improve variable length shift creation
This commit is contained in:
parent
74d3d82787
commit
fb573fd1d9
|
@ -232,53 +232,57 @@ function admin_shifts()
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Chronologisch absteigend sortieren (WHY???)
|
// Alle Tage durchgehen
|
||||||
usort($change_hours, function ($a, $b) {
|
$end_day = parse_date('Y-m-d H:i', date('Y-m-d', $end) . ' 00:00');
|
||||||
return str_replace(':', '', $a) > str_replace(':', '', $b) ? -1 : 1;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Start-Tag
|
|
||||||
$day = parse_date('Y-m-d H:i', date('Y-m-d', $start) . ' 00:00');
|
$day = parse_date('Y-m-d H:i', date('Y-m-d', $start) . ' 00:00');
|
||||||
|
|
||||||
$change_index = 0;
|
|
||||||
// Ersten/nächsten passenden Schichtwechsel suchen
|
|
||||||
foreach ($change_hours as $i => $change_time) {
|
|
||||||
list($change_hour, $change_minute) = explode(':', $change_time);
|
|
||||||
|
|
||||||
$shift_end = $day + $change_hour * 60 * 60 + $change_minute * 60;
|
|
||||||
if ($start < $shift_end) {
|
|
||||||
$change_index = $i;
|
|
||||||
} elseif ($start == $shift_end) {
|
|
||||||
// Start trifft Schichtwechsel
|
|
||||||
$change_index = ($i + count($change_hours) - 1) % count($change_hours);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$shift_start = $start;
|
|
||||||
do {
|
do {
|
||||||
$day = parse_date('Y-m-d H:i', date('Y-m-d', $shift_start) . ' 00:00');
|
// Alle Schichtwechselstunden durchgehen
|
||||||
|
for($i = 0; $i < count($change_hours); $i++) {
|
||||||
list($change_hour, $change_minute) = explode(':', $change_hours[$change_index]);
|
$start_hour = $change_hours[$i];
|
||||||
|
if ($i < count($change_hours) - 1) {
|
||||||
$shift_end = $day + $change_hour * 60 * 60 + $change_minute * 60;
|
// Normales Intervall zwischen zwei Schichtwechselstunden
|
||||||
|
$end_hour = $change_hours[$i+1];
|
||||||
if ($shift_end > $end) {
|
} elseif ($shift_over_midnight) {
|
||||||
$shift_end = $end;
|
// Letzte Schichtwechselstunde: Wenn eine 24h Abdeckung gewünscht ist, hier die erste Schichtwechselstunde als Ende ensetzen
|
||||||
}
|
$end_hour = $change_hours[0];
|
||||||
if ($shift_start >= $shift_end) {
|
} else {
|
||||||
$shift_end += 24 * 60 * 60;
|
// Letzte Schichtwechselstunde: Keine Schicht erstellen
|
||||||
if ($shift_end > $end) {
|
break;
|
||||||
$shift_end = $end;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if($shift_over_midnight || $day == parse_date('Y-m-d H:i', date('Y-m-d', $shift_end) . ' 00:00')) {
|
$interval_start = parse_date('Y-m-d H:i', date('Y-m-d', $day) . ' ' . $start_hour);
|
||||||
|
if (str_replace(':', '', $end_hour) < str_replace(':', '', $start_hour)) {
|
||||||
|
// Endstunde kleiner Startstunde? Dann sind wir im nächsten Tag gelandet
|
||||||
|
$interval_end = parse_date('Y-m-d H:i', date('Y-m-d', $day + 36 * 60 * 60) . ' ' . $end_hour);
|
||||||
|
} else {
|
||||||
|
// Endstunde ist noch im selben Tag
|
||||||
|
$interval_end = parse_date('Y-m-d H:i', date('Y-m-d', $day) . ' ' . $end_hour);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Liegt das Intervall vor dem Startzeitpunkt -> Überspringen
|
||||||
|
if ($interval_end <= $start) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Liegt das Intervall nach dem Endzeitpunkt -> Überspringen
|
||||||
|
if ($interval_start >= $end) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Liegt nur der Schichtstart vor dem Startzeitpunkt -> Startzeitpunkt übernehmen
|
||||||
|
if ($interval_start < $start) {
|
||||||
|
$interval_start = $start;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Liegt nur das Schichtende nach dem Endzeitpunkt -> Endzeitpunkt übernehmen
|
||||||
|
if ($interval_end > $end) {
|
||||||
|
$interval_end = $end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Intervall für Schicht hinzufügen
|
||||||
$shifts[] = [
|
$shifts[] = [
|
||||||
'start' => $shift_start,
|
'start' => $interval_start,
|
||||||
'end' => $shift_end,
|
'end' => $interval_end,
|
||||||
'RID' => $rid,
|
'RID' => $rid,
|
||||||
'title' => $title,
|
'title' => $title,
|
||||||
'shifttype_id' => $shifttype_id,
|
'shifttype_id' => $shifttype_id,
|
||||||
|
@ -286,12 +290,13 @@ function admin_shifts()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
$shift_start = $shift_end;
|
$day = parse_date('Y-m-d H:i', date('Y-m-d', $day + 36 * 60 * 60) . ' 00:00');
|
||||||
$change_index--;
|
} while($day <= $end_day);
|
||||||
if($change_index < 0) {
|
|
||||||
$change_index = count($change_hours) - 1;
|
usort($shifts, function ($a, $b) {
|
||||||
}
|
return $a['start'] < $b['start'] ? -1 : 1;
|
||||||
} while ($shift_end < $end);
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$shifts_table = [];
|
$shifts_table = [];
|
||||||
|
|
Loading…
Reference in New Issue