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(); } }