PACS

class satcfdi.pacs.PAC(environment)[source]

Bases: object

RFC = None
status(cfdi: CFDI) dict[source]

Consulta el estado de un CFDI :return: Respuesta de la consulta

validate(cfdi: CFDI)[source]
issue(cfdi: CFDI, accept: Accept = Accept.XML) Document[source]

Operation to request CFDI be sealed and stamped by PAC :param accept: :param cfdi: :return:

stamp(cfdi: CFDI, accept: Accept = Accept.XML) Document[source]

Operation to request sealed CFDI be stamped by PAC :param accept: :param cfdi: :return: document_id and bytes of stamped xml

recover(document_id: str, accept: Accept = Accept.XML) Document[source]
Parameters
  • accept

  • document_id

Returns

cancel(cfdi: CFDI, reason: CancelReason, substitution_id: Optional[str] = None, signer: Optional[Signer] = None) CancelationAcknowledgment[source]

Operation to request single cfdi to be canceled :param signer: :param cfdi: :param substitution_id: :param reason: :return:

cancel_comprobante(cancelation: Cancelacion) CancelationAcknowledgment[source]
cancel_retencion(cancelation: Cancelacion) CancelationAcknowledgment[source]
accept_reject(request: SolicitudAceptacionRechazo) AcceptRejectAcknowledgment[source]
pending(rfc: str) list[str][source]
list_69b(rfc: str) TaxpayerStatus[source]
class satcfdi.pacs.Accept(value)[source]

Bases: Flag

An enumeration.

NOTHING = 0
XML = 1
PDF = 2
XML_PDF = 3
class satcfdi.pacs.Document(document_id: str, xml: bytes = None, pdf: bytes = None)[source]

Bases: object

document_id: str
xml: bytes = None
pdf: bytes = None
property cfdi: CFDI
class satcfdi.pacs.CancelationAcknowledgment(code: str | dict, acuse: bytes = None)[source]

Bases: object

code: str | dict
acuse: bytes = None
class satcfdi.pacs.AcceptRejectAcknowledgment(folios: dict, acuse: bytes = None)[source]

Bases: object

folios: dict
acuse: bytes = None
class satcfdi.pacs.CancelReason(value)[source]

Bases: Enum

An enumeration.

COMPROBANTE_EMITIDO_CON_ERRORES_CON_RELACION = '01'

– Comprobante emitido con errores con relación –

Este supuesto aplica cuando la factura generada contiene un error en la clave del producto, valor unitario, descuento o cualquier otro dato, por lo que se debe reexpedir. En este caso, primero se sustituye la factura y cuando se solicita la cancelación, se incorpora el folio de la factura que sustituye a la cancelada.

¿Qué debo hacer si uso el motivo de cancelación “01” Comprobantes emitidos con errores con relación y el comprobante no se cancela o presenta error?

Se podrá utilizar la clave 02 para realizar la cancelación de los CFDI relacionados incluyendo el que sustituye al CFDI a cancelar, esto con la finalidad de que no se genere un estatus de “No cancelable”

En los casos en los que subsista la operación, se deberá emitir un nuevo comprobante con la información correcta y la clave de tipo relación 04 sustitución de CFDI previos relacionando el folio fiscal del comprobante que se sustituye

COMPROBANTE_EMITIDO_CON_ERRORES_SIN_RELACION = '02'

– Comprobante emitido con errores sin relación –

Este supuesto aplica cuando la factura generada contiene un error en la clave del producto, valor unitario, descuento o cualquier otro dato y no se requiera relacionar con otra factura generada.

NO_SE_LLEVO_A_CABO_LA_OPERACION = '03'

– No se llevó a cabo la operación –

Este supuesto aplica cuando se facturó una operación que no se concreta.

OPERACION_NORMATIVA_RELACIONADA_EN_LA_FACTURA_GLOBAL = '04'

– Operación nominativa relacionada en la factura global –

