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.
This commit is contained in:
54
docs/MODULO-WHATSAPP.md
Normal file
54
docs/MODULO-WHATSAPP.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user