# Analisis Workflow Sistem E-Budgeting

Dokumen ini menggambarkan alur aktual sistem E-Budgeting berdasarkan kode aplikasi. Fokus utama: aktor, status, transisi, menu, notifikasi, data, dan titik keputusan agar mudah diubah menjadi diagram flowchart, BPMN, activity diagram, sequence diagram, atau state diagram.

Tanggal analisis: 31 Mei 2026

## 1. Ringkasan Sistem

Sistem mengelola siklus anggaran kampus dari pengajuan RKAT, review keuangan, persetujuan yayasan, pengajuan pencairan, pencatatan pencairan, unggah LPJ, verifikasi LPJ, sampai laporan PDF.

Alur besar:

1. Admin Keuangan membuka periode dan mengatur pagu unit.
2. Pengaju/unit membuat RKAT untuk periode aktif.
3. Keuangan memverifikasi RKAT.
4. Yayasan menyetujui RKAT dengan nominal ACC per item kegiatan.
5. Pengaju mengajukan pencairan berdasarkan item RKAT yang sudah disetujui, atau mengajukan pencairan lain di luar RKAT.
6. Keuangan memverifikasi dan mencatat pencairan, termasuk pencairan lain di luar RKAT.
7. Pengaju mengunggah LPJ setelah dana dicairkan.
8. Keuangan memverifikasi LPJ.
9. Yayasan memantau pencairan dan LPJ.
10. Keuangan/Yayasan dapat mencetak laporan RKAT, pencairan, dan sisa anggaran.

## 2. Aktor

| Aktor | Model login | Peran utama | Batas akses |
|---|---|---|---|
| Pengaju | `Pengaju` | Membuat RKAT, mengajukan pencairan, unggah LPJ | Hanya data milik unit sendiri |
| Admin Keuangan | `Admin` role `keuangan` | Kelola periode, pagu unit, RKAT tahap keuangan, pencairan, LPJ, template, laporan | Semua unit |
| Admin Yayasan | `Admin` role `yayasan` | Persetujuan RKAT, monitoring pencairan dan LPJ, laporan | Semua unit |
| Sistem | command/scheduler | Notifikasi deadline LPJ, nomor otomatis, log aktivitas | Tidak punya UI langsung |

## 3. Modul Utama

| Modul | Fungsi | Aktor utama |
|---|---|---|
| Autentikasi | Login/logout, profile, avatar, password | Semua |
| Periode | Buat/edit/aktifkan/tutup periode anggaran | Keuangan |
| Pagu Unit | Set pagu per unit per periode | Keuangan |
| RKAT | Pengajuan anggaran periode | Pengaju, Keuangan, Yayasan |
| Item RKAT | Detail kegiatan, kategori, waktu, biaya, ACC | Pengaju, Yayasan |
| Pencairan | Pengajuan dan pencatatan pencairan dana | Pengaju, Keuangan, Yayasan monitor |
| LPJ | Unggah dan verifikasi pertanggungjawaban | Pengaju, Keuangan, Yayasan monitor |
| Dokumen | Review surat/proposal/LPJ/bukti pencairan | Semua sesuai akses |
| Template Dokumen | Upload/download template surat | Keuangan upload, semua download |
| Laporan PDF | Laporan RKAT, pencairan, sisa anggaran | Keuangan, Yayasan |
| Notifikasi | Badge sidebar dan dropdown notifikasi | Semua |

## 4. Data Inti dan Relasi

```mermaid
erDiagram
    PENGAJU ||--o{ RKAT : membuat
    PENGAJU ||--o{ PENCAIRAN : membuat
    PERIODE ||--o{ RKAT : memiliki
    PENGAJU ||--o{ UNIT_BUDGET_CEILING : punya_pagu
    PERIODE ||--o{ UNIT_BUDGET_CEILING : punya_pagu
    RKAT ||--o{ ITEM : berisi
    BUDGET_CATEGORY ||--o{ ITEM : kategori
    RKAT ||--o{ PENCAIRAN : dasar
    ITEM ||--o{ PENCAIRAN : dasar_item
    ADMIN ||--o{ NOTIFICATION : menerima
    PENGAJU ||--o{ NOTIFICATION : menerima
```

Entitas kunci:

| Entitas | Field penting | Catatan |
|---|---|---|
| `periode` | `nama`, `tahun`, `buka`, `tutup`, `status` | Hanya satu periode aktif saat `aktifkan` dijalankan |
| `pengaju` | `unit`, `nama`, `email`, `aktif` | Akun unit pengaju |
| `unit_budget_ceilings` | `periode_id`, `pengaju_id`, `nominal_pagu`, `catatan` | Pagu pembanding RKAT |
| `rkat` | `nomor`, `periode_id`, `unit`, `pembuat`, `perihal`, `ringkasan`, `total`, `disetujui`, `status`, `surat`, `proposal`, `riwayat`, `catatan` | Status resmi RKAT ada di level RKAT |
| `item` | `rkat_id`, `budget_category_id`, `kegiatan`, `keterangan`, `waktu_mulai`, `waktu_selesai`, `biaya`, `acc` | `acc` jadi batas pencairan per kegiatan |
| `pencairan` | `nomor`, `rkat_id`, `item_id`, `unit`, `pembuat`, `perihal`, `ringkasan`, `diminta`, `disetujui`, `luar_rkat`, `status`, dokumen, LPJ, bukti pencairan, `deadline_lpj` | `luar_rkat=true` diverifikasi Keuangan tanpa approval Yayasan |
| `notifications` | `tipe_penerima`, `id_penerima`, `judul`, `pesan`, `link`, `dibaca` | Badge sidebar dihitung dari unread dan link menu |
| `activity_logs` | `aksi`, `aktor`, `target`, `payload` | Audit trail internal |

