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