Allow closing protected legacy NCF ranges
Publicar paquete PyPI / publish (push) Successful in 1m42s

This commit is contained in:
José Arturo García
2026-08-27 10:49:35 -04:00
parent c01ab2e54c
commit c83cf048ea
4 changed files with 32 additions and 3 deletions
+5
View File
@@ -43,6 +43,11 @@ same document direction. The last issued number automatically finishes the
line. Finishing an authorization closes every remaining active line without line. Finishing an authorization closes every remaining active line without
reusing numbers. reusing numbers.
Legacy migration lines keep their original technical sequence immutable after
activation. Prefix selection is enforced while a line is in draft and fiscal
activation performs the same server-side validation; closing a protected
historical line therefore does not invalidate already-linked invoices.
Electronic fiscal numbers are only reserved by this module. Activating an Electronic fiscal numbers are only reserved by this module. Activating an
E-series authorization never signs or transmits an e-CF to DGII. E-series authorization never signs or transmits an e-CF to DGII.
+3 -1
View File
@@ -8,7 +8,7 @@ from trytond.i18n import gettext
from trytond.model import ModelView, ModelSQL, Workflow, fields, Unique from trytond.model import ModelView, ModelSQL, Workflow, fields, Unique
from trytond.pool import Pool from trytond.pool import Pool
from trytond.pyson import Eval from trytond.pyson import Eval, If
from trytond.transaction import Transaction from trytond.transaction import Transaction
@@ -309,7 +309,9 @@ class NCFManagerSequences(Workflow, ModelSQL, ModelView):
ncf_sequences = fields.Many2One('ir.sequence.strict', 'Fiscal Sequence', ncf_sequences = fields.Many2One('ir.sequence.strict', 'Fiscal Sequence',
domain=[ domain=[
('company', '=', Eval('company', -1)), ('company', '=', Eval('company', -1)),
If(Eval('state') == 'draft',
('prefix', '=', Eval('expected_prefix')), ('prefix', '=', Eval('expected_prefix')),
()),
('active', '=', True), ('active', '=', True),
], ],
states={ states={
+22
View File
@@ -396,6 +396,28 @@ class NcfManagerTestCase(ModuleTestCase):
with self.assertRaises(UserError): with self.assertRaises(UserError):
Manager.activate([manager]) Manager.activate([manager])
@with_transaction()
def test_finish_preserves_bound_legacy_migration_sequence(self):
'Finishing must not invalidate an immutable historical sequence'
pool = Pool()
Manager = pool.get('ncf.manager')
StrictSequence = pool.get('ir.sequence.strict')
company = self._create_company()
line = self._create_ncf_sequence(company)
strict_sequence = line.ncf_sequences
StrictSequence.write([strict_sequence], {
'prefix': 'MIG1',
'padding': 9,
})
Manager.finish([line.pos])
line = line.__class__(line.id)
self.assertEqual(line.state, 'finished')
self.assertEqual(line.ncf_sequences.id, strict_sequence.id)
self.assertEqual(line.ncf_sequences.prefix, 'MIG1')
@with_transaction() @with_transaction()
def test_import_dgii_authorization_is_idempotent(self): def test_import_dgii_authorization_is_idempotent(self):
pool = Pool() pool = Pool()
+1 -1
View File
@@ -1,5 +1,5 @@
[tryton] [tryton]
version=8.0.2 version=8.0.3
depends: depends:
account_do account_do
account_invoice_do account_invoice_do