XPrivate · admin-MVP-1 · Pricing ops — effective-dating + bulk + %-bump (base+override) ALIGNED rebuilt 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 OPS — operasi bekerja di baris Harga Dasar (Tingkat × Segmentasi) + baris Override. Bukan cell matrix per-subject (model itu ditinggalkan). Semua op model-agnostik: effective-dating, bulk fill-down, %-bump, dirty-guard.

Pricing Operations — Base + Override

Operasi harga di atas model final SubjectLevel ?? Subject ?? Base. Yang di-edit = baris Harga Dasar (~45 baris Tingkat × Segmentasi) dan baris Override / Harga Khusus (sparse). Tiap baris punya effective_from, bukan cell matrix.

Late-bind & effective-date model. Tiap baris Harga Dasar / Override punya effective_from (di-anchor ke WIB). Harga & kebijakan pembatalan di-resolve telat (late-bind) — diambil dari harga yang berlaku pada tanggal pelajaran, lalu di-snapshot saat SETTLEMENT (penagihan/pembatalan), bukan saat sesi di-APPROVE. Konsekuensi: jadwalkan kenaikan jauh hari, sistem switch otomatis di tanggal efektif; sesi yang sudah disettle tetap pakai harga lamanya.
1Effective-dating — jadwalkan perubahan baris harga ⏰ terjadwal
Harga/Harga Dasar/SD 3 · INT

Berlaku Mulai per baris effective_from (WIB)

Pilih baris Harga Dasar atau Override → jadwalkan nilai baru dengan tanggal Berlaku Mulai. Nilai aktif berjalan terus (tanpa tanggal akhir) sampai versi terjadwal mengambil alih.

Bukan input per-cell. Tanggal di-set lewat flow "Jadwalkan Perubahan" pada satu baris cascade. Edit biasa = berlaku hari ini. Header baris menampilkan status berlaku + badge perubahan terjadwal.
Harga Dasar · SD 3 · INT ✓ Berlaku sejak 1 Jan 2026 ⏰ Perubahan terjadwal: 1 Jul 2026
Sekarang — berlaku
Rp 215.000
effective_from 1 Jan 2026 · tanpa tanggal akhir
Terjadwal — 1 Jul 2026
Rp 237.000
+10% · otomatis aktif, admin tak perlu edit hari-H
Berlaku untuk baris Harga Dasar maupun baris Override.
💡 Hover baris → tooltip "Berlaku sejak 1 Jan 2026". Tanggal per-baris = info read-only; di-set lewat flow Jadwalkan. Late-bind: sesi di tanggal ≥ 1 Jul 2026 otomatis pakai Rp 237.000 saat di-settle; sesi sebelum itu tetap Rp 215.000.
2Bulk ops — fill-down Segmentasi & multi-select baris Harga Dasar
Harga/Harga Dasar/Matrix

Harga Dasar — Tingkat × Segmentasi

Pilih baris/kolom Harga Dasar → fill-down satu Segmentasi melintasi semua Tingkat, atau pilih banyak sel lalu terapkan sekaligus. Inilah ~45 baris cascade (subject-agnostic), bukan cell matrix per-subject.

0 sel dipilih
Cara pakai: klik header Tingkat (kolom) atau label Segmentasi (baris) untuk select cepat, atau klik sel satu-satu. Lalu klik-kanan untuk menu bulk, atau pakai tombol di atas. Fill-down menyalin sel sumber (bertepi putus-putus) ke seluruh baris.
dipilih sumber fill-down baris Override (Harga Khusus)
💡 Fill-down paling ngurangin kerja kalau harga clustering (banyak Tingkat dengan harga sama dalam satu Segmentasi). Sekali isi → propagate ke seluruh baris. Baris Override tetap menang atas Base lewat cascade.
Operasi bulk
↓ Isi ke bawah (fill-down baris)
→ Isi ke kanan (semua Tingkat)
📈 Naikkan % sel terpilih
⏰ Jadwalkan perubahan…
✕ Kosongkan pilihan
3%-Bump dengan pratinjau old → new konfirmasi sebelum apply
Harga/Harga Dasar/Naikkan %

Terapkan +X% ke baris terpilih

Pilih baris Harga Dasar → masukkan persen → pratinjau Rupiah lama → baru berdampingan SEBELUM commit. Konfirmasi eksplisit dengan jumlah baris + total.

%
Ribuan terdekat
Pilih dulu baris di tabel section 2.
Belum ada baris dipilih. Pilih sel/baris di matrix Harga Dasar (section 2), lalu klik Pratinjau. Pratinjau menampilkan tiap baris old → new + total sebelum kamu commit.
💡 %-bump bekerja pada nilai baris Harga Dasar; baris Override yang ikut terpilih juga di-bump. Setelah commit, kamu masih bisa menjadwalkannya (effective_from) alih-alih langsung aktif hari ini.
4Dirty-cue + escape guard manual save
Harga/Status simpan

Perubahan belum disimpan

Sel/baris yang diubah tapi belum di-commit = highlight + dot biru. Simpan manual (bukan autosave). Keluar halaman dengan perubahan pending → konfirmasi beforeunload.

Coba: edit nilai di matrix Harga Dasar (section 2) atau jadwalkan/bump perubahan → bar status di bawah berubah jadi kuning. Klik Simpan untuk commit, atau refresh/tutup tab untuk memicu escape guard.
Escape guard. Browser beforeunload — prompt "Perubahan belum disimpan. Yakin keluar?" muncul saat menutup tab / navigasi keluar dengan perubahan pending. Mencegah kehilangan kerja tidak sengaja.

🎯 Catatan handover

Operasi (semua model-agnostik)

Effective-datingeffective_from per baris cascade (Base/Override), WIB-anchored, late-bind di settlement.
Bulk — fill-down Segmentasi melintasi Tingkat, multi-select apply, clear.
%-bump — pratinjau old→new + konfirmasi (jumlah baris + total).
Dirty-cue + escape guard — manual save + beforeunload.

Acuan model

Operasi bekerja pada baris Harga Dasar (~45) + baris Override (sparse), bukan cell matrix per-subject (ditinggalkan). Cascade SubjectLevel ?? Subject ?? Base dari file kanonik admin-mvp-1-pricing-base-override.html. Harga + kebijakan pembatalan late-bind: resolve pada tanggal pelajaran, snapshot saat settlement. Partner authority on impl.

Semua tersimpan. Tidak ada perubahan pending.