MIF_31230115/manajemen_mp/app/Http/Controllers/PenilaianController.php

163 lines
6.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Anggota;
use App\Models\Penilaian;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class PenilaianController extends Controller
{
public function index()
{
// Mencari anggota berdasarkan relasi 'role' yang bernama 'Pelatih'
$data_pelatih = Anggota::whereHas('role', function ($query) {
$query->where('nama_role', 'Pelatih');
})
->with('kolat')
->get();
return view('penilaian.index', compact('data_pelatih'));
}
public function create($id)
{
// 1. Tentukan ID Anggota Penilai (Lebih aman pakai operator ?? untuk mencegah error jika relasi anggota kosong)
$anggota_penilai_id = auth()->check() ? (auth()->user()->anggota->id ?? 1) : 1;
// 2. Tentukan rentang waktu bulan berjalan
$awalBulanIni = Carbon::now()->startOfMonth();
$akhirBulanIni = Carbon::now()->endOfMonth();
// 3. PENJAGA AWAL: Cek sebelum halaman form kuis terbuka
$sudahMenilai = Penilaian::where('anggota_id', $anggota_penilai_id)
->where('pelatih_id', $id)
->whereBetween('bulan_evaluasi', [$awalBulanIni, $akhirBulanIni])
->exists();
if ($sudahMenilai) {
// Jika sudah pernah menilai bulan ini, langsung tendang balik ke halaman daftar pelatih
return redirect()->route('penilaian.anggota_index')
->with('error', 'Anda sudah memberikan penilaian untuk pelatih ini pada bulan ini!');
}
$pelatih = Anggota::with('kolat')->findOrFail($id);
return view('penilaian.create', compact('pelatih'));
}
public function store(Request $request)
{
$request->validate([
'pelatih_id' => 'required',
'metode_pelatihan' => 'required|integer|min:1|max:5',
'komunikasi' => 'required|integer|min:1|max:5',
'sikap_kepribadian' => 'required|integer|min:1|max:5',
'kepemimpinan' => 'required|integer|min:1|max:5',
'konsistensi_komitmen' => 'required|integer|min:1|max:5',
'kedekatan_interpersonal' => 'required|integer|min:1|max:5',
'kritik_saran' => 'nullable|string'
]);
$anggota_penilai_id = auth()->check() ? (auth()->user()->anggota->id ?? 1) : 1;
$awalBulanIni = Carbon::now()->startOfMonth();
$akhirBulanIni = Carbon::now()->endOfMonth();
// 4. PENJAGA KEDUA: Memastikan keamanan data saat disubmit
$sudahMenilai = Penilaian::where('anggota_id', $anggota_penilai_id)
->where('pelatih_id', $request->pelatih_id)
->whereBetween('bulan_evaluasi', [$awalBulanIni, $akhirBulanIni])
->exists();
if ($sudahMenilai) {
return redirect()->route('penilaian.anggota_index')
->with('error', 'Gagal! Anda sudah menilai pelatih ini bulan ini.');
}
Penilaian::create([
'pelatih_id' => $request->pelatih_id,
'anggota_id' => $anggota_penilai_id,
'bulan_evaluasi' => $awalBulanIni,
'metode_pelatihan' => $request->metode_pelatihan,
'komunikasi' => $request->komunikasi,
'sikap_kepribadian' => $request->sikap_kepribadian,
'kepemimpinan' => $request->kepemimpinan,
'konsistensi_komitmen' => $request->konsistensi_komitmen,
'kedekatan_interpersonal' => $request->kedekatan_interpersonal,
'kritik_saran' => $request->kritik_saran,
]);
return redirect()->route('penilaian.anggota_index')->with('success', 'Penilaian pelatih berhasil disimpan!');
}
// FUNGSI INI KEMBALI DITAMBAHKAN KARENA SEMPAT TERHAPUS
public function show($id)
{
$pelatih = Anggota::with('kolat')->findOrFail($id);
// Hitung rata-rata tiap kriteria bulan ini
$rekap = Penilaian::where('pelatih_id', $id)
->whereMonth('bulan_evaluasi', now()->month)
->selectRaw('
AVG(metode_pelatihan) as avg_metode,
AVG(komunikasi) as avg_komunikasi,
AVG(sikap_kepribadian) as avg_sikap,
AVG(kepemimpinan) as avg_kepemimpinan,
AVG(konsistensi_komitmen) as avg_komitmen,
AVG(kedekatan_interpersonal) as avg_interpersonal
')->first();
// Ambil ulasan/kritik saran (Pluck agar anonim)
$ulasan = Penilaian::where('pelatih_id', $id)
->whereMonth('bulan_evaluasi', now()->month)
->whereNotNull('kritik_saran')
->pluck('kritik_saran');
return view('penilaian.rekap', compact('pelatih', 'rekap', 'ulasan'));
}
public function exportPdf($id)
{
// 1. Ambil data pelatih
$pelatih = Anggota::with('kolat')->findOrFail($id);
// 2. Hitung rata-rata nilai (Rekap)
$rekap = Penilaian::where('pelatih_id', $id)
->whereMonth('bulan_evaluasi', now()->month)
->selectRaw('
AVG(metode_pelatihan) as avg_metode,
AVG(komunikasi) as avg_komunikasi,
AVG(sikap_kepribadian) as avg_sikap,
AVG(kepemimpinan) as avg_kepemimpinan,
AVG(konsistensi_komitmen) as avg_komitmen,
AVG(kedekatan_interpersonal) as avg_interpersonal
')->first();
// 3. Ambil ulasan ulasan anggota
$ulasan = Penilaian::where('pelatih_id', $id)
->whereMonth('bulan_evaluasi', now()->month)
->whereNotNull('kritik_saran')
->pluck('kritik_saran');
// 4. Panggil file view "laporan_pdf" sesuai nama filemu
$pdf = Pdf::loadView('penilaian.laporan_pdf', compact('pelatih', 'rekap', 'ulasan'));
// 5. Download file PDF
return $pdf->download('Laporan-Performa-' . $pelatih->nama_lengkap . '.pdf');
}
public function indexAnggota()
{
// Ubah juga bagian ini menggunakan whereHas
$data_pelatih = Anggota::whereHas('role', function ($query) {
$query->where('nama_role', 'Pelatih');
})
->with('kolat')
->get();
return view('penilaian.anggota_index', compact('data_pelatih'));
}
}