Skip to content

Commit

Permalink
Contabilidad Fix
Browse files Browse the repository at this point in the history
  • Loading branch information
satcfdi committed Mar 29, 2024
1 parent 7d365d8 commit 56acd43
Show file tree
Hide file tree
Showing 9 changed files with 343 additions and 18 deletions.
53 changes: 45 additions & 8 deletions satcfdi/transform/objectify.py
Original file line number Diff line number Diff line change
Expand Up @@ -8749,6 +8749,40 @@ def folios0(cls, node):
el = node.find('{http://cancelacfd.sat.gob.mx}Respuesta')
self['Respuesta'] = el.text
return self
def spei_tercero0(cls, node):
self = cls()
self.tag = node.tag
el = node.find('Ordenante')
self['Ordenante'] = ordenante0(cls, el)
el = node.find('Beneficiario')
self['Beneficiario'] = beneficiario0(cls, el)
self['FechaOperacion'] = date.fromisoformat(node.attrib['FechaOperacion'])
self['Hora'] = time.fromisoformat(node.attrib['Hora'])
self['ClaveSPEI'] = Xint(node.attrib['ClaveSPEI'])
self['Sello'] = node.attrib['sello']
self['NumeroCertificado'] = node.attrib['numeroCertificado']
self['CadenaCDA'] = node.attrib['cadenaCDA']
return self
def ordenante0(cls, node):
self = ScalarMap()
self['BancoEmisor'] = node.attrib['BancoEmisor']
self['Nombre'] = node.attrib['Nombre']
self['TipoCuenta'] = Decimal(node.attrib['TipoCuenta'])
self['Cuenta'] = Decimal(node.attrib['Cuenta'])
self['RFC'] = node.attrib['RFC']
return self
def beneficiario0(cls, node):
self = ScalarMap()
self['BancoReceptor'] = node.attrib['BancoReceptor']
self['Nombre'] = node.attrib['Nombre']
self['TipoCuenta'] = Decimal(node.attrib['TipoCuenta'])
self['Cuenta'] = Decimal(node.attrib['Cuenta'])
self['RFC'] = node.attrib['RFC']
self['Concepto'] = node.attrib['Concepto']
if (a := node.attrib.get('IVA')) is not None:
self['IVA'] = Decimal(a)
self['MontoPago'] = Decimal(node.attrib['MontoPago'])
return self
def diverza0(cls, node):
self = cls()
self.tag = node.tag
Expand Down Expand Up @@ -9700,7 +9734,7 @@ def pagosaextranjeros0(cls, node):
self['NoBeneficiario'] = no_beneficiario0(cls, el)
el = node.find('{http://www.sat.gob.mx/esquemas/retencionpago/1/pagosaextranjeros}Beneficiario')
if el is not None:
self['Beneficiario'] = beneficiario0(cls, el)
self['Beneficiario'] = beneficiario1(cls, el)
self['Version'] = node.attrib['Version']
self['EsBenefEfectDelCobro'] = node.attrib['EsBenefEfectDelCobro']
return self
Expand All @@ -9710,7 +9744,7 @@ def no_beneficiario0(cls, node):
self['ConceptoPago'] = catalog_code('Ccb0_c_TipoContribuyenteSujetoRetencion', node.attrib['ConceptoPago'])
self['DescripcionConcepto'] = node.attrib['DescripcionConcepto']
return self
def beneficiario0(cls, node):
def beneficiario1(cls, node):
self = ScalarMap()
self['RFC'] = node.attrib['RFC']
self['CURP'] = node.attrib['CURP']
Expand Down Expand Up @@ -13830,30 +13864,30 @@ def inmueble0(cls, node):
def complemento_spei0(cls, node):
self = cls()
self.tag = node.tag
self['SPEI_Tercero'] = [spei_tercero0(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/spei}SPEI_Tercero')]
self['SPEI_Tercero'] = [spei_tercero1(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/spei}SPEI_Tercero')]
return self
def spei_tercero0(cls, node):
def spei_tercero1(cls, node):
self = ScalarMap()
el = node.find('{http://www.sat.gob.mx/spei}Ordenante')
self['Ordenante'] = ordenante0(cls, el)
self['Ordenante'] = ordenante1(cls, el)
el = node.find('{http://www.sat.gob.mx/spei}Beneficiario')
self['Beneficiario'] = beneficiario1(cls, el)
self['Beneficiario'] = beneficiario2(cls, el)
self['FechaOperacion'] = date.fromisoformat(node.attrib['FechaOperacion'])
self['Hora'] = time.fromisoformat(node.attrib['Hora'])
self['ClaveSPEI'] = Xint(node.attrib['ClaveSPEI'])
self['Sello'] = node.attrib['sello']
self['NumeroCertificado'] = node.attrib['numeroCertificado']
self['CadenaCDA'] = node.attrib['cadenaCDA']
return self
def ordenante0(cls, node):
def ordenante1(cls, node):
self = ScalarMap()
self['BancoEmisor'] = node.attrib['BancoEmisor']
self['Nombre'] = node.attrib['Nombre']
self['TipoCuenta'] = Decimal(node.attrib['TipoCuenta'])
self['Cuenta'] = Decimal(node.attrib['Cuenta'])
self['RFC'] = node.attrib['RFC']
return self
def beneficiario1(cls, node):
def beneficiario2(cls, node):
self = ScalarMap()
self['BancoReceptor'] = node.attrib['BancoReceptor']
self['Nombre'] = node.attrib['Nombre']
Expand Down Expand Up @@ -14010,6 +14044,8 @@ def s_cancelacion1(cls, node):
return cancelacion1(cls, node)
def s_solicitud_aceptacion_rechazo0(cls, node):
return solicitud_aceptacion_rechazo0(cls, node)
def s_spei_tercero0(cls, node):
return spei_tercero0(cls, node)
def s_diverza0(cls, node):
if node.attrib.get('version') == '1.1':
return diverza0(cls, node)
Expand Down Expand Up @@ -14386,6 +14422,7 @@ def s_rsakey_value0(cls, node):
'{http://cancelacfd.sat.gob.mx}Cancelacion': s_cancelacion0,
'{http://www.sat.gob.mx/esquemas/retencionpago/1}Cancelacion': s_cancelacion1,
'{http://cancelacfd.sat.gob.mx}SolicitudAceptacionRechazo': s_solicitud_aceptacion_rechazo0,
'SPEI_Tercero': s_spei_tercero0,
'{http://www.diverza.com/ns/addenda/diverza/1}diverza': s_diverza0,
'{http://www.uif.shcp.gob.mx/recepcion/ari}archivo': s_archivo0,
'{http://www.uif.shcp.gob.mx/recepcion/avi}archivo': s_archivo1,
Expand Down
5 changes: 5 additions & 0 deletions satcfdi/transform/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -3660,6 +3660,8 @@ def solicitud_aceptacion_rechazo0(col, data):
col.add_map(None, 'http://cancelacfd.sat.gob.mx')
col.add_schema('http://cancelacfd.sat.gob.mx SolicitudAceptacionRechazo.xsd')
col.add_base('SolicitudAceptacionRechazo.xsd')
def spei_tercero0(col, data):
pass
def diverza0(col, data):
col.add_map('dvz', 'http://www.diverza.com/ns/addenda/diverza/1')
col.add_schema('http://www.diverza.com/ns/addenda/diverza/1 http://www.diverza.com/schema/xsd/Addenda_Diverza_v1.1.xsd')
Expand Down Expand Up @@ -4100,6 +4102,8 @@ def s_cancelacion1(col, data):
cancelacion1(col, data)
def s_solicitud_aceptacion_rechazo0(col, data):
solicitud_aceptacion_rechazo0(col, data)
def s_spei_tercero0(col, data):
spei_tercero0(col, data)
def s_diverza0(col, data):
if data.get('Version') == '1.1':
diverza0(col, data)
Expand Down Expand Up @@ -4407,6 +4411,7 @@ def s_rsakey_value0(col, data):
'{http://cancelacfd.sat.gob.mx}Cancelacion': s_cancelacion0,
'{http://www.sat.gob.mx/esquemas/retencionpago/1}Cancelacion': s_cancelacion1,
'{http://cancelacfd.sat.gob.mx}SolicitudAceptacionRechazo': s_solicitud_aceptacion_rechazo0,
'SPEI_Tercero': s_spei_tercero0,
'{http://www.diverza.com/ns/addenda/diverza/1}diverza': s_diverza0,
'{http://www.uif.shcp.gob.mx/recepcion/ari}archivo': s_archivo0,
'{http://www.uif.shcp.gob.mx/recepcion/avi}archivo': s_archivo1,
Expand Down
54 changes: 46 additions & 8 deletions satcfdi/transform/xmlify.py
Original file line number Diff line number Diff line change
Expand Up @@ -9095,6 +9095,41 @@ def folios0(name, data):
el = data['Respuesta']
self.append(simple_element('{http://cancelacfd.sat.gob.mx}Respuesta', nsmap={None: 'http://cancelacfd.sat.gob.mx'}, text=el))
return self
def spei_tercero0(name, data):
col = SchemaCollector()
cfdi_schemas[data.tag](col, data)
self = Element('{%s}%s' % ('', name), nsmap=col.nsmap)
el = data['Ordenante']
self.append(ordenante0('Ordenante', el))
el = data['Beneficiario']
self.append(beneficiario0('Beneficiario', el))
self.attrib['FechaOperacion'] = data['FechaOperacion'].isoformat()
self.attrib['Hora'] = str(data['Hora'])
self.attrib['ClaveSPEI'] = str(data['ClaveSPEI'])
self.attrib['sello'] = data['Sello']
self.attrib['numeroCertificado'] = data['NumeroCertificado']
self.attrib['cadenaCDA'] = data['CadenaCDA']
return self
def ordenante0(name, data):
self = Element('{%s}%s' % ('', name), nsmap=data.get('_nsmap') or {None: ''})
self.attrib['BancoEmisor'] = data['BancoEmisor']
self.attrib['Nombre'] = data['Nombre']
self.attrib['TipoCuenta'] = fmt_decimal(data['TipoCuenta'])
self.attrib['Cuenta'] = fmt_decimal(data['Cuenta'])
self.attrib['RFC'] = data['RFC']
return self
def beneficiario0(name, data):
self = Element('{%s}%s' % ('', name), nsmap=data.get('_nsmap') or {None: ''})
self.attrib['BancoReceptor'] = data['BancoReceptor']
self.attrib['Nombre'] = data['Nombre']
self.attrib['TipoCuenta'] = fmt_decimal(data['TipoCuenta'])
self.attrib['Cuenta'] = fmt_decimal(data['Cuenta'])
self.attrib['RFC'] = data['RFC']
self.attrib['Concepto'] = data['Concepto']
if (a := data.get('IVA')) is not None:
self.attrib['IVA'] = fmt_decimal(a)
self.attrib['MontoPago'] = fmt_decimal(data['MontoPago'])
return self
def diverza0(name, data):
col = SchemaCollector()
cfdi_schemas[data.tag](col, data)
Expand Down Expand Up @@ -10124,7 +10159,7 @@ def pagosaextranjeros0(name, data):
self.append(no_beneficiario0('NoBeneficiario', el))
el = data.get('Beneficiario')
if el is not None:
self.append(beneficiario0('Beneficiario', el))
self.append(beneficiario1('Beneficiario', el))
self.attrib['Version'] = data['Version']
self.attrib['EsBenefEfectDelCobro'] = data['EsBenefEfectDelCobro']
return self
Expand All @@ -10134,7 +10169,7 @@ def no_beneficiario0(name, data):
self.attrib['ConceptoPago'] = strcode(data['ConceptoPago'])
self.attrib['DescripcionConcepto'] = data['DescripcionConcepto']
return self
def beneficiario0(name, data):
def beneficiario1(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/esquemas/retencionpago/1/pagosaextranjeros', name), nsmap=data.get('_nsmap') or {'pagosaextranjeros': 'http://www.sat.gob.mx/esquemas/retencionpago/1/pagosaextranjeros'})
self.attrib['RFC'] = data['RFC']
self.attrib['CURP'] = data['CURP']
Expand Down Expand Up @@ -14598,30 +14633,30 @@ def complemento_spei0(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/spei', name), nsmap=col.nsmap)
el = data['SPEI_Tercero']
for r in iterate(el):
self.append(spei_tercero0('SPEI_Tercero', r))
self.append(spei_tercero1('SPEI_Tercero', r))
return self
def spei_tercero0(name, data):
def spei_tercero1(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/spei', name), nsmap=data.get('_nsmap') or {'spei': 'http://www.sat.gob.mx/spei'})
el = data['Ordenante']
self.append(ordenante0('Ordenante', el))
self.append(ordenante1('Ordenante', el))
el = data['Beneficiario']
self.append(beneficiario1('Beneficiario', el))
self.append(beneficiario2('Beneficiario', el))
self.attrib['FechaOperacion'] = data['FechaOperacion'].isoformat()
self.attrib['Hora'] = str(data['Hora'])
self.attrib['ClaveSPEI'] = str(data['ClaveSPEI'])
self.attrib['sello'] = data['Sello']
self.attrib['numeroCertificado'] = data['NumeroCertificado']
self.attrib['cadenaCDA'] = data['CadenaCDA']
return self
def ordenante0(name, data):
def ordenante1(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/spei', name), nsmap=data.get('_nsmap') or {'spei': 'http://www.sat.gob.mx/spei'})
self.attrib['BancoEmisor'] = data['BancoEmisor']
self.attrib['Nombre'] = data['Nombre']
self.attrib['TipoCuenta'] = fmt_decimal(data['TipoCuenta'])
self.attrib['Cuenta'] = fmt_decimal(data['Cuenta'])
self.attrib['RFC'] = data['RFC']
return self
def beneficiario1(name, data):
def beneficiario2(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/spei', name), nsmap=data.get('_nsmap') or {'spei': 'http://www.sat.gob.mx/spei'})
self.attrib['BancoReceptor'] = data['BancoReceptor']
self.attrib['Nombre'] = data['Nombre']
Expand Down Expand Up @@ -14796,6 +14831,8 @@ def s_cancelacion1(data):
return cancelacion1('Cancelacion', data)
def s_solicitud_aceptacion_rechazo0(data):
return solicitud_aceptacion_rechazo0('SolicitudAceptacionRechazo', data)
def s_spei_tercero0(data):
return spei_tercero0('SPEI_Tercero', data)
def s_diverza0(data):
if data.get('Version') == '1.1':
return diverza0('diverza', data)
Expand Down Expand Up @@ -15172,6 +15209,7 @@ def s_rsakey_value0(data):
'{http://cancelacfd.sat.gob.mx}Cancelacion': s_cancelacion0,
'{http://www.sat.gob.mx/esquemas/retencionpago/1}Cancelacion': s_cancelacion1,
'{http://cancelacfd.sat.gob.mx}SolicitudAceptacionRechazo': s_solicitud_aceptacion_rechazo0,
'SPEI_Tercero': s_spei_tercero0,
'{http://www.diverza.com/ns/addenda/diverza/1}diverza': s_diverza0,
'{http://www.uif.shcp.gob.mx/recepcion/ari}archivo': s_archivo0,
'{http://www.uif.shcp.gob.mx/recepcion/avi}archivo': s_archivo1,
Expand Down
7 changes: 7 additions & 0 deletions tests/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

CFDI_FILES = []
CONTABILIDAD_FILES = []
SPEI_FILES = []

walk_path = os.path.join(current_dir, 'cfdi_ejemplos')
for (dirpath, dirnames, filenames) in walk(walk_path):
Expand All @@ -20,6 +21,12 @@
CONTABILIDAD_FILES.append(os.path.join(rel_path, f))


walk_path = os.path.join(current_dir, 'spei_ejemplos')
for (dirpath, dirnames, filenames) in walk(walk_path):
rel_path = os.path.relpath(dirpath, walk_path)
for f in filenames:
SPEI_FILES.append(os.path.join(rel_path, f))

PERSONAS_FISICAS = [
'CACX7605101P8',
'CAÑF770131PA3',
Expand Down
22 changes: 22 additions & 0 deletions tests/spei_ejemplos/cep.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<SPEI_Tercero FechaOperacion="2020-04-01"
Hora="10:04:21"
ClaveSPEI="40021"
sello="sello"
numeroCertificado="2345345342532"
cadenaCDA="cadena"
claveRastreo="12345623452">
<Beneficiario BancoReceptor="BANCO1"
Nombre="JUANITO PEREZ"
TipoCuenta="40"
Cuenta="1234123412421421"
RFC="ABC1234208343"
Concepto="PAGO"
IVA="0.00"
MontoPago="100.00"/>
<Ordenante BancoEmisor="BANCO2"
Nombre="SULTANITA"
TipoCuenta="40"
Cuenta="25345234634254"
RFC="MCF2453ASAS"/>
</SPEI_Tercero>
13 changes: 11 additions & 2 deletions tests/test_contabilidad.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from satcfdi import render
from satcfdi.cfdi import CFDI
from tests.constants import CFDI_FILES, CONTABILIDAD_FILES
from tests.constants import CFDI_FILES, CONTABILIDAD_FILES, SPEI_FILES
from tests.utils import verify_result, XElementPrettyPrinter

module = 'satcfdi'
Expand Down Expand Up @@ -34,4 +34,13 @@ def test_generate_pdf(caplog, xml_file):
os.path.join(current_dir, 'contabilidad_ejemplos', xml_file)
)

verify_invoice(cfdi, xml_file)
verify_invoice(cfdi, xml_file)


@pytest.mark.parametrize('xml_file', SPEI_FILES)
def test_generate_spei_pdf(caplog, xml_file):
cfdi = CFDI.from_file(
os.path.join(current_dir, 'spei_ejemplos', xml_file)
)

verify_invoice(cfdi, xml_file)
Loading

0 comments on commit 56acd43

Please sign in to comment.