odoo-addon-l10n-br-fiscal 16.0.8.0.2__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 (115) hide show
  1. odoo/addons/l10n_br_fiscal/README.rst +1 -1
  2. odoo/addons/l10n_br_fiscal/__manifest__.py +10 -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/data/uom_data.xml +186 -33
  13. odoo/addons/l10n_br_fiscal/demo/fiscal_document_demo.xml +3 -377
  14. odoo/addons/l10n_br_fiscal/demo/fiscal_document_nfse_demo.xml +0 -12
  15. odoo/addons/l10n_br_fiscal/demo/fiscal_operation_demo.xml +2 -2
  16. odoo/addons/l10n_br_fiscal/i18n/l10n_br_fiscal.pot +902 -304
  17. odoo/addons/l10n_br_fiscal/i18n/pt_BR.po +22 -22
  18. odoo/addons/l10n_br_fiscal/migrations/16.0.13.0.0/pre-migration.py +25 -0
  19. odoo/addons/l10n_br_fiscal/migrations/16.0.14.0.0/pre-migration.py +30 -0
  20. odoo/addons/l10n_br_fiscal/migrations/16.0.14.0.5/pre-migration.py +15 -0
  21. odoo/addons/l10n_br_fiscal/models/__init__.py +3 -2
  22. odoo/addons/l10n_br_fiscal/models/comment.py +2 -2
  23. odoo/addons/l10n_br_fiscal/models/data_ncm_nbs_abstract.py +1 -1
  24. odoo/addons/l10n_br_fiscal/models/document.py +83 -226
  25. odoo/addons/l10n_br_fiscal/models/document_line.py +67 -5
  26. odoo/addons/l10n_br_fiscal/models/document_line_mixin.py +1932 -136
  27. odoo/addons/l10n_br_fiscal/models/document_mixin.py +248 -17
  28. odoo/addons/l10n_br_fiscal/models/document_related.py +11 -8
  29. odoo/addons/l10n_br_fiscal/models/document_serie.py +33 -0
  30. odoo/addons/l10n_br_fiscal/models/ibpt.py +1 -1
  31. odoo/addons/l10n_br_fiscal/models/icms_regulation.py +1 -1
  32. odoo/addons/l10n_br_fiscal/models/invalidate_number.py +4 -5
  33. odoo/addons/l10n_br_fiscal/models/operation_dashboard.py +3 -2
  34. odoo/addons/l10n_br_fiscal/models/operation_indicator.py +58 -0
  35. odoo/addons/l10n_br_fiscal/models/operation_line.py +28 -0
  36. odoo/addons/l10n_br_fiscal/models/partner_profile.py +6 -0
  37. odoo/addons/l10n_br_fiscal/models/product_template.py +5 -1
  38. odoo/addons/l10n_br_fiscal/models/res_company.py +18 -0
  39. odoo/addons/l10n_br_fiscal/models/res_partner.py +27 -6
  40. odoo/addons/l10n_br_fiscal/models/simplified_tax_range.py +8 -0
  41. odoo/addons/l10n_br_fiscal/models/tax.py +7 -3
  42. odoo/addons/l10n_br_fiscal/models/tax_classification.py +81 -0
  43. odoo/addons/l10n_br_fiscal/models/tax_pis_cofins_base.py +1 -1
  44. odoo/addons/l10n_br_fiscal/models/tax_pis_cofins_credit.py +1 -1
  45. odoo/addons/l10n_br_fiscal/models/uom_uom.py +24 -0
  46. odoo/addons/l10n_br_fiscal/security/fiscal_security.xml +6 -16
  47. odoo/addons/l10n_br_fiscal/security/ir.model.access.csv +8 -2
  48. odoo/addons/l10n_br_fiscal/static/description/index.html +1 -1
  49. odoo/addons/l10n_br_fiscal/tests/__init__.py +3 -0
  50. odoo/addons/l10n_br_fiscal/tests/test_document_edition.py +308 -0
  51. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_generic.py +23 -111
  52. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_nfse.py +5 -13
  53. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_serie.py +60 -0
  54. odoo/addons/l10n_br_fiscal/tests/test_ibpt.py +2 -2
  55. odoo/addons/l10n_br_fiscal/tests/test_icms_regulation.py +2 -2
  56. odoo/addons/l10n_br_fiscal/tests/test_tax_benefit.py +14 -20
  57. odoo/addons/l10n_br_fiscal/tests/test_tax_classification.py +110 -0
  58. odoo/addons/l10n_br_fiscal/tools.py +1 -1
  59. odoo/addons/l10n_br_fiscal/views/cest_view.xml +2 -4
  60. odoo/addons/l10n_br_fiscal/views/cfop_view.xml +3 -5
  61. odoo/addons/l10n_br_fiscal/views/city_taxation_code.xml +1 -4
  62. odoo/addons/l10n_br_fiscal/views/cnae_view.xml +2 -4
  63. odoo/addons/l10n_br_fiscal/views/comment_view.xml +2 -4
  64. odoo/addons/l10n_br_fiscal/views/cst_view.xml +6 -8
  65. odoo/addons/l10n_br_fiscal/views/{document_fiscal_line_mixin_view.xml → document_line_mixin_view.xml} +525 -388
  66. odoo/addons/l10n_br_fiscal/views/document_line_view.xml +101 -82
  67. odoo/addons/l10n_br_fiscal/views/document_related_view.xml +44 -46
  68. odoo/addons/l10n_br_fiscal/views/document_serie_view.xml +2 -6
  69. odoo/addons/l10n_br_fiscal/views/document_type_view.xml +0 -2
  70. odoo/addons/l10n_br_fiscal/views/document_view.xml +304 -346
  71. odoo/addons/l10n_br_fiscal/views/icms_regulation_view.xml +14 -16
  72. odoo/addons/l10n_br_fiscal/views/icms_relief_view.xml +8 -10
  73. odoo/addons/l10n_br_fiscal/views/invalidate_number_view.xml +46 -48
  74. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_action.xml +162 -244
  75. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_menu.xml +16 -72
  76. odoo/addons/l10n_br_fiscal/views/legal_nature_view.xml +0 -2
  77. odoo/addons/l10n_br_fiscal/views/nbm_view.xml +5 -6
  78. odoo/addons/l10n_br_fiscal/views/nbs_view.xml +5 -6
  79. odoo/addons/l10n_br_fiscal/views/ncm_view.xml +12 -15
  80. odoo/addons/l10n_br_fiscal/views/operation_dashboard_view.xml +13 -12
  81. odoo/addons/l10n_br_fiscal/views/operation_indicator_view.xml +75 -0
  82. odoo/addons/l10n_br_fiscal/views/operation_line_view.xml +22 -21
  83. odoo/addons/l10n_br_fiscal/views/operation_view.xml +3 -6
  84. odoo/addons/l10n_br_fiscal/views/partner_profile_view.xml +3 -6
  85. odoo/addons/l10n_br_fiscal/views/product_genre_view.xml +7 -9
  86. odoo/addons/l10n_br_fiscal/views/product_product_view.xml +37 -14
  87. odoo/addons/l10n_br_fiscal/views/product_template_view.xml +34 -14
  88. odoo/addons/l10n_br_fiscal/views/res_company_view.xml +40 -38
  89. odoo/addons/l10n_br_fiscal/views/res_config_settings_view.xml +23 -28
  90. odoo/addons/l10n_br_fiscal/views/res_partner_view.xml +13 -2
  91. odoo/addons/l10n_br_fiscal/views/service_type_view.xml +7 -8
  92. odoo/addons/l10n_br_fiscal/views/simplified_tax_range_view.xml +0 -2
  93. odoo/addons/l10n_br_fiscal/views/simplified_tax_view.xml +0 -2
  94. odoo/addons/l10n_br_fiscal/views/tax_classification.xml +110 -0
  95. odoo/addons/l10n_br_fiscal/views/tax_definition_view.xml +157 -129
  96. odoo/addons/l10n_br_fiscal/views/tax_estimate_view.xml +0 -2
  97. odoo/addons/l10n_br_fiscal/views/tax_group_view.xml +3 -6
  98. odoo/addons/l10n_br_fiscal/views/tax_ipi_control_seal_view.xml +0 -2
  99. odoo/addons/l10n_br_fiscal/views/tax_ipi_guideline_class_view.xml +0 -2
  100. odoo/addons/l10n_br_fiscal/views/tax_ipi_guideline_view.xml +2 -4
  101. odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_base_view.xml +2 -4
  102. odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_credit_view.xml +2 -4
  103. odoo/addons/l10n_br_fiscal/views/tax_pis_cofins_view.xml +5 -7
  104. odoo/addons/l10n_br_fiscal/views/tax_view.xml +5 -7
  105. odoo/addons/l10n_br_fiscal/views/uom_uom.xml +52 -0
  106. odoo/addons/l10n_br_fiscal/wizards/__init__.py +1 -0
  107. odoo/addons/l10n_br_fiscal/wizards/base_wizard_mixin.py +1 -1
  108. odoo/addons/l10n_br_fiscal/wizards/document_import_wizard_mixin.py +129 -0
  109. odoo/addons/l10n_br_fiscal/wizards/document_import_wizard_mixin.xml +41 -0
  110. {odoo_addon_l10n_br_fiscal-16.0.8.0.2.dist-info → odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info}/METADATA +3 -3
  111. {odoo_addon_l10n_br_fiscal-16.0.8.0.2.dist-info → odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info}/RECORD +113 -99
  112. {odoo_addon_l10n_br_fiscal-16.0.8.0.2.dist-info → odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info}/WHEEL +1 -1
  113. odoo/addons/l10n_br_fiscal/models/document_line_mixin_methods.py +0 -814
  114. odoo/addons/l10n_br_fiscal/models/document_mixin_methods.py +0 -363
  115. {odoo_addon_l10n_br_fiscal-16.0.8.0.2.dist-info → odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info}/top_level.txt +0 -0
