App Flow (FRD)
Functional Requirements Document — alur utama penggunaan aplikasi dari registrasi hingga analitik keuangan.
1. Registrasi & Login
Email / Password
Daftar akun
User mengisi nama, email, dan password. Sistem mengirim OTP ke email untuk verifikasi.
Verifikasi OTP
User memasukkan kode 6 digit yang dikirim ke email (berlaku 5 menit). Setelah valid, akun dibuat dan JWT token dikembalikan.
Login
User memasukkan email + password. Sistem memvalidasi credentials, lalu mengirim OTP. Setelah OTP diverifikasi, JWT token dikembalikan dan disimpan di cookie.
OAuth (Google / Facebook)
Klik Sign in with Google/Facebook
User diarahkan ke halaman OAuth provider.
Callback & upsert user
NextAuth menerima callback, mencari atau membuat user di database berdasarkan email.
Generate JWT
Sistem membuat JWT token internal, menyimpannya di session NextAuth.
Redirect ke /auth/oauth-callback
Frontend membaca session, menyimpan JWT ke cookie, lalu redirect ke dashboard.
2. Setup Rekening
Tambah rekening bank
User mendaftarkan rekening bank (provider, nomor rekening, nama). Satu nomor rekening hanya bisa didaftarkan sekali.
Tambah dompet digital
User mendaftarkan dompet digital (provider, nomor HP, nama akun).
Rekening aktif
Rekening yang aktif akan muncul sebagai pilihan saat upload e-statement dan di filter dashboard.
3. Upload E-Statement
Pilih rekening & file
User memilih rekening/dompet tujuan, lalu upload file CSV, XLSX, atau PDF (maks 10MB).
Cek duplikat
Sistem mengecek duplikat berdasarkan nama file dan hash konten file. Jika sudah ada, upload ditolak dengan kode DUPLICATE_FILENAME.
Simpan ke storage
File disimpan ke Vercel Blob. Record upload dibuat di database dengan status PENDING.
Parsing otomatis
Sistem mem-parsing file: deteksi kolom otomatis (tanggal, deskripsi, debit, kredit, saldo, referensi), konversi format tanggal, deteksi tipe transaksi (CREDIT/DEBIT).
Auto-kategorisasi
Setiap transaksi dicocokkan dengan keyword dari kategori yang sudah dibuat user. Transaksi yang cocok langsung dikategorikan.
Notifikasi
Setelah selesai, notifikasi dikirim ke user via SSE (Server-Sent Events) dengan ringkasan: total baris, parsed, failed, total credit/debit.
4. Dashboard & Analitik
Filter periode & rekening
User bisa filter berdasarkan tanggal, rekening spesifik (bank/wallet), dan kategori.
Metrik utama
Tampil: total income, total expense, net flow, total balance, jumlah transaksi — beserta persentase perubahan vs periode sebelumnya.
Cash flow trend
Grafik bar income vs expense. Granularitas otomatis: per hari (≤31 hari), per minggu (≤92 hari), per bulan (>92 hari).
Spending by category
Donut/bar chart pengeluaran dan pemasukan per kategori.
Transaksi terbaru
List transaksi terbaru dengan detail provider, kategori, dan status.
5. Manajemen Kategori
Buat kategori
User membuat kategori dengan nama dan kode unik (maks 5 karakter). Contoh: nama='Gaji Karyawan', kode='GAJI'.
Auto-assign
Setelah kategori dibuat, sistem otomatis mencari transaksi yang deskripsinya mengandung keyword dari nama kategori dan mengassign kategori tersebut.
Re-assign manual
User bisa trigger re-assign ulang semua transaksi tanpa kategori via POST /api/categories/reassign.
6. Laporan Keuangan
Pilih periode & filter
User memilih rentang tanggal, rekening, dan tipe sumber (bank/wallet).
Laporan pengeluaran
Trend pengeluaran, breakdown per kategori, breakdown per sumber rekening, perbandingan vs periode sebelumnya.
Laporan pemasukan
Sama seperti pengeluaran tapi untuk transaksi CREDIT.
Laporan periode
Laporan gabungan income + expense + net flow untuk periode tertentu.
7. Kalender Transaksi
Tampilan kalender bulanan
Setiap hari yang ada transaksi menampilkan ringkasan: total credit, total debit, jumlah transaksi.
Detail per hari
Klik hari untuk melihat list transaksi lengkap pada hari tersebut (via GET /api/calendar/[date]).
Timezone WIB
Semua tanggal dikonversi ke WIB (UTC+7) untuk pengelompokan yang akurat.
Middleware & Proteksi Route
Halaman Publik (tanpa login)
/auth/login/auth/register/auth/change-password/auth/oauth-callback/docs
API Publik (tanpa token)
/api/auth/login/api/auth/register/api/auth/send-otp/api/auth/verify-otp/api/auth/callback/*
Semua halaman lain redirect ke /auth/login jika tidak ada cookie token. Semua API lain wajib header Authorization: Bearer <token>.