43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from odoo import api, fields, models
|
|
|
|
SOUTH_SOUTHEAST = {"PR", "RS", "SC", "SP", "ES", "MG", "RJ"}
|
|
NORTH_NORTHEAST_MIDWEST = {
|
|
"AC", "AP", "AM", "PA", "RO", "RR", "TO", "AL", "BA", "CE",
|
|
"MA", "PB", "PE", "PI", "RN", "SE", "DF", "GO", "MT", "MS"
|
|
}
|
|
|
|
|
|
class AccountFiscalPosition(models.Model):
|
|
_inherit = 'account.fiscal.position'
|
|
|
|
l10n_br_fp_type = fields.Selection(
|
|
selection=[
|
|
('internal', 'Internal'),
|
|
('ss_nnm', 'South/Southeast selling to North/Northeast/Midwest'),
|
|
('interstate', 'Other interstate'),
|
|
],
|
|
string='Interstate Fiscal Position Type',
|
|
)
|
|
|
|
@api.model
|
|
def _get_fiscal_position(self, partner, delivery=None):
|
|
if not delivery:
|
|
delivery = partner
|
|
|
|
if self.env.company.country_id.code != "BR" or delivery.country_id.code != 'BR':
|
|
return super()._get_fiscal_position(partner, delivery=delivery)
|
|
|
|
# manually set fiscal position on partner has a higher priority
|
|
manual_fiscal_position = delivery.property_account_position_id or partner.property_account_position_id
|
|
if manual_fiscal_position:
|
|
return manual_fiscal_position
|
|
|
|
# Taxation in Brazil depends on both the state of the partner and the state of the company
|
|
if self.env.company.state_id == delivery.state_id:
|
|
return self.search([('l10n_br_fp_type', '=', 'internal'), ('company_id', '=', self.env.company.id)], limit=1)
|
|
if self.env.company.state_id.code in SOUTH_SOUTHEAST and delivery.state_id.code in NORTH_NORTHEAST_MIDWEST:
|
|
return self.search([('l10n_br_fp_type', '=', 'ss_nnm'), ('company_id', '=', self.env.company.id)], limit=1)
|
|
return self.search([('l10n_br_fp_type', '=', 'interstate'), ('company_id', '=', self.env.company.id)], limit=1)
|