changeset cb91ca85f587 in modules/product_kit:6.4
details: 
https://hg.tryton.org/modules/product_kit?cmd=changeset&node=cb91ca85f587
description:
        Normalize price ratio from component quantity

        The price ratio is used to convert unit price of kit into unit price of
        component so it must be for 1 unit or the component.

        issue11874
        review424221004
        (grafted from 3127dbf9cd1537f07181161779d9bff7c0d3ebcb)
diffstat:

 common.py                               |  14 +++++++++++---
 tests/scenario_product_kit_purchase.rst |   2 +-
 tests/scenario_product_kit_sale.rst     |   2 +-
 3 files changed, 13 insertions(+), 5 deletions(-)

diffs (69 lines):

diff -r 1d4cc1393e68 -r cb91ca85f587 common.py
--- a/common.py Thu Nov 17 18:57:56 2022 +0100
+++ b/common.py Thu Nov 24 19:19:50 2022 +0100
@@ -147,7 +147,7 @@
                         components = []
                         for component in line.product.components_used:
                             components.append(line.get_component(component))
-                        Component.set_price_ratio(components)
+                        Component.set_price_ratio(components, line.quantity)
                         line.components = components
                     else:
                         for component in line.product.components_used:
@@ -289,7 +289,7 @@
                 return self.line.product.type
 
         @classmethod
-        def set_price_ratio(cls, components):
+        def set_price_ratio(cls, components, quantity):
             "Set price ratio between components"
             pool = Pool()
             Uom = pool.get('product.uom')
@@ -299,7 +299,11 @@
                 product = component.product
                 list_price = Uom.compute_price(
                     product.default_uom, product.list_price,
-                    component.unit) * Decimal(str(component.quantity))
+                    component.unit)
+                if component.fixed:
+                    list_price *= Decimal(str(component.quantity / quantity))
+                else:
+                    list_price *= Decimal(str(component.quantity_ratio))
                 list_prices[component] = list_price
                 sum_ += list_price
 
@@ -308,6 +312,10 @@
                     ratio = list_prices[component] / sum_
                 else:
                     ratio = 1 / len(components)
+                if component.fixed:
+                    ratio /= Decimal(str(component.quantity / quantity))
+                else:
+                    ratio /= Decimal(str(component.quantity_ratio))
                 component.price_ratio = ratio
 
         def get_move(self, type_):
diff -r 1d4cc1393e68 -r cb91ca85f587 tests/scenario_product_kit_purchase.rst
--- a/tests/scenario_product_kit_purchase.rst   Thu Nov 17 18:57:56 2022 +0100
+++ b/tests/scenario_product_kit_purchase.rst   Thu Nov 24 19:19:50 2022 +0100
@@ -253,7 +253,7 @@
     >>> shipment.reload()
     >>> invoice.reload()
     >>> sorted([m.unit_price for m in shipment.incoming_moves])
-    [Decimal('5.0000'), Decimal('5.0000'), Decimal('7.0909'), 
Decimal('18.9091')]
+    [Decimal('5.0000'), Decimal('5.0000'), Decimal('9.4545'), 
Decimal('14.1818')]
 
 Check backorder moves::
 
diff -r 1d4cc1393e68 -r cb91ca85f587 tests/scenario_product_kit_sale.rst
--- a/tests/scenario_product_kit_sale.rst       Thu Nov 17 18:57:56 2022 +0100
+++ b/tests/scenario_product_kit_sale.rst       Thu Nov 24 19:19:50 2022 +0100
@@ -238,7 +238,7 @@
     >>> shipment.reload()
     >>> invoice.reload()
     >>> sorted([m.unit_price for m in shipment.outgoing_moves])
-    [Decimal('10.0000'), Decimal('10.0000'), Decimal('15.0000'), 
Decimal('25.0000')]
+    [Decimal('10.0000'), Decimal('10.0000'), Decimal('25.0000'), 
Decimal('37.5000')]
 
 Check backorder::
 

Reply via email to