Files
spota-dev/steven/API/willy_manageJadwal.php

391 lines
12 KiB
PHP

<?php
include '../conf/class.server.php';
include '../conf/koneksiPDO.php';
include '../conf/function.php';
header('Content-Type: application/json');
$conn = new createCon();
$dbh = $conn->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);
}