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
+109 -82
View File
@@ -405,99 +405,126 @@ class Service_model extends CI_Model {
public function getAvailableTimes($worker_id, $selectedDate, $servicelength) {
$this->load->database();
$this->load->database();
if (strtotime($selectedDate) < strtotime(date('Y-m-d'))) {
return [];
}
// múltbeli napra ne lehessen foglalni
if (strtotime($selectedDate) < strtotime(date('Y-m-d'))) {
return [];
}
$today = new DateTime();
$maxDate = (clone $today)->modify('+3 months');
$selected = new DateTime($selectedDate);
// max 3 hónappal előre
$today = new DateTime();
$maxDate = (clone $today)->modify('+3 months');
$selected = new DateTime($selectedDate);
if ($selected > $maxDate) {
return [];
}
if ($selected > $maxDate) {
return [];
}
$ts = strtotime($selectedDate);
$debugDate = date('Y-m-d (w)', $ts) . ' - ' . date('l', $ts);
log_message('error', "📅 DEBUG DATE CHECK for '{$selectedDate}': {$debugDate}");
log_message('error', "⏱ Timezone: " . date_default_timezone_get());
$serviceLengthTime = strtotime($servicelength);
$availableTimeArray = [];
$ts = strtotime($selectedDate);
$debugDate = date('Y-m-d (w)', $ts) . ' - ' . date('l', $ts);
log_message('error', "📅 DEBUG DATE CHECK for '{$selectedDate}': {$debugDate}");
log_message('error', "⏱ Timezone: " . date_default_timezone_get());
// Check override first
$overrideQuery = $this->db->query("
SELECT * FROM worker_schedule_overrides
WHERE worker_id = '$worker_id' AND date = '$selectedDate'
LIMIT 1
$serviceLengthTime = strtotime($servicelength);
$availableTimeArray = [];
// --- Override ellenőrzés ---
$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) {
$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 ($scheduleQuery->num_rows() == 0) {
return [];
}
$schedule = $scheduleQuery->row();
$dayStartTime = new DateTime($selectedDate . ' ' . $schedule->start_time);
$finishTime = new DateTime($selectedDate . ' ' . $schedule->end_time);
if ($scheduleQuery->num_rows() == 0) {
return [];
}
$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;
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;
$schedule = $scheduleQuery->row();
$dayStartTime = new DateTime($selectedDate . ' ' . $schedule->start_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');
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){