From c47ca22d1e60af38041174f3aea68cd6f3633fb1 Mon Sep 17 00:00:00 2001 From: Telmo Santos Date: Wed, 10 Apr 2024 15:45:41 +0200 Subject: [PATCH] [IMP] product_pricelist_alternative validate alternative pricelist with based formula pricelist --- product_pricelist_alternative/i18n/fr.po | 24 +++++++++++++++++++ .../i18n/product_pricelist_alternative.pot | 23 +++++++++++++++++- .../models/product_pricelist.py | 16 +++++++++++++ .../models/product_pricelist_item.py | 20 +++++++++++++++- .../tests/test_pricelist_alternative.py | 14 ++++++++++- 5 files changed, 94 insertions(+), 3 deletions(-) diff --git a/product_pricelist_alternative/i18n/fr.po b/product_pricelist_alternative/i18n/fr.po index e536a68109e..c701fc336a2 100644 --- a/product_pricelist_alternative/i18n/fr.po +++ b/product_pricelist_alternative/i18n/fr.po @@ -25,6 +25,17 @@ msgstr "Politique de prix alternatifs" msgid "Alternative Pricelists" msgstr "Listes de prix alternatives" +#. module: product_pricelist_alternative +#. odoo-python +#: code:addons/product_pricelist_alternative/models/product_pricelist.py:0 +#, python-format +msgid "" +"Formulas based on another pricelist are not allowed on alternative " +"pricelists." +msgstr "" +"Les formules basées sur un autre liste de prix ne sont pas autorisées sur les listes de prix alternatives " +"alternatifs." + #. module: product_pricelist_alternative #: model:ir.model.fields,field_description:product_pricelist_alternative.field_product_pricelist__alternative_pricelist_ids msgid "Alternative pricelists" @@ -44,3 +55,16 @@ msgstr "Ignorer les alternatives" #: model:ir.model.fields.selection,name:product_pricelist_alternative.selection__product_pricelist_item__alternative_pricelist_policy__use_lower_price msgid "Use lower price" msgstr "Utiliser le prix le plus bas" + +#. module: product_pricelist_alternative +#. odoo-python +#: code:addons/product_pricelist_alternative/models/product_pricelist_item.py:0 +#, python-format +msgid "" +"It is not possible to encode this price rule. Formulas based on another " +"pricelist are not allowed on alternative pricelists. Please change to " +"another type of price computation." +msgstr "" +"Il n'est pas possible d'encoder cette règle de prix. Les formules basées sur une autre " +"ne sont pas autorisées dans les listes de prix alternatives. Veuillez passer à " +"un autre type de calcul de prix." diff --git a/product_pricelist_alternative/i18n/product_pricelist_alternative.pot b/product_pricelist_alternative/i18n/product_pricelist_alternative.pot index 1e95b04c24f..39393420d40 100644 --- a/product_pricelist_alternative/i18n/product_pricelist_alternative.pot +++ b/product_pricelist_alternative/i18n/product_pricelist_alternative.pot @@ -4,8 +4,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 16.0+e\n" "Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-10 13:21+0000\n" +"PO-Revision-Date: 2024-04-10 13:21+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -33,6 +35,15 @@ msgstr "" msgid "Alternative to Pricelist" msgstr "" +#. module: product_pricelist_alternative +#. odoo-python +#: code:addons/product_pricelist_alternative/models/product_pricelist.py:0 +#, python-format +msgid "" +"Formulas based on another pricelist are not allowed on alternative " +"pricelists." +msgstr "" + #. module: product_pricelist_alternative #: model:ir.model.fields.selection,name:product_pricelist_alternative.selection__product_pricelist_item__alternative_pricelist_policy__ignore msgid "Ignore alternatives" @@ -55,6 +66,16 @@ msgstr "" msgid "Is alternative to pricelists" msgstr "" +#. module: product_pricelist_alternative +#. odoo-python +#: code:addons/product_pricelist_alternative/models/product_pricelist_item.py:0 +#, python-format +msgid "" +"It is not possible to encode this price rule. Formulas based on another " +"pricelist are not allowed on alternative pricelists. Please change to " +"another type of price computation." +msgstr "" + #. module: product_pricelist_alternative #: model:ir.model,name:product_pricelist_alternative.model_product_pricelist msgid "Pricelist" diff --git a/product_pricelist_alternative/models/product_pricelist.py b/product_pricelist_alternative/models/product_pricelist.py index 417f8d5c8ab..532c605ae53 100644 --- a/product_pricelist_alternative/models/product_pricelist.py +++ b/product_pricelist_alternative/models/product_pricelist.py @@ -2,6 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import _, api, fields, models +from odoo.exceptions import ValidationError class Pricelist(models.Model): @@ -80,3 +81,18 @@ def _compute_price_rule(self, products, qty, uom=None, date=False, **kwargs): if alternative_price_rule[product.id][0] < res[product.id][0]: res[product.id] = alternative_price_rule[product.id] return res + + @api.constrains("alternative_pricelist_ids") + def _check_pricelist_alternative_items_based_on_other_pricelist(self): + """Alternative pricelists can not contain items based on other pricelist""" + for pricelist in self: + if pricelist.alternative_pricelist_ids.item_ids.filtered( + lambda item: item.compute_price == "formula" + and item.base == "pricelist" + ): + raise ValidationError( + _( + "Formulas based on another pricelist are not allowed " + "on alternative pricelists." + ) + ) diff --git a/product_pricelist_alternative/models/product_pricelist_item.py b/product_pricelist_alternative/models/product_pricelist_item.py index 55c69d34ca7..34c6a31bf0d 100644 --- a/product_pricelist_alternative/models/product_pricelist_item.py +++ b/product_pricelist_alternative/models/product_pricelist_item.py @@ -1,7 +1,8 @@ # Copyright 2024 Camptocamp (). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import fields, models +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError class PricelistItem(models.Model): @@ -15,3 +16,20 @@ class PricelistItem(models.Model): default="use_lower_price", required=True, ) + + @api.constrains("base") + def _check_pricelist_alternative_items_based_on_other_pricelist(self): + """Alternative pricelists can not contain items based on other pricelist""" + for item in self: + if ( + item.compute_price == "formula" + and item.base == "pricelist" + and item.pricelist_id.is_alternative_to_pricelist_count + ): + raise ValidationError( + _( + "It is not possible to encode this price rule. Formulas based " + "on another pricelist are not allowed on alternative pricelists." + " Please change to another type of price computation." + ) + ) diff --git a/product_pricelist_alternative/tests/test_pricelist_alternative.py b/product_pricelist_alternative/tests/test_pricelist_alternative.py index 28f5f7902e3..79a69e06445 100644 --- a/product_pricelist_alternative/tests/test_pricelist_alternative.py +++ b/product_pricelist_alternative/tests/test_pricelist_alternative.py @@ -1,6 +1,6 @@ # Copyright 2024 Camptocamp (). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - +from odoo.exceptions import ValidationError from odoo.tests import common, tagged from .common import CommonProductPricelistAlternative @@ -92,3 +92,15 @@ def test_skip_alternative_pricelist(self): )._get_product_price(self.usb_adapter, 1.0), 95, ) + + def test_check_pricelist_alternative_items_based_on_other_pricelist(self): + with self.assertRaises(ValidationError) as e: + self.alternative_pricelist_01.item_ids.write( + { + "compute_price": "formula", + "base": "pricelist", + "base_pricelist_id": self.alternative_pricelist_02.id, + } + ) + msg = "Formulas based on another pricelist are not allowed on alternative pricelists." + self.assertIn(msg, e.exception.args[0])