437 lines
21 KiB
PHP
437 lines
21 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
|
|
use CodeIgniter\RESTful\ResourceController;
|
|
|
|
class DashboardController extends ResourceController
|
|
{
|
|
protected $db;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->db = \Config\Database::connect();
|
|
}
|
|
|
|
public function managerDashboard()
|
|
{
|
|
|
|
$manager_id = $this->request->getGet('manager_id');
|
|
$today = date('Y-m-d');
|
|
$month = date('m');
|
|
$year = date('Y');
|
|
|
|
// --- Policies Issued ---
|
|
$policiesToday = $this->db->table('partner_policy')
|
|
->where('created_on >=', $today.' 00:00:00')
|
|
->where('created_on <=', $today.' 23:59:59')
|
|
->where('manager_id',$manager_id)
|
|
->countAllResults();
|
|
|
|
$policiesMonth = $this->db->table('partner_policy')
|
|
->where('MONTH(created_on)', $month)
|
|
->where('YEAR(created_on)', $year)
|
|
->where('manager_id',$manager_id)
|
|
->countAllResults();
|
|
|
|
$policiesYear = $this->db->table('partner_policy')
|
|
->where('YEAR(created_on)', $year)
|
|
->where('manager_id',$manager_id)
|
|
->countAllResults();
|
|
|
|
// --- Premium Value ---
|
|
$premiumToday = (float) ($this->db->table('partner_policy')
|
|
->selectSum('premium_amount', 'total')
|
|
->where('created_on >=', $today.' 00:00:00')
|
|
->where('created_on <=', $today.' 23:59:59')
|
|
->where('manager_id',$manager_id)
|
|
->get()->getRow()->total ?? 0);
|
|
|
|
$premiumMonth = (float) ($this->db->table('partner_policy')
|
|
->selectSum('premium_amount', 'total')
|
|
->where('MONTH(created_on)', $month)
|
|
->where('YEAR(created_on)', $year)
|
|
->where('manager_id',$manager_id)
|
|
->get()->getRow()->total ?? 0);
|
|
|
|
$premiumYear = (float) ($this->db->table('partner_policy')
|
|
->selectSum('premium_amount', 'total')
|
|
->where('YEAR(created_on)', $year)
|
|
->where('manager_id',$manager_id)
|
|
->get()->getRow()->total ?? 0);
|
|
|
|
// --- Earnings (same as premium for now) ---
|
|
$earningsToday = $premiumToday;
|
|
$earningsMonth = $premiumMonth;
|
|
$earningsYear = $premiumYear;
|
|
|
|
$last30 = date('Y-m-d H:i:s', strtotime('-30 days'));
|
|
|
|
// --- Performance Agents (last 30 days) ---
|
|
$performanceAgents = $this->db->table('partner_agent pa')
|
|
->select('pa.id AS agent_id, pa.name AS agent_name, COUNT(pp.id) AS total_policy_issued, COALESCE(SUM(pp.premium_amount),0) AS total_premium_value, IF(COUNT(pp.id)>0,"Active","Inactive") AS status')
|
|
->join('partner_policy pp', 'pp.agent_id = pa.id', 'inner')
|
|
->where('pp.created_on >=', $last30)
|
|
->where('pa.manager_id',$manager_id)
|
|
->get()
|
|
->getResultArray();
|
|
|
|
if(count($performanceAgents) == 1 && $performanceAgents[0]['agent_name'] == null){
|
|
$performanceAgents = [];
|
|
}
|
|
|
|
// --- Un assigned enquiry ---
|
|
$unassignedEnquiry = $this->db->table('partner_enquiry pe')
|
|
->select('pe.* , pe.name as insured_name , pa.name as agent_name')
|
|
->join('partner_agent pa', 'pa.id = pe.agent_id', 'left')
|
|
->where('pe.assigned_to', 0)
|
|
->where('pe.manager_id', $manager_id)
|
|
->get()
|
|
->getResultArray();
|
|
|
|
|
|
|
|
// // --- Staff level Quotations Pending ---
|
|
// $quotationsPending = $this->db->table('partner_staff ps')
|
|
// ->select('ps.name as staff_name, COUNT(pe.id) as total_quotation_pending')
|
|
// ->join('partner_enquiry pe', "pe.assigned_to = ps.id AND pe.status = 'Awaiting Proposal'", 'left')
|
|
// ->where('ps.role_id', 2)
|
|
// ->where('ps.manager_id',$manager_id)
|
|
// ->groupBy('ps.id, ps.name')
|
|
// ->get()->getResultArray();
|
|
|
|
// // --- Staff level Quotations Approva Pending ---
|
|
// $quotationsApprovalPending = $this->db->table('partner_staff ps')
|
|
// ->select('ps.name as staff_name, COUNT(pe.id) as total_approval_pending')
|
|
// ->join('partner_enquiry pe', "pe.assigned_to = ps.id AND pe.status = 'Proposal Created'", 'left')
|
|
// ->where('ps.role_id', 2)
|
|
// ->where('ps.manager_id',$manager_id)
|
|
// ->groupBy('ps.id, ps.name')
|
|
// ->get()->getResultArray();
|
|
|
|
|
|
|
|
// // --- Staff level Policies Pending ---
|
|
// $policiesPending = $this->db->table('partner_staff ps')
|
|
// ->select('ps.name as staff_name, COUNT(pe.id) as total_policis_pending, SUM(pq.premium_amount) as total_premium_value')
|
|
// ->join('partner_enquiry pe', "pe.assigned_to = ps.id AND pe.status = 'Proposal Accepted'", 'left')
|
|
// ->join('partner_quotation pq', "pq.enquiry_id = pe.id AND pq.status = 'Accepted'", 'left')
|
|
// ->where('ps.role_id', 2)
|
|
// ->where('ps.manager_id',$manager_id)
|
|
// ->groupBy('ps.id, ps.name')
|
|
// ->get()->getResultArray();
|
|
|
|
|
|
$staffLevelPendingSummary = $this->db->table('partner_enquiry pe')
|
|
->select("
|
|
ps.name AS staff_name,
|
|
ps.id AS staff_id,
|
|
ps.handler_id,
|
|
COUNT(pe.id) AS total_assigned,
|
|
SUM(CASE
|
|
WHEN pe.enquiry_status = 'Assigned'
|
|
AND DATE(pe.created_on) = CURDATE()
|
|
THEN 1
|
|
ELSE 0
|
|
END
|
|
) AS today_assigned,
|
|
SUM(CASE WHEN pe.enquiry_status = 'Assigned' AND DATE(pe.created_on) = CURDATE() THEN 1 ELSE 0 END) AS pending_assigned,
|
|
SUM(CASE WHEN pe.enquiry_status = 'In progress' AND DATE(pe.created_on) = CURDATE() THEN 1 ELSE 0 END) AS total_in_progress,
|
|
SUM(CASE WHEN pe.enquiry_status = 'Completed' AND DATE(pe.created_on) = CURDATE() THEN 1 ELSE 0 END) AS total_completed
|
|
")
|
|
->join('partner_staff ps', 'ps.id = pe.assigned_to', 'left')
|
|
->where('pe.manager_id', $manager_id)
|
|
->where('pe.is_active', 1)
|
|
->where('pe.assigned_to IS NOT NULL')
|
|
->where('pe.assigned_to !=', 0)
|
|
->groupBy('pe.assigned_to')
|
|
->orderBy('ps.name', 'ASC')
|
|
->get()
|
|
->getResultArray();
|
|
|
|
foreach ($staffLevelPendingSummary as &$row) {
|
|
|
|
$handlerIds = json_decode($row['handler_id'] ?? '[]', true);
|
|
|
|
if (!empty($handlerIds)) {
|
|
$handlers = $this->db->table('partner_staff')
|
|
->select('name')
|
|
->whereIn('id', $handlerIds)
|
|
->get()
|
|
->getResultArray();
|
|
|
|
$row['handlers'] = array_column($handlers, 'name');
|
|
|
|
} else {
|
|
$row['handlers'] = [];
|
|
}
|
|
}
|
|
|
|
|
|
$result = [
|
|
'policies_issued' => [
|
|
'today' => $policiesToday,
|
|
'month' => $policiesMonth,
|
|
'year' => $policiesYear,
|
|
],
|
|
'premium_value' => [
|
|
'today' => $premiumToday,
|
|
'month' => $premiumMonth,
|
|
'year' => $premiumYear,
|
|
],
|
|
'earnings' => [
|
|
'today' => $earningsToday,
|
|
'month' => $earningsMonth,
|
|
'year' => $earningsYear,
|
|
],
|
|
'agents_performance' => $performanceAgents,
|
|
'unassigned_enquiry' => $unassignedEnquiry,
|
|
// 'quotations_pending' => $quotationsPending,
|
|
// 'quotations_approval_pending' => $quotationsApprovalPending,
|
|
// 'policies_pending' => $policiesPending,
|
|
'staff_level_pending_summary' => $staffLevelPendingSummary
|
|
];
|
|
|
|
return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result], 200);
|
|
}
|
|
|
|
public function handlerDashboard()
|
|
{
|
|
$handler_id = $this->request->getGet('handler_id');
|
|
$manager_id = $this->request->getGet('manager_id');
|
|
|
|
if (empty($handler_id)) {
|
|
return $this->response->setJSON([
|
|
'status' => false,
|
|
'message' => 'Handler ID is required.'
|
|
]);
|
|
}
|
|
|
|
$staffLevelPendingSummary = $this->db->table('partner_enquiry pe')
|
|
->select("
|
|
ps.name AS staff_name,
|
|
ps.id AS staff_id,
|
|
COUNT(pe.id) AS total_assigned,
|
|
SUM(CASE
|
|
WHEN pe.enquiry_status = 'Assigned'
|
|
AND DATE(pe.created_on) = CURDATE()
|
|
THEN 1
|
|
ELSE 0
|
|
END
|
|
) AS today_assigned,
|
|
SUM(CASE WHEN pe.enquiry_status = 'Assigned' AND DATE(pe.created_on) = CURDATE() THEN 1 ELSE 0 END) AS total_assigned,
|
|
SUM(CASE WHEN pe.enquiry_status = 'In progress' AND DATE(pe.created_on) = CURDATE() THEN 1 ELSE 0 END) AS total_in_progress,
|
|
SUM(CASE WHEN pe.enquiry_status = 'Completed' AND DATE(pe.created_on) = CURDATE() THEN 1 ELSE 0 END) AS total_completed
|
|
")
|
|
->join('partner_staff ps', 'ps.id = pe.assigned_to', 'left')
|
|
|
|
->groupStart()
|
|
->where("JSON_CONTAINS(ps.handler_id, '\"$handler_id\"')")
|
|
->orWhere('ps.id', $handler_id)
|
|
->groupEnd()
|
|
|
|
// ->where('ps.handler_id', $handler_id)
|
|
->where('pe.is_active', 1)
|
|
->where('pe.assigned_to IS NOT NULL')
|
|
->where('pe.assigned_to !=', 0)
|
|
->groupBy('pe.assigned_to')
|
|
->orderBy('ps.name', 'ASC')
|
|
->get()
|
|
->getResultArray();
|
|
|
|
|
|
$last30 = date('Y-m-d H:i:s', strtotime('-30 days'));
|
|
// --- Performance Agents (last 30 days) ---
|
|
$performanceAgents = $this->db->table('partner_agent pa')
|
|
->select('pa.id AS agent_id, pa.name AS agent_name, COUNT(pp.id) AS total_policy_issued, COALESCE(SUM(pp.premium_amount),0) AS total_premium_value, IF(COUNT(pp.id)>0,"Active","Inactive") AS status')
|
|
->join('partner_policy pp', 'pp.agent_id = pa.id', 'inner')
|
|
->where('pp.created_on >=', $last30)
|
|
->where('pa.manager_id',$manager_id)
|
|
->get()
|
|
->getResultArray();
|
|
|
|
if(count($performanceAgents) == 1 && $performanceAgents[0]['agent_name'] == null)
|
|
{
|
|
$performanceAgents = [];
|
|
}
|
|
|
|
// --- Un assigned enquiry ---
|
|
$unassignedEnquiry = $this->db->table('partner_enquiry pe')
|
|
->select('pe.* , pe.name as insured_name , pa.name as agent_name')
|
|
->join('partner_agent pa', 'pa.id = pe.agent_id', 'left')
|
|
->where('pe.assigned_to', 0)
|
|
->where('pe.manager_id', $manager_id)
|
|
->get()
|
|
->getResultArray();
|
|
|
|
$result = [
|
|
'staff_level_pending_summary' => $staffLevelPendingSummary,
|
|
'agents_performance' => $performanceAgents,
|
|
'unassigned_enquiry' => $unassignedEnquiry,
|
|
];
|
|
|
|
return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result], 200);
|
|
}
|
|
|
|
|
|
public function staffDashboard()
|
|
{
|
|
|
|
$staff_id = $this->request->getGet('staff_id');
|
|
|
|
|
|
// --- Proposal pending for staff (last 30 days) ---
|
|
$quotationsPending = $this->db->table('partner_enquiry pe')
|
|
->select('pe.* ')
|
|
->where('pe.assigned_to',$staff_id)
|
|
->whereIn('pe.status',["Awaiting Proposal","Proposal Rejected"])
|
|
->orderBy('pe.created_on', 'DESC')
|
|
->get()
|
|
->getResultArray();
|
|
|
|
|
|
// --- Proposal Approval pending for staff (last 30 days) ---
|
|
$quotationsApprovalPending = $this->db->table('partner_enquiry pe')
|
|
->select('pe.* ')
|
|
->where('pe.assigned_to',$staff_id)
|
|
->whereIn('pe.status',["Proposal Created"])
|
|
->orderBy('pe.created_on', 'DESC')
|
|
->get()
|
|
->getResultArray();
|
|
|
|
// --- Policy pending for staff (last 30 days) ---
|
|
$policiesPending = $this->db->table('partner_enquiry pe')
|
|
->select('pe.* , I.name as insurer_name, I.short_name as insurer_short_name')
|
|
->join('partner_quotation Q', 'Q.enquiry_id = pe.id AND Q.status = "Accepted"', 'left')
|
|
->join('insurers I', 'I.id = Q.insurer_id', 'left')
|
|
->where('pe.assigned_to',$staff_id)
|
|
->whereIn('pe.status',["Proposal Accepted"])
|
|
->orderBy('pe.created_on', 'DESC')
|
|
->get()
|
|
->getResultArray();
|
|
|
|
$result = [
|
|
'quotations_pending' => $quotationsPending,
|
|
'quotations_approval_pending' => $quotationsApprovalPending,
|
|
'quotations_rejected' => $quotationsApprovalPending,
|
|
'policies_pending' => $policiesPending,
|
|
];
|
|
|
|
|
|
return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result], 200);
|
|
}
|
|
|
|
public function agentDashboard()
|
|
{
|
|
|
|
$agent_id = $this->request->getGet('agent_id');
|
|
$today = date('Y-m-d');
|
|
$month = date('m');
|
|
$year = date('Y');
|
|
|
|
// --- Policies Issued ---
|
|
$policiesToday = $this->db->table('partner_policy')
|
|
->where('created_on >=', $today.' 00:00:00')
|
|
->where('created_on <=', $today.' 23:59:59')
|
|
->where('agent_id',$agent_id)
|
|
->countAllResults();
|
|
|
|
$policiesMonth = $this->db->table('partner_policy')
|
|
->where('MONTH(created_on)', $month)
|
|
->where('YEAR(created_on)', $year)
|
|
->where('agent_id',$agent_id)
|
|
->countAllResults();
|
|
|
|
$policiesYear = $this->db->table('partner_policy')
|
|
->where('YEAR(created_on)', $year)
|
|
->where('agent_id',$agent_id)
|
|
->countAllResults();
|
|
|
|
// --- Premium Value ---
|
|
$premiumToday = (float) ($this->db->table('partner_policy')
|
|
->selectSum('premium_amount', 'total')
|
|
->where('created_on >=', $today.' 00:00:00')
|
|
->where('created_on <=', $today.' 23:59:59')
|
|
->where('agent_id',$agent_id)
|
|
->get()->getRow()->total ?? 0);
|
|
|
|
$premiumMonth = (float) ($this->db->table('partner_policy')
|
|
->selectSum('premium_amount', 'total')
|
|
->where('MONTH(created_on)', $month)
|
|
->where('YEAR(created_on)', $year)
|
|
->where('agent_id',$agent_id)
|
|
->get()->getRow()->total ?? 0);
|
|
|
|
$premiumYear = (float) ($this->db->table('partner_policy')
|
|
->selectSum('premium_amount', 'total')
|
|
->where('YEAR(created_on)', $year)
|
|
->where('agent_id',$agent_id)
|
|
->get()->getRow()->total ?? 0);
|
|
|
|
// --- Earnings (same as premium for now) ---
|
|
$earningsToday = $premiumToday;
|
|
$earningsMonth = $premiumMonth;
|
|
$earningsYear = $premiumYear;
|
|
|
|
$last30 = date('Y-m-d H:i:s', strtotime('-30 days'));
|
|
|
|
// --- Proposal pending for agent (last 30 days) ---
|
|
$quotationsPending = $this->db->table('partner_enquiry pe')
|
|
->select('pe.* ')
|
|
->where('pe.created_on >=', $last30)
|
|
->where('pe.agent_id',$agent_id)
|
|
->whereIn('pe.status',["Awaiting Proposal","Proposal Rejected"])
|
|
->orderBy('pe.created_on', 'DESC')
|
|
->get()
|
|
->getResultArray();
|
|
|
|
// --- Proposal approval pending for agent (last 30 days) ---
|
|
$quotationsApprovalPending = $this->db->table('partner_enquiry pe')
|
|
->select('pe.* ')
|
|
->where('pe.created_on >=', $last30)
|
|
->where('pe.agent_id',$agent_id)
|
|
->whereIn('pe.status',["Awaiting Created"])
|
|
->orderBy('pe.created_on', 'DESC')
|
|
->get()
|
|
->getResultArray();
|
|
|
|
// --- Policy pending for agent (last 30 days) ---
|
|
$policiesPending = $this->db->table('partner_enquiry pe')
|
|
->select('pe.* , I.name as insurer_name , I.short_name as insurer_short_name')
|
|
->join('partner_quotation Q', 'Q.enquiry_id = pe.id AND Q.status = "Accepted"', 'left')
|
|
->join('insurers I', 'I.id = Q.insurer_id', 'left')
|
|
->where('pe.created_on >=', $last30)
|
|
->where('pe.agent_id',$agent_id)
|
|
->where('pe.status','Proposal Accepted')
|
|
->orderBy('pe.created_on', 'DESC')
|
|
->get()
|
|
->getResultArray();
|
|
|
|
$result = [
|
|
'policies_issued' => [
|
|
'today' => $policiesToday,
|
|
'month' => $policiesMonth,
|
|
'year' => $policiesYear,
|
|
],
|
|
'premium_value' => [
|
|
'today' => $premiumToday,
|
|
'month' => $premiumMonth,
|
|
'year' => $premiumYear,
|
|
],
|
|
'earnings' => [
|
|
'today' => $earningsToday,
|
|
'month' => $earningsMonth,
|
|
'year' => $earningsYear,
|
|
],
|
|
'quotations_pending' => $quotationsPending,
|
|
'quotations_approval_pending' => $quotationsApprovalPending,
|
|
'policies_pending' => $policiesPending,
|
|
];
|
|
|
|
|
|
|
|
return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result], 200);
|
|
}
|
|
|
|
}
|