feat(odoo): extend res.partner with WhatsApp fields

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Claude AI
2026-01-29 22:43:03 +00:00
parent 7551a3d8b7
commit 1074bf6739

View File

@@ -0,0 +1,116 @@
from odoo import models, fields, api
class ResPartner(models.Model):
_inherit = 'res.partner'
whatsapp_conversation_ids = fields.One2many(
'whatsapp.conversation',
'partner_id',
string='Conversaciones WhatsApp',
)
whatsapp_conversation_count = fields.Integer(
string='Conversaciones',
compute='_compute_whatsapp_conversation_count',
)
whatsapp_last_conversation_id = fields.Many2one(
'whatsapp.conversation',
string='Última Conversación',
compute='_compute_whatsapp_last_conversation',
)
whatsapp_unread_count = fields.Integer(
string='Mensajes No Leídos',
compute='_compute_whatsapp_unread_count',
)
@api.depends('whatsapp_conversation_ids')
def _compute_whatsapp_conversation_count(self):
for partner in self:
partner.whatsapp_conversation_count = len(partner.whatsapp_conversation_ids)
@api.depends('whatsapp_conversation_ids.last_message_at')
def _compute_whatsapp_last_conversation(self):
for partner in self:
conversations = partner.whatsapp_conversation_ids.sorted(
'last_message_at', reverse=True
)
partner.whatsapp_last_conversation_id = conversations[:1].id if conversations else False
@api.depends('whatsapp_conversation_ids.unread_count')
def _compute_whatsapp_unread_count(self):
for partner in self:
partner.whatsapp_unread_count = sum(
partner.whatsapp_conversation_ids.mapped('unread_count')
)
def action_open_whatsapp_conversations(self):
"""Open WhatsApp conversations for this partner"""
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'name': f'Conversaciones - {self.name}',
'res_model': 'whatsapp.conversation',
'view_mode': 'tree,form',
'domain': [('partner_id', '=', self.id)],
'context': {'default_partner_id': self.id},
}
def action_send_whatsapp(self):
"""Open wizard to send WhatsApp message"""
self.ensure_one()
phone = self.mobile or self.phone
if not phone:
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'message': 'El contacto no tiene número de teléfono',
'type': 'warning',
}
}
return {
'type': 'ir.actions.act_window',
'name': 'Enviar WhatsApp',
'res_model': 'whatsapp.send.wizard',
'view_mode': 'form',
'target': 'new',
'context': {
'default_partner_id': self.id,
'default_phone': phone,
},
}
def action_open_whatsapp_chat(self):
"""Open or create WhatsApp conversation"""
self.ensure_one()
phone = self.mobile or self.phone
if not phone:
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'message': 'El contacto no tiene número de teléfono',
'type': 'warning',
}
}
account = self.env['whatsapp.account'].get_default_account()
if not account:
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'message': 'No hay cuenta WhatsApp configurada',
'type': 'warning',
}
}
conversation = self.env['whatsapp.conversation'].find_or_create_by_phone(
phone=phone,
account_id=account.id,
contact_name=self.name,
)
conversation.partner_id = self.id
return conversation.action_open_chat()