Merge branch 'main' of bitbucket.org:jubilian/nhance_partner_be

This commit is contained in:
Gowtham M 2026-01-03 12:37:26 +05:30
commit c22810974a
5 changed files with 256 additions and 121 deletions

View File

@ -148,25 +148,28 @@ $routes->group('api', ['filter' => 'appSignature'], function ($routes) {
$routes->get("dashboard/productivityDashboard", "DashboardController::productivityDashboard");
//DASHBOARD Season 1 EXPORT EXCEL (ManagerDashboard - staffLevelPendingSummaryData)
$routes->get("dashboard/downloadStaffPendingSummaryExcel", "ExcelExportController::downloadStaffPendingSummaryExcel");
$routes->get("dashboard/downloadStaffPendingSummaryExcelByID", "ExcelExportController::downloadStaffPendingSummaryExcelByID");
$routes->get("dashboard/downloadExcelStaffPendingSummary", "ExcelExportController::downloadExcelStaffPendingSummary");
$routes->get("dashboard/downloadExcelStaffPendingSummaryByID", "ExcelExportController::downloadExcelStaffPendingSummaryByID");
//DASHBOARD Season 2 EXPORT EXCEL (businessDashboard)
$routes->get("dashboard/downloadBrokerPoliciesExcel", "ExcelExportController::downloadBrokerPoliciesExcel");
$routes->get("dashboard/downloadInsurerPoliciesExcel", "ExcelExportController::downloadInsurerPoliciesExcel");
$routes->get("dashboard/downloadProductPoliciesExcel", "ExcelExportController::downloadProductPoliciesExcel");
$routes->get("dashboard/downloadExcelBroker", "ExcelExportController::downloadExcelBroker");
$routes->get("dashboard/downloadExcelInsurer", "ExcelExportController::downloadExcelInsurer");
$routes->get("dashboard/downloadExcelProduct", "ExcelExportController::downloadExcelProduct");
//DASHBOARD Season 3 EXPORT EXCEL (partnerDashboard)
$routes->get("dashboard/downloadT50AgentPoliciesExcel", "ExcelExportController::downloadT50AgentPoliciesExcel"); // whole agent but top 50
$routes->get("dashboard/downloadAgentMonthlyPoliciesExcel", "ExcelExportController::downloadAgentMonthlyPoliciesExcel"); // particular Agent
$routes->get("dashboard/downloadLowPremiumAgentExcel", "ExcelExportController::downloadLowPremiumAgentExcel");
$routes->get("dashboard/downloadAgentsWithoutPoliciesExcel", "ExcelExportController::downloadAgentsWithoutPoliciesExcel");
$routes->get("dashboard/downloadExcelLowPremium", "ExcelExportController::downloadExcelLowPremium");
$routes->get("dashboard/downloadExcelPerformingAgentsByID", "ExcelExportController::downloadExcelPerformingAgentsByID");
$routes->get("dashboard/downloadExcelPerformingAgentsTop50", "ExcelExportController::downloadExcelPerformingAgentsTop50");
$routes->get("dashboard/downloadExcelWithoutPolicies", "ExcelExportController::downloadExcelWithoutPolicies");
//DASHBOARD Season 4 EXPORT EXCEL AS ZIP (partnerDashboard - 3Excel in Zip Folder)
$routes->get("dashboard/downloadExcelAsZIP", "ExcelExportController::downloadExcelAsZIP");
//DASHBOARD Season 5 EXPORT EXCEL (productivityDashboard)
$routes->get("dashboard/downloadStaffAndProductPoliciesExcel", "ExcelExportController::downloadStaffAndProductPoliciesExcel");
$routes->get("dashboard/downloadExcelStaffAndProduct", "ExcelExportController::downloadExcelStaffAndProduct");
$routes->get('reports/endorsement-excel', 'PolicyReportController::downloadExcelEndorsement');

View File

@ -830,6 +830,8 @@ class DashboardController extends ResourceController
$builder = $this->db->table('partner_policy pp');
$fromDate = date('Y-m-d', strtotime('-10 days'));
$toDate = date('Y-m-d');
$builder->select("
pa.id AS agent_id,
@ -842,10 +844,10 @@ class DashboardController extends ResourceController
$builder->join('partner_agent pa', 'pp.agent_id = pa.id', 'inner');
$builder->join('partner_enquiry pe', 'pe.id = pp.enquiry_id', 'left');
$builder->where("MONTH(pp.issued_date) = MONTH('$customDate')", null, false);
$builder->where("YEAR(pp.issued_date) = YEAR('$customDate')", null, false);
$builder->where('pp.issued_date >=', $fromDate);
$builder->where('pp.issued_date <=', $toDate);
$builder->where('pp.manager_id',$manager_id);
// $builder->where('pp.manager_id',$manager_id);
$builder->groupBy(['pa.id']);
$builder->orderBy('policy_count', 'DESC');
@ -856,6 +858,7 @@ class DashboardController extends ResourceController
}
$result = $builder->get()->getResultArray();
// echo $this->db->getLastQuery()->getQuery();die;
return $result;
}

View File

@ -31,6 +31,8 @@ class EnquiryController extends ResourceController
}
// List all enquiries
// This query is also copied in PolicyReportController::downloadExcel(). Please apply the same changes there as well.
// 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=
public function enquiryList()
{
try {

View File

@ -111,7 +111,7 @@ class ExcelExportController extends ResourceController
}
// 1) Broker generate the Excel file
public function BrokerWiseExcel()
public function downloadExcelBroker()
{
try{
$managerId = $this->request->getGet('manager_id');
@ -177,12 +177,7 @@ class ExcelExportController extends ResourceController
$monthName = ($month === 'current') ? date('M_Y') : date('M_Y', strtotime('-1 month'));
$brokerName = $finalData[0][11] ?? '';
if (empty($brokerName) || $brokerName === 'N/A') {
$fileName = "Broker_Policies_Details_{$monthName}.xlsx";
} else {
$cleanName = str_replace(' ', '_', strtolower(trim($brokerName)));
$fileName = "{$cleanName}_Policies_Details_{$monthName}.xlsx";
}
$fileName = "Broker_Policies_Details_{$monthName}.xlsx";
$titleName = str_replace(['_', '.xlsx'], [' ', ''], $fileName);
@ -239,7 +234,7 @@ class ExcelExportController extends ResourceController
}
// 2) Product generate the Excel file
public function ProductWiseExcel()
public function downloadExcelProduct()
{
try{
$managerId = $this->request->getGet('manager_id');
@ -309,12 +304,8 @@ class ExcelExportController extends ResourceController
$monthName = ($month === 'current') ? date('M_Y') : date('M_Y', strtotime('-1 month'));
$vehicleType = $finalData[0][11] ?? '';
if (empty($vehicleType) || $vehicleType === 'N/A') {
$fileName = "Product_Policies_Details_{$monthName}.xlsx";
} else {
$cleanName = str_replace(' ', '_', strtolower(trim($vehicleType)));
$fileName = "{$cleanName}_Policies_Details_{$monthName}.xlsx";
}
$fileName = "Product_Policies_Details_{$monthName}.xlsx";
$titleName = str_replace(['_', '.xlsx'], [' ', ''], $fileName);
// --- CALL CENTRALIZED FUNCTION ---
@ -367,7 +358,7 @@ class ExcelExportController extends ResourceController
}
// 3) Insurer generate the Excel file
public function InsurerWiseExcel()
public function downloadExcelInsurer()
{
try{
$managerId = $this->request->getGet('manager_id');
@ -443,12 +434,8 @@ class ExcelExportController extends ResourceController
$monthName = ($month === 'current') ? date('M_Y') : date('M_Y', strtotime('-1 month'));
$InsurerName = $finalData[0][8] ?? "" ;
if (empty($InsurerName) || $InsurerName === 'N/A') {
$fileName = "Insurer_Policies_Details_{$monthName}.xlsx";
} else {
$cleanName = str_replace(' ', '_', strtolower(trim($InsurerName)));
$fileName = "{$cleanName}_Policies_Details_{$monthName}.xlsx";
}
$fileName = "Insurer_Policies_Details_{$monthName}.xlsx";
$titleName = str_replace(['_', '.xlsx'], [' ', ''], $fileName);
// --- CALL CENTRALIZED FUNCTION ---
@ -684,13 +671,7 @@ class ExcelExportController extends ResourceController
$PartnerName = $finalData[0][11] ?? '';
if (empty($PartnerName) || $PartnerName === 'N/A') {
$fileName = 'Performing_Partner_Policy_Details.xlsx';
} else {
$cleanName = str_replace(' ', '_', strtolower(trim($PartnerName)));
$cleanName = ucwords($cleanName);
$fileName = "Performing_Partner_({$cleanName})_Policy_Details.xlsx";
}
$fileName = 'Performing_Partner_Policy_Details.xlsx';
$titleName = str_replace(['_', '.xlsx'], [' ', ''], $fileName);
// --- CALL CENTRALIZED FUNCTION ---
@ -1025,14 +1006,7 @@ class ExcelExportController extends ResourceController
$monthName = ($month === 'current') ? date('M_Y') : date('M_Y', strtotime('-1 month'));
$cleanExec = str_replace(' ', '_', strtolower(trim($executiveName)));
$cleanVeh = str_replace(' ', '_', strtolower(trim($vehicleType)));
$parts = array_filter([$cleanExec, $cleanVeh]);
$prefix = !empty($parts) ? implode('_', $parts) . '_' : 'Staff_Product_';
$fileName = $prefix . "Policies_Details_" . $monthName . ".xlsx";
$fileName = "Sales_Executive_Product_Wise_" . $monthName . ".xlsx";
$titleName = str_replace(['_', '.xlsx'], [' ', ''], $fileName);
$this->streamExcelFile($header,$finalData,$titleName,$fileName,true);
@ -1424,6 +1398,7 @@ class ExcelExportController extends ResourceController
{
try{
$managerId = $this->request->getGet('manager_id');
$search = $this->request->getGet('search');
// --- ADDED VALIDATION (Simplified logic for clarity) ---
@ -1433,7 +1408,7 @@ class ExcelExportController extends ResourceController
return $this->response->setJSON(['status' => 'error', 'code' => 400, 'data' => [], 'message' => 'Missing required parameters', 'ref' => $ref])->setStatusCode(200);
}
$data = $this->getDataEndorsement($managerId);
$data = $this->getDataEndorsement($managerId,$search);
if (empty($data)) {
@ -1906,7 +1881,8 @@ class ExcelExportController extends ResourceController
$data = [];
try {
$customDate = date('Y-m-d');
$fromDate = date('Y-m-d', strtotime('-10 days'));
$toDate = date('Y-m-d');
$builder = $this->db->table('partner_policy pp');
@ -1920,8 +1896,11 @@ class ExcelExportController extends ResourceController
$builder->join('partner_agent pa', 'pp.agent_id = pa.id', 'inner');
$builder->join('partner_enquiry pe', 'pe.id = pp.enquiry_id', 'left');
$builder->where("MONTH(pp.issued_date) = MONTH('$customDate')", null, false);
$builder->where("YEAR(pp.issued_date) = YEAR('$customDate')", null, false);
// $builder->where("MONTH(pp.issued_date) = MONTH('$customDate')", null, false);
// $builder->where("YEAR(pp.issued_date) = YEAR('$customDate')", null, false);
$builder->where('pp.issued_date >=', $fromDate);
$builder->where('pp.issued_date <=', $toDate);
$builder->where('pp.manager_id',$manager_id);
@ -2335,7 +2314,7 @@ class ExcelExportController extends ResourceController
}
private function getDataEndorsement($managerId): array
private function getDataEndorsement($managerId, $search = ''): array
{
try {
@ -2354,31 +2333,63 @@ class ExcelExportController extends ResourceController
per.endorsement_description AS remarks,
CONCAT('₹ ', FORMAT(per.endorsement_premium, 2, 'en_IN')) AS premium_amount,
per.endorsement_premium AS raw_premium
FROM partner_endorsement_request AS per
FROM partner_endorsement_request per
LEFT JOIN partner_policy pp ON pp.agent_id = per.agent_id
LEFT JOIN partner_enquiry pe ON pe.agent_id = per.agent_id
LEFT JOIN partner_agent pa ON pa.id = per.agent_id
LEFT JOIN partner_staff ps ON ps.id = pe.assigned_to
LEFT JOIN insurers I ON I.id = pe.insurer_id
LEFT JOIN partner_endorsement_type_master petm ON petm.id = per.endorsement_type
WHERE per.manager_id = :manager_id:
AND per.is_active = 1
GROUP BY per.id";
WHERE per.manager_id = ?
AND per.is_active = 1";
$bindings = [$managerId];
if (!empty($search)) {
$searchTerm = '%' . strtolower(trim($search)) . '%';
$sql .= " AND (
LOWER(per.policy_from) LIKE ? OR
LOWER(per.status) LIKE ? OR
LOWER(pe.reg_no) LIKE ? OR
LOWER(I.name) LIKE ? OR
LOWER(pp.policy_number) LIKE ? OR
LOWER(petm.endorsement_type) LIKE ? OR
LOWER(per.endorsement_no) LIKE ?
)";
for ($i = 0; $i < 7; $i++) {
$bindings[] = $searchTerm;
}
}
// GROUP BY must be LAST
$sql .= " GROUP BY per.id";
$query = $this->db->query($sql, $bindings);
$results = $query->getResultArray();
// Convert associative rows to indexed rows (Excel-friendly)
$data = [];
foreach ($results as $row) {
$data[] = array_values($row);
}
// foreach ($results as $row) {
// foreach ($row as $key => $value) {
// if ($value === null || $value === '') {
// $row[$key] = '-';
// }
// }
// $data[] = array_values($row);
// }
$query = $this->db->query($sql, ['manager_id' => $managerId]);
$results = $query->getResultArray();
$data = [];
foreach ($results as $row) {
$data[] = array_values($row);
}
return $data;
return $data;
} catch (\Exception $e) {
log_message('error', 'Excel Fetch Error: ' . $e->getMessage());
throw $e;
throw $e;
}
}

View File

@ -30,64 +30,180 @@ class PolicyReportController extends Controller
}
// -----------------------------
// QUERY (100% Excel-aligned)
// 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,
// $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,
// 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.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,
// (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,
// 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,
// 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,
// 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();
// 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,
pq.insurance_plan_type_id AS plan_type,
pp.vehicle_type AS product,
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,
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,
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
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
@ -97,11 +213,11 @@ class PolicyReportController extends Controller
// EXACT HEADER FROM YOUR EXCEL
$headers = [
'POS CODE','POS NAME','REFF CODE','Inward Date','PARTNER NAME',
'Insurer','Policy No','Issured Name','PLAN TYPE','Product',
'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',
'ASSIDNED TO','SALES MANAGER','SALES EXECUTIVE','CONTACT NO',
'ADDRESS','PIN CODE','BOOKING STATUS','DATE OF BOOKING',
'BOOKING REF NO','GRID %','GRID AMT','REMARK'
];