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>
139 lines
5.0 KiB
Plaintext
139 lines
5.0 KiB
Plaintext
# ==================================
|
|
# CRM Aduanasoft - Variables de Entorno
|
|
# ==================================
|
|
|
|
# ----- PostgreSQL App -----
|
|
POSTGRES_APP_PASSWORD=postgres
|
|
|
|
# ----- PostgreSQL Keycloak -----
|
|
POSTGRES_KEYCLOAK_PASSWORD=postgres
|
|
|
|
# ----- Keycloak Admin -----
|
|
KEYCLOAK_ADMIN=admin
|
|
KEYCLOAK_ADMIN_PASSWORD=admin
|
|
|
|
# ----- Keycloak Configuración -----
|
|
KEYCLOAK_REALM=master
|
|
KEYCLOAK_CLIENT_ID=app-backend
|
|
KEYCLOAK_CLIENT_SECRET=dev-secret
|
|
KEYCLOAK_FRONTEND_CLIENT_ID=app-frontend
|
|
|
|
# ----- Backend -----
|
|
APP_NAME=CRM Aduanasoft
|
|
DEBUG=True
|
|
ENVIRONMENT=development
|
|
CORE_DB_HOST=postgres
|
|
CORE_DB_PORT=5432
|
|
CORE_DB_NAME=crm_core
|
|
CORE_DB_USER=postgres
|
|
CORE_DB_PASSWORD=postgres
|
|
|
|
# Lista de orígenes permitidos (CORS)
|
|
# Ejemplo para Hub: http://localhost:5173,http://100.78.6.108:5174,http://100.78.6.108:8001
|
|
CORS_ORIGINS=http://localhost:5173,http://localhost:3000
|
|
|
|
# ----- Frontend -----
|
|
NODE_ENV=development
|
|
VITE_API_URL=http://localhost:8000/api
|
|
INTERNAL_API_URL=http://backend:8000/api
|
|
|
|
# ⚠️ ADVERTENCIA PRODUCCIÓN — ORIGIN, VITE_HUB_URL y APP_PUBLIC_URL
|
|
# ─────────────────────────────────────────────────────────────────────
|
|
# Docker Compose carga ESTE archivo (.env raíz) automáticamente cuando
|
|
# se ejecuta: docker compose -f docker-compose.prod.yml up
|
|
#
|
|
# Si estas variables tienen valores localhost aquí, PISARÁN los defaults
|
|
# de docker-compose.prod.yml y causarán que el login falle en producción
|
|
# (redirect_uri y KC URL apuntarán a localhost).
|
|
#
|
|
# Para dev local (docker-compose.yml): dejar localhost.
|
|
# Para producción (docker-compose.prod.yml): asegurarse que el servidor
|
|
# NO tenga este .env raíz con valores localhost, O usar:
|
|
# docker compose --env-file .env.prod -f docker-compose.prod.yml up
|
|
#
|
|
# Variables críticas para producción:
|
|
# ORIGIN=https://anexo76-dev.aduanasoft.com ← determina url.origin en SvelteKit
|
|
# VITE_HUB_URL=https://workspace.aduanasoft.com
|
|
# APP_PUBLIC_URL=https://anexo76-dev.aduanasoft.com
|
|
ORIGIN=http://localhost:5173
|
|
VITE_HUB_URL=http://localhost:3001
|
|
APP_PUBLIC_URL=http://localhost:5173
|
|
VITE_KEYCLOAK_REALM=master
|
|
VITE_KEYCLOAK_URL=http://localhost:8080/kcauth
|
|
VITE_KEYCLOAK_CLIENT_ID=app-frontend
|
|
|
|
#------ Celery / Valkey ----------
|
|
VALKEY_URL=redis://valkey:6379/0
|
|
PERMISSION_CACHE_ENABLED=true
|
|
PERMISSION_CACHE_TTL_SECONDS=300
|
|
|
|
# ----- MinIO (S3-compatible) -----
|
|
MINIO_ROOT_USER=minioadmin
|
|
MINIO_ROOT_PASSWORD=minioadmin
|
|
MINIO_API_PORT=9100
|
|
MINIO_CONSOLE_PORT=9101
|
|
|
|
# ----- Imports CSV (layouts_csv): redis | minio -----
|
|
CSV_IMPORT_STORAGE=minio
|
|
S3_ENDPOINT_URL=http://minio:9000
|
|
S3_ACCESS_KEY=minioadmin
|
|
S3_SECRET_KEY=minioadmin
|
|
S3_BUCKET=crm
|
|
S3_REGION=us-east-1
|
|
S3_USE_SSL=false
|
|
# Logos, certificados, help: mismo bucket. Si CSV_IMPORT_STORAGE=minio, también se usa MinIO aquí
|
|
# (use_s3_object_storage = minio CSV o S3_FILE_STORAGE=true).
|
|
S3_FILE_STORAGE=true
|
|
S3_PRESIGNED_EXPIRES_SECONDS=3600
|
|
|
|
COVE_FIEL_HASH_KEY=
|
|
COVE_FIEL_HASH_IV=
|
|
COVE_API_URL=https://api.vu.aduanasoft.com
|
|
COVE_API_VERIFY_SSL=False
|
|
|
|
# ----- Sitar API -----
|
|
SITAR_API_URL=http://api.sitar.aduanasoft.com
|
|
SITAR_API_USER=user_sitar_api
|
|
SITAR_API_PASSWORD=password123
|
|
|
|
# ==================================
|
|
# CONFIGURACIÓN DE SINCRONIZACIÓN
|
|
# ==================================
|
|
# Hub IP: 100.78.6.108
|
|
|
|
# URL del Hub para sincronización (Solo si es CLIENTE)
|
|
# Ejemplo: http://100.78.6.108:8001/api/v1/core/help-center/sync/
|
|
CENTRAL_SERVER_URL=
|
|
|
|
# UUID único de este cliente (Opcional, se genera uno si está vacío)
|
|
|
|
# Token de seguridad compartido (Debe ser IDÉNTICO en Hub y Clientes)
|
|
SYNC_SECRET_TOKEN=change-this-sync-token-in-production
|
|
|
|
# Lista de spokes (Solo si es HUB y desea retransmitir a otros - Opcional)
|
|
SPOKE_URLS=""
|
|
|
|
# ==================================
|
|
# PAC COMERCIO DIGITAL (timbrado CFDI)
|
|
# ==================================
|
|
# El modo de timbrado se decide POR FACTURA, en fin.invoices.stamping_mode.
|
|
# Esta variable solo fija con qué valor nacen las facturas que no lo especifican.
|
|
# pruebas -> pruebas.comercio-digital.mx | produccion -> ws.comercio-digital.mx
|
|
# Una factura en "produccion" emite un CFDI con validez fiscal real ante el SAT.
|
|
PAC_DEFAULT_MODE=pruebas
|
|
# Credenciales del web service (headers usrws / pwdws). NO commitear valores reales:
|
|
# van en .env, que está en .gitignore.
|
|
PAC_USER=
|
|
PAC_PASSWORD=
|
|
# Opcional: correo al que el PAC notifica el comprobante (header email).
|
|
PAC_NOTIFICATION_EMAIL=
|
|
# Clave maestra que cifra las contraseñas de los CSD en la base de datos. OBLIGATORIA para
|
|
# poder cargar certificados desde Configuración de Facturación. Generarla con:
|
|
# python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
|
# Si se cambia, las contraseñas ya guardadas dejan de poder descifrarse y hay que recargar
|
|
# los certificados.
|
|
CSD_ENCRYPTION_KEY=
|
|
# LEGADO: contraseña global del CSD. Sólo se usa como respaldo si una empresa no tiene la
|
|
# suya guardada. Lo correcto es cargar el CSD por empresa desde la interfaz.
|
|
CSD_PASSWORD=
|