From 9df95cb5541212b25ee671ad7b541e7250da213e Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Mon, 26 Apr 2021 16:22:04 +0000 Subject: [PATCH] [FIX] pos,repair,sale(_*): multi-company taxes management Since product can be shared between multiple companies, their taxes m2m fields may hold taxes from multiple companies. When working in sudoed or multi-company environments, those taxes were incorrectly filtered and taxes from other companies may erroneously impact records from other companies. This commit ensures that the product taxes are properly filtered to only consider the ones from the current/record company. --- addons/point_of_sale/models/pos_order.py | 4 ++-- addons/sale_coupon/models/sale_order.py | 5 ++--- addons/sale_purchase/models/sale_order.py | 5 ++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index 3b2cc4f5839..acffb09f984 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -846,8 +846,8 @@ class PosOrderLine(models.Model): raise UserError(_('You have to select a pricelist in the sale form.')) price = self.price_unit * (1 - (self.discount or 0.0) / 100.0) self.price_subtotal = self.price_subtotal_incl = price * self.qty - if (self.product_id.taxes_id): - taxes = self.product_id.taxes_id.compute_all(price, self.order_id.pricelist_id.currency_id, self.qty, product=self.product_id, partner=False) + if (self.tax_ids): + taxes = self.tax_ids.compute_all(price, self.order_id.pricelist_id.currency_id, self.qty, product=self.product_id, partner=False) self.price_subtotal = taxes['total_excluded'] self.price_subtotal_incl = taxes['total_included'] diff --git a/addons/sale_coupon/models/sale_order.py b/addons/sale_coupon/models/sale_order.py index 1652c5b70e8..106a1012601 100644 --- a/addons/sale_coupon/models/sale_order.py +++ b/addons/sale_coupon/models/sale_order.py @@ -140,9 +140,8 @@ class SaleOrder(models.Model): def _get_reward_values_discount(self, program): if program.discount_type == 'fixed_amount': - taxes = program.discount_line_product_id.taxes_id - if self.fiscal_position_id: - taxes = self.fiscal_position_id.map_tax(taxes) + product_taxes = program.discount_line_product_id.taxes_id.filtered(lambda tax: tax.company_id == self.company_id) + taxes = self.fiscal_position_id.map_tax(product_taxes) return [{ 'name': _("Discount: %s", program.name), 'product_id': program.discount_line_product_id.id, diff --git a/addons/sale_purchase/models/sale_order.py b/addons/sale_purchase/models/sale_order.py index a9d6ae19abf..751135ebe49 100644 --- a/addons/sale_purchase/models/sale_order.py +++ b/addons/sale_purchase/models/sale_order.py @@ -230,9 +230,8 @@ class SaleOrderLine(models.Model): uom_id=self.product_id.uom_po_id ) fpos = purchase_order.fiscal_position_id - taxes = fpos.map_tax(self.product_id.supplier_taxes_id) - if taxes: - taxes = taxes.filtered(lambda t: t.company_id.id == self.company_id.id) + supplier_taxes = self.product_id.supplier_taxes_id.filtered(lambda t: t.company_id.id == self.company_id.id) + taxes = fpos.map_tax(supplier_taxes) # compute unit price price_unit = 0.0