466 lines
19 KiB
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();
|
|
}
|
|
}
|