@@ -1300,9 +1300,9 @@ msgid "CNPJ"
1300
1300
  msgstr "CNPJ"
1301
1301
 
1302
1302
  #. module: l10n_br_fiscal
1303
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_related__cnpj_cpf
1304
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_partner__cnpj_cpf
1305
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_users__cnpj_cpf
1303
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_related__vat
1304
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_partner__vat
1305
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_users__vat
1306
1306
  msgid "CNPJ/CPF"
1307
1307
  msgstr "CNPJ/CPF"
1308
1308
 
@@ -1914,8 +1914,8 @@ msgid "Company Main CNAE"
1914
1914
  msgstr "CNAE Principal da Empresa"
1915
1915
 
1916
1916
  #. module: l10n_br_fiscal
1917
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__company_inscr_mun
1918
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__company_inscr_mun
1917
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__company_l10n_br_im_code
1918
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__company_l10n_br_im_code
1919
1919
  msgid "Company Municipal Tax Number"
1920
1920
  msgstr "Número de Impostos Municipais da Empresa"
1921
1921
 
@@ -1938,8 +1938,8 @@ msgid "Company Phone"
1938
1938
  msgstr "Telefone da Empresa"
1939
1939
 
1940
1940
  #. module: l10n_br_fiscal
1941
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__company_inscr_est_st
1942
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__company_inscr_est_st
1941
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__company_l10n_br_ie_code_st
1942
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__company_l10n_br_ie_code_st
1943
1943
  msgid "Company ST State Tax Number"
