diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py index d27c90f..ee5238e 100644 --- a/source/app/controllers/util.py +++ b/source/app/controllers/util.py @@ -82,6 +82,7 @@ from settings import ( EXT, MXN, PATHS, + PRE_DEFAULT, ) @@ -2111,25 +2112,53 @@ def _nomina(doc, data, values, version_cfdi): return info +def _get_info_pays_2(node): + pre_pays = PRE_DEFAULT['PAGOS']['PRE'] + data = CaseInsensitiveDict(node.attrib.copy()) + + path = f"{pre_pays}Totales" + totales = node.find(path) + data.update(CaseInsensitiveDict(totales.attrib.copy())) + + path = f"{pre_pays}Pago" + node_pay = node.find(path) + data.update(CaseInsensitiveDict(node_pay.attrib.copy())) + + related = [] + for n in node_pay: + attr = CaseInsensitiveDict(n.attrib.copy()) + if attr: + attr['metododepagodr'] = '' + related.append(attr) + + data['related'] = related + + return data + + def _cfdipays(doc, data, version): #todo: Obtener versiĆ³n de complemento if version == '4.0': - node = doc.find(f"{PRE[version]}Complemento/{PRE['pagos20']}Pagos") + pre_pays = PRE_DEFAULT['PAGOS']['PRE'] + path = f"{PRE[version]}Complemento/{pre_pays}Pagos" + node = doc.find(path) else: node = doc.find('{}Complemento/{}Pagos'.format(PRE[version], PRE['pagos'])) if node is None: return {} - info = CaseInsensitiveDict(node.attrib.copy()) + if version == '4.0': + info = _get_info_pays_2(node) + else: + info = CaseInsensitiveDict(node.attrib.copy()) + related = [] + for n1 in node: + info.update(CaseInsensitiveDict(n1.attrib.copy())) + for n2 in n1: + related.append(CaseInsensitiveDict(n2.attrib.copy())) - related = [] - for n1 in node: - info.update(CaseInsensitiveDict(n1.attrib.copy())) - for n2 in n1: - related.append(CaseInsensitiveDict(n2.attrib.copy())) - - info['related'] = related + info['related'] = related data['comprobante']['totalenletras'] = to_letters( float(info['monto']), info['monedap']) diff --git a/source/app/models/main.py b/source/app/models/main.py index 4168a10..4a51ce2 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -32,9 +32,9 @@ if __name__ == '__main__': from controllers import util -from settings import log, COMPANIES, VERSION, PATH_CP, PRE, CURRENT_CFDI, \ +from settings import log, COMPANIES, VERSION, PATH_CP, PRE, \ INIT_VALUES, DEFAULT_PASSWORD, DECIMALES, IMPUESTOS, DEFAULT_SAT_PRODUCTO, \ - CANCEL_SIGNATURE, PUBLIC, DEFAULT_SERIE_TICKET, CURRENT_CFDI_NOMINA, \ + CANCEL_SIGNATURE, PUBLIC, DEFAULT_SERIE_TICKET, \ DEFAULT_SAT_NOMINA, DECIMALES_TAX, TITLE_APP, MV, DECIMALES_PRECIOS, \ DEFAULT_CFDIPAY, CURRENCY_MN @@ -50,6 +50,7 @@ from settings import ( IS_MV, MXN, PATHS, + PRE_DEFAULT, URL, VALUES_PDF, VERSION as VERSION_EMPRESA_LIBRE, @@ -4441,7 +4442,7 @@ class RangosPrecios(BaseModel): class Facturas(BaseModel): cliente = ForeignKeyField(Socios) - version = TextField(default=CURRENT_CFDI) + version = TextField(default=PRE_DEFAULT['CFDI']['VERSION']) serie = TextField(default='') folio = BigIntegerField(default=0) fecha = DateTimeField(default=util.now, formats=['%Y-%m-%d %H:%M:%S']) @@ -6575,7 +6576,7 @@ class PreFacturas(BaseModel): } data['comprobante'] = obj - data['comprobante']['version'] = CURRENT_CFDI + data['comprobante']['version'] = PRE_DEFAULT['CFDI']['VERSION'] data['comprobante']['folio'] = str(data['comprobante']['folio']) data['comprobante']['seriefolio'] = '{}-{}'.format( data['comprobante']['serie'], data['comprobante']['folio']) @@ -9034,7 +9035,7 @@ class Empleados(BaseModel): class CfdiNomina(BaseModel): empleado = ForeignKeyField(Empleados) - version = TextField(default=CURRENT_CFDI) + version = TextField(default=PRE_DEFAULT['CFDI']['VERSION']) serie = TextField(default='N') folio = IntegerField(default=0) fecha = DateTimeField(default=util.now, formats=['%Y-%m-%d %H:%M:%S']) @@ -9075,7 +9076,7 @@ class CfdiNomina(BaseModel): acuse = TextField(default='') tipo_relacion = TextField(default='') error = TextField(default='') - version_nomina = TextField(default=CURRENT_CFDI_NOMINA) + version_nomina = TextField(default=PRE_DEFAULT['NOMINA']['VERSION']) registro_patronal = TextField(default='') rfc_patron_origen = TextField(default='') tipo_nomina = ForeignKeyField(SATTipoNomina) diff --git a/source/app/settings.py b/source/app/settings.py index 87725fb..986f01f 100644 --- a/source/app/settings.py +++ b/source/app/settings.py @@ -128,6 +128,22 @@ if 'win' in sys.platform: PATH_XMLSEC = os.path.join(PATH_BIN, 'xmlsec.exe') +PRE_DEFAULT = { + 'CFDI': {'VERSION': '4.0', 'PRE': '{http://www.sat.gob.mx/cfd/4}'}, + 'NOMINA': {'VERSION': '1.2', 'PRE': '{http://www.sat.gob.mx/nomina12}'}, + 'PAGOS': {'VERSION': '2.0', 'PRE': '{http://www.sat.gob.mx/Pagos20}'}, + 'TIBRE': {'VERSION': '1.1', 'PRE': '{http://www.sat.gob.mx/TimbreFiscalDigital}'}, +} + +pre2 ='{http://www.sat.gob.mx/cfd/2}' +pre3 ='{http://www.sat.gob.mx/cfd/3}' +PRE_HISTORY = { + 'CFDI': {'2.0': pre2, '2.2': pre2, + '3.0': pre3, '3.2': pre3, '3.3': pre3}, + 'NOMINA': {'1.1': '{http://www.sat.gob.mx/nomina}'}, + 'PAGOS': {'1.0': '{http://www.sat.gob.mx/Pagos}'}, +} + PRE = { '2.0': '{http://www.sat.gob.mx/cfd/2}', '2.2': '{http://www.sat.gob.mx/cfd/2}', @@ -141,14 +157,16 @@ PRE = { 'LOCALES': '{http://www.sat.gob.mx/implocal}', 'NOMINA': { '1.1': '{http://www.sat.gob.mx/nomina}', - '1.2': '{http://www.sat.gob.mx/nomina12}', }, - 'pagos': '{http://www.sat.gob.mx/Pagos}', - 'pagos20': '{http://www.sat.gob.mx/Pagos20}', + 'PAGOS': { + '1.0': '{http://www.sat.gob.mx/Pagos}', + } } -CURRENT_CFDI = '3.3' -CURRENT_CFDI_NOMINA = '1.2' +# To delete +# ~ CURRENT_CFDI = '4.0' +# ~ CURRENT_CFDI_NOMINA = '1.2' + DECIMALES = 2 DECIMALES_TAX = 4 DECIMALES_PRECIOS = 4