From 619ac5f83c595421f2e6906505cb8298a18a5abe Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Sat, 20 Dec 2025 11:04:01 +0530 Subject: [PATCH] GWM : report --- app/Config/Routes.php | 6 + app/Controllers/PolicyReportController.php | 175 +++++++++++++++++++++ app/Models/StaffModel.php | 17 ++ 3 files changed, 198 insertions(+) create mode 100644 app/Controllers/PolicyReportController.php diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 04d0819..da0b9c9 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -170,6 +170,9 @@ $routes->group('api', ['filter' => 'appSignature'], function ($routes) { $routes->post('salesExecutive/createExecutive', 'SalesExecutive::createSalesExecutive'); $routes->post('salesExecutive/updateExecutive', 'SalesExecutive::updateSalesExecutivedetails'); $routes->post('salesExecutive/changeExecutiveStatus', 'SalesExecutive::changeSalesExecutiveStatus'); + + //report + $routes->get('reports/policy-excel', 'PolicyReportController::downloadExcel'); }); @@ -207,3 +210,6 @@ $routes->get("processjob", "JobWorker::processJob"); + + + diff --git a/app/Controllers/PolicyReportController.php b/app/Controllers/PolicyReportController.php new file mode 100644 index 0000000..297fe69 --- /dev/null +++ b/app/Controllers/PolicyReportController.php @@ -0,0 +1,175 @@ +request->getGet('manager_id'); + $fromDate = $this->request->getGet('from_date'); + $toDate = $this->request->getGet('to_date'); + $fromDate = DateTime::createFromFormat('d-m-Y', $fromDate)->format('Y-m-d 00:00:00'); + $toDate = DateTime::createFromFormat('d-m-Y', $toDate)->format('Y-m-d 23:59:59'); + + if (!$managerId || !$fromDate || !$toDate) { + return $this->response->setJSON([ + 'status' => 'failed', + 'message' => 'manager_id, from_date and to_date are required' + ]); + } + + // ----------------------------- + // QUERY (100% Excel-aligned) + // ----------------------------- + $data = $db->query(" + SELECT + pos.pos_code AS pos_code, + pos.name AS pos_name, + pa.agent_code AS ref_code, + pp.created_on AS inward_date, + pa.name AS partner_name, + ins.short_name AS insurer, + pp.policy_number, + pp.insured_name, + pq.insurance_plan_type_id AS plan_type, + pp.vehicle_type AS product, + + pp.od AS od, + pp.tp AS tp, + (IFNULL(pp.od,0) + IFNULL(pp.tp,0)) AS net_amount, + + (IFNULL(pp.cgst,0) + IFNULL(pp.sgst,0) + IFNULL(pp.igst,0)) AS service_tax, + + (IFNULL(pp.od,0) + IFNULL(pp.tp,0) + + IFNULL(pp.cgst,0) + IFNULL(pp.sgst,0) + IFNULL(pp.igst,0) + ) AS total_amount, + + pm.value AS payment_mode, + CONCAT(pp.rto_state_code,'-',pp.rto_city_code) AS rto_loc, + NULL AS ncb_percent, + pp.end_date AS expire_date, + + pb.short_name AS broker_code, + ps.name AS assigned_to, + pp.manager_id AS sales_manager, + pa.name AS sales_executive, + pa.mobile AS contact_no, + pos.address, + pos.pincode, + + pe.status AS booking_status, + pe.created_on AS booking_date, + pe.id AS booking_ref_no, + + pp.agent_retention_rate AS grid_percent, + pp.commission_amount AS grid_amount, + pe.remarks AS remark + FROM partner_policy pp + LEFT JOIN partner_agent pa ON pa.id = pp.agent_id + LEFT JOIN partner_pos pos ON pos.id = pa.pos_id + LEFT JOIN partner_quotation pq ON pq.id = pp.quotation_id + LEFT JOIN insurers ins ON ins.id = pq.insurer_id + LEFT JOIN partner_payment_mode_master pm ON pm.id = pq.payment_mode_id + LEFT JOIN partner_enquiry pe ON pe.id = pp.enquiry_id + LEFT JOIN partner_staff ps ON ps.id = pe.assigned_to + LEFT JOIN partner_brokers pb ON pb.id = pe.broker_id + WHERE pp.manager_id = ? + AND pp.issued_date BETWEEN ? AND ? + ORDER BY pp.created_on DESC + ", [$managerId, $fromDate, $toDate])->getResultArray(); + + // ----------------------------- + // EXCEL GENERATION + // ----------------------------- + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + // EXACT HEADER FROM YOUR EXCEL + $headers = [ + 'POS CODE','POS NAME','REFF CODE','Inward Date','PARTNER NAME', + 'Insurer','Policy No','Issured Name','PLAN TYPE','Product', + 'A (OD)','B (TP)','A+B (NET)','S.TAX','TOTAL', + 'PAYMENT MODE','RTO LOC.','NCB %','Expire Date','BROKER CODE', + 'Assigned To','SALES MANAGER','SALES EXECUTIVE','CONTACT NO', + 'ADDRESS','PIN CODE','BOOKING STATUS','DATE OF BOOKING', + 'BOOKING REF NO','GRID %','GRID AMT','REMARK' + ]; + + // Header row + $col = 'A'; + foreach ($headers as $header) { + $sheet->setCellValue($col.'1', $header); + $sheet->getColumnDimension($col)->setAutoSize(true); + $col++; + } + + // Data rows + $row = 2; + foreach ($data as $d) { + $sheet->fromArray([ + $d['pos_code'], + $d['pos_name'], + $d['ref_code'], + $d['inward_date'], + $d['partner_name'], + $d['insurer'], + $d['policy_number'], + $d['insured_name'], + $d['plan_type'], + $d['product'], + $d['od'], + $d['tp'], + $d['net_amount'], + $d['service_tax'], + $d['total_amount'], + $d['payment_mode'], + $d['rto_loc'], + $d['ncb_percent'], + $d['expire_date'], + $d['broker_code'], + $d['assigned_to'], + $d['sales_manager'], + $d['sales_executive'], + $d['contact_no'], + $d['address'], + $d['pincode'], + $d['booking_status'], + $d['booking_date'], + $d['booking_ref_no'], + $d['grid_percent'], + $d['grid_amount'], + $d['remark'] + ], null, "A$row"); + + $row++; + } + + // ----------------------------- + // DOWNLOAD RESPONSE + // ----------------------------- + $fileName = 'Policy_Report_' . date('YmdHis') . '.xlsx'; + + $response = $this->response; + $response->setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + $response->setHeader('Content-Disposition', 'attachment; filename="'.$fileName.'"'); + $response->setHeader('Cache-Control', 'max-age=0'); + + $writer = new Xlsx($spreadsheet); + ob_start(); + $writer->save('php://output'); + $excelOutput = ob_get_clean(); + + return $response->setBody($excelOutput); + } +} diff --git a/app/Models/StaffModel.php b/app/Models/StaffModel.php index 3b8e9de..364fc27 100644 --- a/app/Models/StaffModel.php +++ b/app/Models/StaffModel.php @@ -26,4 +26,21 @@ class StaffModel extends Model ]; protected $useTimestamps = false; // we manually manage created_on / updated_on + + protected $validationRules = [ + 'name' => 'required|min_length[3]', + 'email' => 'permit_empty|valid_email|is_unique[partner_staff.email,id,{id}]', + 'mobile' => 'permit_empty|numeric|max_length[20]|is_unique[partner_staff.mobile,id,{id}]', + 'manager_id' => 'required|integer', + ]; + + protected $validationMessages = [ + 'email' => [ + 'is_unique' => 'Sorry, that email address is already registered.', + ], + 'mobile' => [ + 'is_unique' => 'Sorry, that mobile number is already registered.', + ], + ]; + }