Panduan Developer
Dokumen ini untuk pengembang yang akan memelihara atau mengembangkan codebase talentasyskoo.
Stack Teknologi
| Layer | Teknologi |
|---|---|
| Framework | Next.js 16 (App Router) |
| UI | React 19, Tailwind CSS |
| Icons | Phosphor Icons |
| Database ORM | Prisma 5 |
| Auth | next-auth 4 (Credentials + JWT) |
| Charts | recharts |
| html2pdf.js, jspdf | |
| QR | react-qr-code, html5-qrcode |
| Payment | midtrans-client |
| Validasi | zod |
Penting: Baca
AGENTS.md— versi Next.js ini memiliki breaking changes dari versi yang umum diketahui. Dokumentasi internal ada dinode_modules/next/dist/docs/.
Struktur Folder
src/
├── app/
│ ├── (public)/ # Portal publik + panduan
│ ├── admin/ # Dashboard admin
│ ├── guru/ # Portal guru
│ ├── orangtua/ # Portal orang tua
│ ├── login/ # Halaman login
│ ├── ppdb/ # PPDB publik
│ └── api/
│ ├── auth/ # next-auth handler
│ ├── cron/ # Cron tagihan
│ └── webhooks/ # Midtrans webhook
├── components/
│ ├── admin/ # AdminSidebar, dll.
│ ├── guru/
│ ├── orangtua/
│ ├── public/
│ └── panduan/
└── lib/
├── auth.ts # next-auth config
├── prisma.ts # Prisma singleton
├── notifikasi.ts # Helper notifikasi
├── komunikasi.ts # Quiet hours
├── penjemputan.ts # JWT QR token
├── kantin.ts # Utilitas kantin
└── panduan.ts # Reader markdown panduan
prisma/
├── schema.prisma # Skema database
├── seed.ts # Seed utama (reset + orchestration)
├── seed-advanced.ts # Multi-kurikulum, kamus kosakata
├── seed-observasi-modules.ts # Observasi unified, intervensi, consent
├── seed-demo-features.ts # Pelatihan guru, media, inventaris
├── seed-extended.ts # Modul extended (RKAS, HRIS, dll.)
└── seed-keuangan.js
docs/
└── panduan/ # Sumber markdown user guide
Autentikasi & Otorisasi
Konfigurasi Auth
File: src/lib/auth.ts
- Provider: Credentials (email + password, bcrypt)
- Session strategy: JWT
- Callback menambahkan
roledanidke token/session
Middleware
File: src/middleware.ts
- Melindungi route
/admin,/guru,/orangtua - Redirect ke
/loginjika belum autentikasi - Validasi role — admin tidak bisa akses portal guru, dll.
Role
| Role | Enum Prisma |
|---|---|
| Admin | ADMIN |
| Guru | GURU |
| Orang Tua | ORANG_TUA |
Pola Pengembangan
Server Components (default)
Halaman di app/ umumnya Server Component — fetch data langsung via Prisma:
export default async function Page() {
const data = await prisma.siswa.findMany();
return <div>...</div>;
}
Client Components
Gunakan "use client" untuk interaktivitas (form state, chart, QR scanner):
*Client.tsx — suffix konvensi untuk client components
Server Actions
File actions.ts di sebelah page.tsx:
"use server";
import { revalidatePath } from "next/cache";
export async function simpanData(formData: FormData) {
// ... prisma mutation
revalidatePath("/admin/modul");
}
Validasi Form
Gunakan zod di server actions untuk validasi input (lihat src/app/admin/keuangan/pengaturan/actions.ts).
Model Prisma Kunci
| Model | Fungsi |
|---|---|
User | Akun semua peran |
Siswa | Data siswa, relasi orangTua, kelas, jenjang |
KategoriTagihan | Master biaya, jenjangId, auto-generate |
Tagihan | Tagihan per siswa |
Pembayaran | Transaksi Midtrans |
RencanaCicilan | Jadwal cicilan manual (JSON) |
PenilaianHarian | Skor BB/MB/BSH/BSB, indikatorPerkembanganId, konteksEnv, waktuKejadian |
IndikatorPerkembangan | Milestone TK/SD + aturan SPI trigger |
LampiranObservasi | Media bukti terhubung ke penilaian harian |
BankIntervensi | Paket solusi pedagogis per indikator |
Intervensi / PersetujuanIntervensi | Alur intervensi + consent (IP, device, versi) |
PelatihanModul / KuisPelatihan | LMS guru + kuis kalibrasi |
ProgressPelatihanGuru / SertifikasiGuru | Progress modul & sertifikat internal |
KurikulumMaster / KurikulumSekolah | Merdeka, Cambridge, IB-PYP per jenjang |
ElemenKurikulum | Elemen/TP; field stage, strand, temaTransdisipliner, learnerProfile |
KelasKurikulumTrack | Multi-track per kelas (UTAMA / PARALEL) |
KamusKosakata | Smart keywords observasi |
Rapor | Rapor TK (snapshot JSON, status DRAFT/FINAL) |
BankNarasi | Template narasi rapor |
Penjemputan | Log scan QR |
WaliPenjemput | Wali terdaftar |
TiketDelegasi | QR single-use delegasi |
SaldoKantin | Saldo virtual siswa |
TransaksiKantin | Transaksi POS |
PreOrderKantin | Pre-order dari ortu |
Feedback | Saran/masukan orang tua |
Faq | FAQ publik |
NewsletterSubscriber | Subscriber buletin |
Pengaturan | Key-value config per jenjang |
Modul Khusus — Referensi Kode
| Fitur | File utama |
|---|---|
| QR Penjemputan JWT | src/lib/penjemputan.ts |
| Scanner satpam | src/app/admin/satpam/scanner/ |
| Notifikasi tagihan | src/lib/notifikasi.ts |
| Quiet Hours | src/lib/komunikasi.ts |
| RKAS over-budget | src/app/admin/keuangan/rkas/ |
| Midtrans | src/lib/midtrans.ts, webhook route |
| Payroll | src/app/admin/hris/payroll/ |
| Panduan in-app | src/lib/panduan.ts, docs/panduan/ |
| Skor observasi BB/MB/BSH/BSB | src/lib/observasi-skor.ts |
| Kerangka form observasi | src/lib/observasi-kerangka.ts |
| Konteks observasi | src/lib/observasi-konteks.ts |
| Grafik tren ortu | src/lib/observasi-tren.ts |
| Trigger intervensi SPI | src/lib/intervention-trigger.ts |
| Progress pelatihan guru | src/lib/pelatihan-progress.ts |
| Terminologi multi-kurikulum | src/lib/kurikulum-terminologi.ts |
| Multi-track kelas | src/lib/multi-track.ts |
| Metadata consent ortu | src/lib/consent-metadata.ts |
Menambah Modul Baru
- Schema: Tambah model/field di
prisma/schema.prisma→npx prisma db push && npx prisma generate - Server actions: Buat
actions.tsdengan validasi zod - Page: Server component di
src/app/[portal]/[modul]/page.tsx - Client UI: Pisahkan ke
*Client.tsxjika perlu state - Sidebar: Tambah entry di
AdminSidebar.tsx/GuruSidebar.tsx/OrangTuaSidebar.tsx - Panduan: Update
docs/panduan/0X-*.mdyang relevan - Lint & typecheck:
npm run lint && npx tsc --noEmit
Testing Manual
npm run dev # Development
npm run build # Pastikan build sukses
npx tsc --noEmit # Type check
npm run lint # ESLint
Konvensi Styling
- Tailwind utility classes
- Portal Admin/Guru: sidebar gelap
#0c1a2e, aksen amber - Portal Orang Tua: aksen orange-rose gradient
- Portal Publik: slate + premium layout
- Komponen kartu:
rounded-2xl/3xl,border-slate-200,shadow-sm
Diagram Arsitektur Data
flowchart TB
subgraph client [Browser]
Public[Portal Publik]
Admin[Admin UI]
Guru[Guru UI]
Ortu[Ortu UI]
end
subgraph nextjs [Next.js App Router]
RSC[Server Components]
SA[Server Actions]
API[API Routes]
end
subgraph data [Data Layer]
Prisma[Prisma ORM]
DB[(Database)]
end
subgraph external [External]
Midtrans[Midtrans]
Cron[Cron Scheduler]
end
Public --> RSC
Admin --> RSC
Admin --> SA
Guru --> SA
Ortu --> SA
RSC --> Prisma
SA --> Prisma
API --> Prisma
Prisma --> DB
API --> Midtrans
Cron --> API