diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py index a2d4f491e97..127b7fa459b 100644 --- a/addons/delivery/models/sale_order.py +++ b/addons/delivery/models/sale_order.py @@ -88,8 +88,7 @@ class SaleOrder(models.Model): } } - def _create_delivery_line(self, carrier, price_unit): - SaleOrderLine = self.env['sale.order.line'] + def _prepare_delivery_line_vals(self, carrier, price_unit): context = {} if self.partner_id: # set delivery detail in the customer language @@ -123,9 +122,12 @@ class SaleOrder(models.Model): values['name'] += '\n' + _('Free Shipping') if self.order_line: values['sequence'] = self.order_line[-1].sequence + 1 - sol = SaleOrderLine.sudo().create(values) del context - return sol + return values + + def _create_delivery_line(self, carrier, price_unit): + values = self._prepare_delivery_line_vals(carrier, price_unit) + return self.env['sale.order.line'].sudo().create(values) @api.depends('order_line.is_delivery', 'order_line.is_downpayment') def _compute_invoice_status(self): diff --git a/addons/stock_delivery/models/stock_picking.py b/addons/stock_delivery/models/stock_picking.py index 5de885181fc..9c6412d4f3f 100644 --- a/addons/stock_delivery/models/stock_picking.py +++ b/addons/stock_delivery/models/stock_picking.py @@ -200,18 +200,29 @@ class StockPicking(models.Model): self.ensure_one() self.carrier_id.get_return_label(self) + def _get_matching_delivery_lines(self): + return self.sale_id.order_line.filtered( + lambda l: l.is_delivery + and l.currency_id.is_zero(l.price_unit) + and l.product_id == self.carrier_id.product_id + ) + + def _prepare_sale_delivery_line_vals(self): + return { + 'price_unit': self.carrier_price, + # remove the estimated price from the description + 'name': self.carrier_id.with_context(lang=self.partner_id.lang).name, + } + def _add_delivery_cost_to_so(self): self.ensure_one() sale_order = self.sale_id if sale_order and self.carrier_id.invoice_policy == 'real' and self.carrier_price: - delivery_lines = sale_order.order_line.filtered(lambda l: l.is_delivery and l.currency_id.is_zero(l.price_unit) and l.product_id == self.carrier_id.product_id) + delivery_lines = self._get_matching_delivery_lines() if not delivery_lines: delivery_lines = sale_order._create_delivery_line(self.carrier_id, self.carrier_price) - delivery_lines[0].write({ - 'price_unit': self.carrier_price, - # remove the estimated price from the description - 'name': self.carrier_id.with_context(lang=self.partner_id.lang).name, - }) + vals = self._prepare_sale_delivery_line_vals() + delivery_lines[0].write(vals) def open_website_url(self): self.ensure_one()