Sentra Rental — Booking Module¶
Modul booking mengelola seluruh siklus pemesanan unit dari inisiasi hingga penyelesaian, menggunakan Redlock untuk mencegah double booking dan state machine untuk menjaga konsistensi status rental.
9.1 Anti-Double-Booking via Redlock¶
Saat dua pelanggan mencoba memesan unit yang sama untuk tanggal yang sama secara simultan:
Client A → POST /api/v1/bookings
Client B → POST /api/v1/bookings (bersamaan, ±0 ms)
Server A: SET lock:asset:<serial>:2026-05-25 NX EX 600 → OK
Server B: SET lock:asset:<serial>:2026-05-25 NX EX 600 → FAIL
Server A: → Insert ke DB → Commit → Update Redis bitmask → DEL lock
Server B: → Return 409 ASSET_LOCKED
Redlock diimplementasikan via library redlock-node atau ioredis-redlock dengan quorum dari 3 node Redis untuk ketahanan split-brain.
9.2 Booking State Machine¶
| Status | Trigger | Tindakan Otomatis |
|---|---|---|
PENDING_PAYMENT |
Booking draft dibuat | Redis lock acquired, bitmask dipesan, timeout 15 menit |
CANCELLED |
Timeout / manual cancel | Redlock dilepas, bitmask direset, refund initiated |
PAID_APPROVED |
Webhook PG sukses + KTP verified | Notifikasi WhatsApp booking confirmed |
DISPATCHED |
Inspector submit check-out handover | Asset status → BOOKED, tamper-hash direkam |
ACTIVE_RENTAL |
Surat jalan diterbitkan | Countdown timer jatuh tempo aktif |
EXTENSION_PENDING |
Customer request perpanjangan | Cek bitmask slot berikutnya |
RETURNED_PENDING_CHECK |
Inspector submit check-in | Hitung late fee, trigger damage assessment |
DISPUTED |
Kerusakan / keterlambatan terdeteksi | Admin notifikasi, deposit hold diperpanjang |
COMPLETED |
Fine paid / deposit settled | Bitmask direset, asset status → AVAILABLE/MAINTENANCE |
9.3 Dynamic Pricing Engine¶
Harga sewa disesuaikan secara otomatis berdasarkan kalender:
| Kondisi | Multiplier | Contoh |
|---|---|---|
| Weekday (Senin–Kamis) | 1.0× (base rate) | Avanza Rp 350.000/hari |
| Weekend (Jumat–Minggu) | 1.25× | Avanza Rp 437.500/hari |
| Peak Season (Libnas/Lebaran) | 1.5× | Avanza Rp 525.000/hari |
| Last-minute (<24 jam) | 1.1× | Surcharge 10% |
Pricing rule disimpan di tabel pricing_rules PostgreSQL dan di-cache di Redis (TTL 1 jam).
9.4 Reschedule & Cancellation Rules¶
Reschedule¶
- Hanya diperbolehkan maksimal H-2 dari jadwal pengambilan.
- Biaya administrasi reschedule: 10% dari tarif sewa harian.
- Sistem mengecek bitmask Redis untuk slot tanggal baru sebelum mengizinkan perubahan.
Pembatalan¶
| Waktu Pembatalan | Refund Rental | Refund Deposit |
|---|---|---|
| > H-3 | 100% | 100% |
| H-2 s.d H-1 | 50% | 100% |
| Hari-H | 0% (hangus) | 100% |
Refund diproses otomatis via payment gateway (Xendit Refund API / Midtrans Cancel).
9.5 Booking Extension¶
Pelanggan dapat mengajukan perpanjangan saat masa sewa aktif:
1. Customer → POST /api/v1/bookings/:id/extension { new_end_time }
2. Server cek bitmask hari setelah current end_time
3. Jika hari tersedia → buat EXTENSION_PENDING
4. Hitung additional charge (dynamic pricing berlaku)
5. Pelanggan bayar → status kembali ke ACTIVE_RENTAL
6. Jika tidak tersedia → return 409 (suggest unit alternatif SKU sama)