MIF_E31211891/app/Http/Controllers/SemproController.php

466 lines
19 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Exports\SeminarProposalExport;
use App\Models\Pengajuan;
use App\Models\SeminarJadwal;
use App\Models\SeminarProposal;
use App\Models\SeminarProposalTempat;
use App\Models\SeminarProposalWaktu;
use App\Models\SettingSempro;
use App\Models\User;
use Carbon\Carbon;
use DateTime;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Facades\Excel;
use Barryvdh\DomPDF\Facade\Pdf as PDF;
class SemproController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
if (Auth::User()->role == 'Admin') {
// Filter Tahun
$tahuns = SeminarJadwal::selectRaw('YEAR(tanggal_seminar) as year')->groupBy('year')->pluck('year');
$tahun = $request->tahun;
// Tangani filter tahun
$seminarJadwals = SeminarJadwal::whereIn(SeminarJadwal::raw('YEAR(tanggal_seminar)'), $tahuns)->when($tahun, function ($query, $tahun) {
return $query->whereYear('tanggal_seminar', $tahun);
});
// Filter Jadwal
$filter = $request->jadwal;
$today = Carbon::today();
// Tangani filter dropdown
if ($filter == 'hari') {
$seminarJadwals->whereDate('tanggal_seminar', $today);
} elseif ($filter == 'minggu') {
$startOfWeek = $today->startOfWeek();
$endOfWeek = $today->endOfWeek();
$seminarJadwals->whereBetween('tanggal_seminar', [$startOfWeek, $endOfWeek]);
} elseif ($filter == 'bulan') {
$seminarJadwals->whereYear('tanggal_seminar', $today->year)
->whereMonth('tanggal_seminar', $today->month);
}
// Dapatkan data seminar jadwal
$seminarJadwals = $seminarJadwals->get();
// Mengambil semua pengajuan
$pengajuans = Pengajuan::all();
// Mengambil semua mahasiswa
$mahasiswas = User::where('role', 'mahasiswa')->get();
// Mengambil semua dosen pembimbing
$dosenPembimbings = User::where('role', 'Dosen')->get();
// Mengambil semua seminar proposals
$seminarProposals = SeminarProposal::all();
// Mengambil semua tempat seminar proposal
$seminarProposalTempats = SeminarProposalTempat::all();
// Mengambil semua waktu seminar proposal
$seminarProposalWaktus = SeminarProposalWaktu::all();
// Memeriksa apakah ada jadwal
$showResetButton = $seminarJadwals->isNotEmpty();
return view('sempro', compact('tahuns', 'tahun', 'seminarJadwals', 'pengajuans', 'mahasiswas', 'dosenPembimbings', 'seminarProposals', 'seminarProposalTempats', 'seminarProposalWaktus', 'showResetButton'));
} elseif (Auth::user()->role == 'Dosen') {
$user_id = Auth::user()->id;
// Filter Tahun
$tahuns = SeminarJadwal::selectRaw('YEAR(tanggal_seminar) as year')->groupBy('year')->pluck('year');
$tahun = $request->tahun;
// Tangani filter tahun
$seminarJadwals = SeminarJadwal::where(function ($query) use ($user_id) {
$query->where('id_dosen_pembimbing', $user_id)
->orWhere('id_dosen_panelis_1', $user_id);
})
->whereIn(SeminarJadwal::raw('YEAR(tanggal_seminar)'), $tahuns)
->when($tahun, function ($query, $tahun) {
return $query->whereYear('tanggal_seminar', $tahun);
});
// Filter Jadwal
$filter = $request->jadwal;
$today = Carbon::today();
// Tangani filter dropdown
if ($filter == 'hari') {
$seminarJadwals->whereDate('tanggal_seminar', $today);
} elseif ($filter == 'minggu') {
$startOfWeek = $today->startOfWeek();
$endOfWeek = $today->endOfWeek();
$seminarJadwals->whereBetween('tanggal_seminar', [$startOfWeek, $endOfWeek]);
} elseif ($filter == 'bulan') {
$seminarJadwals->whereYear('tanggal_seminar', $today->year)
->whereMonth('tanggal_seminar', $today->month);
}
// Dapatkan data seminar jadwal
$seminarJadwals = $seminarJadwals->get();
return view('sempro', compact('seminarJadwals', 'tahun', 'tahuns'));
} elseif (Auth::user()->role == 'Mahasiswa') {
$user_id = Auth::user()->id;
$seminarJadwals = SeminarJadwal::where('id_mahasiswa', $user_id)
->get();
return view('sempro', compact('seminarJadwals'));
}
}
function generateJadwal($seminarProposal = null, $tglMulaiSidang = null, $waktuSeminarProposal = null, $tempatSeminarProposal = null)
{
// Ambil pengaturan seminar proposal
$settingSempro = SettingSempro::first();
// Ambil waktu mulai sidang
$tglMulaiSidang = ($tglMulaiSidang == null) ? $settingSempro->tgl_mulai_sidang : $tglMulaiSidang;
// Ambil tanggal akhir sidang
$tglAkhirSidang = $settingSempro->tgl_akhir_sidang;
// Ambil data seminar proposal yang belum terjadwal
$seminarProposalBelumTerjadwal = SeminarProposal::whereDoesntHave('seminarJadwal')->get();
$semproToBeAssigned = [];
/** @var SeminarProposal $pengajuanSeminarProposal */
foreach ($seminarProposalBelumTerjadwal as $pengajuanSeminarProposal) {
/** @var Pengajuan $pengajuan */
$pengajuan = $pengajuanSeminarProposal->pengajuan;
/** @var User $dosenPembimbing */
$dosenPembimbing = $pengajuan->dosenPembimbing;
$listPengajuan = $semproToBeAssigned[$dosenPembimbing->getAuthIdentifier()] ?? [];
$listPengajuan[] = $pengajuanSeminarProposal;
$semproToBeAssigned[$dosenPembimbing->getAuthIdentifier()] = $listPengajuan;
}
$listIdDosen = array_keys($semproToBeAssigned);
while ($semproToBeAssigned != []) {
$arrayKeys = array_keys($semproToBeAssigned);
$idDosenTimA = $arrayKeys[0] ?? null;
/** @var SeminarProposal $timA */
$timA = $semproToBeAssigned[$idDosenTimA] ?? null;
$idDosenTimB = $arrayKeys[1] ?? null;
/** @var SeminarProposal $timB */
$timB = $semproToBeAssigned[$idDosenTimB] ?? null;
$daftarTim = [];
if ($idDosenTimA != null) {
$daftarTim[$idDosenTimA] = $timA;
}
if ($idDosenTimB != null) {
$daftarTim[$idDosenTimB] = $timB;
}
if (count($daftarTim) < 2) {
$dosen = User::query()->where('role', 'Dosen')->where('prodi', 'MIF')->whereNot('id', $idDosenTimA)->inRandomOrder()->first();
$daftarTim[$dosen->id] = [];
}
[$sisaTimA, $sisaTimB] = $this->generateJadwalService($daftarTim, $tglMulaiSidang, $tglAkhirSidang);
if ($sisaTimA != null && count($sisaTimA) != 0) {
$semproToBeAssigned[$idDosenTimA] = $sisaTimA;
} else {
unset($semproToBeAssigned[$idDosenTimA]);
}
if ( $sisaTimB != null && count($sisaTimB) != 0) {
$semproToBeAssigned[$idDosenTimB] = $sisaTimB;
} else {
unset($semproToBeAssigned[$idDosenTimB]);
}
}
return redirect()->back()->with('toast_success', 'Generate Jadwal Seminar Proposal Berhasil.');
}
public function generateJadwalService(
$teamToBeAssigned = null,
$tglMulaiSidang = null,
$tglAkhirSidang = null,
$waktuSeminarProposal = null,
$tempatSeminarProposal = null
) {
// Konversi tanggal menjadi objek Carbon
$tglMulaiSidang = Carbon::parse($tglMulaiSidang);
// Jika tanggal tersebut adalah hari Sabtu atau Minggu, geser ke hari Senin
if ($tglMulaiSidang->isWeekend()) {
$tglMulaiSidang->next(Carbon::MONDAY);
}
// Periksa apakah tanggal mulai sidang melewati tanggal akhir sidang
if (Carbon::parse($tglMulaiSidang)->gt(Carbon::parse($tglAkhirSidang))) {
// Jika tanggal mulai sidang melewati tanggal akhir sidang, generate gagal
return redirect()
->back()
->with(
'toast_error',
'Generate Jadwal Melewati Batas Akhir. Tambahkan Tempat/Waktu Seminar Proposal.'
);
}
$arrayKeys = array_keys($teamToBeAssigned);
$idDosenTimA = $arrayKeys[0];
/** @var SeminarProposal $timA */
$timA = $teamToBeAssigned[$idDosenTimA];
$idDosenTimB = $arrayKeys[1];
/** @var SeminarProposal $timB */
$timB = $teamToBeAssigned[$idDosenTimB];
$waktuSeminarProposal = ($waktuSeminarProposal == null)
? SeminarProposalWaktu::query()->orderBy('waktu_mulai')->first()
: $waktuSeminarProposal;
$tempatSeminarProposal = ($tempatSeminarProposal == null)
? SeminarProposalTempat::query()->orderBy('id')->first()
: $tempatSeminarProposal;
// Ambil data jadwal seminar yang sudah ada pada tanggal dan waktu yang sama
$cekDosenSudahTerjadwal = SeminarJadwal::query()
->where('tanggal_seminar', $tglMulaiSidang)
->where('id_seminar_proposal_waktu', $waktuSeminarProposal->id)
->where(function (Builder $query) use ($idDosenTimA, $idDosenTimB) {
$query->where('id_dosen_pembimbing', $idDosenTimA)
->orWhere('id_dosen_panelis_1', $idDosenTimA)
->orWhere('id_dosen_pembimbing', $idDosenTimB)
->orWhere('id_dosen_panelis_1', $idDosenTimB);
})->count();
if ($cekDosenSudahTerjadwal == 0) {
$cekApaRuanganTidakKosong = SeminarJadwal::query()
->where('tanggal_seminar', $tglMulaiSidang)
->where('id_seminar_proposal_waktu', $waktuSeminarProposal->id)
->where('id_seminar_proposal_tempat', $tempatSeminarProposal->id)
->count();
// 0 artinya ruangan kosong
if ($cekApaRuanganTidakKosong == 0) {
$jumlahTimAAwal = count($timA);
for ($i = 0; $i < $jumlahTimAAwal && $i < 3; $i++) {
$mahasiswa = $timA[$i]->mahasiswa;
$pengajuan = $timA[$i]->pengajuan;
$dosenPembimbing = $idDosenTimA;
$dosenPenguji = $idDosenTimB;
$seminarJadwal = new SeminarJadwal;
$seminarJadwal->id_pengajuan = $pengajuan->id;
$seminarJadwal->id_mahasiswa = $mahasiswa->id;
$seminarJadwal->id_dosen_pembimbing = $dosenPembimbing;
$seminarJadwal->id_dosen_panelis_1 = $dosenPenguji;
$seminarJadwal->id_seminar_proposal = $timA[$i]->id;
$seminarJadwal->id_seminar_proposal_waktu = $waktuSeminarProposal->id;
$seminarJadwal->id_seminar_proposal_tempat = $tempatSeminarProposal->id;
$seminarJadwal->tanggal_seminar = $tglMulaiSidang;
$seminarJadwal->save();
unset($timA[$i]);
}
$jumlahTimBAwal = count($timB);
for ($i = 0; $i < $jumlahTimBAwal && $i < 3; $i++) {
$mahasiswa = $timB[$i]->mahasiswa;
$pengajuan = $timB[$i]->pengajuan;
$dosenPembimbing = $idDosenTimB;
$dosenPenguji = $idDosenTimA;
$seminarJadwal = new SeminarJadwal;
$seminarJadwal->id_pengajuan = $pengajuan->id;
$seminarJadwal->id_mahasiswa = $mahasiswa->id;
$seminarJadwal->id_dosen_pembimbing = $dosenPembimbing;
$seminarJadwal->id_dosen_panelis_1 = $dosenPenguji;
$seminarJadwal->id_seminar_proposal = $timB[$i]->id;
$seminarJadwal->id_seminar_proposal_waktu = $waktuSeminarProposal->id;
$seminarJadwal->id_seminar_proposal_tempat = $tempatSeminarProposal->id;
$seminarJadwal->tanggal_seminar = $tglMulaiSidang;
$seminarJadwal->save();
unset($timB[$i]);
}
if (count($timA) != 0 && count($timB) != 0) {
$waktuSeminarProposalBerikutnya = SeminarProposalWaktu::where('waktu_mulai', '>', $waktuSeminarProposal->waktu_mulai)->first();
$sisaData = [
$idDosenTimA => [...$timA],
$idDosenTimB => [...$timB],
];
if ($waktuSeminarProposalBerikutnya == null) {
$tglMulaiSidangObj = new DateTime($tglMulaiSidang->format('Y-m-d'));
$tglMulaiSidangObj->modify('+1 day');
$tglMulaiSidang = $tglMulaiSidangObj;
// Konversi tanggal menjadi objek Carbon
$tglMulaiSidang = Carbon::parse($tglMulaiSidang);
// Jika tanggal tersebut adalah hari Sabtu atau Minggu, geser ke hari Senin
if ($tglMulaiSidang->isWeekend()) {
$tglMulaiSidang->next(Carbon::MONDAY);
}
return $this->generateJadwalService($sisaData, $tglMulaiSidang, $tglAkhirSidang);
} else {
return $this->generateJadwalService($sisaData, $tglMulaiSidang, $tglAkhirSidang, $waktuSeminarProposalBerikutnya);
}
} else {
return [$timA, $timB];
}
} else {
$tempatSeminarProposalBerikutnya = SeminarProposalTempat::where('id', '>', $tempatSeminarProposal->id)->first();
$sisaData = [
$idDosenTimA => [...$timA],
$idDosenTimB => [...$timB],
];
if ($tempatSeminarProposalBerikutnya == null) {
$waktuSeminarProposalBerikutnya = SeminarProposalWaktu::where('waktu_mulai', '>', $waktuSeminarProposal->waktu_mulai)->first();
if ($waktuSeminarProposalBerikutnya == null) {
$tglMulaiSidangObj = new DateTime($tglMulaiSidang);
$tglMulaiSidangObj->modify('+1 day');
$tglMulaiSidang = $tglMulaiSidangObj;
// Konversi tanggal menjadi objek Carbon
$tglMulaiSidang = Carbon::parse($tglMulaiSidang);
// Jika tanggal tersebut adalah hari Sabtu atau Minggu, geser ke hari Senin
if ($tglMulaiSidang->isWeekend()) {
$tglMulaiSidang->next(Carbon::MONDAY);
}
return $this->generateJadwalService($sisaData, $tglMulaiSidang, $tglAkhirSidang);
} else {
return $this->generateJadwalService($sisaData, $tglMulaiSidang, $tglAkhirSidang, $waktuSeminarProposalBerikutnya);
}
} else {
return $this->generateJadwalService($sisaData, $tglMulaiSidang, $tglAkhirSidang, $waktuSeminarProposal, $tempatSeminarProposalBerikutnya);
}
}
} else {
$waktuSeminarProposalBerikutnya = SeminarProposalWaktu::where('waktu_mulai', '>', $waktuSeminarProposal->waktu_mulai)->first();
$sisaData = [
$idDosenTimA => [...$timA],
$idDosenTimB => [...$timB],
];
if ($waktuSeminarProposalBerikutnya == null) {
$tglMulaiSidangObj = new DateTime($tglMulaiSidang);
$tglMulaiSidangObj->modify('+1 day');
$tglMulaiSidang = $tglMulaiSidangObj;
// Konversi tanggal menjadi objek Carbon
$tglMulaiSidang = Carbon::parse($tglMulaiSidang);
// Jika tanggal tersebut adalah hari Sabtu atau Minggu, geser ke hari Senin
if ($tglMulaiSidang->isWeekend()) {
$tglMulaiSidang->next(Carbon::MONDAY);
}
return $this->generateJadwalService($sisaData, $tglMulaiSidang, $tglAkhirSidang);
} else {
return $this->generateJadwalService($sisaData, $tglMulaiSidang, $tglAkhirSidang, $waktuSeminarProposalBerikutnya);
}
}
return [$sisaTimA, $sisaTimB];
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
// Validasi data yang diterima dari request
$request->validate([]);
// Cari data SeminarJadwal berdasarkan ID
$jadwal = SeminarJadwal::findOrFail($id);
if($request->id_dosen_panelis_1 == $jadwal->id_dosen_pembimbing)
{
return redirect()->back()->with('toast_error', 'Dosen Penguji Sama Dengan Dosen Pembimbing.');
} else {
// Update data SeminarJadwal dengan data baru dari request
$jadwal->update([
'id_seminar_proposal_waktu' => $request->input('id_seminar_proposal_waktu'),
'id_seminar_proposal_tempat' => $request->input('id_seminar_proposal_tempat'),
'tanggal_seminar' => $request->input('tanggal_seminar'),
'id_dosen_panelis_1' => $request->input('id_dosen_panelis_1'),
]);
// Redirect ke halaman atau route yang sesuai setelah berhasil mengupdate data
return redirect()->back()->with('toast_success', 'Jadwal Seminar Proposal Berhasil Diperbarui.');
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
// Cari data SeminarJadwal berdasarkan ID
$jadwal = SeminarJadwal::findOrFail($id);
// Hapus data SeminarJadwal
$jadwal->delete();
// Redirect ke halaman atau route yang sesuai setelah berhasil menghapus data
return redirect()->back()->with('toast_success', 'Jadwal Seminar Proposal Berhasil Dihapus.');
}
public function reset()
{
// Menghapus semua jadwal
SeminarJadwal::truncate();
return redirect()->back()->with('toast_success', 'Jadwal Seminar Proposal Berhasil Diatur Ulang.');
}
public function exportExcel()
{
return Excel::download(new SeminarProposalExport, 'seminarproposal.xlsx');
}
public function exportPDF()
{
$seminarJadwal = SeminarJadwal::with([
'pengajuan',
'mahasiswa',
'dosenPembimbing',
'dosenPanelis1',
'seminarProposal',
'seminarProposalWaktu',
'seminarProposalTempat'
])->get();
$pdf = PDF::loadView('export.seminarproposal', compact('seminarJadwal'))->setPaper('a4', 'landscape');
return $pdf->stream();
}
}