Users (Pengguna)
| Code | SET-USR |
| Module | Settings |
| Type | Master data (akun & akses) |
| Status | Implemented |
| Priority | P0 — MVP |
| Process | Setup tenant |
| API | [URL Postman] |
1. Overview
Pengguna adalah akun yang bisa login ke tenant-dashboard. Setiap pengguna punya nama, email login, status aktif, dan satu atau lebih peran. Peran menentukan hak akses pengguna di seluruh aplikasi. Pengguna terhubung ke sebuah entitas, sehingga bila entitas yang sama juga seorang karyawan, pengguna itu bertindak sebagai karyawan tersebut, misalnya sebagai PIC Pesanan Pembelian.
Saat pengguna dibuat atau emailnya diubah, sistem mengirim email verifikasi. Pengguna harus memverifikasi email untuk mengaktifkan akun dan mendapatkan akses.
Hasil yang diharapkan: hanya orang yang berhak yang bisa masuk, dan setiap pengguna hanya bisa melakukan apa yang diizinkan perannya.
2. Problem
- Satu akun bersama untuk banyak orang membuat aktivitas tidak bisa ditelusuri.
- Tidak semua staf boleh mengakses semua modul, misalnya kasir tidak boleh mengubah pengaturan.
- Email yang salah ketik membuat pengguna tidak bisa masuk; email harus diverifikasi.
3. Goals & Non-goals
Goals
- Admin bisa membuat akun per orang dengan peran yang tepat. Indikator: setiap pengguna punya minimal satu peran.
- Email login terverifikasi. Indikator: pengguna baru dan perubahan email melalui verifikasi email.
- Akses bisa dicabut cepat. Indikator: pengguna bisa dinonaktifkan tanpa dihapus.
Non-goals
- Admin mengatur password pengguna
- SSO / login pihak ketiga, 2FA
- Hak akses per pengguna di luar peran
4. User Scenarios
| Role | Scenario |
|---|---|
| Owner | Membuat akun untuk kepala toko baru dengan peran “Kepala Toko” |
| Admin | Membuat akun untuk karyawan yang sudah terdaftar, tanpa mengetik ulang nama dan email |
| Admin | Mengganti email pengguna yang salah ketik; pengguna memverifikasi email baru |
| Owner | Menonaktifkan akun staf yang sudah keluar |
| Admin | Menambah peran “Purchasing” ke pengguna yang merangkap tugas |
5. User Flow
- Pilih sumber — Dialog muncul saat membuka Tambah Pengguna:
- Buat dari Awal: formulir kosong.
- Buat dari Entitas: tabel entitas yang belum punya akun pengguna. Nama pengguna dan email diisi otomatis dari entitas terpilih.
- Profil — Nama pengguna, email, dan status (Aktif / Tidak Aktif); semuanya wajib.
- Peran — Kartu peran dengan checkbox; setiap kartu menampilkan jumlah hak akses dan bisa diperluas untuk melihat serta mencari daftar hak aksesnya.
- Tinjauan — Ringkasan beserta error BE bila ada.
- Simpan — Dikirim bersama
verify_url(<origin>/auth/verify-email?token=). Bila sumbernya entitas, dikirim ke endpointby-partydenganparty_id. - Tersimpan — Toast sukses, kembali ke daftar pengguna. BE mengirim email verifikasi.
- Verifikasi — Pengguna membuka tautan di email; halaman
/auth/verify-emailmemverifikasi token lalu mengarahkan ke login. - Login — Email tampil dengan ikon terverifikasi di daftar pengguna.
Alternative paths
- Ubah email — Di mode ubah, tab Email menerima email baru. Setelah disimpan, sistem mengirim email verifikasi ke alamat baru.
- Tinggalkan wizard tanpa simpan — muncul konfirmasi perubahan belum disimpan.
- Hapus pengguna — hanya dari daftar (satuan atau massal), setelah konfirmasi.
6. User Stories
Prioritas: P0 wajib untuk rilis, P1 penting, P2 kalau sempat.
US-01 — Membuat pengguna dari awal (P0)
Sebagai owner, saya ingin membuat akun untuk staf, agar mereka bisa login dengan hak akses yang sesuai.
| ID | Kriteria penerimaan |
|---|---|
| AC-01.1 | Membuka Tambah Pengguna menampilkan dialog pilihan sumber; “Buat dari Awal” membuka wizard Profil → Peran → Tinjauan. |
| AC-01.2 | Nama pengguna wajib (maks 20 karakter), email wajib (format valid, maks 50 karakter), status wajib dipilih. |
| AC-01.3 | Minimal satu peran wajib dipilih. |
| AC-01.4 | Langkah Tinjauan menampilkan info bahwa email verifikasi akan dikirim setelah data disimpan. |
| AC-01.5 | Setelah berhasil, toast sukses tampil dan pengguna diarahkan ke daftar; BE mengirim email verifikasi. |
| AC-01.6 | Error BE (misalnya email sudah dipakai) tampil di langkah Tinjauan dan pada field terkait. |
US-02 — Membuat pengguna dari entitas (P1)
Sebagai admin, saya ingin membuat akun dari entitas yang sudah ada (misalnya karyawan), agar tidak terjadi duplikasi identitas.
| ID | Kriteria penerimaan |
|---|---|
| AC-02.1 | Tabel entitas hanya menampilkan entitas yang belum punya akun pengguna. |
| AC-02.2 | Setelah entitas dipilih dan klik Selanjutnya, nama dan email terisi dari entitas. |
| AC-02.3 | Data dikirim dengan party_id entitas terpilih. |
US-03 — Mengubah profil pengguna (P0)
Sebagai admin, saya ingin mengubah nama dan status pengguna, agar akses bisa diaktifkan atau dicabut.
| ID | Kriteria penerimaan |
|---|---|
| AC-03.1 | Tombol Ubah Data hanya tampil untuk pengguna dengan izin update. |
| AC-03.2 | Tab Profil menyimpan nama dan status; tombol simpan aktif hanya jika ada perubahan. |
US-04 — Mengubah email pengguna (P0)
Sebagai admin, saya ingin mengganti email login pengguna, agar pengguna yang salah email tetap bisa masuk.
| ID | Kriteria penerimaan |
|---|---|
| AC-04.1 | Tab Email hanya tampil di mode ubah. |
| AC-04.2 | Email baru wajib, format valid, maks 50 karakter. |
| AC-04.3 | Setelah disimpan, sistem mengirim email verifikasi ke alamat baru; info verifikasi ditampilkan di tab. |
US-05 — Mengubah peran pengguna (P0)
Sebagai owner, saya ingin menambah atau mencabut peran pengguna, agar hak aksesnya sesuai tugas.
| ID | Kriteria penerimaan |
|---|---|
| AC-05.1 | Tab Peran di mode lihat menampilkan peran pengguna; di mode ubah menampilkan semua peran dengan checkbox. |
| AC-05.2 | Minimal satu peran harus tetap terpilih. |
| AC-05.3 | Setiap kartu peran bisa diperluas untuk melihat dan mencari hak aksesnya. |
US-06 — Daftar dan filter pengguna (P0)
Sebagai owner, saya ingin melihat dan menyaring pengguna, agar mudah memeriksa siapa punya akses apa.
| ID | Kriteria penerimaan |
|---|---|
| AC-06.1 | Kolom: nama, email (dengan ikon terverifikasi), peran, sebagai karyawan, sebagai pemasok, status. |
| AC-06.2 | Pencarian kata kunci; filter lanjutan status dan peran; paginasi. |
| AC-06.3 | Aksi baris: Lihat, Ubah, Hapus sesuai izin; hapus massal dari baris terpilih. |
US-07 — Menghapus pengguna (P1)
Sebagai owner, saya ingin menghapus akun yang tidak diperlukan.
| ID | Kriteria penerimaan |
|---|---|
| AC-07.1 | Hapus satuan dan massal memerlukan konfirmasi dan izin delete. |
| AC-07.2 | Bila BE menolak, pesan error tampil sebagai toast. |
US-08 — Riwayat aktivitas (P2)
Sebagai auditor, saya ingin melihat log aktivitas pengguna.
| ID | Kriteria penerimaan |
|---|---|
| AC-08.1 | Log tersedia untuk semua pengguna (di daftar) dan per pengguna (di detail), dengan filter event, pelaku, dan rentang tanggal. |
7. Document Structure
Header (Profil)
| Field | Required | Default | Notes |
|---|---|---|---|
| Nama Pengguna | Ya | Dari entitas (jika sumber entitas) | Maks 20 karakter |
| Ya | Dari entitas (jika sumber entitas) | Format valid, maks 50 karakter; email login | |
Status (is_active) | Ya | Belum dipilih (buat) | Aktif / Tidak Aktif |
Email terverifikasi (email_verified_at) | Otomatis | — | Diisi setelah verifikasi |
| Avatar | — | — | Diatur pengguna sendiri, tidak diubah di sini |
Lines (Peran)
| Field | Required | Default | Notes |
|---|---|---|---|
Peran (role_ids) | Ya, minimal 1 | — | Array id peran |
8. Status Lifecycle
Pengguna punya dua status yang berdiri sendiri:
| Status | Label UI | Meaning | Editable | Next status |
|---|---|---|---|---|
is_active: true | Aktif | Akun boleh dipakai | Ya | Tidak Aktif |
is_active: false | Tidak Aktif | Akun dinonaktifkan | Ya | Aktif |
email_verified_at: null | — (tanpa ikon) | Email belum diverifikasi | — | Terverifikasi |
email_verified_at terisi | Ikon terverifikasi | Email sudah diverifikasi | — | Belum terverifikasi (saat email diubah) |
9. Permissions & Actions
Permissions
| Action | Permission | Syarat tambahan |
|---|---|---|
| Lihat daftar dan log semua pengguna | settings:user:list:any | — |
| Lihat detail pengguna | settings:user:view:any | — |
| Buat pengguna | settings:user:create:any | — |
| Ubah profil / email / peran | settings:user:update:any | — |
| Hapus pengguna | settings:user:delete:any | — |
FE menyembunyikan aksi yang tidak diizinkan; BE tetap menolaknya.
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 Email pengguna adalah identitas login dan harus unik (validasi BE).
- BR-02 Pengguna wajib memiliki minimal satu peran; hak akses efektif adalah gabungan hak akses semua perannya.
- BR-03 Pengguna baru dan perubahan email wajib melalui verifikasi email; tautan verifikasi dibentuk dari
url/verify_urlyang dikirim FE ditambah token dari BE. - BR-04 Satu entitas maksimal punya satu akun pengguna; membuat dari entitas hanya bisa memakai entitas yang belum punya akun.
- BR-05 Pengguna tidak aktif tidak boleh mengakses sistem (ditegakkan BE saat login/refresh).
- BR-06 Admin tidak mengatur password pengguna di halaman ini; cara pengguna baru mendapatkan password pertama ditentukan alur auth/BE.
- BR-07 Setiap perubahan dicatat di log aktivitas.
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 | Email sudah dipakai pengguna lain | Ditolak BE; error tampil pada field email |
| EC-02 | Pengguna tidak menerima email verifikasi | Belum ada tombol kirim ulang di halaman ini; admin bisa menyimpan ulang email, atau pengguna meminta kirim ulang dari alur auth |
| EC-03 | Admin mengubah email pengguna | Tautan verifikasi mengarah ke /auth/verify-email (alur verifikasi akun baru), berbeda dengan ubah email dari Akun Saya yang memakai /auth/change-verify-email; BE harus menerima token ini di endpoint yang benar |
| EC-04 | Admin menonaktifkan, menghapus, atau mencabut peran akunnya sendiri | FE tidak mencegah; BE harus menolak agar admin tidak mengunci dirinya sendiri |
| EC-05 | Menghapus peran terakhir yang memberi akses Settings ke semua admin | Ditentukan BE (lihat PRD Roles) |
| EC-06 | Nama pengguna lebih dari 20 karakter | Ditolak FE; pesan error saat ini menyebut “maks 50” dan perlu diselaraskan |
| EC-07 | Pengguna dinonaktifkan saat sedang login | Sesi berakhir saat token berikutnya diperbarui (ditentukan BE) |
12. API Contract
| Action | Method | Endpoint | Ref |
|---|---|---|---|
| Daftar pengguna (paginasi, cari, filter) | GET | /api/users/paginate | US-06 |
| Daftar pengguna (cursor) | GET | /api/users/cursor | — |
| Detail pengguna | GET | /api/users/:id | US-03 |
| Buat pengguna dari awal | POST | /api/users | US-01 |
| Buat pengguna dari entitas | POST | /api/users/by-party | US-02 |
| Ubah profil (nama, status) | PATCH | /api/users/:id | US-03 |
| Ubah peran | PATCH | /api/users/:id/roles | US-05 |
| Ubah email (kirim verifikasi) | POST | /api/users/:id/email/change | US-04 |
| Hapus pengguna | DELETE | /api/users/:id | US-07 |
| Hapus pengguna massal | DELETE | /api/users/bulk | US-07 |
| Log aktivitas semua pengguna | GET | /api/users/activity-logs/cursor | US-08 |
| Log aktivitas satu pengguna | GET | /api/users/:id/activity-logs/cursor | US-08 |
| Semua peran beserta hak akses | GET | /api/roles?is_with_permission=true | US-05 |
Entitas tanpa pengguna (filter: doesnt_have=user) | GET | /api/parties/paginate | US-02 |
| Verifikasi email (halaman auth) | POST | /api/auth/email/verify | BR-03 |
13. Dependencies
PRD terkait
- Roles & Permissions — peran dan hak akses pengguna.
- Entities — identitas pengguna dan sinkronisasi dengan karyawan/pemasok.
- Employees — pengguna yang terhubung ke karyawan bertindak sebagai karyawan di transaksi.
- Auth (login, verifikasi email, lupa/reset password) — di luar Settings.
- Activity Logs — sumber log aktivitas.
Efek ke modul lain
- Hak akses pengguna menentukan menu sidebar yang tampil dan aksi yang tersedia di semua modul.
- Pengguna adalah pelaku (actor) yang tercatat di semua log aktivitas.