## Frontend - Add media display (images, audio, video, docs) in Inbox - Add pause/resume functionality for WhatsApp accounts - Fix media URLs to use nginx proxy (relative URLs) ## API Gateway - Add /accounts/:id/pause and /accounts/:id/resume endpoints - Fix media URL handling for browser access ## WhatsApp Core - Add pauseSession() - disconnect without logout - Add resumeSession() - reconnect using saved credentials - Add media download and storage for incoming messages - Serve media files via /media/ static route ## Odoo Module (odoo_whatsapp_hub) - Add Chat Hub interface with DOLLARS theme (dark, 3-column layout) - Add WhatsApp/DRRR theme switcher for chat view - Add "ABRIR CHAT" button in conversation form - Add send_message_from_chat() method - Add security/ir.model.access.csv - Fix CSS scoping to avoid breaking Odoo UI - Update webhook to handle message events properly ## Documentation - Add docs/CONTEXTO_DESARROLLO.md with complete project context ## Infrastructure - Add whatsapp_media Docker volume - Configure nginx proxy for /media/ route - Update .gitignore to track src/sessions/ source files Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
345 lines
10 KiB
Markdown
345 lines
10 KiB
Markdown
# WhatsApp Centralizado - Contexto de Desarrollo
|
|
|
|
> **Fecha de última actualización:** 2026-01-30
|
|
> **Estado:** En desarrollo activo
|
|
|
|
---
|
|
|
|
## Resumen del Proyecto
|
|
|
|
Sistema centralizado de WhatsApp para gestión de múltiples números, integrado con Odoo y un frontend React. Permite:
|
|
- Conectar múltiples números de WhatsApp vía QR
|
|
- Recibir y enviar mensajes (texto, imágenes, audio, video, documentos)
|
|
- Gestionar conversaciones desde frontend web o Odoo
|
|
- Automatizar respuestas con flujos de bot
|
|
- Pausar/reanudar conexiones sin perder sesión
|
|
|
|
---
|
|
|
|
## Arquitectura del Sistema
|
|
|
|
```
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
│ Frontend │────▶│ API Gateway │────▶│ WhatsApp Core │
|
|
│ React + Ant │ │ FastAPI │ │ Node + Baileys │
|
|
│ Puerto: 3000 │ │ Puerto: 8000 │ │ Puerto: 3001 │
|
|
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
│ │
|
|
▼ │
|
|
┌─────────────────┐ │
|
|
│ PostgreSQL │◀────────────┘
|
|
│ Puerto: 5432 │
|
|
└─────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────┐
|
|
│ Odoo (CAS) │◀── Webhooks
|
|
│ 192.168.10.188 │
|
|
│ Puerto: 8069 │
|
|
└─────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Servicios Docker
|
|
|
|
| Servicio | Puerto | Descripción |
|
|
|----------|--------|-------------|
|
|
| `frontend` | 3000 | React + Ant Design |
|
|
| `api-gateway` | 8000 | FastAPI - API principal |
|
|
| `whatsapp-core` | 3001 | Node.js + Baileys - Conexión WhatsApp |
|
|
| `flow-engine` | 8001 | Motor de flujos de bot |
|
|
| `integrations` | 8002 | Integraciones externas |
|
|
| `postgres` | 5432 | Base de datos PostgreSQL |
|
|
| `redis` | 6379 | Cache y colas |
|
|
|
|
### Comandos Docker útiles
|
|
|
|
```bash
|
|
# Reconstruir servicios
|
|
docker compose build whatsapp-core frontend api-gateway
|
|
|
|
# Reiniciar servicios
|
|
docker compose up -d
|
|
|
|
# Ver logs
|
|
docker compose logs -f whatsapp-core
|
|
docker compose logs -f api-gateway
|
|
|
|
# Entrar a un contenedor
|
|
docker exec -it wac_whatsapp sh
|
|
docker exec -it wac_api bash
|
|
```
|
|
|
|
---
|
|
|
|
## Servidor Odoo
|
|
|
|
- **IP:** 192.168.10.188
|
|
- **Puerto:** 8069
|
|
- **Base de datos:** `cas` (NO usar "odoo")
|
|
- **Usuario SSH:** root / Aasi940812
|
|
- **Ruta módulo:** `/opt/odoo/addons/odoo_whatsapp_hub/`
|
|
|
|
### Comandos Odoo útiles
|
|
|
|
```bash
|
|
# Conectar por SSH
|
|
sshpass -p 'Aasi940812' ssh root@192.168.10.188
|
|
|
|
# Actualizar módulo
|
|
systemctl stop odoo
|
|
/usr/bin/odoo -c /etc/odoo/odoo.conf -d cas -u odoo_whatsapp_hub --stop-after-init
|
|
systemctl start odoo
|
|
|
|
# Instalar módulo
|
|
/usr/bin/odoo -c /etc/odoo/odoo.conf -d cas -i odoo_whatsapp_hub --stop-after-init
|
|
|
|
# Ver logs
|
|
tail -f /var/log/odoo/odoo-server.log
|
|
|
|
# Consultas a PostgreSQL
|
|
sudo -u postgres psql -d cas -c "SELECT * FROM whatsapp_conversation;"
|
|
```
|
|
|
|
### Configuración WhatsApp Account en Odoo
|
|
|
|
```sql
|
|
-- Ver cuentas
|
|
SELECT id, name, external_id, api_url FROM whatsapp_account;
|
|
|
|
-- Configurar external_id (debe coincidir con el UUID del frontend)
|
|
UPDATE whatsapp_account
|
|
SET external_id = '33ce868e-1aa0-4795-9d44-a389e8ade0de',
|
|
api_url = 'http://192.168.10.221:8000'
|
|
WHERE id = 1;
|
|
```
|
|
|
|
---
|
|
|
|
## Módulo Odoo (odoo_whatsapp_hub)
|
|
|
|
### Estructura
|
|
|
|
```
|
|
odoo_whatsapp_hub/
|
|
├── __manifest__.py
|
|
├── __init__.py
|
|
├── models/
|
|
│ ├── whatsapp_account.py # Cuentas WhatsApp
|
|
│ ├── whatsapp_conversation.py # Conversaciones
|
|
│ └── whatsapp_message.py # Mensajes
|
|
├── controllers/
|
|
│ └── webhook.py # Recibe eventos del sistema
|
|
├── views/
|
|
│ ├── whatsapp_account_views.xml
|
|
│ ├── whatsapp_conversation_views.xml
|
|
│ ├── dollars_action.xml # Interfaz DOLLARS
|
|
│ └── whatsapp_menu.xml
|
|
├── wizards/
|
|
│ └── send_whatsapp_wizard.xml
|
|
├── static/src/
|
|
│ ├── css/
|
|
│ │ ├── whatsapp.css # Estilos WhatsApp/DRRR
|
|
│ │ └── dollars_theme.css # Tema DOLLARS oscuro
|
|
│ ├── js/
|
|
│ │ ├── chat_action.js # Chat con temas
|
|
│ │ └── dollars_chat.js # Chat Hub DOLLARS
|
|
│ └── xml/
|
|
│ ├── chat_template.xml
|
|
│ └── dollars_template.xml
|
|
└── security/
|
|
└── ir.model.access.csv
|
|
```
|
|
|
|
### Menú en Odoo
|
|
|
|
- **WhatsApp Hub > Chat Hub** - Interfaz DOLLARS (oscura, 3 columnas)
|
|
- **WhatsApp Hub > Conversaciones (Lista)** - Vista clásica de Odoo
|
|
- **WhatsApp Hub > Cuentas** - Gestión de números
|
|
- **WhatsApp Hub > Configuración** - Ajustes
|
|
|
|
### Webhook
|
|
|
|
```
|
|
POST http://192.168.10.188:8069/whatsapp/webhook
|
|
Header: X-Odoo-Database: cas
|
|
Header: Content-Type: application/json
|
|
|
|
Body:
|
|
{
|
|
"type": "message", // message, status_update, conversation_update, account_status
|
|
"account_id": "uuid-de-la-cuenta",
|
|
"data": { ... }
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Frontend React
|
|
|
|
### Estructura principal
|
|
|
|
```
|
|
frontend/src/
|
|
├── pages/
|
|
│ ├── WhatsAppAccounts.tsx # Gestión de números (pausar/reanudar)
|
|
│ ├── Inbox.tsx # Bandeja de entrada
|
|
│ ├── Dashboard.tsx
|
|
│ └── ...
|
|
├── api/
|
|
│ └── client.ts # Cliente API
|
|
└── App.tsx
|
|
```
|
|
|
|
### Funcionalidades implementadas
|
|
|
|
1. **Gestión de cuentas WhatsApp**
|
|
- Crear cuenta y escanear QR
|
|
- Pausar conexión (mantiene sesión)
|
|
- Reanudar conexión (sin QR)
|
|
- Eliminar cuenta
|
|
|
|
2. **Bandeja de entrada (Inbox)**
|
|
- Lista de conversaciones
|
|
- Visualización de mensajes
|
|
- Envío de mensajes
|
|
- Soporte para imágenes, audio, video, documentos
|
|
|
|
### Proxy Nginx para media
|
|
|
|
```nginx
|
|
location /media/ {
|
|
proxy_pass http://whatsapp-core:3001/media/;
|
|
proxy_set_header Host $host;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## API Endpoints Principales
|
|
|
|
### WhatsApp Accounts
|
|
|
|
```
|
|
GET /api/whatsapp/accounts # Listar cuentas
|
|
POST /api/whatsapp/accounts # Crear cuenta
|
|
GET /api/whatsapp/accounts/:id # Obtener cuenta
|
|
DELETE /api/whatsapp/accounts/:id # Eliminar cuenta
|
|
POST /api/whatsapp/accounts/:id/pause # Pausar conexión
|
|
POST /api/whatsapp/accounts/:id/resume # Reanudar conexión
|
|
```
|
|
|
|
### Conversaciones y Mensajes
|
|
|
|
```
|
|
GET /api/whatsapp/conversations # Listar conversaciones
|
|
GET /api/whatsapp/conversations/:id # Detalle con mensajes
|
|
POST /api/whatsapp/conversations/:id/send # Enviar mensaje
|
|
```
|
|
|
|
### WhatsApp Core (interno)
|
|
|
|
```
|
|
POST /api/sessions # Crear sesión
|
|
GET /api/sessions/:id # Info de sesión
|
|
POST /api/sessions/:id/disconnect # Cerrar sesión (logout)
|
|
POST /api/sessions/:id/pause # Pausar (sin logout)
|
|
POST /api/sessions/:id/resume # Reanudar
|
|
POST /api/sessions/:id/messages # Enviar mensaje
|
|
```
|
|
|
|
---
|
|
|
|
## Temas de Chat en Odoo
|
|
|
|
### Tema WhatsApp (clásico)
|
|
- Fondo beige con patrón
|
|
- Burbujas verdes (salientes) y blancas (entrantes)
|
|
- Estilo familiar de WhatsApp
|
|
|
|
### Tema DRRR (Durarara/Dollars)
|
|
- Fondo negro (#0a0a0a)
|
|
- Texto verde neón (#00ff88) para salientes
|
|
- Texto cyan (#00ccff) para entrantes
|
|
- Nombres en corchetes [Usuario]
|
|
- Fuente monospace
|
|
|
|
### Tema DOLLARS (Chat Hub)
|
|
- Interfaz oscura 3 columnas
|
|
- Sidebar con lista de conversaciones
|
|
- Chat central
|
|
- Panel de detalles a la derecha
|
|
- Acentos ámbar/naranja (#f59e0b)
|
|
|
|
---
|
|
|
|
## Problemas Conocidos y Soluciones
|
|
|
|
### 1. Imágenes no se ven en frontend
|
|
**Causa:** URLs absolutas con hostname Docker interno
|
|
**Solución:** Usar URLs relativas (`/media/uuid.jpg`) + proxy nginx
|
|
|
|
### 2. Odoo no muestra cambios
|
|
**Causa:** Base de datos incorrecta (odoo vs cas)
|
|
**Solución:** Siempre usar `-d cas` y header `X-Odoo-Database: cas`
|
|
|
|
### 3. CSS rompe todo Odoo
|
|
**Causa:** Estilos globales no encapsulados
|
|
**Solución:** Prefijar todo con `.o_dollars_chat` o `.o_whatsapp_chat_fullscreen`
|
|
|
|
### 4. Webhook retorna 404
|
|
**Causa:** Falta header de base de datos
|
|
**Solución:** Agregar `X-Odoo-Database: cas` a todas las peticiones
|
|
|
|
### 5. Account not found en webhook
|
|
**Causa:** `external_id` no configurado en Odoo
|
|
**Solución:** Actualizar tabla whatsapp_account con el UUID correcto
|
|
|
|
---
|
|
|
|
## Próximos Pasos Sugeridos
|
|
|
|
1. **Testing de pausar/reanudar** - Verificar que funciona correctamente
|
|
2. **Notificaciones en tiempo real** - WebSocket para nuevos mensajes
|
|
3. **Mejoras al Chat Hub DOLLARS** - Indicador de typing, scroll automático
|
|
4. **Integración completa Odoo** - Sincronizar contactos con res.partner
|
|
5. **Panel de métricas** - Dashboard con estadísticas de uso
|
|
|
|
---
|
|
|
|
## Credenciales y Accesos
|
|
|
|
| Servicio | URL | Usuario | Contraseña |
|
|
|----------|-----|---------|------------|
|
|
| Frontend | http://192.168.10.221:3000 | admin | (ver BD) |
|
|
| API Gateway | http://192.168.10.221:8000 | - | - |
|
|
| Odoo | http://192.168.10.188:8069 | ialcarazsalazar@consultoria-as.com | (conocida) |
|
|
| SSH Odoo | 192.168.10.188:22 | root | Aasi940812 |
|
|
| Gitea | https://git.consultoria-as.com | consultoria-as | (token en remote) |
|
|
|
|
---
|
|
|
|
## Comandos de Desarrollo
|
|
|
|
```bash
|
|
# Clonar repositorio
|
|
git clone https://git.consultoria-as.com/consultoria-as/WhatsAppCentralizado.git
|
|
|
|
# Levantar todo
|
|
cd WhatsAppCentralizado
|
|
docker compose up -d
|
|
|
|
# Desplegar módulo Odoo
|
|
sshpass -p 'Aasi940812' scp -r odoo_whatsapp_hub root@192.168.10.188:/opt/odoo/addons/
|
|
sshpass -p 'Aasi940812' ssh root@192.168.10.188 "systemctl stop odoo && /usr/bin/odoo -c /etc/odoo/odoo.conf -d cas -u odoo_whatsapp_hub --stop-after-init && systemctl start odoo"
|
|
|
|
# Ver estado
|
|
docker compose ps
|
|
docker compose logs -f
|
|
```
|
|
|
|
---
|
|
|
|
*Documento generado automáticamente. Última sesión de trabajo: 2026-01-30*
|