9 · Cabang & Manajemen Akses
Atur siapa boleh melakukan apa (pengguna, peran, persetujuan) dan di cabang mana (profil, jam, shift).
1 Daftar pengguna
Menu Manajemen Akses → Pengguna (izin user:read). Tampil nama, email, role, status, dan login terakhir. Filter: Cari pengguna, Status (bawaan Aktif; pilihan Tidak aktif / Semua status), Role, Urutkan. Klik baris untuk melihat panel Akses terpilih dengan tombol Lihat audit dan Edit akses.
Kata kunci pencarian tidak disimpan di alamat halaman: kata kunci hilang saat halaman dimuat ulang dan tidak ikut terbawa saat tautan halaman dibagikan, sedangkan filter lain tetap tersimpan.
💡 Tersedia juga Template dan Pilih berkas untuk impor user dari CSV/XLSX; tidak didemokan di sini.
Daftar pengguna dengan panel Akses terpilih.
Menu aksi baris (titik tiga) berisi Ubah.
2 Menambah dan mengubah pengguna
Akun pengguna selalu ditautkan ke satu Karyawan, jadi buat dulu data karyawan di HRIS.
- Klik Tambah user (izin
user:create). - Isi Telepon (opsional), Nama depan (wajib), Nama belakang, dan Password awal (aturan password sama seperti Ganti password).
- Pada Role assignment centang minimal satu role; kartu ringkasan menampilkan jumlah izin efektif.
- Pada Karyawan tertaut klik Cari dan pilih karyawan dan pilih karyawannya (wajib: "Pilih karyawan yang ditautkan.").
- Klik Buat pengguna (atau Buat pengguna & buat lagi).
- Untuk mengubah: Edit akses atau menu baris Ubah; ubah email/telepon/nama/role/karyawan, lalu Simpan perubahan akses (izin
user:update, penetapan roleuser:assign_role).
⚠️ Mengubah email pengguna juga mengubah email Karyawan tertaut. Layar Pengguna tidak menyediakan tombol nonaktifkan atau reset password oleh admin; pengguna yang lupa password memakai Lupa kata sandi?.
💡 Galat umum: Nomor telepon user sudah digunakan. (kode USER_PHONE_EXISTS) bila telepon sudah dipakai akun lain; ganti nomornya. Email akun dibentuk otomatis dari karyawan terpilih (tampil di Email akun).
Daftar pencarian karyawan yang belum punya akun.
Memilih karyawan yang ditautkan lewat daftar pencarian.
Formulir Tambah pengguna: identitas dan role Frontliner dicentang.
Dialog Ubah akses pengguna.
3 Peran dan izin (Role): membuat peran baru dan mengatur izin
Untuk apa: peran adalah "paket izin" yang ditempelkan ke pengguna, misalnya Resepsionis hanya boleh melihat/mendaftarkan pasien dan membuat janji temu. Buat peran kustom bila 13 peran bawaan (tipe Peran sistem) tidak pas dengan pembagian kerja klinik Anda.
Menu Role (izin role:read) menampilkan daftar peran, jumlah izin, dan jumlah pengguna. Klik sebuah peran untuk membaca Rincian Izin per modul di panel kanan.
- Klik Tambah Peran (izin
role:create). - Isi Kode peran (huruf kecil, dipakai API dan audit; contoh
resepsionis_demo), Nama peran (tampil di layar; contoh Resepsionis Demo), dan Deskripsi. - Pada Matriks hak akses, centang izin yang dibutuhkan. Tiap izin menampilkan nama, penjelasan, dan kodenya (
patient:read, dst.). Contoh peran ini: Lihat Pasien, Tambah Pasien, Lihat Janji Temu, Buat Janji Temu. - Periksa kartu Izin dipilih dan Ringkasan dampak di bagian atas dialog (jumlah izin dan daftar nama izin).
- Klik Simpan Peran. (Simpan Peran & buat lagi menyimpan lalu mengosongkan formulir.)
- Untuk mengubah, pilih peran lalu klik Ubah Peran (izin
role:update), centang/lepas izin, dan simpan.
Setelahnya: peran baru muncul di daftar dengan tipe Peran kustom dan jumlah izinnya (di demo: 4 izin). Panel Rincian Izin mengelompokkan izin per modul.
Siapa yang boleh
Melihat peran: role:read. Membuat: role:create. Mengubah: role:update.
Aturan penting
Perubahan izin berlaku untuk semua pengguna berperan itu setelah disimpan. Hindari mengubah peran sistem bawaan; buat peran kustom.
⚠️ Izin yang berakhiran cross_branch ("Akses Lintas Cabang") tidak menambah hak baru, tetapi melepas batas cabang pada izin modul yang sama. Lihat bagian Cakupan cabang.
Daftar peran dengan jumlah izin dan pengguna.
Formulir Tambah Peran: identitas peran dan ringkasan dampak.
Matriks hak akses: Tambah Pasien, Lihat Pasien, dan Buat Janji Temu dicentang.
Peran Resepsionis Demo tersimpan sebagai Peran kustom dengan 4 izin.
Panel Rincian Izin untuk peran Frontliner.
4 Menugaskan peran ke pengguna
Untuk apa: peran baru belum berguna sampai dipasang ke akun seseorang. Satu pengguna boleh punya lebih dari satu peran; izin efektifnya gabungan semuanya.
- Buka Pengguna, klik Tambah user untuk akun baru, atau pilih pengguna lalu Edit akses untuk akun yang ada.
- Pada Role assignment centang peran, misalnya Resepsionis Demo (kartu menampilkan "Role custom · 4 izin"). Kartu ringkasan di atas dialog memperlihatkan Role dipilih dan Izin efektif.
- Simpan (Buat pengguna atau Simpan perubahan akses). Izin penetapan peran:
user:assign_role.
Cara memeriksa: di daftar Role, kolom Pengguna peran itu bertambah; di panel Akses terpilih pengguna tampil peran barunya. Pengguna perlu login ulang agar menu barunya muncul.
Role Resepsionis Demo dicentang: kartu Izin efektif menunjukkan 4.
5 Daftar dan detail cabang
Untuk apa: melihat semua klinik dalam satu layar, siapa yang bekerja di sana, dan apakah cabang siap beroperasi. Menu Cabang (izin branch:read).
- Kartu ringkasan: Cabang tampil, Aktif, Setup / nonaktif, dan jumlah Dental chair.
- Filter: Pencarian (kode, nama, alamat, telepon), Kota, Status (Semua/Aktif/Setup/Nonaktif), Tipe (Semua tipe/Kantor pusat/Cabang klinik), dan Urutkan.
- Tiap baris menampilkan kontak, lingkup (jumlah dental chair, shift, staf), dan status. Klik baris untuk panel Konteks cabang dengan tombol Lihat detail dan Edit cabang.
Halaman detail berisi: ringkasan status, Profil cabang, Istirahat operasional, Shift operasional, Karyawan & mitra (tab Semua/Karyawan/Mitra, pencarian, urutan, Tampilkan nonaktif), panel Scope klinis (jumlah dental chair dan mapping unit), dan Kontrol status.
Daftar cabang: cabang baru KD2 berstatus Setup, dengan panel Konteks cabang.
Detail cabang: profil, scope klinis, dan kontrol status.
Bagian Karyawan & mitra pada detail cabang.
6 Menambah cabang baru
Untuk apa: mendaftarkan klinik baru. Cabang baru selalu berstatus Setup sampai Anda mengaktifkannya. Contoh di bawah: Klinik Demo Cabang Dua (KD2), Bandung.
- Klik Tambah cabang (izin
branch:create). - Identitas dan kontak: Kode cabang (maks. 20 karakter), Nama cabang, Kota, Telepon, Email, Nomor WA Cabang (tercetak di kop struk dan invoice), dan opsi Tandai sebagai kantor pusat.
- Alamat dan koordinat: Alamat lengkap, Latitude, Longitude, Foto cabang (opsional, tampil di widget reservasi), Radius GPS presensi (meter) (bawaan 50) untuk validasi Clock In/Clock Out, dan Target BMHP (% omzet) (kosong berarti 7%).
- Jam operasional klinik: per hari isi jam buka dan tutup; centang Tutup untuk hari libur (semua hari awalnya Tutup, jadi hilangkan centang pada hari buka). Tombol Copy ke semua jadwal menyalin satu hari ke hari lain.
- Istirahat operasional (opsional): Tambah istirahat atau pilih contoh Bandung / Karawang atau Bekasi / Depok.
- Shift cabang: satu shift awal (Full-day, FD) sudah tersedia; ubah nama, kode, jam, dan Hari kerja serta Hari libur (lihat langkah Shift). Tambah shift menambah shift lain.
- Mapping dental chair: isi Jumlah dental chair; untuk tiap unit pilih posisi yang boleh memakainya (Dokter Gigi dan/atau TGM) dan beri Nama unit bila perlu.
- Klik Simpan cabang (atau Simpan cabang & buat lagi).
Setelahnya: cabang muncul di daftar dengan status Setup. Cabang baru belum bisa dipakai operasional sampai diaktifkan.
⚠️ Pesan galat yang muncul bila shift belum lengkap: Hari kerja shift wajib dinyatakan. dan Hari libur shift wajib dinyatakan. Tandai "tidak ada hari libur" bila shift ini memang tidak punya. Isi hari pada shift atau centang Tidak ada hari libur.
Formulir Tambah Cabang: identitas dan kontak.
Alamat, koordinat, dan kebijakan absensi.
Jam operasional per hari; Senin sampai Sabtu dibuka, Minggu Tutup.
Mapping dental chair dan nama unit.
Shift cabang dengan hari kerja dan hari libur terisi.
7 Mengubah cabang, kursi, mengaktifkan dan menonaktifkan
Untuk apa: memperbarui data cabang, menambah kursi (dental chair), lalu membuka atau menutup cabang untuk operasional.
- Di detail cabang klik Edit (atau Edit profil; izin
branch:update). Dialog Edit Cabang berisi bagian yang sama dengan formulir tambah. - Kursi: ubah Jumlah dental chair, misalnya dari 2 menjadi 3. Kartu Unit baru muncul; centang posisi (Dokter Gigi/TGM) dan isi nama unit, contoh Unit C. Ringkasan di bawah menunjukkan "3 dental chair (3 Dokter Gigi / 0 TGM)".
- Istirahat: klik contoh Bandung / Karawang untuk mengisi Istirahat siang dan sore (30 menit).
- Klik Simpan cabang. Detail cabang menampilkan jumlah dental chair baru, mapping unit, dan istirahat.
- Mengaktifkan: klik Aktifkan (atau Aktifkan cabang pada Kontrol status). Status berubah ke Aktif seketika, tanpa dialog konfirmasi (izin
branch:status_write). - Menonaktifkan: klik Nonaktifkan. Status menjadi Nonaktif seketika. Aktifkan lagi kapan saja dengan tombol yang sama.
Siapa yang boleh
Membuat branch:create, mengubah branch:update, mengganti status branch:status_write.
Aturan penting
Menonaktifkan tidak menghapus data; riwayat tetap ada. Mengubah kode cabang meminta konfirmasi lebih dulu.
💡 Pemeriksaan: setelah cabang Aktif, ia muncul di pemilih Cabang pada bilah atas milik pengguna yang berhak (lihat Cakupan cabang).
Edit Cabang: jumlah dental chair menjadi 3 dan Unit C ditambahkan.
Cabang berstatus Aktif; tombol berganti menjadi Nonaktifkan.
Setelah Nonaktifkan: status Nonaktif, 3 dental chair, dua istirahat operasional, dan tombol Aktifkan.
8 Shift cabang
Untuk apa: menentukan jam kerja yang bisa dipilih saat menyusun jadwal staf. Di detail cabang, Shift operasional menampilkan nama, kode, asal (Cabang), jam, istirahat, hari kerja/libur, jumlah staf, dan status.
- Klik Tambah shift.
- Isi Nama shift, Kode shift (wajib), dan Urutan. Contoh: Shift Sore, kode SR, urutan 2.
- Isi Jam shift (Mulai/Selesai) dan Jam istirahat (Mulai/Selesai), mis. 13.00-21.00 dengan istirahat 17.00-18.00.
- Klik hari pada Hari kerja (Sen-Min) dan Hari libur; atau centang Tidak ada hari libur. Kotak Aktif mengatur status.
- Klik Simpan shift (atau Simpan shift & buat lagi).
Setelahnya: shift tampil di tabel dan kartu Shift aktif bertambah (di contoh dari 1 menjadi 2).
Dialog Tambah shift: Shift Sore, Senin sampai Sabtu kerja, Minggu libur.
9 Cakupan cabang dan akses lintas cabang
Untuk apa: pengguna biasa hanya melihat data cabang tempat ia bekerja. Pemilik atau manajer area yang perlu melihat banyak cabang diberi izin "Akses Lintas Cabang".
- Setiap modul punya izin sendiri berkode
<modul>:cross_branch, misalnya Akses Lintas Cabang: Pasien (patient:cross_branch) atau Akses Lintas Cabang: Laporan. Izin ini hanya memperluas jangkauan izin modul yang sudah dipegang, tidak memberi hak baru. - Tanpa izin lintas cabang, data dibatasi ke cabang aktif yang dipilih di pemilih Cabang pada bilah atas. Aksi tulis dalam konteks cabang memakai cabang aktif itu.
- Peran Direktur memegang seluruh izin (224) termasuk semua izin lintas cabang.
Contoh nyata di demo: Dewi Anggraini (peran Resepsionis Demo, tanpa izin lintas cabang) membuka pemilih Cabang dan hanya melihat Klinik Demo Tumbuh. Berandanya menampilkan 3 modul (Presensi, Operasional, Pengaturan). Direktur, yang memegang semua izin lintas cabang, melihat tiga cabang (Klinik Demo Cabang Dua, Kantor Pusat Demo, Klinik Demo Tumbuh) dan 9 modul. Bila Dewi membuka halaman di luar izinnya, misalnya Role, muncul pesan Akses dibatasi dengan kode izin yang dibutuhkan (role:read).
Direktur: pemilih Cabang menampilkan semua cabang.
Dewi (Resepsionis Demo): hanya satu cabang dan 3 modul.
Halaman di luar izin: Akses dibatasi, Kode hak akses role:read.
Izin Akses Lintas Cabang: Pasien di matriks hak akses.
10 Kredensial Agent (AI Agent / MCP)
Untuk apa: memberi program AI (misalnya bot WhatsApp penjadwal) kunci akses terbatas ke ERP lewat MCP, tanpa memakai akun orang. Menu Pengaturan → Kredensial Agent (izin agent:read).
Di halaman ini ada Saklar akses agent (Matikan seluruh akses menghentikan semua agent sekaligus), Akses per cabang (tombol Matikan per cabang), dan tabel Kredensial diterbitkan (nama, prefiks, jumlah permission, cabang, masa berlaku, pemakaian 24 jam, status).
- Klik Terbitkan Kredensial.
- Isi Nama agent (wajib) dan Keterangan (opsional).
- Pilih Cabang yang boleh diakses (wajib; agent hanya menyentuh cabang itu) dan Masa berlaku (30, 90, 180, atau 365 hari).
- Pada Permission centang kewenangan per modul (atau Pilih semua per modul). Kewenangan bertanda Sulit dibalik (pembatalan bernilai uang, rekam klinis, payroll, tata kelola akses) berikan hanya bila benar-benar perlu.
- Klik Terbitkan. Dialog Simpan rahasia ini sekarang menampilkan rahasia berawalan
tmbh_agt_dan contoh perintah untuk Claude Code, Cursor, Claude Desktop, atau cURL. Klik Salin rahasia, simpan di pengelola rahasia, lalu Selesai.
⚠️ Rahasia hanya tampil sekali dan tidak bisa dilihat lagi. Cabang dan kewenangan terkunci sejak diterbitkan: untuk menambah kewenangan, cabut lalu terbitkan ulang. Layar rahasia tidak disertakan sebagai gambar di panduan ini.
Mengelola: klik nama kredensial untuk Detail: cabang, permission, Panduan MCP, Pemakaian (60 menit dan 24 jam terakhir), Batas kuota (Ubah batas kuota), Pemanggilan terakhir, dan Riwayat tindakan. Menu titik tiga di baris berisi Jeda (berhenti sementara; bisa Lanjutkan) dan Cabut (permanen, konfirmasi Ya, cabut). Agent yang dijeda menerima galat 403 AGENT_CREDENTIAL_SUSPENDED.
Demonstrasi: pada kredensial uji, Jeda mengubah status menjadi Dijeda; Lanjutkan mengaktifkannya lagi. Cabut membuka dialog Cabut kredensial? ("akan berhenti bekerja seketika... tidak dapat dibatalkan"); setelah Ya, cabut status menjadi Dicabut dan menu baris tidak lagi menyediakan aksi.
Status Dijeda; hitungan berjalan menjadi 1 dari 2.
Dialog konfirmasi Cabut kredensial.
Status Dicabut.
Saklar akses agent dan daftar kredensial.
Formulir Terbitkan Kredensial Agent: nama, cabang, masa berlaku.
Permission per modul; Janji Temu terpilih 4/4.
Detail kredensial: permission dan Panduan MCP.
Menu baris: Jeda dan Cabut.
11 Jejak audit
Untuk apa: melihat siapa mengubah apa, kapan, dan dari nilai apa ke nilai apa; berguna saat ada selisih data atau perubahan akses yang mencurigakan.
- Pengaturan → Audit Trail (izin
audit:read): filter Modul, Jenis pelaku (Manusia, Mesin/kredensial agent, Sistem), Aksi, ID atau nomor entitas, Dari/Sampai tanggal, Urutkan, dan Hanya aksi lintas cabang. Kolom: Waktu, Pelaku, Modul, Aksi, Entitas, Cabang, Asal, Perubahan. - Log Audit (
/settings/audit): khusus perubahan konfigurasi, dengan filter kunci, lingkup, dan tanggal; menampilkan nilai lama dan baru. - Exports: riwayat siapa mengunduh data apa; kosong sampai ada ekspor.
- Dari Pengguna, tombol Lihat audit membuka riwayat satu pengguna.
⚠️ Isi audit memuat data pribadi lintas modul; berikan audit:read hanya pada peran yang memerlukan.
Jejak Audit: login dan perubahan tercatat dengan pelaku, cabang, dan perubahan nilai.
Log Audit konfigurasi.
Riwayat Ekspor.
12 Persetujuan (approval)
Menu Persetujuan (izin approval:read) berisi permintaan yang menunggu keputusan Anda. Filter Status (Menunggu, Disetujui, Ditolak, Semua status) dan Tipe (Role / akses, Finance, Clinical, Inventory).
- Klik sebuah permintaan untuk melihat konteks, lalu buka halamannya (Detail approval).
- Isi Catatan persetujuan lalu klik Setujui approval, atau isi Alasan penolakan lalu klik Tolak approval.
- Bila berwenang, Delegasikan keputusan: isi User ID tujuan dan Alasan delegasi. Riwayat approval mencatat setiap langkah.
💡 Contoh nyata di demo: dua permintaan refund dari modul Tagihan (pengembalian dana ke pasien) ditangani sebagai berikut.
Menyetujui: buka permintaan, isi Catatan persetujuan (opsional, tercatat di audit), klik Setujui approval. Status menjadi Disetujui, kolom Respons berisi catatan, dan Riwayat approval menambah baris approved.
Menolak: isi Alasan penolakan (wajib; tombol Tolak approval baru aktif setelah diisi), lalu klik tombolnya. Status menjadi Ditolak dan riwayat menambah baris rejected.
Mendelegasikan: klik Delegasikan keputusan, isi User ID tujuan (approver pengganti) dan Alasan delegasi, lalu Konfirmasi delegasi; Batal delegasi menutup formulir. Formulir delegasi sudah diperagakan, tetapi pengiriman delegasi tidak dijalankan.
⚠️ Keputusan tidak bisa diubah setelah disetujui atau ditolak: panel Keputusan hanya aktif untuk status Menunggu.
Halaman Detail approval: konteks, Riwayat approval, dan panel Keputusan (Catatan persetujuan, Setujui approval, Alasan penolakan, Tolak approval, Delegasikan keputusan). Tombol Tolak baru aktif setelah alasan diisi.
Refund INV-20261003-001 Disetujui dengan catatan; riwayat mencatat approved.
Formulir Delegasi approval: User ID tujuan dan Alasan delegasi.
Refund INV-20261003-010 Ditolak dengan alasan; riwayat mencatat rejected.
Daftar persetujuan dengan panel Konteks terpilih.