## 5. Status RKAT

| Status DB | Makna sistem | Aktor yang membuat status | Tindakan lanjut |
|---|---|---|---|
| `Draft` | RKAT disimpan, belum diajukan | Pengaju | Edit atau submit |
| `Proses` | RKAT diajukan ke Keuangan | Pengaju | Keuangan forward/revisi |
| `Revisi` | RKAT dikembalikan untuk diperbaiki | Keuangan/Yayasan | Pengaju edit dan submit ulang |
| `Diajukan` | RKAT diteruskan Keuangan ke Yayasan | Keuangan | Yayasan setujui/revisi/tolak |
| `Disetujui` | Yayasan menyetujui RKAT dengan nominal ACC item | Yayasan | Pengaju bisa ajukan pencairan dari item |
| `Ditolak` | Yayasan menolak RKAT | Yayasan | Pengaju boleh membuat RKAT baru untuk periode yang sama karena check existing mengecualikan `Ditolak` |

Label tampilan dapat berbeda per role, tetapi status DB tetap sama.

## 6. Status Pencairan

| Status DB | Makna sistem | Aktor yang membuat status | Tindakan lanjut |
|---|---|---|---|
| `Draft` | Pencairan disimpan, belum diajukan | Pengaju | Edit atau submit |
| `Proses` | Pencairan masuk Keuangan untuk verifikasi | Pengaju | Keuangan revisi/tolak/cairkan |
| `Revisi` | Pencairan dikembalikan ke pengaju | Keuangan | Pengaju edit dan submit ulang |
| `Diajukan` | Status legacy pencairan lama yang pernah diteruskan ke Yayasan | Keuangan | Keuangan tetap bisa catat cair agar data lama tidak macet |
| `ACC` | Status legacy pencairan lama yang pernah disetujui Yayasan | Yayasan | Keuangan tetap bisa catat cair agar data lama tidak macet |
| `Dicairkan` | Keuangan sudah mencatat pencairan dan bukti | Keuangan | Pengaju unggah LPJ |
| `LPJ Diunggah` | Pengaju sudah unggah LPJ | Pengaju | Keuangan terima/tolak LPJ |
| `LPJ Ditolak` | LPJ perlu diperbaiki | Keuangan | Pengaju unggah ulang LPJ |
| `Selesai` | LPJ diterima, proses selesai | Keuangan | Closed |
| `Ditolak` | Pencairan ditolak | Keuangan | Closed |

Status yang mengurangi sisa anggaran item RKAT:

`Proses`, `Revisi`, `Diajukan`, `ACC`, `Dicairkan`, `LPJ Diunggah`, `LPJ Diterima`, `LPJ Ditolak`, `Selesai`.

Status yang tidak mengurangi sisa anggaran:

`Draft`, `Ditolak`.

## 7. Alur Master Data

### 7.1 Periode

```mermaid
flowchart TD
    K[Admin Keuangan] --> P1[Buat/Edit Periode]
    P1 --> P2{Aktifkan?}
    P2 -->|Ya| P3[Semua periode aktif lain ditutup]
    P3 --> P4[Periode dipilih menjadi aktif]
    P2 -->|Tidak| P5[Periode tersimpan nonaktif/tertutup]
    P4 --> R[Pengaju bisa membuat RKAT]
```

Aturan:

- Periode dibuat oleh Keuangan.
- `tutup` wajib setelah `buka`.
- Saat periode diaktifkan, periode lain yang aktif otomatis berubah `ditutup`.
- Jika tidak ada periode aktif, Pengaju tidak bisa membuat RKAT.

### 7.2 Pagu Unit

```mermaid
flowchart TD
    K[Admin Keuangan] --> U1[Pilih periode]
    U1 --> U2[Pilih unit pengaju]
    U2 --> U3[Isi nominal pagu]
    U3 --> U4[Simpan/Update pagu]
    U4 --> U5[Pagu muncul di form/detail RKAT]
```

Aturan:

- Pagu bersifat per `periode_id` + `pengaju_id`.
- Jika kombinasi periode dan unit sudah ada, sistem update pagu lama.
- Pagu tidak otomatis memblokir RKAT, tetapi sistem mencatat warning bila total RKAT melebihi pagu.

## 8. Alur RKAT

### 8.1 RKAT Normal

```mermaid
flowchart TD
    A[Pengaju buka Buat RKAT] --> B{Ada periode aktif?}
    B -->|Tidak| B1[Redirect daftar RKAT + error]
    B -->|Ya| C{Sudah ada RKAT periode ini selain Ditolak?}
    C -->|Ya| C1[Form tetap tampil dengan info sudah pernah mengajukan]
    C -->|Tidak| D[Isi perihal, ringkasan, item kegiatan, dokumen]
    C1 --> D
    D --> E{Aksi simpan?}
    E -->|Simpan Draft| F[Status Draft]
    E -->|Submit| G{Surat permohonan ada?}
    G -->|Tidak| G1[Validasi gagal, tetap di form]
    G -->|Ya| H[Status Proses]
    H --> I[Notif Keuangan: RKAT Baru]
    I --> J[Keuangan review RKAT]
    J --> K{Keputusan Keuangan}
    K -->|Forward| L[Status Diajukan]
    K -->|Revisi| M[Status Revisi + catatan ke Pengaju]
    L --> N[Notif Yayasan: RKAT Menunggu Persetujuan]
    N --> O[Yayasan review nominal per item]
    O --> P{Keputusan Yayasan}
    P -->|Setujui| Q[Isi item.acc + rkat.disetujui = SUM acc]
    Q --> R[Status Disetujui]
    P -->|Revisi| M
    P -->|Tolak| S[Status Ditolak + catatan]
    R --> T[Notif Pengaju + Keuangan]
    S --> U[Notif Pengaju + Keuangan]
    M --> V[Pengaju edit dan submit ulang]
    V --> H
```

