From f2e55a3a235c744d3f6c75749133c3049d3226ed Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Thu, 14 Mar 2024 15:25:04 +0530 Subject: [PATCH 1/2] FEAT_IMPORT_EXPORT : RV --- app/Config/Autoload.php | 2 +- app/Config/Routes.php | 2 + app/Controllers/ClientController.php | 29 +- app/Controllers/EmpDataServiceController.php | 166 ++++++ app/Controllers/EmployeeController.php | 305 ++++++++-- app/Controllers/EmployeeServiceController.php | 97 ++++ app/Controllers/LoginController.php | 5 +- app/Helpers/excel_import_export_helper.php | 261 +++++++++ app/Models/BatchFileModel.php | 25 + app/Models/BatchListModel.php | 20 + app/Models/EmpEndorsementModel.php | 28 + app/Models/EmployeeModel.php | 1 + app/Models/EmployeePolicyModel.php | 136 +++++ app/Views/UserList.php | 8 + app/Views/client_basic_info.php | 82 ++- app/Views/client_kyc.php | 47 +- app/Views/client_policy.php | 10 - app/Views/client_rm.php | 3 + app/Views/employee_upload.php | 540 ++++++++++-------- app/Views/excel_errors.php | 159 ++++-- app/Views/import_export.php | 32 ++ app/Views/insurer_or_tpa_data.php | 334 +++++++++++ app/Views/layout/header.php | 4 - .../session => public/sample_excel}/.gitkeep | 0 public/sample_excel/inception.xls | Bin 0 -> 10240 bytes public/sample_excel/inception_1.xls | Bin 0 -> 10240 bytes public/sample_excel/inception_2.xls | Bin 0 -> 10240 bytes public/sample_excel/inception_3.xls | Bin 0 -> 10240 bytes 28 files changed, 1885 insertions(+), 411 deletions(-) create mode 100644 app/Controllers/EmpDataServiceController.php create mode 100644 app/Helpers/excel_import_export_helper.php create mode 100644 app/Models/BatchFileModel.php create mode 100644 app/Models/BatchListModel.php create mode 100644 app/Models/EmpEndorsementModel.php create mode 100644 app/Views/import_export.php create mode 100644 app/Views/insurer_or_tpa_data.php rename {writable/session => public/sample_excel}/.gitkeep (100%) create mode 100644 public/sample_excel/inception.xls create mode 100644 public/sample_excel/inception_1.xls create mode 100644 public/sample_excel/inception_2.xls create mode 100644 public/sample_excel/inception_3.xls diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php index dfba0156..33f1403b 100755 --- a/app/Config/Autoload.php +++ b/app/Config/Autoload.php @@ -99,5 +99,5 @@ class Autoload extends AutoloadConfig * @var string[] * @phpstan-var list */ - public $helpers = ['uuid','session','utility', 'form', 'url', 'oauth', 'fileupload']; + public $helpers = ['uuid','session','utility', 'form', 'url', 'oauth', 'fileupload', 'excel_import_export', 'file']; } diff --git a/app/Config/Routes.php b/app/Config/Routes.php index f8a6622c..e64d9709 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -187,6 +187,8 @@ $routes->group("/util", ["filter" => "authMVC"], function($routes){ $routes->get("kyc-other-docs-delete/(:any)", "ClientController::deleteClientKycOtherDocs/$1"); $routes->get("policy-premium", "ClientController::getpolicyGridData/$1"); $routes->get("update-policy-status", "ClientController::updateClientPolicyStatus/$1"); + $routes->get("download-excel/(:any)", "EmployeeController::downloadSampleExcelFile/$1"); + $routes->post("import-export", "EmployeeController::importExport"); }); $routes->cli('processjob', 'JobWorker::processJob'); diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 8575d6b0..5612386c 100644 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -90,20 +90,11 @@ class ClientController extends AdminController public function index() { - // $token = $_SESSION; - // $token = $request->getHeaderLine('Authorization'); - - - // print_r(JWTToken::getIdFromToken($token)); - - // die(); - $this->myLogger->logme('error','Client list function called'); $headerData['page_name'] = 'Client List'; $data['clientList'] = $this->clientModel->getCreatedByUserName(); $data['client_rm'] = $this->clientRMModel->getAllClientRM(); - // echo '
';
-        // print_r($data); die;
+
         echo view('layout/header', $headerData);
         echo view('client_list', $data);
         echo view('layout/footer');
@@ -138,18 +129,18 @@ class ClientController extends AdminController
     // In your controller
     public function deposit($id = null)
     {
-    $headerData['page_name'] = 'Client Deposit';
+        $headerData['page_name'] = 'Client Deposit';
 
-    $data['clientData'] = $this->clientPolicyModel->getinsurerswithclientid($id);
-    $data['depositsummary'] = $this->clientPolicyModel->getDepositlistsummary($id);
+        $data['clientData'] = $this->clientPolicyModel->getinsurerswithclientid($id);
+        $data['depositsummary'] = $this->clientPolicyModel->getDepositlistsummary($id);
 
-    // Fetch associated insurer names and balances
-    $balances = $this->clientPolicyModel->getBalances($id);
-    $data['balances'] = $balances;
+        // Fetch associated insurer names and balances
+        $balances = $this->clientPolicyModel->getBalances($id);
+        $data['balances'] = $balances;
 
-    echo view('layout/header', $headerData);
-    echo view('client_deposit_list', $data);
-    echo view('layout/footer');
+        echo view('layout/header', $headerData);
+        echo view('client_deposit_list', $data);
+        echo view('layout/footer');
     }
    
     public function view_Deposit($insurerId) 
diff --git a/app/Controllers/EmpDataServiceController.php b/app/Controllers/EmpDataServiceController.php
new file mode 100644
index 00000000..28efc8cf
--- /dev/null
+++ b/app/Controllers/EmpDataServiceController.php
@@ -0,0 +1,166 @@
+myLogger = \Config\Services::mylogger();
+        $this->employeeModel = new EmployeeModel();
+        $this->employeePolicyModel = new EmployeePolicyModel();
+        $this->clientModel       = new ClientModel();
+        $this->fileModel         = new FileModel();
+        $this->clientPolicyModel = new ClientPolicyModel();
+        $this->batchListModel    = new BatchListModel();
+        $this->batchFileModel    = new BatchFileModel();
+        $this->empEndorsementModel    = new EmpEndorsementModel();
+    }
+
+
+    public function batchFilesAndBatchListEntry($data, $filename, $objects){
+       $random_number_count = 4;
+       $data['batch_code'] = generate_random_string($random_number_count);
+       $data['created_by'] = get_session_userid();
+       $data['file_name'] = $filename;
+       $insert = $this->batchFileModel->insert($data);
+       $batch_file_batch_code = $this->batchFileModel->where('id', $insert)->first();
+
+       if($insert){
+          foreach($objects as $value){
+            $batch_list_data['batch_code'] =  $batch_file_batch_code['batch_code'];
+            $batch_list_data['emp_policy_id'] =  $value->employee_policy_id ?? $value->emp_id;
+            $batch_list_data['created_by'] = get_session_userid();
+             $this->batchListModel->insert($batch_list_data);
+          }
+       }
+       return true;
+        
+    }
+    
+
+    public function generateExcelForAdditionandInception($batch_files_data, $export_data, $file_name)
+    {
+
+        $data = transform_objects_to_array_for_inception($export_data);
+        $headers = [
+            'S.No', 'NAME OF EMP/DEP', 'EMP ID', 'EMP/DEP TYPE', 'RELATION', 'DOB', 'GENDER', 'PRE EXISTING AILMENTS',
+            'BASIC COVER SI', 'DATE OF COVERAGE', 'AGE', 'RELATIONSHIP', 'REMARKS', 'POLICY END DATE', 'NO OF DAYS', 'TPA ID', 'UHID',
+            'PREMIUM', 'PR0 RATA PREMIUM', 'GST', 'TOTAL'
+        ];
+        
+        // Create a temporary file in memory
+        $tempFile = tmpfile();
+
+        // Generate Excel file with the temporary file
+        $value = generate_excel($headers, $data, $tempFile, 1);
+
+        // Generate a random filename
+        $randomFilename = $file_name;
+
+        if($value){
+           $return = $this->batchFilesAndBatchListEntry($batch_files_data, $randomFilename, $export_data);
+           if($return){
+
+                // Set the appropriate headers for Excel file download
+                header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+                header('Content-Disposition: attachment;filename="' . $randomFilename . '"');
+                header('Cache-Control: max-age=0');
+
+                // Rewind the temporary file pointer
+                rewind($tempFile);
+
+                // Output the contents of the temporary file to the browser
+                fpassthru($tempFile);
+
+                // Close and remove the temporary file
+                fclose($tempFile);
+
+           }else{
+               return false;
+           }
+        }
+
+
+
+    }
+
+
+    public function generateExcelForCorrection($file_name, $objects, $batch_files_data)
+    {
+
+        $correction_data = transform_objects_to_array_for_correction($objects);
+
+        $headers = [
+            'Emp Code', 'RISK ID', 'NAME OF EMP/DEP', 'EMP/DEP TYPE', 'RELATION', 'DOB', 'GENDER', 'Wrong Data', 'Correct Data', 'Remarks', 'Endorsement_Id'
+        ];
+
+
+         // Create a temporary file in memory
+         $tempFile = tmpfile();
+
+         // Generate Excel file with the temporary file
+         $value = generate_excel($headers, $correction_data, $tempFile);
+ 
+         // Generate a random filename
+         $randomFilename = $file_name;
+ 
+         if($value){
+            $return = $this->batchFilesAndBatchListEntry($batch_files_data, $randomFilename, $objects);
+            if($return){
+ 
+                 // Set the appropriate headers for Excel file download
+                 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+                 header('Content-Disposition: attachment;filename="' . $randomFilename . '"');
+                 header('Cache-Control: max-age=0');
+ 
+                 // Rewind the temporary file pointer
+                 rewind($tempFile);
+ 
+                 // Output the contents of the temporary file to the browser
+                 fpassthru($tempFile);
+ 
+                 // Close and remove the temporary file
+                 fclose($tempFile);
+
+                 return true;
+ 
+            }else{
+                return false;
+            }
+         }
+
+    }
+    
+}
diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php
index e47f06a2..21448fe0 100644
--- a/app/Controllers/EmployeeController.php
+++ b/app/Controllers/EmployeeController.php
@@ -12,11 +12,16 @@ use App\Models\EmployeeModel;
 use App\Models\EmployeePolicyModel;
 use App\Models\ClientModel;
 use App\Models\FileModel;
