From 784d3cbbcf0e7d6375cdf094e81d3690bfe8815a Mon Sep 17 00:00:00 2001 From: David Tran Date: Fri, 28 Dec 2018 13:41:55 +0000 Subject: [PATCH] [IMP] point_of_sale: more convenient in refund extending and inheritance When creating refund order, Odoo copies the original order and put some default copy data. All these things were put in the same method which causes problems for extensions. This commit split the refund method into multiple dedicated methods so that others can modify/inject more data easily closes odoo/odoo#29792 --- addons/point_of_sale/models/pos_order.py | 66 +++++++++++++++++------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index 2d17216eadc..0a98c07311e 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -937,7 +937,31 @@ class PosOrder(models.Model): self.env['account.bank.statement.line'].with_context(context).create(args) self.amount_paid = sum(payment.amount for payment in self.statement_ids) return args.get('statement_id', False) + + def _prepare_refund_order_data(self, current_session=None): + """ + Prepare data for the creation of refund order based on the current order's data. Inheritance may inject its own data here + @param current_session: the single pos.session record that presents the current session for refunding order. + If not passed, the last closed session of the same original order's sales person will be used + @type current_session: pos.session + + @return: dictionary of default data for the creation of refund order + @rtype: dict + """ + current_session = current_session or self.env['pos.session'].search([('state', '!=', 'closed'), ('user_id', '=', self.env.uid)], limit=1) + return { + # ot used, name forced by create + 'name': self.name + _(' REFUND'), + 'session_id': current_session.id, + 'date_order': fields.Datetime.now(), + 'pos_reference': self.pos_reference, + 'lines': False, + 'amount_tax': -self.amount_tax, + 'amount_total': -self.amount_total, + 'amount_paid': 0, + } + @api.multi def refund(self): """Create a copy of order for refund order""" @@ -946,26 +970,10 @@ class PosOrder(models.Model): if not current_session: raise UserError(_('To return product(s), you need to open a session that will be used to register the refund.')) for order in self: - clone = order.copy({ - # ot used, name forced by create - 'name': order.name + _(' REFUND'), - 'session_id': current_session.id, - 'date_order': fields.Datetime.now(), - 'pos_reference': order.pos_reference, - 'lines': False, - 'amount_tax': -order.amount_tax, - 'amount_total': -order.amount_total, - 'amount_paid': 0, - }) + data_for_copy = order._prepare_refund_order_data(current_session) + clone = order.copy(data_for_copy) for line in order.lines: - clone_line = line.copy({ - # required=True, copy=False - 'name': line.name + _(' REFUND'), - 'order_id': clone.id, - 'qty': -line.qty, - 'price_subtotal': -line.price_subtotal, - 'price_subtotal_incl': -line.price_subtotal_incl, - }) + line.copy(line._prepare_refund_data(clone)) PosOrder += clone return { @@ -1017,6 +1025,26 @@ class PosOrderLine(models.Model): tax_ids_after_fiscal_position = fields.Many2many('account.tax', compute='_get_tax_ids_after_fiscal_position', string='Taxes to Apply') pack_lot_ids = fields.One2many('pos.pack.operation.lot', 'pos_order_line_id', string='Lot/serial Number') + @api.model + def _prepare_refund_data(self, refund_order_id): + """ + This prepares data for refund order line. Inheritance may inject more data here + + @param refund_order_id: the pre-created refund order + @type refund_order_id: pos.order + + @return: dictionary of data which is for creating a refund order line from the original line + @rtype: dict + """ + return { + # required=True, copy=False + 'name': self.name + _(' REFUND'), + 'qty': -self.qty, + 'order_id': refund_order_id.id, + 'price_subtotal': -self.price_subtotal, + 'price_subtotal_incl': -self.price_subtotal_incl, + } + @api.model def create(self, values): if values.get('order_id') and not values.get('name'):