@extends('layouts.app', ['class' => 'g-sidenav-show bg-gray-100']) @section('content') @include('layouts.navbars.auth.topnav', ['title' => ''])
{{ $title_menu ?? 'Evaluasi' }}
@include('components.alert')
{{-- Employee Information --}}
Informasi Karyawan
NIP : {{ $master->employee_nip ?? '-' }}
Nama : {{ $master->employee_name ?? '-' }}
Periode Evaluasi
Periode : {{ $master->quarter ?? '-' }} {{ $master->year ?? '-' }}
Durasi : {{ isset($master->start_date) ? $format->tanggal($master->start_date) : '-' }} - {{ isset($master->end_date) ? $format->tanggal($master->end_date) : '-' }}
Status : @php // Get period status $period = DB::table('mst_period') ->where('id', $master->period_id) ->first(); $isPeriodLocked = $period && $period->status === 'locked'; // Get evaluation data $status = $master->status ?? 'in_progress'; // Calculate submitted months and check for missing evaluations $submittedMonths = 0; $hasMissingEvaluations = $hasMissingMonths ?? false; // Count submitted evaluation segments if ( isset($segmentsByMonth) && !empty($segmentsByMonth) ) { foreach ($segmentsByMonth as $segment) { if ( $segment && isset($evaluationItems[$segment->id]) && count($evaluationItems[$segment->id]) > 0 ) { $submittedMonths++; } } } // Determine combined status based on 4-status logic $combinedStatus = 'sedang_berjalan'; if ($status === 'approved') { $combinedStatus = 'approved'; } elseif ($status === 'need_approval') { // Need approval after admin revision → Sudah Dicek $combinedStatus = 'sudah_dicek'; } elseif ($status === 'ready_for_approval') { // Supervisor completed → Belum Dicek $combinedStatus = 'belum_dicek'; } else { // in_progress → Sedang Berjalan $combinedStatus = 'sedang_berjalan'; } // Status badge styling (4-status system) $statusBadge = [ 'approved' => [ 'class' => 'bg-primary', 'text' => 'Approved', ], 'sudah_dicek' => [ 'class' => 'bg-success', 'text' => 'Sudah Dicek', ], 'belum_dicek' => [ 'class' => 'bg-warning', 'text' => 'Belum Dicek', ], 'sedang_berjalan' => [ 'class' => 'bg-info', 'text' => 'Sedang Berjalan', ], ][$combinedStatus] ?? [ 'class' => 'bg-secondary', 'text' => ucwords( str_replace('_', ' ', $combinedStatus), ), ]; @endphp {{ $statusBadge['text'] }} @if (isset($master->has_late_unlock) && $master->has_late_unlock) TERLAMBAT @endif
{{-- Evaluation Form --}}
@csrf
Evaluasi Per Posisi
@if (empty($standardSetTabs))
Tidak ada data evaluasi.
@else @php // Group tabs by position name $tabsByPosition = []; foreach ($standardSetTabs as $positionKey => $setData) { $positionName = $setData['position_name'] ?? 'Unknown Position'; if (!isset($tabsByPosition[$positionName])) { $tabsByPosition[$positionName] = []; } $tabsByPosition[$positionName][$positionKey] = $setData; } @endphp {{-- Position Tabs --}} {{-- Tab Content --}}
@foreach ($tabsByPosition as $positionName => $positionData) @php $positionSlug = Str::slug($positionName); @endphp
@foreach ($positionData as $positionKey => $setData)
{{ $setData['position_name'] ?? '-' }} — {{ isset($setData['month_labels']) ? implode(', ', $setData['month_labels']) : '-' }}
@php // Since we now use safe tab IDs, // the positionKey IS the safe tab ID $tabKey = $positionKey; $allStandardItems = collect(); if (isset($standardItemsBySet[$tabKey])) { $allStandardItems = collect( $standardItemsBySet[$tabKey], ) ->sortBy('order') ->unique(function ($item) { return strtolower( trim($item->name ?? ''), ); }) ->values(); } // Resolve standard items (and rating signature) from standard set id. // This is used to detect month differences even when evaluation items are still empty. $standardItemsBySetCache = []; $buildItemsFromStandardSetId = function ( $standardSetId, ) use (&$standardItemsBySetCache) { if (!$standardSetId) { return collect(); } if ( isset( $standardItemsBySetCache[ $standardSetId ], ) ) { return $standardItemsBySetCache[ $standardSetId ]; } $items = DB::table('mst_pa_standard_item') ->where('standard_set_id', $standardSetId) ->where('isactive', '1') ->orderBy('order') ->get(); if ($items->isEmpty()) { $standardItemsBySetCache[ $standardSetId ] = collect(); return $standardItemsBySetCache[ $standardSetId ]; } $itemIds = $items ->pluck('id') ->filter() ->values(); $ratingsByItem = collect(); if ($itemIds->isNotEmpty()) { $ratingsByItem = DB::table( 'mst_pa_standard_rating', ) ->whereIn('standard_item_id', $itemIds) ->orderBy('score') ->get() ->groupBy('standard_item_id'); } $resolvedItems = $items ->map(function ($item) use ( $ratingsByItem, ) { $ratingSignature = collect( $ratingsByItem->get($item->id) ?? [], ) ->map(function ($rating) { return trim( ($rating->score ?? '-') . '|' . ($rating->label ?? '-'), ); }) ->implode('||'); return (object) [ 'id' => $item->id, 'name' => $item->name, 'order' => $item->order, 'weight' => $item->weight, 'rating_signature' => $ratingSignature ?: '-', ]; }) ->values(); $standardItemsBySetCache[ $standardSetId ] = $resolvedItems; return $standardItemsBySetCache[$standardSetId]; }; // Resolve expected standard set for month when segment/evaluation item does not exist. $expectedStandardByMonthCache = []; $buildItemsFromMonth = function ($monthKey) use ( &$expectedStandardByMonthCache, $master, $buildItemsFromStandardSetId, ) { if ( isset( $expectedStandardByMonthCache[ $monthKey ], ) ) { return $expectedStandardByMonthCache[ $monthKey ]; } $monthDate = \Carbon\Carbon::createFromFormat( 'Y-m', $monthKey, )->startOfMonth(); $monthAssignment = DB::table( 'trs_employee_assignment', ) ->where( 'employee_nik', $master->employee_nik, ) ->where( 'effective_from', '<=', $monthDate->toDateString(), ) ->where(function ($q) use ($monthDate) { $q->whereNull('effective_to')->orWhere( 'effective_to', '>=', $monthDate->toDateString(), ); }) ->where('isactive', '1') ->orderBy('effective_from', 'desc') ->first(); if (!$monthAssignment) { $expectedStandardByMonthCache[ $monthKey ] = collect(); return $expectedStandardByMonthCache[ $monthKey ]; } $calendarMonth = DB::table('mst_calendar_month') ->where('year', $monthDate->year) ->where('month', $monthDate->month) ->first(); if (!$calendarMonth) { $expectedStandardByMonthCache[ $monthKey ] = collect(); return $expectedStandardByMonthCache[ $monthKey ]; } $expectedStandardSet = DB::table( 'mst_pa_standard_set', ) ->where( 'calendar_month_id', $calendarMonth->id, ) ->where( 'pa_position_id', $monthAssignment->pa_position_id, ) ->first(); if (!$expectedStandardSet) { $expectedStandardByMonthCache[ $monthKey ] = collect(); return $expectedStandardByMonthCache[ $monthKey ]; } $expectedStandardByMonthCache[ $monthKey ] = $buildItemsFromStandardSetId( $expectedStandardSet->id, ); return $expectedStandardByMonthCache[$monthKey]; }; // Build month metadata and group months by standards+criteria signature. // If signature differs, the UI will split into separate tabs. $monthMeta = collect(); foreach ($setData['months'] as $monthKey) { $segment = $segmentsByMonth[$monthKey] ?? null; $monthLabel = \Carbon\Carbon::createFromFormat( 'Y-m', $monthKey, )->format('M Y'); $monthStandardItems = collect(); if ( $segment && isset($evaluationItems[$segment->id]) && $evaluationItems[$segment->id]->isNotEmpty() ) { $monthStandardItems = $evaluationItems[ $segment->id ] ->sortBy('item_order') ->map(function ($item) use ( $allRatings, ) { return (object) [ 'id' => $item->standard_item_id, 'name' => $item->item_name, 'order' => $item->item_order, 'weight' => $item->item_weight, 'rating_signature' => isset( $allRatings[ $item->standard_item_id ], ) ? $allRatings[ $item->standard_item_id ] ->map(function ($r) { return trim( ($r->score ?? '-') . '|' . ($r->label ?? '-'), ); }) ->implode('||') : '-', ]; }) ->unique(function ($item) { return strtolower( trim($item->name ?? ''), ); }) ->values(); } else { // Prefer month-specific expected standard set to avoid merging different months. if ( $segment && !empty($segment->standard_set_id) ) { $monthStandardItems = $buildItemsFromStandardSetId( $segment->standard_set_id, ); } if ($monthStandardItems->isEmpty()) { $monthStandardItems = $buildItemsFromMonth( $monthKey, ); } if ($monthStandardItems->isEmpty()) { $monthStandardItems = $allStandardItems ->map(function ($item) { return (object) [ 'id' => $item->id ?? null, 'name' => $item->name ?? '-', 'order' => $item->order ?? 0, 'weight' => $item->weight ?? 0, 'rating_signature' => '-', ]; }) ->values(); } } $monthSignature = $monthStandardItems ->map(function ($item) { return trim( ($item->name ?? '-') . '|' . ($item->order ?? 0) . '|' . ($item->rating_signature ?? '-'), ); }) ->implode('###'); $monthMeta->push([ 'month_key' => $monthKey, 'month_label' => $monthLabel, 'signature' => $monthSignature, 'standard_items' => $monthStandardItems, ]); } $monthGroups = $monthMeta ->groupBy('signature') ->values() ->map(function ($group, $index) use ( $allStandardItems, $tabKey, ) { $groupStandardItems = $group ->pluck('standard_items') ->flatten(1) ->sortBy('order') ->unique(function ($item) { return strtolower( trim($item->name ?? ''), ); }) ->values(); if ($groupStandardItems->isEmpty()) { $groupStandardItems = $allStandardItems; } return [ 'group_id' => 'std-group-' . $tabKey . '-' . $index, 'months' => $group ->pluck('month_key') ->values(), 'month_labels' => $group ->pluck('month_label') ->values(), 'standard_items' => $groupStandardItems, ]; }) ->values(); $hasDifferentStandards = $monthGroups->count() > 1; $hasAnyStandardItems = $monthGroups->contains( function ($group) { return $group[ 'standard_items' ]->isNotEmpty(); }, ); @endphp @if ($hasAnyStandardItems) @if ($hasDifferentStandards)
Ditemukan perbedaan standar/deskripsi antar bulan. Tampilan dipisah per tab agar lebih mudah dibandingkan.
@endif
@foreach ($monthGroups as $group)
@foreach ($group['months'] as $monthKey) @php $monthLabel = \Carbon\Carbon::createFromFormat( 'Y-m', $monthKey, )->format( 'M Y', ); $segment = $segmentsByMonth[ $monthKey ] ?? null; $restMonth = $restMonths[ $monthKey ] ?? null; @endphp @if ($restMonth) @elseif($segment) @else @endif @endforeach @foreach ($group['months'] as $monthKey) @php $segment = $segmentsByMonth[ $monthKey ] ?? null; $restMonth = $restMonths[ $monthKey ] ?? null; @endphp @if ($restMonth) @elseif($segment) @else @endif @endforeach @foreach ($group['standard_items'] as $standardItem) @foreach ($group['months'] as $monthKey) @php $segment = $segmentsByMonth[ $monthKey ] ?? null; $restMonth = $restMonths[ $monthKey ] ?? null; $evaluationItem = null; // Find evaluation item for this standard item and segment if ( $segment && isset( $evaluationItems[ $segment ->id ], ) ) { // First try exact match by standard_item_id $evaluationItem = $evaluationItems[ $segment ->id ]->firstWhere( 'standard_item_id', $standardItem->id, ); // If no exact match, try matching by name and order only (not weight) // Weight can be different for same standard name in different months if ( !$evaluationItem ) { $evaluationItem = $evaluationItems[ $segment ->id ]->first( function ( $item, ) use ( $standardItem, ) { return $item->item_name === $standardItem->name && $item->item_order == $standardItem->order; }, ); } } @endphp @if ($restMonth) @elseif($evaluationItem) {{-- Bobot --}} {{-- Rating --}} {{-- Kolom Alasan Revisi dan Skor --}} {{-- ... (kode untuk textarea alasan dan {{-- Score --}} @elseif($segment) {{-- Segment ada, item evaluasi tidak ada --}} @else {{-- Tidak ada segment --}} @endif @endforeach @endforeach @foreach ($group['months'] as $monthKey) @php $segment = $segmentsByMonth[ $monthKey ] ?? null; $restMonth = $restMonths[ $monthKey ] ?? null; @endphp @if ($restMonth) @elseif($segment) @else @endif @endforeach
Standar PA {{ $monthLabel }} ({{ ucfirst($restMonth->reason) }}) {{ $monthLabel }} @if (isset($lateMonths[$monthKey]) && $lateMonths[$monthKey]) TERLAMBAT @endif {{ $monthLabel }} (Kosong)
- - - - Bobot (%) Nilai Alasan Score - - - -
{{ $standardItem->name }} Sedang Cuti
@php $currentWeight = $evaluationItem->final_weight ?? ($evaluationItem->item_weight ?? $standardItem->weight); $defaultWeight = $evaluationItem->item_weight ?? $standardItem->weight; $isInactive = $currentWeight == 0; @endphp status ?? null) === 'approved' ? 'disabled' : '' }}> @if ($isInactive)
Nonaktif
@endif
@php $evalItemId = $evaluationItem->id; // ID trs_pa_evaluation_item (pasti ada) $stdItemId = $evaluationItem->standard_item_id; $finalRatingId = $evaluationItem->final_rating_id ?? null; $originalRatingId = $evaluationItem->original_rating_id ?? null; // Skor & Label ORIGINAL (handle null) $originalRatingScore = $evaluationItem->original_rating_score ?? null; // Bisa null $originalRatingLabel = $evaluationItem->original_rating_label ?? ''; // Format data-original-rating seperti yang diharapkan JS lama $originalRatingAttrValue = !is_null( $originalRatingScore, ) ? "{$originalRatingScore} - {$originalRatingLabel}" : ''; // Kosong jika original null // Skor & Label FINAL (handle null) $finalRatingScore = $evaluationItem->final_rating_score ?? null; // Bisa null $finalRatingLabel = $evaluationItem->final_rating_label ?? ''; // Tampilan default jika final rating null $displayScore = '-'; $displayLabel = 'Belum Dinilai'; $badgeClass = 'bg-secondary'; // Jika final rating TIDAK null, gunakan nilainya if ( !is_null( $finalRatingId, ) ) { // Cek apakah rating valid ada di $allRatings (safety check) if ( isset( $allRatings[ $stdItemId ], ) && ($foundRating = collect( $allRatings[ $stdItemId ], )->firstWhere( 'id', $finalRatingId, )) ) { $displayScore = $foundRating->score; // Gunakan skor dari $allRatings $displayLabel = $foundRating->label; // Gunakan label dari $allRatings $badgeClass = 'bg-primary'; } else { // Fallback jika ID ada tapi rating tidak ketemu $displayScore = '?'; $displayLabel = 'Rating Tdk Valid'; $badgeClass = 'bg-danger'; // Log::warning(...) bisa ditambahkan di sini } } // Tentukan apakah perlu menampilkan skor original di badge $isDifferentFromOriginal = $finalRatingId != $originalRatingId; // Tampilkan hanya jika item di-revise DAN berbeda DAN original score ada $showOriginalScoreInBadge = $evaluationItem->is_revised == 1 && $isDifferentFromOriginal && !is_null( $originalRatingScore, ); @endphp {{-- Hidden select: Harus ada opsi null, dan data-original-rating format lama --}} {{-- Badge: Tampilan visual, onclick only if not inactive --}}
{{ $displayScore }} {{-- Skor final atau '-' --}} {{-- Tampilkan skor original jika perlu (pastikan $originalRatingScore tidak null) --}} @if ($showOriginalScoreInBadge) ({{ $originalRatingScore }}) {{-- Tampilkan skor original --}} @endif
skor tetap sama) ... --}} {{-- Alasan Revisi --}} {{ rtrim(rtrim(number_format($evaluationItem->weighted_score ?? 0, 2), '0'), '.') }} - No Data - - Belum Dinilai
Total Bobot 0% -
@endforeach
@else
Tidak ada standard item untuk posisi ini.
@endif
@endforeach
@endforeach
@endif
{{-- End col-lg-12 --}}
{{-- /.row g-3 --}}
{{-- /.card-body --}}
{{-- /.card --}} {{-- ADMIN EVALUATION CARD (Fill missing months or handle injury status) --}} @php $adminRequiredItemsMap = collect(); $adminMonthLabels = collect(); $showAdminForm = ($hasMissingMonths ?? false) || ($master->status ?? null) === 'injury'; @endphp @if ($showAdminForm)

