~unifield-team/unifield-wm/us-671-homere

« back to all changes in this revision

Viewing changes to account_journal/account_journal.py

  • Committer: chloups208
  • Date: 2012-11-21 11:15:15 UTC
  • mto: This revision was merged to the branch mainline in revision 1340.
  • Revision ID: chloups208@chloups208-laptop-20121121111515-myqv282h6xmgh053
utp-171 modification of fields po, po line, product, so, so line

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
 
28
28
from tools.translate import _
29
29
 
30
 
from account_override import ACCOUNT_RESTRICTED_AREA
31
 
 
32
30
class account_journal(osv.osv):
33
31
    _inherit = "account.journal"
34
32
 
54
52
                file = tools.file_open(pathname)
55
53
                tools.convert_xml_import(cr, 'account_journal', file, {}, mode='init', noupdate=False)
56
54
 
 
55
 
57
56
    def get_journal_type(self, cursor, user_id, context=None):
58
57
        return [('accrual', 'Accrual'),
59
58
                ('bank', 'Bank'),
62
61
                ('correction','Correction'),
63
62
                ('cur_adj', 'Currency Adjustement'),
64
63
                ('depreciation', 'Depreciation'),
 
64
                ('extra', 'OD-Extra Accounting'),
65
65
                ('general', 'General'),
66
66
                ('hq', 'HQ'),
67
67
                ('hr', 'HR'),
68
68
                ('inkind', 'In-kind Donation'),
69
69
                ('intermission', 'Intermission'),
70
 
                ('migration', 'Migration'),
71
 
                ('extra', 'OD-Extra Accounting'),
72
70
                ('situation', 'Opening/Closing Situation'),
73
71
                ('purchase', 'Purchase'),
74
72
                ('purchase_refund','Purchase Refund'),
75
 
                ('revaluation', 'Revaluation'),
76
73
                ('sale', 'Sale'),
77
74
                ('sale_refund','Sale Refund'),
78
75
                ('stock', 'Stock'),
79
 
                ('system', 'System'),
80
76
        ]
81
 
 
82
 
    def _get_has_entries(self, cr, uid, ids, field_name, arg, context=None):
83
 
        def count_entries(journal_id):
84
 
            return am_obj.search(cr, uid, [('journal_id', '=', journal_id)],
85
 
                limit=1, context=context)
86
 
 
87
 
        res = {}
88
 
        if not ids:
89
 
            return res
90
 
        am_obj = self.pool.get('account.move')
91
 
        if isinstance(ids, (int, long)):
92
 
            ids = [ids]
93
 
        for id in ids:
94
 
            res[id] = bool(count_entries(id))
95
 
        return res
96
 
 
 
77
    
97
78
    _columns = {
98
79
        'type': fields.selection(get_journal_type, 'Type', size=32, required=True),
99
80
        'code': fields.char('Code', size=10, required=True, help="The code will be used to generate the numbers of the journal entries of this journal."),
100
 
        'bank_journal_id': fields.many2one('account.journal', _("Corresponding bank journal"), domain="[('type', '=', 'bank'), ('currency', '=', currency)]"),
101
 
        'cheque_journal_id': fields.one2many('account.journal', 'bank_journal_id', 'Linked cheque'),
102
 
        'has_entries': fields.function(_get_has_entries, type='boolean', method=True, string='Has journal entries'),
103
81
    }
104
82
 
105
83
    _defaults = {
109
87
        'update_posted': True,
110
88
        'group_invoice_lines': False,
111
89
    }
112
 
 
 
90
    
113
91
    def get_current_period(self, cr, uid, context=None):
114
92
        periods = self.pool.get('account.period').find(cr, uid, datetime.date.today())
115
93
        if periods:
116
94
            return periods[0]
117
95
        return False
118
 
 
119
 
    def name_get(self, cr, uid, ids, context=None):
120
 
        """
121
 
        Get code for journals
122
 
        """
123
 
        result = self.read(cr, uid, ids, ['code', 'instance_id'])
 
96
    
 
97
    def name_get(self, cr, user, ids, context=None):
 
98
        result = self.browse(cr, user, ids, context=context)
124
99
        res = []
125
 
        is_manual_view = context.get('from_manual_entry', False)
126
100
        for rs in result:
127
 
            txt = rs.get('code', '')
128
 
            if is_manual_view:
129
 
                if rs.get('instance_id', False):
130
 
                    instance = self.pool.get('msf.instance').read(cr, uid, [rs.get('instance_id')[0]], ['code'])
