Draft kerangka v0.1 Internal

PRD - ERP Internal Kantor

Kerangka platform all in one untuk operasional internal Nusa Tiga Putra. Semua modul bisnis dikembangkan sebagai aplikasi terpisah, terhubung ke satu database yang sama, dengan standar stack dan keamanan yang seragam.

Tidak ada hasil

Tidak ada bab yang cocok dengan kata kunci tersebut. Coba kata lain seperti “RBAC”, “MongoDB”, atau “Sub-program”.

Ringkasan #

Dokumen ini adalah skeleton PRD, bukan PRD fitur lengkap. Tujuannya mengunci fondasi supaya penambahan modul nanti tidak memicu rework arsitektur.

Cara membaca: Urutan bab mengikuti file sumber. Bab 1 menjelaskan mengapa platform ini ada, bab 2 sampai 6 mengunci teknis dan standar, bab 7 dan 8 mengunci mutu dan alur rilis, bab 9 jujur menyebut apa yang belum diputuskan.
  • Satu database MongoDB dipakai bersama semua modul
  • Tujuh folder shared di root, mirror 1:1 di /Dokumentasi
  • Dashboard gabungan sengaja ditunda sampai modul dasar solid

1. Tujuan #

1.1 Objektif

Membangun aplikasi kantor all in one untuk memenuhi kebutuhan operasional internal, bukan sekadar tools lepas. Satu platform yang menaungi seluruh proses kerja kantor, dari collection sampai project baru ke depan.

1.2 User profile dan role

Platform melayani 10 peran sebagai acuan awal RBAC dan SBAC di bab keamanan. Peran ini bukan daftar akhir, tapi titik mulai untuk desain akses.

RoleCatatan cakupan
DirekturAkses lintas modul, persetujuan strategis
HRDData kepegawaian, rekrutmen, penilaian
Manager UmumOperasional harian dan koordinasi
Tech Lead ITArsitektur, review, standar kode
ITPengembangan dan pemeliharaan
AdminAdministrasi dan entri data
IT SupportDukungan teknis dan operasional
Team LeaderKoordinasi tim collection
DeskcollEksekusi collection harian
Vendor / MitraAkses terbatas berbasis scope, bukan role penuh

1.3 Cakupan

Scope mencakup seluruh proses collection dan berpotensi menaungi project baru. Ada rencana multi tenant, tapi baru sebagai pertimbangan arsitektur, belum diimplementasi di fase awal.

Batasan tegas: Platform tidak menangani transaksi pembayaran real dari debitur. Peran platform di sisi collection murni reporting. Pembayaran tetap berjalan lewat mitra Bank atau fintech di luar sistem.

1.4 Success metrics fase 1

Fase 1 dianggap berhasil kalau dua hal ini terpenuhi.

Pertama, skeleton (fondasi arsitektur, security, struktur /Sub-program) fungsional. Kedua, skeleton bisa connect dan terintegrasi dengan program terpisah yang sudah ada sebelumnya, bukan mulai dari nol.

1.5 Kebutuhan fungsional

Belum didefinisikan. Masih fase 1, fokus ke fondasi bukan fitur. Akan disusun di iterasi PRD berikutnya begitu modul mulai ditentukan.

Prinsip fondasi #

Setiap modul bisnis dikembangkan sebagai aplikasi terpisah, tapi dengan tiga ikatan yang tidak boleh dilanggar:

  1. Semua modul connect ke satu database yang sama (shared MongoDB)
  2. Semua modul pakai stack, standar keamanan, dan standar kode yang sama
  3. Semua modul ditaruh sebagai sub folder di dalam satu folder induk /Sub-program

Prinsipnya, bangun fondasi yang kuat dan seragam dulu, supaya waktu modul ditambahkan satu per satu tidak ada rework arsitektur. Dashboard atau laporan gabungan dibangun paling akhir setelah modul dasar solid.

2. Tech stack #

