diff --git a/app/Controllers/ExcelExportController.php b/app/Controllers/ExcelExportController.php index b46f615..75ed719 100644 --- a/app/Controllers/ExcelExportController.php +++ b/app/Controllers/ExcelExportController.php @@ -87,6 +87,989 @@ class ExcelExportController extends ResourceController return; } + // 1) Broker generate the Excel file + public function downloadBrokerPoliciesExcel() + { + try{ + $managerId = $this->request->getGet('manager_id'); + $brokerId = $this->request->getGet('broker_id'); + $month = $this->request->getGet('month'); + + if (empty($managerId) || empty($brokerId) || empty($month)) { + + $msg = "Missing: "; + $msg .= empty($managerId) ? "manager_id " : ""; + $msg .= empty($brokerId) ? "broker_id " : ""; + $msg .= empty($month) ? "month " : ""; + $ref = ['debug_msg' => $msg]; + // $ref = ['debug_msg' => 'Missing required parameters: manager_id, broker_id, and month must be provided.']; + return $this->response->setJSON(['status' => 'error','code' => 400,'data' => [],'message' => 'Missing required parameters','ref' => $ref])->setStatusCode(200); + } + + $data = $this->getBrokerPoliciesData($managerId, $brokerId, $month); + + $header = ['Broker Name', 'Issue Date', 'Policy Number', 'Premium Amount']; + + if (empty($data)) { + throw new \RuntimeException('No policies found...', 404); + } + + // Calculate and append total + $grandTotal = array_sum(array_column($data, 3)); + $data[] = ['','','Total:', $grandTotal]; // Column C (index 2) is 'Total:', Column D (index 3) is the value + + $monthName = ($month === 'current') ? date('Ym') : date('Ym', strtotime('-1 month')); + $brokerName = $data[0][0] ?? 'Broker'; + $fileName = $brokerName . '_Policies_Details_' . $monthName . '.xlsx'; + + // --- CALL CENTRALIZED FUNCTION --- + $this->streamExcelFile( + $header, + $data, + "Broker Policies Details for {$month}", + $fileName, + 'C', // Total Label Column (aligned right) + 'D' // Total Value Column (bold) + ); + + return; + + } catch (\Throwable $e) { + + // ... (Your error handling remains the same) ... + $ref = []; + // Case 1: No Data Found (Soft Success JSON) + if ($e instanceof \RuntimeException && $e->getCode() === 404) { + $ref['debug_msg'] = 'No Data Found'; + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => [], + 'message' => 'No Data Found', + 'ref' => $ref + ], 200); + } + + // Case 2: Database or Other Error (Error JSON) + $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException + || $e instanceof \mysqli_sql_exception + || $e instanceof \PDOException; + + if ($isDbError) { + $ref['debug_info'] = $e->getFile() . " / LN : " . $e->getLine(); + $ref['debug_msg'] = 'Database Error Occurred: ' . $e->getMessage(); + $message = 'Database Error Occurred.'; + } else { + $ref['debug_msg'] = 'An unexpected error occurred: ' . $e->getMessage(); + $message = 'Something went wrong. Please try again later.'; + } + + return $this->respond([ + 'status' => 'error', + 'code' => 500, + 'data' => [], + 'message'=> $message, + 'ref' => $ref + ], 200); + } + } + + + // 2) Product generate the Excel file + public function downloadProductPoliciesExcel() + { + try{ + $managerId = $this->request->getGet('manager_id'); + $vehicleType = $this->request->getGet('vehicle_type'); + $month = $this->request->getGet('month'); + + if (empty($managerId) || empty($vehicleType) || empty($month)) { + + + $msg = "Missing: "; + $msg .= empty($managerId) ? "manager_id " : ""; + $msg .= empty($brokerId) ? "broker_id " : ""; + $msg .= empty($month) ? "month " : ""; + $ref = ['debug_msg' => $msg]; + // $ref = ['debug_msg' => 'Missing required parameters: manager_id, broker_id, and month must be provided.']; + return $this->response->setJSON(['status' => 'error','code' => 400,'data' => [],'message' => 'Missing required parameters','ref' => $ref])->setStatusCode(200); + + } + + $data = $this->getProductPoliciesData($managerId, $vehicleType, $month); + $header = ['Vehicle Type', 'Issue Date', 'Policy Number', 'Premium Amount']; + + if (empty($data)) { + throw new \RuntimeException('No policies found for this vehicle type...', 404); + } + + $grandTotal = array_sum(array_column($data, 3)); + $data[] = ['','','Total:',$grandTotal]; // Column C is 'Total:', Column D is the value + + $monthName = ($month === 'current') ? date('Ym') : date('Ym', strtotime('-1 month')); + $vehicleType = $data[0][0] ?? 'Vehicle'; + $fileName = $vehicleType . '_Policies_Details_' . $monthName . '.xlsx'; + + // --- CALL CENTRALIZED FUNCTION --- + $this->streamExcelFile( + $header, + $data, + "Vehicle Type Policies Details for {$month}", + $fileName, + 'C', // Total Label Column + 'D' // Total Value Column + ); + + return; + } catch (\Throwable $e) { + + // ... (Your error handling remains the same) ... + $ref = []; + // Case 1: No Data Found (Soft Success JSON) + if ($e instanceof \RuntimeException && $e->getCode() === 404) { + $ref['debug_msg'] = 'No Data Found'; + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => [], + 'message' => 'No Data Found', + 'ref' => $ref + ], 200); + } + + // Case 2: Database or Other Error (Error JSON) + $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException + || $e instanceof \mysqli_sql_exception + || $e instanceof \PDOException; + + if ($isDbError) { + $ref['debug_info'] = $e->getFile() . " / LN : " . $e->getLine(); + $ref['debug_msg'] = 'Database Error Occurred: ' . $e->getMessage(); + $message = 'Database Error Occurred.'; + } else { + $ref['debug_msg'] = 'An unexpected error occurred: ' . $e->getMessage(); + $message = 'Something went wrong. Please try again later.'; + } + + return $this->respond([ + 'status' => 'error', + 'code' => 500, + 'data' => [], + 'message'=> $message, + 'ref' => $ref + ], 200); + } + } + + + + // 3) Insurer generate the Excel file + public function downloadInsurerPoliciesExcel() + { + try{ + $managerId = $this->request->getGet('manager_id'); + $insurerId = $this->request->getGet('insurer_id'); + $month = $this->request->getGet('month'); + + // --- ADDED VALIDATION (Simplified logic for clarity) --- + if (empty($managerId) || empty($insurerId) || empty($month)) { + $msg = "Missing: "; + $msg .= empty($managerId) ? "manager_id " : ""; + $msg .= empty($insurerId) ? "insurer_id " : ""; + $msg .= empty($month) ? "month " : ""; + $ref = ['debug_msg' => $msg]; + // Status code remains 200, but JSON code is 400 as per your preference + return $this->response->setJSON([ + 'status' => 'error', + 'code' => 400, + 'data' => [], + 'message' => 'Missing required parameters', + 'ref' => $ref + ])->setStatusCode(200); + } + + $data = $this->getInsurerPoliciesData($managerId, $insurerId, $month); + + // Define column headers + $header = ['Insurer Name', 'Insurer Short Name','Insured Name', 'Policy Issued Date','Policy Number', 'Premium Amount']; + + // --- 1. MODIFIED LOGIC: Throw RuntimeException if no data --- + if (empty($data)) { + throw new \RuntimeException('No policies found for this insurer for the specified month.', 404); + } + + $grandTotal = 0; + foreach ($data as $row) { $grandTotal += (float)$row[5]; } + + // Create and append the "Total" row + $totalRow = ['','','','','Total:',$grandTotal]; + $data[] = $totalRow; + + // Determine file name and date string + $monthName = ($month === 'current') ? date('Ym') : date('Ym', strtotime('-1 month')); + $InsurerName = $data[0][0]; + + // 2. Prepare PhpSpreadsheet (assuming $spreadsheet, $writer, etc. are created here) + while (ob_get_level() > 0) { + ob_end_clean(); + } + + // Create Spreadsheet + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + // Title + $sheet->mergeCells('A1:G1'); + $sheet->setCellValue('A1', "Insurer Policies Details for $month"); + $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + + // Headers + $sheet->fromArray($header, NULL, 'A2'); + + // Data + $sheet->fromArray($data, NULL, 'A3'); + + // 1. Define the target row number (Must be the first step!) + $totalRowNumber = count($data) + 2; + + // 2. Set the 'TOTAL:' label in Column F + $sheet->setCellValue('E' . $totalRowNumber, 'TOTAL:'); + + // 3. Apply bold formatting to the label and the sum (Columns C and D) + $sheet->getStyle('E' . $totalRowNumber . ':F' . $totalRowNumber)->getFont()->setBold(true); + + // 4. Align the label to the right for a clean look next to the sum + $sheet->getStyle('E' . $totalRowNumber)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT); + + // File Name + $fileName = $InsurerName . '_Policies_Details_' . $monthName . '.xlsx'; + + // HTTP Headers + header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + header("Content-Disposition: attachment; filename=\"{$fileName}\""); + header("Cache-Control: max-age=0"); + + // Output File + $writer = new Xlsx($spreadsheet); + $writer->save('php://output'); + + return; // STOP CI4 rendering anything else + + } catch (\Throwable $e) { + + // ... (Your error handling remains the same) ... + $ref = []; + // Case 1: No Data Found (Soft Success JSON) + if ($e instanceof \RuntimeException && $e->getCode() === 404) { + $ref['debug_msg'] = 'No Data Found'; + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => [], + 'message' => 'No Data Found', + 'ref' => $ref + ], 200); + } + + // Case 2: Database or Other Error (Error JSON) + $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException + || $e instanceof \mysqli_sql_exception + || $e instanceof \PDOException; + + if ($isDbError) { + $ref['debug_info'] = $e->getFile() . " / LN : " . $e->getLine(); + $ref['debug_msg'] = 'Database Error Occurred: ' . $e->getMessage(); + $message = 'Database Error Occurred.'; + } else { + $ref['debug_msg'] = 'An unexpected error occurred: ' . $e->getMessage(); + $message = 'Something went wrong. Please try again later.'; + } + + return $this->respond([ + 'status' => 'error', + 'code' => 500, + 'data' => [], + 'message'=> $message, + 'ref' => $ref + ], 200); + } + } + + + // 4) LowPremium generate the Excel file (Below 5OK) + public function downloadLowPremiumAgentExcel() + { + echo "***"; + try{ + $managerId = $this->request->getGet('manager_id'); + + if (empty($managerId)) { + $msg = "Missing: "; + $msg .= empty($managerId) ? "manager_id " : ""; + $ref = ['debug_msg' => $msg]; + // $ref = ['debug_msg' => 'Missing required parameters: manager_id, broker_id, and month must be provided.']; + return $this->response->setJSON(['status' => 'error','code' => 400,'data' => [],'message' => 'Missing required parameters','ref' => $ref])->setStatusCode(200); + } + + $data = $this->getLowPremiumAgentData($managerId); + $header = ['Partner Name', 'Partner Code','Partner Status' ,'Policy Number','Issued Date', 'Premium Amount']; + + if (empty($data)) { + throw new \RuntimeException('No low premium agents found...', 404); + } + + $grandTotal = array_sum(array_column($data, 5)); + $data[] = ['','','','','Total:', $grandTotal]; // Column E is 'Total:', Column F is the value + + // Note: $month variable is undefined, assuming you want current month for filename + $monthName = date('Ym'); + $PartnerName = $data[0][0] ?? 'Partner'; + $fileName = $PartnerName . '_Low_Premium_Details_' . $monthName . '.xlsx'; + + // --- CALL CENTRALIZED FUNCTION --- + $this->streamExcelFile( + $header, + $data, + $PartnerName ." Low Premium Agents Policy Details", // Adjusted Title + $fileName, + 'E', // Total Label Column + 'F' // Total Value Column + ); + + return; + } catch (\Throwable $e) { + + // ... (Your error handling remains the same) ... + $ref = []; + // Case 1: No Data Found (Soft Success JSON) + if ($e instanceof \RuntimeException && $e->getCode() === 404) { + $ref['debug_msg'] = 'No Data Found'; + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => [], + 'message' => 'No Data Found', + 'ref' => $ref + ], 200); + } + + // Case 2: Database or Other Error (Error JSON) + $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException + || $e instanceof \mysqli_sql_exception + || $e instanceof \PDOException; + + if ($isDbError) { + $ref['debug_info'] = $e->getFile() . " / LN : " . $e->getLine(); + $ref['debug_msg'] = 'Database Error Occurred: ' . $e->getMessage(); + $message = 'Database Error Occurred.'; + } else { + $ref['debug_msg'] = 'An unexpected error occurred: ' . $e->getMessage(); + $message = 'Something went wrong. Please try again later.'; + } + + return $this->respond([ + 'status' => 'error', + 'code' => 500, + 'data' => [], + 'message'=> $message, + 'ref' => $ref + ], 200); + } + } + + // 5) AgentMonthly generate the Excel file + public function downloadAgentMonthlyPoliciesExcel() + { + try{ + $managerId = $this->request->getGet('manager_id'); + $agentId = $this->request->getGet('agent_id'); + $month = $this->request->getGet('month'); + + if (empty($managerId) || empty($agentId) || empty($month)) { + + $msg = "Missing: "; + $msg .= empty($managerId) ? "manager_id " : ""; + $msg .= empty($agentId) ? "agent_id " : ""; + $msg .= empty($month) ? "month " : ""; + $ref = ['debug_msg' => $msg]; + return $this->response->setJSON(['status' => 'error','code' => 400,'data' => [],'message' => 'Missing required parameters','ref' => $ref])->setStatusCode(200); + } + + // Renamed helper function for consistency: getAgentMonthlyPoliciesData + $data = $this->getAgentMonthlyPoliciesData($managerId, $agentId, $month); + $header = ['Partner Name','Partner Code' ,'Issue Date', 'Policy Number', 'Premium Amount']; + + if (empty($data)) { + throw new \RuntimeException('No policies found for this agent for the specified month.', 404); + } + + $grandTotal = array_sum(array_column($data, 4)); + $data[] = ['','','','Total:',$grandTotal]; // Column D is 'Total:', Column E is the value + + $monthName = ($month === 'current') ? date('Ym') : date('Ym', strtotime('-1 month')); + $PartnerName = $data[0][0] ?? 'Partner'; + $fileName = $PartnerName . '_Policies_Details_' . $monthName . '.xlsx'; + + // --- CALL CENTRALIZED FUNCTION --- + $this->streamExcelFile( + $header, + $data, + "Partner Policies Details for {$month}", + $fileName, + 'D', // Total Label Column + 'E' // Total Value Column + ); + + return; + } catch (\Throwable $e) { + + // ... (Your error handling remains the same) ... + $ref = []; + // Case 1: No Data Found (Soft Success JSON) + if ($e instanceof \RuntimeException && $e->getCode() === 404) { + $ref['message'] = 'No Data Found'; + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => [], + 'message' => 'No Data Found', + 'ref' => $ref + ], 200); + } + + // Case 2: Database or Other Error (Error JSON) + $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException + || $e instanceof \mysqli_sql_exception + || $e instanceof \PDOException; + + if ($isDbError) { + $ref['debug_info'] = $e->getFile() . " / LN : " . $e->getLine(); + $ref['message'] = 'Database Error Occurred.'; + $message = 'Database Error Occurred.'; + } else { + $ref['message'] = 'An unexpected error occurred: ' . $e->getMessage(); + $message = 'An unexpected error occurred: ' . $e->getMessage(); + } + + return $this->respond([ + 'status' => 'error', + 'code' => 500, + 'data' => [], + 'message'=> $message, + 'ref' => $ref + ], 200); + } + } + + // Function to generate the Excel file + public function downloadStaffWiseProductPoliciesExcel() + { + try{ + $managerId = $this->request->getGet('manager_id'); + $brokerId = $this->request->getGet('broker_id'); + $month = $this->request->getGet('month'); + + // --- ADDED VALIDATION (Simplified logic for clarity) --- + if (empty($managerId) || empty($brokerId) || empty($month)) { + $ref = ['message' => 'Missing required parameters: manager_id, broker_id, and month must be provided.']; + // Status code remains 200, but JSON code is 400 as per your preference + return $this->response->setJSON([ + 'status' => 'error', + 'code' => 400, + 'data' => [], + 'message' => 'Missing required parameters: manager_id, broker_id, and month must be provided.', + 'ref' => $ref + ])->setStatusCode(200); + } + + $data = $this->getBrokerPoliciesData($managerId, $brokerId, $month); + // Define column headers + $header = ['Broker Name', 'Issue Date', 'Policy Number', 'Premium Amount']; + + // --- 1. MODIFIED LOGIC: Throw RuntimeException if no data --- + if (empty($data)) { + throw new \RuntimeException('No policies found for this broker for the specified month.', 404); + } + + $grandTotal = 0; + foreach ($data as $row) { $grandTotal += (float)$row[3]; } + + // Create and append the "Total" row + $totalRow = ['','','Total:',$grandTotal]; + $data[] = $totalRow; + + // Determine file name and date string + $monthName = ($month === 'current') ? date('Ym') : date('Ym', strtotime('-1 month')); + $brokerName = $data[0][0]; + + // 2. Prepare PhpSpreadsheet (assuming $spreadsheet, $writer, etc. are created here) + while (ob_get_level() > 0) { + ob_end_clean(); + } + + // Create Spreadsheet + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + // Title + $sheet->mergeCells('A1:D1'); + $sheet->setCellValue('A1', "Broker Policies Details for $month"); + $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + + // Headers + $sheet->fromArray($header, NULL, 'A2'); + + // Data + $sheet->fromArray($data, NULL, 'A3'); + + // File Name + $fileName = $brokerName . '_Policies_Details_' . $monthName . '.xlsx'; + + // HTTP Headers + header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + header("Content-Disposition: attachment; filename=\"{$fileName}\""); + header("Cache-Control: max-age=0"); + + // Output File + $writer = new Xlsx($spreadsheet); + $writer->save('php://output'); + + return; // STOP CI4 rendering anything else + + } catch (\Throwable $e) { + + // ... (Your error handling remains the same) ... + $ref = []; + // Case 1: No Data Found (Soft Success JSON) + if ($e instanceof \RuntimeException && $e->getCode() === 404) { + $ref['message'] = 'No Data Found'; + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => [], + 'message' => 'No Data Found', + 'ref' => $ref + ], 200); + } + + // Case 2: Database or Other Error (Error JSON) + $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException + || $e instanceof \mysqli_sql_exception + || $e instanceof \PDOException; + + if ($isDbError) { + $ref['debug_info'] = $e->getFile() . " / LN : " . $e->getLine(); + $ref['message'] = 'Database Error Occurred.'; + $message = 'Database Error Occurred.'; + } else { + $ref['message'] = 'An unexpected error occurred: ' . $e->getMessage(); + $message = 'An unexpected error occurred: ' . $e->getMessage(); + } + + return $this->respond([ + 'status' => 'error', + 'code' => 500, + 'data' => [], + 'message'=> $message, + 'ref' => $ref + ], 200); + } + } + + public function downloadAgentsWithoutPoliciesExcel() +{ + try{ + $managerId = $this->request->getGet('manager_id'); + + if (empty($managerId)) { + // ... (Missing parameter error handling) ... + } + + $data = $this->getAgentsWithoutPoliciesData($managerId); + $header = ['Partner Name', 'Partner Code', 'Email', 'Mobile']; + + if (empty($data)) { + throw new \RuntimeException('No agents without policies found.', 404); + } + + $monthName = date('Ym'); // Assuming current month is used for the file name + $fileName = 'Agents_Without_Policies_Details_' . $monthName . '.xlsx'; + + // --- CALL CENTRALIZED FUNCTION (NO TOTAL PARAMETERS) --- + $this->streamExcelFile( + $header, + $data, + "Agents Without Policies", + $fileName + // Note: Omitting 'C', 'D' will prevent total row styling + ); + + return; + } catch (\Throwable $e) { + + // ... (Your error handling remains the same) ... + $ref = []; + // Case 1: No Data Found (Soft Success JSON) + if ($e instanceof \RuntimeException && $e->getCode() === 404) { + $ref['message'] = 'No Data Found'; + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => [], + 'ref' => $ref + ], 200); + } + + // Case 2: Database or Other Error (Error JSON) + $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException + || $e instanceof \mysqli_sql_exception + || $e instanceof \PDOException; + + if ($isDbError) { + $ref['debug_info'] = $e->getFile() . " / LN : " . $e->getLine(); + $ref['message'] = 'Database Error Occurred.'; + } else { + $ref['message'] = 'An unexpected error occurred: ' . $e->getMessage(); + } + + return $this->respond([ + 'status' => 'error', + 'code' => $e->getCode() ?: 500, + 'data' => [], + 'ref' => $ref + ], 200); + } +} + + + + // Function to generate the Excel file + public function downloadAgentMonthlyPoliciesExcel_2() + { + try{ + $managerId = $this->request->getGet('manager_id'); + $brokerId = $this->request->getGet('broker_id'); + $month = $this->request->getGet('month'); + + // --- ADDED VALIDATION (Simplified logic for clarity) --- + + + + $data = $this->getAgentMonthlyPoliciesExcel($managerId, $brokerId, $month); + // Define column headers + $header = ['Partner Name','Partner Code' ,'Issue Date', 'Policy Number', 'Premium Amount']; + + + // --- 1. MODIFIED LOGIC: Throw RuntimeException if no data --- + if (empty($data)) { + throw new \RuntimeException('No policies found for this broker for the specified month.', 404); + } + + $grandTotal = 0; + foreach ($data as $row) { $grandTotal += (float)$row[3]; } + + // Create and append the "Total" row + $totalRow = ['','','Total:',$grandTotal]; + $data[] = $totalRow; + + // Determine file name and date string + $monthName = ($month === 'current') ? date('Ym') : date('Ym', strtotime('-1 month')); + $PartnerName = $data[0][0]; + + // 2. Prepare PhpSpreadsheet (assuming $spreadsheet, $writer, etc. are created here) + while (ob_get_level() > 0) { + ob_end_clean(); + } + + // Create Spreadsheet + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + // Title + $sheet->mergeCells('A1:F1'); + $sheet->setCellValue('A1', "Partner Policies Details for $month"); + $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + + // Headers + $sheet->fromArray($header, NULL, 'A2'); + + // Data + $sheet->fromArray($data, NULL, 'A3'); + + // File Name + $fileName = $PartnerName . '_Policies_Details_' . $monthName . '.xlsx'; + + // HTTP Headers + header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + header("Content-Disposition: attachment; filename=\"{$fileName}\""); + header("Cache-Control: max-age=0"); + + // Output File + $writer = new Xlsx($spreadsheet); + $writer->save('php://output'); + + return; // STOP CI4 rendering anything else + + } catch (\Throwable $e) { + + // ... (Your error handling remains the same) ... + $ref = []; + // Case 1: No Data Found (Soft Success JSON) + if ($e instanceof \RuntimeException && $e->getCode() === 404) { + $ref['message'] = 'No Data Found'; + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => [], + 'ref' => $ref + ], 200); + } + + // Case 2: Database or Other Error (Error JSON) + $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException + || $e instanceof \mysqli_sql_exception + || $e instanceof \PDOException; + + if ($isDbError) { + $ref['debug_info'] = $e->getFile() . " / LN : " . $e->getLine(); + $ref['message'] = 'Database Error Occurred.'; + } else { + $ref['message'] = 'An unexpected error occurred: ' . $e->getMessage(); + } + + return $this->respond([ + 'status' => 'error', + 'code' => $e->getCode() ?: 500, + 'data' => [], + 'ref' => $ref + ], 200); + } + } + + + + // Function to generate the Excel file + public function downloadAgentNoPolicyTimeRange_2() + { + try{ + $managerId = $this->request->getGet('manager_id'); + $brokerId = $this->request->getGet('broker_id'); + $month = $this->request->getGet('month'); + + // --- ADDED VALIDATION (Simplified logic for clarity) --- + if (empty($managerId) || empty($brokerId) || empty($month)) { + $ref = ['message' => 'Missing required parameters: manager_id, broker_id, and month must be provided.']; + // Status code remains 200, but JSON code is 400 as per your preference + return $this->response->setJSON([ + 'status' => 'error', + 'code' => 400, + 'data' => [], + 'ref' => $ref + ])->setStatusCode(200); + } + + $data = $this->getBrokerPoliciesData($managerId, $brokerId, $month); + // Define column headers + $header = ['Broker Name', 'Issue Date', 'Policy Number', 'Premium Amount']; + + // --- 1. MODIFIED LOGIC: Throw RuntimeException if no data --- + if (empty($data)) { + throw new \RuntimeException('No policies found for this broker for the specified month.', 404); + } + + $grandTotal = 0; + foreach ($data as $row) { $grandTotal += (float)$row[3]; } + + // Create and append the "Total" row + $totalRow = ['','','Total:',$grandTotal]; + $data[] = $totalRow; + + // Determine file name and date string + $monthName = ($month === 'current') ? date('Ym') : date('Ym', strtotime('-1 month')); + $brokerName = $data[0][0]; + + // 2. Prepare PhpSpreadsheet (assuming $spreadsheet, $writer, etc. are created here) + while (ob_get_level() > 0) { + ob_end_clean(); + } + + // Create Spreadsheet + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + // Title + $sheet->mergeCells('A1:D1'); + $sheet->setCellValue('A1', "Broker Policies Details for $month"); + $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + + // Headers + $sheet->fromArray($header, NULL, 'A2'); + + // Data + $sheet->fromArray($data, NULL, 'A3'); + + // File Name + $fileName = $brokerName . '_Policies_Details_' . $monthName . '.xlsx'; + + // HTTP Headers + header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + header("Content-Disposition: attachment; filename=\"{$fileName}\""); + header("Cache-Control: max-age=0"); + + // Output File + $writer = new Xlsx($spreadsheet); + $writer->save('php://output'); + + return; // STOP CI4 rendering anything else + + } catch (\Throwable $e) { + + // ... (Your error handling remains the same) ... + $ref = []; + // Case 1: No Data Found (Soft Success JSON) + if ($e instanceof \RuntimeException && $e->getCode() === 404) { + $ref['message'] = 'No Data Found'; + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => [], + 'ref' => $ref + ], 200); + } + + // Case 2: Database or Other Error (Error JSON) + $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException + || $e instanceof \mysqli_sql_exception + || $e instanceof \PDOException; + + if ($isDbError) { + $ref['debug_info'] = $e->getFile() . " / LN : " . $e->getLine(); + $ref['message'] = 'Database Error Occurred.'; + } else { + $ref['message'] = 'An unexpected error occurred: ' . $e->getMessage(); + } + + return $this->respond([ + 'status' => 'error', + 'code' => $e->getCode() ?: 500, + 'data' => [], + 'ref' => $ref + ], 200); + } + } + + + + // Function to generate the Excel file + public function downloadBrokerPoliciesExcel_agentBelow50tPremiumTimeRange_2() + { + try{ + $managerId = $this->request->getGet('manager_id'); + $brokerId = $this->request->getGet('broker_id'); + $month = $this->request->getGet('month'); + + // --- ADDED VALIDATION (Simplified logic for clarity) --- + if (empty($managerId) || empty($brokerId) || empty($month)) { + $ref = ['message' => 'Missing required parameters: manager_id, broker_id, and month must be provided.']; + // Status code remains 200, but JSON code is 400 as per your preference + return $this->response->setJSON([ + 'status' => 'error', + 'code' => 400, + 'data' => [], + 'ref' => $ref + ])->setStatusCode(200); + } + + $data = $this->getBrokerPoliciesData($managerId, $brokerId, $month); + // Define column headers + $header = ['Broker Name', 'Issue Date', 'Policy Number', 'Premium Amount']; + + $grandTotal = 0; + foreach ($data as $row) { $grandTotal += (float)$row[3]; } + + // Create and append the "Total" row + $totalRow = ['','','Total:',$grandTotal]; + $data[] = $totalRow; + + // --- 1. MODIFIED LOGIC: Throw RuntimeException if no data --- + if (empty($data)) { + throw new \RuntimeException('No policies found for this broker for the specified month.', 404); + } + + // Determine file name and date string + $monthName = ($month === 'current') ? date('Ym') : date('Ym', strtotime('-1 month')); + $brokerName = $data[0][0]; + + // 2. Prepare PhpSpreadsheet (assuming $spreadsheet, $writer, etc. are created here) + while (ob_get_level() > 0) { + ob_end_clean(); + } + + // Create Spreadsheet + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + // Title + $sheet->mergeCells('A1:D1'); + $sheet->setCellValue('A1', "Broker Policies Details for $month"); + $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + + // Headers + $sheet->fromArray($header, NULL, 'A2'); + + // Data + $sheet->fromArray($data, NULL, 'A3'); + + // File Name + $fileName = $brokerName . '_Policies_Details_' . $monthName . '.xlsx'; + + // HTTP Headers + header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + header("Content-Disposition: attachment; filename=\"{$fileName}\""); + header("Cache-Control: max-age=0"); + + // Output File + $writer = new Xlsx($spreadsheet); + $writer->save('php://output'); + + return; // STOP CI4 rendering anything else + + } catch (\Throwable $e) { + + // ... (Your error handling remains the same) ... + $ref = []; + // Case 1: No Data Found (Soft Success JSON) + if ($e instanceof \RuntimeException && $e->getCode() === 404) { + $ref['message'] = 'No Data Found'; + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => [], + 'ref' => $ref + ], 200); + } + + // Case 2: Database or Other Error (Error JSON) + $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException + || $e instanceof \mysqli_sql_exception + || $e instanceof \PDOException; + + if ($isDbError) { + $ref['debug_info'] = $e->getFile() . " / LN : " . $e->getLine(); + $ref['message'] = 'Database Error Occurred.'; + } else { + $ref['message'] = 'An unexpected error occurred: ' . $e->getMessage(); + } + + return $this->respond([ + 'status' => 'error', + 'code' => $e->getCode() ?: 500, + 'data' => [], + 'ref' => $ref + ], 200); + } + } + /** * Executes the detailed policy query and extracts the data for the spreadsheet. @@ -318,7 +1301,7 @@ class ExcelExportController extends ResourceController * @param string $month ('current' or 'previous') * @return array */ - private function getAgentMonthlyPoliciesExcel($managerId, $AgentId, $month): array + private function getAgentMonthlyPoliciesData($managerId, $AgentId, $month): array { // --- Correction 1: Initialize Database Connection --- @@ -447,7 +1430,7 @@ class ExcelExportController extends ResourceController $builder->join('partner_agent pa', 'pa.id = pp.agent_id', 'inner'); // WHERE conditions $builder->where('pp.manager_id', $managerId); - $builder->where('pa.id', $agentId); + // $builder->where('pa.id', $agentId); $builder->where('pp.premium_amount <', 50000); $builder->orderBy('pp.issued_date', 'DESC');