Skip to content

Commit 54dc563

Browse files
committed
Fixed Descarga Masiva
1 parent 93eed59 commit 54dc563

File tree

4 files changed

+179
-143
lines changed

4 files changed

+179
-143
lines changed

docs/pages/getting_started/45_cfdi_descarga_massiva.rst

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Descarga Masiva
22
================================================
33

4-
Descarga CFDIs
4+
Descarga CFDIs Emitidos
55
___________________
66

77
.. code-block:: python
@@ -23,7 +23,7 @@ ___________________
2323
)
2424
2525
# Facturas Recibidas
26-
response = sat_service.recover_comprobante_request(
26+
response = sat_service.recover_comprobante_emited_request(
2727
fecha_inicial=date(2020, 1, 1),
2828
fecha_final=date(2020, 12, 1),
2929
rfc_receptor=sat_service.signer.rfc,
@@ -50,6 +50,57 @@ ___________________
5050
pass
5151
5252
53+
Descarga CFDIs Recibidos
54+
___________________
55+
56+
.. code-block:: python
57+
58+
import base64
59+
from datetime import date
60+
61+
from satcfdi.create.catalogos import EstadoComprobante
62+
from satcfdi.models import Signer
63+
from satcfdi.pacs.sat import SAT, TipoDescargaMasivaTerceros, EstadoSolicitud
64+
65+
# Load Fiel
66+
signer = Signer.load(
67+
certificate=open('csd/xiqb891116qe4.cer', 'rb').read(),
68+
key=open('csd/xiqb891116qe4.key', 'rb').read(),
69+
password=open('csd/xiqb891116qe4.txt', 'r').read()
70+
)
71+
72+
sat_service = SAT(
73+
signer=signer
74+
)
75+
76+
# Facturas Recibidas
77+
response = sat_service.recover_comprobante_received_request(
78+
fecha_inicial=date(2020, 1, 1),
79+
fecha_final=date(2020, 12, 1),
80+
rfc_receptor=sat_service.signer.rfc,
81+
tipo_solicitud=TipoDescargaMasivaTerceros.CFDI,
82+
estado_comprobante=EstadoComprobante.VIGENTE, # Puedes especificar un estado si es necesario
83+
)
84+
85+
# Almacenar el id_solicitud en algún lugar
86+
id_solicitud = response['IdSolicitud']
87+
88+
# Revisar estado de descarga
89+
response = sat_service.recover_comprobante_status(id_solicitud)
90+
91+
est = response["EstadoSolicitud"]
92+
if est == EstadoSolicitud.TERMINADA:
93+
for id_paquete in response['IdsPaquetes']:
94+
response, paquete = sat_service.recover_comprobante_download(
95+
id_paquete=id_paquete
96+
)
97+
paquete = base64.b64decode(paquete)
98+
with open(f"{id_paquete}.zip", "wb") as f:
99+
f.write(paquete)
100+
else:
101+
# volver a intentar más tarde
102+
pass
103+
53104
54105
Si ya se tiene una solicitud
55106
______________________________
@@ -64,19 +115,3 @@ ______________________________
64115
f.write(data)
65116
66117
67-
En una sola operacion
68-
______________________________
69-
70-
.. code-block:: python
71-
72-
# En una solo operación se descargan todos los CFDI de un RFC receptor
73-
# No se recomienda cuando el servicio tome mucho tiempo en responder
74-
for paquete_id, data in sat_service.recover_comprobante_iwait(
75-
fecha_inicial=date(2020, 1, 1),
76-
fecha_final=date(2020, 12, 1),
77-
rfc_receptor=sat_service.signer.rfc,
78-
tipo_solicitud=TipoDescargaMasivaTerceros.CFDI
79-
):
80-
with open(f"{paquete_id}.zip", "wb") as f:
81-
f.write(data)
82-

satcfdi/create/catalogos.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22

33

44
class EstadoComprobante(StrEnum):
5-
CANCELADO = '0'
6-
VIGENTE = '1'
5+
CANCELADO = 'Cancelado'
6+
VIGENTE = 'Vigente'
7+
TODOS = 'Todos'

satcfdi/pacs/sat.py

Lines changed: 69 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -813,75 +813,75 @@ def recover_comprobante_download(self, id_paquete: str) -> (dict, str):
813813
needs_token_fn=self._get_token_comprobante
814814
)
815815

816-
def recover_comprobante_iwait(
817-
self,
818-
fecha_inicial: date = None,
819-
fecha_final: date = None,
820-
rfc_receptor: str | Sequence[str] = None,
821-
rfc_emisor: str = None,
822-
tipo_solicitud: TipoDescargaMasivaTerceros | str = TipoDescargaMasivaTerceros.CFDI,
823-
tipo_comprobante: TipoDeComprobante | str = None,
824-
estado_comprobante: EstadoComprobante | str = None,
825-
rfc_a_cuenta_terceros: str = None,
826-
complemento: str = None,
827-
uuid: str | UUID = None,
828-
id_solicitud: str | UUID = None
829-
) -> Iterator[tuple[str, bytes]]:
830-
"""
831-
Itera sobre los paquetes obtenidos
832-
833-
:param fecha_inicial: Solo se buscarán CFDI, cuya fecha de emisión sea igual o mayor a la fecha inicial indicada en este parámetro.
834-
Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).
835-
:param fecha_final: Solo se buscarán CFDI, cuya fecha de emisión sea igual o menor a la fecha final indicada en este parámetro.
836-
Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).
837-
:param rfc_receptor: Contiene el/los RFCs receptores de los cuales se quiere consultar los CFDIs
838-
Importante: El campo RfcReceptor, únicamente permite la captura de 5 registros como máximo
839-
:param rfc_emisor: Contiene el RFC del emisor del cual se quiere consultar los CFDI.
840-
Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).
841-
:param tipo_solicitud: Define el tipo de descarga
842-
:param tipo_comprobante: Define el tipo de comprobante
843-
:param estado_comprobante: Define el estado del comprobante
844-
:param rfc_a_cuenta_terceros: Contiene el RFC del a cuenta a tercero del cual se quiere consultar los CFDIs
845-
:param complemento: Define el complemento de CFDI a descargar
846-
:param uuid: Folio Fiscal
847-
:param id_solicitud: Si ya se cuenta con el id de una solicitud anterior, solo pasar este parametro
848-
:return: Iterador sobre packetes y su contenido en bytes
849-
"""
850-
if not id_solicitud:
851-
response = self.recover_comprobante_request(
852-
fecha_inicial=fecha_inicial,
853-
fecha_final=fecha_final,
854-
rfc_receptor=rfc_receptor,
855-
rfc_emisor=rfc_emisor,
856-
tipo_solicitud=tipo_solicitud,
857-
tipo_comprobante=tipo_comprobante,
858-
estado_comprobante=estado_comprobante,
859-
rfc_a_cuenta_terceros=rfc_a_cuenta_terceros,
860-
complemento=complemento,
861-
uuid=uuid
862-
)
863-
_service_logger("SolicitaDescargaResult", response)
864-
id_solicitud = response['IdSolicitud']
865-
time.sleep(self.wait_time)
866-
867-
while True:
868-
response = self.recover_comprobante_status(
869-
id_solicitud=id_solicitud
870-
)
871-
_service_logger("VerificaSolicitudDescargaResult", response)
872-
est = response["EstadoSolicitud"]
873-
if est == EstadoSolicitud.TERMINADA:
874-
for id_paquete in response['IdsPaquetes']:
875-
response, paquete = self.recover_comprobante_download(
876-
id_paquete=id_paquete
877-
)
878-
_service_logger("RespuestaDescargaMasivaTercerosSalida", response)
879-
yield id_paquete, base64.b64decode(paquete)
880-
break
881-
if est in [EstadoSolicitud.ACEPTADA, EstadoSolicitud.EN_PROCESO]:
882-
time.sleep(self.wait_time)
883-
continue
884-
break
816+
# def recover_comprobante_iwait(
817+
# self,
818+
# fecha_inicial: date = None,
819+
# fecha_final: date = None,
820+
# rfc_receptor: str | Sequence[str] = None,
821+
# rfc_emisor: str = None,
822+
# tipo_solicitud: TipoDescargaMasivaTerceros | str = TipoDescargaMasivaTerceros.CFDI,
823+
# tipo_comprobante: TipoDeComprobante | str = None,
824+
# estado_comprobante: EstadoComprobante | str = None,
825+
# rfc_a_cuenta_terceros: str = None,
826+
# complemento: str = None,
827+
# uuid: str | UUID = None,
828+
# id_solicitud: str | UUID = None
829+
# ) -> Iterator[tuple[str, bytes]]:
830+
# """
831+
# Itera sobre los paquetes obtenidos
832+
#
833+
# :param fecha_inicial: Solo se buscarán CFDI, cuya fecha de emisión sea igual o mayor a la fecha inicial indicada en este parámetro.
834+
# Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).
835+
# :param fecha_final: Solo se buscarán CFDI, cuya fecha de emisión sea igual o menor a la fecha final indicada en este parámetro.
836+
# Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).
837+
# :param rfc_receptor: Contiene el/los RFCs receptores de los cuales se quiere consultar los CFDIs
838+
# Importante: El campo RfcReceptor, únicamente permite la captura de 5 registros como máximo
839+
# :param rfc_emisor: Contiene el RFC del emisor del cual se quiere consultar los CFDI.
840+
# Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).
841+
# :param tipo_solicitud: Define el tipo de descarga
842+
# :param tipo_comprobante: Define el tipo de comprobante
843+
# :param estado_comprobante: Define el estado del comprobante
844+
# :param rfc_a_cuenta_terceros: Contiene el RFC del a cuenta a tercero del cual se quiere consultar los CFDIs
845+
# :param complemento: Define el complemento de CFDI a descargar
846+
# :param uuid: Folio Fiscal
847+
# :param id_solicitud: Si ya se cuenta con el id de una solicitud anterior, solo pasar este parametro
848+
# :return: Iterador sobre packetes y su contenido en bytes
849+
# """
850+
# if not id_solicitud:
851+
# response = self.recover_comprobante_request(
852+
# fecha_inicial=fecha_inicial,
853+
# fecha_final=fecha_final,
854+
# rfc_receptor=rfc_receptor,
855+
# rfc_emisor=rfc_emisor,
856+
# tipo_solicitud=tipo_solicitud,
857+
# tipo_comprobante=tipo_comprobante,
858+
# estado_comprobante=estado_comprobante,
859+
# rfc_a_cuenta_terceros=rfc_a_cuenta_terceros,
860+
# complemento=complemento,
861+
# uuid=uuid
862+
# )
863+
# _service_logger("SolicitaDescargaResult", response)
864+
# id_solicitud = response['IdSolicitud']
865+
# time.sleep(self.wait_time)
866+
#
867+
# while True:
868+
# response = self.recover_comprobante_status(
869+
# id_solicitud=id_solicitud
870+
# )
871+
# _service_logger("VerificaSolicitudDescargaResult", response)
872+
# est = response["EstadoSolicitud"]
873+
# if est == EstadoSolicitud.TERMINADA:
874+
# for id_paquete in response['IdsPaquetes']:
875+
# response, paquete = self.recover_comprobante_download(
876+
# id_paquete=id_paquete
877+
# )
878+
# _service_logger("RespuestaDescargaMasivaTercerosSalida", response)
879+
# yield id_paquete, base64.b64decode(paquete)
880+
# break
881+
# if est in [EstadoSolicitud.ACEPTADA, EstadoSolicitud.EN_PROCESO]:
882+
# time.sleep(self.wait_time)
883+
# continue
884+
# break
885885

886886
def recover_retencion_request(
887887
self,

0 commit comments

Comments
 (0)