Manajemen Keuangan & Penagihan
Modul Manajemen Keuangan & Penagihan mengelola seluruh aspek finansial sistem TrueDignity, termasuk pencatatan transaksi keuangan, pengelolaan pengeluaran (tetap atau berulang), tracking pengeluaran per permohonan, dan pembuatan laporan keuangan untuk analisis bisnis.
Spesifikasi Perilaku & Alur
Skenario 6.1: Lihat Tabel Transaksi
Skenario ini menampilkan daftar lengkap semua transaksi keuangan kantor.
| Aktor | Officer & Sistem |
|---|---|
| Rincian | Given officer memiliki izin akses KEUANGAN, When officer membuka menu keuangan di /keuangan, Then sistem menampilkan tabel transaksi keuangan dengan kolom: tanggal, deskripsi, jumlah, jenis (pemasukan/pengeluaran), dan keterangan. |
Fitur Tabel Transaksi:
- Kolom yang ditampilkan: tanggal, deskripsi/nama transaksi, jumlah, jenis (pemasukan/pengeluaran), keterangan, action (Edit/Hapus)
- Sorting: bisa diurutkan by tanggal (newest first), jumlah, atau jenis
- Search: pencarian by deskripsi atau keterangan
- Pagination: support untuk data besar (page size: 10, 25, 50)
- Filtering: filter by jenis (Pemasukan/Pengeluaran), periode tanggal
- Export: quick export ke CSV untuk setiap view
Skenario 6.2: Lihat Pengeluaran dari Permohonan
Skenario ini menampilkan detail pengeluaran yang terkait dengan permohonan spesifik.
| Aktor | Officer & Sistem |
|---|---|
| Rincian | Given officer berada di menu keuangan, When officer memilih salah satu permohonan dari dropdown daftar permohonan, Then sistem menampilkan detail pengeluaran yang terkait dengan permohonan tersebut, termasuk: biaya layanan default, biaya tugas, biaya tambahan, dan total keseluruhan. |
Detail Pengeluaran per Permohonan:
- Dropdown Permohonan: list semua permohonan dengan nomor dan nama pemohon
- Breakdown Pengeluaran:
- Biaya Layanan Default (dari layanan yang dipilih)
- Biaya per Tugas (breakdown by task)
- Biaya Tambahan (optional, jika ada)
- Total Pengeluaran
- Status Pembayaran: indicator pembayaran (lunas/belum lunas/sebagian)
- Tanggal Jatuh Tempo: menampilkan deadline pembayaran
Skenario 6.3: Lihat Daftar Pengeluaran Berulang dan Terjadwal
Skenario ini menampilkan pengeluaran yang berulang secara otomatis dengan jadwal tertentu.
| Aktor | Officer & Sistem |
|---|---|
| Rincian | Given officer berada di menu keuangan, When officer membuka tab "Pengeluaran Berulang", Then sistem menampilkan daftar pengeluaran yang berulang dan terjadwal, termasuk informasi: deskripsi, jumlah, frekuensi (harian/mingguan/bulanan/tahunan), tanggal jatuh tempo berikutnya, dan status (aktif/tidak aktif). |
Fitur Pengeluaran Berulang:
- Kolom: deskripsi, jumlah, frekuensi, tanggal mulai, tanggal jatuh tempo berikutnya, status (aktif/paused)
- Frekuensi: harian, mingguan, bulanan, tahunan
- Estimasi: menampilkan perkiraan pengeluaran dalam satu periode (bulan/tahun)
- Status: indicator apakah pengeluaran berulang aktif atau paused
- Action: Tambah, Edit, Hapus, Pause/Resume
Skenario 6.4: Hapus Pengeluaran dari Tabel Transaksi
Skenario ini menunjukkan proses penghapusan transaksi dari tabel.
| Aktor | Officer & Sistem |
|---|---|
| Rincian | Given officer sedang melihat tabel transaksi, When officer menekan tombol hapus pada salah satu transaksi dan mengonfirmasi penghapusan melalui modal, Then sistem menghapus transaksi tersebut dari tabel transaksi dan update totals otomatis. |
Workflow Penghapusan:
- Officer klik tombol "Hapus" pada salah satu row transaksi
- Modal konfirmasi ditampilkan: "Hapus transaksi [Deskripsi] - Rp [Jumlah]?"
- Officer klik "Hapus" untuk konfirmasi
- Sistem delete via API
DELETE /office/finance/transactions/{id} - Tabel refresh otomatis
- Totals (Total Pemasukan, Total Pengeluaran, Saldo) di-update otomatis
- Toast notification menampilkan "Transaksi berhasil dihapus"
Skenario 6.5: Hapus Pengeluaran dari Permohonan
Skenario ini menunjukkan penghapusan pengeluaran yang terkait dengan permohonan.
| Aktor | Officer & Sistem |
|---|---|
| Rincian | Given officer sedang melihat detail pengeluaran permohonan, When officer menekan tombol hapus pada salah satu item pengeluaran dan mengonfirmasi penghapusan, Then sistem menghapus pengeluaran tersebut dari permohonan, total biaya permohonan di-update, dan tagihan otomatis di-revisi. |
Workflow Penghapusan Pengeluaran Permohonan:
- Officer buka tab "Pengeluaran per Permohonan"
- Pilih permohonan dari dropdown
- Lihat breakdown pengeluaran (biaya layanan, biaya tugas, biaya tambahan)
- Klik tombol "Hapus" pada salah satu item pengeluaran
- Modal konfirmasi: "Hapus pengeluaran [Item]?"
- Setelah konfirmasi, sistem delete dan update invoice terkait
- Total pengeluaran dan tagihan otomatis di-recalculate
Skenario 6.6: Tambah Pengeluaran pada Tabel Transaksi
Skenario ini menunjukkan cara menambahkan transaksi baru ke tabel.
| Aktor | Officer & Sistem |
|---|---|
| Rincian | Given officer berada di menu keuangan, When officer menekan tombol "Tambah Pengeluaran" dan mengisi form dengan data transaksi (tanggal, deskripsi, jumlah, jenis, keterangan, permohonan terkait optional), Then sistem menambahkan pengeluaran baru ke tabel transaksi dan update totals. |
Form Tambah Pengeluaran:
- Tanggal: date picker, default hari ini
- Deskripsi: text input, nama/deskripsi transaksi (required)
- Jumlah: number input, Rp format (required)
- Jenis: dropdown (Pemasukan/Pengeluaran) (required)
- Keterangan: textarea, catatan tambahan (optional)
- Permohonan Terkait: dropdown select permohonan (optional, untuk tracking biaya per order)
- Tombol: Simpan, Batal
Skenario 6.7: Ubah Data Pengeluaran
Skenario ini menunjukkan proses edit transaksi yang sudah ada.
| Aktor | Officer & Sistem |
|---|---|
| Rincian | Given officer sedang melihat detail pengeluaran, When officer menekan tombol "Edit" dan mengubah data pengeluaran (tanggal, deskripsi, jumlah, jenis, keterangan), Then sistem memperbarui data pengeluaran dan menampilkan data yang telah diubah, serta update totals otomatis. |
Workflow Edit Pengeluaran:
- Officer klik tombol "Edit" pada salah satu transaksi
- Form modal ditampilkan dengan data lama pre-filled
- Officer ubah data yang diperlukan
- Klik "Simpan"
- Sistem validate dan send PATCH request ke API
- Totals di-update otomatis
- Toast notification: "Transaksi berhasil diperbarui"
Skenario 6.8: Tambah Pengeluaran Berulang dan Terjadwal
Skenario ini menunjukkan cara membuat pengeluaran berulang otomatis.
| Aktor | Officer & Sistem |
|---|---|
| Rincian | Given officer berada di tab "Pengeluaran Berulang", When officer menekan tombol "Tambah Pengeluaran Berulang" dan mengisi form dengan: deskripsi, jumlah, frekuensi (harian/mingguan/bulanan/tahunan), tanggal mulai, dan konfirmasi, Then sistem menambahkan pengeluaran berulang baru ke daftar dan mendaftarkan scheduler untuk otomasi. |
Form Tambah Pengeluaran Berulang:
- Deskripsi: text input (required)
- Jumlah: number input Rp format (required)
- Frekuensi: dropdown (Harian, Mingguan, Bulanan, Tahunan) (required)
- Tanggal Mulai: date picker (required)
- Tanggal Akhir: date picker (optional, untuk pengeluaran yang dibatasi)
- Permohonan Terkait: dropdown (optional)
- Catatan: textarea (optional)
- Tombol: Buat, Batal
Proses Scheduler:
- Setelah form submit, sistem register recurring task ke scheduler
- Scheduler akan otomatis create transaction pada tanggal yang ditentukan
- Pengguna bisa melihat "Tanggal Jatuh Tempo Berikutnya" di daftar
- Status otomatis "Aktif" setelah dibuat
Skenario 6.9: Filter Transaksi Berdasarkan Periode
Skenario ini menunjukkan filtering transaksi by date range.
| Aktor | Officer & Sistem |
|---|---|
| Rincian | Given officer berada di menu keuangan, When officer memilih periode waktu tertentu menggunakan filter tanggal (date range picker), dan optional memilih jenis transaksi, Then sistem menampilkan transaksi yang terjadi dalam periode yang dipilih, dan menampilkan totals untuk periode tersebut. |
Fitur Filter:
- Date Range: dari tanggal - sampai tanggal
- Quick Filter: "Minggu Ini", "Bulan Ini", "Kuartal Ini", "Tahun Ini"
- Jenis: filter additional by Pemasukan/Pengeluaran
- Apply: tombol Apply untuk trigger filter
- Reset: tombol Reset untuk clear semua filter
- Summary: menampilkan summary untuk periode (Total Pemasukan, Total Pengeluaran, Net)
Skenario 6.10: Ekspor Laporan Keuangan
Skenario ini menunjukkan cara export data keuangan ke format file.
| Aktor | Officer & Sistem |
|---|---|
| Rincian | Given officer telah memfilter data transaksi dengan periode tertentu, When officer menekan tombol "Ekspor Laporan" dan memilih format (Excel/PDF), Then sistem menghasilkan file laporan keuangan yang dapat diunduh dengan konten: ringkasan totals, detail transaksi, breakdown per permohonan, dan chart grafik. |
Format Export:
Excel Format (.xlsx):
- Sheet 1: Ringkasan - Total Pemasukan, Total Pengeluaran, Saldo Bersih, Periode
- Sheet 2: Detail Transaksi - Tabel lengkap dengan semua kolom (tanggal, deskripsi, jumlah, jenis, keterangan)
- Sheet 3: Pengeluaran per Permohonan - Breakdown biaya by order
- Sheet 4: Pengeluaran Berulang - Daftar recurring expenses dengan next due date
- Formatting dengan header bold, number format Rp, auto-width columns
PDF Format (.pdf):
- Halaman 1: Cover & Summary - Header kantor, periode, totals dengan grafik pie/bar chart
- Halaman 2+: Detail Transaksi - Tabel detail transaksi
- Halaman N: Pengeluaran per Permohonan - Summary by order
- Format profesional dengan watermark kantor
Detail Teknis & Perancangan
Abstraksi & Objek Inti
Modul ini berinteraksi dengan objek-objek inti berikut:
| Objek | Anggota | Tipe Data/Keterangan |
|---|---|---|
| Transaction (Transaksi) | Properti: | |
id | string (ID unik transaksi) | |
tanggal | date (Tanggal transaksi) | |
deskripsi | string (Deskripsi/nama transaksi) | |
jumlah | float (Jumlah Rp) | |
jenis | enum (PEMASUKAN, PENGELUARAN) | |
keterangan | string? (Catatan tambahan) | |
permohonanId | string? (ID permohonan terkait, optional) | |
createdBy | string (ID user pembuat) | |
createdAt | date (Timestamp pembuatan) | |
| Metode: | ||
create(data: TransactionData) | Membuat transaksi baru. Kembali: Transaction. | |
update(data: TransactionData) | Mengubah data transaksi. Kembali: boolean. | |
delete() | Menghapus transaksi. Kembali: boolean. | |
getRelatedOrder() | Mendapatkan permohonan terkait. Kembali: Order?. | |
| Expense (Pengeluaran Permohonan) | Properti: | |
id | string (ID unik pengeluaran) | |
orderId | string (ID permohonan) | |
kategori | enum (BIAYA_LAYANAN, BIAYA_TUGAS, BIAYA_TAMBAHAN) | |
jumlah | float (Jumlah Rp) | |
deskripsi | string (Deskripsi pengeluaran) | |
statusPembayaran | enum (BELUM_BAYAR, SEBAGIAN, LUNAS) | |
tanggalJatuhTempo | date (Deadline pembayaran) | |
| Metode: | ||
calculateTotal(expenses: Expense[]) | Menghitung total pengeluaran. Kembali: float. | |
updatePaymentStatus() | Update status pembayaran. Kembali: boolean. | |
generateInvoice() | Generate invoice untuk pengeluaran. Kembali: Invoice. | |
| RecurringExpense (Pengeluaran Berulang) | Properti: | |
id | string (ID unik) | |
deskripsi | string (Deskripsi pengeluaran) | |
jumlah | float (Jumlah Rp) | |
frekuensi | enum (HARIAN, MINGGUAN, BULANAN, TAHUNAN) | |
tanggalMulai | date (Tanggal mulai recurring) | |
tanggalAkhir | date? (Tanggal akhir, optional) | |
tanggalJatuhTempoBerikutnya | date (Calculated next due date) | |
status | enum (AKTIF, PAUSED, EXPIRED) | |
| Metode: | ||
create() | Membuat pengeluaran berulang & register scheduler. Kembali: RecurringExpense. | |
pause() | Menangguhkan pengeluaran berulang. Kembali: boolean. | |
resume() | Melanjutkan pengeluaran berulang. Kembali: boolean. | |
calculateNextDueDate() | Menghitung tanggal jatuh tempo berikutnya. Kembali: date. | |
generateForPeriod(startDate: date, endDate: date) | Generate transactions untuk periode tertentu. Kembali: Transaction[]. | |
| FinancialReport (Laporan Keuangan) | Properti: | |
id | string (ID unik laporan) | |
periodStart | date (Tanggal mulai periode) | |
periodEnd | date (Tanggal akhir periode) | |
totalPemasukan | float (Calculated total income) | |
totalPengeluaran | float (Calculated total expense) | |
saldoBersih | float (Net balance = income - expense) | |
generatedAt | date (Timestamp pembuatan laporan) | |
| Metode: | ||
generate(startDate: date, endDate: date) | Generate laporan untuk periode. Kembali: FinancialReport. | |
exportToExcel() | Export ke format Excel. Kembali: File. | |
exportToPDF() | Export ke format PDF. Kembali: File. | |
getSummary() | Mendapatkan ringkasan laporan. Kembali: object. | |
getBreakdownByOrder() | Breakdown pengeluaran per permohonan. Kembali: ExpenseBreakdown[]. |
Diagram Kelas (Class Diagram)
Diagram ini menunjukkan struktur kelas inti dan relasinya dalam modul keuangan.
ERD (Entity-Relationship Diagram)
Diagram ini merepresentasikan struktur database untuk modul ini dan hubungannya dengan entitas lain.
Endpoint API
Modul ini menggunakan endpoint API berikut:
| Method | Endpoint | Deskripsi |
|---|---|---|
GET | /office/finance/transactions | Mendapatkan daftar transaksi dengan pagination, filter, dan search |
GET | /office/finance/transactions/{id} | Mendapatkan detail transaksi spesifik |
POST | /office/finance/transactions | Membuat transaksi baru |
PATCH | /office/finance/transactions/{id} | Memperbarui data transaksi |
DELETE | /office/finance/transactions/{id} | Menghapus transaksi |
GET | /office/finance/expenses?orderId={id} | Mendapatkan pengeluaran untuk permohonan tertentu |
GET | /office/finance/recurring-expenses | Mendapatkan daftar pengeluaran berulang |
POST | /office/finance/recurring-expenses | Membuat pengeluaran berulang baru |
PATCH | /office/finance/recurring-expenses/{id} | Memperbarui pengeluaran berulang (pause/resume/edit) |
DELETE | /office/finance/recurring-expenses/{id} | Menghapus pengeluaran berulang |
GET | /office/finance/report?startDate={date}&endDate={date} | Generate financial report untuk periode |
POST | /office/finance/report/export?format={format} | Export laporan ke Excel/PDF |
GET | /office/finance/summary | Mendapatkan ringkasan keuangan (totals, saldo) |
Query Parameters untuk /office/finance/transactions:
page(number): Nomor halamansize(number): Jumlah item per halamansort(string): Field untuk sorting (tanggal, jumlah)direction(string): Arah sorting (asc, desc)search(string): Term pencarianjenis(string): Filter by jenis (PEMASUKAN, PENGELUARAN)startDate(date): Filter by periode mulaiendDate(date): Filter by periode akhir
Rencana Pengujian (Test Cases)
| Nama | Deskripsi | Langkah-langkah | Hasil yang Diharapkan |
|---|---|---|---|
| Verifikasi Akses Keuangan | Memastikan hanya user dengan izin KEUANGAN yang dapat mengakses menu keuangan. | 1. Login sebagai user dengan izin KEUANGAN=false. 2. Coba akses /keuangan.3. Verifikasi sidebar & access. | 1. User diarahkan ke unauthorized page. 2. Sidebar tidak menampilkan menu keuangan. 3. Error message ditampilkan. |
| Lihat Tabel Transaksi | Memastikan tabel transaksi menampilkan data dengan benar. | 1. Login sebagai user dengan izin KEUANGAN. 2. Akses menu keuangan /keuangan.3. Verifikasi tampilan tabel. | 1. Tabel transaksi ditampilkan dengan semua kolom. 2. Data tersorted by tanggal (newest first). 3. Pagination berfungsi. |
| Tambah Transaksi Baru | Memastikan user dapat menambahkan transaksi baru ke tabel. | 1. Akses /keuangan.2. Klik "Tambah Pengeluaran". 3. Isi form (tanggal, deskripsi, jumlah, jenis). 4. Submit form. | 1. Form modal ditampilkan. 2. Data baru muncul di tabel. 3. Totals otomatis di-update. 4. Toast notification: "Berhasil ditambahkan". |
| Edit Transaksi | Memastikan user dapat mengubah data transaksi. | 1. Buka tabel transaksi. 2. Klik "Edit" pada salah satu transaksi. 3. Ubah data (deskripsi, jumlah). 4. Submit perubahan. | 1. Form modal ditampilkan dengan data lama. 2. Data di-update di tabel. 3. Totals otomatis di-recalculate. 4. Toast notification: "Berhasil diperbarui". |
| Hapus Transaksi | Memastikan user dapat menghapus transaksi dengan konfirmasi. | 1. Buka tabel transaksi. 2. Klik "Hapus" pada salah satu transaksi. 3. Konfirmasi penghapusan di modal. | 1. Modal konfirmasi ditampilkan. 2. Transaksi terhapus dari tabel. 3. Totals otomatis di-update. 4. Toast notification: "Berhasil dihapus". |
| Filter Transaksi by Periode | Memastikan filter tanggal berfungsi dengan benar. | 1. Akses menu keuangan. 2. Pilih periode: "Bulan Ini". 3. Klik Apply. | 1. Tabel menampilkan hanya transaksi bulan ini. 2. Totals di-update untuk periode. 3. Jumlah row berkurang sesuai filter. |
| Lihat Pengeluaran Permohonan | Memastikan detail pengeluaran per permohonan ditampilkan. | 1. Akses tab "Pengeluaran per Permohonan". 2. Pilih permohonan dari dropdown. 3. Verifikasi breakdown pengeluaran. | 1. Dropdown berisi semua permohonan. 2. Breakdown ditampilkan (Biaya Layanan, Biaya Tugas, dll). 3. Total pengeluaran dihitung dengan benar. |
| Tambah Pengeluaran Berulang | Memastikan pengeluaran berulang dapat dibuat dan scheduler terdaftar. | 1. Akses tab "Pengeluaran Berulang". 2. Klik "Tambah Pengeluaran Berulang". 3. Isi form (deskripsi, jumlah, frekuensi=Bulanan, tanggal mulai=01/01/2025). 4. Submit. | 1. Pengeluaran berulang muncul di daftar. 2. Status = "Aktif". 3. Tanggal jatuh tempo berikutnya ditampilkan. 4. Scheduler registered (verifikasi via logs). |
| Pause/Resume Pengeluaran Berulang | Memastikan pengeluaran berulang dapat di-pause dan di-resume. | 1. Buka tab "Pengeluaran Berulang". 2. Klik "Pause" pada salah satu pengeluaran. 3. Verifikasi status. 4. Klik "Resume". | 1. Status berubah ke "PAUSED". 2. Scheduler suspend. 3. Setelah resume, status kembali "AKTIF". 4. Scheduler resume. |
| Ekspor Laporan Excel | Memastikan export ke Excel berfungsi dengan benar. | 1. Filter transaksi bulan tertentu. 2. Klik "Ekspor Laporan". 3. Pilih format "Excel". 4. Download file. | 1. File Excel di-generate dengan nama [periode]_laporan_keuangan.xlsx. 2. File berisi 4 sheet (Ringkasan, Detail, Per Permohonan, Recurring). 3. Data lengkap dan format benar. 4. File dapat di-open di Excel. |
| Ekspor Laporan PDF | Memastikan export ke PDF berfungsi dengan benar. | 1. Filter transaksi periode tertentu. 2. Klik "Ekspor Laporan". 3. Pilih format "PDF". 4. Download file. | 1. File PDF di-generate dengan nama [periode]_laporan_keuangan.pdf. 2. Halaman 1 = cover + summary dengan grafik. 3. Halaman 2+ = detail transaksi tabel. 4. File dapat di-open di PDF reader. |
| Calculate Financial Summary | Memastikan totals (pemasukan, pengeluaran, saldo) dihitung dengan akurat. | 1. Buat 3 transaksi: 2 Pemasukan (1M, 2M) & 1 Pengeluaran (500K). 2. Verifikasi totals di dashboard. | 1. Total Pemasukan = 3M. 2. Total Pengeluaran = 500K. 3. Saldo Bersih = 2.5M. 4. Semua dihitung otomatis. |
| Transaksi Terkait Permohonan | Memastikan transaksi dapat di-link ke permohonan dan tracking bekerja. | 1. Buat permohonan baru (Order ID = ABC). 2. Tambah transaksi dengan permohonanId = ABC. 3. Buka "Pengeluaran per Permohonan". 4. Pilih Order ABC. | 1. Transaksi muncul di detail pengeluaran Order ABC. 2. Total pengeluaran Order ABC otomatis di-update. 3. Link bidirectional bekerja. |
| Recurring Expense Auto-Generation | Memastikan recurring expenses otomatis di-generate sesuai jadwal. | 1. Buat recurring expense (Bulanan, mulai 01/01/2025). 2. Tunggu sistem scheduler trigger (mock/simulate). 3. Verifikasi transaction terbaru di tabel. | 1. Transaction baru otomatis di-create pada tanggal jatuh tempo. 2. Deskripsi = "[Recurring] [Original Description]". 3. Jumlah sama dengan recurring amount. 4. Status perubahan menjadi SELESAI (auto-confirmed). |
| Delete dengan Cascade | Memastikan penghapusan transaksi tidak menyebabkan data inconsistency. | 1. Buat transaksi terkait permohonan ABC. 2. Delete transaksi tersebut. 3. Buka detail permohonan ABC. | 1. Transaksi terhapus dari tabel global. 2. Total pengeluaran Order ABC otomatis di-update. 3. Tidak ada broken reference. |
Status Dokumentasi: ✅ 100% LENGKAP
Seluruh skenario 6.1 hingga 6.10 telah didokumentasikan dengan format BDD lengkap, diagram visual, abstraksi teknis, ERD, API endpoints, dan comprehensive test cases.