Este supuesto aplica cuando se incluye una venta en la factura global de operaciones con el público en general y posterior a ello, el cliente solicita su factura nominativa, lo que conlleva a cancelar la factura global y reexpedirla, así como generar la factura nominativa al cliente.

class satcfdi.pacs.TaxpayerStatus(value)[source]

Bases: Enum

An enumeration.

PRESUNTO = 'Presunto'

Cuando la autoridad fiscal detecta que un contribuyente ha estado emitiendo comprobantes de manera irregular, se presumirá la inexistencia de las operaciones amparadas en tales comprobantes.

En este supuesto, procederá a notificar a los contribuyentes que se encuentren en dicha situación a través de su buzón tributario, de la página de internet del Servicio de Administración Tributaria, así como mediante una publicación en el Diario Oficial de la Federación.

Type

PRESUNTO

SENTENCIA_FAVORABLE = 'Sentencia Favorable'

El contribuyente tiene treinta días para acreditar que efectivamente sus operaciones son reales, si logra corregir su situación se publica este estado.

Type

SENTENCIA FAVORABLE

DEFINITIVO = 'Definitivo'

Si el contribuyente no atiende el llamado de la autoridad en quince días a partir de la última de las notificaciones o el contribuyente no pueda desvirtuar la existencia de sus operaciones se publica este estado.

Type

DEFINITIVO

DESVIRTUADO = 'Desvirtuado'

Cuando el contribuyente aporte a la autoridad fiscal la documentación e información que consideren pertinentes para desvirtuar los hechos que llevaron a notificarlos con un plazo de quince días contados a partir de la última de las notificaciones que se hayan efectuado.

Type

DESVIRTUADO

class satcfdi.pacs.Environment(value)[source]

Bases: Enum

An enumeration.

PRODUCTION = 1
TEST = 2

Proveedores Autorizados de Certificación

class satcfdi.pacs.comerciodigital.ComercioDigital(user: str, password: str, environment=Environment.PRODUCTION)[source]

Bases: PAC

RFC = 'SCD110105654'
issue(cfdi: CFDI, accept: Accept = Accept.XML) Document[source]

Operation to request CFDI be sealed and stamped by PAC :param accept: :param cfdi: :return:

stamp(cfdi: CFDI, accept: Accept = Accept.XML) Document[source]

Operation to request sealed CFDI be stamped by PAC :param accept: :param cfdi: :return: document_id and bytes of stamped xml

cancel(cfdi: CFDI, reason: CancelReason, substitution_id: Optional[str] = None, signer: Optional[Signer] = None) CancelationAcknowledgment[source]

Operation to request single cfdi to be canceled :param signer: :param cfdi: :param substitution_id: :param reason: :return:

recover(document_id: str, accept: Accept = Accept.XML) Document[source]
Parameters
  • accept

  • document_id

Returns

rfc_valid(rfc: str | list[str]) bool | list[bool][source]
class satcfdi.pacs.diverza.Diverza(rfc: str, id: str, token: str, environment=Environment.PRODUCTION)[source]

Bases: PAC

Class to call Diverza API’s see https://diverza.docs.apiary.io/ for more information

RCF = 'SNF171020F3A'
issue(cfdi: CFDI, accept: Accept = Accept.XML, ref_id: Optional[str] = None) Document[source]

Operation to request CFDI be sealed and stamped by PAC :param accept: :param cfdi: :return:

stamp(cfdi: CFDI, accept: Accept = Accept.XML, ref_id: Optional[str] = None) Document[source]

Operation to request sealed CFDI be stamped by PAC :param accept: :param cfdi: :return: document_id and bytes of stamped xml

cancel(cfdi: CFDI, reason: CancelReason, substitution_id: Optional[str] = None, signer: Optional[Signer] = None) CancelationAcknowledgment[source]

