diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 6ff4f07aa3b..6bed1f0f396 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -36,11 +36,12 @@ class account_move_line(osv.osv): def _query_get(self, cr, uid, obj='l', context=None): fiscalyear_obj = self.pool.get('account.fiscalyear') fiscalperiod_obj = self.pool.get('account.period') + account_obj = self.pool.get('account.account') fiscalyear_ids = [] if context is None: context = {} initial_bal = context.get('initial_bal', False) - company_clause = "" + company_clause = " " if context.get('company_id', False): company_clause = " AND " +obj+".company_id = %s" % context.get('company_id', False) if not context.get('fiscalyear', False): @@ -53,20 +54,19 @@ class account_move_line(osv.osv): fiscalyear_ids = [context['fiscalyear']] fiscalyear_clause = (','.join([str(x) for x in fiscalyear_ids])) or '0' - state = context.get('state',False) - + state = context.get('state', False) where_move_state = '' where_move_lines_by_date = '' if context.get('date_from', False) and context.get('date_to', False): if initial_bal: - where_move_lines_by_date = " OR " +obj+".move_id in ( select id from account_move where date < '"+context['date_from']+"')" + where_move_lines_by_date = " OR " +obj+".move_id IN (SELECT id FROM account_move WHERE date < '" +context['date_from']+"')" else: - where_move_lines_by_date = " AND " +obj+".move_id in ( select id from account_move where date >= '" +context['date_from']+"' AND date <= '"+context['date_to']+"')" + where_move_lines_by_date = " AND " +obj+".move_id IN (SELECT id FROM account_move WHERE date >= '" +context['date_from']+"' AND date <= '"+context['date_to']+"')" if state: if state.lower() not in ['all']: - where_move_state= " AND "+obj+".move_id in (select id from account_move where account_move.state = '"+state+"')" + where_move_state= " AND "+obj+".move_id IN (SELECT id FROM account_move WHERE account_move.state = '"+state+"')" if context.get('period_from', False) and context.get('period_to', False) and not context.get('periods', False): if initial_bal: @@ -77,7 +77,7 @@ class account_move_line(osv.osv): context['periods'] = fiscalperiod_obj.build_ctx_periods(cr, uid, context['period_from'], context['period_to']) if context.get('periods', False): if initial_bal: - query = obj+".state<>'draft' AND "+obj+".period_id in (SELECT id from account_period WHERE fiscalyear_id in (%s) %s %s)" % (fiscalyear_clause, where_move_state, where_move_lines_by_date) + query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) %s %s)" % (fiscalyear_clause, where_move_state, where_move_lines_by_date) period_ids = fiscalperiod_obj.search(cr, uid, [('id', 'in', context['periods'])], order='date_start', limit=1) if period_ids and period_ids[0]: first_period = fiscalperiod_obj.browse(cr, uid, period_ids[0], context=context) @@ -85,19 +85,19 @@ class account_move_line(osv.osv): periods = fiscalperiod_obj.search(cr, uid, [('date_start', '<', first_period.date_start)]) periods = ','.join([str(x) for x in periods]) if periods: - query = obj+".state<>'draft' AND "+obj+".period_id in (SELECT id from account_period WHERE fiscalyear_id in (%s) OR id in (%s)) %s %s" % (fiscalyear_clause, periods, where_move_state, where_move_lines_by_date) + query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) OR id IN (%s)) %s %s" % (fiscalyear_clause, periods, where_move_state, where_move_lines_by_date) else: ids = ','.join([str(x) for x in context['periods']]) - query = obj+".state<>'draft' AND "+obj+".period_id in (SELECT id from account_period WHERE fiscalyear_id in (%s) AND id in (%s)) %s %s" % (fiscalyear_clause, ids, where_move_state, where_move_lines_by_date) + query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) AND id IN (%s)) %s %s" % (fiscalyear_clause, ids, where_move_state, where_move_lines_by_date) else: - query = obj+".state<>'draft' AND "+obj+".period_id in (SELECT id from account_period WHERE fiscalyear_id in (%s) %s %s)" % (fiscalyear_clause, where_move_state, where_move_lines_by_date) + query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) %s %s)" % (fiscalyear_clause, where_move_state, where_move_lines_by_date) if context.get('journal_ids', False): - query += ' AND '+obj+'.journal_id in (%s)' % ','.join(map(str, context['journal_ids'])) + query += ' AND '+obj+'.journal_id IN (%s)' % ','.join(map(str, context['journal_ids'])) if context.get('chart_account_id', False): - child_ids = self.pool.get('account.account')._get_children_and_consol(cr, uid, [context['chart_account_id']], context=context) - query += ' AND '+obj+'.account_id in (%s)' % ','.join(map(str, child_ids)) + child_ids = account_obj._get_children_and_consol(cr, uid, [context['chart_account_id']], context=context) + query += ' AND '+obj+'.account_id IN (%s)' % ','.join(map(str, child_ids)) query += company_clause @@ -111,26 +111,27 @@ class account_move_line(osv.osv): return data def create_analytic_lines(self, cr, uid, ids, context={}): + acc_ana_line_obj = self.pool.get('account.analytic.line') for obj_line in self.browse(cr, uid, ids, context): if obj_line.analytic_account_id: if not obj_line.journal_id.analytic_journal_id: - raise osv.except_osv(_('No Analytic Journal !'),_("You have to define an analytic journal on the '%s' journal!") % (obj_line.journal_id.name,)) + raise osv.except_osv(_('No Analytic Journal !'),_("You have to define an analytic journal on the '%s' journal!") % (obj_line.journal_id.name, )) amt = (obj_line.credit or 0.0) - (obj_line.debit or 0.0) - vals_lines={ + vals_lines = { 'name': obj_line.name, 'date': obj_line.date, 'account_id': obj_line.analytic_account_id.id, - 'unit_amount':obj_line.quantity, + 'unit_amount': obj_line.quantity, 'product_id': obj_line.product_id and obj_line.product_id.id or False, 'product_uom_id': obj_line.product_uom_id and obj_line.product_uom_id.id or False, 'amount': amt, 'general_account_id': obj_line.account_id.id, 'journal_id': obj_line.journal_id.analytic_journal_id.id, 'ref': obj_line.ref, - 'move_id':obj_line.id, + 'move_id': obj_line.id, 'user_id': uid } - self.pool.get('account.analytic.line').create(cr,uid,vals_lines) + acc_ana_line_obj.create(cr, uid, vals_lines) return True def _default_get_move_form_hook(self, cursor, user, data): @@ -143,94 +144,89 @@ class account_move_line(osv.osv): def convert_to_period(self, cr, uid, context={}): period_obj = self.pool.get('account.period') - #check if the period_id changed in the context from client side if context.get('period_id', False): period_id = context.get('period_id') if type(period_id) == str: - ids = period_obj.search(cr, uid, [('name','ilike',period_id)]) + ids = period_obj.search(cr, uid, [('name', 'ilike', period_id)]) context.update({ - 'period_id':ids[0] + 'period_id': ids[0] }) - return context def _default_get(self, cr, uid, fields, context={}): - if not context.get('journal_id', False) and context.get('search_default_journal_id', False): context['journal_id'] = context.get('search_default_journal_id') - + account_obj = self.pool.get('account.account') period_obj = self.pool.get('account.period') - + journal_obj = self.pool.get('account.journal') + move_obj = self.pool.get('account.move') + tax_obj = self.pool.get('account.tax') + fiscal_pos_obj = self.pool.get('account.fiscal.position') + partner_obj = self.pool.get('res.partner') + currency_obj = self.pool.get('res.currency') context = self.convert_to_period(cr, uid, context) - # Compute simple values data = super(account_move_line, self).default_get(cr, uid, fields, context) # Starts: Manual entry from account.move form if context.get('lines',[]): - - total_new=0.00 + total_new = 0.00 for i in context['lines']: if i[2]: - total_new +=(i[2]['debit'] or 0.00)- (i[2]['credit'] or 0.00) + total_new += (i[2]['debit'] or 0.00)- (i[2]['credit'] or 0.00) for item in i[2]: - data[item]=i[2][item] + data[item] = i[2][item] if context['journal']: - journal_obj=self.pool.get('account.journal').browse(cr, uid, context['journal']) - if journal_obj.type == 'purchase': + journal_data = obj_journal.browse(cr, uid, context['journal']) + if journal_data.type == 'purchase': if total_new > 0: - account = journal_obj.default_credit_account_id + account = journal_data.default_credit_account_id else: - account = journal_obj.default_debit_account_id + account = journal_data.default_debit_account_id else: if total_new > 0: - account = journal_obj.default_credit_account_id + account = journal_data.default_credit_account_id else: - account = journal_obj.default_debit_account_id - + account = journal_data.default_debit_account_id if account and ((not fields) or ('debit' in fields) or ('credit' in fields)) and 'partner_id' in data and (data['partner_id']): - part = self.pool.get('res.partner').browse(cr, uid, data['partner_id']) - account = self.pool.get('account.fiscal.position').map_account(cr, uid, part and part.property_account_position or False, account.id) - account = self.pool.get('account.account').browse(cr, uid, account) + part = partner_obj.browse(cr, uid, data['partner_id']) + account = fiscal_pos_obj.map_account(cr, uid, part and part.property_account_position or False, account.id) + account = account_obj.browse(cr, uid, account) data['account_id'] = account.id s = -total_new - data['debit'] = s>0 and s or 0.0 - data['credit'] = s<0 and -s or 0.0 + data['debit'] = s > 0 and s or 0.0 + data['credit'] = s < 0 and -s or 0.0 data = self._default_get_move_form_hook(cr, uid, data) return data # Ends: Manual entry from account.move form - if not 'move_id' in fields: #we are not in manual entry return data - # Compute the current move move_id = False partner_id = False if context.get('journal_id', False) and context.get('period_id', False): if 'move_id' in fields: - cr.execute('select move_id \ - from \ + cr.execute('SELECT move_id \ + FROM \ account_move_line \ - where \ - journal_id=%s and period_id=%s and create_uid=%s and state=%s \ - order by id desc limit 1', + WHERE \ + journal_id = %s and period_id = %s AND create_uid = %s AND state = %s \ + ORDER BY id DESC limit 1', (context['journal_id'], context['period_id'], uid, 'draft')) res = cr.fetchone() move_id = (res and res[0]) or False - if not move_id: return data else: data['move_id'] = move_id - if 'date' in fields: - cr.execute('select date \ - from \ + cr.execute('SELECT date \ + FROM \ account_move_line \ - where \ - journal_id=%s and period_id=%s and create_uid=%s \ - order by id desc', + WHERE \ + journal_id = %s AND period_id = %s AND create_uid = %s \ + ORDER BY id DESC', (context['journal_id'], context['period_id'], uid)) res = cr.fetchone() if res: @@ -241,10 +237,9 @@ class account_move_line(osv.osv): data['date'] = period.date_start if not move_id: return data - total = 0 ref_id = False - move = self.pool.get('account.move').browse(cr, uid, move_id, context) + move = move_obj.browse(cr, uid, move_id, context) if 'name' in fields: data.setdefault('name', move.line_id[-1].name) acc1 = False @@ -260,44 +255,40 @@ class account_move_line(osv.osv): data['partner_id'] = partner_id if move.journal_id.type == 'purchase': - if total>0: + if total > 0: account = move.journal_id.default_credit_account_id else: account = move.journal_id.default_debit_account_id else: - if total>0: + if total > 0: account = move.journal_id.default_credit_account_id else: account = move.journal_id.default_debit_account_id - - part = partner_id and self.pool.get('res.partner').browse(cr, uid, partner_id) or False + part = partner_id and partner_obj.browse(cr, uid, partner_id) or False # part = False is acceptable for fiscal position. - account = self.pool.get('account.fiscal.position').map_account(cr, uid, part and part.property_account_position or False, account.id) + account = fiscal_pos_obj.map_account(cr, uid, part and part.property_account_position or False, account.id) if account: - account = self.pool.get('account.account').browse(cr, uid, account) + account = account_obj.browse(cr, uid, account) if account and ((not fields) or ('debit' in fields) or ('credit' in fields)): data['account_id'] = account.id # Propose the price VAT excluded, the VAT will be added when confirming line if account.tax_ids: - taxes = self.pool.get('account.fiscal.position').map_tax(cr, uid, part and part.property_account_position or False, account.tax_ids) - tax = self.pool.get('account.tax').browse(cr, uid, taxes) - for t in self.pool.get('account.tax').compute_inv(cr, uid, tax, total, 1): + taxes = fiscal_pos_obj.map_tax(cr, uid, part and part.property_account_position or False, account.tax_ids) + tax = tax_obj.browse(cr, uid, taxes) + for t in tax_obj.compute_inv(cr, uid, tax, total, 1): total -= t['amount'] s = -total - data['debit'] = s>0 and s or 0.0 - data['credit'] = s<0 and -s or 0.0 + data['debit'] = s > 0 and s or 0.0 + data['credit'] = s < 0 and -s or 0.0 if account and account.currency_id: data['currency_id'] = account.currency_id.id acc = account if s>0: acc = acc1 - v = self.pool.get('res.currency').compute(cr, uid, - account.company_id.currency_id.id, - data['currency_id'], - s, account=acc, account_invert=True) + v = currency_obj.compute(cr, uid, account.company_id.currency_id.id, data['currency_id'], s, account=acc, account_invert=True) data['amount_currency'] = v return data @@ -308,20 +299,18 @@ class account_move_line(osv.osv): def _balance(self, cr, uid, ids, name, arg, context=None): if context is None: context = {} - c = context.copy() c['initital_bal'] = True - sql = [ - """select l2.id, sum(l1.debit-l1.credit) from account_move_line l1, account_move_line l2""", - """where l2.account_id=l1.account_id""", - """and""", - """l1.id<=l2.id""", - """and""", - """l2.id in %s""", - """and""", + """SELECT l2.id, SUM(l1.debit-l1.credit) FROM account_move_line l1, account_move_line l2""", + """WHERE l2.account_id = l1.account_id""", + """AND""", + """l1.id <= l2.id""", + """AND""", + """l2.id IN %s""", + """AND""", self._query_get(cr, uid, obj='l1', context=c), - """ group by l2.id""", + """ GROUP BY l2.id""", ] cr.execute('\n'.join(sql), [tuple(ids)]) @@ -343,8 +332,7 @@ class account_move_line(osv.osv): res[line_id] = invoice_id invoice_ids.append(invoice_id) invoice_names = {False: ''} - for invoice_id, name in invoice_obj.name_get(cursor, user, - invoice_ids, context=context): + for invoice_id, name in invoice_obj.name_get(cursor, user, invoice_ids, context=context): invoice_names[invoice_id] = name for line_id in res.keys(): invoice_id = res[line_id] @@ -365,12 +353,11 @@ class account_move_line(osv.osv): def _balance_search(self, cursor, user, obj, name, args, domain=None, context=None): if context is None: context = {} - if not args: return [] - where = ' and '.join(map(lambda x: '(abs(sum(debit-credit))'+x[1]+str(x[2])+')',args)) - cursor.execute('select id, sum(debit-credit) from account_move_line \ - group by id, debit, credit having '+where) + where = ' AND '.join(map(lambda x: '(abs(sum(debit-credit))'+x[1]+str(x[2])+')',args)) + cursor.execute('SELECT id, SUM(debit-credit) FROM account_move_line \ + GROUP BY id, debit, credit having '+where) res = cursor.fetchall() if not res: return [('id', '=', '0')] @@ -380,7 +367,6 @@ class account_move_line(osv.osv): if not args: return [] invoice_obj = self.pool.get('account.invoice') - i = 0 while i < len(args): fargs = args[i][0].split('.', 1) @@ -406,7 +392,7 @@ class account_move_line(osv.osv): qu2.append(x[2]) elif x[1] == 'in': if len(x[2]) > 0: - qu1.append('(i.id in (%s))' % (','.join(['%s'] * len(x[2])))) + qu1.append('(i.id IN (%s))' % (','.join(['%s'] * len(x[2])))) qu2 += x[2] else: qu1.append(' (False)') @@ -445,17 +431,15 @@ class account_move_line(osv.osv): 'reconcile_partial_id': fields.many2one('account.move.reconcile', 'Partial Reconcile', readonly=True, ondelete='set null', select=2), 'amount_currency': fields.float('Amount Currency', help="The amount expressed in an optional other currency if it is a multi-currency entry.", digits_compute=dp.get_precision('Account')), 'currency_id': fields.many2one('res.currency', 'Currency', help="The optional other currency if it is a multi-currency entry."), - 'period_id': fields.many2one('account.period', 'Period', required=True, select=2), 'journal_id': fields.many2one('account.journal', 'Journal', required=True, select=1), 'blocked': fields.boolean('Litigation', help="You can check this box to mark this journal item as a litigation with the associated partner"), - 'partner_id': fields.many2one('res.partner', 'Partner'), 'date_maturity': fields.date('Due date', help="This field is used for payable and receivable journal entries. You can put the limit date for the payment of this line."), 'date': fields.related('move_id','date', string='Effective date', type='date', required=True, - store={ - 'account.move': (_get_move_lines, ['date'], 20) - }), + store = { + 'account.move': (_get_move_lines, ['date'], 20) + }), 'date_created': fields.date('Creation date'), 'analytic_lines': fields.one2many('account.analytic.line', 'move_id', 'Analytic lines'), 'centralisation': fields.selection([('normal','Normal'),('credit','Credit Centralisation'),('debit','Debit Centralisation')], 'Centralisation', size=6), @@ -472,23 +456,21 @@ class account_move_line(osv.osv): #TODO: remove this #'amount_taxed':fields.float("Taxed Amount", digits_compute=dp.get_precision('Account')), 'company_id': fields.related('account_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True) - } def _get_date(self, cr, uid, context): period_obj = self.pool.get('account.period') dt = time.strftime('%Y-%m-%d') if ('journal_id' in context) and ('period_id' in context): - cr.execute('select date from account_move_line ' \ - 'where journal_id=%s and period_id=%s ' \ - 'order by id desc limit 1', + cr.execute('SELECT date FROM account_move_line ' \ + 'WHERE journal_id = %s AND period_id = %s ' \ + 'ORDER BY id DESC limit 1', (context['journal_id'], context['period_id'])) res = cr.fetchone() if res: dt = res[0] else: - period = period_obj.browse(cr, uid, context['period_id'], - context=context) + period = period_obj.browse(cr, uid, context['period_id'], context=context) dt = period.date_start return dt @@ -549,23 +531,29 @@ class account_move_line(osv.osv): ] #TODO: ONCHANGE_ACCOUNT_ID: set account_tax_id - def onchange_currency(self, cr, uid, ids, account_id, amount, currency_id, date=False, journal=False): + account_obj = self.pool.get('account.account') + journal_obj = self.pool.get('account.journal') + currency_obj = self.pool.get('res.currency') if (not currency_id) or (not account_id): return {} result = {} - acc =self.pool.get('account.account').browse(cr, uid, account_id) + acc = account_obj.browse(cr, uid, account_id) if (amount>0) and journal: - x = self.pool.get('account.journal').browse(cr, uid, journal).default_credit_account_id + x = journal_obj.browse(cr, uid, journal).default_credit_account_id if x: acc = x - v = self.pool.get('res.currency').compute(cr, uid, currency_id,acc.company_id.currency_id.id, amount, account=acc) + v = currency_obj.compute(cr, uid, currency_id, acc.company_id.currency_id.id, amount, account=acc) result['value'] = { - 'debit': v>0 and v or 0.0, - 'credit': v<0 and -v or 0.0 + 'debit': v > 0 and v or 0.0, + 'credit': v < 0 and -v or 0.0 } return result def onchange_partner_id(self, cr, uid, ids, move_id, partner_id, account_id=None, debit=0, credit=0, date=False, journal=False): + partner_obj = self.pool.get('res.partner') + payment_term_obj = self.pool.get('account.payment.term') + journal_obj = self.pool.get('account.journal') + fiscal_pos_obj = self.pool.get('account.fiscal.position') val = {} val['date_maturity'] = False @@ -573,51 +561,50 @@ class account_move_line(osv.osv): return {'value':val} if not date: date = datetime.now().strftime('%Y-%m-%d') - part = self.pool.get('res.partner').browse(cr, uid, partner_id) + part = partner_obj.browse(cr, uid, partner_id) if part.property_payment_term: - res = self.pool.get('account.payment.term').compute(cr, uid, part.property_payment_term.id, 100, date) + res = payment_term_obj.compute(cr, uid, part.property_payment_term.id, 100, date) if res: val['date_maturity'] = res[0][0] if not account_id: id1 = part.property_account_payable.id id2 = part.property_account_receivable.id if journal: - jt = self.pool.get('account.journal').browse(cr, uid, journal).type + jt = journal_obj.browse(cr, uid, journal).type #FIXME: Bank and cash journal are such a journal we can not assume a account based on this 2 journals # Bank and cash journal can have a payment or receipt transaction, and in both type partner account # will not be same id payment then payable, and if receipt then receivable #if jt in ('sale', 'purchase_refund', 'bank', 'cash'): if jt in ('sale', 'purchase_refund'): - val['account_id'] = self.pool.get('account.fiscal.position').map_account(cr, uid, part and part.property_account_position or False, id2) + val['account_id'] = fiscal_pos_obj.map_account(cr, uid, part and part.property_account_position or False, id2) elif jt in ('purchase', 'sale_refund', 'expense', 'bank', 'cash'): - val['account_id'] = self.pool.get('account.fiscal.position').map_account(cr, uid, part and part.property_account_position or False, id1) - + val['account_id'] = fiscal_pos_obj.map_account(cr, uid, part and part.property_account_position or False, id1) if val.get('account_id', False): d = self.onchange_account_id(cr, uid, ids, val['account_id']) val.update(d['value']) - return {'value':val} def onchange_account_id(self, cr, uid, ids, account_id=False, partner_id=False): + account_obj = self.pool.get('account.account') + partner_obj = self.pool.get('res.partner') + fiscal_pos_obj = self.pool.get('account.fiscal.position') val = {} if account_id: - res = self.pool.get('account.account').browse(cr, uid, account_id) + res = account_obj.browse(cr, uid, account_id) tax_ids = res.tax_ids if tax_ids and partner_id: - part = self.pool.get('res.partner').browse(cr, uid, partner_id) - tax_id = self.pool.get('account.fiscal.position').map_tax(cr, uid, part and part.property_account_position or False, tax_ids)[0] + part = partner_obj.browse(cr, uid, partner_id) + tax_id = fiscal_pos_obj.map_tax(cr, uid, part and part.property_account_position or False, tax_ids)[0] else: tax_id = tax_ids and tax_ids[0].id or False val['account_tax_id'] = tax_id - return {'value':val} - + return {'value': val} # # type: the type if reconciliation (no logic behind this field, for info) # # writeoff; entry generated for the difference between the lines # - def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False): if context is None: context = {} @@ -637,7 +624,7 @@ class account_move_line(osv.osv): SELECT p.id FROM res_partner p RIGHT JOIN ( - SELECT l.partner_id as partner_id, SUM(l.debit) as debit, SUM(l.credit) as credit + SELECT l.partner_id AS partner_id, SUM(l.debit) AS debit, SUM(l.credit) AS credit FROM account_move_line l LEFT JOIN account_account a ON (a.id = l.account_id) LEFT JOIN res_partner p ON (l.partner_id = p.id) @@ -648,20 +635,19 @@ class account_move_line(osv.osv): GROUP BY l.partner_id ) AS s ON (p.id = s.partner_id) WHERE debit > 0 AND credit > 0 - ORDER BY p.last_reconciliation_date LIMIT 1 OFFSET %s""", (offset,) + ORDER BY p.last_reconciliation_date LIMIT 1 OFFSET %s""", (offset, ) ) return cr.fetchone() def reconcile_partial(self, cr, uid, ids, type='auto', context=None): + move_rec_obj = self.pool.get('account.move.reconcile') merges = [] unmerge = [] total = 0.0 merges_rec = [] - company_list = [] if context is None: context = {} - for line in self.browse(cr, uid, ids, context=context): if company_list and not line.company_id.id in company_list: raise osv.except_osv(_('Warning !'), _('To reconcile the entries company should be the same for all entries')) @@ -684,14 +670,19 @@ class account_move_line(osv.osv): if not total: res = self.reconcile(cr, uid, merges+unmerge, context=context) return res - r_id = self.pool.get('account.move.reconcile').create(cr, uid, { + r_id = move_rec_obj.create(cr, uid, { 'type': type, 'line_partial_ids': map(lambda x: (4,x,False), merges+unmerge) }) - self.pool.get('account.move.reconcile').reconcile_partial_check(cr, uid, [r_id] + merges_rec, context=context) + move_rec_obj.reconcile_partial_check(cr, uid, [r_id] + merges_rec, context=context) return True def reconcile(self, cr, uid, ids, type='auto', writeoff_acc_id=False, writeoff_period_id=False, writeoff_journal_id=False, context=None): + account_obj = self.pool.get('account.account') + move_obj = self.pool.get('account.move') + move_rec_obj = self.pool.get('account.move.reconcile') + partner_obj = self.pool.get('res.partner') + currency_obj = self.pool.get('res.currency') lines = self.browse(cr, uid, ids, context=context) unrec_lines = filter(lambda x: not x['reconcile_id'], lines) credit = debit = 0.0 @@ -700,13 +691,11 @@ class account_move_line(osv.osv): partner_id = False if context is None: context = {} - company_list = [] for line in self.browse(cr, uid, ids, context=context): if company_list and not line.company_id.id in company_list: raise osv.except_osv(_('Warning !'), _('To reconcile the entries company should be the same for all entries')) company_list.append(line.company_id.id) - for line in unrec_lines: if line.state <> 'valid': raise osv.except_osv(_('Error'), @@ -728,21 +717,21 @@ class account_move_line(osv.osv): 'FROM account_move_line '\ 'WHERE id IN %s '\ 'GROUP BY account_id,reconcile_id', - (tuple(ids),)) + (tuple(ids), )) r = cr.fetchall() #TODO: move this check to a constraint in the account_move_reconcile object if (len(r) != 1) and not context.get('fy_closing', False): raise osv.except_osv(_('Error'), _('Entries are not of the same account or already reconciled ! ')) if not unrec_lines: raise osv.except_osv(_('Error'), _('Entry is already reconciled')) - account = self.pool.get('account.account').browse(cr, uid, account_id, context=context) + account = account_obj.browse(cr, uid, account_id, context=context) if not context.get('fy_closing', False) and not account.reconcile: raise osv.except_osv(_('Error'), _('The account is not defined to be reconciled !')) if r[0][1] != None: raise osv.except_osv(_('Error'), _('Some entries are already reconciled !')) - if (not self.pool.get('res.currency').is_zero(cr, uid, account.company_id.currency_id, writeoff)) or \ - (account.currency_id and (not self.pool.get('res.currency').is_zero(cr, uid, account.currency_id, currency))): + if (not currency_obj.is_zero(cr, uid, account.company_id.currency_id, writeoff)) or \ + (account.currency_id and (not currency_obj.is_zero(cr, uid, account.currency_id, currency))): if not writeoff_acc_id: raise osv.except_osv(_('Warning'), _('You have to provide an account for the write off entry !')) if writeoff > 0: @@ -755,36 +744,34 @@ class account_move_line(osv.osv): credit = -writeoff self_credit = 0.0 self_debit = -writeoff - # If comment exist in context, take it if 'comment' in context and context['comment']: - libelle=context['comment'] + libelle = context['comment'] else: - libelle='Write-Off' - + libelle = 'Write-Off' writeoff_lines = [ (0, 0, { - 'name':libelle, - 'debit':self_debit, - 'credit':self_credit, - 'account_id':account_id, - 'date':date, - 'partner_id':partner_id, + 'name': libelle, + 'debit': self_debit, + 'credit': self_credit, + 'account_id': account_id, + 'date': date, + 'partner_id': partner_id, 'currency_id': account.currency_id.id or False, 'amount_currency': account.currency_id.id and -currency or 0.0 }), (0, 0, { - 'name':libelle, - 'debit':debit, - 'credit':credit, - 'account_id':writeoff_acc_id, + 'name': libelle, + 'debit': debit, + 'credit': credit, + 'account_id': writeoff_acc_id, 'analytic_account_id': context.get('analytic_id', False), - 'date':date, - 'partner_id':partner_id + 'date': date, + 'partner_id': partner_id }) ] - writeoff_move_id = self.pool.get('account.move').create(cr, uid, { + writeoff_move_id = move_obj.create(cr, uid, { 'period_id': writeoff_period_id, 'journal_id': writeoff_journal_id, 'date':date, @@ -795,11 +782,10 @@ class account_move_line(osv.osv): writeoff_line_ids = self.search(cr, uid, [('move_id', '=', writeoff_move_id), ('account_id', '=', account_id)]) ids += writeoff_line_ids - r_id = self.pool.get('account.move.reconcile').create(cr, uid, { - #'name': date, + r_id = move_rec_obj.create(cr, uid, { 'type': type, - 'line_id': map(lambda x: (4,x,False), ids), - 'line_partial_ids': map(lambda x: (3,x,False), ids) + 'line_id': map(lambda x: (4, x, False), ids), + 'line_partial_ids': map(lambda x: (3, x, False), ids) }) wf_service = netsvc.LocalService("workflow") # the id of the move.reconcile is written in the move.line (self) by the create method above @@ -810,21 +796,21 @@ class account_move_line(osv.osv): if lines and lines[0]: partner_id = lines[0].partner_id and lines[0].partner_id.id or False if partner_id and context and context.get('stop_reconcile', False): - self.pool.get('res.partner').write(cr, uid, [partner_id], {'last_reconciliation_date': time.strftime('%Y-%m-%d %H:%M:%S')}) + partner_obj.write(cr, uid, [partner_id], {'last_reconciliation_date': time.strftime('%Y-%m-%d %H:%M:%S')}) return r_id def view_header_get(self, cr, user, view_id, view_type, context): context = self.convert_to_period(cr, user, context) if context.get('account_id', False): - cr.execute('select code from account_account where id=%s', (context['account_id'],)) + cr.execute('SELECT code FROM account_account WHERE id = %s', (context['account_id'], )) res = cr.fetchone() res = _('Entries: ')+ (res[0] or '') return res if (not context.get('journal_id', False)) or (not context.get('period_id', False)): return False - cr.execute('select code from account_journal where id=%s', (context['journal_id'],)) + cr.execute('SELECT code FROM account_journal WHERE id = %s', (context['journal_id'], )) j = cr.fetchone()[0] or '' - cr.execute('select code from account_period where id=%s', (context['period_id'],)) + cr.execute('SELECT code FROM account_period WHERE id = %s', (context['period_id'], )) p = cr.fetchone()[0] or '' if j or p: return j+(p and (':'+p) or '') @@ -857,22 +843,18 @@ class account_move_line(osv.osv): def fields_view_get(self, cr, uid, view_id=None, view_type='form', context={}, toolbar=False, submenu=False): journal_pool = self.pool.get('account.journal') - result = super(osv.osv, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) if view_type != 'tree': #Remove the toolbar from the form view if view_type == 'form': if result.get('toolbar', False): result['toolbar']['action'] = [] - #Restrict the list of journal view in search view if view_type == 'search' and result['fields'].get('journal_id', False): result['fields']['journal_id']['selection'] = journal_pool.name_search(cr, uid, '', [], context=context) return result - if context.get('view_mode', False): return result - fld = [] fields = {} flds = [] @@ -895,45 +877,38 @@ class account_move_line(osv.osv): else: fields.get(field.field).append(journal.id) common_fields[field.field] = common_fields[field.field] + 1 - fld.append(('period_id', 3, 'Period')) fld.append(('journal_id', 10, 'Journal')) flds.append('period_id') flds.append('journal_id') fields['period_id'] = all_journal fields['journal_id'] = all_journal - fld = sorted(fld, key=itemgetter(1)) - widths = { 'statement_id': 50, 'state': 60, 'tax_code_id': 50, 'move_id': 40, } - for field_it in fld: field = field_it[0] - if common_fields.get(field) == total: fields.get(field).append(None) - # if field=='state': # state = 'colors="red:state==\'draft\'"' - attrs = [] if field == 'debit': - attrs.append('sum="Total debit"') + attrs.append('sum = "Total debit"') elif field == 'credit': - attrs.append('sum="Total credit"') + attrs.append('sum = "Total credit"') elif field == 'move_id': - attrs.append('required="False"') + attrs.append('required = "False"') elif field == 'account_tax_id': - attrs.append('domain="[(\'parent_id\',\'=\',False)]"') - attrs.append("context=\"{'journal_id':journal_id}\"") + attrs.append('domain="[(\'parent_id\', \'=\' ,False)]"') + attrs.append("context=\"{'journal_id': journal_id}\"") elif field == 'account_id' and journal.id: attrs.append('domain="[(\'journal_id\', \'=\', '+str(journal.id)+'),(\'type\',\'<>\',\'view\'), (\'type\',\'<>\',\'closed\')]" on_change="onchange_account_id(account_id, partner_id)"') @@ -942,17 +917,17 @@ class account_move_line(osv.osv): attrs.append('on_change="onchange_partner_id(move_id, partner_id, account_id, debit, credit, date, journal_id)"') elif field == 'journal_id': - attrs.append("context=\"{'journal_id':journal_id}\"") + attrs.append("context=\"{'journal_id': journal_id}\"") elif field == 'statement_id': - attrs.append("domain=\"[('state','!=','confirm'),('journal_id.type','=','bank')]\"") + attrs.append("domain=\"[('state', '!=', 'confirm'),('journal_id.type', '=', 'bank')]\"") elif field == 'date': attrs.append('on_change="onchange_date(date)"') if field in ('amount_currency', 'currency_id'): - attrs.append('on_change="onchange_currency(account_id, amount_currency,currency_id, date, journal_id)"') - attrs.append('''attrs="{'readonly':[('state','=','valid')]}"''') + attrs.append('on_change="onchange_currency(account_id, amount_currency, currency_id, date, journal_id)"') + attrs.append('''attrs="{'readonly': [('state', '=', 'valid')]}"''') if field in widths: attrs.append('width="'+str(widths[field])+'"') @@ -967,7 +942,7 @@ class account_move_line(osv.osv): def _check_moves(self, cr, uid, context): # use the first move ever created for this journal and period - cr.execute('select id, state, name from account_move where journal_id=%s and period_id=%s order by id limit 1', (context['journal_id'],context['period_id'])) + cr.execute('SELECT id, state, name FROM account_move WHERE journal_id = %s AND period_id = %s ORDER BY id limit 1', (context['journal_id'],context['period_id'])) res = cr.fetchone() if res: if res[1] != 'draft': @@ -983,7 +958,7 @@ class account_move_line(osv.osv): unlink_ids = [] if not move_ids: return True - recs = obj_move_line.read(cr, uid, move_ids, ['reconcile_id','reconcile_partial_id']) + recs = obj_move_line.read(cr, uid, move_ids, ['reconcile_id', 'reconcile_partial_id']) full_recs = filter(lambda x: x['reconcile_id'], recs) rec_ids = [rec['reconcile_id'][0] for rec in full_recs] part_recs = filter(lambda x: x['reconcile_partial_id'], recs) @@ -995,19 +970,23 @@ class account_move_line(osv.osv): return True def unlink(self, cr, uid, ids, context={}, check=True): + move_obj = self.pool.get('account.move') self._update_check(cr, uid, ids, context) result = False for line in self.browse(cr, uid, ids, context): - context['journal_id']=line.journal_id.id - context['period_id']=line.period_id.id + context['journal_id'] = line.journal_id.id + context['period_id'] = line.period_id.id result = super(account_move_line, self).unlink(cr, uid, [line.id], context=context) if check: - self.pool.get('account.move').validate(cr, uid, [line.move_id.id], context=context) + move_obj.validate(cr, uid, [line.move_id.id], context=context) return result def _check_date(self, cr, uid, vals, context=None, check=True): if context is None: context = {} + move_obj = self.pool.get('account.move') + journal_obj = self.pool.get('account.journal') + period_obj = self.pool.get('account.period') journal_id = False if 'date' in vals.keys(): if 'journal_id' in vals and 'journal_id' not in context: @@ -1016,17 +995,17 @@ class account_move_line(osv.osv): period_id = vals['period_id'] elif 'journal_id' not in context and 'move_id' in vals: if vals.get('move_id', False): - m = self.pool.get('account.move').browse(cr, uid, vals['move_id']) + m = move_obj.browse(cr, uid, vals['move_id']) journal_id = m.journal_id.id period_id = m.period_id.id else: - journal_id = context.get('journal_id',False) - period_id = context.get('period_id',False) + journal_id = context.get('journal_id', False) + period_id = context.get('period_id', False) if journal_id: - journal = self.pool.get('account.journal').browse(cr, uid, [journal_id])[0] + journal = journal_obj.browse(cr, uid, [journal_id])[0] if journal.allow_date and period_id: - period = self.pool.get('account.period').browse(cr, uid, [period_id])[0] - if not time.strptime(vals['date'][:10],'%Y-%m-%d')>=time.strptime(period.date_start,'%Y-%m-%d') or not time.strptime(vals['date'][:10],'%Y-%m-%d')<=time.strptime(period.date_stop,'%Y-%m-%d'): + period = period_obj.browse(cr, uid, [period_id])[0] + if not time.strptime(vals['date'][:10],'%Y-%m-%d') >= time.strptime(period.date_start, '%Y-%m-%d') or not time.strptime(vals['date'][:10], '%Y-%m-%d') <= time.strptime(period.date_stop, '%Y-%m-%d'): raise osv.except_osv(_('Error'),_('The date of your Journal Entry is not in the defined period!')) else: return True @@ -1036,6 +1015,7 @@ class account_move_line(osv.osv): context={} move_obj = self.pool.get('account.move') account_obj = self.pool.get('account.account') + journal_obj = self.pool.get('account.journal') if vals.get('account_tax_id', False): raise osv.except_osv(_('Unable to change tax !'), _('You can not change the tax, you should remove and recreate lines !')) self._check_date(cr, uid, vals, context, check) @@ -1050,7 +1030,7 @@ class account_move_line(osv.osv): todo_date = vals['date'] del vals['date'] - for line in self.browse(cr, uid, ids,context=context): + for line in self.browse(cr, uid, ids, context=context): ctx = context.copy() if ('journal_id' not in ctx): if line.move_id: @@ -1063,12 +1043,10 @@ class account_move_line(osv.osv): else: ctx['period_id'] = line.period_id.id #Check for centralisation - journal = self.pool.get('account.journal').browse(cr, uid, ctx['journal_id'], context=ctx) + journal = journal_obj.browse(cr, uid, ctx['journal_id'], context=ctx) if journal.centralisation: self._check_moves(cr, uid, context=ctx) - result = super(account_move_line, self).write(cr, uid, ids, vals, context) - if check: done = [] for line in self.browse(cr, uid, ids): @@ -1080,15 +1058,18 @@ class account_move_line(osv.osv): return result def _update_journal_check(self, cr, uid, journal_id, period_id, context={}): - cr.execute('select state from account_journal_period where journal_id=%s and period_id=%s', (journal_id, period_id)) + journal_obj = self.pool.get('account.journal') + period_obj = self.pool.get('account.period') + jour_period_obj = self.pool.get('account.journal.period') + cr.execute('SELECT state FROM account_journal_period WHERE journal_id = %s AND period_id = %s', (journal_id, period_id)) result = cr.fetchall() for (state,) in result: - if state=='done': + if state == 'done': raise osv.except_osv(_('Error !'), _('You can not add/modify entries in a closed journal.')) if not result: - journal = self.pool.get('account.journal').browse(cr, uid, journal_id, context) - period = self.pool.get('account.period').browse(cr, uid, period_id, context) - self.pool.get('account.journal.period').create(cr, uid, { + journal = journal_obj.browse(cr, uid, journal_id, context) + period = period_obj.browse(cr, uid, period_id, context) + jour_period_obj.create(cr, uid, { 'name': (journal.code or journal.name)+':'+(period.name or ''), 'journal_id': journal.id, 'period_id': period.id @@ -1098,7 +1079,7 @@ class account_move_line(osv.osv): def _update_check(self, cr, uid, ids, context={}): done = {} for line in self.browse(cr, uid, ids, context): - if line.move_id.state<>'draft': + if line.move_id.state <> 'draft': raise osv.except_osv(_('Error !'), _('You can not do this modification on a confirmed entry ! Please note that you can just change some non important fields !')) if line.reconcile_id: raise osv.except_osv(_('Error !'), _('You can not do this modification on a reconciled entry ! Please note that you can just change some non important fields !')) @@ -1113,6 +1094,7 @@ class account_move_line(osv.osv): tax_obj = self.pool.get('account.tax') move_obj = self.pool.get('account.move') cur_obj = self.pool.get('res.currency') + journal_obj = self.pool.get('account.journal') if context is None: context = {} self._check_date(cr, uid, vals, context, check) @@ -1129,7 +1111,7 @@ class account_move_line(osv.osv): self._update_journal_check(cr, uid, context['journal_id'], context['period_id'], context) move_id = vals.get('move_id', False) - journal = self.pool.get('account.journal').browse(cr, uid, context['journal_id']) + journal = journal_obj.browse(cr, uid, context['journal_id']) # is_new_move = False if not move_id: if journal.centralisation: @@ -1137,7 +1119,6 @@ class account_move_line(osv.osv): res = self._check_moves(cr, uid, context) if res: vals['move_id'] = res[0] - if not vals.get('move_id', False): if journal.sequence_id: #name = self.pool.get('ir.sequence').get_id(cr, uid, journal.sequence_id.id) @@ -1151,7 +1132,6 @@ class account_move_line(osv.osv): else: raise osv.except_osv(_('No piece number !'), _('Can not create an automatic sequence for this piece !\n\nPut a sequence in the journal definition for automatic numbering or create a sequence manually for this piece.')) # is_new_move = True - ok = not (journal.type_control_ids or journal.account_control_ids) if ('account_id' in vals): account = account_obj.browse(cr, uid, vals['account_id']) @@ -1166,7 +1146,6 @@ class account_move_line(osv.osv): if a.id == vals['account_id']: ok = True break - # Automatically convert in the account's secondary currency if there is one and # the provided values were not already multi-currency if account.currency_id and 'amount_currency' not in vals and account.currency_id.id != account.company_id.currency_id.id: @@ -1175,8 +1154,7 @@ class account_move_line(osv.osv): if 'date' in vals: ctx['date'] = vals['date'] vals['amount_currency'] = cur_obj.compute(cr, uid, account.company_id.currency_id.id, - account.currency_id.id, vals.get('debit', 0.0)-vals.get('credit', 0.0), - context=ctx) + account.currency_id.id, vals.get('debit', 0.0)-vals.get('credit', 0.0), context=ctx) if not ok: raise osv.except_osv(_('Bad account !'), _('You can not use this general account in this journal !')) @@ -1195,7 +1173,6 @@ class account_move_line(osv.osv): })] result = super(osv.osv, self).create(cr, uid, vals, context=context) - # CREATE Taxes if vals.get('account_tax_id', False): tax_id = tax_obj.browse(cr, uid, vals['account_tax_id']) @@ -1212,7 +1189,6 @@ class account_move_line(osv.osv): account_id = 'account_collected_id' base_sign = 'base_sign' tax_sign = 'tax_sign' - tmp_cnt = 0 for tax in tax_obj.compute_all(cr, uid, [tax_id], total, 1.00).get('taxes'): #create the base movement @@ -1241,7 +1217,6 @@ class account_move_line(osv.osv): } if data['tax_code_id']: self.create(cr, uid, data, context) - #create the VAT movement data = { 'move_id': vals['move_id'], @@ -1263,9 +1238,9 @@ class account_move_line(osv.osv): del vals['account_tax_id'] if check and ((not context.get('no_store_function')) or journal.entry_posted): - tmp = self.pool.get('account.move').validate(cr, uid, [vals['move_id']], context) + tmp = move_obj.validate(cr, uid, [vals['move_id']], context) if journal.entry_posted and tmp: - self.pool.get('account.move').button_validate(cr,uid, [vals['move_id']],context) + move_obj.button_validate(cr,uid, [vals['move_id']], context) return result account_move_line()