From 0db6fdfeadd860c4a773d3b352425ad4d3fd7fcf Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Fri, 26 Apr 2024 11:25:07 +0530 Subject: [PATCH] FEAT_E_CARD_MAIL_SEND : RV --- app/Config/Routes.php | 2 +- app/Controllers/EmpDataServiceController.php | 71 ++++- app/Controllers/EmployeeController.php | 124 +++----- app/Helpers/utility_helper.php | 36 +++ app/Models/EmployeePolicyModel.php | 315 ++++++++++--------- app/Views/id_card_view.php | 5 - 6 files changed, 314 insertions(+), 239 deletions(-) diff --git a/app/Config/Routes.php b/app/Config/Routes.php index a1ad29d4..240671ef 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -17,7 +17,7 @@ $routes->get('/logout', 'LoginController::logout'); $routes->get('/oauth2callback', 'LoginController::receiveGoogleOAuthResponse'); $routes->get('/auth/google', 'LoginController::initiateGoogleOAuth'); $routes->get('/update-emp-policy-status', 'ClientController::updateEmpAndPolicyStatus'); -$routes->get('download-e-card/(:segment)/(:segment)', 'EmployeeController::generateIDCardForEmployee/$1/$2'); +$routes->get('download-e-card/(:segment)', 'EmployeeController::generateIDCardForEmployee/$1'); diff --git a/app/Controllers/EmpDataServiceController.php b/app/Controllers/EmpDataServiceController.php index 80095b64..e2e50f9f 100644 --- a/app/Controllers/EmpDataServiceController.php +++ b/app/Controllers/EmpDataServiceController.php @@ -8,6 +8,7 @@ use CodeIgniter\HTTP\ResponseInterface; use Psr\Log\LoggerInterface; use App\Helpers\DepositHelper; +use App\Helpers\MailHelper; use App\Models\EmployeeModel; @@ -644,7 +645,10 @@ class EmpDataServiceController extends BaseController ]; $this->cashDepositCalculationForInception($depositeData); - + + + $this->sendMailForDownloadingECard($empty_emp_tpa_uh_ids); + } @@ -1586,4 +1590,69 @@ class EmpDataServiceController extends BaseController return true; } + + + public function sendMailForDownloadingECard(array $ids) + { + try { + foreach ($ids as $key => $id) { + + $get_emp_email_and_other_details = $this->employeePolicyModel + ->select('employee_polices.client_policy_id, employees.emp_code, employees.email_corporate, employees.name, employee_polices.rand_string, employee_polices.tpa_id') + ->join('employees', 'employees.id = employee_polices.employee_id') + ->where('employees.emp_status', 'active') + ->where('employees.is_active', '1') + ->where('employee_polices.status', 'active') + ->where('employee_polices.is_active', '1') + ->where('employee_polices.id', $id)->first(); + + if ($get_emp_email_and_other_details != null && $get_emp_email_and_other_details != "") { + + $name = $get_emp_email_and_other_details['name']; + $email = $get_emp_email_and_other_details['email_corporate']; + $rand_string = $get_emp_email_and_other_details['rand_string']; + $tpa_id = $get_emp_email_and_other_details['tpa_id']; + $link = generate_download_link($rand_string); + $subject = 'Download E-Card'; + + $html = ' +

Dear ' .$name .',

+

Your Policy( ' .$tpa_id .' ) has been successfully created. Please click the link below to download the insurance card:

+

Download Insurance Card

+

Thank you,

+ '; + + + + if ($email != null && $email != "") { + + $mail_data = [ + 'mail' => $email, + 'subject' => $subject, + 'message' => $html + ]; + + // dd($mail_data); + + $result = Mailhelper::send_email($mail_data); + $decoded_result = (array) json_decode($result); + + $data = [ + 'status' => $decoded_result['status'], + 'message'=>$decoded_result['message'] ?? 'Internal Server Error', + 'email' => $decoded_result['data'] + ]; + + // dd($data); + $this->myLogger->logme('error', 'status : {status}, message : {message}, email : {email}', $data); + } + } + } + return true; // Email(s) sent successfully + } catch (\Exception $e) { + // Log the error + $this->myLogger->log('error', 'Error occurred while sending email: ' . $e->getMessage()); + return false; // Email(s) sending failed + } + } } diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php index bfcc61d9..0efa458a 100644 --- a/app/Controllers/EmployeeController.php +++ b/app/Controllers/EmployeeController.php @@ -131,8 +131,8 @@ class EmployeeController extends AdminController // print_r($this->request->getPost('policies')); // print_r($this->request->getPost('upload-action-type')); // die(); - // $empServiceController = new EmployeeServiceController(); - // $res = $empServiceController->excelFileFormatValidation(['file_id' => '42']); + $empServiceController = new EmployeeServiceController(); + $res = $empServiceController->excelFileFormatValidation(['file_id' => '42']); // dd($res); // $empServiceController = new EmployeeServiceController(); @@ -723,7 +723,7 @@ class EmployeeController extends AdminController } - public function downloadFullExcelErrorFile($file_id = 137, $rowIndex = 1, $colIndex = 1) + public function downloadFullExcelErrorFile($file_id, $rowIndex = 1, $colIndex = 1) { // Get file data from the database $file_data = $this->fileModel->find($file_id); @@ -832,97 +832,61 @@ class EmployeeController extends AdminController // Return the response return $response; } - - public function generateIDCardForEmployee($emp_code, $client_policy_id) - { - $dompdf = new Dompdf(); + + public function generateIDCardForEmployee($rand_string) + { + $get_emp_code_and_client_policy_id = $this->employeePolicyModel + ->select('employee_polices.client_policy_id, employees.emp_code') + ->join('employees', 'employees.id = employee_polices.employee_id') + ->where('employees.emp_status', 'active') + ->where('employees.is_active', '1') + ->where('employee_polices.status', 'active') + ->where('employee_polices.is_active', '1') + ->where('employee_polices.rand_string', $rand_string)->first(); + + if($get_emp_code_and_client_policy_id == null || $get_emp_code_and_client_policy_id == ""){ + + $data['message'] = 'Record Not Found'; + return view('errors/404', $data); + + } + + $client_policy_id = $get_emp_code_and_client_policy_id['client_policy_id']; + $emp_code = $get_emp_code_and_client_policy_id['emp_code']; $data['data'] = $this->employeePolicyModel->getECardDataUsingMd5($client_policy_id, $emp_code); - // $this->loadLayout('id_card_view', $data); exit; - + // $this->loadLayout('id_card_view', $data);exit; $html = view('id_card_view', $data); - // $html = str_replace('', '', $html); + $dompdf = new Dompdf(); $dompdf->loadHtml($html); - - // (Optional) Setup the paper size and orientation $dompdf->setPaper('A4', 'landscape'); - - // Render the HTML as PDF $dompdf->render(); - // Output the generated PDF to Browser - $dompdf->stream(); - + $filename = 'ECard.pdf'; // Default filename + + foreach ($data['data'] as $key => $value) { + + if ($value['relationship'] == "Self") { + + $filename = $value['tpa_id']; // Update filename if relationship is "Self" + + } elseif (!empty($value['tpa_id']) && $filename == 'ECard.pdf') { + + $filename = $value['tpa_id']; + } + } + + $dompdf->stream($filename); } public function viewECard() { - $this->loadLayout('id_card_view'); + + $this->loadLayout('id_card_view'); + } - - public function truncateFileData() //truncateFileDataIn DB (de activate rows) - { - $file_id = $this->request->uri->getSegment(3); - // $file_id = 112; - $file = $this->fileModel->find($file_id); - // $file['action'] = 'si_enhancement'; - // $result = []; - // !dd($file); - if($file['action'] == 'inception' || $file['action'] == 'dependent_addition' || $file['action'] == 'addition') - { - $result = $this->employeeModel->getEmpListByFileId(file_id: $file_id,emp_status: ['active'],policy_status:['active']); - // ~dd($result); - if(count($result)) - { - return $this->respond(['dataStatus' => false,'code' => 404,'message' => 'File data already processed'], 200); - } - else - { - - //update emp and emp plocies - $db = db_connect(); - $query = "UPDATE employees JOIN employee_polices ON employees.id = employee_polices.employee_id and employees.file_id = $file_id SET employees.emp_status = 'truncated', employee_polices.status = 'truncated', employees.is_active = 0,employee_polices.is_active = 0 WHERE employees.file_id = $file_id"; - $db->query($query); - $affectedRows = $db->affectedRows(); - // $affectedRows = 10; - - //update file status - $this->fileModel->where('id', $file_id)->set(['status' => 'truncated'])->update(); - - return $this->respond(['dataStatus' => true,'code' => 200,'data' => round($affectedRows/2)], 200); - } - } - else if($file['action'] == 'si_enhancement' || $file['action'] == 'correction' || $file['action'] == 'deletion') - { - $res = $this->empEndorsementModel->select(['count(id) as count']) - ->where('emp_endorsement.file_id',$file_id) - ->groupStart() - ->where('emp_endorsement.endorsement_id is not null') - ->orwhereIn('emp_endorsement.status',['complete']) - ->groupEnd() - ->get() - ->getResult(); - // print_r($this->empEndorsementModel->getLastQuery()); - // echo $res[0]->count;die(); - if($res[0]->count == 0) - { - //update truncated status to db - $this->empEndorsementModel->where('file_id',$file_id) - ->set(['status' => 'truncated']) - ->update(); - //update file status - $this->fileModel->where('id', $file_id)->set(['status' => 'truncated'])->update(); - return $this->respond(['dataStatus' => true,'code' => 200,'data' => 'success'], 200); - } - else - { - return $this->respond(['dataStatus' => false,'code' => 404,'message' => 'File data already processed'], 200); - } - } - - } diff --git a/app/Helpers/utility_helper.php b/app/Helpers/utility_helper.php index 2ac23d6f..7e74234c 100644 --- a/app/Helpers/utility_helper.php +++ b/app/Helpers/utility_helper.php @@ -132,5 +132,41 @@ if(!function_exists('check_string_date')) +if (!function_exists('generate_download_link')) { + + function generate_download_link($rand_string) { + + // Generate the link using provided emp_code and client_policy_id + $link = htmlspecialchars(base_url('download-e-card/' . $rand_string)); + + // Return the link wrapped in anchor tag + // return 'Click To '; + return $link; + } +} + + + +if (!function_exists('generate_random_alphanumeric')) { + function generate_random_alphanumeric($length = 6) { + $random_string = ''; + for ($i = 0; $i < $length; $i++) { + $random_ascii = rand(0, 61); + if ($random_ascii < 10) { + $random_character = chr($random_ascii + 48); + } elseif ($random_ascii < 36) { + $random_character = chr($random_ascii + 55); + } else { + $random_character = chr($random_ascii + 61); + } + $random_string .= $random_character; + } + return $random_string; + } +} + + + + diff --git a/app/Models/EmployeePolicyModel.php b/app/Models/EmployeePolicyModel.php index 3198d873..1e67186f 100644 --- a/app/Models/EmployeePolicyModel.php +++ b/app/Models/EmployeePolicyModel.php @@ -30,12 +30,13 @@ class EmployeePolicyModel extends Model "created_by", "updated_by", "updated_at", + "rand_string", "is_active", ]; // Callbacks protected $allowCallbacks = true; - protected $beforeInsert = ["checkAndADDCreatedByValue"]; + protected $beforeInsert = ["checkAndADDCreatedByValue", "addRandomNumberBeforeInsert"]; protected $afterInsert = []; protected $beforeUpdate = ["checkAndUpdateUpdatedByValue"]; protected $afterUpdate = []; @@ -66,6 +67,14 @@ class EmployeePolicyModel extends Model return $data; } + protected function addRandomNumberBeforeInsert(array $data) + { + $random_number = generate_random_alphanumeric(); + $data['data']['rand_string'] = $random_number; + + return $data; + } + // ----------------------------------------------------------------------------------------------------- public function getEmployeePolicy($client_id,$policy_id,$status) { @@ -175,66 +184,66 @@ class EmployeePolicyModel extends Model public function getCorrectionEmployeesDataForExportExcel($ref_data) { - $client_id = $ref_data['client_id']; - $client_policy_id = $ref_data['client_policy_id']; - $insurer_or_tpa = $ref_data['insurer_or_tpa']; + $client_id = $ref_data['client_id']; + $client_policy_id = $ref_data['client_policy_id']; + $insurer_or_tpa = $ref_data['insurer_or_tpa']; - $sql = " - SELECT DISTINCT - emp_endorsement.id, - emp_endorsement.pk, - emp_endorsement.emp_code, - emp_endorsement.endorsement_id, - emp_endorsement.old_value, - emp_endorsement.new_value, - emp_endorsement.field_name, - emp_endorsement.remarks, - emp_endorsement.actions, - employees.id AS primaryKey, - 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 + $sql = " + SELECT DISTINCT + emp_endorsement.id, + emp_endorsement.pk, + emp_endorsement.emp_code, + emp_endorsement.endorsement_id, + emp_endorsement.old_value, + emp_endorsement.new_value, + emp_endorsement.field_name, + emp_endorsement.remarks, + emp_endorsement.actions, + employees.id AS primaryKey, + 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 - FROM - emp_endorsement - LEFT JOIN - employees ON employees.id = emp_endorsement.pk - LEFT JOIN - employee_polices ON 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 + emp_endorsement + LEFT JOIN + employees ON employees.id = emp_endorsement.pk 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 ON emp_endorsement.pk = batch_data.emp_policy_id + employee_polices ON 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 ON emp_endorsement.pk = batch_data.emp_policy_id - WHERE batch_data.bf IS NULL - AND batch_data.bl IS NULL - AND employees.client_id = '{$client_id}' - AND employee_polices.client_policy_id = '{$client_policy_id}' - AND emp_endorsement.actions = 'c' - AND (emp_endorsement.endorsement_id IS NULL OR emp_endorsement.endorsement_id = '')"; + WHERE batch_data.bf IS NULL + AND batch_data.bl IS NULL + AND employees.client_id = '{$client_id}' + AND employee_polices.client_policy_id = '{$client_policy_id}' + AND emp_endorsement.actions = 'c' + AND (emp_endorsement.endorsement_id IS NULL OR emp_endorsement.endorsement_id = '')"; - // Execute the raw query - $query = $this->db->query($sql); + // Execute the raw query + $query = $this->db->query($sql); - // Get the result set - $result = $query->getResult(); + // Get the result set + $result = $query->getResult(); - return $result; + return $result; } @@ -242,106 +251,106 @@ class EmployeePolicyModel extends Model public function getSIEnhancementEmployeesDataForExportExcel($ref_data) { - $client_id = $ref_data['client_id']; - $client_policy_id = $ref_data['client_policy_id']; - $insurer_or_tpa = $ref_data['insurer_or_tpa']; + $client_id = $ref_data['client_id']; + $client_policy_id = $ref_data['client_policy_id']; + $insurer_or_tpa = $ref_data['insurer_or_tpa']; - $query = $this->db->query(" - SELECT - a.id as endorsement_primarykey, - employee_polices.id AS primaryKey, - employees.name AS emp_name, - employees.emp_code AS emp_code, - employees.dob AS emp_dob, - employees.gender AS emp_gender, - employees.relationship_code AS emp_relationship_code, - 'Has Define' AS emp_type, - employee_polices.uhid AS risk_id, - employee_polices.pre_existing_alignments, - employee_polices.policy_end_date, - employee_polices.basic_cover_si as old_basic_cover_si, - employee_polices.rata_premimum as old_si_premium, - batch_data.emp_policy_id, - batch_data.bl AS batch_list_batch_code, - batch_data.bf AS batch_files_batch_code, - sidata.new_basic_cover_si, - sidata.new_si_premium, - sidata.date_of_coverage, - DATEDIFF(employee_polices.policy_end_date, sidata.date_of_coverage) + 1 AS no_of_days, - sidata.new_si_premium - employee_polices.rata_premimum AS difference_premium, - ROUND((sidata.new_si_premium - employee_polices.rata_premimum) * (DATEDIFF(employee_polices.policy_end_date, sidata.date_of_coverage) + 1) / 365, 2) AS pro_rata_premimum, - ROUND(((sidata.new_si_premium - employee_polices.rata_premimum) * (DATEDIFF(employee_polices.policy_end_date, sidata.date_of_coverage) + 1) / 365) * 0.18, 2) AS gst, - ((sidata.new_si_premium - employee_polices.rata_premimum) * (DATEDIFF(employee_polices.policy_end_date, sidata.date_of_coverage) + 1) / 365) + ROUND(((sidata.new_si_premium - employee_polices.rata_premimum) * (DATEDIFF(employee_polices.policy_end_date, sidata.date_of_coverage) + 1) / 365) * 0.18, 2) AS total - - FROM - emp_endorsement a - LEFT JOIN - employees ON employees.emp_code = a.emp_code - LEFT JOIN - employee_polices ON employees.id = employee_polices.employee_id - LEFT JOIN ( + $query = $this->db->query(" SELECT - aa.emp_code, - aa.new_value as 'new_basic_cover_si', - bb.new_value as 'new_si_premium', - cc.new_value as 'date_of_coverage' - FROM ( - SELECT - a1.emp_code, - a1.field_name, - a1.new_value - FROM - emp_endorsement as a1 - WHERE - a1.field_name = 'basic_cover_si' - ) aa - LEFT JOIN ( - SELECT - b1.emp_code, - b1.field_name, - b1.new_value - FROM - emp_endorsement as b1 - WHERE - b1.field_name = 'premium' - ) bb ON aa.emp_code = bb.emp_code - LEFT JOIN ( - SELECT - c1.emp_code, - c1.field_name, - c1.new_value - FROM - emp_endorsement as c1 - WHERE - c1.field_name = 'si_enhancement_date' - ) cc ON aa.emp_code = cc.emp_code - ) as sidata ON a.emp_code = sidata.emp_code - LEFT JOIN ( - SELECT DISTINCT - 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 = 'si_enhancement' - AND batch_files.actions = 'export' - AND batch_files.insurer_or_tpa = '{$insurer_or_tpa}' - ) AS batch_data ON employee_polices.id = batch_data.emp_policy_id - WHERE - batch_data.bf IS NULL - AND batch_data.bl IS NULL - AND employee_polices.client_policy_id = '{$client_policy_id}' - AND employee_polices.is_active = '1' - AND (a.endorsement_id IS NULL OR a.endorsement_id = '') - AND a.field_name = 'si_enhancement_date' - "); + a.id as endorsement_primarykey, + employee_polices.id AS primaryKey, + employees.name AS emp_name, + employees.emp_code AS emp_code, + employees.dob AS emp_dob, + employees.gender AS emp_gender, + employees.relationship_code AS emp_relationship_code, + 'Has Define' AS emp_type, + employee_polices.uhid AS risk_id, + employee_polices.pre_existing_alignments, + employee_polices.policy_end_date, + employee_polices.basic_cover_si as old_basic_cover_si, + employee_polices.rata_premimum as old_si_premium, + batch_data.emp_policy_id, + batch_data.bl AS batch_list_batch_code, + batch_data.bf AS batch_files_batch_code, + sidata.new_basic_cover_si, + sidata.new_si_premium, + sidata.date_of_coverage, + DATEDIFF(employee_polices.policy_end_date, sidata.date_of_coverage) + 1 AS no_of_days, + sidata.new_si_premium - employee_polices.rata_premimum AS difference_premium, + ROUND((sidata.new_si_premium - employee_polices.rata_premimum) * (DATEDIFF(employee_polices.policy_end_date, sidata.date_of_coverage) + 1) / 365, 2) AS pro_rata_premimum, + ROUND(((sidata.new_si_premium - employee_polices.rata_premimum) * (DATEDIFF(employee_polices.policy_end_date, sidata.date_of_coverage) + 1) / 365) * 0.18, 2) AS gst, + ((sidata.new_si_premium - employee_polices.rata_premimum) * (DATEDIFF(employee_polices.policy_end_date, sidata.date_of_coverage) + 1) / 365) + ROUND(((sidata.new_si_premium - employee_polices.rata_premimum) * (DATEDIFF(employee_polices.policy_end_date, sidata.date_of_coverage) + 1) / 365) * 0.18, 2) AS total - // Get the result set - $results = $query->getResult(); - return $results; + FROM + emp_endorsement a + LEFT JOIN + employees ON employees.emp_code = a.emp_code + LEFT JOIN + employee_polices ON employees.id = employee_polices.employee_id + LEFT JOIN ( + SELECT + aa.emp_code, + aa.new_value as 'new_basic_cover_si', + bb.new_value as 'new_si_premium', + cc.new_value as 'date_of_coverage' + FROM ( + SELECT + a1.emp_code, + a1.field_name, + a1.new_value + FROM + emp_endorsement as a1 + WHERE + a1.field_name = 'basic_cover_si' + ) aa + LEFT JOIN ( + SELECT + b1.emp_code, + b1.field_name, + b1.new_value + FROM + emp_endorsement as b1 + WHERE + b1.field_name = 'premium' + ) bb ON aa.emp_code = bb.emp_code + LEFT JOIN ( + SELECT + c1.emp_code, + c1.field_name, + c1.new_value + FROM + emp_endorsement as c1 + WHERE + c1.field_name = 'si_enhancement_date' + ) cc ON aa.emp_code = cc.emp_code + ) as sidata ON a.emp_code = sidata.emp_code + LEFT JOIN ( + SELECT DISTINCT + 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 = 'si_enhancement' + AND batch_files.actions = 'export' + AND batch_files.insurer_or_tpa = '{$insurer_or_tpa}' + ) AS batch_data ON employee_polices.id = batch_data.emp_policy_id + WHERE + batch_data.bf IS NULL + AND batch_data.bl IS NULL + AND employee_polices.client_policy_id = '{$client_policy_id}' + AND employee_polices.is_active = '1' + AND (a.endorsement_id IS NULL OR a.endorsement_id = '') + AND a.field_name = 'si_enhancement_date' + "); + + // Get the result set + $results = $query->getResult(); + return $results; } @@ -737,12 +746,14 @@ class EmployeePolicyModel extends Model ->where('e.is_active', '1') ->where('ep.status', 'active') ->where('ep.is_active', '1') - ->where('MD5(e.emp_code)', $emp_code) - ->where('MD5(ep.client_policy_id)', $client_policy_id) + ->where('e.emp_code', $emp_code) + ->where('ep.client_policy_id', $client_policy_id) ->get() ->getResultArray(); return $result; } + + } \ No newline at end of file diff --git a/app/Views/id_card_view.php b/app/Views/id_card_view.php index b646bb87..6ae6412c 100644 --- a/app/Views/id_card_view.php +++ b/app/Views/id_card_view.php @@ -70,11 +70,6 @@ - - button - - \ No newline at end of file