From 84bf9f3145ee2fcec913f0a32d6bbba37f2e6937 Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Wed, 14 Nov 2018 14:50:24 +0000 Subject: [PATCH] [FIX] sale: free optional product - Create a dynamic product P1 with an optional product P2 - The list price of P2 is 20 - Create a pricelist where P2 is free (fixed price of 0) - In a SO, choose 'Configure a product' and choose P1, add In the modal which suggests P2, its price is 20 instead of 0. This is because we fall back on the list price when fetching the combination prices. This should not be necessary since: - a pricelist is required to fetch a price - a pricelist should always contain a rule applying to all products Therefore, the list price doesn't need to be used as a fallback. It is then necessary to modify the test tours by adding a partner on the SO before selecting the product. Anyway, this is usually the way to go since the selection of the partner determines the pricelist. opw-1902456 closes odoo/odoo#28687 --- .../sale/controllers/product_configurator.py | 4 ++-- .../sale_product_configurator_templates.xml | 2 +- .../product_configurator_advanced_test_ui.js | 11 ++++++++-- .../tests/product_configurator_test_ui.js | 19 +++++++++++++++- addons/sale_management/tests/test_sale_ui.py | 22 +++++++++++++++---- 5 files changed, 48 insertions(+), 10 deletions(-) diff --git a/addons/sale/controllers/product_configurator.py b/addons/sale/controllers/product_configurator.py index 49572b64311..9a9d397b4dd 100644 --- a/addons/sale/controllers/product_configurator.py +++ b/addons/sale/controllers/product_configurator.py @@ -183,7 +183,7 @@ class ProductConfiguratorController(http.Controller): product_id = None list_price = product_template.price_compute('list_price')[product_template.id] - price = product_template.price or list_price + price = product_template.price if(product): product = product.with_context( no_variant_attributes_price_extra=[product_attribute_value.price_extra or 0.0 @@ -194,7 +194,7 @@ class ProductConfiguratorController(http.Controller): ) product_id = product.id list_price = product.price_compute('list_price')[product.id] - price = product.price or list_price + price = product.price display_name = [product_template.name] if filtered_product_template_attribute_values: diff --git a/addons/sale/views/sale_product_configurator_templates.xml b/addons/sale/views/sale_product_configurator_templates.xml index 5cd7317b09b..bf9df14a54d 100644 --- a/addons/sale/views/sale_product_configurator_templates.xml +++ b/addons/sale/views/sale_product_configurator_templates.xml @@ -19,7 +19,7 @@

a:contains('Tajine Saucisse')", + auto: true, +}, { + trigger: "a:contains('Configure a product')", + extra_trigger: ".o_field_widget[name=pricelist_id] > .o_external_button", // Wait for pricelist (onchange_partner_id) }, { trigger: '.o_product_configurator .o_input_dropdown input', run: 'click' @@ -129,4 +136,4 @@ tour.register('sale_product_configurator_advanced_tour', { run: function (){} //check }]); -}); \ No newline at end of file +}); diff --git a/addons/sale_management/static/tests/product_configurator_test_ui.js b/addons/sale_management/static/tests/product_configurator_test_ui.js index 39165e279a3..0f50c1b4440 100644 --- a/addons/sale_management/static/tests/product_configurator_test_ui.js +++ b/addons/sale_management/static/tests/product_configurator_test_ui.js @@ -16,7 +16,14 @@ tour.register('sale_product_configurator_tour', { trigger: ".o_list_button_add", extra_trigger: ".o_sale_order" }, { - trigger: "a:contains('Configure a product')" + trigger: ".o_required_modifier[name=partner_id] input", + run: "text Couscous Magique", +}, { + trigger: ".ui-menu-item > a:contains('Couscous Magique')", + auto: true, +}, { + trigger: "a:contains('Configure a product')", + extra_trigger: ".o_field_widget[name=pricelist_id] > .o_external_button", // Wait for pricelist (onchange_partner_id) }, { trigger: '.o_product_configurator .o_input_dropdown input', run: 'click' @@ -85,6 +92,16 @@ tour.register('sale_product_configurator_tour', { extra_trigger: 'div[name="order_line"]', in_modal: false, run: function (){} +}, { + trigger: '.o_readonly_modifier[name=amount_total]:contains("835")', + in_modal: false, + edition: 'community', + run: function (){} +}, { + trigger: '.o_readonly_modifier[name=amount_total]:contains("837")', + in_modal: false, + edition: 'enterprise', + run: function (){} }]); }); diff --git a/addons/sale_management/tests/test_sale_ui.py b/addons/sale_management/tests/test_sale_ui.py index dc323229ee7..7f147d0d574 100644 --- a/addons/sale_management/tests/test_sale_ui.py +++ b/addons/sale_management/tests/test_sale_ui.py @@ -8,14 +8,28 @@ class TestUi(odoo.tests.HttpCase): self.phantom_js("/web", "odoo.__DEBUG__.services['web_tour.tour'].run('sale_tour')", "odoo.__DEBUG__.services['web_tour.tour'].tours.sale_tour.ready", login="admin") def test_02_product_configurator(self): - # To be able to test the product configurator, admin user must have access to "variants and options" feature, so we give him the right group for that - self.env.ref('base.user_admin').write({'groups_id': [(4, self.env.ref('product.group_product_variant').id)]}) + # group_product_variant: use the product configurator + # group_sale_pricelist: display the pricelist to determine when it is changed after choosing + # the partner + self.env.ref('base.user_admin').write({ + 'groups_id': [ + (4, self.env.ref('product.group_product_variant').id), + (4, self.env.ref('product.group_sale_pricelist').id), + ], + }) self.phantom_js("/web", "odoo.__DEBUG__.services['web_tour.tour'].run('sale_product_configurator_tour')", "odoo.__DEBUG__.services['web_tour.tour'].tours.sale_product_configurator_tour.ready", login="admin") def test_03_product_configurator_advanced(self): - # To be able to test the product configurator, admin user must have access to "variants and options" feature, so we give him the right group for that - self.env.ref('base.user_admin').write({'groups_id': [(4, self.env.ref('product.group_product_variant').id)]}) + # group_product_variant: use the product configurator + # group_sale_pricelist: display the pricelist to determine when it is changed after choosing + # the partner + self.env.ref('base.user_admin').write({ + 'groups_id': [ + (4, self.env.ref('product.group_product_variant').id), + (4, self.env.ref('product.group_sale_pricelist').id), + ], + }) # Prepare relevant test data # This is not included in demo data to avoid useless noise