Riwayat Perubahan Data Sebelum & Sesudah
Menampilkan catatan jelas siapa yang mengubah data, kapan diubah, serta perbandingan nilai lama dan nilai baru agar pencatatan keuangan tetap transparan.
Menampilkan catatan jelas siapa yang mengubah data, kapan diubah, serta perbandingan nilai lama dan nilai baru agar pencatatan keuangan tetap transparan.
Tantangan & Kebutuhan Pengguna
Pada kantong tabungan yang dikelola bersama, catatan aktivitas yang hanya bertuliskan 'Mengubah pengeluaran' tidak cukup menjawab transparansi: anggota lain perlu mengetahui kolom apa yang diubah, berapa nilai sebelumnya, dan berapa nilai barunya. Namun, membuat tabel audit relasional terpisah untuk setiap jenis entitas akan memperumit skema database secara berlebihan.
Log audit yang bernilai tinggi tidak sekadar melapor bahwa sebuah data telah disentuh, melainkan menyandingkan nilai masa lalu dan nilai saat ini secara berdampingan.
Solusi & Cara Kerja
Seluruh modul menggunakan kontrak data `LogDetail` (`{ action, summary, fields: [{ label, value, old, new }] }`) yang diserialisasi menjadi JSON string oleh helper `buildLog()` ke dalam kolom `detail` di tabel `logactivity`. Setiap kali endpoint `PUT` dipanggil, server mengambil snapshot baris lama (`old`) terlebih dahulu sebelum menjalankan perintah `UPDATE`, lalu membandingkan properti satu per satu untuk mencatat hanya field yang benar-benar berubah. Di sisi frontend, komponen `LogDetailView.tsx` mengurai JSON tersebut menjadi badge aksi berwarna (`Tambah`, `Ubah`, `Hapus`) lengkap dengan teks nilai lama yang dicoret (`line-through`) menuju nilai baru.
Detail & Hal yang Diperhatikan
- Backward Compatibility untuk Log Lama: Blok `try-catch` pada `JSON.parse(detail)` memastikan log sistem (seperti log login atau auto-generate dari scheduler) yang berupa string biasa tetap di-render dengan rapi tanpa memicu runtime error.
- Urutan Eksekusi sebelum Cascade Delete: Saat pemilik menghapus kantong tabungan (`DELETE /api/saving/[uuid]`), penyisipan catatan ke `logactivity` dieksekusi lebih dulu sebelum `DELETE FROM bank` agar tidak gagal akibat constraint referensi.
- Normalisasi Prefix Summary: `LogDetailView` membersihkan kata kerja berulang di awal ringkasan dengan `.replace(/^(Tambah|Edit|Ubah|Hapus|Top-up)\s+/i, '')` agar tidak tampil ganda bersama badge aksi.
Daftar log aktivitas di halaman Profil otomatis menyesuaikan konteks: jika pengguna sedang memilih kantong tabungan aktif, log difilter khusus untuk kantong tersebut; jika belum memilih, sistem menampilkan gabungan aktivitas lintas kantong.