* @see https://codeigniter.com/userguide3/general/urls.html */ public function dashboard(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Vezérlőpult'; $data['message'] = ''; $data['message_class'] = ''; 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); } $this->load->view('admin/dashboard', $data); } else{ header("Location:".SITEURL."login"); } } public function services(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Szolgáltatások'; $data['message'] = ''; $data['message_class'] = ''; 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); } $data['results'] = $this->Service_model->getAllServices(); $this->load->view('admin/services', $data); } else{ header("Location:".SITEURL."login"); } } public function add_service(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Szolgáltatás hozzáadás'; $data['message'] = ''; $data['message_class'] = ''; 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); } $data['serviceCategories'] = $this->Service_model->getAllServiceCategories(); $this->load->view('admin/add-service', $data); } else{ header("Location:".SITEURL."login"); } } public function worker_schedule() { $this->load->helper('url'); $this->load->model('Service_model'); $this->load->model('User_model'); $this->load->model('Module_model'); if (!isset($_SESSION['username'])) { header("Location:".SITEURL."login"); exit; } $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); 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); } $data['workers'] = $this->Service_model->getAllWorkers(); $worker_id = $this->input->get('worker_id'); if ($worker_id) { $data['selectedWorkerId'] = $worker_id; $data['schedule'] = $this->Service_model->getWorkerSchedule($worker_id); } else { $data['selectedWorkerId'] = null; $data['schedule'] = []; } $this->load->view('admin/worker_schedule', $data); } public function worker_schedule_overrides() { $this->load->model('Service_model'); $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['workerSchedules'] = $this->Service_model->getWorkerScheduleOverrides(); $data['workers'] = $this->Service_model->getAllWorkers(); $data['pageTitle'] = 'Dolgozói egyedi munkaidők'; $this->load->view('admin/worker_schedule_overrides', $data); } public function admin_worker_schedule() { $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $data['pageTitle'] = 'Munkarend beállítása'; $data['workers'] = $this->Service_model->getAllWorkers(); if ($this->input->post('storeSchedule')) { $this->load->database(); $this->db->where('worker_id', $_POST['worker_id']); $this->db->delete('worker_schedule'); foreach ($_POST['weekday'] as $i => $day) { $insert = [ 'worker_id' => $_POST['worker_id'], 'weekday' => $day, 'start_time' => $_POST['start_time'][$i], 'end_time' => $_POST['end_time'][$i], 'is_alternate_week' => isset($_POST['is_alternate_week'][$i]) ? 1 : 0 ]; $this->db->insert('worker_schedule', $insert); } } if (!empty($_GET['worker_id'])) { $this->load->database(); $worker_id = $_GET['worker_id']; $data['selectedWorkerId'] = $worker_id; $data['schedule'] = $this->db->query("SELECT * FROM worker_schedule WHERE worker_id = ?", array($worker_id))->result(); } $this->load->view('admin/worker_schedule', $data); } public function store_worker_schedule() { $this->load->model('Service_model'); $this->load->helper('url'); $worker_id = $this->input->post('worker_id'); if (!$worker_id) { show_error('Dolgozó nincs kiválasztva.'); return; } // Clear existing schedule $this->Service_model->clearWorkerSchedule($worker_id); // Loop through submitted times for ($i = 0; $i <= 6; $i++) { $start = $this->input->post("start_time[$i]"); $end = $this->input->post("end_time[$i]"); $alt = $this->input->post("alternate_week[$i]") ? 1 : 0; if (!empty($start) && !empty($end)) { $this->Service_model->addWorkerSchedule([ 'worker_id' => $worker_id, 'weekday' => $i, 'start_time' => $start, 'end_time' => $end, 'is_alternate_week' => $alt ]); } } redirect('admin/worker_schedule'); } public function manage_worker_schedule($worker_id = null) { $this->load->model('Service_model'); $data['workers'] = $this->Service_model->getAllWorkers(); $data['selectedWorker'] = null; $data['schedule'] = []; if ($worker_id) { $data['selectedWorker'] = $this->Service_model->getWorkerById($worker_id); $data['schedule'] = $this->Service_model->getWorkerSchedule($worker_id); } $this->load->view('admin/manage_worker_schedule', $data); } public function save_worker_schedule() { $this->load->model('Service_model'); $worker_id = $this->input->post('worker_id'); $this->Service_model->clearWorkerSchedule($worker_id); foreach ($_POST['weekday'] as $index => $day) { if (!empty($_POST['start_time'][$index]) && !empty($_POST['end_time'][$index])) { $this->Service_model->addWorkerSchedule([ 'worker_id' => $worker_id, 'weekday' => $day, 'start_time' => $_POST['start_time'][$index], 'end_time' => $_POST['end_time'][$index], 'is_alternate_week' => isset($_POST['is_alternate_week'][$index]) ? 1 : 0 ]); } } redirect('admin/manage_worker_schedule/' . $worker_id); } public function update_service($service_id){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Szolgáltatás módosítása (#'.$service_id.')'; $data['message'] = ''; $data['message_class'] = ''; 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); } $data['selectedItem'] = $this->Service_model->getServiceById($service_id); $data['serviceCategories'] = $this->Service_model->getAllServiceCategories(); $this->load->view('admin/update-service', $data); } else{ header("Location:".SITEURL."login"); } } public function service_process(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Log_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = ''; $data['message'] = ''; $data['message_class'] = ''; if(isset($_GET['delete-service'])){ $selected_service = $this->Service_model->getServiceById($_GET['delete-service']); $serviceArray = array( 'is_deleted' => '1' ); $this->Service_model->updateService($_GET['delete-service'], $serviceArray); $this->Log_model->addLog('services', $data['currentUser']->username.' törölte a(z) '.$_GET['delete-service'].' számú szolgáltatást ('.$selected_service->service_name_hu.')', $data['currentUser']->username); } if(isset($_POST['addNewService'])){ $serviceArray = array( 'service_type' => $_POST['service_type'], 'service_category_no' => $_POST['service_category_no'], 'service_category_en' => $_POST['service_category_en'], 'service_category_hu' => $_POST['service_category_hu'], 'service_name_no' => $_POST['service_name_no'], 'service_name_en' => $_POST['service_name_en'], 'service_name_hu' => $_POST['service_name_hu'], 'service_description_no' => $_POST['service_description_no'], 'service_description_en' => $_POST['service_description_en'], 'service_description_hu' => $_POST['service_description_hu'], 'service_price' => $_POST['service_price'], 'service_time' => $_POST['service_time'], 'service_category_id' => $_POST['service_category_id'], 'is_enabled' => $_POST['is_enabled'] ); $this->Log_model->addLog('services', $data['currentUser']->username.' hozzáadta a(z) '.$_POST['service_name_hu'].' szolgáltatást ('.implode(',',$serviceArray).')', $data['currentUser']->username); $this->Service_model->createService($serviceArray); } if(isset($_POST['updateService'])){ $serviceArray = array( 'service_type' => $_POST['service_type'], 'service_category_no' => $_POST['service_category_no'], 'service_category_en' => $_POST['service_category_en'], 'service_category_hu' => $_POST['service_category_hu'], 'service_name_no' => $_POST['service_name_no'], 'service_name_en' => $_POST['service_name_en'], 'service_name_hu' => $_POST['service_name_hu'], 'service_description_no' => $_POST['service_description_no'], 'service_description_en' => $_POST['service_description_en'], 'service_description_hu' => $_POST['service_description_hu'], 'service_price' => $_POST['service_price'], 'service_time' => $_POST['service_time'], 'service_category_id' => $_POST['service_category_id'], 'is_enabled' => $_POST['is_enabled'] ); $this->Log_model->addLog('services', $data['currentUser']->username.' módosította a(z) '.$_POST['service_name_hu'].' szolgáltatást ('.implode(',',$serviceArray).')', $data['currentUser']->username); $this->Service_model->updateService($_POST['service_id'], $serviceArray); } header('Location:'.SITEURL.'services'); $this->load->view('admin/service-process', $data); } } public function service_categories(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Szolgáltatás kategóriák'; $data['message'] = ''; $data['message_class'] = ''; 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); } $data['results'] = $this->Service_model->getAllServiceCategories(); $this->load->view('admin/service-categories', $data); } else{ header("Location:".SITEURL."login"); } } public function add_service_category(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Szolgáltatás kategória hozzáadása'; $data['message'] = ''; $data['message_class'] = ''; 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); } $this->load->view('admin/add-service-category', $data); } else{ header("Location:".SITEURL."login"); } } public function update_service_category($service_category_id){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Szolgáltatás módosítása (#'.$service_category_id.')'; $data['message'] = ''; $data['message_class'] = ''; 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); } $data['selectedItem'] = $this->Service_model->getServiceCategoryById($service_category_id); $this->load->view('admin/update-service-category', $data); } else{ header("Location:".SITEURL."login"); } } public function service_category_process(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Log_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = ''; $data['message'] = ''; $data['message_class'] = ''; if(isset($_GET['delete-service-category'])){ $selected_service = $this->Service_model->getServiceCategoryById($_GET['delete-service-category']); $serviceArray = array( 'is_deleted' => '1' ); $this->Service_model->updateServiceCategory($_GET['delete-service-category'], $serviceArray); } if(isset($_POST['addNewServiceCategory'])){ $serviceCategoryArray = array( 'serv_cat_slug' => $_POST['serv_cat_slug'], 'serv_cat_name' => $_POST['serv_cat_name'] ); $this->Service_model->createServiceCategory($serviceCategoryArray); } if(isset($_POST['updateServiceCategory'])){ $serviceCategoryArray = array( 'serv_cat_slug' => $_POST['serv_cat_slug'], 'serv_cat_name' => $_POST['serv_cat_name'] ); $this->Service_model->updateServiceCategory($_POST['service_category_id'], $serviceCategoryArray); } header('Location:'.SITEURL.'service-categories'); $this->load->view('admin/service-category-process', $data); } } public function workers(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Dolgozók'; $data['message'] = ''; $data['message_class'] = ''; 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); } $data['results'] = $this->Service_model->getAllWorkers(); $this->load->view('admin/workers', $data); } else{ header("Location:".SITEURL."login"); } } public function add_worker(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Dolgozó hozzáadása'; $data['message'] = ''; $data['message_class'] = ''; 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); } $data['serviceCategories'] = $this->Service_model->getAllServiceCategories(); $this->load->view('admin/add-worker', $data); } else{ header("Location:".SITEURL."login"); } } public function update_worker($worker_id){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Dolgozó módosítása (#'.$worker_id.')'; $data['message'] = ''; $data['message_class'] = ''; 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); } $data['serviceCategories'] = $this->Service_model->getAllServiceCategories(); $data['selectedItem'] = $this->Service_model->getWorkerById($worker_id); $this->load->view('admin/update-worker', $data); } else{ header("Location:".SITEURL."login"); } } public function worker_process(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Log_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = ''; $data['message'] = ''; $data['message_class'] = ''; if(isset($_GET['delete-worker'])){ $selected_worker = $this->Service_model->getWorkerById($_GET['delete-worker']); $workerArray = array( 'is_deleted' => '1' ); $this->Service_model->updateWorker($_GET['delete-worker'], $workerArray); $this->Log_model->addLog('workers', $data['currentUser']->username.' törölte a(z) '.$_GET['delete-worker'].' számú dolgozót ('.$selected_worker->worker_name.')', $data['currentUser']->username); } if(isset($_POST['addNewWorker'])){ $data['worker_img'] = ''; if($_FILES["worker_img"]["tmp_name"] != ''){ $target_dir = getcwd()."/assets/img/"; $target_file = $target_dir . 'worker_'.str_replace(' ','_', $_POST['worker_name']); $imageFileType = strtolower(pathinfo(basename($_FILES["worker_img"]["name"]),PATHINFO_EXTENSION)); $allowedTypes = array('jpg', 'jpeg', 'png', 'gif', 'webp'); if (!in_array($imageFileType, $allowedTypes)) { $data['message'] = 'Csak képfájlok engedélyezettek (jpg, png, gif, webp)!'; $data['message_class'] = 'errorMessage'; } elseif (move_uploaded_file($_FILES["worker_img"]["tmp_name"], $target_file.'.'.$imageFileType)) { $data['message'] = 'A profilkép sikeresen feltöltve!'; $data['message_class'] = 'successMessage'; $data['worker_img'] = 'worker_'.str_replace(' ','_', $_POST['worker_name']).'.'.$imageFileType; } else { $data['message'] = 'Hiba a feltöltés közben!'; $data['message_class'] = 'errorMessage'; } } $workerArray = array( 'worker_name' => $_POST['worker_name'], 'worker_info' => $_POST['worker_info'], 'is_beauty' => $_POST['is_beauty'], 'is_barber' => $_POST['is_barber'], 'worker_profile_img' => $data['worker_img'], 'service_category_id' => $_POST['service_category_id'], 'is_active' => $_POST['is_active'] ); $this->Log_model->addLog('workers', $data['currentUser']->username.' létrehozta a(z) '.$_POST['worker_name'].' nevű dolgozót ('.implode(',',$workerArray).')', $data['currentUser']->username); $this->Service_model->createWorker($workerArray); } if(isset($_POST['updateWorker'])){ $workerArray = array( 'worker_name' => $_POST['worker_name'], 'worker_info' => $_POST['worker_info'], 'is_beauty' => $_POST['is_beauty'], 'is_barber' => $_POST['is_barber'], 'service_category_id' => $_POST['service_category_id'], 'is_active' => $_POST['is_active'], 'google_calendar_id' => isset($_POST['google_calendar_id']) ? $_POST['google_calendar_id'] : '', 'ntfy_topic' => isset($_POST['ntfy_topic']) ? $_POST['ntfy_topic'] : '', 'lunch_window_start' => !empty($_POST['lunch_window_start']) ? $_POST['lunch_window_start'] : null, 'lunch_window_end' => !empty($_POST['lunch_window_end']) ? $_POST['lunch_window_end'] : null, 'lunch_preferred_time' => !empty($_POST['lunch_preferred_time']) ? $_POST['lunch_preferred_time'] : null, ); $this->Service_model->updateWorker($_POST['worker_id'], $workerArray); $this->Log_model->addLog('workers', $data['currentUser']->username.' módosította a(z) '.$_POST['worker_name'].' nevű dolgozót ('.implode(',',$workerArray).')', $data['currentUser']->username); if($_FILES["worker_img"]["tmp_name"] != ''){ $target_dir = getcwd()."/assets/img/"; $target_file = $target_dir . 'worker_'.str_replace(' ','_', $_POST['worker_name']); $imageFileType = strtolower(pathinfo(basename($_FILES["worker_img"]["name"]),PATHINFO_EXTENSION)); $allowedTypes = array('jpg', 'jpeg', 'png', 'gif', 'webp'); if (!in_array($imageFileType, $allowedTypes)) { $data['message'] = 'Csak képfájlok engedélyezettek (jpg, png, gif, webp)!'; $data['message_class'] = 'errorMessage'; } elseif (move_uploaded_file($_FILES["worker_img"]["tmp_name"], $target_file.'.'.$imageFileType)) { $data['message'] = 'A profilkép sikeresen feltöltve!'; $data['message_class'] = 'successMessage'; $data['worker_img'] = 'worker_'.str_replace(' ','_', $_POST['worker_name']).'.'.$imageFileType; $workerArray = array( 'worker_profile_img' => $data['worker_img'] ); $this->Log_model->addLog('workers', $data['currentUser']->username.' profilképet állított be a(z) '.$_POST['worker_name'].' nevű dolgozóhoz', $data['currentUser']->username); $this->Service_model->updateWorker($_POST['worker_id'], $workerArray); } else { $data['message'] = 'Hiba a feltöltés közben!'; $data['message_class'] = 'errorMessage'; } } } header("Location:".SITEURL."workers"); $this->load->view('admin/worker-process', $data); } } public function bookings(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Foglalások'; $data['message'] = ''; $data['message_class'] = ''; 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); } $data['workers'] = $this->Service_model->getActiveWorkers(); if(isset($_GET['worker'])){ $data['results'] = $this->Service_model->getActualBookingsByWorkerID($_GET['worker']); } else{ $data['results'] = $this->Service_model->getActualBookings(); } $this->load->view('admin/bookings', $data); } else{ header("Location:".SITEURL."login"); } } public function add_booking(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Foglalás hozzáadása'; $data['message'] = ''; $data['message_class'] = ''; 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); } $available_services = $this->Service_model->getAvailableServices(); $serviceFile = fopen("load_services.json", "w") or die("Unable to open file!"); fwrite($serviceFile, json_encode($available_services)); fclose($serviceFile); $data['workers'] = $this->Service_model->getAllWorkers(); $this->load->view('admin/add-booking', $data); } else{ header("Location:".SITEURL."login"); } } public function update_booking($booking_id){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Module_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = 'Foglalás módosítása (#'.$booking_id.')'; $data['message'] = ''; $data['message_class'] = ''; 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); } $available_services = $this->Service_model->getAvailableServices(); $serviceFile = fopen("load_services.json", "w") or die("Unable to open file!"); fwrite($serviceFile, json_encode($available_services)); fclose($serviceFile); $data['workers'] = $this->Service_model->getAllWorkers(); $data['selectedItem'] = $this->Service_model->getBookingById($booking_id); $this->load->view('admin/update-booking', $data); } else{ header("Location:".SITEURL."login"); } } public function booking_process(){ $this->load->helper('url'); $this->load->model('User_model'); $this->load->model('Service_model'); $this->load->model('Log_model'); if(isset($_SESSION['username'])){ $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); $data['pageTitle'] = ''; $data['message'] = ''; $data['message_class'] = ''; if(isset($_GET['delete-booking'])){ $selectedBooking = $this->Service_model->getBookingById($_GET['delete-booking']); // Google Calendar: delete events before removing booking $this->load->library('GoogleCalendar'); $this->config->load('google_calendar'); $delWorker = $this->Service_model->getWorkerById($selectedBooking->worker_id); if(!empty($selectedBooking->gcal_event_id_worker) && $delWorker && !empty($delWorker->google_calendar_id)){ $this->googlecalendar->deleteEvent($delWorker->google_calendar_id, $selectedBooking->gcal_event_id_worker); } $evelinCalIdDel = $this->config->item('gcal_evelin_calendar_id'); if(!empty($selectedBooking->gcal_event_id_owner) && !empty($evelinCalIdDel)){ $this->googlecalendar->deleteEvent($evelinCalIdDel, $selectedBooking->gcal_event_id_owner); } // ntfy push notification $this->_ntfy( 'Admin deleted booking: ' . $selectedBooking->guest_name, 'Worker: ' . ($delWorker ? $delWorker->worker_name : '?') . "\n" . 'Date: ' . $selectedBooking->booking_date . ' ' . $selectedBooking->booking_start_time, ($delWorker && isset($delWorker->ntfy_topic)) ? $delWorker->ntfy_topic : null ); $this->Service_model->deleteBooking($_GET['delete-booking']); $this->Log_model->addLog('bookings', $data['currentUser']->username.' törölte a(z) '.$_GET['delete-booking'].' számú foglalást ('.$selectedBooking->guest_name.', '.$selectedBooking->guest_email.', '.$selectedBooking->guest_phone.', '.$selectedBooking->booking_date.', '.$selectedBooking->booking_start_time.', '.$selectedBooking->booking_finish_time.', '.$selectedBooking->service_ids.')', $data['currentUser']->username); header('Location:'.SITEURL.'bookings'); } if(isset($_POST['addNewBookingManual'])){ $booking_date = new DateTime(date('Y-m-d', strtotime($_POST['booking_date']))); $end_booking_date = new DateTime(date('Y-m-d', strtotime($_POST['end_booking_date']))); $diff = $booking_date->diff($end_booking_date); $selectedServiceArray = array(); if($_POST['service_ids'] != ''){ $selectedServiceArray = explode(',', $_POST['service_ids']); } if($_POST['booking_date'] != $_POST['end_booking_date'] && $booking_date <= $end_booking_date){ for($index = 0; $index <= $diff->days; $index++){ $selectedDate = date('Y-m-d', strtotime($_POST['booking_date']. ' + '.$index.' days')); $bookingArray = array( 'guest_name' => $_POST['guest_name'], 'guest_email' => $_POST['guest_email'], 'guest_phone' => $_POST['guest_phone'], 'worker_id' => $_POST['worker_id'], 'booking_date' => $selectedDate, 'booking_start_time' => $_POST['booking_start_time'], 'booking_finish_time' => $_POST['booking_finish_time'], 'service_ids' => serialize($selectedServiceArray), 'guest_confirmed' => '0', 'guest_confirm_code' => '1234', ); $this->Service_model->createBooking($bookingArray); } } else{ $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' => $_POST['booking_finish_time'], 'service_ids' => serialize($selectedServiceArray), 'guest_confirmed' => '0', 'guest_confirm_code' => '1234', ); $this->Log_model->addLog('bookings', $data['currentUser']->username.' létrehoza a(z) '.$_POST['guest_name'].' nevű vendég foglalást ('.implode(', ', $bookingArray).')', $data['currentUser']->username); $this->Service_model->createBooking($bookingArray); } if($_POST['send_notification']){ $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 .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= '
Navn: '.$bookingArray['guest_name'].'
E-post: '.$bookingArray['guest_email'].'
Telefon: '.$bookingArray['guest_phone'].'
Arbeider: '.$worker->worker_name.'
Dato: '.$bookingArray['booking_date'].'
Tid: '.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'
Tjenester: '; $totalServicePrice = 0; foreach($serviceArray as $serviceArrayItem){ $totalServicePrice += $serviceArrayItem->service_price; $content .= ''; } $content .= '
'.$serviceArrayItem->service_name_no.''.$serviceArrayItem->service_price.' kr
Totalpris: '.$totalServicePrice.' kr
'; $content .= '
STUDIOBEVE'; $this->Log_model->addLog('bookings', $data['currentUser']->username.' új foglalásról norvég nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username); break; case 'en': $content = 'Dear Guest,
'; $content .= 'Thank you for your booking!
'; $content .= '
'; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= '
Name: '.$bookingArray['guest_name'].'
Email: '.$bookingArray['guest_email'].'
Phone: '.$bookingArray['guest_phone'].'
Worker: '.$worker->worker_name.'
Date: '.$bookingArray['booking_date'].'
Time: '.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'
Services: '; $totalServicePrice = 0; foreach($serviceArray as $serviceArrayItem){ $totalServicePrice += $serviceArrayItem->service_price; $content .= ''; } $content .= '
'.$serviceArrayItem->service_name_en.''.$serviceArrayItem->service_price.' kr
Total price: '.$totalServicePrice.' kr
'; $content .= '
STUDIOBEVE'; $this->Log_model->addLog('bookings', $data['currentUser']->username.' új foglalásról angol nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username); break; case 'hu': $content = 'Kedves Vendégünk,
'; $content .= 'Köszönettel fogadtuk a foglalását!
'; $content .= '
'; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= '
Név: '.$bookingArray['guest_name'].'
Email: '.$bookingArray['guest_email'].'
Telefon: '.$bookingArray['guest_phone'].'
Dolgozó: '.$worker->worker_name.'
Dátum: '.$bookingArray['booking_date'].'
Időpont: '.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'
Szolgáltatás(ok): '; $totalServicePrice = 0; foreach($serviceArray as $serviceArrayItem){ $totalServicePrice += $serviceArrayItem->service_price; $content .= ''; } $content .= '
'.$serviceArrayItem->service_name_hu.''.$serviceArrayItem->service_price.' kr
Összesen fizetendő: '.$totalServicePrice.' kr
'; $content .= '
STUDIOBEVE'; $this->Log_model->addLog('bookings', $data['currentUser']->username.' új foglalásról magyar nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username); 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; $this->User_model->sendEmail($emailArray, $_POST['lang'], ''); } header('Location:'.SITEURL.'bookings'); } if(isset($_POST['updateBookingManual'])){ $selectedServiceArray = array(); if($_POST['service_ids'] != ''){ $selectedServiceArray = explode(',', $_POST['service_ids']); } $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' => $_POST['booking_finish_time'], 'service_ids' => serialize($selectedServiceArray), 'guest_confirmed' => '0', 'guest_confirm_code' => '1234' ); $oldBooking = $this->Service_model->getBookingById($_POST['booking_id']); $this->Service_model->updateBooking($_POST['booking_id'], $bookingArray); $this->Log_model->addLog('bookings', $data['currentUser']->username.' módosította a foglalását a(z) '.$bookingArray['guest_name'].' nevű vendégnek ('.implode(', ', $bookingArray).')', $data['currentUser']->username); // Google Calendar: delete old events, create new ones $this->load->library('GoogleCalendar'); $this->config->load('google_calendar'); $evelinCalId = $this->config->item('gcal_evelin_calendar_id'); if($oldBooking){ $oldWorker = $this->Service_model->getWorkerById($oldBooking->worker_id); if(!empty($oldBooking->gcal_event_id_worker) && $oldWorker && !empty($oldWorker->google_calendar_id)){ $this->googlecalendar->deleteEvent($oldWorker->google_calendar_id, $oldBooking->gcal_event_id_worker); } if(!empty($oldBooking->gcal_event_id_owner) && !empty($evelinCalId)){ $this->googlecalendar->deleteEvent($evelinCalId, $oldBooking->gcal_event_id_owner); } } $gcalWorker = $this->Service_model->getWorkerById($bookingArray['worker_id']); $gcalServices = unserialize($bookingArray['service_ids']); $gcalServiceArray = array(); if(is_array($gcalServices)){ foreach($gcalServices as $sid){ $svc = $this->Service_model->getServiceById($sid); if(is_object($svc)) $gcalServiceArray[] = $svc; } } $gcalServiceNames = implode(', ', array_map(function($s){ return $s->service_name_no; }, $gcalServiceArray)); $gcalTitle = $gcalWorker->worker_name . ' — ' . $gcalServiceNames . ' — ' . $bookingArray['guest_name']; $gcalDescription = 'Guest: ' . $bookingArray['guest_name'] . "\nPhone: " . $bookingArray['guest_phone'] . "\nEmail: " . $bookingArray['guest_email']; $gcalStart = $bookingArray['booking_date'] . 'T' . $bookingArray['booking_start_time']; $gcalEnd = $bookingArray['booking_date'] . 'T' . $bookingArray['booking_finish_time']; $newWorkerEventId = null; $newOwnerEventId = null; if(!empty($gcalWorker->google_calendar_id)){ $newWorkerEventId = $this->googlecalendar->createEvent($gcalWorker->google_calendar_id, $gcalTitle, $gcalDescription, $gcalStart, $gcalEnd); } if(!empty($evelinCalId)){ $newOwnerEventId = $this->googlecalendar->createEvent($evelinCalId, $gcalTitle, $gcalDescription, $gcalStart, $gcalEnd); } $this->Service_model->updateBookingCalEvents($_POST['booking_id'], $newWorkerEventId, $newOwnerEventId); // ntfy push notification $this->_ntfy( 'Admin modified booking: ' . $bookingArray['guest_name'], 'Worker: ' . $gcalWorker->worker_name . "\n" . 'Date: ' . $bookingArray['booking_date'] . ' ' . $bookingArray['booking_start_time'] . ' - ' . $bookingArray['booking_finish_time'] . "\n" . 'Services: ' . $gcalServiceNames, isset($gcalWorker->ntfy_topic) ? $gcalWorker->ntfy_topic : null ); if($_POST['send_notification']){ $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 = ''; $email_subject =''; switch($_POST['lang']){ case 'no': $email_subject ='[studiobeve] Din reservasjon er endret'; $content = 'Kjære gjest,
'; $content .= 'Vi vil gjerne informere deg om at din reservasjon er endret.
'; $content .= '
'; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= '
Navn: '.$bookingArray['guest_name'].'
E-post: '.$bookingArray['guest_email'].'
Telefon: '.$bookingArray['guest_phone'].'
Arbeider: '.$worker->worker_name.'
Dato: '.$bookingArray['booking_date'].'
Tid: '.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'
Tjenester: '; $totalServicePrice = 0; foreach($serviceArray as $serviceArrayItem){ $totalServicePrice += $serviceArrayItem->service_price; $content .= ''; } $content .= '
'.$serviceArrayItem->service_name_no.''.$serviceArrayItem->service_price.' kr
Totalpris: '.$totalServicePrice.' kr
'; $content .= '
STUDIOBEVE'; $this->Log_model->addLog('bookings', $data['currentUser']->username.' foglalás módosításról norvég nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username); break; case 'en': $email_subject ='[studiobeve] Your booking has changed'; $content = 'Dear Guest,
'; $content .= 'We inform you that your booking has changed.
'; $content .= '
'; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= '
Name: '.$bookingArray['guest_name'].'
Email: '.$bookingArray['guest_email'].'
Phone: '.$bookingArray['guest_phone'].'
Worker: '.$worker->worker_name.'
Date: '.$bookingArray['booking_date'].'
Time: '.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'
Services: '; $totalServicePrice = 0; foreach($serviceArray as $serviceArrayItem){ $totalServicePrice += $serviceArrayItem->service_price; $content .= ''; } $content .= '
'.$serviceArrayItem->service_name_en.''.$serviceArrayItem->service_price.' kr
Total price: '.$totalServicePrice.' kr
'; $content .= '
STUDIOBEVE'; $this->Log_model->addLog('bookings', $data['currentUser']->username.' foglalás módosításról angol nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username); break; case 'hu': $email_subject ='[studiobeve] A foglalása módosult'; $content = 'Kedves Vendégünk,
'; $content .= 'Tájékoztatjuk, hogy a foglalása módosult.
'; $content .= '
'; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= '
Név: '.$bookingArray['guest_name'].'
Email: '.$bookingArray['guest_email'].'
Telefon: '.$bookingArray['guest_phone'].'
Dolgozó: '.$worker->worker_name.'
Dátum: '.$bookingArray['booking_date'].'
Időpont: '.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'
Szolgáltatás(ok): '; $totalServicePrice = 0; foreach($serviceArray as $serviceArrayItem){ $totalServicePrice += $serviceArrayItem->service_price; $content .= ''; } $content .= '
'.$serviceArrayItem->service_name_hu.''.$serviceArrayItem->service_price.' kr
Összesen fizetendő: '.$totalServicePrice.' kr
'; $content .= '
STUDIOBEVE'; $this->Log_model->addLog('bookings', $data['currentUser']->username.' foglalás módosításról magyar nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username); break; } $data['selectedLang'] = $_POST['lang']; $emailItem = array( 'addressee_email' => $bookingArray['guest_email'], 'addressee_name' => $bookingArray['guest_name'], 'subject' => $email_subject, 'content' => $content, 'attachments' => array() ); $emailArray[] = $emailItem; $this->User_model->sendEmail($emailArray, $_POST['lang'], ''); } header('Location:'.SITEURL.'bookings'); } $this->load->view('admin/booking-process', $data); } } private function _ntfy($title, $message, $workerTopic = null){ $this->config->load('google_calendar'); $evelinTopic = $this->config->item('ntfy_topic'); $topics = []; if(!empty($evelinTopic)) $topics[] = $evelinTopic; if(!empty($workerTopic) && $workerTopic !== $evelinTopic) $topics[] = $workerTopic; if(empty($topics)) return; foreach($topics as $topic){ $ch = curl_init('https://ntfy.sh/' . $topic); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => $message, CURLOPT_HTTPHEADER => ['Title: ' . $title, 'Priority: high', 'Tags: calendar'], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, ]); curl_exec($ch); curl_close($ch); } } public function worker_calendar($worker_id = null) { $this->load->helper('url'); $this->load->model('Service_model'); $this->load->model('User_model'); $this->load->model('Module_model'); if (!isset($_SESSION['username'])) { header("Location:".SITEURL."login"); exit; } $data['currentUser'] = $this->User_model->getUserByUsername($_SESSION['username']); 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); } $data['workers'] = $this->Service_model->getAllWorkers(); $data['selectedWorker'] = null; $data['overridesByDate'] = []; $data['scheduleRows'] = []; $monthParam = $this->input->get('month'); if ($monthParam && preg_match('/^\d{4}-\d{2}$/', $monthParam)) { list($year, $month) = explode('-', $monthParam); $year = (int)$year; $month = (int)$month; } else { $year = (int)date('Y'); $month = (int)date('m'); } $data['year'] = $year; $data['month'] = $month; if ($worker_id) { $data['selectedWorker'] = $this->Service_model->getWorkerById($worker_id); $data['overridesByDate'] = $this->Service_model->getWorkerOverridesByMonth($worker_id, $year, $month); $data['scheduleRows'] = $this->Service_model->getWorkerSchedule($worker_id); } // Compute lunch break slot for every working day of the month $data['lunchByDate'] = []; $sw = $data['selectedWorker']; if ($sw && !empty($sw->lunch_window_start) && !empty($sw->lunch_window_end)) { $monthBookings = $this->Service_model->getBookingsForWorkerMonth($worker_id, $year, $month); $scheduleMap = []; foreach ($data['scheduleRows'] as $row) { $scheduleMap[$row->weekday] = $row; } $daysInMonth = (int)date('t', mktime(0, 0, 0, $month, 1, $year)); for ($d = 1; $d <= $daysInMonth; $d++) { $dateStr = $year . '-' . str_pad($month, 2, '0', STR_PAD_LEFT) . '-' . str_pad($d, 2, '0', STR_PAD_LEFT); $override = isset($data['overridesByDate'][$dateStr]) ? $data['overridesByDate'][$dateStr] : null; if ($override && $override->is_day_off) continue; if ($override && !$override->is_day_off && $override->end_time) { $shiftStart = new DateTime($dateStr . ' ' . $override->start_time); $shiftEnd = new DateTime($dateStr . ' ' . $override->end_time); } else { $phpWeekday = (int)date('w', strtotime($dateStr)); if (!isset($scheduleMap[$phpWeekday])) continue; $shiftStart = new DateTime($dateStr . ' ' . $scheduleMap[$phpWeekday]->start_time); $shiftEnd = new DateTime($dateStr . ' ' . $scheduleMap[$phpWeekday]->end_time); } $dayBookings = isset($monthBookings[$dateStr]) ? $monthBookings[$dateStr] : []; $lunch = $this->Service_model->computeLunchBreak( $sw->lunch_window_start, $sw->lunch_window_end, $dateStr, $dayBookings, $shiftEnd, $shiftStart, isset($sw->lunch_preferred_time) ? $sw->lunch_preferred_time : null ); if ($lunch) $data['lunchByDate'][$dateStr] = $lunch; } } $data['pageTitle'] = 'Munkaidő naptár'; $this->load->view('admin/worker_calendar', $data); } public function store_calendar_override() { $this->load->model('Service_model'); $this->load->helper('url'); if (!isset($_SESSION['username'])) { header("Location:".SITEURL."login"); exit; } $worker_id = $this->input->post('worker_id'); $start_date = $this->input->post('start_date'); $end_date = $this->input->post('end_date') ?: $start_date; $type = $this->input->post('override_type'); $start_time = $this->input->post('start_time'); $end_time = $this->input->post('end_time'); $note = $this->input->post('note'); $current = strtotime($start_date); $last = strtotime($end_date); $guard = 0; while ($current <= $last && $guard < 366) { $dateStr = date('Y-m-d', $current); if ($type === 'remove') { $this->Service_model->deleteWorkerScheduleOverrideByDate($worker_id, $dateStr); } else { $data = []; if ($type === 'day_off') { $data['is_day_off'] = 1; $data['absence_type'] = null; $data['start_time'] = null; $data['end_time'] = null; $data['note'] = null; } elseif ($type === 'custom') { $data['is_day_off'] = 0; $data['absence_type'] = 'custom'; $data['start_time'] = $start_time; $data['end_time'] = $end_time; $data['note'] = $note; } else { // vacation, sick, other $data['is_day_off'] = 1; $data['absence_type'] = $type; $data['start_time'] = null; $data['end_time'] = null; $data['note'] = $note; } $this->Service_model->upsertWorkerScheduleOverride($worker_id, $dateStr, $data); } $current = strtotime('+1 day', $current); $guard++; } $monthParam = date('Y-m', strtotime($start_date)); redirect('workers/worker-calendar/' . $worker_id . '?month=' . $monthParam); } public function delete_calendar_override() { $this->load->model('Service_model'); $this->load->helper('url'); if (!isset($_SESSION['username'])) { header("Location:".SITEURL."login"); exit; } $worker_id = $this->input->post('worker_id'); $date = $this->input->post('date'); $this->Service_model->deleteWorkerScheduleOverrideByDate($worker_id, $date); $monthParam = date('Y-m', strtotime($date)); redirect('workers/worker-calendar/' . $worker_id . '?month=' . $monthParam); } }