### 8.2 Detail Pengisian Item RKAT

Item RKAT berisi:

- `kegiatan`: nama kegiatan.
- `keterangan`: keterangan kegiatan.
- `budget_category_id`: kategori anggaran opsional.
- `waktu_mulai`: awal kegiatan opsional.
- `waktu_selesai`: akhir kegiatan opsional.
- `biaya`: nominal diajukan.
- `acc`: nominal disetujui Yayasan.

Aturan tanggal:

- Jika `waktu_mulai` dan `waktu_selesai` diisi, `waktu_selesai` tidak boleh sebelum `waktu_mulai`.

Aturan nominal:

- `biaya` minimal 0.
- Saat Yayasan approve, setiap `acc` minimal 0 dan tidak boleh melebihi `biaya`.
- Jika total `acc` semua item = 0, sistem menolak aksi `Setujui RKAT`; Yayasan harus memakai `Tolak RKAT`.

### 8.3 Review RKAT oleh Yayasan

Behavior Yayasan:

1. Buka RKAT status `Diajukan`.
2. Sistem menampilkan tabel item kegiatan full-width.
3. Yayasan mengisi nominal ACC per item.
4. Checkbox dan tombol toolbar membantu isi massal:
   - isi penuh sesuai `biaya`;
   - reset ke nilai awal;
   - nolkan item terpilih.
5. Tombol keputusan global ada di bawah halaman:
   - `Setujui RKAT`;
   - `Tolak RKAT`;
   - `Minta Revisi RKAT`.
6. Catatan wajib untuk `Tolak` dan `Revisi`.

Catatan proses:

- Item tidak punya status sendiri.
- Item dianggap mendapat dana sesuai nominal `acc`.
- `acc = 0` berarti item tidak mendapat dana, tetapi status resmi tetap milik RKAT.

### 8.4 Edge List RKAT untuk Diagram State

| Dari | Event | Oleh | Ke | Catatan |
|---|---|---|---|---|
| none | create draft | Pengaju | Draft | Dokumen boleh belum lengkap |
| none | create submit | Pengaju | Proses | Wajib surat permohonan |
| Draft | submit | Pengaju | Proses | Wajib surat permohonan |
| Revisi | submit ulang | Pengaju | Proses | Setelah edit |
| Proses | forward | Keuangan | Diajukan | Notif Yayasan |
| Proses | revisi | Keuangan | Revisi | Catatan wajib |
| Diajukan | approve | Yayasan | Disetujui | SUM item.acc > 0 |
| Diajukan | revisi | Yayasan | Revisi | Catatan wajib |
| Diajukan | reject | Yayasan | Ditolak | Alasan wajib |

## 9. Alur Pencairan dari RKAT

Pencairan dari RKAT dipakai untuk kegiatan yang sudah disetujui dalam RKAT.

```mermaid
flowchart TD
    A[Pengaju buka Ajukan Pencairan] --> B[Pilih RKAT status Disetujui]
    B --> C[Pilih item kegiatan yang punya sisa anggaran]
    C --> D[Form otomatis isi perihal = kegiatan, ringkasan = keterangan, diminta <= sisa]
    D --> E{Aksi}
    E -->|Simpan Draft| F[Status Draft]
    E -->|Ajukan| H[Status Proses]
    H --> I[Notif Keuangan: Pencairan Baru]
    H --> I2[Notif Yayasan: Pencairan Baru untuk dipantau]
    I --> J[Keuangan Verifikasi Pencairan]
    J --> K{Keputusan Keuangan}
    K -->|Revisi| L[Status Revisi + catatan ke Pengaju]
    K -->|Tolak| M[Status Ditolak]
    K -->|Catat cair| N[Status Dicairkan]
    N --> O[Set tanggal cair + deadline LPJ H+14 + bukti pencairan]
    O --> P[Notif Pengaju: Dana dicairkan]
    L --> Q[Pengaju edit revisi]
    Q --> H
```

Aturan:

- Pengaju hanya bisa memilih RKAT miliknya yang statusnya `Disetujui`.
- Pencairan dari RKAT harus terhubung ke `item_id`.
- `diminta` tidak boleh melebihi `item.sisaAnggaran()`.
- `perihal` dan `ringkasan` diambil ulang dari item di server, tidak dipercaya dari browser.
- Untuk pencairan dari RKAT, pengaju tidak perlu unggah surat permohonan atau proposal pencairan.
- Pencairan RKAT tidak perlu approval Yayasan lagi.
- Yayasan menerima notifikasi dan dapat memantau, tetapi bukan approver untuk pencairan RKAT.

## 10. Alur Pencairan Lain di Luar RKAT

Pencairan lain dipakai untuk kebutuhan yang tidak berasal dari item RKAT periode.

```mermaid
flowchart TD
    A[Pengaju klik Ajukan Pencairan Lain] --> B[Isi perihal, ringkasan, nominal, dokumen]
    B --> C{Aksi}
    C -->|Simpan Draft| D[Status Draft]
    C -->|Ajukan| E{Surat dan proposal ada?}
    E -->|Tidak| E1[Validasi gagal]
    E -->|Ya| F[Status Proses]
    F --> G[Notif Keuangan]
    F --> G2[Notif Yayasan untuk monitoring]
    G --> H[Keuangan review]
    H --> I{Keputusan Keuangan}
    I -->|Revisi| J[Status Revisi]
    I -->|Tolak| K[Status Ditolak]
    I -->|Catat cair| L[Status Dicairkan + deadline LPJ]
```

