{{-- Header --}}

{{ $angsuran->mahasiswa->kampus->nama ?? 'KAMPUS TIDAK ADA' }}

PROGRAM PERKULIAHAN

{{-- Student Info --}}
Nama : {{ $angsuran->mahasiswa->nama }}
NIM : {{ $angsuran->mahasiswa->nim }}
Status : Baru
No Telp : {{ $angsuran->mahasiswa->no_wa ?? '-' }}
Kelompok : {{ $angsuran->mahasiswa->kelompok ?? 'SMA' }}
Angkatan : ({{ $angsuran->mahasiswa->angkatan }})
Program Studi : @if ($angsuran->mahasiswa->prodi && $angsuran->mahasiswa->prodi->jenjang) [{{ $angsuran->mahasiswa->prodi->jenjang }}] @endif {{ $angsuran->mahasiswa->prodi->nama ?? '-' }}
{{-- Helper function to check if item is on cuti (history cuti) --}} @php $cutiSemester = $angsuran->mahasiswa->cuti_semester; $cutiList = []; if (!is_null($cutiSemester)) { if (is_string($cutiSemester) && str_starts_with($cutiSemester, '[')) { $cutiList = json_decode($cutiSemester, true); } elseif (is_array($cutiSemester)) { $cutiList = $cutiSemester; } elseif ($cutiSemester != '') { $cutiList = [$cutiSemester]; } } $isItemOnCuti = function ($detail) use ($angsuran, $cutiList) { if (empty($cutiList)) { return false; } $kodeBiaya = $detail->kode_biaya; // Biaya RUTIN, BL, SP, BT tidak terpengaruh cuti if ( str_starts_with($kodeBiaya, 'RUTIN-') || str_starts_with($kodeBiaya, 'BL-') || str_starts_with($kodeBiaya, 'SP-') || str_starts_with($kodeBiaya, 'BT-') ) { return false; } // Hanya SPB, SPP, UKT yang bisa terkena cuti if ( !str_starts_with($kodeBiaya, 'SPB') && !str_starts_with($kodeBiaya, 'SPP') && !str_starts_with($kodeBiaya, 'UKT') ) { return false; } return in_array($detail->semester, $cutiList); }; $cutiText = !empty($cutiList) ? 'Semester ' . implode(', ', $cutiList) : ''; @endphp @if ($cutiText)
Informasi Cuti: {{ $cutiText }} (Item dicoret karena cuti pada semester tersebut)
@endif {{-- BIAYA TAMBAHAN (RUTIN, SEMESTER PENDEK, DLL) --}} @php $biayaTambahan = $angsuran->details ->filter(function ($d) { $kode = $d->kode_biaya; return str_starts_with($kode, 'RUTIN-') || str_starts_with($kode, 'SP-') || str_starts_with($kode, 'BL-') || str_starts_with($kode, 'BT-'); }) ->sortBy(function ($detail) { preg_match('/S(\d+)-/', $detail->kode_biaya, $matches); $semester = (int) ($matches[1] ?? 0); $jenis = substr($detail->kode_biaya, 0, strpos($detail->kode_biaya, '-')); $prioritas = ['RUTIN' => 1, 'SP' => 2, 'BL' => 3, 'BT' => 4]; return [$semester, $prioritas[$jenis] ?? 5]; }) ->values(); // PERBAIKAN: Group biaya tambahan berdasarkan semester $groupedBiayaTambahan = $biayaTambahan->groupBy(function ($detail) { preg_match('/S(\d+)-/', $detail->kode_biaya, $matches); return 'Semester ' . ($matches[1] ?? '0'); }); @endphp @if ($biayaTambahan->count() > 0)

BIAYA LAINNYA

@foreach ($groupedBiayaTambahan as $semester => $semesterDetails) @foreach ($semesterDetails as $index => $detail) @php $jenisBiaya = str_starts_with($detail->kode_biaya, 'RUTIN-') ? 'Biaya Rutin' : (str_starts_with($detail->kode_biaya, 'SP-') ? 'Semester Pendek' : (str_starts_with($detail->kode_biaya, 'BL-') ? 'Biaya Lain' : 'Biaya Tetap')); $isCuti = $isItemOnCuti($detail); // Tampilkan nilai asli jika potongan pending $displayTotal = $detail->total; $displaySisa = $detail->sisa; if ($detail->total_asli && $detail->potongan_valid !== 'valid') { $displayTotal = $detail->total_asli; $displaySisa = $detail->total_asli - $detail->dibayar; } @endphp @endforeach @endforeach
No Jenis Biaya Komponen Rencana Realisasi
Tanggal Rupiah Tanggal Rupiah
{{ $semester }}
{{ $index + 1 }} {{ $jenisBiaya }} @if ($isCuti) {{ $detail->komponen }} (Cuti Semester {{ $detail->semester }}) @else {{ $detail->komponen }} @endif @if ($isCuti) {{ \Carbon\Carbon::parse($detail->tanggal_angsuran)->format('d-m-Y') }} @else {{ \Carbon\Carbon::parse($detail->tanggal_angsuran)->format('d-m-Y') }} @endif @if ($isCuti) Rp {{ number_format($displayTotal, 0, ',', '.') }} @else Rp {{ number_format($displayTotal, 0, ',', '.') }} @endif @if ($isCuti) - @else @if ($detail->tanggal_bayar) {{ \Carbon\Carbon::parse($detail->tanggal_bayar)->format('d-m-Y') }} @else - @endif @endif @if ($isCuti) - @else @if ($detail->dibayar > 0) Rp {{ number_format($detail->dibayar, 0, ',', '.') }} @else - @endif @endif
Jumlah {{ $semester }} Rp {{ number_format($semesterDetails->sum('total'), 0, ',', '.') }} Jumlah Rp {{ number_format($semesterDetails->sum('dibayar'), 0, ',', '.') }}
TOTAL BIAYA LAINNYA Rp {{ number_format($biayaTambahan->sum('total'), 0, ',', '.') }} TOTAL Rp {{ number_format($biayaTambahan->sum('dibayar'), 0, ',', '.') }}
@endif {{-- SPB, SPP dan UKT --}} @php $spbDetails = $angsuran->details ->filter(fn($d) => str_starts_with($d->kode_biaya, 'SPB')) ->sortBy(function ($d) { preg_match('/SPB_(\d+)/', $d->kode_biaya, $m); return (int) ($m[1] ?? 0); }) ->values(); $sppDetails = $angsuran->details ->filter(fn($d) => str_starts_with($d->kode_biaya, 'SPP')) ->sortBy(function ($d) { preg_match('/SPP(\d+)_(\d+)/', $d->kode_biaya, $m); return [(int) ($m[2] ?? 1), (int) ($m[1] ?? 0)]; }) ->values(); $uktDetails = $angsuran->details ->filter(fn($d) => str_starts_with($d->kode_biaya, 'UKT')) ->sortBy(function ($d) { preg_match('/UKT(\d+)_(\d+)/', $d->kode_biaya, $m); return [(int) ($m[2] ?? 1), (int) ($m[1] ?? 0)]; }) ->values(); $sppGrouped = $sppDetails->groupBy(function ($d) { preg_match('/SPP(\d+)_(\d+)/', $d->kode_biaya, $m); return 'Semester ' . ($m[2] ?? '1'); }); $uktGrouped = $uktDetails->groupBy(function ($d) { preg_match('/UKT(\d+)_(\d+)/', $d->kode_biaya, $m); return 'Semester ' . ($m[2] ?? '1'); }); @endphp
@if ($spbDetails->count() > 0)

SUMBANGAN UANG GEDUNG (SPB)

@foreach ($spbDetails as $i => $d) @php $isCuti = $isItemOnCuti($d); $displayTotal = $d->total; if ($d->total_asli && $d->potongan_valid !== 'valid') { $displayTotal = $d->total_asli; } @endphp @endforeach
No Rencana Realisasi
Tanggal Rupiah Tanggal Rupiah
{{ $i + 1 }} @if ($isCuti) {{ \Carbon\Carbon::parse($d->tanggal_angsuran)->format('d-m-Y') }} @else {{ \Carbon\Carbon::parse($d->tanggal_angsuran)->format('d-m-Y') }} @endif @if ($isCuti) Rp {{ number_format($displayTotal, 0, ',', '.') }} @else Rp {{ number_format($displayTotal, 0, ',', '.') }} @endif @if ($isCuti) - @else @if ($d->tanggal_bayar) {{ \Carbon\Carbon::parse($d->tanggal_bayar)->format('d-m-Y') }} @else - @endif @endif @if ($isCuti) - @else @if ($d->dibayar > 0) Rp {{ number_format($d->dibayar, 0, ',', '.') }} @else - @endif @endif
Jumlah SPB Rp {{ number_format($spbDetails->sum('total'), 0, ',', '.') }} Jumlah Rp {{ number_format($spbDetails->sum('dibayar'), 0, ',', '.') }}
@endif @if ($sppDetails->count() > 0)

SUMBANGAN PENDIDIKAN PERSEMESTER (SPP)

@foreach ($sppGrouped as $semester => $details)
{{ $semester }}
@foreach ($details as $idx => $d) @php preg_match('/SPP(\d+)_(\d+)/', $d->kode_biaya, $m); $angsuranKe = $m[1] ?? $idx + 1; $isCuti = $isItemOnCuti($d); $displayTotal = $d->total; if ($d->total_asli && $d->potongan_valid !== 'valid') { $displayTotal = $d->total_asli; } @endphp @endforeach
Angsuran Ke- Rencana Realisasi
Tanggal Rupiah Tanggal Rupiah
{{ $angsuranKe }} @if ($isCuti) {{ \Carbon\Carbon::parse($d->tanggal_angsuran)->format('d-m-Y') }} @else {{ \Carbon\Carbon::parse($d->tanggal_angsuran)->format('d-m-Y') }} @endif @if ($isCuti) Rp {{ number_format($displayTotal, 0, ',', '.') }} @else Rp {{ number_format($displayTotal, 0, ',', '.') }} @endif @if ($isCuti) - @else @if ($d->tanggal_bayar) {{ \Carbon\Carbon::parse($d->tanggal_bayar)->format('d-m-Y') }} @else - @endif @endif @if ($isCuti) - @else @if ($d->dibayar > 0) Rp {{ number_format($d->dibayar, 0, ',', '.') }} @else - @endif @endif
Jumlah {{ $semester }} Rp {{ number_format($details->sum('total'), 0, ',', '.') }} Jumlah Rp {{ number_format($details->sum('dibayar'), 0, ',', '.') }}
@endforeach
@endif @if ($uktDetails->count() > 0)

UANG KULIAH TUNGGAL (UKT)

@foreach ($uktGrouped as $semester => $details)
{{ $semester }}
@foreach ($details as $idx => $d) @php preg_match('/UKT(\d+)_(\d+)/', $d->kode_biaya, $m); $angsuranKe = $m[1] ?? $idx + 1; $isCuti = $isItemOnCuti($d); $displayTotal = $d->total; if ($d->total_asli && $d->potongan_valid !== 'valid') { $displayTotal = $d->total_asli; } @endphp @endforeach
Angsuran Ke- Rencana Realisasi
Tanggal Rupiah Tanggal Rupiah
{{ $angsuranKe }} @if ($isCuti) {{ \Carbon\Carbon::parse($d->tanggal_angsuran)->format('d-m-Y') }} @else {{ \Carbon\Carbon::parse($d->tanggal_angsuran)->format('d-m-Y') }} @endif @if ($isCuti) Rp {{ number_format($displayTotal, 0, ',', '.') }} @else Rp {{ number_format($displayTotal, 0, ',', '.') }} @endif @if ($isCuti) - @else @if ($d->tanggal_bayar) {{ \Carbon\Carbon::parse($d->tanggal_bayar)->format('d-m-Y') }} @else - @endif @endif @if ($isCuti) - @else @if ($d->dibayar > 0) Rp {{ number_format($d->dibayar, 0, ',', '.') }} @else - @endif @endif
Jumlah {{ $semester }} Rp {{ number_format($details->sum('total'), 0, ',', '.') }} Jumlah Rp {{ number_format($details->sum('dibayar'), 0, ',', '.') }}
@endforeach
@endif
{{-- Summary --}}

Total Tagihan: Rp {{ number_format($angsuran->total, 0, ',', '.') }}

Total Dibayar: Rp {{ number_format($angsuran->total - $angsuran->sisa, 0, ',', '.') }}

Sisa Tagihan: Rp {{ number_format($angsuran->sisa, 0, ',', '.') }}

Status: {{ $angsuran->sisa <= 0 ? 'LUNAS' : 'BELUM LUNAS' }}

@if ($cutiText)

Catatan: Item semester yang dicoret adalah history cuti (Semester {{ implode(', ', $cutiList) }}) dan tidak wajib dibayar.

@endif