diff --git a/odoo_whatsapp_hub/models/res_partner.py b/odoo_whatsapp_hub/models/res_partner.py new file mode 100644 index 0000000..4feace2 --- /dev/null +++ b/odoo_whatsapp_hub/models/res_partner.py @@ -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()