[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
This commit is contained in:
Alexis de Lattre
2015-07-16 15:47:56 +02:00
committed by Martin Trigaux
parent 39d17c2580
commit 4b548d98d1
+18 -7
View File
@@ -588,9 +588,10 @@ class pos_order(osv.osv):
def _process_order(self, cr, uid, order, context=None): def _process_order(self, cr, uid, order, context=None):
order_id = self.create(cr, uid, self._order_fields(cr, uid, order, context=context),context) order_id = self.create(cr, uid, self._order_fields(cr, uid, order, context=context),context)
journal_ids = set()
for payments in order['statement_ids']: for payments in order['statement_ids']:
self.add_payment(cr, uid, order_id, self._payment_fields(cr, uid, payments[2], context=context), context=context) 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) session = self.pool.get('pos.session').browse(cr, uid, order['pos_session_id'], context=context)
if session.sequence_number <= order['sequence_number']: 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')): if not float_is_zero(order['amount_return'], self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')):
cash_journal = session.cash_journal_id cash_journal = session.cash_journal_id
if not cash_journal: if not cash_journal:
cash_journal_ids = filter(lambda st: st.journal_id.type=='cash', session.statement_ids) # Select for change one of the cash journals used in this payment
if not len(cash_journal_ids): cash_journal_ids = self.pool['account.journal'].search(cr, uid, [
raise osv.except_osv( _('error!'), ('type', '=', 'cash'),
_("No cash statement found for this session. Unable to record returned cash.")) ('id', 'in', list(journal_ids)),
cash_journal = cash_journal_ids[0].journal_id ], 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, { self.add_payment(cr, uid, order_id, {
'amount': -order['amount_return'], 'amount': -order['amount_return'],
'payment_date': time.strftime('%Y-%m-%d %H:%M:%S'), 'payment_date': time.strftime('%Y-%m-%d %H:%M:%S'),
'payment_name': _('return'), 'payment_name': _('return'),
'journal': cash_journal.id, 'journal': cash_journal,
}, context=context) }, context=context)
return order_id return order_id