1944
1944
  msgstr ""
1945
1945
 
@@ -1950,8 +1950,8 @@ msgid "Company State"
1950
1950
  msgstr "Estado da Empresa"
1951
1951
 
1952
1952
  #. module: l10n_br_fiscal
1953
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__company_inscr_est
1954
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__company_inscr_est
1953
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__company_l10n_br_ie_code
1954
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__company_l10n_br_ie_code
1955
1955
  msgid "Company State Tax Number"
1956
1956
  msgstr "Número da Inscrição Estadual"
1957
1957
 
@@ -1968,8 +1968,8 @@ msgid "Company Street2"
1968
1968
  msgstr "Empresa Rua2"
1969
1969
 
1970
1970
  #. module: l10n_br_fiscal
1971
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__company_suframa
1972
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__company_suframa
1971
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__company_l10n_br_isuf_code
1972
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__company_l10n_br_isuf_code
1973
1973
  msgid "Company Suframa"
1974
1974
  msgstr "Empresa Suframa"
1975
1975
 
@@ -5165,7 +5165,7 @@ msgid "Input"
5165
5165
  msgstr "Entrada"
5166
5166
 
5167
5167
  #. module: l10n_br_fiscal
5168
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_related__inscr_est
5168
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_related__l10n_br_ie_code
5169
5169
  msgid "Inscr. Estadual/RG"