131
 
                    if instance and instance[0] and instance[0].get('code', False):
132
 
                        instance_code = instance[0].get('code')
133
 
                        txt += ' - ' + str(instance_code)
134
 
            res += [(rs.get('id'), txt)]
 
101
            txt = rs.name
 
102
            res += [(rs.id, txt)]
135
103
        return res
136
 
 
 
104
    
137
105
    def onchange_type(self, cr, uid, ids, type, currency, context=None):
138
106
        analytic_journal_obj = self.pool.get('account.analytic.journal')
139
107
#        value = super(account_journal, self).onchange_type(cr, uid, ids, type, currency, context)
152
120
            analytic_cash_journal = analytic_journal_obj.search(cr, uid, [('code', '=', 'CAS'),
153
121
                                                                          ('is_current_instance', '=', True)], context=context)[0]
154
122
            value['value']['analytic_journal_id'] = analytic_cash_journal
155
 
            value['domain']['default_debit_account_id'] = ACCOUNT_RESTRICTED_AREA['journals']
156
 
            value['domain']['default_credit_account_id'] = ACCOUNT_RESTRICTED_AREA['journals']
157
 
        elif type == 'bank':
 
123
        elif type == 'bank': 
158
124
            analytic_bank_journal = analytic_journal_obj.search(cr, uid, [('code', '=', 'BNK'),
159
125
                                                                          ('is_current_instance', '=', True)], context=context)[0]
160
126
            value['value']['analytic_journal_id'] = analytic_bank_journal
161
 
            value['domain']['default_debit_account_id'] = ACCOUNT_RESTRICTED_AREA['journals']
162
 
            value['domain']['default_credit_account_id'] = ACCOUNT_RESTRICTED_AREA['journals']
163
 
        elif type == 'cheque':
 
127
        elif type == 'cheque': 
164
128
            analytic_cheque_journal = analytic_journal_obj.search(cr, uid, [('code', '=', 'CHK'),
165
129
                                                                            ('is_current_instance', '=', True)], context=context)[0]
166
130
            value['value']['analytic_journal_id'] = analytic_cheque_journal
167
 
            value['domain']['default_debit_account_id'] = ACCOUNT_RESTRICTED_AREA['journals']
168
 
            value['domain']['default_credit_account_id'] = ACCOUNT_RESTRICTED_AREA['journals']
169
131
        elif type == 'cur_adj':
170
132
            debit_default_dom = [('type','<>','view'),('type','<>','consolidation')]
171
133
            credit_default_dom = [('type','<>','view'),('type','<>','consolidation')]
183
145
            value['domain']['default_credit_account_id'] = credit_default_dom
184
146
        return value
185
147
 
186
 
    def create_fiscalyear_sequence(self, cr, uid, fiscalyear, name, code, date, main_sequence=False, context=None):
187
 
        """
188
 
        Create a fiscalyear sequence between journal and fiscalyear.
189
 
        """
190
 
        # Some checks
191
 
        if context is None:
192
 
            context = {}
193
 
        if not fiscalyear:
194
 
            raise osv.except_osv(_('Error'), _('Fiscalyear is missing'))
195
 
        if not name:
196
 
            raise osv.except_osv(_('Error'), _('Name is missing!'))
197
 
        if not code:
198
 
            raise osv.except_osv(_('Error'), _('Code is missing!'))
199
 
        if not date:
200
 
            raise osv.except_osv(_('Error'), _('Date is missing!'))
201
 
        # create a new sequence
202
 
        seq = {
203
 
            'name': name,
204
 
            'code': code,
205
 
            'active': True,
206
 
            'prefix': "%s" % str(date)[2:4], # take last 2 number of year
207
 
            'padding': 4,
208
 
            'number_increment': 1
209
 
        }
210
 
        # check if code exists
211
 
        if not self.pool.get('ir.sequence.type').search(cr, uid, [('code', '=' , code)], limit=1, context=context):
212
 
            self.pool.get('ir.sequence.type').create(cr, uid, {'name': code, 'code': code}, context=context)
213
 
        sequence_id = self.pool.get('ir.sequence').create(cr, uid, seq)
214
 
        if not main_sequence:
215
 
            main_sequence = sequence_id
216
 
        self.pool.get('account.sequence.fiscalyear').create(cr, uid, {'sequence_id': sequence_id, 'fiscalyear_id': fiscalyear, 'sequence_main_id': main_sequence,})
217
 
        return True
