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

55 lines
2.7 KiB
Markdown

# Módulo WhatsApp (WA CRM) — CRM360 FRASA
Integración entre el CRM y [wacrm](https://wacrm.tech) (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:
```bash
cd api-gateway && npx vitest run src/services/wacrm.service.test.ts
```