| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- 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
|