Aturan:

- Pencairan lain wajib punya surat dan proposal/dokumen pendukung saat diajukan.
- Pencairan lain tidak perlu approval Yayasan.
- Keuangan dapat merevisi, menolak, atau langsung mencatat pencairan dari status `Proses`.
- Keuangan menentukan nominal disetujui saat pencatatan pencairan lain.
- Nominal disetujui pencairan lain wajib lebih dari 0 dan tidak boleh melebihi nominal diminta.

## 11. Alur Pencatatan Pencairan oleh Keuangan

```mermaid
flowchart TD
    A[Keuangan buka Verifikasi Pencairan] --> B[Pilih aksi Cairkan]
    B --> C[Isi tanggal cair, metode transfer/tunai, upload bukti, catatan opsional]
    C --> D{Validasi}
    D -->|Bukti kosong| E[Gagal: bukti wajib]
    D -->|Jumlah tidak sama nominal disetujui| F[Gagal]
    D -->|Valid| G[Status Dicairkan]
    G --> H[Set tanggal_cair]
    H --> I[Set deadline_lpj = tanggal_cair + 14 hari]
    I --> J[Simpan bukti pencairan]
    J --> K[Notif Pengaju upload LPJ]
```

Aturan:

- Metode pencairan: `transfer` atau `tunai`.
- Bukti pencairan wajib PDF/JPG/JPEG/PNG.
- Jumlah cair harus sama dengan nominal disetujui/diminta.
- Setelah cair, Pengaju wajib LPJ maksimal 14 hari dari tanggal cair.

## 12. Alur LPJ

```mermaid
flowchart TD
    A[Status Dicairkan] --> B[Pengaju upload LPJ PDF]
    B --> C[Status LPJ Diunggah]
    C --> D[Notif Keuangan]
    C --> E[Notif Yayasan untuk pantau LPJ]
    D --> F[Keuangan verifikasi LPJ]
    F --> G{Keputusan}
    G -->|Terima| H[Status Selesai]
    G -->|Tolak| I[Status LPJ Ditolak + catatan]
    I --> J[Notif Pengaju]
    J --> B
```

Aturan:

- LPJ hanya bisa diunggah saat status `Dicairkan` atau `LPJ Ditolak`.
- File LPJ wajib PDF.
- Keuangan dapat menerima LPJ langsung dari tabel utama atau detail.
- Jika LPJ diterima, status menjadi `Selesai`.
- Jika LPJ ditolak, pengaju dapat upload ulang.
- Yayasan hanya memantau LPJ.

### 12.1 Deadline LPJ

```mermaid
flowchart TD
    A[Status Dicairkan] --> B[deadline_lpj = tanggal_cair + 14 hari]
    B --> C{Scheduler lpj:send-deadline-warnings}
    C -->|H-3| D[Notif H-3 ke Pengaju, Keuangan, Yayasan]
    C -->|H-1| E[Notif H-1 ke Pengaju, Keuangan, Yayasan]
    C -->|Terlambat| F[Notif terlambat ke Pengaju, Keuangan, Yayasan]
```

Command:

`php artisan lpj:send-deadline-warnings`

Catatan:

- Sistem mengirim satu notifikasi per judul per penerima agar tidak spam notifikasi harian dengan judul sama.
- Target warning hanya status `Dicairkan` dan `LPJ Ditolak`.

## 13. Alur Dokumen

Dokumen utama:

| Modul | Dokumen | Wajib kapan | Format |
|---|---|---|---|
| RKAT | Surat permohonan | Saat submit RKAT | PDF |
| RKAT | Proposal | Opsional | PDF |
| Pencairan RKAT | Tidak wajib dokumen permintaan/proposal | Cukup isi form pengajuan | - |
| Pencairan Lain | Surat dan proposal/dokumen pendukung | Saat submit pencairan lain | PDF |
| Pencairan | Bukti pencairan | Saat Keuangan catat cair | PDF/JPG/JPEG/PNG |
| LPJ | Dokumen LPJ | Saat upload LPJ | PDF |

Review dokumen:

```mermaid
flowchart TD
    A[User klik Lihat Dokumen] --> B{Authorize}
    B -->|Pengaju pemilik data| C[Preview dokumen]
    B -->|Keuangan/Yayasan| C
    B -->|Tidak berhak| D[403]
    C --> E[File dikirim dari storage local]
```

Aturan akses:

- Pengaju hanya bisa melihat dokumen milik unitnya sendiri.
- Keuangan dan Yayasan bisa melihat dokumen semua unit.
- File dikirim dari disk `local`, bukan public langsung.
- Response file memakai header anti-sniffing dan private cache.

## 14. Alur Template Dokumen

```mermaid
flowchart TD
    A[Keuangan buka Template Surat] --> B[Upload template DOC/DOCX/RTF]
    B --> C[Pilih kategori: rkat/pencairan/lpj/lainnya]
    C --> D[Template aktif]
    D --> E[Pengguna download template dari form terkait]
```

Aturan:

- Keuangan saja yang dapat upload/hapus template.
- Semua role authenticated dapat download template aktif berdasarkan kategori.
- Jika template belum ada, sistem menampilkan error.

## 15. Alur Laporan PDF

Laporan yang dihasilkan controller:

| Type | Isi utama | Filter |
|---|---|---|
| `rkat` | Nomor, unit, periode, perihal, total, disetujui, status | Unit, periode |
| `pencairan` | Nomor, unit, periode, kegiatan, diminta, disetujui, tanggal cair, status | Unit, periode |
| `sisa-anggaran` | RKAT, unit, periode, kegiatan, kategori, ACC, terpakai, sisa | Unit, periode |

