From 2f6b44d7e02553bd94ab2389d0aa5cff79f5cdb5 Mon Sep 17 00:00:00 2001 From: Michael Tietz Date: Thu, 3 Aug 2023 09:13:20 +0000 Subject: [PATCH] [IMP] delivery: Make delivery line creation and selection hookable closes odoo/odoo#131047 X-original-commit: 1242d6309b9b76c2bea5606facd81d6d20fa8b65 Signed-off-by: Victor Feyens (vfe) --- addons/delivery/models/sale_order.py | 10 ++++---- addons/stock_delivery/models/stock_picking.py | 23 ++++++++++++++----- 2 files changed, 23 insertions(+), 10 deletions(-) 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()