odoo-addon-l10n-br-fiscal 16.0.19.4.0__py3-none-any.whl → 17.0.4.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.
Files changed (90) hide show
  1. odoo/addons/l10n_br_fiscal/README.rst +10 -10
  2. odoo/addons/l10n_br_fiscal/__init__.py +2 -3
  3. odoo/addons/l10n_br_fiscal/__manifest__.py +3 -7
  4. odoo/addons/l10n_br_fiscal/constants/fiscal.py +0 -66
  5. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.cest.csv +983 -1043
  6. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.cst.csv +0 -58
  7. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.csv +0 -31
  8. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.group.csv +0 -3
  9. odoo/addons/l10n_br_fiscal/data/product_data.xml +2 -2
  10. odoo/addons/l10n_br_fiscal/demo/fiscal_document_demo.xml +88 -0
  11. odoo/addons/l10n_br_fiscal/i18n/l10n_br_fiscal.pot +28 -1031
  12. odoo/addons/l10n_br_fiscal/i18n/pt_BR.po +1078 -1197
  13. odoo/addons/l10n_br_fiscal/models/__init__.py +2 -2
  14. odoo/addons/l10n_br_fiscal/models/comment.py +20 -18
  15. odoo/addons/l10n_br_fiscal/models/data_abstract.py +11 -12
  16. odoo/addons/l10n_br_fiscal/models/document.py +4 -30
  17. odoo/addons/l10n_br_fiscal/models/document_line.py +3 -16
  18. odoo/addons/l10n_br_fiscal/models/document_line_mixin.py +27 -1048
  19. odoo/addons/l10n_br_fiscal/models/document_line_mixin_methods.py +883 -0
  20. odoo/addons/l10n_br_fiscal/models/document_mixin.py +3 -241
  21. odoo/addons/l10n_br_fiscal/models/document_mixin_methods.py +239 -0
  22. odoo/addons/l10n_br_fiscal/models/document_serie.py +5 -3
  23. odoo/addons/l10n_br_fiscal/models/invalidate_number.py +0 -6
  24. odoo/addons/l10n_br_fiscal/models/operation.py +0 -11
  25. odoo/addons/l10n_br_fiscal/models/operation_dashboard.py +2 -3
  26. odoo/addons/l10n_br_fiscal/models/operation_line.py +0 -28
  27. odoo/addons/l10n_br_fiscal/models/partner_profile.py +0 -6
  28. odoo/addons/l10n_br_fiscal/models/product_template.py +0 -4
  29. odoo/addons/l10n_br_fiscal/models/res_company.py +0 -18
  30. odoo/addons/l10n_br_fiscal/models/res_partner.py +0 -17
  31. odoo/addons/l10n_br_fiscal/models/simplified_tax_range.py +0 -8
  32. odoo/addons/l10n_br_fiscal/models/tax_definition.py +2 -35
  33. odoo/addons/l10n_br_fiscal/security/ir.model.access.csv +0 -6
  34. odoo/addons/l10n_br_fiscal/static/description/index.html +8 -8
  35. odoo/addons/l10n_br_fiscal/tests/__init__.py +0 -1
  36. odoo/addons/l10n_br_fiscal/tests/test_cnae.py +2 -3
  37. odoo/addons/l10n_br_fiscal/tests/test_document_edition.py +10 -37
  38. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_generic.py +28 -4
  39. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_nfse.py +4 -0
  40. odoo/addons/l10n_br_fiscal/tests/test_service_type.py +2 -3
  41. odoo/addons/l10n_br_fiscal/tests/test_tax_benefit.py +4 -2
  42. odoo/addons/l10n_br_fiscal/views/cest_view.xml +2 -2
  43. odoo/addons/l10n_br_fiscal/views/cnae_view.xml +0 -1
  44. odoo/addons/l10n_br_fiscal/views/document_line_mixin_view.xml +170 -243
  45. odoo/addons/l10n_br_fiscal/views/document_line_view.xml +7 -11
  46. odoo/addons/l10n_br_fiscal/views/document_related_view.xml +15 -11
  47. odoo/addons/l10n_br_fiscal/views/document_serie_view.xml +1 -1
  48. odoo/addons/l10n_br_fiscal/views/document_view.xml +32 -44
  49. odoo/addons/l10n_br_fiscal/views/invalidate_number_view.xml +12 -12
  50. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_action.xml +0 -31
  51. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_menu.xml +2 -18
  52. odoo/addons/l10n_br_fiscal/views/nbm_view.xml +2 -2
  53. odoo/addons/l10n_br_fiscal/views/nbs_view.xml +1 -1
  54. odoo/addons/l10n_br_fiscal/views/ncm_view.xml +3 -3
  55. odoo/addons/l10n_br_fiscal/views/operation_dashboard_view.xml +27 -18
  56. odoo/addons/l10n_br_fiscal/views/operation_line_view.xml +2 -5
  57. odoo/addons/l10n_br_fiscal/views/operation_view.xml +39 -16
  58. odoo/addons/l10n_br_fiscal/views/partner_profile_view.xml +3 -6
  59. odoo/addons/l10n_br_fiscal/views/product_genre_view.xml +2 -2
  60. odoo/addons/l10n_br_fiscal/views/product_product_view.xml +17 -45
  61. odoo/addons/l10n_br_fiscal/views/product_template_view.xml +16 -35
  62. odoo/addons/l10n_br_fiscal/views/res_company_view.xml +17 -18
  63. odoo/addons/l10n_br_fiscal/views/res_config_settings_view.xml +37 -98
  64. odoo/addons/l10n_br_fiscal/views/res_partner_view.xml +3 -13
  65. odoo/addons/l10n_br_fiscal/views/service_type_view.xml +2 -3
  66. odoo/addons/l10n_br_fiscal/views/tax_definition_view.xml +60 -29
  67. odoo/addons/l10n_br_fiscal/views/tax_estimate_view.xml +2 -2
  68. odoo/addons/l10n_br_fiscal/views/tax_group_view.xml +4 -4
  69. odoo/addons/l10n_br_fiscal/views/tax_view.xml +14 -16
  70. odoo/addons/l10n_br_fiscal/wizards/document_import_wizard_mixin.py +1 -1
  71. odoo/addons/l10n_br_fiscal/wizards/document_import_wizard_mixin.xml +2 -5
  72. {odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info → odoo_addon_l10n_br_fiscal-17.0.4.0.0.1.dist-info}/METADATA +16 -16
  73. {odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info → odoo_addon_l10n_br_fiscal-17.0.4.0.0.1.dist-info}/RECORD +77 -88
  74. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.operation.indicator.csv +0 -27
  75. odoo/addons/l10n_br_fiscal/data/l10n_br_fiscal.tax.classification.csv +0 -163
  76. odoo/addons/l10n_br_fiscal/migrations/16.0.14.0.5/pre-migration.py +0 -15
  77. odoo/addons/l10n_br_fiscal/migrations/16.0.2.0.0/pre-migration.py +0 -25
  78. odoo/addons/l10n_br_fiscal/migrations/16.0.2.15.0/pre-migration.py +0 -19
  79. odoo/addons/l10n_br_fiscal/migrations/16.0.4.0.0/pre-migration.py +0 -220
  80. odoo/addons/l10n_br_fiscal/migrations/16.0.5.0.0/pre-migration.py +0 -33
  81. odoo/addons/l10n_br_fiscal/migrations/16.0.5.2.0/pre-migration.py +0 -21
  82. odoo/addons/l10n_br_fiscal/models/operation_indicator.py +0 -58
  83. odoo/addons/l10n_br_fiscal/models/tax_classification.py +0 -81
  84. odoo/addons/l10n_br_fiscal/tests/test_tax_classification.py +0 -110
  85. odoo/addons/l10n_br_fiscal/views/operation_indicator_view.xml +0 -75
  86. odoo/addons/l10n_br_fiscal/views/tax_classification.xml +0 -110
  87. /odoo/addons/l10n_br_fiscal/migrations/{16.0.13.0.0 → 17.0.2.0.0}/pre-migration.py +0 -0
  88. /odoo/addons/l10n_br_fiscal/migrations/{16.0.14.0.0 → 17.0.3.0.0}/pre-migration.py +0 -0
  89. {odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info → odoo_addon_l10n_br_fiscal-17.0.4.0.0.1.dist-info}/WHEEL +0 -0
  90. {odoo_addon_l10n_br_fiscal-16.0.19.4.0.dist-info → odoo_addon_l10n_br_fiscal-17.0.4.0.0.1.dist-info}/top_level.txt +0 -0
