MIF_E31231754/resources/views/admin/penilaian/index.blade.php

265 lines
12 KiB
PHP

@extends('admin.layouts.app')
@section('title', 'Penilaian Warga')
@section('content')
@php
$kriteriaList = \App\Models\Kriteria::orderBy('kode')->get();
@endphp
<div class="container-fluid">
<!-- Breadcrumb -->
<nav aria-label="breadcrumb" class="mb-4">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="{{ route('admin.dashboard') }}">Dashboard</a></li>
<li class="breadcrumb-item active">Penilaian Warga</li>
</ol>
</nav>
<!-- Header -->
<div class="d-flex justify-content-between align-items-center mb-4">
<div>
<h2 class="mb-1"><i class="bi bi-clipboard-check me-2"></i>Penilaian Warga</h2>
<p class="text-muted mb-0">Kelola penilaian kriteria untuk calon penerima BLT-DD</p>
</div>
<div class="d-flex gap-2">
@if ($periodeAktif)
<a href="{{ route('admin.penilaian.export', $periodeAktif->id) }}" class="btn btn-outline-success">
<i class="bi bi-file-earmark-arrow-down me-1"></i> Export Excel
</a>
<button type="button" class="btn btn-outline-primary" data-bs-toggle="modal" data-bs-target="#importModal">
<i class="bi bi-file-earmark-arrow-up me-1"></i> Import Excel
</button>
@endif
<a href="{{ route('admin.penilaian.create') }}" class="btn btn-success">
<i class="bi bi-plus-circle me-2"></i>Tambah Penilaian
</a>
</div>
</div>
@if ($periodeAktif && \Carbon\Carbon::parse($periodeAktif->tanggal_selesai)->endOfDay()->isPast())
<div class="alert alert-warning border-warning shadow-sm mb-4">
<i class="bi bi-exclamation-triangle-fill me-2 text-warning"></i>
<strong>Perhatian:</strong> Masa aktif periode seleksi <strong>{{ $periodeAktif->nama }}</strong> telah berakhir pada {{ \Carbon\Carbon::parse($periodeAktif->tanggal_selesai)->format('d/m/Y') }}. Anda masih dapat menyesuaikan penilaian warga sebelum penerima ditetapkan secara final pada menu Proses SAW.
</div>
@endif
<!-- Info Periode -->
@if ($periodeAktif)
<div class="card shadow-sm border-0 mb-4">
<div class="card-body">
<div class="row align-items-center">
<div class="col-md-8">
<h5 class="mb-2"><i class="bi bi-calendar-event text-success me-2"></i>Periode Aktif</h5>
<div class="row">
<div class="col-md-4">
<small class="text-muted">Nama Periode</small>
<p class="mb-0 fw-bold">{{ $periodeAktif->nama }}</p>
</div>
<div class="col-md-4">
<small class="text-muted">Tanggal</small>
<p class="mb-0">{{ \Carbon\Carbon::parse($periodeAktif->tanggal_mulai)->format('d/m/Y') }} -
{{ \Carbon\Carbon::parse($periodeAktif->tanggal_selesai)->format('d/m/Y') }}
</p>
</div>
<div class="col-md-4">
<small class="text-muted">Kuota Penerima</small>
<p class="mb-0">{{ $periodeAktif->kuota_penerima }} orang</p>
</div>
</div>
</div>
<div class="col-md-4 text-end">
<div class="d-flex flex-column gap-2">
<span class="badge bg-success fs-6">{{ $warga->count() }} Warga Dinilai</span>
@if ($periodeAktif->status == 'aktif')
<span class="badge bg-primary fs-6">Status: {{ ucfirst($periodeAktif->status) }}</span>
@else
<span class="badge bg-secondary fs-6">Status: {{ ucfirst($periodeAktif->status) }}</span>
@endif
</div>
</div>
</div>
</div>
</div>
@endif
<!-- Table Card -->
<div class="card shadow-sm border-0">
<div class="card-header bg-white py-3">
<div class="d-flex justify-content-between align-items-center">
<h5 class="mb-0">Daftar Warga yang Sudah Dinilai</h5>
<span class="badge bg-secondary">Total: {{ $warga->count() }} warga</span>
</div>
</div>
<div class="card-body p-0">
@if ($warga->count() > 0)
<div class="table-responsive">
<table class="table table-hover table-striped mb-0">
<thead class="table-success">
<thead class="table-success">
<tr>
<th width="50" class="text-center">No</th>
<th>Nama Warga</th>
<th>NIK</th>
<th>Alamat</th>
<th>Dusun/RW</th>
<th class="text-center" colspan="{{ $kriteriaList->count() }}">Nilai Kriteria</th>
<th width="150" class="text-center">Aksi</th>
</tr>
<tr class="table-light">
<th colspan="5"></th>
@foreach ($kriteriaList as $k)
<th class="text-center small" title="{{ $k->nama }}">{{ $k->kode }}</th>
@endforeach
<th></th>
</tr>
</thead>
<tbody>
@foreach ($warga as $index => $w)
@php
// Ambil nilai per kriteria (gunakan relasi 'penilaian' sesuai Model Warga)
$nilaiKriteria = $w->penilaian->keyBy('kriteria_id');
@endphp
<tr>
<td class="text-center">{{ $index + 1 }}</td>
<td><strong>{{ $w->nama }}</strong></td>
<td>{{ $w->nik }}</td>
<td>{{ Str::limit($w->alamat, 30) }}</td>
<td>{{ $w->dusun }}, RW {{ $w->rw }}</td>
<!-- Nilai Kriteria Dinamis -->
@foreach ($kriteriaList as $k)
<td class="text-center">
@if ($nilaiKriteria->has($k->id))
<span class="badge bg-primary">{{ $nilaiKriteria[$k->id]->nilai }}</span>
@else
<span class="text-muted">-</span>
@endif
</td>
@endforeach
<td class="text-center">
<div class="btn-group btn-group-sm" role="group">
<a href="{{ route('admin.penilaian.show', $w->id) }}" class="btn btn-info" title="Detail">
<i class="bi bi-eye"></i>
</a>
<a href="{{ route('admin.penilaian.edit', $w->id) }}" class="btn btn-warning" title="Edit">
<i class="bi bi-pencil"></i>
</a>
<form action="{{ route('admin.penilaian.destroy', $w->id) }}" method="POST" class="d-inline" onsubmit="return confirm('Yakin ingin menghapus penilaian warga ini?')">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm" title="Hapus">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@else
<div class="text-center py-5">
<i class="bi bi-inbox display-1 text-muted"></i>
<h5 class="mt-3">Belum Ada Penilaian</h5>
<p class="text-muted">Silakan tambah penilaian warga untuk periode aktif</p>
<a href="{{ route('admin.penilaian.create') }}" class="btn btn-success mt-2">
<i class="bi bi-plus-circle me-2"></i>Tambah Penilaian
</a>
</div>
@endif
</div>
</div>
<!-- Info Footer -->
<div class="card shadow-sm border-0 mt-4">
<div class="card-body">
<h6 class="mb-3"><i class="bi bi-info-circle text-primary me-2"></i>Keterangan Kriteria</h6>
<div class="row">
@php
$chunks = $kriteriaList->chunk(ceil($kriteriaList->count() / 2));
@endphp
@foreach ($chunks as $chunk)
<div class="col-md-6">
<ul class="list-unstyled mb-0">
@foreach ($chunk as $k)
<li><strong>{{ $k->kode }}:</strong> {{ $k->nama }}</li>
@endforeach
</ul>
</div>
@endforeach
</div>
</div>
</div>
</div>
{{-- Modal Import Excel --}}
@if ($periodeAktif)
<div class="modal fade" id="importModal" tabindex="-1" aria-labelledby="importModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<form action="{{ route('admin.penilaian.import') }}" method="POST" enctype="multipart/form-data" id="formImport">
@csrf
<div class="modal-header bg-primary text-white">
<h5 class="modal-title" id="importModalLabel">
<i class="bi bi-file-earmark-arrow-up me-2"></i>Import Data Penilaian
</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="alert alert-info border-0 small">
<i class="bi bi-info-circle-fill me-1"></i>
<strong>Petunjuk:</strong>
<ul class="mb-0 mt-1">
<li>Gunakan file hasil <strong>Export Excel</strong> sebagai template.</li>
<li>Pastikan kolom <strong>NIK</strong> sesuai dengan data warga yang ada di sistem.</li>
<li>Nilai kriteria (C1-C5) harus berupa angka <strong>1-5</strong> atau format deskriptif (misal: "1 - Tidak bekerja").</li>
<li>Data yang sudah ada akan <strong>diperbarui</strong> (update), bukan duplikasi.</li>
</ul>
</div>
<div class="mb-3">
<label for="importFile" class="form-label fw-semibold">Pilih File Excel</label>
<input type="file" class="form-control" id="importFile" name="file" accept=".xlsx,.xls" required>
<div class="form-text">Format: .xlsx atau .xls (maks. 5MB)</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
<i class="bi bi-x-circle me-1"></i>Batal
</button>
<button type="submit" class="btn btn-primary" id="btnImport">
<i class="bi bi-upload me-1"></i>Import Sekarang
</button>
</div>
</form>
</div>
</div>
</div>
@endif
@push('scripts')
<script>
document.getElementById('formImport')?.addEventListener('submit', function() {
const btn = document.getElementById('btnImport');
btn.disabled = true;
btn.innerHTML = '<span class="spinner-border spinner-border-sm me-1" role="status"></span>Mengimpor...';
});
</script>
@endpush
@push('styles')
<style>
.table th {
font-weight: 600;
white-space: nowrap;
}
.btn-group-sm .btn {
padding: 0.25rem 0.5rem;
}
</style>
@endpush
@endsection