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.

Files changed (120) hide show
  1. odoo/addons/l10n_br_fiscal/README.rst +10 -10
  2. odoo/addons/l10n_br_fiscal/__init__.py +1 -0
  3. odoo/addons/l10n_br_fiscal/__manifest__.py +3 -2
  4. odoo/addons/l10n_br_fiscal/constants/fiscal.py +51 -24
  5. odoo/addons/l10n_br_fiscal/data/ir_cron.xml +19 -34
  6. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.document.type.csv +1 -0
  7. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_cfop_data.xml +0 -2
  8. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_data.xml +6 -8
  9. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_icms_tax_definition_data.xml +4055 -4033
  10. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_server_action.xml +0 -2
  11. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_tax_icms_data.xml +54 -50
  12. odoo/addons/l10n_br_fiscal/data/operation_data.xml +198 -182
  13. odoo/addons/l10n_br_fiscal/data/product_data.xml +0 -2
  14. odoo/addons/l10n_br_fiscal/data/res_partner_data.xml +0 -2
  15. odoo/addons/l10n_br_fiscal/data/simplified_tax_data.xml +0 -2
  16. odoo/addons/l10n_br_fiscal/data/uom_data.xml +0 -2
  17. odoo/addons/l10n_br_fiscal/demo/city_taxation_code_demo.xml +0 -2
  18. odoo/addons/l10n_br_fiscal/demo/company_demo.xml +0 -3
  19. odoo/addons/l10n_br_fiscal/demo/fiscal_document_demo.xml +40 -228
  20. odoo/addons/l10n_br_fiscal/demo/fiscal_document_nfse_demo.xml +0 -5
  21. odoo/addons/l10n_br_fiscal/demo/fiscal_operation_demo.xml +2 -4
  22. odoo/addons/l10n_br_fiscal/demo/icms_tax_definition_demo.xml +0 -2
  23. odoo/addons/l10n_br_fiscal/demo/partner_demo.xml +0 -2
  24. odoo/addons/l10n_br_fiscal/demo/product_demo.xml +0 -1705
  25. odoo/addons/l10n_br_fiscal/demo/res_users_demo.xml +0 -2
  26. odoo/addons/l10n_br_fiscal/hooks.py +68 -0
  27. odoo/addons/l10n_br_fiscal/i18n/l10n_br_fiscal.pot +232 -201
  28. odoo/addons/l10n_br_fiscal/i18n/pt_BR.po +1272 -1344
  29. odoo/addons/l10n_br_fiscal/migrations/18.0.2.0.0/pre-migration.py +25 -0
  30. odoo/addons/l10n_br_fiscal/migrations/18.0.3.0.0/pre-migration.py +30 -0
  31. odoo/addons/l10n_br_fiscal/models/cfop.py +1 -1
  32. odoo/addons/l10n_br_fiscal/models/cnae.py +2 -2
  33. odoo/addons/l10n_br_fiscal/models/comment.py +12 -27
  34. odoo/addons/l10n_br_fiscal/models/cst.py +2 -2
  35. odoo/addons/l10n_br_fiscal/models/data_abstract.py +11 -24
  36. odoo/addons/l10n_br_fiscal/models/document.py +57 -9
  37. odoo/addons/l10n_br_fiscal/models/document_line.py +65 -5
  38. odoo/addons/l10n_br_fiscal/models/document_line_mixin.py +118 -38
  39. odoo/addons/l10n_br_fiscal/models/document_line_mixin_methods.py +261 -295
  40. odoo/addons/l10n_br_fiscal/models/document_mixin.py +8 -16
  41. odoo/addons/l10n_br_fiscal/models/document_mixin_methods.py +49 -177
  42. odoo/addons/l10n_br_fiscal/models/document_related.py +1 -1
  43. odoo/addons/l10n_br_fiscal/models/document_serie.py +35 -2
  44. odoo/addons/l10n_br_fiscal/models/document_type.py +0 -1
  45. odoo/addons/l10n_br_fiscal/models/ibpt.py +1 -1
  46. odoo/addons/l10n_br_fiscal/models/icms_regulation.py +1 -1
  47. odoo/addons/l10n_br_fiscal/models/invalidate_number.py +6 -7
  48. odoo/addons/l10n_br_fiscal/models/legal_nature.py +1 -1
  49. odoo/addons/l10n_br_fiscal/models/nbm.py +2 -2
  50. odoo/addons/l10n_br_fiscal/models/nbs.py +4 -4
  51. odoo/addons/l10n_br_fiscal/models/ncm.py +4 -4
  52. odoo/addons/l10n_br_fiscal/models/operation.py +2 -2
  53. odoo/addons/l10n_br_fiscal/models/operation_dashboard.py +3 -2
  54. odoo/addons/l10n_br_fiscal/models/operation_line.py +1 -1
  55. odoo/addons/l10n_br_fiscal/models/partner_profile.py +7 -1
  56. odoo/addons/l10n_br_fiscal/models/product_template.py +1 -1
  57. odoo/addons/l10n_br_fiscal/models/res_partner.py +9 -0
  58. odoo/addons/l10n_br_fiscal/models/tax.py +12 -4
  59. odoo/addons/l10n_br_fiscal/models/tax_group.py +6 -6
  60. odoo/addons/l10n_br_fiscal/models/tax_pis_cofins.py +4 -4
  61. odoo/addons/l10n_br_fiscal/models/tax_pis_cofins_base.py +3 -3
  62. odoo/addons/l10n_br_fiscal/models/tax_pis_cofins_credit.py +3 -3
  63. odoo/addons/l10n_br_fiscal/security/fiscal_security.xml +6 -18
  64. odoo/addons/l10n_br_fiscal/security/ir.model.access.csv +1 -2
  65. odoo/addons/l10n_br_fiscal/static/description/index.html +8 -8
  66. odoo/addons/l10n_br_fiscal/tests/__init__.py +1 -0
  67. odoo/addons/l10n_br_fiscal/tests/test_document_edition.py +200 -14
  68. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_generic.py +16 -44
  69. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_nfse.py +0 -5
  70. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_serie.py +60 -0
  71. odoo/addons/l10n_br_fiscal/tests/test_tax_benefit.py +2 -5
  72. odoo/addons/l10n_br_fiscal/views/cest_view.xml +2 -2
  73. odoo/addons/l10n_br_fiscal/views/cfop_view.xml +2 -2
  74. odoo/addons/l10n_br_fiscal/views/city_taxation_code.xml +2 -2
  75. odoo/addons/l10n_br_fiscal/views/cnae_view.xml +2 -2
  76. odoo/addons/l10n_br_fiscal/views/comment_view.xml +2 -2
  77. odoo/addons/l10n_br_fiscal/views/cst_view.xml +2 -2
  78. odoo/addons/l10n_br_fiscal/views/document_line_mixin_view.xml +1 -1
  79. odoo/addons/l10n_br_fiscal/views/document_line_view.xml +6 -4
  80. odoo/addons/l10n_br_fiscal/views/document_related_view.xml +2 -2
  81. odoo/addons/l10n_br_fiscal/views/document_serie_view.xml +2 -2
  82. odoo/addons/l10n_br_fiscal/views/document_type_view.xml +2 -2
  83. odoo/addons/l10n_br_fiscal/views/document_view.xml +29 -29
  84. odoo/addons/l10n_br_fiscal/views/icms_regulation_view.xml +2 -2
  85. odoo/addons/l10n_br_fiscal/views/icms_relief_view.xml +2 -2
  86. odoo/addons/l10n_br_fiscal/views/invalidate_number_view.xml +2 -2
  87. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_action.xml +36 -36
  88. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_menu.xml +0 -9
  89. odoo/addons/l10n_br_fiscal/views/legal_nature_view.xml +2 -2
  90. odoo/addons/l10n_br_fiscal/views/nbm_view.xml +5 -5
  91. odoo/addons/l10n_br_fiscal/views/nbs_view.xml +5 -5
  92. odoo/addons/l10n_br_fiscal/views/ncm_view.xml +5 -5
  93. odoo/addons/l10n_br_fiscal/views/operation_dashboard_view.xml +7 -8
  94. odoo/addons/l10n_br_fiscal/views/operation_line_view.xml +2 -2
  95. odoo/addons/l10n_br_fiscal/views/operation_view.xml +4 -4
  96. odoo/addons/l10n_br_fiscal/views/partner_profile_view.xml +2 -2
  97. odoo/addons/l10n_br_fiscal/views/product_genre_view.xml +2 -2
  98. odoo/addons/l10n_br_fiscal/views/product_product_view.xml +38 -11
  99. odoo/addons/l10n_br_fiscal/views/product_template_view.xml +22 -9
  100. odoo/addons/l10n_br_fiscal/views/res_config_settings_view.xml +8 -8
  101. odoo/addons/l10n_br_fiscal/views/res_partner_view.xml +9 -0
  102. odoo/addons/l10n_br_fiscal/views/service_type_view.xml +5 -5
  103. odoo/addons/l10n_br_fiscal/views/simplified_tax_range_view.xml +2 -2
  104. odoo/addons/l10n_br_fiscal/views/simplified_tax_view.xml +4 -4
  105. odoo/addons/l10n_br_fiscal/views/tax_definition_view.xml +4 -4
  106. odoo/addons/l10n_br_fiscal/views/tax_estimate_view.xml +2 -2
  107. odoo/addons/l10n_br_fiscal/views/tax_group_view.xml +2 -2
  108. odoo/addons/l10n_br_fiscal/views/tax_ipi_control_seal_view.xml +2 -2
  109. odoo/addons/l10n_br_fiscal/views/tax_ipi_guideline_class_view.xml +2 -2
  110. odoo/addons/l10n_br_fiscal/views/tax_ipi_guideline_view.xml +2 -2
  111. odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_base_view.xml +2 -2
  112. odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_credit_view.xml +2 -2
  113. odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_view.xml +2 -2
  114. odoo/addons/l10n_br_fiscal/views/tax_view.xml +2 -2
  115. odoo/addons/l10n_br_fiscal/views/uom_uom.xml +2 -2
  116. odoo/addons/l10n_br_fiscal/wizards/base_wizard_mixin.py +1 -1
  117. {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
  118. {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
  119. {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
  120. {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)
@@ -195,6 +195,6 @@ class Cfop(models.Model):
195
195
  (
196
196
  "fiscal_cfop_code_uniq",
197
197
  "unique (code)",
198
- "CFOP already exists with this code !",
198
+ "CFOP already exists with this code!",
199
199
  )
200
200
  ]
@@ -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 _, fields, models
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
- _("CNAE already exists with this code !"),
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, tools
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 _name_search(self, name, domain=None, operator="ilike", limit=None, order=None):
66
- if name:
67
- domain = expression.AND(
68
- [
69
- domain or [],
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, currency.round(amount), grouping=True, monetary=True)
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(tools.ustr(record.comment))
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 _, fields, models
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
- _("CST already exists with this code !"),
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 `name_get`
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 _name_search(self, name, domain=None, operator="ilike", limit=None, order=None):
91
+ def _search_display_name(self, operator, value):
92
+ name = value or ""
93
93
  if operator == "ilike" and not (name or "").strip():
94
- domain = []
94
+ return []
95
95
  elif operator in ("ilike", "like", "=", "=like", "=ilike"):
96
- domain = expression.AND(
97
- [
98
- domain or [],
99
- [
100
- "|",
101
- "|",
102
- ("name", operator, name),
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
- related="document_id.partner_id",
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
- quantity = fields.Float(default=1.0)
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
- ind_final = fields.Selection(related="document_id.ind_final")
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
+ )