MIF_E31231754/resources/views/admin/saw/hasil.blade.php

316 lines
15 KiB
PHP

@extends('admin.layouts.app')
@section('title', 'Hasil Perhitungan SAW')
@section('content')
<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"><a href="{{ route('admin.saw.index', $periode) }}">Proses SAW</a></li>
<li class="breadcrumb-item active">Hasil & Ranking</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-trophy me-2"></i>Hasil Perhitungan SAW</h2>
<p class="text-muted mb-0">Periode: <strong>{{ $periode->nama }}</strong></p>
</div>
<div class="d-flex gap-2">
@if($periode->status == 'selesai')
<a href="{{ route('admin.saw.exportPdf', $periode) }}" class="btn btn-danger">
<i class="bi bi-file-pdf me-2"></i>Export PDF
</a>
@else
@if(auth()->user()->hasRole('superadmin') || auth()->user()->hasRole('admin'))
<form action="{{ route('admin.saw.tetapkan', $periode) }}" method="POST" onsubmit="return confirm('Yakin ingin menetapkan penerima? Setelah ditetapkan, periode akan ditutup.')">
@csrf
<button type="submit" class="btn btn-primary">
<i class="bi bi-check-circle me-2"></i>Tetapkan Penerima
</button>
</form>
@endif
@endif
@if(auth()->user()->hasRole('superadmin') || auth()->user()->hasRole('admin'))
<a href="{{ route('admin.saw.index', $periode) }}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-2"></i>Kembali
</a>
@else
<a href="{{ route('admin.dashboard') }}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-2"></i>Kembali ke Dashboard
</a>
@endif
</div>
</div>
<!-- Info Periode & Status -->
<div class="row mb-4">
<div class="col-md-3">
<div class="card shadow-sm border-0">
<div class="card-body text-center">
<i class="bi bi-people-fill text-primary display-4"></i>
<h3 class="mt-2 mb-0">{{ $hasil->count() }}</h3>
<small class="text-muted">Total Warga Dinilai</small>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card shadow-sm border-0">
<div class="card-body text-center">
<i class="bi bi-trophy-fill text-warning display-4"></i>
<h3 class="mt-2 mb-0">{{ $periode->kuota_penerima }}</h3>
<small class="text-muted">Kuota Penerima</small>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card shadow-sm border-0">
<div class="card-body text-center">
<i class="bi bi-check-circle-fill text-success display-4"></i>
<h3 class="mt-2 mb-0">{{ $totalPenerima }}</h3>
<small class="text-muted">Sudah Ditetapkan</small>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card shadow-sm border-0">
<div class="card-body text-center">
<i class="bi bi-clock-fill text-info display-4"></i>
<h3 class="mt-2 mb-0">{{ $totalCadangan }}</h3>
<small class="text-muted">Cadangan</small>
</div>
</div>
</div>
</div>
<!-- Info Tie-Breaking -->
<div class="alert alert-info mb-4">
<h6 class="mb-2"><i class="bi bi-info-circle me-2"></i>Mekanisme Tie-Breaking</h6>
<p class="mb-0 small">
Jika terdapat skor SAW yang sama, sistem memprioritaskan berdasarkan:
<strong>(1) C5 - Belum pernah dapat bansos</strong>,
<strong>(2) C1 - Pekerjaan paling rentan</strong>,
<strong>(3) C2 - Tanggungan terbanyak</strong>,
<strong>(4) Waktu pendaftaran</strong>.
</p>
</div>
<!-- Tabel Hasil -->
<div class="card shadow-sm border-0">
<div class="card-header bg-white py-3">
<h5 class="mb-0">Ranking Hasil SAW</h5>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover table-striped mb-0">
<thead class="table-success">
<tr>
<th width="60" class="text-center">Rank</th>
<th>Nama Warga</th>
<th>Dusun/RW</th>
<th width="120" class="text-center">Skor SAW</th>
<!-- Kolom Tie-Breaking -->
<th width="80" class="text-center" title="C5 - Riwayat Bansos">C5</th>
<th width="80" class="text-center" title="C1 - Pekerjaan">C1</th>
<th width="80" class="text-center" title="C2 - Tanggungan">C2</th>
<th width="120" class="text-center">Status</th>
<th width="100" class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@php
$prevSkor = null;
$skorKembar = false;
@endphp
@foreach($hasil as $h)
@php
// Deteksi skor kembar
$currentSkor = number_format($h->skor_akhir, 4);
$isTie = ($prevSkor !== null && $currentSkor == $prevSkor);
$prevSkor = $currentSkor;
@endphp
<tr class="{{ $isTie ? 'table-warning' : '' }}">
<td class="text-center">
<strong class="fs-5">{{ $h->ranking }}</strong>
@if($isTie)
<br><span class="badge bg-warning text-dark small">Tie</span>
@endif
</td>
<td>
<strong>{{ $h->warga->nama }}</strong>
<br>
<small class="text-muted">NIK: {{ $h->warga->nik }}</small>
</td>
<td>{{ $h->warga->dusun }}, RW {{ $h->warga->rw }}</td>
<td class="text-center">
<span class="badge bg-primary fs-6">{{ number_format($h->skor_akhir, 4) }}</span>
</td>
<!-- Nilai Tie-Breaking -->
<td class="text-center">
@php
$c5 = $h->detailNormalisasi->first(function($item) { return $item->kriteria->kode == 'C5'; });
@endphp
@if($c5)
<span class="badge bg-secondary">{{ $c5->nilai_asli }}</span>
@else
<span class="text-muted">-</span>
@endif
</td>
<td class="text-center">
@php
$c1 = $h->detailNormalisasi->first(function($item) { return $item->kriteria->kode == 'C1'; });
@endphp
@if($c1)
<span class="badge bg-secondary">{{ $c1->nilai_asli }}</span>
@else
<span class="text-muted">-</span>
@endif
</td>
<td class="text-center">
@php
$c2 = $h->detailNormalisasi->first(function($item) { return $item->kriteria->kode == 'C2'; });
@endphp
@if($c2)
<span class="badge bg-secondary">{{ $c2->nilai_asli }}</span>
@else
<span class="text-muted">-</span>
@endif
</td>
<!-- Status -->
<td class="text-center">
@if($h->status == 'penerima')
<span class="badge bg-success">Penerima</span>
@elseif($h->status == 'cadangan')
<span class="badge bg-info">Cadangan</span>
@elseif($h->status == 'tidak_penerima')
<span class="badge bg-secondary">Tidak Penerima</span>
@else
<span class="badge bg-warning text-dark">Belum Ditetapkan</span>
@endif
</td>
<!-- Aksi -->
<td class="text-center">
<button type="button" class="btn btn-sm btn-info" data-bs-toggle="modal" data-bs-target="#detailModal{{ $h->id }}">
<i class="bi bi-eye"></i> Detail
</button>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Modal Detail (untuk setiap warga) -->
@foreach($hasil as $h)
<div class="modal fade" id="detailModal{{ $h->id }}" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header bg-primary text-white">
<h5 class="modal-title">
<i class="bi bi-person-circle me-2"></i>Detail Perhitungan: {{ $h->warga->nama }}
</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<!-- Info Warga -->
<div class="mb-3">
<h6>Informasi Warga</h6>
<table class="table table-sm table-borderless">
<tr>
<td width="150">Ranking</td>
<td>: <strong class="fs-5 text-primary">#{{ $h->ranking }}</strong></td>
</tr>
<tr>
<td>Skor Akhir</td>
<td>: <strong>{{ number_format($h->skor_akhir, 4) }}</strong></td>
</tr>
<tr>
<td>Dusun/RW</td>
<td>: {{ $h->warga->dusun }}, RW {{ $h->warga->rw }}</td>
</tr>
<tr>
<td>Status</td>
<td>:
@if($h->status == 'penerima')
<span class="badge bg-success">Penerima</span>
@elseif($h->status == 'cadangan')
<span class="badge bg-info">Cadangan</span>
@else
<span class="badge bg-secondary">{{ ucfirst($h->status ?? 'Belum Ditetapkan') }}</span>
@endif
</td>
</tr>
</table>
</div>
<hr>
<!-- Detail Normalisasi -->
<h6>Detail Perhitungan Per Kriteria</h6>
<div class="table-responsive">
<table class="table table-sm table-bordered">
<thead class="table-light">
<tr>
<th>Kriteria</th>
<th>Jenis</th>
<th>Bobot</th>
<th class="text-center">Nilai Asli</th>
<th class="text-center">Normalisasi</th>
<th class="text-center">Nilai Terbobot</th>
</tr>
</thead>
<tbody>
@foreach($h->detailNormalisasi as $detail)
<tr>
<td>{{ $detail->kriteria->kode }} - {{ $detail->kriteria->nama }}</td>
<td>
<span class="badge {{ $detail->kriteria->jenis == 'benefit' ? 'bg-primary' : 'bg-warning text-dark' }}">
{{ ucfirst($detail->kriteria->jenis) }}
</span>
</td>
<td>{{ number_format($detail->kriteria->bobot, 2) }}</td>
<td class="text-center">{{ $detail->nilai_asli }}</td>
<td class="text-center">{{ number_format($detail->nilai_normalisasi, 4) }}</td>
<td class="text-center"><strong>{{ number_format($detail->nilai_terbobot, 4) }}</strong></td>
</tr>
@endforeach
</tbody>
<tfoot class="table-light">
<tr>
<th colspan="5" class="text-end">Total Skor Akhir:</th>
<th class="text-center"><strong class="text-primary">{{ number_format($h->skor_akhir, 4) }}</strong></th>
</tr>
</tfoot>
</table>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div>
@endforeach
@push('styles')
<style>
.table th {
font-weight: 600;
white-space: nowrap;
}
.table-warning {
background-color: #fff3cd !important;
}
</style>
@endpush
@endsection