odoo-addon-l10n-br-fiscal 15.0.1.20.4__py3-none-any.whl → 15.0.2.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 (53) hide show
  1. odoo/addons/l10n_br_fiscal/README.rst +1 -1
  2. odoo/addons/l10n_br_fiscal/__manifest__.py +2 -12
  3. odoo/addons/l10n_br_fiscal/i18n/l10n_br_fiscal.pot +8 -804
  4. odoo/addons/l10n_br_fiscal/i18n/pt_BR.po +297 -826
  5. odoo/addons/l10n_br_fiscal/migrations/16.0.2.0.0/pre-migration.py +25 -0
  6. odoo/addons/l10n_br_fiscal/models/__init__.py +0 -12
  7. odoo/addons/l10n_br_fiscal/models/document.py +62 -20
  8. odoo/addons/l10n_br_fiscal/models/invalidate_number.py +0 -44
  9. odoo/addons/l10n_br_fiscal/models/ncm.py +27 -0
  10. odoo/addons/l10n_br_fiscal/models/tax_definition.py +189 -1
  11. odoo/addons/l10n_br_fiscal/security/ir.model.access.csv +0 -5
  12. odoo/addons/l10n_br_fiscal/static/description/index.html +1 -1
  13. odoo/addons/l10n_br_fiscal/tests/__init__.py +0 -1
  14. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_generic.py +0 -48
  15. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_nfse.py +0 -2
  16. odoo/addons/l10n_br_fiscal/tests/test_subsequent_operation.py +2 -1
  17. odoo/addons/l10n_br_fiscal/tests/test_tax_benefit.py +0 -21
  18. odoo/addons/l10n_br_fiscal/views/document_view.xml +3 -67
  19. odoo/addons/l10n_br_fiscal/views/invalidate_number_view.xml +2 -7
  20. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_action.xml +0 -34
  21. odoo/addons/l10n_br_fiscal/views/l10n_br_fiscal_menu.xml +0 -19
  22. odoo/addons/l10n_br_fiscal/wizards/__init__.py +0 -6
  23. odoo/addons/l10n_br_fiscal/wizards/base_wizard_mixin.py +0 -5
  24. odoo/addons/l10n_br_fiscal/wizards/document_status_wizard.py +2 -0
  25. {odoo_addon_l10n_br_fiscal-15.0.1.20.4.dist-info → odoo_addon_l10n_br_fiscal-15.0.2.1.0.dist-info}/METADATA +3 -3
  26. {odoo_addon_l10n_br_fiscal-15.0.1.20.4.dist-info → odoo_addon_l10n_br_fiscal-15.0.2.1.0.dist-info}/RECORD +28 -52
  27. odoo/addons/l10n_br_fiscal/models/document_eletronic.py +0 -234
  28. odoo/addons/l10n_br_fiscal/models/document_event.py +0 -392
  29. odoo/addons/l10n_br_fiscal/models/document_workflow.py +0 -396
  30. odoo/addons/l10n_br_fiscal/models/ncm_cest.py +0 -17
  31. odoo/addons/l10n_br_fiscal/models/ncm_nbm.py +0 -17
  32. odoo/addons/l10n_br_fiscal/models/ncm_tax_pis_cofins.py +0 -17
  33. odoo/addons/l10n_br_fiscal/models/tax_definition_benefit.py +0 -118
  34. odoo/addons/l10n_br_fiscal/models/tax_definition_cfop.py +0 -35
  35. odoo/addons/l10n_br_fiscal/models/tax_definition_company.py +0 -28
  36. odoo/addons/l10n_br_fiscal/models/tax_definition_icms.py +0 -35
  37. odoo/addons/l10n_br_fiscal/models/tax_definition_operation_line.py +0 -36
  38. odoo/addons/l10n_br_fiscal/models/tax_definition_partner_profile.py +0 -32
  39. odoo/addons/l10n_br_fiscal/tests/test_workflow.py +0 -118
  40. odoo/addons/l10n_br_fiscal/views/document_event_report.xml +0 -15
  41. odoo/addons/l10n_br_fiscal/views/document_event_template.xml +0 -114
  42. odoo/addons/l10n_br_fiscal/views/document_event_view.xml +0 -68
  43. odoo/addons/l10n_br_fiscal/wizards/document_cancel_wizard.py +0 -20
  44. odoo/addons/l10n_br_fiscal/wizards/document_cancel_wizard.xml +0 -30
  45. odoo/addons/l10n_br_fiscal/wizards/document_correction_wizard.py +0 -17
  46. odoo/addons/l10n_br_fiscal/wizards/document_correction_wizard.xml +0 -30
  47. odoo/addons/l10n_br_fiscal/wizards/document_import_wizard_mixin.py +0 -132
  48. odoo/addons/l10n_br_fiscal/wizards/document_import_wizard_mixin.xml +0 -44
  49. odoo/addons/l10n_br_fiscal/wizards/document_status_wizard.xml +0 -58
  50. odoo/addons/l10n_br_fiscal/wizards/invalidate_number_wizard.py +0 -29
  51. odoo/addons/l10n_br_fiscal/wizards/invalidate_number_wizard.xml +0 -30
  52. {odoo_addon_l10n_br_fiscal-15.0.1.20.4.dist-info → odoo_addon_l10n_br_fiscal-15.0.2.1.0.dist-info}/WHEEL +0 -0
  53. {odoo_addon_l10n_br_fiscal-15.0.1.20.4.dist-info → odoo_addon_l10n_br_fiscal-15.0.2.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,25 @@
1
+ # Copyright (C) 2024 - TODAY - Raphaël Valyi - Akretion <raphael.valyi@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
+ to_install = "l10n_br_fiscal_edi"
7
+
8
+
9
+ def install_new_modules(cr):
10
+ sql = f"""
11
+ UPDATE ir_module_module
12
+ SET state='to install'
13
+ WHERE name = '{to_install}' AND state='uninstalled'
14
+ """
15
+ openupgrade.logged_query(cr, sql)
16
+
17
+
18
+ @openupgrade.migrate()
19
+ def migrate(env, version):
20
+ install_new_modules(env.cr)
21
+ query = """
22
+ DELETE FROM ir_model_fields
23
+ WHERE model = 'l10n_br_fiscal.document.electronic'
24
+ """
25
+ openupgrade.logged_query(env.cr, query)
@@ -3,15 +3,12 @@
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_workflow
7
6
  from . import document_fiscal_mixin_methods
8
7
  from . import document_fiscal_mixin_fields
9
8
  from . import document_fiscal_mixin
10
9
  from . import document_move_mixin
11
10
  from . import document_fiscal_line_mixin_methods
12
11
  from . import document_fiscal_line_mixin
13
- from . import document_event
14
- from . import document_eletronic
15
12
  from . import invalidate_number
16
13
  from . import comment
17
14
  from . import ibpt
@@ -22,26 +19,17 @@ from . import nbs
22
19
  from . import service_type
23
20
  from . import ncm
24
21
  from . import nbm
25
- from . import ncm_nbm
26
22
  from . import cest
27
- from . import ncm_cest
28
23
  from . import tax_group
29
24
  from . import tax
30
25
  from . import tax_pis_cofins
31
26
  from . import tax_pis_cofins_base
32
27
  from . import tax_pis_cofins_credit
33
- from . import ncm_tax_pis_cofins
34
28
  from . import tax_ipi_control_seal
35
29
  from . import tax_ipi_guideline
36
30
  from . import tax_ipi_guideline_class
37
31
  from . import tax_estimate
38
32
  from . import tax_definition
39
- from . import tax_definition_benefit
40
- from . import tax_definition_company
41
- from . import tax_definition_cfop
42
- from . import tax_definition_icms
43
- from . import tax_definition_operation_line
44
- from . import tax_definition_partner_profile
45
33
  from . import icms_regulation
46
34
  from . import icms_relief
47
35
  from . import document_type
@@ -10,6 +10,7 @@ from odoo import _, api, fields, models
10
10
  from odoo.exceptions import ValidationError
11
11
 
12
12
  from ..constants.fiscal import (
13
+ DOCUMENT_ISSUER,
13
14
  DOCUMENT_ISSUER_COMPANY,
14
15
  DOCUMENT_ISSUER_DICT,
15
16
  DOCUMENT_ISSUER_PARTNER,
@@ -20,10 +21,13 @@ from ..constants.fiscal import (
20
21
  MODELO_FISCAL_NFCE,
21
22
  MODELO_FISCAL_NFE,
22
23
  MODELO_FISCAL_NFSE,
24
+ SITUACAO_EDOC,
23
25
  SITUACAO_EDOC_AUTORIZADA,
24
26
  SITUACAO_EDOC_CANCELADA,
25
27
  SITUACAO_EDOC_DENEGADA,
28
+ SITUACAO_EDOC_EM_DIGITACAO,
26
29
  SITUACAO_EDOC_INUTILIZADA,
30
+ SITUACAO_FISCAL,
27
31
  )
28
32
 
29
33
 
@@ -49,7 +53,6 @@ class Document(models.Model):
49
53
  _name = "l10n_br_fiscal.document"
50
54
  _inherit = [
51
55
  "l10n_br_fiscal.document.mixin.fields",
52
- "l10n_br_fiscal.document.electronic",
53
56
  "l10n_br_fiscal.document.move.mixin",
54
57
  "mail.thread",
55
58
  ]
@@ -62,6 +65,25 @@ class Document(models.Model):
62
65
  index=True,
63
66
  )
64
67
 
68
+ state_edoc = fields.Selection(
69
+ selection=SITUACAO_EDOC,
70
+ string="Situação e-doc",
71
+ default=SITUACAO_EDOC_EM_DIGITACAO,
72
+ copy=False,
73
+ required=True,
74
+ readonly=True,
75
+ # tracking=True,
76
+ index=True,
77
+ )
78
+
79
+ state_fiscal = fields.Selection(
80
+ selection=SITUACAO_FISCAL,
81
+ string="Situação Fiscal",
82
+ copy=False,
83
+ # tracking=True,
84
+ index=True,
85
+ )
86
+
65
87
  fiscal_operation_id = fields.Many2one(
66
88
  domain="[('state', '=', 'approved'), "
67
89
  "'|', ('fiscal_operation_type', '=', fiscal_operation_type),"
@@ -140,23 +162,6 @@ class Document(models.Model):
140
162
  default=EDOC_PURPOSE_NORMAL,
141
163
  )
142
164
 
143
- event_ids = fields.One2many(
144
- comodel_name="l10n_br_fiscal.event",
145
- inverse_name="document_id",
146
- string="Events",
147
- copy=False,
148
- readonly=True,
149
- )
150
-
151
- correction_event_ids = fields.One2many(
152
- comodel_name="l10n_br_fiscal.event",
153
- inverse_name="document_id",
154
- domain=[("type", "=", "14")],
155
- string="Correction Events",
156
- copy=False,
157
- readonly=True,
158
- )
159
-
160
165
  document_type = fields.Char(
161
166
  string="Document Type Code",
162
167
  related="document_type_id.code",
@@ -171,10 +176,16 @@ class Document(models.Model):
171
176
  copy=False,
172
177
  )
173
178
 
174
- # Você não vai poder fazer isso em modelos que tem state
175
- # TODO Porque não usar o campo state do fiscal.document???
179
+ # this related "state" field is required for the status bar widget
180
+ # while state_edoc avoids colliding with the state field
181
+ # of objects where the fiscal mixin might be injected.
176
182
  state = fields.Selection(related="state_edoc", string="State")
177
183
 
184
+ issuer = fields.Selection(
185
+ selection=DOCUMENT_ISSUER,
186
+ default=DOCUMENT_ISSUER_COMPANY,
187
+ )
188
+
178
189
  document_subsequent_ids = fields.One2many(
179
190
  comodel_name="l10n_br_fiscal.subsequent.document",
180
191
  inverse_name="source_document_id",
@@ -404,6 +415,37 @@ class Document(models.Model):
404
415
 
405
416
  return action
406
417
 
418
+ # the following actions are meant to be implemented in other modules such as
419
+ # l10n_br_fiscal_edi. They are defined here so they can be overriden in modules
420
+ # that don't depend on l10n_br_fiscal_edi (such as l10n_br_account).
421
+ def view_pdf(self):
422
+ pass
423
+
424
+ def view_xml(self):
425
+ pass
426
+
427
+ def action_document_confirm(self):
428
+ pass
429
+
430
+ def action_document_send(self):
431
+ pass
432
+
433
+ def action_document_back2draft(self):
434
+ pass
435
+
436
+ def action_document_cancel(self):
437
+ pass
438
+
439
+ def action_document_invalidate(self):
440
+ pass
441
+
442
+ def action_document_correction(self):
443
+ pass
444
+
445
+ def exec_after_SITUACAO_EDOC_DENEGADA(self, old_state, new_state):
446
+ # see https://github.com/OCA/l10n-brazil/pull/3272
447
+ pass
448
+
407
449
  def _get_email_template(self, state):
408
450
  self.ensure_one()
409
451
  return self.document_type_id.document_email_ids.search(
@@ -82,50 +82,6 @@ class InvalidateNumber(models.Model):
82
82
  default="draft",
83
83
  )
84
84
 
85
- event_ids = fields.One2many(
86
- comodel_name="l10n_br_fiscal.event",
87
- inverse_name="invalidate_number_id",
88
- string="Events",
89
- readonly=True,
90
- states={"done": [("readonly", True)]},
91
- )
92
-
93
- # Authorization Event Related Fields
94
- authorization_event_id = fields.Many2one(
95
- comodel_name="l10n_br_fiscal.event",
96
- string="Authorization Event",
97
- readonly=True,
98
- copy=False,
99
- )
100
-
101
- authorization_date = fields.Datetime(
102
- string="Authorization Date",
103
- readonly=True,
104
- related="authorization_event_id.protocol_date",
105
- )
106
-
107
- authorization_protocol = fields.Char(
108
- string="Authorization Protocol",
109
- related="authorization_event_id.protocol_number",
110
- readonly=True,
111
- )
112
-
113
- send_file_id = fields.Many2one(
114
- comodel_name="ir.attachment",
115
- related="authorization_event_id.file_request_id",
116
- string="Send Document File XML",
117
- ondelete="restrict",
118
- readonly=True,
119
- )
120
-
121
- authorization_file_id = fields.Many2one(
122
- comodel_name="ir.attachment",
123
- related="authorization_event_id.file_response_id",
124
- string="Authorization File XML",
125
- ondelete="restrict",
126
- readonly=True,
127
- )
128
-
129
85
  @api.constrains("number_start", "number_end")
130
86
  def _check_range(self):
131
87
  for record in self:
@@ -51,6 +51,33 @@ class Ncm(models.Model):
51
51
  string="Tax Definition",
52
52
  )
53
53
 
54
+ cest_ids = fields.Many2many(
55
+ comodel_name="l10n_br_fiscal.cest",
56
+ relation="fiscal_cest_ncm_rel",
57
+ column1="ncm_id",
58
+ column2="cest_id",
59
+ readonly=True,
60
+ string="CESTs",
61
+ )
62
+
63
+ nbm_ids = fields.Many2many(
64
+ comodel_name="l10n_br_fiscal.nbm",
65
+ relation="fiscal_nbm_ncm_rel",
66
+ column1="ncm_id",
67
+ column2="nbm_id",
68
+ readonly=True,
69
+ string="NBMs",
70
+ )
71
+
72
+ piscofins_ids = fields.Many2many(
73
+ comodel_name="l10n_br_fiscal.tax.pis.cofins",
74
+ relation="fiscal_pis_cofins_ncm_rel",
75
+ column1="ncm_id",
76
+ column2="piscofins_id",
77
+ readonly=True,
78
+ string="PIS/COFINS",
79
+ )
80
+
54
81
  _sql_constraints = [
55
82
  (
56
83
  "fiscal_ncm_code_exception_uniq",
@@ -2,7 +2,7 @@
2
2
  # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
3
3
 
4
4
  from odoo import _, api, fields, models
5
- from odoo.exceptions import UserError
5
+ from odoo.exceptions import UserError, ValidationError
6
6
 
7
7
  from .. import tools
8
8
  from ..constants.fiscal import (
@@ -12,6 +12,7 @@ from ..constants.fiscal import (
12
12
  OPERATION_STATE,
13
13
  OPERATION_STATE_DEFAULT,
14
14
  )
15
+ from ..constants.icms import ICMS_TAX_BENEFIT_TYPE
15
16
 
16
17
 
17
18
  class TaxDefinition(models.Model):
@@ -41,6 +42,19 @@ class TaxDefinition(models.Model):
41
42
 
42
43
  display_name = fields.Char(compute="_compute_display_name", store=True)
43
44
 
45
+ code = fields.Char(
46
+ size=8,
47
+ states={"draft": [("readonly", False)]},
48
+ )
49
+
50
+ name = fields.Char(
51
+ states={"draft": [("readonly", False)]},
52
+ )
53
+
54
+ description = fields.Text(
55
+ states={"draft": [("readonly", False)]},
56
+ )
57
+
44
58
  type_in_out = fields.Selection(
45
59
  selection=FISCAL_IN_OUT,
46
60
  string="Type",
@@ -238,6 +252,31 @@ class TaxDefinition(models.Model):
238
252
  domain="['|', ('cst_in_id', '=', cst_id), ('cst_out_id', '=', cst_id)]",
239
253
  )
240
254
 
255
+ fiscal_profile_id = fields.Many2one(
256
+ comodel_name="l10n_br_fiscal.partner.profile", string="Partner Profile"
257
+ )
258
+
259
+ fiscal_operation_line_id = fields.Many2one(
260
+ comodel_name="l10n_br_fiscal.operation.line", string="Operation Line"
261
+ )
262
+
263
+ icms_regulation_id = fields.Many2one(
264
+ comodel_name="l10n_br_fiscal.icms.regulation", string="ICMS Regulation"
265
+ )
266
+
267
+ cfop_id = fields.Many2one(comodel_name="l10n_br_fiscal.cfop", string="CFOP")
268
+
269
+ is_benefit = fields.Boolean(
270
+ string="Benefit?",
271
+ readonly=True,
272
+ states={"draft": [("readonly", False)]},
273
+ )
274
+
275
+ benefit_type = fields.Selection(
276
+ selection=ICMS_TAX_BENEFIT_TYPE,
277
+ states={"draft": [("readonly", False)]},
278
+ )
279
+
241
280
  def _get_search_domain(self, tax_definition):
242
281
  """Create domain to be used in contraints methods"""
243
282
  domain = [
@@ -247,6 +286,34 @@ class TaxDefinition(models.Model):
247
286
  ("tax_group_id", "=", tax_definition.tax_group_id.id),
248
287
  ("tax_id", "=", tax_definition.tax_id.id),
249
288
  ]
289
+ if tax_definition.icms_regulation_id:
290
+ domain.append(
291
+ ("icms_regulation_id", "=", tax_definition.icms_regulation_id.id),
292
+ )
293
+ if tax_definition.icms_regulation_id and tax_definition.is_benefit:
294
+ domain.append(
295
+ ("is_benefit", "=", tax_definition.is_benefit),
296
+ )
297
+ if tax_definition.ncm_ids:
298
+ domain.append(
299
+ ("ncm_ids", "in", tax_definition.ncm_ids.ids),
300
+ )
301
+ if tax_definition.cest_ids:
302
+ domain.append(
303
+ ("cest_ids", "in", tax_definition.cest_ids.ids),
304
+ )
305
+ if tax_definition.nbm_ids:
306
+ domain.append(
307
+ ("nbm_ids", "in", tax_definition.nbm_ids.ids),
308
+ )
309
+ if tax_definition.product_ids:
310
+ domain.append(
311
+ ("product_ids", "in", tax_definition.product_ids.ids),
312
+ )
313
+ if tax_definition.ncm_exception:
314
+ domain.append(
315
+ ("ncm_exception", "=", tax_definition.ncm_exception),
316
+ )
250
317
  return domain
251
318
 
252
319
  def action_review(self):
@@ -415,3 +482,124 @@ class TaxDefinition(models.Model):
415
482
  self.cst_id = self.tax_id.cst_out_id
416
483
  else:
417
484
  self.cst_id = self.tax_id.cst_in_id
485
+
486
+ @api.onchange("cfop_id")
487
+ def _onchange_cfop_id(self):
488
+ if self.cfop_id:
489
+ self.type_in_out = self.cfop_id.type_in_out
490
+
491
+ @api.constrains("fiscal_profile_id")
492
+ def _check_fiscal_profile_id(self):
493
+ for record in self:
494
+ if record.fiscal_profile_id:
495
+ domain = [
496
+ ("id", "!=", record.id),
497
+ ("fiscal_profile_id", "=", record.fiscal_profile_id.id),
498
+ ("tax_group_id", "=", record.tax_group_id.id),
499
+ ("tax_id", "=", record.tax_id.id),
500
+ ]
501
+
502
+ if record.env["l10n_br_fiscal.tax.definition"].search_count(domain):
503
+ raise ValidationError(
504
+ _(
505
+ "Tax Definition already exists "
506
+ "for this Partner Profile and Tax Group !"
507
+ )
508
+ )
509
+
510
+ @api.constrains("fiscal_operation_line_id")
511
+ def _check_fiscal_operation_line_id(self):
512
+ for record in self:
513
+ if record.fiscal_operation_line_id:
514
+ domain = [
515
+ ("id", "!=", record.id),
516
+ (
517
+ "fiscal_operation_line_id",
518
+ "=",
519
+ record.fiscal_operation_line_id.id,
520
+ ),
521
+ ("tax_group_id", "=", record.tax_group_id.id),
522
+ ("tax_id", "=", record.tax_id.id),
523
+ ]
524
+
525
+ if record.env["l10n_br_fiscal.tax.definition"].search_count(domain):
526
+ raise ValidationError(
527
+ _(
528
+ "Tax Definition already exists "
529
+ "for this Operation Line and Tax Group !"
530
+ )
531
+ )
532
+
533
+ @api.constrains("icms_regulation_id", "state_from_id")
534
+ def _check_icms(self):
535
+ for record in self:
536
+ if record.icms_regulation_id:
537
+ domain = self._get_search_domain(record)
538
+ if record.env["l10n_br_fiscal.tax.definition"].search_count(domain):
539
+ raise ValidationError(
540
+ _(
541
+ "Tax Definition already exists "
542
+ "for this ICMS and Tax Group !"
543
+ )
544
+ )
545
+
546
+ @api.constrains("company_id")
547
+ def _check_company_id(self):
548
+ for record in self:
549
+ if record.company_id:
550
+ domain = [
551
+ ("id", "!=", record.id),
552
+ ("company_id", "=", record.company_id.id),
553
+ ("tax_group_id", "=", record.tax_group_id.id),
554
+ ("tax_id", "=", record.tax_id.id),
555
+ ]
556
+
557
+ if record.env["l10n_br_fiscal.tax.definition"].search_count(domain):
558
+ raise ValidationError(
559
+ _(
560
+ "Tax Definition already exists "
561
+ "for this Company and Tax Group !"
562
+ )
563
+ )
564
+
565
+ @api.constrains("cfop_id")
566
+ def _check_cfop_id(self):
567
+ for record in self:
568
+ if record.cfop_id:
569
+ domain = [
570
+ ("id", "!=", record.id),
571
+ ("cfop_id", "=", record.cfop_id.id),
572
+ ("tax_group_id", "=", record.tax_group_id.id),
573
+ ("tax_id", "=", record.tax_id.id),
574
+ ]
575
+
576
+ if record.env["l10n_br_fiscal.tax.definition"].search_count(domain):
577
+ raise ValidationError(
578
+ _(
579
+ "Tax Definition already exists "
580
+ "for this CFOP and Tax Group !"
581
+ )
582
+ )
583
+
584
+ @api.constrains("is_benefit", "code", "benefit_type", "state_from_id")
585
+ def _check_tax_benefit_code(self):
586
+ for record in self:
587
+ if record.is_benefit:
588
+ if record.code:
589
+ if len(record.code) != 8:
590
+ raise ValidationError(
591
+ _("Tax benefit code must be 8 characters!")
592
+ )
593
+
594
+ if record.code[:2].upper() != record.state_from_id.code.upper():
595
+ raise ValidationError(
596
+ _("Tax benefit code must be start with state code!")
597
+ )
598
+
599
+ if record.code[3:4] != record.benefit_type:
600
+ raise ValidationError(
601
+ _(
602
+ "The tax benefit code must contain "
603
+ "the type of benefit!"
604
+ )
605
+ )
@@ -93,14 +93,9 @@
93
93
  "uom_alternative_user","UOM alternative for User","model_uom_uom_alternative","l10n_br_fiscal.group_user",1,0,0,0
94
94
  "uom_alternative_manager","UOM alternative for Manager","model_uom_uom_alternative","l10n_br_fiscal.group_manager",1,0,0,0
95
95
  "uom_alternative_maintenance","UOM alternative for Maintenance","model_uom_uom_alternative","l10n_br_fiscal.group_data_maintenance",1,1,1,1
96
- "l10n_br_fiscal_event_user","Fiscal Document Event for User","model_l10n_br_fiscal_event","l10n_br_fiscal.group_user",1,1,1,0
97
96
  "l10n_br_fiscal_invalidate_number_user","user_l10n_br_fiscal_invalidate_number","model_l10n_br_fiscal_invalidate_number","l10n_br_fiscal.group_user",1,0,0,0
98
97
  "l10n_br_fiscal_invalidate_number_manager","manager_l10n_br_fiscal_invalidate_number","model_l10n_br_fiscal_invalidate_number","l10n_br_fiscal.group_manager",1,1,1,1
99
98
  "l10n_br_fiscal_city_taxation_code_user","Fiscal City Taxation Code for User","model_l10n_br_fiscal_city_taxation_code","l10n_br_fiscal.group_user",1,1,1,0
100
99
  "l10n_br_fiscal_city_taxation_code_manager","Fiscal City Taxation Code for Manager","model_l10n_br_fiscal_city_taxation_code","l10n_br_fiscal.group_user",1,1,1,1
101
100
  "l10n_br_fiscal_base_wizard_mixin_user",l10n_br_fiscal_base_wizard_mixin,model_l10n_br_fiscal_base_wizard_mixin,base.group_user,1,1,1,1
102
- "l10n_br_fiscal_document_cancel_wizard_user",l10n_br_fiscal_document_cancel_wizard,model_l10n_br_fiscal_document_cancel_wizard,base.group_user,1,1,1,1
103
- "l10n_br_fiscal_document_correction_wizard_user",l10n_br_fiscal_document_correction_wizard,model_l10n_br_fiscal_document_correction_wizard,base.group_user,1,1,1,1
104
101
  "l10n_br_fiscal_document_status_wizard_user",l10n_br_fiscal_document_status_wizard,model_l10n_br_fiscal_document_status_wizard,base.group_user,1,1,1,1
105
- "l10n_br_fiscal_invalidate_number_wizard_user",l10n_br_fiscal_invalidate_number_wizard,model_l10n_br_fiscal_invalidate_number_wizard,base.group_user,1,1,1,1
106
- "l10n_br_fiscal_document_import_wizard_mixin_user",l10n_br_fiscal_document_import_wizard_mixin_user,model_l10n_br_fiscal_document_import_wizard_mixin,base.group_user,1,1,1,1
@@ -367,7 +367,7 @@ ul.auto-toc {
367
367
  !! This file is generated by oca-gen-addon-readme !!
368
368
  !! changes will be overwritten. !!
369
369
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
370
- !! source digest: sha256:0e8d9c3715f54b1a132a180c05dcde4f1f0cabe022d66d99064006eaa2635fb6
370
+ !! source digest: sha256:bd6e457ae9e21f0060721e5351b2778eba1f71bb760b9a3a96053d2b11e045af
371
371
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
372
372
  <p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Production/Stable" src="https://img.shields.io/badge/maturity-Production%2FStable-green.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/l10n-brazil/tree/15.0/l10n_br_fiscal"><img alt="OCA/l10n-brazil" src="https://img.shields.io/badge/github-OCA%2Fl10n--brazil-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/l10n-brazil-15-0/l10n-brazil-15-0-l10n_br_fiscal"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/l10n-brazil&amp;target_branch=15.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
373
373
  <img alt="https://raw.githubusercontent.com/OCA/l10n-brazil/15.0/l10n_br_fiscal/static/img/fiscal_dashboard.png" src="https://raw.githubusercontent.com/OCA/l10n-brazil/15.0/l10n_br_fiscal/static/img/fiscal_dashboard.png" />
@@ -14,5 +14,4 @@ from . import (
14
14
  test_service_type,
15
15
  test_subsequent_operation,
16
16
  test_uom_uom,
17
- test_workflow,
18
17
  )
@@ -5,12 +5,6 @@
5
5
 
6
6
  from odoo.tests import TransactionCase
7
7
 
8
- from ..constants.fiscal import (
9
- SITUACAO_EDOC_A_ENVIAR,
10
- SITUACAO_EDOC_AUTORIZADA,
11
- SITUACAO_EDOC_CANCELADA,
12
- SITUACAO_EDOC_EM_DIGITACAO,
13
- )
14
8
  from ..constants.icms import ICMS_ORIGIN_TAX_IMPORTED
15
9
 
16
10
 
@@ -172,26 +166,9 @@ class TestFiscalDocumentGeneric(TransactionCase):
172
166
 
173
167
  self.nfe_same_state.action_document_confirm()
174
168
 
175
- self.assertEqual(
176
- self.nfe_same_state.state_edoc,
177
- SITUACAO_EDOC_A_ENVIAR,
178
- "Document is not in To Sent state",
179
- )
180
-
181
- self.nfe_same_state.action_document_send()
182
-
183
- self.assertEqual(
184
- self.nfe_same_state.state_edoc,
185
- SITUACAO_EDOC_AUTORIZADA,
186
- "Document is not in Authorized state",
187
- )
188
-
189
169
  # Total value of the products
190
170
  self.assertEqual(self.nfe_same_state.amount_price_gross, 200)
191
171
 
192
- result = self.nfe_same_state.action_document_cancel()
193
- self.assertTrue(result)
194
-
195
172
  def test_nfe_other_state(self):
196
173
  """Test NFe other state."""
197
174
 
@@ -1164,28 +1141,3 @@ class TestFiscalDocumentGeneric(TransactionCase):
1164
1141
  "Unexpected value for the field"
1165
1142
  " Other Values in Fiscal Document line",
1166
1143
  )
1167
-
1168
- def test_nfe_purchase_same_state(self):
1169
- self.nfe_purchase_same_state.action_document_confirm()
1170
-
1171
- self.assertEqual(
1172
- self.nfe_purchase_same_state.state_edoc,
1173
- SITUACAO_EDOC_AUTORIZADA,
1174
- "Document is not in Authorized state",
1175
- )
1176
-
1177
- self.nfe_purchase_same_state.action_document_back2draft()
1178
-
1179
- self.assertEqual(
1180
- self.nfe_purchase_same_state.state_edoc,
1181
- SITUACAO_EDOC_EM_DIGITACAO,
1182
- "Document is not in Draft state",
1183
- )
1184
-
1185
- self.nfe_purchase_same_state.action_document_cancel()
1186
-
1187
- self.assertEqual(
1188
- self.nfe_purchase_same_state.state_edoc,
1189
- SITUACAO_EDOC_CANCELADA,
1190
- "Document is not in Canceled state",
1191
- )
@@ -46,5 +46,3 @@ class TestFiscalDocumentNFSe(TransactionCase):
46
46
  "Error to mapping ICMS CST Tributada com permissão de crédito"
47
47
  " for Venda de Serviço de Contribuinte Dentro do Estado.",
48
48
  )
49
-
50
- self.nfse_same_state.action_document_confirm()
@@ -33,7 +33,8 @@ class TestSubsequentOperation(TransactionCase):
33
33
  line._onchange_product_id_fiscal()
34
34
  line._onchange_fiscal_taxes()
35
35
 
36
- self.nfe_simples_faturamento.action_document_confirm()
36
+ self.nfe_simples_faturamento.state_edoc = "a_enviar"
37
+ self.nfe_simples_faturamento._generates_subsequent_operations()
37
38
 
38
39
  subsequent_documents = self.nfe_simples_faturamento.document_subsequent_ids
39
40
 
@@ -3,8 +3,6 @@
3
3
 
4
4
  from odoo.tests import TransactionCase
5
5
 
6
- from ..constants.fiscal import SITUACAO_EDOC_A_ENVIAR, SITUACAO_EDOC_AUTORIZADA
7
-
8
6
 
9
7
  class TestTaxBenefit(TransactionCase):
10
8
  def setUp(self):
@@ -53,22 +51,3 @@ class TestTaxBenefit(TransactionCase):
53
51
  self.tax_benefit,
54
52
  "Document line must have tax benefit",
55
53
  )
56
-
57
- self.nfe_tax_benefit.action_document_confirm()
58
-
59
- self.assertEqual(
60
- self.nfe_tax_benefit.state_edoc,
61
- SITUACAO_EDOC_A_ENVIAR,
62
- "Document is not in To Send state",
63
- )
64
-
65
- self.nfe_tax_benefit.action_document_send()
66
-
67
- self.assertEqual(
68
- self.nfe_tax_benefit.state_edoc,
69
- SITUACAO_EDOC_AUTORIZADA,
70
- "Document is not in Authorized state",
71
- )
72
-
73
- result = self.nfe_tax_benefit.action_document_cancel()
74
- self.assertTrue(result)