MIF_E31211891/app/Http/Controllers/DaftarTungguController.php

164 lines
5.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Models\Pengajuan;
use Illuminate\Http\Request;
use App\Models\SettingPengajuan;
use App\Models\Subkriteria;
use Illuminate\Support\Facades\Session;
class DaftarTungguController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$no = 1;
$mahasiswa = User::where('role', 'Mahasiswa')->whereNotNull('judul')->where('pembimbing', NULL)->orderBy('name', 'ASC')->get();
$dosen = User::where('role', 'Dosen')->orderBy('prodi', 'ASC')->orderBy('name', 'ASC')->get();
return view('daftar-tunggu', compact('no', 'mahasiswa', 'dosen'));
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$mahasiswas = User::where('role', 'Mahasiswa')->whereNotNull('judul')->where('pembimbing', NULL)->get();
$results = [];
// Mendapatkan prodi yang dipilih dari checkbox
$prodi = $request->input('prodi');
// Kata kunci untuk setiap kategori
$kategoriKeywords = [
'Sistem Pendukung Keputusan' => ['Sistem Pendukung Keputusan', 'Rekomendasi', 'Pemilihan', 'Penentuan'],
'Media Pembelajaran' => ['Media Pembelajaran', 'Augmented Reality', 'Game', 'Edukasi', 'Pembelajaran'],
'Sistem Pakar' => ['Sistem Pakar'],
'Sistem Informasi' => ['Sistem Informasi', 'Sistem Penjualan', 'Website'],
'Aplikasi Mobile' => ['Mobile', 'Android'],
'Data Mining' => ['Data Mining', 'Analisis', 'Visualisasi Data', 'Peramalan', 'Prediksi', 'Forecasting']
];
// Mengambil daftar jabatan dari database
$jabatanData = Subkriteria::where('id_kriteria', '2')->get();
$jabatanTertinggi = $jabatanData->pluck('nama_subkriteria')->toArray();
$jabatanTerendah = array_reverse($jabatanTertinggi);
foreach ($mahasiswas as $mahasiswa) {
$judul = $mahasiswa->judul;
$kategori = NULL;
foreach ($kategoriKeywords as $kategoriKey => $keywords) {
foreach ($keywords as $keyword) {
if (strpos($judul, $keyword) !== false) {
$kategori = $kategoriKey;
break 2; // Keluar dari kedua loop
}
}
}
// Tentukan urutan jabatan berdasarkan IPK mahasiswa
$jabatanUrut = $mahasiswa->ipk >= 3.75 ? $jabatanTerendah : $jabatanTertinggi;
$randomDosen = null;
// Loop melalui urutan jabatan
foreach ($jabatanUrut as $jabatan) {
// Mendapatkan dosen berdasarkan jabatan dan kategori
$dosens = User::where(function($query) use ($jabatan) {
if ($jabatan === 'Dosen') {
$query->where('jabatan', $jabatan)
->orWhereNull('jabatan');
} else {
$query->where('jabatan', $jabatan);
}
})
->where(function($query) use ($kategori) {
$query->where('keahlian', 'like', "%$kategori%")
->orWhere('minat', 'like', "%$kategori%");
})
->whereIn('prodi', $prodi)
->get();
// Filter dosen yang kuotanya belum penuh
$availableDosens = $dosens->reject(function ($dosen) {
$settingPengajuan = SettingPengajuan::first();
$maxMahasiswa = $settingPengajuan->maxMahasiswa;
return User::where('pembimbing', $dosen->name)->count() >= $maxMahasiswa;
});
// Jika ada dosen yang tersedia, pilih salah satu secara acak
if ($availableDosens->isNotEmpty()) {
$randomDosen = $availableDosens->random();
break; // Keluar dari loop jabatan setelah menemukan dosen
}
}
// Jika tidak menemukan dosen yang tersedia dalam urutan jabatan yang ditentukan
if (!$randomDosen) {
$dosens = User::where(function($query) use ($jabatanUrut) {
$query->whereIn('jabatan', $jabatanUrut)
->orWhereNull('jabatan');
})
->whereIn('prodi', $prodi)
->get();
$randomDosen = $dosens->random();
}
$results[] = [
'mahasiswa' => $mahasiswa,
'dosen' => $randomDosen,
'dosens' => $dosens
];
}
Session::put('pembimbing', $results);
return view('daftar-tunggu', compact('results'))->with('toast_success', 'Generate Dosen Pembimbing Berhasil');
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request)
{
$dosenSelections = $request->input('pembimbing');
$results = Session::get('pembimbing');
foreach ($results as $result) {
$mahasiswa = $result['mahasiswa'];
$selectedDosen = $dosenSelections[$mahasiswa->id];
$mahasiswa->update([
'pembimbing' => $selectedDosen,
]);
}
Session::forget('pembimbing'); // Hapus session setelah disimpan
return redirect()->route('daftar-tunggu')->with('toast_success', 'Dosen Pembimbing Berhasil Disimpan');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}