# Gestor de Grupos de WhatsApp Web para Odoo 18
## Descripción
Este módulo permite gestionar grupos, contactos y roles de WhatsApp Web, sincronizando automáticamente con la API de whatsapp-web.js. Proporciona una interfaz completa para administrar grupos de WhatsApp y sus miembros dentro de Odoo.
## Características Principales
- ✅ Sincronización automática de grupos de WhatsApp Web
- ✅ Gestión de contactos y miembros de grupos
- ✅ Creación automática de canales de discusión para cada grupo
- ✅ Sistema de roles y permisos para miembros
- ✅ Integración con el sistema de contactos de Odoo
- ✅ Procesamiento automático de mensajes de grupos
- ✅ Sincronización programada con cron jobs
- ✅ Envío directo de mensajes a grupos
## Requisitos
- Odoo 18.0
- Módulo `whatsapp_web` (dependencia obligatoria)
- Módulos: `base`, `contacts`, `mail`, `calendar`, `helpdesk`
- Servidor whatsapp-web.js configurado y funcionando
## Instalación
1. **Instalar dependencias:**
```bash
cd /var/odoo/mcteam.run
sudo -u odoo venv/bin/python3 src/odoo-bin -c odoo.conf -i whatsapp_web
```
2. **Instalar el módulo:**
```bash
sudo -u odoo venv/bin/python3 src/odoo-bin -c odoo.conf -i whatsapp_web_groups
```
3. **Reiniciar el servidor Odoo:**
```bash
./restart_odoo.sh
```
## Configuración Inicial
### 1. Configurar Cuenta WhatsApp Web
1. Ir a **WhatsApp > Configuración > Cuentas WhatsApp**
2. Crear o editar una cuenta WhatsApp
3. Configurar la **WhatsApp Web URL** (ej: `https://web.whatsapp.com/api`)
4. Guardar la configuración
### 2. Sincronización Inicial
1. Ir a **WhatsApp Web > Grupos**
2. Hacer clic en "Sincronizar" o ejecutar manualmente:
```python
self.env['ww.group'].sync_ww_contacts_groups()
```
### 3. Configurar Cron Job (Opcional)
Para sincronización automática cada hora:
1. Ir a **Configuración > Técnico > Automatización > Acciones Programadas**
2. Buscar "Sincronizar Contactos y Grupos WhatsApp Web"
3. Activar el cron job
4. Configurar intervalo deseado
## Uso
### Gestión de Grupos
#### Ver Grupos Sincronizados
1. Ir a **WhatsApp Web > Grupos**
2. Ver lista de todos los grupos sincronizados
3. Hacer clic en un grupo para ver detalles
#### Enviar Mensaje a Grupo
1. Seleccionar un grupo de la lista
2. Hacer clic en "Send WhatsApp Message"
3. Completar el composer de WhatsApp
4. Enviar el mensaje
#### Sincronización Manual
```python
# Desde shell de Odoo
groups = self.env['ww.group']
groups.sync_ww_contacts_groups()
```
### Gestión de Contactos
#### Ver Contactos WhatsApp
1. Ir a **Contactos > Contactos WhatsApp Web**
2. Ver todos los contactos sincronizados de WhatsApp
3. Editar información de contactos si es necesario
#### Contactos en Grupos
- Los contactos se sincronizan automáticamente cuando están en grupos
- Se actualizan los números de teléfono y nombres
- Se evitan duplicados usando los últimos 10 dígitos del móvil
### Canales de Discusión
#### Creación Automática
- Cada grupo crea automáticamente un canal de discusión
- El canal se nombra con prefijo "📱" + nombre del grupo
- Todos los miembros del grupo se agregan al canal
#### Gestión de Canales
1. Ir al canal desde el menú de discusión
2. Los mensajes de WhatsApp se procesan automáticamente
3. Se mantiene historial de conversaciones
## Estructura de Datos
### Modelos Principales
#### `ww.group`
Representa un grupo de WhatsApp Web.
**Campos:**
- `name`: Nombre del grupo
- `whatsapp_web_id`: ID único en WhatsApp Web
- `whatsapp_account_id`: Cuenta WhatsApp asociada
- `channel_id`: Canal de discusión creado
- `contact_ids`: Contactos miembros del grupo
#### `ww.contact` (Extiende `res.partner`)
Contactos de WhatsApp Web.
**Campos adicionales:**
- `whatsapp_web_id`: ID único en WhatsApp Web
- `group_ids`: Grupos donde participa el contacto
#### `ww.role`
Roles que pueden tener los miembros en grupos.
**Campos:**
- `name`: Nombre del rol
- `description`: Descripción del rol
#### `ww.group_contact_rel`
Relación entre grupos y contactos con roles.
**Campos:**
- `group_id`: Referencia al grupo
- `contact_id`: Referencia al contacto
- `is_admin`: Si es administrador
- `is_super_admin`: Si es super administrador
- `role_id`: Rol asignado
## API del Módulo
### Métodos Principales
#### `ww.group.sync_ww_contacts_groups()`
Sincroniza todos los grupos y contactos desde WhatsApp Web.
```python
# Sincronización completa
self.env['ww.group'].sync_ww_contacts_groups()
# Sincronización por cuenta específica
account = self.env['whatsapp.account'].browse(1)
groups_data = account.get_groups()
```
#### `ww.group._create_discussion_channel()`
Crea un canal de discusión para el grupo.
```python
group = self.env['ww.group'].browse(1)
channel = group._create_discussion_channel()
```
#### `ww.group._process_messages(messages_data)`
Procesa mensajes de WhatsApp y los crea en el canal.
```python
group = self.env['ww.group'].browse(1)
messages = [
{
'id': {'_serialized': 'message_id'},
'body': 'Contenido del mensaje',
'author': 'contacto_id',
'timestamp': 1234567890
}
]
group._process_messages(messages)
```
#### `ww.group.send_whatsapp_message(body, attachment=None, wa_template_id=None)`
Envía un mensaje WhatsApp al grupo.
```python
group = self.env['ww.group'].browse(1)
message = group.send_whatsapp_message(
body="Hola grupo!",
attachment=attachment_record,
wa_template_id=template_record
)
```
#### `ww.group.action_send_whatsapp_message()`
Abre el composer de WhatsApp para enviar mensaje al grupo.
```python
group = self.env['ww.group'].browse(1)
action = group.action_send_whatsapp_message()
```
### Métodos de Sincronización
#### `whatsapp.account.get_groups()`
Obtiene grupos desde el servidor whatsapp-web.js.
**Respuesta esperada:**
```json
[
{
"id": {"_serialized": "120363158956331133@g.us"},
"name": "Mi Grupo",
"members": [
{
"id": {"_serialized": "5215551234567@c.us"},
"number": "5551234567",
"name": "Juan Pérez",
"isAdmin": false,
"isSuperAdmin": false
}
],
"messages": [...]
}
]
```
## Configuración Avanzada
### Personalización de Sincronización
#### Modificar Intervalo de Sincronización
```xml
2
hours
```
#### Filtros de Sincronización
```python
# Sincronizar solo grupos específicos
accounts = self.env['whatsapp.account'].search([
('name', 'ilike', 'cuenta_especifica')
])
for account in accounts:
groups_data = account.get_groups()
# Procesar solo grupos deseados
```
### Gestión de Permisos
#### Configurar Accesos
```csv
# En security/ir.model.access.csv
access_ww_group_user,ww.group.user,model_ww_group,base.group_user,1,1,1,0
access_ww_group_manager,ww.group.manager,model_ww_group,base.group_system,1,1,1,1
```
## Solución de Problemas
### Error: "No hay contactos para crear el canal"
- **Causa**: El grupo no tiene miembros o la sincronización falló
- **Solución**: Ejecutar sincronización manual y verificar conectividad
### Error: "Error al crear el canal para el grupo"
- **Causa**: Problemas de permisos o configuración de grupos de usuario
- **Solución**: Verificar que el usuario tenga permisos para crear canales
### Grupos no se sincronizan
- **Causa**: Servidor whatsapp-web.js no responde o método `getGroups` no implementado
- **Solución**:
1. Verificar conectividad con el servidor
2. Confirmar implementación del método `getGroups`
3. Revisar logs del servidor whatsapp-web.js
### Contactos duplicados
- **Causa**: Múltiples números similares en diferentes formatos
- **Solución**: El módulo usa los últimos 10 dígitos para evitar duplicados automáticamente
### Mensajes no se procesan en canales
- **Causa**: Formato incorrecto de datos de mensajes o canal no creado
- **Solución**:
1. Verificar que el grupo tenga canal asociado
2. Confirmar formato de datos de mensajes
3. Revisar permisos de escritura en canales
## Logs y Debugging
### Logs de Sincronización
```bash
# Ver logs de sincronización
tail -f /var/odoo/stg2.mcteam.run/logs/odoo-server.log | grep -i "sincroniz\|grupo\|contacto"
```
### Debug de Grupos
```python
# Verificar estado de grupos
groups = self.env['ww.group'].search([])
for group in groups:
print(f"Grupo: {group.name}")
print(f"Contactos: {len(group.contact_ids)}")
print(f"Canal: {group.channel_id.name if group.channel_id else 'Sin canal'}")
```
### Debug de Sincronización
```python
# Probar sincronización paso a paso
account = self.env['whatsapp.account'].search([('whatsapp_web_url', '!=', False)], limit=1)
groups_data = account.get_groups()
print(f"Grupos obtenidos: {len(groups_data)}")
```
## Mantenimiento
### Limpieza de Datos
```python
# Limpiar grupos sin contactos
empty_groups = self.env['ww.group'].search([
('contact_ids', '=', False)
])
empty_groups.unlink()
# Limpiar contactos sin grupos
orphan_contacts = self.env['res.partner'].search([
('whatsapp_web_id', '!=', False),
('group_ids', '=', False)
])
orphan_contacts.write({'whatsapp_web_id': False})
```
### Optimización de Performance
- La sincronización procesa grupos en lotes para evitar timeouts
- Los mensajes se crean en bulk para mejorar performance
- Se evitan duplicados usando constraints de base de datos
## Actualizaciones
Para actualizar el módulo:
```bash
cd /var/odoo/mcteam.run
sudo -u odoo venv/bin/python3 src/odoo-bin -c odoo.conf -u whatsapp_web_groups
./restart_odoo.sh
```
## Integración con Otros Módulos
### Marketing
- Los grupos se pueden usar como destinatarios en campañas de marketing
- Soporte para plantillas personalizadas por grupo
### Helpdesk
- Crear tickets automáticamente desde mensajes de grupos
- Asignar SLAs basados en roles de grupo
### Calendar
- Programar reuniones con miembros de grupos
- Invitaciones automáticas a eventos
## Soporte
Para soporte técnico o reportar bugs:
- Revisar logs de Odoo y del servidor whatsapp-web.js
- Verificar configuración de cuentas WhatsApp
- Confirmar conectividad de red
## Changelog
### Versión 1.0
- Implementación inicial del gestor de grupos
- Sincronización automática de grupos y contactos
- Creación automática de canales de discusión
- Sistema de roles y permisos
- Procesamiento de mensajes de grupos
- Integración con composer de WhatsApp