Tablas para Nómina
This commit is contained in:
parent
9785c7a72c
commit
133aed9c85
|
@ -260,6 +260,14 @@ def get_file(path):
|
||||||
return open(path, 'rb')
|
return open(path, 'rb')
|
||||||
|
|
||||||
|
|
||||||
|
def get_files(path, ext='xml'):
|
||||||
|
docs = []
|
||||||
|
for folder, _, files in os.walk(path):
|
||||||
|
pattern = re.compile('\.{}'.format(ext), re.IGNORECASE)
|
||||||
|
docs += [os.path.join(folder,f) for f in files if pattern.search(f)]
|
||||||
|
return tuple(docs)
|
||||||
|
|
||||||
|
|
||||||
def read_file(path, mode='rb'):
|
def read_file(path, mode='rb'):
|
||||||
return open(path, mode).read()
|
return open(path, mode).read()
|
||||||
|
|
||||||
|
@ -308,6 +316,10 @@ def loads(data):
|
||||||
return json.loads(data)
|
return json.loads(data)
|
||||||
|
|
||||||
|
|
||||||
|
def import_json(path):
|
||||||
|
return loads(read_file(path, 'r'))
|
||||||
|
|
||||||
|
|
||||||
def clean(values):
|
def clean(values):
|
||||||
for k, v in values.items():
|
for k, v in values.items():
|
||||||
if isinstance(v, str):
|
if isinstance(v, str):
|
||||||
|
|
|
@ -17,7 +17,8 @@ if __name__ == '__main__':
|
||||||
from controllers import util
|
from controllers import util
|
||||||
from settings import log, VERSION, PATH_CP, COMPANIES, PRE, CURRENT_CFDI, \
|
from settings import log, VERSION, PATH_CP, COMPANIES, PRE, CURRENT_CFDI, \
|
||||||
INIT_VALUES, DEFAULT_PASSWORD, DECIMALES, IMPUESTOS, DEFAULT_SAT_PRODUCTO, \
|
INIT_VALUES, DEFAULT_PASSWORD, DECIMALES, IMPUESTOS, DEFAULT_SAT_PRODUCTO, \
|
||||||
CANCEL_SIGNATURE, PUBLIC, DEFAULT_SERIE_TICKET, DECIMALES_TAX, TITLE_APP
|
CANCEL_SIGNATURE, PUBLIC, DEFAULT_SERIE_TICKET, CURRENT_CFDI_NOMINA, \
|
||||||
|
DEFAULT_SAT_NOMINA, DECIMALES_TAX, TITLE_APP
|
||||||
|
|
||||||
|
|
||||||
FORMAT = '{0:.2f}'
|
FORMAT = '{0:.2f}'
|
||||||
|
@ -650,6 +651,7 @@ class SATRegimenes(BaseModel):
|
||||||
|
|
||||||
class Emisor(BaseModel):
|
class Emisor(BaseModel):
|
||||||
rfc = TextField(unique=True)
|
rfc = TextField(unique=True)
|
||||||
|
curp = TextField(unique=True)
|
||||||
nombre = TextField(default='')
|
nombre = TextField(default='')
|
||||||
nombre_comercial = TextField(default='')
|
nombre_comercial = TextField(default='')
|
||||||
calle = TextField(default='')
|
calle = TextField(default='')
|
||||||
|
@ -675,6 +677,7 @@ class Emisor(BaseModel):
|
||||||
token_timbrado = TextField(default='')
|
token_timbrado = TextField(default='')
|
||||||
token_soporte = TextField(default='')
|
token_soporte = TextField(default='')
|
||||||
logo = TextField(default='')
|
logo = TextField(default='')
|
||||||
|
registro_patronal = TextField(default='')
|
||||||
regimenes = ManyToManyField(SATRegimenes, related_name='emisores')
|
regimenes = ManyToManyField(SATRegimenes, related_name='emisores')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
@ -1843,6 +1846,208 @@ class SATUsoCfdi(BaseModel):
|
||||||
return tuple(rows)
|
return tuple(rows)
|
||||||
|
|
||||||
|
|
||||||
|
class SATEstados(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
pais = TextField(default='')
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name', 'pais'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Estado: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATOrigenRecurso(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Origen Recurso: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATPeriodicidadPago(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Periodicidad de Pago: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATTipoContrato(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Tipo de Contrato: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATTipoDeduccion(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
clave = TextField(default='')
|
||||||
|
nombre = TextField(default='')
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Tipo de Deducción: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATTipoHoras(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Tipo de Horas: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATTipoIncapacidad(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Tipo de Incapacidad: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATTipoJornada(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Tipo de Jornada: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATTipoNomina(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Tipo de Nómina: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATTipoOtroPago(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
clave = TextField(default='')
|
||||||
|
nombre = TextField(default='')
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Tipo de Otro Pago: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATTipoPercepcion(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
clave = TextField(default='')
|
||||||
|
nombre = TextField(default='')
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Tipo de Percepción: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATTipoRegimen(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Regimen de contratación: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
|
class SATRiesgoPuesto(BaseModel):
|
||||||
|
key = TextField(index=True, unique=True)
|
||||||
|
name = TextField(default='', index=True)
|
||||||
|
activo = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('name',)
|
||||||
|
indexes = (
|
||||||
|
(('key', 'name'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Riesgo Puesto: {} ({})'.format(self.name, self.key)
|
||||||
|
|
||||||
|
|
||||||
class TipoCambio(BaseModel):
|
class TipoCambio(BaseModel):
|
||||||
dia = DateField(default=util.now)
|
dia = DateField(default=util.now)
|
||||||
moneda = ForeignKeyField(SATMonedas)
|
moneda = ForeignKeyField(SATMonedas)
|
||||||
|
@ -4975,6 +5180,275 @@ class SeriesProductos(BaseModel):
|
||||||
order_by = ('serie',)
|
order_by = ('serie',)
|
||||||
|
|
||||||
|
|
||||||
|
class Departamentos(BaseModel):
|
||||||
|
nombre = TextField(default='')
|
||||||
|
descripcion = TextField(default='')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('nombre',)
|
||||||
|
|
||||||
|
|
||||||
|
class Puestos(BaseModel):
|
||||||
|
nombre = TextField(default='')
|
||||||
|
descripcion = TextField(default='')
|
||||||
|
departamento = ForeignKeyField(Departamentos)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('nombre',)
|
||||||
|
indexes = (
|
||||||
|
(('nombre', 'departamento'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Empleados(BaseModel):
|
||||||
|
num_empleado = TextField(default='')
|
||||||
|
rfc = TextField(default='', unique=True)
|
||||||
|
curp = TextField(default='', unique=True)
|
||||||
|
nombre = TextField(default='')
|
||||||
|
paterno = TextField(default='')
|
||||||
|
materno = TextField(default='')
|
||||||
|
nombre_completo = TextField(default='')
|
||||||
|
es_activo = BooleanField(default=True)
|
||||||
|
es_extranjero = BooleanField(default=False)
|
||||||
|
fecha_alta = DateField(default=util.now)
|
||||||
|
fecha_ingreso = DateField(default=util.now)
|
||||||
|
imss = TextField(default='')
|
||||||
|
tipo_contrato = ForeignKeyField(SATTipoContrato)
|
||||||
|
es_sindicalizado = BooleanField(default=False)
|
||||||
|
tipo_jornada = ForeignKeyField(SATTipoJornada, null=True)
|
||||||
|
tipo_regimen = ForeignKeyField(SATTipoRegimen)
|
||||||
|
puesto = ForeignKeyField(Puestos, null=True)
|
||||||
|
riesgo_puesto = ForeignKeyField(SATRiesgoPuesto, null=True)
|
||||||
|
periodicidad_pago = ForeignKeyField(SATPeriodicidadPago)
|
||||||
|
banco = ForeignKeyField(SATBancos, null=True)
|
||||||
|
cuenta_bancaria = TextField(default='')
|
||||||
|
clabe = TextField(default='')
|
||||||
|
salario_base = DecimalField(default=0.0, max_digits=18, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
salario_diario = DecimalField(default=0.0, max_digits=18, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
estado = ForeignKeyField(SATEstados)
|
||||||
|
codigo_postal = TextField(default='')
|
||||||
|
notas = TextField(default='')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('nombre_completo',)
|
||||||
|
indexes = (
|
||||||
|
(('num_empleado', 'rfc'), True),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNomina(BaseModel):
|
||||||
|
empleado = ForeignKeyField(Empleados)
|
||||||
|
version = TextField(default=CURRENT_CFDI)
|
||||||
|
serie = TextField(default='')
|
||||||
|
folio = IntegerField(default=0)
|
||||||
|
fecha = DateTimeField(default=util.now, formats=['%Y-%m-%d %H:%M:%S'])
|
||||||
|
fecha_timbrado = DateTimeField(null=True)
|
||||||
|
forma_pago = TextField(default='')
|
||||||
|
condiciones_pago = TextField(default='')
|
||||||
|
subtotal = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
descuento = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
moneda = TextField(default='MXN')
|
||||||
|
tipo_cambio = DecimalField(default=1.0, max_digits=15, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total_mn = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
tipo_comprobante = TextField(default='I')
|
||||||
|
metodo_pago = TextField(default='PUE')
|
||||||
|
lugar_expedicion = TextField(default='')
|
||||||
|
confirmacion = TextField(default='')
|
||||||
|
uso_cfdi = TextField(default='')
|
||||||
|
total_retenciones = DecimalField(
|
||||||
|
max_digits=20, decimal_places=6, auto_round=True, null=True)
|
||||||
|
total_trasladados = DecimalField(
|
||||||
|
max_digits=20, decimal_places=6, auto_round=True, null=True)
|
||||||
|
xml = TextField(default='')
|
||||||
|
uuid = UUIDField(null=True)
|
||||||
|
estatus = TextField(default='Guardada')
|
||||||
|
estatus_sat = TextField(default='Vigente')
|
||||||
|
regimen_fiscal = TextField(default='')
|
||||||
|
notas = TextField(default='')
|
||||||
|
saldo = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
pagada = BooleanField(default=False)
|
||||||
|
cancelada = BooleanField(default=False)
|
||||||
|
fecha_cancelacion = DateTimeField(null=True)
|
||||||
|
acuse = TextField(default='')
|
||||||
|
tipo_relacion = TextField(default='')
|
||||||
|
error = TextField(default='')
|
||||||
|
version = TextField(default=CURRENT_CFDI_NOMINA)
|
||||||
|
registro_patronal = TextField(default='')
|
||||||
|
rfc_patron_origen = TextField(default='')
|
||||||
|
tipo_nomina = ForeignKeyField(SATTipoNomina)
|
||||||
|
fecha_pago = DateField()
|
||||||
|
fecha_inicial_pago = DateField()
|
||||||
|
fecha_final_pago = DateField()
|
||||||
|
dias_pagados = DecimalField(default=0.0, max_digits=12, decimal_places=2,
|
||||||
|
auto_round=True)
|
||||||
|
origen_recurso = ForeignKeyField(SATOrigenRecurso, null=True)
|
||||||
|
monto_recurso_propio = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('fecha',)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaDetalle(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
clave_sat = TextField(default=DEFAULT_SAT_NOMINA['CLAVE'])
|
||||||
|
cantidad = DecimalField(default=1.0, max_digits=18, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
clave_unidad = TextField(default=DEFAULT_SAT_NOMINA['UNIDAD'])
|
||||||
|
descripcion = TextField(default=DEFAULT_SAT_NOMINA['DESCRIPCION'])
|
||||||
|
valor_unitario = DecimalField(default=0.0, max_digits=18, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
importe = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
descuento = DecimalField(default=0.0, max_digits=18, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('cfdi',)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaTotales(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
subtotal = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
descuento = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total_percepciones = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
total_gravado = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total_exento = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total_deducciones = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total_otros_pagos = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total_sueldos = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total_separacion = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total_jubilacion = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total_retenciones = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
total_otras_deducciones = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
total = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaJubilacion(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
total_una_exhibicion = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
total_parcialidad = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
monto_diario = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
ingreso_acumulable = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
ingreso_no_acumulable = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaSeparacion(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
total_pagado = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
years_servicio = IntegerField(default=0)
|
||||||
|
ultimo_sueldo = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
ingreso_acumulable = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
ingreso_no_acumulable = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaPercepciones(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
tipo_percepcion = ForeignKeyField(SATTipoPercepcion)
|
||||||
|
importe_gravado = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
importe_exento = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
valor_mercado = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
precio_al_ortorgarse = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaDeducciones(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
tipo_deduccion = ForeignKeyField(SATTipoDeduccion)
|
||||||
|
importe = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaOtroPago(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
tipo_otro_pago = ForeignKeyField(SATTipoOtroPago)
|
||||||
|
importe = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
subsidio_causado = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
saldo_a_favor = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
year = IntegerField(default=0)
|
||||||
|
remanente_saldo = DecimalField(default=0.0, max_digits=20, decimal_places=6,
|
||||||
|
auto_round=True)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaIncapacidad(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
dias = IntegerField(default=0)
|
||||||
|
tipo = ForeignKeyField(SATTipoIncapacidad)
|
||||||
|
importe = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaHorasExtra(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
dias = IntegerField(default=0)
|
||||||
|
tipos_horas = ForeignKeyField(SATTipoHoras)
|
||||||
|
horas_extra = IntegerField(default=0)
|
||||||
|
importe_pagado = DecimalField(default=0.0, max_digits=20,
|
||||||
|
decimal_places=6, auto_round=True)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaSubcontratos(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
rfc = TextField(default='')
|
||||||
|
porcentaje = DecimalField(default=0.0, max_digits=12, decimal_places=2,
|
||||||
|
auto_round=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('cfdi',)
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaOtros(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina)
|
||||||
|
node = TextField(default='')
|
||||||
|
key = TextField(default='')
|
||||||
|
value = TextField(default='')
|
||||||
|
|
||||||
|
|
||||||
|
class CfdiNominaRelacionados(BaseModel):
|
||||||
|
cfdi = ForeignKeyField(CfdiNomina, related_name='original')
|
||||||
|
cfdi_origen = ForeignKeyField(CfdiNomina, related_name='relacion')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
order_by = ('cfdi',)
|
||||||
|
|
||||||
|
|
||||||
def authenticate(args):
|
def authenticate(args):
|
||||||
respuesta = {'login': False, 'msg': 'No Autorizado', 'user': ''}
|
respuesta = {'login': False, 'msg': 'No Autorizado', 'user': ''}
|
||||||
values = util.get_con(args['rfc'])
|
values = util.get_con(args['rfc'])
|
||||||
|
@ -5114,14 +5588,22 @@ def _crear_tablas(rfc):
|
||||||
PreFacturasRelacionadas, Tickets, TicketsDetalle, TicketsImpuestos,
|
PreFacturasRelacionadas, Tickets, TicketsDetalle, TicketsImpuestos,
|
||||||
SATAduanas, SATFormaPago, SATImpuestos, SATMonedas, SATRegimenes,
|
SATAduanas, SATFormaPago, SATImpuestos, SATMonedas, SATRegimenes,
|
||||||
SATTipoRelacion, SATUnidades, SATUsoCfdi, SATBancos,
|
SATTipoRelacion, SATUnidades, SATUsoCfdi, SATBancos,
|
||||||
SATNivelesEducativos,
|
SATNivelesEducativos, SATEstados, SATRiesgoPuesto, SATPeriodicidadPago,
|
||||||
Socios, Contactos, ContactoCorreos, ContactoDirecciones,
|
SATOrigenRecurso, SATTipoContrato, SATTipoDeduccion, SATTipoHoras,
|
||||||
ContactoTelefonos,
|
SATTipoIncapacidad, SATTipoJornada, SATTipoNomina, SATTipoOtroPago,
|
||||||
|
SATTipoPercepcion, SATTipoRegimen,
|
||||||
|
Socios, Contactos, ContactoCorreos, ContactoDirecciones, Empleados,
|
||||||
|
ContactoTelefonos, Departamentos, Puestos,
|
||||||
Tags, Usuarios, CuentasBanco, TipoCambio, MovimientosBanco,
|
Tags, Usuarios, CuentasBanco, TipoCambio, MovimientosBanco,
|
||||||
TipoCorreo, TipoDireccion, TipoPariente, TipoResponsable, TipoTelefono,
|
TipoCorreo, TipoDireccion, TipoPariente, TipoResponsable, TipoTelefono,
|
||||||
TipoTitulo, TipoMovimientoAlumno, TipoMovimientoAlmacen,
|
TipoTitulo, TipoMovimientoAlumno, TipoMovimientoAlmacen,
|
||||||
CfdiPagos, NivelesEducativos, Alumnos, AlumnosParientes, Grupos,
|
CfdiPagos, NivelesEducativos, Alumnos, AlumnosParientes, Grupos,
|
||||||
ParienteDirecciones, ParienteTelefonos, ParienteCorreos,
|
ParienteDirecciones, ParienteTelefonos, ParienteCorreos,
|
||||||
|
CfdiNomina, CfdiNominaDeducciones, CfdiNominaDetalle,
|
||||||
|
CfdiNominaHorasExtra, CfdiNominaIncapacidad, CfdiNominaJubilacion,
|
||||||
|
CfdiNominaOtroPago, CfdiNominaOtros, CfdiNominaPercepciones,
|
||||||
|
CfdiNominaRelacionados, CfdiNominaSeparacion, CfdiNominaSubcontratos,
|
||||||
|
CfdiNominaTotales,
|
||||||
Emisor.regimenes.get_through_model(),
|
Emisor.regimenes.get_through_model(),
|
||||||
Socios.tags.get_through_model(),
|
Socios.tags.get_through_model(),
|
||||||
Productos.impuestos.get_through_model(),
|
Productos.impuestos.get_through_model(),
|
||||||
|
@ -5166,7 +5648,16 @@ def _migrate_tables():
|
||||||
|
|
||||||
conectar(args)
|
conectar(args)
|
||||||
|
|
||||||
tablas = [Sucursales]
|
tablas = [Sucursales, SATEstados, SATRiesgoPuesto, SATPeriodicidadPago,
|
||||||
|
SATOrigenRecurso, SATTipoContrato, SATTipoDeduccion, SATTipoHoras,
|
||||||
|
SATTipoIncapacidad, SATTipoJornada, SATTipoNomina, SATTipoOtroPago,
|
||||||
|
SATTipoPercepcion, SATTipoRegimen, Departamentos, Puestos, Empleados,
|
||||||
|
CfdiNomina, CfdiNominaDeducciones, CfdiNominaDetalle,
|
||||||
|
CfdiNominaHorasExtra, CfdiNominaIncapacidad, CfdiNominaJubilacion,
|
||||||
|
CfdiNominaOtroPago, CfdiNominaOtros, CfdiNominaPercepciones,
|
||||||
|
CfdiNominaRelacionados, CfdiNominaSeparacion, CfdiNominaSubcontratos,
|
||||||
|
CfdiNominaTotales,
|
||||||
|
]
|
||||||
log.info('Creando nuevas tablas...')
|
log.info('Creando nuevas tablas...')
|
||||||
database_proxy.create_tables(tablas, True)
|
database_proxy.create_tables(tablas, True)
|
||||||
log.info('Tablas creadas correctamente...')
|
log.info('Tablas creadas correctamente...')
|
||||||
|
@ -5175,12 +5666,23 @@ def _migrate_tables():
|
||||||
migrations = []
|
migrations = []
|
||||||
migrator = PostgresqlMigrator(database_proxy)
|
migrator = PostgresqlMigrator(database_proxy)
|
||||||
|
|
||||||
sucursal = ForeignKeyField(Sucursales, null=True, to_field=Sucursales.id)
|
|
||||||
columns = [c.name for c in database_proxy.get_columns('usuarios')]
|
columns = [c.name for c in database_proxy.get_columns('usuarios')]
|
||||||
if not 'sucursal_id' in columns:
|
if not 'sucursal_id' in columns:
|
||||||
|
sucursal = ForeignKeyField(Sucursales, null=True, to_field=Sucursales.id)
|
||||||
migrations.append(
|
migrations.append(
|
||||||
migrator.add_column('usuarios', 'sucursal_id', sucursal))
|
migrator.add_column('usuarios', 'sucursal_id', sucursal))
|
||||||
|
|
||||||
|
columns = [c.name for c in database_proxy.get_columns('emisor')]
|
||||||
|
if not 'registro_patronal' in columns:
|
||||||
|
registro_patronal = TextField(default='')
|
||||||
|
migrations.append(
|
||||||
|
migrator.add_column(
|
||||||
|
'emisor', 'registro_patronal', registro_patronal))
|
||||||
|
if not 'curp' in columns:
|
||||||
|
curp = TextField(default='')
|
||||||
|
migrations.append(
|
||||||
|
migrator.add_column('emisor', 'curp', curp))
|
||||||
|
|
||||||
if migrations:
|
if migrations:
|
||||||
with database_proxy.atomic() as txn:
|
with database_proxy.atomic() as txn:
|
||||||
migrate(*migrations)
|
migrate(*migrations)
|
||||||
|
@ -5732,7 +6234,7 @@ def _importar_factura_libre_gambas(conexion):
|
||||||
_importar_socios(data['Socios'])
|
_importar_socios(data['Socios'])
|
||||||
_importar_facturas(data['Facturas'])
|
_importar_facturas(data['Facturas'])
|
||||||
_importar_categorias(data['Categorias'])
|
_importar_categorias(data['Categorias'])
|
||||||
# ~ _importar_productos_gambas(data['Productos'])
|
_importar_productos_gambas(data['Productos'])
|
||||||
_import_tickets(data['Tickets'])
|
_import_tickets(data['Tickets'])
|
||||||
|
|
||||||
log.info('Importación terminada...')
|
log.info('Importación terminada...')
|
||||||
|
@ -5907,6 +6409,41 @@ def _importar_productos(archivo):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def _import_from_folder(path):
|
||||||
|
files = util.get_files(path, 'json')
|
||||||
|
if not files:
|
||||||
|
msg = 'No se encontraron archivos para importar'
|
||||||
|
log.error(msg)
|
||||||
|
return
|
||||||
|
|
||||||
|
rfc = input('Introduce el RFC: ').strip().upper()
|
||||||
|
if not rfc:
|
||||||
|
msg = 'El RFC es requerido'
|
||||||
|
log.error(msg)
|
||||||
|
return
|
||||||
|
|
||||||
|
args = util.get_con(rfc)
|
||||||
|
if not args:
|
||||||
|
return
|
||||||
|
|
||||||
|
conectar(args)
|
||||||
|
log.info('Importando valores...')
|
||||||
|
for p in files:
|
||||||
|
msg = '\tImportando tabla: {}'
|
||||||
|
data = util.import_json(p)
|
||||||
|
log.info(msg.format(data['tabla']))
|
||||||
|
table = globals()[data['tabla']]
|
||||||
|
for r in data['datos']:
|
||||||
|
try:
|
||||||
|
with database_proxy.atomic() as txn:
|
||||||
|
table.create(**r)
|
||||||
|
except IntegrityError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
log.info('Valores importados...')
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
def _test():
|
def _test():
|
||||||
rfc = input('Introduce el RFC: ').strip().upper()
|
rfc = input('Introduce el RFC: ').strip().upper()
|
||||||
if not rfc:
|
if not rfc:
|
||||||
|
@ -5957,10 +6494,12 @@ help_lr = 'Listar RFCs'
|
||||||
@click.option('-a', '--alta', is_flag=True, default=False)
|
@click.option('-a', '--alta', is_flag=True, default=False)
|
||||||
@click.option('-r', '--rfc')
|
@click.option('-r', '--rfc')
|
||||||
@click.option('-d', '--detalle', is_flag=True, default=False)
|
@click.option('-d', '--detalle', is_flag=True, default=False)
|
||||||
|
@click.option('-id', '--importar-directorio')
|
||||||
def main(iniciar_bd, migrar_bd, nuevo_superusuario, cambiar_contraseña,
|
def main(iniciar_bd, migrar_bd, nuevo_superusuario, cambiar_contraseña,
|
||||||
agregar_rfc, borrar_rfc, listar_rfc, importar_valores, archivo, conexion,
|
agregar_rfc, borrar_rfc, listar_rfc, importar_valores, archivo, conexion,
|
||||||
factura_libre, factura_libre_gambas, test, generar_archivo_productos,
|
factura_libre, factura_libre_gambas, test, generar_archivo_productos,
|
||||||
importar_productos, backup_dbs, no_bd, alta, rfc, detalle):
|
importar_productos, backup_dbs, no_bd, alta, rfc, detalle,
|
||||||
|
importar_directorio):
|
||||||
|
|
||||||
opt = locals()
|
opt = locals()
|
||||||
|
|
||||||
|
@ -6066,6 +6605,9 @@ def main(iniciar_bd, migrar_bd, nuevo_superusuario, cambiar_contraseña,
|
||||||
_importar_productos(opt['archivo'])
|
_importar_productos(opt['archivo'])
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
if opt['importar_directorio']:
|
||||||
|
_import_from_folder(opt['importar_directorio'])
|
||||||
|
|
||||||
if opt['backup_dbs']:
|
if opt['backup_dbs']:
|
||||||
util.backup_dbs()
|
util.backup_dbs()
|
||||||
|
|
||||||
|
|
|
@ -115,6 +115,7 @@ PRE = {
|
||||||
}
|
}
|
||||||
|
|
||||||
CURRENT_CFDI = '3.3'
|
CURRENT_CFDI = '3.3'
|
||||||
|
CURRENT_CFDI_NOMINA = '1.2'
|
||||||
DECIMALES = 2
|
DECIMALES = 2
|
||||||
DECIMALES_TAX = 4
|
DECIMALES_TAX = 4
|
||||||
IMPUESTOS = {
|
IMPUESTOS = {
|
||||||
|
@ -135,3 +136,8 @@ DIR_FACTURAS = 'facturas'
|
||||||
USAR_TOKEN = False
|
USAR_TOKEN = False
|
||||||
CANCEL_SIGNATURE = False
|
CANCEL_SIGNATURE = False
|
||||||
PUBLIC = 'Público en general'
|
PUBLIC = 'Público en general'
|
||||||
|
DEFAULT_SAT_NOMINA = {
|
||||||
|
'CLAVE': '84111505',
|
||||||
|
'UNIDAD': 'ACT',
|
||||||
|
'DESCRIPCION': 'Pago de nómina',
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue