Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions l10n_br_account/tests/test_move_edition.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,9 @@ def wrapped_method(self, *args, **kwargs):
nbs=self.env["l10n_br_fiscal.nbs"],
cest=self.env["l10n_br_fiscal.cest"],
city_taxation_code=self.env["l10n_br_fiscal.city.taxation.code"],
national_taxation_code=self.env[
"l10n_br_fiscal.national.taxation.code"
],
service_type=self.env["l10n_br_fiscal.service.type"],
ind_final="1",
)
Expand Down
9 changes: 7 additions & 2 deletions l10n_br_account/views/account_move_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@
<field name="cfop_id" optional="hide" />
<field name="tax_classification_id" optional="hide" />
<field name="city_taxation_code_id" optional="hide" />
<field name="national_taxation_code_id" optional="hide" />
<field
name="fiscal_operation_line_id"
attrs="{'column_invisible': [('parent.fiscal_operation_id', '=', False)]}"
Expand Down Expand Up @@ -419,11 +420,15 @@
/>
<field
name="city_taxation_code_id"
attrs="{'invisible': ['|', ('document_type_id', '=', False), ('tax_icms_or_issqn', '=', 'icms')], 'required': [('document_type_id', '!=', False), ('tax_icms_or_issqn', '=', 'issqn'),('fiscal_operation_type','=','out')]}"
attrs="{'invisible': ['|', ('document_type_id', '=', False), ('tax_icms_or_issqn', '=', 'icms')]}"
/>
<field
name="national_taxation_code_id"
attrs="{'invisible': ['|', ('document_type_id', '=', False), ('tax_icms_or_issqn', '=', 'icms')]}"
/>
<field
name="service_type_id"
attrs="{'invisible': ['|', ('document_type_id', '=', False), ('tax_icms_or_issqn', '=', 'icms')], 'required': [('document_type_id', '!=', False), ('tax_icms_or_issqn', '=', 'issqn'),('fiscal_operation_type','=','out')]}"
attrs="{'invisible': ['|', ('document_type_id', '=', False), ('tax_icms_or_issqn', '=', 'icms')]}"
/>
<field
name="cnae_id"
Expand Down
5 changes: 5 additions & 0 deletions l10n_br_contract/views/contract_line.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@
attrs="{'invisible': ['|', '|', ('tax_icms_or_issqn', '=', 'icms'), ('country_id', '!=', %(base.br)d), ('fiscal_operation_id', '=', False)]}"
options="{'no_create': True}"
/>
<field
name="national_taxation_code_id"
attrs="{'invisible': ['|', '|', ('tax_icms_or_issqn', '=', 'icms'), ('country_id', '!=', %(base.br)d), ('fiscal_operation_id', '=', False)]}"
options="{'no_create': True}"
/>
<field
name="cnae_id"
attrs="{'invisible': ['|', '|', ('tax_icms_or_issqn', '=', 'icms'), ('country_id', '!=', %(base.br)d), ('fiscal_operation_id', '=', False)]}"
Expand Down
6 changes: 1 addition & 5 deletions l10n_br_fiscal/README.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association

========================
Módulo fiscal brasileiro
========================
Expand All @@ -17,7 +13,7 @@ Módulo fiscal brasileiro
.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
:target: https://odoo-community.org/page/development-status
:alt: Production/Stable
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--brazil-lightgray.png?logo=github
Expand Down
1 change: 1 addition & 0 deletions l10n_br_fiscal/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@
"views/uom_uom.xml",
"views/invalidate_number_view.xml",
"views/city_taxation_code.xml",
"views/national_taxation_code.xml",
"views/operation_dashboard_view.xml",
# Wizards
"wizards/document_import_wizard.xml",
Expand Down
1 change: 1 addition & 0 deletions l10n_br_fiscal/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
from . import uom_uom
from . import operation_dashboard
from . import city_taxation_code
from . import national_taxation_code
from . import document_supplement
from . import tax_classification
from . import operation_indicator
40 changes: 39 additions & 1 deletion l10n_br_fiscal/models/document_line_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,7 @@ def _compute_fiscal_operation_line_id(self):
"nbm_id",
"cest_id",
"city_taxation_code_id",
"national_taxation_code_id",
"service_type_id",
"ind_final",
)
Expand All @@ -327,6 +328,7 @@ def _compute_fiscal_tax_ids(self):
nbs=line.nbs_id,
cest=line.cest_id,
city_taxation_code=line.city_taxation_code_id,
national_taxation_code=line.national_taxation_code_id,
service_type=line.service_type_id,
ind_final=line.ind_final,
)
Expand Down Expand Up @@ -555,6 +557,7 @@ def _compute_product_fiscal_fields(self):
line.nbs_id = False
line.fiscal_genre_id = False
line.service_type_id = False
line.national_taxation_code_id = False
line.operation_indicator_id = False
continue
p = line.product_id
Expand All @@ -567,6 +570,7 @@ def _compute_product_fiscal_fields(self):
line.nbs_id = p.nbs_id
line.fiscal_genre_id = p.fiscal_genre_id
line.service_type_id = p.service_type_id
line.national_taxation_code_id = p.national_taxation_code_id
line.operation_indicator_id = p.operation_indicator_id

