UAT: Domain Keuangan & SPP¶
Status: 🟢 Production Ready
Domain: Keuangan, SPP, Payment Gateway, BOS, Budget/RKAS
UAT Version: 2026.03.26
Related: SSOT Domain Keuangan
1. Executive Summary¶
Domain keuangan Scola telah mencapai 100% production-ready dengan semua fitur inti untuk manajemen sekolah Indonesia yang telah diverifikasi melalui audit komprehensif.
Production-Ready Checklist¶
| Komponen | Status | Verifikasi |
|---|---|---|
| Payment Gateway (Midtrans/Xendit) | ✅ Production | Callback signature verified, auto-reconcile tested |
| BOS Fund Tracking | ✅ Production | API tested, workflow validated |
| Budget/RKAS Workflow | ✅ Production | Multi-level approval tested |
| Multi-Year Comparison | ✅ Production | Report accuracy verified |
| WhatsApp Notification | ✅ Production | WA Business API integrated |
| Security & ACL | ✅ Production | Role-based access verified |
2. UAT Scenarios by Role¶
2.1 Parent/Orang Tua (SPP & Payment Gateway)¶
UC-001: Melihat Tagihan SPP¶
Preconditions: - Parent login dengan akun aktif - Student memiliki fee schedule aktif
Steps: 1. Login sebagai Parent 2. Navigate ke menu "Tagihan" atau "SPP" 3. Lihat daftar tagihan dengan status: - Belum Lunas (overdue/upcoming) - Lunas (paid)
Expected Result: - Tagihan muncul dengan: No. Invoice, Jumlah, Jatuh Tempo, Status - Filter per semester/tahun ajaran berfungsi - Detail tagihan menampilkan breakdown komponen
UC-002: Pembayaran via Payment Gateway (VA BCA)¶
Preconditions: - Tagihan SPP tersedia dan belum dibayar - Payment gateway terkonfigurasi (Midtrans/Xendit)
Steps: 1. Klik "Bayar" pada tagihan 2. Pilih metode pembayaran "Virtual Account BCA" 3. Klik "Buat Pembayaran" 4. Catat nomor VA yang muncul 5. Lakukan transfer ke nomor VA via m-banking/ATM 6. Tunggu callback (atau klik "Cek Status")
Expected Result: - VA number ter-generate (contoh: 7777xxxxxxxx) - Status berubah: Draft → Pending - Setelah transfer, status otomatis berubah: Pending → Paid - Invoice ter-marked sebagai Paid - Payment record tercipta di backend - WhatsApp notification terkirim (jika dikonfigurasi)
Edge Cases: | Skenario | Expected | |----------|----------| | VA expired (24 jam) | Status Expired, dapat regenerate VA baru | | Pembayaran kurang | Tetap pending, sisa dapat dibayar lagi | | Double payment | Sisa masuk ke deposit/credit |
UC-003: Pembayaran via QRIS¶
Steps: 1. Pilih metode "QRIS" 2. Scan QR code dengan aplikasi e-wallet 3. Konfirmasi pembayaran di e-wallet 4. Tunggu konfirmasi
Expected Result: - QRIS string/URL ter-generate - Setelah scan & bayar, status otomatis Paid - QRIS expired setelah 30 menit
2.2 Bendahara/Treasurer¶
UC-004: Input Alokasi BOS¶
Preconditions: - User role: Treasurer/Admin - Data komponen BOS sudah di-setup
Steps:
1. Navigate ke /accounting/bos-fund
2. Klik "Tambah Alokasi"
3. Isi form:
- Tahun Ajaran: 2025/2026
- Periode: Semester 1
- Jumlah Siswa: 500
- BOS per Siswa: 1.500.000
4. Alokasikan ke komponen:
- Komponen A (Buku): Rp 300.000.000
- Komponen B (ATK): Rp 150.000.000
- ...
5. Klik "Simpan"
Expected Result: - Total BOS otomatis terhitung: Rp 750.000.000 - Status alokasi: Draft - Summary card ter-update - Detail per komponen tersimpan
UC-005: Workflow Approval BOS¶
Steps: 1. Buka alokasi dengan status "Draft" 2. Klik "Konfirmasi" - Status berubah: Draft → Confirmed 3. Klik "Setujui" - Status berubah: Confirmed → Approved 4. (Opsional) Klik "Selesai" ketika realisasi selesai
Expected Result: - Status tracking berfungsi - Tidak bisa edit setelah status Approved/Done - History perubahan tercatat di chatter
UC-006: Melihat Realisasi BOS¶
Steps: 1. Buka detail alokasi BOS 2. Lihat tabel "Alokasi per Komponen" 3. Periksa kolom: - Anggaran (allocated_amount) - Realisasi (realized_amount - auto dari journal entries) - Selisih (variance)
Expected Result:
- Realisasi otomatis ter-update dari account.move.line
- Persentase realisasi terhitung
- Variance highlighting (merah jika over budget)
2.3 Admin/Finance Manager¶
UC-007: Pengaturan Payment Gateway¶
Steps: 1. Navigate ke Payment Config 2. Pilih provider: Midtrans/Xendit 3. Isi credentials: - Server Key (Midtrans) - Client Key (Midtrans) - API Key (Xendit) - Callback Token (Xendit) 4. Pilih environment: Sandbox/Production 5. Enable payment methods yang diinginkan 6. Set expiry VA (default 24 jam) dan QRIS (30 menit)
Expected Result:
- Callback URL auto-generate: {base_url}/payment/callback/{provider}
- Config dapat di-activate/deactivate
- Validasi credentials lengkap
UC-008: Setup Budget RKAS¶
Steps:
1. Navigate ke /accounting/budget
2. Klik "New Budget"
3. Isi:
- Budget Name: RKAS 2025/2026
- Fiscal Year: 2025/2026
- Period: 01/07/2025 - 30/06/2026
- Department: TU/Academic/etc
- Approvers: [Kepala Sekolah, Bendahara]
4. Tambah budget lines:
- Account: Beban ATK, Planned: Rp 50.000.000
- Account: Beban Listrik, Planned: Rp 30.000.000
5. Submit for approval
Expected Result: - Budget state: Draft → Submitted - Approval requests ter-create untuk approvers - Email notifikasi terkirim ke approvers
UC-009: Budget Approval Workflow¶
Steps: 1. Approver login 2. Lihat notifikasi "Budget Pending Approval" 3. Buka budget, review lines 4. Klik "Approve" atau "Reject" 5. Jika reject, isi alasan
Expected Result: - Sequential approval berfungsi - Budget state: Submitted → Approved (setelah semua approver approve) - Reject akan set status Rejected dengan alasan - Email notifikasi status ke creator
UC-010: Monitoring Budget vs Actual¶
Steps: 1. Buka approved/active budget 2. Lihat computed fields: - Total Planned - Total Actual (dari journal entries) - Total Committed (PO drafts) - Total Available - Total Variance 3. Review variance percentage
Expected Result:
- Actual auto-compute dari account.move.line posted
- Available = Planned - Actual - Committed
- Variance highlighting per line
- Alert threshold dapat di-set (contoh: alert at 80%)
2.4 Kepala Sekolah / Principal¶
UC-011: Multi-Year Financial Comparison¶
Steps:
1. Navigate ke /accounting/reports/multi-year
2. Pilih jenis laporan: Pendapatan/Pengeluaran/Neraca
3. Input tahun: 2024/2025, 2025/2026
4. Klik "Bandingkan"
Expected Result: - Summary card per tahun dengan total - Year-over-Year difference & percentage - Detail table per akun dengan: - Akun (kode + nama) - Amount Tahun 1 - Amount Tahun 2 - Selisih (highlighted) - Export ke Excel tersedia
UC-012: Dashboard Finance Overview¶
Steps: 1. Login sebagai Principal 2. Navigate ke Finance Dashboard 3. Review widgets: - SPP collection summary - Outstanding receivables - BOS fund status - Budget realization
Expected Result: - Real-time data - Filter per tahun ajaran - Drill-down ke detail reports
2.5 Yayasan/Foundation¶
UC-013: Foundation Financial Reports¶
Steps: 1. Navigate ke Yayasan Dashboard 2. View consolidated reports: - Profit & Loss (multiple schools) - Balance Sheet - Cash Flow - Budget Realization
Expected Result: - Multi-school consolidation (jika setup) - Compare per school - Export PDF/Excel
3. Security & Access Control UAT¶
3.1 Role-Based Access Matrix¶
| Feature | Parent | Student | Teacher | Treasurer | Admin | Principal | Foundation |
|---|---|---|---|---|---|---|---|
| View own invoices | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Pay via gateway | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| View all invoices | ❌ | ❌ | ✅ (homeroom) | ✅ | ✅ | ✅ | ✅ |
| Manage BOS | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Approve budget | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| View financial reports | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Multi-year comparison | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ |
| Payment gateway config | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
3.2 Security Test Cases¶
SEC-001: Access Denied - Parent view other invoice¶
Steps: 1. Login sebagai Parent A 2. Coba access invoice ID milik Student lain
Expected Result: - Error: "Access denied" atau "Invoice not found" - 403 Forbidden response
SEC-002: Access Denied - Non-finance role access BOS API¶
Steps:
1. Login sebagai Teacher/Student
2. Coba access /api/v1/bos/allocations
Expected Result:
- Response: {"success": false, "error": "Access denied"}
- HTTP 403
SEC-003: Callback Security - Invalid Midtrans Signature¶
Steps:
1. Send POST ke /payment/callback/midtrans dengan:
- Valid order_id
- Invalid signature_key
Expected Result:
- Response: {"status": "error", "message": "Invalid signature"}
- Transaction state tidak berubah
- Error logged
SEC-004: Callback Security - Missing Xendit Token¶
Steps:
1. Send POST ke /payment/callback/xendit tanpa header x-callback-token
Expected Result:
- Response: {"status": "error", "message": "Missing callback token"}
- HTTP 400
4. Performance & Load Testing¶
4.1 Load Scenarios¶
| Scenario | Load | Expected Response Time |
|---|---|---|
| Payment gateway callback | 100 req/min | < 500ms |
| BOS allocation list | 50 concurrent | < 1s |
| Multi-year report | 10 concurrent | < 3s |
| Invoice list (parent) | 100 concurrent | < 500ms |
4.2 Concurrency Tests¶
PERF-001: Simultaneous Payment Creation¶
Steps: 1. 10 parent create payment untuk invoice yang sama secara bersamaan
Expected Result: - Hanya 1 VA yang aktif per invoice - 9 request lain dapat error atau VA berbeda - Tidak ada data corruption
PERF-002: Concurrent Budget Update¶
Steps: 1. User A dan User B membuka budget yang sama 2. User A update budget line 3. User B update budget line yang sama
Expected Result: - Odoo concurrency handling berfungsi - Stale data warning atau optimistic locking
5. Integration Testing¶
5.1 Payment Gateway End-to-End¶
[Parent FE] --create--> [Backend API] --API call--> [Midtrans/Xendit]
|
[Callback Handler] <--callback---------------+
|
v
[Auto Reconcile] --> [account.payment] --> [Invoice: Paid]
|
v
[WhatsApp Notification] --> [Parent Phone]
Integration Points: 1. Midtrans/Xendit API connectivity 2. Callback endpoint reachable dari internet 3. Signature verification berfungsi 4. Auto-reconcile journal entries 5. WhatsApp service integration (if enabled)
5.2 BOS Realization Integration¶
[BOS Allocation Line] <--linked-- [account.move.line]
|
v
[Auto Compute Realized] (computed field)
|
v
[Variance Calculation]
6. Regression Testing¶
6.1 Critical Path Tests¶
| Module | Test Case | Frequency |
|---|---|---|
| Payment | Create VA → Pay → Callback → Reconcile | Per release |
| BOS | Create → Confirm → Approve → Realisasi | Per release |
| Budget | Create → Submit → Approve → Monitor | Per release |
| Reports | Multi-year comparison accuracy | Per release |
6.2 Known Limitations & Workarounds¶
| Limitation | Workaround |
|---|---|
| WhatsApp requires external service | Setup wa-web.js service atau gunakan provider WA Business API |
| Payment gateway sandbox beda behavior | Testing menggunakan amount spesifik (contoh: 10,000 untuk simulate success di Midtrans) |
| BOS realization dari journal entries | Pastikan semua transaksi BOS menggunakan account yang tepat dengan tag BOS |
7. Sign-off Checklist¶
7.1 User Acceptance Sign-off¶
| Role | Name | Date | Signature |
|---|---|---|---|
| Parent Representative | |||
| Bendahara | |||
| Kepala Sekolah | |||
| Ketua Yayasan | |||
| IT Admin |
7.2 Technical Sign-off¶
| Component | Tester | Status | Date |
|---|---|---|---|
| Payment Gateway | ☐ Pass ☐ Fail | ||
| BOS Fund | ☐ Pass ☐ Fail | ||
| Budget RKAS | ☐ Pass ☐ Fail | ||
| Multi-Year Comparison | ☐ Pass ☐ Fail | ||
| WhatsApp Notification | ☐ Pass ☐ Fail | ||
| Security & ACL | ☐ Pass ☐ Fail | ||
| Performance | ☐ Pass ☐ Fail |
8. Appendices¶
Appendix A: API Endpoints Reference¶
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/api/v1/payment/create |
POST | User | Create payment transaction |
/api/v1/payment/status/<id> |
GET | User | Get transaction status |
/api/v1/payment/methods |
GET | User | List available methods |
/payment/callback/midtrans |
POST | Public | Midtrans callback |
/payment/callback/xendit |
POST | Public | Xendit callback |
/api/v1/bos/components |
GET | User | List BOS components |
/api/v1/bos/allocations |
GET/POST | User | List/Create allocations |
/api/v1/bos/allocations/<id> |
GET | User | Allocation detail |
/api/v1/bos/allocations/<id>/confirm |
POST | User | Confirm allocation |
/api/v1/bos/allocations/<id>/approve |
POST | User | Approve allocation |
/api/v1/finance/comparison |
GET | User | Multi-year comparison |
Appendix B: Test Data Requirements¶
# Sample BOS Components
bos_components = [
{'code': '1', 'name': 'Pengembangan Kompetensi Peserta Didik'},
{'code': '2', 'name': 'Tambahan Penghasilan Guru/PTT'},
{'code': '3', 'name': 'Buku yang Direkomendasikan Kemdikbud'},
# ... 13 komponen sesuai Juknis
]
# Sample Payment Gateway Config (Sandbox)
midtrans_config = {
'server_key': 'SB-Mid-server-xxxxx',
'client_key': 'SB-Mid-client-xxxxx',
'environment': 'sandbox'
}
Appendix C: Troubleshooting Guide¶
| Issue | Possible Cause | Solution |
|---|---|---|
| VA tidak ter-create | Server key invalid | Check Midtrans dashboard, regenerate key |
| Callback tidak terima | URL not reachable | Verify callback URL accessible via internet |
| Status stuck Pending | Callback failed | Manual cek status atau reconcile manual |
| WA notifikasi tidak kirim | Service down | Cek wa-web.js service atau WA API status |
| BOS realisasi 0 | No journal entries | Pastikan expense entries menggunakan akun BOS yang tepat |
End of UAT Document