Activity Logs (Log Aktivitas)
| Code | SET-LOG |
| Module | Settings |
| Type | Audit log (read-only) |
| Status | Implemented |
| Priority | P1 |
| Process | Audit & kepatuhan |
| API | [URL Postman] |
1. Overview
Log Aktivitas mencatat setiap perubahan data di tenant: siapa melakukan apa, kapan, pada data apa, dan nilai apa yang berubah (sebelum → sesudah). Halaman Settings → Log Aktivitas menampilkan semua log lintas modul dalam satu timeline yang bisa disaring berdasarkan event, jenis log (modul/data), pelaku, dan rentang tanggal.
Setiap fitur juga punya panel log aktivitasnya sendiri (tombol “Log Aktivitas” di halaman daftar atau detail). Panel itu memakai komponen dan format data yang sama, tetapi terbatas pada data fitur tersebut.
Hasil yang diharapkan: owner dan auditor bisa menelusuri perubahan apa pun tanpa bantuan tim teknis.
2. Problem
- Kesalahan data (harga, status, akses) sulit dilacak penyebabnya tanpa jejak perubahan.
- Owner perlu memastikan tidak ada perubahan yang tidak sah pada pengaturan penting.
- Satu aksi bisa mengubah beberapa data sekaligus; perubahan terkait perlu terlihat bersama.
3. Goals & Non-goals
Goals
- Semua perubahan bisa ditelusuri. Indikator: setiap log memuat pelaku, waktu, event, dan detail perubahan field.
- Log mudah disaring. Indikator: filter event, jenis log, pelaku, dan rentang tanggal.
- Perubahan berantai terlihat. Indikator: log turunan (batch) ditampilkan di bawah log induknya.
Non-goals
- Mengubah atau menghapus log dari UI
- Ekspor log (CSV/PDF)
- Notifikasi real-time berdasarkan log
4. User Scenarios
| Role | Scenario |
|---|---|
| Owner | Mencari siapa yang mengubah harga beli produk minggu lalu |
| Auditor | Menyaring semua perubahan yang dilakukan satu pengguna dalam rentang tanggal tertentu |
| Owner | Memeriksa perubahan peran dan hak akses setelah ada insiden |
| Admin | Membagikan tautan hasil filter log ke rekan (filter tersimpan di URL) |
5. User Flow
- Timeline — Log ditampilkan sesuai urutan dari BE, masing-masing menampilkan pelaku (nama dan avatar), pesan, jenis log, dan waktu (relatif maupun absolut).
- Filter — Panel filter di sisi halaman (drawer di layar kecil): event, jenis log, pelaku (pilihan dimuat dari BE), dan rentang tanggal. Filter disimpan di URL (
?filter=) sehingga bisa dibagikan dan bertahan saat reload. - Muat berikutnya — Tombol muat lebih banyak (berbasis cursor), disembunyikan bila tidak ada data lagi.
- Detail — Tabel perubahan field (nilai lama → nilai baru) dan akordeon “lihat perubahan terkait” untuk log batch.
Alternative paths
- Log per fitur — dibuka dari tombol “Log Aktivitas” di halaman fitur (daftar untuk semua data fitur, detail untuk satu data); filter: event, pelaku, rentang tanggal.
- Tidak ada hasil — tampil “Data tidak ditemukan”.
6. User Stories
Prioritas: P0 wajib untuk rilis, P1 penting, P2 kalau sempat.
US-01 — Melihat semua log aktivitas (P1)
Sebagai owner, saya ingin melihat semua perubahan data di tenant dalam satu tempat, agar mudah diaudit.
| ID | Kriteria penerimaan |
|---|---|
| AC-01.1 | Halaman hanya bisa dibuka pengguna dengan izin list log aktivitas; lainnya diarahkan ke unauthorized. |
| AC-01.2 | Setiap log menampilkan pelaku, pesan, jenis log, event, dan waktu. |
| AC-01.3 | Log dimuat bertahap lewat tombol muat lebih banyak; tombol disembunyikan bila data habis. |
| AC-01.4 | Perubahan field ditampilkan sebagai tabel nilai lama → nilai baru; nilai kosong ditandai sebagai tidak ada nilai. |
| AC-01.5 | Log yang punya log turunan menampilkan akordeon “lihat perubahan terkait”. |
US-02 — Menyaring log (P1)
Sebagai auditor, saya ingin menyaring log, agar cepat menemukan perubahan yang dicari.
| ID | Kriteria penerimaan |
|---|---|
| AC-02.1 | Filter event, jenis log, dan pelaku berupa pilihan multi yang dimuat dari BE. |
| AC-02.2 | Filter rentang tanggal: satu tanggal atau rentang; dikirim sebagai start_date dan end_date (yyyy-MM-dd). Satu tanggal berarti start_date = end_date. |
| AC-02.3 | Filter tersimpan di URL dan dipulihkan saat halaman dibuka ulang. |
| AC-02.4 | Filter bisa direset ke kosong. |
US-03 — Log per fitur (P1)
Sebagai admin, saya ingin melihat log langsung dari halaman fitur, agar tidak perlu menyaring manual.
| ID | Kriteria penerimaan |
|---|---|
| AC-03.1 | Tombol Log Aktivitas di halaman daftar menampilkan log semua data fitur; di halaman detail menampilkan log data tersebut saja. |
| AC-03.2 | Panel memakai format tampilan yang sama dengan halaman global, dengan filter event, pelaku, dan rentang tanggal. |
7. Document Structure
| Field | Required | Default | Notes |
|---|---|---|---|
id | — | — | |
log_name | — | — | Jenis log / modul data |
event | — | — | Misalnya created, updated, deleted |
name, message | — | — | Judul dan pesan yang ditampilkan |
actor | — | — | id, name, email, avatar_file |
subject | — | — | type dan id data yang berubah |
changes[] | — | — | field, old, new (primitif, objek, atau array) |
meta | — | — | ip_address, user_agent |
created_at, created_at_human | — | — | Waktu absolut dan relatif |
batch_logs[] | — | — | Log turunan dengan struktur yang sama |
Semua field read-only.
8. Status Lifecycle
Tidak berlaku. Log bersifat append-only dan tidak punya status.
9. Permissions & Actions
Permissions
| Action | Permission | Syarat tambahan |
|---|---|---|
| Lihat halaman log aktivitas global | settings:activity-log:list:any | — |
| Lihat panel log per fitur | Permission list/view fitur terkait | Mengikuti halaman tempat panel dibuka |
10. Business Rules
Aturan bisnis adalah ketentuan yang berlaku di semua layar dan semua aksi, siapa pun yang melakukannya. FE memakainya sebagai validasi di form, BE memakainya sebagai sumber kebenaran; jika keduanya berbeda, perilaku BE yang dianggap benar dan FE menyesuaikan.
- BR-01 Log bersifat append-only; tidak ada aksi ubah atau hapus log.
- BR-02 Log dibuat oleh BE; FE hanya membaca.
- BR-03 Perubahan yang terjadi dalam satu aksi dikelompokkan sebagai log induk dengan
batch_logs. - BR-04 Log dimuat berbasis cursor; urutan ditentukan BE.
- BR-05 Opsi filter (event, jenis log, pelaku) dimuat dari endpoint partial BE, bukan daftar tetap di FE.
11. Edge Cases
Edge case adalah kondisi yang jarang terjadi tetapi pasti muncul di operasional nyata. Perilaku yang diharapkan ditetapkan di sini agar tidak diputuskan sendiri-sendiri saat implementasi.
| ID | Case | Expected behavior |
|---|---|---|
| EC-01 | Pelaku sudah dihapus | Ditentukan BE; log tetap harus bisa ditampilkan |
| EC-02 | Nilai perubahan berupa objek atau array | Ditampilkan terstruktur, bukan teks mentah |
| EC-03 | URL berisi filter yang tidak valid | Filter kembali ke default kosong |
| EC-04 | Fitur tanpa log aktivitas | Peran & Izin dan Pengelola File belum punya panel log di UI |
12. API Contract
| Action | Method | Endpoint | Ref |
|---|---|---|---|
| Semua log (cursor, filter) | GET | /api/activity-logs/cursor | US-01, US-02 |
| Opsi filter event | GET | /api/activity-logs/partials/events/cursor | AC-02.1 |
| Opsi filter jenis log | GET | /api/activity-logs/partials/log-names/cursor | AC-02.1 |
| Opsi filter pelaku | GET | /api/activity-logs/partials/causers/cursor | AC-02.1 |
| Log per fitur (semua data) | GET | /api/<fitur>/activity-logs/cursor | US-03 |
| Log per data | GET | /api/<fitur>/:id/activity-logs/cursor | US-03 |
Parameter filter: event[], log_name[], causer_id[], start_date, end_date.
13. Dependencies
PRD terkait
- Semua fitur yang diaudit (Appearance, Company, Stores, Entities, Employees, Users, Purchase Order, dan lainnya).
- Users — pelaku log adalah pengguna.