431 lines
19 KiB
PHP
431 lines
19 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
|
|
use CodeIgniter\Controller;
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
|
use DateTime;
|
|
|
|
class PolicyReportController extends Controller
|
|
{
|
|
public function downloadExcel()
|
|
{
|
|
$db = \Config\Database::connect();
|
|
|
|
// -----------------------------
|
|
// REQUEST PARAMS
|
|
// -----------------------------
|
|
$managerId = $this->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');
|
|
$show_policy_report = $this->request->getGet('show_policy_report') ?? 'All';
|
|
$insurer_id = $this->request->getGet('insurer_id') ?? '';
|
|
|
|
if ($show_policy_report === 'Verified') {
|
|
$statusValues = [1];
|
|
} elseif ($show_policy_report === 'Not Verified') {
|
|
$statusValues = [0];
|
|
} else {
|
|
$statusValues = [0, 1];
|
|
}
|
|
|
|
|
|
|
|
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,
|
|
CASE
|
|
WHEN pp.issued_date IS NULL
|
|
OR pp.issued_date = '0000-00-00 00:00:00'
|
|
THEN 'N/A'
|
|
ELSE DATE_FORMAT(pp.issued_date, '%d-%m-%Y %h:%i %p')
|
|
END AS issued_date,
|
|
pa.name AS partner_name,
|
|
ins.short_name AS insurer,
|
|
CONCAT('`', pp.policy_number) AS 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,
|
|
pp.fuel_type,
|
|
v.vehicle_no,
|
|
CASE
|
|
WHEN pp.date_of_registration IS NULL
|
|
OR pp.date_of_registration = '0000-00-00'
|
|
THEN 'N/A'
|
|
ELSE DATE_FORMAT(pp.date_of_registration, '%d-%m-%Y')
|
|
END AS date_of_registration,
|
|
pp.make,
|
|
pp.model
|
|
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 vehicle v ON v.id = pp.vehicle_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 ];
|
|
|
|
// Add insurer filter only if it's not empty
|
|
if (!empty($insurer_id)) {
|
|
$sql .= " AND ins.id = ?";
|
|
$bindings[] = $insurer_id;
|
|
}
|
|
|
|
$whereIn = implode(',', array_fill(0, count($statusValues), '?'));
|
|
|
|
if (!empty($statusValues)) {
|
|
$sql .= " AND pp.is_data_accuracy_checked IN ($whereIn)";
|
|
$bindings = array_merge($bindings, $statusValues);
|
|
}
|
|
|
|
$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();
|
|
|
|
// dd($whereIn, $bindings,$query,$data);
|
|
|
|
// -----------------------------
|
|
// 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'
|
|
// ];
|
|
|
|
$headers = [
|
|
'PARTNER CODE',
|
|
'PARTNER NAME',
|
|
'BOOKING REF NO',
|
|
'INSURED DATE',
|
|
'INSURER',
|
|
'PLAN TYPE',
|
|
'POLICY NO',
|
|
'INSURED NAME',
|
|
'REG NO',
|
|
'PRODUCT',
|
|
'PRODUCT TYPE',
|
|
'FUEL TYPE',
|
|
'GVW',
|
|
'YEAR OF MFG',
|
|
'RTO LOC',
|
|
'DATE OF REGISTRATION',
|
|
'COMPANY',
|
|
'MAKE & VARIANT',
|
|
'A (OD)',
|
|
'B (TP)',
|
|
'A+B (NET)',
|
|
'S.TAX (CGST/IGST)',
|
|
'TOTAL',
|
|
'PAYMENT MODE',
|
|
'EXPIRY DATE',
|
|
'NCB %',
|
|
'BROKER CODE',
|
|
'ASSIGNED TO',
|
|
// 'SALES MANAGER',
|
|
'SALES EXECUTIVE',
|
|
'CONTACT NO',
|
|
'ADDRESS',
|
|
'PIN CODE',
|
|
'BOOKING STATUS',
|
|
'DATE OF BOOKING',
|
|
'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['ref_code'],
|
|
$d['partner_name'],
|
|
$d['booking_ref_no'],
|
|
$d['issued_date'],
|
|
$d['insurer'],
|
|
$d['plan_type'],
|
|
$d['policy_number'],
|
|
$d['insured_name'],
|
|
$d['reg_no'],
|
|
$d['product'],
|
|
$d['product_type'],
|
|
$d['fuel_type'], //
|
|
$d['vehicle_weight'],
|
|
$d['year_of_manufacture'],
|
|
$d['rto_loc'],
|
|
$d['date_of_registration'],
|
|
$d['make'],
|
|
$d['model'],
|
|
$d['od'],
|
|
$d['tp'],
|
|
$d['net_amount'],
|
|
$d['service_tax'],
|
|
$d['total_amount'],
|
|
$d['payment_mode'],
|
|
$d['expire_date'],
|
|
$d['ncb_percent'],
|
|
$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['remark']
|
|
], null, "A$row");
|
|
|
|
$row++;
|
|
}
|
|
|
|
// 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);
|
|
}
|
|
}
|