Source code for cfdibills.verifiers

"""
Module to verify a CFDI with the SAT.
"""
from typing import Union

from cfdibills.api import SATConsultaResponse, consulta_cfdi_service
from cfdibills.schemas.cfdi33 import CFDI33
from cfdibills.schemas.cfdi40 import CFDI40
from cfdibills.schemas.complementos import TimbreFiscalDigital


[docs]def verify( cfdi: Union[CFDI33, CFDI40] = None, uuid: str = None, rfc_emisor: str = None, rfc_receptor: str = None, total_facturado: float = None, ) -> SATConsultaResponse: """ Verifies a bill's status with the SAT. The bill can be given as a ``CFDI33`` or as its details (uuid, rfc_emisor, rfc_receptor, total_facturado). When the ``CFDI33`` is present, no other detail is used to query the SAT's web service. If the ``CFDI33`` is not present, then all the other details must be provided. Parameters ---------- cfdi: CFDI33 CFDI v3.3 object to check. Details are overriden by this argument when passed. uuid: str UUID of the CFDI to check (if details are given). rfc_emisor: str RFC of the issuer of the CFDI to check (if details are given). rfc_receptor: str RFC of the recipient of the CFDI to check (if details are given). total_facturado: str Total amount of money billed in the CFDI to check (if details are given). Returns ------- SATConsultaResponse Status of the CFDI as verified by SAT. Raises ------ ValueError When no CFDI is provided or there are missing details. """ return ( _verify_cfdi(cfdi) if cfdi # this is validated in _verify_cfdi_by_values else _verify_cfdi_by_values(uuid, rfc_emisor, rfc_receptor, total_facturado) # type: ignore )
def _verify_cfdi(cfdi: Union[CFDI33, CFDI40]) -> SATConsultaResponse: return _verify_cfdi_by_values( str(cfdi.get_complemento(TimbreFiscalDigital).uuid), cfdi.emisor.rfc, cfdi.receptor.rfc, cfdi.total, ) def _verify_cfdi_by_values( uuid: str, rfc_emisor: str, rfc_receptor: str, total_facturado: float ) -> SATConsultaResponse: if uuid is None or rfc_emisor is None or rfc_receptor is None or total_facturado is None: raise ValueError("All args [uuid, rfc_emisor, rfc_receptor, total_facturado] must be not None") return consulta_cfdi_service(uuid, rfc_emisor, rfc_receptor, total_facturado)