- Circuit breaker saludMonday (3 fallos → modo local; ping cada 60s)
- Endpoint GET /api/sistema/estado {mondayOk, pendientesSync}
- LeadCaptura extendida (board, etapa, origen, motivo, pendienteSync)
- Tablas Unidad (espejo inventario, 288 seed) + SyncPendiente
- crmLocal: crearLead, afluencia, cambio etapa, descarte, conversión, apartar
- Ruteo en controllers: fallback local ante 502 o Monday caído
- Mi día local: resumen completo desde SQLite + unión con Monday
- Fallbacks: unidades, contactos, reportes, prefill, buscador
- Sync worker cada 2min + handlers 15 tipos (con DependenciaPendienteError)
- Gate automatizaciones: skip si !mondayOk
- Banner 'Modo local' en 5 apps + badge pendiente en mi-dia
- 597 API tests + 263 front tests verdes
Env MODO_LOCAL_FORZADO=true para testing sin Monday.
94 lines
3.8 KiB
Plaintext
94 lines
3.8 KiB
Plaintext
# ============================================
|
|
# MONDAY.COM
|
|
# ============================================
|
|
MONDAY_API_KEY="PONER_API_KEY_DE_MONDAY"
|
|
MONDAY_API_URL="https://api.monday.com/v2"
|
|
MONDAY_WORKSPACE="Frasa-CAS"
|
|
|
|
# Board IDs del workspace Frasa-CAS (ya creados)
|
|
MONDAY_BOARD_CONTACTOS="18427678476"
|
|
MONDAY_BOARD_DESARROLLOS="18427678485"
|
|
MONDAY_BOARD_UNIDADES="18427678487"
|
|
MONDAY_BOARD_LEADS="18427678493"
|
|
MONDAY_BOARD_OPORTUNIDADES="18427678497"
|
|
MONDAY_BOARD_APARTADO="18427678515"
|
|
MONDAY_BOARD_VENTAS="18427678520"
|
|
# Tableros creados por api-gateway/scripts/setup-crm.ts (npm run setup:crm)
|
|
MONDAY_BOARD_MOTIVOS="18427702505"
|
|
MONDAY_BOARD_ACTIVIDADES="18427702517"
|
|
# Tableros de obra/escrituras alimentados por api-gateway/scripts/sync-obra-estatus.py
|
|
# (referencia; el script los trae como constantes)
|
|
MONDAY_BOARD_FLUJO_ESCRITURAS="18429252054"
|
|
MONDAY_BOARD_SALDOS_FAVOR="18429252069"
|
|
# 'false' desactiva la creación de actividades en Monday (default true)
|
|
ACTIVIDADES_ENABLED="true"
|
|
|
|
# Automatizaciones del tablero Leads (api-gateway)
|
|
# IDs de usuario Monday separados por coma para el round-robin;
|
|
# vacío = auto-detectar usuarios no-guest del workspace
|
|
MONDAY_RR_USER_IDS=""
|
|
# Días sin actividad para recordar un lead (update automático en el item)
|
|
INACTIVIDAD_DIAS="10"
|
|
# Cron de polling de respaldo (asigna vendedor a leads nuevos sin asignar)
|
|
POLL_CRON="*/5 * * * *"
|
|
# 'false' desactiva los crons (los endpoints /api/automatizaciones siguen vivos)
|
|
MONDAY_AUTOMATIONS_ENABLED="true"
|
|
# 'true' fuerza el modo local aunque Monday responda (pruebas del modo degradado):
|
|
# /api/sistema/estado reporta mondayOk=false y el sync worker no procesa la cola
|
|
MODO_LOCAL_FORZADO="false"
|
|
|
|
# ============================================
|
|
# BASE DE DATOS (fase API Gateway)
|
|
# ============================================
|
|
DATABASE_URL="postgresql://frasa_user:CAMBIAR@postgres:5432/frasa_db?schema=public"
|
|
POSTGRES_USER=frasa_user
|
|
POSTGRES_PASSWORD=CAMBIAR
|
|
POSTGRES_DB=frasa_db
|
|
REDIS_URL="redis://redis:6379"
|
|
|
|
# ============================================
|
|
# SEGURIDAD
|
|
# ============================================
|
|
JWT_SECRET="cambiar_por_secreto_largo_y_aleatorio"
|
|
JWT_EXPIRES_IN="7d"
|
|
# 'false' desactiva la exigencia de token en /api (tests/arranque temprano)
|
|
AUTH_ENABLED=true
|
|
# Password inicial del usuario 'admin' sembrado por npm run seed:usuarios
|
|
ADMIN_PASSWORD="Frasa2026"
|
|
# Token compartido script→API en este host (sync de estatus → alertas de
|
|
# inventario). Generar con: openssl rand -hex 24
|
|
INTERNAL_SYNC_TOKEN=""
|
|
|
|
# ============================================
|
|
# APP CONFIG
|
|
# ============================================
|
|
NODE_ENV=development
|
|
PORT=3000
|
|
|
|
# ============================================
|
|
# AGENTE IA (proveedor NAN, OpenAI-compatible)
|
|
# ============================================
|
|
NAN_API_KEY="PONER_API_KEY_DE_NAN"
|
|
NAN_BASE_URL="https://api.nan.builders/v1"
|
|
NAN_CHAT_MODEL="qwen3.6"
|
|
NAN_EMBED_MODEL="qwen3-embedding"
|
|
# Umbral mínimo de similitud coseno para recuperar contexto (0-1)
|
|
AI_MIN_SCORE="0.3"
|
|
|
|
# Ronda 2: horas antes de escalar un lead asignado que sigue en NUEVO/Intento de contacto
|
|
LEAD_ESCALADO_HORAS=48
|
|
# User ID Monday del coordinador para escalados; vacio = actividad al vendedor asignado
|
|
MONDAY_COORDINADOR_USER_ID=
|
|
# User ID Monday de la cuenta COMPARTIDA de vendedores de piso (usan solo la
|
|
# app, todos ligados a una sola cuenta Monday). Con ella, Mi dia filtra "lo mio"
|
|
# por captura local y no por la columna people. 0/vacio = desactivado
|
|
MONDAY_VENDEDOR_COMPARTIDO_ID=
|
|
|
|
# Recordatorios de cobranza (pagos por vencer / vencidos)
|
|
# Cron del escaneo diario (default "30 9 * * *")
|
|
RECORDATORIOS_CRON="30 9 * * *"
|
|
# Días de anticipación para el recordatorio "próximo a vencer" (default 3)
|
|
RECORDATORIO_DIAS_ANTES=3
|
|
# Cada cuántos días se re-recuerda un pago que sigue vencido (default 7)
|
|
RECORDATORIO_REVOLVER_DIAS=7
|