marketing_activity.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from odoo import models, fields
  2. import logging
  3. _logger = logging.getLogger(__name__)
  4. class MarketingActivity(models.Model):
  5. _inherit = 'marketing.activity'
  6. # Campo para grupo de WhatsApp en actividades de marketing
  7. whatsapp_group_id = fields.Many2one(
  8. 'ww.group',
  9. string='Grupo de WhatsApp',
  10. help="Grupo de WhatsApp para enviar mensajes (opcional). Si está vacío, se envían a destinatarios individuales según la plantilla."
  11. )
  12. def _execute_whatsapp(self, traces):
  13. """Override para soportar envío a grupos de WhatsApp usando campos nativos"""
  14. _logger.info(f"Ejecutando WhatsApp para actividad {self.id}: {self.name}")
  15. # Si hay grupo configurado, usar la lógica simple que funcionaba antes
  16. if self.whatsapp_group_id:
  17. _logger.info(f"Enviando mensaje WhatsApp al grupo NATIVO: {self.whatsapp_group_id.name}")
  18. try:
  19. # Usar el método original pero con mobile_number del grupo
  20. res_ids = [res_id for res_id in set(traces.mapped('res_id')) if res_id]
  21. now = self.env.cr.now()
  22. composer_vals = {
  23. 'res_model': self.model_name,
  24. 'res_ids': res_ids,
  25. 'wa_template_id': self.whatsapp_template_id.id,
  26. 'batch_mode': True,
  27. 'phone': self.whatsapp_group_id.whatsapp_web_id, # ✅ Usar ID del grupo como "teléfono"
  28. }
  29. _logger.info(f"Usando método original con grupo ID: {self.whatsapp_group_id.whatsapp_web_id}")
  30. composer = self.env['whatsapp.composer'].with_context(active_model=self.model_name).create(composer_vals)
  31. messages = composer._create_whatsapp_messages(force_create=True)
  32. message_by_res_id = {r.mail_message_id.res_id: r for r in messages}
  33. # Asignar mensajes a traces (como el original)
  34. for trace in self.trace_ids:
  35. res_id = trace.res_id
  36. message = message_by_res_id.get(res_id, self.env['whatsapp.message'])
  37. if message:
  38. trace.whatsapp_message_id = message.id
  39. # Marcar como grupo
  40. message.write({
  41. 'recipient_type': 'group',
  42. 'whatsapp_group_id': self.whatsapp_group_id.id,
  43. })
  44. if not message.mobile_number:
  45. message.state = 'error'
  46. message.failure_type = 'phone_invalid'
  47. # Enviar mensajes (como el original)
  48. messages._send()
  49. _logger.info(f"Mensaje enviado exitosamente al grupo {self.whatsapp_group_id.name}")
  50. except Exception as e:
  51. _logger.warning('Marketing Automation: actividad <%s> error al enviar a grupo WhatsApp %s', self.id, str(e))
  52. traces.write({
  53. 'state': 'error',
  54. 'schedule_date': now,
  55. 'state_msg': f'Error al enviar a grupo WhatsApp: {e}',
  56. })
  57. else:
  58. # LÓGICA ORIGINAL: Marcar traces como procesados
  59. cancelled_traces = traces.filtered(lambda trace: trace.whatsapp_message_id.state == 'cancel')
  60. error_traces = traces.filtered(lambda trace: trace.whatsapp_message_id.state == 'error')
  61. if cancelled_traces:
  62. cancelled_traces.write({
  63. 'state': 'canceled',
  64. 'schedule_date': now,
  65. 'state_msg': 'WhatsApp canceled'
  66. })
  67. if error_traces:
  68. error_traces.write({
  69. 'state': 'error',
  70. 'schedule_date': now,
  71. 'state_msg': 'WhatsApp failed'
  72. })
  73. processed_traces = traces - (cancelled_traces | error_traces)
  74. if processed_traces:
  75. processed_traces.write({
  76. 'state': 'processed',
  77. 'schedule_date': now,
  78. })
  79. else:
  80. _logger.info(f"Campo whatsapp_group_id VACÍO - Enviando a destinatarios individuales")
  81. # Usar lógica original para envío individual
  82. super()._execute_whatsapp(traces)
  83. return True