143 lines
6.5 KiB
Python
143 lines
6.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import models, fields, api, _
|
|
|
|
class SocialCommerceDashboard(models.Model):
|
|
_name = 'social.commerce.dashboard'
|
|
_description = 'Social Commerce Admin Dashboard'
|
|
|
|
name = fields.Char(string='Dashboard', default='Social Commerce Overview')
|
|
company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.company)
|
|
|
|
# Meta Metrics
|
|
meta_connection_status = fields.Selection([
|
|
('untested', 'Not Tested'),
|
|
('connected', 'Connected'),
|
|
('error', 'Connection Error')
|
|
], string='Meta Connection Status', compute='_compute_metrics')
|
|
meta_catalog_id = fields.Char(string='Meta Catalog ID', compute='_compute_metrics')
|
|
meta_last_sync = fields.Datetime(string='Last Catalog Sync', compute='_compute_metrics')
|
|
meta_synced_count = fields.Integer(string='Products Synced', compute='_compute_metrics')
|
|
meta_pending_count = fields.Integer(string='Products Pending', compute='_compute_metrics')
|
|
meta_failed_count = fields.Integer(string='Products Failed', compute='_compute_metrics')
|
|
|
|
# WhatsApp Metrics
|
|
whatsapp_connection_status = fields.Selection([
|
|
('untested', 'Not Tested'),
|
|
('connected', 'Connected'),
|
|
('error', 'Connection Error')
|
|
], string='WhatsApp Connection Status', compute='_compute_metrics')
|
|
whatsapp_webhook_verified = fields.Boolean(string='Webhook Verified', compute='_compute_metrics')
|
|
whatsapp_phone = fields.Char(string='Business Number', compute='_compute_metrics')
|
|
whatsapp_sent_count = fields.Integer(string='Notifications Sent', compute='_compute_metrics')
|
|
whatsapp_failed_count = fields.Integer(string='Failed Notifications', compute='_compute_metrics')
|
|
whatsapp_inbound_count = fields.Integer(string='Customer Inquiries', compute='_compute_metrics')
|
|
last_inbound_message = fields.Text(string='Last Customer Message', compute='_compute_metrics')
|
|
last_inbound_date = fields.Datetime(string='Last Message Date', compute='_compute_metrics')
|
|
|
|
def _compute_metrics(self):
|
|
queue_model = self.env['social.meta.sync.queue']
|
|
notif_model = self.env['social.whatsapp.notification']
|
|
msg_model = self.env['social.whatsapp.message']
|
|
product_model = self.env['product.product']
|
|
|
|
for rec in self:
|
|
comp = rec.company_id or self.env.company
|
|
# Meta
|
|
rec.meta_connection_status = comp.meta_connection_status
|
|
rec.meta_catalog_id = comp.meta_catalog_id or 'Not Configured'
|
|
|
|
last_synced_prod = product_model.search([
|
|
('meta_last_sync', '!=', False),
|
|
('company_id', 'in', (False, comp.id))
|
|
], order='meta_last_sync desc', limit=1)
|
|
rec.meta_last_sync = last_synced_prod.meta_last_sync if last_synced_prod else False
|
|
|
|
rec.meta_synced_count = product_model.search_count([
|
|
('meta_sync_status', '=', 'synced'),
|
|
('company_id', 'in', (False, comp.id))
|
|
])
|
|
rec.meta_pending_count = queue_model.search_count([
|
|
('state', 'in', ('pending', 'processing')),
|
|
('company_id', '=', comp.id)
|
|
])
|
|
rec.meta_failed_count = queue_model.search_count([
|
|
('state', '=', 'failed'),
|
|
('company_id', '=', comp.id)
|
|
])
|
|
|
|
# WhatsApp
|
|
rec.whatsapp_connection_status = comp.whatsapp_connection_status
|
|
rec.whatsapp_webhook_verified = comp.whatsapp_webhook_verified
|
|
rec.whatsapp_phone = comp.whatsapp_business_phone_number or 'Not Configured'
|
|
|
|
rec.whatsapp_sent_count = notif_model.search_count([
|
|
('state', 'in', ('sent', 'delivered', 'read')),
|
|
('company_id', '=', comp.id)
|
|
])
|
|
rec.whatsapp_failed_count = notif_model.search_count([
|
|
('state', '=', 'failed'),
|
|
('company_id', '=', comp.id)
|
|
])
|
|
rec.whatsapp_inbound_count = msg_model.search_count([
|
|
('direction', '=', 'inbound'),
|
|
('company_id', '=', comp.id)
|
|
])
|
|
|
|
last_msg = msg_model.search([
|
|
('direction', '=', 'inbound'),
|
|
('company_id', '=', comp.id)
|
|
], order='timestamp desc', limit=1)
|
|
if last_msg:
|
|
rec.last_inbound_message = f"{last_msg.from_phone}: {last_msg.body or ''}"
|
|
rec.last_inbound_date = last_msg.timestamp
|
|
else:
|
|
rec.last_inbound_message = "No incoming customer messages yet."
|
|
rec.last_inbound_date = False
|
|
|
|
def action_test_meta_connection(self):
|
|
return self.env['social.meta.catalog'].test_connection(self.company_id)
|
|
|
|
def action_test_whatsapp_connection(self):
|
|
return self.env['social.whatsapp.api'].test_connection(self.company_id)
|
|
|
|
def action_sync_products_now(self):
|
|
return self.env['social.meta.sync.queue'].action_sync_all_published_products(self.company_id)
|
|
|
|
def action_retry_failed_all(self):
|
|
# 1. Retry failed Meta queue items
|
|
meta_items = self.env['social.meta.sync.queue'].search([
|
|
('state', '=', 'failed'),
|
|
('company_id', '=', self.company_id.id)
|
|
])
|
|
if meta_items:
|
|
meta_items.action_retry()
|
|
self.env['social.meta.sync.queue'].process_queue(limit=50)
|
|
|
|
# 2. Retry failed WhatsApp notifications
|
|
wa_notifs = self.env['social.whatsapp.notification'].search([
|
|
('state', '=', 'failed'),
|
|
('company_id', '=', self.company_id.id)
|
|
])
|
|
if wa_notifs:
|
|
wa_notifs.action_retry()
|
|
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'title': _("Retry Initiated"),
|
|
'message': _("Retrying %d failed Meta catalog items and %d failed WhatsApp notifications.") % (len(meta_items), len(wa_notifs)),
|
|
'type': 'success',
|
|
'sticky': False,
|
|
}
|
|
}
|
|
|
|
def action_view_sync_logs(self):
|
|
return self.env["ir.actions.actions"]._for_xml_id("dine360_meta_social.action_social_meta_sync_queue")
|
|
|
|
def action_view_whatsapp_logs(self):
|
|
return self.env["ir.actions.actions"]._for_xml_id("dine360_meta_social.action_social_whatsapp_notification")
|
|
|
|
def action_view_inbound_messages(self):
|
|
return self.env["ir.actions.actions"]._for_xml_id("dine360_meta_social.action_social_whatsapp_message")
|