Am Ende entschied ich mich für ein System, das Zeitstempel für das Start- und Enddatum in der Datenbank generiert. Bei der Überprüfung habe ich am Anfang eine Sekunde hinzugefügt und am Ende eine Sekunde abgezogen, um Zeitüberschneidungen bei Terminen zu vermeiden.
Was habe ich letztendlich getan
Natürlich bin ich mir nicht sicher, ob dies die beste Methode ist, aber es hat für mich funktioniert. Der Benutzer beginnt mit der Auswahl seines Geschlechts und einer Präferenz für den Tag. Dies sendet eine AJAX-Anfrage, um das verfügbare Personal und verschiedene Arten von Termintypen (z. B. Haare färben, Haare schneiden usw.) abzurufen.
Wenn alle Einstellungen vorgenommen wurden (Geschlecht, Datum, Person und Typ), beginne ich mit einigen einfachen Validierungen:Überprüfung des Datums, Überprüfung, ob das Datum ("N") nicht 7 (Sonntag) ist. Wenn alles in Ordnung ist, wird mit den wichtigeren Sachen begonnen:
1) Der Termintyp wird aus der Datenbank abgerufen, einschließlich der Gesamtzeit, die dieser Typ benötigt (30 Minuten, 45 Minuten usw.) 2) Das verfügbare Personal wird abgerufen (eine vollständige Liste der Personen an diesem Tag oder nur eine einzelne Person, falls einer ausgewählt wird) einschließlich der verfügbaren Zeiten
Die Person (oder eine Person) wird dann geloopt, beginnend mit ihrer eigenen Startzeit. An diesem Punkt habe ich eine Reihe von Daten, die Folgendes enthalten:
$duration (of the appointment type)
$startTime (starting time of the person selected in the loop)
$endTime (= $startTime + $duration)
$personStart (= starting time of the person)
$personEnd (= end time of the person)
Nehmen wir diese Demodaten:
$duration = 30 min
$startTime = 9.00h
$endTime = 9.30h
$personStart = 9.00h
$personEnd = 12.00h
Was ich hier mache, ist:
while( $endTime < $personEnd )
{
// Check the spot for availability
$startTime = $endTime;
$endTime = $startTime + $duration;
}
Offensichtlich ist es in diesem Fall alles vereinfacht. Denn wenn ich die Verfügbarkeit prüfe, ist der Platz nicht frei. Ich setze die $startTime auf den letzten gefundenen Termin und starte von dort in der Schleife.
Beispiel:
I check for a free spot at 9.00 but the spot is not free because there's an appointment from 9.00 till 10.00, then 10.00 is returned and $startTime is set to 10.00h instead of 9.30h. This is done to keep the number of queries to a minimum since there can be quiet a lot.
Verfügbarkeitsfunktion prüfen
// Check Availability
public static function checkAvailability($start, $end, $ape_id)
{
// add one second to the start to avoid results showing up on the full hour
$start += 1;
// remove one second from the end to avoid results showing up on the full hour
$end -= 1;
// $start and $end are timestamps
$getAppointments = PRegistry::getObject('db')->query("SELECT * FROM appointments WHERE
((
app_start BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."'
OR
app_end BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."'
)
OR
(
app_start < '".date("Y-m-d H:i:s", $start)."' AND app_end > '".date("Y-m-d H:i:s", $end)."'
))
AND
ape_id = ".PRegistry::getObject('db')->escape($ape_id));
if(PRegistry::getObject('db')->num_rows($getAppointments) == 0) {
return true;
} else {
$end = 0;
foreach(PRegistry::getObject('db')->fetch_array(MYSQLI_ASSOC, $getAppointments, false) as $app) {
if($app['app_end'] > $end) {
$end = $app['app_end'];
}
}
return $end;
}
}
Da ich Termine als "From:10.00 Till:11.00" speichere, muss ich darauf achten, Spots von 11:00:01 bis 11:59:59 zu prüfen, da sonst der Termin um 11:00 in den Ergebnissen erscheint.
Am Ende der Funktion, falls ein Termin gefunden wird, schleife ich die Ergebnisse und gebe das späteste Ende zurück. Dies ist der nächste Start in der Schleife, die ich oben erwähnt habe.
Hoffentlich kann dies jemandem helfen. Nur als Info:ape_id
ist die ID der "Ernennungsperson", mit der sie verknüpft ist.