316 lines
15 KiB
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 |