odoo-addon-l10n-br-fiscal 18.0.2.0.0.10__py3-none-any.whl → 18.0.7.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of odoo-addon-l10n-br-fiscal might be problematic. Click here for more details.
- odoo/addons/l10n_br_fiscal/README.rst +1 -1
- odoo/addons/l10n_br_fiscal/__manifest__.py +7 -3
- odoo/addons/l10n_br_fiscal/constants/fiscal.py +64 -18
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.cest.csv +1043 -983
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.cst.csv +58 -0
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.document.type.csv +1 -0
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.operation.indicator.csv +27 -0
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.classification.csv +163 -0
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.csv +31 -0
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.group.csv +3 -0
- odoo/addons/l10n_br_fiscal/data/operation_data.xml +1 -1
- odoo/addons/l10n_br_fiscal/demo/fiscal_document_demo.xml +3 -179
- odoo/addons/l10n_br_fiscal/demo/fiscal_document_nfse_demo.xml +0 -4
- odoo/addons/l10n_br_fiscal/demo/fiscal_operation_demo.xml +2 -2
- odoo/addons/l10n_br_fiscal/i18n/l10n_br_fiscal.pot +665 -79
- odoo/addons/l10n_br_fiscal/i18n/pt_BR.po +713 -102
- odoo/addons/l10n_br_fiscal/migrations/18.0.3.0.0/pre-migration.py +30 -0
- odoo/addons/l10n_br_fiscal/models/__init__.py +2 -2
- odoo/addons/l10n_br_fiscal/models/comment.py +3 -1
- odoo/addons/l10n_br_fiscal/models/data_abstract.py +9 -6
- odoo/addons/l10n_br_fiscal/models/document.py +27 -8
- odoo/addons/l10n_br_fiscal/models/document_line.py +51 -8
- odoo/addons/l10n_br_fiscal/models/document_line_mixin.py +1107 -35
- odoo/addons/l10n_br_fiscal/models/document_mixin.py +244 -6
- odoo/addons/l10n_br_fiscal/models/document_related.py +1 -1
- odoo/addons/l10n_br_fiscal/models/document_serie.py +33 -0
- odoo/addons/l10n_br_fiscal/models/icms_regulation.py +1 -1
- odoo/addons/l10n_br_fiscal/models/operation_dashboard.py +3 -2
- odoo/addons/l10n_br_fiscal/models/operation_indicator.py +58 -0
- odoo/addons/l10n_br_fiscal/models/operation_line.py +28 -0
- odoo/addons/l10n_br_fiscal/models/partner_profile.py +6 -0
- odoo/addons/l10n_br_fiscal/models/product_template.py +4 -0
- odoo/addons/l10n_br_fiscal/models/res_company.py +17 -0
- odoo/addons/l10n_br_fiscal/models/res_partner.py +17 -0
- odoo/addons/l10n_br_fiscal/models/simplified_tax_range.py +8 -0
- odoo/addons/l10n_br_fiscal/models/tax.py +7 -3
- odoo/addons/l10n_br_fiscal/models/tax_classification.py +81 -0
- odoo/addons/l10n_br_fiscal/security/fiscal_security.xml +6 -16
- odoo/addons/l10n_br_fiscal/security/ir.model.access.csv +7 -2
- odoo/addons/l10n_br_fiscal/static/description/index.html +1 -1
- odoo/addons/l10n_br_fiscal/tests/__init__.py +2 -0
- odoo/addons/l10n_br_fiscal/tests/test_document_edition.py +175 -10
- odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_generic.py +13 -42
- odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_nfse.py +0 -5
- odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_serie.py +60 -0
- odoo/addons/l10n_br_fiscal/tests/test_tax_benefit.py +2 -5
- odoo/addons/l10n_br_fiscal/tests/test_tax_classification.py +110 -0
- odoo/addons/l10n_br_fiscal/views/document_line_mixin_view.xml +107 -4
- odoo/addons/l10n_br_fiscal/views/document_line_view.xml +7 -3
- odoo/addons/l10n_br_fiscal/views/document_view.xml +34 -15
- odoo/addons/l10n_br_fiscal/views/icms_regulation_view.xml +1 -5
- odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_action.xml +30 -0
- odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_menu.xml +16 -9
- odoo/addons/l10n_br_fiscal/views/nbs_view.xml +1 -5
- odoo/addons/l10n_br_fiscal/views/ncm_view.xml +1 -5
- odoo/addons/l10n_br_fiscal/views/operation_dashboard_view.xml +3 -3
- odoo/addons/l10n_br_fiscal/views/operation_indicator_view.xml +75 -0
- odoo/addons/l10n_br_fiscal/views/operation_line_view.xml +4 -5
- odoo/addons/l10n_br_fiscal/views/operation_view.xml +1 -5
- odoo/addons/l10n_br_fiscal/views/product_product_view.xml +33 -6
- odoo/addons/l10n_br_fiscal/views/product_template_view.xml +22 -4
- odoo/addons/l10n_br_fiscal/views/res_company_view.xml +6 -0
- odoo/addons/l10n_br_fiscal/views/res_partner_view.xml +10 -0
- odoo/addons/l10n_br_fiscal/views/service_type_view.xml +1 -5
- odoo/addons/l10n_br_fiscal/views/tax_classification.xml +108 -0
- odoo/addons/l10n_br_fiscal/views/tax_definition_view.xml +1 -5
- odoo/addons/l10n_br_fiscal/views/tax_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/wizards/__init__.py +1 -1
- odoo/addons/l10n_br_fiscal/wizards/base_wizard_mixin.py +1 -1
- odoo/addons/l10n_br_fiscal/wizards/document_import_wizard.py +234 -0
- odoo/addons/l10n_br_fiscal/wizards/{document_import_wizard_mixin.xml → document_import_wizard.xml} +26 -7
- {odoo_addon_l10n_br_fiscal-18.0.2.0.0.10.dist-info → odoo_addon_l10n_br_fiscal-18.0.7.1.0.dist-info}/METADATA +3 -3
- {odoo_addon_l10n_br_fiscal-18.0.2.0.0.10.dist-info → odoo_addon_l10n_br_fiscal-18.0.7.1.0.dist-info}/RECORD +75 -68
- odoo/addons/l10n_br_fiscal/models/document_line_mixin_methods.py +0 -837
- odoo/addons/l10n_br_fiscal/models/document_mixin_methods.py +0 -349
- odoo/addons/l10n_br_fiscal/wizards/document_import_wizard_mixin.py +0 -129
- {odoo_addon_l10n_br_fiscal-18.0.2.0.0.10.dist-info → odoo_addon_l10n_br_fiscal-18.0.7.1.0.dist-info}/WHEEL +0 -0
- {odoo_addon_l10n_br_fiscal-18.0.2.0.0.10.dist-info → odoo_addon_l10n_br_fiscal-18.0.7.1.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Copyright (C) 2025 - Engenere (<https://engenere.one>).
|
|
2
|
+
# @author Antônio S. Pereira Neto <neto@engenere.one>
|
|
3
|
+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
4
|
+
|
|
5
|
+
from openupgradelib import openupgrade
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@openupgrade.migrate()
|
|
9
|
+
def migrate(env, version):
|
|
10
|
+
field_spec = [
|
|
11
|
+
(
|
|
12
|
+
"l10n_br_fiscal.document",
|
|
13
|
+
"l10n_br_fiscal_document",
|
|
14
|
+
"amount_untaxed",
|
|
15
|
+
"fiscal_amount_untaxed",
|
|
16
|
+
),
|
|
17
|
+
(
|
|
18
|
+
"l10n_br_fiscal.document",
|
|
19
|
+
"l10n_br_fiscal_document",
|
|
20
|
+
"amount_tax",
|
|
21
|
+
"fiscal_amount_tax",
|
|
22
|
+
),
|
|
23
|
+
(
|
|
24
|
+
"l10n_br_fiscal.document",
|
|
25
|
+
"l10n_br_fiscal_document",
|
|
26
|
+
"amount_total",
|
|
27
|
+
"fiscal_amount_total",
|
|
28
|
+
),
|
|
29
|
+
]
|
|
30
|
+
openupgrade.rename_fields(env, field_spec)
|
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
from . import data_abstract
|
|
4
4
|
from . import data_product_abstract
|
|
5
5
|
from . import data_ncm_nbs_abstract
|
|
6
|
-
from . import document_mixin_methods
|
|
7
6
|
from . import document_mixin
|
|
8
|
-
from . import document_line_mixin_methods
|
|
9
7
|
from . import document_line_mixin
|
|
10
8
|
from . import invalidate_number
|
|
11
9
|
from . import comment
|
|
@@ -54,3 +52,5 @@ from . import uom_uom
|
|
|
54
52
|
from . import operation_dashboard
|
|
55
53
|
from . import city_taxation_code
|
|
56
54
|
from . import document_supplement
|
|
55
|
+
from . import tax_classification
|
|
56
|
+
from . import operation_indicator
|
|
@@ -85,9 +85,11 @@ class Comment(models.Model):
|
|
|
85
85
|
def format_amount(self, env, amount, currency):
|
|
86
86
|
fmt = f"%.{currency.decimal_places}f"
|
|
87
87
|
lang = env.ref("base.lang_pt_BR")
|
|
88
|
+
if not lang.active:
|
|
89
|
+
lang = env.ref("base.lang_en")
|
|
88
90
|
|
|
89
91
|
formatted_amount = (
|
|
90
|
-
lang.format(fmt,
|
|
92
|
+
lang.format(fmt, amount, grouping=True)
|
|
91
93
|
.replace(r" ", "\N{NO-BREAK SPACE}")
|
|
92
94
|
.replace(r"-", "-\N{ZERO WIDTH NO-BREAK SPACE}")
|
|
93
95
|
)
|
|
@@ -103,13 +103,16 @@ class DataAbstract(models.AbstractModel):
|
|
|
103
103
|
|
|
104
104
|
@api.depends("name", "code")
|
|
105
105
|
def _compute_display_name(self):
|
|
106
|
-
def
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
106
|
+
def truncate(value, size=64):
|
|
107
|
+
value = value or ""
|
|
108
|
+
if len(value) > size:
|
|
109
|
+
return f"{value[: size - 3]}..."
|
|
110
|
+
return value
|
|
110
111
|
|
|
111
112
|
for record in self:
|
|
113
|
+
code = record.code or ""
|
|
114
|
+
name = truncate(record.name)
|
|
112
115
|
if self._context.get("show_code_only"):
|
|
113
|
-
record.display_name =
|
|
116
|
+
record.display_name = code
|
|
114
117
|
else:
|
|
115
|
-
record.display_name = f"{
|
|
118
|
+
record.display_name = f"{code} - {name}" if name else code
|
|
@@ -17,11 +17,14 @@ from ..constants.fiscal import (
|
|
|
17
17
|
DOCUMENT_ISSUER_PARTNER,
|
|
18
18
|
EDOC_PURPOSE,
|
|
19
19
|
EDOC_PURPOSE_NORMAL,
|
|
20
|
+
EDOC_REFUND_CREDIT_TYPE,
|
|
21
|
+
EDOC_REFUND_DEBIT_TYPE,
|
|
20
22
|
FISCAL_IN_OUT_DICT,
|
|
21
23
|
MODELO_FISCAL_CTE,
|
|
22
24
|
MODELO_FISCAL_NFCE,
|
|
23
25
|
MODELO_FISCAL_NFE,
|
|
24
26
|
MODELO_FISCAL_NFSE,
|
|
27
|
+
PUBLIC_ENTIRY_TYPE,
|
|
25
28
|
SITUACAO_EDOC,
|
|
26
29
|
SITUACAO_EDOC_AUTORIZADA,
|
|
27
30
|
SITUACAO_EDOC_CANCELADA,
|
|
@@ -140,8 +143,16 @@ class Document(models.Model):
|
|
|
140
143
|
partner_id = fields.Many2one(
|
|
141
144
|
comodel_name="res.partner",
|
|
142
145
|
string="Partner",
|
|
146
|
+
inverse="_inverse_partner_id",
|
|
143
147
|
)
|
|
144
148
|
|
|
149
|
+
@api.onchange("partner_id")
|
|
150
|
+
def _inverse_partner_id(self):
|
|
151
|
+
for doc in self:
|
|
152
|
+
for line in doc.fiscal_line_ids:
|
|
153
|
+
if line.partner_id != doc.partner_id:
|
|
154
|
+
line.partner_id = doc.partner_id
|
|
155
|
+
|
|
145
156
|
partner_shipping_id = fields.Many2one(
|
|
146
157
|
comodel_name="res.partner",
|
|
147
158
|
string="Shipping Address",
|
|
@@ -170,6 +181,21 @@ class Document(models.Model):
|
|
|
170
181
|
precompute=True,
|
|
171
182
|
)
|
|
172
183
|
|
|
184
|
+
edoc_refund_debit_type = fields.Selection(
|
|
185
|
+
selection=EDOC_REFUND_DEBIT_TYPE,
|
|
186
|
+
string="Tipo de Nota de Débito",
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
edoc_refund_credit_type = fields.Selection(
|
|
190
|
+
selection=EDOC_REFUND_CREDIT_TYPE,
|
|
191
|
+
string="Tipo de Nota de Crédito",
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
public_entity_type = fields.Selection(
|
|
195
|
+
selection=PUBLIC_ENTIRY_TYPE,
|
|
196
|
+
string="Tipo de Entidade Governamental",
|
|
197
|
+
)
|
|
198
|
+
|
|
173
199
|
document_type = fields.Char(
|
|
174
200
|
string="Document Type Code",
|
|
175
201
|
related="document_type_id.code",
|
|
@@ -185,9 +211,9 @@ class Document(models.Model):
|
|
|
185
211
|
)
|
|
186
212
|
|
|
187
213
|
currency_id = fields.Many2one(
|
|
214
|
+
related="company_id.currency_id",
|
|
188
215
|
comodel_name="res.currency",
|
|
189
216
|
string="Currency",
|
|
190
|
-
compute="_compute_currency_id",
|
|
191
217
|
)
|
|
192
218
|
|
|
193
219
|
# this related "state" field is required for the status bar widget
|
|
@@ -325,11 +351,6 @@ class Document(models.Model):
|
|
|
325
351
|
self.fiscal_operation_id = False
|
|
326
352
|
return {"domain": {"fiscal_operation_id": domain}}
|
|
327
353
|
|
|
328
|
-
@api.depends("company_id")
|
|
329
|
-
def _compute_currency_id(self):
|
|
330
|
-
for doc in self:
|
|
331
|
-
doc.currency_id = doc.company_id.currency_id or self.env.company.currency_id
|
|
332
|
-
|
|
333
354
|
def _compute_document_name(self):
|
|
334
355
|
self.ensure_one()
|
|
335
356
|
name = ""
|
|
@@ -431,8 +452,6 @@ class Document(models.Model):
|
|
|
431
452
|
).format(line.fiscal_operation_id)
|
|
432
453
|
)
|
|
433
454
|
line.fiscal_operation_id = fsc_op_line
|
|
434
|
-
line._onchange_fiscal_operation_id()
|
|
435
|
-
|
|
436
455
|
return_docs |= new_doc
|
|
437
456
|
return return_docs
|
|
438
457
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Copyright (C) 2013 Renato Lima - Akretion
|
|
2
2
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
|
|
3
3
|
|
|
4
|
-
from odoo import fields, models
|
|
4
|
+
from odoo import api, fields, models
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class DocumentLine(models.Model):
|
|
@@ -30,7 +30,12 @@ class DocumentLine(models.Model):
|
|
|
30
30
|
ondelete="cascade",
|
|
31
31
|
)
|
|
32
32
|
|
|
33
|
-
name = fields.Char(
|
|
33
|
+
name = fields.Char(
|
|
34
|
+
compute="_compute_name",
|
|
35
|
+
store=True,
|
|
36
|
+
precompute=True,
|
|
37
|
+
readonly=False,
|
|
38
|
+
)
|
|
34
39
|
|
|
35
40
|
company_id = fields.Many2one(
|
|
36
41
|
comodel_name="res.company",
|
|
@@ -45,14 +50,36 @@ class DocumentLine(models.Model):
|
|
|
45
50
|
)
|
|
46
51
|
|
|
47
52
|
partner_id = fields.Many2one(
|
|
48
|
-
|
|
53
|
+
comodel_name="res.partner",
|
|
54
|
+
compute="_compute_partner_id",
|
|
49
55
|
store=True,
|
|
50
56
|
precompute=True,
|
|
57
|
+
readonly=False,
|
|
51
58
|
)
|
|
52
59
|
|
|
53
|
-
|
|
60
|
+
# Do not depend on `document_id.partner_id`, the inverse is taking care of that
|
|
61
|
+
def _compute_partner_id(self):
|
|
62
|
+
for line in self:
|
|
63
|
+
line.partner_id = line.document_id.partner_id
|
|
64
|
+
|
|
65
|
+
uom_id = fields.Many2one(
|
|
66
|
+
comodel_name="uom.uom",
|
|
67
|
+
string="UOM",
|
|
68
|
+
compute="_compute_uom_id",
|
|
69
|
+
store=True,
|
|
70
|
+
readonly=False,
|
|
71
|
+
precompute=True,
|
|
72
|
+
)
|
|
54
73
|
|
|
55
|
-
|
|
74
|
+
price_unit = fields.Float(
|
|
75
|
+
digits="Product Price",
|
|
76
|
+
compute="_compute_price_unit_fiscal",
|
|
77
|
+
store=True,
|
|
78
|
+
precompute=True,
|
|
79
|
+
readonly=False,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
quantity = fields.Float(default=1.0)
|
|
56
83
|
|
|
57
84
|
# Usado para tornar Somente Leitura os campos dos custos
|
|
58
85
|
# de entrega quando a definição for por Total
|
|
@@ -70,6 +97,22 @@ class DocumentLine(models.Model):
|
|
|
70
97
|
|
|
71
98
|
additional_data = fields.Text()
|
|
72
99
|
|
|
100
|
+
@api.depends("product_id")
|
|
101
|
+
def _compute_name(self):
|
|
102
|
+
for line in self:
|
|
103
|
+
if line.product_id:
|
|
104
|
+
line.name = line.product_id.display_name
|
|
105
|
+
else:
|
|
106
|
+
line.name = False
|
|
107
|
+
|
|
108
|
+
@api.depends("product_id")
|
|
109
|
+
def _compute_uom_id(self):
|
|
110
|
+
for line in self:
|
|
111
|
+
if line.fiscal_operation_type == "in":
|
|
112
|
+
line.uom_id = line.product_id.uom_po_id
|
|
113
|
+
else:
|
|
114
|
+
line.uom_id = line.product_id.uom_id
|
|
115
|
+
|
|
73
116
|
def __document_comment_vals(self):
|
|
74
117
|
self.ensure_one()
|
|
75
118
|
return {
|
|
@@ -80,7 +123,7 @@ class DocumentLine(models.Model):
|
|
|
80
123
|
}
|
|
81
124
|
|
|
82
125
|
def _document_comment(self):
|
|
83
|
-
for
|
|
84
|
-
|
|
85
|
-
|
|
126
|
+
for line in self:
|
|
127
|
+
line.additional_data = line.comment_ids.compute_message(
|
|
128
|
+
line.__document_comment_vals(), line.manual_additional_data
|
|
86
129
|
)
|