Prepare NCF manager for production on Tryton 8.0
Publicar paquete PyPI / publish (push) Successful in 1m17s

This commit is contained in:
José Arturo García
2026-08-16 13:36:51 -04:00
parent e272bb5cfa
commit b96639f3e8
10 changed files with 204 additions and 192 deletions
+30 -12
View File
@@ -1,18 +1,10 @@
# This file is part of ncf_manager module for Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from string import Template
import time
from sql import Literal, For
from trytond.exceptions import UserError
from trytond.model.exceptions import ValidationError
from trytond.model import ModelView, ModelSQL, DeactivableMixin, fields, Check
from trytond.pyson import Eval, And
from trytond.transaction import Transaction
from trytond.pool import Pool, PoolMeta
from trytond.model import fields
from trytond.pyson import Eval
from trytond.pool import PoolMeta
from trytond.i18n import gettext
from trytond import backend
# Maps sequence_type.name → (prefix, padding)
_NCF_TYPE_MAP = {
@@ -38,6 +30,7 @@ _NCF_TYPE_MAP = {
'Exportación Electrónico': ('E46', 10),
'Pagos al Exterior Electrónico': ('E47', 10),
}
NCF_PREFIXES = tuple(prefix for prefix, _padding in _NCF_TYPE_MAP.values())
class Sequence(metaclass=PoolMeta):
@@ -114,8 +107,33 @@ class Sequence(metaclass=PoolMeta):
@fields.depends('number_next', 'until_number')
def on_change_with_remaining_qty(self, name=None):
if self.until_number and self.number_next:
if self.until_number is not None and self.number_next is not None:
return self.until_number - self.number_next + 1
@classmethod
def validate_fields(cls, records, field_names):
super().validate_fields(records, field_names)
if field_names & {
'prefix', 'padding', 'from_number', 'until_number',
'number_next'}:
for record in records:
record._validate_ncf_range()
def _validate_ncf_range(self):
if self.prefix not in NCF_PREFIXES:
return
expected_padding = 10 if self.prefix.startswith('E') else 8
if self.padding != expected_padding:
raise UserError(gettext(
'ncf_manager.msg_ncf_invalid_padding',
padding=expected_padding))
if self.from_number is None or self.until_number is None:
return
if self.from_number < 1 or self.until_number < self.from_number:
raise UserError(gettext('ncf_manager.msg_ncf_invalid_range'))
if (self.number_next is not None
and self.number_next < self.from_number):
raise UserError(gettext('ncf_manager.msg_ncf_next_before_range'))
class SequenceStrict(Sequence):
"Sequence Strict"