5170
5170
  msgstr "O Inscr. Estadual/RG"
5171
5171
 
@@ -5771,10 +5771,10 @@ msgid "Move Settings"
5771
5771
  msgstr "Configurações de movimento"
5772
5772
 
5773
5773
  #. module: l10n_br_fiscal
5774
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__partner_inscr_mun
5775
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__partner_inscr_mun
5776
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_partner__inscr_mun
5777
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_users__inscr_mun
5774
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__partner_l10n_br_im_code
5775
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__partner_l10n_br_im_code
5776
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_partner__l10n_br_im_code
5777
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_users__l10n_br_im_code
5778
5778
  msgid "Municipal Tax Number"
5779
5779
  msgstr "Número de Impostos Municipais"
5780
5780
 
@@ -7705,10 +7705,10 @@ msgid "State"
7705
7705
  msgstr "Estado"
7706
7706
 
7707
7707
  #. module: l10n_br_fiscal
7708
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__partner_inscr_est
7709
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__partner_inscr_est
7710
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_partner__inscr_est
7711
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_users__inscr_est
7708
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__partner_l10n_br_ie_code
7709
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__partner_l10n_br_ie_code
7710
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_partner__l10n_br_ie_code
7711
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_res_users__l10n_br_ie_code
7712
7712
  msgid "State Tax Number"
7713
7713
  msgstr "Número do Imposto Estadual/RG"
7714
7714
 
@@ -7798,8 +7798,8 @@ msgid "Sufix"
7798
7798
  msgstr "Sufix"
7799
7799
 
7800
7800
  #. module: l10n_br_fiscal
7801
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__partner_suframa
7802
- #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__partner_suframa
7801
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document__partner_l10n_br_isuf_code
7802
+ #: model:ir.model.fields,field_description:l10n_br_fiscal.field_l10n_br_fiscal_document_move_mixin__partner_l10n_br_isuf_code
7803
7803
  msgid "Suframa"
7804
7804
  msgstr "Suframa"
7805
7805
 
@@ -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)
@@ -0,0 +1,15 @@
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 openupgradelib import openupgrade
5
+
6
+
7
+ @openupgrade.migrate()
8
+ def migrate(env, version):
9
+ xmlids_renames = [
10
+ (
11
+ "l10n_br_fiscal.l10n_br_fiscal_operation_line_rule",
12
+ "l10n_br_fiscal.l10n_br_fiscal_operation_rule",
13
+ )
14
+ ]
15
+ openupgrade.rename_xmlids(env.cr, xmlids_renames)
@@ -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
@@ -50,6 +48,9 @@ from . import document_related
50
48
  from . import document_line
51
49
  from . import res_config_settings
52
50
  from . import res_country_state
51
+ from . import uom_uom
53
52
  from . import operation_dashboard
54
53
  from . import city_taxation_code
55
54
  from . import document_supplement
55
+ from . import tax_classification
56
+ from . import operation_indicator
@@ -6,7 +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
9
+ from odoo import api, fields, models
10
10
  from odoo.osv.expression import AND
