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()