From be58a41cbb50b3841fa6f656d2a753e3c4a88f8a Mon Sep 17 00:00:00 2001 From: "Ahmed Khalaf (ahkh)" Date: Mon, 25 Jul 2022 09:12:13 +0000 Subject: [PATCH] [IMP] delivery: set weight for shipping rate Previously, when adding shipment to sale order, the user did not know the total weight of the order when getting rate of shipping method. This commit shows the total order weight to the user with the ability to set it to any value to get the rate with. Taskid: 2797613 Part-of: odoo/odoo#96660 --- addons/delivery/models/delivery_grid.py | 6 +++++- addons/delivery/models/sale_order.py | 9 +++++++++ addons/delivery/views/delivery_view.xml | 4 ++++ addons/delivery/wizard/choose_delivery_carrier.py | 9 +++++++-- addons/delivery/wizard/choose_delivery_carrier_views.xml | 5 +++++ 5 files changed, 30 insertions(+), 3 deletions(-) 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 @@ +