diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 77dc786..0c2ff20 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -96,6 +96,8 @@ $routes->group('api', ['filter' => 'appSignature'], function ($routes) { $routes->post('endorsement/createEndorsement', 'EndorsementController::createEndorsement'); //dashboard + $routes->get('dashboard/managerDashboard', 'DashboardController::managerDashboard'); + $routes->get('dashboard/staffDashboard', 'DashboardController::staffDashboard'); $routes->get('dashboard/agentDashboard', 'DashboardController::agentDashboard'); }); diff --git a/app/Controllers/DashboardController.php b/app/Controllers/DashboardController.php index 291cdfa..56afa1d 100644 --- a/app/Controllers/DashboardController.php +++ b/app/Controllers/DashboardController.php @@ -13,8 +13,10 @@ class DashboardController extends ResourceController $this->db = \Config\Database::connect(); } - public function agentDashboard() + public function managerDashboard() { + + $manager_id = $this->request->getGet('manager_id'); $today = date('Y-m-d'); $month = date('m'); $year = date('Y'); @@ -23,15 +25,18 @@ class DashboardController extends ResourceController $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 --- @@ -39,17 +44,20 @@ class DashboardController extends ResourceController ->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) --- @@ -59,54 +67,41 @@ class DashboardController extends ResourceController $last30 = date('Y-m-d H:i:s', strtotime('-30 days')); - // --- Performance Agents (top 5, last 30 days) --- - $performanceAgents = $this->db->table('partner_policy pp') - ->select('pa.id AS agent_id, pa.name AS agent_name, COUNT(pp.id) AS policies_issued, COALESCE(SUM(pp.premium_amount),0) AS premium_value') - ->join('partner_agent pa', 'pa.id = pp.agent_id', 'inner') + // --- 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) - ->groupBy('pa.id') - ->orderBy('policies_issued', 'DESC') - ->limit(5) + ->where('pa.manager_id',$manager_id) ->get() ->getResultArray(); - + - // --- Non-Performing Agents (bottom 5, last 30 days) --- - $nonPerformingAgents = $this->db->table('partner_agent pa') - ->select('pa.id AS agent_id, pa.name AS agent_name, COUNT(pp.id) AS policies_issued, IF(COUNT(pp.id)>0,"Active","Inactive") AS status') - ->join('partner_policy pp', 'pp.agent_id = pa.id', 'left') - ->where('pp.created_on >=', $last30) - ->groupBy('pa.id') - ->orderBy('policies_issued', 'ASC') - ->limit(5) - ->get() - ->getResultArray(); + - dd($nonPerformingAgents); - - // --- Quotations Pending --- - $quotationsPending = $this->db->table('partner_quotation pq') - ->select('ps.name as staff_name, COUNT(pq.id) as quotation_issued, COALESCE(SUM(pq.premium_amount),0) as premium_value') - ->join('partner_enquiry pe', 'pe.id = pq.enquiry_id') - ->join('partner_staff ps', 'ps.id = pe.assigned_to') - ->where('pq.status', 'Pending') - ->groupBy('ps.id') - ->limit(10) - ->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 Quotation'", 'left') + ->where('ps.role_id', 2) + ->where('ps.manager_id',$manager_id) + ->groupBy('ps.id, ps.name') + ->get()->getResultArray(); - dd($quotationsPending); - // --- Policies Pending --- - $policiesPending = $this->db->table('partner_enquiry pe') - ->select('ps.name as staff_name, COUNT(pp.id) as policies_issued, COALESCE(SUM(pp.premium_amount),0) as premium_value') - ->join('partner_staff ps', 'ps.id = pe.assigned_to') - ->join('partner_policy pp', 'pp.enquiry_id = pe.id', 'left') - // ->where('pp.id', null) // correct way in CI4 for IS NULL - ->groupBy('ps.id') - ->limit(15) - ->get()->getResultArray(); - return $this->respond([ + // --- 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 = 'Quotation 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(); + + + $result = [ 'policies_issued' => [ 'today' => $policiesToday, 'month' => $policiesMonth, @@ -122,11 +117,148 @@ class DashboardController extends ResourceController 'month' => $earningsMonth, 'year' => $earningsYear, ], - 'performance_agents' => $performanceAgents, - 'non_performing_agents'=> $nonPerformingAgents, + 'agents_performance' => $performanceAgents, 'quotations_pending' => $quotationsPending, 'policies_pending' => $policiesPending, - ]); + ]; + + return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result], 200); + } + + public function staffDashboard() + { + + $staff_id = $this->request->getGet('staff_id'); + + + // --- Quotation pending for staff (last 30 days) --- + $quotationsPending = $this->db->table('partner_enquiry pe') + ->select('pe.* , I.name as insurer_name, I.short_name as insurer_short_name') + ->join('insurers I', 'I.id = pe.insurer_id', 'left') + ->where('pe.assigned_to',$staff_id) + ->where('pe.status','Awaiting Quotation') + ->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('insurers I', 'I.id = pe.insurer_id', 'left') + ->where('pe.assigned_to',$staff_id) + ->where('pe.status','Quotation Accepted') + ->orderBy('pe.created_on', 'DESC') + ->get() + ->getResultArray(); + + $result = [ + 'quotations_pending' => $quotationsPending, + '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')); + + // --- Quotation pending for agent (last 30 days) --- + $quotationsPending = $this->db->table('partner_enquiry pe') + ->select('pe.* , I.name as insurer_name , I.short_name as insurer_short_name') + ->join('insurers I', 'I.id = pe.insurer_id', 'left') + ->where('pe.created_on >=', $last30) + ->where('pe.agent_id',$agent_id) + ->where('pe.status','Awaiting Quotation') + ->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('insurers I', 'I.id = pe.insurer_id', 'left') + ->where('pe.created_on >=', $last30) + ->where('pe.agent_id',$agent_id) + ->where('pe.status','Quotation 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, + 'policies_pending' => $policiesPending, + ]; + + + + return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result], 200); } }