{{-- 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
| No |
Jenis Biaya |
Komponen |
Rencana |
Realisasi |
|
|
|
Tanggal |
Rupiah |
Tanggal |
Rupiah |
@foreach ($groupedBiayaTambahan as $semester => $semesterDetails)
|
{{ $semester }}
|
@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
| {{ $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
|
@endforeach
| Jumlah {{ $semester }} |
Rp
{{ number_format($semesterDetails->sum('total'), 0, ',', '.') }} |
Jumlah |
Rp
{{ number_format($semesterDetails->sum('dibayar'), 0, ',', '.') }} |
@endforeach
| 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)
| No |
Rencana |
Realisasi |
|
Tanggal |
Rupiah |
Tanggal |
Rupiah |
@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
| {{ $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
|
@endforeach
| 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 }}
| Angsuran Ke- |
Rencana |
Realisasi |
|
Tanggal |
Rupiah |
Tanggal |
Rupiah |
@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
| {{ $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
|
@endforeach
| 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 }}
| Angsuran Ke- |
Rencana |
Realisasi |
|
Tanggal |
Rupiah |
Tanggal |
Rupiah |
@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
| {{ $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
|
@endforeach
| 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