Lewati ke isi

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)