MIF_E31221225/app/Http/Controllers/Siswa/AngketController.php

136 lines
5.5 KiB
PHP

<?php
namespace App\Http\Controllers\Siswa;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Siswa;
use App\Models\AngketSiswa;
use App\Models\PaketMapel;
use App\Models\ProdiLanjutan;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class AngketController extends Controller
{
// Menampilkan halaman utama angket siswa
public function index()
{
// Ambil data siswa berdasarkan user yang login
$siswa = Siswa::where('user_id', Auth::id())->first();
// Ambil data angket yang sudah diisi siswa (jika ada)
$angket = AngketSiswa::where('siswa_id', $siswa->id)->first();
// Ambil semua data paket mapel beserta relasi mapel
$paketMapels = PaketMapel::with('mapels')->get();
// Hitung jumlah peminat tiap paket (manual karena tidak bisa pakai withCount)
foreach ($paketMapels as $paket) {
$paket->jumlah_peminat = AngketSiswa::where('paket_pertama_id', $paket->id)
->orWhere('paket_kedua_id', $paket->id)
->orWhere('paket_ketiga_id', $paket->id)
->count();
}
return view('siswa.angket.index', compact('siswa', 'angket', 'paketMapels'));
}
// Menampilkan halaman info angket untuk siswa
public function info()
{
// Ambil informasi angket terbaru
$info = \App\Models\InfoAngket::latest()->first();
// Ambil semua paket mapel dan prodi lanjutan untuk ditampilkan
$pakets = PaketMapel::with('mapels')->get();
$prodis = ProdiLanjutan::with('mapels')->get();
return view('siswa.angket.info', compact('info', 'pakets', 'prodis'));
}
// Menampilkan form pengisian angket
public function create()
{
// Ambil data siswa yang login
$siswa = Siswa::where('user_id', Auth::id())->first();
// Ambil data prodi lanjutan dan paket mapel
$prodis = ProdiLanjutan::with('mapels')->get();
$paketMapels = PaketMapel::with('mapels')->get();
// Cek apakah siswa sudah pernah mengisi angket
$angket = AngketSiswa::where('siswa_id', $siswa->id)->first();
return view('siswa.angket.create', compact('siswa', 'prodis', 'paketMapels', 'angket'));
}
// Menyimpan data angket yang diisi siswa
public function store(Request $request)
{
// Validasi input siswa
$request->validate([
'prodi_id' => 'required|exists:prodi_lanjutan,id',
'paket_pertama_id' => 'required|exists:paket_mapel,id',
'paket_kedua_id' => 'nullable|exists:paket_mapel,id|different:paket_pertama_id',
'paket_ketiga_id' => 'nullable|exists:paket_mapel,id|different:paket_pertama_id|different:paket_kedua_id',
'cita_cita' => 'nullable|string',
'rencana' => 'nullable|string',
]);
// Ambil data siswa yang login
$siswa = Siswa::where('user_id', Auth::id())->first();
// Cek apakah siswa sudah pernah mengisi angket (hanya sekali boleh)
$count = AngketSiswa::where('siswa_id', $siswa->id)->count();
if ($count >= 1) {
return redirect()->route('siswa.angket.index')->with('error', 'Anda sudah mengisi angket.');
}
// Simpan data angket ke database
AngketSiswa::create([
'siswa_id' => $siswa->id,
'nama' => $siswa->nama,
'jenis_kelamin' => $siswa->jenis_kelamin,
'kelas_id' => $siswa->kelas_id,
'cita_cita' => $request->cita_cita ?? '-',
'rencana_setelah_lulus' => $request->rencana ?? '-',
'prodi_id' => $request->prodi_id,
'paket_pertama_id' => $request->paket_pertama_id,
'paket_kedua_id' => $request->paket_kedua_id,
'paket_ketiga_id' => $request->paket_ketiga_id,
'paket_final_id' => null, // Finalisasi dilakukan oleh admin nanti
]);
return redirect()->route('siswa.angket.index')->with('success', 'Pilihan paket mapel berhasil disimpan.');
}
// Menampilkan hasil angket yang sudah diisi siswa
public function hasil()
{
// Ambil data siswa yang login
$siswa = Siswa::where('user_id', Auth::id())->first();
// Ambil data angket milik siswa tersebut
$angket = AngketSiswa::where('siswa_id', $siswa->id)->first();
if (!$angket) {
return redirect()->route('siswa.angket.index')->with('error', 'Belum ada data angket.');
}
// Ambil data masing-masing paket mapel yang dipilih siswa
$paket1 = PaketMapel::with('mapels')->find($angket->paket_pertama_id);
$paket2 = PaketMapel::with('mapels')->find($angket->paket_kedua_id);
$paket3 = PaketMapel::with('mapels')->find($angket->paket_ketiga_id);
$paketFinal = $angket->paket_final_id ? PaketMapel::with('mapels')->find($angket->paket_final_id) : null;
// Ambil ranking siswa berdasarkan total nilai dari tabel nilai_total_mapel
$ranking = DB::table('nilai_total_mapel')
->select('siswa_id', DB::raw('SUM(nilai_total) as total_nilai'))
->groupBy('siswa_id')
->orderByDesc('total_nilai')
->get();
// Ambil nilai total siswa
$nilaiSiswa = $ranking->firstWhere('siswa_id', $siswa->id);
// Cari posisi ranking siswa
$peringkat = $ranking->search(fn($item) => $item->siswa_id == $siswa->id);
return view('siswa.angket.hasil', compact('paket1', 'paket2', 'paket3', 'paketFinal', 'nilaiSiswa', 'peringkat'));
}
}