Skip to content

Commit 7c76298

Browse files
committed
consultar estado de facturas added
1 parent 7b976a7 commit 7c76298

File tree

5 files changed

+72
-3
lines changed

5 files changed

+72
-3
lines changed

examples.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,5 +1095,25 @@ def main ():
10951095
# print(api_response)
10961096

10971097

1098+
# Consultar estado de factura por valores
1099+
# invoice_status = InvoiceStatusRequest(
1100+
# issuer_tin="POPJ450924HD6", # RFC del emisor
1101+
# recipient_tin="MEJJ940824C61", # RFC del receptor
1102+
# invoice_total=Decimal("430.00"), # Total de la factura
1103+
# invoice_uuid="8e0fdc23-e148-4cf5-b3ce-4459f31c9c45", # UUID de la factura
1104+
# last8_digits_issuer_signature="oxPKRg==" # Últimos 8 dígitos del sello digital del emisor
1105+
# )
1106+
#api_response = client.invoices.get_status(invoice_status)
1107+
#print(api_response)
1108+
1109+
1110+
# Consultar estado de factura por referencias (id)
1111+
# invoice_status = InvoiceStatusRequest(
1112+
# id="16444d58-37e0-4a86-b247-a73bcc18c751"
1113+
# )
1114+
# api_response = client.invoices.get_status(invoice_status)
1115+
# print(api_response)
1116+
1117+
10981118
if __name__ == "__main__":
10991119
main()

fiscalapi/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
CreatePdfRequest,
3434
FileResponse,
3535
SendInvoiceRequest,
36+
InvoiceStatusRequest,
37+
InvoiceStatusResponse,
3638
)
3739

3840
# Re-exportar servicios
@@ -75,7 +77,10 @@
7577
"CreatePdfRequest",
7678
"FileResponse",
7779
"SendInvoiceRequest",
78-
80+
"InvoiceStatusRequest",
81+
"InvoiceStatusResponse",
82+
83+
7984
# Servicios
8085
"CatalogService",
8186
"InvoiceService",

fiscalapi/models/fiscalapi_models.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,3 +321,30 @@ class SendInvoiceRequest(BaseDto):
321321

322322
class Config:
323323
populate_by_name = True
324+
325+
326+
class InvoiceStatusRequest(BaseDto):
327+
"""Modelo para consultar estado de facturas."""
328+
id: Optional[str] = Field(default=None, description="Id de la factura a consultar")
329+
issuer_tin: Optional[str] = Field(default=None, alias="issuerTin", description="RFC Emisor la factura")
330+
recipient_tin: Optional[str] = Field(default=None, alias="recipientTin", description="RFC Receptor de la factura")
331+
invoice_total: Optional[Decimal] = Field(default=None, alias="invoiceTotal", description="Total de la factura")
332+
invoice_uuid: Optional[str] = Field(default=None, alias="invoiceUuid", description="Folio fiscal factura a consultar")
333+
last8_digits_issuer_signature: Optional[str] = Field(default=None, alias="last8DigitsIssuerSignature", description="Últimos ocho caracteres del sello digital del emisor")
334+
335+
model_config = {
336+
"populate_by_name": True,
337+
"json_encoders": {Decimal: str}
338+
}
339+
340+
class InvoiceStatusResponse(BaseDto):
341+
"""Modelo de respuesta de consulta de estado de facturas."""
342+
status_code: str = Field(..., alias="statusCode", description="Código de estatus retornado por el SAT")
343+
status: str = Field(..., description="Estado actual de la factura. Posibles valores: 'Vigente' | 'Cancelado' | 'No Encontrado'")
344+
cancelable_status: str = Field(..., alias="cancelableStatus", description="Indica si la factura es cancelable. Posibles valores: 'Cancelable con aceptación' | 'No cancelable' | 'Cancelable sin aceptación'")
345+
cancellation_status: str = Field(..., alias="cancellationStatus", description="Detalle del estatus de cancelación")
346+
efos_validation: str = Field(..., alias="efosValidation", description="Codigo que indica si el RFC Emisor se encuentra dentro de la lista negra de EFOS")
347+
348+
model_config = {
349+
"populate_by_name": True
350+
}

fiscalapi/services/invoice_service.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from fiscalapi.models.common_models import ApiResponse, PagedList
2-
from fiscalapi.models.fiscalapi_models import CancelInvoiceRequest, CancelInvoiceResponse, CreatePdfRequest, FileResponse, Invoice, SendInvoiceRequest
2+
from fiscalapi.models.fiscalapi_models import CancelInvoiceRequest, CancelInvoiceResponse, CreatePdfRequest, FileResponse, Invoice, InvoiceStatusRequest, InvoiceStatusResponse, SendInvoiceRequest
33
from fiscalapi.services.base_service import BaseService
44

55

@@ -63,4 +63,21 @@ def send(self, send_invoice_request : SendInvoiceRequest):
6363

6464
return self.send_request("POST", endpoint, bool, payload=send_invoice_request)
6565

66+
# consultar estado de facturas
67+
def get_status(self, request: InvoiceStatusRequest) -> ApiResponse[InvoiceStatusResponse]:
68+
"""
69+
Obtiene el estado de una factura.
70+
71+
Args:
72+
request (InvoiceStatusRequest): Solicitud para consultar estado
73+
74+
Returns:
75+
ApiResponse[InvoiceStatusResponse]: Respuesta con el estado de la factura
76+
"""
77+
if request is None:
78+
raise ValueError("request cannot be null")
79+
80+
endpoint = "invoices/status"
81+
return self.send_request("POST", endpoint, InvoiceStatusResponse, payload=request)
82+
6683

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import os
33
from setuptools import setup, find_packages
44

5-
VERSION = "4.0.120"
5+
VERSION = "4.0.142"
66
# Descripción breve basada en el .csproj
77
DESCRIPTION = "Genera facturas CFDI válidas ante el SAT consumiendo el API de https://www.fiscalapi.com"
88

0 commit comments

Comments
 (0)