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.

Files changed (78) hide show
  1. odoo/addons/l10n_br_fiscal/README.rst +1 -1
  2. odoo/addons/l10n_br_fiscal/__manifest__.py +7 -3
  3. odoo/addons/l10n_br_fiscal/constants/fiscal.py +64 -18
  4. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.cest.csv +1043 -983
  5. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.cst.csv +58 -0
  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.operation.indicator.csv +27 -0
  8. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.classification.csv +163 -0
  9. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.csv +31 -0
  10. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.group.csv +3 -0
  11. odoo/addons/l10n_br_fiscal/data/operation_data.xml +1 -1
  12. odoo/addons/l10n_br_fiscal/demo/fiscal_document_demo.xml +3 -179
  13. odoo/addons/l10n_br_fiscal/demo/fiscal_document_nfse_demo.xml +0 -4
  14. odoo/addons/l10n_br_fiscal/demo/fiscal_operation_demo.xml +2 -2
  15. odoo/addons/l10n_br_fiscal/i18n/l10n_br_fiscal.pot +665 -79
  16. odoo/addons/l10n_br_fiscal/i18n/pt_BR.po +713 -102
  17. odoo/addons/l10n_br_fiscal/migrations/18.0.3.0.0/pre-migration.py +30 -0
  18. odoo/addons/l10n_br_fiscal/models/__init__.py +2 -2
  19. odoo/addons/l10n_br_fiscal/models/comment.py +3 -1
  20. odoo/addons/l10n_br_fiscal/models/data_abstract.py +9 -6
  21. odoo/addons/l10n_br_fiscal/models/document.py +27 -8
  22. odoo/addons/l10n_br_fiscal/models/document_line.py +51 -8
  23. odoo/addons/l10n_br_fiscal/models/document_line_mixin.py +1107 -35
  24. odoo/addons/l10n_br_fiscal/models/document_mixin.py +244 -6
  25. odoo/addons/l10n_br_fiscal/models/document_related.py +1 -1
  26. odoo/addons/l10n_br_fiscal/models/document_serie.py +33 -0
  27. odoo/addons/l10n_br_fiscal/models/icms_regulation.py +1 -1
  28. odoo/addons/l10n_br_fiscal/models/operation_dashboard.py +3 -2
  29. odoo/addons/l10n_br_fiscal/models/operation_indicator.py +58 -0
  30. odoo/addons/l10n_br_fiscal/models/operation_line.py +28 -0
  31. odoo/addons/l10n_br_fiscal/models/partner_profile.py +6 -0
  32. odoo/addons/l10n_br_fiscal/models/product_template.py +4 -0
  33. odoo/addons/l10n_br_fiscal/models/res_company.py +17 -0
  34. odoo/addons/l10n_br_fiscal/models/res_partner.py +17 -0
  35. odoo/addons/l10n_br_fiscal/models/simplified_tax_range.py +8 -0
  36. odoo/addons/l10n_br_fiscal/models/tax.py +7 -3
  37. odoo/addons/l10n_br_fiscal/models/tax_classification.py +81 -0
  38. odoo/addons/l10n_br_fiscal/security/fiscal_security.xml +6 -16
  39. odoo/addons/l10n_br_fiscal/security/ir.model.access.csv +7 -2
  40. odoo/addons/l10n_br_fiscal/static/description/index.html +1 -1
  41. odoo/addons/l10n_br_fiscal/tests/__init__.py +2 -0
  42. odoo/addons/l10n_br_fiscal/tests/test_document_edition.py +175 -10
  43. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_generic.py +13 -42
  44. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_nfse.py +0 -5
  45. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_serie.py +60 -0
  46. odoo/addons/l10n_br_fiscal/tests/test_tax_benefit.py +2 -5
  47. odoo/addons/l10n_br_fiscal/tests/test_tax_classification.py +110 -0
  48. odoo/addons/l10n_br_fiscal/views/document_line_mixin_view.xml +107 -4
  49. odoo/addons/l10n_br_fiscal/views/document_line_view.xml +7 -3
  50. odoo/addons/l10n_br_fiscal/views/document_view.xml +34 -15
  51. odoo/addons/l10n_br_fiscal/views/icms_regulation_view.xml +1 -5
  52. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_action.xml +30 -0
  53. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_menu.xml +16 -9
  54. odoo/addons/l10n_br_fiscal/views/nbs_view.xml +1 -5
  55. odoo/addons/l10n_br_fiscal/views/ncm_view.xml +1 -5
  56. odoo/addons/l10n_br_fiscal/views/operation_dashboard_view.xml +3 -3
  57. odoo/addons/l10n_br_fiscal/views/operation_indicator_view.xml +75 -0
  58. odoo/addons/l10n_br_fiscal/views/operation_line_view.xml +4 -5
  59. odoo/addons/l10n_br_fiscal/views/operation_view.xml +1 -5
  60. odoo/addons/l10n_br_fiscal/views/product_product_view.xml +33 -6
  61. odoo/addons/l10n_br_fiscal/views/product_template_view.xml +22 -4
  62. odoo/addons/l10n_br_fiscal/views/res_company_view.xml +6 -0
  63. odoo/addons/l10n_br_fiscal/views/res_partner_view.xml +10 -0
  64. odoo/addons/l10n_br_fiscal/views/service_type_view.xml +1 -5
  65. odoo/addons/l10n_br_fiscal/views/tax_classification.xml +108 -0
  66. odoo/addons/l10n_br_fiscal/views/tax_definition_view.xml +1 -5
  67. odoo/addons/l10n_br_fiscal/views/tax_view.xml +2 -2
  68. odoo/addons/l10n_br_fiscal/wizards/__init__.py +1 -1
  69. odoo/addons/l10n_br_fiscal/wizards/base_wizard_mixin.py +1 -1
  70. odoo/addons/l10n_br_fiscal/wizards/document_import_wizard.py +234 -0
  71. odoo/addons/l10n_br_fiscal/wizards/{document_import_wizard_mixin.xml → document_import_wizard.xml} +26 -7
  72. {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
  73. {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
  74. odoo/addons/l10n_br_fiscal/models/document_line_mixin_methods.py +0 -837
  75. odoo/addons/l10n_br_fiscal/models/document_mixin_methods.py +0 -349
  76. odoo/addons/l10n_br_fiscal/wizards/document_import_wizard_mixin.py +0 -129
  77. {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
  78. {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, currency.round(amount), grouping=True, monetary=True)
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 truncate_name(name):
107
- if len(name) > 60:
108
- name = f"{name[:60]}..."
109
- return name
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 = record.code
116
+ record.display_name = code
114
117
  else:
115
- record.display_name = f"{record.code} - {truncate_name(record.name)}"
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
- 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
@@ -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 d in self:
84
- d.additional_data = d.comment_ids.compute_message(
85
- d.__document_comment_vals(), d.manual_additional_data
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
  )