@if (($master->status ?? null) === 'injury') EVALUASI MEMERLUKAN REVIEW ADMIN (INJURY STATUS) @else ISI EVALUASI BULAN KOSONG @endif

@if ($hasMissingMonths ?? false)
@csrf @method('PUT') @if (($master->status ?? null) === 'injury')
Mode Injury: Standar PA telah berubah pada periode locked. Isi item standar yang baru ditambahkan. Evaluasi akan menunggu persetujuan head.
@else
Mode Pengisian Admin: Anda dapat mengisi evaluasi untuk bulan-bulan yang belum dinilai oleh supervisor. Evaluasi yang Anda isi akan menunggu persetujuan head.
@endif @else {{-- Injury status but no missing months --}}
Status Injury: Standar PA telah berubah pada periode locked. Gunakan form "Simpan Revisi" di atas untuk merevisi evaluasi, atau buka akses terlambat untuk supervisor.
@endif {{-- End hasMissingMonths check --}} @if ($hasMissingMonths ?? false) @php // Group missing months by position $positionsData = collect(); foreach ($missingMonths as $missing) { $positionId = $missing['position_id']; $positionName = $missing['position_name']; $adminMonthLabels->put($missing['calendar_month_id'], $missing['month_label']); if (!$positionsData->has($positionId)) { $positionsData->put($positionId, [ 'position_id' => $positionId, 'position_name' => $positionName, 'months' => collect(), ]); } $positionsData[$positionId]['months']->push($missing); $activeItems = collect($missing['standard_items'] ?? []) ->filter(function ($item) { return (float) ($item->weight ?? 0) > 0; }) ->map(function ($item) { return [ 'id' => $item->id, 'name' => $item->name, ]; }); $adminRequiredItemsMap->put( $missing['calendar_month_id'], $activeItems->values()->toArray(), ); } $isMultiPosition = $positionsData->count() > 1; @endphp {{-- Position tabs (left) + month-group tabs (right) --}}
@foreach ($positionsData as $index => $posData) @php $topPositionMonthsData = collect(); foreach ($posData['months'] as $missing) { $monthId = $missing['calendar_month_id']; $topPositionMonthsData->put($monthId, [ 'standard_items' => collect($missing['standard_items'] ?? []) ->sortBy('order') ->values(), 'ratings_by_item' => $missing['ratings_by_item'], 'month_label' => $missing['month_label'], ]); } $topAdminMonthGroups = $topPositionMonthsData ->map(function ($monthData, $monthId) { $signature = collect($monthData['standard_items']) ->map(function ($item) use ($monthData) { $ratings = collect( $monthData['ratings_by_item']->get( $item->id ?? null, ) ?? [], ); $ratingSignature = $ratings ->map(function ($rating) { return trim( ($rating->score ?? '-') . '|' . ($rating->label ?? '-'), ); }) ->implode('||'); return trim( ($item->name ?? '-') . '|' . ($item->order ?? 0) . '|' . $ratingSignature, ); }) ->implode('###'); return [ 'month_id' => $monthId, 'month_label' => $monthData['month_label'], 'signature' => $signature, ]; }) ->groupBy('signature') ->values() ->map(function ($group, $groupIndex) use ($posData) { return [ 'group_id' => 'admin-std-group-' . $posData['position_id'] . '-' . $groupIndex, 'month_labels' => $group->pluck('month_label')->values(), ]; }) ->values(); @endphp @if ($topAdminMonthGroups->count() > 1) @endif @endforeach
@foreach ($positionsData as $index => $posData) @php $contentWrapperClass = 'tab-pane fade ' . ($loop->first ? 'show active' : ''); $contentWrapperId = 'admin-content-' . $posData['position_id']; // Prepare months data for this position $positionMonthsData = collect(); foreach ($posData['months'] as $missing) { $monthId = $missing['calendar_month_id']; $positionMonthsData->put($monthId, [ 'assignment_id' => $missing['assignment_id'], 'standard_set_id' => $missing['standard_set_id'], 'standard_items' => collect($missing['standard_items'] ?? []) ->sortBy('order') ->values(), 'ratings_by_item' => $missing['ratings_by_item'], 'month_label' => $missing['month_label'], 'is_injury' => $missing['is_injury'] ?? false, 'new_item_ids' => $missing['new_item_ids'] ?? [], 'existing_evaluations' => $missing['existing_evaluations'] ?? collect(), ]); } // Group month columns by standards + rating descriptions signature $adminMonthGroups = $positionMonthsData ->map(function ($monthData, $monthId) { $signature = collect($monthData['standard_items']) ->map(function ($item) use ($monthData) { $ratings = collect( $monthData['ratings_by_item']->get($item->id ?? null) ?? [], ); $ratingSignature = $ratings ->map(function ($rating) { return trim( ($rating->score ?? '-') . '|' . ($rating->label ?? '-'), ); }) ->implode('||'); return trim( ($item->name ?? '-') . '|' . ($item->order ?? 0) . '|' . $ratingSignature, ); }) ->implode('###'); return [ 'month_id' => $monthId, 'month_label' => $monthData['month_label'], 'signature' => $signature, 'month_data' => $monthData, ]; }) ->groupBy('signature') ->values() ->map(function ($group, $groupIndex) use ($posData) { $groupMonthsData = collect(); foreach ($group as $row) { $groupMonthsData->put($row['month_id'], $row['month_data']); } return [ 'group_id' => 'admin-std-group-' . $posData['position_id'] . '-' . $groupIndex, 'month_ids' => $group->pluck('month_id')->values(), 'month_labels' => $group->pluck('month_label')->values(), 'months_data' => $groupMonthsData, ]; }) ->values(); $hasAdminDifferentStandards = $adminMonthGroups->count() > 1; @endphp
@if ($hasAdminDifferentStandards)
Standar/deskripsi penilaian antar bulan berbeda. Gunakan tab bulan di sisi kanan.
@endif
@foreach ($adminMonthGroups as $group) @php $groupMonthsData = $group['months_data']; $allStandards = collect(); foreach ($groupMonthsData as $monthData) { $allStandards = $allStandards->merge( $monthData['standard_items'], ); } $uniqueStandards = $allStandards ->unique('name') ->sortBy('order') ->values(); $counter = 1; @endphp
@foreach ($groupMonthsData as $monthId => $monthData) @endforeach @foreach ($groupMonthsData as $monthId => $monthData) @endforeach @foreach ($uniqueStandards as $standard) @php $descriptionRatings = collect(); foreach ($groupMonthsData as $monthData) { $descItem = collect( $monthData['standard_items'], )->firstWhere('name', $standard->name); if ($descItem) { $candidateRatings = collect( $monthData[ 'ratings_by_item' ]->get($descItem->id ?? null) ?? [], ); if ( $candidateRatings->isNotEmpty() ) { $descriptionRatings = $candidateRatings; break; } } } @endphp @foreach ($groupMonthsData as $monthId => $monthData) @php $itemForMonth = collect( $monthData['standard_items'], )->firstWhere( 'name', $standard->name, ); $defaultWeight = $itemForMonth->weight ?? 0; $ratings = collect( $monthData[ 'ratings_by_item' ]->get( $itemForMonth->id ?? null, ) ?? [], ); // For injury months: check if item is new or existing $isInjuryMonth = $monthData['is_injury'] ?? false; $isNewItem = $isInjuryMonth && in_array( $itemForMonth->id ?? null, $monthData[ 'new_item_ids' ] ?? [], ); $existingEval = null; $existingWeight = $defaultWeight; $existingRating = null; if ( $isInjuryMonth && !$isNewItem && isset($itemForMonth->id) ) { $existingEval = $monthData[ 'existing_evaluations' ]->get($itemForMonth->id); if ($existingEval) { $existingWeight = $existingEval->weight ?? $defaultWeight; $existingRating = $existingEval->rating ?? null; } } @endphp {{-- Bobot Column --}} {{-- Nilai Column --}} @endforeach {{-- Description Column --}} @endforeach @foreach ($groupMonthsData as $monthId => $monthData) @endforeach
No Standar {{ $monthData['month_label'] }} @if ($monthData['is_injury'] ?? false) ITEM BARU @else KOSONG @endif Deskripsi Penilaian
Bobot Nilai
{{ $counter++ }} {{ $standard->name }} @if ($itemForMonth) @else - @endif @if ($itemForMonth && $defaultWeight > 0)
@foreach ($ratings as $rating) @php $isChecked = $isInjuryMonth && $existingEval && $existingRating == $rating->score; @endphp
@endforeach
@else - @endif
@if ($descriptionRatings->isNotEmpty()) @foreach ($descriptionRatings as $rating)

{{ $rating->score }} = {{ $rating->label }}

@endforeach @endif
Total Bobot
@endforeach
{{-- End position tab content --}} @endforeach
{{-- End tab-content --}}
@endif {{-- End hasMissingMonths conditional for form content --}}
{{-- End card-body --}}
{{-- End card --}} @endif {{-- End showAdminForm --}}
{{-- Approval Confirmation Modal --}} @endsection @push('js') @endpush