diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index 2efeffd03de..441e1c46713 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -3118,6 +3118,28 @@ class AccountMoveLine(models.Model): return self.product_id.uom_id return False + def _set_price_and_tax_after_fpos(self): + self.ensure_one() + # Manage the fiscal position after that and adapt the price_unit. + # E.g. mapping a price-included-tax to a price-excluded-tax must + # remove the tax amount from the price_unit. + # However, mapping a price-included tax to another price-included tax must preserve the balance but + # adapt the price_unit to the new tax. + # E.g. mapping a 10% price-included tax to a 20% price-included tax for a price_unit of 110 should preserve + # 100 as balance but set 120 as price_unit. + if self.tax_ids and self.move_id.fiscal_position_id: + price_subtotal = self._get_price_total_and_subtotal()['price_subtotal'] + self.tax_ids = self.move_id.fiscal_position_id.map_tax( + self.tax_ids._origin, + partner=self.move_id.partner_id) + accounting_vals = self._get_fields_onchange_subtotal( + price_subtotal=price_subtotal, + currency=self.move_id.company_currency_id) + amount_currency = accounting_vals['amount_currency'] + business_vals = self._get_fields_onchange_balance(amount_currency=amount_currency) + if 'price_unit' in business_vals: + self.price_unit = business_vals['price_unit'] + @api.depends('product_id', 'account_id', 'partner_id', 'date') def _compute_analytic_account(self): for record in self: @@ -3343,25 +3365,8 @@ class AccountMoveLine(models.Model): line.product_uom_id = line._get_computed_uom() line.price_unit = line._get_computed_price_unit() - # Manage the fiscal position after that and adapt the price_unit. - # E.g. mapping a price-included-tax to a price-excluded-tax must - # remove the tax amount from the price_unit. - # However, mapping a price-included tax to another price-included tax must preserve the balance but - # adapt the price_unit to the new tax. - # E.g. mapping a 10% price-included tax to a 20% price-included tax for a price_unit of 110 should preserve - # 100 as balance but set 120 as price_unit. - if line.tax_ids and line.move_id.fiscal_position_id: - price_subtotal = line._get_price_total_and_subtotal()['price_subtotal'] - line.tax_ids = line.move_id.fiscal_position_id.map_tax( - line.tax_ids._origin, - partner=line.move_id.partner_id) - accounting_vals = line._get_fields_onchange_subtotal( - price_subtotal=price_subtotal, - currency=line.move_id.company_currency_id) - amount_currency = accounting_vals['amount_currency'] - business_vals = line._get_fields_onchange_balance(amount_currency=amount_currency) - if 'price_unit' in business_vals: - line.price_unit = business_vals['price_unit'] + # price_unit and taxes may need to be adapted following Fiscal Position + line._set_price_and_tax_after_fpos() # Convert the unit price to the invoice's currency. company = line.move_id.company_id