Sentra Membership — Booking & Class Engine Module¶
Overview¶
Modul Booking menangani pemesanan slot kelas olahraga secara konkuren menggunakan Redis distributed lock (Redlock) untuk mencegah over-capacity. Mendukung waiting list otomatis, promosi waiting list ke slot terkonfirmasi, dan penalti pembatalan.
9.1 Subscription State Machine¶
stateDiagram-v2
[*] --> PENDING_PAYMENT : Pendaftaran & Pilih Paket
PENDING_PAYMENT --> ACTIVE : Pembayaran Settlement Berhasil
PENDING_PAYMENT --> CANCELLED : Batas Waktu Bayar Terlewati
ACTIVE --> FROZEN : Permintaan Bekukan Keanggotaan (Freeze)
FROZEN --> ACTIVE : Masa Freeze Berakhir / Unfreeze Manual
ACTIVE --> EXPIRED : Tanggal Akhir Lewat & Gagal Auto-Renew
ACTIVE --> PENDING_PAYMENT : Memicu Auto-Renewal (Hari Terakhir)
EXPIRED --> ACTIVE : Pembayaran Tunggakan Lunas
EXPIRED --> [*]
9.2 Auto-Renewal Retry Loop Rules¶
| Waktu | Aksi |
|---|---|
| H-3 | Notifikasi WhatsApp pengingat auto-debit akan dijalankan dalam 3 hari |
| Hari H pukul 01.00 | Percobaan auto-debit pertama. Jika gagal, status tetap ACTIVE, dijadwalkan ulang |
| H+1 | Percobaan auto-debit kedua. Jika gagal, notifikasi peringatan kegagalan dikirim ke member |
| H+2 | Percobaan auto-debit ketiga. Jika gagal, keanggotaan otomatis EXPIRED pukul 23.59, sinyal penguncian akses dikirim ke turnstile |
10.1 Waiting List Queue Transition Flowchart¶
graph TD
A[Member Batalkan Booking Kelas] --> B[Sistem Ubah Status Booking -> CANCELLED]
B --> C[Ambil Peserta Daftar Tunggu Posisi #1]
C --> D{Apakah Kelas Mulai kurang dari 2 Jam?}
D -- Ya --> E[Kirim Notifikasi WA Penawaran Cepat: Wajib Konfirmasi dalam 10 Menit]
E --> F{Konfirmasi Sukses?}
F -- Ya --> G[Konfirmasi Booking Peserta #1]
F -- Tidak --> H[Alihkan ke Peserta Daftar Tunggu Posisi #2]
D -- Tidak --> I[Auto-Promote Peserta #1 Menjadi CONFIRMED & Kirim WA]
H --> I
10.2 Late Cancellation & No-Show Penalty Logic¶
| Kondisi | Penalti |
|---|---|
| Pembatalan > 4 jam sebelum kelas | Gratis, tidak ada penalti |
| Pembatalan < 4 jam sebelum kelas | Potong 1 kuota sesi, atau Rp 25.000 dari wallet (paket unlimited) |
| No-show (tidak hadir tanpa pembatalan) | Diblokir dari pemesanan kelas selama 3 hari berturut-turut |
Redis Atomic Slot Lock Detail¶
Sistem menggunakan perintah EVAL Lua Script pada Redis untuk memvalidasi kuota slot dan mengurangi kuota tersisa secara atomik:
- Acquire Redlock pada ID kelas (maksimum lock duration: 500 ms)
- Verify
remaining_slots > 0di Redis - Decrement
remaining_slotssecara atomik - Write booking record ke PostgreSQL
- Release lock
Jika lock gagal diperoleh (kelas sedang dikunci thread lain), request dikembalikan ke waiting queue atau retry dalam milidetik.