Detail Penggajian

{{ $assignment->karyawan?->employee_code }} - {{ $assignment->karyawan?->full_name }} | Profil Bulan: {{ $profil->code }} - {{ $profil->name }} | Periode: {{ $effectiveStart }} s/d {{ $effectiveEnd }}
@php $dailyRows = is_array($dailyRows ?? null) ? $dailyRows : []; $otCols = is_array($dailyRowsOtColumns ?? null) ? $dailyRowsOtColumns : []; $sumPlannedHours = 0.0; $sumHk = 0.0; $jamTdkMasuk = 0.0; $sumOvertime = 0.0; $sumWeightedOvertime = 0.0; $otTotals = []; $pdfPayrollBasis = is_array($payrollBasis ?? null) ? $payrollBasis : []; $hkHoursPerDay = (float) ($pdfPayrollBasis['hours_per_day'] ?? ($profil->jam_per_hari ?? 8)); $hkBaseHours = (float) ($pdfPayrollBasis['monthly_hour_base'] ?? (((float) ($profil->hk_basis ?? 21)) * $hkHoursPerDay)); $hkBasis = $hkHoursPerDay > 0 ? ($hkBaseHours / $hkHoursPerDay) : (float) ($profil->hk_basis ?? 21); $fmt = function ($v) { return rtrim(rtrim(number_format((float) $v, 2, '.', ''), '0'), '.'); }; $dayTypeLabelResolver = static fn (string $dayType): string => match ($dayType) { 'holiday_special' => 'Holiday Special', 'holiday' => 'Holiday', 'weekend' => 'Weekend', default => 'Workday', }; $specialPaymentModeLabelResolver = static fn (?string $mode): string => match (strtolower(trim((string) $mode))) { 'payroll' => 'Gabung Payroll', 'separate' => 'Bayar Terpisah', default => '-', }; $emergencyBaselineLabelResolver = static fn (?string $mode): string => match (strtolower(trim((string) $mode))) { 'after_normal_shift' => 'Setelah jam normal selesai', 'after_normal_or_existing_ot' => 'Setelah jam normal / OT existing selesai', default => trim((string) $mode) !== '' ? trim((string) $mode) : '-', }; $emergencyMultiplierLabelResolver = static fn (?string $profile): string => match (strtolower(trim((string) $profile))) { 'default' => 'Default Emergency x2', default => trim((string) $profile) !== '' ? trim((string) $profile) : '-', }; $workTargetBonusSourceLabelResolver = static fn (?string $source): string => match (strtolower(trim((string) $source))) { 'manual_override' => 'Override manual', 'remaining_target' => 'Sisa target aktual', default => trim((string) $source) !== '' ? trim((string) $source) : '-', }; $dayTypeRowClassResolver = static fn (string $dayType): string => match ($dayType) { 'holiday_special' => 'row-holiday-special', 'holiday' => 'row-holiday', 'weekend' => 'row-weekend', default => '', }; $isHolidayLikeDayType = static fn (string $dayType): bool => in_array($dayType, ['holiday', 'holiday_special'], true); $resolvePayrollDayCredit = static fn (array $detailRow, float $hkHoursPerDay, $profil): array => \App\Modules\AttendanceReview\Services\AttendanceDayCreditResolver::resolve($detailRow, $profil, $hkHoursPerDay); foreach ($dailyRows as $row) { $sumPlannedHours += (float) ($row['planned_hours'] ?? 0); $sumOvertime += (float) ($row['overtime_hours'] ?? 0); $sumWeightedOvertime += (float) ($row['weighted_overtime_hours'] ?? 0); if (!empty($row['ot_dynamic']) && is_array($row['ot_dynamic'])) { foreach ($row['ot_dynamic'] as $k => $v) { if (!isset($otTotals[$k])) { $otTotals[$k] = 0.0; } $otTotals[$k] += (float) $v; } } $dayCredit = $resolvePayrollDayCredit((array) $row, $hkHoursPerDay, $profil); $sumHk += (int) ($dayCredit['hk_flag'] ?? 0); } $totalJamHk = $hkBaseHours; $deficitRows = []; foreach ($dailyRows as $row) { $dayCredit = $resolvePayrollDayCredit((array) $row, $hkHoursPerDay, $profil); if ((int) ($dayCredit['hk_flag'] ?? 0) !== 1) { continue; } $deficitRows[] = (float) ($dayCredit['deficit_hours'] ?? 0.0); } $jamTdkMasuk = round(array_sum($deficitRows), 2); $jamMasukNormal = max(0.0, $hkBaseHours - $jamTdkMasuk); $hkMasuk = $hkHoursPerDay > 0 ? $jamMasukNormal / $hkHoursPerDay : 0; $totalColumns = 11 + count($otCols); $remainingAfterThreeValues = max(1, $totalColumns - 8); $remainingAfterTwoValues = max(1, $totalColumns - 7); $bd = is_array($breakdown ?? null) ? $breakdown : []; $money = static fn ($value): string => 'Rp ' . number_format((float) $value, 2, ',', '.'); $number = static fn ($value, int $decimals = 2): string => number_format((float) $value, $decimals, ',', '.'); $allowances = [ 'Tunjangan Tetap' => (float) ($bd['allowance_fixed'] ?? 0), 'Tunjangan Jabatan' => (float) ($bd['allowance_position'] ?? 0), 'Tunjangan Keahlian' => (float) ($bd['allowance_skill'] ?? 0), 'Tunjangan Kesehatan / Perumahan' => (float) ($bd['allowance_medical_housing'] ?? 0), 'Tunjangan Lain' => (float) ($bd['allowance_other'] ?? 0), ]; $allowanceTotal = (float) ($bd['allowance_total'] ?? array_sum($allowances)); $incentiveNominal = (float) ($bd['incentive_amount'] ?? 0); $overtimeNominal = (float) ($bd['overtime_nominal'] ?? 0); $reimburseDisplay = (float) ($reimburseNominal ?? ($bd['reimburse_nominal'] ?? 0)); $additionTotal = max(0.0, $allowanceTotal + $incentiveNominal + $overtimeNominal + $reimburseDisplay); $dedAbsence = (float) ($bd['absence_deduction_nominal'] ?? 0); $dedLate = (float) ($bd['late_deduction_nominal'] ?? 0); $dynamicDeductions = is_array($bd['dynamic_deduction_components'] ?? null) ? $bd['dynamic_deduction_components'] : []; $dedDynamic = (float) ($bd['dynamic_deduction_nominal'] ?? array_sum(array_map( static fn ($row) => (float) ($row['amount'] ?? 0), $dynamicDeductions ))); $dedBpjs = (float) ($bpjsNominal ?? ($bd['bpjs_nominal'] ?? 0)); $dedPph21 = (float) ($pph21Nominal ?? ($bd['pph21_nominal'] ?? 0)); $deductionTotal = max(0.0, $dedAbsence + $dedLate + $dedDynamic + $dedBpjs + $dedPph21); $grossDisplay = (float) ($nominalTertagih ?? ($bd['gross_nominal'] ?? 0)); $calculatedBaseSalary = max(0.0, $grossDisplay + $dedAbsence + $dedLate - $allowanceTotal - $incentiveNominal - $overtimeNominal); $subtotalIncome = max(0.0, $calculatedBaseSalary + $additionTotal); $netDisplay = (float) ($netNominal ?? ($bd['net_nominal'] ?? 0)); $pphDetails = is_array($bd['pph21_calculation_details'] ?? null) ? $bd['pph21_calculation_details'] : []; $pphGrossComponents = is_array($pphDetails['gross_components'] ?? null) ? $pphDetails['gross_components'] : []; $pphGrossReductions = is_array($pphDetails['gross_reductions'] ?? null) ? $pphDetails['gross_reductions'] : []; $pphMethod = (string) ($bd['pph21_method'] ?? 'legacy_flat_rate'); $pphMethodLabel = match ($pphMethod) { 'ter_monthly' => 'TER Bulanan', 'legacy_flat_rate' => 'Fallback Tarif Lama', 'disabled' => 'Dinonaktifkan', default => strtoupper(str_replace('_', ' ', $pphMethod)), }; $pphTaxableGross = (float) ($bd['pph21_taxable_gross'] ?? 0); $bpjsRows = is_array($bd['bpjs_details'] ?? null) ? $bd['bpjs_details'] : []; $bpjsCompanyTotal = array_sum(array_map(static fn ($row) => (float) ($row['company_nominal'] ?? 0), $bpjsRows)); $bpjsEmployeeTotal = array_sum(array_map(static fn ($row) => (float) ($row['employee_nominal'] ?? 0), $bpjsRows)); $specialSummary = is_array($bd['special_overtime_summary'] ?? null) ? $bd['special_overtime_summary'] : []; @endphp
A. Identitas dan Periode Payroll
Karyawan {{ $assignment->karyawan?->employee_code }} - {{ $assignment->karyawan?->full_name }} Profil Bulan {{ $profil->code }} - {{ $profil->name }} Status Pembayaran {{ strtoupper((string) ($paymentStatus ?? 'unpaid')) }}
Periode Tertagih {{ $effectiveStart }} s/d {{ $effectiveEnd }} Siklus {{ $cycleLabel ?? '-' }} Tanggal Bayar / Jatuh Tempo {{ $payDate ?? '-' }} / {{ $dueDate ?? '-' }}
Profil Gaji {{ $assignment->profilGaji?->code ?? '-' }} - {{ $assignment->profilGaji?->name ?? '-' }} Rekening {{ $bankAccountLabel ?? '-' }} No. Bukti Potong {{ $taxProofNo ?? '-' }}
B. Ringkasan Kehadiran dan Nominal
Basis Jam Profil {{ $number($hkBaseHours) }} jam Jam Tertagih {{ $number($billedHours ?? $approvedHours ?? 0) }} jam Jam Aktual Approved {{ $number($approvedHours ?? 0) }} jam Jam Lembur {{ $number($overtimeHours ?? $bd['overtime_hours'] ?? 0) }} jam
HK Masuk / Basis {{ $number($hkMasuk) }} / {{ $number($hkBasis, 0) }} Total Jam Kurang {{ $number($jamTdkMasuk) }} jam Alpha / Cuti {{ $number($alphaDays ?? 0, 0) }} / {{ $number($cutiDays ?? 0, 0) }} hari Rate per Jam {{ $money($hourlyRate ?? $bd['hourly_rate'] ?? 0) }}
Gaji Bulanan {{ $money($monthlyBaseSalary ?? 0) }} Bruto Payroll {{ $money($grossDisplay) }} Total Pengurang {{ $money($deductionTotal) }} Netto Dibayarkan {{ $money($netDisplay) }}
C. Rincian Komponen Penggajian
@foreach ($allowances as $allowanceName => $allowanceValue) @if ($allowanceValue != 0) @endif @endforeach @foreach ($dynamicDeductions as $dynamicDeduction) @if ((float) ($dynamicDeduction['amount'] ?? 0) != 0) @endif @endforeach
Komponen Pendapatan Nominal Komponen Pengurang Nominal
Gaji Pokok Sesuai Hitungan Kehadiran {{ $money($calculatedBaseSalary) }} Potongan Tidak Masuk / Alpha {{ $money($dedAbsence) }}
Total Tunjangan {{ $money($allowanceTotal) }} Potongan Keterlambatan {{ $money($dedLate) }}
  {{ $allowanceName }} {{ $money($allowanceValue) }}