@api.depends("product_id")
Expand All @@ -585,6 +589,24 @@ def _compute_city_taxation_code_id(self):
else:
line.city_taxation_code_id = False

@api.depends("product_id")
def _compute_national_taxation_code_id(self):
for line in self:
if not line.product_id:
line.national_taxation_code_id = False
continue
line.national_taxation_code_id = line.product_id.national_taxation_code_id

@api.depends("city_taxation_code_id")
def _compute_issqn_fg_city_id(self):
for line in self:
if line.city_taxation_code_id and line.city_taxation_code_id.city_id:
line.issqn_fg_city_id = line.city_taxation_code_id.city_id
elif line.company_id and line.company_id.city_id:
line.issqn_fg_city_id = line.company_id.city_id
else:
line.issqn_fg_city_id = False

def _prepare_fields_issqn(self, tax_dict):
self.ensure_one()
return {
Expand Down Expand Up @@ -1197,12 +1219,27 @@ def _compute_ind_final(self):

city_taxation_code_id = fields.Many2one(
comodel_name="l10n_br_fiscal.city.taxation.code",
string="City Taxation Code",
help=(
"City Taxation Code for Municipal NFS-e or "
"ISS Municipal Taxation Code for National NFS-e."
),
compute="_compute_city_taxation_code_id",
store=True,
readonly=False,
precompute=True,
)

national_taxation_code_id = fields.Many2one(
comodel_name="l10n_br_fiscal.national.taxation.code",
string="ISS National Taxation Code",
help="National Taxation Code for the ISS tax (National NFS-e)",
compute="_compute_national_taxation_code_id",
store=True,
readonly=False,
precompute=True,
)

operation_indicator_id = fields.Many2one(
comodel_name="l10n_br_fiscal.operation.indicator",
string="Operation Indicator",
Expand All @@ -1229,10 +1266,11 @@ def _compute_ind_final(self):

issqn_fg_city_id = fields.Many2one(
comodel_name="res.city",
related="city_taxation_code_id.city_id",
compute="_compute_issqn_fg_city_id",
string="ISSQN City",
store=True,
precompute=True,
readonly=False,
)

# vDeducao
Expand Down
17 changes: 17 additions & 0 deletions l10n_br_fiscal/models/national_taxation_code.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Copyright 2025 Marcel Savegnago <https://escodoo.com.br>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import fields, models


class NationalTaxationCode(models.Model):
_name = "l10n_br_fiscal.national.taxation.code"
_inherit = "l10n_br_fiscal.data.abstract"
_description = "National Taxation Code"

tax_definition_ids = fields.Many2many(
comodel_name="l10n_br_fiscal.tax.definition",
relation="tax_definition_national_taxation_code_rel", # (default is too long)
readonly=True,
string="Tax Definition",
)
7 changes: 7 additions & 0 deletions l10n_br_fiscal/models/operation_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ def map_fiscal_taxes(
nbs=None,
cest=None,
city_taxation_code=None,
national_taxation_code=None,
service_type=None,
ind_final=None,
):
Expand Down Expand Up @@ -246,6 +247,8 @@ def map_fiscal_taxes(
defaults to product's CEST.
:param city_taxation_code: Optional City Taxation Code record
(l10n_br_fiscal.city.taxation.code).
:param national_taxation_code: Optional National Taxation Code record
(l10n_br_fiscal.national.taxation.code).
:param service_type: Optional Service Type record
(l10n_br_fiscal.service.type).
:param ind_final: (Passed to icms_regulation_id.map_tax; not directly
Expand Down Expand Up @@ -287,6 +290,7 @@ def map_fiscal_taxes(
nbs=nbs,
cest=cest,
city_taxation_code=city_taxation_code,
national_taxation_code=national_taxation_code,
service_type=service_type,
):
self._build_mapping_result(mapping_result, tax_definition)
Expand Down Expand Up @@ -342,6 +346,7 @@ def map_fiscal_taxes(
nbs=nbs,
cest=cest,
city_taxation_code=city_taxation_code,
national_taxation_code=national_taxation_code,
service_type=service_type,
):
self._build_mapping_result(mapping_result, tax_definition)
Expand All @@ -358,6 +363,7 @@ def map_fiscal_taxes(
nbs=nbs,
cest=cest,
city_taxation_code=city_taxation_code,
national_taxation_code=national_taxation_code,
service_type=service_type,
):
self._build_mapping_result(mapping_result, tax_definition)
Expand All @@ -374,6 +380,7 @@ def map_fiscal_taxes(
nbs=nbs,
cest=cest,
city_taxation_code=city_taxation_code,
national_taxation_code=national_taxation_code,
service_type=service_type,
):
self._build_mapping_result(mapping_result, tax_definition)
Expand Down
5 changes: 5 additions & 0 deletions l10n_br_fiscal/models/product_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ def _get_default_ncm_id(self):
comodel_name="l10n_br_fiscal.city.taxation.code", string="City Taxation Code"
)

national_taxation_code_id = fields.Many2one(
comodel_name="l10n_br_fiscal.national.taxation.code",
string="National Taxation Code",
)

fiscal_genre_code = fields.Char(
related="fiscal_genre_id.code",
store=True,
Expand Down
12 changes: 12 additions & 0 deletions l10n_br_fiscal/models/tax_definition.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,12 @@ def name_get(self):
string="City Taxation Codes",
)

national_taxation_code_ids = fields.Many2many(
comodel_name="l10n_br_fiscal.national.taxation.code",
relation="tax_definition_national_taxation_code_rel", # (default is too long)
string="National Taxation Codes",
)

service_type_ids = fields.Many2many(
comodel_name="l10n_br_fiscal.service.type",
string="Fiscal Service Types",
Expand Down Expand Up @@ -444,6 +450,7 @@ def map_tax_definition(
nbs=None,
cest=None,
city_taxation_code=None,
national_taxation_code=None,
service_type=None,
):
"""
Expand Down Expand Up @@ -476,6 +483,8 @@ def map_tax_definition(
defaults to product's CEST.
:param city_taxation_code: Optional City Taxation Code record
(l10n_br_fiscal.city.taxation.code).
:param national_taxation_code: Optional National Taxation Code record
(l10n_br_fiscal.national.taxation.code).
:param service_type: Optional Service Type record
(l10n_br_fiscal.service.type).
:return: A recordset of matching
Expand Down Expand Up @@ -510,6 +519,9 @@ def map_tax_definition(
("city_taxation_code_ids", "=", False),
("city_taxation_code_ids", "=", city_taxation_code.id),
"|",
("national_taxation_code_ids", "=", False),
("national_taxation_code_ids", "=", national_taxation_code.id),
"|",
("service_type_ids", "=", False),
("service_type_ids", "=", service_type.id),
"|",
Expand Down
2 changes: 2 additions & 0 deletions l10n_br_fiscal/security/ir.model.access.csv
Original file line number Diff line number Diff line change
Expand Up @@ -100,5 +100,7 @@
"l10n_br_fiscal_invalidate_number_manager","manager_l10n_br_fiscal_invalidate_number","model_l10n_br_fiscal_invalidate_number","l10n_br_fiscal.group_manager",1,1,1,1
"l10n_br_fiscal_city_taxation_code_user","Fiscal City Taxation Code for User","model_l10n_br_fiscal_city_taxation_code","l10n_br_fiscal.group_user",1,1,1,0
"l10n_br_fiscal_city_taxation_code_manager","Fiscal City Taxation Code for Manager","model_l10n_br_fiscal_city_taxation_code","l10n_br_fiscal.group_user",1,1,1,1
"l10n_br_fiscal_national_taxation_code_user","Fiscal National Taxation Code for User","model_l10n_br_fiscal_national_taxation_code","l10n_br_fiscal.group_user",1,1,1,0
"l10n_br_fiscal_national_taxation_code_manager","Fiscal National Taxation Code for Manager","model_l10n_br_fiscal_national_taxation_code","l10n_br_fiscal.group_user",1,1,1,1
"l10n_br_fiscal_document_status_wizard_user",l10n_br_fiscal_document_status_wizard,model_l10n_br_fiscal_document_status_wizard,base.group_user,1,1,1,1
"l10n_br_fiscal_document_import_wizard_user",l10n_br_fiscal_document_import_wizard_user,model_l10n_br_fiscal_document_import_wizard,base.group_user,1,1,1,1
Loading