From d62c579b4672de74c1f438cacddac6a551739127 Mon Sep 17 00:00:00 2001 From: SatCFDI Date: Wed, 10 Apr 2024 18:53:33 -0600 Subject: [PATCH] updated test requirements --- satcfdi/accounting/contabilidad.py | 51 +++++--- satcfdi/accounting/contabilidad_print.py | 6 +- satcfdi/zip.py | 20 ++- tests/test_contabilidad.py | 120 ++++++++++++------ .../ref/simple_zip/CACX7605101P8202402BN.xlsx | Bin 0 -> 5905 bytes .../ref/simple_zip/CACX7605101P8202402BN.zip | Bin 0 -> 461 bytes .../ref/simple_zip/CACX7605101P8202402CT.zip | Bin 0 -> 533 bytes .../ref/simple_zip/CACX7605101P8202402PL.zip | Bin 0 -> 584 bytes .../ref/simple_zip/CACX7605101P8202402XC.zip | Bin 0 -> 550 bytes .../ref/simple_zip/CACX7605101P8202402XF.zip | Bin 0 -> 494 bytes 10 files changed, 130 insertions(+), 67 deletions(-) create mode 100644 tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402BN.xlsx create mode 100644 tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402BN.zip create mode 100644 tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402CT.zip create mode 100644 tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402PL.zip create mode 100644 tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402XC.zip create mode 100644 tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402XF.zip diff --git a/satcfdi/accounting/contabilidad.py b/satcfdi/accounting/contabilidad.py index c868bda..fe382ee 100644 --- a/satcfdi/accounting/contabilidad.py +++ b/satcfdi/accounting/contabilidad.py @@ -1,7 +1,9 @@ import os from typing import Sequence -from satcfdi.catalogs import select +from satcfdi.zip import zip_create, ZipData, zip_file + +from satcfdi.catalogs import select, catalog_code from satcfdi.utils import iterate @@ -31,21 +33,28 @@ def filename(file): raise ValueError(f"Unknown file type: {file.tag}") -def output_file(file, folder, fiel=None, generate_pdf=False): +def output_file(file, folder, fiel=None, generate_pdf=False, zip_xml=False): if fiel: file.sign(fiel) output_file = os.path.join(folder, filename(file)) - file.xml_write( - output_file, - pretty_print=True, - xml_declaration=True - ) + if zip_xml: + zip_file(output_file[:-4] + '.zip', [ + ZipData( + filename(file), + file.xml_bytes(xml_declaration=True) + ) + ]) + else: + file.xml_write( + output_file, + pretty_print=True, + xml_declaration=True + ) + if generate_pdf: - # render.html_write(file, output_file[:-4] + ".html") render.pdf_write(file, output_file[:-4] + ".pdf") else: - # delete file try: os.remove(output_file[:-4] + ".pdf") except FileNotFoundError: @@ -66,7 +75,9 @@ def generar_contabilidad( numero_tramite=None, folder=None, fiel=None, - generate_pdf=False): + generate_pdf=False, + zip_xml=False +): validate_cuentas(cuentas) validate_polizas(polizas) calcular_saldos(cuentas, polizas) @@ -80,7 +91,7 @@ def generar_contabilidad( num_tramite=numero_tramite, poliza=polizas ) - output_file(plz, folder, fiel, generate_pdf=generate_pdf) + output_file(plz, folder, fiel, generate_pdf=generate_pdf, zip_xml=zip_xml) cat = Catalogo( rfc=rfc_emisor, @@ -88,7 +99,7 @@ def generar_contabilidad( anio=dp.year, ctas=[ Ctas( - cod_agrup=v["CodAgrup"].split("_")[0], + cod_agrup=v["CodAgrup"], num_cta=k, desc=v["Desc"], nivel=v["Nivel"], @@ -97,7 +108,7 @@ def generar_contabilidad( ) for k, v in cuentas.items() ] ) - cato = output_file(cat, folder, fiel) + output_file(cat, folder, fiel, zip_xml=zip_xml) ban = Balanza( rfc=rfc_emisor, @@ -110,7 +121,7 @@ def generar_contabilidad( **v, } for k, v in cuentas.items() if v["SaldoIni"] or v["Debe"] or v["Haber"] or v["SaldoFin"]], ) - bano = output_file(ban, folder, fiel) + output_file(ban, folder, fiel, zip_xml=zip_xml) aux_detalles = group_aux_cuentas(polizas) aux = AuxiliarCtas( @@ -130,7 +141,7 @@ def generar_contabilidad( ) for k, v in cuentas.items() if k in aux_detalles ] ) - output_file(aux, folder, fiel, generate_pdf=generate_pdf) + output_file(aux, folder, fiel, generate_pdf=generate_pdf, zip_xml=zip_xml) auxf = RepAuxFol( rfc=rfc_emisor, @@ -141,11 +152,11 @@ def generar_contabilidad( num_tramite=numero_tramite, det_aux_fol=list(group_aux_folios(polizas)) ) - output_file(auxf, folder, fiel, generate_pdf=generate_pdf) + output_file(auxf, folder, fiel, generate_pdf=generate_pdf, zip_xml=zip_xml) imprimir_contablidad( - catalogo_cuentas=cato, - balanza_comprobacion=bano, + catalogo_cuentas=cat, + balanza_comprobacion=ban, archivo_excel=os.path.join(folder, filename(ban)[:-4] + ".xlsx") ) @@ -209,7 +220,9 @@ def validate_cuentas(cuentas): v['Nivel'] = cuentas[v['SubCtaDe']]['Nivel'] + 1 else: v['Nivel'] = 1 - assert select('Cb9f_c_CodAgrup', v['CodAgrup'].split("_")[0]), f"Unknown CodAgrup: {v['CodAgrup']}" + + v['CodAgrup'] = catalog_code('Cb9f_c_CodAgrup', v['CodAgrup']) + assert v['CodAgrup'].description, f"Unknown CodAgrup: {v['CodAgrup']}" for k, v in cuentas.items(): if v['SubCtaDe']: diff --git a/satcfdi/accounting/contabilidad_print.py b/satcfdi/accounting/contabilidad_print.py index 5d75a1a..eba2b5f 100644 --- a/satcfdi/accounting/contabilidad_print.py +++ b/satcfdi/accounting/contabilidad_print.py @@ -22,10 +22,8 @@ def imprimir_contablidad( balanza_comprobacion, archivo_excel ): - ct = CFDI.from_file(catalogo_cuentas) - bc = CFDI.from_file(balanza_comprobacion) - # ct = catalogo_cuentas - # bc = balanza_comprobacion + ct = catalogo_cuentas + bc = balanza_comprobacion ctas = { c['NumCta']: { diff --git a/satcfdi/zip.py b/satcfdi/zip.py index 9dbe1d4..45bf6ab 100644 --- a/satcfdi/zip.py +++ b/satcfdi/zip.py @@ -8,8 +8,8 @@ def zip_create(target: io.BytesIO, files: list[ZipData]): p = target.tell() - for f in files: - with ZipFile(target, "w") as myzip: + with ZipFile(target, "w") as myzip: + for f in files: zinfo = ZipInfo( filename=f.filename ) @@ -24,3 +24,19 @@ def zip_create(target: io.BytesIO, files: list[ZipData]): with target.getbuffer() as view: # change zip flag bytes view[p + 6:p + 8] = b"\x08\x08" + + +def zip_file(zipfile, files: list[ZipData]): + # Create a ZipFile object in write mode + with ZipFile(zipfile, 'w') as zipf: + # Add the input file to the zip archive with its base name + for f in files: + zinfo = ZipInfo( + filename=f.filename, + # date_time=datetime_to_tuple(datetime.now()) + ) + zinfo.compress_type = 8 + zinfo.create_system = 0 + + with zipf.open(zinfo, 'w') as stream: + stream.write(f.data) diff --git a/tests/test_contabilidad.py b/tests/test_contabilidad.py index c8fac91..7d05498 100644 --- a/tests/test_contabilidad.py +++ b/tests/test_contabilidad.py @@ -1,7 +1,9 @@ import datetime import logging import os +from unittest import mock from uuid import UUID +from zipfile import ZipInfo import pytest import yaml @@ -69,59 +71,93 @@ def test_generate_contabilidad_empty(): ) +polizas = [ + Poliza( + num_un_iden_pol="1", + fecha=datetime.date(2024, 2, 1), + concepto="Compra de equipo de computo", + transaccion=[ + Transaccion( + num_cta="1020.01", + des_cta="Bancos", + concepto="Nal", + debe=10000, + haber=0, + comp_nal=[ + CompNal( + uuid_cfdi='a4f4fea5-e798-4ab3-a2e5-75f741f4ecca', + rfc="CACX7605101P8", + monto_total=10000 + ) + ] + ), + Transaccion( + num_cta="1020.02", + des_cta="Bancos", + concepto="Ext", + debe=0, + haber=10000, + comp_nal=[ + CompNal( + uuid_cfdi='a4f4fea5-e798-4ab3-a2e5-75f741f4ecca', + rfc="CACX7605101P8", + monto_total=10000 + ) + ] + ) + ] + ) +] + + def test_generate_contabilidad_simple(): - os.makedirs(os.path.join(current_dir, 'test_contabilidad_electronica/out/simple'), exist_ok=True) + path = 'simple' + os.makedirs(os.path.join(current_dir, 'test_contabilidad_electronica/out', path), exist_ok=True) with open(os.path.join(current_dir, 'contabilidad_electronica', 'cuentas.yaml'), 'r', encoding='utf-8') as f: cuentas = yaml.load(f, Loader=yaml.SafeLoader) - polizas = [ - Poliza( - num_un_iden_pol="1", - fecha=datetime.date(2024, 2, 1), - concepto="Compra de equipo de computo", - transaccion=[ - Transaccion( - num_cta="1020.01", - des_cta="Bancos", - concepto="Nal", - debe=10000, - haber=0, - comp_nal=[ - CompNal( - uuid_cfdi='a4f4fea5-e798-4ab3-a2e5-75f741f4ecca', - rfc="CACX7605101P8", - monto_total=10000 - ) - ] - ), - Transaccion( - num_cta="1020.02", - des_cta="Bancos", - concepto="Ext", - debe=0, - haber=10000, - comp_nal=[ - CompNal( - uuid_cfdi='a4f4fea5-e798-4ab3-a2e5-75f741f4ecca', - rfc="CACX7605101P8", - monto_total=10000 - ) - ] - ) - ] - ) - ] generar_contabilidad( dp=DatePeriod(2024, 2), rfc_emisor="CACX7605101P8", cuentas=cuentas, polizas=polizas, - folder=os.path.join(current_dir, 'test_contabilidad_electronica/out/simple'), - tipo_solicitud='AF' + folder=os.path.join(current_dir, 'test_contabilidad_electronica/out', path), + tipo_solicitud='AF', + zip_xml=False ) assert compare_directories( - os.path.join(current_dir, 'test_contabilidad_electronica/ref/simple'), - os.path.join(current_dir, 'test_contabilidad_electronica/out/simple') + os.path.join(current_dir, 'test_contabilidad_electronica/ref', path), + os.path.join(current_dir, 'test_contabilidad_electronica/out', path) + ) + + +def test_generate_contabilidad_zip(): + path = 'simple_zip' + os.makedirs(os.path.join(current_dir, 'test_contabilidad_electronica/out', path), exist_ok=True) + + with open(os.path.join(current_dir, 'contabilidad_electronica', 'cuentas.yaml'), 'r', encoding='utf-8') as f: + cuentas = yaml.load(f, Loader=yaml.SafeLoader) + + def zi(filename): + return ZipInfo( + filename=filename, + date_time=(2022, 11, 8, 11, 41, 8) # time.localtime(time.time())[:6] + ) + + with mock.patch(f'{module}.zip.ZipInfo', zi) as m: + generar_contabilidad( + dp=DatePeriod(2024, 2), + rfc_emisor="CACX7605101P8", + cuentas=cuentas, + polizas=polizas, + folder=os.path.join(current_dir, 'test_contabilidad_electronica/out', path), + tipo_solicitud='AF', + zip_xml=True + ) + + assert compare_directories( + os.path.join(current_dir, 'test_contabilidad_electronica/ref', path), + os.path.join(current_dir, 'test_contabilidad_electronica/out', path) ) diff --git a/tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402BN.xlsx b/tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402BN.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..be6852c30e94a3e39382d8409d5a9472912ab466 GIT binary patch literal 5905 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 literal 0 HcmV?d00001 diff --git a/tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402BN.zip b/tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402BN.zip new file mode 100644 index 0000000000000000000000000000000000000000..4811acd9655852e9607cc4f7fdbaf8e72701188e GIT binary patch literal 461 zcmWIWW@Zs#U|`^2P>Ib5UFg)?YRSmJAjZtVAPE$8c65#~H#0CbG%yUXFfuSQF)(uS z)2qnMS$iou`;dVM!-MjA*Aw3J&n&&`+7)UNY!)!_Wn2EFZ423M9WlK)?eDLnT1E#? z%GGc^fAYk7XX)?KiOqX8dar1G(om8U(7L!XB=SkE&hfW>*WYj5jcmpX zHr$)*!i&; literal 0 HcmV?d00001 diff --git a/tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402CT.zip b/tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402CT.zip new file mode 100644 index 0000000000000000000000000000000000000000..ac71b8f5a286f9a6058f08da7b442553a3ed0e00 GIT binary patch literal 533 zcmWIWW@Zs#U|`^2P>Ib5_1eMK-^j?o@ScT%K@uqH?C2a}Zf0O=XkZv%VPs%rVqoMP zqF0fdvvi7oev^Sj`}?}CW#ayem-givE-GBH{H)IJ>34lv*>)%FzPPC7&t9XFHQXna z%^8Y*_QJU*dar1``7QTWd12CAkEv~cr$0Y>)VJQ~U2jre<+5N|ai_?< zwm@6uirAS8H_JZi-74?w^zHZF^c`P=_I}%@D)?-(Ky;qRl7}~<(u^LSobzKfqb1Yg ze5Q2=mrmTD@VjyO=P3qWwV%rBzl-EIlq*i%7;}_q@pUWCZ+jWt`nxrbTr{cLy>C&Y z|KE1$o_DM@a;Xx&Q?DqdO^Izfb7JAjh;pe-Aua0!1Hv1u*FWe9pT*K&&GC2d#Ac&Q zCr!?F^Plk7bUU5IeflcHWuF-qM=swuHMgy4dXc)(jb`<{Zkr>Ib5mH!bZy@ip1;RQ1TgCtPY+0i+|+|0n#(7-Uj!pOkL#K0)P zN3S9`=j`Ob{96VB$M63XnHFE+^`^x@B5OrNhKWklLeXVe`Y#?yY?yMxq|9xL|9SOx74CQTg7eszO z_*?!^%=pi-XC=3kpJeerS*T}THPO4*(64DyNEdU=o+_I!7G4qFCl(*(R9R*d=1}DM zq`0>@<33B)R^#-d<8k2&bU7NEGq_dw8X5U_-oNzh(!5sv9jwXgU-AcRIX*LI^T&lx zv{N=65-s__cfYK0XUgWtGuu6_;*W?dirq5V;LDR2pKo+4NLL7)T4*ly&Mk05_Y#2* z?Xr&*&fc=nh+DPk9A|a<)A>AY^~M#~cZfHyf2Qa9U%XlTIb5J@ai=|0G5RhTF^x43a=mXGiA;IbI-PU>a;b4?F_n|YPM&$?xMvHPo@;uJ)-58gr0a%7u}@#vE!ic#B`nc&-m^6kM_H$TzBVL zH(^ufl!I5Yrf&>c!p@WT_14+B7rok-ow>0^p?>}Gebe`sc(uiS@t*p?d;9k`cdOp$ z_)RAn68>+0!aIrQ%&acALkdBH-7N`>4l~z~?U4%D*jgsea3|(qKUn*Y(DP=j)=b3wg2B6`@H`*|Nk%Q@3lqUQeSg-KcmZip9Z77f))Ay xXFaTEv0GE#e)55NfHxzP2m|h@1jZ&9GytO)Ps9dzv$BB{Fan`FkUj}k4gj|||f literal 0 HcmV?d00001 diff --git a/tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402XF.zip b/tests/test_contabilidad_electronica/ref/simple_zip/CACX7605101P8202402XF.zip new file mode 100644 index 0000000000000000000000000000000000000000..3c942956110a880dc82d57432da4cf4d909f3fc6 GIT binary patch literal 494 zcmWIWW@Zs#U|`^2P>Ib5?Y4`0AH~SP(9XobAPE$8c65#~H#0CbG%yUXFfuSQF))g7 z)2qnMSsE0Z-((JIia?TJ}q7lnq~9m=l=(4BBBds|c^fJ|j9oYV zO@G+)s6{&!*psDYudl8xyIQ37I7o0_AjiG;`xfTz6nHbqqNPwozFGXu?Hl*{6eEHq zo!&SI6skGBNI2g7;6T>K>%GRyZrQX1F8b|lHnI7SSBeYoB7Z*Cc~9&QOkTI4YUbga z91ZhpbyneAktq8x$7aoO(yiY-4g#wZgxkyB*K6@N`SEf1`WVy!V^IO-mGjO1&l!G4x}f7l>-0*Grsl! literal 0 HcmV?d00001