{{-- 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 ?? '-' }}
{{-- Informasi History Cuti --}} @php $cutiSemester = $angsuran->mahasiswa->cuti_semester; $cutiText = ''; $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]; } if (is_array($cutiList) && count($cutiList) > 0) { $cutiText = 'Semester ' . implode(', ', $cutiList); } } // Helper function to check if item is on cuti $isItemOnCuti = function ($detail) use ($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); }; @endphp @if ($cutiText)
Informasi Cuti: {{ $cutiText }} (Item dicoret karena cuti pada semester tersebut)
@endif {{-- Biaya Lainnya (RUTIN, SP, BL, BT) --}} @php // Filter biaya tetap rutin, semester pendek, dan lainnya $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]; $urutanJenis = $prioritas[$jenis] ?? 5; return [$semester, $urutanJenis]; }) ->values(); @endphp {{-- Tabel Biaya Lainnya --}} @if ($biayaTambahan->count() > 0)

BIAYA LAINNYA

@php $groupedBySemester = $biayaTambahan->groupBy(function ($detail) { preg_match('/S(\d+)-/', $detail->kode_biaya, $matches); return 'Semester ' . ($matches[1] ?? '0'); }); @endphp @foreach ($groupedBySemester as $semester => $semesterDetails) @foreach ($semesterDetails as $index => $detail) @php $jenisBiaya = ''; if (str_starts_with($detail->kode_biaya, 'RUTIN-')) { $jenisBiaya = 'Biaya Tetap Rutin'; } elseif (str_starts_with($detail->kode_biaya, 'SP-')) { $jenisBiaya = 'Semester Pendek'; } elseif (str_starts_with($detail->kode_biaya, 'BL-')) { $jenisBiaya = 'Biaya Lain'; } elseif (str_starts_with($detail->kode_biaya, 'BT-')) { $jenisBiaya = 'Biaya Tambahan'; } $isCuti = $isItemOnCuti($detail); $rowClass = $isCuti ? 'cuti-item' : ''; @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($detail->total, 0, ',', '.') }} @else Rp {{ number_format($detail->total, 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 Side by Side --}} @php $spbDetails = $angsuran->details ->filter(fn($d) => str_starts_with($d->kode_biaya, 'SPB')) ->sortBy(function ($detail) { preg_match('/SPB(\d+)/', $detail->kode_biaya, $matches); return (int) ($matches[1] ?? 0); }) ->values(); $sppDetails = $angsuran->details ->filter(fn($d) => str_starts_with($d->kode_biaya, 'SPP')) ->sortBy(function ($detail) { preg_match('/SPP(\d+)_(\d+)/', $detail->kode_biaya, $matches); return [(int) ($matches[2] ?? 1), (int) ($matches[1] ?? 0)]; }) ->values(); $uktDetails = $angsuran->details ->filter(fn($d) => str_starts_with($d->kode_biaya, 'UKT')) ->sortBy(function ($detail) { preg_match('/UKT(\d+)_(\d+)/', $detail->kode_biaya, $matches); return [(int) ($matches[2] ?? 1), (int) ($matches[1] ?? 0)]; }) ->values(); $sppGroupedBySemester = $sppDetails->groupBy(function ($detail) { preg_match('/SPP(\d+)_(\d+)/', $detail->kode_biaya, $matches); return 'Semester ' . ($matches[2] ?? '1'); }); $uktGroupedBySemester = $uktDetails->groupBy(function ($detail) { preg_match('/UKT(\d+)_(\d+)/', $detail->kode_biaya, $matches); return 'Semester ' . ($matches[2] ?? '1'); }); $onlyUkt = $spbDetails->isEmpty() && $sppDetails->isEmpty() && $uktDetails->isNotEmpty(); @endphp
{{-- SPB Table --}} @if ($spbDetails->count() > 0)

SUMBANGAN UANG GEDUNG (SPB)

@foreach ($spbDetails as $index => $detail) @php $isCuti = $isItemOnCuti($detail); @endphp @endforeach
No Rencana Realisasi
Tanggal Rupiah Tanggal Rupiah
{{ $index + 1 }} @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($detail->total, 0, ',', '.') }} @else Rp {{ number_format($detail->total, 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 SPB Rp {{ number_format($spbDetails->sum('total'), 0, ',', '.') }} Jumlah Rp {{ number_format($spbDetails->sum('dibayar'), 0, ',', '.') }}
@endif {{-- SPP Table --}} @if ($sppDetails->count() > 0)

SUMBANGAN PENDIDIKAN PERSEMESTER (SPP)

@foreach ($sppGroupedBySemester as $semester => $semesterDetails)
{{ $semester }}
@foreach ($semesterDetails as $index => $detail) @php preg_match('/SPP(\d+)_(\d+)/', $detail->kode_biaya, $matches); $angsuranKe = $matches[1] ?? $index + 1; $isCuti = $isItemOnCuti($detail); @endphp @endforeach
Angsuran Ke- Rencana Realisasi
Tanggal Rupiah Tanggal Rupiah
{{ $angsuranKe }} @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($detail->total, 0, ',', '.') }} @else Rp {{ number_format($detail->total, 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, ',', '.') }}
@endforeach
@endif {{-- UKT Table --}} @if ($uktDetails->count() > 0)

UANG KULIAH TUNGGAL (UKT)

@foreach ($uktGroupedBySemester as $semester => $semesterDetails)
{{ $semester }}
@foreach ($semesterDetails as $index => $detail) @php preg_match('/UKT(\d+)_(\d+)/', $detail->kode_biaya, $matches); $angsuranKe = $matches[1] ?? $index + 1; $isCuti = $isItemOnCuti($detail); @endphp @endforeach
Angsuran Ke- Rencana Realisasi
Tanggal Rupiah Tanggal Rupiah
{{ $angsuranKe }} @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($detail->total, 0, ',', '.') }} @else Rp {{ number_format($detail->total, 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, ',', '.') }}
@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' }}

{{-- Print Button --}}