Files
CRM_AGENTES_CARGA/backend/requirements.txt
Jair Cedillo 6e208876f7 feat(fin): timbrado de CFDI 4.0 de ingreso con Comercio Digital
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>
2026-08-11 09:07:05 -05:00

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