Operation to request single cfdi to be canceled :param signer: :param cfdi: :param substitution_id: :param reason: :return:

recover(document_id: str, accept: Accept = Accept.XML) Document[source]
Parameters
  • accept

  • document_id

Returns

rfc_valid(rfc: str | list[str]) bool | list[bool][source]
class satcfdi.pacs.prodigia.Prodigia(user: str, password: str, contrato: str, environment=Environment.PRODUCTION)[source]

Bases: PAC

PAC de facturacion Prodigia

Documentacion: https://www.prodigia.com.mx/api-de-integracion-para-timbrado-de-cfdi

RFC = 'PPD101129EA3'
issue(cfdi: CFDI, accept: Accept = Accept.XML) Document[source]

Operation to request CFDI be sealed and stamped by PAC :param accept: :param cfdi: :return:

stamp(cfdi: CFDI, accept: Accept = Accept.XML) Document[source]

Operation to request sealed CFDI be stamped by PAC :param accept: :param cfdi: :return: document_id and bytes of stamped xml

cancel(cfdi: CFDI, reason: CancelReason, substitution_id: Optional[str] = None, signer: Optional[Signer] = None) CancelationAcknowledgment[source]

Operation to request single cfdi to be canceled :param signer: :param cfdi: :param substitution_id: :param reason: :return:

recover(document_id: str, accept: Accept = Accept.XML) Document[source]
Parameters
  • accept

  • document_id

Returns

rfc_valid(rfc: str | list[str]) bool | list[bool][source]
class satcfdi.pacs.swsapien.SWSapien(token=None, user=None, password=None, environment=Environment.PRODUCTION)[source]

Bases: PAC

Luna Soft, S.A. de C.V. SW sapien-SmarterWEB

RFC = 'LSO1306189R5'
validate(cfdi: CFDI)[source]
issue(cfdi: CFDI, accept: Accept = Accept.XML, ref_id: Optional[str] = None) Document[source]

Operation to request CFDI be sealed and stamped by PAC :param accept: :param cfdi: :return:

stamp(cfdi: CFDI, accept: Accept = Accept.XML, ref_id: Optional[str] = None) Document[source]

Operation to request sealed CFDI be stamped by PAC :param accept: :param cfdi: :return: document_id and bytes of stamped xml

recover(document_id: str, accept: Accept = Accept.XML) Document[source]
Parameters
  • accept

  • document_id

Returns

cancel(cfdi: CFDI, reason: CancelReason, substitution_id: Optional[str] = None, signer: Optional[Signer] = None) CancelationAcknowledgment[source]

Operation to request single cfdi to be canceled :param signer: :param cfdi: :param substitution_id: :param reason: :return:

cancel_comprobante(cancelation: Cancelacion) CancelationAcknowledgment[source]
cancel_retencion(cancelation: Cancelacion) CancelationAcknowledgment[source]
relations(cfdi: CFDI)[source]
accept_reject(request: SolicitudAceptacionRechazo) AcceptRejectAcknowledgment[source]
pending(rfc: str) list[str][source]
rfc_valid(rfc: str | list[str]) bool | list[bool][source]
list_69b(rfc: str) TaxpayerStatus[source]

sat

class satcfdi.pacs.sat.EstadoSolicitud(value)[source]

Bases: IntEnum

An enumeration.

Aceptada = 1
EnProceso = 2
Terminada = 3
Error = 4
Rechazada = 5
Vencida = 6
class satcfdi.pacs.sat.TipoDescargaMasivaTerceros(value)[source]

Bases: Enum

An enumeration.

CFDI = 'CFDI'
Metadata = 'Metadata'
class satcfdi.pacs.sat.TipoDeComprobante(value)[source]

Bases: Enum

An enumeration.

Ingreso = 'I'
Egreso = 'E'
Traslado = 'T'
Nomina = 'N'
Pago = 'P'
class satcfdi.pacs.sat.EstadoComprobante(value)[source]

