- 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.
55 lines
2.7 KiB
Markdown
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
|
|
```
|