Catatan:

- Laporan LPJ tidak dibuat sebagai laporan PDF terpisah.
- Data laporan dicetak sesuai filter saat dokumen dibuat.
- PDF memakai A4 portrait.
- Header memakai logo kampus dan identitas institut.
- Pembuat laporan mengikuti role: `Admin Keuangan` atau `Admin Yayasan`.

```mermaid
flowchart TD
    A[Keuangan/Yayasan pilih laporan] --> B[Pilih filter unit/periode]
    B --> C[Generate PDF]
    C --> D[Query data sesuai type]
    D --> E[Render formal-pdf A4]
    E --> F[Stream PDF]
    F --> G[ActivityLog GENERATE_REPORT_PDF]
```

## 16. Dashboard dan Monitoring

### 16.1 Dashboard Pengaju

Informasi:

- Pagu unit periode aktif.
- Total RKAT diajukan/disetujui.
- Total pencairan diminta/dicairkan.
- Tugas yang perlu aksi: RKAT draft/revisi, pencairan draft/revisi, upload LPJ.
- Alur berkas: draft, review, cair, LPJ, selesai.
- Daftar RKAT terbaru dan pencairan terbaru.

Behavior:

- Pengaju melihat kondisi unitnya sendiri.
- Angka realisasi pencairan dihitung dari nominal dicairkan dibanding RKAT disetujui.

### 16.2 Dashboard Keuangan

Informasi:

- Filter unit dan periode.
- Nominal RKAT, pencairan masuk, dana cair, menunggu verifikasi.
- Workload: RKAT verifikasi, RKAT ke Yayasan, pencairan proses, LPJ masuk, selesai.
- List RKAT pending dan pencairan pending.
- Warning LPJ H-3/H-1/terlambat.

Behavior:

- Keuangan menggunakan dashboard sebagai meja kerja operasional.
- Menu `Verifikasi Pencairan` fokus status `Proses`.
- Menu `Laporan Pencairan` menampilkan pencairan non-draft tanpa aksi operasional utama kecuali detail.
- Menu `Verifikasi LPJ` fokus status `LPJ Diunggah`.

### 16.3 Dashboard Yayasan

Informasi:

- RKAT menunggu ACC.
- Total RKAT disetujui.
- Pencairan dipantau.
- LPJ diunggah.
- Nominal utama dengan filter unit/periode.
- Keputusan RKAT.
- Pencairan dan LPJ untuk monitoring.

Behavior:

- Yayasan menjadi approver RKAT.
- Yayasan memantau pencairan RKAT sejak pencairan diajukan.
- Yayasan menerima notifikasi `Pencairan Baru` saat pengaju mengajukan pencairan.
- Yayasan menerima notifikasi `LPJ Diunggah` saat pengaju upload LPJ.
- Yayasan memantau pencairan lain, tetapi tidak menjadi approver pencairan.

## 17. Menu per Role

### 17.1 Pengaju

| Menu | Fungsi | Status dominan |
|---|---|---|
| Dashboard | Ringkasan unit | Semua milik pengaju |
| Buat RKAT | Buat pengajuan anggaran periode aktif | Draft/submit |
| Daftar RKAT | Lihat/edit/detail RKAT | Draft, Proses, Revisi, Diajukan, Disetujui, Ditolak |
| Ajukan Pencairan | Buat pencairan dari RKAT disetujui atau pencairan lain | Draft/Proses |
| Daftar Pencairan | Lihat status pencairan | Semua milik pengaju |
| LPJ | Upload/revisi LPJ | Dicairkan, LPJ Diunggah, LPJ Ditolak, Selesai |
| Profile | Data akun | - |

### 17.2 Keuangan

| Menu | Fungsi | Status dominan |
|---|---|---|
| Dashboard | Ringkasan operasional | Semua |
| Daftar RKAT | Verifikasi RKAT dan forward ke Yayasan | Proses, Diajukan, Disetujui, Ditolak |
| Verifikasi Pencairan | Verifikasi pengajuan pencairan | Proses |
| Laporan Pencairan | Pantau pencairan non-draft | Proses, Diajukan, ACC, Dicairkan, LPJ, Selesai, Ditolak |
| Verifikasi LPJ | Terima/tolak LPJ | LPJ Diunggah |
| Kelola Periode | Master periode | - |
| Pagu Unit | Master pagu unit | - |
| Template Surat | Master template dokumen | - |

### 17.3 Yayasan

| Menu | Fungsi | Status dominan |
|---|---|---|
| Dashboard | Ringkasan persetujuan dan monitoring | Semua |
| Daftar RKAT | Review dan approve RKAT | Diajukan |
| Monitoring Pencairan | Pantau pengajuan/pencairan | Semua non-draft/non-revisi |
| LPJ | Pantau LPJ | Dicairkan, LPJ Diunggah, LPJ Diterima, LPJ Ditolak, Selesai |
| Profile | Data akun | - |

## 18. Notifikasi dan Badge Sidebar

### 18.1 Matrix Notifikasi

