Files
FRASA-CAS/docs/MODULO-WHATSAPP.md
Consult AS Technology e3b5660769 feat: modulo WhatsApp (WA CRM) con round-robin de conversaciones
- Servicio wacrm en api-gateway (pg pool lazy): round-robin de conversaciones
  sin agente entre vendedores vinculados y miembro-agentes de la cuenta wacrm,
  cron cada 30 s; bandeja del vendedor; estado/config/reasignar para admin.
- Endpoints /api/wacrm/* con guarda de rol admin/manager.
- Usuario.wacrmUserId en schema Prisma (vinculo CRM<->wacrm).
- App apps/wa-crm (/wa-crm/): bandeja + administracion del round-robin.
- Landing: tarjeta WhatsApp; clave 'whatsapp' en MATRIZ de roles.
- Plan de nuevas reglas de negocio del cotizador (docs/PLAN-REGLAS-COTIZADOR.md).
- WACRM_PG_URL apunta a Postgres de Supabase por 127.0.0.1:5433.
- Tests de integracion wacrm (3) y suite completa 764/764 en verde.
2026-09-30 00:30:17 +00:00

2.7 KiB

Módulo WhatsApp (WA CRM) — CRM360 FRASA

Integración entre el CRM y wacrm (WhatsApp CRM self-hosted en /root/wacrm, datos en Supabase self-hosted /root/supabase).

Cómo funciona

  • Vínculo de usuarios: cada Usuario del CRM tiene wacrmUserId (id de auth.users en Supabase). Los 30 usuarios activos del CRM están dados de alta en wacrm y su perfil pertenece a la cuenta compartida (7b17a9ab-6723-43aa-a9da-28e97f0071ae, del usuario administrador). Vendedores = rol agent, managers/admins = rol admin.
  • Round-robin: el API Gateway (frasa-api) revisa cada 30 s las conversaciones de la cuenta compartida que llegan sin asignar (assigned_agent_id IS NULL, estatus open) y las turna entre los vendedores del pool (rol vendedor, activos, vinculados y miembros agente de la cuenta). El índice del turno vive en ConfiguracionSistema (wacrm_rr_idx), así que sobrevive reinicios.
  • Bandeja del vendedor: GET /api/wacrm/mi-bandeja devuelve las conversaciones asignadas al usuario logueado (contacto, último mensaje, no leídos). La app apps/wa-crm (/wa-crm/) las muestra con liga a /wa/inbox para responder desde wacrm.
  • Administración (rol admin/manager, pestaña en /wa-crm/):
    • Estado: sin asignar, total, pool con "es miembro" y cuántas tiene cada uno.
    • Activar/desactivar round-robin y cambiar la cuenta (POST /api/wacrm/config).
    • "Asignar ahora" dispara el reparto a demanda (POST /api/wacrm/round-robin).
    • Reasignar una conversación a cualquier vendedor (POST /api/wacrm/reasignar).

Conexión técnica

  • WACRM_PG_URL en /root/frasa-ecosystem/.env apunta al Postgres de Supabase por 127.0.0.1:5433 (puerto publicado solo en localhost del contenedor supabase-db; el 5432 es Supavisor y exige tenant).
  • El servicio api-gateway/src/services/wacrm.service.ts usa pg (Pool lazy; sin URL lanza 503 y el resto del CRM sigue igual).
  • Al escribir (UPDATE conversations) se hace como superusuario postgres, bypass RLS — solo el API lo hace, nunca el cliente.

Puesta en marcha del número

El round-robin está activo sobre la cuenta compartida. Falta conectar el número de WhatsApp (API oficial de Meta) en wacrm: credenciales y pasos en /root/wacrm/ENV-PENDIENTES.md. Cuando Meta entregue el número, conectarlo desde wacrm → Settings → WhatsApp con la cuenta del administrador.

Tests

api-gateway/src/services/wacrm.service.test.ts — integración real contra Supabase (se auto-salta si no hay WACRM_PG_URL); crea usuarios/cuenta/ conversaciones de prueba y los limpia. Correr:

cd api-gateway && npx vitest run src/services/wacrm.service.test.ts