+use App\Models\BatchListModel;
+use App\Models\BatchFileModel;
+use App\Models\EmpEndorsementModel;
+use App\Models\ClientPolicyModel;
 
 use App\Controllers\Jobs ;
 use App\Controllers\JobWorker ;
 use App\Controllers\Jobs\SubJob;
 use App\Controllers\EmployeeServiceController;
+use App\Controllers\EmpDataServiceController;
 
 use CodeIgniter\API\ResponseTrait;
 
@@ -32,6 +37,11 @@ class EmployeeController extends AdminController
     protected $employeePolicyModel;
     protected $clientModel;
     protected $fileModel;
+    protected $batchListModel;
+    protected $batchFileModel;
+    protected $empEndorsementModel;
+    protected $clientPolicyModel;
+
     public function __construct()
     {
         // helper('utility');
@@ -41,6 +51,10 @@ class EmployeeController extends AdminController
         $this->employeePolicyModel = new EmployeePolicyModel();
         $this->clientModel = new ClientModel();
         $this->fileModel = new FileModel();
+        $this->batchListModel    = new BatchListModel();
+        $this->batchFileModel    = new BatchFileModel();
+        $this->empEndorsementModel    = new EmpEndorsementModel();
+        $this->clientPolicyModel  = new ClientPolicyModel();
     }
 
     public function list()
@@ -177,6 +191,9 @@ class EmployeeController extends AdminController
         }
 
         $data['actions'] = ['inception' => 'Inception + Addition + Deletion','correction' =>'Correction','si_enhancement' =>'SI Enhancement'];
+        $data['events'] = ['inception' => 'Inception + Addition','correction' =>'Correction', 'deletion'=>'Deletion' ,'si_enhancement' =>'SI Enhancement'];
+        $data['import_or_export'] = ['import' => 'Import','export' =>'Export'];
+        $data['insurer_or_tpa'] = ['insurer' => 'Insurer','tpa' =>'TPA'];
         $data['fileList'] = $this->fileModel
                             ->select(['files.*','up.emp_code','up.first_name','pm.name as policy_name','c.short_name'])
                             ->join('user_profiles up','files.created_by = up.id')
@@ -186,77 +203,251 @@ class EmployeeController extends AdminController
         // dd($data['fileList']);die();
         if($this->request->getMethod() == "get")
         {
-           $this->loadLayout('employee_upload',$data);    
+           $this->loadLayout('import_export',$data);    
         }
         
     }
 
     public function getExcelFileErrors()
     {
+        $file_id = $this->request->uri->getSegment(3);
+        $empServiceController = new EmployeeServiceController();
         
-         $file_id = $this->request->uri->getSegment(3);
-         $file = $this->fileModel->find($file_id);
-         $error_data = json_decode($file['reason']);
-         $file_name_with_path = WRITEPATH."/uploads/excel/".$file['file_name'];
+        // Render views and capture output
+        $result = $empServiceController->getExcelErrorData($file_id);
 
-         //check the file exist or not
-         if(!file_exists($file_name_with_path))
-         {
-            $error_message = "File not found";
-            $this->myLogger->logme('error',($error_message . ' for file id ' . $file_id));
-         }
-
-         $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
-         $sheet = $spreadsheet->getActiveSheet();
+        // echo '
';
+        // print_r($result); die;
+        echo view('excel_errors', $result);
     
-         $highestRowAndColumn = $sheet->getHighestRowAndColumn();
-         $excel_data = $sheet->rangeToArray('A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row']);
-         $data['excel_header'] = $excel_data[0];
-         unset($excel_data[0]);
-         $data['excel_data'] = $excel_data;
-         
+    }
 