218
 
 
219
 
    def check_linked_journal(self, cr, uid, journal_id, context=None):
220
 
        """
221
 
        Check that used linked journal is not used twice.
222
 
        """
223
 
        if context is None:
224
 
            context = {}
225
 
        if not journal_id:
226
 
            raise osv.except_osv(_('Error'), _('Programming error.'))
227
 
        res = self.search(cr, uid, [('bank_journal_id', '=', journal_id)], count=1)
228
 
        if res and res > 1:
229
 
            raise osv.except_osv(_('Error'), _('Corresponding bank journal already used. Choose another one.'))
230
 
        return True
231
 
 
232
148
    def create(self, cr, uid, vals, context=None):
233
 
        """
234
 
        Create the journal with its sequence, a sequence linked to the fiscalyear and some register if this journal type is bank, cash or cheque.
235
 
        """
236
 
        # Checks
 
149
        
 
150
        # TODO: add default accounts
 
151
       
237
152
        if context is None:
238
153
            context = {}
239
154
 
240
 
        if not context.get('sync_update_execution', False) and \
241
 
            not context.get('allow_journal_system_create', False) and \
242
 
            vals.get('type', '') == 'system':
243
 
                    # user not allowed to create 'system' journal
244
 
                    raise osv.except_osv(_('Warning'),
245
 
                        _('You can not create a System journal'))
246
 
 
247
 
        # Prepare some values
 
155
        # Create associated sequence
248
156
        seq_pool = self.pool.get('ir.sequence')
249
157
        seq_typ_pool = self.pool.get('ir.sequence.type')
250
 
        seq_fiscal_pool = self.pool.get('account.sequence.fiscalyear')
251
158
        name = self.pool.get('res.users').browse(cr, uid, uid, context).company_id.name
252
159
        code = vals['code'].lower()
253
 
        fy_ids = self.pool.get('account.fiscalyear').search(cr, uid, [('state', '=', 'draft')])
254
160
        types = {
255
161
            'name': name,
256
162
            'code': code
257
163
        }
258
 
        # Create main sequence
259
164
        seq_typ_pool.create(cr, uid, types)
