from odoo import models, fields import logging _logger = logging.getLogger(__name__) class MarketingActivity(models.Model): _inherit = 'marketing.activity' # Campo para grupo de WhatsApp en actividades de marketing whatsapp_group_id = fields.Many2one( 'ww.group', string='Grupo de WhatsApp', help="Grupo de WhatsApp para enviar mensajes (opcional). Si está vacío, se envían a destinatarios individuales según la plantilla." ) def _execute_whatsapp(self, traces): """Override para soportar envío a grupos de WhatsApp usando campos nativos""" _logger.info(f"Ejecutando WhatsApp para actividad {self.id}: {self.name}") # Si hay grupo configurado, usar la lógica simple que funcionaba antes if self.whatsapp_group_id: _logger.info(f"Enviando mensaje WhatsApp al grupo NATIVO: {self.whatsapp_group_id.name}") try: # Usar el método original pero con mobile_number del grupo res_ids = [res_id for res_id in set(traces.mapped('res_id')) if res_id] now = self.env.cr.now() composer_vals = { 'res_model': self.model_name, 'res_ids': res_ids, 'wa_template_id': self.whatsapp_template_id.id, 'batch_mode': True, 'phone': self.whatsapp_group_id.whatsapp_web_id, # ✅ Usar ID del grupo como "teléfono" } _logger.info(f"Usando método original con grupo ID: {self.whatsapp_group_id.whatsapp_web_id}") composer = self.env['whatsapp.composer'].with_context(active_model=self.model_name).create(composer_vals) messages = composer._create_whatsapp_messages(force_create=True) message_by_res_id = {r.mail_message_id.res_id: r for r in messages} # Asignar mensajes a traces (como el original) for trace in self.trace_ids: res_id = trace.res_id message = message_by_res_id.get(res_id, self.env['whatsapp.message']) if message: trace.whatsapp_message_id = message.id # Marcar como grupo message.write({ 'recipient_type': 'group', 'whatsapp_group_id': self.whatsapp_group_id.id, }) if not message.mobile_number: message.state = 'error' message.failure_type = 'phone_invalid' # Enviar mensajes (como el original) messages._send() _logger.info(f"Mensaje enviado exitosamente al grupo {self.whatsapp_group_id.name}") except Exception as e: _logger.warning('Marketing Automation: actividad <%s> error al enviar a grupo WhatsApp %s', self.id, str(e)) traces.write({ 'state': 'error', 'schedule_date': now, 'state_msg': f'Error al enviar a grupo WhatsApp: {e}', }) else: # LÓGICA ORIGINAL: Marcar traces como procesados cancelled_traces = traces.filtered(lambda trace: trace.whatsapp_message_id.state == 'cancel') error_traces = traces.filtered(lambda trace: trace.whatsapp_message_id.state == 'error') if cancelled_traces: cancelled_traces.write({ 'state': 'canceled', 'schedule_date': now, 'state_msg': 'WhatsApp canceled' }) if error_traces: error_traces.write({ 'state': 'error', 'schedule_date': now, 'state_msg': 'WhatsApp failed' }) processed_traces = traces - (cancelled_traces | error_traces) if processed_traces: processed_traces.write({ 'state': 'processed', 'schedule_date': now, }) else: _logger.info(f"Campo whatsapp_group_id VACÍO - Enviando a destinatarios individuales") # Usar lógica original para envío individual super()._execute_whatsapp(traces) return True