XPrivate · admin-MVP-1 · Unified pricing engine (all subjects = base + applicability variant) 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

Unified Matrix — Subject = Applicability Variant

Visualisasi Finding 2 #4: SEMUA subject pakai 1 matrix yang sama (Segmentasi × Tingkat). Yang beda CUMA kolom Tingkat mana yang "ditawarkan". Bukan engine pricing terpisah.

Inti: Tryout, IELTS, musik, CPNS, Matematika = semua Subject biasa. Beda cuma 3 atribut: (1) kategori grouping, (2) has_levels shape, (3) applicability = Tingkat mana di-is_offered. Switch subject di bawah → liat grid SAMA, cuma pola "ditawarkan" (hijau) vs "tidak ditawarkan" (abu) yang geser.
Subject Registry (semua = Subject, beda atribut)
SubjectKategorihas_levelsApplicability (Tingkat ditawarkan)
MatematikaREGULER_KELASfalseSD 1-6 · SMP 7-9 · SMA 10-12
Bahasa MandarinBAHASA_ASINGtrue (HSK 1-6)SD-SMA · Umum
Persiapan Tryout (UTBK)PROGRAM_KHUSUSfalseSMA 10-12 · Umum irisan
IELTS / TOEFL PrepSERTIFIKASIfalseSMA 10-12 · Umum · Profesional
Musik (gitar/vokal)MUSIKfalseUmum (+ SD-SMA opsional)
CPNS / BUMN PrepPROGRAM_KHUSUSfalseUmum · Profesional
Klik baris → lihat matriksnya di bawah. Semua pakai struktur identik; hanya applicability yang beda.
Matriks (struktur SAMA, applicability bergeser)
ditawarkan (ada harga) tidak ditawarkan
Kesimpulan: partner build 1 matrix engine (Segmentasi × Tingkat individual [× SubjectLevel kalo has_levels]). "Jenis subject" = data, bukan code path. Tryout/IELTS/musik = bikin Subject baru, set kategori + has_levels + toggle Tingkat mana di-offer. Pricing pakai matrix yang sama. Gak ada special-case pricing engine per jenis.