@php $detailRows = is_array($detailRows ?? null) ? $detailRows : []; $detailOtColumns = is_array($detailOtColumns ?? null) ? $detailOtColumns : []; $detailProfil = $detailProfil ?? $profil ?? null; $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); $sumPlannedHours = 0.0; $sumNormalHours = 0.0; $sumHk = 0.0; $jamTdkMasuk = 0.0; $sumOvertime = 0.0; $sumWeightedOvertime = 0.0; $otTotals = []; $detailPayrollBasis = is_array($payrollBasis ?? null) ? $payrollBasis : []; $hkHoursPerDay = (float) ($detailPayrollBasis['hours_per_day'] ?? ($detailProfil->jam_per_hari ?? 8)); $hkBaseHours = (float) ($detailPayrollBasis['monthly_hour_base'] ?? (((float) ($detailProfil->hk_basis ?? 21)) * $hkHoursPerDay)); $hkBasis = $hkHoursPerDay > 0 ? ($hkBaseHours / $hkHoursPerDay) : (float) ($detailProfil->hk_basis ?? 21); $fmt = function ($v) { return rtrim(rtrim(number_format((float) $v, 2, '.', ''), '0'), '.'); }; $resolveAttendanceDayCredit = static fn (array $detailRow, float $hkHoursPerDay, $profil): array => \App\Modules\AttendanceReview\Services\AttendanceDayCreditResolver::resolve($detailRow, $profil, $hkHoursPerDay); foreach ($detailRows as $row) { $sumPlannedHours += (float) ($row['planned_hours'] ?? 0); $sumNormalHours += (float) ($row['normal_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 = $resolveAttendanceDayCredit((array) $row, $hkHoursPerDay, $detailProfil); $sumHk += (int) ($dayCredit['hk_flag'] ?? 0); } $totalJamHk = $hkBaseHours; $deficitRows = []; foreach ($detailRows as $row) { $dayCredit = $resolveAttendanceDayCredit((array) $row, $hkHoursPerDay, $detailProfil); if ((int) ($dayCredit['hk_flag'] ?? 0) !== 1) { continue; } $normalHours = max(0.0, (float) ($dayCredit['recognized_hours'] ?? 0)); $deficitHours = max(0.0, (float) ($dayCredit['deficit_hours'] ?? 0)); if ($deficitHours <= 0) { continue; } $deficitRows[] = [ 'work_date' => (string) ($row['work_date'] ?? '-'), 'day_name' => (string) ($row['day_name'] ?? '-'), 'day_type' => (string) ($row['day_type'] ?? 'workday'), 'leave_tag_label' => (string) ($row['leave_tag_label'] ?? ''), 'normal_hours' => $normalHours, 'deficit_hours' => $deficitHours, 'reason' => (string) ($row['reason'] ?? '-') . (!empty($dayCredit['special_bonus']) ? ' | Bonus HK ContinuesNextDay' : ''), ]; } $totalDeficitHours = collect($deficitRows)->sum('deficit_hours'); $jamTdkMasuk = max(0.0, $totalDeficitHours); $jamMasukNormal = max(0.0, $hkBaseHours - $jamTdkMasuk); $hkMasuk = $hkHoursPerDay > 0 ? $jamMasukNormal / $hkHoursPerDay : 0; $otCount = count($detailOtColumns); $remainingCols = 6 + $otCount; @endphp
| Tanggal | Jenis | Jam Diakui | Kurang | Reason |
|---|---|---|---|---|
| {{ $auditRow['work_date'] }} ({{ $auditRow['day_name'] }}) |
{{ ucfirst($auditRow['day_type']) }}
@if ($auditRow['leave_tag_label'] !== '')
{{ $auditRow['leave_tag_label'] }} @endif |
{{ number_format($auditRow['normal_hours'], 2, ',', '.') }} jam | {{ number_format($auditRow['deficit_hours'], 2, ',', '.') }} jam | {!! nl2br(e($auditRow['reason'])) !!} |
| Total Jam Kurang | {{ number_format($totalDeficitHours, 2, ',', '.') }} jam | |||