XPrivate · admin-MVP-1 · Wireframes — Audit Log + Cron Jobs ALIGNED aligned 2026-05-31
Index → admin-mvp-1-ia-handover.html · Stack: React 19 + TanStack Start (SPA) · shadcn amber b1MJ9vRwY6 · light-mode iter-1

Audit Log + Cron Jobs

Settings-tier · Audit Log (A1 epic, insert-only 7thn) + Cron Jobs admin (partner-discussion Item 2) · light mode · Indonesian · WIB

Wireframe 9 / 10

Log Audit (Audit Log)

Route: /audit · Recipe A (filterable list) · insert-only, retensi 7thn · klik row → before/after diff · Role: ADMIN full, OPS/FINANCE scoped
Audit/Log

Log Audit

📅 30 hari terakhir ▾ Aktor: Semua ▾ Entitas: Semua ▾ Aksi: Semua ▾
🔍
Timestamp (WIB)AktorAksiEntitasIDIP
31 Mei 14:32:08
FAFahrul A.
pricing.updatepricing_matrix#PM-2041103.xx.12.4
31 Mei 14:02:11
FAFahrul A.
schedule.approveschedule#1042103.xx.12.4
31 Mei 11:18:45
DKDewi K. (OPS)
schedule.cancelschedule#1037103.xx.55.2
31 Mei 10:05:30
RnRina (FIN)
settlement.mark_paidsettlement#bulk-22103.xx.77.9
30 Mei 16:48:02
FAFahrul A.
tutor.suspendtutor#T-088103.xx.12.4
30 Mei 09:30:15
RnRina (FIN)
period.closeperiod#2026-04103.xx.77.9

Detail — #PM-2041 · pricing.update · Fahrul A. · 31 Mei 14:32:08 WIB

Alasan: penyesuaian strategi kompetitor — Mandarin HSK3 SMA naik · IP 103.xx.12.4 · insert-only (tidak dapat diubah atau dihapus)
KolomSebelumSesudah
amount (HSK3·SMA10·REG)Rp 250.000Rp 270.000
effective_from2026-06-01
Menampilkan 6 dari 1.247 entri · halaman dimuat dari server · klik baris untuk lihat perubahan sebelum/sesudah

Komponen Kunci

Insert-only, immutable

DB constraint: no UPDATE, no DELETE. Retensi 7 thn (legal). Setiap entry permanen — dispute-proof. Cover 6 financial touch-point (create/approve/cancel/finalize/reconcile bill/reconcile payout) + master-data edit + FM events.

Before/after diff drill

Klik row → expand diff (field, sebelum, sesudah) + alasan + IP. Buat dispute ("kok harga siswa ini beda?") + forensik.

Filter heavy

Date range · aktor (Combobox) · entity_type (Select) · entity_id (search) · aksi. Server-side query + pagination (volume tinggi, 50-100k/thn).

Role-scoped view

ADMIN = full. OPS = own actions + scoped entity. FINANCE = finance actions. Per permission (Negation ACL).

Entity deep-link

entity_id clickable → buka entity detail (sesi #1042 → schedule detail). Cross-ref dari audit ke entity + balik (tab Riwayat per entity).

Components

DataTable (TanStack, server-side), DateRangePicker, Combobox (actor), Select, Sheet/inline-expand (diff), Badge (action type). Ekspor → Excel/CSV.

Open Knobs

  • Diff: inline-expand (mockup) atau Sheet side-panel? Strawman = inline-expand (cepet scan), Sheet kalo diff besar.
  • Ekspor log: butuh permission khusus (audit:export)? Strawman = ADMIN + FINANCE only.
  • Retensi 7thn: archive cold-storage setelah 1-2 thn? Partner authority (storage planning).
Wireframe 10 / 10

Cron Jobs (Admin)

Route: /settings/cron-jobs · ADMIN only · monitor + manual trigger + log · WIB · (partner-discussion Item 2)
Pengaturan/Tugas Terjadwal

Tugas Terjadwal · semua jadwal WIB (Asia/Jakarta)

TugasJadwalTerakhir dijalankanStatusJadwal berikutnya
Tutup periode bulanan
pemicu period.close
0 0 1 * *
tiap tgl 1, 00:00
1 Mei 00:00Berhasil1 Jun 00:00
Pembersihan strike kedaluwarsa
hapus strike >90 hari
0 0 * * *
harian 00:00
31 Mei 00:00Berhasil · 4 dibersihkan1 Jun 00:00
Tutup jendela banding FM
tutup PENDING_L2 >14 hari
0 0 * * *
harian 00:00
31 Mei 00:00Berhasil · 0 ditutup1 Jun 00:00
Hitung ulang aging
hitung ulang bucket outstanding
0 1 * * *
harian 01:00
31 Mei 01:00Berhasil1 Jun 01:00
Kirim ulang email selamat datang
kirim ulang antrian gagal
*/30 * * * *
tiap 30 menit
31 Mei 02:001 gagal kirim ulang31 Mei 02:30
Riwayat jalan — Pembersihan strike kedaluwarsa (5 terakhir)
31 Mei 00:00:02 ✓ SUCCESS · 4 strike cleared (>90d) · 218ms
30 Mei 00:00:01 ✓ SUCCESS · 2 strike cleared · 195ms
29 Mei 00:00:03 ✓ SUCCESS · 0 cleared · 142ms
28 Mei 00:00:02 ✓ SUCCESS · 1 cleared · 168ms
27 Mei 00:00:01 ✓ SUCCESS · 3 cleared · 201ms
💡 Ubah ekspresi cron atau tambah/hapus tugas dilakukan di sisi kode (wewenang partner, konfigurasi Wrangler). Halaman ini hanya untuk pemantauan, jalankan manual, dan log.

Komponen Kunci

Monitor + manual trigger (scope iter-1)

List job + schedule + last/next run + status. Manual trigger (debug / re-run / period-close override). Drill → run history + log. NO edit cron expr / add-remove job (code-side, partner authority).

5 jobs iter-1

Period close (monthly) · Strike decay (daily) · FM banding-close (daily) · Aging recalc (daily) · Notif retry (30 min). Semua WIB.

Status indicator

Dot warna: hijau sukses / kuning warning (1 gagal retry) / merah error / abu idle. + result summary ("4 cleared").

Ops helper visibility

ADMIN-only page. Kenapa UI (bukan CLI-only): ops helper future gak boleh ke-lock dari Wrangler. Incident response butuh manual trigger.

WIB timezone (locked)

Semua cron run WIB (Asia/Jakarta). Period close = WIB midnight tgl 1. Log timestamp WIB. Per lock doc.

Components

DataTable (job list), Badge/status dot, Button (trigger), inline-expand (run history + log), AlertDialog (confirm manual trigger period-close — high-impact).

Open Knobs

  • Manual trigger period-close: butuh confirm (high-impact)? Strawman = ya, AlertDialog.
  • Log retention/verbosity: tail N lines di UI, full di R2? Strawman = last 5 run di UI, full di R2 link.
  • Alert kalo job gagal: notif ke admin (email/WA)? Strawman = iter-1.5 (iter-1 = visual status di page).
✅ 10 / 10 wireframes COMPLETE — Pricing (interactive) · Approval · Schedule Detail · Calendar · Pembatalan · Tutup Periode · Dashboard · ⌘K Palette · Audit Log · Cron Jobs.
Next: Section 6 (design tokens + locale) · Section 7 (a11y) · Section 8 (assemble final handover HTML).