-         echo '
';
+     /**This downloadSampleExcelFile() function facilitates downloading various sample Excel files  
+    ** based on user-selected actions, handling file retrieval and download processes. **/
+    public function downloadSampleExcelFile($actionType = null)
+    {
+        // $actionType = $this->request->getGet();
+        $filePath = '';
+        // Path to your file
+        if($actionType == 'inception'){
+            $filePath = ROOTPATH . 'public/sample_excel/inception.xls';
 
-            // foreach ($error_data->error_data as $key => $value) {
-            //     print_r($excel_data[$key]);
-            //     foreach($value as $key2 => $value2){
-            //         // echo '
';
-            //         // print_r($excel_data[$key][$value2->col_idx]);
-            //     }
-                
-            // }
-            $finalArray = [];
-            foreach ($error_data->error_data as $key => $value) {
-                foreach($value as $key2 => $value2){
-                    $error_data = $value2->error;
+        }else if($actionType == 'correction'){
+            $filePath = ROOTPATH . 'public/sample_excel/inception_1.xls';
 
-                    echo '
';
-                    // print_r([$value2->col_idx]);
-                    $excel_data[$key][$value2->col_idx] = $error_data;
-                    // print_r($excel_data[$key]);
-                   
-                }
-                // print_r($excel_data[$key]);
-               // array_push($finalArray, $excel_data);
-            }
+        }else if($actionType == 'si_enhancement'){
+            $filePath = ROOTPATH . 'public/sample_excel/inception_2.xls';
+        }
+        
+        // Check if the file exists
+        if (file_exists($filePath)) {
+            
+            // Set the appropriate MIME type
+            $mimeType = mime_content_type($filePath);
 
-            print_r($excel_data);
-
- die; 
-           
-
-        //  echo '###################################################################### 
'; - // print_r($excel_data); - // echo '######################################################################
'; - // print_r($error_data->error_data); die; - - $headerData['page_name'] = 'Excel Error'; - echo view('layout/header', $headerData); - echo view('excel_errors', $data); - echo view('layout/footer'); + // Send the file to the client for download + return $this->response->download($filePath, null, $mimeType); + } else { + // File not found, show an error message or redirect + return redirect()->back()->with('error', 'File not found.'); + } } + public function importExport() + { + + $this->myLogger->logme('error','importExport function called'); + $empDataServiceController = new EmpDataServiceController(); + $client_id = $this->request->getPost('client_id'); + $client_policy_id = $this->request->getPost('client_policy_id'); + $insurer_or_tpa = $this->request->getPost('insurer_or_tpa'); + $event_type = $this->request->getPost('event_type'); + $actions = $this->request->getPost('action_type'); + + $batch_data = [ + 'client_id' => $client_id, + 'client_policy_id' => $client_policy_id, + 'insurer_or_tpa' => $insurer_or_tpa, + 'event_type' => $event_type, + 'actions' => $actions, + ]; + + $client_data = $this->clientModel->where('id', $client_id)->first(); + $policy_name = $this->clientPolicyModel->select('policies.name') + ->join('policies', 'policies.id = client_policy.policy_id') + ->where('client_policy.id', $client_policy_id)->first(); + $file_name = generate_filename($client_data['short_name'], $event_type, $actions, $insurer_or_tpa, $policy_name['name']); + + if($actions == 'export'){ + + if($event_type == 'inception'){ + + $objects = $this->employeePolicyModel->getInceptionEmployeeDataForExportExcel($client_policy_id, $insurer_or_tpa, $event_type, $actions); + $count = count($objects); + $this->myLogger->logme('error','Inception export data count : {data}', ['data'=> $count ]); + $batch_data['count'] = $count; -} + if($count == 0){ + + session()->setFlashdata('error', 'No data found'); + return redirect()->to(base_url('employee/upload')); + } + + $this->myLogger->logme('error','Inception export file name : {data}', ['data'=> $file_name ]); + $empDataServiceController->generateExcelForAdditionandInception($batch_data, $objects, $file_name); + + } else if($event_type == 'correction'){ + + $objects = $this->employeePolicyModel->getCorrectionEmployeesDataForExportExcel($client_id, $client_policy_id, $insurer_or_tpa); + $count = count($objects); + $this->myLogger->logme('error','Correction export data count : {data}', ['data'=> $count ]); + $batch_data['count'] = $count; + if($count == 0){ + session()->setFlashdata('error', 'No data found'); + return redirect()->to(base_url('employee/upload')); + } + $this->myLogger->logme('error','Correction export file name : {data}', ['data'=> $file_name ]); + $empDataServiceController->generateExcelForCorrection($file_name, $objects, $batch_data); + } + + }else if($actions == 'import'){ + + if($event_type == 'inception'){ + + $file = $this->request->getFile('import_file_data'); + $is_moved = $file->move(WRITEPATH . 'uploads/import_excel'); + $filename = $file->getName(); + + $this->myLogger->logme('error','Inception Import file name : {data}', ['data'=> $filename ]); + $random_number_count = 4; + $batch_code = generate_random_string($random_number_count); + + $this->myLogger->logme('error','Inception Import BATCH CODE : {data}', ['data'=> $batch_code ]); + + $batch_data['batch_code'] = $batch_code; + $batch_data['created_by'] = get_session_userid(); + $batch_data['file_name'] = $filename; + $insert = $this->batchFileModel->insert($batch_data); + $batch_file_batch_code = $this->batchFileModel->where('id', $insert)->first(); + + $file_name_with_path = WRITEPATH."/uploads/import_excel/".$batch_file_batch_code['file_name']; + + //check the file exist or not + if(!file_exists($file_name_with_path)) + { + session()->setFlashdata('error', 'File not found'); + return redirect()->to(base_url('employee/upload')); + } + + $data = read_excel_file_to_array($file_name_with_path); + unset($data[0]); + array_pop($data); + // dd($data ); + foreach ($data as $key => $value) { + // Check if the array is not empty and has the necessary data + if (!empty($value) && (isset($value[15]) || isset($value[16]))) { + + // Extract the client_policy_id and tpa_id from the array + $tpa_id = $value[15] != null ? $value[15] : ''; + $uhid = $value[16] != null ? $value[16] : ''; + $emp_code = $value[2]; + $name = $value[1]; + + // echo $tpa_id, $uhid, $emp_code, $name; die; + $this->employeePolicyModel->updateTPAIDorUHID( $client_policy_id, $client_id, $name, $emp_code, $uhid, $tpa_id); + $query = $this->employeePolicyModel->getLastQuery(); + echo $query . "
"; + + }else{ + + session()->setFlashdata('error', 'Something went wrong'); + return redirect()->to(base_url('employee/upload')); + } + + } + + session()->setFlashdata('success', 'Data updated successfully'); + return redirect()->to(base_url('employee/upload')); + + }else if($event_type == 'correction'){ + + $file = $this->request->getFile('import_file_data'); + $is_moved = $file->move(WRITEPATH . 'uploads/import_excel'); + $filename = $file->getName(); + + $this->myLogger->logme('error','Correction Import file name : {data}', ['data'=> $filename ]); + $random_number_count = 4; + $batch_code = generate_random_string($random_number_count); + $this->myLogger->logme('error','Correction Import BATCH CODE : {data}', ['data'=> $batch_code ]); + + + $batch_data['batch_code'] = $batch_code; + $batch_data['created_by'] = get_session_userid(); + $batch_data['file_name'] = $filename; + $insert = $this->batchFileModel->insert($batch_data); + $batch_file_batch_code = $this->batchFileModel->where('id', $insert)->first(); + + $file_name_with_path = WRITEPATH."/uploads/import_excel/".$batch_file_batch_code['file_name']; + + if(!file_exists($file_name_with_path)) + { + session()->setFlashdata('error', 'File not found'); + return redirect()->to(base_url('employee/upload')); + } + + $data = read_excel_file_to_array($file_name_with_path); + unset($data[0]); + // dd($data); + foreach ($data as $key => $value) { + + if (!empty($value) && isset($value[10])) { + + $emp_code = $value[0]; + $uhid = $value[1]; + $endorsement_id = $value[10] != null ? $value[10] : ''; + // $this->employeePolicyModel->updateCorrectionData($emp_code, $uhid, $endorsement_id); + + $queryData = $this->empEndorsementModel->select('emp_endorsement.*') + ->join('employees', 'employees.id = emp_endorsement.emp_id') + ->join('employee_polices', 'employee_polices.employee_id = employees.id') + ->where('employees.emp_code', $emp_code) + ->where('employees.client_id', $client_id) + ->where('employee_polices.client_policy_id', $client_policy_id) + ->where('employee_polices.uhid', $uhid) + ->get() + ->getResultArray(); + + // dd($queryData); + + foreach ($queryData as $endorsementData) { + + $emp_endoresment_id = $endorsementData['id']; + $emp_id = $endorsementData['emp_id']; + $field_name = $endorsementData['field_name']; + $new_value = $endorsementData['new_value']; + $this->empEndorsementModel->where('id', $emp_endoresment_id)->set('endorsement_id', $endorsement_id)->update(); + $this->employeeModel->where('id', $emp_id)->set($field_name, $new_value)->update(); + } + + $query = $this->employeePolicyModel->getLastQuery(); + echo $query . "
"; + }else{ + session()->setFlashdata('error', 'Something went wrong'); + return redirect()->to(base_url('employee/upload')); + } + + } + + session()->setFlashdata('success', 'Data updated successfully'); + return redirect()->to(base_url('employee/upload')); + + } + + } + + + } + + +} \ No newline at end of file diff --git a/app/Controllers/EmployeeServiceController.php b/app/Controllers/EmployeeServiceController.php index 5d97f51b..ccf52ee4 100644 --- a/app/Controllers/EmployeeServiceController.php +++ b/app/Controllers/EmployeeServiceController.php @@ -378,6 +378,103 @@ class EmployeeServiceController extends AdminController } +// --------------------------------------------------------------------------------- + + + public function getExcelErrorData($file_id){ + + $file = $this->fileModel->find($file_id); + $error_data = json_decode($file['reason']); + + // return $error_data; + + $file_name_with_path = WRITEPATH."/uploads/excel/".$file['file_name']; + + //check the file exist or not + if(!file_exists($file_name_with_path)) + { + $error_message = "File not found"; + $this->myLogger->logme('error',($error_message . ' for file id ' . $file_id)); + } + + $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path); + $sheet = $spreadsheet->getActiveSheet(); + + $highestRowAndColumn = $sheet->getHighestRowAndColumn(); + $excel_data = $sheet->rangeToArray('A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row']); + $excelErrorData['excel_header'] = $excel_data[0]; + unset($excel_data[0]); + // echo '
';
+
+         if($error_data->error_type == 1){
+
+            $finalArray = [];
+            foreach ($error_data->error_data as $key => $value) {
+    
+                foreach ($value as $key2 => $value2) {
+                    $error_data = $value2->error;
+                    $data = ['value' => $excel_data[$key][$value2->col_idx], 'error'=>$error_data,];
+                    $excel_data[$key][$value2->col_idx] = $data;
+    
+                }
+                array_push($finalArray, $excel_data[$key]);
+            }
+    
+            foreach ($finalArray as $fkey => $value){
+                foreach ($value as $vkey => $arrayData){
+                    if(!is_array($arrayData)){
+                        $data = ['value' => $arrayData];
+                        $finalArray[$fkey][$vkey] =  $data;
+                    }
+                }
+            }
+    
+            $excelErrorData['excel_data'] = $finalArray;
+            return $excelErrorData;
+
+         }else if($error_data->error_type == 2){
+
+
+            $allErrors = [];
+            $typeTowArray = [];
+
+            foreach ($error_data->error_data as $index => $item) {
+
+                foreach ($item as $field) {
+                    if (!isset($allErrors[$index])) {
+                        $allErrors[$index] = [];
+                    }
+                    $allErrors[$index] = array_merge($allErrors[$index], $field->error);
+                }
+            }
+
+
+            foreach ($allErrors as $key => $value){
+                $data = ['value' => $excel_data[$key][1], 'error'=>$value,];
+                $excel_data[$key][1] = $data;
+                array_push($typeTowArray, $excel_data[$key]);
+            }
+
+            foreach ($typeTowArray as $fkey => $value){
+                foreach ($value as $vkey => $arrayData){
+                    if(!is_array($arrayData)){
+                        $data = ['value' => $arrayData];
+                        $typeTowArray[$fkey][$vkey] =  $data;
+                    }
+                }
+            }
+
+            $excelErrorData['excel_data'] = $typeTowArray;
+            return $excelErrorData;
+
+         }
+
+
+
+ }
+
+
+// ---------------------------------------------------------------------------------
 
     
 }
