diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index 2115fdd5249..5d0b3526740 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -701,6 +701,23 @@ class pos_order(osv.osv): return new_session_id + def _match_payment_to_invoice(self, cr, uid, order, context=None): + account_precision = self.pool.get('decimal.precision').precision_get(cr, uid, 'Account') + + # ignore orders with an amount_paid of 0 because those are returns through the POS + if not float_is_zero(order['amount_return'], account_precision) and not float_is_zero(order['amount_paid'], account_precision): + cur_amount_paid = 0 + payments_to_keep = [] + for payment in order.get('statement_ids'): + if cur_amount_paid + payment[2]['amount'] > order['amount_total']: + payment[2]['amount'] = order['amount_total'] - cur_amount_paid + payments_to_keep.append(payment) + break + cur_amount_paid += payment[2]['amount'] + payments_to_keep.append(payment) + order['statement_ids'] = payments_to_keep + order['amount_return'] = 0 + def _process_order(self, cr, uid, order, context=None): session = self.pool.get('pos.session').browse(cr, uid, order['pos_session_id'], context=context) @@ -757,6 +774,10 @@ class pos_order(osv.osv): for tmp_order in orders_to_save: to_invoice = tmp_order['to_invoice'] order = tmp_order['data'] + + if to_invoice: + self._match_payment_to_invoice(cr, uid, order, context=context) + order_id = self._process_order(cr, uid, order, context=context) order_ids.append(order_id)