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>';
+31 -4
View File
@@ -407,10 +407,12 @@ 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();
// múltbeli napra ne lehessen foglalni
if (strtotime($selectedDate) < strtotime(date('Y-m-d'))) { if (strtotime($selectedDate) < strtotime(date('Y-m-d'))) {
return []; return [];
} }
// max 3 hónappal előre
$today = new DateTime(); $today = new DateTime();
$maxDate = (clone $today)->modify('+3 months'); $maxDate = (clone $today)->modify('+3 months');
$selected = new DateTime($selectedDate); $selected = new DateTime($selectedDate);
@@ -423,10 +425,11 @@ class Service_model extends CI_Model {
$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); $serviceLengthTime = strtotime($servicelength);
$availableTimeArray = []; $availableTimeArray = [];
// Check override first // --- Override ellenőrzés ---
$overrideQuery = $this->db->query(" $overrideQuery = $this->db->query("
SELECT * FROM worker_schedule_overrides SELECT * FROM worker_schedule_overrides
WHERE worker_id = '$worker_id' AND date = '$selectedDate' WHERE worker_id = '$worker_id' AND date = '$selectedDate'
@@ -464,6 +467,29 @@ class Service_model extends CI_Model {
$finishTime = new DateTime($selectedDate . ' ' . $schedule->end_time); $finishTime = new DateTime($selectedDate . ' ' . $schedule->end_time);
} }
// --- Ú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'); $interval = new DateInterval('PT15M');
list($h, $m) = explode(':', $servicelength); list($h, $m) = explode(':', $servicelength);
$serviceDuration = new DateInterval('PT' . (int)$h . 'H' . (int)$m . 'M'); $serviceDuration = new DateInterval('PT' . (int)$h . 'H' . (int)$m . 'M');
@@ -472,7 +498,6 @@ class Service_model extends CI_Model {
$slotEnd = clone $current; $slotEnd = clone $current;
$slotEnd->add($serviceDuration); $slotEnd->add($serviceDuration);
if ($slotEnd > $finishTime) break; if ($slotEnd > $finishTime) break;
if ($selectedDate == date('Y-m-d') && $current < new DateTime()) continue;
$startTimeStr = $current->format('H:i:s'); $startTimeStr = $current->format('H:i:s');
$endTimeStr = $slotEnd->format('H:i:s'); $endTimeStr = $slotEnd->format('H:i:s');
@@ -489,14 +514,16 @@ class Service_model extends CI_Model {
if ($bookingQuery->num_rows() == 0) { if ($bookingQuery->num_rows() == 0) {
$availableTimeArray[] = $startTimeStr; $availableTimeArray[] = $startTimeStr;
} }
log_message('debug', 'Selected Date: ' . $selectedDate); log_message('debug', 'Selected Date: ' . $selectedDate);
log_message('debug', 'Weekday: ' . $weekday); log_message('debug', 'Weekday: ' . (isset($weekday) ? $weekday : 'N/A'));
log_message('debug', 'Worker ID: ' . $worker_id); log_message('debug', 'Worker ID: ' . $worker_id);
log_message('debug', 'Query: ' . $this->db->last_query()); log_message('debug', 'Query: ' . $this->db->last_query());
} }
return $availableTimeArray; return $availableTimeArray;
} }
@@ -459,26 +459,12 @@
} }
function setWorker(worker_id){ function setWorker(worker_id){
// csak az aktuális worker ID-t állítjuk be a formban
$('#worker_id').val(worker_id); $('#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){
// csak az aktuális worker ID-t állítjuk be a formban
$('#worker_id').val(worker_id); $('#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){
// csak az aktuális worker ID-t állítjuk be a formban
$('#worker_id').val(worker_id); $('#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>