Nakonec jsem zvolil systém, který generoval časová razítka pro počáteční a koncová data v databázi. Při kontrole jsem přidal jednu sekundu k začátku a odečetl jednu sekundu od konce, abych se vyhnul překrývání času pro schůzky.
Co jsem nakonec udělal
Samozřejmě si nejsem jistý, zda je to nejlepší postup, ale pro mě to fungovalo. Uživatel začíná výběrem svého pohlaví a preference dne. Tím se odešle požadavek AJAX na získání dostupného personálu a různých typů schůzek (např. barvení vlasů, stříhání vlasů atd.).
Když jsou všechna nastavení zvolena (pohlaví, datum, personál a typ), začnu několika jednoduchými ověřeními:zkontroluji datum, zkontroluji, zda datum ("N") není 7 (neděle). Pokud je vše v pořádku, začíná to důležitější:
1) Typ schůzky je načten z databáze včetně celkové doby, kterou tento typ zabere (30 minut, 45 minut atd.)2) Načte se dostupný personál (úplný seznam lidí v daný den nebo pouze jedna osoba, pokud jeden je vybrán) včetně jejich dostupných časů
Osoba (nebo jedna osoba) je poté smyčka, počínaje jejich vlastním počátečním časem. V tomto okamžiku mám sadu dat obsahující:
$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)
Vezměme si tato ukázková data:
$duration = 30 min
$startTime = 9.00h
$endTime = 9.30h
$personStart = 9.00h
$personEnd = 12.00h
Co tady dělám je:
while( $endTime < $personEnd )
{
// Check the spot for availability
$startTime = $endTime;
$endTime = $startTime + $duration;
}
Je zřejmé, že v tomto případě je to celé zjednodušené. Protože když zkontroluji dostupnost, místo není volné. Nastavil jsem $startTime tak, aby se rovnal poslední nalezené schůzce a začnu odtamtud ve smyčce.
Příklad:
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.
Funkce kontroly dostupnosti
// 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;
}
}
Protože ukládám schůzky jako „Od:10:00 do:11:00“, musím se ujistit, že budu kontrolovat místa od 11:00:01 do 11:59:59, protože jinak se ve výsledcích zobrazí schůzka v 11:00.
Na konci funkce, v případě, že je nalezena schůzka, zacyklím výsledky a vrátím poslední konec. Toto je další začátek ve smyčce, kterou jsem zmínil výše.
Snad to může být pro někoho užitečné. Stejně jako informace:ape_id
je ID „osoby schůzky“, se kterou je spojen.