whatsapp_composer.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. super()._onchange_recipient_type()
  22. if self.recipient_type != 'group':
  23. self.whatsapp_group_id = False
  24. @api.constrains('recipient_type', 'phone', 'whatsapp_group_id', 'whatsapp_group_id_char', 'wa_template_id', 'body')
  25. def _check_recipient_configuration(self):
  26. """Extender validación para incluir whatsapp_group_id"""
  27. super()._check_recipient_configuration()
  28. for record in self:
  29. if record.recipient_type == 'group':
  30. if not record.whatsapp_group_id and not record.whatsapp_group_id_char:
  31. raise ValidationError("Please select a WhatsApp group or enter a Group ID when sending to groups")
  32. def _send_whatsapp_web_message(self):
  33. """Extender método para usar whatsapp_group_id si está disponible"""
  34. records = self._get_active_records()
  35. for record in records:
  36. # Determinar destinatario - priorizar whatsapp_group_id sobre whatsapp_group_id_char
  37. if self.recipient_type == 'group':
  38. if self.whatsapp_group_id:
  39. mobile_number = self.whatsapp_group_id.whatsapp_web_id
  40. elif self.whatsapp_group_id_char:
  41. mobile_number = self.whatsapp_group_id_char
  42. else:
  43. raise ValidationError("Please specify a group")
  44. else:
  45. mobile_number = self.phone
  46. if not mobile_number:
  47. raise ValidationError("Please provide a phone number")
  48. # Crear mail.message con adjuntos si existen
  49. post_values = {
  50. 'attachment_ids': [self.attachment_id.id] if self.attachment_id else [],
  51. 'body': self.body,
  52. 'message_type': 'whatsapp_message',
  53. 'partner_ids': hasattr(record, '_mail_get_partners') and record._mail_get_partners()[record.id].ids or record._whatsapp_get_responsible().partner_id.ids,
  54. }
  55. if hasattr(records, '_message_log'):
  56. message = record._message_log(**post_values)
  57. else:
  58. message = self.env['mail.message'].create(
  59. dict(post_values, res_id=record.id, model=self.res_model,
  60. subtype_id=self.env['ir.model.data']._xmlid_to_res_id("mail.mt_note"))
  61. )
  62. # Crear mensaje WhatsApp
  63. message_vals = {
  64. 'mail_message_id': message.id,
  65. 'mobile_number': mobile_number,
  66. 'mobile_number_formatted': mobile_number,
  67. 'recipient_type': self.recipient_type,
  68. 'wa_template_id': False,
  69. 'wa_account_id': self._get_whatsapp_web_account().id,
  70. 'state': 'outgoing',
  71. }
  72. # Agregar whatsapp_group_id si está disponible
  73. if self.whatsapp_group_id:
  74. message_vals['whatsapp_group_id'] = self.whatsapp_group_id.id
  75. whatsapp_message = self.env['whatsapp.message'].create(message_vals)
  76. # Enviar mensaje
  77. whatsapp_message._send_message()
  78. return {'type': 'ir.actions.act_window_close'}
  79. def _prepare_whatsapp_message_values(self, record):
  80. """Extender método para agregar información de grupo"""
  81. values = super()._prepare_whatsapp_message_values(record)
  82. # Agregar información de grupo si está disponible
  83. if (hasattr(self, 'recipient_type') and self.recipient_type == 'group'):
  84. if self.whatsapp_group_id:
  85. values.update({
  86. 'whatsapp_group_id': self.whatsapp_group_id.id,
  87. 'mobile_number': self.whatsapp_group_id.whatsapp_web_id,
  88. 'mobile_number_formatted': self.whatsapp_group_id.whatsapp_web_id,
  89. })
  90. elif self.whatsapp_group_id_char:
  91. values.update({
  92. 'mobile_number': self.whatsapp_group_id_char,
  93. 'mobile_number_formatted': self.whatsapp_group_id_char,
  94. })
  95. return values