diff --git a/app/Controllers/LoginController.php b/app/Controllers/LoginController.php
index 1dc8fb89..70863177 100644
--- a/app/Controllers/LoginController.php
+++ b/app/Controllers/LoginController.php
@@ -46,7 +46,7 @@ class LoginController extends BaseController
                         set_session_data($session_data);
                         log_message('error', 'Set The UserId : `'. $user->id .'` in Session');
                         log_message('error', 'Is User Login Sucessfully');
-                        $this->getUserDeviceInfo($user->id);
+                        $this->getUserDeviceInfo($user->id, 'NhanceUser');
                         return redirect()->to(base_url('/dashboard/view'));
 
                     }else{
@@ -79,7 +79,7 @@ class LoginController extends BaseController
     }
 
 
-    public function getUserDeviceInfo($userId){
+    public function getUserDeviceInfo($userId, $type_of_user){
 
         // Load the UserAgent library
         $userAgent = $this->request->getUserAgent();
@@ -95,6 +95,7 @@ class LoginController extends BaseController
 
         $datd = [
            'user_id' => $userId,
+           'user_type' => $type_of_user,
            'ip' => $ipAddress,
            'platform' => $platform,
            'broswer' => $browser,
diff --git a/app/Helpers/excel_import_export_helper.php b/app/Helpers/excel_import_export_helper.php
new file mode 100644
index 00000000..9a655c2e
--- /dev/null
+++ b/app/Helpers/excel_import_export_helper.php
@@ -0,0 +1,261 @@
+getActiveSheet()->setTitle('Sheet 1');
+
+        // Set headers into the spreadsheet
+        $spreadsheet->getActiveSheet()->fromArray([$headers], null, 'A1');
+
+        // Set data into the spreadsheet
+        $spreadsheet->getActiveSheet()->fromArray($data, null, 'A2');
+
+        if($totals){
+            // Call the helper function for Calculate GST, Pro Rata Premium, and Total sums for inception
+            add_totals_row($spreadsheet, $data);
+        }
+
+        // Create Excel writer
+        $writer = new Xlsx($spreadsheet);
+
+        try {
+            // Save Excel file to the specified path
+            $writer->save($filename);
+            return true; // Return true if file was successfully saved
+        } catch (\Exception $e) {
+            // Log or handle the exception
+            return false; // Return false if there was an error saving the file
+        }
+    }
+}
+
+
+if (! function_exists('transform_objects_to_array_for_inception')) {
+    function transform_objects_to_array_for_inception($objects) {
+
+        // Define an array to store the transformed data
+        $data  = [];
+        $TPAID = "";
+        $UHID  = "";
+
+        // Initialize serial number
+        $serialNumber = 1;
+
+        // Iterate through each object
+        foreach ($objects as $obj) {
+            // Extract all values for the object
+            $rowData = [
+                $serialNumber++,                     // Serial Number
+                $obj->emp_name,                      // Employee Name
+                $obj->emp_code,                      // Employee Code
+                $obj->emp_type,                      // Employee Type
+                $obj->emp_relationship_code,         // Relationship Code
+                $obj->emp_dob,                       // Date of Birth
+                $obj->emp_gender,                    // Employee Gender
+                $obj->pre_existing_alignments,       // Pre-existing Alignments
+                $obj->basic_cover_si,                // Basic Cover SI
+                $obj->date_coverage,                 // Date Coverage
+                $obj->emp_age,                       // Employee Age
+                $obj->emp_relationship,              // Employee Relationship
+                $obj->change_event,                  // Change Event
+                $obj->policy_end_date,               // Policy End Date
+                $obj->days,                          // Days
+                $TPAID,                              //EMPTY FIELD FOR TPA ID  
+                $UHID,                               //EMPTY FIELD FOR UHID 
+                $obj->premium,                       // Premium
+                $obj->rata_premimum,                 // Rata Premium
+                $obj->gst,                           // GST
+                $obj->total                          // Total
+            ];
+
+            // Append the row data to the main data array
+            $data[] = $rowData;
+        }
+
+        return $data;
+    }
+}
+
+
+if (! function_exists('transform_objects_to_array_for_correction')) {
+    function transform_objects_to_array_for_correction($objects) {
+
+        // Define an array to store the transformed data
+        $data  = [];
+        $endorsement_id = "";
+
+        // Iterate through each object
+        foreach ($objects as $obj) {
+            // Extract all values for the object
+            $rowData = [
+                $obj->emp_code,                         
+                $obj->uhid,                             
+                $obj->emp_name,                         
+                $obj->emp_type,                         
+                $obj->relationship_code,                      
+                $obj->emp_dob,                          
+                $obj->emp_gender,                        
+                $obj->old_value,                     
+                $obj->new_value,                    
+                $obj->remarks,                     
+                $endorsement_id,
+            ];
+
+            // Append the row data to the main data array
+            $data[] = $rowData;
+        }
+
+        return $data;
+    }
+}
+
+
+if (!function_exists('add_totals_row')) {
+    function add_totals_row(Spreadsheet $spreadsheet, array $data)
+    {
+        // Calculate GST, Pro Rata Premium, and Total sums
+        $gstSum = 0;
+        $proRataPremiumSum = 0;
+        $totalSum = 0;
+
+        foreach ($data as $row) {
+            $gstSum += $row[18];
+            $proRataPremiumSum += $row[19];
+            $totalSum += $row[20];
+        }
+
+        // Add a new row with sums
+        $lastRow = count($data) + 1; // To get the last row number
+        $spreadsheet->getActiveSheet()->setCellValue('R' . ($lastRow + 1), 'TOTALS');
+        $spreadsheet->getActiveSheet()->setCellValue('S' . ($lastRow + 1), $gstSum);
+        $spreadsheet->getActiveSheet()->setCellValue('T' . ($lastRow + 1), $proRataPremiumSum);
+        $spreadsheet->getActiveSheet()->setCellValue('U' . ($lastRow + 1), $totalSum);
+    }
+}
+
+
+if (!function_exists('read_excel_file_to_array')) {
+    function read_excel_file_to_array($file)
+    {
+        // Load the Excel file
+        $spreadsheet = IOFactory::load($file);
+
+        // Get the active sheet
+        $sheet = $spreadsheet->getActiveSheet();
+
+        // Get the highest row and column numbers
+        $highestRow = $sheet->getHighestRow();
+        $highestColumn = $sheet->getHighestColumn();
+
+        $data = [];
+
+        // Iterate through each row
+        for ($row = 1; $row <= $highestRow; $row++) {
+            // Initialize the row data array
+            $rowData = [];
+
+            // Iterate through each column in the row
+            for ($col = 'A'; $col <= $highestColumn; $col++) {
+                // Get the cell value
+                $value = $sheet->getCell($col . $row)->getValue();
+                
+                // Add the cell value to the row data array
+                $rowData[] = $value;
+            }
+
+            // Add the row data to the main data array
+            $data[] = $rowData;
+        }
+
+        // Return the array containing data from the Excel file
+        return $data;
+    }
+}
+
+
+// app/Helpers/filename_helper.php
+
+if (! function_exists('generate_filename')) {
+    function generate_filename($client_short_name, $event_type, $actions, $insurer_or_tpa, $policy_name) {
+
+        $evenTypeLabel = '';
+        if($event_type == 'inception'){
+            $evenTypeLabel = 'I';
+        }else if($event_type == 'deletion'){
+            $evenTypeLabel = 'D';
+        }else if($event_type == 'correction'){
+            $evenTypeLabel = 'C';
+        }else if($event_type == 'si_enhancement'){
+            $evenTypeLabel = 'SI';
+        }
+
+        $insurer_or_tpa_lable = "";
+        if($insurer_or_tpa == 'insurer'){
+            $insurer_or_tpa_lable = 'I';
+        }else if($insurer_or_tpa == 'tpa'){
+            $insurer_or_tpa_lable = 'T';
+        }
+
+        $actions = 'E';
+        $currentDateTime = new DateTime('now', new DateTimeZone('Asia/Kolkata'));
+        $formattedDateTime = $currentDateTime->format('d-m-Y_H-i-s');
+        $policy_name = 'dsfjaisdjfa;ldsfaksl;dfaksdfaksdf';
+        $policy_name = str_replace(' ', '_', $policy_name);
+
+        // Generate file name
+        $file_name = $client_short_name. '_' . $policy_name . '_' . $insurer_or_tpa_lable . $actions . $evenTypeLabel . '_' . $formattedDateTime . '.xlsx';
+        return $file_name;
+    }
+}
diff --git a/app/Models/BatchFileModel.php b/app/Models/BatchFileModel.php
new file mode 100644
index 00000000..d97a7391
--- /dev/null
+++ b/app/Models/BatchFileModel.php
@@ -0,0 +1,25 @@
+findAll();
         return ($result);
    }
