mail_template.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from odoo import models, fields
  2. from odoo.tools import html2plaintext
  3. from odoo.tools.mail import email_split
  4. class MailTemplate(models.Model):
  5. _inherit = 'mail.template'
  6. send_whatsapp = fields.Boolean(string="Enviar también por WhatsApp", default=False)
  7. def send_mail_batch(self, res_ids, force_send=False, raise_exception=False, email_values=None, email_layout_xmlid=False):
  8. mails = super().send_mail_batch(res_ids, force_send=force_send, raise_exception=raise_exception, email_values=email_values, email_layout_xmlid=email_layout_xmlid)
  9. if not self.send_whatsapp or not mails:
  10. return mails
  11. RecordModel = self.env[self.model]
  12. partners_by_mail = {}
  13. for mail in mails:
  14. for partner in mail.recipient_ids:
  15. if partner.email:
  16. partners_by_mail.setdefault(partner.email.strip().lower(), []).append(partner)
  17. for mail in mails:
  18. # Filtrar por modelo habilitado en ir.model
  19. model_enabled = self.env['ir.model'].search([('model', '=', mail.model), ('whatsapp_notifications_enabled', '=', True)], limit=1)
  20. if not model_enabled:
  21. continue
  22. to_emails = []
  23. if mail.email_to:
  24. to_emails = [e.strip().lower() for e in email_split(mail.email_to)]
  25. recipients = set(to_emails)
  26. for partner in mail.recipient_ids:
  27. if partner.email:
  28. recipients.add(partner.email.strip().lower())
  29. subject = mail.subject or ''
  30. body_plain = html2plaintext(mail.body_html or '') if mail.body_html else ''
  31. message_text = (subject + "\n\n" + body_plain).strip() if (subject or body_plain) else ''
  32. sent_partner_ids = set()
  33. for email in recipients:
  34. partners = partners_by_mail.get(email, [])
  35. if not partners:
  36. partners = self.env['res.partner'].search([('email', 'ilike', email), ('mobile', '!=', False)])
  37. for partner in partners or []:
  38. if partner.id in sent_partner_ids:
  39. continue
  40. # Filtrar por preferencia del partner
  41. pref = self.env['partner.whatsapp.notification'].search([
  42. ('partner_id', '=', partner.id),
  43. ('model_id', '=', model_enabled.id),
  44. ('active', '=', True),
  45. ], limit=1)
  46. if not pref:
  47. continue
  48. if partner.mobile:
  49. msg = self.env['mail.message'].sudo().create({
  50. 'body': message_text or subject,
  51. 'message_type': 'whatsapp_message',
  52. 'model': mail.model,
  53. 'res_id': mail.res_id,
  54. 'partner_ids': [partner.id],
  55. 'subtype_id': self.env.ref("mail.mt_note").id,
  56. })
  57. wa_account = self.env['whatsapp.account'].search([('whatsapp_web_url', '!=', False)], limit=1)
  58. if not wa_account:
  59. continue
  60. self.env['whatsapp.message'].sudo().create({
  61. 'mail_message_id': msg.id,
  62. 'mobile_number': partner.mobile,
  63. 'mobile_number_formatted': partner.mobile,
  64. 'wa_template_id': False,
  65. 'wa_account_id': wa_account.id,
  66. 'state': 'outgoing',
  67. })._send_message()
  68. for attachment in mail.attachment_ids:
  69. msg_att = self.env['mail.message'].sudo().create({
  70. 'body': message_text or subject,
  71. 'message_type': 'whatsapp_message',
  72. 'model': mail.model,
  73. 'res_id': mail.res_id,
  74. 'partner_ids': [partner.id],
  75. 'attachment_ids': [(4, attachment.id)],
  76. 'subtype_id': self.env.ref("mail.mt_note").id,
  77. })
  78. self.env['whatsapp.message'].sudo().create({
  79. 'mail_message_id': msg_att.id,
  80. 'mobile_number': partner.mobile,
  81. 'mobile_number_formatted': partner.mobile,
  82. 'wa_template_id': False,
  83. 'wa_account_id': wa_account.id,
  84. 'state': 'outgoing',
  85. })._send_message()
  86. sent_partner_ids.add(partner.id)
  87. return mails