* @see https://codeigniter.com/userguide3/general/urls.html
*/
public function index(){
$this->load->helper('url');
$this->load->model('User_model');
$this->load->model('Service_model');
$data['pageTitle'] = '';
$this->load->view('pages/home', $data);
}
public function barber($lang){
$this->load->helper('url');
$this->load->model('User_model');
$this->load->model('Service_model');
$data['pageTitle'] = '';
$data['selectedLang'] = $lang;
$data['services'] = $this->Service_model->getAllServiceByServiceType('barber', $lang);
$this->load->view('pages/barber', $data);
}
public function beauty($lang){
$this->load->helper('url');
$this->load->model('User_model');
$this->load->model('Service_model');
$data['pageTitle'] = '';
$data['selectedLang'] = $lang;
$data['services'] = $this->Service_model->getAllServiceByServiceType('beauty', $lang);
$this->load->view('pages/beauty', $data);
}
public function booking($lang, $subpage){
$this->load->helper('url');
$this->load->model('User_model');
$this->load->model('Service_model');
$data['pageTitle'] = '';
$data['selectedLang'] = $lang;
$data['subpage'] = $subpage;
$data['services'] = $this->Service_model->getAllServiceByServiceType($subpage, $lang);
$data['workers'] = $this->Service_model->getActiveWorkers($subpage);
switch($subpage){
case 'barber':
$this->load->view('pages/barber-booking', $data);
break;
case 'beauty':
$this->load->view('pages/beauty-booking', $data);
break;
default:
header('Location:'.SITEURL);
}
}
public function booking_finished($lang, $subpage){
$this->load->helper('url');
$this->load->model('User_model');
$this->load->model('Service_model');
$data['pageTitle'] = '';
$data['selectedLang'] = $lang;
switch($subpage){
case 'barber':
$this->load->view('pages/barber-booking-finished', $data);
break;
case 'beauty':
$this->load->view('pages/beauty-booking-finished', $data);
break;
default:
header('Location:'.SITEURL);
}
}
public function email_verification(){
$this->load->helper('url');
$this->load->model('User_model');
$this->load->model('Service_model');
$this->load->model('Log_model');
$data['pageTitle'] = '';
$this->load->view('pages/email-verification', $data);
}
public function ajax(){
$this->load->helper('url');
$this->load->model('User_model');
$this->load->model('Service_model');
$this->load->model('Log_model');
$data['pageTitle'] = '';
if(isset($_POST['action']) && $_POST['action'] == 'getAvailableWorkersByServiceCategory' && isset($_POST['serv_cat_slug'])){
$workers = $this->Service_model->getWorkersByCategorySlug($_POST['serv_cat_slug']);
$returnedWorkers = '';
$workerIndex = 0;
$workerListShow = '';
if(is_array($workers)){
foreach($workers as $workerItem){
$workerListShow .= '';
/*
?>
$workers,
'workerListShow' => $workerListShow
);
echo json_encode($responseArray);
}
if(isset($_POST['action']) && $_POST['action'] == 'calculate_service_length' && isset($_POST['service_ids'])){
if($_POST['service_ids'] != ''){
$explodedServiceIds = explode(',', $_POST['service_ids']);
$totalLength = '00:00:00';
if(!empty($explodedServiceIds)){
foreach($explodedServiceIds as $explodedServiceIdItem){
$currentService = $this->Service_model->getServiceById($explodedServiceIdItem);
$time = $totalLength;
$time2 = $currentService->service_time;
$secs = strtotime($time2)-strtotime("00:00:00");
$addedTotal = date("H:i:s",strtotime($time)+$secs);
$totalLength = $addedTotal;
}
}
echo $totalLength;
}
}
if(isset($_POST['action']) && $_POST['action'] == 'getAvailableTimeOptions' && isset($_POST['selectedDate'])){
$results = $this->Service_model->getAvailableTimes($_POST['worker_id'], $_POST['selectedDate'], $_POST['servicelength']);
$rowIndex = 1;
if(is_array($results)){
foreach($results as $resultIem){
?>
Service_model->getAvailableTimes($_POST['worker_id'], $_POST['selectedDate'], $_POST['servicelength']);
$timeIsAvailable = 0;
if(is_array($results)){
foreach($results as $resultIem){
if(date('H:i:s', strtotime($resultIem)) == $_POST['selectedTime']){
$timeIsAvailable = 1;
}
}
echo $timeIsAvailable;
}
else{
echo 0;
}
}
if(isset($_POST['action']) && $_POST['action'] == 'getAvailableTimes' && isset($_POST['selectedDate'])){
$results = $this->Service_model->getAvailableTimes($_POST['worker_id'], $_POST['selectedDate'], $_POST['servicelength'].':00');
$rowIndex = 1;
if(!empty($results)){
foreach($results as $resultIem){
?>
Service_model->getWorkerById($_POST['worker_id']);
if(is_object($result)){
?>
worker_name;?>
User_model->getUserById($_POST['user_id']);
$userArray = array(
'is_enabled' => $_POST['newValue']
);
$this->User_model->updateUser($_POST['user_id'], $userArray);
$this->Log_model->addLog('change_user_status', $data['currentUser']->username.' státusza változott - '.($_POST['newValue']?'aktív':'letiltva').' állapotra', $_POST['operator']);
}
if(isset($_POST['action']) && $_POST['action'] == 'checkUser'){
echo $this->User_model->isUsernameAvailable($_POST['username']);
}
if(isset($_POST['action']) && $_POST['action'] == 'refreshLogMonitor'){
$logInfoArray = $this->Log_model->getAllLoginfo();
$logrow = '';
foreach($logInfoArray as $logInfoItem){
$logDateTime = new datetime($logInfoItem->event_datetime);
$logrow .= date_format($logDateTime,"Y-m-d H:i").' '.$logInfoItem->username.' '.$logInfoItem->event_content.'
';
}
echo $logrow;
}
$this->load->view('pages/ajax', $data);
}
public function booking_process(){
$this->load->helper('url');
$this->load->model('User_model');
$this->load->model('Service_model');
$data['pageTitle'] = '';
$data['subpage'] = '';
if(isset($_POST['sendBooking'])){
//calculate finish time
$serviceStartTime = date("H:i:s", strtotime($_POST['booking_start_time']));
$serviceLengthTime = date("H:i:s", strtotime($_POST['servicelength']));
$secs = strtotime($serviceLengthTime)-strtotime("00:00:00");
$serviceFinishTime = date("H:i:s",strtotime($serviceStartTime)+$secs);
$data['services'] = $this->Service_model->getAllServiceByServiceType($_POST['subpage'], $_POST['lang']);
$data['workers'] = $this->Service_model->getAllWorkers();
$data['selectedLang'] = 'en';
$selectedServiceArray = array();
//find selected services
if(is_array($data['services'])){
foreach($data['services'] as $serviceItem){
if(isset($_POST['service_'.$serviceItem->service_id])){
if($_POST['service_'.$serviceItem->service_id]){
$selectedServiceArray[] = $serviceItem->service_id;
}
}
}
}
// 1. Build selected service array
$selectedServiceArray = array();
$totalLengthSeconds = 0;
foreach ($_POST as $key => $value) {
if (strpos($key, 'service_') === 0 && $value == '1') {
$serviceId = str_replace('service_', '', $key);
$selectedServiceArray[] = $serviceId;
$service = $this->Service_model->getServiceById($serviceId);
if ($service) {
$parts = explode(':', $service->service_time);
$totalLengthSeconds += ($parts[0] * 3600) + ($parts[1] * 60);
}
}
}
// 2. Convert total time to H:i format
$servicelength = gmdate('H:i:s', $totalLengthSeconds);
// 3. Build booking array
$bookingArray = array(
'guest_name' => $_POST['guest_name'],
'guest_email' => $_POST['guest_email'],
'guest_phone' => $_POST['guest_phone'],
'worker_id' => $_POST['worker_id'],
'booking_date' => $_POST['booking_date'],
'booking_start_time' => $_POST['booking_start_time'],
'booking_finish_time' => '', // optional
'service_ids' => serialize($selectedServiceArray),
'guest_confirmed' => '0',
'guest_confirm_code' => '1234',
);
$bookingDate = $bookingArray['booking_date'];
$bookingTime = $bookingArray['booking_start_time'];
$weekday = date('w', strtotime($bookingDate));
$schedule = $this->Service_model->getWorkerScheduleByDay($bookingArray['worker_id'], $weekday);
if (!$schedule) {
$this->output
->set_status_header(403)
->set_content_type('application/json')
->set_output(json_encode(['error' => 'Worker is not available on this day.']));
return;
}
if ($bookingTime < $schedule->start_time || $bookingTime >= $schedule->end_time) {
$this->output
->set_status_header(403)
->set_content_type('application/json')
->set_output(json_encode(['error' => 'Booking time is outside worker schedule.']));
return;
}
if ($schedule->is_alternate_week) {
$weekNum = date('W', strtotime($bookingDate));
if ($weekNum % 2 !== 0) {
$this->output
->set_status_header(403)
->set_content_type('application/json')
->set_output(json_encode(['error' => 'Worker only works every second week.']));
return;
}
}
// 4. Validate: available slot with correct length
$available = $this->Service_model->getAvailableTimes(
$bookingArray['worker_id'],
$bookingArray['booking_date'],
$servicelength
);
if (!is_array($available) || !in_array($bookingArray['booking_start_time'], $available)) {
$this->output
->set_status_header(409)
->set_content_type('application/json')
->set_output(json_encode([
'error' => 'Conflict. Timeslot is taken or does not fit the service.'
]));
return;
}
// 5. Validate: booking doesn't go past 18:00
$bookingStart = new DateTime($bookingArray['booking_start_time']);
$bookingLength = new DateTime($servicelength);
$bookingEnd = clone $bookingStart;
$bookingEnd->add(new DateInterval('PT' . intval($bookingLength->format('H')) . 'H'));
$bookingEnd->add(new DateInterval('PT' . intval($bookingLength->format('i')) . 'M'));
$bookingArray['booking_finish_time'] = $bookingEnd->format('H:i:s');
$closingTime = new DateTime('18:00');
if ($bookingEnd > $closingTime) {
$this->output
->set_status_header(403)
->set_content_type('application/json')
->set_output(json_encode([
'error' => 'Selected time exceeds business hours.'
]));
return;
}
// 6. Create booking
$this->Service_model->createBooking($bookingArray);
$worker = $this->Service_model->getWorkerById($bookingArray['worker_id']);
$services = unserialize($bookingArray['service_ids']);
$serviceArray = array();
$emailArray = array();
if(is_array($services)){
foreach($services as $serviceItem){
$selectedService = $this->Service_model->getServiceById($serviceItem);
if(is_object($selectedService)){
$serviceArray[] = $selectedService;
}
}
}
$content = '';
switch($_POST['lang']){
case 'no':
$content = 'Kjære gjest,
';
$content .= 'Takk for din bestilling!
';
$content .= '
';
$content .= '';
$content .= '| Navn: | '.$bookingArray['guest_name'].' |
';
$content .= '| E-post: | '.$bookingArray['guest_email'].' |
';
$content .= '| Telefon: | '.$bookingArray['guest_phone'].' |
';
$content .= '| Arbeider: | '.$worker->worker_name.' |
';
$content .= '| Dato: | '.$bookingArray['booking_date'].' |
';
$content .= '| Tid: | '.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].' |
';
$content .= '| Tjenester: | ';
$totalServicePrice = 0;
foreach($serviceArray as $serviceArrayItem){
$totalServicePrice += $serviceArrayItem->service_price;
$content .= '| '.$serviceArrayItem->service_name_no.' | '.$serviceArrayItem->service_price.' kr | ';
}
$content .= ' | ';
$content .= '
| Totalpris: | '.$totalServicePrice.' kr |
';
$content .= '
';
$content .= '
STUDIOBEVE';
break;
case 'en':
$content = 'Dear Guest,
';
$content .= 'Thank you for your booking!
';
$content .= '
';
$content .= '';
$content .= '| Name: | '.$bookingArray['guest_name'].' |
';
$content .= '| Email: | '.$bookingArray['guest_email'].' |
';
$content .= '| Phone: | '.$bookingArray['guest_phone'].' |
';
$content .= '| Worker: | '.$worker->worker_name.' |
';
$content .= '| Date: | '.$bookingArray['booking_date'].' |
';
$content .= '| Time: | '.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].' |
';
$content .= '| Services: | ';
$totalServicePrice = 0;
foreach($serviceArray as $serviceArrayItem){
$totalServicePrice += $serviceArrayItem->service_price;
$content .= '| '.$serviceArrayItem->service_name_en.' | '.$serviceArrayItem->service_price.' kr | ';
}
$content .= ' | ';
$content .= '
| Total price: | '.$totalServicePrice.' kr |
';
$content .= '
';
$content .= '
STUDIOBEVE';
break;
case 'hu':
$content = 'Kedves Vendégünk,
';
$content .= 'Köszönettel fogadtuk a foglalását!
';
$content .= '
';
$content .= '';
$content .= '| Név: | '.$bookingArray['guest_name'].' |
';
$content .= '| Email: | '.$bookingArray['guest_email'].' |
';
$content .= '| Telefon: | '.$bookingArray['guest_phone'].' |
';
$content .= '| Dolgozó: | '.$worker->worker_name.' |
';
$content .= '| Dátum: | '.$bookingArray['booking_date'].' |
';
$content .= '| Időpont: | '.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].' |
';
$content .= '| Szolgáltatás(ok): | ';
$totalServicePrice = 0;
foreach($serviceArray as $serviceArrayItem){
$totalServicePrice += $serviceArrayItem->service_price;
$content .= '| '.$serviceArrayItem->service_name_hu.' | '.$serviceArrayItem->service_price.' kr | ';
}
$content .= ' | ';
$content .= '
| Összesen fizetendő: | '.$totalServicePrice.' kr |
';
$content .= '
';
$content .= '
STUDIOBEVE';
break;
}
$data['selectedLang'] = $_POST['lang'];
$emailItem = array(
'addressee_email' => $bookingArray['guest_email'],
'addressee_name' => $bookingArray['guest_name'],
'subject' => '[studiobeve] Your booking has arrived',
'content' => $content,
'attachments' => array()
);
$emailArray[] = $emailItem;
header('Location:'.SITEURL.$_POST['lang'].'/booking-finished/'.$_POST['subpage']);
}
$this->User_model->sendEmail($emailArray, $_POST['lang'], $_POST['subpage']);
$this->load->view('pages/booking-process', $data);
}
public function profile(){
$this->load->helper('url');
$this->load->model('User_model');
$this->load->model('Log_model');
$this->load->model('Module_model');
$data['message'] = '';
$data['message_class'] = '';
$data['fullname'] = '';
$data['password'] = '';
$data['profile_img_url'] = '';
if(isset($_SESSION['username'])){
$data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']);
$data['message'] = '';
$data['message_class'] = '';
$data['pageTitle'] = 'Profil szerkesztése';
if($this->User_model->is_user_admin($_SESSION['username'])){
$data['activeModules'] = $this->Module_model->getAllModule();
}
else{
$data['activeModules'] = $this->Module_model->getUserModules($data['currentUser']->user_id);
}
if(isset($_POST["storeProfile"])) {
if($_POST['fullname'] != $data['currentUser']->fullname){
$userArray = array(
'fullname' => $_POST['fullname']
);
$this->User_model->updateUser($data['currentUser']->user_id, $userArray);
$this->Log_model->addLog('profile', 'A felhasználó módosította a teljes nevét: '.$data['currentUser']->fullname.' => '.$_POST['fullname'],$_SESSION['username']);
}
if($_POST['password'] != ''){
$userArray = array(
'password' => hash('sha256', $_POST['password'])
);
$this->User_model->updateUser($data['currentUser']->user_id, $userArray);
$this->Log_model->addLog('profile', 'A felhasználó módosította a jelszavát',$_SESSION['username']);
}
//upload profile image
if($_FILES["profile_img"]["tmp_name"] != ''){
$target_dir = getcwd()."/assets/img/profiles/";
$target_file = $target_dir . str_replace('.','_', str_replace('@','_',$_SESSION['username']));
$imageFileType = strtolower(pathinfo(basename($_FILES["profile_img"]["name"]),PATHINFO_EXTENSION));
if (move_uploaded_file($_FILES["profile_img"]["tmp_name"], $target_file.'.'.$imageFileType)) {
$data['message'] = 'A profilkép sikeresen feltöltve!';
$data['message_class'] = 'successMessage';
$data['profile_img_url'] = 'assets/img/profiles/'.str_replace('.','_', str_replace('@','_',$_SESSION['username'])).'.'.$imageFileType;
$userArray = array(
'profile_img_url' => $data['profile_img_url']
);
$this->User_model->updateUser($data['currentUser']->user_id, $userArray);
$this->Log_model->addLog('profile', 'A felhasználó lecserélte a profilképét ',$_SESSION['username']);
} else {
$data['message'] = 'Hiba a feltöltés közben!';
$data['message_class'] = 'errorMessage';
}
}
$data['message'] = 'A profil sikeresen módosítva!';
$data['message_class'] = 'successMessage';
}
$data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']);
$this->load->view('pages/profile', $data);
}
else{
header("Location:".SITEURL."login");
}
}
public function log_monitor(){
$this->load->helper('url');
$this->load->model('User_model');
$this->load->model('Log_model');
$this->load->model('Module_model');
if(isset($_SESSION['username'])){
$data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']);
$data['message'] = '';
$data['message_class'] = '';
$data['pageTitle'] = 'Rendszermonitor';
$data['logInfoLink'] = '';
if($this->User_model->is_user_admin($_SESSION['username'])){
$data['activeModules'] = $this->Module_model->getAllModule();
}
else{
$data['activeModules'] = $this->Module_model->getUserModules($data['currentUser']->user_id);
}
$selectedModule = $this->Module_model->getModuleBySlug('log-monitor');
if($this->Module_model->is_module_available($selectedModule->module_id, $data['currentUser']->user_id)){
if(isset($_POST['exportToFile'])){
$logInfoArray = $this->Log_model->getAllLoginfo();
$logrow = '';
$logTxt = fopen(getcwd()."/documents/loginfo.csv", "w") or die("Hiba a fájl mentésekor!");
$row = '"Esemény ideje";'.'"Esemény típusa";'.'"Felhasználónév";"Bejegyzés tartalma";'.PHP_EOL;
$string_encoded = iconv( mb_detect_encoding( $row ), 'ISO-8859-2', $row );
fwrite($logTxt, $string_encoded);
foreach($logInfoArray as $logInfoItem){
$logDateTime = new datetime($logInfoItem->event_datetime);
$row = date_format($logDateTime,"Y-m-d H:i").';"'.$logInfoItem->event_type.'";"'.$logInfoItem->username.'";"'.$logInfoItem->event_content.'";'.PHP_EOL;
$string_encoded = iconv( mb_detect_encoding( $row ), 'ISO-8859-2', $row );
fwrite($logTxt, $string_encoded);
}
fclose($logTxt);
$data['logInfoLink'] = 'A loginfo.csv fájl letöltése';
}
$this->load->view('log-monitor', $data);
}
else{
header("Location:".SITEURL."home");
}
}
else{
header("Location:".SITEURL."login");
}
}
}