11
11
 
12
12
  from ..constants.fiscal import (
@@ -163,7 +163,7 @@ class Comment(models.Model):
163
163
 
164
164
  comments = [manual_comment] if manual_comment else []
165
165
  for record in self:
166
- template = mako_safe_env.from_string(tools.ustr(record.comment))
166
+ template = mako_safe_env.from_string(record.comment)
167
167
  comments.append(template.render(vals))
168
168
  return " - ".join(comments)
169
169
 
@@ -89,7 +89,7 @@ class DataNcmNbsAbstract(models.AbstractModel):
89
89
 
90
90
  config = DeOlhoNoImposto(
91
91
  company.ibpt_token,
92
- misc.punctuation_rm(company.cnpj_cpf),
92
+ misc.punctuation_rm(company.vat),
93
93
  company.state_id.code,
94
94
  odooconfig.get("ibpt_request_timeout")
95
95
  or self.env["ir.config_parameter"]
@@ -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,
@@ -61,6 +66,7 @@ class Document(models.Model):
61
66
  _inherit = [
62
67
  "l10n_br_fiscal.document.mixin",
63
68
  "mail.thread",
69
+ "mail.activity.mixin",
64
70
  ]
65
71
  _description = "Fiscal Document"
66
72
  _check_company_auto = True
@@ -91,9 +97,9 @@ class Document(models.Model):
91
97
  )
92
98
 
93
99
  fiscal_operation_id = fields.Many2one(
94
- domain="[('state', '=', 'approved'), "
95
- "'|', ('fiscal_operation_type', '=', fiscal_operation_type),"
96
- " ('fiscal_operation_type', '=', 'all')]",
100
+ "l10n_br_fiscal.operation",
101
+ string="Fiscal Operation",
102
+ domain="[('state', '=', 'approved')]",
97
103
  )
98
104
 
99
105
  fiscal_operation_type = fields.Selection(
@@ -138,8 +144,16 @@ class Document(models.Model):
138
144
  partner_id = fields.Many2one(
139
145
  comodel_name="res.partner",
140
146
  string="Partner",
147
+ inverse="_inverse_partner_id",
141
148
  )
142
149
 
150
+ @api.onchange("partner_id")
151
+ def _inverse_partner_id(self):
152
+ for doc in self:
153
+ for line in doc.fiscal_line_ids:
154
+ if line.partner_id != doc.partner_id:
155
+ line.partner_id = doc.partner_id
156
+
143
157
  partner_shipping_id = fields.Many2one(
144
158
  comodel_name="res.partner",
145
159
  string="Shipping Address",
@@ -168,6 +182,21 @@ class Document(models.Model):
168
182
  precompute=True,
169
183
  )
170
184
 
185
+ edoc_refund_debit_type = fields.Selection(
186
+ selection=EDOC_REFUND_DEBIT_TYPE,
187
+ string="Tipo de Nota de Débito",
188
+ )
189
+
190
+ edoc_refund_credit_type = fields.Selection(
191
+ selection=EDOC_REFUND_CREDIT_TYPE,
192
+ string="Tipo de Nota de Crédito",
193
+ )
194
+
195
+ public_entity_type = fields.Selection(
196
+ selection=PUBLIC_ENTIRY_TYPE,
197
+ string="Tipo de Entidade Governamental",
198
+ )
199
+
171
200
  document_type = fields.Char(
172
201
  string="Document Type Code",
173
202
  related="document_type_id.code",
@@ -183,9 +212,9 @@ class Document(models.Model):
183
212
  )
184
213
 
185
214
  currency_id = fields.Many2one(
215
+ related="company_id.currency_id",
186
216
  comodel_name="res.currency",
187
217
  string="Currency",
188
- compute="_compute_currency_id",
189
218
  )
190
219
 
191
220
  # this related "state" field is required for the status bar widget
@@ -215,205 +244,29 @@ class Document(models.Model):
215
244
  ],
216
245
  string="Tomador do Serviço",
217
246
  )
