Lewati ke isi

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:

  1. Acquire Redlock pada ID kelas (maksimum lock duration: 500 ms)
  2. Verify remaining_slots > 0 di Redis
  3. Decrement remaining_slots secara atomik
  4. Write booking record ke PostgreSQL
  5. Release lock

Jika lock gagal diperoleh (kelas sedang dikunci thread lain), request dikembalikan ke waiting queue atau retry dalam milidetik.