Bases: Enum

An enumeration.

Cancelado = '0'
Vigente = '1'
class satcfdi.pacs.sat.SAT(signer: Optional[Signer] = None, environment=Environment.PRODUCTION)[source]

Bases: PAC

RFC = 'SAT970701NN3'
status(cfdi: CFDI) dict[source]

Consulta el estado de un CFDI :return: Respuesta de la consulta

validate(cfdi: CFDI)[source]

verify if the CFDI is valid based on its signatures and certificates this method might need improvements :return: True is all certificate and signatures verifications passed

list_69b(rfc: str) TaxpayerStatus[source]
recover_comprobante_request(fecha_inicial: Optional[date] = None, fecha_final: Optional[date] = None, rfc_receptor: Optional[Union[str, Sequence[str]]] = None, rfc_emisor: Optional[str] = None, tipo_solicitud: satcfdi.pacs.sat.TipoDescargaMasivaTerceros | str = TipoDescargaMasivaTerceros.CFDI, tipo_comprobante: Optional[Union[TipoDeComprobante, str]] = None, estado_comprobante: Optional[Union[EstadoComprobante, str]] = None, rfc_a_cuenta_terceros: Optional[str] = None, complemento: Optional[str] = None, uuid: Optional[Union[str, UUID]] = None) dict[source]

Esta operación permite solicitar la descarga de CFDIs o Metadata y como resultado devuelve un id de solicitud o estatus de la petición realizada.

Parameters
  • 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. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • 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. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • rfc_receptor – Contiene el/los RFCs receptores de los cuales se quiere consultar los CFDIs Importante: El campo RfcReceptor, únicamente permite la captura de 5 registros como máximo

  • rfc_emisor – Contiene el RFC del emisor del cual se quiere consultar los CFDI. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • tipo_solicitud – Define el tipo de descarga

  • tipo_comprobante – Define el tipo de comprobante

  • estado_comprobante – Define el estado del comprobante

  • rfc_a_cuenta_terceros – Contiene el RFC del a cuenta a tercero del cual se quiere consultar los CFDIs

  • complemento – Define el complemento de CFDI a descargar

  • uuid – Folio Fiscal

Returns

respuesta de solicitud de descarga

recover_comprobante_status(id_solicitud: str) dict[source]
recover_comprobante_download(id_paquete: str) -> (<class 'dict'>, <class 'str'>)[source]
recover_comprobante_iwait(fecha_inicial: Optional[date] = None, fecha_final: Optional[date] = None, rfc_receptor: Optional[Union[str, Sequence[str]]] = None, rfc_emisor: Optional[str] = None, tipo_solicitud: satcfdi.pacs.sat.TipoDescargaMasivaTerceros | str = TipoDescargaMasivaTerceros.CFDI, tipo_comprobante: Optional[Union[TipoDeComprobante, str]] = None, estado_comprobante: Optional[Union[EstadoComprobante, str]] = None, rfc_a_cuenta_terceros: Optional[str] = None, complemento: Optional[str] = None, uuid: Optional[Union[str, UUID]] = None, id_solicitud: Optional[Union[str, UUID]] = None) Iterator[tuple[str, bytes]][source]

Itera sobre los paquetes obtenidos

Parameters
  • 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. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • 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. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • rfc_receptor – Contiene el/los RFCs receptores de los cuales se quiere consultar los CFDIs Importante: El campo RfcReceptor, únicamente permite la captura de 5 registros como máximo

  • rfc_emisor – Contiene el RFC del emisor del cual se quiere consultar los CFDI. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • tipo_solicitud – Define el tipo de descarga

  • tipo_comprobante – Define el tipo de comprobante

  • estado_comprobante – Define el estado del comprobante

  • rfc_a_cuenta_terceros – Contiene el RFC del a cuenta a tercero del cual se quiere consultar los CFDIs

  • complemento – Define el complemento de CFDI a descargar

  • uuid – Folio Fiscal

  • id_solicitud – Si ya se cuenta con el id de una solicitud anterior, solo pasar este parametro

