diff --git a/app/Config/Routes.php b/app/Config/Routes.php index b6d181b3..0c5f0d0c 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -52,6 +52,10 @@ $routes->get('/update-emp-policy-status', 'ClientController::updateEmpAndPolicyS $routes->get('download-e-card/(:any)', 'EmployeeController::generateIDCardForEmployee/$1'); $routes->get('download-kyc-docs/(:segment)', 'ClientController::downloadKYCDocument/$1'); $routes->get('claim-form-download/(:any)', 'TicketController::downloadClaimForm/$1'); +$routes->match (['get','post'],"claims-feedback-form/(:any)/(:any)", "TicketController::viewClaimFeedbackForm/$1/$2"); +$routes->match (['get','post'],"claims-feedback-form/(:any)", "TicketController::viewClaimFeedbackForm/$1"); + + $routes->group("/user", ["filter" => "authMVC"], function ($routes) { $routes->post("create", "UserController::create"); @@ -440,6 +444,9 @@ $routes->post("/employeeRest/verifyMpin", "RestAuthenticationController::verifyM $routes->post("/employeeRest/checkMpin", "RestAuthenticationController::checkMpin"); $routes->post("/employeeRest/verifyEmployeeEmailId", "RestAuthenticationController::verifyEmployeeWithEmailId"); $routes->post("/employeeRest/updateEmpOTP", "RestAuthenticationController::updateEmpOTP"); +$routes->post("/employeeRest/updateEmpMPIN", "RestAuthenticationController::updateEmpMPIN"); +// $routes->post("/employeeRest/saveMpin", "RestAuthenticationController::saveMpin"); + //HR login api's $routes->post("/employeeRest/verifyHrWithMobileNumber", "RestAuthenticationController::verifyHrWithMobileNumber"); @@ -460,6 +467,11 @@ $routes->group("/api", ["filter" => "authJWT"], function ($routes) { $routes->get('get_ticket_data',"EmployeeRestController::get_ticket_data"); }); +$routes->post("employeeRest/saveMpin", "RestAuthenticationController::saveMpin"); +$routes->post("employeeRest/updateMpin", "RestAuthenticationController::updateMpin"); + + + $routes->get("getEmployeePolicy", "EmployeeRestController::getEmployeePolicy"); $routes->get("getAddOnPolicy", "EmployeeRestController::getAddOnPolicy"); $routes->group("employeeRest", ["filter" => "authJWT"], function ($routes) { @@ -467,8 +479,7 @@ $routes->group("employeeRest", ["filter" => "authJWT"], function ($routes) { $routes->post("getVerifiedUserData", "RestAuthenticationController::getVerifiedUserData"); $routes->post("storeFireBase", "EmployeeRestController::storeFireBase"); - $routes->post("saveMpin", "RestAuthenticationController::saveMpin"); - $routes->post("updateMpin", "RestAuthenticationController::updateMpin"); + // $routes->post("updateMpin", "RestAuthenticationController::updateMpin"); $routes->post("getChatResponse", "ChatBotController::getChatResponse"); $routes->get("getEmployeeProfile", "EmployeeRestController::getEmployeeProfile"); @@ -526,6 +537,7 @@ $routes->group("/bdsReport", ["filter" => "authMVC"], function ($routes) { //New Tickets $routes->group("/ticket", ["filter" => "authMVC"], function ($routes) { $routes->match( ['get', 'post'], 'list','TicketController::ticketList'); + $routes->get('feedback-list','TicketController::feedbackList'); $routes->get('new/(:any)','TicketController::ticket_form/$1'); $routes->post('create','TicketController::createTicket'); $routes->post('update','TicketController::updateTicket'); diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 4ca4505d..0a096c82 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -3675,6 +3675,7 @@ class ClientController extends AdminController } } + //Function for get all client, branch and policy data public function getClientAndBranchAndPolicy() { // ---------for client----------------------------------------------------------------------------- @@ -3725,6 +3726,7 @@ class ClientController extends AdminController policy_type.iep, policy_type.itp, policy_type.bap, + policy_type.allocg, DATE_FORMAT(client_policy.policy_start_date, '%d/%m/%Y') as policy_start_date, DATE_FORMAT(client_policy.policy_end_date, '%d/%m/%Y') as policy_end_date ") @@ -4713,8 +4715,42 @@ class ClientController extends AdminController // dd($data); - // $LeadsController = new LeadsController(); - // $LeadsController->constructNonEbExcelToSaveTemp(92, 2, "Proposal 2-ICICIPRU-ICICI001"); + $LeadsController = new LeadsController(); + $RFQModel = new RFQModel(); + // $path = $LeadsController->constructNonEbExcelToSaveTemp(106, 2, "Proposal 2-ICICIPRU-ICICI001"); + // $filepath = $path['filePath']; + + // if (file_exists($filepath)) { + // // Set headers to force download + // header('Content-Description: File Transfer'); + // header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + // header('Content-Disposition: attachment; filename="' . basename($filepath) . '"'); + // header('Content-Length: ' . filesize($filepath)); + // header('Pragma: public'); + + // // Output the file content + // readfile($filepath); + + // // Delete the file after download + // unlink($filepath); + + // exit; + // } else { + // echo "File does not exist."; + // } + + // $data = $this->leadsModel->where('leads.id', 125)->where('leads.is_active', 1)->first(); + // $RFQdata = $RFQModel->getRFQTableDataWithLeadIDAndType(125, 2); + // // Kint::dump($RFQdata); + // $returnData = $LeadsController->getPlacementJson($data); + // Kint::dump($returnData); + // $policy_terms = $LeadsController->convertNonEbQCRJsonToPolicyTerms(json_decode($returnData, true)); + // Kint::dump($policy_terms); + + // // $this->clientPolicyModel->where('id', 6050)->set('placement_json', $returnData)->update(); + // $this->clientPolicyModel->where('id', 6050)->set('policy_terms', $policy_terms)->update(); + // dd($returnData); + } // ------------------------------------------------------------------------------------------------------- diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php index 6857487a..30f012b7 100755 --- a/app/Controllers/EmployeeController.php +++ b/app/Controllers/EmployeeController.php @@ -360,12 +360,13 @@ class EmployeeController extends AdminController batch_files.status, batch_files.client_branch_id, - CASE - WHEN batch_files.status = 'partially success' THEN - batch_files.error_data + CASE + WHEN batch_files.status = 'partially success' OR batch_files.status = 'in-progress-partially' THEN + batch_files.error_data ELSE - error_data = null - END AS error_data, + NULL + END AS error_data, + clients.short_name as client_short_name, client_branch.branch_name, diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index 2d7bf436..e86f5de7 100755 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -3112,6 +3112,8 @@ class EmployeeRestController extends AdminController } + // ---------------- TICKET API's --------------------------------------------------------------------------------------------------- + //Get Data from post for inserting ticket and message public function initiateClaim() { @@ -3171,22 +3173,27 @@ class EmployeeRestController extends AdminController ->first()['id']; $fetchData['priority'] = 1; - $fetchData['mode_of_intimation'] = 1; + $fetchData['mode_of_intimation'] = 3; + $fetchData['claim_type'] = 1; $fetchData = array_merge($fetchData, $received_data); + $fetchData['relationship'] = strtolower($fetchData['relationship']) ?? $fetchData['relationship']; // print_r($fetchData); die; $insert_status = $this->ticketMaster->insert($fetchData); $ticket_id = $this->ticketMaster->insertID(); if ($insert_status && !empty($ticket_id)) { + //insert first history + $this->ticketController->putHistoryAfterInsert($fetchData, $ticket_id); + $messagesData = [ 'ticket_id' => $ticket_id ?? null, 'sender' => 'user', 'claim_status' => $fetchData['claim_status_id'] ?? null, 'emp_mail' => $fetchData['emp_mail'] ?? null, - 'mail_subject' => $fetchData['subject'] ?? null, - 'mail_content' => $fetchData['message'] ?? null, + 'mail_subject' => $fetchData['subject'] ?? "New Claim", + 'mail_content' => $fetchData['message'] ?? "New Claim", ]; if (!empty($messagesData['ticket_id'])) { diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php index 8d926761..1c5e9f80 100644 --- a/app/Controllers/LeadsController.php +++ b/app/Controllers/LeadsController.php @@ -177,7 +177,7 @@ class LeadsController extends BaseController { $data = $this->request->getPost(); - if ($data['lead_type'] == 2) { + if ($data['lead_type'] != 1) { $client_data = $this->clientModel->where('id', $data['client_id'])->where('is_active', 1)->first(); $data['client_name'] = $client_data['client_name']; $data['client_short_name'] = $client_data['short_name']; @@ -549,7 +549,7 @@ class LeadsController extends BaseController // dd($lead_data); - if ($lead_data['lead_type'] == 2) { + if ($lead_data['lead_type'] != 1) { $client_policy_data = $this->clientPolicyModel->where('is_active', 1)->where('id', $lead_data['source_policy_id'])->first(); $data['policy_terms'] = $client_policy_data['policy_terms']; } @@ -576,7 +576,7 @@ class LeadsController extends BaseController $data['subject'] = $this->transformMailContent($lead_data, $subject, $data['page_name']); - // dd($data); + if ($data['lead_data']['lead_form_type'] == 1) { $this->loadLayout('view_rfq.php', $data); @@ -584,10 +584,20 @@ class LeadsController extends BaseController $data['occupancy'] = $this->occupancyModel->findAll(); // dd($data['occupancy']); - $data['policies'] = json_decode($data['question_json'], true)['policies']; - $data["child_table_data"] = json_decode($data['question_json'], true)['child_table_data']; + + if($lead_data['lead_type'] != 1 && $data['rfq_count'] == 0){ + $client_policy_data = $this->clientPolicyModel->where('is_active', 1)->where('id', $lead_data['source_policy_id'])->first(); + $data['rfq_data']['json'] = $client_policy_data['placement_json']; + } + + if(!empty($data['question_json'])){ + $data['policies'] = json_decode($data['question_json'], true)['policies']; + $data["child_table_data"] = json_decode($data['question_json'], true)['child_table_data']; + } + // $data['lead_register_data'] = json_decode($data['lead_data']['custom_fields']); // dd($data['lead_register_data']); + // dd($data); $data['client_type'] = $this->clientType; $data['buisness_type'] = $this->buisnessType; $this->loadLayout('view_rfq_non_eb', $data); @@ -681,6 +691,7 @@ class LeadsController extends BaseController ], 200); } + public function createQCR() { @@ -857,6 +868,7 @@ class LeadsController extends BaseController $data = $this->convertJsonForQCR($data, $type); // dd($data); } + // dd($data); $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); @@ -1022,7 +1034,7 @@ class LeadsController extends BaseController // Merge header cells if it spans multiple subheaders if ($subHeaderCount > 1) { - $endColumn = chr(ord($startColumn) + $subHeaderCount - 1); // Calculate the end column + $endColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($startColumn) + $subHeaderCount - 1); $sheet->mergeCells("{$startColumn}{$rowNumber}:{$endColumn}{$rowNumber}"); } else { $endColumn = $startColumn; // No merge needed if only one subheader @@ -1050,7 +1062,8 @@ class LeadsController extends BaseController } // Apply border to the header range - $headerRange = "A{$rowNumber}:" . chr(ord($columnLetter) - 1) . "{$subHeaderRow}"; + $prevColumn1 = $this->getPreviousColumn($columnLetter); + $headerRange = "A{$rowNumber}:" . "{$prevColumn1}" . "{$subHeaderRow}"; $sheet->getStyle($headerRange)->applyFromArray([ 'borders' => [ 'allBorders' => [ @@ -1089,7 +1102,8 @@ class LeadsController extends BaseController $serial_no++; } - $dataRange = "A" . ($subHeaderRow + 1) . ":" . chr(ord($columnLetter) - 1) . ($rowNumber - 1); + $prevColumn2 = $this->getPreviousColumn($columnLetter); + $dataRange = "A" . ($subHeaderRow + 1) . ":" . "{$prevColumn2}" . ($rowNumber - 1); $sheet->getStyle($dataRange)->applyFromArray([ 'borders' => [ 'allBorders' => [ @@ -1136,7 +1150,8 @@ class LeadsController extends BaseController $rowNumber++; } - $premiumRange = "B" . ($rowNumber - 4) . ":" . chr(ord($columnLetter) - 2) . ($rowNumber - 1); + $prevColumn3 = $this->getPreviousColumn($columnLetter, 2); + $premiumRange = "B" . ($rowNumber - 4) . ":" . "{$prevColumn3}" . ($rowNumber - 1); // dd($premiumRange); $sheet->getStyle($premiumRange)->applyFromArray([ 'borders' => [ @@ -2271,8 +2286,6 @@ class LeadsController extends BaseController 'policy_status' => 1, ]; - $terms = $this->preparePolicyTermsFromRFQ($data); - $policy_type_id = $data['policy_type_id']; if (in_array($policy_type_id, [1, 2, 6, 7])) { $client_policy_data['is_addon'] = 1; // Base Policy @@ -2286,8 +2299,17 @@ class LeadsController extends BaseController // } } - $client_policy_data['policy_terms'] = $this->preparePolicyTermsFromRFQ($data); + if($data['lead_form_type'] == 1){ + $client_policy_data['policy_terms'] = $this->preparePolicyTermsFromRFQ($data); + }else{ + $placementJson = $this->getPlacementJson($data); + if ($placementJson) { + $client_policy_data['placement_json'] = $placementJson; + $client_policy_data['policy_terms'] = $this->convertNonEbQCRJsonToPolicyTerms(json_decode($placementJson, true)); + } + + } // print_r($client_policy_data); die; return $client_policy_data; @@ -2297,7 +2319,7 @@ class LeadsController extends BaseController { $proposel_data = json_decode($data['proposel_data'], true); - $QCRData = $this->RFQModel->where('is_active', 1)->where('type', 2)->where('lead_id', $data['id'])->first(); + $QCRData = $this->RFQModel->where('is_active', 1)->where('lead_id', $data['id'])->first(); $JSON = json_decode($QCRData['json'], true); @@ -2384,6 +2406,53 @@ class LeadsController extends BaseController return json_encode($terms_array); } + public function convertNonEbQCRJsonToPolicyTerms($allTableData) + { + + if (!empty($allTableData)) { + + array_pop($allTableData); // Remove the last item from the array + $terms_array = []; + + foreach ($allTableData as $TableIndex => $tableGroup) { + + if ($TableIndex == 0) { + continue; + } + + foreach ($tableGroup['table_data']['data'] as $dataRow) { + $item = $dataRow['items'] ?? ''; + + foreach ($dataRow['data'] as $cellData) { + $parentth = $cellData['parentth'] ?? ''; + $subth = $cellData['subth'] ?? ''; + $value = $cellData['display_content'] ?? ''; + + // Skip unwanted keys + if (in_array($parentth, ['SNO', 'Particulars', 'Action']) || $subth === 'Quote Asked') { + continue; + } + + // Skip if item matches parentth + if ($item === $parentth) { + continue; + } + + // Set the value directly, overwriting with latest encountered + if (!empty($item) && !empty($value)) { + $terms_array[$item] = $value; + } + } + } + } + + return json_encode($terms_array); + + } else { + return null; + } + } + public function featchClientPolicyFromLead($client_id, $branch_id, $lead_id) { $data = $this->leadsModel->where('leads.id', $lead_id)->where('leads.is_active', 1)->first(); @@ -2404,6 +2473,58 @@ class LeadsController extends BaseController return $this->respond(['status' => false, 'message' => 'Failed to create policy', 'data' => $data], 200); } + public function getPlacementJson(array $data): ?string + { + $proposel_data = json_decode($data['proposel_data'], true); + + $QCRData = $this->RFQModel + ->where('is_active', 1) + ->where('lead_id', $data['id']) + ->first(); + + if (!$QCRData || empty($QCRData['json'])) { + return null; + } + + $jsonArray = json_decode($QCRData['json'], true); + $proposalData = array_pop($jsonArray); // Get last item and remove it from the array + + if (empty($jsonArray)) { + return null; + } + + $placement_json_data = array_map(function ($jsonData) use ($proposel_data) { + return $this->transformNonEbProposelData( + $jsonData, + $proposel_data['proposel_name'] ?? '', + $proposel_data['insurer_name'] ?? '', null, 1 + ); + }, $jsonArray); + + if (!empty($proposalData)) { + foreach ($proposalData['proposal_data']['over_all_column_data'] as $key => &$proposal) { + // Keep only the required proposal + if ($key !== $proposel_data['proposel_name']) { + unset($proposalData['proposal_data']['over_all_column_data'][$key]); + } else { + // Within the matched proposal, filter insurers + if (!empty($proposal['insurers'])) { + $proposal['insurers'] = array_values(array_filter($proposal['insurers'], function ($insurer) use ($proposel_data) { + return $insurer['display_name'] === $proposel_data['insurer_name']; + })); + } + } + } + unset($proposal); // Good practice after foreach by reference + } + + + $placement_json_data[] = $proposalData; + + return json_encode($placement_json_data); + } + + //------------------------------------------------------------------------------------------------ @@ -2652,6 +2773,7 @@ class LeadsController extends BaseController // Initialize max width tracking variables $maxWidthB = 0; + //Lead Data foreach ($lead_data as $key => $value) { $formattedKey = ucwords(str_replace('_', ' ', $key)); @@ -2692,9 +2814,113 @@ class LeadsController extends BaseController $sheet->getColumnDimension('C')->setWidth($maxWidthB * 1.2); $rowNumber += 2; + //Policy Registration + if (!empty($policy_registration_data)) { + foreach ($policy_registration_data as $key => $value) { - // Kint::dump($jsonData); + $startRow = $rowNumber; // Track where the block starts + // Title Row + $titleMergeRangeKey = "A{$rowNumber}:C{$rowNumber}"; + $sheet->mergeCells($titleMergeRangeKey); + $sheet->setCellValue("A{$rowNumber}", ucfirst($key) . " Policy Details"); + + // Title Style + $sheet->getStyle($titleMergeRangeKey)->applyFromArray([ + 'font' => ['bold' => true], + 'alignment' => [ + 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, + 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER, + ], + 'fill' => [ + 'fillType' => Fill::FILL_SOLID, + 'startColor' => ['rgb' => 'ADD8E6'], + ], + ]); + + $rowNumber++; // Move to next row + + // Policy Type + if (isset($value['policyType'])) { + $sheet->mergeCells("A{$rowNumber}:B{$rowNumber}"); + $sheet->setCellValue("A{$rowNumber}", "Policy Type"); + $sheet->setCellValue("C{$rowNumber}", $value['policyType']); + + $sheet->getStyle("A{$rowNumber}:C{$rowNumber}")->applyFromArray([ + 'font' => ['bold' => true], + 'alignment' => [ + 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, + 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER, + ], + ]); + + $rowNumber++; + }else{ + $sheet->mergeCells("A{$rowNumber}:B{$rowNumber}"); + $sheet->setCellValue("A{$rowNumber}", "Policy Type"); + $sheet->setCellValue("C{$rowNumber}", ucfirst($key) . " Policy"); + + $sheet->getStyle("A{$rowNumber}:C{$rowNumber}")->applyFromArray([ + 'font' => ['bold' => true], + 'alignment' => [ + 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, + 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER, + ], + ]); + + $rowNumber++; + } + + // Type of Business & Nature of Business + if (isset($value['productSelection']) && !empty($value['productSelection'])) { + // Type of Business + $sheet->mergeCells("A{$rowNumber}:B{$rowNumber}"); + $sheet->setCellValue("A{$rowNumber}", "Type of Business"); + $sheet->setCellValue("C{$rowNumber}", $this->buisnessType[$value['productSelection']['type_of_buisness']] ?? ''); + + $sheet->getStyle("A{$rowNumber}")->applyFromArray([ + 'font' => ['bold' => true], + 'alignment' => [ + 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, + 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER, + ], + ]); + + $rowNumber++; + + // Nature of Business + $sheet->mergeCells("A{$rowNumber}:B{$rowNumber}"); + $sheet->setCellValue("A{$rowNumber}", "Nature of Business"); + $sheet->setCellValue("C{$rowNumber}", $value['productSelection']['buisness_nature'] ?? ''); + + $sheet->getStyle("A{$rowNumber}")->applyFromArray([ + 'font' => ['bold' => true], + 'alignment' => [ + 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, + 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER, + ], + ]); + + $rowNumber++; + } + + $endRow = $rowNumber - 1; // Block ends at previous row + + // Apply border to the whole block + $sheet->getStyle("A{$startRow}:C{$endRow}")->applyFromArray([ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['argb' => '000000'], + ], + ], + ]); + + $rowNumber += 2; // Add space before the next block + } + } + + //Table Data foreach ($jsonData as $key => $data) { // Kint::dump($data, 'First'); @@ -2768,7 +2994,7 @@ class LeadsController extends BaseController // Merge header cells if it spans multiple subheaders if ($subHeaderCount > 1) { - $endColumn = chr(ord($startColumn) + $subHeaderCount - 1); // Calculate the end column + $endColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($startColumn) + $subHeaderCount - 1); $sheet->mergeCells("{$startColumn}{$rowNumber}:{$endColumn}{$rowNumber}"); } else { $endColumn = $startColumn; // No merge needed if only one subheader @@ -2796,7 +3022,8 @@ class LeadsController extends BaseController } // Apply border to the header range - $headerRange = "A{$rowNumber}:" . chr(ord($columnLetter) - 1) . "{$subHeaderRow}"; + $prevColumn4 = $this->getPreviousColumn($columnLetter); + $headerRange = "A{$rowNumber}:" . "{$prevColumn4}" . "{$subHeaderRow}"; $sheet->getStyle($headerRange)->applyFromArray([ 'borders' => [ 'allBorders' => [ @@ -2812,13 +3039,17 @@ class LeadsController extends BaseController $rowNumber = $subHeaderRow + 2; $column_data = $data['table_data']['data']; + // dd($column_data); $serial_no = 1; $maxColumnWidths = []; - + $RowSpanEnable = false; + // Add table data rows foreach ($column_data as $dataRow) { $columnLetter = 'A'; + $hasPolicy = in_array('Policy', array_column($dataRow['data'], 'parentth')); + // Kint::dump($hasPolicy); foreach ($dataRow['data'] as $cellData) { @@ -2837,16 +3068,31 @@ class LeadsController extends BaseController $sheet->getStyle("{$columnLetter}{$mergeStart}:{$columnLetter}{$mergeEnd}") ->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER); } else { - $sheet->setCellValue("{$columnLetter}{$rowNumber}", $cellData['display_content']); + if(!$hasPolicy && $key == 0){ + $RowSpanEnable = true; + $columnLetter++; + $sheet->setCellValue("{$columnLetter}{$rowNumber}", $cellData['display_content']); + }else{ + $sheet->setCellValue("{$columnLetter}{$rowNumber}", $cellData['display_content']); + } } - $columnLetter++; + if (!($key === 0 && !$hasPolicy)) { + $columnLetter++; + } + } $rowNumber++; $serial_no++; } - $dataRange = "A" . ($subHeaderRow + 1) . ":" . chr(ord($columnLetter) - 1) . ($rowNumber - 1); + if($key == 0 && $RowSpanEnable == true){ + $columnLetter++; + } + + // dd($columnLetter); + $prevColumn5 = $this->getPreviousColumn($columnLetter); + $dataRange = "A" . ($subHeaderRow + 1) . ":" . "{$prevColumn5}" . ($rowNumber - 1); $sheet->getStyle($dataRange)->applyFromArray([ 'borders' => [ 'allBorders' => [ @@ -2991,8 +3237,12 @@ class LeadsController extends BaseController } // Row-wise Check: Remove rows if qcr == 0 for actions + $groupedRows = []; foreach ($first_json['table_data']['data'] as $rowKey => $rowData) { - foreach ($rowData['data'] as $data) { + + $groupedRows[$rowData['row_id']][] = $rowData; + + foreach ($rowData['data'] as $keyIndex => $data) { if ($indexOfTheTable == 0) { @@ -3013,6 +3263,42 @@ class LeadsController extends BaseController } } + $finalRows = []; + + if (!empty($groupedRows)) { + + // Loop through each row_id group and check for Policy status + foreach ($groupedRows as $rowId => $rows) { + $hasPolicy = false; + $isChecked = false; + + foreach ($rows as $row) { + foreach ($row['data'] as $cell) { + if ($cell['parentth'] === 'Policy') { + $hasPolicy = true; + if (trim(strtolower($cell['input_value'])) === 'checked') { + $isChecked = true; + } + break 2; // Found Policy, no need to continue further + } + } + } + + // Step 3: If parent Policy is "Checked", retain the entire group + if (!$hasPolicy || $isChecked) { + foreach ($rows as $r) { + $finalRows[] = $r; + } + } + } + + if (!empty($finalRows)) { + // Update the original data + $first_json['table_data']['data'] = array_values($finalRows); + } + } + + // Reindex arrays to maintain proper structure $first_json['table_data']['headers'] = array_values($first_json['table_data']['headers']); $first_json['table_data']['data'] = array_values($first_json['table_data']['data']); @@ -3033,6 +3319,7 @@ class LeadsController extends BaseController } //Remove insurer Row wise data for RFQ + $groupedRows = []; foreach ($first_json['table_data']['data'] as &$row) { // Filter the inner data array @@ -3044,11 +3331,48 @@ class LeadsController extends BaseController ); $row['data'] = array_values($row['data']); - } + $groupedRows[$row['row_id']][] = $row; + } // Ensure to unset the reference after the loop unset($row); + + $finalRows = []; + + if (!empty($groupedRows)) { + + // Loop through each row_id group and check for Policy status + foreach ($groupedRows as $rowId => $rows) { + $hasPolicy = false; + $isChecked = false; + + foreach ($rows as $row) { + foreach ($row['data'] as $cell) { + if ($cell['parentth'] === 'Policy') { + $hasPolicy = true; + if (trim(strtolower($cell['input_value'])) === 'checked') { + $isChecked = true; + } + break 2; // Found Policy, no need to continue further + } + } + } + + // Step 3: If parent Policy is "Checked", retain the entire group + if (!$hasPolicy || $isChecked) { + foreach ($rows as $r) { + $finalRows[] = $r; + } + } + } + + if (!empty($finalRows)) { + // Update the original data + $first_json['table_data']['data'] = array_values($finalRows); + } + } + // Remove insurers from Proposal Data key for RFQ foreach ($proposeldata['proposal_data']['over_all_column_data'] as $key => &$proposal) { if (isset($proposal['insurers'])) { @@ -3060,12 +3384,12 @@ class LeadsController extends BaseController // Ensure to reset the reference unset($proposal); } - return $first_json; + return $first_json; return null; } - public function transformNonEbProposelData(&$data, $proposal, $insurer, $tableCount) + public function transformNonEbProposelData(&$data, $proposal, $insurer, $tableCount=null, $actionColumn = null) { // Kint::dump($data, $proposal, $insurer, $tableCount); @@ -3102,6 +3426,13 @@ class LeadsController extends BaseController // Update the original data's headers $data['table_data']['headers'] = $headerData; + if(!empty($actionColumn)){ + $data['table_data']['headers'][] = [ + 'parentHeader' => "Action", + 'subHeaders' => ['-'] + ]; + } + foreach ($data['table_data']['data'] as &$entry) { $sno = $entry['SNO']; @@ -3126,6 +3457,12 @@ class LeadsController extends BaseController if ($item['parentth'] === $proposal && $item['subth'] === $insurer) { $filteredData[] = $item; } + + if(!empty($actionColumn)){ + if($item['parentth'] === "Action"){ + $filteredData[] = $item; + } + } } // Update the entry with filtered data @@ -3139,5 +3476,20 @@ class LeadsController extends BaseController // kint::dump($data); return $data; } + + // function getPreviousColumn($columnLetter) + // { + // $colIndex = Coordinate::columnIndexFromString($columnLetter); + // if ($colIndex > 1) { + // $colIndex--; + // } + // return Coordinate::stringFromColumnIndex($colIndex); + // } + + function getPreviousColumn($columnLetter, $decrement = 1) { + $colIndex = Coordinate::columnIndexFromString($columnLetter); + $colIndex = max(1, $colIndex - $decrement); // ensure column index doesn't go below 1 + return Coordinate::stringFromColumnIndex($colIndex); + } } diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php index 2c40bd30..3f7f36df 100644 --- a/app/Controllers/PolicyTransactionController.php +++ b/app/Controllers/PolicyTransactionController.php @@ -418,7 +418,7 @@ class PolicyTransactionController extends BaseController // die; if(isset($data['co_share_id']) && !empty($data['co_share_id'])){ - $this->removePtCoShareRecords($data['co_share_id']); + $this->removePtCoShareRecords($data['co_share_id'], $pt_id); } if(isset($data['follow_insurer_id'])){ @@ -967,21 +967,26 @@ class PolicyTransactionController extends BaseController } //function for soft delete for pt_co_share_details records - public function removePtCoShareRecords($primaryKeys) + public function removePtCoShareRecords($primaryKeys, $pt_id) { - // print_r($primaryKeys); die; if (empty($primaryKeys)) { return false; } - // Convert array to a comma-separated string for query binding + // Convert array to a comma-separated string of placeholders for query binding $placeholders = implode(',', array_fill(0, count($primaryKeys), '?')); - $sql = "UPDATE pt_co_share_details SET is_active = 0 WHERE id NOT IN ($placeholders)"; - - return db_connect()->query($sql, $primaryKeys); + // Prepare the query with proper binding + $sql = "UPDATE pt_co_share_details SET is_active = 0 WHERE pt_id = ? AND id NOT IN ($placeholders)"; + + // Merge pt_id with primary keys for binding + $params = array_merge([$pt_id], $primaryKeys); + + // Execute the query with bound parameters + return db_connect()->query($sql, $params); } + //------------------------------------------------------------------------------------------------ diff --git a/app/Controllers/RestAuthenticationController.php b/app/Controllers/RestAuthenticationController.php index 27114883..77c6854c 100755 --- a/app/Controllers/RestAuthenticationController.php +++ b/app/Controllers/RestAuthenticationController.php @@ -178,6 +178,46 @@ class RestAuthenticationController extends AdminController } + public function updateEmpMPIN() + { + $requestData = $this->request->getJSON(); + $mobile_number = $requestData->mobile_number ?? null; + $email_id = $requestData->email_id ?? null; + $new_mpin = $requestData->new_mpin ?? $requestData->mpin ?? null; + $old_mpin = $requestData->old_mpin ?? null; + + if (!$new_mpin) { + return $this->response->setJSON(['status' => false, 'message' => 'MPIN is required.']); + } + + $query = $this->employeeModel->where('relationship', 'self'); + + if ($mobile_number) { + $query->where('mobile', $mobile_number); + } elseif ($email_id) { + $query->where('email_corporate', $email_id); + } else { + return $this->response->setJSON(['status' => false, 'message' => 'Mobile number or Email ID is required.']); + } + + if (!empty($old_mpin)) { + $query->where('mpin', $old_mpin); + } + + // Fetch employee data + $employeeData = $query->first(); + + if (!$employeeData) { + return $this->response->setJSON(['status' => false, 'message' => 'Employee not found or invalid MPIN.']); + } + + // Update MPIN + $updated = $this->employeeModel->update($employeeData['id'], ['mpin' => $new_mpin]); + + return true; + } + + public function getVerifiedUserData() { @@ -401,15 +441,14 @@ class RestAuthenticationController extends AdminController $mobile_number = isset($this->request->getJSON()->mobile_number) ? $this->request->getJSON()->mobile_number : null; $email_id = isset($this->request->getJSON()->email_id) ? $this->request->getJSON()->email_id : null; $mpin = $this->request->getJSON()->mpin; - if (isset($mobile_number)) { $employeeData = $this->employeeModel->where('mobile', $mobile_number)->where('relationship', 'self')->first(); }else{ $employeeData = $this->employeeModel->where('email_corporate', $email_id)->where('relationship', 'self')->first(); } - if ($employeeData && $mpin == $employeeData["mpin"]) { + $auth = HttpRequestHelper::getRequestInfo(); if ($auth) { $data = [ @@ -427,6 +466,7 @@ class RestAuthenticationController extends AdminController $result = JWTToken::encode($employeeData); + // $result = $employeeData; return $this->respond(['status' => 'success','code' => 200,'data' => $result],200); } else { return $this->respond(['status' => 'failed','code' => 404,'data' => "Invalid OTP"],200); @@ -441,7 +481,7 @@ class RestAuthenticationController extends AdminController try { $mobile_number = isset($this->request->getJSON()->mobile_number) ? $this->request->getJSON()->mobile_number : null; $email_id = isset($this->request->getJSON()->email_id) ? $this->request->getJSON()->email_id : null; - $mpin = $this->request->getJSON()->mpin; + // $mpin = $this->request->getJSON()->mpin; if (isset($mobile_number)) { diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php index a7392860..ec574927 100644 --- a/app/Controllers/TicketController.php +++ b/app/Controllers/TicketController.php @@ -120,6 +120,8 @@ class TicketController extends BaseController '((POLICY_TYPE))' => 'policy_type', '((AUTO_QUERY_CONTENT))' => 'auto_query_content', '((CLAIM_FORM_LINK))' => 'claim_form_link', + '((CLAIM_FEEDBACK_FORM))' => 'claim_feedback_form', + '((SETTLED_LETTER))' => 'settle_letter', ]; $this->extraFields = [ 1 => ['non_id_reason'], @@ -232,7 +234,9 @@ class TicketController extends BaseController 'tcs.claim_status AS status', 'tm.claim_number AS claim_no', 'tm.tpa_id', + 'tm.tpa_no', 'tm.emp_name', + 'tm.emp_code', 'i.name AS insurer_name', 'c.client_name', 'tm.insured_name', @@ -272,7 +276,9 @@ class TicketController extends BaseController 'tm.claim_status_id', 'tm.is_head_approved', 'tm.tpa_id', + 'tm.tpa_no', 'tm.emp_name', + 'tm.emp_code', 'i.name AS insurer_name', 'c.client_name', 'tm.insured_name', @@ -456,7 +462,18 @@ class TicketController extends BaseController $data['placeHolders'] = $this->placeHolders; $data['message_data'] = $this->getTicketMessage($ticket_id); $data['view_ticket_page'] = []; - $data['member_data'] = $this->employeeModel->getEmployeeByEmployeeCode($ticket_data['emp_code']); + + if($ticket_data['ticket_type_id'] == 1){ + $data['member_data'] = $this->employeeModel->getEmployeeByEmployeeCode($ticket_data['emp_code']); + }else{ + $data['member_data'] = array_filter( + $this->employeeModel->getEmployeeByEmployeeCode($ticket_data['emp_code']), + function ($member) { + return isset($member['emp_relationship']) && $member['emp_relationship'] == 'Self'; + } + ); + } + $data['ticket_history'] = $this->ticketHistory($ticket_id); $data['ticket_check_list'] = db_connect()->table('ticket_check_list')->where('is_active', 1)->where('ticket_type_id', $ticket_data['ticket_type_id'])->get()->getResultArray(); if (!empty($ticket_data['client_policy_id'])){ @@ -578,7 +595,9 @@ class TicketController extends BaseController $return_value = $this->ticketMasterModel->insert($ticket_data); if ($return_value) { //mail trigger part + $this->putHistoryAfterInsert($ticket_data, $return_value); $mail_responce = $this->sendAutoMailTrigger($return_value); + $this->autoMessageInsertBasedOnMailResponse($mail_responce, $return_value); return $this->respond(['status' => true, 'ticket_id' => $return_value, 'code' => 200, 'data' => $ticket_data, "message" => "Claim created successfully", 'mail_responce' => $mail_responce], 200); } else { return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to create claim'], 200); @@ -601,8 +620,12 @@ class TicketController extends BaseController $return_value = $this->ticketMasterModel->where('id', $ticket_id)->set($ticket_data)->update(); if ($return_value) { - //mail trigger part - $mail_responce = $this->sendAutoMailTrigger($ticket_id); + $mail_responce = null; + if($old_ticket_data['claim_status_id'] != $ticket_data['claim_status_id']){ + //mail trigger part + $mail_responce = $this->sendAutoMailTrigger($ticket_id); + $this->autoMessageInsertBasedOnMailResponse($mail_responce, $ticket_id); + } //send mail to the head for rejected ticket approvel if($ticket_data['claim_status_id'] == 8 && $ticket_data['is_head_approved'] == 0){ @@ -837,7 +860,7 @@ class TicketController extends BaseController } // Construct Mail Data - $mailData = [ + $mailData[] = [ 'mail' => $ticket_data['emp_mail'], 'subject' => $subject, 'message' => $message, @@ -845,6 +868,17 @@ class TicketController extends BaseController 'attachments' => [] ]; + // if the employee personal mail is not empty then send the mail to the employee personal mail + if(!empty($ticket_data['emp_personal_mail'])){ + $mailData[] = [ + 'mail' => $ticket_data['emp_personal_mail'], + 'subject' => $subject, + 'message' => $message, + 'cc' => $ticket_data['common_mails'] ?? '', + 'attachments' => [] + ]; + } + // print_r($mailData); die; $this->myLogger->logme('error', "Final Email Data"); @@ -869,6 +903,10 @@ class TicketController extends BaseController $replaceData = str_replace("Claim-", "", $this->ticketType[$ticket_data['ticket_type_id']] ?? ""); } else if ($value == "claim_form_link"){ $replaceData = 'Click here to download Claim Form'; + } else if ($value == "claim_feedback_form" && $ticket_data['ticket_type_id'] == 1){ + $replaceData = 'Click to open Claim Feedback Form'; + } else if ($value == "settle_letter"){ + $replaceData = ' View Settlement Letter '; }else { $replaceData = isset($ticket_data[$value]) ? $ticket_data[$value] : ''; } @@ -927,6 +965,27 @@ class TicketController extends BaseController $this->myLogger->logme('error', "Fetched ACM emails"); + + if(!empty($ticket_data['emp_personal_mail'])){ + + $this->myLogger->logme('error', "Send employee personal mail start"); + + $emailPersonalData = [ + 'mail' => $ticket_data['emp_personal_mail'], + 'subject' => $mail_data['mail_subject'], + 'message' => $mail_data['mail_content'], + 'common' => [], + 'cc' => $acm_mails['common_mails'], + 'attachments' => [] + ]; + + $this->sendTrigger($emailPersonalData); + + $this->myLogger->logme('error', "Send employee personal mail successfully"); + }else{ + $this->myLogger->logme('error', "Send employee personal mail is empty"); + } + $emailData = [ 'mail' => $mail_data['emp_mail'], 'subject' => $mail_data['mail_subject'], @@ -950,7 +1009,10 @@ class TicketController extends BaseController if (!empty($auto_mail_enable) && $auto_mail_enable['is_auto_mail'] == 1) { $mail_content = $this->constructMailContent($ticket_id); // print_r($mail_content); die; - $mail_responce = $this->sendTrigger($mail_content); + foreach ($mail_content as $key => $value) { + $mail_responce = $this->sendTrigger($value); + $this->myLogger->logme('error', '{data} - Auto Mail Sent, Successfully', ['data' => $key + 1]); + } } elseif (!empty($auto_mail_enable) && $auto_mail_enable['is_auto_mail'] == 0) { $this->myLogger->logme('error', 'Auto Mail Not Sent, Reason: Automail Not Enabled'); } else { @@ -1371,7 +1433,8 @@ class TicketController extends BaseController } } - public function getPoliciesbyEmpID() { + public function getPoliciesbyEmpID() + { $received_data = $this->request->getPost(); $emp_id = $received_data['emp_id']; @@ -1443,5 +1506,121 @@ class TicketController extends BaseController return $this->response->setStatusCode(500)->setBody('An error occurred while downloading the file.'); } } - + + // ------------------------------------------------------------------------------------------------------------------------- + + public function autoMessageInsertBasedOnMailResponse($mail_sent_status, $ticket_id) + { + if (gettype($mail_sent_status) == 'array') { + $this->myLogger->logme('error', "auto Message Insert Based On Mail Response Failed because is array :$ticket_id "); + } else { + $mail_sent_status = json_decode($mail_sent_status); + $this->myLogger->logme('error', "mail_sent_status is object :$ticket_id "); + } + + if (!empty($mail_sent_status) && isset($mail_sent_status->status) && $mail_sent_status->status == 'success') { + + $sent_message_data['ticket_id'] = $ticket_id; + $sent_message_data['sender'] = 'staff'; + $sent_message_data['emp_mail'] = $mail_sent_status->data->params->mail; + $sent_message_data['mail_subject'] = $mail_sent_status->data->params->subject; + $sent_message_data['mail_content'] = $mail_sent_status->data->params->message; + + $message_insert_status = $this->ticketMessageModel->insert($sent_message_data); + + if ($message_insert_status) { + $this->myLogger->logme('error', "Claim initiated, Mail sent Successfully, successfully store message:$ticket_id "); + } else { + $this->myLogger->logme('error', "Claim initiated, Mail sent Successfully, Failed to store message:$ticket_id "); + } + + return true; + } else { + + $this->myLogger->logme('error', "Failed to send Mail :$ticket_id "); + return true; + } + } + + public function putHistoryAfterInsert($ticket_data, $ticket_id) + { + $this->myLogger->logme('error', "Put History After Insert function called : $ticket_id"); + + if(!empty($ticket_data)){ + + $history_data = [ + 'ticket_id' => $ticket_id, + 'field_name' => 'claim_status_id', + 'display_name' => 'Ticket Created', + 'old_value' => null, + 'new_value' => $ticket_data['claim_status_id'], + 'created_by' => get_session_userid(), + 'is_active' => 1 + ]; + + $this->myLogger->logme('error', "Put History After Insert function called : " . json_encode($history_data)); + + + $history_insert = $this->ticketHistoryModel->insert($history_data); + + if($history_insert){ + $this->myLogger->logme('error', "Put History After Insert Ticket Data Successfully"); + }else{ + $this->myLogger->logme('error', "Put History After Insert Ticket Data Failed"); + } + + }else{ + $this->myLogger->logme('error', "Put History After Insert Ticket Data is empty"); + } + + return true; + + } + + public function viewClaimFeedbackForm($md5_ticket_id,$empView = null) + { + + if ($this->request->is("get")){ + + $data['ticket_id'] = $md5_ticket_id; + $data['ticket_data'] = $this->ticketMasterModel->select('ticket_master.*,clients.client_name')->join('clients','clients.id = ticket_master.client_id')->where('MD5(ticket_master.id)',$md5_ticket_id)->where('ticket_master.is_active',1)->first(); + $data['form_submitted'] = !empty($data['ticket_data']['feedback_json'])? 1 : 0; + + + $data['viewer'] = !empty($empView) ? $empView : 0; + // dd($data); + return view('ticket_feedback_form', $data); + }else{ + + $formDataJson = json_encode($this->request->getPost()); + // log_message("error","Form data : ".$formDataJson); + + + $data_to_store = [ + + 'feedback_json' => $formDataJson + ]; + + if (!empty($formDataJson)){ + // $this->ticketMasterModel->save($data_to_store); + $this->ticketMasterModel->where('MD5(id)', $md5_ticket_id)->set($data_to_store)->update(); + + return $this->respond(['status' => true,'id'=> $md5_ticket_id,'received_data' => $formDataJson], 200); + + }else{ + return $this->respond(['status' => false,'id'=> $md5_ticket_id,'received_data' => $formDataJson], 200); + } + + } + + } + + public function feedbackList(){ + + $data['feedback_data'] = $this->ticketMasterModel->select("ticket_master.*,clients.client_name")->join("clients","clients.id = ticket_master.client_id")->where("ticket_master.is_active",1)->where("ticket_master.feedback_json IS NOT NULL", null, false)->where("ticket_master.feedback_json !=", "")->findAll(); + + // dd($data); + $this->loadLayout("ticket_feedback_list",$data); + } + } diff --git a/app/Helpers/ExcelSanitizeHelper.php b/app/Helpers/ExcelSanitizeHelper.php index 5c2836a7..f4591bfa 100644 --- a/app/Helpers/ExcelSanitizeHelper.php +++ b/app/Helpers/ExcelSanitizeHelper.php @@ -29,6 +29,7 @@ class ExcelSanitizeHelper $cleanData[$key] = self::sanitizeArrayData($value); // Recursive call for nested arrays } elseif (is_string($value)) { // Remove non-printable characters and trim whitespace from strings + $value = str_replace("\u00a0", " ", $value); $cleanData[$key] = trim(preg_replace(self::$nonPrintablePattern, '', $value)); } else { $cleanData[$key] = $value; // Keep non-string/non-array data as is diff --git a/app/Helpers/utility_helper.php b/app/Helpers/utility_helper.php index 2e932ab7..54a5883a 100755 --- a/app/Helpers/utility_helper.php +++ b/app/Helpers/utility_helper.php @@ -665,3 +665,15 @@ if (!function_exists('check_pay_by_employee_or_company')) { } +if (!function_exists('is_json_string')) { + function is_json_string($string) + { + if (!is_string($string)) { + return false; + } + + $decoded = json_decode($string, true); + return (json_last_error() === JSON_ERROR_NONE && is_array($decoded)); + } +} + diff --git a/app/Models/ClientPolicyModel.php b/app/Models/ClientPolicyModel.php index c8fcb855..360081a4 100755 --- a/app/Models/ClientPolicyModel.php +++ b/app/Models/ClientPolicyModel.php @@ -54,6 +54,7 @@ class ClientPolicyModel extends Model "is_member_modify_allowed", "cd_ac_pk", "is_lgbtq", + "placement_json", ]; // Callbacks diff --git a/app/Models/EmployeePolicyModel.php b/app/Models/EmployeePolicyModel.php index 960f37d0..175be311 100755 --- a/app/Models/EmployeePolicyModel.php +++ b/app/Models/EmployeePolicyModel.php @@ -81,6 +81,146 @@ class EmployeePolicyModel extends Model } // ---------------------------------------------------------------------------------------------------------- + // public function getEmployeePolicy($client_id = 0, $policy_id = 0, $status = [], $branch_id = 0, $emp_code = "", $emp_name = "") + // { + // // dd($status); + + // $result = $this->select([ + // 'employee_polices.*', + // 'policy_type.policy_type as policy_name', + // 'im.short_name as insurer_short_name', + // 'ib.branch_name as insurer_branch_name', + // 'ib.branch_code as insurer_branch_code', + // 'tpam.name as tpa_name', + // 'tpam.short_name as tpa_short_name', + // 'tpab.branch_code as tpa_branch_code', + // 'cm.client_name', + // 'cm.short_name as client_short_name', + // // 'emp.id as employee_primary_id', + // 'emp.relationship', + // 'emp.relationship_code', + // 'emp.change_event', + // 'emp.emp_code', + // 'emp.name', + // 'emp.email_corporate', + // 'emp.dob', + // 'DATE_FORMAT(emp.dob, "%d/%m/%Y") AS formatted_dob', + // 'emp.gender', + // 'emp.emp_status', + // 'emp.is_active as emp_is_active', + // 'emp.mobile as mobile', + // 'emp.doj', + // 'emp.basic_pay', + // 'emp.band as grade', + // 'policy_type.policy_type', + // 'client_branch.branch_name as client_branch_name', + // 'client_branch.branch_code as client_branch_code', + // 'cp.policy_no', + // 'cp.policy_type_id', + + // // Name audit trail + // '(SELECT old_value FROM auditing_history WHERE pk = emp.id AND field_name = "name" AND table_name = "employees" ORDER BY id ASC LIMIT 1) AS name_first_old', + // '(SELECT new_value FROM auditing_history WHERE pk = emp.id AND field_name = "name" AND table_name = "employees" ORDER BY id DESC LIMIT 1) AS name_last_new', + + // // DOB audit trail + // '(SELECT old_value FROM auditing_history WHERE pk = emp.id AND field_name = "dob" AND table_name = "employees" ORDER BY id ASC LIMIT 1) AS dob_first_old', + // '(SELECT new_value FROM auditing_history WHERE pk = emp.id AND field_name = "dob" AND table_name = "employees" ORDER BY id DESC LIMIT 1) AS dob_last_new', + + // // Gender audit trail + // '(SELECT old_value FROM auditing_history WHERE pk = emp.id AND field_name = "gender" AND table_name = "employees" ORDER BY id ASC LIMIT 1) AS gender_first_old', + // '(SELECT new_value FROM auditing_history WHERE pk = emp.id AND field_name = "gender" AND table_name = "employees" ORDER BY id DESC LIMIT 1) AS gender_last_new', + + // '(CASE + // WHEN emp.relationship = "Self" + // THEN (SELECT COUNT(id) FROM employees WHERE emp_code = emp.emp_code AND is_active = 0 AND emp_status != "truncated") + // ELSE NULL + // END) AS removed_count', + + // '(CASE + // WHEN emp.relationship != "Self" AND emp.created_at != ( + // SELECT created_at + // FROM employees + // WHERE emp_code = emp.emp_code AND relationship = "Self" AND is_active = 1 + // LIMIT 1 + // ) + // THEN "Newly Added" + // ELSE NULL + // END) AS newly_added', + + // ]) + // ->join('employees emp', 'employee_polices.employee_id = emp.id') + // ->join('client_policy cp', 'employee_polices.client_policy_id = cp.id') //cp - client policy + // ->join('policies pm', 'cp.policy_id = pm.id', 'left') //pm - policy master + // ->join('policy_type', 'policy_type.id = cp.policy_type_id') + // ->join('insurers im', 'cp.insurer_id = im.id') //im - insurer master + // ->join('insurer_branch ib', 'cp.insurer_branch_id = ib.id') //ib - insurer branch + // ->join('tpa tpam', 'cp.tpa_id = tpam.id', 'left') //tpam - tpa master + // ->join('tpa_branch tpab', 'cp.tpa_branch_id = tpab.id', 'left') //tpab - tpa branch + // ->join('clients cm', 'cp.client_id = cm.id') //cm - client master + // ->join('client_branch', 'emp.client_branch_id = client_branch.id') //cm - client master + // ->orderBy('emp.emp_code', 'ASC') + // ->orderBy('employee_polices.employee_id', 'ASC'); + + + // // Conditionally add where clauses + // if ($client_id != 0 && !empty($client_id)) { + // $result->where('emp.client_id', $client_id); + // } + // if ($branch_id != 0 && !empty($branch_id)) { + // $result->where('emp.client_branch_id', $branch_id); + // } + // if ($policy_id != 0 && !empty($policy_id)) { + // $result->where('employee_polices.client_policy_id', $policy_id); + // } + + // if (is_array($status) && count($status) > 0) { + + // $result->where('employee_polices.status !=', 'expired'); + + // if (in_array("active", $status)) { + + // $result->where('employee_polices.tpa_id IS NOT NULL'); + // $result->where('employee_polices.uhid IS NOT NULL'); + // $result->whereIn('employee_polices.status', $status); + // } elseif (in_array("pending", $status)) { + + // $result->where('employee_polices.tpa_id IS NULL'); + // $result->where('employee_polices.uhid IS NULL'); + // $result->whereIn('employee_polices.status', array_merge($status, ['active'])); + // } else { + + // $result->whereIn('employee_polices.status', $status); + // } + + // // if($status == 'active'){ + // // $result->where('employee_polices.tpa_id IS NOT NULL'); + // // $result->where('employee_polices.uhid IS NOT NULL'); + // // }else if($status == 'pending'){ + // // $status = 'active'; + // // $result->where('employee_polices.status', $status); + // // }else{ + // // $result->where('employee_polices.status', $status); + // // } + // } + + // if (!empty($emp_code)) { + // $result->where('emp.emp_code', $emp_code); + // } + // if (!empty($emp_name)) { + // $result->like('emp.name', $emp_name); + // } + + // // Always check these conditions + // $result->where('employee_polices.is_active', 1) + // ->where('emp.is_active', 1); + + // $res = $result->findAll(); + + // // dd($this->db->getLastQuery()); + + // return $res; + // } // remarks do not remove + public function getEmployeePolicy($client_id = 0, $policy_id = 0, $status = [], $branch_id = 0, $emp_code = "", $emp_name = "") { // dd($status); @@ -179,9 +319,11 @@ class EmployeePolicyModel extends Model } // Always check these conditions - $result->where('employee_polices.is_active', 1) - ->where('emp.is_active', 1); - + $result + ->where('employee_polices.is_active', 1) + ->where('emp.is_active', 1) + ->where('employee_polices.status !=', 'inactive'); + $res = $result->findAll(); // dd($this->db->getLastQuery()); diff --git a/app/Models/TicketHistoryModel.php b/app/Models/TicketHistoryModel.php index 6d7eb0f5..92041c8c 100644 --- a/app/Models/TicketHistoryModel.php +++ b/app/Models/TicketHistoryModel.php @@ -12,7 +12,7 @@ class TicketHistoryModel extends Model protected $returnType = 'array'; protected $useSoftDeletes = false; protected $protectFields = true; - protected $allowedFields = ['id','field_name','display_name','old_value', + protected $allowedFields = ['id', "ticket_id", 'field_name','display_name','old_value', 'new_value','created_by','created_at','updated_by','updated_at','is_active']; // Callbacks diff --git a/app/Models/TicketMasterModel.php b/app/Models/TicketMasterModel.php index f75cf2a6..1612c08e 100644 --- a/app/Models/TicketMasterModel.php +++ b/app/Models/TicketMasterModel.php @@ -15,6 +15,7 @@ class TicketMasterModel extends Model protected $allowedFields = [ 'id', 'ticket_type_id', + 'feedback_json', 'claim_status_id', 'acm_id', 'insurer_id', @@ -689,6 +690,7 @@ class TicketMasterModel extends Model $query = $this->select('ticket_master.*, tms.mail_subject as subject') ->join('ticket_messages tms', 'ticket_master.id = tms.ticket_id', 'left') ->where('ticket_master.is_active', 1) + ->where('tms.sender', "user") ->where('ticket_master.emp_id', $emp_id); if (!empty($ticket_id)) { diff --git a/app/Views/batch_list.php b/app/Views/batch_list.php index 4d85d018..f1a623fe 100755 --- a/app/Views/batch_list.php +++ b/app/Views/batch_list.php @@ -90,6 +90,17 @@   + + + + + + +   + + + failed Re-Upload - + diff --git a/app/Views/client_rm.php b/app/Views/client_rm.php index 0e84926a..c235351f 100755 --- a/app/Views/client_rm.php +++ b/app/Views/client_rm.php @@ -71,13 +71,10 @@ $(document).ready(function(){ $('#client_rm_edit').hide() - $('#account_manager').multiselect({ - nonSelectedText: 'Select Account Manager', - enableFiltering: false, - enableCaseInsensitiveFiltering: false, - includeSelectAllOption : false, - buttonWidth:'100%' - }); + $('#account_manager').prop('disabled', true); + + $("textarea.select2-search__field").attr('rows', '1'); + $("textarea.select2-search__field").css('resize', 'none'); var data = ; @@ -94,10 +91,16 @@ $(document).ready(function(){ } }); - $('#account_manager').multiselect('refresh'); + + $('#account_manager').select2({ + placeholder: "Select Account Manager", + }).prop('disabled', true); + + $("textarea.select2-search__field").attr('rows', '1'); + $("textarea.select2-search__field").css('resize', 'none'); + $('#head').prop('disabled', true); $('#manager').prop('disabled', true); - $('#account_manager').multiselect('disable'); } @@ -172,14 +175,25 @@ $(document).ready(function(){ $('#manager').prop('disabled', !isDisabled); if (isDisabled) { - $('#account_manager').multiselect('enable'); + $('#account_manager').select2({ + placeholder: "Select Account Manager", + }).prop('disabled', false); + $('#client_rm_btnSubmit').show(); $(this).html(' Close Edit '); } else { - $('#account_manager').multiselect('disable'); + $('#account_manager').select2({ + placeholder: "Select Account Manager" + }).prop('disabled', true); + $('#client_rm_btnSubmit').hide(); $(this).html(' Edit '); } + + $("textarea.select2-search__field").attr('rows', '1'); + $("textarea.select2-search__field").css('resize', 'none'); + + }); diff --git a/app/Views/layout/header.php b/app/Views/layout/header.php index 0abdf8d5..f7ccabb4 100755 --- a/app/Views/layout/header.php +++ b/app/Views/layout/header.php @@ -81,6 +81,13 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ " class="form-control-plaintext" id="email" readonly> +
+
+ +
+
+ +
+
+ " class="form-control-plaintext" id="name" readonly> +
+
+ +
+
+ +
+
+ " class="form-control-plaintext" id="client_name" readonly> +
+
+ +
+
+ +
+
+ " class="form-control-plaintext" id="emp_code" readonly> +
+
+ +
+
+ +
+
+ " class="form-control-plaintext" id="claim_number" readonly> +
+
+
+
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+ +
+ +
+ + +
+
+ +
+ +
+
+ +
+ +
+ + +
+
+ /assets/images/nhance-loader-fast.gif" height="40" width="40" alt="Loading..."> +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/app/Views/ticket_feedback_list.php b/app/Views/ticket_feedback_list.php new file mode 100644 index 00000000..f4de0f73 --- /dev/null +++ b/app/Views/ticket_feedback_list.php @@ -0,0 +1,148 @@ + + + + + +
+
+
+
+
+

Claim Feedback List

+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
Claim NumberEmp CodeEmp nameCorporate name
+ +
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/app/Views/ticket_history.php b/app/Views/ticket_history.php index 7ee087e1..c0e5bfea 100644 --- a/app/Views/ticket_history.php +++ b/app/Views/ticket_history.php @@ -20,8 +20,9 @@ '.$row['new_value']; ?> - - + + + diff --git a/app/Views/ticket_list.php b/app/Views/ticket_list.php index a51706fd..f0410316 100644 --- a/app/Views/ticket_list.php +++ b/app/Views/ticket_list.php @@ -35,6 +35,10 @@ table.dataTable tbody td { white-space: nowrap !important; } +#scroll-horizontal-datatable tbody tr:hover { + background-color: #e0e0e0; +} + @@ -57,6 +61,7 @@ table.dataTable tbody td { Policy Type Claim number TPA ID + Emp ID Emp name Insured Name Corporate name @@ -66,7 +71,7 @@ table.dataTable tbody td { $row){ ?> - + - + + @@ -184,8 +190,12 @@ $(document).ready(function() { function viewTicket(ticket_id){ + $('.loader').fadeIn(); + $('.loader-mask').fadeIn(); + let url = '' + ticket_id window.location.href = url + } \ No newline at end of file diff --git a/app/Views/view_rfq_non_eb.php b/app/Views/view_rfq_non_eb.php index 5822cb9f..6a182769 100644 --- a/app/Views/view_rfq_non_eb.php +++ b/app/Views/view_rfq_non_eb.php @@ -5,40 +5,82 @@ display: block; } + + .btn-custom { background-color: #007bff; color: #fff; margin-right: 10px; } + .readonly-select { + pointer-events: none; + background-color: #f0f0f0; + color: #666; + } table { /* border-collapse: collapse; */ margin-bottom: 20px; /* max-width: 800px; */ /* table-layout: fixed; */ - width: 1200px; - /* Set a fixed width */ + width: 1400px; + min-width: 1200px; table-layout: fixed; - /* Ensures equal column widths */ border-collapse: collapse; - /* Optional: Makes borders cleaner */ word-wrap: break-word; } - - - th:nth-child(1), - td:nth-child(1) { - width: 110px; - /* Adjust first column width */ + table thead tr:nth-child(1) th { + background-color: #bfe0e2; + border: 1px solid #007bff; } + table thead tr:nth-child(2) th { + background-color: #bfe0e2; + border: 1px solid #007bff; + } + + + /* Apply styles to the first column, accounting for rowspan */ + table th:nth-child(1), + table td:nth-child(1) { + width: 110px; + background-color: #bfe0e2; + } + + + + /* Ensure rowspan cells in the first column inherit the same styles */ + table td[rowspan]:nth-child(1) { + width: 110px; + /* background-color: #bfe0e2; */ + } + + .table { + border: 1px solid #007bff; /* Border around the table */ + border-collapse: collapse; /* Ensures borders don’t double up */ + width: 100%; + } + + .table th, + .table td { + border: 1px solid #007bff; /* Border for all table cells */ + padding: 8px; /* Optional: Adds spacing inside cells */ + text-align: left; /* Optional: Aligns text inside cells */ + } + + th:nth-child(2), td:nth-child(2) { width: 720px; + background-color: #bfe0e2; /* Adjust first column width */ } + .bold { + font-weight: bold; + color: red; + } th:nth-last-child(1), td:nth-last-child(1) { @@ -53,7 +95,7 @@ } th { - background-color: #f2f2f2 !important; + /* background-color: #f2f2f2 !important; */ position: relative !important; } @@ -68,6 +110,12 @@ box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2); z-index: 1; } + /* Selects the last cell in each row */ + table tr td:last-child, + table tr th:last-child { + background-color: white !important; + } + .dropdown-content button { display: block; @@ -98,11 +146,13 @@ cursor: pointer; min-width: 80px; user-select: none; + background-color: #ff9999; } /* Hover effect for options */ .dropdown-option:hover { - background-color: #f0f0f0; + background-color: #333; + color : white; } /* Optional: Add transition for smoother hover effect */ @@ -115,11 +165,6 @@ cursor: pointer; } - [contenteditable="true"] { - pointer-events: auto; - /* Ensure clicking works */ - } - /* Optional: Style for selected state */ .selected-option { background-color: #f8f9fa; @@ -160,6 +205,57 @@ color: white !important; margin-right: 5px; } + + .table-collapsible-bar { + min-width: 1300px; + background-color: #f1f1f1; + padding: 10px; + cursor: pointer; + border: 1px solid #ddd; + border-radius: 4px 4px 0 0; + font-weight: bold; + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0; + } + + .table-collapsible-bar .collapse-icon { + transition: transform 0.3s ease; + } + + .table-collapsible-bar.collapsed .collapse-icon { + transform: rotate(-90deg); + } + + .table-content { + overflow-x: auto; + width: 100%; + } + + /* Ensure these styles are present */ + .table-content { + transition: all 0.3s ease; + /* overflow: hidden; */ + } + + .table-content.collapse:not(.show) { + display: none; + } + + .table-content.collapse.show { + display: block; + } + + .collapse-icon { + transition: transform 0.3s ease; + } + + .table-collapsible-bar { + cursor: pointer; + user-select: none; + } + @@ -389,15 +485,29 @@