connect(); requireRobotSecret(); $jsonData = getRequestJson(); $act = isset($jsonData['act']) ? trim((string) $jsonData['act']) : ''; if ($act === '') { jsonResponse([ 'status' => false, 'msg' => 'Parameter act tidak lengkap', ], 422); } function getManageJadwalTitle($jenis, $namaMahasiswa, $nimMahasiswa) { $judulSeminar = ''; switch ($jenis) { case 'Outline': $judulSeminar = 'Seminar Outline'; break; case 'SidHas': $judulSeminar = 'Sidang Hasil'; break; case 'Sidang': $judulSeminar = 'Sidang Terbuka'; break; } if ($judulSeminar === '') { return ''; } return $judulSeminar.' '.$namaMahasiswa.' / '.$nimMahasiswa; } function loadMahasiswaByNim($dbh, $nim) { $sql = 'SELECT * FROM tbmhs WHERE nim = :nim'; $stmt = $dbh->prepare($sql); $stmt->bindParam(':nim', $nim); $stmt->execute(); $mahasiswa = $stmt->fetch(PDO::FETCH_ASSOC); if (!$mahasiswa) { jsonResponse([ 'status' => false, 'msg' => 'NIM mahasiswa tidak dikenali', ], 404); } return $mahasiswa; } function loadDosenMeta($dbh, $namaPemb1, $namaPemb2, $namaPeng1, $namaPeng2) { $namaList = [$namaPemb1, $namaPemb2, $namaPeng1, $namaPeng2]; $placeholders = []; $params = []; foreach ($namaList as $index => $nama) { $key = ':nama'.$index; $placeholders[] = $key; $params[$key] = $nama; } $sql = 'SELECT * FROM tbdosen WHERE nmLengkap IN ('.implode(', ', $placeholders).')'; $stmt = $dbh->prepare($sql); $stmt->execute($params); $result = [ 'listEmail' => [], 'idPemb1' => 0, 'idPemb2' => 0, 'idPeng1' => 0, 'idPeng2' => 0, ]; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { if (!empty($row['email'])) { $result['listEmail'][] = $row['email']; } if ($namaPemb1 === $row['nmLengkap']) { $result['idPemb1'] = (int) $row['iddosen']; } if ($namaPemb2 === $row['nmLengkap']) { $result['idPemb2'] = (int) $row['iddosen']; } if ($namaPeng1 === $row['nmLengkap']) { $result['idPeng1'] = (int) $row['iddosen']; } if ($namaPeng2 === $row['nmLengkap']) { $result['idPeng2'] = (int) $row['iddosen']; } } return $result; } function callCalendarApi($endpoint, $payload) { $url = 'http://203.24.50.140:8086/'.$endpoint; $postData = json_encode($payload); $opts = [ 'http' => [ 'method' => 'POST', 'ignore_errors' => true, 'header' => 'Content-Type: application/json', 'content' => $postData, 'timeout' => 20, ], ]; $context = stream_context_create($opts); $response = @file_get_contents($url, false, $context); if ($response === false || trim($response) === '') { return []; } $decoded = json_decode($response, true); return is_array($decoded) ? $decoded : []; } function buildCalendarPayload($jenis, $namaMahasiswa, $nimMahasiswa, $ruangan, $waktuSidang, $listEmail, $calendarId = null) { $timestampStartSeminar = strtotime($waktuSidang); if ($timestampStartSeminar === false) { jsonResponse([ 'status' => false, 'msg' => 'Format waktuSidang tidak valid', ], 422); } $timestampEndSeminar = strtotime('+2 hours', $timestampStartSeminar); $payload = [ 'judul' => getManageJadwalTitle($jenis, $namaMahasiswa, $nimMahasiswa), 'ruangan' => $ruangan, 'start' => date('Y-m-d\TH:i:s', $timestampStartSeminar), 'end' => date('Y-m-d\TH:i:s', $timestampEndSeminar), 'emailUser' => array_values(array_unique(array_filter($listEmail))), ]; if ($calendarId !== null && $calendarId !== '') { $payload['id'] = $calendarId; } return $payload; } function getManageJadwalParams($jsonData, $needsId) { $required = [ 'nim', 'judul', 'ruangan', 'jenis', 'waktuSidang', 'namaPemb1', 'namaPemb2', 'namaPeng1', 'namaPeng2', ]; if ($needsId) { $required[] = 'id'; } foreach ($required as $field) { if (!isset($jsonData[$field]) || trim((string) $jsonData[$field]) === '') { jsonResponse([ 'status' => false, 'msg' => 'Parameter tidak lengkap', ], 422); } } return [ 'id' => $needsId ? (int) $jsonData['id'] : 0, 'nim' => trim((string) $jsonData['nim']), 'judul' => trim((string) $jsonData['judul']), 'ruangan' => trim((string) $jsonData['ruangan']), 'jenis' => trim((string) $jsonData['jenis']), 'waktuSidang' => trim((string) $jsonData['waktuSidang']), 'namaPemb1' => trim((string) $jsonData['namaPemb1']), 'namaPemb2' => trim((string) $jsonData['namaPemb2']), 'namaPeng1' => trim((string) $jsonData['namaPeng1']), 'namaPeng2' => trim((string) $jsonData['namaPeng2']), ]; } switch ($act) { case 'add': $params = getManageJadwalParams($jsonData, false); $mahasiswa = loadMahasiswaByNim($dbh, $params['nim']); $dosenMeta = loadDosenMeta( $dbh, $params['namaPemb1'], $params['namaPemb2'], $params['namaPeng1'], $params['namaPeng2'] ); $listEmail = $dosenMeta['listEmail']; if (!empty($mahasiswa['email'])) { $listEmail[] = $mahasiswa['email']; } $calendarPayload = buildCalendarPayload( $params['jenis'], $mahasiswa['nmLengkap'], $mahasiswa['nim'], $params['ruangan'], $params['waktuSidang'], $listEmail ); $calendarResponse = callCalendarApi('insertJadwal', $calendarPayload); $calendarId = isset($calendarResponse['id']) ? $calendarResponse['id'] : null; $calendarLink = isset($calendarResponse['link']) ? $calendarResponse['link'] : null; $sql = "INSERT INTO tbjadwal(idMhs, judul, ruangan, jenis, start, pemb1, pemb2, peng1, peng2, end, idProdi, calendarId, calendarLink, idPemb1, idPemb2, idPeng1, idPeng2) VALUES(:idMhs, :judul, :ruangan, :jenis, :waktuSidang, :namaPemb1, :namaPemb2, :namaPeng1, :namaPeng2, '2000-01-01 00:00:00', '2', :calendarId, :calendarLink, :idPemb1, :idPemb2, :idPeng1, :idPeng2)"; $stmt = $dbh->prepare($sql); $stmt->bindValue(':idMhs', $mahasiswa['idmhs']); $stmt->bindValue(':judul', $params['judul']); $stmt->bindValue(':ruangan', $params['ruangan']); $stmt->bindValue(':jenis', $params['jenis']); $stmt->bindValue(':waktuSidang', $params['waktuSidang']); $stmt->bindValue(':namaPemb1', $params['namaPemb1']); $stmt->bindValue(':namaPemb2', $params['namaPemb2']); $stmt->bindValue(':namaPeng1', $params['namaPeng1']); $stmt->bindValue(':namaPeng2', $params['namaPeng2']); $stmt->bindValue(':calendarId', $calendarId); $stmt->bindValue(':calendarLink', $calendarLink); $stmt->bindValue(':idPemb1', $dosenMeta['idPemb1']); $stmt->bindValue(':idPemb2', $dosenMeta['idPemb2']); $stmt->bindValue(':idPeng1', $dosenMeta['idPeng1']); $stmt->bindValue(':idPeng2', $dosenMeta['idPeng2']); $stmt->execute(); $error = $stmt->errorInfo(); if ($error[0] !== '00000') { jsonResponse([ 'status' => false, 'msg' => 'Terjadi kesalahan teknis!!!', 'error' => $error, ], 500); } jsonResponse([ 'status' => true, 'msg' => 'Berhasil menambah data jadwal!!!', 'id' => $dbh->lastInsertId(), 'link' => $calendarLink, ]); break; case 'update': $params = getManageJadwalParams($jsonData, true); $mahasiswa = loadMahasiswaByNim($dbh, $params['nim']); $dosenMeta = loadDosenMeta( $dbh, $params['namaPemb1'], $params['namaPemb2'], $params['namaPeng1'], $params['namaPeng2'] ); $listEmail = $dosenMeta['listEmail']; if (!empty($mahasiswa['email'])) { $listEmail[] = $mahasiswa['email']; } $sql = 'SELECT calendarId FROM tbjadwal WHERE id = :id'; $stmt = $dbh->prepare($sql); $stmt->bindValue(':id', $params['id']); $stmt->execute(); $jadwal = $stmt->fetch(PDO::FETCH_ASSOC); $calendarId = $jadwal ? $jadwal['calendarId'] : null; $sql = 'UPDATE tbjadwal SET idMhs = :idMhs, judul = :judul, ruangan = :ruangan, jenis = :jenis, start = :waktuSidang, pemb1 = :namaPemb1, pemb2 = :namaPemb2, peng1 = :namaPeng1, peng2 = :namaPeng2, idPemb1 = :idPemb1, idPemb2 = :idPemb2, idPeng1 = :idPeng1, idPeng2 = :idPeng2 WHERE id = :id'; $stmt = $dbh->prepare($sql); $stmt->bindValue(':id', $params['id']); $stmt->bindValue(':idMhs', $mahasiswa['idmhs']); $stmt->bindValue(':judul', $params['judul']); $stmt->bindValue(':ruangan', $params['ruangan']); $stmt->bindValue(':jenis', $params['jenis']); $stmt->bindValue(':waktuSidang', $params['waktuSidang']); $stmt->bindValue(':namaPemb1', $params['namaPemb1']); $stmt->bindValue(':namaPemb2', $params['namaPemb2']); $stmt->bindValue(':namaPeng1', $params['namaPeng1']); $stmt->bindValue(':namaPeng2', $params['namaPeng2']); $stmt->bindValue(':idPemb1', $dosenMeta['idPemb1']); $stmt->bindValue(':idPemb2', $dosenMeta['idPemb2']); $stmt->bindValue(':idPeng1', $dosenMeta['idPeng1']); $stmt->bindValue(':idPeng2', $dosenMeta['idPeng2']); $stmt->execute(); $error = $stmt->errorInfo(); if ($error[0] !== '00000') { jsonResponse([ 'status' => false, 'msg' => 'Terjadi kesalahan teknis!!!', 'error' => $error, ], 500); } if (!empty($calendarId)) { $calendarPayload = buildCalendarPayload( $params['jenis'], $mahasiswa['nmLengkap'], $mahasiswa['nim'], $params['ruangan'], $params['waktuSidang'], $listEmail, $calendarId ); callCalendarApi('updateJadwal', $calendarPayload); } jsonResponse([ 'status' => true, 'msg' => 'Berhasil mengubah data jadwal!!!', ]); break; case 'delete': if (!isset($jsonData['id'], $jsonData['nim']) || trim((string) $jsonData['id']) === '' || trim((string) $jsonData['nim']) === '') { jsonResponse([ 'status' => false, 'msg' => 'Parameter tidak lengkap', ], 422); } $id = (int) $jsonData['id']; $nim = trim((string) $jsonData['nim']); $mahasiswa = loadMahasiswaByNim($dbh, $nim); $sql = 'SELECT calendarId FROM tbjadwal WHERE id = :id'; $stmt = $dbh->prepare($sql); $stmt->bindValue(':id', $id); $stmt->execute(); $jadwal = $stmt->fetch(PDO::FETCH_ASSOC); $calendarId = $jadwal ? $jadwal['calendarId'] : null; $sql = 'DELETE FROM tbjadwal WHERE id = :id AND idMhs = :idMhs'; $stmt = $dbh->prepare($sql); $stmt->bindValue(':id', $id); $stmt->bindValue(':idMhs', $mahasiswa['idmhs']); $stmt->execute(); $error = $stmt->errorInfo(); if ($error[0] !== '00000') { jsonResponse([ 'status' => false, 'msg' => 'Terjadi kesalahan teknis!!!', 'error' => $error, ], 500); } if (!empty($calendarId)) { callCalendarApi('deleteJadwal', [ 'id' => $calendarId, ]); } jsonResponse([ 'status' => true, 'msg' => 'Berhasil menghapus data jadwal!!!', ]); break; default: jsonResponse([ 'status' => false, 'msg' => 'act tidak dikenali', ], 422); }