Returns

Iterador sobre packetes y su contenido en bytes

recover_retencion_request(fecha_inicial: Optional[date] = None, fecha_final: Optional[date] = None, rfc_receptor: Optional[Union[str, Sequence[str]]] = None, rfc_emisor: Optional[str] = None, tipo_solicitud: satcfdi.pacs.sat.TipoDescargaMasivaTerceros | str = TipoDescargaMasivaTerceros.CFDI, tipo_comprobante: Optional[Union[TipoDeComprobante, str]] = None, estado_comprobante: Optional[Union[EstadoComprobante, str]] = None, rfc_a_cuenta_terceros: Optional[str] = None, complemento: Optional[str] = None, uuid: Optional[Union[str, UUID]] = None) dict[source]

Esta operación permite solicitar la descarga de CFDIs o Metadata y como resultado devuelve un id de solicitud o estatus de la petición realizada.

Parameters
  • 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. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • 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. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • rfc_receptor – Contiene el/los RFCs receptores de los cuales se quiere consultar los CFDIs Importante: El campo RfcReceptor, únicamente permite la captura de 5 registros como máximo

  • rfc_emisor – Contiene el RFC del emisor del cual se quiere consultar los CFDI. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • tipo_solicitud – Define el tipo de descarga

  • tipo_comprobante – Define el tipo de comprobante

  • estado_comprobante – Define el estado del comprobante

  • rfc_a_cuenta_terceros – Contiene el RFC del a cuenta a tercero del cual se quiere consultar los CFDIs

  • complemento – Define el complemento de CFDI a descargar

  • uuid – Folio Fiscal

Returns

respuesta de solicitud de descarga

recover_retencion_status(id_solicitud: str) dict[source]
recover_retencion_download(id_paquete: str) -> (<class 'dict'>, <class 'str'>)[source]
recover_retencion_iwait(fecha_inicial: Optional[date] = None, fecha_final: Optional[date] = None, rfc_receptor: Optional[Union[str, Sequence[str]]] = None, rfc_emisor: Optional[str] = None, tipo_solicitud: satcfdi.pacs.sat.TipoDescargaMasivaTerceros | str = TipoDescargaMasivaTerceros.CFDI, tipo_comprobante: Optional[Union[TipoDeComprobante, str]] = None, estado_comprobante: Optional[Union[EstadoComprobante, str]] = None, rfc_a_cuenta_terceros: Optional[str] = None, complemento: Optional[str] = None, uuid: Optional[Union[str, UUID]] = None, id_solicitud: Optional[Union[str, UUID]] = None) Iterator[tuple[str, bytes]][source]

Itera sobre los paquetes obtenidos

Parameters
  • 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. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • 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. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • rfc_receptor – Contiene el/los RFCs receptores de los cuales se quiere consultar los CFDIs Importante: El campo RfcReceptor, únicamente permite la captura de 5 registros como máximo

  • rfc_emisor – Contiene el RFC del emisor del cual se quiere consultar los CFDI. Parámetro obligatorio. Este parámetro no debe declararse en caso de realizar una consulta por el folio fiscal (UUID).

  • tipo_solicitud – Define el tipo de descarga

  • tipo_comprobante – Define el tipo de comprobante

  • estado_comprobante – Define el estado del comprobante

  • rfc_a_cuenta_terceros – Contiene el RFC del a cuenta a tercero del cual se quiere consultar los CFDIs

  • complemento – Define el complemento de CFDI a descargar

  • uuid – Folio Fiscal

  • id_solicitud – Si ya se cuenta con el id de una solicitud anterior, solo pasar este parametro

Returns

Iterador sobre packetes y su contenido en bytes

recover_certificate(no_certificado: str | int) Certificate[source]