@@ -1,81 +0,0 @@
1
- # Copyright 2025 Marcel Savegnago <https://escodoo.com.br>
2
- # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3
-
4
- from odoo import api, fields, models
5
-
6
- from ..constants.fiscal import (
7
- TAX_DOMAIN_CBS,
8
- TAX_DOMAIN_IBS,
9
- TAX_RATE_TYPE,
10
- TAX_RATE_TYPE_DEFAULT,
11
- )
12
-
13
-
14
- class TaxClassification(models.Model):
15
- _name = "l10n_br_fiscal.tax.classification"
16
- _inherit = "l10n_br_fiscal.data.abstract"
17
- _order = "code"
18
- _description = "Tax Classification"
19
-
20
- code = fields.Char(size=8)
21
-
22
- description = fields.Text()
23
-
24
- cst_code_prefix_like = fields.Char(
25
- compute="_compute_cst_code_prefix_like",
26
- help="Helper field to filter taxes by CST code prefix (3 chars) using LIKE.",
27
- )
28
-
29
- @api.depends("code")
30
- def _compute_cst_code_prefix_like(self):
31
- for rec in self:
32
- prefix = (rec.code or "")[:3]
33
- # Avoid matching all records when the prefix is not available yet.
34
- rec.cst_code_prefix_like = (
35
- f"{prefix}%" if len(prefix) == 3 else "__no_match__%"
36
- )
37
-
38
- tax_ibs_id = fields.Many2one(
39
- comodel_name="l10n_br_fiscal.tax",
40
- string="Tax IBS",
41
- domain=(
42
- f"[('tax_domain', '=', '{TAX_DOMAIN_IBS}'), '|', "
43
- "('cst_in_id.code', 'like', cst_code_prefix_like), "
44
- "('cst_out_id.code', 'like', cst_code_prefix_like)]"
45
- ),
46
- )
47
-
48
- tax_cbs_id = fields.Many2one(
49
- comodel_name="l10n_br_fiscal.tax",
50
- string="Tax CBS",
51
- domain=(
52
- f"[('tax_domain', '=', '{TAX_DOMAIN_CBS}'), '|', "
53
- "('cst_in_id.code', 'like', cst_code_prefix_like), "
54
- "('cst_out_id.code', 'like', cst_code_prefix_like)]"
55
- ),
56
- )
57
-
58
- regular_taxation = fields.Boolean(
59
- default=False,
60
- )
61
-
62
- presumed_credit = fields.Boolean(
63
- default=False,
64
- )
65
-
66
- credit_reversal = fields.Boolean(
67
- default=False,
68
- )
69
-
70
- rate_type = fields.Selection(
71
- selection=TAX_RATE_TYPE,
72
- default=TAX_RATE_TYPE_DEFAULT,
73
- required=True,
74
- )
75
-
76
- document_type_ids = fields.Many2many(
77
- comodel_name="l10n_br_fiscal.document.type",
78
- relation="tax_classification_document_type_rel",
79
- string="Related DFes",
80
- help="Related Digital Fiscal Documents",
81
- )
@@ -1,110 +0,0 @@
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
- )
@@ -1,75 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8" ?>
2
- <odoo>
3
- <record id="operation_indicator_tree" model="ir.ui.view">
4
- <field name="name">l10n_br_fiscal.operation.indicator.tree</field>
5
- <field name="model">l10n_br_fiscal.operation.indicator</field>
6
- <field name="arch" type="xml">
7
- <tree>
8
- <field name="code" />
9
- <field name="name" />
10
- <field name="supply_location" />
11
- <field name="active" invisible="1" />
12
- </tree>
13
- </field>
14
- </record>
15
-
16
- <record id="operation_indicator_form" model="ir.ui.view">
17
- <field name="name">l10n_br_fiscal.operation.indicator.form</field>
18
- <field name="model">l10n_br_fiscal.operation.indicator</field>
19
- <field name="arch" type="xml">
20
- <form string="Operation Indicator">
21
- <sheet>
22
- <group>
23
- <group>
24
- <field name="code" />
25
- <field name="name" />
26
- </group>
27
- </group>
28
- <notebook>
29
- <page string="Operation Details">
30
- <group>
31
- <field
32
- name="operation_type"
33
- placeholder="Type of operation"
34
- />
35
- <field
36
- name="operation_location"
37
- placeholder="Where the operation is considered"
38
- />
39
- </group>
40
- </page>
41
- <page string="Supply Information">
42
- <group>
43
- <field
44
- name="supply_characteristic"
45
- placeholder="Supply characteristic"
46
- />
47
- <field
48
- name="supply_location"
49
- placeholder="Place of supply"
50
- />
51
- </group>
52
- </page>
53
- </notebook>
54
- </sheet>
55
- </form>
56
- </field>
57
- </record>
58
-
59
- <record id="operation_indicator_search" model="ir.ui.view">
60
- <field name="name">l10n_br_fiscal.operation.indicator.search</field>
61
- <field name="model">l10n_br_fiscal.operation.indicator</field>
62
- <field name="arch" type="xml">
63
- <search string="Operation Indicator">
64
- <field name="code" />
65
- <field name="name" />
66
- <field name="supply_location" />
67
- <filter
68
- string="Archived"
69
- name="inactive"
70
- domain="[('active', '=', False)]"
71
- />
72
- </search>
73
- </field>
74
- </record>
75
- </odoo>
@@ -1,110 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8" ?>
2
- <!-- Copyright 2025 Marcel Savegnago <https://escodoo.com.br>
3
- License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
4
- <odoo>
5
-
6
- <record id="tax_classification_search" model="ir.ui.view">
7
- <field name="model">l10n_br_fiscal.tax.classification</field>
8
- <field name="arch" type="xml">
9
- <search string="Tax Classification">
10
- <field name="code" />
11
- <field name="name" />
12
- <group expand="0" string="Group By...">
13
- <filter
14
- string="Rate Type"
15
- name="rate_type"
16
- domain="[]"
17
- context="{'group_by': 'rate_type'}"
18
- />
19
- <filter
20
- string="Regular Taxation"
21
- name="regular_taxation"
22
- domain="[('regular_taxation', '=', True)]"
23
- />
24
- <filter
25
- string="Presumed Credit"
26
- name="presumed_credit"
27
- domain="[('presumed_credit', '=', True)]"
28
- />
29
- </group>
30
- </search>
31
- </field>
32
- </record>
33
-
34
- <record id="tax_classification_tree" model="ir.ui.view">
35
- <field name="model">l10n_br_fiscal.tax.classification</field>
36
- <field name="arch" type="xml">
37
- <tree>
38
- <field name="code" />
39
- <field name="name" />
40
- <field name="cst_code_prefix_like" invisible="1" />
41
- <field name="tax_ibs_id" />
42
- <field name="tax_cbs_id" />
43
- <field name="regular_taxation" string="Regular Taxation" />
44
- <field name="presumed_credit" string="Presumed Credit" />
45
- <field name="credit_reversal" string="Credit Reversal" />
46
- <field name="rate_type" string="Rate Type" />
47
- <field
48
- name="document_type_ids"
49
- widget="many2many_tags"
50
- string="Related DFes"
51
- />
52
- </tree>
53
- </field>
54
- </record>
55
-
56
- <record id="tax_classification_form" model="ir.ui.view">
57
- <field name="model">l10n_br_fiscal.tax.classification</field>
58
- <field name="arch" type="xml">
59
- <form string="Tax Classification">
60
- <field name="id" invisible="1" />
61
- <sheet>
62
- <group>
63
- <group>
64
- <field name="code" />
65
- <field name="name" />
66
- <field name="cst_code_prefix_like" invisible="1" />
67
- <field name="description" />
68
- <field name="rate_type" />
69
- </group>
70
- </group>
71
- <group string="Taxes">
72
- <group>
73
- <field name="tax_ibs_id" />
74
- </group>
75
- <group>
76
- <field name="tax_cbs_id" />
77
- </group>
78
- </group>
79
- <group string="Tax Indicators">
80
- <group>
81
- <field name="regular_taxation" />
82
- </group>
83
- <group>
84
- <field name="presumed_credit" />
85
- </group>
86
- <group>
87
- <field name="credit_reversal" />
88
- </group>
89
- </group>
90
- <group string="Related Digital Fiscal Documents">
91
- <field
92
- name="document_type_ids"
93
- widget="many2many_tags"
94
- options="{'no_create': True, 'no_create_edit': True}"
95
- />
96
- </group>
97
- </sheet>
98
- </form>
99
- </field>
100
- </record>
101
-
102
- <record id="tax_classification_act_window" model="ir.actions.act_window">
103
- <field name="name">Tax Classification</field>
104
- <field name="res_model">l10n_br_fiscal.tax.classification</field>
105
- <field name="view_mode">tree,form</field>
106
- <field name="domain">[]</field>
107
- <field name="context">{}</field>
108
- </record>
109
-
110
- </odoo>