LayerPilihan
FrontendReact + Vite
BackendNestJS
KomunikasiREST API
DatabaseMongoDB (NoSQL, shared single database untuk semua modul)
BahasaJavaScript (konsisten front dan back)

Karena NoSQL shared database, setiap modul wajib punya penamaan collection yang di namespace jelas (lihat bab keamanan §5.3) supaya tidak tabrakan schema antar modul.

3. Struktur folder #

Ini struktur root asli Z:\ERP NUSATIGAPUTRA, bukan skema hipotetis. Pola: 7 folder shared di root, dan /Dokumentasi mirror strukturnya 1:1. Sub-program belum dipecah per modul karena masih fase skeleton.

3.1 Batas pengerjaan per folder #

Setiap folder shared punya batas scope yang tegas. Modul di /Sub-program/<nama> tidak boleh membawa security, backend base, atau frontend base sendiri, semua import dari root.

FolderIsiBatas pengerjaan
/ApiKontrak API bersama, routing atau gateway, definisi endpoint umum, versioning, OpenAPI specHanya kontrak dan gateway lintas modul. Endpoint spesifik modul tetap di modul itu, bukan di sini.
/BackendLibrary NestJS bersama, base module, interceptor, guard umum, DTO atau util bersamaHanya kode yang dipakai minimal 2 modul. Logic bisnis spesifik modul tidak boleh masuk sini.
/DatabaseKoneksi MongoDB, schema atau model bersama, migration dan seedHanya schema dan koneksi tingkat platform. Collection spesifik modul didefinisikan di modulnya, tetap connect ke instance yang didefinisikan di sini.
/FrontendLibrary React + Vite bersama, termasuk komponen reusable (§4.2), theme, hook umumHanya UI kit dan util lintas modul. Halaman spesifik modul tetap di /Sub-program/<modul>.
/RedisKonfigurasi dan client caching bersamaHanya setup koneksi dan strategi cache umum (key naming, TTL default). Key spesifik fitur didefinisikan oleh modul yang pakai.
/SecurityRBAC, SBAC, enkripsi payload atau response, rate limit, fingerprinting, IP identifier (§5)Satu satunya sumber kebenaran untuk security. Modul tidak boleh implementasi ulang.
/Sub-programFolder induk modul bisnis, tiap modul adalah app terpisah yang mengonsumsi 6 folder sharedModul bisnis belum ditentukan. Tidak boleh dobel implementasi apa yang sudah ada di shared.
/DokumentasiMirror 1:1 dari 7 folder di atas, dokumentasi per layer atau modulWajib update setiap ada perubahan struktural di folder pasangannya. Murni dokumentasi, bukan tempat kode.

Aturan lintas folder

  • Semua modul connect ke instance MongoDB yang sama, didefinisikan di /Database
  • Dashboard atau laporan gabungan ditunda, belum ada folder khusus di tree final
  • Setiap penambahan atau perubahan di 7 folder root wajib disertai update dokumentasi pasangannya di /Dokumentasi/<nama-folder>

4. Kode dan komponen #

4.1 Batas ukuran file

Maksimal 300 baris per file modul. Jika service, controller, atau component mendekati limit, wajib dipecah (extract ke sub modul, sub service, atau hook terpisah), bukan dipaksa muat.

4.2 Reusable components

Struktur: /Sub-program/_shared/components/<NamaKomponen>/

FileFungsi
index.tsx atau .jsxImplementasi komponen
<Nama>.styles.tsStyling terpisah jika perlu
<Nama>.test.tsxUnit test komponen
README.md opsionalCara pakai props untuk komponen kompleks

Prinsip: 1 komponen sama dengan 1 folder sama dengan 1 file modul utama. Tombol, input, modal, table, semua reusable dari sini, tidak ada re implementasi lokal di masing masing modul.

