diff --git a/addons/delivery/models/delivery_grid.py b/addons/delivery/models/delivery_grid.py index 063c6bb1624..cdb8cd7df74 100644 --- a/addons/delivery/models/delivery_grid.py +++ b/addons/delivery/models/delivery_grid.py @@ -104,7 +104,11 @@ class ProviderGrid(models.Model): total = (order.amount_total or 0.0) - total_delivery total = self._compute_currency(order, total, 'pricelist_to_company') - + # weight is either, + # 1- weight chosen by user in choose.delivery.carrier wizard passed by context + # 2- saved weight to use on sale order + # 3- total order line weight as fallback + weight = self.env.context.get('order_weight') or order.shipping_weight or weight return self._get_price_from_picking(total, weight, volume, quantity) def _get_price_dict(self, total, weight, volume, quantity): diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py index eb290a3b525..41bec980a38 100644 --- a/addons/delivery/models/sale_order.py +++ b/addons/delivery/models/sale_order.py @@ -14,6 +14,7 @@ class SaleOrder(models.Model): delivery_set = fields.Boolean(compute='_compute_delivery_state') recompute_delivery_price = fields.Boolean('Delivery cost should be recomputed') is_all_service = fields.Boolean("Service Product", compute="_compute_is_service_products") + shipping_weight = fields.Float("Shipping Weight", compute="_compute_shipping_weight", store=True, readonly=False) @api.depends('order_line') def _compute_is_service_products(self): @@ -79,6 +80,7 @@ class SaleOrder(models.Model): 'context': { 'default_order_id': self.id, 'default_carrier_id': carrier.id, + 'default_total_weight': self._get_estimated_weight() } } @@ -143,8 +145,15 @@ class SaleOrder(models.Model): if all(line.product_id.invoice_policy == 'delivery' and line.invoice_status == 'no' for line in order_lines): order.invoice_status = 'no' + @api.depends('order_line.product_uom_qty', 'order_line.product_uom') + def _compute_shipping_weight(self): + for order in self: + order.shipping_weight = order._get_estimated_weight() + def _get_estimated_weight(self): self.ensure_one() + if self.delivery_set: + return self.shipping_weight weight = 0.0 for order_line in self.order_line.filtered(lambda l: l.product_id.type in ['product', 'consu'] and not l.is_delivery and not l.display_type): weight += order_line.product_qty * order_line.product_id.weight diff --git a/addons/delivery/views/delivery_view.xml b/addons/delivery/views/delivery_view.xml index 00ea2743f8c..e573fff7ddf 100644 --- a/addons/delivery/views/delivery_view.xml +++ b/addons/delivery/views/delivery_view.xml @@ -353,7 +353,11 @@ recompute_delivery_price and is_delivery + + + + diff --git a/addons/delivery/wizard/choose_delivery_carrier.py b/addons/delivery/wizard/choose_delivery_carrier.py index b8914b2acc6..f2e904363b7 100644 --- a/addons/delivery/wizard/choose_delivery_carrier.py +++ b/addons/delivery/wizard/choose_delivery_carrier.py @@ -9,6 +9,9 @@ class ChooseDeliveryCarrier(models.TransientModel): _name = 'choose.delivery.carrier' _description = 'Delivery Carrier Selection Wizard' + def _get_default_weight_uom(self): + return self.env['product.template']._get_weight_uom_name_from_ir_config_parameter() + order_id = fields.Many2one('sale.order', required=True, ondelete="cascade") partner_id = fields.Many2one('res.partner', related='order_id.partner_id', required=True) carrier_id = fields.Many2one( @@ -24,8 +27,10 @@ class ChooseDeliveryCarrier(models.TransientModel): available_carrier_ids = fields.Many2many("delivery.carrier", compute='_compute_available_carrier', string="Available Carriers") invoicing_message = fields.Text(compute='_compute_invoicing_message') delivery_message = fields.Text(readonly=True) + total_weight = fields.Float(string='Total Order Weight', related='order_id.shipping_weight', readonly=False) + weight_uom_name = fields.Char(readonly=True, default=_get_default_weight_uom) - @api.onchange('carrier_id') + @api.onchange('carrier_id', 'total_weight') def _onchange_carrier_id(self): self.delivery_message = False if self.delivery_type in ('fixed', 'base_on_rule'): @@ -64,7 +69,7 @@ class ChooseDeliveryCarrier(models.TransientModel): rec.available_carrier_ids = carriers.available_carriers(rec.order_id.partner_shipping_id) if rec.partner_id else carriers def _get_shipment_rate(self): - vals = self.carrier_id.rate_shipment(self.order_id) + vals = self.carrier_id.with_context(order_weight=self.total_weight).rate_shipment(self.order_id) if vals.get('success'): self.delivery_message = vals.get('warning_message', False) self.delivery_price = vals['price'] diff --git a/addons/delivery/wizard/choose_delivery_carrier_views.xml b/addons/delivery/wizard/choose_delivery_carrier_views.xml index 2c4fdd8b091..1c569d95ff8 100644 --- a/addons/delivery/wizard/choose_delivery_carrier_views.xml +++ b/addons/delivery/wizard/choose_delivery_carrier_views.xml @@ -9,6 +9,11 @@ +