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 @@
+
+
+
+
+