Mengatur ketersediaan
Atur jam operasional mingguan, blokir waktu, dan hari libur agar slot booking Termilo selalu akurat. Termilo menghitung slot dari aturan ketersediaan dikurangi libur, blokir, dan booking yang sudah ada.
startMinute/endMinute), dan weekday memakai 0–6 dengan 0 = Minggu.Tiga lapis ketersediaan#
Ketersediaan di Termilo dibangun dari tiga tabel terpisah. Mesin booking menggabungkannya saat menghitung slot: aturan menentukan kapan Anda bisa menerima booking, sedangkan blokir dan libur memotong kembali waktu itu.
Jendela mingguan berulang (buka/tutup per hari). Bisa per bisnis, per staf, atau per resource.
Waktu libur sekali jalan dengan rentang epoch-ms — cuti, rapat, atau maintenance.
Penutupan seluruh bisnis pada rentang tanggal, mis. libur nasional.
ownerType — tenant, staff, atau resource. Aturan tingkat bisnis (tenant) berlaku untuk semua orang; aturan tingkat staf/resource mempersempit ketersediaan orang atau ruangan tertentu.Atur lewat dashboard#
Jalur tercepat ada di dashboard. Langkah-langkahnya cocok dengan layar Jam operasional.
- Buka Operasional → Jam operasional.
- Atur jam buka/tutup tiap hari (Sen–Min, 06:00–22:00, kelipatan 30 menit). Gunakan “Salin ke semua hari” untuk menyamakan jadwal.
- Aktifkan “Tutup otomatis saat libur nasional” bila perlu.
- Tambahkan “Pengecualian & hari libur” (Tanggal + Keterangan) untuk blokir dan libur satu kali.
POST /api/availability-rules, POST /api/blocked-times, dan POST /api/holidays. Detail tiap endpoint ada di bawah.Jam operasional (availability rules)#
Aturan ketersediaan adalah jendela mingguan berulang. Satu baris = satu rentang buka pada satu hari. Untuk jadwal Senin–Jumat 09:00–17:00, buat lima baris (weekday 1 sampai 5) dengan startMinute: 540 dan endMinute: 1020. Server memvalidasi startMinute < endMinute.
Endpoint: GET|POST /api/availability-rules dan PATCH /api/availability-rules/:ruleId — sesi dashboard + peran tulis + header CSRF X-Termilo-CSRF.
Blokir waktu (blocked times)#
Blokir waktu adalah libur sekali jalan dengan rentang epoch-ms eksplisit — di luar jadwal mingguan. Gunakan untuk cuti, rapat internal, atau perawatan ruangan. Set status: "cancelled" untuk membatalkan blokir tanpa menghapus baris.
Endpoint: GET|POST /api/blocked-times dan PATCH /api/blocked-times/:blockId — sesi dashboard + CSRF.
Hari libur (holidays)#
Hari libur menutup seluruh bisnis pada rentang tanggal — tidak terikat pada satu owner. Cocok untuk libur nasional atau penutupan tahunan.
Endpoint: GET|POST /api/holidays dan PATCH /api/holidays/:holidayId — sesi dashboard + CSRF.
POST /api/holidays.Cara slot dihitung#
Slot bukan tabel — slot dihitung. Mesin ketersediaan mengambil aturan mingguan lalu mengurangi hari libur, blokir waktu, dan booking yang sudah ada, lalu memotongnya ke durasi layanan. Hasilnya adalah daftar slot kandidat untuk halaman publik.
Bacaan publik tidak perlu auth: GET /book/:tenantSlug/availability. Jendela pencarian dibatasi maksimal 31 hari.
{
"service": { "serviceId": "...", "slug": "konsultasi-30", "durationMin": 30 },
"finalAuthority": "booking_create_recheck_under_lock",
"slots": [
{
"startsAtMs": 1750723200000,
"endsAtMs": 1750725000000,
"staffId": null,
"resourceId": null,
"capacityRemaining": 1
}
]
}Slot adalah pratinjau, bukan otoritas akhir
"finalAuthority": "booking_create_recheck_under_lock". Artinya: tampilkan slot ini untuk dipilih, tapi ketersediaan sesungguhnya baru ditetapkan saat POST /book/:tenantSlug/bookings mengecek ulang slot di bawah lock Durable Object. Bila slot sudah terisi, create mengembalikan BOOKING_SLOT_UNAVAILABLE (409). Jangan perlakukan respons availability sebagai jaminan.Buffer antar booking#
Buffer adalah jeda di sekitar setiap booking, dan itu milik layanan — bukan aturan ketersediaan. Setiap layanan punya bufferBeforeMin dan bufferAfterMin (bawaan 0, diatur lewat /api/services). Mesin ikut memperhitungkan buffer ini saat membentuk slot, sehingga ada jeda persiapan atau bersih- bersih antar sesi.