# 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