foglalás időpont +1 órás baszakodás
This commit is contained in:
@@ -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){
|
||||
|
||||
Reference in New Issue
Block a user