+
+    //------------------------------------------------------------------
+
+    public function getInceptionEmployeeDataForExportExcel($client_policy_id, $insurer_or_tpa, $event_type)
+    {
+        return $this->db->table('employee_polices')
+            ->select('employees.name AS emp_name,
+                    employees.emp_code AS emp_code,
+                    employees.dob  AS emp_dob,
+                    employees.gender AS emp_gender,
+                    employees.change_event AS change_event,
+                    employees.relationship AS emp_relationship,
+                    employees.relationship_code AS emp_relationship_code,
+                    TIMESTAMPDIFF(YEAR, employees.dob, CURDATE()) AS emp_age,
+                    "Has Define" as emp_type,
+
+                    employee_polices.id as employee_policy_id, 
+                    employee_polices.pre_existing_alignments, 
+                    employee_polices.basic_cover_si, 
+                    employee_polices.date_coverage, 
+                    employee_polices.policy_end_date, 
+                    employee_polices.days,
+                    employee_polices.premium,
+                    employee_polices.rata_premimum,
+                    employee_polices.gst,
+                    (employee_polices.rata_premimum + employee_polices.gst) AS total, 
+                    batch_data.emp_policy_id, 
+                    batch_data.bl AS batch_list_batch_code, 
+                    batch_data.bf AS batch_files_batch_code')
+
+            ->join('employees', 'employees.id = employee_polices.employee_id', 'left')
+            ->join("(
+                SELECT 
+                    batch_list.emp_policy_id, 
+                    batch_list.batch_code as bl, 
+                    batch_files.batch_code as bf
+                FROM batch_files 
+                LEFT JOIN batch_list ON batch_files.batch_code = batch_list.batch_code 
+                WHERE batch_files.event_type = 'inception' 
+                    AND batch_files.actions = 'export' 
+                    AND batch_files.insurer_or_tpa = '{$insurer_or_tpa}') as batch_data", 'employee_polices.id = batch_data.emp_policy_id', 'left')
+            ->where('batch_data.bf', null)
+            ->where('batch_data.bl', null)
+            ->where('employee_polices.client_policy_id', $client_policy_id)
+            ->get()
+            ->getResult();
+    }
+
+
+    public function getCorrectionEmployeesDataForExportExcel($client_id, $client_policy_id, $insurer_or_tpa)
+    {
+
+        return $this->db->table('emp_endorsement')
+        ->select('emp_endorsement.id, 
+                    emp_endorsement.emp_id, 
+                    emp_endorsement.emp_code, 
+                    emp_endorsement.endorsement_id, 
+                    emp_endorsement.old_value, 
+                    emp_endorsement.new_value, 
+                    emp_endorsement.field_name, 
+                    emp_endorsement.remarks, 
+                    employees.name AS emp_name, 
+                    employees.dob AS emp_dob, 
+                    employees.gender AS emp_gender, 
+                    employees.client_id AS emp_client_id, 
+                    "Has Define" as emp_type,
+                    employee_polices.uhid,
+                    employees.relationship_code,
+                    batch_data.emp_policy_id, 
+                    batch_data.bl AS batch_list_batch_code, 
+                    batch_data.bf AS batch_files_batch_code')
+        ->join('employees', 'employees.id = emp_endorsement.emp_id', 'left')
+        ->join('employee_polices', 'employees.id = employee_polices.employee_id', 'left')
+        ->join("(SELECT batch_list.emp_policy_id, 
+                    batch_list.batch_code as bl, 
+                    batch_files.batch_code as bf 
+                    FROM batch_files 
+                    LEFT JOIN batch_list ON batch_files.batch_code = batch_list.batch_code 
+                    WHERE batch_files.event_type = 'correction' 
+                    AND batch_files.actions = 'export' 
+                    AND batch_files.insurer_or_tpa = '{$insurer_or_tpa}') as batch_data", 'emp_endorsement.emp_id = batch_data.emp_policy_id', 'left', false)
+        ->where('batch_data.bf IS NULL')
+        ->where('batch_data.bl IS NULL')
+        ->where('emp_endorsement.endorsement_id', '')
+        ->where('employees.client_id', $client_id)
+        ->where('employee_polices.client_policy_id', $client_policy_id)
+        ->get()
+        ->getResult();
+
+    }
+
+
+    public function updateTPAIDorUHID( $client_policy_id, $client_id, $name, $emp_code, $uhid, $tpa_id)
+    {
+
+        // $this->table('employee_polices')
+        // ->join('employees', 'employees.id = employee_polices.employee_id')
+        // ->set('employee_polices.tpa_id', $tpa_id)
+        // ->set('employee_polices.uhid', $uhid)
+        // ->where('employees.emp_code', $emp_code)
+        // ->where('employees.name', $name)
+        // ->where('employees.client_id', $client_id)
+        // ->where('employee_polices.client_policy_id', $client_policy_id)
+        // ->update();
+
+        $query = "UPDATE employee_polices
+                    JOIN employees ON employees.id = employee_polices.employee_id
+                    SET employee_polices.tpa_id = '{$tpa_id}', 
+                        employee_polices.uhid = '{$uhid}'
+                    WHERE employees.emp_code = '{$emp_code}'
+                    AND employees.name = '{$name}'
+                    AND employees.client_id = '{$client_id}'
+                    AND employee_polices.client_policy_id = '{$client_policy_id}'";
+
+        $this->query($query);
+
+
+    }
+
+
+    public function updateCorrectionData($emp_code, $uhid, $endorsement_id){
+
+        $sql = "
+            UPDATE emp_endorsement 
+            JOIN employees ON employees.id = emp_endorsement.emp_id
+            JOIN employee_polices ON employees.id = employee_polices.employee_id
+            SET emp_endorsement.endorsement_id = '$endorsement_id'
+            WHERE employees.emp_code = '$emp_code'
+            AND employee_polices.uhid = '$uhid'
+        ";
+        $query = $this->query($sql);
+    }
+
+    
+    //------------------------------------------------------------------
 }
diff --git a/app/Views/UserList.php b/app/Views/UserList.php
index 47806801..bb36986f 100644
--- a/app/Views/UserList.php
+++ b/app/Views/UserList.php
@@ -291,5 +291,13 @@ function onlyNumbers(event){
     return false;
 }
 
+var form = document.getElementById("UserForm");
+
+// Add submit event listener to the form
+form.addEventListener("submit", function(event) {
+    // Disable the submit button to avoid multiple submissions
+    document.getElementById("btnSubmit").disabled = true;
+});
+
 
 
diff --git a/app/Views/client_basic_info.php b/app/Views/client_basic_info.php
index c7a54c83..e743434f 100644
--- a/app/Views/client_basic_info.php
+++ b/app/Views/client_basic_info.php
@@ -127,8 +127,13 @@ $(document).ready(function () {
     $("#general_form").submit(function(event) {
 
         event.preventDefault(); 
+
+        var $submitButton = $('#general_form').find('button[type="submit"]');
+        $submitButton.prop('disabled', true); // Disable the submit button
+
         var isValid = $('#general_form').parsley().validate();    
         if (!isValid) { 
+            $submitButton.prop('disabled', false);
             console.log('Form is Empty', 'Warning');
             return ; 
         }
@@ -162,7 +167,7 @@ $(document).ready(function () {
                         $('#kyc_tab').click();
                         var message = (PrimaryKey === '') ? 'Client General Info Created successfully' : 'Client General Info Updated successfully';
                         toastr.success(message, 'Success');
-
+                        $submitButton.prop('disabled', false);
                     }, 1000);
                 }
                 
@@ -177,42 +182,57 @@ $(document).ready(function () {
                 $('#kyc_PrimaryKey').val(res.data.id);
                 $('#entity_type').val(res.data.entity_type_id);
 
-                $.ajax({
-                    url: '' + res.data.entity_type_id,
-                    type: "GET",
-                    dataType: 'json',
-                    processData: false,
-                    contentType: false,
-                    success: function (res) {
-                        
-                        console.log(res);
-                        var tbody = $('#tbody');
-                        tbody.empty(); 
+                console.log()
 
-                        $.each(res.data, function (index, item) {
-                            var row = `
-                                         ${item.file_name}
-                                        
- - - -
- - - `; - tbody.append(row); - }); - }, - error: function (xhr, status, error) { - console.error(xhr.responseText); - console.error(status, error); - } - }); + if(PrimaryKey === ''){ + $.ajax({ + url: '' + res.data.entity_type_id, + type: "GET", + dataType: 'json', + processData: false, + contentType: false, + success: function (res) { + + console.log('kyc docs', res); + var tbody = $('#tbody'); + tbody.empty(); + $.each(res.data, function (index, item) { + var row = ` + ${item.file_name} +
+ + + +
+ + + `; + tbody.append(row); + }); + }, + error: function (xhr, status, error) { + console.error(xhr.responseText); + console.error(status, error); + } + }); + } }, error: function (xhr, status, error) { console.error(xhr.responseText); console.error(status, error); + setTimeout(function() { + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + $submitButton.prop('disabled', false); + if (xhr.status === 404) { + toastr.warning('Resource not found', 'Warning'); + } else if (xhr.status === 500) { + toastr.warning('Internal server error', 'Warning'); + } else { + toastr.warning('Unknown error occurred', 'Warning'); + } + }, 1000); } }); }); diff --git a/app/Views/client_kyc.php b/app/Views/client_kyc.php index 9ea8fbea..59051f6a 100644 --- a/app/Views/client_kyc.php +++ b/app/Views/client_kyc.php @@ -94,7 +94,7 @@ +//-------------------------------------------------------------------------------------- + + + /**This function updates the download link based on the selected option in the dropdown menu. **/ + $('#upload-action-type').change(function() { + + var selectedValue = $(this).val(); + if(selectedValue !== ''){ + $('#file_upload').show(); + var fullURL = '' + selectedValue; + $('#excel_download').attr('href', fullURL); + }else{ + $('#file_upload').hide(); + $('#excel_download').removeAttr('href'); + } + }); + + + /** This function verifies if the download link (#excel_download) has its href attribute set, + ** ensuring proper link configuration. **/ + + $('#excel_download').click(function() { + + // Check if the element with ID "excel_download" has the href attribute set + if (!$(this).attr('href')) { + // If href attribute is not set, show an error message + toastr.warning('Please select an Action to download a sample Excel.', 'Warning'); + } else { + console.log('Download action triggered.'); + } + }); +//-------------------------------------------------------------------------------------- + + \ No newline at end of file diff --git a/app/Views/excel_errors.php b/app/Views/excel_errors.php index 0b9b2044..25b100ad 100644 --- a/app/Views/excel_errors.php +++ b/app/Views/excel_errors.php @@ -1,34 +1,125 @@ -
-
-
-
-
-
-

Excel Error List

-
-
-
- - - - - - - - - - - - - - - - - -
-
-
-
-
- -
\ No newline at end of file + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
> + '; + echo '' . implode("
", $data['error']) . '
'; + } + ?> +
+
+ + + + + + + + + + + + + + diff --git a/app/Views/import_export.php b/app/Views/import_export.php new file mode 100644 index 00000000..361c9124 --- /dev/null +++ b/app/Views/import_export.php @@ -0,0 +1,32 @@ + + + + + + + + diff --git a/app/Views/insurer_or_tpa_data.php b/app/Views/insurer_or_tpa_data.php new file mode 100644 index 00000000..3a2af61c --- /dev/null +++ b/app/Views/insurer_or_tpa_data.php @@ -0,0 +1,334 @@ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+ + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/app/Views/layout/header.php b/app/Views/layout/header.php index 21d677aa..672924c5 100644 --- a/app/Views/layout/header.php +++ b/app/Views/layout/header.php @@ -43,10 +43,6 @@ /assets/css/jodit.css" rel="stylesheet" type="text/css" /> - - - - diff --git a/writable/session/.gitkeep b/public/sample_excel/.gitkeep similarity index 100% rename from writable/session/.gitkeep rename to public/sample_excel/.gitkeep diff --git a/public/sample_excel/inception.xls b/public/sample_excel/inception.xls new file mode 100644 index 0000000000000000000000000000000000000000..850d8d0654fa519e3adc68ad8e194c5be89f09b0 GIT binary patch literal 10240 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 Ie^CE_0Ldo-IRF3v literal 0 HcmV?d00001 diff --git a/public/sample_excel/inception_1.xls b/public/sample_excel/inception_1.xls new file mode 100644 index 0000000000000000000000000000000000000000..850d8d0654fa519e3adc68ad8e194c5be89f09b0 GIT binary patch literal 10240 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 Ie^CE_0Ldo-IRF3v literal 0 HcmV?d00001 diff --git a/public/sample_excel/inception_2.xls b/public/sample_excel/inception_2.xls new file mode 100644 index 0000000000000000000000000000000000000000..850d8d0654fa519e3adc68ad8e194c5be89f09b0 GIT binary patch literal 10240 zcmeHNeT-aH6+dsjXJ^~lEwtc*vyW|eDgA<$sE9%KYg!h&AMIAGq=~-nyzNdqJJZb0 zB5V9uD)@(i1ciizV6X&H)cAo35=AJQ7)|`BCYaa|Q~ZMj#biO$puqb3o%`O*o0(m^ zt;7VD)J}P19FtPVZbR&*#EE6uNWMQ7*1f5xz37VuL)sSdH~ne@*VAY zQm@wuGZ0Fz*w^TTCBH?3WAD;ymtI%nYRM0D%qgX8mk#+kxE4QqH#ag2h+2JE19@?z zAPv1>cjOBuLb_HK024a!~bemrH}lz!bB%RuAfGEdkr5K?zIrcLe*JEX&Aq zs^7PJIsL7o98K~wkyd$_yTq>SNOo`E?o6azzRDfqqbLWq4i6vLIyjh#tdU2!Weg6I z1R8tE`Zcl!iKpd4=y+KEzG&m_mlHPWoEoLSx-vRlx)lF%bV^-{|D8*J7(TUWo>zQ7 zZ#I5lXln84S1d!{vJ8FGGW6t<^q9`OuakG9R}fK(lLr$mKK+p;=~2kpV|9t__t+!J zRg9lF>CY28UOY7ajs6tZ5B?} zi4#^YuDz0ZnJz%0Oh8!TBGiAvE3eB?a`e! z2v-hf$Dn6$v>yz+++xlxL(tyr?!J9Pqa))t42|K;-rqMqG++;m-jv;Ij}IyPjR4W_ z%;YERF=q}Q>UWB{D|eNhoQqi*bZ7F1icTe8D&nnRY^qdranDXW`2zeswl`~M_YaNl z8yeYV_YLhH&W`LGhn9&cr+CP<-CNvZ#kPSW=Tuy~G-)rZ z1XV!cUT4}KD?3M=nJJp<7AE19akrQUZ{N&JX(A6%SQ}+$`lw;+Jw!CyCQ8%r_z(;j zowmI$5QZUqr&F17%kX=_IWjXfowrLtj-B8bE|CKd<3~%gGcGiLvNY$wQl~uU6yc`v zQV}x)dyYW;%#>YrN)UcCXhyh=a4R^UxIpA+IX~yvb)4XuRs|jx%yi0!XNz{(&E@7G zryr$>Krjcu(q6BE>D+XbRXoiw=$JC-I!3i@yP77QwD3! zEx2UGV_B!u&0*BwBHrnC$k(xbL%K{P)}rFUE0|p^AwUyzKy0f!Ahsg7b65ymTgJ-BMY#<<&qOxqh|PLEro2qi;OH6X>01j#u%TyQ z%s~|OjD1eoZr5uML|(1s#p^E*Ja5GFq?U#2uLwLJmo5Ozq4IZ3wpd#%f4qOU6OFm3kq?pGMB_9y z^6`s6BMqyiiN@E5Mm`2rBMr0LL}Q>e@?oVk(HO0bd{_anx#oj6^m~QBX_=OVt&n~( ztq@xDh-ro8U7EK|D}p|H!L*`i(SFm4p+(D0D~=XzHmwBSBxtQ^CDEdtrqzNLEi|nZ zTC~lyTICXrJkwf*7VR;u)z~mO>!y{Kck357(`rK>=ijv2(c+i6AHzGeGov^&(&5lI zlOZ3!ZsQ2_r5o z*wcmQyH|x?wfaqeE6xYZBcDMMv0&5ss>hi!(!y0lw48^GdMAjME3Z?y5;&f3eH)~s z*H{t)>TdYn*dD_CbYlj6P9OVIDmyMcikisR!_P)q5KX8K4cA0QeI7&;Rx}-+4rYN3 z@(^-2Ee$K0OFT4TMZ;qbHH9$?#*;)7h9{fRgzJ10u0z8(%;=o?Xsl2S`sf?Vk0_EI zZ6QU%Y}AeTF@A{vNhc!4Ac@o=i7bgEqDcJsjsVH!)mh>i$Y{$)LffN?B;)CbDw_Ml z22HezhM1WdyA^Y^4oP%LB+)vbMC*J)e86C?)##2Xl1>jvOp!eHWrKtstHlekbR+hS zUznk5GZa%a8^!;bc!>ecM#wjQjn$#y`p@8}n5t;v;NFPUV|2t7&Cgyk@xqO+TUQG` z7*{mwtDHeJ@g>o452>Mv*P&tl$*An$EG5)88$2BeMe}>h_$E>3n}nk2u5t#^B$h;z zs6&&eL&N-+LB!YlCaGvhWdtYdW-19Zoz<0{1R6gpT?|g5`N_Y+a)mth(-5re!r3gL zk)K3w7oye7P!fLaf{#pYN_x5J^z3sF{kxAoPa+SjhZG+{FdHQ6EMU&g$R@pJs{ z)TvZjz*W9MZaQvemus?S0ar+8H8-`uf*vXVHHLh;M(4gc8?@9#ehV^DS~f#JaknV8 zEod=satF!Cwgzk|#kLhxuDXSK9W{kDV=BLOaAP<92~K*j6+IWpA5WOQs1>_fTCPH$;pASi z-Q(oWn3nhA`jU*{DYS3{o^kYCVB}k`H%qVH#xBp1v{i43(8k`^7uG0blt z46TvJnO>xq7r9xlUqLq`ihFOENs)?}YTMfn;YIBbHG2i8VSa~Y>j~?AuvxIJRZjlm z&vUQ+@Yn5k9+Pj#haOEalW=F_?pVe*ziE73<^2fij7&lMA#M2wZ1oZhy3b-yfNmm6Y3CZuQ zCkbQT%1H{qT+t)v-v2u;&zr=;HcvLZpD*uh4_KJxFjhCMY)f!&5;>t)*~xc_;rv9o zG*g9pL5VH6kHq|@bxM`ImxZ)oD1U5C_P6BZ(_e?+HEY1>(h5U_{wXe zQ*Gb;VnQ}w{{262cls16fwP~$c}nd?WrEv{%5&9zRGwpUs62BVMWu!p-{9HCeC2%) z4kf*KmPa4^+k+6M&upXgqR#*0z8BU_oU-^VYlrT{7iWfu1H)W-k)7{Y&nOzNDFQo$*-1j_P-@1oSqeS`Pq zIcq)i*SEZ8R0g48LNU1dA1G&s=bCe{pX(Qd!2L|E|uFIK{TCLUim?`Ps= Ie^CE_0Ldo-IRF3v literal 0 HcmV?d00001 diff --git a/public/sample_excel/inception_3.xls b/public/sample_excel/inception_3.xls new file mode 100644 index 0000000000000000000000000000000000000000..850d8d0654fa519e3adc68ad8e194c5be89f09b0 GIT binary patch literal 10240 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 Ie^CE_0Ldo-IRF3v literal 0 HcmV?d00001 From 434abf1a8c70fcfa031b7c48abda969c198f3a55 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Thu, 14 Mar 2024 15:57:20 +0530 Subject: [PATCH 2/2] CHANGE_EXCEL_HELPER : RV --- app/Helpers/excel_import_export_helper.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Helpers/excel_import_export_helper.php b/app/Helpers/excel_import_export_helper.php index 9a655c2e..e594f650 100644 --- a/app/Helpers/excel_import_export_helper.php +++ b/app/Helpers/excel_import_export_helper.php @@ -251,7 +251,6 @@ if (! function_exists('generate_filename')) { $actions = 'E'; $currentDateTime = new DateTime('now', new DateTimeZone('Asia/Kolkata')); $formattedDateTime = $currentDateTime->format('d-m-Y_H-i-s'); - $policy_name = 'dsfjaisdjfa;ldsfaksl;dfaksdfaksdf'; $policy_name = str_replace(' ', '_', $policy_name); // Generate file name