| Event | Penerima | Judul contoh | Link |
|---|---|---|---|
| RKAT submit ke Keuangan | Keuangan | `RKAT Baru: RKAT-...` | `/keuangan/rkat/{id}` |
| RKAT forward ke Yayasan | Yayasan | `RKAT ... Menunggu Persetujuan` | `/yayasan/rkat/{id}` |
| RKAT revisi | Pengaju | `RKAT ... Perlu Revisi` | `/pengaju/rkat/{id}` |
| RKAT disetujui | Pengaju | `RKAT ... Disetujui` | `/pengaju/rkat/{id}` |
| RKAT disetujui | Keuangan | `RKAT ... Disetujui` | `/keuangan/rkat/{id}` |
| RKAT ditolak | Pengaju | `RKAT ... Ditolak` | `/pengaju/rkat/{id}` |
| RKAT ditolak | Keuangan | `RKAT ... Ditolak` | `/keuangan/rkat/{id}` |
| Pencairan submit | Keuangan | `Pencairan Baru: PCR-...` | `/keuangan/pencairan?status=verifikasi` |
| Pencairan submit | Yayasan | `Pencairan Baru: PCR-...` | `/yayasan/pencairan` |
| Pencairan lain submit | Keuangan | `Pencairan Lain Baru: PCR-...` | `/keuangan/pencairan?status=verifikasi` |
| Pencairan lain submit | Yayasan | `Pencairan Lain Baru: PCR-...` | `/yayasan/pencairan` |
| Pencairan revisi | Pengaju | `Pencairan ... Perlu Revisi` | `/pengaju/pencairan/{id}` |
| Pencairan ditolak | Pengaju | `Pencairan ... Ditolak` | `/pengaju/pencairan/{id}` |
| Dana dicairkan | Pengaju | `Dana ... Telah Dicairkan` | `/pengaju/pencairan/{id}` |
| LPJ diunggah | Keuangan | `LPJ Diunggah: PCR-...` | `/keuangan/pencairan?status=lpj` |
| LPJ diunggah | Yayasan | `LPJ Diunggah: PCR-...` | `/yayasan/pencairan?status=lpj` |
| LPJ diterima | Pengaju | `Pencairan ... Selesai` | `/pengaju/pencairan/{id}` |
| LPJ ditolak | Pengaju | `LPJ ... Ditolak` | `/pengaju/pencairan/{id}` |
| Deadline LPJ H-3/H-1/terlambat | Pengaju, Keuangan, Yayasan | `LPJ H-3/H-1/Terlambat: PCR-...` | Menu LPJ masing-masing |

### 18.2 Badge Sidebar

Badge dihitung dari notifikasi unread dengan prefix link menu dan keyword judul/pesan.

| Role | Menu | Prefix | Keyword |
|---|---|---|---|
| Pengaju | Daftar RKAT | `/pengaju/rkat` | semua unread RKAT |
| Pengaju | Daftar Pencairan | `/pengaju/pencairan` | `Revisi` |
| Pengaju | LPJ | `/pengaju/pencairan` | `Dana`, `LPJ`, `Selesai` |
| Keuangan | Daftar RKAT | `/keuangan/rkat` | semua unread RKAT |
| Keuangan | Verifikasi Pencairan | `/keuangan/pencairan` | `Pencairan Baru`, `Pencairan Lain`, `Pencairan Darurat` |
| Keuangan | Verifikasi LPJ | `/keuangan/pencairan` | `LPJ` |
| Yayasan | Daftar RKAT | `/yayasan/rkat` | semua unread RKAT |
| Yayasan | Monitoring Pencairan | `/yayasan/pencairan` | `Pencairan Baru`, `Pencairan Lain`, `Pencairan Darurat` |
| Yayasan | LPJ | `/yayasan/pencairan` | `LPJ` |

Mark as read:

- Membuka menu RKAT akan menandai notifikasi RKAT role tersebut sebagai dibaca.
- Membuka menu pencairan Keuangan status `verifikasi` akan menandai notif pencairan baru sebagai dibaca.
- Membuka menu pencairan Yayasan default akan menandai notif monitoring pencairan sebagai dibaca.
- Membuka menu LPJ akan menandai notif LPJ sebagai dibaca.

## 19. User Behavior per Aktor

### 19.1 Pengaju

Behavior normal:

1. Login sebagai unit.
2. Cek dashboard: pagu, tugas, status berkas.
3. Jika periode aktif, masuk Buat RKAT.
4. Mengisi item kegiatan dalam satu baris per item.
5. Upload surat permohonan, opsional proposal.
6. Simpan draft jika belum siap.
7. Submit jika dokumen siap.
8. Jika menerima revisi, buka detail, baca catatan, klik edit, submit ulang.
9. Setelah RKAT disetujui, buka Ajukan Pencairan.
10. Pilih RKAT dan item kegiatan.
11. Upload surat/proposal pencairan.
12. Submit pencairan.
13. Setelah dana dicairkan, upload LPJ dari menu LPJ atau detail.
14. Jika LPJ ditolak, upload ulang LPJ.

Risiko user awam:

- Salah paham `Draft` vs `Submit`; UI perlu tombol jelas.
- Lupa upload surat; sistem harus tetap di form dan tampilkan warning.
- Salah input nominal; input rupiah perlu format titik dan tidak memakai spinner.
- Tidak tahu sisa anggaran; form perlu menampilkan sisa item.

### 19.2 Keuangan

Behavior normal:

1. Login Keuangan.
2. Cek dashboard workload.
3. Kelola periode dan pagu sebelum siklus RKAT dimulai.
4. Buka Daftar RKAT untuk status `Proses`.
5. Review dokumen dan item.
6. Forward RKAT valid ke Yayasan atau revisi jika perlu perbaikan.
7. Buka Verifikasi Pencairan untuk status `Proses`.
8. Untuk pencairan dari RKAT, catat pencairan jika nominal valid.
9. Untuk pencairan lain, pastikan surat/proposal lengkap lalu revisi, tolak, atau catat cair.
10. Upload bukti pencairan saat mencatat cair.
11. Buka Verifikasi LPJ saat ada LPJ diunggah.
12. Terima atau tolak LPJ.
13. Cetak laporan jika dibutuhkan.

Risiko user awam:

- Bingung bedakan Verifikasi Pencairan, Laporan Pencairan, Verifikasi LPJ.
- Butuh aksi cepat di tabel agar tidak selalu masuk detail.
- Butuh bukti pencairan wajib agar audit lengkap.

### 19.3 Yayasan

Behavior normal:

1. Login Yayasan.
2. Cek dashboard: RKAT menunggu, pencairan dipantau, LPJ diunggah.
3. Buka Daftar RKAT.
4. Masuk detail RKAT status `Diajukan`.
5. Isi nominal ACC per item.
6. Setujui, minta revisi, atau tolak RKAT.
7. Pantau pencairan yang diajukan dan dicairkan.
8. Pantau LPJ diunggah dan deadline LPJ.
9. Cetak laporan bila diperlukan.

Risiko user awam:

- Mengira item punya status approve/reject sendiri; sistem aktual memakai nominal ACC item dan status RKAT global.
- Perlu catatan jelas saat revisi/tolak.
- Perlu notifikasi pencairan dan LPJ tetap muncul sampai menu terkait dibuka.

## 20. Boundary dan Guardrail Sistem

| Area | Guardrail |
|---|---|
| Role access | Route dibatasi middleware role |
| Data pengaju | Pengaju tidak bisa lihat RKAT/pencairan unit lain |
| Dokumen | File hanya lewat route review/file berotorisasi |
| RKAT duplicate | Pengaju tidak bisa membuat RKAT kedua di periode sama kecuali RKAT lama `Ditolak` |
| Submit RKAT | Surat permohonan wajib |
| Review RKAT | ACC item tidak boleh lebih dari biaya |
| Approve RKAT | Total ACC harus lebih dari 0 |
| Pencairan RKAT | Harus dari RKAT `Disetujui`, item valid, sisa cukup |
| Pencairan submit | Pencairan RKAT cukup isi form; pencairan lain wajib surat dan proposal |
| Pencairan lain | Diverifikasi dan dicairkan oleh Keuangan tanpa approval Yayasan |
| Cairkan | Bukti pencairan wajib, jumlah harus sama nominal disetujui |
| LPJ | Hanya PDF, hanya dari status `Dicairkan`/`LPJ Ditolak` |
| Laporan | Hanya Keuangan/Yayasan |

## 21. Diagram State RKAT

```mermaid
stateDiagram-v2
    [*] --> Draft: Pengaju simpan
    [*] --> Proses: Pengaju submit dengan surat
    Draft --> Proses: Submit
    Revisi --> Proses: Submit ulang
    Proses --> Diajukan: Keuangan forward
    Proses --> Revisi: Keuangan minta revisi
    Diajukan --> Disetujui: Yayasan approve nominal item
    Diajukan --> Revisi: Yayasan minta revisi
    Diajukan --> Ditolak: Yayasan tolak
    Disetujui --> [*]
    Ditolak --> [*]
```

## 22. Diagram State Pencairan RKAT

```mermaid
stateDiagram-v2
    [*] --> Draft: Pengaju simpan
    [*] --> Proses: Pengaju submit
    Draft --> Proses: Submit
    Revisi --> Proses: Submit ulang
    Proses --> Revisi: Keuangan minta revisi
    Proses --> Ditolak: Keuangan tolak
    Proses --> Dicairkan: Keuangan catat cair
    Dicairkan --> LPJ_Diunggah: Pengaju upload LPJ
    LPJ_Diunggah --> Selesai: Keuangan terima LPJ
    LPJ_Diunggah --> LPJ_Ditolak: Keuangan tolak LPJ
    LPJ_Ditolak --> LPJ_Diunggah: Pengaju upload ulang
    Selesai --> [*]
    Ditolak --> [*]
```

## 23. Diagram State Pencairan Lain

```mermaid
stateDiagram-v2
    [*] --> Draft: Pengaju simpan
    [*] --> Proses: Pengaju submit
    Draft --> Proses: Submit
    Revisi --> Proses: Submit ulang
    Proses --> Revisi: Keuangan minta revisi
    Proses --> Ditolak: Keuangan tolak
    Proses --> Dicairkan: Keuangan catat cair
    Dicairkan --> LPJ_Diunggah: Pengaju upload LPJ
    LPJ_Diunggah --> Selesai: Keuangan terima LPJ
    LPJ_Diunggah --> LPJ_Ditolak: Keuangan tolak LPJ
    LPJ_Ditolak --> LPJ_Diunggah: Pengaju upload ulang
    Selesai --> [*]
    Ditolak --> [*]
```

## 24. Sequence RKAT End-to-End

```mermaid
sequenceDiagram
    participant P as Pengaju
    participant K as Keuangan
    participant Y as Yayasan
    participant S as Sistem

    P->>S: Buat RKAT + item + dokumen
    P->>S: Submit RKAT
    S->>K: Notifikasi RKAT Baru
    K->>S: Review RKAT
    K->>S: Forward ke Yayasan
    S->>Y: Notifikasi RKAT Menunggu Persetujuan
    Y->>S: Isi ACC per item
    Y->>S: Setujui RKAT
    S->>P: Notifikasi RKAT Disetujui
    S->>K: Notifikasi RKAT Disetujui
```

## 25. Sequence Pencairan RKAT End-to-End

```mermaid
sequenceDiagram
    participant P as Pengaju
    participant K as Keuangan
    participant Y as Yayasan
    participant S as Sistem

    P->>S: Pilih RKAT Disetujui
    S-->>P: Item + sisa anggaran
    P->>S: Submit pencairan dari form
    S->>K: Notifikasi Pencairan Baru
    S->>Y: Notifikasi Pencairan Baru untuk dipantau
    K->>S: Catat pencairan + bukti
    S->>P: Notifikasi Dana Dicairkan
    P->>S: Upload LPJ
    S->>K: Notifikasi LPJ Diunggah
    S->>Y: Notifikasi LPJ Diunggah
    K->>S: Terima LPJ
    S->>P: Notifikasi Pencairan Selesai
```