218
-
219
- # ----- Now some handy related fields:
220
-
221
247
  partner_legal_name = fields.Char(
222
248
  string="Legal Name",
223
249
  related="partner_id.legal_name",
224
250
  )
225
-
226
- partner_name = fields.Char(
227
- string="Partner Name",
228
- related="partner_id.name",
229
- )
230
-
231
251
  partner_cnpj_cpf = fields.Char(
232
252
  string="CNPJ",
233
- related="partner_id.cnpj_cpf",
253
+ related="partner_id.vat",
234
254
  )
235
-
236
- partner_inscr_est = fields.Char(
255
+ partner_l10n_br_ie_code = fields.Char(
237
256
  string="State Tax Number",
238
- related="partner_id.inscr_est",
239
- )
240
-
241
- partner_ind_ie_dest = fields.Selection(
242
- string="Contribuinte do ICMS",
243
- related="partner_id.ind_ie_dest",
244
- )
245
-
246
- partner_inscr_mun = fields.Char(
247
- string="Municipal Tax Number",
248
- related="partner_id.inscr_mun",
249
- )
250
-
251
- partner_suframa = fields.Char(
252
- string="Suframa",
253
- related="partner_id.suframa",
254
- )
255
-
256
- partner_cnae_main_id = fields.Many2one(
257
- comodel_name="l10n_br_fiscal.cnae",
258
- string="Main CNAE",
259
- related="partner_id.cnae_main_id",
260
- )
261
-
262
- partner_tax_framework = fields.Selection(
263
- string="Tax Framework",
264
- related="partner_id.tax_framework",
265
- )
266
-
267
- partner_street = fields.Char(
268
- string="Partner Street",
269
- related="partner_id.street",
270
- )
271
-
272
- partner_number = fields.Char(
273
- string="Partner Number",
274
- related="partner_id.street_number",
275
- )
276
-
277
- partner_street2 = fields.Char(
278
- string="Partner Street2",
279
- related="partner_id.street2",
280
- )
281
-
282
- partner_district = fields.Char(
283
- string="Partner District",
284
- related="partner_id.district",
285
- )
286
-
287
- partner_country_id = fields.Many2one(
288
- comodel_name="res.country",
289
- string="Partner Country",
290
- related="partner_id.country_id",
291
- )
292
-
293
- partner_state_id = fields.Many2one(
294
- comodel_name="res.country.state",
295
- string="Partner State",
296
- related="partner_id.state_id",
297
- )
298
-
299
- partner_city_id = fields.Many2one(
300
- comodel_name="res.city",
301
- string="Partner City",
302
- related="partner_id.city_id",
303
- )
304
-
305
- partner_zip = fields.Char(
306
- string="Partner Zip",
307
- related="partner_id.zip",
308
- )
309
-
310
- partner_phone = fields.Char(
311
- string="Partner Phone",
312
- related="partner_id.phone",
313
- )
314
-
315
- partner_is_company = fields.Boolean(
316
- string="Partner Is Company?",
317
- related="partner_id.is_company",
257
+ related="partner_id.l10n_br_ie_code",
318
258
  )
319
259
 
320
260
  processador_edoc = fields.Selection(
321
261
  related="company_id.processador_edoc",
322
262
  )
323
-
324
- company_legal_name = fields.Char(
325
- string="Company Legal Name",
326
- related="company_id.legal_name",
327
- )
328
-
329
- company_name = fields.Char(
330
- string="Company Name",
331
- size=128,
332
- related="company_id.name",
333
- )
334
-
335
- company_cnpj_cpf = fields.Char(
336
- string="Company CNPJ",
337
- related="company_id.cnpj_cpf",
338
- )
339
-
340
- company_inscr_est = fields.Char(
341
- string="Company State Tax Number",
342
- related="company_id.inscr_est",
343
- )
344
-
345
- company_inscr_est_st = fields.Char(
263
+ company_l10n_br_ie_code_st = fields.Char(
346
264
  string="Company ST State Tax Number",
347
265
  )
348
266
 
349
- company_inscr_mun = fields.Char(
350
- string="Company Municipal Tax Number",
351
- related="company_id.inscr_mun",
352
- )
353
-
354
- company_suframa = fields.Char(
355
- string="Company Suframa",
356
- related="company_id.suframa",
357
- )
358
-
359
- company_cnae_main_id = fields.Many2one(
360
- comodel_name="l10n_br_fiscal.cnae",
361
- string="Company Main CNAE",
362
- related="company_id.cnae_main_id",
363
- )
364
-
365
- company_tax_framework = fields.Selection(
366
- string="Company Tax Framework",
367
- related="company_id.tax_framework",
368
- )
369
-
370
- company_street = fields.Char(
371
- string="Company Street",
372
- related="company_id.street",
373
- )
374
-
375
- company_number = fields.Char(
376
- string="Company Number",
377
- related="company_id.street_number",
378
- )
379
-
380
- company_street2 = fields.Char(
381
- string="Company Street2",
382
- related="company_id.street2",
383
- )
267
+ fiscal_additional_data = fields.Text()
384
268
 
385
- company_district = fields.Char(
386
- string="Company District",
387
- related="company_id.district",
388
- )
389
-
390
- company_country_id = fields.Many2one(
391
- comodel_name="res.country",
392
- string="Company Country",
393
- related="company_id.country_id",
394
- )
395
-
396
- company_state_id = fields.Many2one(
397
- comodel_name="res.country.state",
398
- string="Company State",
399
- related="company_id.state_id",
400
- )
401
-
402
- company_city_id = fields.Many2one(
403
- comodel_name="res.city",
404
- string="Company City",
405
- related="company_id.city_id",
406
- )
407
-
408
- company_zip = fields.Char(
409
- string="Company ZIP",
410
- related="company_id.zip",
411
- )
412
-
413
- company_phone = fields.Char(
414
- string="Company Phone",
415
- related="company_id.phone",
416
- )
269
+ customer_additional_data = fields.Text()
417
270
 
418
271
  @api.constrains("document_key")
419
272
  def _check_key(self):
@@ -486,10 +339,18 @@ class Document(models.Model):
486
339
  )
487
340
  )