260
 
        main_seq = {
 
165
        seq = {
261
166
            'name': name,
262
167
            'code': code,
263
168
            'active': True,
264
169
            # UF-433: sequence is now only the number, no more prefix
 
170
            #'prefix': "%(year)s%(month)s-" + name + "-" + code + "-",
265
171
            'prefix': "",
266
 
            'padding': 4,
 
172
            'padding': 6,
267
173
            'number_increment': 1
268
174
        }
269
 
        vals['sequence_id'] = seq_pool.create(cr, uid, main_seq)
270
 
        if fy_ids:
271
 
            for fy in self.pool.get('account.fiscalyear').browse(cr, uid, fy_ids, context=context):
272
 
                # Create associated sequence FY/JOURNAL
273
 
                self.create_fiscalyear_sequence(cr, uid, fy.id, name, code, fy.date_start, main_sequence=vals['sequence_id'], context=context)
 
175
        vals['sequence_id'] = seq_pool.create(cr, uid, seq)
 
176
        
274
177
        # View is set by default, since every journal will display the same thing
275
178
        obj_data = self.pool.get('ir.model.data')
276
179
        data_id = obj_data.search(cr, uid, [('model','=','account.journal.view'), ('name','=','account_journal_view')])
277
180
        data = obj_data.browse(cr, uid, data_id[0], context=context)
278
181
        vals['view_id'] = data.res_id
279
 
 
280
 
        # Create journal
281
 
        journal_id = super(account_journal, self).create(cr, uid, vals, context)
282
 
        # Check that linked bank journal if cheque
283
 
        if vals['type'] == 'cheque':
284
 
            self.check_linked_journal(cr, uid, vals['bank_journal_id'] or False)
285
 
 
 
182
        
 
183
        # create journal
 
184
        journal_obj = super(account_journal, self).create(cr, uid, vals, context)
 
185
        
286
186
        # Some verification for cash, bank, cheque and cur_adj type
287
187
        if vals['type'] in ['cash', 'bank', 'cheque', 'cur_adj']:
288
188
            if not vals.get('default_debit_account_id'):
289
189
                raise osv.except_osv(_('Warning'), _('Default Debit Account is missing.'))
290
 
 
 
190
        
291
191
        # if the journal can be linked to a register, the register is also created
292
 
        # UTP-182: but not create if the journal came from another instance via the synchronization
293
 
        if vals['type'] in ('cash','bank','cheque') and not context.get('sync_update_execution', False):
 
192
        # UTP-182: but not create if the journal came from another instance via the synchronization 
 
193
        if vals['type'] in ('cash','bank','cheque') and not context.get('sync_data', False):
294
194
            # 'from_journal_creation' in context permits to pass register creation that have a
295
195
            #  'prev_reg_id' mandatory field. This is because this register is the first register from this journal.
296
196
            context.update({'from_journal_creation': True})
297
 
 
298
 
            #BKLG-53 get the next draft period from today
299
 
            current_date = datetime.date.today().strftime('%Y-%m-%d')
300
 
            periods = self.pool.get('account.period').search(cr, uid, [
301
 
                    ('date_stop','>=',current_date),
302
 
                    ('state','=','draft'),
303
 
                    ('special', '=', False),
304
 
                ], context=context, limit=1, order='date_stop')
305
 
            if not periods:
306
 
                raise osv.except_osv(_('Warning'), _('Sorry, No open period for creating the register!'))
307
197
            self.pool.get('account.bank.statement') \
308
 
                .create(cr, uid, {'journal_id': journal_id,
 
198
                .create(cr, uid, {'journal_id': journal_obj,
309
199
                                  'name': vals['name'],
310
 
                                  'period_id': periods[0],
 
200
                                  'period_id': self.get_current_period(cr, uid, context),
311
201
                                  'currency': vals.get('currency')}, \
312
202
                                  context=context)
313
 
 
 
203
        
314
204
        # Prevent user that default account for cur_adj type should be an expense account
315
205
        if vals['type'] in ['cur_adj']:
316
206
            account_id = vals['default_debit_account_id']
317
207
            user_type_code = self.pool.get('account.account').read(cr, uid, account_id, ['user_type_code']).get('user_type_code', False)
318
208
            if user_type_code != 'expense':
319
209
                raise osv.except_osv(_('Warning'), _('Default Debit Account should be an expense account for Adjustement Journals!'))
320
 
        return journal_id
 
210
        return journal_obj
321
211
 
322
212
    def write(self, cr, uid, ids, vals, context=None):
323
213
        """
324
214
        Verify default debit account for adjustement journals
325
215
        """
326
 
        if context is None:
327
 
            context = {}
328
 
 
329
 
        if not context.get('sync_update_execution', False):
330
 
            if vals.get('type', '') == 'system':
331
 
                # not from sync, user not allowed to update 'system' journal
332
 
                # (note: noteditable not usable on journal form)
333
 
                raise osv.except_osv(_('Warning'),
334
 
                    _('System journal not updatable'))
335
 
 
336
216
        res = super(account_journal, self).write(cr, uid, ids, vals, context=context)
337
217
        for j in self.browse(cr, uid, ids):
338
218
            if j.type == 'cur_adj' and j.default_debit_account_id.user_type_code != 'expense':
339
219
                raise osv.except_osv(_('Warning'), _('Default Debit Account should be an expense account for Adjustement Journals!'))
340
 
            # Check linked bank journal if type is cheque
341
 
            if j.type == 'cheque':
342
 
                self.check_linked_journal(cr, uid, j.bank_journal_id.id, context=context)
343
 
            # US-265: Check account bank statements if name change
344
 
            if not context.get('sync_update_execution'):
345
 
                if vals.get('name', False):
346
 
                    abs_obj = self.pool.get('account.bank.statement')
347
 
                    s_ids = abs_obj.search(cr, uid, [('journal_id', '=', j.id)], context=context)
348
 
                    if s_ids:
349
 
                        abs_obj.write(cr, uid, s_ids, {'name': vals['name']}, context=context)
350
220
        return res
351
221
 
352
 
    def unlink(self, cr, uid, ids, context=None):
353
 
        if not ids:
354
 
            return False
355
 
        if isinstance(ids, (int, long, )):
356
 
            ids = [ids]
357
 
 
358
 
        is_system = [ rec.type == 'system' \
359
 
            for rec in self.browse(cr, uid, ids, context=context) ]
360
 
        if any(is_system):
361
 
            raise osv.except_osv(_('Warning'),
362
 
                _('System journal not deletable'))
363
 
        return super(account_journal, self).unlink(cr, uid, ids,
364
 
            context=context)
365
 
 
366
222
    def button_delete_journal(self, cr, uid, ids, context=None):
367
223
        """
368
224
        Delete all linked register and this journal except: