{{-- ═══════════════════════════════════════════════════════════════ --}}
{{-- TAB 1: REVIEW DOKUMEN --}}
{{-- ═══════════════════════════════════════════════════════════════ --}}
Review Dokumen Perorangan
@php
$docTypes = [
'dokumen_ktp' => 'KTP Pemohon + Pasangan',
'dokumen_kk' => 'Kartu Keluarga',
'dokumen_formulir' => 'Formulir Permohonan Perorangan',
'dokumen_penguasaan_lahan' => 'Dokumen Penguasaan Lahan',
'dokumen_surat_permohonan_fdb' => 'Surat Permohonan FDB Kelompok',
'dokumen_jaminan' => 'Dokumen Jaminan',
];
$uploadedDocs = $application->documents->keyBy('type');
$reviewDokumen = collect($da->review_dokumen ?? []);
@endphp
{{-- ═══════════════════════════════════════════════════════════════ --}}
{{-- TAB 2: SLIK --}}
{{-- ═══════════════════════════════════════════════════════════════ --}}
Input Hasil SLIK / iDeb OJK
@php $slik = $application->hasilSlik; @endphp
@if($slik)
SLIK sudah diinput pada {{ $slik->tanggal_query?->format('d M Y') ?? '-' }}.
Risk Category: {{ $slik->risk_label }} .
Diinput oleh: {{ $slik->diinputOleh?->name ?? '-' }}.
@endif
{{-- ═══════════════════════════════════════════════════════════════ --}}
{{-- TAB 3: KRITERIA --}}
{{-- ═══════════════════════════════════════════════════════════════ --}}
{{-- ── Section A: Auto-Check (Read-Only) ── --}}
Section A — Hasil Auto-Check Read-Only
Data dihitung otomatis dari form PL. Jika hasil tidak sesuai, kembalikan ke PL — bukan override.
Kriteria Kelompok
@foreach($kriteriaKelompok as $k)
@php
$st = $k['status'] ?? 'perlu_konfirmasi';
$icon = match($st) { 'lulus' => '✅', 'tidak' => '❌', default => '❓' };
$color = match($st) { 'lulus' => 'text-success', 'tidak' => 'text-danger', default => 'text-warning' };
@endphp
{{ $icon }}
{{ $k['label'] }}
{{ $k['info'] ?? '' }}
Auto
@endforeach
Kriteria Debitur (Auto)
@php
$autoKodes = ['a_anggota_kelompok','b_tidak_aktif_bpdlh','e_rumah_bukan_sewa','f_domisili_gt1th','h_usia_produktif','j_kemampuan_bayar','k_profesi'];
@endphp
@foreach($kriteriaDebitur as $k)
@if(in_array($k['kode'], $autoKodes))
@php
$st = $k['status'] ?? 'perlu_konfirmasi';
$icon = match($st) { 'lulus' => '✅', 'tidak' => '❌', default => '❓' };
$color = match($st) { 'lulus' => 'text-success', 'tidak' => 'text-danger', default => 'text-warning' };
$letter = strtoupper(substr($k['kode'], 0, 1));
@endphp
{{ $letter }}.
{{ $icon }}
{{ $k['label'] }}
{{ $k['info'] ?? '' }}
Auto
@endif
@endforeach
Hasil auto-check tidak bisa diubah. Jika ada yang ❌ Tidak Lulus atau ❓ Perlu Konfirmasi , gunakan tombol "Kembalikan ke PL" di Tab Kesimpulan.
{{-- ── Section B: Input Manual Verifikasi (4 item: c, d, g, i) ── --}}
@csrf
Section B — Input Manual Verifikasi 4 Item Wajib
Hanya item ini yang membutuhkan judgment Verifikasi — konfirmasi berdasarkan dokumen fisik atau arsip BPDLH.
@php
$savedKd = collect($da->kriteria_debitur ?? []);
$manualItems = ['c_tidak_macet', 'd_tidak_restrukturisasi', 'g_status_lahan', 'i_masa_penguasaan_lahan'];
@endphp
@foreach($kriteriaDebitur as $k)
@if(! in_array($k['kode'], $manualItems)) @continue @endif
@php
$savedK = $savedKd->firstWhere('kode', $k['kode']) ?? $k;
$savedStatus = $savedK['status'] ?? 'perlu_konfirmasi';
$savedCatatan = $savedK['catatan'] ?? '';
$letter = strtoupper(substr($k['kode'], 0, 1));
$isKriteriaG = $k['kode'] === 'g_status_lahan';
$isKriteriaI = $k['kode'] === 'i_masa_penguasaan_lahan';
@endphp
@if($isKriteriaG)
Jenis Dokumen Lahan yang Ditunjukkan
❓ Belum Dikonfirmasi
✅ Lulus — SHM / Sertifikat Resmi
⚠️ Letter C / Girik / Izin Pemanfaatan
❌ Tidak Ada / Tidak Sesuai
@elseif($isKriteriaI)
Tanggal Berakhir Hak Penguasaan Lahan *
@if($k['info'])
{{ $k['info'] }}
@endif
{{-- hidden status field — di-compute server-side dari tanggal --}}
@elseif($k['kode'] === 'c_tidak_macet')
Konfirmasi dari arsip BPDLH / sistem lama
@elseif($k['kode'] === 'd_tidak_restrukturisasi')
Konfirmasi dari arsip BPDLH / sistem lama
@endif
Catatan
@endforeach
{{-- Safeguard --}}
Safeguard Check
Debitur/usaha tidak masuk daftar exclusion safeguard BPDLH?
Catatan Safeguard
{{ old('safeguard_catatan', $da->safeguard_catatan) }}
Simpan Kriteria Manual & Safeguard
{{-- ═══════════════════════════════════════════════════════════════ --}}
{{-- TAB 4: TALLYSHEET SUMMARY --}}
{{-- ═══════════════════════════════════════════════════════════════ --}}
Tallysheet — Data Produksi & Jaminan
Data diinput oleh PL (read-only). Rasio jaminan terhadap plafond dihitung otomatis.
@php
$jenisLayanan = $application->jenis_layanan ?? '';
$isTundaTebang = str_contains(strtolower($jenisLayanan), 'tunda');
$plafondDiajukan = $application->plafond_diajukan ?? 0;
@endphp
@if($isTundaTebang)
{{-- Tallysheet: Tunda Tebang (LHC Summary) --}}
@php
$pohonList = $application->pohonTundaTebang ?? collect();
$byJenis = $pohonList->groupBy('jenis_pohon');
$totalNilai = $pohonList->sum('nilai_pohon');
$rasioJaminan = $plafondDiajukan > 0 ? round(($totalNilai / $plafondDiajukan) * 100, 2) : 0;
@endphp
Jenis Pohon
Jml Pohon
Total Keliling (cm)
Total Tinggi (m)
Total Nilai
@forelse($byJenis as $jenis => $pohons)
{{ $jenis }}
{{ $pohons->count() }}
{{ number_format($pohons->sum('keliling_cm'), 0, ',', '.') }}
{{ number_format($pohons->sum('tinggi_m'), 0, ',', '.') }}
Rp {{ number_format($pohons->sum('nilai_pohon'), 0, ',', '.') }}
@empty
Belum ada data tallysheet tunda tebang
@endforelse
@if($pohonList->isNotEmpty())
Total
{{ $pohonList->count() }} pohon
Rp {{ number_format($totalNilai, 0, ',', '.') }}
@endif
@else
{{-- Tallysheet: MUK — Produksi Bulanan --}}
@php
$tanamanList = $application->tanaman ?? collect();
$totalPendapatan = 0;
foreach ($tanamanList as $tan) {
foreach ($tan->produksiBulanan as $p) {
$totalPendapatan += $p->total_harga ?? ($p->jumlah_panen_kg * $p->harga_per_kg);
}
}
$nilaiJaminan = (int) ($totalPendapatan * 0.5);
$rasioJaminan = $plafondDiajukan > 0 ? round(($nilaiJaminan / $plafondDiajukan) * 100, 2) : 0;
@endphp
@forelse($tanamanList as $tanaman)
{{ $tanaman->nama_komoditas ?? $tanaman->jenis_tanaman ?? 'Komoditas' }}
@if($tanaman->luas_lahan_ha) ({{ $tanaman->luas_lahan_ha }} ha) @endif
Bulan
Qty (kg)
Harga/kg
Total
@forelse($tanaman->produksiBulanan->sortBy('bulan') as $p)
{{ \App\Models\ProduksiBulanan::getNamaBulan($p->bulan) }}
{{ number_format($p->jumlah_panen_kg, 0, ',', '.') }}
Rp {{ number_format($p->harga_per_kg, 0, ',', '.') }}
Rp {{ number_format($p->total_harga ?? ($p->jumlah_panen_kg * $p->harga_per_kg), 0, ',', '.') }}
@empty
Belum ada data produksi bulanan
@endforelse
Total Pendapatan Tahunan
Rp {{ number_format($tanaman->produksiBulanan->sum(fn($p) => $p->total_harga ?? ($p->jumlah_panen_kg * $p->harga_per_kg)), 0, ',', '.') }}
@empty
Belum ada data tanaman/produksi dari PL.
@endforelse
@endif
{{-- Ringkasan Jaminan --}}
Ringkasan Jaminan vs Plafond
Nilai Jaminan
@if($isTundaTebang)
Rp {{ number_format($totalNilai ?? 0, 0, ',', '.') }}
@else
Rp {{ number_format($nilaiJaminan ?? 0, 0, ',', '.') }}
(50% × total produksi)
@endif
Plafond Diajukan
Rp {{ number_format($plafondDiajukan, 0, ',', '.') }}
Rasio Jaminan / Plafond
{{ number_format($rasioJaminan, 2, ',', '.') }}%
{{ $rasioJaminan >= 125 ? '✅' : '⚠️' }}
(min 125%)
Status Compliance Jaminan
{{ $rasioJaminan >= 125 ? '✅ Accepted' : '❌ Rejected' }}
{{-- ═══════════════════════════════════════════════════════════════ --}}
{{-- TAB 5: COMPLIANCE PARAMETER --}}
{{-- ═══════════════════════════════════════════════════════════════ --}}
@php
$compParams = $da->compliance_params ?? [];
$compAllOk = collect($compParams)->every(fn($p) => ($p['status'] ?? '') === 'Accepted');
$compRejectedCount = collect($compParams)->filter(fn($p) => ($p['status'] ?? '') !== 'Accepted')->count();
$slik = $application->hasilSlik;
@endphp
{{-- Section A: Karakter SLIK --}}
A. Karakter Debitur (SLIK / iDeb OJK)
@if($slik)
Kategori Risiko
{{ $slik->risk_label }}
Skor CSL Eksternal
{{ $slik->risk_score }} × 40% = {{ number_format($slik->risk_score * 0.4, 1) }}
Tunggakan
{{ $slik->ada_tunggakan ? 'Ada — '.$slik->jumlah_hari_tunggakan.' hari' : 'Tidak ada' }}
Tanggal Query
{{ \Carbon\Carbon::parse($slik->tanggal_query)->format('d/m/Y') }}
@if($slik->catatan)
Catatan
{{ $slik->catatan }}
@endif
@else
SLIK belum diinput. Input hasil SLIK di Tab SLIK untuk melihat Karakter Debitur.
@endif
{{-- Section B: CSL Scoring Breakdown --}}
B. CSL Scoring — Breakdown
@if(empty($compParams))
Parameter compliance akan muncul setelah data aplikasi lengkap (SLIK + data FA tersedia).
@else
{{-- ① Compliance Parameters — Gate Wajib --}}
① Compliance Parameter — Gate Wajib
8 parameter dikalkulasi otomatis dari data aplikasi. Parameter 4 (Karakter) dari SLIK.
#
Parameter
Sumber
Status
@foreach($compParams as $idx => $p)
@php $isAcc = ($p['status'] ?? '') === 'Accepted'; @endphp
{{ $idx + 1 }}
{{ $p['label'] }}
{{ ($p['sumber'] ?? '') === 'slik' ? 'SLIK' : 'Auto' }}
{{ $isAcc ? 'Accepted' : 'Rejected' }}
@endforeach
@php $rejectedLabels = collect($compParams)->filter(fn($p) => ($p['status'] ?? '') !== 'Accepted')->pluck('label'); @endphp
@if($compAllOk)
Gate: ✅ Semua 8 Accepted
@else
Gate: ⚠️ {{ $compRejectedCount }} Rejected ({{ $rejectedLabels->join(', ') }})
→ Pengajuan diteruskan ke Signature dengan catatan risiko.
@endif
@if(!$slik)
⏳ Menunggu input SLIK — skor CSL Eksternal/Financial/Non-Financial belum tersedia.
@elseif(!$cslScoring)
Skor CSL akan tersedia setelah FA selesai dan semua data lengkap.
@else
@php
$cslTotal = $cslScoring->skor_total ?? 0;
$cslKat = $cslScoring->kategori_risiko ?? '—';
// 3-state: Hijau (≥50 + all ok), Kuning (≥50 + ada rejected), Merah (<50)
$cslState = $cslTotal >= 50 && $compAllOk ? 'hijau' : ($cslTotal >= 50 ? 'kuning' : 'merah');
$angsuranPerTahun = $cslScoring->angsuran_per_tahun ?? 0;
$angsuranPerBulan = $angsuranPerTahun > 0 ? round($angsuranPerTahun / 12) : 0;
$rpcTahunan = $cslScoring->rpc_tahunan ?? 0;
$rasioRpc = $cslScoring->rasio_rpc ?? 0;
$idir = $rpcTahunan > 0 ? round(($angsuranPerTahun / $rpcTahunan) * 100, 1) : 0;
@endphp
{{-- ② Eksternal 40% --}}
② Komponen Eksternal — bobot 40%
Risk Category
{{ $slik->risk_label }}
Skala nilai
@php
$riskMap = ['very_low'=>'VL','low'=>'L','average'=>'A','moderate'=>'M','high'=>'H','very_high'=>'VH'];
$riskScoresDisplay = \App\Models\HasilSlik::$RISK_SCORE;
@endphp
@foreach($riskScoresDisplay as $key => $score)
{{ $riskMap[$key] ?? $key }}={{ $score }}
@endforeach
Nilai mentah
{{ $cslScoring->nilai_eksternal }}
Kalkulasi: {{ $cslScoring->nilai_eksternal }} × 0,40 =
{{ number_format($cslScoring->skor_eksternal, 1) }} poin
{{-- ③ Financial 30% --}}
③ Komponen Financial — bobot 30%
Sumber: Self Assessment Keuangan + plafond yang diajukan
RPC Tahunan
Rp {{ number_format($rpcTahunan, 0, ',', '.') }}
Angsuran / Tahun
Rp {{ number_format($angsuranPerTahun, 0, ',', '.') }}
@if($angsuranPerBulan)
(Rp {{ number_format($angsuranPerBulan, 0, ',', '.') }}/bln × 12)
@endif
Rasio RPC / Angsuran
{{ number_format($rasioRpc, 2) }}×
IDIR
{{ $idir }}%
(batas maks 80%)
Skala rasio RPC
> 1,5× → nilai 100 (Low Risk)
1 – 1,5× → nilai 75 (Moderate)
< 1× → nilai 50 (High Risk)
Nilai mentah
{{ number_format($cslScoring->nilai_financial ?? 0, 0) }}
Kalkulasi: {{ number_format($cslScoring->nilai_financial ?? 0, 0) }} × 0,30 =
{{ number_format($cslScoring->skor_financial ?? 0, 1) }} poin
{{-- ④ Non-Financial 30% --}}
④ Komponen Non-Financial — bobot 30% (10 Parameter)
@if($cslScoring->params_non_financial)
@php
$nfParams = $cslScoring->params_non_financial;
$nfTotal = collect($nfParams)->sum('nilai');
$nfRataRata = count($nfParams) > 0 ? $nfTotal / count($nfParams) : 0;
@endphp
#
Parameter
Nilai
Kategori
Evidence
@foreach($nfParams as $i => $nf)
{{ $i + 1 }}
{{ $nf['label'] ?? '' }}
{{ $nf['nilai'] ?? '' }}
{{ $nf['kategori'] ?? '' }}
{{ $nf['evidence'] ?? '—' }}
@endforeach
Total nilai mentah:
{{ $nfTotal }}
Rata-rata (÷ 10):
{{ number_format($nfRataRata, 1) }}
× 0,30 = {{ number_format($cslScoring->skor_non_financial ?? 0, 1) }} poin
@endif
{{-- ⑤ Hasil Akhir CSL --}}
@php
$hasilBorderClass = match($cslState) { 'hijau' => 'border-success', 'kuning' => 'border-warning', default => 'border-danger' };
$hasilBgClass = match($cslState) { 'hijau' => 'bg-success bg-opacity-10', 'kuning' => 'bg-warning bg-opacity-10', default => 'bg-danger bg-opacity-10' };
$hasilLabel = match($cslState) {
'hijau' => '✅ Layak — Siap ke Signature',
'kuning' => '⚠️ Skor memenuhi syarat, namun gate compliance belum lolos → diteruskan ke Signature dengan catatan',
default => '❌ Tidak Layak — Skor < 50, rekomendasikan tolak',
};
@endphp
⑤ Hasil Akhir CSL Scoring
Eksternal (40%)
{{ number_format($cslScoring->nilai_eksternal, 0) }} × 0,40 = {{ number_format($cslScoring->skor_eksternal, 1) }}
Financial (30%)
{{ number_format($cslScoring->nilai_financial ?? 0, 0) }} × 0,30 = {{ number_format($cslScoring->skor_financial ?? 0, 1) }}
Non-Financial (30%)
{{ number_format($nfRataRata ?? 0, 1) }} × 0,30 = {{ number_format($cslScoring->skor_non_financial ?? 0, 1) }}
TOTAL CSL
{{ number_format($cslTotal, 1) }} poin
Kategori Risiko:
{{ $cslKat }}
(≥75 = Low, 50–74 = Moderate, <50 = High)
Gate Compliance:
{{ $compAllOk ? '✅ Passed' : '⚠️ '.$compRejectedCount.' Rejected' }}
Syarat lolos: skor ≥50 DAN semua 8 param Accepted
STATUS AKHIR: {{ $hasilLabel }}
@endif {{-- end if slik + cslScoring --}}
@endif {{-- end if compParams not empty --}}
{{-- ═══════════════════════════════════════════════════════════════ --}}
{{-- TAB 5: KESIMPULAN & SUBMIT --}}
{{-- ═══════════════════════════════════════════════════════════════ --}}
Catatan DA & Rekomendasi
@csrf
{{-- ── Ringkasan Status DA (Gate sesuai dokumen) ── --}}
@php
// Gate 1 — Dokumen
$reviewDok = collect($da->review_dokumen ?? []);
$adaTidakValid = $reviewDok->contains('status', 'tidak_valid');
$adaBelumAda = $reviewDok->contains('status', 'belum_ada');
$dokBelumDireview = $reviewDok->isEmpty();
$dokStatus = match(true) {
$dokBelumDireview => 'belum',
$adaTidakValid => 'tidak_valid',
$adaBelumAda => 'belum_ada',
default => 'ok',
};
// Gate 2 — SLIK
$slikOk2 = (bool) $application->hasilSlik;
// Gate 3 — Kriteria Manual (c, d, g, i) — harus sudah dikonfirmasi
$kriteriaKes = collect($da->kriteria_debitur ?? []);
$manualKodesKes = ['c_tidak_macet', 'd_tidak_restrukturisasi', 'g_status_lahan', 'i_masa_penguasaan_lahan'];
$kritManualOkKes = collect($manualKodesKes)->every(function ($kode) use ($kriteriaKes) {
$item = $kriteriaKes->firstWhere('kode', $kode);
return $item && ($item['status'] ?? 'perlu_konfirmasi') !== 'perlu_konfirmasi';
});
// Gate 4 — Safeguard
$safeguardOk = $da->safeguard_clear === true;
// Compliance — informational only (bukan blocker)
$compAllOkKes = collect($da->compliance_params ?? [])->every(fn($p) => ($p['status'] ?? '') === 'Accepted');
$compEmptyKes = empty($da->compliance_params);
// Semua gate terpenuhi? (compliance bukan blocker sesuai spec §3.6)
$gateLolos = $slikOk2 && $kritManualOkKes && $safeguardOk && $dokStatus === 'ok';
@endphp
Gate — Syarat Selesai DA
(sesuai dokumen: "Dokumen valid + DA selesai")
{{-- Gate 1: Dokumen --}}
📄 Dokumen
@if($dokBelumDireview)
⏳ Belum direview
@elseif($adaTidakValid)
❌ Ada Tidak Valid
@elseif($adaBelumAda)
⚠️ Ada Belum Ada
@else
✅ Semua Valid
@endif
@if($adaTidakValid)
Kembalikan ke PL untuk diperbaiki
@endif
{{-- Gate 2: SLIK --}}
🏦 SLIK / iDeb OJK
@if($slikOk2)
✅ Terinput
{{ $application->hasilSlik->risk_label }}
@else
❌ Belum diinput
@endif
{{-- Gate 3: Kriteria Manual --}}
📋 Kriteria Manual (C,D,G,I)
@if($kritManualOkKes)
✅ Semua Terkonfirmasi
@else
@php
$belumKonfirmasiKes = collect($manualKodesKes)->filter(function ($kode) use ($kriteriaKes) {
$item = $kriteriaKes->firstWhere('kode', $kode);
return !$item || ($item['status'] ?? 'perlu_konfirmasi') === 'perlu_konfirmasi';
});
@endphp
❌ {{ $belumKonfirmasiKes->count() }} belum dikonfirmasi
@endif
{{-- Gate 4: Safeguard --}}
🛡️ Safeguard
@if($da->safeguard_clear === true)
✅ Clear
@elseif($da->safeguard_clear === false)
❌ Ada Masalah
@else
⏳ Belum dicek
@endif
{{-- Pesan gate jika ada yang belum lolos --}}
@if(!$gateLolos)
Yang perlu diselesaikan (blocker):
@if($dokBelumDireview) Review semua dokumen di Tab Dokumen @endif
@if($adaTidakValid) Ada dokumen Tidak Valid — kembalikan ke PL @endif
@if(!$slikOk2) Input hasil SLIK di Tab SLIK @endif
@if(!$kritManualOkKes) Konfirmasi kriteria manual C, D, G, I di Tab Kriteria (Section B) @endif
@if($da->safeguard_clear === null) Isi Safeguard Check di Tab Kriteria @endif
@if($da->safeguard_clear === false) Ada masalah safeguard — pertimbangkan kembalikan ke PL @endif
@endif
{{-- Compliance warning — informatif, bukan blocker --}}
@if(!$compEmptyKes && !$compAllOkKes)
Informasi: {{ collect($da->compliance_params)->filter(fn($p) => ($p['status'] ?? '') !== 'Accepted')->count() }} compliance parameter Rejected —
DA tetap bisa disubmit . Evaluasi final CSL dilakukan di Tahap 6 Finalisasi.
@endif
{{-- Kembalikan ke PL --}}
Kembalikan ke PL
@if(!$gateLolos)
Selesai DA → Lanjut ke Finalisasi CSL
@else
Selesai DA → Lanjut ke Finalisasi CSL
@endif