Cierra el ciclo de la factura: construcción del comprobante, sellado con el CSD de la empresa emisora y transmisión al PAC. - cfdi_builder: XML 4.0 de ingreso en el orden de atributos del XSD, del que depende la cadena original y con ella el sello. Todo el dinero con Decimal. - sealer: cadena original vía el XSLT oficial del SAT y firma con la llave del CSD. - pac_comercio_digital: cliente de timbrarV5. Conserva el código y el saldo de folios que el legado leía en una variable que descartaba (CFDI.cs:19324-19336). - csd_service y core/crypto: CSD por empresa, con la contraseña cifrada en la base. Antes el certificado había que dejarlo a mano en el almacenamiento y su contraseña era una variable de entorno global, lo que no funciona con varias empresas emisoras. - Cada intento —también los rechazados— guarda el XML que se transmitió y el que contestó el PAC: sin ese par no hay forma de reconstruir un rechazo cuando termina la petición. La declaración XML se escribe a mano con comillas dobles. lxml la emite con comillas simples, que es XML válido, pero Comercio Digital compara la cadena literal version="1.0" y responde 642 "la versión del XML no es 1.0". El modo (pruebas o producción) sale de invoices.stamping_mode y no se puede pasar por la API: es lo único que separa un timbre de prueba de un CFDI con validez fiscal. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
67 lines
1.3 KiB
Plaintext
67 lines
1.3 KiB
Plaintext
# Core Framework
|
|
fastapi==0.119.0
|
|
uvicorn[standard]==0.37.0
|
|
gunicorn==23.0.0
|
|
pydantic==2.12.3
|
|
pydantic[email]==2.12.3
|
|
pydantic-settings==2.11.0
|
|
|
|
# Database
|
|
sqlalchemy==2.0.44
|
|
alembic==1.17.0
|
|
psycopg2-binary==2.9.11
|
|
asyncpg==0.30.0
|
|
|
|
# Authentication & Authorization
|
|
cachetools==5.5.0
|
|
python-jose[cryptography]==3.5.0
|
|
passlib[bcrypt]==1.7.4
|
|
|
|
# HTTP & API
|
|
httpx==0.28.1
|
|
requests==2.32.5
|
|
boto3==1.35.36
|
|
|
|
|
|
# Utilities
|
|
python-multipart==0.0.20
|
|
python-dotenv==1.1.1
|
|
tenacity==9.1.2
|
|
|
|
# Monitoring & Logging
|
|
prometheus-client==0.23.1
|
|
python-json-logger==4.0.0
|
|
|
|
# Development
|
|
pytest==8.4.2
|
|
pytest-asyncio==1.2.0
|
|
pytest-cov==7.0.0
|
|
black==25.9.0
|
|
flake8==7.3.0
|
|
mypy==1.18.2
|
|
pylint==4.0.2
|
|
|
|
# reportes
|
|
Jinja2==3.1.6
|
|
pdfkit==1.0.0
|
|
openpyxl==3.1.5
|
|
|
|
# Desarrollo en seguno plano
|
|
celery==5.3.6
|
|
redis==5.0.1
|
|
flower==2.0.1
|
|
|
|
# CFDI / timbrado
|
|
# lxml: la cadena original del SAT sólo se obtiene aplicando el XSLT 1.0 oficial;
|
|
# xml.etree de la stdlib no hace XSLT y no hay otra implementación madura en Python.
|
|
# cryptography: lee el .key del CSD (PKCS#8 DER cifrado) y el .cer (X.509 DER), y firma
|
|
# RSA-SHA256. Ya entraba de forma transitiva por python-jose[cryptography]; aquí pasa a
|
|
# ser dependencia directa, así que se declara.
|
|
lxml==5.3.0
|
|
cryptography==43.0.3
|
|
|
|
# Barcode
|
|
pdf417gen==0.8.1
|
|
asgiref==3.8.1
|
|
aiosmtplib==3.0.1
|