Insentif / Bonus Payroll {{ $money($incentiveNominal) }} Potongan Dinamis Lainnya {{ $money($dedDynamic) }}
  {{ $dynamicDeduction['component_name'] ?? $dynamicDeduction['component_code'] ?? 'Potongan Lain' }} {{ $money($dynamicDeduction['amount'] ?? 0) }}
Upah Lembur {{ $money($overtimeNominal) }} BPJS Karyawan {{ $money($dedBpjs) }}
Reimbursement Approved {{ $money($reimburseDisplay) }} PPh21 {{ $money($dedPph21) }}
Sub Total Pendapatan {{ $money($subtotalIncome) }} Sub Total Pengurang {{ $money($deductionTotal) }}
Grand Total / Take Pay {{ $money($netDisplay) }}
D. Audit Perhitungan PPh21
Metode {{ $pphMethodLabel }} Rule {{ $pphDetails['rule_set_code'] ?? '-' }} Tanggal Acuan {{ $pphDetails['calculation_date'] ?? $effectiveEnd }}
PTKP {{ $bd['pph21_ptkp_status'] ?? '-' }} Kategori TER {{ $bd['pph21_ter_category'] ?? '-' }} NPWP {{ array_key_exists('has_npwp', $pphDetails) ? ($pphDetails['has_npwp'] ? 'Ada' : 'Tidak Ada') : '-' }}
Bruto Kena Pajak {{ $money($pphTaxableGross) }} Tarif {{ $number(((float) ($pph21Rate ?? $bd['pph21_rate'] ?? 0)) * 100, 4) }}% PPh21 Dipotong {{ $money($dedPph21) }}
@if (!empty($pphGrossComponents) || !empty($pphGrossReductions)) @php $pphComponentKeys = array_keys($pphGrossComponents); $pphReductionKeys = array_keys($pphGrossReductions); $pphRowCount = max(count($pphComponentKeys), count($pphReductionKeys)); @endphp @for ($pphIdx = 0; $pphIdx < $pphRowCount; $pphIdx++) @php $componentKey = $pphComponentKeys[$pphIdx] ?? null; $reductionKey = $pphReductionKeys[$pphIdx] ?? null; @endphp @endfor
Komponen Bruto PPh21 Nominal Pengurang Bruto Internal Nominal
{{ $componentKey ? ucwords(str_replace('_', ' ', $componentKey)) : '' }} {{ $componentKey ? $money($pphGrossComponents[$componentKey]) : '' }} {{ $reductionKey ? ucwords(str_replace('_', ' ', $reductionKey)) : '' }} {{ $reductionKey ? $money($pphGrossReductions[$reductionKey]) : '' }}
@endif
E. Rincian Program BPJS
@forelse ($bpjsRows as $bpjsRow) @empty @endforelse
Program Basis Basis Sumber Basis Dipakai Rate Perusahaan Nominal Perusahaan Rate Karyawan Nominal Karyawan Mode / Catatan
{{ $bpjsRow['component_code'] ?? '-' }} - {{ $bpjsRow['component_name'] ?? '-' }} {{ strtoupper((string) ($bpjsRow['basis_type'] ?? 'general')) }} {{ $money($bpjsRow['basis_source_nominal'] ?? 0) }} {{ $money($bpjsRow['basis_nominal'] ?? 0) }} {{ $number($bpjsRow['rate_company_percent'] ?? 0) }}% {{ $money($bpjsRow['company_nominal'] ?? 0) }} {{ $number($bpjsRow['rate_employee_percent'] ?? 0) }}% {{ $money($bpjsRow['employee_nominal'] ?? 0) }} {{ !empty($bpjsRow['deduct_to_payroll']) ? 'Potong Payroll' : 'Report Only' }}{{ !empty($bpjsRow['notes']) ? ' - '.$bpjsRow['notes'] : '' }}
Belum ada rincian BPJS.
Total BPJS {{ $money($bpjsCompanyTotal) }} {{ $money($bpjsEmployeeTotal) }}
@if (!empty($specialSummary['rows']))
F. Rincian Bonus SPL Khusus
@foreach ($specialSummary['rows'] as $specialRow) @endforeach
No SPL Tanggal Jenis Mode Bayar Bonus Jam Bonus HK Nominal Catatan
{{ $specialRow['document_no'] ?? '-' }} {{ $specialRow['work_date'] ?? '-' }} {{ $specialRow['overtime_type_label'] ?? '-' }} {{ $specialRow['payment_mode_label'] ?? '-' }} {{ $number($specialRow['bonus_hours'] ?? 0) }} {{ $number($specialRow['bonus_hk'] ?? 0, 0) }} {{ $money($specialRow['nominal'] ?? 0) }} {{ $specialRow['notes'] ?? '-' }}
@endif
G. Rincian Jam Harian
@foreach ($otCols as $ot) @endforeach @forelse ($dailyRows as $idx => $row) @php $dayType = (string) ($row['day_type'] ?? 'workday'); $dayLabel = $dayTypeLabelResolver($dayType); $inShadow = (string) ($row['in_time_shadow'] ?? '-'); $inRaw = (string) ($row['in_time_real'] ?? '-'); $inReal = $inShadow !== '-' && $inShadow !== '' ? $inShadow : ($inRaw !== '-' && $inRaw !== '' ? $inRaw : '-'); $outShadow = (string) ($row['out_time_shadow'] ?? '-'); $outRaw = (string) ($row['out_time_real'] ?? '-'); $outReal = $outShadow !== '-' && $outShadow !== '' ? $outShadow : ($outRaw !== '-' && $outRaw !== '' ? $outRaw : '-'); @endphp @foreach ($otCols as $ot) @php $k = $ot['key'] ?? ''; @endphp @endforeach @empty @endforelse @if (!empty($dailyRows)) @foreach ($otCols as $otCol) @php $k = $otCol['key'] ?? ''; @endphp @endforeach @endif
No Tanggal In Out Jam Normal (Plan) HK Jam Aktual / Efektif Jam Lembur Bersih{{ $ot['label'] ?? 'OT' }}Jam Lembur xKali In Lembur Out Lembur
{{ $idx + 1 }} {{ $row['work_date'] ?? '-' }} ({{ $row['day_name'] ?? '-' }}) @if (!empty($row['day_type_description']) && $row['day_type_description'] !== '-') - {{ $row['day_type_description'] }} @endif
{{ $dayLabel }} @if (!empty($row['leave_tag_label'])) {{ $row['leave_tag_label'] }} @endif @if (!empty($row['special_overtime_label'])) {{ $row['special_overtime_label'] }} @endif @if (!empty($row['special_overtime_mode'])) {{ $row['special_overtime_mode'] }} @endif
{{ $row['in_time'] ?? '-' }} @if ($inReal !== '-')
{{ $inReal }} (actual)
@endif
{{ $row['out_time'] ?? '-' }} @if ($outReal !== '-')
{{ $outReal }} (actual)
@endif
{{ number_format((float) ($row['planned_hours'] ?? 0), 2, '.', '') }} @if (!empty($row['planned_in_time']) && !empty($row['planned_out_time']))
{{ $row['planned_in_time'] }} - {{ $row['planned_out_time'] }}
@endif
@php $dayCredit = $resolvePayrollDayCredit((array) $row, $hkHoursPerDay, $profil); $hkFlag = (int) ($dayCredit['hk_flag'] ?? 0); @endphp {{ $hkFlag }} ({{ $fmt($hkHoursPerDay) }} jam) @if (!empty($dayCredit['special_bonus']))
HK Bonus ContinuesNextDay
@endif
@php $dayTypeValue = (string) ($row['day_type'] ?? 'workday'); $actualInTime = trim((string) ($row['in_time'] ?? '-')); $actualOutTime = trim((string) ($row['out_time'] ?? '-')); $hasActualInOut = $actualInTime !== '' && $actualInTime !== '-' && $actualOutTime !== '' && $actualOutTime !== '-'; $isHolidayWeekend = in_array($dayTypeValue, ['holiday', 'holiday_special', 'weekend'], true); $sourceHours = $isHolidayWeekend && (float) ($row['overtime_hours_gross'] ?? 0) > 0 ? (float) ($row['overtime_hours_gross'] ?? 0) : (float) ($row['actual_hours'] ?? 0); $sourceLabel = $isHolidayWeekend ? 'Total Jam Lembur' : 'Jam Aktual'; $hasNormalBreakCut = (float) ($row['break_hours'] ?? 0) > 0 && $sourceHours > 0 && $hasActualInOut; $actualDisplayHours = $hasNormalBreakCut ? max(0, $sourceHours - (float) ($row['break_hours'] ?? 0)) : $sourceHours; $specialPayload = is_array($row['special_overtime_payload'] ?? null) ? $row['special_overtime_payload'] : []; $specialCodeHours = strtolower((string) ($row['special_overtime_code'] ?? '')); $specialModeHours = strtolower((string) ($row['special_overtime_mode'] ?? '')); $isContinuesHours = $specialCodeHours === 'continues_work_day' || str_contains($specialModeHours, 'continues'); $continuesTargetCoverageHours = round((float) ($specialPayload['continues_target_coverage_hours'] ?? 0), 2); $continuesNextDayWorkHours = round((float) ($specialPayload['continues_next_day_work_hours'] ?? 0), 2); $continuesShortageHours = round((float) ($specialPayload['continues_effective_shortage_hours'] ?? ($specialPayload['continues_shortage_hours'] ?? 0)), 2); $continuesOriginalShortageHours = round((float) ($specialPayload['continues_original_shortage_hours'] ?? $continuesShortageHours), 2); $continuesEffectiveHours = round(max(0.0, $continuesNextDayWorkHours + $continuesShortageHours), 2); $continuesConversionMode = strtolower(trim((string) ($specialPayload['continues_conversion_mode'] ?? ''))); $continuesConversionLabel = $continuesConversionMode === 'bonus_hk' ? 'Bonus 1 HK' : ($continuesConversionMode === 'bonus_hours' ? 'Bonus Jam' : 'Bonus Continues'); $continuesCarryActualOut = trim((string) ($specialPayload['continues_carry_actual_out'] ?? '')); $continuesBonusCutoff = trim((string) ($specialPayload['continues_bonus_cutoff_time'] ?? '16:00')); $continuesBonusAwarded = (bool) ($specialPayload['continues_bonus_awarded'] ?? ($continuesShortageHours > 0)); $isEmergencyHours = $specialCodeHours === 'emergency_on_call'; $emergencyBonusHours = round((float) ($specialPayload['emergency_bonus_hours'] ?? 0), 2); $emergencyBonusNominal = round((float) ($specialPayload['emergency_bonus_nominal'] ?? 0), 2); $emergencyBaselineLabel = $emergencyBaselineLabelResolver($specialPayload['emergency_baseline_mode'] ?? ''); $emergencyMultiplierLabel = $emergencyMultiplierLabelResolver($specialPayload['emergency_multiplier_profile'] ?? ''); $specialPaymentModeLabel = $specialPaymentModeLabelResolver($specialPayload['bonus_payment_mode'] ?? ''); $isTargetWorkHours = $specialCodeHours === 'work_target'; $workTargetBonusHours = round((float) ($specialPayload['work_target_bonus_hours'] ?? 0), 2); $workTargetBonusCapHours = round((float) ($specialPayload['work_target_bonus_cap_hours'] ?? 0), 2); $workTargetMinimumActualHours = round((float) ($specialPayload['work_target_minimum_actual_hours'] ?? 0), 2); $workTargetCompletionRequired = (bool) ($specialPayload['work_target_completion_required'] ?? false); $workTargetBonusSourceLabel = $workTargetBonusSourceLabelResolver($specialPayload['work_target_bonus_source'] ?? ''); @endphp @if ($isContinuesHours && str_contains($specialModeHours, 'carry')) {{ number_format($continuesEffectiveHours, 2, '.', '') }}
Jam Actual Carry: {{ number_format($continuesNextDayWorkHours, 2, '.', '') }} jam
@if ($continuesCarryActualOut !== '')
Checkout Carry Actual: {{ $continuesCarryActualOut }}
@endif
{{ $continuesConversionLabel }} Carry: {{ number_format($continuesShortageHours, 2, '.', '') }} jam
@if (!$continuesBonusAwarded && $continuesOriginalShortageHours > 0)
Bonus carry tidak diberikan karena checkout actual <= {{ $continuesBonusCutoff }}
@endif
Perkalian Carry: {{ number_format($continuesNextDayWorkHours, 2, '.', '') }} actual + {{ number_format($continuesShortageHours, 2, '.', '') }} bonus = {{ number_format($continuesEffectiveHours, 2, '.', '') }} jam
@elseif ($isContinuesHours) {{ number_format((float) ($row['actual_hours'] ?? $actualDisplayHours), 2, '.', '') }}
Jam Efektif Anchor: {{ number_format((float) ($row['actual_hours'] ?? $actualDisplayHours), 2, '.', '') }} jam
@if ($continuesTargetCoverageHours > 0)
Target Coverage Continues: {{ number_format($continuesTargetCoverageHours, 2, '.', '') }} jam
@endif @if (!empty($row['out_time']) && $row['out_time'] !== '-')
Bridge approved hingga {{ $row['out_time'] }}
@endif @elseif ($isEmergencyHours) {{ number_format($actualDisplayHours, 2, '.', '') }}
Jam Aktual Emergency: {{ number_format($actualDisplayHours, 2, '.', '') }} jam
Baseline Emergency: {{ $emergencyBaselineLabel }}
Profile Multiplier: {{ $emergencyMultiplierLabel }}
@if ($emergencyBonusHours > 0)
Tambahan Jam Emergency: {{ number_format($emergencyBonusHours, 2, '.', '') }} jam
@endif @if ($emergencyBonusNominal > 0)
Insentif Emergency: Rp {{ number_format($emergencyBonusNominal, 2, ',', '.') }}
@endif @if ($specialPaymentModeLabel !== '-')
Pembayaran Bonus: {{ $specialPaymentModeLabel }}
@endif @elseif ($isTargetWorkHours) {{ number_format($actualDisplayHours, 2, '.', '') }}
Jam Aktual Target Work: {{ number_format($actualDisplayHours, 2, '.', '') }} jam
Sumber Bonus: {{ $workTargetBonusSourceLabel }}
@if ($workTargetMinimumActualHours > 0)
Minimum Aktual Bonus: {{ number_format($workTargetMinimumActualHours, 2, '.', '') }} jam
@endif @if ($workTargetBonusCapHours > 0)
Cap Bonus Jam: {{ number_format($workTargetBonusCapHours, 2, '.', '') }} jam
@endif @if ($workTargetBonusHours > 0)
Override Bonus Manual: {{ number_format($workTargetBonusHours, 2, '.', '') }} jam
@endif @if ($workTargetCompletionRequired)
Bonus hanya berlaku jika pekerjaan dinyatakan selesai.
@endif @if ($specialPaymentModeLabel !== '-')
Pembayaran Bonus: {{ $specialPaymentModeLabel }}
@endif @else {{ number_format($actualDisplayHours, 2, '.', '') }} @if ($hasNormalBreakCut)
{{ $sourceLabel }}: {{ number_format($sourceHours, 2, '.', '') }} jam
Potong Istirahat Normal: {{ number_format((float) ($row['break_hours'] ?? 0), 2, '.', '') }} jam
Hasil Jam Efektif: {{ number_format($actualDisplayHours, 2, '.', '') }} jam
@endif @endif
{{ number_format((float) ($row['overtime_hours'] ?? 0), 2, '.', '') }}{{ number_format((float) ($row['ot_dynamic'][$k] ?? 0), 2, '.', '') }}{{ number_format((float) ($row['weighted_overtime_hours'] ?? 0), 2, '.', '') }} {{ $row['overtime_in_time'] ?? '-' }} {{ $row['overtime_out_time'] ?? '-' }}
Tidak ada data.
Total Jam Normal (Plan) {{ number_format($sumPlannedHours, 2, '.', '') }} - -
Basis Jam Profil - {{ number_format($totalJamHk, 2, '.', '') }} -
Total Jam Kurang - {{ number_format($jamTdkMasuk, 2, '.', '') }}
Jam Masuk Normal (Basis Jam Profil - Total Jam Kurang) - {{ number_format($jamMasukNormal, 2, '.', '') }}
HK Masuk Riil = Jam Masuk Normal / {{ $fmt($hkHoursPerDay) }} jam - {{ number_format($hkMasuk, 2, '.', '') }} hari
Total Lembur (OT) {{ $fmt($sumOvertime) }}{{ $fmt($otTotals[$k] ?? 0) }}{{ $fmt($sumWeightedOvertime) }}