- Monthly calendar grid per worker with colour-coded day status - Override types: vacation, sick, custom hours, other, day-off - Date-range override support via modal - Floating 30-min lunch break: finds slot closest to preferred time within configurable window, adapts to existing bookings - Lunch break only applies for shifts >= 6 hours - Lunch slot shown in admin calendar; blocked in booking availability - DB migrations: absence_type/note on worker_schedule_overrides, lunch_window_start/end/preferred_time on workers Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1358 lines
54 KiB
PHP
Executable File
1358 lines
54 KiB
PHP
Executable File
<?php
|
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
|
|
|
class Admin extends CI_Controller {
|
|
|
|
/**
|
|
* Index Page for this controller.
|
|
*
|
|
* Maps to the following URL
|
|
* http://example.com/index.php/welcome
|
|
* - or -
|
|
* http://example.com/index.php/welcome/index
|
|
* - or -
|
|
* Since this controller is set as the default controller in
|
|
* config/routes.php, it's displayed at http://example.com/
|
|
*
|
|
* So any other public methods not prefixed with an underscore will
|
|
* map to /index.php/welcome/<method_name>
|
|
* @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 = '$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 admin_worker_override() {
|
|
$this->load->helper('url');
|
|
$this->load->model('User_model');
|
|
$this->load->model('Service_model');
|
|
|
|
$data['pageTitle'] = 'Egyedi napok kezelése';
|
|
$data['workers'] = $this->Service_model->getAllWorkers();
|
|
|
|
if ($this->input->post('storeOverride')) {
|
|
$this->load->database();
|
|
$insert = [
|
|
'worker_id' => $_POST['worker_id'],
|
|
'date' => $_POST['date'],
|
|
'is_day_off' => isset($_POST['is_day_off']) ? 1 : 0,
|
|
'start_time' => $_POST['start_time'],
|
|
'end_time' => $_POST['end_time']
|
|
];
|
|
|
|
$existing = $this->db->query("SELECT * FROM worker_schedule_overrides WHERE worker_id = '{$insert['worker_id']}' AND date = '{$insert['date']}'")->row();
|
|
if ($existing) {
|
|
$this->db->where('id', $existing->id)->update('worker_schedule_overrides', $insert);
|
|
} else {
|
|
$this->db->insert('worker_schedule_overrides', $insert);
|
|
}
|
|
}
|
|
|
|
if (!empty($_GET['worker_id'])) {
|
|
$this->load->database();
|
|
$worker_id = $_GET['worker_id'];
|
|
$data['selectedWorkerId'] = $worker_id;
|
|
$data['overrides'] = $this->db->query("SELECT * FROM worker_schedule_overrides WHERE worker_id = '$worker_id' ORDER BY date ASC")->result();
|
|
}
|
|
|
|
$this->load->view('admin/worker_override', $data);
|
|
}
|
|
|
|
|
|
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));
|
|
|
|
if (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));
|
|
|
|
if (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,<br />';
|
|
$content .= 'Takk for din bestilling!<br />';
|
|
$content .= '<br />';
|
|
$content .= '<table>';
|
|
$content .= '<tr><td>Navn: </td><td>'.$bookingArray['guest_name'].'</td></tr>';
|
|
$content .= '<tr><td>E-post: </td><td>'.$bookingArray['guest_email'].'</td></tr>';
|
|
$content .= '<tr><td>Telefon: </td><td>'.$bookingArray['guest_phone'].'</td></tr>';
|
|
$content .= '<tr><td>Arbeider: </td><td>'.$worker->worker_name.'</td></tr>';
|
|
$content .= '<tr><td>Dato: </td><td>'.$bookingArray['booking_date'].'</td></tr>';
|
|
$content .= '<tr><td>Tid: </td><td>'.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'</td></tr>';
|
|
$content .= '<tr><td>Tjenester: </td><td><table>';
|
|
$totalServicePrice = 0;
|
|
foreach($serviceArray as $serviceArrayItem){
|
|
$totalServicePrice += $serviceArrayItem->service_price;
|
|
$content .= '<tr><td>'.$serviceArrayItem->service_name_no.'</td><td>'.$serviceArrayItem->service_price.' kr</td></tr>';
|
|
}
|
|
$content .= '</table></td>';
|
|
$content .= '<tr><td>Totalpris: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
|
|
$content .= '</table>';
|
|
$content .= '<br /> 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,<br />';
|
|
$content .= 'Thank you for your booking!<br />';
|
|
$content .= '<br />';
|
|
$content .= '<table>';
|
|
$content .= '<tr><td>Name: </td><td>'.$bookingArray['guest_name'].'</td></tr>';
|
|
$content .= '<tr><td>Email: </td><td>'.$bookingArray['guest_email'].'</td></tr>';
|
|
$content .= '<tr><td>Phone: </td><td>'.$bookingArray['guest_phone'].'</td></tr>';
|
|
$content .= '<tr><td>Worker: </td><td>'.$worker->worker_name.'</td></tr>';
|
|
$content .= '<tr><td>Date: </td><td>'.$bookingArray['booking_date'].'</td></tr>';
|
|
$content .= '<tr><td>Time: </td><td>'.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'</td></tr>';
|
|
$content .= '<tr><td>Services: </td><td><table>';
|
|
$totalServicePrice = 0;
|
|
foreach($serviceArray as $serviceArrayItem){
|
|
$totalServicePrice += $serviceArrayItem->service_price;
|
|
$content .= '<tr><td>'.$serviceArrayItem->service_name_en.'</td><td>'.$serviceArrayItem->service_price.' kr</td></tr>';
|
|
}
|
|
$content .= '</table></td>';
|
|
$content .= '<tr><td>Total price: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
|
|
$content .= '</table>';
|
|
$content .= '<br /> 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,<br />';
|
|
$content .= 'Köszönettel fogadtuk a foglalását!<br />';
|
|
$content .= '<br />';
|
|
$content .= '<table>';
|
|
$content .= '<tr><td>Név: </td><td>'.$bookingArray['guest_name'].'</td></tr>';
|
|
$content .= '<tr><td>Email: </td><td>'.$bookingArray['guest_email'].'</td></tr>';
|
|
$content .= '<tr><td>Telefon: </td><td>'.$bookingArray['guest_phone'].'</td></tr>';
|
|
$content .= '<tr><td>Dolgozó: </td><td>'.$worker->worker_name.'</td></tr>';
|
|
$content .= '<tr><td>Dátum: </td><td>'.$bookingArray['booking_date'].'</td></tr>';
|
|
$content .= '<tr><td>Időpont: </td><td>'.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'</td></tr>';
|
|
$content .= '<tr><td>Szolgáltatás(ok): </td><td><table>';
|
|
$totalServicePrice = 0;
|
|
foreach($serviceArray as $serviceArrayItem){
|
|
$totalServicePrice += $serviceArrayItem->service_price;
|
|
$content .= '<tr><td>'.$serviceArrayItem->service_name_hu.'</td><td>'.$serviceArrayItem->service_price.' kr</td></tr>';
|
|
}
|
|
$content .= '</table></td>';
|
|
$content .= '<tr><td>Összesen fizetendő: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
|
|
$content .= '</table>';
|
|
$content .= '<br /> 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,<br />';
|
|
$content .= 'Vi vil gjerne informere deg om at din reservasjon er endret.<br />';
|
|
$content .= '<br />';
|
|
$content .= '<table>';
|
|
$content .= '<tr><td>Navn: </td><td>'.$bookingArray['guest_name'].'</td></tr>';
|
|
$content .= '<tr><td>E-post: </td><td>'.$bookingArray['guest_email'].'</td></tr>';
|
|
$content .= '<tr><td>Telefon: </td><td>'.$bookingArray['guest_phone'].'</td></tr>';
|
|
$content .= '<tr><td>Arbeider: </td><td>'.$worker->worker_name.'</td></tr>';
|
|
$content .= '<tr><td>Dato: </td><td>'.$bookingArray['booking_date'].'</td></tr>';
|
|
$content .= '<tr><td>Tid: </td><td>'.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'</td></tr>';
|
|
$content .= '<tr><td>Tjenester: </td><td><table>';
|
|
$totalServicePrice = 0;
|
|
foreach($serviceArray as $serviceArrayItem){
|
|
$totalServicePrice += $serviceArrayItem->service_price;
|
|
$content .= '<tr><td>'.$serviceArrayItem->service_name_no.'</td><td>'.$serviceArrayItem->service_price.' kr</td></tr>';
|
|
}
|
|
$content .= '</table></td>';
|
|
$content .= '<tr><td>Totalpris: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
|
|
$content .= '</table>';
|
|
$content .= '<br /> 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,<br />';
|
|
$content .= 'We inform you that your booking has changed.<br />';
|
|
$content .= '<br />';
|
|
$content .= '<table>';
|
|
$content .= '<tr><td>Name: </td><td>'.$bookingArray['guest_name'].'</td></tr>';
|
|
$content .= '<tr><td>Email: </td><td>'.$bookingArray['guest_email'].'</td></tr>';
|
|
$content .= '<tr><td>Phone: </td><td>'.$bookingArray['guest_phone'].'</td></tr>';
|
|
$content .= '<tr><td>Worker: </td><td>'.$worker->worker_name.'</td></tr>';
|
|
$content .= '<tr><td>Date: </td><td>'.$bookingArray['booking_date'].'</td></tr>';
|
|
$content .= '<tr><td>Time: </td><td>'.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'</td></tr>';
|
|
$content .= '<tr><td>Services: </td><td><table>';
|
|
$totalServicePrice = 0;
|
|
foreach($serviceArray as $serviceArrayItem){
|
|
$totalServicePrice += $serviceArrayItem->service_price;
|
|
$content .= '<tr><td>'.$serviceArrayItem->service_name_en.'</td><td>'.$serviceArrayItem->service_price.' kr</td></tr>';
|
|
}
|
|
$content .= '</table></td>';
|
|
$content .= '<tr><td>Total price: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
|
|
$content .= '</table>';
|
|
$content .= '<br /> 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,<br />';
|
|
$content .= 'Tájékoztatjuk, hogy a foglalása módosult.<br />';
|
|
$content .= '<br />';
|
|
$content .= '<table>';
|
|
$content .= '<tr><td>Név: </td><td>'.$bookingArray['guest_name'].'</td></tr>';
|
|
$content .= '<tr><td>Email: </td><td>'.$bookingArray['guest_email'].'</td></tr>';
|
|
$content .= '<tr><td>Telefon: </td><td>'.$bookingArray['guest_phone'].'</td></tr>';
|
|
$content .= '<tr><td>Dolgozó: </td><td>'.$worker->worker_name.'</td></tr>';
|
|
$content .= '<tr><td>Dátum: </td><td>'.$bookingArray['booking_date'].'</td></tr>';
|
|
$content .= '<tr><td>Időpont: </td><td>'.$bookingArray['booking_start_time'].' - '.$bookingArray['booking_finish_time'].'</td></tr>';
|
|
$content .= '<tr><td>Szolgáltatás(ok): </td><td><table>';
|
|
$totalServicePrice = 0;
|
|
foreach($serviceArray as $serviceArrayItem){
|
|
$totalServicePrice += $serviceArrayItem->service_price;
|
|
$content .= '<tr><td>'.$serviceArrayItem->service_name_hu.'</td><td>'.$serviceArrayItem->service_price.' kr</td></tr>';
|
|
}
|
|
$content .= '</table></td>';
|
|
$content .= '<tr><td>Összesen fizetendő: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
|
|
$content .= '</table>';
|
|
$content .= '<br /> 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);
|
|
}
|
|
|
|
}
|