You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

162 lines
7.5 KiB

# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Dhanya Babu (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import datetime as DT
from odoo import http
from odoo.http import request
class HelpDeskDashboard(http.Controller):
"""Controller for handling Help Desk dashboard requests."""
@http.route(['/helpdesk_dashboard'], type='json', auth="public")
def helpdesk_dashboard(self):
"""Retrieves statistics for tickets in different stages.
Returns:dict: Dashboard statistics including counts and IDs for each
stage.
"""
stage_names = ['Inbox', 'Draft', 'In Progress', 'Canceled', 'Done',
'Closed']
stage_ids = {
name: request.env['ticket.stage'].search([('name', '=', name)],
limit=1).id for name in
stage_names}
new_stages = [stage_ids['Inbox'], stage_ids['Draft']]
def get_ticket_data(stage_ids):
tickets = request.env["ticket.helpdesk"].search(
[('stage_id', 'in', stage_ids)])
return len(tickets), [ticket.id for ticket in tickets]
dashboard_values = {
'new': (get_ticket_data(new_stages))[0],
'new_id': (get_ticket_data(new_stages))[1],
'in_progress': (get_ticket_data([stage_ids['In Progress']]))[0],
'in_progress_id': (get_ticket_data([stage_ids['In Progress']]))[1],
'canceled': (get_ticket_data([stage_ids['Canceled']]))[0],
'canceled_id': (get_ticket_data([stage_ids['Canceled']]))[1],
'done': (get_ticket_data([stage_ids['Done']]))[0],
'done_id': (get_ticket_data([stage_ids['Done']]))[1],
'closed': (get_ticket_data([stage_ids['Closed']]))[0],
'closed_id': (get_ticket_data([stage_ids['Closed']]))[1]}
return dashboard_values
def helpdesk_dashboard_week(self):
""" Retrieves statistics for tickets created in the past week.
Returns:
dict: Dashboard statistics including counts and IDs for each stage."""
today = DT.date.today()
week_ago = str(today - DT.timedelta(days=7)) + ' '
stage_names = ['Inbox', 'Draft', 'In Progress', 'Canceled', 'Done',
'Closed']
stages = {
name: request.env['ticket.stage'].search([('name', '=', name)],
limit=1).id for name in
stage_names}
stage_ids = [stages['Inbox'], stages['Draft']]
def get_ticket_data(stage_id):
count = request.env["ticket.helpdesk"].search_count(
[('stage_id', '=', stage_id), ('create_date', '>', week_ago)])
ids = request.env["ticket.helpdesk"].search(
[('stage_id', '=', stage_id),
('create_date', '>', week_ago)]).ids
return count, ids
new_count, new_ids = get_ticket_data(stage_ids)
in_progress_count, in_progress_ids = get_ticket_data(
stages['In Progress'])
canceled_count, canceled_ids = get_ticket_data(stages['Canceled'])
done_count, done_ids = get_ticket_data(stages['Done'])
closed_count, closed_ids = get_ticket_data(stages['Closed'])
dashboard_values = {
'new': new_count,
'in_progress': in_progress_count,
'canceled': canceled_count,
'done': done_count,
'closed': closed_count,
'new_id': new_ids,
'in_progress_id': in_progress_ids,
'canceled_id': canceled_ids,
'done_id': done_ids,
'closed_id': closed_ids,
}
return dashboard_values
@http.route(['/helpdesk_dashboard_month'], type='json', auth="public")
def helpdesk_dashboard_month(self):
"""Retrieves statistics for tickets created in the past month.
Returns:
dict: Dashboard statistics including counts and IDs for each stage."""
today = DT.date.today()
month_ago = today - DT.timedelta(days=30)
week_ago = str(month_ago) + ' '
stages = request.env['ticket.stage'].search([('name', 'in',
['Inbox', 'Draft',
'In Progress',
'Canceled', 'Done',
'Closed'])])
stage_ids = {stage.name: stage.id for stage in stages}
def get_stage_data(stage_names):
stage_ids_list = [stage_ids[name] for name in stage_names]
tickets = request.env["ticket.helpdesk"].search(
[('stage_id', 'in', stage_ids_list),
('create_date', '>', week_ago)])
return len(tickets), [ticket.id for ticket in tickets]
new_count, new_ids = get_stage_data(['Inbox', 'Draft'])
in_progress_count, in_progress_ids = get_stage_data(['In Progress'])
canceled_count, canceled_ids = get_stage_data(['Canceled'])
done_count, done_ids = get_stage_data(['Done'])
closed_count, closed_ids = get_stage_data(['Closed'])
dashboard_values = {
'new': new_count,
'in_progress': in_progress_count,
'canceled': canceled_count,
'done': done_count,
'closed': closed_count,
'new_id': new_ids,
'in_progress_id': in_progress_ids,
'canceled_id': canceled_ids,
'done_id': done_ids,
'closed_id': closed_ids,
}
return dashboard_values
@http.route(['/helpdesk_dashboard_year'], type='json', auth="public")
def helpdesk_dashboard_year(self):
"""Retrieves statistics for tickets created in the past year.
Returns:
dict: Dashboard statistics including counts and IDs for each stage.
"""
today = DT.date.today()
year_ago = today - DT.timedelta(days=360)
stages = ['Inbox', 'Draft', 'In Progress', 'Canceled', 'Done', 'Closed']
stage_ids = {
stage: request.env['ticket.stage'].search([('name', '=', stage)],
limit=1).id for stage in
stages}
def get_ticket_data(stage_name):
stage_id = stage_ids[stage_name]
tickets = request.env["ticket.helpdesk"].search(
[('stage_id', '=', stage_id), ('create_date', '>', year_ago)])
return len(tickets), [ticket.id for ticket in tickets]
dashboard_values = {}
for stage in stages:
count, ids = get_ticket_data(stage)
dashboard_values[stage.lower()] = count
dashboard_values[f'{stage.lower()}_id'] = ids
return dashboard_values