Files
ncf_manager/sequence.py
T

126 lines
6.0 KiB
Python

# 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.i18n import gettext
from trytond import backend
# Maps sequence_type.name → (prefix, padding)
_NCF_TYPE_MAP = {
'Factura de Crédito Fiscal': ('B01', 8),
'Factura de Consumo': ('B02', 8),
'Nota de Débito': ('B03', 8),
'Nota de Crédito': ('B04', 8),
'Comprobante de Compras': ('B11', 8),
'Registro Único de Ingreso': ('B12', 8),
'Comprobante para Gasto Menor': ('B13', 8),
'Comprobante de Regímen Especial': ('B14', 8),
'Comprobante Gubernamental': ('B15', 8),
'Comprobante para exportaciones': ('B16', 8),
'Comprobante para Pagos al Exterior': ('B17', 8),
'Factura de Crédito Fiscal Electrónica': ('E31', 10),
'Factura de Consumo Electrónica': ('E32', 10),
'Nota de Débito Electrónica': ('E33', 10),
'Nota de Crédito Electrónica': ('E34', 10),
'Compras Electrónico': ('E41', 10),
'Gastos Menores Electrónico': ('E43', 10),
'Regímenes Especiales Electrónico': ('E44', 10),
'Gubernamental Electrónico': ('E45', 10),
'Exportación Electrónico': ('E46', 10),
'Pagos al Exterior Electrónico': ('E47', 10),
}
class Sequence(metaclass=PoolMeta):
__name__ = 'ir.sequence'
from_number = fields.Integer('From Number',
states={
'required': Eval('prefix').in_(['B01', 'B02', 'B03', 'B04',
'B11', 'B12', 'B13', 'B14', 'B15', 'B16', 'B17', 'E31',
'E32', 'E33', 'E34', 'E41', 'E43', 'E44', 'E45', 'E46', 'E47']),
'invisible': ~Eval('prefix').in_(['B01', 'B02', 'B03', 'B04',
'B11', 'B12', 'B13', 'B14', 'B15', 'B16', 'B17', 'E31',
'E32', 'E33', 'E34', 'E41', 'E43', 'E44', 'E45', 'E46', 'E47'])
}, depends=['prefix'])
until_number = fields.Integer('Until Number',
states={
'required': Eval('prefix').in_(['B01', 'B02', 'B03', 'B04',
'B11', 'B12', 'B13', 'B14', 'B15', 'B16', 'B17', 'E31',
'E32', 'E33', 'E34', 'E41', 'E43', 'E44', 'E45', 'E46', 'E47']),
'invisible': ~Eval('prefix').in_(['B01', 'B02', 'B03', 'B04',
'B11', 'B12', 'B13', 'B14', 'B15', 'B16', 'B17', 'E31',
'E32', 'E33', 'E34', 'E41', 'E43', 'E44', 'E45', 'E46', 'E47'])
}, depends=['prefix'])
approved_qty = fields.Function(fields.Integer('Approved Quantity',
states={
'invisible': ~Eval('prefix').in_(['B01', 'B02', 'B03', 'B04',
'B11', 'B12', 'B13', 'B14', 'B15', 'B16', 'B17', 'E31',
'E32', 'E33', 'E34', 'E41', 'E43', 'E44', 'E45', 'E46', 'E47'])
}), 'on_change_with_approved_qty')
expiration_date = fields.Date('Expiration Date',
states={
'required': Eval('prefix').in_(['B01', 'B03',
'B11', 'B12', 'B13', 'B14', 'B15', 'B16', 'B17', 'E31',
'E33', 'E41', 'E43', 'E44', 'E45', 'E46', 'E47']),
'invisible': ~Eval('prefix').in_(['B01', 'B02', 'B03', 'B04',
'B11', 'B12', 'B13', 'B14', 'B15', 'B16', 'B17', 'E31',
'E32', 'E33', 'E34', 'E41', 'E43', 'E44', 'E45', 'E46', 'E47'])
}, depends=['prefix'])
remaining_qty = fields.Function(fields.Integer('Remaining Quantity',
states={
'invisible': ~Eval('prefix').in_(['B01', 'B02', 'B03', 'B04',
'B11', 'B12', 'B13', 'B14', 'B15', 'B16', 'B17', 'E31',
'E32', 'E33', 'E34', 'E41', 'E43', 'E44', 'E45', 'E46', 'E47'])
}), 'on_change_with_remaining_qty')
@fields.depends('sequence_type')
def on_change_with_name(self, name=None):
if self.sequence_type:
return self.sequence_type.name
return None
@fields.depends('sequence_type')
def on_change_with_prefix(self, name=None):
if not self.sequence_type or not self.sequence_type.name:
return None
entry = _NCF_TYPE_MAP.get(self.sequence_type.name)
return entry[0] if entry else None
@fields.depends('sequence_type')
def on_change_with_padding(self, name=None):
if not self.sequence_type or not self.sequence_type.name:
return 0
entry = _NCF_TYPE_MAP.get(self.sequence_type.name)
return entry[1] if entry else 0
@fields.depends('from_number', 'until_number')
def on_change_with_approved_qty(self, name=None):
if self.from_number and self.until_number:
return self.until_number - self.from_number + 1
@fields.depends('number_next', 'until_number')
def on_change_with_remaining_qty(self, name=None):
if self.until_number and self.number_next:
return self.until_number - self.number_next + 1
class SequenceStrict(Sequence):
"Sequence Strict"
__name__ = 'ir.sequence.strict'
_table = None # Needed to reset Sequence._table
_strict = True