odoo-addon-l10n-br-fiscal 16.0.2.17.0__py3-none-any.whl → 16.0.19.4.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.
Files changed (162) hide show
  1. odoo/addons/l10n_br_fiscal/README.rst +11 -4
  2. odoo/addons/l10n_br_fiscal/__manifest__.py +20 -12
  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.cfop.csv +620 -620
  6. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.cst.csv +58 -0
  7. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.document.type.csv +1 -0
  8. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.legal.nature.csv +82 -0
  9. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.nbs.csv +791 -764
  10. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.operation.indicator.csv +27 -0
  11. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.partner.profile.csv +11 -0
  12. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.classification.csv +163 -0
  13. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.csv +32 -0
  14. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.group.csv +3 -0
  15. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_icms_tax_definition_data.xml +340 -352
  16. odoo/addons/l10n_br_fiscal/data/operation_data.xml +1 -1
  17. odoo/addons/l10n_br_fiscal/data/simplified_tax_data.xml +5 -5
  18. odoo/addons/l10n_br_fiscal/data/uom.alias.csv +25 -0
  19. odoo/addons/l10n_br_fiscal/data/uom_data.xml +104 -33
  20. odoo/addons/l10n_br_fiscal/demo/__init__.py +21 -15
  21. odoo/addons/l10n_br_fiscal/demo/company_demo.xml +6 -0
  22. odoo/addons/l10n_br_fiscal/demo/fiscal_document_demo.xml +3 -377
  23. odoo/addons/l10n_br_fiscal/demo/fiscal_document_nfse_demo.xml +0 -12
  24. odoo/addons/l10n_br_fiscal/demo/fiscal_operation_demo.xml +2 -2
  25. odoo/addons/l10n_br_fiscal/demo/icms_tax_definition_demo.xml +5 -2
  26. odoo/addons/l10n_br_fiscal/demo/res_users_demo.xml +2 -2
  27. odoo/addons/l10n_br_fiscal/i18n/l10n_br_fiscal.pot +1161 -804
  28. odoo/addons/l10n_br_fiscal/i18n/pt_BR.po +22 -22
  29. odoo/addons/l10n_br_fiscal/migrations/16.0.13.0.0/pre-migration.py +25 -0
  30. odoo/addons/l10n_br_fiscal/migrations/16.0.14.0.0/pre-migration.py +30 -0
  31. odoo/addons/l10n_br_fiscal/migrations/16.0.14.0.5/pre-migration.py +15 -0
  32. odoo/addons/l10n_br_fiscal/migrations/16.0.4.0.0/pre-migration.py +220 -0
  33. odoo/addons/l10n_br_fiscal/migrations/16.0.5.0.0/pre-migration.py +33 -0
  34. odoo/addons/l10n_br_fiscal/migrations/16.0.5.2.0/pre-migration.py +21 -0
  35. odoo/addons/l10n_br_fiscal/models/__init__.py +3 -8
  36. odoo/addons/l10n_br_fiscal/models/cest.py +0 -8
  37. odoo/addons/l10n_br_fiscal/models/cfop.py +91 -0
  38. odoo/addons/l10n_br_fiscal/models/city_taxation_code.py +1 -3
  39. odoo/addons/l10n_br_fiscal/models/comment.py +2 -2
  40. odoo/addons/l10n_br_fiscal/models/cst.py +0 -1
  41. odoo/addons/l10n_br_fiscal/models/data_abstract.py +26 -0
  42. odoo/addons/l10n_br_fiscal/models/data_ncm_nbs_abstract.py +1 -1
  43. odoo/addons/l10n_br_fiscal/models/document.py +131 -222
  44. odoo/addons/l10n_br_fiscal/models/document_line.py +82 -5
  45. odoo/addons/l10n_br_fiscal/models/document_line_mixin.py +1952 -138
  46. odoo/addons/l10n_br_fiscal/models/document_mixin.py +741 -6
  47. odoo/addons/l10n_br_fiscal/models/document_related.py +12 -9
  48. odoo/addons/l10n_br_fiscal/models/document_serie.py +33 -0
  49. odoo/addons/l10n_br_fiscal/models/document_type.py +0 -6
  50. odoo/addons/l10n_br_fiscal/models/ibpt.py +1 -1
  51. odoo/addons/l10n_br_fiscal/models/icms_regulation.py +2 -2
  52. odoo/addons/l10n_br_fiscal/models/invalidate_number.py +4 -5
  53. odoo/addons/l10n_br_fiscal/models/legal_nature.py +20 -0
  54. odoo/addons/l10n_br_fiscal/models/nbm.py +0 -8
  55. odoo/addons/l10n_br_fiscal/models/ncm.py +0 -12
  56. odoo/addons/l10n_br_fiscal/models/operation.py +49 -15
  57. odoo/addons/l10n_br_fiscal/models/operation_dashboard.py +3 -2
  58. odoo/addons/l10n_br_fiscal/models/operation_indicator.py +58 -0
  59. odoo/addons/l10n_br_fiscal/models/operation_line.py +75 -6
  60. odoo/addons/l10n_br_fiscal/models/partner_profile.py +6 -0
  61. odoo/addons/l10n_br_fiscal/models/product_mixin.py +24 -21
  62. odoo/addons/l10n_br_fiscal/models/product_template.py +23 -13
  63. odoo/addons/l10n_br_fiscal/models/res_company.py +31 -9
  64. odoo/addons/l10n_br_fiscal/models/res_partner.py +38 -6
  65. odoo/addons/l10n_br_fiscal/models/simplified_tax.py +0 -3
  66. odoo/addons/l10n_br_fiscal/models/simplified_tax_range.py +8 -0
  67. odoo/addons/l10n_br_fiscal/models/tax.py +144 -55
  68. odoo/addons/l10n_br_fiscal/models/tax_classification.py +81 -0
  69. odoo/addons/l10n_br_fiscal/models/tax_definition.py +72 -23
  70. odoo/addons/l10n_br_fiscal/models/tax_pis_cofins.py +0 -3
  71. odoo/addons/l10n_br_fiscal/models/tax_pis_cofins_base.py +1 -1
  72. odoo/addons/l10n_br_fiscal/models/tax_pis_cofins_credit.py +1 -1
  73. odoo/addons/l10n_br_fiscal/models/uom_uom.py +15 -30
  74. odoo/addons/l10n_br_fiscal/security/fiscal_security.xml +11 -27
  75. odoo/addons/l10n_br_fiscal/security/ir.model.access.csv +11 -10
  76. odoo/addons/l10n_br_fiscal/static/description/index.html +27 -21
  77. odoo/addons/l10n_br_fiscal/static/src/js/list_renderer_with_button.esm.js +38 -0
  78. odoo/addons/l10n_br_fiscal/tests/__init__.py +3 -2
  79. odoo/addons/l10n_br_fiscal/tests/test_document_edition.py +308 -0
  80. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_generic.py +23 -129
  81. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_nfse.py +5 -15
  82. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_serie.py +60 -0
  83. odoo/addons/l10n_br_fiscal/tests/test_ibpt.py +4 -3
  84. odoo/addons/l10n_br_fiscal/tests/test_icms_regulation.py +2 -2
  85. odoo/addons/l10n_br_fiscal/tests/test_ncm.py +4 -1
  86. odoo/addons/l10n_br_fiscal/tests/test_tax_benefit.py +17 -22
  87. odoo/addons/l10n_br_fiscal/tests/test_tax_classification.py +110 -0
  88. odoo/addons/l10n_br_fiscal/tools.py +1 -1
  89. odoo/addons/l10n_br_fiscal/views/cest_view.xml +2 -4
  90. odoo/addons/l10n_br_fiscal/views/cfop_view.xml +25 -5
  91. odoo/addons/l10n_br_fiscal/views/city_taxation_code.xml +1 -4
  92. odoo/addons/l10n_br_fiscal/views/cnae_view.xml +2 -4
  93. odoo/addons/l10n_br_fiscal/views/comment_view.xml +2 -4
  94. odoo/addons/l10n_br_fiscal/views/cst_view.xml +6 -8
  95. odoo/addons/l10n_br_fiscal/views/{document_fiscal_line_mixin_view.xml → document_line_mixin_view.xml} +525 -385
  96. odoo/addons/l10n_br_fiscal/views/document_line_view.xml +101 -82
  97. odoo/addons/l10n_br_fiscal/views/document_related_view.xml +44 -46
  98. odoo/addons/l10n_br_fiscal/views/document_serie_view.xml +2 -6
  99. odoo/addons/l10n_br_fiscal/views/document_type_view.xml +0 -8
  100. odoo/addons/l10n_br_fiscal/views/document_view.xml +303 -370
  101. odoo/addons/l10n_br_fiscal/views/icms_regulation_view.xml +14 -16
  102. odoo/addons/l10n_br_fiscal/views/icms_relief_view.xml +8 -10
  103. odoo/addons/l10n_br_fiscal/views/invalidate_number_view.xml +46 -48
  104. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_action.xml +166 -280
  105. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_menu.xml +25 -99
  106. odoo/addons/l10n_br_fiscal/views/legal_nature_view.xml +40 -0
  107. odoo/addons/l10n_br_fiscal/views/nbm_view.xml +5 -6
  108. odoo/addons/l10n_br_fiscal/views/nbs_view.xml +5 -6
  109. odoo/addons/l10n_br_fiscal/views/ncm_view.xml +12 -15
  110. odoo/addons/l10n_br_fiscal/views/operation_dashboard_view.xml +13 -12
  111. odoo/addons/l10n_br_fiscal/views/operation_indicator_view.xml +75 -0
  112. odoo/addons/l10n_br_fiscal/views/operation_line_view.xml +22 -21
  113. odoo/addons/l10n_br_fiscal/views/operation_view.xml +4 -19
  114. odoo/addons/l10n_br_fiscal/views/partner_profile_view.xml +3 -6
  115. odoo/addons/l10n_br_fiscal/views/product_genre_view.xml +7 -9
  116. odoo/addons/l10n_br_fiscal/views/product_product_view.xml +37 -14
  117. odoo/addons/l10n_br_fiscal/views/product_template_view.xml +34 -14
  118. odoo/addons/l10n_br_fiscal/views/res_company_view.xml +55 -52
  119. odoo/addons/l10n_br_fiscal/views/res_config_settings_view.xml +23 -28
  120. odoo/addons/l10n_br_fiscal/views/res_partner_view.xml +22 -2
  121. odoo/addons/l10n_br_fiscal/views/service_type_view.xml +7 -8
  122. odoo/addons/l10n_br_fiscal/views/simplified_tax_range_view.xml +0 -2
  123. odoo/addons/l10n_br_fiscal/views/simplified_tax_view.xml +0 -2
  124. odoo/addons/l10n_br_fiscal/views/tax_classification.xml +110 -0
  125. odoo/addons/l10n_br_fiscal/views/tax_definition_view.xml +157 -129
  126. odoo/addons/l10n_br_fiscal/views/tax_estimate_view.xml +0 -2
  127. odoo/addons/l10n_br_fiscal/views/tax_group_view.xml +3 -6
  128. odoo/addons/l10n_br_fiscal/views/tax_ipi_control_seal_view.xml +0 -2
  129. odoo/addons/l10n_br_fiscal/views/tax_ipi_guideline_class_view.xml +0 -2
  130. odoo/addons/l10n_br_fiscal/views/tax_ipi_guideline_view.xml +2 -4
  131. odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_base_view.xml +2 -4
  132. odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_credit_view.xml +2 -4
  133. odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_view.xml +5 -7
  134. odoo/addons/l10n_br_fiscal/views/tax_view.xml +5 -7
  135. odoo/addons/l10n_br_fiscal/views/uom_uom.xml +24 -17
  136. odoo/addons/l10n_br_fiscal/wizards/__init__.py +1 -0
  137. odoo/addons/l10n_br_fiscal/wizards/base_wizard_mixin.py +1 -1
  138. odoo/addons/l10n_br_fiscal/wizards/document_import_wizard_mixin.py +129 -0
  139. odoo/addons/l10n_br_fiscal/wizards/document_import_wizard_mixin.xml +41 -0
  140. {odoo_addon_l10n_br_fiscal-16.0.2.17.0.dist-info → odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info}/METADATA +15 -6
  141. odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info/RECORD +210 -0
  142. {odoo_addon_l10n_br_fiscal-16.0.2.17.0.dist-info → odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info}/WHEEL +1 -1
  143. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal_email_template.xml +0 -68
  144. odoo/addons/l10n_br_fiscal/data/partner_profile_data.xml +0 -96
  145. odoo/addons/l10n_br_fiscal/data/uom_alternative_data.xml +0 -58
  146. odoo/addons/l10n_br_fiscal/demo/l10n_br_fiscal_document_email.xml +0 -54
  147. odoo/addons/l10n_br_fiscal/demo/subsequent_operation_demo.xml +0 -10
  148. odoo/addons/l10n_br_fiscal/models/document_email.py +0 -74
  149. odoo/addons/l10n_br_fiscal/models/document_line_mixin_methods.py +0 -913
  150. odoo/addons/l10n_br_fiscal/models/document_mixin_fields.py +0 -473
  151. odoo/addons/l10n_br_fiscal/models/document_mixin_methods.py +0 -269
  152. odoo/addons/l10n_br_fiscal/models/document_move_mixin.py +0 -261
  153. odoo/addons/l10n_br_fiscal/models/subsequent_document.py +0 -203
  154. odoo/addons/l10n_br_fiscal/models/subsequent_operation.py +0 -54
  155. odoo/addons/l10n_br_fiscal/models/uom_uom_alternative.py +0 -22
  156. odoo/addons/l10n_br_fiscal/tests/test_subsequent_operation.py +0 -71
  157. odoo/addons/l10n_br_fiscal/tests/test_uom_uom.py +0 -22
  158. odoo/addons/l10n_br_fiscal/views/document_email_view.xml +0 -48
  159. odoo/addons/l10n_br_fiscal/views/subsequent_document_view.xml +0 -43
  160. odoo/addons/l10n_br_fiscal/views/subsequent_operation_view.xml +0 -21
  161. odoo_addon_l10n_br_fiscal-16.0.2.17.0.dist-info/RECORD +0 -205
  162. {odoo_addon_l10n_br_fiscal-16.0.2.17.0.dist-info → odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,60 @@
1
+ # Copyright (C) 2025 Renato Lima - Akretion <renato.lima@akretion.com.br>
2
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3
+
4
+ from psycopg2 import IntegrityError
5
+
6
+ from odoo.exceptions import ValidationError
7
+ from odoo.tests import TransactionCase
8
+ from odoo.tools import mute_logger
9
+
10
+
11
+ class TestFiscalDocumentSerie(TransactionCase):
12
+ @classmethod
13
+ def setUpClass(cls):
14
+ super().setUpClass()
15
+ cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
16
+
17
+ # Company
18
+ cls.company_sn = cls.env.ref("l10n_br_base.empresa_simples_nacional")
19
+
20
+ # Fiscal Document Type
21
+ cls.document_type_nfe = cls.env.ref("l10n_br_fiscal.document_55")
22
+
23
+ cls.document_serie_nfe_5 = cls.env["l10n_br_fiscal.document.serie"].create(
24
+ {
25
+ "code": "5",
26
+ "name": "Serie 5",
27
+ "document_type_id": cls.document_type_nfe.id,
28
+ "company_id": cls.company_sn.id,
29
+ }
30
+ )
31
+
32
+ # Fiscal Document
33
+ cls.document = cls.env["l10n_br_fiscal.document"].create(
34
+ {
35
+ "company_id": cls.company_sn.id,
36
+ "document_type_id": cls.document_type_nfe.id,
37
+ "document_serie_id": cls.document_serie_nfe_5.id,
38
+ "partner_id": cls.env.ref("l10n_br_base.res_partner_cliente1_sp").id,
39
+ "state_edoc": "cancelada",
40
+ }
41
+ )
42
+
43
+ def test_document_serie_duplicated(self):
44
+ """Test document serie duplicate constraint."""
45
+ document_serie = self.env["l10n_br_fiscal.document.serie"]
46
+ document_serie_values = {
47
+ "code": "10",
48
+ "name": "Serie 10",
49
+ "document_type_id": self.document_type_nfe.id,
50
+ "company_id": self.company_sn.id,
51
+ }
52
+
53
+ with self.assertRaises(IntegrityError), mute_logger("odoo.sql_db"):
54
+ for _ in range(2):
55
+ document_serie.create(document_serie_values)
56
+
57
+ def test_document_serie_code_in_use(self):
58
+ """Test document serie code in use constraint."""
59
+ with self.assertRaises(ValidationError):
60
+ self.document_serie_nfe_5.write({"code": "7"})
@@ -8,6 +8,7 @@ from os import environ
8
8
  from decorator import decorate
9
9
  from erpbrasil.base import misc
10
10
 
11
+ from odoo import Command
11
12
  from odoo.tests import TransactionCase
12
13
  from odoo.tools import config as odooconfig
13
14
 
@@ -95,7 +96,7 @@ class TestIbpt(TransactionCase):
95
96
  """Add a company to the user's allowed & set to current."""
96
97
  user.write(
97
98
  {
98
- "company_ids": [(6, 0, (company + user.company_ids).ids)],
99
+ "company_ids": [Command.set((company + user.company_ids).ids)],
99
100
  "company_id": company.id,
100
101
  }
101
102
  )
@@ -107,7 +108,7 @@ class TestIbpt(TransactionCase):
107
108
  try:
108
109
  config = DeOlhoNoImposto(
109
110
  company.ibpt_token,
110
- misc.punctuation_rm(company.cnpj_cpf),
111
+ misc.punctuation_rm(company.vat),
111
112
  company.state_id.code,
112
113
  odooconfig.get("ibpt_request_timeout")
113
114
  or cls.env["ir.config_parameter"]
@@ -130,7 +131,7 @@ class TestIbpt(TransactionCase):
130
131
  company = cls.env["res.company"].create(
131
132
  {
132
133
  "name": "Company Test Fiscal BR",
133
- "cnpj_cpf": "02.960.895/0002-12",
134
+ "vat": "02.960.895/0002-12",
134
135
  "country_id": cls.env.ref("base.br").id,
135
136
  "state_id": cls.env.ref("base.state_br_es").id,
136
137
  "ibpt_api": True,
@@ -61,8 +61,8 @@ class TestICMSRegulation(TransactionCase):
61
61
 
62
62
  def find_icms_tax(self, in_state_id, out_state_id, ncm_id, ind_final):
63
63
  self.partner.state_id = in_state_id
64
- self.company.partner_id.inscr_est = False
65
- self.company.inscr_est = False
64
+ self.company.partner_id.l10n_br_ie_code = False
65
+ self.company.l10n_br_ie_code = False
66
66
  self.company.state_id = out_state_id
67
67
  self.product.ncm_id = ncm_id
68
68
 
@@ -2,6 +2,7 @@
2
2
  # Felipe Motter Pereira <felipe@engenere.one>
3
3
  # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
4
4
 
5
+ from odoo import Command
5
6
  from odoo.exceptions import AccessError
6
7
  from odoo.tests import TransactionCase
7
8
 
@@ -16,7 +17,9 @@ class TestNcm(TransactionCase):
16
17
  {
17
18
  "name": "Test User Manager",
18
19
  "login": "test_user_manager",
19
- "groups_id": [(6, 0, [cls.env.ref("l10n_br_fiscal.group_manager").id])],
20
+ "groups_id": [
21
+ Command.set([cls.env.ref("l10n_br_fiscal.group_manager").id])
22
+ ],
20
23
  }
21
24
  )
22
25
 
@@ -1,19 +1,21 @@
1
1
  # Copyright 2023 Akretion - Renato Lima <renato.lima@akretion.com.br>
2
2
  # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3
3
 
4
+ from odoo import Command
4
5
  from odoo.tests import TransactionCase
5
6
 
6
7
 
7
8
  class TestTaxBenefit(TransactionCase):
8
- def setUp(self):
9
- super().setUp()
10
- self.nfe_tax_benefit = self.env.ref("l10n_br_fiscal.demo_nfe_tax_benefit")
11
- self.tax_benefit = self.env["l10n_br_fiscal.tax.definition"].create(
9
+ @classmethod
10
+ def setUpClass(cls):
11
+ super().setUpClass()
12
+ cls.nfe_tax_benefit = cls.env.ref("l10n_br_fiscal.demo_nfe_tax_benefit")
13
+ cls.tax_benefit = cls.env["l10n_br_fiscal.tax.definition"].create(
12
14
  {
13
- "icms_regulation_id": self.env.ref(
15
+ "icms_regulation_id": cls.env.ref(
14
16
  "l10n_br_fiscal.tax_icms_regulation"
15
17
  ).id,
16
- "tax_group_id": self.env.ref("l10n_br_fiscal.tax_group_icms").id,
18
+ "tax_group_id": cls.env.ref("l10n_br_fiscal.tax_group_icms").id,
17
19
  "code": "SP810001",
18
20
  "name": "TAX BENEFIT DEMO",
19
21
  "description": "TAX BENEFIT DEMO",
@@ -22,30 +24,23 @@ class TestTaxBenefit(TransactionCase):
22
24
  "is_taxed": True,
23
25
  "is_debit_credit": True,
24
26
  "custom_tax": True,
25
- "tax_id": self.env.ref("l10n_br_fiscal.tax_icms_12_red_26_57").id,
26
- "cst_id": self.env.ref("l10n_br_fiscal.cst_icms_20").id,
27
- "state_from_id": self.env.ref("base.state_br_sp").id,
28
- "state_to_ids": [(6, 0, self.env.ref("base.state_br_mg").ids)],
27
+ "tax_id": cls.env.ref("l10n_br_fiscal.tax_icms_12_red_26_57").id,
28
+ "cst_id": cls.env.ref("l10n_br_fiscal.cst_icms_20").id,
29
+ "state_from_id": cls.env.ref("base.state_br_sp").id,
30
+ "state_to_ids": [Command.set(cls.env.ref("base.state_br_mg").ids)],
29
31
  "ncms": "73269090",
30
- "ncm_ids": [(6, 0, self.env.ref("l10n_br_fiscal.ncm_73269090").ids)],
32
+ "ncm_ids": [
33
+ Command.set(cls.env.ref("l10n_br_fiscal.ncm_73269090").ids)
34
+ ],
31
35
  "state": "approved",
32
36
  }
33
37
  )
38
+ # force update
39
+ cls.nfe_tax_benefit.fiscal_line_ids._compute_fiscal_tax_ids()
34
40
 
35
41
  def test_nfe_tax_benefit(self):
36
42
  """Test NFe with tax benefit."""
37
-
38
- self.nfe_tax_benefit._onchange_document_serie_id()
39
- self.nfe_tax_benefit._onchange_fiscal_operation_id()
40
-
41
43
  for line in self.nfe_tax_benefit.fiscal_line_ids:
42
- line._onchange_product_id_fiscal()
43
- line._onchange_commercial_quantity()
44
- line._onchange_ncm_id()
45
- line._onchange_fiscal_operation_id()
46
- line._onchange_fiscal_operation_line_id()
47
- line._onchange_fiscal_taxes()
48
-
49
44
  self.assertEqual(
50
45
  line.icms_tax_benefit_id,
51
46
  self.tax_benefit,
@@ -0,0 +1,110 @@
1
+ from odoo.tests import TransactionCase
2
+ from odoo.tests.common import Form, tagged
3
+
4
+
5
+ @tagged("post_install", "-at_install")
6
+ class TestTaxClassification(TransactionCase):
7
+ @classmethod
8
+ def setUpClass(cls):
9
+ super().setUpClass()
10
+ cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
11
+
12
+ cls.company = cls.env.ref("l10n_br_base.empresa_lucro_presumido")
13
+ cls.partner = cls.env.ref("l10n_br_base.res_partner_cliente1_sp")
14
+ cls.product = cls.env.ref("product.product_product_6")
15
+
16
+ # Use a stable operation line already referenced in existing test suites.
17
+ cls.operation_line = cls.env.ref("l10n_br_fiscal.fo_venda_venda")
18
+
19
+ # Pick classifications with CBS/IBS taxes set in the provided CSV.
20
+ cls.classification_company = cls.env.ref(
21
+ "l10n_br_fiscal.tax_classification_000001"
22
+ )
23
+ cls.classification_line = cls.env.ref(
24
+ "l10n_br_fiscal.tax_classification_200001"
25
+ )
26
+
27
+ def _map_kwargs(self):
28
+ return {
29
+ "company": self.company,
30
+ "partner": self.partner,
31
+ "product": self.product,
32
+ "ncm": self.product.ncm_id,
33
+ "nbm": self.env["l10n_br_fiscal.nbm"],
34
+ "nbs": self.env["l10n_br_fiscal.nbs"],
35
+ "cest": self.env["l10n_br_fiscal.cest"],
36
+ "city_taxation_code": self.env["l10n_br_fiscal.city.taxation.code"],
37
+ "service_type": self.env["l10n_br_fiscal.service.type"],
38
+ "ind_final": "1",
39
+ }
40
+
41
+ def test_map_fiscal_taxes_tax_classification_from_company(self):
42
+ """Operation line must fallback to company tax classification when empty."""
43
+ self.company.tax_classification_id = self.classification_company
44
+ self.operation_line.tax_classification_id = False
45
+
46
+ result = self.operation_line.map_fiscal_taxes(**self._map_kwargs())
47
+
48
+ self.assertEqual(result["tax_classification"], self.classification_company)
49
+ self.assertEqual(
50
+ result["taxes"][self.classification_company.tax_cbs_id.tax_domain],
51
+ self.classification_company.tax_cbs_id,
52
+ )
53
+ self.assertEqual(
54
+ result["taxes"][self.classification_company.tax_ibs_id.tax_domain],
55
+ self.classification_company.tax_ibs_id,
56
+ )
57
+
58
+ def test_map_fiscal_taxes_tax_classification_from_operation_line(self):
59
+ """Operation line tax classification must override company default."""
60
+ self.company.tax_classification_id = self.classification_company
61
+ self.operation_line.tax_classification_id = self.classification_line
62
+
63
+ result = self.operation_line.map_fiscal_taxes(**self._map_kwargs())
64
+
65
+ self.assertEqual(result["tax_classification"], self.classification_line)
66
+ self.assertEqual(
67
+ result["taxes"][self.classification_line.tax_cbs_id.tax_domain],
68
+ self.classification_line.tax_cbs_id,
69
+ )
70
+ self.assertEqual(
71
+ result["taxes"][self.classification_line.tax_ibs_id.tax_domain],
72
+ self.classification_line.tax_ibs_id,
73
+ )
74
+
75
+ def test_document_line_receives_cbs_ibs_from_tax_classification(self):
76
+ """Fiscal document line must receive tax classification and CBS/IBS taxes."""
77
+ self.company.tax_classification_id = self.classification_company
78
+ self.operation_line.tax_classification_id = False
79
+
80
+ doc_form = Form(
81
+ self.env["l10n_br_fiscal.document"].with_context(
82
+ default_fiscal_operation_type="out",
83
+ )
84
+ )
85
+ doc_form.company_id = self.company
86
+ doc_form.partner_id = self.partner
87
+ doc_form.fiscal_operation_id = self.env.ref("l10n_br_fiscal.fo_venda")
88
+ doc_form.ind_final = "1"
89
+
90
+ with doc_form.fiscal_line_ids.new() as line_form:
91
+ line_form.product_id = self.product
92
+ # Ensure we map on a predictable operation line for this assertion.
93
+ line_form.fiscal_operation_line_id = self.operation_line
94
+
95
+ self.assertEqual(
96
+ line_form.tax_classification_id, self.classification_company
97
+ )
98
+ self.assertEqual(
99
+ line_form.cbs_tax_id, self.classification_company.tax_cbs_id
100
+ )
101
+ self.assertEqual(
102
+ line_form.ibs_tax_id, self.classification_company.tax_ibs_id
103
+ )
104
+
105
+ self.assertIn(
106
+ self.classification_company.tax_cbs_id, line_form.fiscal_tax_ids
107
+ )
108
+ self.assertIn(
109
+ self.classification_company.tax_ibs_id, line_form.fiscal_tax_ids
110
+ )
@@ -48,7 +48,7 @@ def domain_field_codes(
48
48
  def path_edoc_company(company_id):
49
49
  db_name = company_id._cr.dbname
50
50
  filestore = tools.config.filestore(db_name)
51
- return "/".join([filestore, "edoc", punctuation_rm(company_id.cnpj_cpf)])
51
+ return "/".join([filestore, "edoc", punctuation_rm(company_id.vat)])
52
52
 
53
53
 
54
54
  def build_edoc_path(
@@ -1,6 +1,5 @@
1
1
  <?xml version="1.0" encoding="utf-8" ?>
2
2
  <odoo>
3
-
4
3
  <record id="cest_search" model="ir.ui.view">
5
4
  <field name="name">l10n_br_fiscal.cest.search</field>
6
5
  <field name="model">l10n_br_fiscal.cest</field>
@@ -10,9 +9,9 @@
10
9
  <field name="name" />
11
10
  <field name="item" />
12
11
  <field name="segment" />
13
- <group expand='0' string='Group By...'>
12
+ <group expand="0" string="Group By...">
14
13
  <filter
15
- string='Segment'
14
+ string="Segment"
16
15
  name="segment"
17
16
  domain="[]"
18
17
  context="{'group_by' : 'segment'}"
@@ -79,5 +78,4 @@
79
78
  </form>
80
79
  </field>
81
80
  </record>
82
-
83
81
  </odoo>
@@ -1,6 +1,5 @@
1
1
  <?xml version="1.0" encoding="utf-8" ?>
2
2
  <odoo>
3
-
4
3
  <record id="cfop_search" model="ir.ui.view">
5
4
  <field name="name">l10n_br_fiscal.cfop.search</field>
6
5
  <field name="model">l10n_br_fiscal.cfop</field>
@@ -25,15 +24,15 @@
25
24
  <field name="code" />
26
25
  <field name="name" />
27
26
  <field name="small_name" />
28
- <group expand='0' string='Group By...'>
27
+ <group expand="0" string="Group By...">
29
28
  <filter
30
- string='Type In Out'
29
+ string="Type In Out"
31
30
  name="type_in_out"
32
31
  domain="[]"
33
32
  context="{'group_by' : 'type_in_out'}"
34
33
  />
35
34
  <filter
36
- string='Type Move'
35
+ string="Type Move"
37
36
  name="type_move"
38
37
  domain="[]"
39
38
  context="{'group_by' : 'type_move'}"
@@ -53,6 +52,15 @@
53
52
  <field name="type_in_out" />
54
53
  <field name="destination" />
55
54
  <field name="type_move" />
55
+ <field name="ind_nfe" optional="hide" />
56
+ <field name="ind_cte" optional="hide" />
57
+ <field name="ind_comunica" optional="hide" />
58
+ <field name="ind_transp" optional="hide" />
59
+ <field name="ind_devol" optional="hide" />
60
+ <field name="ind_retor" optional="hide" />
61
+ <field name="ind_anula" optional="hide" />
62
+ <field name="ind_remes" optional="hide" />
63
+ <field name="ind_comb" optional="hide" />
56
64
  </tree>
57
65
  </field>
58
66
  </record>
@@ -81,6 +89,19 @@
81
89
  <field name="account_move" />
82
90
  <field name="assent_move" />
83
91
  </group>
92
+ <group name="fiscal_document" string="Used In Fiscal Document">
93
+ <field name="ind_nfe" />
94
+ <field name="ind_cte" />
95
+ </group>
96
+ <group name="move_type" string="Move Type">
97
+ <field name="ind_comunica" />
98
+ <field name="ind_transp" />
99
+ <field name="ind_devol" />
100
+ <field name="ind_retor" />
101
+ <field name="ind_anula" />
102
+ <field name="ind_remes" />
103
+ <field name="ind_comb" />
104
+ </group>
84
105
  </group>
85
106
  <group name="tax_settings" string="Taxes Settings">
86
107
  <field
@@ -94,5 +115,4 @@
94
115
  </form>
95
116
  </field>
96
117
  </record>
97
-
98
118
  </odoo>
@@ -2,7 +2,6 @@
2
2
  <!-- Copyright 2020 KMEE INFORMATICA LTDA
3
3
  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
4
4
  <odoo>
5
-
6
5
  <record id="city_taxation_code_search_view" model="ir.ui.view">
7
6
  <field name="name">city.taxation.code.search (in l10n_br_fiscal)</field>
8
7
  <field name="model">l10n_br_fiscal.city.taxation.code</field>
@@ -38,8 +37,7 @@
38
37
  <field name="model">l10n_br_fiscal.city.taxation.code</field>
39
38
  <field name="arch" type="xml">
40
39
  <form>
41
- <header>
42
- </header>
40
+ <header />
43
41
  <sheet>
44
42
  <group>
45
43
  <field name="code" />
@@ -53,5 +51,4 @@
53
51
  </form>
54
52
  </field>
55
53
  </record>
56
-
57
54
  </odoo>
@@ -1,6 +1,5 @@
1
1
  <?xml version="1.0" encoding="utf-8" ?>
2
2
  <odoo>
3
-
4
3
  <record id="cnae_search" model="ir.ui.view">
5
4
  <field name="name">l10n_br_fiscal.cnae.search</field>
6
5
  <field name="model">l10n_br_fiscal.cnae</field>
@@ -8,9 +7,9 @@
8
7
  <search string="CNAE">
9
8
  <field name="code" />
10
9
  <field name="name" />
11
- <group expand='0' string='Group By...'>
10
+ <group expand="0" string="Group By...">
12
11
  <filter
13
- string='Parent'
12
+ string="Parent"
14
13
  name="parent_id"
15
14
  domain="[]"
16
15
  context="{'group_by' : 'parent_id'}"
@@ -51,5 +50,4 @@
51
50
  </form>
52
51
  </field>
53
52
  </record>
54
-
55
53
  </odoo>
@@ -1,15 +1,14 @@
1
1
  <?xml version="1.0" encoding="utf-8" ?>
2
2
  <odoo>
3
-
4
3
  <record id="comment_search" model="ir.ui.view">
5
4
  <field name="name">l10n_br_fiscal.comment.search</field>
6
5
  <field name="model">l10n_br_fiscal.comment</field>
7
6
  <field name="arch" type="xml">
8
7
  <search string="Comment">
9
8
  <field name="name" />
10
- <group expand='0' string='Group By...'>
9
+ <group expand="0" string="Group By...">
11
10
  <filter
12
- string='Comment Type'
11
+ string="Comment Type"
13
12
  name="comment_type"
14
13
  domain="[]"
15
14
  context="{'group_by' : 'comment_type'}"
@@ -75,5 +74,4 @@
75
74
  </form>
76
75
  </field>
77
76
  </record>
78
-
79
77
  </odoo>
@@ -1,6 +1,5 @@
1
1
  <?xml version="1.0" encoding="utf-8" ?>
2
2
  <odoo>
3
-
4
3
  <record id="cst_search" model="ir.ui.view">
5
4
  <field name="name">l10n_br_fiscal.cst.search</field>
6
5
  <field name="model">l10n_br_fiscal.cst</field>
@@ -10,9 +9,9 @@
10
9
  <field name="name" />
11
10
  <field name="tax_group_id" />
12
11
  <field name="tax_domain" />
13
- <group expand='0' string='Group By...'>
12
+ <group expand="0" string="Group By...">
14
13
  <filter
15
- string='Tax Group'
14
+ string="Tax Group"
16
15
  name="tax_group_id"
17
16
  domain="[]"
18
17
  context="{'group_by' : 'tax_group_id'}"
@@ -42,14 +41,13 @@
42
41
  <form string="CST">
43
42
  <sheet>
44
43
  <group>
45
- <field name="code" />
46
- <field name="name" />
47
- <field name="cst_type" />
48
- <field name="tax_group_id" />
44
+ <field name="code" />
45
+ <field name="name" />
46
+ <field name="cst_type" />
47
+ <field name="tax_group_id" />
49
48
  </group>
50
49
  </sheet>
51
50
  </form>
52
51
  </field>
53
52
  </record>
54
-
55
53
  </odoo>