4.3 Clean code

  • Ikuti aturan clean code standar: single responsibility per fungsi atau file, penamaan deskriptif, tanpa dead code, tanpa magic number
  • Untuk UI atau UX, wajib rujuk ANTISLOP.md dari repo miqdadbadjuber/anti-slop sebelum generate tampilan. File ini jadi filter kualitas desain (38 rules R-01 sampai R-38 plus Delivery Gate), bukan style guide, jadi tetap sesuai palet dan tema Apple style di §6
  • Setup: taruh ANTISLOP.md di /docs atau /.agent, lalu di AGENTS.md atau CLAUDE.md cukup taruh satu baris pointer, tidak perlu di inject ke semua sesi

5. Keamanan #

Berlaku di _shared/security dan dipakai semua modul. Didefinisikan satu kali sebagai middleware atau guard NestJS yang di reuse tiap modul backend, bukan diimplementasikan ulang per modul.

AspekImplementasi
Access controlRBAC plus SBAC berlapis. Role menentukan kelas akses, SBAC menentukan cakupan data spesifik (misal per departemen atau per cabang)
KriptografiEnkripsi payload request dan response, bukan cuma transport TLS, tapi payload level encryption
ObfuscationResponse dan error message tidak boleh bocorkan struktur internal (stack trace, nama field DB asli)
Behavioral detectionDeteksi pola akses anomali (request pattern tidak wajar, brute force pelan)
Rate limitingPer user dan per IP, di level gateway atau NestJS middleware
CachingLayer cache (misal Redis) untuk kurangi beban DB dan response time, dengan invalidasi yang jelas per collection
FingerprintingDevice atau browser fingerprint disimpan per sesi login, dipakai untuk deteksi session hijacking
IP identifierLogging dan binding IP per sesi, alert kalau sesi pindah IP drastis
Implikasi namespace: Karena shared single database, penamaan collection wajib di namespace jelas per modul untuk mencegah tabrakan schema. Contoh: hr_employees, coll_cases, bukan users generik yang dipakai dua modul.

6. Desain dan tema #

  • Font: clean sans serif terinspirasi gaya Apple (kandidat Inter, General Sans, atau Geist), bukan font Apple asli San Francisco yang berlisensi, tapi karakter serupa yaitu rounded, netral, mudah dibaca
  • Light mode: terang, whitespace lega, kontras lembut ala Apple standar
  • Dark mode: gelap pekat dengan aksen material seperti Apple Pro Display, bukan dark mode abu abu datar, ada depth atau elevation
  • Palet warna dan detail token akan didefinisikan di docs/design-system.md saat modul pertama mulai dibangun, skeleton ini belum masuk ke situ
  • Semua keputusan visual tetap difilter lewat ANTISLOP.md supaya tidak jatuh ke pola AI slop generik (gradien biru ungu template dan sejenisnya)
Catatan wiki ini: Wiki ini sendiri adalah implementasi tema tersebut dalam versi ekstrem monochrome yaitu hitam di atas putih untuk light dan putih di atas hitam untuk dark. Tanpa gradien dan tanpa warna aksen, kontras 21:1, tipografi menjadi pembeda utama. Keputusan ini ditulis eksplisit agar tidak dianggap sterile default tanpa alasan.

7. Testing dan dokumentasi #

  • Unit test wajib untuk tiap service atau component, bukan opsional, pakai test harness konsisten (misal Jest untuk backend NestJS dan frontend React)
  • Setiap modul punya /tests sendiri plus minimal 1 file README.md yang menjelaskan fungsi modul, cara jalanin lokal, endpoint utama, dependency ke _shared
  • Dokumentasi arsitektur global (ERD shared database, security policy, alur auth) ditaruh di /docs, di update tiap ada modul baru masuk

8. Repo dan environment strategy #

AspekAturan
Environment3 environment: Production, Staging, Develop. Masing masing branch atau pipeline terpisah, merge terkontrol (Develop ke Staging ke Production, tidak boleh commit langsung ke Production)
CredentialTidak boleh ada credential ke push. .env selalu di .gitignore, pakai .env.example sebagai template, plus secret scanning (pre commit hook atau CI check) supaya kredensial tidak lolos ke git history
Branch protectionTidak ada direct push ke main atau production, wajib lewat PR plus review, hindari conflict dengan strategi branching per modul (misal feature/<modul>/<task>)