488
341
 
489
- @api.depends("company_id")
490
- def _compute_currency_id(self):
491
- for doc in self:
492
- doc.currency_id = doc.company_id.currency_id or self.env.company.currency_id
342
+ @api.onchange("fiscal_operation_type")
343
+ def _onchange_fiscal_operation_type(self):
344
+ domain = [("state", "=", "approved")]
345
+ if self.fiscal_operation_type:
346
+ domain.append(("fiscal_operation_type", "=", self.fiscal_operation_type))
347
+ if (
348
+ self.fiscal_operation_id
349
+ and self.fiscal_operation_id.fiscal_operation_type
350
+ != self.fiscal_operation_type
351
+ ):
352
+ self.fiscal_operation_id = False
353
+ return {"domain": {"fiscal_operation_id": domain}}
493
354
 
494
355
  def _compute_document_name(self):
495
356
  self.ensure_one()
@@ -510,19 +371,19 @@ class Document(models.Model):
510
371
  name += "/" + type_serie_number
511
372
  if self.document_date:
512
373
  name += " - " + self.document_date.strftime("%d/%m/%Y")
513
- if not self.partner_cnpj_cpf:
374
+ if not self.partner_id.vat:
514
375
  name += " - " + _("Unidentified Consumer")
515
- elif self.partner_legal_name:
516
- name += " - " + self.partner_legal_name
517
- name += " - " + self.partner_cnpj_cpf
376
+ elif self.partner_id.legal_name:
377
+ name += " - " + self.partner_id.legal_name
378
+ name += " - " + self.partner_id.vat
518
379
  else:
519
- name += " - " + self.partner_name
520
- name += " - " + self.partner_cnpj_cpf
380
+ name += " - " + self.partner_id.name
381
+ name += " - " + self.partner_id.vat
521
382
  elif self._context.get("fiscal_document_no_company"):
