From 180866fe1e3b8998cc47ee584abaaff76d4135bb Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Wed, 20 Mar 2019 08:43:29 +0000 Subject: [PATCH] [FIX] website_sale: discount - Go to Sales > Configuration > Settings - Enable "Multiple Sales Prices per Product" and select option "Prices computed from formulas (discounts, margins, roundings)" - Go to Sales > Catalog / Pricelists - Select "Public Pricelist" and set "Discount Policy: Show public price & discount to the customer" - Go to the eCommerce, buy "iPad Retina Display" which as a 20 % discount In the corresponding SO, the discount appears to be zero, and the discount is included in the price unit. However, adding the product directly to the SO in the backend displays the discount as expected. There should not be a difference in behavior between the eCommerce and the backend. Fixes #31337 opw-1943989 closes odoo/odoo#31965 Signed-off-by: Nicolas Martinelli (nim) --- addons/website_sale/models/sale_order.py | 26 +++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py index 101b87fee49..098a8629e15 100644 --- a/addons/website_sale/models/sale_order.py +++ b/addons/website_sale/models/sale_order.py @@ -98,11 +98,26 @@ class SaleOrder(models.Model): 'pricelist': order.pricelist_id.id, }) product = self.env['product.product'].with_context(product_context).browse(product_id) - pu = product.price - if order.pricelist_id and order.partner_id: - order_line = order._cart_find_product_line(product.id) - 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) + discount = 0 + + if order.pricelist_id.discount_policy == 'without_discount': + # This part is pretty much a copy-paste of the method '_onchange_discount' of + # 'sale.order.line'. + price, rule_id = order.pricelist_id.with_context(product_context).get_product_price_rule(product, qty or 1.0, order.partner_id) + pu, currency_id = request.env['sale.order.line'].with_context(product_context)._get_real_price_currency(product, rule_id, qty, product.uom_id, order.pricelist_id.id) + if pu != 0: + if order.pricelist_id.currency_id.id != currency_id: + # we need new_list_price in the same currency as price, which is in the SO's pricelist's currency + pu = request.env['res.currency'].browse(currency_id).with_context(product_context).compute(pu, order.pricelist_id.currency_id) + discount = (pu - price) / pu * 100 + if discount < 0: + discount = 0 + else: + pu = product.price + if order.pricelist_id and order.partner_id: + order_line = order._cart_find_product_line(product.id) + 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) return { 'product_id': product_id, @@ -110,6 +125,7 @@ class SaleOrder(models.Model): 'order_id': order_id, 'product_uom': product.uom_id.id, 'price_unit': pu, + 'discount': discount, } @api.multi