136 lines
5.5 KiB
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'));
|
|
}
|
|
}
|