Pada akhirnya saya menggunakan sistem yang menghasilkan cap waktu untuk tanggal mulai dan berakhir dalam database. Saat memeriksa, saya menambahkan satu detik ke awal dan mengurangi satu detik dari akhir untuk menghindari waktu yang tumpang tindih untuk janji temu.
Apa yang akhirnya saya lakukan
Jelas saya tidak yakin ini adalah praktik terbaik, tetapi itu berhasil untuk saya. Pengguna mulai dengan memilih jenis kelamin mereka dan preferensi untuk hari itu. Ini mengirimkan permintaan AJAX untuk mendapatkan personel yang tersedia dan berbagai jenis janji temu (misalnya mewarnai rambut, memotong rambut, dll).
Ketika semua pengaturan telah dipilih (jenis kelamin, tanggal, pribadi dan tipe) saya mulai dengan beberapa validasi sederhana:memeriksa tanggal, memeriksa apakah tanggal ("N") bukan 7 (Minggu). Jika semuanya baik-baik saja, hal yang lebih penting dimulai:
1) Jenis janji diambil dari database termasuk jumlah total waktu yang dibutuhkan jenis ini (30 menit, 45 menit, dll)2) Pribadi yang tersedia diambil (daftar lengkap orang pada hari itu atau hanya satu orang jika satu dipilih) termasuk waktu yang tersedia
Personil (atau satu orang) kemudian dilingkarkan, dimulai dengan waktu mulai mereka sendiri. Pada titik ini saya memiliki satu set data yang berisi:
$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)
Mari kita ambil data demo ini:
$duration = 30 min
$startTime = 9.00h
$endTime = 9.30h
$personStart = 9.00h
$personEnd = 12.00h
Apa yang saya lakukan di sini adalah:
while( $endTime < $personEnd )
{
// Check the spot for availability
$startTime = $endTime;
$endTime = $startTime + $duration;
}
Jelas, itu al disederhanakan dalam kasus ini. Karena saat saya cek ketersediaan, dan spotnya tidak gratis. Saya menyetel $startTime agar sama dengan janji temu terbaru yang ditemukan dan mulai dari sana dalam perulangan.
Contoh:
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.
Periksa fungsi ketersediaan
// 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;
}
}
Karena saya menyimpan janji temu sebagai "Dari:10.00 Hingga 11.00", saya harus memastikan untuk memeriksa tempat dari 11:00:01 hingga 11:59:59, karena jika tidak, janji temu pada 11:00 akan muncul di hasil.
Di akhir fungsi, jika janji temu ditemukan, saya mengulang hasilnya dan mengembalikan akhir terbaru. Ini adalah awal berikutnya dari loop yang saya sebutkan di atas.
Semoga ini bisa membantu siapa pun. Sekedar info:ape_id
adalah ID dari "Appointment Person" yang terhubung dengannya.