App Flow (FRD)

Functional Requirements Document — alur utama penggunaan aplikasi dari registrasi hingga analitik keuangan.

1. Registrasi & Login

Email / Password

1

Daftar akun

User mengisi nama, email, dan password. Sistem mengirim OTP ke email untuk verifikasi.

2

Verifikasi OTP

User memasukkan kode 6 digit yang dikirim ke email (berlaku 5 menit). Setelah valid, akun dibuat dan JWT token dikembalikan.

3

Login

User memasukkan email + password. Sistem memvalidasi credentials, lalu mengirim OTP. Setelah OTP diverifikasi, JWT token dikembalikan dan disimpan di cookie.

OAuth (Google / Facebook)

1

Klik Sign in with Google/Facebook

User diarahkan ke halaman OAuth provider.

2

Callback & upsert user

NextAuth menerima callback, mencari atau membuat user di database berdasarkan email.

3

Generate JWT

Sistem membuat JWT token internal, menyimpannya di session NextAuth.

4

Redirect ke /auth/oauth-callback

Frontend membaca session, menyimpan JWT ke cookie, lalu redirect ke dashboard.

2. Setup Rekening

1

Tambah rekening bank

User mendaftarkan rekening bank (provider, nomor rekening, nama). Satu nomor rekening hanya bisa didaftarkan sekali.

2

Tambah dompet digital

User mendaftarkan dompet digital (provider, nomor HP, nama akun).

3

Rekening aktif

Rekening yang aktif akan muncul sebagai pilihan saat upload e-statement dan di filter dashboard.

3. Upload E-Statement

1

Pilih rekening & file

User memilih rekening/dompet tujuan, lalu upload file CSV, XLSX, atau PDF (maks 10MB).

2

Cek duplikat

Sistem mengecek duplikat berdasarkan nama file dan hash konten file. Jika sudah ada, upload ditolak dengan kode DUPLICATE_FILENAME.

3

Simpan ke storage

File disimpan ke Vercel Blob. Record upload dibuat di database dengan status PENDING.

4

Parsing otomatis

Sistem mem-parsing file: deteksi kolom otomatis (tanggal, deskripsi, debit, kredit, saldo, referensi), konversi format tanggal, deteksi tipe transaksi (CREDIT/DEBIT).

5

Auto-kategorisasi

Setiap transaksi dicocokkan dengan keyword dari kategori yang sudah dibuat user. Transaksi yang cocok langsung dikategorikan.

6

Notifikasi

Setelah selesai, notifikasi dikirim ke user via SSE (Server-Sent Events) dengan ringkasan: total baris, parsed, failed, total credit/debit.

4. Dashboard & Analitik

1

Filter periode & rekening

User bisa filter berdasarkan tanggal, rekening spesifik (bank/wallet), dan kategori.

2

Metrik utama

Tampil: total income, total expense, net flow, total balance, jumlah transaksi — beserta persentase perubahan vs periode sebelumnya.

3

Cash flow trend

Grafik bar income vs expense. Granularitas otomatis: per hari (≤31 hari), per minggu (≤92 hari), per bulan (>92 hari).

4

Spending by category

Donut/bar chart pengeluaran dan pemasukan per kategori.

5

Transaksi terbaru

List transaksi terbaru dengan detail provider, kategori, dan status.

5. Manajemen Kategori

1

Buat kategori

User membuat kategori dengan nama dan kode unik (maks 5 karakter). Contoh: nama='Gaji Karyawan', kode='GAJI'.

2

Auto-assign

Setelah kategori dibuat, sistem otomatis mencari transaksi yang deskripsinya mengandung keyword dari nama kategori dan mengassign kategori tersebut.

3

Re-assign manual

User bisa trigger re-assign ulang semua transaksi tanpa kategori via POST /api/categories/reassign.

6. Laporan Keuangan

1

Pilih periode & filter

User memilih rentang tanggal, rekening, dan tipe sumber (bank/wallet).

2

Laporan pengeluaran

Trend pengeluaran, breakdown per kategori, breakdown per sumber rekening, perbandingan vs periode sebelumnya.

3

Laporan pemasukan

Sama seperti pengeluaran tapi untuk transaksi CREDIT.

4

Laporan periode

Laporan gabungan income + expense + net flow untuk periode tertentu.

7. Kalender Transaksi

1

Tampilan kalender bulanan

Setiap hari yang ada transaksi menampilkan ringkasan: total credit, total debit, jumlah transaksi.

2

Detail per hari

Klik hari untuk melihat list transaksi lengkap pada hari tersebut (via GET /api/calendar/[date]).

3

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>.