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