From e09b7199b8cd5b32804ec24d3a6a0df7e5765b29 Mon Sep 17 00:00:00 2001 From: aadhavan valli Date: Tue, 19 Mar 2024 23:51:24 +0530 Subject: [PATCH] CHANGE_EMPLOYEE_REST_FILE_UPLOAD_MAIL : AADHAVAN --- app/Config/Filters.php | 2 +- app/Config/Routes.php | 6 +- app/Controllers/EmployeeRestController.php | 143 +++++++++++++++------ app/Controllers/Home.php | 2 +- app/Controllers/JobWorker.php | 38 +++++- app/Helpers/MailHelper.php | 15 +-- app/Models/EmployeeModel.php | 1 + app/Views/mail_welcome.php | 23 ++++ composer.json | 1 + public/assets/images/Nhance-Logo-Final.png | Bin 0 -> 4069 bytes 10 files changed, 173 insertions(+), 58 deletions(-) create mode 100644 app/Views/mail_welcome.php create mode 100644 public/assets/images/Nhance-Logo-Final.png diff --git a/app/Config/Filters.php b/app/Config/Filters.php index 4f16d072..40324597 100644 --- a/app/Config/Filters.php +++ b/app/Config/Filters.php @@ -44,7 +44,7 @@ class Filters extends BaseConfig */ public array $globals = [ 'before' => [ - 'HttpRequestLog' => ['except' => 'processjob'], + 'HttpRequestLog' => ['except' => 'cli/*'], // 'csrf', // 'invalidchars', ], diff --git a/app/Config/Routes.php b/app/Config/Routes.php index cce60574..ed5af8ac 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -6,7 +6,7 @@ use CodeIgniter\Router\RouteCollection; * @var RouteCollection $routes */ // $routes->get('/', 'LoginController::index'); -$routes->get('/test', 'Home::test'); +$routes->get('/test', 'Home::index'); $routes->get('/login', 'LoginController::index');///auth/google $routes->get('/logout', 'LoginController::logout'); $routes->get('/oauth2callback', 'LoginController::receiveGoogleOAuthResponse'); @@ -191,7 +191,8 @@ $routes->group("/util", ["filter" => "authMVC"], function($routes){ $routes->post("import-export", "EmployeeController::importExport"); }); -$routes->cli('processjob', 'JobWorker::processJob'); +$routes->cli('cli/processjob', 'JobWorker::processJob'); +$routes->cli('cli/processjobs', 'JobWorker::processJobs'); @@ -215,6 +216,7 @@ $routes->post("/editEmployeeProfile", "EmployeeRestController::editEmployeeProfi $routes->get("getClientPolicy", "EmployeeRestController::getClientPolicy"); +$routes->post("employeeUpload", "EmployeeRestController::employeeUpload"); $routes->group("employeeRest", ["filter" => "authJWT"], function($routes){ $routes->post("employeeUpload", "EmployeeRestController::employeeUpload"); diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index 36eddb23..e46b0f93 100644 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -18,6 +18,9 @@ use App\Models\RelationshipModel; use App\Models\FileModel; use App\Models\ClientPolicyModel; +use App\Controllers\Jobs ; +use App\Controllers\JobWorker ; + use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; @@ -411,26 +414,31 @@ class EmployeeRestController extends AdminController $highestRow = $sheet->getHighestRow(); $highestColumn = $sheet->getHighestColumn(); - $data = []; + $highestRowAndColumn = $sheet->getHighestRowAndColumn(); + $data = $sheet->rangeToArray('A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row']); + // print_r($excel_data);die(); + // $data = []; + // $data[] =$excel_data; + // print_r($data);die; // Iterate through each row - for ($row = 1; $row <= $highestRow; $row++) { - // Initialize the row data array - $rowData = []; + // 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; - } + // // Iterate through each column in the row + // for ($col = 'A'; $col <= $highestColumn; $col++) { + // // Get the cell value + // $value = $sheet->getCell($col . $row)->getValue(); + // // print_r($value); + // // Add the cell value to the row data array + // $rowData[] = $value; + // } + // // Add the row data to the main data array + // $data[] = $rowData; + // } + // print_r($data);die; $extractData['file_name']= $filename; $extractData['client_id']= $client_id; @@ -442,6 +450,10 @@ class EmployeeRestController extends AdminController $file_data =$this->fileModel->insert($extractData); $extra = []; + //this change the column name into index number + for ($i = 0; $i < count($data[0]); $i++) { + $data[0][$i] = $i; + } for ($i = 0; $i < count($data); $i++) { if ($i == 0) { // Loop through the first row to extract keys @@ -462,27 +474,64 @@ class EmployeeRestController extends AdminController // print_r("Extra", $extra);die; $dataToInsert = []; $basic_cover_si= []; - foreach ($extra['id'] as $index => $id) { - $record = [ - // 'id' => $id, - 'emp_code' => isset($extra['emp_code'][$index]) ? $extra['emp_code'][$index] : 0, - 'name' => $extra['name'][$index], - // Check if the 'doj' key exists before accessing it - 'doj' => isset($extra['doj'][$index]) ? $extra['doj'][$index] : null, - 'gender' => $extra['gender'][$index], - 'relationship' => $extra['relationship'][$index], - 'dob' => $extra['dob'][$index], - 'email_personal' => $extra['Email'][$index], - 'client_id' => $client_id, - ]; - $record2 = [ - 'basic_cover_si' => isset($extra['sum_insure'][$index]) ? $extra['sum_insure'][$index] : 0, - ]; + // print_r($extra);die; + foreach ($extra['0'] as $index => $id) { + $relation =''; + if ($extra['5'][$index] === 'Mother' || $extra['5'][$index] === 'Father') { + $relation = 'parent'; + } else if($extra['5'][$index] === 'Son' || $extra['5'][$index] === 'Daughter'){ + $relation = 'child'; + }else if($extra['5'][$index] === 'Father in Law' || $extra['5'][$index] === 'Mother in Law'){ + $relation = 'parent_in_law'; + }else if($extra['5'][$index] === 'Spouse'){ + $relation = 'spouse'; + }else{ + $relation = 'self'; + } + + // Simplified formatDate function - $dataToInsert[] = $record; - $basic_cover_si[]= $record2; + + // Assigning formatted dates + // print_r($extra['3']);die; + $doj = $extra['3'][$index] ; + $dob = $extra['6'][$index] ; + + + // Change date format for $doj + $doj_new_format = date('Y-m-d', strtotime($doj)); // $doj_new_format will be "2001-02-12" + + // Change date format for $dob + $dob_new_format = date('Y-m-d', strtotime($dob)); + + // Your existing code here + + $emp_code =isset($extra['1'][$index]) ? $extra['1'][$index] : 0; + $name = $extra['2'][$index]; + + if($emp_code != 0 && $name != '' || $name != null){ + $record = [ + // 'id' => $id, + 'emp_code' => $emp_code, + 'name' => $name, + // Check if the 'doj' key exists before accessing it + 'doj' => $doj_new_format, + 'gender' => $extra['4'][$index], + 'relationship' => $extra['5'][$index], + 'family_floater_key' => $relation, + 'dob' => $dob_new_format, + 'email_corporate' => $extra['7'][$index], + 'mobile'=> $extra['8'][$index], + 'client_id' => $client_id, + + ]; + $record2 = [ + 'basic_cover_si' => isset($extra['9'][$index]) ? $extra['9'][$index] : 0, + ]; + $dataToInsert[] = $record; + $basic_cover_si[]= $record2; + } } - // print_r("dataToInsert", $dataToInsert);die; for ($a=0; $a employeeModel->checkExistingEmpEntrollment($dataToInsert[$a]); @@ -496,6 +545,7 @@ class EmployeeRestController extends AdminController $this->myLogger->logme('error',('Update - ' . $employee['id'].' - '. $employee['emp_code'] .' - '.$employee['name'])); } }else{ + $result = $this->employeeModel->insert($dataToInsert[$a]); $emp_id =$result; if ($result) { @@ -529,13 +579,24 @@ class EmployeeRestController extends AdminController // print_r($dataToInsert[$a]['email_personal']);die; $policy = $this->clientPolicyModel->where('id', $policy_id)->first(); $policy_name = $this->policesModel->where('id', $policy['policy_id'])->first(); - $mail = $dataToInsert[$a]['email_personal']; + $mail = $dataToInsert[$a]['email_corporate']; $subject = 'Welcome, Employee Benefit Program Enrolment'; - $message = 'Dear ' . $dataToInsert[$a]['name'] . ",
We are glad to welcome you to the employee benefit program ," .$policy_name['name'] ."offered by your employer,


Click on the link below to review your personal and family details:
Review Details" ; - $return_log = MailHelper::send_email($mail,$subject, $message); - $return_log = json_decode($return_log); - - $this->myLogger->logme('info', "Email Status : {mail_status}, Sender Email:{email}", ['mail_status' => $return_log->status, 'email'=> $return_log->data]); + // $message = 'Dear ' . $dataToInsert[$a]['name'] . ",
We are glad to welcome you to the employee benefit program ," .$policy_name['name'] ."offered by your employer,


Click on the link below to review your personal and family details:
Review Details" ; + $data['employee_name']=$dataToInsert[$a]['name']; + $data['policy_name']=$policy_name['name']; + + $message = view('mail_welcome', $data); + if ($dataToInsert[$a]['email_corporate'] != null || $dataToInsert[$a]['email_corporate'] != '' && $dataToInsert[$a]['relationship'] == 'Self') { + $job_details = new Jobs(); + $r = Jobs::addJob(['job_name' => 'send_email','payload' => ['mail' => $mail, 'subject' => $subject,'message'=> $message]]); + } + + // print_r($r);//die(); + // $jobWorker = new JobWorker(); + //JobWorker::processJob($r); + // $return_log = MailHelper::send_email($mail,$subject, $message); + // $return_log = json_decode($return_log); + // $this->myLogger->logme('info', "Email Status : {mail_status}, Sender Email:{email}", ['mail_status' => $return_log->status, 'email'=> $return_log->data]); } } diff --git a/app/Controllers/Home.php b/app/Controllers/Home.php index 9280fa95..9f76bf77 100644 --- a/app/Controllers/Home.php +++ b/app/Controllers/Home.php @@ -6,7 +6,7 @@ class Home extends PublicController { public function index(): string { - return view('welcome_message'); + return view('mail_welcome'); } public function test() diff --git a/app/Controllers/JobWorker.php b/app/Controllers/JobWorker.php index f3a2ab2a..964d365a 100644 --- a/app/Controllers/JobWorker.php +++ b/app/Controllers/JobWorker.php @@ -14,7 +14,7 @@ class JobWorker extends AdminController * Constructs the class */ - private static $event_class_mapping = ['add' => ['type' => 'HC','handler' => 'App\\Helpers\\HttpRequestHelper'], 'sub' => ['type' => 'CC','handler' => 'App\\Controllers\\Jobs\SubJob'],'fancy_date_time_format' => [ 'type' => 'HF','handler' => 'fancy_date_time_format'],'addNumber' => ['type' => 'HC','handler' => 'App\\Model\\HttpRequestHelper'],'excelFileFormatValidation' => ['type' => 'CC','handler' => 'App\\Controllers\\EmployeeServiceController'],'excelFileDataValidation' => ['type' => 'CC','handler' => 'App\\Controllers\\EmployeeServiceController'],'employeeOnboard' => ['type' => 'CC','handler' => 'App\\Controllers\\EmployeeServiceController']]; + private static $event_class_mapping = ['add' => ['type' => 'HC','handler' => 'App\\Helpers\\HttpRequestHelper'], 'sub' => ['type' => 'CC','handler' => 'App\\Controllers\\Jobs\SubJob'],'fancy_date_time_format' => [ 'type' => 'HF','handler' => 'fancy_date_time_format'],'addNumber' => ['type' => 'HC','handler' => 'App\\Model\\HttpRequestHelper'],'excelFileFormatValidation' => ['type' => 'CC','handler' => 'App\\Controllers\\EmployeeServiceController'],'excelFileDataValidation' => ['type' => 'CC','handler' => 'App\\Controllers\\EmployeeServiceController'],'employeeOnboard' => ['type' => 'CC','handler' => 'App\\Controllers\\EmployeeServiceController'],'send_email' => ['type' => 'HC','handler' => 'App\\Helpers\\MailHelper']]; public function __construct() { // echo 'HiC';//die(); @@ -27,12 +27,39 @@ class JobWorker extends AdminController // } } + public static function processJobs(array $jobdata = []) + { + // echo 'listen';//die(); + $query = " + SELECT id, name, payload, uuid + FROM jobs + WHERE status=? + ORDER BY created_dt ASC"; + $where_condition = [self::STATUS_QUEUED]; + $db = \Config\Database::connect(); + $jobs = $db->query($query, $where_condition)->getResult(); + + if(count($jobs)) + { + // echo count($jobs); + // print_r($jobs);die; + foreach($jobs as $key => $job) + { + // echo $job->id.' - '.$job->name; + //sleep(1); + + SELF::processjob(['id' => $job->id,'uuid' => $job->uuid]); + } + } + } /** * process jobs */ public static function processJob(array $jobdata = []) { - // echo 'listen';//die(); + // print_r($jobdata); + // echo 'listen'; + // die(); $query = " SELECT id, name, payload, uuid FROM jobs @@ -61,7 +88,9 @@ class JobWorker extends AdminController echo "\nProcessing job id - " . $job->id . "\n"; echo "Job name - " . $job->name . "\n"; - + // print_r(SELF::$event_class_mapping); + // echo array_key_exists($job->name,SELF::$event_class_mapping) ? 'mapped' : 'notmapped'; + // die(); try { $start = microtime(true); @@ -69,7 +98,7 @@ class JobWorker extends AdminController $job_status = self::STATUS_RUNNING; $db->query("UPDATE jobs SET status=? WHERE id=? AND uuid=?", [$job_status, $job->id,$job->uuid]); - if (!array_key_exists($job->name,SeLf::$event_class_mapping)) + if (!array_key_exists($job->name,SELF::$event_class_mapping)) { throw new \RuntimeException('Job ' . $job->name . ' handler not registered'); } @@ -145,6 +174,7 @@ class JobWorker extends AdminController // echo "Job $job->id $job_status. Response - $response \n"; echo "Job $job->id $job_status \n"; + return true; } else { diff --git a/app/Helpers/MailHelper.php b/app/Helpers/MailHelper.php index fd56e4f5..9709de46 100644 --- a/app/Helpers/MailHelper.php +++ b/app/Helpers/MailHelper.php @@ -12,11 +12,15 @@ use PHPMailer\PHPMailer\Exception; class MailHelper { - static function send_email($emaill, $subject, $message) + public static function send_email($params) { + $emaill = $params['mail']; + $subject = $params['subject']; + $message = $params['message']; try { $email = \Config\Services::email(); - $email->setFrom('bbone@venbait.in', 'Venkat'); + $email->setMailType('html'); + $email->setFrom('bbone@venbait.in', 'Nhance'); $email->setTo($emaill); @@ -33,12 +37,5 @@ class MailHelper return json_encode(['status' => 'failed','code' => 500,'data' => $emaill],500); } } - - - function logme($message, $email) { - // Your logging logic here - // For example, writing to a log file - file_put_contents('path/to/log/file.txt', $message . "\n", FILE_APPEND); - } } ?> \ No newline at end of file diff --git a/app/Models/EmployeeModel.php b/app/Models/EmployeeModel.php index 41c42a52..09eeb13d 100644 --- a/app/Models/EmployeeModel.php +++ b/app/Models/EmployeeModel.php @@ -23,6 +23,7 @@ class EmployeeModel extends Model "mobile", "gender", "dob", + "doj", "otp", "family_floater_key", "emp_status", diff --git a/app/Views/mail_welcome.php b/app/Views/mail_welcome.php new file mode 100644 index 00000000..9ebdd64b --- /dev/null +++ b/app/Views/mail_welcome.php @@ -0,0 +1,23 @@ + + + + + + +
+ +
+
+ Dear, +

We are glad to welcome you to the employee benefit program, offered by your employer.

+
+ +
+
+ + + diff --git a/composer.json b/composer.json index 12d029a0..e0f50cfa 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ "firebase/php-jwt": "^6.10", "google/apiclient": "^2.15.0", "laminas/laminas-escaper": "^2.9", + "php-amqplib/php-amqplib": "^2.8", "phpmailer/phpmailer": "^6.9", "phpoffice/phpspreadsheet": "^2.0", "psr/log": "^1.1", diff --git a/public/assets/images/Nhance-Logo-Final.png b/public/assets/images/Nhance-Logo-Final.png new file mode 100644 index 0000000000000000000000000000000000000000..0d331b6844d5e4a205d94f90b8f999ba00b5041d GIT binary patch literal 4069 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 X000000Mb*F00000NkvXXu0mjfbUfZE literal 0 HcmV?d00001