nhance_partner_be/app/Controllers/DashboardController.php
2025-09-08 14:46:27 +05:30

127 lines
4.8 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 agentDashboard()
{
$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')
->countAllResults();
$policiesMonth = $this->db->table('partner_policy')
->where('MONTH(created_on)', $month)
->where('YEAR(created_on)', $year)
->countAllResults();
$policiesYear = $this->db->table('partner_policy')
->where('YEAR(created_on)', $year)
->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')
->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)
->get()->getRow()->total ?? 0);
$premiumYear = (float) ($this->db->table('partner_policy')
->selectSum('premium_amount', 'total')
->where('YEAR(created_on)', $year)
->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 (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')
->where('pp.created_on >=', $last30)
->groupBy('pa.id')
->orderBy('policies_issued', 'DESC')
->limit(5)
->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(pa.is_active=1,"Active","Inactive") AS status')
->join('partner_policy pp', 'pp.agent_id = pa.id AND ', 'left')
->groupBy('pa.id')
->orderBy('policies_issued', 'ASC')
->limit(5)
->get()
->getResultArray();
// --- 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();
// --- 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([
'policies_issued' => [
'today' => $policiesToday,
'month' => $policiesMonth,
'year' => $policiesYear,
],
'premium_value' => [
'today' => $premiumToday,
'month' => $premiumMonth,
'year' => $premiumYear,
],
'earnings' => [
'today' => $earningsToday,
'month' => $earningsMonth,
'year' => $earningsYear,
],
'performance_agents' => $performanceAgents,
'non_performing_agents'=> $nonPerformingAgents,
'quotations_pending' => $quotationsPending,
'policies_pending' => $policiesPending,
]);
}
}