From b9194406ecc8cf99d9747c2164838f3e092e0ec4 Mon Sep 17 00:00:00 2001 From: Yannick Tivisse Date: Wed, 27 Oct 2021 16:42:38 +0200 Subject: [PATCH] [IMP] account: Avoid multiple rebrowse in get_fiscal_position + Make it private, as it is not supposed to be called from the webclient. --- addons/account/models/account_move.py | 6 +-- .../account/models/account_reconcile_model.py | 2 +- addons/account/models/partner.py | 17 +++------ addons/account/tests/test_fiscal_position.py | 2 +- .../l10n_ar/models/account_fiscal_position.py | 38 +++++++++---------- addons/mrp_repair/models/repair.py | 2 +- addons/purchase/models/purchase.py | 10 ++--- .../purchase_requisition/models/purchase.py | 2 +- addons/purchase_stock/models/stock_rule.py | 2 +- addons/repair/models/repair.py | 6 +-- addons/sale/models/account_move.py | 6 +-- addons/sale/models/account_move_line.py | 2 +- addons/sale/models/sale_order.py | 2 +- addons/sale/models/sale_order_line.py | 2 +- .../sale/wizard/sale_make_invoice_advance.py | 2 +- addons/sale_coupon/models/sale_order.py | 2 +- addons/sale_purchase/models/sale_order.py | 2 +- .../website_sale/models/product_template.py | 2 +- addons/website_sale/models/website.py | 2 +- 19 files changed, 50 insertions(+), 59 deletions(-) diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index f0372c241f6..05e1b70f524 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -502,9 +502,9 @@ class AccountMove(models.Model): self.partner_bank_id = bank_ids and bank_ids[0] # Find the new fiscal position. - delivery_partner_id = self._get_invoice_delivery_partner_id() - self.fiscal_position_id = self.env['account.fiscal.position'].get_fiscal_position( - self.partner_id.id, delivery_id=delivery_partner_id) + delivery_partner = self.env['res.partner'].browse(self._get_invoice_delivery_partner_id()) + self.fiscal_position_id = self.env['account.fiscal.position']._get_fiscal_position( + self.partner_id, delivery=delivery_partner) self._recompute_dynamic_lines() if warning: return {'warning': warning} diff --git a/addons/account/models/account_reconcile_model.py b/addons/account/models/account_reconcile_model.py index cec7ffcb54e..18325b1c518 100644 --- a/addons/account/models/account_reconcile_model.py +++ b/addons/account/models/account_reconcile_model.py @@ -424,7 +424,7 @@ class AccountReconcileModel(models.Model): if line.tax_ids: taxes = line.tax_ids - detected_fiscal_position = self.env['account.fiscal.position'].get_fiscal_position(partner_id) + detected_fiscal_position = self.env['account.fiscal.position']._get_fiscal_position(self.env['res.partner'].browse(partner_id)) if detected_fiscal_position: taxes = detected_fiscal_position.map_tax(taxes) writeoff_line['tax_ids'] = [Command.set(taxes.ids)] diff --git a/addons/account/models/partner.py b/addons/account/models/partner.py index 2a3767d9563..69fc1c66767 100644 --- a/addons/account/models/partner.py +++ b/addons/account/models/partner.py @@ -206,27 +206,22 @@ class AccountFiscalPosition(models.Model): return fpos @api.model - def get_fiscal_position(self, partner_id, delivery_id=None): + def _get_fiscal_position(self, partner, delivery=None): """ :return: fiscal position found (recordset) :rtype: :class:`account.fiscal.position` """ - if not partner_id: + if not partner: return self.env['account.fiscal.position'] - # This can be easily overridden to apply more complex fiscal rules - PartnerObj = self.env['res.partner'] - partner = PartnerObj.browse(partner_id) - # if no delivery use invoicing - if delivery_id: - delivery = PartnerObj.browse(delivery_id) - else: + if not delivery: delivery = partner # partner manually set fiscal position always win - if delivery.property_account_position_id or partner.property_account_position_id: - return delivery.property_account_position_id or partner.property_account_position_id + manual_fiscal_position = delivery.property_account_position_id or partner.property_account_position_id + if manual_fiscal_position: + return manual_fiscal_position # First search only matching VAT positions vat_required = bool(partner.vat) diff --git a/addons/account/tests/test_fiscal_position.py b/addons/account/tests/test_fiscal_position.py index 5bcb87d1aba..24ef5a47c9c 100644 --- a/addons/account/tests/test_fiscal_position.py +++ b/addons/account/tests/test_fiscal_position.py @@ -64,7 +64,7 @@ class TestFiscalPosition(common.TransactionCase): def test_10_fp_country(self): def assert_fp(partner, expected_pos, message): self.assertEqual( - self.fp.get_fiscal_position(partner.id).id, + self.fp._get_fiscal_position(partner).id, expected_pos.id, message) diff --git a/addons/l10n_ar/models/account_fiscal_position.py b/addons/l10n_ar/models/account_fiscal_position.py index c032a689285..2726d59017e 100644 --- a/addons/l10n_ar/models/account_fiscal_position.py +++ b/addons/l10n_ar/models/account_fiscal_position.py @@ -12,30 +12,26 @@ class AccountFiscalPosition(models.Model): 'should be auto-detected') @api.model - def get_fiscal_position(self, partner_id, delivery_id=None): + def _get_fiscal_position(self, partner, delivery=None): """ Take into account the partner afip responsibility in order to auto-detect the fiscal position """ - company = self.env.company - if company.country_id.code == "AR": - PartnerObj = self.env['res.partner'] - partner = PartnerObj.browse(partner_id) + if self.env.company.country_id.code != "AR": + return super()._get_fiscal_position(partner, delivery=delivery) - # if no delivery use invoicing - if delivery_id: - delivery = PartnerObj.browse(delivery_id) - else: - delivery = partner + # if no delivery use invoicing + if not delivery: + delivery = partner - # partner manually set fiscal position always win - if delivery.property_account_position_id or partner.property_account_position_id: - return delivery.property_account_position_id or partner.property_account_position_id - domain = [ - ('auto_apply', '=', True), - ('l10n_ar_afip_responsibility_type_ids', '=', self.env['res.partner'].browse( - partner_id).l10n_ar_afip_responsibility_type_id.id), - ('company_id', '=', company.id), - ] - return self.sudo().search(domain, limit=1) - return super().get_fiscal_position(partner_id, delivery_id=delivery_id) + # partner manually set fiscal position always win + manual_fiscal_position = delivery.property_account_position_id or partner.property_account_position_id + if manual_fiscal_position: + return manual_fiscal_position + + domain = [ + ('auto_apply', '=', True), + ('l10n_ar_afip_responsibility_type_ids', '=', partner.l10n_ar_afip_responsibility_type_id.id), + ('company_id', '=', self.env.company.id), + ] + return self.sudo().search(domain, limit=1) @api.onchange('l10n_ar_afip_responsibility_type_ids', 'country_group_id', 'country_id', 'zip_from', 'zip_to') def _onchange_afip_responsibility(self): diff --git a/addons/mrp_repair/models/repair.py b/addons/mrp_repair/models/repair.py index 47971ecc002..7f526a56f7c 100644 --- a/addons/mrp_repair/models/repair.py +++ b/addons/mrp_repair/models/repair.py @@ -48,7 +48,7 @@ class RepairLine(models.Model): tax = self.env['account.tax'] if partner: partner_invoice = self.repair_id.partner_invoice_id or partner - fpos = self.env['account.fiscal.position'].get_fiscal_position(partner_invoice.id, delivery_id=self.repair_id.address_id.id) + fpos = self.env['account.fiscal.position']._get_fiscal_position(partner_invoice, delivery=self.repair_id.address_id) taxes = self.product_id.taxes_id.filtered(lambda x: x.company_id == self.repair_id.company_id) tax = fpos.map_tax(taxes) return { diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index bfd1e3ed51d..6641a460fe3 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -308,7 +308,7 @@ class PurchaseOrder(models.Model): self.fiscal_position_id = False self.currency_id = self.env.company.currency_id.id else: - self.fiscal_position_id = self.env['account.fiscal.position'].get_fiscal_position(self.partner_id.id) + self.fiscal_position_id = self.env['account.fiscal.position']._get_fiscal_position(self.partner_id) self.payment_term_id = self.partner_id.property_supplier_payment_term_id.id self.currency_id = self.partner_id.property_purchase_currency_id.id or self.env.company.currency_id.id return {} @@ -572,15 +572,15 @@ class PurchaseOrder(models.Model): if not journal: raise UserError(_('Please define an accounting purchase journal for the company %s (%s).') % (self.company_id.name, self.company_id.id)) - partner_invoice_id = self.partner_id.address_get(['invoice'])['invoice'] + partner_invoice = self.env['res.partner'].browse(self.partner_id.address_get(['invoice'])['invoice']) invoice_vals = { 'ref': self.partner_ref or '', 'move_type': move_type, 'narration': self.notes, 'currency_id': self.currency_id.id, 'invoice_user_id': self.user_id and self.user_id.id or self.env.user.id, - 'partner_id': partner_invoice_id, - 'fiscal_position_id': (self.fiscal_position_id or self.fiscal_position_id.get_fiscal_position(partner_invoice_id)).id, + 'partner_id': partner_invoice, + 'fiscal_position_id': (self.fiscal_position_id or self.fiscal_position_id._get_fiscal_position(partner_invoice)).id, 'payment_reference': self.partner_ref or '', 'partner_bank_id': self.partner_id.bank_ids[:1].id, 'invoice_origin': self.name, @@ -953,7 +953,7 @@ class PurchaseOrderLine(models.Model): def _compute_tax_id(self): for line in self: line = line.with_company(line.company_id) - fpos = line.order_id.fiscal_position_id or line.order_id.fiscal_position_id.get_fiscal_position(line.order_id.partner_id.id) + fpos = line.order_id.fiscal_position_id or line.order_id.fiscal_position_id._get_fiscal_position(line.order_id.partner_id) # filter taxes by company taxes = line.product_id.supplier_taxes_id.filtered(lambda r: r.company_id == line.env.company) line.taxes_id = fpos.map_tax(taxes) diff --git a/addons/purchase_requisition/models/purchase.py b/addons/purchase_requisition/models/purchase.py index 1e4e595db01..2fb39475351 100644 --- a/addons/purchase_requisition/models/purchase.py +++ b/addons/purchase_requisition/models/purchase.py @@ -24,7 +24,7 @@ class PurchaseOrder(models.Model): payment_term = partner.property_supplier_payment_term_id FiscalPosition = self.env['account.fiscal.position'] - fpos = FiscalPosition.with_company(self.company_id).get_fiscal_position(partner.id) + fpos = FiscalPosition.with_company(self.company_id)._get_fiscal_position(partner) self.partner_id = partner.id self.fiscal_position_id = fpos.id diff --git a/addons/purchase_stock/models/stock_rule.py b/addons/purchase_stock/models/stock_rule.py index 2feab33b18c..e0bf8e34488 100644 --- a/addons/purchase_stock/models/stock_rule.py +++ b/addons/purchase_stock/models/stock_rule.py @@ -270,7 +270,7 @@ class StockRule(models.Model): partner = values['supplier'].partner_id purchase_date = procurement_date_planned - relativedelta(days=supplier_delay) - fpos = self.env['account.fiscal.position'].with_company(company_id).get_fiscal_position(partner.id) + fpos = self.env['account.fiscal.position'].with_company(company_id)._get_fiscal_position(partner) gpo = self.group_propagation_option group = (gpo == 'fixed' and self.group_id.id) or \ diff --git a/addons/repair/models/repair.py b/addons/repair/models/repair.py index 2b67d2db2c9..56366cdd857 100644 --- a/addons/repair/models/repair.py +++ b/addons/repair/models/repair.py @@ -342,7 +342,7 @@ class Repair(models.Model): current_invoices_list = grouped_invoices_vals[(partner_invoice.id, currency.id, company.id)] if not group or len(current_invoices_list) == 0: - fpos = self.env['account.fiscal.position'].get_fiscal_position(partner_invoice.id, delivery_id=repair.address_id.id) + fpos = self.env['account.fiscal.position']._get_fiscal_position(partner_invoice, delivery=repair.address_id) invoice_vals = { 'move_type': 'out_invoice', 'partner_id': partner_invoice.id, @@ -717,7 +717,7 @@ class RepairLine(models.Model): self.product_uom = product.uom_id.id if self.type != 'remove': if partner: - fpos = self.env['account.fiscal.position'].get_fiscal_position(partner_invoice.id, delivery_id=self.repair_id.address_id.id) + fpos = self.env['account.fiscal.position']._get_fiscal_position(partner_invoice, delivery=self.repair_id.address_id) taxes = self.product_id.taxes_id.filtered(lambda x: x.company_id == self.repair_id.company_id) self.tax_id = fpos.map_tax(taxes) warning = False @@ -795,7 +795,7 @@ class RepairFee(models.Model): pricelist = self.repair_id.pricelist_id if partner and self.product_id: - fpos = self.env['account.fiscal.position'].get_fiscal_position(partner_invoice.id, delivery_id=self.repair_id.address_id.id) + fpos = self.env['account.fiscal.position']._get_fiscal_position(partner_invoice, delivery=self.repair_id.address_id) taxes = self.product_id.taxes_id.filtered(lambda x: x.company_id == self.repair_id.company_id) self.tax_id = fpos.map_tax(taxes) if partner: diff --git a/addons/sale/models/account_move.py b/addons/sale/models/account_move.py index acd7ffed417..90db9859f7b 100644 --- a/addons/sale/models/account_move.py +++ b/addons/sale/models/account_move.py @@ -33,9 +33,9 @@ class AccountMove(models.Model): """ Trigger the change of fiscal position when the shipping address is modified. """ - delivery_partner_id = self._get_invoice_delivery_partner_id() - fiscal_position = self.env['account.fiscal.position'].with_company(self.company_id).get_fiscal_position( - self.partner_id.id, delivery_id=delivery_partner_id) + delivery_partner_id = self.env['res.partner'].browse(self._get_invoice_delivery_partner_id()) + fiscal_position = self.env['account.fiscal.position'].with_company(self.company_id)._get_fiscal_position( + self.partner_id, delivery=delivery_partner_id) if fiscal_position: self.fiscal_position_id = fiscal_position diff --git a/addons/sale/models/account_move_line.py b/addons/sale/models/account_move_line.py index 9b8d08746d3..6315c6591da 100644 --- a/addons/sale/models/account_move_line.py +++ b/addons/sale/models/account_move_line.py @@ -158,7 +158,7 @@ class AccountMoveLine(models.Model): last_so_line = self.env['sale.order.line'].search([('order_id', '=', order.id)], order='sequence desc', limit=1) last_sequence = last_so_line.sequence + 1 if last_so_line else 100 - fpos = order.fiscal_position_id or order.fiscal_position_id.get_fiscal_position(order.partner_id.id) + fpos = order.fiscal_position_id or order.fiscal_position_id._get_fiscal_position(order.partner_id) taxes = fpos.map_tax(self.product_id.taxes_id) return { diff --git a/addons/sale/models/sale_order.py b/addons/sale/models/sale_order.py index fac1701aeba..07cacdc6464 100644 --- a/addons/sale/models/sale_order.py +++ b/addons/sale/models/sale_order.py @@ -624,7 +624,7 @@ class SaleOrder(models.Model): 'team_id': self.team_id.id, 'partner_id': self.partner_invoice_id.id, 'partner_shipping_id': self.partner_shipping_id.id, - 'fiscal_position_id': (self.fiscal_position_id or self.fiscal_position_id.get_fiscal_position(self.partner_invoice_id.id)).id, + 'fiscal_position_id': (self.fiscal_position_id or self.fiscal_position_id._get_fiscal_position(self.partner_invoice_id)).id, 'partner_bank_id': self.company_id.partner_id.bank_ids[:1].id, 'journal_id': journal.id, # company comes from the journal 'invoice_origin': self.name, diff --git a/addons/sale/models/sale_order_line.py b/addons/sale/models/sale_order_line.py index 6e3e02ac7ca..78604ab87ca 100644 --- a/addons/sale/models/sale_order_line.py +++ b/addons/sale/models/sale_order_line.py @@ -137,7 +137,7 @@ class SaleOrderLine(models.Model): def _compute_tax_id(self): for line in self: line = line.with_company(line.company_id) - fpos = line.order_id.fiscal_position_id or line.order_id.fiscal_position_id.get_fiscal_position(line.order_partner_id.id) + fpos = line.order_id.fiscal_position_id or line.order_id.fiscal_position_id._get_fiscal_position(line.order_partner_id) # If company_id is set, always filter taxes by the company taxes = line.product_id.taxes_id.filtered(lambda t: t.company_id == line.env.company) line.tax_id = fpos.map_tax(taxes) diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py index cb70230be49..590a1080f21 100644 --- a/addons/sale/wizard/sale_make_invoice_advance.py +++ b/addons/sale/wizard/sale_make_invoice_advance.py @@ -78,7 +78,7 @@ class SaleAdvancePaymentInv(models.TransientModel): 'invoice_user_id': order.user_id.id, 'narration': order.note, 'partner_id': order.partner_invoice_id.id, - 'fiscal_position_id': (order.fiscal_position_id or order.fiscal_position_id.get_fiscal_position(order.partner_id.id)).id, + 'fiscal_position_id': (order.fiscal_position_id or order.fiscal_position_id._get_fiscal_position(order.partner_id)).id, 'partner_shipping_id': order.partner_shipping_id.id, 'currency_id': order.pricelist_id.currency_id.id, 'payment_reference': order.reference, diff --git a/addons/sale_coupon/models/sale_order.py b/addons/sale_coupon/models/sale_order.py index 5a7339a32a8..c2f54dcbd6c 100644 --- a/addons/sale_coupon/models/sale_order.py +++ b/addons/sale_coupon/models/sale_order.py @@ -509,7 +509,7 @@ class SaleOrderLine(models.Model): # In case of a free product, retrieving the tax on the line instead of the product won't affect the behavior. for line in reward_lines: line = line.with_company(line.company_id) - fpos = line.order_id.fiscal_position_id or line.order_id.fiscal_position_id.get_fiscal_position(line.order_partner_id.id) + fpos = line.order_id.fiscal_position_id or line.order_id.fiscal_position_id._get_fiscal_position(line.order_partner_id) # If company_id is set, always filter taxes by the company taxes = line.tax_id.filtered(lambda r: not line.company_id or r.company_id == line.company_id) line.tax_id = fpos.map_tax(taxes) diff --git a/addons/sale_purchase/models/sale_order.py b/addons/sale_purchase/models/sale_order.py index 9515721e998..004295edfea 100644 --- a/addons/sale_purchase/models/sale_order.py +++ b/addons/sale_purchase/models/sale_order.py @@ -193,7 +193,7 @@ class SaleOrderLine(models.Model): """ self.ensure_one() partner_supplier = supplierinfo.partner_id - fpos = self.env['account.fiscal.position'].sudo().get_fiscal_position(partner_supplier.id) + fpos = self.env['account.fiscal.position'].sudo()._get_fiscal_position(partner_supplier) date_order = self._purchase_get_date_order(supplierinfo) return { 'partner_id': partner_supplier.id, diff --git a/addons/website_sale/models/product_template.py b/addons/website_sale/models/product_template.py index a50e6fc25a1..d00d3bbb990 100644 --- a/addons/website_sale/models/product_template.py +++ b/addons/website_sale/models/product_template.py @@ -183,7 +183,7 @@ class ProductTemplate(models.Model): company_id = current_website.company_id tax_display = self.user_has_groups('account.group_show_line_subtotals_tax_excluded') and 'total_excluded' or 'total_included' - fpos = self.env['account.fiscal.position'].sudo().get_fiscal_position(partner.id) + fpos = self.env['account.fiscal.position'].sudo()._get_fiscal_position(partner) product_taxes = product.sudo().taxes_id.filtered(lambda x: x.company_id == company_id) taxes = fpos.map_tax(product_taxes) diff --git a/addons/website_sale/models/website.py b/addons/website_sale/models/website.py index 4067e9db146..6e1498ff934 100644 --- a/addons/website_sale/models/website.py +++ b/addons/website_sale/models/website.py @@ -277,7 +277,7 @@ class Website(models.Model): fpos_id = ( self.env['account.fiscal.position'].sudo() .with_company(sale_order.company_id.id) - .get_fiscal_position(sale_order.partner_id.id, delivery_id=sale_order.partner_shipping_id.id) + ._get_fiscal_position(sale_order.partner_id, delivery=sale_order.partner_shipping_id) ).id if sale_order.fiscal_position_id.id != fpos_id: sale_order = None