Chapter 6 — System UI/UX: Antarmuka sebagai Penjaga CLoAK
6.0 Register Keputusan
Table
| Item |
Status |
Alasan / catatan |
| Handcrafted Navigation (Peta Menu BMP) |
Adopsi Penuh |
Navigasi bukan hasil konfigurasi runtime; dipetakan per role dengan CLoAK |
| Workspace User-Editable |
Tolak |
User tidak boleh mengubah sidebar; menghindari navigasi kabur & kebocoran menu |
| Landing Page Role-Based |
Adopsi Penuh |
Owner, Finance, Manufacturing, Sales, IT, Operator masing-masing punya pintu masuk berbeda |
| Form Layout BPM (Build-Process-Monitor) |
Adopsi |
Pola layout seragam: header → baris transaksi → footer aksi; mengurangi beban kognitif |
| List View dengan Saved Views |
Adopsi |
Filter & tata letak kolom bisa disimpan per user/role, tapi tidak mengubah schema |
| Global Search |
Adopsi |
Pencarian lintas doctype dengan hasil tersaring oleh permission user |
| Dashboard & Number Card |
Adaptasi |
Widget statis per role; tidak boleh menampilkan data sensitif cross-role |
| Mobile Responsive |
Adopsi |
UMKM mengandalkan HP di lapangan (gudang, produksi); tap target & input harus lapang |
| Dark Mode |
Tolak |
Fokus pada konsistensi visual & penghematan baterai tidak sebanding dengan biaya maintenance tema ganda |
| Print & PDF Output |
Adopsi |
Print Format terkontrol per role; dokumen sensitif tidak boleh diedit IT |
| Notifikasi Real-time |
Adopsi |
Toast, bell icon, dan notification log; prioritas: error > peringatan > info |
6.1 Filosofi Dasar: UI sebagai Perpanjangan CLoAK
Di BMP, antarmuka bukan sekadar "tampilan yang bagus". UI adalah mekanisme penegak keamanan terdepan — apa yang tidak dilihat user, tidak bisa dieksploitasi. Prinsip payung:
- Visibility by Permission: Setiap pixel di layar harus lulus pemeriksaan permission. Jika IT tidak punya permlevel 1, field rate, amount, dan valuation_rate tidak hanya disabled — mereka tidak dirender sama sekali di DOM.
- Navigasi sebagai Tembok: Sidebar menu tidak dibuat dinamis berdasarkan apa yang "user-friendly". Sidebar dibuat berdasarkan Role Matrix CLoAK — IT tidak akan pernah melihat menu "Manufacturing" atau "Accounting" di sidebarnya, meski mereka tahu URL-nya ada.
- Konsistensi Mengurangi Kesalahan: Satu pola layout, satu pola aksi, satu pola notifikasi di seluruh modul. Ketika user pindah dari Stock ke Accounting, mereka tidak perlu belajar ulang.
- UMKM-First, Not Enterprise-First: Tidak ada wizard berjalan 7 langkah, tidak ada konfigurasi layar yang memerlukan manual 20 halaman. Setiap layar harus bisa dipahami oleh user yang tidak pernah mengikuti training formal.
6.2 Navigasi & Information Architecture
6.2.1 Peta Menu BMP (Cloak)
Navigasi BMP mengikuti pola "Cloak" — menu yang terlihat tergantung siapa yang mengenakan jubah (role). Peta menu tidak dihasilkan dari Module Def runtime; ia adalah struktur statis yang didefinisikan di kode dan di-deploy bersama aplikasi.
Struktur Level Navigasi:
Table
| Level |
Elemen |
Perilaku |
| L0 |
App Bar |
Logo BMP + Global Search + Notification Bell + User Avatar. Selalu terlihat. |
| L1 |
Sidebar (Primary) |
Modul utama: Dashboard, Manufacturing, Stock, Buying, Selling, Accounting, Quality, HR, Settings. Tersaring per role. |
| L2 |
Sidebar (Secondary) |
Sub-menu per modul: mis. Manufacturing → BOM, Work Order, Production Plan. Tersaring per role + permission doctype. |
| L3 |
Workspace / Landing |
Halaman pembuka modul: shortcut, number card, chart. Tersaring per role. |
| L4 |
Daftar (List View) |
Tabel record dengan filter, sort, kolom. Tersaring oleh User Permission + Role Permission. |
| L5 |
Form |
Input/Edit record. Field tersaring oleh permlevel. |
Aturan CLoAK di Navigasi:
- Owner / Administrator: Lihat semua menu L1-L3.
- Finance / Accounts Manager: Lihat Accounting, Selling (read-only invoice), Buying (read-only PI). Tidak melihat Manufacturing menu.
- Manufacturing Manager / R&D: Lihat Manufacturing, Stock (RM, WIP, FG), Quality. Tidak melihat Accounting menu.
- Stock Manager / Gudang: Lihat Stock (terbatas), Buying (PR, DN). Tidak melihat BOM rate, Accounting, Selling harga.
- Sales Admin: Lihat Selling, Stock (FG read-only). Tidak melihat Manufacturing, Accounting detail.
- IT / System Manager: Lihat Settings, Users, Integrations, Build, Error Log, Background Job. Tidak melihat menu bisnis (Accounting, Manufacturing, Selling, Stock kecuali struktur master).
- Operator Produksi: Lihat Work Order (baca), Stock Entry (input), Batch. Tidak melihat menu lain.
Edge case:
- User dengan multi-role (mis. Finance + Manufacturing Manager) = union menu, tapi field tetap tersaring permlevel. User melihat kedua menu, tapi field sensitif di masing-masing tetap terlindungi.
- IT mengetahui URL langsung ke /app/bom = sistem menolak dengan pesan "Anda tidak memiliki akses ke dokumen ini" setelah pengecekan permission. Navigasi bukan satu-satunya garis pertahanan; permission doctype adalah garis terakhir.
- Menu yang di-hide tapi menjadi target workflow (mis. notifikasi approval) = notifikasi muncul di Bell Icon, tapi klik membuka form read-only atau approval dialog terbatas, bukan navigasi penuh ke modul.
6.3 Landing Page & Dashboard
6.3.1 Landing Page Role-Based
Setiap role memiliki satu halaman awal yang menjadi pintu masuk setelah login. Halaman ini bukan "home generik" — ia adalah cockpit tugas untuk role tersebut.
Table
| Role |
Landing Page |
Widget Utama |
| Owner |
Executive Dashboard |
P&L summary, Cash position, Outstanding AR/AP, BOM summary, Low stock alert |
| Finance |
Finance Cockpit |
Outstanding invoices, Bank reconciliation pending, Tax withholding summary, Budget variance |
| Manufacturing Mgr |
Production Dashboard |
Open Work Orders, BOM list, Quality inspection pending, Material availability |
| Stock Mgr |
Warehouse Dashboard |
Stock levels, Pending Stock Entry, Delivery Note to ship, Inventory aging |
| Sales Admin |
Sales Cockpit |
Open SO, DN to deliver, Overdue invoices, Customer PII-free activity |
| IT |
System Health |
Error Log count, Background Job queue, Scheduler status, User login activity |
| Operator Produksi |
My Tasks |
Assigned Work Orders, Stock Entry draft, Batch to process |
Perilaku kunci:
- Landing page tidak boleh menampilkan data sensitif cross-role. Contoh: IT melihat "System Health" dengan jumlah Error Log, tapi tidak melihat "Outstanding Sales Invoice" meski error log tersebut berasal dari modul Selling.
- Number Card dan Chart di landing page menggunakan query tersaring yang sama dengan list view — tidak ada bypass.
- Shortcut di landing page adalah deep link ke doctype yang diizinkan; shortcut yang mengarah ke doctype terlarang tidak dirender.
6.3.2 Dashboard Chart & Number Card
Dashboard chart adalah visualisasi read-only dari report yang sudah ada. Mereka tidak memiliki query sendiri; mereka adalah instance visual dari report yang tersaring.
Aturan BMP:
- Chart "Pendapatan Bulanan" hanya terlihat oleh Owner dan Finance.
- Chart "Produksi Harian" terlihat oleh Manufacturing Manager dan Owner.
- Chart "System Health" terlihat oleh IT.
- Tidak ada chart yang menampilkan data agregat lintas role — tidak ada "Overview Perusahaan" yang menampilkan BOM rate + Financial + Sales dalam satu layar.
6.4 Interaction Patterns & Aturan Interaksi
6.4.1 Pola Aksi Seragam (Universal Action Patterns)
Setiap form dan list di BMP mengikuti pola aksi yang identik. User tidak perlu menebak "di modul ini tombol save-nya di mana?"
Table
| Konteks |
Aksi Utama |
Posisi |
Warna |
Ikon |
| Form baru |
Simpan Draft |
Footer kanan |
Primary |
Save |
| Form draft |
Submit |
Footer kanan |
Success |
Check |
| Form submitted |
Cancel |
Footer kiri |
Danger |
X |
| Form cancelled |
Amend |
Footer kanan |
Warning |
Edit |
| List view |
Buat Baru |
Header kanan |
Primary |
Plus |
| List view (bulk) |
Bulk Action |
Toolbar atas |
Secondary |
— |
Aturan transisi status:
- Draft → Submit: validasi berjalan, GL/ledger ditulis, notifikasi terkirim.
- Submitted → Cancel: tidak ada hapus fisik. Cancel membuat baris pembalik (reverse entry) dengan jejak utuh.
- Cancelled → Amend: salinan baru dengan link ke dokumen asli; dokumen asli tetap terlihat.
6.4.2 Konfirmasi & Peringatan
BMP menggunakan tingkat intervensi yang berbeda untuk aksi berbeda:
Table
| Tingkat |
Pola |
Contoh |
| Silent |
Aksi langsung, tanpa dialog |
Simpan draft, Ubah filter, Pindah tab |
| Toast |
Konfirmasi singkat setelah aksi |
Submit berhasil, Cancel berhasil, Export dimulai |
| Dialog |
Konfirmasi eksplisit sebelum aksi |
Cancel dokumen, Hapus draft, Bulk update |
| Blocker |
Aksi ditolak dengan penjelasan |
Submit tanpa balance debit=kredit, Budget Stop, Permission denied |
Prinsip: Error dan peringatan harus actionable. Pesan "Permission denied" ditolak; yang diterima adalah "Anda tidak memiliki akses ke BOM rate. Hubungi Owner untuk permintaan akses."
6.4.3 Real-time & Kolaborasi
- Indicator "Sedang Diedit": Jika user A membuka form Sales Invoice, user B melihat indikator "Dibuka oleh A" di list view. Ini mencegah konflik save, bukan untuk kolaborasi real-time editing.
- Notification Bell: Notifikasi muncul untuk assignment (Workflow Action), approval request, dan error background job. Notifikasi tidak muncul untuk "data berhasil disimpan" — itu tugas toast.
- Auto-Save Draft: Form draft di-auto-save setiap 30 detik ke local storage. Jika browser crash, user dipulihkan ke draft terakhir.
6.5 Form Design & Data Entry
6.5.1 Layout Form: Pola BPM (Build-Process-Monitor)
Setiap form transaksi di BMP mengikuti pola BPM Layout yang sama, terinspirasi dari kebutuhan manufaktur tapi diuniversalkan:
plain
┌─────────────────────────────────────────┐
│ HEADER (Metadata Dokumen) │
│ No. Dokumen | Tanggal | Party | Status │
├─────────────────────────────────────────┤
│ BARIS TRANSAKSI (Child Table) │
│ Item | Qty | Rate* | Amount* | Warehouse │
├─────────────────────────────────────────┤
│ FOOTER (Total & Referensi) │
│ Total | Tax | Grand Total | Terms │
├─────────────────────────────────────────┤
│ TIMELINE & COMMENT (Kolaborasi) │
│ Komentar | Versi | Audit Log │
├─────────────────────────────────────────┤
│ ACTION BAR (Simpan | Submit | Cancel) │
└─────────────────────────────────────────┘
Catatan: Field bertanda * (rate, amount) di-set ke permlevel 1 — tersembunyi dari IT, Operator, dan Sales Admin.
6.5.2 Field-Level Security di UI
CLoAK diimplementasikan di UI pada tiga level:
- Hidden: Field tidak dirender sama sekali di DOM. Digunakan untuk field sensitif yang tidak relevan untuk role (mis. valuation_rate untuk Operator Produksi).
- Read-Only: Field dirender tapi tidak bisa diubah. Digunakan untuk field yang boleh dilihat tapi tidak boleh diedit role tersebut (mis. item_code di Work Order untuk Operator).
- Editable: Field bisa diubah. Default untuk field dalam kewenangan role.
Perilaku khusus Customize Form:
- IT boleh membuka Customize Form untuk melihat struktur field (nama, tipe, urutan).
- IT tidak boleh mengubah permlevel field. Perubahan permlevel memerlukan approval Owner.
- UI Customize Form menampilkan permlevel dalam mode read-only untuk IT, editable hanya untuk Owner.
6.5.3 Input Patterns
Table
| Pola |
Kapan Dipakai |
Contoh |
| Link Field + Search |
Referensi ke master data |
Customer, Supplier, Item, Warehouse |
| Dropdown (Select) |
Pilihan terbatas, statis |
Status, UOM, Priority |
| Date Picker |
Tanggal transaksi |
Posting Date, Due Date |
| Number (Formatted) |
Kuantitas, harga |
Qty (3 desimal), Rate (2 desimal) |
| Currency Toggle |
Multi-currency (terbatas) |
IDR default; USD hanya referensi di Purchase |
| Child Table Grid |
Baris transaksi |
Invoice Items, BOM Items, Stock Entry Detail |
| File Attachment |
Dokumen pendukung |
PO scan, Faktur Pajak, COA supplier |
Aturan validasi client-side:
- Format number mengikuti locale id-ID: titik ribuan, koma desimal.
- Tanggal tidak boleh lebih dari 1 hari ke depan tanpa approval (mencegah predating).
- Link field menampilkan hanya record yang diizinkan oleh User Permission — dropdown warehouse hanya menampilkan warehouse yang di-assign ke user.
6.6 List Views, Reports & Search
6.6.1 List View
List view adalah gerbang utama ke data. BMP menggunakan list view dengan prinsip:
- Kolom default minimal: Hanya kolom yang esensial untuk role tersebut. Tidak ada "tampilkan 20 kolom sekaligus".
- Saved Views: User boleh menyimpan filter, sort, dan pilihan kolom sebagai "View" pribadi. Saved views tidak mengubah default untuk user lain.
- Filter Builder: Filter di list view menggunakan field doctype yang sama dengan form — termasuk field custom dan dimensi akuntansi.
- Bulk Actions: Hanya untuk aksi yang aman secara permission. IT tidak melihat "Bulk Update" untuk field rate atau valuation_rate.
6.6.2 Global Search
Global Search (ikon kaca pembesar di App Bar) mencari lintas doctype dengan batasan:
- Hasil tersaring oleh Role Permission — user hanya melihat doctype yang mereka punya akses Read.
- Hasil tersaring oleh User Permission — user hanya melihat record dalam scope mereka (mis. warehouse tertentu).
- Ranking: Dokumen yang baru diakses user naik peringkat (personalized), tapi tidak mengaburkan hasil yang relevan secara textual.
6.6.3 Report & Query
Report di BMP mengikuti pola dari Framework Chapter 1 (Report Builder, Query, Script):
- Report Builder: User menyusun kolom dan filter tanpa kode. Hasil bisa di-export xlsx/csv.
- Query Report: SQL dengan parameter terbatas, ditulis oleh implementor.
- Script Report: Python execute(filters), ditulis oleh implementor.
Aturan CLoAK di Report:
- IT boleh membuat report teknis (Error Log summary, Background Job status).
- IT tidak boleh membuat report yang mengakses doctype sensitif (BOM, Invoice, GL Entry).
- Report untuk doctype sensitif hanya bisa dibuat oleh Owner/Finance/Manufacturing Manager sesuai domain.
- Setiap export report tercatat di Access Log (Framework Chapter 2).
6.7 Print & Output Experience
6.7.1 Print Format
Print Format adalah layout PDF yang dirender dari data dokumen. BMP menggunakan dua mesin render:
- Jinja Template: Layout tradisional dengan HTML/CSS, fleksibel untuk dokumen formal (Invoice, Faktur Pajak, Surat Jalan).
- Print Format Builder: Editor drag-drop untuk layout sederhana, menghasilkan JSON yang dirender oleh mesin yang sama.
Aturan CLoAK:
- IT boleh mengedit Print Format untuk dokumen operasional non-sensitif: Delivery Note, Stock Entry, Material Request.
- IT tidak boleh mengedit Print Format untuk dokumen sensitif: BOM, Sales Invoice, Purchase Invoice, Journal Entry.
- Print Format untuk dokumen sensitif di-restrict via Role Permission Manager.
6.7.2 Email & PDF Output
- Kirim Email dari Form: Tombol "Email" mengambil template dari Email Template (Framework Chapter 5) dan melampirkan PDF.
- Email Template untuk dokumen sensitif tidak boleh mengandung field rate, amount, atau valuation_rate. Template hanya boleh merujuk field non-sensitif (nomor dokumen, tanggal, nama item, qty).
- PDF Header: Setiap PDF resmi BMP memuat watermark/logo, nomor dokumen, dan footer "Dicetak dari BMP pada [timestamp] oleh [user]" — jejak audit fisik.
6.8 Mobile & Responsive Design
6.8.1 Mobile-First untuk Operator Lapangan
UMKM parfum tidak selalu memiliki workstation di setiap sudut gudang. Operator produksi dan staf gudang sering mengakses BMP dari HP.
Prinsip mobile:
- Tap target minimal 44×44 dp: Tombol aksi utama (Submit, Save) diletakkan di thumb zone.
- Form simplifikasi: Di layar <768px, child table ditampilkan sebagai card list (satu baris = satu card), bukan grid horizontal yang memerlukan scroll.
- Barcode/QR Scan: Input field untuk Item Code dan Batch No mendukung scan kamera HP — mengurangi kesalahan ketik di gudang.
- Offline Tolerance: Form draft bisa disimpan di local storage saat signal hilang, lalu disinkronkan saat koneksi kembali.
6.8.2 Responsive Breakpoints
Table
| Breakpoint |
Layout |
Catatan |
| < 640px |
Single column, sidebar jadi drawer |
Fokus pada input & aksi utama |
| 640–1024px |
Sidebar tetap, konten adaptable |
Tablet di meja kerja |
| > 1024px |
Sidebar expanded, multi-pane |
Desktop utama |
6.9 Accessibility & Localization
6.9.1 Aksesibilitas
BMP menargetkan WCAG 2.1 Level AA dengan prioritas:
- Kontras warna: Teks utama vs background minimal 4.5:1. Tidak menggunakan warna sebagai satu-satunya indikator status (ikon selalu mendampingi warna).
- Keyboard Navigation: Seluruh navigasi bisa dilakukan dengan keyboard (Tab, Enter, Escape). Shortcut kritis: Ctrl + / untuk search, Ctrl + S untuk simpan draft.
- Screen Reader: Semua field form memiliki label yang terhubung (<label for="...">), dan ikon memiliki aria-label.
6.9.2 Lokalisasi (Bahasa & Format)
- Bahasa default: Bahasa Indonesia (id). Tidak ada fallback ke Inggris yang membingungkan — semua label, error message, dan bantuan dalam Bahasa Indonesia yang baik.
- Format angka: 1.234.567,89 (titik ribuan, koma desimal) — sesuai konvensi Indonesia.
- Format tanggal: DD-MM-YYYY atau DD/MM/YYYY — tidak ada format MM/DD/YYYY yang rawan salah interpretasi.
- Zona waktu: Asia/Jakarta (WIB/WITA/WIT) — tidak ada ambiguitas UTC di tampilan user.
- Override label: Via Property Setter (Framework Chapter 1) atau lapisan terjemahan per instalasi — tidak mengubah kode sumber.
6.10 CLoAK di Level UI: Ringkasan Implementasi
Table
| Layer |
Mekanisme |
Ditegakkan Oleh |
| Navigasi |
Sidebar menu di-filter per role |
Role Permission + Workspace Restriction |
| Landing |
Dashboard widget di-filter per role |
Query tersaring di backend |
| Form |
Field hidden/read-only/editable via permlevel |
Customize Form + Role Permission Manager |
| List |
Kolom & filter tersaring |
List view query + User Permission |
| Search |
Hasil tersaring lintas doctype |
Role Permission + User Permission |
| Report |
Akses doctype dibatasi per role |
Role Permission Manager |
| Print |
Edit template dibatasi per doctype |
Role Permission pada Print Format |
| Export |
Akses export dibatasi + tercatat di Access Log |
Role Permission + Access Log hook |
| Notifikasi |
Isi notifikasi tidak mengandung data sensitif cross-role |
Notification template + permlevel filter |
6.11 Edge Case & Mitigasi
- Celah: User mengubah role sendiri di browser (client-side manipulation) untuk melihat menu tersembunyi. Mitigasi: Sidebar dirender dari server-side permission check; manipulasi DOM hanya mengubah tampilan, bukan akses data. API call tetap ditolak.
- Celah: User membuat bookmark ke URL form yang tidak boleh mereka akses. Mitigasi: Setiap API getdoc dan get_list menjalankan permission check server-side; URL tidak pernah menjadi bypass.
- Celah: Print Format yang sudah tidak dipakai masih mengandung field sensitif lama. Mitigasi: Audit Print Format berkala; sistem menolak render field yang permlevel-nya lebih tinggi dari role user.
- Celah: Mobile view menampilkan field sensitif karena layout berbeda dari desktop. Mitigasi: Permlevel check berjalan sebelum render, tidak peduli breakpoint atau device.
- Celah: Notifikasi email mengandung snapshot data sensitif karena template lupa di-update. Mitigasi: Review template email saat perubahan permlevel; unit test mengirim email dummy dan memverifikasi tidak ada field sensitif di body.
6.12 Kesimpulan
Chapter 6 menegaskan bahwa di BMP, UI bukan lapisan kosmetik — UI adalah penjaga CLoAK yang pertama dan terakhir. Setiap keputusan desain, dari warna tombol hingga struktur sidebar, harus lolos pertanyaan: "Apakah ini membuat data sensitif lebih sulit dibocorkan oleh orang yang tidak berwenang?"
Dengan navigasi handcrafted, layout seragam, field-level security via permlevel, dan audit trail di setiap output (print, email, export), BMP mencapai keseimbangan antara kegunaan (usability) dan keamanan (security) — dua hal yang sering dianggap saling bertentangan, tapi di BMP menjadi satu kesatuan arsitektur.
Catatan untuk reviewer: Chapter ini sengaja ditulis agresif dalam pembatasan (default deny) karena pengalaman menunjukkan bahwa "memberi akses dulu, membatasi kemudian" selalu meninggalkan celah. Lebih mudah membuka sedikit akses atas permintaan Owner daripada menutup akses yang sudah bocor.
Apakah ada bagian lain yang perlu diselaraskan terminologinya, atau Chapter 6 ini sudah siap untuk direview?