[IMP] account: Avoid multiple rebrowse in get_fiscal_position

+ Make it private, as it is not supposed to be called from the
webclient.
This commit is contained in:
Yannick Tivisse
2021-12-02 12:12:01 +01:00
parent 550eb0b73c
commit b9194406ec
19 changed files with 50 additions and 59 deletions
+3 -3
View File
@@ -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}
@@ -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)]
+6 -11
View File
@@ -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)
+1 -1
View File
@@ -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)
@@ -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):
+1 -1
View File
@@ -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 {
+5 -5
View File
@@ -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)
@@ -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
+1 -1
View File
@@ -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 \
+3 -3
View File
@@ -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:
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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 {
+1 -1
View File
@@ -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,
+1 -1
View File
@@ -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)
@@ -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,
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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,
@@ -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)
+1 -1
View File
@@ -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