diff --git a/sale_product_pack/models/product_pack_line.py b/sale_product_pack/models/product_pack_line.py
index c89902b92..d187de27d 100644
--- a/sale_product_pack/models/product_pack_line.py
+++ b/sale_product_pack/models/product_pack_line.py
@@ -28,22 +28,14 @@ def get_sale_order_line_vals(self, line, order):
sol._onchange_product_id_warning()
vals = sol._convert_to_write(sol._cache)
pack_price_types = {"totalized", "ignored"}
- sale_discount = 0.0
- if line.product_id.pack_component_price == "detailed":
- sale_discount = 100.0 - (
- (100.0 - sol.discount) * (100.0 - self.sale_discount) / 100.0
- )
- elif (
+ if (
line.product_id.pack_type == "detailed"
and line.product_id.pack_component_price in pack_price_types
):
vals["price_unit"] = 0.0
- vals.update(
- {
- "discount": sale_discount,
- "name": "{}{}".format("> " * (line.pack_depth + 1), sol.name),
- }
- )
+
+ vals["name"] = "{}{}".format("> " * (line.pack_depth + 1), sol.name)
+
return vals
def price_compute(
diff --git a/sale_product_pack/models/sale_order.py b/sale_product_pack/models/sale_order.py
index 00f518fe7..ea6ed0639 100644
--- a/sale_product_pack/models/sale_order.py
+++ b/sale_product_pack/models/sale_order.py
@@ -60,12 +60,7 @@ def write(self, vals):
def _get_update_prices_lines(self):
res = super()._get_update_prices_lines()
- result = self.order_line.browse()
- index = 0
- while index < len(res):
- line = res[index]
- result |= line
- index += 1
- if line.product_id.pack_ok and line.pack_type == "detailed":
- index += len(line.product_id.pack_line_ids)
- return result
+ return res.filtered(
+ lambda line: not line.pack_parent_line_id
+ or line.pack_parent_line_id.pack_component_price == "detailed"
+ )
diff --git a/sale_product_pack/models/sale_order_line.py b/sale_product_pack/models/sale_order_line.py
index 5c2d79c84..134900957 100644
--- a/sale_product_pack/models/sale_order_line.py
+++ b/sale_product_pack/models/sale_order_line.py
@@ -126,3 +126,21 @@ def action_open_parent_pack_product_view(self):
"view_mode": "tree,form",
"domain": domain,
}
+
+ def _get_pack_line_discount(self):
+ """returns the discount settled in the parent pack lines"""
+ self.ensure_one()
+ discount = 0.0
+ if self.pack_parent_line_id.pack_component_price == "detailed":
+ for pack_line in self.pack_parent_line_id.product_id.pack_line_ids:
+ if pack_line.product_id == self.product_id:
+ discount = pack_line.sale_discount
+ break
+ return discount
+
+ @api.depends("product_id", "product_uom", "product_uom_qty")
+ def _compute_discount(self):
+ res = super()._compute_discount()
+ for pack_line in self.filtered("pack_parent_line_id"):
+ pack_line.discount = pack_line._get_pack_line_discount()
+ return res
diff --git a/sale_product_pack/tests/test_sale_product_pack.py b/sale_product_pack/tests/test_sale_product_pack.py
index d8de12221..390f8dfd1 100644
--- a/sale_product_pack/tests/test_sale_product_pack.py
+++ b/sale_product_pack/tests/test_sale_product_pack.py
@@ -98,7 +98,7 @@ def test_create_components_price_order_line(self):
self.assertAlmostEqual(line.price_subtotal, 27.68)
self.assertEqual(
(self.sale_order.order_line - line).mapped("price_subtotal"),
- [1755.0, 22.5, 885.0],
+ [1579.5, 20.25, 796.5],
)
def test_create_ignored_price_order_line(self):
diff --git a/sale_product_pack/views/product_pack_line_views.xml b/sale_product_pack/views/product_pack_line_views.xml
index e5cedcf6d..b4ca38772 100644
--- a/sale_product_pack/views/product_pack_line_views.xml
+++ b/sale_product_pack/views/product_pack_line_views.xml
@@ -39,7 +39,7 @@