From e689db5d48d89408ec95820982c7c9208ff3df88 Mon Sep 17 00:00:00 2001 From: "sanjeev.p" Date: Mon, 29 Dec 2025 17:25:43 +0530 Subject: [PATCH] FIX_Dashboard and ExportExcel --- app/Controllers/DashboardController.php | 66 +++++++---- app/Controllers/ExcelExportController.php | 136 +++++++++++++++++++--- 2 files changed, 164 insertions(+), 38 deletions(-) diff --git a/app/Controllers/DashboardController.php b/app/Controllers/DashboardController.php index e4febdd..ab45a73 100644 --- a/app/Controllers/DashboardController.php +++ b/app/Controllers/DashboardController.php @@ -515,7 +515,7 @@ class DashboardController extends ResourceController $details['monthlyPolicyCount'] = $data1; $details['noPolicyTimeRange'] = $this->agentNoPolicyTimeRange($manager_id,$raw); - $data2 = $this->agentBelow50tPremiumTimeRange($manager_id,$raw); + $data2 = $this->getLowPremiumAgentData($manager_id,$raw); if (!empty($data2)) { $lastIndex2 = count(reset($data2)) - 1; @@ -890,10 +890,8 @@ class DashboardController extends ResourceController // } //Step 3 no buiness - public function agentNoPolicyTimeRange($manager_id, $raw){ + public function agentNoPolicyTimeRange($managerId, $raw){ - - $interval = "DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 10 DAY)"; // $builder = $this->db->table('partner_agent pa'); // $builder->select(' // pa.id AS agent_id, @@ -915,37 +913,54 @@ class DashboardController extends ResourceController // $builder->where('pp.id', null); // $builder->orderBy('pa.name'); + // 1. Select the required columns $builder = $this->db->table('partner_agent pa'); $builder->select(' pa.id AS agent_id, + pa.agent_code, pa.name AS agent_name, pa.email, pa.mobile, - pa.agent_code, - pa.is_active - '); + pa.is_active, + MAX(hist.issued_date) AS last_issued_date + '); - $builder->join( - 'partner_policy pp', - "pa.id = pp.agent_id AND pp.issued_date >= $interval", - 'left', - false // IMPORTANT → allows raw SQL - ); + // 2. INNER JOIN ensures they have at least one policy in history (skips new/empty agents) + $builder->join('partner_policy hist', 'pa.id = hist.agent_id', 'inner'); - $builder->where('pa.manager_id',$manager_id); + // 3. LEFT JOIN checks for policies in the last 10 days + $builder->join('partner_policy recent', + "pa.id = recent.agent_id AND recent.issued_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 10 DAY)", + 'left' + ); - $builder->where('pp.id IS NULL'); - $builder->orderBy('pa.name'); - if ($raw === true) { - return $builder->getCompiledSelect(); - } - $result = $builder->get()->getResultArray(); - return $result; + // 4. Filters + $builder->where('pa.manager_id', $managerId); + $builder->where('pa.is_active', 1); + $builder->where('recent.id', NULL); // Keeps only those with NO activity in the 10-day window + + // 5. Grouping and Ordering + $builder->groupBy('pa.id'); + $builder->orderBy('pa.name', 'ASC'); + + // 6. Get Raw Query + if ($raw === true) { + return $builder->getCompiledSelect(); + } + // 7. Execute + $query = $builder->get(); + $result = $query->getResult(); + + // 8. To verify the exact SQL for debugging: + // echo (string) $db->getLastQuery(); + // echo $this->db->getLastQuery()->getQuery();die; + return $result; } //Step 4 - public function agentBelow50tPremiumTimeRange($manager_id, $raw){ + //any changed in this query also change in do the same in ExcelExportController - getLowPremiumAgentData + public function getLowPremiumAgentData($manager_id, $raw){ $builder = $this->db->table('partner_policy pp'); @@ -958,6 +973,7 @@ class DashboardController extends ResourceController ELSE 'Inactive Agent' END AS agent_status, MAX(pp.issued_date) AS last_business_date, + CONCAT('₹ ', FORMAT(SUM(pp.premium_amount), 2, 'en_IN')) AS display_premium, SUM(pp.premium_amount) AS total_premium_amount "); @@ -968,9 +984,9 @@ class DashboardController extends ResourceController $builder->having('total_premium_amount <', 50000); // RAW condition must be inside where() with FALSE - $builder->where(" - pp.issued_date >= DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 10 DAY) - ", null, false); + // $builder->where(" + // pp.issued_date >= DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 10 DAY) + // ", null, false); // groupBy must be array of separate fields $builder->groupBy([ diff --git a/app/Controllers/ExcelExportController.php b/app/Controllers/ExcelExportController.php index e5b85f9..f447f1e 100644 --- a/app/Controllers/ExcelExportController.php +++ b/app/Controllers/ExcelExportController.php @@ -1735,22 +1735,55 @@ class ExcelExportController extends ResourceController $data = []; try { - $builder = $this->db->table('partner_agent pa'); - $builder->select('pa.agent_code,pa.name AS agent_name, pa.email, pa.mobile'); + + // 1. Select the required columns + $builder = $this->db->table('partner_agent pa'); + $builder->select(' + pa.id AS agent_id, + pa.agent_code, + pa.name AS agent_name, + pa.email, + pa.mobile, + pa.is_active, + MAX(hist.issued_date) AS last_issued_date + '); - $builder->join( - 'partner_policy pp', - 'pa.id = pp.agent_id AND pp.issued_date >= DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 10 DAY)', - 'left' - ); - $builder->where('pa.manager_id', $managerId); - $builder->where('pp.id IS NULL', null, false); + // 2. INNER JOIN ensures they have at least one policy in history (skips new/empty agents) + $builder->join('partner_policy hist', 'pa.id = hist.agent_id', 'inner'); - $builder->orderBy('pa.name', 'ASC'); + // 3. LEFT JOIN checks for policies in the last 10 days + $builder->join('partner_policy recent', + "pa.id = recent.agent_id AND recent.issued_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 10 DAY)", + 'left' + ); - $results = $builder->get()->getResultArray(); + // 4. Filters + $builder->where('pa.manager_id', $managerId); + $builder->where('pa.is_active', 1); + $builder->where('recent.id', NULL); // Keeps only those with NO activity in the 10-day window + + // 5. Grouping and Ordering + $builder->groupBy('pa.id'); + $builder->orderBy('pa.name', 'ASC'); + + // 6. Execute + $query = $builder->get(); + $results = $query->getResultArray(); + + // 7. To verify the exact SQL for debugging: + // echo (string) $db->getLastQuery(); + // echo $this->db->getLastQuery()->getQuery();die; + + + + foreach ($results as $row) { + // Now you can use unset because $row is an array + unset($row['agent_id']); + unset($row['is_active']); + // If you want to show last_issued_date in the Excel, don't unset it here. + // If you want to skip it, keep the unset. + unset($row['last_issued_date']); - foreach ($results as $row) { $data[] = array_values($row); } @@ -1810,7 +1843,7 @@ class ExcelExportController extends ResourceController // WHERE conditions $builder->where('pp.manager_id', $managerId); // $builder->where('pa.id', $agentId); - $builder->where('pp.premium_amount <', 50000); + $builder->having('total_premium_amount <', 50000); $builder->orderBy('pp.issued_date', 'DESC'); $results = $builder->get()->getResultArray(); @@ -1829,6 +1862,83 @@ class ExcelExportController extends ResourceController return $data; } + //any changed in this query also change in do the same in DashboardController - getLowPremiumAgentData + private function getLowPremiumAgentData_new($managerId): array + { + // --- Correction 1: Initialize Database Connection --- + + $data = []; + + try { + // 1. First, get the IDs of agents who meet the < 50,000 criteria + $subQuery = $this->db->table('partner_policy') + ->select('agent_id') + ->where('manager_id', $managerId) + ->groupBy('agent_id') + ->having('SUM(premium_amount) <', 50000) + ->get() + ->getResultArray(); + + $agentIds = array_column($subQuery, 'agent_id'); + + // 2. If no agents found, return empty to avoid SQL errors + if (empty($agentIds)) { + return []; + } + + // 3. Now build the detailed Export Query + $builder = $this->db->table('partner_policy pp'); + + $builder->select(" + DATE_FORMAT(pe.created_on, '%d-%m-%Y %h:%i %p') AS received_date, + S.name as assigned_to_name, + I.name as insurer_name, + I.short_name as insurer_short_name, + pe.name as insured_name, + pe.reg_no, + pm.value as payment_mode_value, + ipti.insurance_plan_type, + pa.name AS agent_name, + pa.agent_code, + CASE + WHEN pa.is_active = 1 THEN 'Active Partner' + ELSE 'Inactive Partner' + END AS agent_status, + CONCAT('\t', pp.policy_number) AS policy_number, + DATE_FORMAT(pp.issued_date, '%d-%m-%Y') AS issued_date, + pp.premium_amount + "); + + $builder->join('partner_agent pa', 'pa.id = pp.agent_id', 'inner'); + $builder->join('partner_enquiry pe', 'pe.id = pp.enquiry_id', 'left'); + $builder->join('partner_quotation Q', 'Q.enquiry_id = pe.id', 'left'); + $builder->join('partner_payment_mode_master pm', 'pm.id = Q.payment_mode_id', 'left'); + $builder->join('partner_insurance_plan_type_master ipti', 'ipti.id = Q.insurance_plan_type_id', 'left'); + $builder->join('insurers I', 'I.id = Q.insurer_id', 'left'); + $builder->join('partner_staff S', 'S.id = pe.assigned_to', 'left'); + + // WHERE conditions + $builder->where('pp.manager_id', $managerId); + $builder->whereIn('pp.agent_id', $agentIds); // Filter by the IDs we found above + + $builder->orderBy('pp.issued_date', 'DESC'); + + $results = $builder->get()->getResultArray(); + // return $results; + // Restructure data for PhpSpreadsheet (2D array of values) + foreach ($results as $row) { + $data[] = array_values($row); + } + + } catch (DatabaseException $e) { + log_message('error', 'Database Error during Excel fetch: ' . $e->getMessage()); + // Re-throw the exception so it is caught by the main function's catch block + throw $e; + } + + return $data; + } + private function getStaffPendingSummaryExcel($managerId): array {