522
383
  name += type_serie_number
523
384
  else:
524
385
  name += "{name}/{type_serie_number}".format(
525
- name=self.company_name or "",
386
+ name=self.company_id.name or "",
526
387
  type_serie_number=type_serie_number,
527
388
  )
528
389
  return name
@@ -546,22 +407,9 @@ class Document(models.Model):
546
407
  for r in self:
547
408
  r.name = r._compute_document_name()
548
409
 
549
- @api.depends(
550
- "fiscal_line_ids.estimate_tax",
551
- "fiscal_line_ids.price_gross",
552
- "fiscal_line_ids.amount_untaxed",
553
- "fiscal_line_ids.amount_tax",
554
- "fiscal_line_ids.amount_taxed",
555
- "fiscal_line_ids.amount_total",
556
- "fiscal_line_ids.financial_total",
557
- "fiscal_line_ids.financial_total_gross",
558
- "fiscal_line_ids.financial_discount_value",
559
- "fiscal_line_ids.amount_tax_included",
560
- "fiscal_line_ids.amount_tax_not_included",
561
- "fiscal_line_ids.amount_tax_withholding",
562
- )
563
- def _compute_fiscal_amount(self):
564
- return super()._compute_fiscal_amount()
410
+ @api.model
411
+ def _get_fiscal_lines_field_name(self):
412
+ return "fiscal_line_ids"
565
413
 
566
414
  def unlink(self):
567
415
  forbidden_states_unlink = [
@@ -596,7 +444,6 @@ class Document(models.Model):
596
444
 
597
445
  new_doc = record.copy()
598
446
  new_doc.fiscal_operation_id = fsc_op
599
- new_doc._onchange_fiscal_operation_id()
600
447
 
601
448
  for line in new_doc.fiscal_line_ids:
602
449
  fsc_op_line = line.fiscal_operation_id.return_fiscal_operation_id
@@ -608,9 +455,6 @@ class Document(models.Model):
608
455
  ).format(line.fiscal_operation_id)
609
456
  )
610
457
  line.fiscal_operation_id = fsc_op_line
611
- line._onchange_fiscal_operation_id()
612
- line._onchange_fiscal_operation_line_id()
613
-
614
458
  return_docs |= new_doc
615
459
  return return_docs
616
460
 
@@ -660,13 +504,26 @@ class Document(models.Model):
660
504
  for record in self:
661
505
  record.edoc_purpose = record.fiscal_operation_id.edoc_purpose
662
506
 
663
- @api.onchange("fiscal_operation_id")
664
- def _onchange_fiscal_operation_id(self):
665
- result = super()._onchange_fiscal_operation_id()
666
- if self.fiscal_operation_id:
667
- self.fiscal_operation_type = self.fiscal_operation_id.fiscal_operation_type
668
-
669
- if self.issuer == DOCUMENT_ISSUER_COMPANY and not self.document_type_id:
670
- self.document_type_id = self.company_id.document_type_id
507
+ def __document_comment_vals(self):
508
+ return {
509
+ "user": self.env.user,
510
+ "ctx": self._context,
511
+ "doc": self,
512
+ }
513
+
514
+ def _document_comment(self):
515
+ for d in self:
516
+ # Fiscal Comments
517
+ d.fiscal_additional_data = d.comment_ids.filtered(
518
+ lambda c: c.comment_type == COMMENT_TYPE_FISCAL
519
+ ).compute_message(
520
+ d.__document_comment_vals(), d.manual_fiscal_additional_data
521
+ )
671
522
 
672
- return result
523
+ # Commercial Comments
524
+ d.customer_additional_data = d.comment_ids.filtered(
525
+ lambda c: c.comment_type == COMMENT_TYPE_COMMERCIAL
526
+ ).compute_message(
527
+ d.__document_comment_vals(), d.manual_customer_additional_data
528
+ )
529
+ d.fiscal_line_ids._document_comment()