@extends('layouts.adminlte')
@section('title', 'SLIP GAJI')
@section('page_title', 'SLIP GAJI')
@push('styles')
@endpush
@section('content')
@php
$profile = $slipProfile;
$layout = collect($slipLayout ?? []);
$dynamicEarnings = collect($slipDynamicEarnings ?? []);
$dynamicDeductions = collect($slipDynamicDeductions ?? []);
$bpjsDetailRows = collect($bpjsDetails ?? []);
$fmtMoney = fn ($v) => number_format((float) $v, 2, ',', '.');
$fmtNum = fn ($v, $d = 1) => number_format((float) $v, $d, ',', '.');
$gender = strtoupper(trim((string) ($row['gender'] ?? '')));
$jk = $gender === 'P' ? 'P' : ($gender === 'L' ? 'L' : '-');
$statusKawin = trim((string) ($row['tax_family_status'] ?? '-')) ?: '-';
$statusKaryawan = trim((string) ($row['employment_status'] ?? '-')) ?: '-';
$jenisLembur = strtolower((string) ($row['salary_scheme'] ?? '')) === 'all_in' ? 'All In' : 'Normal';
$bankName = trim((string) ($row['bank_name'] ?? ''));
$bankAccountNo = trim((string) ($row['bank_account_no'] ?? ''));
$bankAccountName = trim((string) ($row['bank_account_name'] ?? ''));
$bankAccountLabel = trim((string) ($row['bank_account_label'] ?? ''));
$npwpNo = trim((string) ($row['npwp_no'] ?? '')) ?: trim((string) ($row['pph21_npwp_no'] ?? '')) ?: trim((string) ($assignment->karyawan?->npwp_no ?? ''));
$rawJamLembur = (float) ($row['overtime_hours'] ?? 0);
$jamLembur = (float) ($row['weighted_overtime_hours'] ?? $rawJamLembur);
$overtimeRate = (float) ($row['overtime_rate'] ?? ($row['hourly_rate'] ?? 0));
$upahLembur = round((float) ($row['overtime_nominal'] ?? ($overtimeRate * $jamLembur)), 2);
$allowFixed = (float) ($row['allowance_fixed'] ?? 0);
$tJabatan = (float) ($row['allowance_position'] ?? 0);
$tKeahlian = (float) ($row['allowance_skill'] ?? 0);
$allowMedicalHousing = (float) ($row['allowance_medical_housing'] ?? 0);
$allowOther = (float) ($row['allowance_other'] ?? 0);
$allowTotal = (float) ($row['allowance_total'] ?? 0);
if ($allowTotal <= 0) {
$allowTotal = $allowFixed + $tJabatan + $tKeahlian + $allowMedicalHousing + $allowOther;
}
$incentive = (float) ($row['incentive_amount'] ?? 0);
$reimburse = (float) ($row['reimburse_nominal'] ?? 0);
$dedAbsence = (float) ($row['absence_deduction_nominal'] ?? 0);
$dedLate = (float) ($row['late_deduction_nominal'] ?? 0);
$dedDynamicFromBreakdown = (float) ($row['dynamic_deduction_nominal'] ?? 0);
$dedDynamicFromRows = 0.0;
foreach ($dynamicDeductions as $c) {
$code = strtolower((string) ($c['component_code'] ?? ''));
$name = strtolower((string) ($c['component_name'] ?? ''));
$text = trim($code . ' ' . $name);
$amt = (float) ($c['amount'] ?? 0);
if (str_contains($text, 'pph')
|| str_contains($text, 'jht')
|| str_contains($text, 'jpk')
|| str_contains($text, 'kesehatan')
|| str_contains($text, 'kes')
|| preg_match('/(^|[^a-z])jp([^a-z]|$)/', $text) === 1) {
continue;
}
$dedDynamicFromRows += $amt;
}
$dedDynamic = $dedDynamicFromBreakdown > 0 ? $dedDynamicFromBreakdown : round($dedDynamicFromRows, 2);
$potKelebihan = round($dedAbsence + $dedLate + $dedDynamic, 2);
$grossNominal = (float) ($row['gross_nominal'] ?? ($row['billed_nominal'] ?? 0));
$grossBeforeInternalDeductions = max(0.0, $grossNominal + $dedAbsence + $dedLate);
$upahPokok = max(0.0, $grossBeforeInternalDeductions - $allowTotal - $incentive - $upahLembur);
$totalUpahPokok = $upahPokok + $upahLembur;
$tTidakTetap = $allowFixed + $allowMedicalHousing + $allowOther + $incentive + $reimburse;
$totalTunjangan = $tJabatan + $tKeahlian + $tTidakTetap;
$koreksiHari = 0.0;
$koreksiLembur = 0.0;
$totalKoreksi = $koreksiHari + $koreksiLembur;
$pph21 = (float) ($row['pph21_nominal'] ?? 0);
$jht = 0.0;
$jp = 0.0;
$jpk = 0.0;
$bpjs = (float) ($row['bpjs_nominal'] ?? 0);
if ($bpjsDetailRows->isNotEmpty()) {
$jht = (float) $bpjsDetailRows->where('component_code', 'JHT')->sum('employee_nominal');
$jp = (float) $bpjsDetailRows->where('component_code', 'JP')->sum('employee_nominal');
$jpk = (float) $bpjsDetailRows->where('component_code', 'JPK')->sum('employee_nominal');
$bpjsSplit = round($jht + $jp + $jpk, 2);
if ($bpjs > 0 && abs($bpjsSplit - $bpjs) >= 0.01) {
$jpk = round($jpk + ($bpjs - $bpjsSplit), 2);
}
} elseif ($dynamicDeductions->isNotEmpty()) {
foreach ($dynamicDeductions as $c) {
$code = strtolower((string) ($c['component_code'] ?? ''));
$name = strtolower((string) ($c['component_name'] ?? ''));
$text = trim($code . ' ' . $name);
$amt = (float) ($c['amount'] ?? 0);
if (str_contains($text, 'pph')) {
continue;
}
if (str_contains($text, 'jht')) {
$jht += $amt;
continue;
}
if (str_contains($text, 'jpk') || str_contains($text, 'kesehatan') || str_contains($text, 'kes')) {
$jpk += $amt;
continue;
}
if (preg_match('/(^|[^a-z])jp([^a-z]|$)/', $text) === 1) {
$jp += $amt;
continue;
}
}
$pph21 = round($pph21, 2);
$jht = round($jht, 2);
$jp = round($jp, 2);
$jpk = round($jpk, 2);
$parsedBpjs = round($jht + $jp + $jpk, 2);
if ($bpjs > 0 && abs($parsedBpjs - $bpjs) >= 0.01) {
$jht = round($bpjs * 0.5, 2);
$jp = round($bpjs * 0.25, 2);
$jpk = round($bpjs - $jht - $jp, 2);
}
}
if ($bpjsDetailRows->isEmpty() && $dynamicDeductions->isEmpty()) {
$jht = round($bpjs * 0.5, 2);
$jp = round($bpjs * 0.25, 2);
$jpk = round($bpjs - $jht - $jp, 2);
}
$totalPotongan = round($pph21 + $bpjs + $potKelebihan, 2);
$gajiBersih = round(max(0.0, ($totalUpahPokok + $totalTunjangan + $totalKoreksi) - $totalPotongan), 2);
$thp = (float) ($row['net_nominal'] ?? 0);
$ot15 = 0.0;
$ot2 = 0.0;
$ot3 = 0.0;
$ot4 = 0.0;
if ($rawJamLembur > 0) {
$ot15 = min(1.0, $rawJamLembur);
$remaining = max(0.0, $rawJamLembur - $ot15);
$ot2 = $remaining;
}
$otNom15 = $ot15 * 1.5;
$otNom2 = $ot2 * 2.0;
$otNom3 = $ot3 * 3.0;
$otNom4 = $ot4 * 4.0;
@endphp
{{ $profile?->company_name ?: 'PT. HIKARI TEKNOLOGI INDONESIA' }}
| Periode : {{ $row['period_start'] ?? '-' }} S/D {{ $row['period_end'] ?? '-' }} |
Sts Kawin : {{ $statusKawin }} |
Tgl Proses : {{ $row['paid_pay_date'] ?? '-' }} |
| No. Finger : {{ $assignment->karyawan?->employee_code ?: '-' }} |
Sts Karyawan : {{ $statusKaryawan }} |
Jenis Lembur : {{ $jenisLembur }} |
| Nama : {{ $assignment->karyawan?->full_name ?: '-' }} |
JK : {{ $jk }} |
Rekening :
@if($bankName !== '' || $bankAccountNo !== '' || $bankAccountName !== '')
{{ $bankName !== '' ? $bankName : '-' }}
{{ $bankAccountNo !== '' ? $bankAccountNo : '-' }}
@if($bankAccountName !== '')
a/n {{ $bankAccountName }}
@endif
@else
{{ $bankAccountLabel !== '' ? $bankAccountLabel : '-' }}
@endif
|
| Upah Pokok (1) |
Perhitungan Lembur |
Potongan (4) |
| Upah | Rp {{ $fmtMoney($upahPokok) }} |
@ 1,5 | {{ $fmtNum($ot15) }} | x | 1,5 | {{ $fmtNum($otNom15) }} |
PPh 21 | Rp {{ $fmtMoney($pph21) }} |
| Lembur | {{ $fmtNum($jamLembur) }} | x | Rp {{ $fmtMoney($overtimeRate) }} | Rp {{ $fmtMoney($upahLembur) }} |
@ 2 | {{ $fmtNum($ot2) }} | x | 2,0 | {{ $fmtNum($otNom2) }} |
JHT 2% | Rp {{ $fmtMoney($jht) }} |
| Total | Rp {{ $fmtMoney($totalUpahPokok) }} |
@ 3 | {{ $fmtNum($ot3) }} | x | 3,0 | {{ $fmtNum($otNom3) }} |
JP 1% | Rp {{ $fmtMoney($jp) }} |
| Tunjangan (2) |
@ 4 | {{ $fmtNum($ot4) }} | x | 4,0 | {{ $fmtNum($otNom4) }} |
JPK 1% | Rp {{ $fmtMoney($jpk) }} |
| Jabatan | Rp {{ $fmtMoney($tJabatan) }} |
Total Lembur |
{{ $fmtNum($jamLembur) }} |
| Keahlian | Rp {{ $fmtMoney($tKeahlian) }} |
|
Potongan Lain | Rp {{ $fmtMoney($potKelebihan) }} |
| Tidak Tetap | Rp {{ $fmtMoney($tTidakTetap) }} |
|
Total | Rp {{ $fmtMoney($totalPotongan) }} |
| Total | Rp {{ $fmtMoney($totalTunjangan) }} |
Koreksi (3) |
|
|
Hari Kerja | {{ $fmtNum($row['hk_days'] ?? 0, 0) }} | x | {{ $fmtMoney(0) }} | Rp {{ $fmtMoney($koreksiHari) }} |
|
|
Lembur | {{ $fmtNum($jamLembur) }} | x | {{ $fmtMoney(0) }} | Rp {{ $fmtMoney($koreksiLembur) }} |
|
| Gaji Bersih ( 1 + 2 + 3 - 4 ) : Rp {{ $fmtMoney($gajiBersih) }} |
Total Koreksi : Rp {{ $fmtMoney($totalKoreksi) }} |
Take Home Pay : Rp {{ $fmtMoney($thp) }} |
HK: {{ number_format((float) ($row['hk_days'] ?? 0), 0, ',', '.') }}/{{ number_format((float) ($row['expected_hk_days'] ?? 0), 0, ',', '.') }}
| Alpha: {{ number_format((float) ($row['alpha_days'] ?? 0), 0, ',', '.') }}
| Cuti: {{ number_format((float) ($row['cuti_days'] ?? 0), 0, ',', '.') }}
| Approved: {{ number_format((float) ($row['approved_days'] ?? 0), 0, ',', '.') }} hari / {{ number_format((float) ($row['approved_hours'] ?? 0), 2, ',', '.') }} jam
| NPWP: {{ $npwpNo !== '' ? $npwpNo : '-' }}
| Generated: {{ $generatedAt ?? '-' }}
| Komponen Pendapatan Dinamis |
| Kode |
Nama |
Sumber |
Nominal |
@forelse($dynamicEarnings as $c)
| {{ $c['component_code'] ?? '-' }} |
{{ $c['component_name'] ?? '-' }} |
{{ strtoupper((string) ($c['source'] ?? '-')) }} |
Rp {{ $fmtMoney($c['amount'] ?? 0) }} |
@empty
| Tidak ada komponen pendapatan dinamis. |
@endforelse
| Komponen Potongan Dinamis |
| Kode |
Nama |
Sumber |
Nominal |
@forelse($dynamicDeductions as $c)
| {{ $c['component_code'] ?? '-' }} |
{{ $c['component_name'] ?? '-' }} |
{{ strtoupper((string) ($c['source'] ?? '-')) }} |
Rp {{ $fmtMoney($c['amount'] ?? 0) }} |
@empty
| Tidak ada komponen potongan dinamis. |
@endforelse
@if(request()->query('autoprint') === '1')
@endif
@endsection