foglalás időpont +1 órás baszakodás

This commit is contained in:
2025-12-16 11:10:33 +01:00
parent fb7178a919
commit 3a7dd84992
6 changed files with 1277 additions and 1292 deletions
+1 -1
View File
@@ -634,7 +634,7 @@ class Admin extends CI_Controller {
'is_beauty' => $_POST['is_beauty'], 'is_beauty' => $_POST['is_beauty'],
'is_barber' => $_POST['is_barber'], 'is_barber' => $_POST['is_barber'],
'worker_profile_img' => $data['worker_img'], 'worker_profile_img' => $data['worker_img'],
'service_category_id' => $data['service_category_id'], 'service_category_id' => $_POST['service_category_id'],
'is_active' => $_POST['is_active'] 'is_active' => $_POST['is_active']
); );
+1 -1
View File
@@ -120,7 +120,7 @@ class Pages extends CI_Controller {
foreach($workers as $workerItem){ foreach($workers as $workerItem){
$workerListShow .= '<label for="worker_'.$workerItem->worker_id.'">'; $workerListShow .= '<label for="worker_'.$workerItem->worker_id.'">';
$workerListShow .= '<div class="profileRow">'; $workerListShow .= '<div class="profileRow">';
$workerListShow .= '<div class="profileCell profileRadioBtn"><input type="radio" class="workers" id="worker_'.$workerItem->worker_id.'" onclick="setWorker('.$workerItem->worker_id.')" '.($workerIndex==0?'checked':'').'></div>'; $workerListShow .= '<div class="profileCell profileRadioBtn"><input type="radio" name="worker_radio" class="workers" id="worker_'.$workerItem->worker_id.'" onclick="setWorker('.$workerItem->worker_id.')" '.($workerIndex==0?'checked':'').'></div>';
$workerListShow .= '<div class="profileCell profileImage"><img src="'.SITEURL.'assets/img/'.$workerItem->worker_profile_img.'"></div>'; $workerListShow .= '<div class="profileCell profileImage"><img src="'.SITEURL.'assets/img/'.$workerItem->worker_profile_img.'"></div>';
$workerListShow .= '<div class="profileCell">'; $workerListShow .= '<div class="profileCell">';
$workerListShow .= '<div class="profileName">'.$workerItem->worker_name.'</div>'; $workerListShow .= '<div class="profileName">'.$workerItem->worker_name.'</div>';
+109 -82
View File
@@ -405,99 +405,126 @@ class Service_model extends CI_Model {
public function getAvailableTimes($worker_id, $selectedDate, $servicelength) { public function getAvailableTimes($worker_id, $selectedDate, $servicelength) {
$this->load->database(); $this->load->database();
if (strtotime($selectedDate) < strtotime(date('Y-m-d'))) { // múltbeli napra ne lehessen foglalni
return []; if (strtotime($selectedDate) < strtotime(date('Y-m-d'))) {
} return [];
}
$today = new DateTime(); // max 3 hónappal előre
$maxDate = (clone $today)->modify('+3 months'); $today = new DateTime();
$selected = new DateTime($selectedDate); $maxDate = (clone $today)->modify('+3 months');
$selected = new DateTime($selectedDate);
if ($selected > $maxDate) { if ($selected > $maxDate) {
return []; return [];
} }
$ts = strtotime($selectedDate); $ts = strtotime($selectedDate);
$debugDate = date('Y-m-d (w)', $ts) . ' - ' . date('l', $ts); $debugDate = date('Y-m-d (w)', $ts) . ' - ' . date('l', $ts);
log_message('error', "📅 DEBUG DATE CHECK for '{$selectedDate}': {$debugDate}"); log_message('error', "📅 DEBUG DATE CHECK for '{$selectedDate}': {$debugDate}");
log_message('error', "⏱ Timezone: " . date_default_timezone_get()); log_message('error', "⏱ Timezone: " . date_default_timezone_get());
$serviceLengthTime = strtotime($servicelength);
$availableTimeArray = [];
// Check override first $serviceLengthTime = strtotime($servicelength);
$overrideQuery = $this->db->query(" $availableTimeArray = [];
SELECT * FROM worker_schedule_overrides
WHERE worker_id = '$worker_id' AND date = '$selectedDate' // --- Override ellenőrzés ---
LIMIT 1 $overrideQuery = $this->db->query("
SELECT * FROM worker_schedule_overrides
WHERE worker_id = '$worker_id' AND date = '$selectedDate'
LIMIT 1
");
if ($overrideQuery->num_rows() > 0) {
$override = $overrideQuery->row();
if ($override->is_day_off) return [];
$dayStartTime = new DateTime($selectedDate.' '.$override->start_time);
$finishTime = new DateTime($selectedDate.' '.$override->end_time);
} else {
$weekday = date('w', strtotime($selectedDate)); // 0 = Sunday, 6 = Saturday
$weekNumber = date('W', strtotime($selectedDate));
$isOddWeek = $weekNumber % 2 !== 0;
$scheduleQuery = $this->db->query("
SELECT * FROM worker_schedule
WHERE worker_id = '{$worker_id}'
AND weekday = '{$weekday}'
AND (
is_alternate_week = 0
OR (is_alternate_week = 1 AND " . ($isOddWeek ? "1" : "0") . ")
)
"); ");
if ($overrideQuery->num_rows() > 0) { if ($scheduleQuery->num_rows() == 0) {
$override = $overrideQuery->row(); return [];
if ($override->is_day_off) return [];
$dayStartTime = new DateTime($selectedDate.' '.$override->start_time);
$finishTime = new DateTime($selectedDate.' '.$override->end_time);
} else {
$weekday = date('w', strtotime($selectedDate)); // 0 = Sunday, 6 = Saturday
$weekNumber = date('W', strtotime($selectedDate));
$isOddWeek = $weekNumber % 2 !== 0;
$scheduleQuery = $this->db->query("
SELECT * FROM worker_schedule
WHERE worker_id = '{$worker_id}'
AND weekday = '{$weekday}'
AND (
is_alternate_week = 0
OR (is_alternate_week = 1 AND " . ($isOddWeek ? "1" : "0") . ")
)
");
if ($scheduleQuery->num_rows() == 0) {
return [];
}
$schedule = $scheduleQuery->row();
$dayStartTime = new DateTime($selectedDate . ' ' . $schedule->start_time);
$finishTime = new DateTime($selectedDate . ' ' . $schedule->end_time);
} }
$interval = new DateInterval('PT15M'); $schedule = $scheduleQuery->row();
list($h, $m) = explode(':', $servicelength); $dayStartTime = new DateTime($selectedDate . ' ' . $schedule->start_time);
$serviceDuration = new DateInterval('PT' . (int)$h . 'H' . (int)$m . 'M'); $finishTime = new DateTime($selectedDate . ' ' . $schedule->end_time);
for ($current = clone $dayStartTime; $current < $finishTime; $current->add($interval)) {
$slotEnd = clone $current;
$slotEnd->add($serviceDuration);
if ($slotEnd > $finishTime) break;
if ($selectedDate == date('Y-m-d') && $current < new DateTime()) continue;
$startTimeStr = $current->format('H:i:s');
$endTimeStr = $slotEnd->format('H:i:s');
$bookingQuery = $this->db->query("
SELECT * FROM bookings
WHERE booking_date = '{$selectedDate}'
AND worker_id = '{$worker_id}'
AND (
(booking_start_time < '{$endTimeStr}' AND booking_finish_time > '{$startTimeStr}')
)
");
if ($bookingQuery->num_rows() == 0) {
$availableTimeArray[] = $startTimeStr;
}
log_message('debug', 'Selected Date: ' . $selectedDate);
log_message('debug', 'Weekday: ' . $weekday);
log_message('debug', 'Worker ID: ' . $worker_id);
log_message('debug', 'Query: ' . $this->db->last_query());
}
return $availableTimeArray;
} }
// --- ÚJ: ma foglalva csak (következő 15 perces blokk + 1 óra) UTÁN legyen időpont ---
if ($selectedDate == date('Y-m-d')) {
// használd a helyi (Oslo) időt, ne az esetleges UTC defaultot
$now = new DateTime('now', new DateTimeZone('Europe/Oslo'));
// kerekítés a következő 15 perces blokkra
$minutes = (int)$now->format('i');
$mod = $minutes % 15;
if ($mod !== 0) {
$now->modify('+' . (15 - $mod) . ' minutes');
}
// erre dobunk +1 órát
$now->modify('+1 hour');
$now->setTime((int)$now->format('H'), (int)$now->format('i'), 0);
// ha ez később van, mint a munkanap kezdete, toljuk fel a nap kezdetét
if ($now > $dayStartTime) {
$dayStartTime = clone $now;
}
log_message('error', '⏳ Min start (next 15min +1h, Europe/Oslo): ' . $dayStartTime->format('Y-m-d H:i:s'));
}
$interval = new DateInterval('PT15M');
list($h, $m) = explode(':', $servicelength);
$serviceDuration = new DateInterval('PT' . (int)$h . 'H' . (int)$m . 'M');
for ($current = clone $dayStartTime; $current < $finishTime; $current->add($interval)) {
$slotEnd = clone $current;
$slotEnd->add($serviceDuration);
if ($slotEnd > $finishTime) break;
$startTimeStr = $current->format('H:i:s');
$endTimeStr = $slotEnd->format('H:i:s');
$bookingQuery = $this->db->query("
SELECT * FROM bookings
WHERE booking_date = '{$selectedDate}'
AND worker_id = '{$worker_id}'
AND (
(booking_start_time < '{$endTimeStr}' AND booking_finish_time > '{$startTimeStr}')
)
");
if ($bookingQuery->num_rows() == 0) {
$availableTimeArray[] = $startTimeStr;
}
log_message('debug', 'Selected Date: ' . $selectedDate);
log_message('debug', 'Weekday: ' . (isset($weekday) ? $weekday : 'N/A'));
log_message('debug', 'Worker ID: ' . $worker_id);
log_message('debug', 'Query: ' . $this->db->last_query());
}
return $availableTimeArray;
}
public function createBooking($bookingArray){ public function createBooking($bookingArray){
@@ -459,26 +459,12 @@
} }
function setWorker(worker_id){ function setWorker(worker_id){
$('#worker_id').val(worker_id); // csak az aktuális worker ID-t állítjuk be a formban
$('#worker_id').val(worker_id);
$.ajax({ // ne jelenjen meg worker név/kép a jobb oldali panelen
url: '<?php echo base_url();?>ajax', $('.serviceBookingWorkerContainer').hide().html('');
type: 'POST', }
data: {
action:'getSelectedWorker',
worker_id:worker_id
},
error: function() {
},
//dataType: 'json',
success: function(data) {
},
}).done(function(result){
$('.serviceBookingWorkerContainer').show();
$('.serviceBookingWorkerContainer').html(result);
});
}
</script> </script>
@@ -457,26 +457,12 @@
} }
function setWorker(worker_id){ function setWorker(worker_id){
$('#worker_id').val(worker_id); // csak az aktuális worker ID-t állítjuk be a formban
$('#worker_id').val(worker_id);
$.ajax({ // ne jelenjen meg worker név/kép a jobb oldali panelen
url: '<?php echo base_url();?>ajax', $('.serviceBookingWorkerContainer').hide().html('');
type: 'POST', }
data: {
action:'getSelectedWorker',
worker_id:worker_id
},
error: function() {
},
//dataType: 'json',
success: function(data) {
},
}).done(function(result){
$('.serviceBookingWorkerContainer').show();
$('.serviceBookingWorkerContainer').html(result);
});
}
</script> </script>
@@ -458,26 +458,12 @@
} }
function setWorker(worker_id){ function setWorker(worker_id){
$('#worker_id').val(worker_id); // csak az aktuális worker ID-t állítjuk be a formban
$('#worker_id').val(worker_id);
$.ajax({ // ne jelenjen meg worker név/kép a jobb oldali panelen
url: '<?php echo base_url();?>ajax', $('.serviceBookingWorkerContainer').hide().html('');
type: 'POST', }
data: {
action:'getSelectedWorker',
worker_id:worker_id
},
error: function() {
},
//dataType: 'json',
success: function(data) {
},
}).done(function(result){
$('.serviceBookingWorkerContainer').show();
$('.serviceBookingWorkerContainer').html(result);
});
}
</script> </script>