diff --git a/addons/website_event_sale/models/sale_order.py b/addons/website_event_sale/models/sale_order.py index 055a9844b136bc9834858be9aeb7fa4cd2614b04..b99ef8577e8fd2fdf04cea66a6653a44124f47c2 100644 --- a/addons/website_event_sale/models/sale_order.py +++ b/addons/website_event_sale/models/sale_order.py @@ -10,7 +10,7 @@ class SaleOrder(models.Model): def _cart_find_product_line(self, product_id=None, line_id=None, **kwargs): self.ensure_one() - lines = super(SaleOrder, self)._cart_find_product_line(product_id, line_id) + lines = super(SaleOrder, self)._cart_find_product_line(product_id, line_id, **kwargs) if line_id: return lines domain = [('id', 'in', lines.ids)] diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py index ca386df57251b7ded6a341a5c038dc8a1c3c8a9c..147de9d61785adbd12f99936b53ab4bdca336592 100644 --- a/addons/website_sale/models/sale_order.py +++ b/addons/website_sale/models/sale_order.py @@ -80,7 +80,7 @@ class SaleOrder(models.Model): product = self.env['product.product'].browse(product_id) # split lines with the same product if it has untracked attributes - if product and (product.product_tmpl_id.has_dynamic_attributes() or product.product_tmpl_id._has_no_variant_attributes()) and not line_id: + if product and (product.product_tmpl_id.has_dynamic_attributes() or product.product_tmpl_id._has_no_variant_attributes()) and not line_id and not kwargs.get('force_search', False): return self.env['sale.order.line'] domain = [('order_id', '=', self.id), ('product_id', '=', product_id)] @@ -132,7 +132,7 @@ class SaleOrder(models.Model): else: pu = product.price if order.pricelist_id and order.partner_id: - order_line = order._cart_find_product_line(product.id) + order_line = order._cart_find_product_line(product.id, force_search=True) if order_line: pu = self.env['account.tax']._fix_tax_included_price_company(pu, product.taxes_id, order_line[0].tax_id, self.company_id) diff --git a/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py b/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py index c18ddbd4a2ebf070d02855ace938eaec64e1656a..578d6b3d84a5fc113a52aa6fa8b11a05825a8699 100644 --- a/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py +++ b/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py @@ -205,3 +205,78 @@ class TestWebsiteSaleProductPricelist(TestSaleProductAttributeValueCommon, TestW with MockRequest(self.env, website=current_website, sale_order_id=so.id): so._cart_update(product_id=test_product.product_variant_id.id, line_id=sol.id, set_qty=1) self.assertEqual(round(sol.price_total), 50, "100$ with 50% discount + 0% tax (mapped from fp 10% -> 0%)") + + def test_cart_update_with_fpos_no_variant_product(self): + # We will test that the mapping of an 10% included tax by a 0% by a fiscal position is taken into account when updating the cart for no_variant product + self.env.user.partner_id.country_id = False + current_website = self.env['website'].get_current_website() + pricelist = current_website.get_current_pricelist() + (self.env['product.pricelist'].search([]) - pricelist).write({'active': False}) + # Add 10% tax on product + tax10 = self.env['account.tax'].create({'name': "Test tax 10", 'amount': 10, 'price_include': True, 'amount_type': 'percent', 'type_tax_use': 'sale'}) + tax0 = self.env['account.tax'].create({'name': "Test tax 0", 'amount': 0, 'price_include': True, 'amount_type': 'percent', 'type_tax_use': 'sale'}) + + # Create fiscal position mapping taxes 10% -> 0% + fpos = self.env['account.fiscal.position'].create({ + 'name': 'test', + }) + self.env['account.fiscal.position.tax'].create({ + 'position_id': fpos.id, + 'tax_src_id': tax10.id, + 'tax_dest_id': tax0.id, + }) + + product = self.env['product.product'].create({ + 'name': 'prod_no_variant', + 'list_price': 110, + 'taxes_id': [(6, 0, [tax10.id])], + 'type': 'consu', + }) + + # create an attribute with one variant + product_attribute = self.env['product.attribute'].create({ + 'name': 'test_attr', + 'display_type': 'radio', + 'create_variant': 'no_variant', + }) + + # create attribute value + a1 = self.env['product.attribute.value'].create({ + 'name': 'pa_value', + 'attribute_id': product_attribute.id, + 'sequence': 1, + }) + + # set variant value to product template + product_template = self.env['product.template'].search( + [('name', '=', 'prod_no_variant')], limit=1) + + product_template.attribute_line_ids = [(0, 0, { + 'attribute_id': product_attribute.id, + 'value_ids': [(6, 0, [a1.id])], + })] + + # publish the product on website + product_template.is_published = True + + # create a so for user using the fiscal position + + so = self.env['sale.order'].create({ + 'partner_id': self.env.user.partner_id.id, + }) + sol = self.env['sale.order.line'].create({ + 'name': product_template.name, + 'product_id': product.id, + 'product_uom_qty': 1, + 'product_uom': product_template.uom_id.id, + 'price_unit': product_template.list_price, + 'order_id': so.id, + 'tax_id': [(6, 0, [tax10.id])], + }) + self.assertEqual(round(sol.price_total), 110.0, "110$ with 10% included tax") + so.pricelist_id = pricelist + so.fiscal_position_id = fpos + sol.product_id_change() + with MockRequest(self.env, website=current_website, sale_order_id=so.id): + so._cart_update(product_id=product.id, line_id=sol.id, set_qty=1) + self.assertEqual(round(sol.price_total), 100, "100$ with public price+ 0% tax (mapped from fp 10% -> 0%)")