odoo-addon-l10n-br-fiscal 17.0.1.0.0.11__py3-none-any.whl → 18.0.5.0.0.1__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 +10 -10
- odoo/addons/l10n_br_fiscal/__init__.py +1 -0
- odoo/addons/l10n_br_fiscal/__manifest__.py +3 -2
- odoo/addons/l10n_br_fiscal/constants/fiscal.py +51 -24
- odoo/addons/l10n_br_fiscal/data/ir_cron.xml +19 -34
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.document.type.csv +1 -0
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_cfop_data.xml +0 -2
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_data.xml +6 -8
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_icms_tax_definition_data.xml +4055 -4033
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_server_action.xml +0 -2
- odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_tax_icms_data.xml +54 -50
- odoo/addons/l10n_br_fiscal/data/operation_data.xml +198 -182
- odoo/addons/l10n_br_fiscal/data/product_data.xml +0 -2
- odoo/addons/l10n_br_fiscal/data/res_partner_data.xml +0 -2
- odoo/addons/l10n_br_fiscal/data/simplified_tax_data.xml +0 -2
- odoo/addons/l10n_br_fiscal/data/uom_data.xml +0 -2
- odoo/addons/l10n_br_fiscal/demo/city_taxation_code_demo.xml +0 -2
- odoo/addons/l10n_br_fiscal/demo/company_demo.xml +0 -3
- odoo/addons/l10n_br_fiscal/demo/fiscal_document_demo.xml +40 -228
- odoo/addons/l10n_br_fiscal/demo/fiscal_document_nfse_demo.xml +0 -5
- odoo/addons/l10n_br_fiscal/demo/fiscal_operation_demo.xml +2 -4
- odoo/addons/l10n_br_fiscal/demo/icms_tax_definition_demo.xml +0 -2
- odoo/addons/l10n_br_fiscal/demo/partner_demo.xml +0 -2
- odoo/addons/l10n_br_fiscal/demo/product_demo.xml +0 -1705
- odoo/addons/l10n_br_fiscal/demo/res_users_demo.xml +0 -2
- odoo/addons/l10n_br_fiscal/hooks.py +68 -0
- odoo/addons/l10n_br_fiscal/i18n/l10n_br_fiscal.pot +232 -201
- odoo/addons/l10n_br_fiscal/i18n/pt_BR.po +1272 -1344
- odoo/addons/l10n_br_fiscal/migrations/18.0.2.0.0/pre-migration.py +25 -0
- odoo/addons/l10n_br_fiscal/migrations/18.0.3.0.0/pre-migration.py +30 -0
- odoo/addons/l10n_br_fiscal/models/cfop.py +1 -1
- odoo/addons/l10n_br_fiscal/models/cnae.py +2 -2
- odoo/addons/l10n_br_fiscal/models/comment.py +12 -27
- odoo/addons/l10n_br_fiscal/models/cst.py +2 -2
- odoo/addons/l10n_br_fiscal/models/data_abstract.py +11 -24
- odoo/addons/l10n_br_fiscal/models/document.py +57 -9
- odoo/addons/l10n_br_fiscal/models/document_line.py +65 -5
- odoo/addons/l10n_br_fiscal/models/document_line_mixin.py +118 -38
- odoo/addons/l10n_br_fiscal/models/document_line_mixin_methods.py +261 -295
- odoo/addons/l10n_br_fiscal/models/document_mixin.py +8 -16
- odoo/addons/l10n_br_fiscal/models/document_mixin_methods.py +49 -177
- odoo/addons/l10n_br_fiscal/models/document_related.py +1 -1
- odoo/addons/l10n_br_fiscal/models/document_serie.py +35 -2
- odoo/addons/l10n_br_fiscal/models/document_type.py +0 -1
- odoo/addons/l10n_br_fiscal/models/ibpt.py +1 -1
- odoo/addons/l10n_br_fiscal/models/icms_regulation.py +1 -1
- odoo/addons/l10n_br_fiscal/models/invalidate_number.py +6 -7
- odoo/addons/l10n_br_fiscal/models/legal_nature.py +1 -1
- odoo/addons/l10n_br_fiscal/models/nbm.py +2 -2
- odoo/addons/l10n_br_fiscal/models/nbs.py +4 -4
- odoo/addons/l10n_br_fiscal/models/ncm.py +4 -4
- odoo/addons/l10n_br_fiscal/models/operation.py +2 -2
- odoo/addons/l10n_br_fiscal/models/operation_dashboard.py +3 -2
- odoo/addons/l10n_br_fiscal/models/operation_line.py +1 -1
- odoo/addons/l10n_br_fiscal/models/partner_profile.py +7 -1
- odoo/addons/l10n_br_fiscal/models/product_template.py +1 -1
- odoo/addons/l10n_br_fiscal/models/res_partner.py +9 -0
- odoo/addons/l10n_br_fiscal/models/tax.py +12 -4
- odoo/addons/l10n_br_fiscal/models/tax_group.py +6 -6
- odoo/addons/l10n_br_fiscal/models/tax_pis_cofins.py +4 -4
- odoo/addons/l10n_br_fiscal/models/tax_pis_cofins_base.py +3 -3
- odoo/addons/l10n_br_fiscal/models/tax_pis_cofins_credit.py +3 -3
- odoo/addons/l10n_br_fiscal/security/fiscal_security.xml +6 -18
- odoo/addons/l10n_br_fiscal/security/ir.model.access.csv +1 -2
- odoo/addons/l10n_br_fiscal/static/description/index.html +8 -8
- odoo/addons/l10n_br_fiscal/tests/__init__.py +1 -0
- odoo/addons/l10n_br_fiscal/tests/test_document_edition.py +200 -14
- odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_generic.py +16 -44
- 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/views/cest_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/cfop_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/city_taxation_code.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/cnae_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/comment_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/cst_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/document_line_mixin_view.xml +1 -1
- odoo/addons/l10n_br_fiscal/views/document_line_view.xml +6 -4
- odoo/addons/l10n_br_fiscal/views/document_related_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/document_serie_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/document_type_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/document_view.xml +29 -29
- odoo/addons/l10n_br_fiscal/views/icms_regulation_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/icms_relief_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/invalidate_number_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_action.xml +36 -36
- odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_menu.xml +0 -9
- odoo/addons/l10n_br_fiscal/views/legal_nature_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/nbm_view.xml +5 -5
- odoo/addons/l10n_br_fiscal/views/nbs_view.xml +5 -5
- odoo/addons/l10n_br_fiscal/views/ncm_view.xml +5 -5
- odoo/addons/l10n_br_fiscal/views/operation_dashboard_view.xml +7 -8
- odoo/addons/l10n_br_fiscal/views/operation_line_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/operation_view.xml +4 -4
- odoo/addons/l10n_br_fiscal/views/partner_profile_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/product_genre_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/product_product_view.xml +38 -11
- odoo/addons/l10n_br_fiscal/views/product_template_view.xml +22 -9
- odoo/addons/l10n_br_fiscal/views/res_config_settings_view.xml +8 -8
- odoo/addons/l10n_br_fiscal/views/res_partner_view.xml +9 -0
- odoo/addons/l10n_br_fiscal/views/service_type_view.xml +5 -5
- odoo/addons/l10n_br_fiscal/views/simplified_tax_range_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/simplified_tax_view.xml +4 -4
- odoo/addons/l10n_br_fiscal/views/tax_definition_view.xml +4 -4
- odoo/addons/l10n_br_fiscal/views/tax_estimate_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/tax_group_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/tax_ipi_control_seal_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/tax_ipi_guideline_class_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/tax_ipi_guideline_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_base_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_credit_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/tax_view.xml +2 -2
- odoo/addons/l10n_br_fiscal/views/uom_uom.xml +2 -2
- odoo/addons/l10n_br_fiscal/wizards/base_wizard_mixin.py +1 -1
- {odoo_addon_l10n_br_fiscal-17.0.1.0.0.11.dist-info → odoo_addon_l10n_br_fiscal-18.0.5.0.0.1.dist-info}/METADATA +16 -16
- {odoo_addon_l10n_br_fiscal-17.0.1.0.0.11.dist-info → odoo_addon_l10n_br_fiscal-18.0.5.0.0.1.dist-info}/RECORD +120 -116
- {odoo_addon_l10n_br_fiscal-17.0.1.0.0.11.dist-info → odoo_addon_l10n_br_fiscal-18.0.5.0.0.1.dist-info}/WHEEL +0 -0
- {odoo_addon_l10n_br_fiscal-17.0.1.0.0.11.dist-info → odoo_addon_l10n_br_fiscal-18.0.5.0.0.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Copyright (C) 2025 - Engenere (<https://engenere.one>).
|
|
2
|
+
# @author Antônio S. Pereira Neto <neto@engenere.one>
|
|
3
|
+
|
|
4
|
+
from openupgradelib import openupgrade
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@openupgrade.migrate()
|
|
8
|
+
def migrate(env, version):
|
|
9
|
+
"""Rename product.template M2M field to the new pluralized name.
|
|
10
|
+
|
|
11
|
+
The underlying Many2many relation table remains the same because
|
|
12
|
+
Odoo derives it from model table names, not the field name. This
|
|
13
|
+
rename keeps references (e.g., stored views/filters) consistent.
|
|
14
|
+
"""
|
|
15
|
+
openupgrade.rename_fields(
|
|
16
|
+
env,
|
|
17
|
+
[
|
|
18
|
+
(
|
|
19
|
+
"product.template",
|
|
20
|
+
"product.template",
|
|
21
|
+
"city_taxation_code_id",
|
|
22
|
+
"city_taxation_code_ids",
|
|
23
|
+
),
|
|
24
|
+
],
|
|
25
|
+
)
|
|
@@ -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)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# Copyright (C) 2014 KMEE - www.kmee.com.br
|
|
3
3
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
|
|
4
4
|
|
|
5
|
-
from odoo import
|
|
5
|
+
from odoo import fields, models
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class Cnae(models.Model):
|
|
@@ -34,6 +34,6 @@ class Cnae(models.Model):
|
|
|
34
34
|
(
|
|
35
35
|
"fiscal_cnae_code_uniq",
|
|
36
36
|
"unique (code)",
|
|
37
|
-
|
|
37
|
+
"CNAE already exists with this code!",
|
|
38
38
|
)
|
|
39
39
|
]
|
|
@@ -6,8 +6,7 @@ from datetime import datetime
|
|
|
6
6
|
|
|
7
7
|
from dateutil.relativedelta import relativedelta
|
|
8
8
|
|
|
9
|
-
from odoo import api, fields, models
|
|
10
|
-
from odoo.osv import expression
|
|
9
|
+
from odoo import api, fields, models
|
|
11
10
|
|
|
12
11
|
from ..constants.fiscal import (
|
|
13
12
|
COMMENT_TYPE,
|
|
@@ -62,29 +61,13 @@ class Comment(models.Model):
|
|
|
62
61
|
)
|
|
63
62
|
|
|
64
63
|
@api.model
|
|
65
|
-
def
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
("comment", "ilike", "%" + name + "%"),
|
|
73
|
-
("name", operator, name),
|
|
74
|
-
],
|
|
75
|
-
]
|
|
76
|
-
)
|
|
77
|
-
return super()._search(
|
|
78
|
-
domain,
|
|
79
|
-
limit=limit,
|
|
80
|
-
)
|
|
81
|
-
return super()._name_search(
|
|
82
|
-
name=name,
|
|
83
|
-
domain=domain,
|
|
84
|
-
operator=operator,
|
|
85
|
-
limit=limit,
|
|
86
|
-
order=order,
|
|
87
|
-
)
|
|
64
|
+
def _search_display_name(self, operator, value):
|
|
65
|
+
name = value or ""
|
|
66
|
+
return [
|
|
67
|
+
"|",
|
|
68
|
+
("comment", "ilike", "%" + name + "%"),
|
|
69
|
+
("name", operator, name),
|
|
70
|
+
]
|
|
88
71
|
|
|
89
72
|
@api.depends("comment")
|
|
90
73
|
def _compute_display_name(self):
|
|
@@ -102,9 +85,11 @@ class Comment(models.Model):
|
|
|
102
85
|
def format_amount(self, env, amount, currency):
|
|
103
86
|
fmt = f"%.{currency.decimal_places}f"
|
|
104
87
|
lang = env.ref("base.lang_pt_BR")
|
|
88
|
+
if not lang.active:
|
|
89
|
+
lang = env.ref("base.lang_en")
|
|
105
90
|
|
|
106
91
|
formatted_amount = (
|
|
107
|
-
lang.format(fmt,
|
|
92
|
+
lang.format(fmt, amount, grouping=True)
|
|
108
93
|
.replace(r" ", "\N{NO-BREAK SPACE}")
|
|
109
94
|
.replace(r"-", "-\N{ZERO WIDTH NO-BREAK SPACE}")
|
|
110
95
|
)
|
|
@@ -165,7 +150,7 @@ class Comment(models.Model):
|
|
|
165
150
|
|
|
166
151
|
comments = [manual_comment] if manual_comment else []
|
|
167
152
|
for record in self:
|
|
168
|
-
template = mako_safe_env.from_string(
|
|
153
|
+
template = mako_safe_env.from_string(record.comment)
|
|
169
154
|
comments.append(template.render(vals))
|
|
170
155
|
return " - ".join(comments)
|
|
171
156
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Copyright (C) 2018 Renato Lima - Akretion
|
|
2
2
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
|
|
3
3
|
|
|
4
|
-
from odoo import
|
|
4
|
+
from odoo import fields, models
|
|
5
5
|
|
|
6
6
|
from ..constants.fiscal import FISCAL_IN_OUT_ALL
|
|
7
7
|
|
|
@@ -34,6 +34,6 @@ class CST(models.Model):
|
|
|
34
34
|
(
|
|
35
35
|
"l10n_br_fiscal_cst_code_tax_group_id_uniq",
|
|
36
36
|
"unique (code, tax_group_id)",
|
|
37
|
-
|
|
37
|
+
"CST already exists with this code!",
|
|
38
38
|
)
|
|
39
39
|
]
|
|
@@ -8,7 +8,6 @@ from lxml import etree
|
|
|
8
8
|
|
|
9
9
|
from odoo import _, api, fields, models
|
|
10
10
|
from odoo.exceptions import AccessError
|
|
11
|
-
from odoo.osv import expression
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
class DataAbstract(models.AbstractModel):
|
|
@@ -23,7 +22,7 @@ class DataAbstract(models.AbstractModel):
|
|
|
23
22
|
- Enhanced search: Modifies search views and `_name_search`
|
|
24
23
|
to allow searching by `code`, `code_unmasked`, and `name`
|
|
25
24
|
simultaneously.
|
|
26
|
-
- Standardized display name format in `
|
|
25
|
+
- Standardized display name format in `display_name`
|
|
27
26
|
(`<code> - <name>`).
|
|
28
27
|
- Permission control for archiving/unarchanging, restricted
|
|
29
28
|
to users in 'l10n_br_fiscal.group_manager' group.
|
|
@@ -89,30 +88,18 @@ class DataAbstract(models.AbstractModel):
|
|
|
89
88
|
return model_view
|
|
90
89
|
|
|
91
90
|
@api.model
|
|
92
|
-
def
|
|
91
|
+
def _search_display_name(self, operator, value):
|
|
92
|
+
name = value or ""
|
|
93
93
|
if operator == "ilike" and not (name or "").strip():
|
|
94
|
-
|
|
94
|
+
return []
|
|
95
95
|
elif operator in ("ilike", "like", "=", "=like", "=ilike"):
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
("code", operator, name),
|
|
104
|
-
("code_unmasked", "ilike", name + "%"),
|
|
105
|
-
],
|
|
106
|
-
]
|
|
107
|
-
)
|
|
108
|
-
return self._search(
|
|
109
|
-
domain,
|
|
110
|
-
limit=limit,
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
return super()._name_search(
|
|
114
|
-
name, domain=domain, operator=operator, limit=limit, order=order
|
|
115
|
-
)
|
|
96
|
+
return [
|
|
97
|
+
"|",
|
|
98
|
+
"|",
|
|
99
|
+
("name", operator, name),
|
|
100
|
+
("code", operator, name),
|
|
101
|
+
("code_unmasked", "ilike", name + "%"),
|
|
102
|
+
]
|
|
116
103
|
|
|
117
104
|
@api.depends("name", "code")
|
|
118
105
|
def _compute_display_name(self):
|
|
@@ -10,16 +10,21 @@ from odoo import _, api, fields, models
|
|
|
10
10
|
from odoo.exceptions import ValidationError
|
|
11
11
|
|
|
12
12
|
from ..constants.fiscal import (
|
|
13
|
+
COMMENT_TYPE_COMMERCIAL,
|
|
14
|
+
COMMENT_TYPE_FISCAL,
|
|
13
15
|
DOCUMENT_ISSUER_COMPANY,
|
|
14
16
|
DOCUMENT_ISSUER_DICT,
|
|
15
17
|
DOCUMENT_ISSUER_PARTNER,
|
|
16
18
|
EDOC_PURPOSE,
|
|
17
19
|
EDOC_PURPOSE_NORMAL,
|
|
20
|
+
EDOC_REFUND_CREDIT_TYPE,
|
|
21
|
+
EDOC_REFUND_DEBIT_TYPE,
|
|
18
22
|
FISCAL_IN_OUT_DICT,
|
|
19
23
|
MODELO_FISCAL_CTE,
|
|
20
24
|
MODELO_FISCAL_NFCE,
|
|
21
25
|
MODELO_FISCAL_NFE,
|
|
22
26
|
MODELO_FISCAL_NFSE,
|
|
27
|
+
PUBLIC_ENTIRY_TYPE,
|
|
23
28
|
SITUACAO_EDOC,
|
|
24
29
|
SITUACAO_EDOC_AUTORIZADA,
|
|
25
30
|
SITUACAO_EDOC_CANCELADA,
|
|
@@ -105,7 +110,6 @@ class Document(models.Model):
|
|
|
105
110
|
string="RPS Number",
|
|
106
111
|
copy=False,
|
|
107
112
|
index=True,
|
|
108
|
-
unaccent=False,
|
|
109
113
|
)
|
|
110
114
|
|
|
111
115
|
document_date = fields.Datetime(
|
|
@@ -139,8 +143,16 @@ class Document(models.Model):
|
|
|
139
143
|
partner_id = fields.Many2one(
|
|
140
144
|
comodel_name="res.partner",
|
|
141
145
|
string="Partner",
|
|
146
|
+
inverse="_inverse_partner_id",
|
|
142
147
|
)
|
|
143
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
|
+
|
|
144
156
|
partner_shipping_id = fields.Many2one(
|
|
145
157
|
comodel_name="res.partner",
|
|
146
158
|
string="Shipping Address",
|
|
@@ -169,6 +181,21 @@ class Document(models.Model):
|
|
|
169
181
|
precompute=True,
|
|
170
182
|
)
|
|
171
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
|
+
|
|
172
199
|
document_type = fields.Char(
|
|
173
200
|
string="Document Type Code",
|
|
174
201
|
related="document_type_id.code",
|
|
@@ -184,9 +211,9 @@ class Document(models.Model):
|
|
|
184
211
|
)
|
|
185
212
|
|
|
186
213
|
currency_id = fields.Many2one(
|
|
214
|
+
related="company_id.currency_id",
|
|
187
215
|
comodel_name="res.currency",
|
|
188
216
|
string="Currency",
|
|
189
|
-
compute="_compute_currency_id",
|
|
190
217
|
)
|
|
191
218
|
|
|
192
219
|
# this related "state" field is required for the status bar widget
|
|
@@ -236,6 +263,10 @@ class Document(models.Model):
|
|
|
236
263
|
string="Company ST State Tax Number",
|
|
237
264
|
)
|
|
238
265
|
|
|
266
|
+
fiscal_additional_data = fields.Text()
|
|
267
|
+
|
|
268
|
+
customer_additional_data = fields.Text()
|
|
269
|
+
|
|
239
270
|
@api.constrains("document_key")
|
|
240
271
|
def _check_key(self):
|
|
241
272
|
for record in self:
|
|
@@ -320,11 +351,6 @@ class Document(models.Model):
|
|
|
320
351
|
self.fiscal_operation_id = False
|
|
321
352
|
return {"domain": {"fiscal_operation_id": domain}}
|
|
322
353
|
|
|
323
|
-
@api.depends("company_id")
|
|
324
|
-
def _compute_currency_id(self):
|
|
325
|
-
for doc in self:
|
|
326
|
-
doc.currency_id = doc.company_id.currency_id or self.env.company.currency_id
|
|
327
|
-
|
|
328
354
|
def _compute_document_name(self):
|
|
329
355
|
self.ensure_one()
|
|
330
356
|
name = ""
|
|
@@ -426,8 +452,6 @@ class Document(models.Model):
|
|
|
426
452
|
).format(line.fiscal_operation_id)
|
|
427
453
|
)
|
|
428
454
|
line.fiscal_operation_id = fsc_op_line
|
|
429
|
-
line._onchange_fiscal_operation_id()
|
|
430
|
-
|
|
431
455
|
return_docs |= new_doc
|
|
432
456
|
return return_docs
|
|
433
457
|
|
|
@@ -476,3 +500,27 @@ class Document(models.Model):
|
|
|
476
500
|
def _compute_edoc_purpose(self):
|
|
477
501
|
for record in self:
|
|
478
502
|
record.edoc_purpose = record.fiscal_operation_id.edoc_purpose
|
|
503
|
+
|
|
504
|
+
def __document_comment_vals(self):
|
|
505
|
+
return {
|
|
506
|
+
"user": self.env.user,
|
|
507
|
+
"ctx": self._context,
|
|
508
|
+
"doc": self,
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
def _document_comment(self):
|
|
512
|
+
for d in self:
|
|
513
|
+
# Fiscal Comments
|
|
514
|
+
d.fiscal_additional_data = d.comment_ids.filtered(
|
|
515
|
+
lambda c: c.comment_type == COMMENT_TYPE_FISCAL
|
|
516
|
+
).compute_message(
|
|
517
|
+
d.__document_comment_vals(), d.manual_fiscal_additional_data
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
# Commercial Comments
|
|
521
|
+
d.customer_additional_data = d.comment_ids.filtered(
|
|
522
|
+
lambda c: c.comment_type == COMMENT_TYPE_COMMERCIAL
|
|
523
|
+
).compute_message(
|
|
524
|
+
d.__document_comment_vals(), d.manual_customer_additional_data
|
|
525
|
+
)
|
|
526
|
+
d.fiscal_line_ids._document_comment()
|
|
@@ -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
|
|
@@ -67,3 +94,36 @@ class DocumentLine(models.Model):
|
|
|
67
94
|
edoc_purpose = fields.Selection(
|
|
68
95
|
related="document_id.edoc_purpose",
|
|
69
96
|
)
|
|
97
|
+
|
|
98
|
+
additional_data = fields.Text()
|
|
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
|
+
|
|
116
|
+
def __document_comment_vals(self):
|
|
117
|
+
self.ensure_one()
|
|
118
|
+
return {
|
|
119
|
+
"user": self.env.user,
|
|
120
|
+
"ctx": self._context,
|
|
121
|
+
"doc": self.document_id if hasattr(self, "document_id") else None,
|
|
122
|
+
"item": self,
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
def _document_comment(self):
|
|
126
|
+
for line in self:
|
|
127
|
+
line.additional_data = line.comment_ids.compute_message(
|
|
128
|
+
line.__document_comment_vals(), line.manual_additional_data
|
|
129
|
+
)
|