From 5a23012694a9e362d0c5077d45a307ccf528f834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 30 Mar 2023 19:11:27 +0200 Subject: [PATCH] Remove unit price to compute price list Instead the value of unit price comes from the product and is defined on the price list. --- modules/product_price_list/CHANGELOG | 2 + modules/product_price_list/price_list.py | 34 +++--- .../product_price_list/tests/test_module.py | 45 ++++---- .../view/price_list_form.xml | 2 + modules/product_price_list_dates/product.py | 5 +- .../tests/test_module.py | 109 ++++++++++-------- modules/product_price_list_parent/product.py | 10 +- .../tests/test_module.py | 5 +- modules/purchase_price_list/product.py | 3 +- modules/sale_price_list/product.py | 2 +- .../tests/scenario_sale_price_list.rst | 2 +- 11 files changed, 123 insertions(+), 96 deletions(-) diff --git a/modules/product_price_list/CHANGELOG b/modules/product_price_list/CHANGELOG index f637acd668..5264cc7136 100644 --- a/modules/product_price_list/CHANGELOG +++ b/modules/product_price_list/CHANGELOG @@ -1,3 +1,5 @@ +* Define the value of 'unit_price' on price list +* Remove unit price to compute price list * Remove party to compute price list Version 6.8.0 - 2023-05-01 diff --git a/modules/product_price_list/price_list.py b/modules/product_price_list/price_list.py index aff2dbf660..7a75124afc 100644 --- a/modules/product_price_list/price_list.py +++ b/modules/product_price_list/price_list.py @@ -17,7 +17,7 @@ from .exceptions import FormulaError @total_ordering -class Null: +class Null(Decimal): def __eq__(self, other): if isinstance(other, Null) or other is None: return True @@ -55,6 +55,12 @@ class PriceList(DeactivableMixin, ModelSQL, ModelView): ('product_default', "Product Default"), ], "Unit", required=True, help="The unit in which the quantity is expressed.") + price = fields.Selection([ + (None, ""), + ('list_price', "List price"), + ('cost_price', "Cost Price"), + ], "Price", + help="The value used for 'unit_price'.") lines = fields.One2Many( 'product.price_list.line', 'price_list', "Lines", help="Add price formulas for different criteria.\n" @@ -72,28 +78,31 @@ class PriceList(DeactivableMixin, ModelSQL, ModelView): def default_unit(cls): return 'product_default' - def get_context_formula( - self, product, unit_price, quantity, uom, pattern=None): + def get_context_formula(self, product, quantity, uom, pattern=None): if product: cost_price = product.get_multivalue('cost_price') or Decimal('0') list_price = product.list_price_used - if list_price is None: - list_price = unit_price else: cost_price = Decimal('0') - list_price = unit_price + list_price = Null() + if self.price == 'list_price': + unit_price = list_price + elif self.price == 'cost_price': + unit_price = cost_price + else: + unit_price = Null() return { 'names': { 'unit_price': unit_price if unit_price is not None else Null(), - 'cost_price': cost_price if unit_price is not None else Null(), - 'list_price': list_price if unit_price is not None else Null(), + 'cost_price': cost_price if cost_price is not None else Null(), + 'list_price': list_price if list_price is not None else Null(), }, } def get_uom(self, product): return product.default_uom - def compute(self, product, unit_price, quantity, uom, pattern=None): + def compute(self, product, quantity, uom, pattern=None): Uom = Pool().get('product.uom') def parents(categories): @@ -114,14 +123,13 @@ class PriceList(DeactivableMixin, ModelSQL, ModelView): self.get_uom(product), round=False) if product else quantity context = self.get_context_formula( - product, unit_price, quantity, uom, pattern=pattern) + product, quantity, uom, pattern=pattern) for line in self.lines: if line.match(pattern): unit_price = line.get_unit_price(**context) if isinstance(unit_price, Null): unit_price = None - break - return unit_price + return unit_price class PriceListLine(sequence_ordered(), ModelSQL, ModelView, MatchMixin): @@ -169,7 +177,7 @@ class PriceListLine(sequence_ordered(), ModelSQL, ModelView, MatchMixin): return for line in lines: context = line.price_list.get_context_formula( - product=None, unit_price=Decimal('0'), quantity=0, uom=None) + product=None, quantity=0, uom=None) try: if not isinstance(line.get_unit_price(**context), Decimal): raise ValueError diff --git a/modules/product_price_list/tests/test_module.py b/modules/product_price_list/tests/test_module.py index 32ca5c3efe..d71278980f 100644 --- a/modules/product_price_list/tests/test_module.py +++ b/modules/product_price_list/tests/test_module.py @@ -5,6 +5,7 @@ from decimal import Decimal from trytond.modules.company.tests import ( CompanyTestMixin, create_company, set_company) +from trytond.modules.product_price_list.price_list import Null from trytond.pool import Pool from trytond.tests.test_tryton import ModuleTestCase, with_transaction @@ -13,6 +14,17 @@ class ProductPriceListTestCase(CompanyTestMixin, ModuleTestCase): 'Test ProductPriceList module' module = 'product_price_list' + def test_null(self): + "Test Null object" + none = None + self.assertEqual(Null() == Null(), True) + self.assertEqual(Null() == none, True) + self.assertEqual(Null() == 0, False) + self.assertEqual(Null() < 1, True) + self.assertEqual(Null() < 0, False) + self.assertEqual(Null() + 1, Null()) + self.assertEqual(1 + Null(), Null()) + @with_transaction() def test_price_list(self): 'Test price_list' @@ -44,6 +56,7 @@ class ProductPriceListTestCase(CompanyTestMixin, ModuleTestCase): price_list, = PriceList.create([{ 'name': 'Default Price List', + 'price': 'list_price', 'lines': [('create', [{ 'quantity': 10.0, 'product': variant.id, @@ -70,9 +83,7 @@ class ProductPriceListTestCase(CompanyTestMixin, ModuleTestCase): ] for product, quantity, unit, result in tests: self.assertEqual( - price_list.compute( - product, product.list_price, quantity, unit), - result) + price_list.compute(product, quantity, unit), result) @with_transaction() def test_price_list_category(self): @@ -106,6 +117,7 @@ class ProductPriceListTestCase(CompanyTestMixin, ModuleTestCase): price_list, = PriceList.create([{ 'name': "Price List", + 'price': 'list_price', 'lines': [('create', [{ 'category': category.id, 'formula': 'unit_price * 0.8', @@ -114,23 +126,18 @@ class ProductPriceListTestCase(CompanyTestMixin, ModuleTestCase): }])], }]) - self.assertEqual( - price_list.compute(product, product.list_price, 1, unit), - Decimal(8)) + self.assertEqual(price_list.compute(product, 1, unit), Decimal(8)) template.categories = [] template.save() self.assertEqual( - price_list.compute(product, product.list_price, 1, unit), - Decimal(10)) + price_list.compute(product, 1, unit), Decimal(10)) template.categories = [child_category] template.save() - self.assertEqual( - price_list.compute(product, product.list_price, 1, unit), - Decimal(8)) + self.assertEqual(price_list.compute(product, 1, unit), Decimal(8)) @with_transaction() def test_price_list_cost_price(self): @@ -162,16 +169,12 @@ class ProductPriceListTestCase(CompanyTestMixin, ModuleTestCase): }])], }]) - self.assertEqual( - price_list.compute(product, product.list_price, 1, unit), - Decimal(0)) + self.assertEqual(price_list.compute(product, 1, unit), Decimal(0)) product.cost_price = Decimal(5) product.save() - self.assertEqual( - price_list.compute(product, product.list_price, 1, unit), - Decimal(6)) + self.assertEqual(price_list.compute(product, 1, unit), Decimal(6)) @with_transaction() def test_price_list_list_price(self): @@ -203,9 +206,7 @@ class ProductPriceListTestCase(CompanyTestMixin, ModuleTestCase): }])], }]) - self.assertEqual( - price_list.compute(product, Decimal(0), 1, unit), - Decimal(8)) + self.assertEqual(price_list.compute(product, 1, unit), Decimal(8)) @with_transaction() def test_price_list_with_none(self): @@ -224,9 +225,7 @@ class ProductPriceListTestCase(CompanyTestMixin, ModuleTestCase): 'formula': 'list_price * 0.8', }])], }]) - self.assertEqual( - price_list.compute(None, None, 1, unit), - None) + self.assertEqual(price_list.compute(None, 1, unit), None) del ModuleTestCase diff --git a/modules/product_price_list/view/price_list_form.xml b/modules/product_price_list/view/price_list_form.xml index 857200b1d3..b4806a79bd 100644 --- a/modules/product_price_list/view/price_list_form.xml +++ b/modules/product_price_list/view/price_list_form.xml @@ -19,6 +19,8 @@ this repository contains the full copyright notices and license terms. -->