From 5ae60d8a2d432cf3280487743b9f413f6ef27e08 Mon Sep 17 00:00:00 2001 From: qdp-odoo Date: Fri, 18 Jul 2014 15:43:00 +0200 Subject: [PATCH] [FIX] point_of_sale: fixed errors that avoid closing a pos session + [IMP] account: added back the account_id field on statement.line obj to ease the reconciliation process when importing statements (or creating them through pos.orders). Fix #932 --- addons/account/account_bank_statement.py | 21 +++++++++++++++---- .../account/static/src/js/account_widgets.js | 2 +- addons/point_of_sale/point_of_sale.py | 20 ++++++++++++++---- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 65dae8a2cc1..138c968a9c0 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -326,16 +326,26 @@ class account_bank_statement(osv.osv): or (not st.journal_id.default_debit_account_id): raise osv.except_osv(_('Configuration Error!'), _('Please verify that an account is defined in the journal.')) for line in st.move_line_ids: - if line.state <> 'valid': + if line.state != 'valid': raise osv.except_osv(_('Error!'), _('The account entries lines are not in valid state.')) move_ids = [] for st_line in st.line_ids: if not st_line.amount: continue - if not st_line.journal_entry_id.id: + if st_line.account_id and not st_line.journal_entry_id.id: + #make an account move as before + vals = { + 'debit': st_line.amount < 0 and -st_line.amount or 0.0, + 'credit': st_line.amount > 0 and st_line.amount or 0.0, + 'account_id': st_line.account_id.id, + 'name': st_line.name + } + self.pool.get('account.bank.statement.line').process_reconciliation(cr, uid, st_line.id, [vals], context=context) + elif not st_line.journal_entry_id.id: raise osv.except_osv(_('Error!'), _('All the account entries lines must be processed in order to close the statement.')) move_ids.append(st_line.journal_entry_id.id) - self.pool.get('account.move').post(cr, uid, move_ids, context=context) + if move_ids: + self.pool.get('account.move').post(cr, uid, move_ids, context=context) self.message_post(cr, uid, [st.id], body=_('Statement %s confirmed, journal items were created.') % (st.name,), context=context) self.link_bank_to_partner(cr, uid, ids, context=context) return self.write(cr, uid, ids, {'state': 'confirm'}, context=context) @@ -728,7 +738,9 @@ class account_bank_statement_line(osv.osv): move_id = am_obj.create(cr, uid, move_vals, context=context) # Create the move line for the statement line - amount = currency_obj.compute(cr, uid, st_line.statement_id.currency.id, company_currency.id, st_line.amount, context=context) + ctx = context.copy() + ctx['date'] = st_line.date + amount = currency_obj.compute(cr, uid, st_line.statement_id.currency.id, company_currency.id, st_line.amount, context=ctx) bank_st_move_vals = bs_obj._prepare_bank_move_line(cr, uid, st_line, move_id, amount, company_currency.id, context=context) aml_obj.create(cr, uid, bank_st_move_vals, context=context) # Complete the dicts @@ -810,6 +822,7 @@ class account_bank_statement_line(osv.osv): 'amount': fields.float('Amount', digits_compute=dp.get_precision('Account')), 'partner_id': fields.many2one('res.partner', 'Partner'), 'bank_account_id': fields.many2one('res.partner.bank','Bank Account'), + 'account_id': fields.many2one('account.account', 'Account', help="This technical field can be used at the statement line creation/import time in order to avoid the reconciliation process on it later on. The statement line will simply create a counterpart on this account"), 'statement_id': fields.many2one('account.bank.statement', 'Statement', select=True, required=True, ondelete='cascade'), 'journal_id': fields.related('statement_id', 'journal_id', type='many2one', relation='account.journal', string='Journal', store=True, readonly=True), 'ref': fields.char('Structured Communication'), diff --git a/addons/account/static/src/js/account_widgets.js b/addons/account/static/src/js/account_widgets.js index 3b04058c33f..c9bdaac7071 100644 --- a/addons/account/static/src/js/account_widgets.js +++ b/addons/account/static/src/js/account_widgets.js @@ -139,7 +139,7 @@ openerp.account = function (instance) { } // Retreive statement infos and reconciliation data from the model - var lines_filter = [['journal_entry_id', '=', false]]; + var lines_filter = [['journal_entry_id', '=', false], ['account_id', '=', false]]; var deferred_promises = []; if (self.statement_id) { diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index 5c8103c7626..f202f4ffdd8 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -492,6 +492,8 @@ class pos_session(osv.osv): pos_order_obj._create_account_move_line(cr, uid, order_ids, session, move_id, context=local_context) for order in session.order_ids: + if order.state == 'done': + continue if order.state not in ('paid', 'invoiced'): raise osv.except_osv( _('Error!'), @@ -811,6 +813,16 @@ class pos_order(osv.osv): 'name': order.name + ': ' + (data.get('payment_name', '') or ''), 'partner_id': order.partner_id and order.partner_id.id or None, } + account_def = property_obj.get(cr, uid, 'property_account_receivable', 'res.partner', context=context) + args['account_id'] = (order.partner_id and order.partner_id.property_account_receivable \ + and order.partner_id.property_account_receivable.id) or (account_def and account_def.id) or False + + if not args['account_id']: + if not args['partner_id']: + msg = _('There is no receivable account defined to make payment.') + else: + msg = _('There is no receivable account defined to make payment for the partner: "%s" (id:%d).') % (order.partner_id.name, order.partner_id.id,) + raise osv.except_osv(_('Configuration Error!'), msg) context.pop('pos_session_id', False) @@ -830,10 +842,10 @@ class pos_order(osv.osv): raise osv.except_osv(_('Error!'), _('You have to open at least one cashbox.')) args.update({ - 'statement_id' : statement_id, - 'pos_statement_id' : order_id, - 'journal_id' : journal_id, - 'ref' : order.session_id.name, + 'statement_id': statement_id, + 'pos_statement_id': order_id, + 'journal_id': journal_id, + 'ref': order.session_id.name, }) statement_line_obj.create(cr, uid, args, context=context)