Buku Panduan Sistem AO BPRS
⚠️ Perbaikan Penting: Upgrade ke Logika Produksi
Pada Sesi 5 sebelumnya digunakan "Mock Engine". Untuk kebutuhan Produksi yang nyata, Anda WAJIB mengganti file app/ml/predictor.py dengan kode di bawah ini. Kode ini mengimplementasikan Weighted Scorecard yang deterministik (hasil selalu sama untuk data yang sama), mudah diaudit oleh OJK/Internal Audit, dan mematuhi prinsip Syariah dalam penilaian risiko.
File yang harus diupdate: /www/wwwroot/app-collection/ao/app/ml/predictor.py
from decimal import Decimal
from typing import Dict
class ProductionScoringEngine:
"""
ENGINE SKOR KREDIT PRODUKSI (Production Ready).
Metodologi: Weighted Scorecard (Tabel Bobot).
Pendekatan ini bersifat transparan (White Box), memudahkan penjelasan ke nasabah
dan audit internal, sesuai standar perbankan.
"""
# Konstanta Bobot (Weights) - Dapat disesuaikan oleh Komite Risiko
BASE_SCORE = 300
MAX_SCORE = 850
# Threshold Segmen
SEGMENT_HIGH_RISK_THRESHOLD = 550
SEGMENT_MED_RISK_THRESHOLD = 700
def calculate_score(self, monthly_income: float, assets: float, loan_amount: float, tenor_months: int) -> Dict:
"""
Input: Data finansial nasabah.
Output: Skor Kredit (300-850), Probabilitas Gagal Bayar (%), dan Segmen.
"""
# --- 1. Perhitungan Angsuran (Flat Rate Syariah - Margin) ---
# Asumsi Margin Standar untuk perhitungan kapasitas bayar (Contoh: 15% flat per tahun)
margin_rate = 0.15
total_margin = loan_amount * margin_rate
total_debt = loan_amount + total_margin
monthly_installment = total_debt / tenor_months
# --- 2. Variabel Penilaian (Assessment Variables) ---
# A. Debt Service Ratio (DSR) = Angsuran / Pendapatan Bersih
# Standar OJK/Bank Umum: DSR aman di bawah 35-40%
if monthly_income <= 0:
dsr_score = -200 # Risiko maksimal jika tidak ada penghasilan
else:
dsr = monthly_installment / monthly_income
if dsr <= 0.30:
dsr_score = 150 # Sangat Sehat
elif dsr <= 0.40:
dsr_score = 100 # Sehat
elif dsr <= 0.50:
dsr_score = 0 # Waspada (Netral)
else:
dsr_score = -150 # Berisiko (Cicilan membebani)
# B. Asset Coverage Ratio (ACR) = Total Aset / Plafond Pinjaman
# Jaminan/Agunan yang kuat menurunkan risiko kerugian (Loss Given Default)
if loan_amount <= 0:
acr_score = 0
else:
acr = assets / loan_amount
if acr >= 1.2:
acr_score = 100 # Aset melampaui pinjaman 20%
elif acr >= 0.8:
acr_score = 50 # Aset mendekati pinjaman
else:
acr_score = -50 # Aset kurang mencukupi
# C. Tenor Risk (Jangka Waktu)
# Semakin lama tenor, semakin tinggi ketidakpastian
if tenor_months <= 12:
tenor_score = 50
elif tenor_months <= 24:
tenor_score = 20
elif tenor_months <= 36:
tenor_score = -20
else:
tenor_score = -50
# --- 3. Agregasi Skor ---
final_score = self.BASE_SCORE + dsr_score + acr_score + tenor_score
# Clamp skor agar tidak melebihi batas min/max
final_score = max(self.BASE_SCORE, min(self.MAX_SCORE, int(final_score)))
# --- 4. Probabilitas Gagal Bayar (Default Probability) ---
# Kurva Invers: Skor Tinggi -> Probabilitas Rendah
# Rumus Linear Sederhana untuk Produksi
if final_score >= 750:
pd = 0.01 # 1%
elif final_score >= 650:
pd = 0.05 # 5%
elif final_score >= 550:
pd = 0.15 # 15%
else:
pd = 0.40 # 40% (Sangat berisiko)
# --- 5. Segmentasi ---
if final_score >= self.SEGMENT_MED_RISK_THRESHOLD:
segment = "low"
elif final_score >= self.SEGMENT_HIGH_RISK_THRESHOLD:
segment = "medium"
else:
segment = "high"
return {
"credit_score": final_score,
"default_probability": float(pd),
"segment": segment,
"dsr": round(monthly_installment / monthly_income if monthly_income > 0 else 0, 2),
"monthly_installment": round(monthly_installment, 2),
"assessment": {
"dsr_score": dsr_score,
"acr_score": acr_score,
"tenor_score": tenor_score
}
}
# Instance Engine
scoring_engine = ProductionScoringEngine()
Bab 1: Arsitektur Sistem & Keamanan
Sistem AO (Account Officer) BPRS Baktimakmur Indah dibangun dengan arsitektur Client-Server yang terpisah secara ketat demi keamanan data nasabah (Confidentiality).
1.1 Area Sistem
- Frontend (Public): Berjalan di
ao.baktimakmur.com. Ini adalah tampilan visual yang diakses oleh browser user. Tidak ada data sensitif (password/pinjaman) yang disimpan di sini secara permanen, hanya ditampilkan sementara. - Backend API (Private): Berjalan di
app-collection/aodi server aaPanel. Ini adalah "Otak" sistem. Semua logika bisnis (perhitungan bunga, skor kredit) terjadi di sini. Area ini tidak bisa diakses langsung oleh publik, hanya bisa diakses oleh Frontend yang sudah terautentikasi.
1.2 Keamanan Data
Password pengguna disimpan menggunakan algoritma Bcrypt. Ini adalah standar industri (hashing one-way). Artinya, bahkan Administrator Database tidak bisa melihat password asli user, hanya bisa memvalidasi kecocokannya.
Bab 2: Metodologi Penilaian Kredit (Credit Scoring)
Sebelum menggunakan aplikasi, seluruh staf (AO sampai Direksi) wajib memahami bagaimana sistem mengambil keputusan. Sistem ini bukan "kotak hitam" (black box), melainkan menggunakan metode Weighted Scorecard.
2.1 Komponen Penilaian
Sistem menilai nasabah berdasarkan 3 pilar utama dengan bobot tertentu:
-
Kapasitas Pembayaran (DSR - Debt Service Ratio):
Mengukur apakah pendapatan nasabah cukup untuk membayar cicilan tanpa menderita.
Rumus: (Angsuran Bulanan) / (Penghasilan Bersih Bulanan). -
Jaminan/Agunan (ACR - Asset Coverage Ratio):
Mengukur perlindungan bank jika nasabah gagal bayar. Apakah nilai agunan cukup untuk menutup pinjaman?
Rumus: (Total Nilai Aset) / (Plafond Pinjaman). -
Jangka Waktu (Tenor Risk):
Risiko waktu. Pinjaman jangka pendek lebih aman daripada jangka panjang karena ketidakpastian ekonomi di masa depan.
2.2 Skor & Segmentasi Risiko
Hasil perhitungan di atas dikonversi menjadi angka Skor (300 - 850) dan dikelompokkan ke dalam segmen:
| Segmen | Range Skor | Arti Bisnis | Tindakan AO |
|---|---|---|---|
| LOW RISK (Hijau) | 700 - 850 | Nasabah Primadona. Sangat mampu bayar, agunan kuat. | Proses segera. Prioritas layanan. |
| MEDIUM RISK (Kuning) | 550 - 699 | Nasabah Waspada. Pendapatan pas-pasan atau agunan kurang. | Perlu analisis tambahan (Survey lapangan). |
| HIGH RISK (Merah) | 300 - 549 | Risiko Gagal Bayar Tinggi. Cicilan terlalu berat. | Tolak atau ajukan penurunan plafond. |
Bab 3: Peran Pengguna (Roles & Responsibilities)
Sistem ini mendukung Multi-User Access. Setiap user memiliki hak akses (privilege) yang berbeda sesuai tugas pokok dan fungsinya (Job Description).
3.1 Branch User (AO / Teller)
- Akses: Terbatas pada Cabang tempat user bertugas (misal: User SBY hanya bisa input data nasabah di Surabaya).
- Tugas: Input data nasabah, Upload Dokumen, Input Pengajuan Pembiayaan, Input Pembayaran Angsuran.
- Keterbatasan: Tidak bisa mengubah logika skor atau melihat data cabang lain.
3.2 Risk Director (Direktur Operasional & Manajemen Risiko)
- Akses: Global (Semua Cabang).
- Tugas: Memantau Portofolio Risiko (High Risk List), menyetujui penyesuaian parameter skor (jika ada perubahan kebijakan), dan memantau Early Warning System (EWS).
3.3 Director Main (Direktur Utama)
- Akses: Global.
- Tugas: Monitoring kinerja bisnis secara makro (Total Aset, Total Penyaluran Dana).
3.4 Commissioner (Komisaris)
- Akses: Read-Only Global. Bisa melihat laporan namun tidak bisa mengubah data transaksi. Fungsi pengawasan.