[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:
@@ -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)]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user