XPrivate · admin-MVP-1 · Pricing full-flow (has_levels × applicability) ALIGNED — supporting view aligned 2026-05-31
Pricing source-of-truth → admin-mvp-1-pricing-base-override.html · model = Base + Override cascade (SubjectLevel ?? Subject ?? Base) · Stack: React 19 + TanStack Start (SPA) · shadcn amber b1MJ9vRwY6

Pricing Matrix — Full Flow & Semua Case (v2)

FIX v2: has_levels (shape) ≠ applicability (Tingkat mana ditawarin) = 2 axis INDEPENDENT. Common case (pelajaran sekolah no-levels SD-SMA) sekarang tercover.

02 Axis Independent (jangan di-conflate)

Axis 1 — has_levels (nentuin SHAPE matrix): subject punya tingkatan internal gak? · Axis 2 — Applicability (nentuin Tingkat mana ditawarin): subject buat jenjang apa? Dua-duanya bebas — no-levels BUKAN berarti adult-only.

has_levels = TRUE (Type A · row=Level)has_levels = FALSE (Type B · row=Segmentasi)
Applies
SD-SMA
Mandarin (HSK 1-6), Piano (Grade 1-8), English (CEFR)
les bertingkat buat anak sekolah
PALING COMMON
Matematika, Biologi, Fisika, Kimia, B.Indonesia, B.Inggris-sekolah
mapel sekolah reguler — no level internal, ikut Tingkat sekolah (SD 1 - SMA 12)
Applies
Umum/Prof
English CEFR buat profesional, sertifikasi bertingkat
jarang
CPNS, IELTS prep, BUMN test
exam dewasa — no level, adult-only (edge)
Kesalahan sebelumnya (fixed): gue conflate "no-levels" = "adult-only" pakai CPNS. SALAH. Mapel sekolah (Matematika) = no-levels TAPI SD-SMA. Itu yang paling sering. CPNS cuma 1 varian applicability, bukan THE no-levels case.
1Matrix Shape per Case (switch buat liat adapt)
SD (1-6) ▾
2Subject Creation Flow
1
Buat Subject
Nama + Kategori (mis. "Matematika" / REGULER_KELAS)
2
Toggle has_levels
Punya tingkatan internal? (Axis 1 — shape)
ON → define levels
→ row=Level
OFF → skip
→ row=Segmentasi
(Matematika dll)
3
Set Applicability
Tingkat mana ditawarin? (Axis 2). Matematika → SD/SMP/SMA. CPNS → Umum/Prof. Toggle is_offered per combo.
4
Isi harga
Manual / impor / clone TA. Per Siswa + Tutor (Golongan).
Step 2 (has_levels) & Step 3 (applicability) = INDEPENDENT. Matematika: has_levels OFF + applies SD-SMA. CPNS: has_levels OFF + applies Umum/Prof. Mandarin: has_levels ON + applies SD-SMA(+Umum).
3Lifecycle Matrix
🆕 Baru
Matrix kosong, coverage 0%. Isi via impor/manual.
✅ Aktif
effective_until=NULL (berlaku terus). Edit inline/bulk + dirty-guard.
🔄 Clone TA
Copy ke TA baru + bump %. TA lama jadi history.
⏰ Terjadwal
Future-dated change, aktif otomatis di tanggal.
📜 History
Versi lama read-only. Harga LATE-BIND: di-resolve saat billing, snapshot saat settlement (bukan saat APPROVED).

🎯 Model summary — confirm equal?

Masih ada case yang miss? (mapel SMP-only, level dengan sub-level, subject lintas-kategori, dll) — koreksi.