X7ROOT File Manager
Current Path:
/home/hamdjcne/app.hamdalillahitravel.com/app/Controllers
home
/
hamdjcne
/
app.hamdalillahitravel.com
/
app
/
Controllers
/
ðŸ“
..
📄
.DS_Store
(6 KB)
📄
Accounts.php
(52.25 KB)
📄
Activity.php
(4.49 KB)
📄
Analytics.php
(12.22 KB)
📄
Api.php
(41.41 KB)
📄
Auth.php
(34.64 KB)
📄
BaseController.php
(1.77 KB)
📄
Dashboard.php
(42.95 KB)
📄
Notification.php
(6.22 KB)
📄
Order.php
(118.16 KB)
📄
Service.php
(61.77 KB)
📄
Settings.php
(40.13 KB)
📄
Staff.php
(67.17 KB)
📄
Tour.php
(32.09 KB)
📄
Wallets.php
(43.15 KB)
📄
Webhook.php
(5.14 KB)
Editing: Accounts.php
<?php namespace App\Controllers; class Accounts extends BaseController { //Customer public function customer($param1='', $param2='', $param3='') { // check session login if($this->session->get('hdt_id') == ''){ $request_uri = uri_string(); $this->session->set('hdt_redirect', $request_uri); return redirect()->to(site_url('auth')); } $mod = 'accounts/customer'; $log_id = $this->session->get('hdt_id'); $role_id = $this->Crud->read_field('id', $log_id, 'user', 'role_id'); $role = strtolower($this->Crud->read_field('id', $role_id, 'access_role', 'name')); $role_c = $this->Crud->module($role_id, $mod, 'create'); $role_r = $this->Crud->module($role_id, $mod, 'read'); $role_u = $this->Crud->module($role_id, $mod, 'update'); $role_d = $this->Crud->module($role_id, $mod, 'delete'); if($role_r == 0){ return redirect()->to(site_url('dashboard')); } $data['log_id'] = $log_id; $data['role'] = $role; $data['role_c'] = $role_c; $table = 'user'; $form_link = site_url($mod); if($param1){$form_link .= '/'.$param1;} if($param2){$form_link .= '/'.$param2.'/';} if($param3){$form_link .= $param3;} // pass parameters to view $data['param1'] = $param1; $data['param2'] = $param2; $data['param3'] = $param3; $data['form_link'] = $form_link; // manage record if($param1 == 'manage') { // prepare for delete if($param2 == 'delete') { if($param3) { $edit = $this->Crud->read_single('id', $param3, $table); //echo var_dump($edit); if(!empty($edit)) { foreach($edit as $e) { $data['d_id'] = $e->id; } } if($this->request->getMethod() == 'post'){ $del_id = $this->request->getVar('d_customer_id'); $code = $this->Crud->read_field('id', $del_id, 'user', 'fullname'); $by = $this->Crud->read_field('id', $log_id, 'user', 'fullname'); $action = $by.' deleted Customer ('.$code.')'; if($this->Crud->deletes('id', $del_id, $table) > 0) { ///// store activities $this->Crud->activity('user', $del_id, $action); echo $this->Crud->msg('success', 'Record Deleted'); echo '<script>location.reload(false);</script>'; } else { echo $this->Crud->msg('danger', 'Please try later'); } die; } } } elseif($param2 == 'email') { if($param3) { $edit = $this->Crud->read_single('id', $param3, $table); //echo var_dump($edit); if(!empty($edit)) { foreach($edit as $e) { $data['d_id'] = $e->id; } } } } else { // prepare for edit if($param2 == 'edit') { if($param3) { $edit = $this->Crud->read_single('id', $param3, $table); if(!empty($edit)) { foreach($edit as $e) { $data['e_id'] = $e->id; $data['e_company_name'] = $e->company_name; $data['e_email'] = $e->email; $data['e_phone'] = $e->phone; $data['e_role_id'] = $e->role_id; $data['e_address'] = $e->address; $data['e_ban'] = $e->activate; $data['e_approval'] = $e->approval; } } } } //profile view if($param2 == 'profile') { $vendor_id = $param3; $data['v_id'] = $vendor_id; $data['fullname'] = $this->Crud->read_field('id', $vendor_id, 'user', 'fullname'); $data['v_phone'] = $this->Crud->read_field('id', $vendor_id, 'user', 'phone'); $data['v_dob'] = $this->Crud->read_field('id', $vendor_id, 'user', 'dob'); $data['reg_date'] = $this->Crud->read_field('id', $vendor_id, 'user', 'reg_date'); $data['v_email'] = $this->Crud->read_field('id', $vendor_id, 'user', 'email'); $v_img_id = $this->Crud->read_field('id', $vendor_id, 'user', 'img_id'); $data['v_img'] = site_url($this->Crud->image($v_img_id, 'big')); $v_status = $this->Crud->read_field('id', $vendor_id, 'user', 'activate'); if(!empty($v_status)) { $v_status = '<span class="text-success">VERIFIED</span>'; } else { $v_status = '<span class="text-danger">UNVERIFIED</span>'; } $data['v_status'] = $v_status; $data['v_address'] = $this->Crud->read_field('id', $vendor_id, 'user', 'address'); $v_state_id = $this->Crud->read_field('id', $vendor_id, 'user', 'state_id'); $data['v_state'] = $this->Crud->read_field('id', $v_state_id, 'state', 'name'); $v_country_id = $this->Crud->read_field('id', $vendor_id, 'user', 'country_id'); $data['v_country'] = $this->Crud->read_field('id', $v_country_id, 'country', 'name'); } if($this->request->getMethod() == 'post'){ $user_i = $this->request->getVar('user_id'); $company_name = $this->request->getVar('company_name'); $email = $this->request->getVar('email'); $phone = $this->request->getVar('phone'); $country_id = $this->request->getVar('country_id'); $lga_id = $this->request->getVar('lga'); $state = $this->request->getVar('state'); $password = $this->request->getVar('password'); $address = $this->request->getVar('address'); $ban = $this->request->getVar('ban'); $approval = $this->request->getVar('approval'); // do create or update if($user_i) { if($password) { $upd_data['password'] = md5($password); } $upd_data = array( 'company_name' => $company_name, 'email' => $email, 'phone' => $phone, 'address' => $address, 'country_id' => $country_id, 'state_id' => $state, 'lga_id' => $lga_id, 'activate' => $ban, 'approval' => $approval ); $upd_rec = $this->Crud->updates('id', $user_i, $table, $upd_data); if($upd_rec > 0) { ///// store activities $by = $this->Crud->read_field('id', $log_id, 'user', 'fullname'); $code = $this->Crud->read_field('id', $user_i, 'user', 'fullname'); $action = $by.' updated Member ('.$code.') Record'; $this->Crud->activity('user', $user_i, $action); echo $this->Crud->msg('success', 'Member Updated'); echo '<script>location.reload(false);</script>'; } else { echo $this->Crud->msg('info', 'No Changes'); } die; } } } } if ($param1 == 'export') { $start = $this->session->get('start_date'); $end = $this->session->get('end_date'); $state_id = $this->session->get('state_id'); $status = $this->session->get('status'); $states = ''; if (!empty($state)) { $st = $this->Crud->read_field('id', $state, 'state', 'name'); $states = $st . ' State '; } $comms = $this->Crud->filter_customer('', '', $log_id, '', '', ''); $codes = ''; if (!empty($comms)) { $count = 1; foreach ($comms as $co) { $item = array(); $item[] = $count; $item[] = date('Y-m-d', strtotime($co->reg_date)); $i = 0; $state = $this->Crud->read_field('id', $co->state_id, 'state', 'name'); $item[] = $co->fullname; $item[] = $co->email; $item[] = $co->phone; $item[] = $co->address; $item[] = $state; $item[] = 'Customer'; $i++; $row[] = $item; $count += 1; } } $date = ''; if (!empty($start) && !empty($end)) { $date = date('dmY', strtotime($start)) . '-' . date('dmY', strtotime($end)); } // now export CSV $dfile_name = $states . 'Customer Report-' . $date; $fname = $dfile_name . '.csv'; header("Content-Type: text/csv;charset=utf-8"); header("Content-Disposition: attachment;filename=$fname"); header("Pragma: no-cache"); header("Expires: 0"); $output = fopen('php://output', 'w'); // Column Title fputcsv($output, array('S/N', 'Reg Date', 'Fullname', 'Email', 'Phone', 'Address', 'State', 'Role')); // Column Items if (!empty($row)) { foreach ($row as $fields) { fputcsv($output, $fields); } } fclose($output); die; } // record listing if($param1 == 'load') { $limit = $param2; $offset = $param3; $rec_limit = 50; $item = ''; if(empty($limit)) {$limit = $rec_limit;} if(empty($offset)) {$offset = 0;} if(!empty($this->request->getPost('state_id'))) { $state_id = $this->request->getPost('state_id'); } else { $state_id = ''; } if(!empty($this->request->getPost('status'))) { $status = $this->request->getPost('status'); } else { $status = ''; } $search = $this->request->getPost('search'); if (!empty($this->request->getPost('state_id'))) { $state_id = $this->request->getPost('state_id'); $this->session->set('state_id', $state_id); } else { $state_id = ''; } if (!empty($this->request->getPost('start_date'))) { $start_date = $this->request->getPost('start_date'); $this->session->set('start_date', $start_date); } else { $start_date = ''; } if (!empty($this->request->getPost('end_date'))) { $end_date = $this->request->getPost('end_date'); $this->session->set('end_date', $end_date); } else { $end_date = ''; } $items = ' '; //echo $status; $log_id = $this->session->get('hdt_id'); if(!$log_id) { $item = '<div class="text-center text-muted">Session Timeout! - Please login again</div>'; } else { $all_rec = $this->Crud->filter_customer('', '', $log_id, $state_id, $status, $search); if(!empty($all_rec)) { $counts = count($all_rec); } else { $counts = 0; } $query = $this->Crud->filter_customer($limit, $offset, $log_id, $state_id, $status, $search); $data['count'] = $counts; if(!empty($query)) { foreach($query as $q) { $id = $q->id; $fullname = $q->fullname; $email = $q->email; $phone = $q->phone; $address = $q->address; $state = $this->Crud->read_field('id', $q->state_id, 'state', 'name'); $country = $this->Crud->read_field('id', $q->country_id, 'country', 'name'); $city = $this->Crud->read_field('id', $q->lga_id, 'city', 'name'); $img = $this->Crud->image($q->img_id, 'big'); $activate = $q->activate; $u_role = $this->Crud->read_field('id', $q->role_id, 'access_role', 'name'); $reg_date = date('M d, Y h:iA', strtotime($q->reg_date)); $approved = ''; $profile = ''; if($activate == 1) { $profile .= ' <li class="d-flex align-items-center py-2"> <span class="bullet bg-primary mx-3"></span> Account Active </li>'; } else { $profile .= ' <li class="d-flex align-items-center py-2"> <span class="bullet bg-danger mx-3"></span> Account Deactivated </li>'; } // add manage buttons if($role_u != 1) { $all_btn = ''; } else { $all_btn = ' <div class="text-right"> <li><a href="javascript:;" class="text-primary pop" pageTitle="Manage '.$fullname.'" pageName="'.site_url($mod.'/manage/edit/'.$id).'"> <i class="ni ni-edit-alt"></i> Edit </a></li> <li><a href="javascript:;" class="text-danger pop" pageTitle="Delete '.$fullname.'" pageName="'.site_url($mod.'/manage/delete/'.$id).'"> <i class="ni ni-trash-alt"></i> Delete </a></li> </div> '; } $item .= ' <tr> <td> '.$reg_date.' </td> <td class="d-flex align-items-center"> <!--begin:: Avatar --> <div class="symbol symbol-circle symbol-50px overflow-hidden me-3"> <a href="javascript:;"> <div class="symbol-label"> <img src="'.site_url($img).'" alt="'.ucwords($fullname).'" class="w-100" /> </div> </a> </div> <!--end::Avatar--> <!--begin::User details--> <div class="d-flex flex-column"> <a href="javascript:;" class="text-gray-800 text-hover-success mb-1">'.ucwords($fullname).'</a> <span>'.$email.'</span> </div> <!--begin::User details--> </td> <td> <div class="d-flex flex-column"> <span class="text-gray-800 mb-1">'.ucwords($phone).'</span> </div> </td> <td> <div class="d-flex flex-column"> <span class="text-gray-800 mb-1">'.ucwords($address).'</span> <span>'.$city.' '.$state.'</span> </div> </td> <td> <div class="d-flex flex-column"> '.$profile.' </div> </td> <td> <div class="d-flex justify-content-end flex-shrink-0"> <a href="javascript:;" class="pop btn btn-icon btn-success btn-active-color-light btn-sm me-2" pageTitle="Edit Member '.$fullname.'" pagesize="modal-lg" data-bs-toggle="tooltip" data-bs-placement="top" title="Edit Member" pageName="'.site_url($mod.'/manage/edit/'.$id).'"> <i class="ki-duotone ki-pencil fs-2"><span class="path1"></span><span class="path2"></span></i> </a> <a href="javascript:;" class="pop me-2 btn btn-icon btn-danger btn-active-color-light btn-sm" data-bs-toggle="tooltip" data-bs-placement="top" title="Delete Member" pageTitle="Delete Member '.$fullname.'" pageName="'.site_url($mod.'/manage/delete/'.$id).'"> <i class="ki-duotone ki-trash fs-2"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span><span class="path5"></span></i> </a> <a href="'.site_url('accounts/profile_view/'.$id).'" data-bs-toggle="tooltip" data-bs-placement="top" title="View Member" class="btn btn-icon btn-primary me-2 btn-active-color-light btn-sm" > <i class="ki-duotone ki-eye fs-2"><span class="path1"></span><span class="path2"></span><span class="path3"></span></i> </a> </div> </td> </tr> '; } } } if(empty($item)) { $resp['item'] = $items.' <tr><td colspan="8"><div class="text-center text-muted"> <br/><br/><br/><br/> <i class="ki-duotone ki-profile-user" style="font-size:150px;"> <span class="path1"></span> <span class="path2"></span> <span class="path3"></span> <span class="path4"></span> </i><br/><br/>No Customer Returned </div></td></tr> '; } else { $resp['item'] = $items . $item; } $resp['count'] = $counts; $more_record = $counts - ($offset + $rec_limit); $resp['left'] = $more_record; if($counts > ($offset + $rec_limit)) { // for load more records $resp['limit'] = $rec_limit; $resp['offset'] = $offset + $limit; } else { $resp['limit'] = 0; $resp['offset'] = 0; } echo json_encode($resp); die; } if($param1 == 'manage') { // view for form data posting return view($mod.'_form', $data); } else { // view for main page $data['title'] = 'Members - '.app_name; $data['page_active'] = $mod; return view($mod, $data); } } public function announcement($param1='', $param2='', $param3='') { // check session login if($this->session->get('hdt_id') == ''){ $request_uri = uri_string(); $this->session->set('hdt_redirect', $request_uri); return redirect()->to(site_url('auth')); } $mod = 'accounts/announcement'; $log_id = $this->session->get('hdt_id'); $role_id = $this->Crud->read_field('id', $log_id, 'user', 'role_id'); $role = strtolower($this->Crud->read_field('id', $role_id, 'access_role', 'name')); $role_c = $this->Crud->module($role_id, $mod, 'create'); $role_r = $this->Crud->module($role_id, $mod, 'read'); $role_u = $this->Crud->module($role_id, $mod, 'update'); $role_d = $this->Crud->module($role_id, $mod, 'delete'); if($role_r == 0){ return redirect()->to(site_url('dashboard')); } $data['log_id'] = $log_id; $data['role'] = $role; $data['role_c'] = $role_c; $table = 'announcement'; $form_link = site_url($mod); if($param1){$form_link .= '/'.$param1;} if($param2){$form_link .= '/'.$param2.'/';} if($param3){$form_link .= $param3;} // pass parameters to view $data['param1'] = $param1; $data['param2'] = $param2; $data['param3'] = $param3; $data['form_link'] = $form_link; // manage record if($param1 == 'manage') { // prepare for delete if($param2 == 'delete') { if($param3) { $edit = $this->Crud->read_single('id', $param3, $table); if(!empty($edit)) { foreach($edit as $e) { $data['d_id'] = $e->id; } } if($this->request->getMethod() == 'post'){ $del_id = $this->request->getVar('d_announcement_id'); if($this->Crud->deletes('id', $del_id, $table) > 0) { echo $this->Crud->msg('success', 'Record Deleted'); echo '<script>location.reload(false);</script>'; } else { echo $this->Crud->msg('danger', 'Please try later'); } exit; } } } elseif($param2 == 'email'){ if($param3) { $edit = $this->Crud->read_single('id', $param3, $table); if(!empty($edit)) { foreach($edit as $e) { $data['d_id'] = $e->id; } } if($this->request->getMethod() == 'post'){ $del_id = $this->request->getVar('d_announcement_id'); $parent = json_decode($this->Crud->read_field('id', $del_id, $table, 'to_id'),true); // print_r($parent); $title = $this->Crud->read_field('id', $del_id, $table, 'title'); $content = $this->Crud->read_field('id', $del_id, $table, 'content'); $sent = 0;$failed = 0; if(!empty($parent)){ foreach($parent as $par){ // echo $par.' '; $email = $this->Crud->read_field('id', $par, 'user', 'email'); $email_body = [ 'from' => 'admin<noreply@mg.pcdl4kids.com>', // Replace with your domain's default sender 'to' => $email, // Assuming $par->email contains the recipient's email address 'subject' => 'Important Notification', // Replace with an appropriate subject 'html' => $content // Use 'html' or 'text' based on your content type ]; if($this->Crud->mailgun($email_body) > 0){ $sent++; } else { $failed++; } } if($failed == count($parent)){ echo $this->Crud->msg('info', 'Email Failed to Send'); } else { echo $this->Crud->msg('success', $sent.' Email sent. <br>'.$failed.' Failed to send.'); } } else { echo $this->Crud->msg('danger', 'No Parent Found'); } // if($this->Crud->deletes('id', $del_id, $table) > 0) { // echo $this->Crud->msg('success', 'Record Deleted'); // echo '<script>location.reload(false);</script>'; // } else { // echo $this->Crud->msg('danger', 'Please try later'); // } exit; } } } else { // prepare for edit if($param2 == 'edit') { if($param3) { $edit = $this->Crud->read_single('id', $param3, $table); if(!empty($edit)) { foreach($edit as $e) { $data['e_id'] = $e->id; $data['e_to_id'] = $e->to_id; $data['e_from_id'] = $e->from_id; $data['e_title'] = $e->title; $data['e_content'] = $e->content; $data['e_img'] = $e->image; } } } } if($param2 == 'view') { if($param3) { $edit = $this->Crud->read_single('id', $param3, $table); if(!empty($edit)) { foreach($edit as $e) { $data['e_id'] = $e->id; $data['e_to_id'] = $e->to_id; $data['e_from_id'] = $e->from_id; $data['e_title'] = $e->title; $data['e_content'] = $e->content; $data['e_img'] = $e->image; $data['e_reg_date'] = date('M d, Y h:i A', strtotime($e->reg_date)); } } } } if($this->request->getMethod() == 'post'){ $announcement_id = $this->request->getVar('announcement_id'); $title = $this->request->getVar('title'); $content = $this->request->getVar('content'); $parent = $this->request->getVar('parent'); $img = $this->request->getVar('img'); $parent = array(); $pa = $this->Crud->read_single('is_member', 1, 'user'); foreach($pa as $par){ $parent[] = $par->id; } $p = json_encode($parent); $ins_data['to_id'] = $p; //// Image upload if(file_exists($this->request->getFile('pics'))) { $path = 'assets/images/announcement/'; $file = $this->request->getFile('pics'); $getImg = $this->Crud->img_upload($path, $file); if(!empty($getImg->path)) $img_id = $getImg->path; } elseif(empty($img) && $img == 0){ $img_id = ''; // die; } else { $img_id = $img; } $ins_data['title'] = $title; $ins_data['content'] = $content; $ins_data['image'] = $img_id; // do create or update if ($announcement_id) { $upd_rec = $this->Crud->updates('id', $announcement_id, $table, $ins_data); if ($upd_rec > 0) { foreach(json_decode($p) as $re => $val){ $in_data['from_id'] = $log_id; $in_data['to_id'] = $val; $in_data['content'] = $title; $in_data['item'] = 'announcement'; $in_data['new'] = 1; $in_data['reg_date'] = date(fdate); $in_data['item_id'] = $announcement_id; $this->Crud->create('notify', $in_data); } ///// store activities $code = $this->Crud->read_field('id', $announcement_id, $table, 'title'); $by = $this->Crud->read_field('id', $log_id, 'user', 'fullname'); $action = $by.' updated Announcement '.$code.' Record'; $this->Crud->activity('tools', $announcement_id, $action); echo $this->Crud->msg('success', 'Announcement Updated'); echo '<script>location.reload(false);</script>'; } else { echo $this->Crud->msg('info', 'No Changes'); } } else { if($this->Crud->check('id', $announcement_id, $table) > 0) { echo $this->Crud->msg('warning', 'Record Already Exist'); } else { $ins_data['reg_date'] = date(fdate); $ins_data['from_id'] = $log_id; $ins_rec = $this->Crud->create($table, $ins_data); if($ins_rec > 0) { echo $this->Crud->msg('success', 'Announcement Created'); foreach(json_decode($p) as $re => $val){ $in_data['from_id'] = $log_id; $in_data['to_id'] = $val; $in_data['content'] = $content; $in_data['item'] = 'announcement'; $in_data['new'] = 1; $in_data['reg_date'] = date(fdate); $in_data['item_id'] = $ins_rec; $this->Crud->create('notify', $in_data); } ///// store activities $by = $this->Crud->read_field('id', $log_id, 'user', 'fullname'); $code = $this->Crud->read_field('id', $ins_rec, 'announcement', 'title'); $action = $by.' created ('.$code.') Announcement '; $this->Crud->activity('announcement', $ins_rec, $action); echo '<script>location.reload(false);</script>'; } else { echo $this->Crud->msg('danger', 'Please try later'); } } } die; } } } // record listing if($param1 == 'load') { $limit = $param2; $offset = $param3; $rec_limit = 50; $item = ''; if(empty($limit)) {$limit = $rec_limit;} if(empty($offset)) {$offset = 0;} if(!empty($this->request->getPost('status'))) { $status = $this->request->getPost('status'); } else { $status = ''; } $search = $this->request->getPost('search'); if (!empty($this->request->getPost('start_date'))) { $start_date = $this->request->getPost('start_date'); $this->session->set('start_date', $start_date); } else { $start_date = ''; } if (!empty($this->request->getPost('end_date'))) { $end_date = $this->request->getPost('end_date'); $this->session->set('end_date', $end_date); } else { $end_date = ''; } $items = ' '; //echo $status; $log_id = $this->session->get('hdt_id'); if(!$log_id) { $item = '<div class="text-center text-muted">Session Timeout! - Please login again</div>'; } else { $query = $this->Crud->filter_announcement($limit, $offset, $log_id, $search, $start_date, $end_date); $all_rec = $this->Crud->filter_announcement('', '', $log_id, $search, $start_date, $end_date); if(!empty($all_rec)) { $counts = count($all_rec); } else { $counts = 0; } $data['count'] = $counts; if(!empty($query)) { foreach($query as $q) { $id = $q->id; $title = $q->title; $content = strip_tags($q->content); $to_id = $q->to_id; $user_i = $q->from_id; $reg_date = date('M d, Y h:i A', strtotime($q->reg_date)); $user = $this->Crud->read_field('id', $user_i, 'user', 'fullname'); if(empty($user)){ $user = $this->Crud->read_field('id', $user_i, 'user', 'company_name'); } $st = ''; if($role == 'developer' || $role == 'administrator'){ $st .= ' <div class="d-flex flex-column"> <li class="d-flex align-items-center py-2"> <span class="bullet bg-success mx-2"></span>'.$this->Crud->check3('item', 'announcement', 'item_id', $id, 'new', 0, 'notify').' Read </li> </div> '; } else{ $status = $this->Crud->read_field3('item', 'announcement', 'item_id', $id, 'to_id', $log_id, 'notify', 'new'); if($status){ $st .= '<span class="text-danger">Unread</span>'; } else{ $st .= '<span class="text-success">Read</span>'; } } $all_btn = ' <a href="javascript:;" class="pop me-2 btn btn-icon btn-primary btn-active-color-light btn-sm" data-bs-toggle="tooltip" data-bs-placement="top" title="View Announcement" pageTitle="View Announcement '.$title.'" pageName="'.site_url($mod.'/manage/view/'.$id).'"> <i class="ki-duotone ki-eye fs-2"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span><span class="path5"></span></i> </a>'; // add manage buttons if($role_u == 1) { $all_btn .= ' <a href="javascript:;" class="pop btn btn-icon btn-success btn-active-color-light btn-sm me-2" pageTitle="Edit Announcement '.$title.'" pagesize="modal-md" data-bs-toggle="tooltip" data-bs-placement="top" title="Edit Announcement" pageName="'.site_url($mod.'/manage/edit/'.$id).'"> <i class="ki-duotone ki-pencil fs-2"><span class="path1"></span><span class="path2"></span></i> </a> <a href="javascript:;" class="pop me-2 btn btn-icon btn-danger btn-active-color-light btn-sm" data-bs-toggle="tooltip" data-bs-placement="top" title="Delete Announcement" pageTitle="Delete Announcement '.$title.'" pageName="'.site_url($mod.'/manage/delete/'.$id).'"> <i class="ki-duotone ki-trash fs-2"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span><span class="path5"></span></i> </a> '; } // Content preview (first 50 chars, strip HTML) $preview = strip_tags($content); $preview = substr($preview, 0, 50); $item .= ' <tr> <td><span class="text-muted small">' . $reg_date . '</span></td> <td>' . ucwords($title) . '</td> <td><div class="d-flex align-items-center">' . $preview . '</div></td> <td>' . $st . '</td> <td class="text-right"> <div class="d-flex justify-content-end flex-shrink-0">' . $all_btn . '</div> </td> </tr>'; } } } if(empty($item)) { $resp['item'] = $items.' <tr><td colspan="8"><div class="text-center text-muted"> <br/><br/><br/><br/> <i class="ki-outline ki-notification-bing" style="font-size:150px;"> </i><br/><br/>No Annoucement Returned </div></td></tr> '; } else { $resp['item'] = $items . $item; } $resp['count'] = $counts; $more_record = $counts - ($offset + $rec_limit); $resp['left'] = $more_record; if($counts > ($offset + $rec_limit)) { // for load more records $resp['limit'] = $rec_limit; $resp['offset'] = $offset + $limit; } else { $resp['limit'] = 0; $resp['offset'] = 0; } echo json_encode($resp); die; } if($param1 == 'manage') { // view for form data posting return view($mod.'_form', $data); } else { // view for main page $data['title'] = 'Announcement - '.app_name; $data['page_active'] = $mod; return view($mod, $data); } } public function profile_view($param1='', $param2='', $param3='', $param4='') { // check login $log_id = $this->session->get('hdt_id'); if(empty($log_id)) return redirect()->to(site_url('auth')); $role_id = $this->Crud->read_field('id', $log_id, 'user', 'role_id'); $role = strtolower($this->Crud->read_field('id', $role_id, 'access_role', 'name')); $main_email = $this->Crud->read_field('id', $log_id, 'user', 'email'); $data['log_id'] = $log_id; $data['role'] = $role; if($param1 == 'records'){ if($param2 == 'activity_load'){ $limit = $param3; $offset = $param4; $count = 0; $rec_limit = 25; $item = ''; if($limit == '') {$limit = $rec_limit;} if($offset == '') {$offset = 0;} $id = $this->request->getVar('id'); if(!empty($this->request->getPost('start_date'))) { $start_date = $this->request->getPost('start_date'); } else { $start_date = ''; } if(!empty($this->request->getPost('end_date'))) { $end_date = $this->request->getPost('end_date'); } else { $end_date = ''; } if(!$log_id) { $item = '<div class="text-center text-muted">Session Timeout! - Please login again</div>'; } else { $query = $this->Crud->filter_activity($limit, $offset, $id, '', $start_date, $end_date); $all_rec = $this->Crud->filter_activity('', '', $id, '', $start_date, $end_date); if(!empty($all_rec)) { $counts = count($all_rec); } else { $counts = 0; } if(!empty($query)) { foreach($query as $q) { $id = $q->id; $type = $q->item; $user_id = $q->user_id; $type_id = $q->item_id; $action = $q->action; $reg_date = date('M d, Y h:i A', strtotime($q->reg_date)); $user = $this->Crud->read_field('id', $user_id, 'user', 'fullname'); $timespan = $this->Crud->timespan(strtotime($q->reg_date)); $item .= ' <tr> <td>'.$reg_date.'</td> <td>'.ucwords($type).'</td> <td>'.ucwords($user).'</td> <td>'.$action.'</td> <td>'.$timespan.'</td> </tr> '; } } } if(empty($item)) { $resp['item'] = ' <tr><td colspan="8"><div class="text-center text-muted"> <br/><br/><br/><br/> <i class="ki-duotone ki-profile-user" style="font-size:150px;"> <span class="path1"></span> <span class="path2"></span> <span class="path3"></span> <span class="path4"></span> </i><br/><br/>No Activity Returned </div></td></tr> '; } else { $resp['item'] = $item; } $resp['count'] = $counts; $more_record = $counts - ($offset + $rec_limit); $resp['left'] = $more_record; if($counts > ($offset + $rec_limit)) { // for load more records $resp['limit'] = $rec_limit; $resp['offset'] = $offset + $limit; } else { $resp['limit'] = 0; $resp['offset'] = 0; } echo json_encode($resp); die; } if($param2 == 'voucher_load') { $limit = $param3; $offset = $param4; $count = 0; $rec_limit = 50; $item = ''; if($limit == '') {$limit = $rec_limit;} if($offset == '') {$offset = 0;} $id = $this->request->getVar('id'); if(!empty($this->request->getVar('start_date'))) { $start_date = $this->request->getVar('start_date'); } else { $start_date = ''; } if(!empty($this->request->getVar('end_date'))) { $end_date = $this->request->getVar('end_date'); } else { $end_date = ''; } $search = $this->request->getVar('search'); if(!$log_id) { $item = '<div class="text-center text-muted">Session Timeout! - Please login again</div>'; } else { $query = $this->Crud->filter_voucher($limit, $offset, $id, 'all', $search, $start_date, $end_date); $all_rec = $this->Crud->filter_voucher('', '', $id, 'all', $search, $start_date, $end_date); if(!empty($all_rec)) { $count = count($all_rec); } else { $count = 0; } $curr = '₦'; if(!empty($query)) { foreach($query as $q) { $id = $q->id; $code = $q->code; $user_id = $q->user_id; $price = $q->price; $status = $q->status; $reg_date = date('M d, Y h:i A', strtotime($q->reg_date)); // user $user = $this->Crud->read_field('id', $user_id, 'user', 'fullname'); $user_role_id = $this->Crud->read_field('id', $user_id, 'user', 'role_id'); $user_role = strtoupper($this->Crud->read_field('id', $user_role_id, 'access_role', 'name')); $user_image_id = $this->Crud->read_field('id', $user_id, 'user', 'img_id'); $user_image = $this->Crud->image($user_image_id, 'big'); $stat = '<div class="badge badge-light-danger">Not Used</div>'; if($q->status == 1){ $stat = '<div class="badge badge-light-primary">Used</div>'; } if($q->status == 2){ $stat = '<div class="badge badge-light-success">Transfered</div>'; } $all_btn = ''; if($q->status == 0){ $all_btn = ' <div class="d-flex justify-content-end flex-shrink-0"> </div> '; } $item .= ' <tr> <td>'.$reg_date.'</td> <td> <a href="javascript:;" class="text-gray-800 text-hover-success mb-1">'.$code.'</a> </td> <td> <a href="javascript:;" class="text-gray-600 text-hover-success mb-1">'.curr.number_format($price,2).'</a> </td> <td>'.$stat.'</td> <td> '.$all_btn.' </td> </tr> '; } } } if(empty($item)) { $resp['item'] = '<tr><td colspan="8"> <div class="text-center text-muted"> <br/><br/> <i class="ki-duotone ki-wallet fs-5x"> <span class="path1"></span> <span class="path2"></span> <span class="path3"></span> <span class="path4"></span> </i><br/><br/>No Voucher Returned </div></td></tr> '; } else { $resp['item'] = $item; } $more_record = $count - ($offset + $rec_limit); $resp['left'] = $more_record; if($count > ($offset + $rec_limit)) { // for load more records $resp['limit'] = $rec_limit; $resp['offset'] = $offset + $limit; } else { $resp['limit'] = 0; $resp['offset'] = 0; } echo json_encode($resp); die; } if($param2 == 'transaction_load') { $limit = $param3; $offset = $param4; $count = 0; $rec_limit = 25; $item = ''; if($limit == '') {$limit = $rec_limit;} if($offset == '') {$offset = 0;} if(!empty($this->request->getVar('status'))) { $status = $this->request->getVar('status'); } else { $status = ''; } if(!empty($this->request->getVar('state'))) { $state = $this->request->getVar('state'); } else { $state = ''; } if(!empty($this->request->getVar('merchant_id'))) { $merchant_id = $this->request->getVar('merchant_id'); } else { $merchant_id = ''; } if(!empty($this->request->getVar('lga'))) { $lga = $this->request->getVar('lga'); } else { $lga = ''; } if(!empty($this->request->getVar('start_date'))) { $start_date = $this->request->getVar('start_date'); } else { $start_date = ''; } if(!empty($this->request->getVar('end_date'))) { $end_date = $this->request->getVar('end_date'); } else { $end_date = ''; } $search = $this->request->getVar('search'); $id = $this->request->getVar('id'); $log_role_id = $this->Crud->read_field('id', $id, 'user', 'role_id'); $log_role = $this->Crud->read_field('id', $log_role_id, 'access_role', 'name'); if($log_role == 'Merchant'){ $merchant_id = $id; $user_id = ''; } if($log_role == 'Customer'){ $merchant_id = ''; $user_id = $id; } if(!$log_id) { $item = '<div class="text-center text-muted">Session Timeout! - Please login again</div>'; } else { $user_id = $id; $query = $this->Crud->filter_transaction($limit, $offset, $user_id, $status, $merchant_id, $state, $lga, $search, $start_date, $end_date); $all_rec = $this->Crud->filter_transaction('', '', $user_id, $status, $merchant_id, $state, $lga, $search, $start_date, $end_date); if(!empty($all_rec)) { $count = count($all_rec); } else { $count = 0; } $curr = '₦'; if(!empty($query)) { foreach($query as $q) { $id = $q->id; $code = $q->code; $state_id = $q->state_id; $city_id = $q->city_id; $user_id = $q->user_id; $merchant_id = $q->merchant_id; $quantity = $q->litre; $total = number_format((float)$q->amount, 2); $reg_date = date('M d, Y h:i A', strtotime($q->reg_date)); // category $merchant = $this->Crud->read_field('id', $merchant_id, 'user', 'company_name'); // state $state = $this->Crud->read_field('id', $state_id, 'state', 'name'); $city = $this->Crud->read_field('id', $city_id, 'city', 'name'); // user $user = $this->Crud->read_field('id', $user_id, 'user', 'fullname'); $item .= ' <tr> <td>'.$reg_date.'</td> <td>'.ucwords($user).'</td> <td>'.ucwords($merchant).'</td> <td><span class="text-gray-600 text-hover-success mb-1">'.$code.'</span><br><span>'.curr.$total.'</span></td> <td>'.number_format($quantity,4).' LTR</td> </tr> '; } } } if(empty($item)) { $resp['item'] = '<tr><td colspan="8"> <div class="text-center text-muted"> <br/><br/> <i class="ki-duotone ki-wallet fs-5x" style="font-size:150px;"> <span class="path1"></span> <span class="path2"></span> <span class="path3"></span> <span class="path4"></span> </i><br/><br/>No Transaction Returned </div></td></tr> '; } else { $resp['item'] = $item; } $more_record = $count - ($offset + $rec_limit); $resp['left'] = $more_record; if($count > ($offset + $rec_limit)) { // for load more records $resp['limit'] = $rec_limit; $resp['offset'] = $offset + $limit; } else { $resp['limit'] = 0; $resp['offset'] = 0; } echo json_encode($resp); die; } if($param2 == 'wallet_load') { $limit = $param3; $offset = $param4; $count = 0; $rec_limit = 25; $item = ''; if($limit == '') {$limit = $rec_limit;} if($offset == '') {$offset = 0;} if(!empty($this->request->getVar('start_date'))) { $start_date = $this->request->getVar('start_date'); } else { $start_date = ''; } if(!empty($this->request->getVar('end_date'))) { $end_date = $this->request->getVar('end_date'); } else { $end_date = ''; } $search = $this->request->getVar('search'); $type = $this->request->getVar('type'); $id = $this->request->getVar('id'); if(!$log_id) { $item = '<div class="text-center text-muted">Session Timeout! - Please login again</div>'; } else { $query = $this->Crud->filter_wallet($limit, $offset, $id, $type, $search, $start_date, $end_date); $all_rec = $this->Crud->filter_wallet('', '', $id, $type, $search, $start_date, $end_date); if(!empty($all_rec)) { $count = count($all_rec); } else { $count = 0; } $curr = '₦'; $credit = 0;$debit = 0; $wallet = $this->Crud->read_single('user_id', $id, 'wallet'); if(!empty($wallet)){ foreach($wallet as $po){ if($po->type == 'credit'){ $credit += (float)$po->amount; } if($po->type == 'debit'){ $debit += (float)$po->amount; } } } if(!empty($query)) { foreach($query as $q) { $id = $q->id; $user_id = $q->user_id; $type = $q->type; $mod = $q->item; $remark = $q->remark; $amount = number_format((float)$q->amount, 2); $reg_date = date('M d, Y h:i A', strtotime($q->reg_date)); if($q->type == 'credit'){ $typ = '<div class="badge badge-light-primary fs-7">CREDIT</div>'; } if($q->type == 'debit'){ $typ = '<div class="badge badge-light-danger fs-7">DEBIT</div>'; } $item .= ' <tr> <td>'.$reg_date.'</td> <td> '.$typ.' </td> <td> <a href="javascript:;" class="text-gray-600 text-hover-success mb-1">'.curr.($amount).'</a> </td> <td>'.ucwords($remark).'</td> </tr> '; } } } $balance = $credit - $debit; if(empty($item)) { $resp['item'] = '<tr><td colspan="8"> <div class="text-center text-muted"> <br/><br/><br/><br/> <i class="ki-duotone ki-wallet fs-4x"> <span class="path1"></span> <span class="path2"></span> <span class="path3"></span> <span class="path4"></span> </i><br/><br/>No Wallet Returned </div></td></tr> '; } else { $resp['item'] = $item; } $more_record = $count - ($offset + $rec_limit); $resp['left'] = $more_record; $resp['credit'] = $curr . number_format($credit, 2); $resp['debit'] = $curr . number_format($debit, 2); $resp['balance'] = $curr . number_format($balance, 2); if($count > ($offset + $rec_limit)) { // for load more records $resp['limit'] = $rec_limit; $resp['offset'] = $offset + $limit; } else { $resp['limit'] = 0; $resp['offset'] = 0; } echo json_encode($resp); die; } } if($param1 == 'activate'){ if($this->request->getMethod() == 'post') { $user_id = $this->request->getVar('user_id'); $st = $this->Crud->read_field('id', $user_id, 'user', 'activate'); if($st == 0){ $act = 1; } else { $act = 0; } $upd = $this->Crud->updates('id', $user_id, 'user', array('activate'=>$act)); if($upd > 0){ echo $this->Crud->msg('success', 'Account status Updated!!'); $code = $this->Crud->read_field('id', $user_id, 'user', 'fullname'); $action = $code.' Updated ('.$code.')Account status'; $this->Crud->activity('authentication', $user_id, $action); echo '<script>location.reload(false);</script>'; } else { echo $this->Crud->msg('info', 'No Changes!!'); } die; } } if($param1 == 'update'){ if($this->request->getMethod() == 'post') { $user_id = $this->request->getVar('user_id'); $email = $this->request->getVar('email'); $fullname = $this->request->getVar('firstname').' '.$this->request->getVar('surname'); $phone = $this->request->getVar('phone'); $company_name = $this->request->getVar('company_name'); $lga_id = $this->request->getVar('lga_id'); $address = $this->request->getVar('address'); $state_id = $this->request->getVar('state_id'); $lat = $this->request->getVar('latitude'); $lng = $this->request->getVar('longitude'); $img_id = $this->request->getVar('img_id'); $main_email = $this->Crud->read_field('id', $user_id, 'user', 'email'); if(!$email || !$fullname) { echo $this->Crud->msg('danger', 'Full Name and Email field(s) missing'); die; } if($email != $main_email) { if($this->Crud->check('email', $email, 'user') > 0) { echo $this->Crud->msg('danger', 'Email already taken, try another'); die; } } //// Image upload if(file_exists($this->request->getFile('avatar'))) { $path = 'assets/images/users/'.$user_id.'/'; $file = $this->request->getFile('avatar'); $getImg = $this->Crud->img_upload($path, $file); if(!empty($getImg->path)) $img_id = $this->Crud->save_image($user_id, $getImg->path); if($role == 'merchant'){ $img_id = $getImg->path; } } $state = $this->Crud->read_field('name', $state_id, 'state', 'id'); $lga = $this->Crud->read_field('name', $lga_id, 'city', 'id'); // update profile $upd_data['email'] = $email; $upd_data['fullname'] = $fullname; $upd_data['phone'] = $phone; $upd_data['lga_id'] = $lga; $upd_data['lat'] = $lat; $upd_data['lng'] = $lng; $upd_data['company_name'] = $company_name; $upd_data['address'] = $address; $upd_data['state_id'] = $state; if($role == 'merchant'){ $upd_data['logo'] = $img_id; } else { $upd_data['img_id'] = $img_id; } if($this->Crud->updates('id', $user_id, 'user', $upd_data) > 0) { echo $this->Crud->msg('success', 'Record Updated'); $by = $this->Crud->read_field('id', $log_id, 'user', 'fullname'); $code = $this->Crud->read_field('id', $user_id, 'user', 'fullname'); $action = $by.' Updated ('.$code.') Account Profile Information '; $this->Crud->activity('authentication', $user_id, $action); echo '<script>location.reload(false);</script>'; } else { echo $this->Crud->msg('info', 'No Changes'); } die; } } $log_id = $param1; $data['email'] = $this->Crud->read_field('id', $log_id, 'user', 'email'); $role_id = $this->Crud->read_field('id', $log_id, 'user', 'role_id'); $role = strtolower($this->Crud->read_field('id', $role_id, 'access_role', 'name')); $data['user_role'] = $role; $data['user_id'] = $log_id; $data['company_name'] = $this->Crud->read_field('id', $log_id, 'user', 'company_name'); $data['fullname'] = $this->Crud->read_field('id', $log_id, 'user', 'fullname'); $data['zone'] = $this->Crud->read_field('id', $log_id, 'user', 'zone'); $data['rc_no'] = $this->Crud->read_field('id', $log_id, 'user', 'rc_no'); $data['iata_number'] = $this->Crud->read_field('id', $log_id, 'user', 'iata_number'); $data['nahcon_license'] = $this->Crud->read_field('id', $log_id, 'user', 'nahcon_license'); $data['website'] = $this->Crud->read_field('id', $log_id, 'user', 'website'); $data['proof_of_payment'] = $this->Crud->read_field('id', $log_id, 'user', 'proof_of_payment'); $data['cac_certificate'] = $this->Crud->read_field('id', $log_id, 'user', 'cac_certificate'); $data['cac_2_7'] = $this->Crud->read_field('id', $log_id, 'user', 'cac_2_7'); $lga_id = $this->Crud->read_field('id', $log_id, 'user', 'lga_id'); $data['city'] = $this->Crud->read_field('id', $lga_id, 'city', 'name'); $data['lat'] = ''; $data['lng'] = ''; $data['phone'] = $this->Crud->read_field('id', $log_id, 'user', 'phone'); $data['address'] = $this->Crud->read_field('id', $log_id, 'user', 'address'); $state_id = $this->Crud->read_field('id', $log_id, 'user', 'state_id'); $data['state'] = $this->Crud->read_field('id', $state_id, 'state', 'name'); $data['country_id'] = $this->Crud->read_field('id', $log_id, 'user', 'country_id'); $img_id = $this->Crud->read_field('id', $log_id, 'user', 'img_id'); $logo = $this->Crud->read_field('id', $log_id, 'user', 'logo'); $data['state_id'] = $state_id; $data['lga_id'] = $lga_id; $data['img_id'] = $img_id; if(!empty($logo)){ $data['img'] = $logo; } else { $data['img'] = $this->Crud->image($img_id, 'big'); } $data['title'] = 'Profile View - '.app_name; $data['page_active'] = 'profile'; return view('accounts/profile', $data); } public function send_email($param1='', $param2=''){ $uid = $this->request->getPost('user_id'); $email = $this->Crud->read_field('id', $uid, 'user', 'email'); $fullname = $this->Crud->read_field('id', $uid, 'user', 'fullname'); if(empty($email)){ echo $this->Crud->msg('danger', 'Invalid Account Email'); die; } if($param1 == 'activation'){ $name = ucwords($fullname); $link = site_url('auth/verify_email/'.$uid); $message = ' <h2>Welcome to '.app_name.'!</h2> <p>Thank you for creating an account with us. To complete the setup of your new account, please verify your email by clicking the button below.</p> <p><a href="'.$link.'" class="button">Verify Your Account</a></p> <p>If the button above doesn`t work, you can copy and paste the following link into your browser:</p> <p><a href="'.$link.'">'.$link.'</a></p> <p class="note">If you didn`t sign up for this account, please disregard this email.</p> <p>Best Regards,</p> <p>The '.app_name.' Team</p> '; $body = ' Dear '.$name.', <br><br> '.$message; $inz = $this->Crud->send_email($email, ucwords('Action Required: Verify Your Account'), $body); if($inz > 0){ echo $this->Crud->msg('success', 'Activation Email sent successfully!'); echo '<script>location.reload(false);</script>'; } else { echo $this->Crud->msg('danger', 'Activation Email Failed. <br>Try Again Later'); } die; } if($param1 == 'otp'){ $reset = substr(md5(time().rand()), 0, 6); if($this->Crud->updates('id', $uid, 'user', array('reset'=>$reset)) > 0) { $fullname = $this->Crud->read_field('id', $uid, 'user', 'fullname'); // send email if ($email) { $msg = 'Dear ' . ucwords($fullname) . ',<br><br> We have received a request to verify your identity for ' . app_name . '. Please use the following One-Time Password (OTP) to proceed with your request:<br><br> OTP: <strong>' . $reset . '</strong><br><br> This OTP is valid for a limited time. If you did not initiate this request or have concerns about the security of your account, please contact our support team immediately at ' . push_email . '.<br><br> Thank you for choosing ' . app_name . '.<br><br> Best regards,<br> ' . app_name . ' Team'; $inz = $this->Crud->send_email($email, 'Your One-Time Password (OTP)', $msg); if($inz > 0){ echo $this->Crud->msg('success', 'Your One-Time Password Email sent successfully!'); echo '<script>location.reload(false);</script>'; } else { echo $this->Crud->msg('danger', 'Your One-Time Password Email Failed. <br>Try Again Later'); } die; } } } } public function get_state($country){ if(empty($country)){ echo '<label for="activate">State</label> <input type="text" class="form-control" name="state" id="state" readonly placeholder="Select Country First">'; } else { $state = $this->Crud->read_single_order('country_id', $country, 'state', 'name', 'asc'); echo '<label for="activate">State</label> <select class="form-select js-select2" data-search="on" id="state" name="state" onchange="lgaa();"> <option value="">Select</option> '; foreach($state as $qr) { $hid = ''; $sel = ''; echo '<option value="'.$qr->id.'" '.$sel.'>'.$qr->name.'</option>'; } echo '</select> <script> $(".js-select2").select2();</script>'; } } public function get_lga($state){ if(empty($state)){ echo '<label for="activate">City</label> <input type="text" class="form-control" name="lga" id="lga" readonly placeholder="Select State First">'; } else { $state = $this->Crud->read_single_order('state_id', $state, 'city', 'name', 'asc'); echo '<label for="activate" class="mb-2">City</label> <select class="form-select select2" data-search="on" id="lga" name="lga" onchange="branc();"> <option value="">Select</option> '; foreach($state as $qr) { $hid = ''; $sel = ''; echo '<option value="'.$qr->id.'" '.$sel.'>'.$qr->name.'</option>'; } echo '</select> <script> $(".js-select2").select2();</script>'; } } public function get_branch($state){ if(empty($state)){ echo '<label for="activate">Branch</label> <input type="text" class="form-control" name="branch" id="branch" readonly placeholder="Select LGA First">'; } else { $state = $this->Crud->read_single_order('city_id', $state, 'branch', 'name', 'asc'); echo '<label for="activate">Branch</label> <select class="form-select js-select2" data-search="on" id="branch" name="branch" onchange="load();"> <option value="">Select</option> '; foreach($state as $qr) { $hid = ''; $sel = ''; echo '<option value="'.$qr->id.'" '.$sel.'>'.$qr->name.'</option>'; } echo '</select> <script> $(".js-select2").select2();</script>'; } } }
Upload File
Create Folder