diff --git a/app/Config/Routes.php b/app/Config/Routes.php index b26c46c4..0e9afd4a 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -578,6 +578,7 @@ $routes->group("/bdsReport", ["filter" => "authMVC"], function ($routes) { $routes->group("/ticket", ["filter" => "authMVC"], function ($routes) { $routes->match( ['get', 'post'], 'list','TicketController::ticketList'); $routes->get('feedback-list','TicketController::feedbackList'); + $routes->match(['get', 'post'], 'claim-upload','TicketController::claimDumpUpload'); $routes->get('remove','TicketController::removeTicket'); $routes->get('new/(:any)','TicketController::ticket_form/$1'); $routes->post('create','TicketController::createTicket'); diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php index b1db3311..9d7a4b2f 100644 --- a/app/Controllers/LeadsController.php +++ b/app/Controllers/LeadsController.php @@ -961,7 +961,7 @@ class LeadsController extends BaseController } - private function reorderProposalsByInsurerTotal(array $data): array + public function reorderProposalsByInsurerTotal(array $data): array { if (!isset($data['premium_data']['data'])) return $data; @@ -973,7 +973,7 @@ class LeadsController extends BaseController foreach ($original as $key => $value) { // Match only keys that look like 'Proposal X' - if (preg_match('/^(Proposal\s+\d+|Existing Renewal|Existing Rollover)$/', $key)) { + if (preg_match('/^(Proposal\s+\d+|Existing Renewal|Existing Rollover)$/', $key)) { // Get the insurer entry (not 'Quote Asked') foreach ($value as $subKey => $subVal) { if ($subKey !== 'Quote Asked' && isset($subVal['Total'])) { @@ -994,6 +994,18 @@ class LeadsController extends BaseController } } + foreach ($proposals as $proposalKey => &$proposal) { + $quoteAsked = $proposal['Quote Asked']; // Keep Quote Asked separately + unset($proposal['Quote Asked']); + + uasort($proposal, function ($a, $b) { + return $a['Total'] <=> $b['Total']; // Ascending by Total + }); + + // Add Quote Asked back at the top + $proposal = array_merge(['Quote Asked' => $quoteAsked], $proposal); + } + // Sort proposals by their insurer's total uasort($proposals, function ($a, $b) { $totalA = 0; @@ -1028,9 +1040,48 @@ class LeadsController extends BaseController return $data; } + $porposalData = $data['premium_data']['data']; $premiumProposals = array_keys($data['premium_data']['data']); $filteredProposals = []; + //Reorder the Insurer based on the Premium data insurer + foreach ($porposalData as $key => $value) { + + if(in_array($key, ['Particulars', ""])){ + continue; + } + + // Ensure the premium data is an array and not empty + if (!is_array($value) || empty($value)) { + continue; + } + + // Step 1: Get the premium display_name order (excluding "Quote Asked") + $premiumOrder = array_keys(array_diff_key($value, ["Quote Asked" => ""])); + + // Skip if no valid order found + if (empty($premiumOrder)) { + continue; + } + + // usort($data['proposal_data']['over_all_column_data'][$key]['insurers'], function($a, $b) use ($premiumOrder) { + // return array_search($a['display_name'], $premiumOrder) - array_search($b['display_name'], $premiumOrder); + // }); + + // Step 2: Reorder proposal insurers based on premium order + usort($data['proposal_data']['over_all_column_data'][$key]['insurers'], function($a, $b) use ($premiumOrder) { + $posA = array_search($a['display_name'] ?? '', $premiumOrder); + $posB = array_search($b['display_name'] ?? '', $premiumOrder); + + // If not found, push to the end + $posA = $posA === false ? PHP_INT_MAX : $posA; + $posB = $posB === false ? PHP_INT_MAX : $posB; + + return $posA - $posB; + }); + + } + // Collect proposal keys that match the pattern "Proposal X" foreach ($premiumProposals as $key) { if (preg_match('/^(Proposal\s+\d+|Existing Renewal|Existing Rollover)$/', $key) && isset($data['proposal_data']['over_all_column_data'][$key])) { @@ -1068,6 +1119,32 @@ class LeadsController extends BaseController } } + //Reorder the SubHeader of the Proposel + foreach ($sortedProposalOrder as $proposalKey => $proposalData) { + // Skip if insurers or subHeaders are missing + if ( + !isset($proposalData['insurers']) || + !is_array($proposalData['insurers']) || + !isset($proposalHeaders[$proposalKey]['subHeaders']) || + !is_array($proposalHeaders[$proposalKey]['subHeaders']) + ) { + continue; + } + + // Keep "Quote Asked" fixed at index 0 + $newSubHeaders = ["Quote Asked"]; + + // Add insurers in the sorted order + foreach ($proposalData['insurers'] as $insurer) { + if(in_array($insurer['display_name'], $proposalHeaders[$proposalKey]['subHeaders'])){ + $newSubHeaders[] = $insurer['display_name']; + } + } + + // Replace the subHeaders in the header array + $proposalHeaders[$proposalKey]['subHeaders'] = $newSubHeaders; + } + // dd($staticHeaders, $proposalHeaders, $sortedProposalOrder); // Step 2: Reorder headers @@ -1088,10 +1165,9 @@ class LeadsController extends BaseController } unset($value); - + //merge the all headers $reorderedHeaders = array_merge($staticHeaders, $reorderedHeaders, $actionHeader); - - + // Step 3: Reorder each row's `data` by matching parentth foreach ($dataRows as $dataRowIndex => &$row) { $staticData = []; @@ -1137,6 +1213,12 @@ class LeadsController extends BaseController } unset($value); + //Reorder the Row Data based on the Insurer + $reorderedProposalData = $this->reorderProposalRowData($reorderedProposalData, $proposalHeaders); + + + // print_rr($reorderedProposalData); die; + $row['data'] = array_merge($staticData, $reorderedProposalData, $actionData); } @@ -1151,6 +1233,45 @@ class LeadsController extends BaseController return $data; } + private function reorderProposalRowData(array $proposalRowData, array $proposalHeaderData): array + { + $newRowData = []; + + // Group rows by parentth + $groupedRows = []; + foreach ($proposalRowData as $row) { + if (!isset($row['parentth'])) { + continue; // skip invalid rows + } + $groupedRows[$row['parentth']][] = $row; + } + + // Reorder each group's rows based on header subHeaders + foreach ($proposalHeaderData as $proposalKey => $headerInfo) { + if ( + !isset($groupedRows[$proposalKey]) || + !isset($headerInfo['subHeaders']) || + !is_array($headerInfo['subHeaders']) + ) { + continue; + } + + $order = $headerInfo['subHeaders']; + $rows = $groupedRows[$proposalKey]; + + // Sort whole rows according to subth position in $order + usort($rows, function ($a, $b) use ($order) { + return array_search($a['subth'], $order) - array_search($b['subth'], $order); + }); + + // Append sorted rows to final array + $newRowData = array_merge($newRowData, $rows); + } + + return $newRowData; + } + + private function renumberProposalKeys(array $input): array { $result = []; @@ -1284,7 +1405,7 @@ class LeadsController extends BaseController $lead_data = [ 'Insured' => $rfq_data['client_name'], 'No of Employees at Inception' => $rfq_data['incept_emp_count'], - 'Total Sum Insured at Inception ' => $rfq_data['total_si_at_incept'], + // 'Total Sum Insured at Inception ' => $rfq_data['total_si_at_incept'], 'Policy Period' => !empty($rfq_data['policy_start_date']) && !empty($rfq_data['policy_end_date']) ? date('d-m-Y', strtotime($rfq_data['policy_start_date'])) . ' to ' . date('d-m-Y', strtotime($rfq_data['policy_end_date'])) : "To be decided", // 'Insurer' => $rfq_data['insurer_name'] ?? " - ", // 'TPA' => $rfq_data['tpa_name'] ?? " - ", @@ -1455,7 +1576,20 @@ class LeadsController extends BaseController ], ], ]); - $subheader_count = array_sum(array_map(fn($header) => count($header['subHeaders']), $data['table_data']['headers'])); + + if($type == 2){ + $subheader_count = array_sum( + array_map( + fn($header) => count(array_filter( + $header['subHeaders'], + fn($sub) => $sub !== "Quote Asked" + )), + $data['table_data']['headers'] + ) + ); + }else{ + $subheader_count = array_sum(array_map(fn($header) => count($header['subHeaders']), $data['table_data']['headers'])); + } if ($is_placement == false) { $subheader_count = $subheader_count - 2; @@ -1525,7 +1659,15 @@ class LeadsController extends BaseController } $startColumn = $columnLetter; // Start of the current header range - $subHeaderCount = count($header['subHeaders']); // Number of subheaders for this parent header + if($type == 2){ + $subHeaderCount = count(array_filter($header['subHeaders'], function($subHeader) { + return $subHeader !== "Quote Asked"; + })); + }else{ + $subHeaderCount = count($header['subHeaders']); // Number of subheaders for this parent header + } + + // Set parent header value if ($is_placement == true && !in_array($header['parentHeader'], ['Particulars', 'S.No.'])) { $sheet->setCellValue("{$startColumn}{$rowNumber}", "Terms"); @@ -1558,6 +1700,10 @@ class LeadsController extends BaseController // Add subheaders foreach ($header['subHeaders'] as $subHeader) { + if($type == 2 && in_array($subHeader, ['Quote Asked'])){ + continue; + } + if ($type == 2 && $is_placement == false) { $sheet->setCellValue("{$columnLetter}{$subHeaderRow}", $subHeader); } @@ -1625,6 +1771,10 @@ class LeadsController extends BaseController continue; } + if($type == 2 && in_array($cellData['subth'], ['Quote Asked'])){ + continue; + } + if ($cellData['parentth'] == 'Sno') { $sheet->setCellValue("{$columnLetter}{$rowNumber}", $serial_no); } else { @@ -1651,7 +1801,7 @@ class LeadsController extends BaseController //premium data if ($type == 2) { - if($is_placement == true){$columnLetterForPremium = "B";}else{$columnLetterForPremium = "C";} + if($is_placement == true){$columnLetterForPremium = "B";}else{$columnLetterForPremium = "B";} $rowNumber += 2; // Add premium data @@ -1665,20 +1815,20 @@ class LeadsController extends BaseController // $gstAmt = [$labelArray[1]]; // $total = [$labelArray[2]]; - if($is_placement == true){ + // if($is_placement == true){ $premium[] = $labelArray[0]; $gstAmt[] = $labelArray[1]; $total[] = $labelArray[2]; - } + // } foreach ($premiumData as $proposal => $insurers) { if ($proposal != 'Particulars') { foreach ($insurers as $insurer => $values) { if($insurer == 'Quote Asked'){ - $premium[] = count($insurers ?? []) > 1 ? $labelArray[0] : ""; + // $premium[] = count($insurers ?? []) > 1 ? $labelArray[0] : ""; // $gst[] = ""; - $gstAmt[] = count($insurers ?? []) > 1 ? $labelArray[1] : ""; - $total[] = count($insurers ?? []) > 1 ? $labelArray[2] : ""; + // $gstAmt[] = count($insurers ?? []) > 1 ? $labelArray[1] : ""; + // $total[] = count($insurers ?? []) > 1 ? $labelArray[2] : ""; }else{ $premium[] = formatIndianCurrency($values[$labelArray[0]]); // $gst[] = $values[$labelArray[1]]; diff --git a/app/Models/PolicyTransactionModel.php b/app/Models/PolicyTransactionModel.php index ba9b2fcd..c1249a7d 100644 --- a/app/Models/PolicyTransactionModel.php +++ b/app/Models/PolicyTransactionModel.php @@ -767,11 +767,17 @@ class PolicyTransactionModel extends Model ) AS unbilled_amt, created_user.first_name as user_name, CASE - WHEN `pt_co_share_details`.`co_share_type` IN (0, 1) THEN `policy_transaction`.`policy_no` - WHEN `pt_co_share_details`.`co_share_type` > 1 THEN `pt_co_share_details`.`follower_policy_no` - ELSE `policy_transaction`.`policy_no` -- Default fallback - END AS `policy_no` - + WHEN pt_co_share_details.co_share_type IN (0, 1) + THEN policy_transaction.policy_no + WHEN pt_co_share_details.co_share_type > 1 + THEN CASE + WHEN pt_co_share_details.follower_policy_no IS NULL + OR pt_co_share_details.follower_policy_no = '' + THEN policy_transaction.policy_no + ELSE pt_co_share_details.follower_policy_no + END + ELSE policy_transaction.policy_no + END AS policy_no ") ->join('pt_co_share_details', 'policy_transaction.id = pt_co_share_details.pt_id', 'left') // ->join('insurer_statements', 'pt_co_share_details.statement_id = insurer_statements.id', 'left') @@ -993,10 +999,17 @@ class PolicyTransactionModel extends Model DATE_FORMAT(policy_transaction.created_at, '%d %b %Y %h:%i %p') AS created_at, user_profiles.first_name as user_name, CASE - WHEN `pt_co_share_details`.`co_share_type` IN (0, 1) THEN `policy_transaction`.`policy_no` - WHEN `pt_co_share_details`.`co_share_type` > 1 THEN `pt_co_share_details`.`follower_policy_no` - ELSE `policy_transaction`.`policy_no` -- Default fallback - END AS `policy_no` + WHEN pt_co_share_details.co_share_type IN (0, 1) + THEN policy_transaction.policy_no + WHEN pt_co_share_details.co_share_type > 1 + THEN CASE + WHEN pt_co_share_details.follower_policy_no IS NULL + OR pt_co_share_details.follower_policy_no = '' + THEN policy_transaction.policy_no + ELSE pt_co_share_details.follower_policy_no + END + ELSE policy_transaction.policy_no + END AS policy_no ") ->join('pt_co_share_details', 'policy_transaction.id = pt_co_share_details.pt_id', 'left') ->join('clients', 'clients.id = policy_transaction.client_id', 'left') @@ -1068,7 +1081,7 @@ class PolicyTransactionModel extends Model { // dd($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer, $status); $builder = $this->db->table('policy_transaction') - ->select(' + ->select(" policy_transaction.*, clients.short_name as client_short_name, clients.client_code, @@ -1077,11 +1090,18 @@ class PolicyTransactionModel extends Model insurers.short_name AS insurer_short_name, policy_type.policy_type , CASE - WHEN `pt_co_share_details`.`co_share_type` IN (0, 1) THEN `policy_transaction`.`policy_no` - WHEN `pt_co_share_details`.`co_share_type` > 1 THEN `pt_co_share_details`.`follower_policy_no` - ELSE `policy_transaction`.`policy_no` -- Default fallback - END AS `policy_no` - ') + WHEN pt_co_share_details.co_share_type IN (0, 1) + THEN policy_transaction.policy_no + WHEN pt_co_share_details.co_share_type > 1 + THEN CASE + WHEN pt_co_share_details.follower_policy_no IS NULL + OR pt_co_share_details.follower_policy_no = '' + THEN policy_transaction.policy_no + ELSE pt_co_share_details.follower_policy_no + END + ELSE policy_transaction.policy_no + END AS policy_no + ") ->join('pt_co_share_details', 'policy_transaction.id = pt_co_share_details.pt_id', 'left') ->join('clients', 'policy_transaction.client_id = clients.id', 'left') ->join('client_branch', 'policy_transaction.client_branch_id = client_branch.id', 'left') @@ -1245,12 +1265,17 @@ class PolicyTransactionModel extends Model 2 ) AS variance_amt, CASE - WHEN `pt_co_share_details`.`co_share_type` IN (0, 1) THEN `policy_transaction`.`policy_no` - WHEN `pt_co_share_details`.`co_share_type` > 1 THEN `pt_co_share_details`.`follower_policy_no` - ELSE `policy_transaction`.`policy_no` -- Default fallback - END AS `policy_no` - - + WHEN pt_co_share_details.co_share_type IN (0, 1) + THEN policy_transaction.policy_no + WHEN pt_co_share_details.co_share_type > 1 + THEN CASE + WHEN pt_co_share_details.follower_policy_no IS NULL + OR pt_co_share_details.follower_policy_no = '' + THEN policy_transaction.policy_no + ELSE pt_co_share_details.follower_policy_no + END + ELSE policy_transaction.policy_no + END AS policy_no ") ->join('pt_co_share_details', 'policy_transaction.id = pt_co_share_details.pt_id', 'left') ->join('insurer_statements', 'pt_co_share_details.statement_id = insurer_statements.id', 'left') @@ -1348,10 +1373,17 @@ class PolicyTransactionModel extends Model 'pt_co_share_details.tep_amt', 'policy_transaction.status', 'CASE - WHEN `pt_co_share_details`.`co_share_type` IN (0, 1) THEN `policy_transaction`.`policy_no` - WHEN `pt_co_share_details`.`co_share_type` > 1 THEN `pt_co_share_details`.`follower_policy_no` - ELSE `policy_transaction`.`policy_no` -- Default fallback - END AS `policy_no`' + WHEN pt_co_share_details.co_share_type IN (0, 1) + THEN policy_transaction.policy_no + WHEN pt_co_share_details.co_share_type > 1 + THEN CASE + WHEN pt_co_share_details.follower_policy_no IS NULL + OR pt_co_share_details.follower_policy_no = "" + THEN policy_transaction.policy_no + ELSE pt_co_share_details.follower_policy_no + END + ELSE policy_transaction.policy_no + END AS policy_no' ]) ->join('pt_co_share_details', 'policy_transaction.id = pt_co_share_details.pt_id', 'left') ->join('clients', 'clients.id = policy_transaction.client_id', 'left') @@ -1443,10 +1475,17 @@ class PolicyTransactionModel extends Model pt_co_share_details.variance, policy_transaction.status, CASE - WHEN `pt_co_share_details`.`co_share_type` IN (0, 1) THEN `policy_transaction`.`policy_no` - WHEN `pt_co_share_details`.`co_share_type` > 1 THEN `pt_co_share_details`.`follower_policy_no` - ELSE `policy_transaction`.`policy_no` -- Default fallback - END AS `policy_no` + WHEN pt_co_share_details.co_share_type IN (0, 1) + THEN policy_transaction.policy_no + WHEN pt_co_share_details.co_share_type > 1 + THEN CASE + WHEN pt_co_share_details.follower_policy_no IS NULL + OR pt_co_share_details.follower_policy_no = '' + THEN policy_transaction.policy_no + ELSE pt_co_share_details.follower_policy_no + END + ELSE policy_transaction.policy_no + END AS policy_no ") ->join('pt_co_share_details', 'policy_transaction.id = pt_co_share_details.pt_id', 'left') ->join('clients', 'clients.id = policy_transaction.client_id', 'left') @@ -1554,11 +1593,18 @@ class PolicyTransactionModel extends Model AND inv_payment_details.is_active = 1 ), 2) AS outstanding_amount, - CASE - WHEN `pt_co_share_details`.`co_share_type` IN (0, 1) THEN `policy_transaction`.`policy_no` - WHEN `pt_co_share_details`.`co_share_type` > 1 THEN `pt_co_share_details`.`follower_policy_no` - ELSE `policy_transaction`.`policy_no` -- Default fallback - END AS `policy_no` + CASE + WHEN pt_co_share_details.co_share_type IN (0, 1) + THEN policy_transaction.policy_no + WHEN pt_co_share_details.co_share_type > 1 + THEN CASE + WHEN pt_co_share_details.follower_policy_no IS NULL + OR pt_co_share_details.follower_policy_no = '' + THEN policy_transaction.policy_no + ELSE pt_co_share_details.follower_policy_no + END + ELSE policy_transaction.policy_no + END AS policy_no ") ->join('pt_co_share_details', 'policy_transaction.id = pt_co_share_details.pt_id', 'left') ->join('insurer_statements', 'pt_co_share_details.statement_id = insurer_statements.id', 'left') diff --git a/app/Views/rfq/gpa.php b/app/Views/rfq/gpa.php index f02f24a6..a8cd08fc 100644 --- a/app/Views/rfq/gpa.php +++ b/app/Views/rfq/gpa.php @@ -8,8 +8,8 @@
- - + +