whatsapp_composer.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from odoo import models, fields, api
  2. from odoo.exceptions import ValidationError
  3. import logging
  4. _logger = logging.getLogger(__name__)
  5. class WhatsAppComposer(models.TransientModel):
  6. _inherit = 'whatsapp.composer'
  7. # Campo Many2one para grupos - solo disponible cuando whatsapp_web_groups está instalado
  8. whatsapp_group_id = fields.Many2one('ww.group', string='WhatsApp Group',
  9. help="Select WhatsApp group to send message to",
  10. ondelete='set null')
  11. @api.onchange('whatsapp_group_id')
  12. def _onchange_whatsapp_group_id(self):
  13. """Actualizar campos cuando se selecciona un grupo"""
  14. if self.whatsapp_group_id:
  15. self.whatsapp_group_id_char = self.whatsapp_group_id.whatsapp_web_id
  16. self.recipient_type = 'group'
  17. self.phone = False
  18. @api.onchange('recipient_type')
  19. def _onchange_recipient_type(self):
  20. """Limpiar campos al cambiar tipo de destinatario"""
  21. if self.recipient_type != 'group':
  22. self.whatsapp_group_id = False
  23. @api.constrains('recipient_type', 'phone', 'whatsapp_group_id', 'whatsapp_group_id_char', 'wa_template_id', 'body')
  24. def _check_recipient_configuration(self):
  25. """Extender validación para incluir whatsapp_group_id"""
  26. super()._check_recipient_configuration()
  27. for record in self:
  28. if record.recipient_type == 'group':
  29. if not record.whatsapp_group_id and not record.whatsapp_group_id_char:
  30. raise ValidationError("Please select a WhatsApp group or enter a Group ID when sending to groups")
  31. def _send_whatsapp_web_message(self):
  32. """Extender método para usar whatsapp_group_id si está disponible"""
  33. records = self._get_active_records()
  34. for record in records:
  35. # Determinar destinatario - priorizar whatsapp_group_id sobre whatsapp_group_id_char
  36. if self.recipient_type == 'group':
  37. if self.whatsapp_group_id:
  38. mobile_number = self.whatsapp_group_id.whatsapp_web_id
  39. elif self.whatsapp_group_id_char:
  40. mobile_number = self.whatsapp_group_id_char
  41. else:
  42. raise ValidationError("Please specify a group")
  43. else:
  44. mobile_number = self.phone
  45. if not mobile_number:
  46. raise ValidationError("Please provide a phone number")
  47. # Crear mail.message con adjuntos si existen
  48. post_values = {
  49. 'attachment_ids': [self.attachment_id.id] if self.attachment_id else [],
  50. 'body': self.body,
  51. 'message_type': 'whatsapp_message',
  52. 'partner_ids': hasattr(record, '_mail_get_partners') and record._mail_get_partners()[record.id].ids or record._whatsapp_get_responsible().partner_id.ids,
  53. }
  54. if hasattr(records, '_message_log'):
  55. message = record._message_log(**post_values)
  56. else:
  57. message = self.env['mail.message'].create(
  58. dict(post_values, res_id=record.id, model=self.res_model,
  59. subtype_id=self.env['ir.model.data']._xmlid_to_res_id("mail.mt_note"))
  60. )
  61. # Crear mensaje WhatsApp
  62. message_vals = {
  63. 'mail_message_id': message.id,
  64. 'mobile_number': mobile_number,
  65. 'mobile_number_formatted': mobile_number,
  66. 'recipient_type': self.recipient_type,
  67. 'wa_template_id': False,
  68. 'wa_account_id': self._get_whatsapp_web_account().id,
  69. 'state': 'outgoing',
  70. }
  71. # Agregar whatsapp_group_id si está disponible
  72. if self.whatsapp_group_id:
  73. message_vals['whatsapp_group_id'] = self.whatsapp_group_id.id
  74. whatsapp_message = self.env['whatsapp.message'].create(message_vals)
  75. # Enviar mensaje
  76. whatsapp_message._send_message()
  77. return {'type': 'ir.actions.act_window_close'}
  78. def _prepare_whatsapp_message_values(self, record):
  79. """Extender método para agregar información de grupo"""
  80. values = super()._prepare_whatsapp_message_values(record)
  81. # Agregar información de grupo si está disponible
  82. if (hasattr(self, 'recipient_type') and self.recipient_type == 'group'):
  83. if self.whatsapp_group_id:
  84. values.update({
  85. 'whatsapp_group_id': self.whatsapp_group_id.id,
  86. 'mobile_number': self.whatsapp_group_id.whatsapp_web_id,
  87. 'mobile_number_formatted': self.whatsapp_group_id.whatsapp_web_id,
  88. })
  89. elif self.whatsapp_group_id_char:
  90. values.update({
  91. 'mobile_number': self.whatsapp_group_id_char,
  92. 'mobile_number_formatted': self.whatsapp_group_id_char,
  93. })
  94. return values