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.
 
 
 
 
 

262 lines
13 KiB

"""Legal Case Management Dashboard"""
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohammed Dilshad Tk (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/>.
#
###############################################################################
from datetime import date, timedelta
from odoo import fields, http
from odoo.http import request
class CaseDashboard(http.Controller):
"""Values for chart and dashboard when filter not applied"""
@http.route('/case/dashboard', type='json', auth='user')
def _get_case_dashboard_values(self):
"""Values for charts, graph and dashboard cards without filtering"""
moves, inv, client, inv_list, lawyers = [], [], [], [], []
data_list = [['Month', 'Income']]
stage_count = [['Stage', 'Cases']]
case_category = [['Category', 'Number']]
lawyer_object = None
draft_count, in_progress_count, invoiced_count, reject_count = 0, 0, 0, 0
won_count, lost_count, cancel_count, inv_amt = 0, 0, 0, 0
today_date = fields.Date.today()
cases = request.env['case.registration'].search([])
# getting last 1 year month range for bar chart
for num in range(0, 13):
month_sub = timedelta(days=num * 30)
current_first_date = today_date.replace(day=5)
range_date = current_first_date - month_sub
first_day = range_date.replace(day=1)
last_day = range_date.replace(day=1) + timedelta(days=32)
last_day = last_day.replace(day=1) - timedelta(days=1)
month_name = range_date.strftime("%b")
monthly_invoice = 0
for invoices in request.env['account.move'].search([]):
if invoices.case_ref:
inv_date = invoices.invoice_date
if first_day < inv_date < last_day:
monthly_invoice += invoices.amount_total
data_list.append([month_name, monthly_invoice])
# Calculate count of case in different category's
for category_id in request.env['case.category'].search([]):
case_count = request.env['case.registration'].search_count(
[('case_category_id', '=', category_id.id)])
case_category.append([category_id.name, case_count])
for case in cases:
# lawyers.append(case.lawyer_id.id)
for invoices in request.env['account.move'].search([]):
if case.name == invoices.case_ref:
# add case name, amount invoiced into list then it look
# like [Case0001, 5500.5]
inv_list.append([case.name, invoices.amount_total])
if case.state == 'draft':
draft_count += 1
if case.state == 'in_progress':
in_progress_count += 1
if case.state == 'invoiced':
invoiced_count += 1
if case.state == 'reject':
reject_count += 1
if case.state == 'won':
won_count += 1
if case.state == 'lost':
lost_count += 1
if case.state == 'cancel':
cancel_count += 1
client.append(case.client_id.id)
for total_invoices in request.env['account.move'].search(
[('case_ref', '=', case.name)]):
if total_invoices:
inv.append(total_invoices)
moves.append(total_invoices.id)
inv_amt += total_invoices.amount_total
case_dict = {}
for case, amount in inv_list:
if case in case_dict:
case_dict[case] += amount # add amount to existing case
else:
case_dict[case] = amount # add new case to dictionary
# Add all invoice amount to each case names and in to list
total_inv_lis = [[case, amount] for case, amount in case_dict.items()]
sorted_cases = sorted(total_inv_lis, key=lambda case: case[1],
reverse=True)
top_10_cases = sorted_cases[:10]
# appending count of each stages into stage_count
stage_count.append(['Draft', draft_count])
stage_count.append(['In Progress', in_progress_count])
stage_count.append(['Invoiced', invoiced_count])
stage_count.append(['Reject', reject_count])
stage_count.append(['Won', won_count])
stage_count.append(['Lost', lost_count])
stage_count.append(['Cancel', cancel_count])
evidence = request.env['legal.evidence'].search([])
trial = request.env['legal.trial'].search([])
lawyers = request.env['hr.employee'].search([]).filtered(
lambda employee: not employee.parent_id and
employee.is_lawyer is True)
# extract integer from lawyers list which contains false
lawyer_list = list(filter(lambda x: x is not False, lawyers))
#append['Case', 'Revenue']in to 0th index of list for pass to donut chart
top_10_cases.insert(0, ['Case', 'Revenue'])
user_id = request.env.uid
login_user = request.env['res.users'].search(
[('employee_id.user_id', '=', user_id)])
if login_user.has_group('legal_case_management.lawyer_access'):
if not login_user.has_group('legal_case_management.admin_access'):
lawyer_object = login_user.employee_id
else:
lawyer_object = None
return {'total_case': len(cases),
'invoices': inv,
'total_invoiced': round(inv_amt, 4),
'lawyers': len(lawyer_list),
'lawyer_ids': lawyer_list,
'evidences': len(evidence),
'trials': len(trial),
'clients': len(list(set(client))),#remove duplicates from list
'clients_in_case': client,
'case_category': case_category,
'data_list': data_list,
'stage_count': stage_count,
'invoice_list': total_inv_lis,
'top_10_cases': top_10_cases,
'user_id': user_id,
'lawyer_object': lawyer_object,
}
class AddLawyerSelectionFieldController(http.Controller):
"""Add lawyers as selection values in Dashboard"""
@http.route('/selection/field/lawyer', type='json', auth='user',
csrf=False)
def add_lawyer_selection_field(self):
"""Adding lawyers to selection of filter"""
return [{'name': lawyer.name,
'id': lawyer.id
} for lawyer in request.env['hr.employee'].search(
[('is_lawyer', '=', True), ('parent_id', '=', False)])]
def date_filter(self):
""" Month filter for dashboard """
today_date = fields.Date.today()
first_day_of_month = date(today_date.year, today_date.month, 1)
# subtract one day from the first day of the current month to get
# the last day of the previous month
last_day_of_last_month = first_day_of_month - timedelta(days=1)
six_months_ago = today_date - timedelta(days=30 * 6)
first_day_of_six_months_ago = date(six_months_ago.year,
six_months_ago.month, 1)
twelve_months_ago = today_date - timedelta(days=30 * 12)
first_day_of_twelve_months_ago = date(twelve_months_ago.year,
twelve_months_ago.month, 1)
return {
'first_day_of_last_month': date(last_day_of_last_month.year,
last_day_of_last_month.month, 1),
'last_day_of_last_month': last_day_of_last_month,
'first_day_of_six_months_ago': first_day_of_six_months_ago,
'first_day_of_twelve_months_ago': first_day_of_twelve_months_ago,
}
@http.route('/dashboard/filter', type='json', auth='user')
def fetch_dashboard_filter_value(self, **kw):
"""Lawyer wise and stage wise filter"""
trial_list, clients, case_list, evidence_list, lawyer_ids, inv_amt = [], \
[], [], [], [], 0
data = kw['data']
if data['stage'] == 'null':
stage_list = ['draft', 'in_progress', 'invoiced', 'won', 'lost',
'cancel']
else:
stage_list = [data['stage']]
if data['lawyer'] == 'admin':
lawyer_list = [lawyer.id for lawyer in
request.env['hr.employee'].search(
[('is_lawyer', '=', True),
('parent_id', '=', False)])]
else:
lawyer_list = [int(data['lawyer'])]
lawyer_list = [lawyer.id for lawyer in
request.env['hr.employee'].search(
[('id', 'in', lawyer_list)])]
if data['month_wise'] != 'null':
month_wise_list = [data['month_wise']]
filter_start_date = None
filter_end_date = self.date_filter()
filter_end_date = filter_end_date['last_day_of_last_month']
if month_wise_list[0] == 'last_month':
filter_start_date = self.date_filter()
filter_start_date = filter_start_date['first_day_of_last_month']
elif month_wise_list[0] == 'last_6_months':
filter_start_date = self.date_filter()
filter_start_date = filter_start_date[
'first_day_of_six_months_ago']
elif month_wise_list[0] == 'last_12_months':
filter_start_date = self.date_filter()
filter_start_date = filter_start_date[
'first_day_of_twelve_months_ago']
if data['lawyer'] == 'admin':
registration_ids = request.env['case.registration'].search(
[('start_date', '>=', filter_start_date),
('start_date', '<=', filter_end_date),
('state', 'in', stage_list)])
else:
lawyer_list = data['lawyer']
registration_ids = request.env['case.registration'].search(
[('start_date', '>=', filter_start_date),
('start_date', '<=', filter_end_date),
('state', 'in', stage_list),
('lawyer_id.id', 'in', [lawyer_list])])
lawyer_list = [lawyer.id for lawyer in
request.env['hr.employee'].search(
[('id', '=', lawyer_list)])]
else:
if data['lawyer'] == 'admin':
registration_ids = request.env['case.registration'].search(
[('state', 'in', stage_list)])
lawyer_list = [lawyer.id for lawyer in
request.env['hr.employee'].search(
[('is_lawyer', '=', True),
('parent_id', '=', False)])]
else:
registration_ids = request.env['case.registration'].search(
[('state', 'in', stage_list),
('lawyer_id.id', 'in', lawyer_list)])
for registration_id in registration_ids:
lawyer_ids.append(registration_id.lawyer_id.id)
case_list.append(registration_id.id)
clients.append(request.env['res.partner'].browse(
registration_id.client_id.id).id)
inv_amt += sum(request.env['account.move'].search(
[('case_ref', '=', registration_id.name)]).mapped(
'amount_total'))
trial_list = [trial.id for trial in request.env['legal.trial'].search(
[('case_id.id', 'in', case_list),
('case_id.lawyer_id.id', 'in', lawyer_list)])]
evidence_list = [evidence.id for evidence in
request.env['legal.evidence'].search(
[('case_id.id', 'in', case_list)])]
return {'total_case': case_list,
'total_invoiced': round(inv_amt, 4),
'lawyers': lawyer_ids,
'evidences': evidence_list,
'trials': trial_list,
'clients': clients }