From 4b548d98d112b6d2d32b95d8d89624f0fac0426b Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 16 Jul 2015 15:44:00 +0200 Subject: [PATCH] [FIX] point_of_sale: payment method selection When giving back change, prioritize the same cache method as the one that was use for the transaction. This prevents cases where cash input is registered in journal B and change in journal A. Fixes #6975, closes #6976 --- addons/point_of_sale/point_of_sale.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index bac0498de36..21f9c803993 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -588,9 +588,10 @@ class pos_order(osv.osv): def _process_order(self, cr, uid, order, context=None): order_id = self.create(cr, uid, self._order_fields(cr, uid, order, context=context),context) - + journal_ids = set() for payments in order['statement_ids']: self.add_payment(cr, uid, order_id, self._payment_fields(cr, uid, payments[2], context=context), context=context) + journal_ids.add(payments[2]['journal_id']) session = self.pool.get('pos.session').browse(cr, uid, order['pos_session_id'], context=context) if session.sequence_number <= order['sequence_number']: @@ -600,16 +601,26 @@ class pos_order(osv.osv): if not float_is_zero(order['amount_return'], self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')): cash_journal = session.cash_journal_id if not cash_journal: - cash_journal_ids = filter(lambda st: st.journal_id.type=='cash', session.statement_ids) - if not len(cash_journal_ids): - raise osv.except_osv( _('error!'), - _("No cash statement found for this session. Unable to record returned cash.")) - cash_journal = cash_journal_ids[0].journal_id + # Select for change one of the cash journals used in this payment + cash_journal_ids = self.pool['account.journal'].search(cr, uid, [ + ('type', '=', 'cash'), + ('id', 'in', list(journal_ids)), + ], limit=1, context=context) + if not cash_journal_ids: + # If none, select for change one of the cash journals of the POS + # This is used for example when a customer pays by credit card + # an amount higher than total amount of the order and gets cash back + cash_journal_ids = [statement.journal_id.id for statement in session.statement_ids + if statement.journal_id.type == 'cash'] + if not cash_journal_ids: + raise osv.except_osv( _('error!'), + _("No cash statement found for this session. Unable to record returned cash.")) + cash_journal = cash_journal_ids[0] self.add_payment(cr, uid, order_id, { 'amount': -order['amount_return'], 'payment_date': time.strftime('%Y-%m-%d %H:%M:%S'), 'payment_name': _('return'), - 'journal': cash_journal.id, + 'journal': cash_journal, }, context=context) return order_id