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) // Old Query Don't Delete It. Any Doubt ask MG Bhai // ----------------------------- // $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(); // New Query // This query is copied from enquiryList() in EnquiryController // to refer this API URI = enquiry/enquiryList?manager_id=1&only_policy_data=true&from_date=18-12-2025&to_date=02-01-2026&staff_id= $sql = "SELECT pos.pos_code AS pos_code, pos.name AS pos_name, pa.agent_code AS ref_code, CASE WHEN pp.created_on IS NULL OR pp.created_on = '0000-00-00 00:00:00' THEN 'N/A' ELSE DATE_FORMAT(pp.created_on, '%d-%m-%Y %h:%i %p') END AS inward_date, pa.name AS partner_name, ins.short_name AS insurer, pp.policy_number, pp.insured_name, iptm.insurance_plan_type AS plan_type, pp.vehicle_type AS product, pp.product AS product_type, CASE WHEN pp.od IS NULL OR pp.od = '' THEN 0 ELSE pp.od END AS od, CASE WHEN pp.tp IS NULL OR pp.tp = '' THEN 0 ELSE pp.tp END 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, CASE WHEN pp.end_date IS NULL OR pp.end_date = '0000-00-00 00:00:00' THEN 'N/A' ELSE DATE_FORMAT(pp.end_date, '%d-%m-%Y %h:%i %p') END AS expire_date, NULL AS ncb_percent, pb.short_name AS broker_code, ps.name AS assigned_to, ps2.name AS sales_manager, pse.name AS sales_executive, pse.mobile AS contact_no, pos.address, pos.pincode, pe.status AS booking_status, pe.id AS enquiry_id, pe.reg_no, CASE WHEN pe.created_on IS NULL OR pe.created_on = '0000-00-00 00:00:00' THEN 'N/A' ELSE DATE_FORMAT(pe.created_on, '%d-%m-%Y %h:%i %p') END AS booking_date, pe.id AS booking_ref_no, pp.agent_retention_rate AS grid_percent, pp.commission_amount AS grid_amount, pp.year_of_manufacture, pp.weight AS vehicle_weight, pe.remarks AS remark FROM partner_enquiry pe LEFT JOIN partner_agent pa ON pa.id = pe.agent_id LEFT JOIN partner_staff ps ON ps.id = pe.assigned_to LEFT JOIN partner_quotation pq ON pq.enquiry_id = pe.id AND pq.status = 'Accepted' LEFT JOIN insurers ins ON ins.id = pe.insurer_id LEFT JOIN partner_policy pp ON pp.quotation_id = pq.id LEFT JOIN partner_payment_mode_master pm ON pm.id = pq.payment_mode_id LEFT JOIN partner_pos pos ON pos.id = pa.pos_id LEFT JOIN partner_sales_executive pse ON pse.id = pa.sales_executive_id LEFT JOIN partner_staff ps2 ON ps2.id = pse.manager_id LEFT JOIN partner_brokers pb ON pb.id = pe.broker_id LEFT JOIN partner_insurance_plan_type_master iptm ON pq.insurance_plan_type_id = iptm.id WHERE pe.is_active = 1 AND pe.is_quick_quote = 0 AND pp.id IS NOT NULL AND pp.created_on BETWEEN ? AND ? AND pe.manager_id = ?"; $bindings = [$fromDate, $toDate, $managerId]; $search = $this->request->getGet('search'); if (!empty($search)) { $searchTerm = '%' . strtolower(trim($search)) . '%'; $sql .= " AND ( LOWER(ps.name) LIKE ? OR LOWER(pa.name) LIKE ? OR LOWER(ins.short_name) LIKE ? OR LOWER(pe.reg_no) LIKE ? OR LOWER(pp.insured_name) LIKE ? OR CAST(pp.premium_amount AS CHAR) LIKE ? OR LOWER(pm.value) LIKE ? OR LOWER(pp.policy_number) LIKE ? )"; // Bind search term 8 times for ($i = 0; $i < 8; $i++) { $bindings[] = $searchTerm; } // YES / NO search support if (strtolower($search) === 'yes') { $sql .= " OR pp.is_bds_pushed = 1"; } elseif (strtolower($search) === 'no') { $sql .= " OR pp.is_bds_pushed = 0"; } } // ORDER BY must be LAST $sql .= " ORDER BY pe.created_on DESC"; $query = $db->query($sql, $bindings); $data = $query->getResultArray(); // ----------------------------- // EXCEL GENERATION // ----------------------------- $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); // enquiry_id,reg_no,year_of_manufacture // EXACT HEADER FROM YOUR EXCEL $headers = [ 'ENQUIRY ID','POS CODE','POS NAME','REFF CODE','PARTNER NAME','INWARD DATE', 'INSURER','POLICY NO','REG NO','ISSURED NAME','PLAN TYPE','PRODUCT','PRODUCT TYPE','YEAR OF MFG','WEIGHT', 'A (OD)','B (TP)','A+B (NET)','S.TAX','TOTAL', 'PAYMENT MODE','RTO LOC.','NCB %','Expire Date','BROKER CODE', 'ASSIDNED 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['enquiry_id'], $d['pos_code'], $d['pos_name'], $d['ref_code'], $d['partner_name'], $d['inward_date'], $d['insurer'], $d['policy_number'], $d['reg_no'], $d['insured_name'], $d['plan_type'], $d['product'], $d['product_type'], $d['year_of_manufacture'], $d['vehicle_weight'], $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); } }