CHANGE_LEAD_AND_RFQ_EB_CHANGES : RV

This commit is contained in:
VENKATESHWARAN 2025-08-13 13:56:04 +05:30
parent 2fde346d36
commit 290f93615e
4 changed files with 247 additions and 50 deletions

View File

@ -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');

View File

@ -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]];

View File

@ -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')

View File

@ -8,8 +8,8 @@
</div>
<div class="form-group col-md-3">
<label for="total_lives_at_incept" class="total_title"> Total Lives at Inception <span class="text-danger">*</span></label>
<input value="<?= isset($lead_edit_data['total_lives_at_incept']) ? $lead_edit_data['total_lives_at_incept'] : '' ?>" type="text" class="form-control" id="total_lives_at_incept" name="total_lives_at_incept[]" placeholder="Enter Lives" required>
<label for="total_lives_at_incept" class="total_title"> Total Lives at Inception <span class="text-danger"></span></label>
<input value="<?= isset($lead_edit_data['total_lives_at_incept']) ? $lead_edit_data['total_lives_at_incept'] : '' ?>" type="text" class="form-control" id="total_lives_at_incept" name="total_lives_at_incept[]" placeholder="Enter Lives" disabled>
</div>
<div class="form-group col-md-3 renewalFields">