164 lines
5.8 KiB
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)
|
|
{
|
|
//
|
|
}
|
|
}
|