## 26. Sequence Pencairan Lain End-to-End

```mermaid
sequenceDiagram
    participant P as Pengaju
    participant K as Keuangan
    participant Y as Yayasan
    participant S as Sistem

    P->>S: Submit pencairan lain + surat + proposal
    S->>K: Notifikasi Pencairan Lain Baru
    S->>Y: Notifikasi monitoring
    K->>S: Catat pencairan + bukti
    S->>P: Notifikasi Dana Dicairkan
    P->>S: Upload LPJ
    K->>S: Terima/Tolak LPJ
```

## 27. Daftar Node untuk Diagram Manual

Node utama:

- `Login`
- `Dashboard Pengaju`
- `Dashboard Keuangan`
- `Dashboard Yayasan`
- `Periode Aktif`
- `Pagu Unit`
- `Buat RKAT`
- `Draft RKAT`
- `Submit RKAT`
- `Verifikasi RKAT Keuangan`
- `Forward RKAT Yayasan`
- `Review ACC Item Yayasan`
- `RKAT Disetujui`
- `RKAT Revisi`
- `RKAT Ditolak`
- `Ajukan Pencairan RKAT`
- `Ajukan Pencairan Lain`
- `Verifikasi Pencairan Keuangan`
- `Catat Pencairan`
- `Upload Bukti Pencairan`
- `Dana Dicairkan`
- `Upload LPJ`
- `Verifikasi LPJ`
- `LPJ Ditolak`
- `Selesai`
- `Monitoring Yayasan`
- `Cetak Laporan`

## 28. Edge List Global untuk Diagram Manual

| Source | Target | Kondisi/Event |
|---|---|---|
| Login | Dashboard role | Auth sukses |
| Dashboard Pengaju | Buat RKAT | Ada periode aktif |
| Buat RKAT | Draft RKAT | Simpan draft |
| Buat RKAT | Submit RKAT | Klik ajukan + surat ada |
| Submit RKAT | Verifikasi RKAT Keuangan | Status `Proses` |
| Verifikasi RKAT Keuangan | Forward RKAT Yayasan | Keuangan valid |
| Verifikasi RKAT Keuangan | RKAT Revisi | Keuangan minta revisi |
| RKAT Revisi | Buat/Edit RKAT | Pengaju perbaiki |
| Forward RKAT Yayasan | Review ACC Item Yayasan | Status `Diajukan` |
| Review ACC Item Yayasan | RKAT Disetujui | Total ACC > 0 |
| Review ACC Item Yayasan | RKAT Revisi | Yayasan minta revisi |
| Review ACC Item Yayasan | RKAT Ditolak | Yayasan tolak |
| RKAT Disetujui | Ajukan Pencairan RKAT | Item punya sisa ACC |
| Ajukan Pencairan RKAT | Verifikasi Pencairan Keuangan | Submit form |
| Ajukan Pencairan Lain | Verifikasi Pencairan Keuangan | Submit + surat + proposal ada |
| Verifikasi Pencairan Keuangan | Catat Pencairan | Pencairan valid |
| Catat Pencairan | Dana Dicairkan | Bukti upload + tanggal cair |
| Dana Dicairkan | Upload LPJ | Pengaju unggah PDF |
| Upload LPJ | Verifikasi LPJ | Status `LPJ Diunggah` |
| Verifikasi LPJ | Selesai | Keuangan terima |
| Verifikasi LPJ | LPJ Ditolak | Keuangan tolak |
| LPJ Ditolak | Upload LPJ | Pengaju upload ulang |
| Dashboard Keuangan | Cetak Laporan | Pilih type + filter |
| Dashboard Yayasan | Cetak Laporan | Pilih type + filter |

## 29. Catatan untuk Pembuat Diagram

Rekomendasi diagram:

1. Buat swimlane 3 aktor: Pengaju, Keuangan, Yayasan.
2. Pisahkan RKAT dan Pencairan menjadi dua flow utama.
3. Beri warna status:
   - Draft: abu-abu.
   - Proses/Revisi: kuning/merah.
   - Diajukan/ACC: biru.
   - Disetujui/Dicairkan/Selesai: hijau.
   - Ditolak: merah gelap.
4. Buat cabang khusus `Pencairan Lain` karena dokumennya masih wajib surat dan proposal.
5. Buat event notifikasi sebagai simbol amplop kecil di edge antar aktor.
6. Buat dokumen wajib sebagai guard condition di diamond.
7. Buat deadline LPJ sebagai timer event setelah `Dicairkan`.

## 30. Open Point Desain Proses

Poin yang sudah ditentukan sistem:

- Status item RKAT tidak dibuat; keputusan per item diwakili nominal `acc`.
- Status resmi persetujuan ada di level RKAT.
- Pencairan RKAT tidak perlu approval Yayasan dan tidak perlu dokumen permintaan/proposal.
- Pencairan lain tidak perlu approval Yayasan, tetapi tetap wajib surat permohonan/proposal.
- Yayasan tetap menerima notifikasi pencairan baru untuk monitoring.
- Laporan LPJ tidak dibuat sebagai PDF terpisah.

Poin yang bisa diputuskan nanti:

- Apakah pencairan status `Revisi` tetap harus mengunci sisa anggaran atau tidak.
- Apakah pencairan RKAT perlu opsi nominal cair parsial setelah approve RKAT.
- Apakah notifikasi monitoring Yayasan perlu dibedakan antara pencairan RKAT dan pencairan lain.