9. Yang sengaja belum dibahas #

Dokumen skeleton jujur menyebut batasnya. Empat hal ini belum diputuskan dan tidak dibuat buat di dokumen ini.

  • Daftar modul bisnis final (HR, keuangan, dan sebagainya), menunggu ditentukan
  • Skema atau collection MongoDB per modul, baru didesain saat modul pertama digarap
  • Dashboard dan laporan gabungan
  • Detail token desain (warna, spacing scale)
Mengapa kosong lebih baik: Sesuai R-38, bagian kosong lebih baik daripada diisi klaim atau fitur fiktif. placeholder yang jujur mencegah rework.

10. Langkah selanjutnya #

  1. Setup /Sub-program/_shared dulu: security middleware (RBAC atau SBAC, encryption, rate limit, fingerprinting) plus komponen dasar (button, input, table, modal)
  2. Setup /infra: docker compose untuk MongoDB plus Redis (cache) plus env template
  3. Setup repo: branch protection, secret scanning, CI skeleton (lint plus test)
  4. Baru setelah fondasi ini jalan, mulai modul pertama sebagai proof of concept struktur

Dokumen sumber: PRD-ERP-Internal-Kantor-Skeleton.md versi 0.1. Wiki ini merender ulang konten tersebut menjadi format dokumentasi yang dapat dibaca di browser, dengan navigasi dan tema terang atau gelap tanpa mengubah isi PRD.

Wiki ini dibangun sebagai dokumentasi statis HTML, CSS, dan JS dasar tanpa framework. Sumber konten tetap PRD-ERP-Internal-Kantor-Skeleton.md. Perubahan struktur folder wajib di mirror di /Dokumentasi.
Dibuat untuk kebutuhan internal Nusa Tiga Putra. Tekan / untuk cari, Esc untuk tutup menu atau bersihkan pencarian.

Catatan desain - alasan satu baris per keputusan (R-31)

Warna hitam putih
Kontras maksimal 21:1, setia pada permintaan hitam di putih dan putih di hitam, tanpa palet tambahan yang mengganggu fokus baca
Tipografi Apple stack
Humanist rounded yang netral dan legibel, memenuhi PRD §6 yang minta inspirasi SF Pro tanpa melanggar lisensi
Layout wiki 3 kolom
Pola dokumentasi yang content driven, navigasi cepat ke 12 bab, bukan template marketing hero plus cards
Garis kiri 3px di h2
Motif identitas berulang yang memberi karakter tanpa dekorasi trend stacking
Radius 6 sampai 8px
Hanya untuk code dan kartu, bukan pill di semua elemen, menjaga hierarki radius sebagai alat bukan default
Tanpa bayangan atau glow
Hierarki dibangun dari weight dan whitespace, bukan elevasi semu yang ditumpuk di semua komponen
Tanpa gradien atau grid
Menghormati R-01 dan R-07, dekorasi hanya dipakai jika melayani hierarki, di wiki ini tidak diperlukan
Motion 120ms hover saja
Sesuai dial MOTION 1 untuk wiki yang dibaca, bukan ditonton, menghormati prefers reduced motion
Ritme RHYTHM 2
Variasi terukur antara paragraf, tabel, tree, dan callout inversi tunggal agar tidak monoton uniform
Aksen inversi satu kali
Blok Success Metrics dengan background terbalik sebagai satu momen aksen, tidak diulang di tempat lain

Delivery Gate diringkas: R-02 tanpa em dash, R-03 mobile drawer diuji, R-24 semua link punya tujuan, R-25 kontras 21:1, R-26 semua tombol berfungsi, R-32 navigasi keyboard dan focus visible, R-34 kedua tema berfungsi, R-37 direction dari PRD §6, R-38 tanpa konten fiktif.