From e7b07a3cfd6f68af3859d576cda9d53535f747d1 Mon Sep 17 00:00:00 2001 From: Power BI Dev Date: Thu, 7 May 2026 14:50:31 +0700 Subject: [PATCH] Stabilize legacy Steven API endpoints and add OpenAPI spec --- steven/API/doxid_penunjukan_penguji.php | 220 ++++++++ steven/API/getBerkasSidangMahasiswa.php | 137 +++++ steven/API/getDetailTugasAkhirMahasiswa.php | 105 ++++ steven/API/getListDataTAMahasiswa.php | 90 ++++ steven/API/getListKK.php | 57 +++ steven/API/notifIngatkanKeKKMasing.php | 129 +++++ steven/API/openapi.yaml | 527 ++++++++++++++++++++ steven/API/postBerkasSidangMahasiswa.php | 111 +++++ steven/API/postBerkasSidangMahasiswaNew.php | 89 ++++ steven/API/sendMail.php | 185 +++++++ steven/API/sendMail_manual.php | 105 ++++ steven/API/verifBerkasAdmin.php | 66 +++ steven/API/verifBerkasDosen.php | 72 +++ steven/API/willy_manageJadwal.php | 390 +++++++++++++++ steven/API/willy_updateDataRekapHasil.php | 78 +++ steven/conf/class.server.php | 49 ++ steven/conf/function.php | 345 +++++++++++++ 17 files changed, 2755 insertions(+) create mode 100644 steven/API/doxid_penunjukan_penguji.php create mode 100644 steven/API/getBerkasSidangMahasiswa.php create mode 100644 steven/API/getDetailTugasAkhirMahasiswa.php create mode 100644 steven/API/getListDataTAMahasiswa.php create mode 100644 steven/API/getListKK.php create mode 100644 steven/API/notifIngatkanKeKKMasing.php create mode 100644 steven/API/openapi.yaml create mode 100644 steven/API/postBerkasSidangMahasiswa.php create mode 100644 steven/API/postBerkasSidangMahasiswaNew.php create mode 100644 steven/API/sendMail.php create mode 100644 steven/API/sendMail_manual.php create mode 100644 steven/API/verifBerkasAdmin.php create mode 100644 steven/API/verifBerkasDosen.php create mode 100644 steven/API/willy_manageJadwal.php create mode 100644 steven/API/willy_updateDataRekapHasil.php create mode 100644 steven/conf/class.server.php create mode 100644 steven/conf/function.php diff --git a/steven/API/doxid_penunjukan_penguji.php b/steven/API/doxid_penunjukan_penguji.php new file mode 100644 index 0000000..d8faa1f --- /dev/null +++ b/steven/API/doxid_penunjukan_penguji.php @@ -0,0 +1,220 @@ +connect(); + +requireRobotSecret(); + +$jsonData = getRequestJson(); + +if (!isset($jsonData['id'], $jsonData['peng1'], $jsonData['peng2'])) { + jsonResponse([ + 'status' => 0, + 'msg' => 'Parameter tidak lengkap', + ], 422); +} + +$id = $jsonData['id']; +$peng1 = $jsonData['peng1']; +$peng2 = $jsonData['peng2']; + +if(empty($peng1) || empty($peng2)){ + echo json_encode([ + 'status' => 0, + 'msg' => "Penguji Tidak Boleh Kosong", + ]); + exit; +} +/** +$jsonInput = json_encode($jsonData); +$sql = "INSERT INTO tescurldaridoxid(data) VALUES (:data)"; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':data', $jsonInput); +$stmt->execute(); +*/ + +$sql = "UPDATE tbrekaphasil SET peng1 = :peng1, peng2 = :peng2 WHERE id = :id"; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':peng1', $peng1); +$stmt->bindParam(':peng2', $peng2); +$stmt->bindParam(':id', $id); +$stmt->execute(); + +$error = $stmt->errorInfo(); + +$isError = true; + +if ($error[0] == '00000') { + $isError = false; +} + +if ($isError) { + echo json_encode( + [ + 'status' => 0, + 'msg' => 'Terjadi kesalahan teknis!!!', + ] + ); +} else { + $listNomorWA = []; + + $sql = "SELECT * FROM tbdosen"; + $stmt = $dbh->prepare($sql); + $stmt->execute(); + + $listDosen = []; + while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ + $listDosen[$row['nip']] = $row; + } + + $sql = "SELECT tbrekaphasil.*, tbmhs.nmLengkap, tbmhs.noHP FROM tbrekaphasil LEFT JOIN tbmhs ON tbrekaphasil.nim = tbmhs.nim WHERE tbrekaphasil.id = :id"; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':id', $id); + $stmt->execute(); + + if($stmt->rowCount() == 0){ + echo json_encode([ + 'status' => 0, + 'msg' => "Data Skripsi Tidak Ditemukan", + ]); + exit; + } + + while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ + $todayDate = date('d-m-Y'); + $tanggalPenunjukanPenguji = $row['timestampPenunjukanPenguji']; + $semesterPenunjukanPenguji = $row['semesterPenunjukanPenguji']; + if(empty($tanggalPenunjukanPenguji)){ + $tanggalPenunjukanPenguji = date('Y-m-d'); + $bulanKeputusan = date('m', strtotime($tanggalPenunjukanPenguji)); + $tahunKeputusan = date('Y', strtotime($tanggalPenunjukanPenguji)); + + if ($bulanKeputusan >= 2 && $bulanKeputusan <= 7) { + $tahunKeputusan = $tahunKeputusan - 1; + $semesterKeputusan = 'GEN'; + } else { + $semesterKeputusan = 'GAS'; + $tahunKeputusan = $tahunKeputusan; + } + + $semesterPenunjukanPenguji = $semesterKeputusan.'-'.$tahunKeputusan; + + $sql = "UPDATE tbrekaphasil SET timestampPenunjukanPenguji = :tanggal, semesterPenunjukanPenguji = :semester WHERE id = :id"; + $stmt1 = $dbh->prepare($sql); + $stmt1->bindParam(':tanggal', $tanggalPenunjukanPenguji); + $stmt1->bindParam(':semester', $semesterPenunjukanPenguji); + $stmt1->bindParam(':id', $id); + $stmt1->execute(); + } + + $waktuPenguji = date('Y-m-d'); + $hari = date('w'); + + $hariText = ''; + switch ($hari) { + case '0': $hariText = 'Minggu'; break; + case '1': $hariText = 'Senin'; break; + case '2': $hariText = 'Selasa'; break; + case '3': $hariText = 'Rabu'; break; + case '4': $hariText = 'Kamis'; break; + case '5': $hariText = 'Jumat'; break; + case '6': $hariText = 'Sabtu'; break; + } + + $idPraoutline = $row['idpraoutline']; + $judul = $row['judul_final']; + + $noHPMahasiswa = $row['noHP']; + $namaMahasiswa = strtoupper($row['nmLengkap']); + $nimMahasiswa = strtoupper($row['nim']); + + //kirimkan ke no bu tuning + array_push($listNomorWA, "082350250892"); + + if(!empty($noHPMahasiswa)){ + array_push($listNomorWA, $noHPMahasiswa); + } + + $nipPemb1 = $row['pemb1']; + $nipPemb2 = $row['pemb2']; + $nipPeng1 = $row['peng1']; + $nipPeng2 = $row['peng2']; + + $namaPemb1 = ''; + $namaPemb2 = ''; + $namaPeng1 = ''; + $namaPeng2 = ''; + + $noPemb1 = ''; + $noPemb2 = ''; + $noPeng1 = ''; + $noPeng2 = ''; + + if(!empty($nipPemb1) && isset($listDosen[$nipPemb1])){ + $namaPemb1 = $listDosen[$nipPemb1]['nmLengkap']; + + if(!empty($listDosen[$nipPemb1]['nohp'])){ + $noPemb1 = $listDosen[$nipPemb1]['nohp']; + array_push($listNomorWA, $listDosen[$nipPemb1]['nohp']); + } + } + + if(!empty($nipPemb2) && isset($listDosen[$nipPemb2])){ + $namaPemb2 = $listDosen[$nipPemb2]['nmLengkap']; + + if(!empty($listDosen[$nipPemb2]['nohp'])){ + $noPemb2 = $listDosen[$nipPemb2]['nohp']; + array_push($listNomorWA, $listDosen[$nipPemb2]['nohp']); + } + } + + if(!empty($nipPeng1) && isset($listDosen[$nipPeng1])){ + $namaPeng1 = $listDosen[$nipPeng1]['nmLengkap']; + + if(!empty($listDosen[$nipPeng1]['nohp'])){ + $noPeng1 = $listDosen[$nipPeng1]['nohp']; + array_push($listNomorWA, $listDosen[$nipPeng1]['nohp']); + } + } + + + if(!empty($nipPeng2) && isset($listDosen[$nipPeng2])){ + $namaPeng2 = $listDosen[$nipPeng2]['nmLengkap']; + + if(!empty($listDosen[$nipPeng2]['nohp'])){ + $noPeng2 = $listDosen[$nipPeng2]['nohp']; + array_push($listNomorWA, $listDosen[$nipPeng2]['nohp']); + } + } + + $isiNotif = "*KEPUTUSAN PENUNJUKKAN PENGUJI (SPOTA)*\n\nDosen penguji untuk skripsi mahasiswa *$namaMahasiswa / $nimMahasiswa* ($noHPMahasiswa) dengan judul *$judul* pada *$hariText, $todayDate* untuk pelaksanaan Seminar Hasil (Sidang Tertutup) dengan susunan Tim Penguji sebagai berikut:\n\nPembimbing 1 (Ketua): *$namaPemb1* ($noPemb1)\nPembimbing 2 (Sekretaris) : *$namaPemb2* ($noPemb2)\nPenguji 1 : *$namaPeng1* ($noPeng1)\nPenguji 2 : *$namaPeng2* ($noPeng2)\n\n*SPOTA INFORMATIKA UNTAN*\nKlik Disini :\nhttps://spota.untan.ac.id/dosen/dashboard.php?page=praoutline&menu=review&prid=$idPraoutline"; + } + + $listNomorWA = array_values(array_unique($listNomorWA)); + + foreach($listNomorWA as $key => $val){ + if (empty($val)) { + continue; + } + + $nomorWA = '62'.intval($val); + $sql = "INSERT INTO tbl_notif_wa(toX,isiPesan, status) VALUES (:toX, :isiPesan, '0')"; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':toX', $nomorWA); + $stmt->bindParam(':isiPesan', $isiNotif); + $stmt->execute(); + } + + echo json_encode( + [ + 'status' => 1, + 'msg' => 'Berhasil mengupdate data penguji untuk data ini!!!', + ] + ); +} diff --git a/steven/API/getBerkasSidangMahasiswa.php b/steven/API/getBerkasSidangMahasiswa.php new file mode 100644 index 0000000..1c7f203 --- /dev/null +++ b/steven/API/getBerkasSidangMahasiswa.php @@ -0,0 +1,137 @@ +connect(); + +header('Content-Type: application/json'); + +if (!isset($_GET['bypassSaya'])) { + $loginMhs = requireSessionRole('mhs'); + $nim = $loginMhs['nim']; +} else { + $loginDosen = isset($_SESSION['login-dosen']) ? $_SESSION['login-dosen'] : null; + $loginAdmin = isset($_SESSION['login-admin']) ? $_SESSION['login-admin'] : null; + if (!is_array($loginDosen) && !is_array($loginAdmin)) { + jsonResponse(['status' => 403, 'msg' => 'Forbidden'], 403); + } +} + +$idRekapHasil = isset($_GET['idRekapHasil']) ? (int) $_GET['idRekapHasil'] : 0; +$jenis = isset($_GET['jenis']) ? trim((string) $_GET['jenis']) : ''; + +if ($idRekapHasil <= 0 || $jenis === '') { + jsonResponse(['status' => 0, 'msg' => 'Parameter tidak lengkap'], 422); +} + +$sql = 'SELECT * FROM tbrekaphasil WHERE id = :idRekapHasil'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':idRekapHasil', $idRekapHasil); +$stmt->execute(); +$rekap = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$rekap) { + jsonResponse(['status' => 0, 'msg' => 'Data Not Found'], 404); +} + +if (!isset($_GET['bypassSaya'])) { + if ($rekap['nim'] !== $nim) { + jsonResponse(['status' => 403, 'msg' => 'Forbidden'], 403); + } +} elseif (!is_array($loginAdmin)) { + $dosenNip = isset($loginDosen['nip']) ? (string) $loginDosen['nip'] : ''; + $allowedNips = [ + (string) $rekap['pemb1'], + (string) $rekap['pemb2'], + (string) $rekap['peng1'], + (string) $rekap['peng2'], + ]; + + if ($dosenNip === '' || !in_array($dosenNip, $allowedNips, true)) { + jsonResponse(['status' => 403, 'msg' => 'Forbidden'], 403); + } +} + +$sql = 'SELECT * FROM tb_verif_berkas WHERE idRekapHasil = :idRekapHasil AND jenisSidang = :jenisSidang'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':idRekapHasil', $idRekapHasil); +$stmt->bindParam(':jenisSidang', $jenis); +$stmt->execute(); + +$catatanAdmin = ''; +while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $catatanAdmin = $row['catatanDariAdmin']; +} + +$sql = 'SELECT * FROM tb_berkas_sidang WHERE idRekapHasil = :idRekapHasil AND jenisSidang = :jenisSidang'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':idRekapHasil', $idRekapHasil); +$stmt->bindParam(':jenisSidang', $jenis); +$stmt->execute(); + +$listBerkas = []; +while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $namaBerkas = $row['nama']; + $idBerkas = $row['idBerkas']; + $driveId = $row['driveId']; + $status = $row['status']; + + if ($driveId != null && $driveId != '') { + $driveId = 'https://drive.google.com/open?id='.$driveId; + } + + array_push($listBerkas, [ + 'id' => $idBerkas, + 'nama' => $namaBerkas, + 'file' => $driveId, + 'status' => $status, + ]); +} + +$berkasSidang = []; +switch ($jenis) { + case 'Sidang': + $berkasSidang = [ + 'ktm' => ['judul' => 'Kartu Tanda Mahasiswa (KTM) terakhir', 'data' => null], + 'spp' => ['judul' => 'Tanda Bukti Pembayaran SPP terakhir', 'data' => null], + 'foto' => ['judul' => 'Pas Photo ukuran 3x4 = 3 lembar (Warna Latar Belakang Biru)', 'data' => null], + 'lirs' => ['judul' => 'Lembaran Isian Rencana Studi (LIRS) terakhir', 'data' => null], + 'transkrip' => ['judul' => 'Rekapitulasi Nilai Terakhir (Transkrip)', 'data' => null], + 'buktiAbsen' => ['judul' => 'Bukti Absen Seminar Outline Skripsi', 'data' => null], + 'beritaAcaraSeminarOutline' => ['judul' => 'Berita Acara Seminar Outline Skripsi', 'data' => null], + 'suratRekomendasiSidang' => ['judul' => 'Surat Rekomendasi Pelaksanaan Sidang Akhir Skripsi Secara Daring dari Jurusan/Program Studi', 'data' => null], + 'bebasReferensiTeknik' => ['judul' => 'Bebas Referensi Fakultas Teknik', 'data' => null], + 'bebasReferensiUntan' => ['judul' => 'Bebas Referensi UNTAN', 'data' => null], + 'bebasReferensiPerpusDaerah' => ['judul' => 'Bebas Referensi Perpustakaan Daerah', 'data' => null], + 'TI08' => ['judul' => 'Siap Sidang TI. 08', 'data' => null], + 'buktiUploadJurnal' => ['judul' => 'Bukti Upload Jurnal ( Teknik Informatika)', 'data' => null], + 'ifTA07' => ['judul' => 'Format IF-TA-07', 'data' => null], + 'b4' => ['judul' => 'Kartu Konsultasi Skripsi (B4)', 'data' => null], + 'b1' => ['judul' => 'Format B.1', 'data' => null], + 'b5' => ['judul' => 'Format B.5', 'data' => null], + 'suratWisuda' => ['judul' => 'Surat Pernyataan Wisuda', 'data' => null], + 'biodataSarjana' => ['judul' => 'Biodata Sarjana Baru', 'data' => null], + 'ijazahSMA' => ['judul' => 'Ijazah SMA', 'data' => null], + 'toefl' => ['judul' => 'Sertifikat TOEFL (nilai min. 425)', 'data' => null], + 'kartuKeluarga' => ['judul' => 'Kartu Keluarga', 'data' => null], + 'ktp' => ['judul' => 'KTP', 'data' => null], + 'skripsi' => ['judul' => 'Skripsi/Tugas Akhir', 'data' => null], + ]; + + break; + default: echo json_encode(['status' => 0, 'msg' => 'Jenis tidak dikenali']); exit; +} + +foreach ($berkasSidang as $key => $val) { + foreach ($listBerkas as $key2 => $val2) { + if ($key == $val2['nama']) { + $berkasSidang[$key]['data'] = $val2; + } + } +} + +echo json_encode(utf8ize(['status' => 1, 'data' => $berkasSidang, 'catatanAdmin' => $catatanAdmin])); diff --git a/steven/API/getDetailTugasAkhirMahasiswa.php b/steven/API/getDetailTugasAkhirMahasiswa.php new file mode 100644 index 0000000..ad583c3 --- /dev/null +++ b/steven/API/getDetailTugasAkhirMahasiswa.php @@ -0,0 +1,105 @@ +connect(); + +requireRobotSecret(); + +$id = isset($_GET['id']) ? (int) $_GET['id'] : 0; +if ($id <= 0) { + jsonResponse([ + 'status' => 0, + 'msg' => 'Parameter id tidak valid', + ], 422); +} + +$listTahunMasukMahasiswa = []; +$sql = "SELECT * FROM tbmhs"; +$stmt = $dbh->prepare($sql); +$stmt->execute(); + +while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ + $nimDb = $row['nim']; + $thnMasukDb = $row['thnmasuk']; + + $listTahunMasukMahasiswa[$nimDb] = intval($thnMasukDb); +} + +//$sql = "SELECT tbpraoutline.*, tbrekaphasil.judul_final, tbrekaphasil.pemb1, tbrekaphasil.pemb2, tbrekaphasil.peng1, tbrekaphasil.peng2, tbrekaphasil.kep_akhir, tbrekaphasil.tgl_kep, tbrekaphasil.wkt_kep FROM tbpraoutline LEFT JOIN tbrekaphasil ON tbpraoutline.id = tbrekaphasil.idpraoutline"; +$sql = "SELECT tbrekaphasil.*, tbpraoutline.kelompokKeahlian FROM tbrekaphasil LEFT JOIN tbpraoutline ON tbrekaphasil.idpraoutline = tbpraoutline.id WHERE tbrekaphasil.id = :id"; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':id', $id); +$stmt->execute(); + +if($stmt->rowCount() == 0){ + jsonResponse([ + 'status' => 0, + 'msg' => 'Data Not Found', + ], 404); +} +$data = null; +while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $id = $row['id']; + $nim = $row['nim']; + $judul = $row['judul_final']; + $pemb1 = $row['pemb1']; + $pemb2 = $row['pemb2']; + $peng1 = $row['peng1']; + $peng2 = $row['peng2']; + $semester = $row['semester']; + $tahun = $row['tahun_ajaran']; + $tanggalKep = $row['tgl_kep']; + $waktuKep = $row['wkt_kep']; + $kepAkhir = $row['kep_akhir']; + $kelompokKeahlian = $row['kelompokKeahlian']; + $jadwal = []; + + if(!isset($listTahunMasukMahasiswa[$nim])){ + continue; + }else{ + if($listTahunMasukMahasiswa[$nim] < 2014){ + continue; + } + } + + $sql = "SELECT * FROM tbjadwal LEFT JOIN tbmhs ON tbjadwal.idMhs = tbmhs.idmhs WHERE nim = :nim AND publish = 'Y' ORDER BY start"; + $stmt1 = $dbh->prepare($sql); + $stmt1->bindParam(':nim', $nim); + $stmt1->execute(); + + while($row1 = $stmt1->fetch(PDO::FETCH_ASSOC)){ + array_push($jadwal,[ + 'jenis' => $row1['jenis'], + 'waktu' => $row1['start'], + 'ruangan' => $row1['ruangan'], + ]); + } + + $data = array( + 'id' => $id, + 'judul' => $judul, + 'nim' => $nim, + 'pemb1' => $pemb1, + 'pemb2' => $pemb2, + 'peng1' => $peng1, + 'peng2' => $peng2, + 'semester' => $semester, + 'tahun' => $tahun, + 'tanggalKeputusan' => $tanggalKep, + 'waktuKeputusan' => $waktuKep, + 'kelompokKeahlian' => $kelompokKeahlian, + 'jadwal' => $jadwal, + 'kepAkhir' => $kepAkhir, + ); +} + +echo json_encode(utf8ize(['status' => 1, 'data' => $data])); diff --git a/steven/API/getListDataTAMahasiswa.php b/steven/API/getListDataTAMahasiswa.php new file mode 100644 index 0000000..3b6b840 --- /dev/null +++ b/steven/API/getListDataTAMahasiswa.php @@ -0,0 +1,90 @@ +connect(); + +requireRobotSecret(); + +$listTahunMasukMahasiswa = []; +$sql = "SELECT * FROM tbmhs"; +$stmt = $dbh->prepare($sql); +$stmt->execute(); + +while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ + $nimDb = $row['nim']; + $thnMasukDb = $row['thnmasuk']; + + $listTahunMasukMahasiswa[$nimDb] = intval($thnMasukDb); +} + +//$sql = "SELECT tbpraoutline.*, tbrekaphasil.judul_final, tbrekaphasil.pemb1, tbrekaphasil.pemb2, tbrekaphasil.peng1, tbrekaphasil.peng2, tbrekaphasil.kep_akhir, tbrekaphasil.tgl_kep, tbrekaphasil.wkt_kep FROM tbpraoutline LEFT JOIN tbrekaphasil ON tbpraoutline.id = tbrekaphasil.idpraoutline"; +$sql = "SELECT tbrekaphasil.*, tbpraoutline.kelompokKeahlian FROM tbrekaphasil LEFT JOIN tbpraoutline ON tbrekaphasil.idpraoutline = tbpraoutline.id WHERE kep_akhir = '1'"; +$stmt = $dbh->prepare($sql); +$stmt->execute(); + +$data = array(); +while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $id = $row['id']; + $nim = $row['nim']; + $judul = $row['judul_final']; + $pemb1 = $row['pemb1']; + $pemb2 = $row['pemb2']; + $peng1 = $row['peng1']; + $peng2 = $row['peng2']; + $semester = $row['semester']; + $tahun = $row['tahun_ajaran']; + $tanggalKep = $row['tgl_kep']; + $waktuKep = $row['wkt_kep']; + $kelompokKeahlian = $row['kelompokKeahlian']; + $jadwal = []; + + if(!isset($listTahunMasukMahasiswa[$nim])){ + continue; + }else{ + if($listTahunMasukMahasiswa[$nim] < 2014){ + continue; + } + } + + $sql = "SELECT * FROM tbjadwal LEFT JOIN tbmhs ON tbjadwal.idMhs = tbmhs.idmhs WHERE nim = :nim AND publish = 'Y' ORDER BY start"; + $stmt1 = $dbh->prepare($sql); + $stmt1->bindParam(':nim', $nim); + $stmt1->execute(); + + while($row1 = $stmt1->fetch(PDO::FETCH_ASSOC)){ + array_push($jadwal,[ + 'jenis' => $row1['jenis'], + 'waktu' => $row1['start'], + 'ruangan' => $row1['ruangan'], + ]); + } + + array_push($data, array( + 'id' => $id, + 'judul' => $judul, + 'nim' => $nim, + 'pemb1' => $pemb1, + 'pemb2' => $pemb2, + 'peng1' => $peng1, + 'peng2' => $peng2, + 'semester' => $semester, + 'tahun' => $tahun, + 'tanggalKeputusan' => $tanggalKep, + 'waktuKeputusan' => $waktuKep, + 'kelompokKeahlian' => $kelompokKeahlian, + 'jadwal' => $jadwal, + )); +} + +echo json_encode(utf8ize(array('status' => 1, 'data' => $data))); diff --git a/steven/API/getListKK.php b/steven/API/getListKK.php new file mode 100644 index 0000000..0e9ed2b --- /dev/null +++ b/steven/API/getListKK.php @@ -0,0 +1,57 @@ +connect(); + +checkKey('GET', 'secret'); + +requireRobotSecret(); + +$sql = 'SELECT * FROM tb_kelompok_keahlian LEFT JOIN tbdosen ON tb_kelompok_keahlian.ketuaKK = tbdosen.iddosen'; +$stmt = $dbh->prepare($sql); +$stmt->execute(); + +$data = []; +while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $idKK = $row['idKK']; + $listAnggotaKK = []; + + array_push($listAnggotaKK, [ + 'status' => 'ketua', + 'id' => $row['iddosen'], + 'nama' => $row['nmLengkap'], + ]); + + $sql = 'SELECT * FROM tbdosen WHERE kelompokKeahlian = :kk'; + $stmt1 = $dbh->prepare($sql); + $stmt1->bindParam(':kk', $idKK); + $stmt1->execute(); + + while ($row1 = $stmt1->fetch(PDO::FETCH_ASSOC)) { + if ($row1['iddosen'] == $row['iddosen']) { + continue; + } + + array_push($listAnggotaKK, [ + 'status' => 'anggota', + 'id' => $row1['iddosen'], + 'nama' => $row1['nmLengkap'], + ]); + } + + array_push($data, [ + 'id' => $row['idKK'], + 'nama' => $row['namaKK'], + 'anggotaKK' => $listAnggotaKK, + ]); +} + +echo json_encode(utf8ize(['status' => 1, 'data' => $data])); diff --git a/steven/API/notifIngatkanKeKKMasing.php b/steven/API/notifIngatkanKeKKMasing.php new file mode 100644 index 0000000..7356519 --- /dev/null +++ b/steven/API/notifIngatkanKeKKMasing.php @@ -0,0 +1,129 @@ +connect(); + +checkKey('GET', 'secret'); +checkKey('GET', 'idKK'); +checkKey('GET', 'tgl'); + +requireRobotSecret(); + +$idKK = intval($_GET['idKK']); +$timestampTgl = strtotime($_GET['tgl']); +if ($timestampTgl === false) { + jsonResponse(['status' => 0, 'msg' => 'Format tanggal tidak valid'], 422); +} + +$tanggalUpload = date('Y-m-d', $timestampTgl); + +$sql = 'SELECT * FROM tb_kelompok_keahlian WHERE idKK = :idKK'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':idKK', $idKK); +$stmt->execute(); + +if ($stmt->rowCount() === 0) { + jsonResponse(['status' => 0, 'msg' => 'KK tidak ditemukan'], 404); +} + +while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $namaKK = $row['namaKK']; + $ketuaKK = $row['ketuaKK']; +} + +$sql = 'SELECT * FROM tbdosen WHERE iddosen = :ketuaKK OR jenis = :jenisKajur'; +$stmt = $dbh->prepare($sql); +$jenisKajur = 'K'; +$stmt->bindParam(':ketuaKK', $ketuaKK); +$stmt->bindParam(':jenisKajur', $jenisKajur); +$stmt->execute(); + +$listNoHP = []; +while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $noHPDosen = $row['nohp']; + array_push($listNoHP, $noHPDosen); +} + +$statusUsulan = '0'; +$sql = 'SELECT tbpraoutline.*, tbmhs.idmhs, tbmhs.thnmasuk, tbmhs.nmLengkap FROM tbpraoutline LEFT JOIN tbmhs ON tbpraoutline.nim = tbmhs.nim WHERE status_usulan = :statusUsulan AND kelompokKeahlian = :idKK AND tgl_upload < :tanggalUpload'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':statusUsulan', $statusUsulan); +$stmt->bindParam(':idKK', $idKK); +$stmt->bindParam(':tanggalUpload', $tanggalUpload); +$stmt->execute(); + +if ($stmt->rowCount() === 0) { + jsonResponse(['status' => 0, 'msg' => 'Tidak ada judul yang belum diclose untuk KK ini'], 404); +} + +$judul = '*PERMINTAAN KEPUTUSAN DRAFT PROPOSAL*'; + +$isiNotif = "\n\nDraft proposal yang masih menunggu keputusan dari KK *$namaKK* sebagai berikut:\n\n"; + +$i = 1; +while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $id = $row['id']; + $nim = $row['nim']; + $nama = $row['nmLengkap']; + $judulSkripsi = $row['judul']; + $tanggalUpload = date('d-m-Y', strtotime($row['tgl_upload'])); + + $isiNotif .= "$i. $judulSkripsi ($nama/$nim) - Tanggal Upload : *$tanggalUpload*\n\n"; + + ++$i; +} + +$sendWA = $judul.$isiNotif."*SPOTA INFORMATIKA UNTAN*"; + +foreach ($listNoHP as $key => $hp) { + if(empty($hp)){ + continue; + } + + $hp = '62'.intval($hp); + $sql = "INSERT INTO tbl_notif_wa(toX, isiPesan) VALUES(:tujuan, :pesan)"; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':tujuan', $hp); + $stmt->bindParam(':pesan', $sendWA); + $stmt->execute(); + + // $data = [ + // 'api_key' => '979b07377545d6ccda68e8fa2e8d629cad2216de', + // 'sender' => '6281522658229', + // 'number' => $hp, + // 'message' => $sendWA, ]; + + // //print_r($data); + + // $curl = curl_init(); + // curl_setopt_array($curl, [ + // CURLOPT_URL => 'https://wa.gofly.id/api/send-message.php', + // CURLOPT_RETURNTRANSFER => true, + // CURLOPT_ENCODING => '', + // CURLOPT_MAXREDIRS => 10, + // CURLOPT_TIMEOUT => 2, + // CURLOPT_FOLLOWLOCATION => true, + // CURLOPT_SSL_VERIFYPEER => 0, + // CURLOPT_CONNECTTIMEOUT => 2, + // CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + // CURLOPT_CUSTOMREQUEST => 'POST', + // CURLOPT_POSTFIELDS => json_encode($data), ] + // ); + + // $response = curl_exec($curl); + + // if (curl_errno($curl)) { + // $error_msg = curl_error($curl); + // echo $error_msg; + // } +} + +echo json_encode(['status' => 1, 'msg' => 'ok']); diff --git a/steven/API/openapi.yaml b/steven/API/openapi.yaml new file mode 100644 index 0000000..3fae34b --- /dev/null +++ b/steven/API/openapi.yaml @@ -0,0 +1,527 @@ +openapi: 3.0.3 +info: + title: SPOTA Legacy Steven API + version: 0.1.0 + description: | + Dokumentasi awal endpoint legacy di `steven/API`. + Fokus dokumen ini adalah endpoint yang sudah distabilkan dan masih dipakai integrasi lama. +servers: + - url: https://spota.informatika.untan.ac.id/steven/API +security: + - LegacySecretQuery: [] + - LegacySecretHeader: [] +tags: + - name: Robot + description: Endpoint machine-to-machine dengan secret legacy. + - name: Session + description: Endpoint yang memerlukan session login aplikasi. +paths: + /getListMahasiswa.php: + get: + tags: [Robot] + summary: Ambil daftar mahasiswa + parameters: + - $ref: '#/components/parameters/SecretQuery' + - name: mulaiTahun + in: query + schema: + type: integer + description: Filter angkatan minimal. + - name: withHP + in: query + schema: + type: string + description: Jika ada, sertakan `hp` dan `hpOrtu`. + responses: + '200': + description: Data mahasiswa + content: + application/json: + schema: + $ref: '#/components/schemas/ListMahasiswaResponse' + '401': + $ref: '#/components/responses/Unauthorized' + /getListDosen.php: + get: + tags: [Robot] + summary: Ambil daftar dosen + parameters: + - $ref: '#/components/parameters/SecretQuery' + responses: + '200': + description: Data dosen + content: + application/json: + schema: + $ref: '#/components/schemas/ListDosenResponse' + '401': + $ref: '#/components/responses/Unauthorized' + /getListTugasAkhir.php: + get: + tags: [Robot] + summary: Ambil daftar tugas akhir mahasiswa + parameters: + - $ref: '#/components/parameters/SecretQuery' + - name: mulaiTahun + in: query + schema: + type: integer + - name: withoutKep + in: query + schema: + type: string + description: Jika ada, data tidak difilter `kep_akhir = 1`. + responses: + '200': + description: Data tugas akhir + content: + application/json: + schema: + $ref: '#/components/schemas/ListTugasAkhirResponse' + '401': + $ref: '#/components/responses/Unauthorized' + /getListDataTAMahasiswa.php: + get: + tags: [Robot] + summary: Ambil data rekap tugas akhir beserta jadwal + parameters: + - $ref: '#/components/parameters/SecretQuery' + responses: + '200': + description: Data TA mahasiswa + content: + application/json: + schema: + $ref: '#/components/schemas/ListDataTaMahasiswaResponse' + '401': + $ref: '#/components/responses/Unauthorized' + /getDetailTugasAkhirMahasiswa.php: + get: + tags: [Robot] + summary: Ambil detail tugas akhir mahasiswa + parameters: + - $ref: '#/components/parameters/SecretQuery' + - name: id + in: query + required: true + schema: + type: integer + responses: + '200': + description: Detail tugas akhir + content: + application/json: + schema: + type: object + '401': + $ref: '#/components/responses/Unauthorized' + /getListKK.php: + get: + tags: [Robot] + summary: Ambil daftar kelompok keahlian + parameters: + - $ref: '#/components/parameters/SecretQuery' + responses: + '200': + description: Data kelompok keahlian + content: + application/json: + schema: + type: object + '401': + $ref: '#/components/responses/Unauthorized' + /sendMail.php: + post: + tags: [Robot] + summary: Kirim email HTML ke banyak penerima + requestBody: + required: true + content: + application/x-www-form-urlencoded: + schema: + type: object + required: [secret, to, judul, content] + properties: + secret: + type: string + to: + type: string + description: JSON array string email penerima. + example: '["user1@example.com","user2@example.com"]' + judul: + type: string + content: + type: string + from: + type: string + responses: + '200': + description: Email terkirim + content: + application/json: + schema: + $ref: '#/components/schemas/StandardSuccess' + '401': + $ref: '#/components/responses/Unauthorized' + '422': + $ref: '#/components/responses/ValidationError' + /willy_manageJadwal.php: + post: + tags: [Robot] + summary: Tambah, ubah, atau hapus jadwal sidang + security: + - LegacySecretHeader: [] + - LegacySecretQuery: [] + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ManageJadwalAddRequest' + - $ref: '#/components/schemas/ManageJadwalUpdateRequest' + - $ref: '#/components/schemas/ManageJadwalDeleteRequest' + responses: + '200': + description: Operasi jadwal berhasil + content: + application/json: + schema: + type: object + '401': + $ref: '#/components/responses/Unauthorized' + '422': + $ref: '#/components/responses/ValidationError' + /getBerkasSidangMahasiswa.php: + get: + tags: [Session] + summary: Ambil daftar berkas sidang mahasiswa + description: | + Default untuk mahasiswa yang sedang login. + Jika memakai `bypassSaya`, akses hanya untuk dosen terkait atau admin. + security: [] + parameters: + - name: idRekapHasil + in: query + required: true + schema: + type: integer + - name: jenis + in: query + required: true + schema: + type: string + enum: [Outline, SidHas, Sidang] + - name: bypassSaya + in: query + schema: + type: string + responses: + '200': + description: Berkas sidang + content: + application/json: + schema: + type: object + '403': + description: Forbidden + /verifBerkasAdmin.php: + post: + tags: [Session] + summary: Verifikasi berkas oleh admin + security: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + responses: + '200': + description: Verifikasi tersimpan + '403': + description: Forbidden + /verifBerkasDosen.php: + post: + tags: [Session] + summary: Verifikasi berkas oleh dosen terkait + security: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + responses: + '200': + description: Verifikasi tersimpan + '403': + description: Forbidden +components: + securitySchemes: + LegacySecretQuery: + type: apiKey + in: query + name: secret + LegacySecretHeader: + type: apiKey + in: header + name: X-API-Key + parameters: + SecretQuery: + name: secret + in: query + required: true + schema: + type: string + responses: + Unauthorized: + description: Secret salah atau tidak dikirim. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + ValidationError: + description: Parameter tidak lengkap atau tidak valid. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + schemas: + StandardSuccess: + type: object + properties: + status: + oneOf: + - type: integer + - type: boolean + msg: + type: string + ErrorResponse: + type: object + properties: + status: + oneOf: + - type: integer + - type: boolean + msg: + type: string + MahasiswaItem: + type: object + properties: + id: + type: integer + nim: + type: string + nama: + type: string + email: + type: string + urlFoto: + type: string + angkatan: + type: integer + hp: + type: string + hpOrtu: + type: string + ListMahasiswaResponse: + type: object + properties: + status: + type: integer + msg: + type: string + data: + type: array + items: + $ref: '#/components/schemas/MahasiswaItem' + DosenItem: + type: object + properties: + id: + type: integer + nip: + type: string + nama: + type: string + email: + type: string + hp: + type: string + urlFoto: + type: string + ListDosenResponse: + type: object + properties: + status: + type: integer + msg: + type: string + data: + type: array + items: + $ref: '#/components/schemas/DosenItem' + TugasAkhirItem: + type: object + properties: + id: + type: integer + judul: + type: string + nim: + type: string + nama: + type: string + pemb1: + type: string + pemb2: + type: string + peng1: + type: string + peng2: + type: string + semester: + type: string + tahun: + type: string + tanggalKeputusan: + type: string + waktuKeputusan: + type: string + idPraoutline: + type: integer + keputusan: + type: string + sidang: + type: integer + ListTugasAkhirResponse: + type: object + properties: + status: + type: integer + msg: + type: string + data: + type: array + items: + $ref: '#/components/schemas/TugasAkhirItem' + JadwalItem: + type: object + properties: + jenis: + type: string + waktu: + type: string + ruangan: + type: string + DataTaMahasiswaItem: + type: object + properties: + id: + type: integer + judul: + type: string + nim: + type: string + pemb1: + type: string + pemb2: + type: string + peng1: + type: string + peng2: + type: string + semester: + type: string + tahun: + type: string + tanggalKeputusan: + type: string + waktuKeputusan: + type: string + kelompokKeahlian: + type: string + jadwal: + type: array + items: + $ref: '#/components/schemas/JadwalItem' + ListDataTaMahasiswaResponse: + type: object + properties: + status: + type: integer + data: + type: array + items: + $ref: '#/components/schemas/DataTaMahasiswaItem' + ManageJadwalBaseRequest: + type: object + required: + - act + - nim + - judul + - ruangan + - jenis + - waktuSidang + - namaPemb1 + - namaPemb2 + - namaPeng1 + - namaPeng2 + properties: + act: + type: string + secret: + type: string + nim: + type: string + judul: + type: string + ruangan: + type: string + jenis: + type: string + enum: [Outline, SidHas, Sidang] + waktuSidang: + type: string + example: '2026-05-07 08:00:00' + namaPemb1: + type: string + namaPemb2: + type: string + namaPeng1: + type: string + namaPeng2: + type: string + ManageJadwalAddRequest: + allOf: + - $ref: '#/components/schemas/ManageJadwalBaseRequest' + - type: object + properties: + act: + type: string + enum: [add] + ManageJadwalUpdateRequest: + allOf: + - $ref: '#/components/schemas/ManageJadwalBaseRequest' + - type: object + required: [id] + properties: + act: + type: string + enum: [update] + id: + type: integer + ManageJadwalDeleteRequest: + type: object + required: [act, secret, id, nim] + properties: + act: + type: string + enum: [delete] + secret: + type: string + id: + type: integer + nim: + type: string diff --git a/steven/API/postBerkasSidangMahasiswa.php b/steven/API/postBerkasSidangMahasiswa.php new file mode 100644 index 0000000..bf0bafe --- /dev/null +++ b/steven/API/postBerkasSidangMahasiswa.php @@ -0,0 +1,111 @@ +connect(); + +header('Content-Type: application/json'); + +$loginMhs = requireSessionRole('mhs'); +$nim = isset($loginMhs['nim']) ? $loginMhs['nim'] : ''; +$idMhs = isset($loginMhs['id']) ? $loginMhs['id'] : 0; + +$idJadwal = isset($_GET['idJadwal']) ? (int) $_GET['idJadwal'] : 0; +if ($idJadwal <= 0) { + jsonResponse(['status' => false, 'msg' => 'Parameter idJadwal tidak valid'], 422); +} + +if (!isset($_POST['listKey'])) { + jsonResponse(['status' => false, 'msg' => 'Parameter listKey tidak lengkap'], 422); +} + +$listKey = json_decode($_POST['listKey'], true); +if (!is_array($listKey) || empty($listKey)) { + jsonResponse(['status' => false, 'msg' => 'Format listKey tidak valid'], 422); +} + +$sql = 'SELECT * FROM tbjadwal WHERE id = :idJadwal AND idMhs = :idMhs'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':idJadwal', $idJadwal); +$stmt->bindParam(':idMhs', $idMhs); +$stmt->execute(); + +if ($stmt->rowCount() === 0) { + jsonResponse(['status' => false, 'msg' => 'Forbidden'], 403); +} + +$namaFolder = 'dll'; + +while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $jenisSidang = strtolower($row['jenis']); + switch ($jenisSidang) { + case 'outline': $namaFolder = 'Seminar Outline'; break; + case 'sidhas': $namaFolder = 'Seminar Hasil'; break; + case 'sidang': $namaFolder = 'Sidang Akhir'; break; + } +} + +$urlAPIDrive = 'http://203.24.50.140/'; +$banyakSukses = 0; + +foreach ($listKey as $key => $val) { + if (isset($_FILES[$val])) { + $tmpfile = $_FILES[$val]['tmp_name']; + $filename = basename($_FILES[$val]['name']); + $typeFile = $_FILES[$val]['type']; + + $cFile = curl_file_create($tmpfile, $typeFile, $filename); + + $post = ['nim' => $nim, 'file_gdrive' => $cFile, 'folderMhs' => $namaFolder]; + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $urlAPIDrive); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_PORT, 8080); + curl_setopt($ch, CURLOPT_POSTFIELDS, $post); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + + $result = curl_exec($ch); + + curl_close($ch); + + $decodedResult = json_decode($result, true); + + if ($decodedResult['status'] == 1) { + $fileId = $decodedResult['fileId']; + + ++$banyakSukses; + $sql = 'SELECT * FROM tb_berkas_sidang WHERE idJadwal = :idJadwal AND nama = :nama'; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':idJadwal', $idJadwal); + $stmt->bindParam(':nama', $val); + $stmt->execute(); + + if ($stmt->rowCount() == 0) { + $sql = 'INSERT INTO tb_berkas_sidang(idJadwal, nama, driveId) VALUES(:idJadwal, :nama, :driveId)'; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':idJadwal', $idJadwal); + $stmt->bindParam(':nama', $val); + $stmt->bindParam(':driveId', $fileId); + $stmt->execute(); + } else { + $sql = 'UPDATE tb_berkas_sidang SET driveId = :driveId WHERE idJadwal = :idJadwal AND nama = :nama'; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':idJadwal', $idJadwal); + $stmt->bindParam(':nama', $val); + $stmt->bindParam(':driveId', $fileId); + $stmt->execute(); + } + } + } +} + +echo json_encode([ + 'status' => true, + 'msg' => $banyakSukses.' file berhasil diupload', +]); diff --git a/steven/API/postBerkasSidangMahasiswaNew.php b/steven/API/postBerkasSidangMahasiswaNew.php new file mode 100644 index 0000000..6da1f40 --- /dev/null +++ b/steven/API/postBerkasSidangMahasiswaNew.php @@ -0,0 +1,89 @@ +connect(); + +header('Content-Type: application/json'); + +$loginMhs = requireSessionRole('mhs'); +$nim = $loginMhs['nim']; + +$idRekapHasil = isset($_GET['idRekapHasil']) ? (int) $_GET['idRekapHasil'] : 0; +$jenis = isset($_GET['jenis']) ? trim((string) $_GET['jenis']) : ''; + +if ($idRekapHasil <= 0 || $jenis === '' || !isset($_POST['data'])) { + jsonResponse(['status' => false, 'msg' => 'Parameter tidak lengkap'], 422); +} + +$sql = 'SELECT * FROM tbrekaphasil WHERE id = :idRekapHasil AND nim = :nim'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':idRekapHasil', $idRekapHasil); +$stmt->bindParam(':nim', $nim); +$stmt->execute(); + +if ($stmt->rowCount() === 0) { + echo json_encode(['status' => false, 'msg' => 'Forbidden']); + exit; +} + +// $namaFolder = 'dll'; + +// while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { +// $jenisSidang = strtolower($row['jenis']); +// switch ($jenisSidang) { +// case 'outline': $namaFolder = 'Seminar Outline'; break; +// case 'sidhas': $namaFolder = 'Seminar Hasil'; break; +// case 'sidang': $namaFolder = 'Sidang Akhir'; break; +// } +// } + +$listData = json_decode($_POST['data'], true); +if (!is_array($listData)) { + jsonResponse(['status' => false, 'msg' => 'Format data tidak valid'], 422); +} + +$banyakSukses = 0; +foreach ($listData as $key => $val) { + if (!is_array($val) || empty($val['file']) || empty($val['nama'])) { + continue; + } + + $fileId = $val['file']; + $namaFile = $val['nama']; + + $sql = 'SELECT * FROM tb_berkas_sidang WHERE idRekapHasil = :idRekapHasil AND jenisSidang = :jenisSidang AND nama = :nama'; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':idRekapHasil', $idRekapHasil); + $stmt->bindParam(':jenisSidang', $jenis); + $stmt->bindParam(':nama', $namaFile); + $stmt->execute(); + + if ($stmt->rowCount() == 0) { + $sql = 'INSERT INTO tb_berkas_sidang(idRekapHasil, jenisSidang, nama, driveId) VALUES(:idRekapHasil, :jenisSidang, :nama, :driveId)'; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':idRekapHasil', $idRekapHasil); + $stmt->bindParam(':jenisSidang', $jenis); + $stmt->bindParam(':nama', $namaFile); + $stmt->bindParam(':driveId', $fileId); + $stmt->execute(); + } else { + $sql = 'UPDATE tb_berkas_sidang SET driveId = :driveId WHERE idRekapHasil = :idRekapHasil AND nama = :nama AND jenisSidang = :jenisSidang'; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':idRekapHasil', $idRekapHasil); + $stmt->bindParam(':jenisSidang', $jenis); + $stmt->bindParam(':nama', $namaFile); + $stmt->bindParam(':driveId', $fileId); + $stmt->execute(); + } + ++$banyakSukses; +} + +echo json_encode([ + 'status' => true, + 'msg' => $banyakSukses.' file berhasil diupload', +]); diff --git a/steven/API/sendMail.php b/steven/API/sendMail.php new file mode 100644 index 0000000..b049e03 --- /dev/null +++ b/steven/API/sendMail.php @@ -0,0 +1,185 @@ + 0, 'msg' => 'Parameter tidak lengkap'], 422); +} + +if (isset($_POST['from'])) { + $from = $_POST['from']; + $fromText = $from; +} else { + $from = 'system@spota.untan.ac.id'; + $fromText = 'SPOTA Informatika UNTAN'; +} + +try { + //Server settings + //$mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output + $mail->isSMTP(); // Send using SMTP + $mail->Host = (string) (getenv('SPOTA_SMTP_HOST') ?: 'smtp.gmail.com'); + $mail->SMTPAuth = true; + $mail->SMTPDebug = 0; + //$mail->SMTPSecure = 'tls'; // Enable SMTP authentication + //gmail + // $mail->Username = 'mail.informatika.untan@gmail.com'; // SMTP username + // $mail->Password = 'informatikauntan247mail'; // SMTP password + $mail->Username = (string) (getenv('SPOTA_SMTP_USERNAME') ?: 'tu1@informatika.untan.ac.id'); + $mail->Password = (string) (getenv('SPOTA_SMTP_PASSWORD') ?: 'IFuntanpnk-2020'); + + $mail->Port = (int) (getenv('SPOTA_SMTP_PORT') ?: 587); + + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged + + // $mail->SMTPOptions = [ + // 'ssl' => [ + // 'verify_peer' => false, + // 'verify_peer_name' => false, + // 'allow_self_signed' => true, + // ], + // ]; + //Recipients + $mail->setFrom($from, $fromText); + $toArr = json_decode($to, 1); + + if (!is_array($toArr) || empty($toArr)) { + jsonResponse(['status' => 0, 'msg' => 'Penerima email tidak valid'], 422); + } + + foreach ($toArr as $key => $val) { + $mail->addAddress(trim($val), $val); // Add a recipient + } + //$mail->addReplyTo('info@example.com', 'Information'); + //$mail->addCC('cc@example.com'); + //$mail->addBCC('bcc@example.com'); + + // Attachments + //$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments + //$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name + + // Content + $mail->isHTML(true); // Set email format to HTML + $mail->Subject = $judul; + $mail->Body = $content; + //$mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; + + if ($mail->send()) { + echo json_encode(['status' => 1, 'msg' => 'Message has been sent']); + } else { + echo json_encode(['status' => 0, 'msg' => 'Mailer Error: '.$mail->ErrorInfo]); + } + //; +} catch (Exception $e) { + echo json_encode(['status' => 0, 'msg' => "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"]); +} + +// try { +// //Server settings +// //$mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output +// $mail->isSMTP(); // Send using SMTP +// $mail->Host = 'smtp.gmail.com'; // Set the SMTP server to send through +// $mail->SMTPAuth = true; +// $mail->SMTPDebug = 4; +// //$mail->SMTPSecure = 'tls'; // Enable SMTP authentication +// //gmail +// $mail->Username = 'mail.informatika.untan@gmail.com'; // SMTP username +// $mail->Password = 'informatikauntan247mail'; // SMTP password +// $mail->Port = 587; // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` abov + +// $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged + +// // $mail->SMTPOptions = [ +// // 'ssl' => [ +// // 'verify_peer' => false, +// // 'verify_peer_name' => false, +// // 'allow_self_signed' => true, +// // ], +// // ]; +// //Recipients +// $mail->setFrom($from, $fromText); +// $toArr = json_decode($to, 1); + +// foreach ($toArr as $key => $val) { +// $mail->addAddress(trim($val), $val); // Add a recipient +// } +// //$mail->addReplyTo('info@example.com', 'Information'); +// //$mail->addCC('cc@example.com'); +// //$mail->addBCC('bcc@example.com'); + +// // Attachments +// //$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments +// //$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name + +// // Content +// $mail->isHTML(true); // Set email format to HTML +// $mail->Subject = $judul; +// $mail->Body = $content; +// //$mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; + +// if ($mail->send()) { +// echo 'Message has been sent'; +// } else { +// echo 'error message'; +// echo 'Mailer Error: '.$mail->ErrorInfo; +// } +// //; +// } catch (Exception $e) { +// echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; +// } diff --git a/steven/API/sendMail_manual.php b/steven/API/sendMail_manual.php new file mode 100644 index 0000000..376bab9 --- /dev/null +++ b/steven/API/sendMail_manual.php @@ -0,0 +1,105 @@ + 0, 'msg' => 'Parameter tidak lengkap'], 422); +} + +if(isset($_POST['from'])){ + $from = $_POST['from']; +}else{ + $from = "system@spota.untan.ac.id"; +} + +$toArr = json_decode($to, 1); +$emailTujuan = ''; + if (is_array($toArr) && sizeof($toArr) > 0) { + $emailTujuan = implode(', ', $toArr); + } else { + jsonResponse(['status' => 0, 'msg' => 'Penerima email tidak valid'], 422); + } + + $headers = 'MIME-Version: 1.0'."\r\n"; + $headers .= 'Content-type:text/html;charset=UTF-8'."\r\n"; + $headers .= "From: $from"; + +$result = mail($emailTujuan, $judul, $content, $headers); +echo json_encode([ + 'status' => $result ? 1 : 0, + 'msg' => $result ? 'Message has been sent' : 'Message could not be sent', +]); +// try { +// //Server settings +// //$mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output +// $mail->isSMTP(); // Send using SMTP +// $mail->Host = 'smtp.gmail.com'; // Set the SMTP server to send through +// $mail->SMTPAuth = true; // Enable SMTP authentication +// $mail->SMTPDebug = 4; +// //gmail +// $mail->Username = 'spota.ifuntan@gmail.com'; // SMTP username +// $mail->Password = 'Steven123!@#'; // SMTP password + +// $mail->Port = 587; // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` abov + +// $mail->SMTPOptions = array( +// 'ssl' => array( +// 'verify_peer' => false, +// 'verify_peer_name' => false, +// 'allow_self_signed' => true, +// ), +// ); + +// $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged + +// //Recipients +// $mail->setFrom('spota.ifuntan@gmail.com', 'SPOTA IF UNTAN'); +// $mail->addReplyTo('spota.ifuntan@gmail.com', 'SPOTA IF UNTAN'); + +// $toArr = json_decode($to, 1); +// if (sizeof($toArr) > 0) { +// for ($i = 0; $i < sizeof($toArr); ++$i) { +// if ($i === 0) { +// $mail->addAddress($toArr[$i], ''); // Add a recipient +// } else { +// $mail->addCC($toArr[$i]); +// } +// } +// } else { +// exit(); +// } +// //$mail->addCC('cc@example.com'); +// //$mail->addBCC('bcc@example.com'); + +// // Attachments +// //$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments +// //$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name + +// // Content +// $mail->isHTML(true); // Set email format to HTML +// $mail->Subject = $judul; +// $mail->Body = $content; +// //$mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; + +// $mail->send(); +// //echo 'Message has been sent'; +// } catch (Exception $e) { +// //echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; +// } diff --git a/steven/API/verifBerkasAdmin.php b/steven/API/verifBerkasAdmin.php new file mode 100644 index 0000000..6b3c45c --- /dev/null +++ b/steven/API/verifBerkasAdmin.php @@ -0,0 +1,66 @@ +connect(); + +header('Content-Type: application/json'); + +$loginAdmin = requireSessionRole('admin'); + +$idRekapHasil = isset($_POST['idRekap']) ? (int) $_POST['idRekap'] : 0; +$jenis = isset($_POST['jenis']) ? trim((string) $_POST['jenis']) : ''; +$catatan = isset($_POST['catatan']) ? (string) $_POST['catatan'] : ''; +$listData = isset($_POST['dataVerif']) ? json_decode($_POST['dataVerif'], true) : null; + +if ($idRekapHasil <= 0 || $jenis === '' || !is_array($listData)) { + jsonResponse(['status' => false, 'msg' => 'Parameter tidak lengkap'], 422); +} + +$sql = 'SELECT id FROM tb_verif_berkas WHERE idRekapHasil = :idRekapHasil AND jenisSidang = :jenis'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':idRekapHasil', $idRekapHasil); +$stmt->bindParam(':jenis', $jenis); +$stmt->execute(); + +if ($stmt->rowCount() === 0) { + $sql = 'INSERT INTO tb_verif_berkas(idRekapHasil, jenisSidang, catatanDariAdmin, verifPemb1, verifPemb2, verifPeng1, verifPeng2) VALUES(:idRekapHasil, :jenis, :catatan, 0, 0, 0, 0)'; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':idRekapHasil', $idRekapHasil); + $stmt->bindParam(':jenis', $jenis); + $stmt->bindParam(':catatan', $catatan); + $stmt->execute(); +} + +$sql = 'UPDATE tb_verif_berkas SET catatanDariAdmin = :catatan WHERE idRekapHasil = :idRekapHasil AND jenisSidang = :jenis'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':catatan', $catatan); +$stmt->bindParam(':idRekapHasil', $idRekapHasil); +$stmt->bindParam(':jenis', $jenis); +$stmt->execute(); + +foreach ($listData as $key => $val) { + if (!is_array($val) || !isset($val['id']) || !isset($val['verif'])) { + continue; + } + + $id = $val['id']; + $verif = $val['verif']; + + $sql = 'UPDATE tb_berkas_sidang SET status = :status WHERE idBerkas = :id AND idRekapHasil = :idRekapHasil AND jenisSidang = :jenis'; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':status', $verif); + $stmt->bindParam(':id', $id); + $stmt->bindParam(':idRekapHasil', $idRekapHasil); + $stmt->bindParam(':jenis', $jenis); + $stmt->execute(); +} + +echo json_encode([ + 'status' => true, + 'msg' => 'Verifikasi berhasil', +]); diff --git a/steven/API/verifBerkasDosen.php b/steven/API/verifBerkasDosen.php new file mode 100644 index 0000000..7292b5d --- /dev/null +++ b/steven/API/verifBerkasDosen.php @@ -0,0 +1,72 @@ +connect(); + +header('Content-Type: application/json'); + +$loginDosen = requireSessionRole('dosen'); + +$idRekapHasil = isset($_POST['idRekap']) ? (int) $_POST['idRekap'] : 0; +$jenis = isset($_POST['jenis']) ? trim((string) $_POST['jenis']) : ''; +$verif = isset($_POST['verif']) ? (int) $_POST['verif'] : 0; +$sebagai = isset($_POST['sebagai']) ? trim((string) $_POST['sebagai']) : ''; + +if ($idRekapHasil <= 0 || $jenis === '' || $sebagai === '') { + jsonResponse(['status' => false, 'msg' => 'Parameter tidak lengkap'], 422); +} + +$sql = 'SELECT pemb1, pemb2, peng1, peng2 FROM tbrekaphasil WHERE id = :idRekapHasil'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':idRekapHasil', $idRekapHasil); +$stmt->execute(); +$rekap = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$rekap) { + jsonResponse(['status' => false, 'msg' => 'Data Not Found'], 404); +} + +$dosenNip = isset($loginDosen['nip']) ? (string) $loginDosen['nip'] : ''; + +switch ($sebagai) { + case 'pemb1': $fieldName = 'verifPemb1'; $expectedNip = (string) $rekap['pemb1']; break; + case 'pemb2': $fieldName = 'verifPemb2'; $expectedNip = (string) $rekap['pemb2']; break; + case 'peng1': $fieldName = 'verifPeng1'; $expectedNip = (string) $rekap['peng1']; break; + case 'peng2': $fieldName = 'verifPeng2'; $expectedNip = (string) $rekap['peng2']; break; + default: jsonResponse(['status' => false, 'msg' => 'Status Dosen Tidak Dikenali'], 422); +} + +if ($expectedNip === '' || $expectedNip !== $dosenNip) { + jsonResponse(['status' => false, 'msg' => 'Forbidden'], 403); +} + +$sql = 'SELECT id FROM tb_verif_berkas WHERE idRekapHasil = :idRekapHasil AND jenisSidang = :jenis'; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':idRekapHasil', $idRekapHasil); +$stmt->bindParam(':jenis', $jenis); +$stmt->execute(); + +if ($stmt->rowCount() === 0) { + $sql = 'INSERT INTO tb_verif_berkas(idRekapHasil, jenisSidang, catatanDariAdmin, verifPemb1, verifPemb2, verifPeng1, verifPeng2) VALUES(:idRekapHasil, :jenis, "", 0, 0, 0, 0)'; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':idRekapHasil', $idRekapHasil); + $stmt->bindParam(':jenis', $jenis); + $stmt->execute(); +} + +$sql = "UPDATE tb_verif_berkas SET {$fieldName} = :verif WHERE idRekapHasil = :idRekapHasil AND jenisSidang = :jenis"; +$stmt = $dbh->prepare($sql); +$stmt->bindParam(':verif', $verif); +$stmt->bindParam(':idRekapHasil', $idRekapHasil); +$stmt->bindParam(':jenis', $jenis); +$stmt->execute(); + +echo json_encode([ + 'status' => true, + 'msg' => 'Verifikasi berhasil', +]); diff --git a/steven/API/willy_manageJadwal.php b/steven/API/willy_manageJadwal.php new file mode 100644 index 0000000..b4549b8 --- /dev/null +++ b/steven/API/willy_manageJadwal.php @@ -0,0 +1,390 @@ +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); +} diff --git a/steven/API/willy_updateDataRekapHasil.php b/steven/API/willy_updateDataRekapHasil.php new file mode 100644 index 0000000..7846361 --- /dev/null +++ b/steven/API/willy_updateDataRekapHasil.php @@ -0,0 +1,78 @@ +connect(); +$jsonData = getRequestJson(); + +requireRobotSecret(); + +$act = isset($jsonData['act']) ? $jsonData['act'] : ''; + +// if($jsonData['nim'] != "D03111037"){ +// echo json_encode([ +// 'status' => false, +// 'msg' => "NIM yang diinjikan hanya D03111037", +// ]); +// exit; +// } + +switch($act){ + case 'update' : + if(!(empty($jsonData['id']) || empty($jsonData['judul']))){ + $id = $jsonData['id']; + $judul = $jsonData['judul']; + + $sql = "UPDATE tbrekaphasil SET judul_final = :judul WHERE id = :id"; + $stmt = $dbh->prepare($sql); + $stmt->bindParam(':id', $id); + $stmt->bindParam(':judul', $judul); + $stmt->execute(); + + $error = $stmt->errorInfo(); + + $isError = true; + + if ($error[0] == '00000') { + $isError = false; + } + + if ($isError) { + echo json_encode( + [ + 'status' => false, + 'msg' => 'Terjadi kesalahan teknis!!!', + ] + ); + } else { + echo json_encode( + [ + 'status' => true, + 'msg' => 'Berhasil mengubah data!!!', + ] + ); + } + + }else{ + echo json_encode([ + 'status' => false, + 'msg' => "Parameter tidak lengkap", + ]); + exit; + } + break; + default : + echo json_encode([ + 'status' => false, + 'msg' => "Parameter tidak lengkap", + ]); + exit; +} diff --git a/steven/conf/class.server.php b/steven/conf/class.server.php new file mode 100644 index 0000000..4b5ee91 --- /dev/null +++ b/steven/conf/class.server.php @@ -0,0 +1,49 @@ +host = $appUrl; + $this->secretKeyRobot = (string) (getenv('SPOTA_LEGACY_API_SECRET') ?: 'in14d4lahP4ssWordSP0TA!12!'); + } + + public function getSecretKeyRobot() + { + return $this->secretKeyRobot; + } + + public function getAPIUrl() + { + return $this->host.'/API/web'; + } + + public function getHostUrl() + { + return $this->host; + } + + public function getLoginPage() + { + return $this->host; + } + + public function getDataTableURL() + { + return $this->host.'/API/datatable'; + } + + public function getPrintUrl() + { + return $this->host.'/print'; + } + + public function getBerkasUrl() + { + return $this->host.'/berkas'; + } +} diff --git a/steven/conf/function.php b/steven/conf/function.php new file mode 100644 index 0000000..528b31e --- /dev/null +++ b/steven/conf/function.php @@ -0,0 +1,345 @@ + 0, 'message' => $msg)); + exit(); + } +} + +function getHari($date) +{ + $timestamp = strtotime($date); + $day = date('D', $timestamp); + $hari = '-'; + switch ($day) { + case 0: $hari = 'Minggu'; break; + case 1: $hari = 'Senin'; break; + case 2: $hari = 'Selasa'; break; + case 3: $hari = 'Rabu'; break; + case 4: $hari = 'Kamis'; break; + case 5: $hari = 'Jumat'; break; + case 6: $hari = 'Sabtu'; break; + } + + return $hari; +} + +function convertHaritoInt($hari) +{ + $intHari = 0; + switch ($hari) { + case 'Senin': $intHari = 1; break; + case 'Selasa': $intHari = 2; break; + case 'Rabu': $intHari = 3; break; + case 'Kamis': $intHari = 4; break; + case 'Jumat': $intHari = 5; break; + case 'Sabtu': $intHari = 6; break; + case 'Minggu': $intHari = 0; break; + } + + return $intHari; +} + +function createToken($id) +{ + $x = base64_encode($id); + $time = base64_encode(time()); + //php7 keatas + $token = $x.bin2hex(random_bytes(64)).$time; + + //dibawah php 7 + //$token = $x.bin2hex(openssl_random_pseudo_bytes(64)).$time; + + return $token; +} + +function getUnauthorizedMessage() +{ + return json_encode( + array( + 'status' => '0', + 'msg' => 'Unauthorized', + ) + ); +} + +function jsonResponse($payload, $statusCode = 200) +{ + http_response_code($statusCode); + echo json_encode($payload); + exit(); +} + +function getRequestJson() +{ + static $decoded = null; + static $loaded = false; + + if ($loaded) { + return $decoded; + } + + $loaded = true; + $raw = file_get_contents('php://input'); + if ($raw === false || trim($raw) === '') { + $decoded = []; + + return $decoded; + } + + $decoded = json_decode($raw, true); + if (!is_array($decoded)) { + $decoded = []; + } + + return $decoded; +} + +function getRequestValue($key, $default = null) +{ + if (isset($_POST[$key])) { + return $_POST[$key]; + } + + if (isset($_GET[$key])) { + return $_GET[$key]; + } + + $json = getRequestJson(); + + if (isset($json[$key])) { + return $json[$key]; + } + + return $default; +} + +function requireRobotSecret() +{ + $server = new Server(); + $expectedSecret = $server->getSecretKeyRobot(); + $providedSecret = getRequestValue('secret'); + + if ($providedSecret === null || $providedSecret === '') { + $headerKey = isset($_SERVER['HTTP_X_API_KEY']) ? trim((string) $_SERVER['HTTP_X_API_KEY']) : ''; + if ($headerKey !== '') { + $providedSecret = $headerKey; + } + } + + if (!is_string($providedSecret) || trim($providedSecret) !== $expectedSecret) { + jsonResponse([ + 'status' => 0, + 'msg' => 'Unauthorized', + ], 401); + } +} + +function requireSessionRole($role) +{ + if (session_status() !== PHP_SESSION_ACTIVE) { + session_start(); + } + + $key = 'login-'.$role; + if (!isset($_SESSION[$key]) || !is_array($_SESSION[$key])) { + jsonResponse([ + 'status' => false, + 'msg' => 'Forbidden', + ], 403); + } + + return $_SESSION[$key]; +} + +function getDataNotFoundMessage() +{ + return json_encode( + array( + 'status' => '0', + 'msg' => 'Data Not Found', + ) + ); +} + +function getDataEmptyMessage() +{ + return json_encode( + array( + 'status' => '0', + 'msg' => 'Data cannot be empty', + ) + ); +} + +function getHariText($hari) +{ + $hariText = '-'; + switch ($hari) { + case '0': $hariText = 'Minggu'; break; + case '1': $hariText = 'Senin'; break; + case '2': $hariText = 'Selasa'; break; + case '3': $hariText = 'Rabu'; break; + case '4': $hariText = 'Kamis'; break; + case '5': $hariText = 'Jumat'; break; + case '6': $hariText = 'Sabtu'; break; + } + + return $hariText; +} + +function cwUpload($field_name = '', $target_folder = '', $file_name = '', $thumb = false, $thumb_folder = '', $thumb_width = '', $thumb_height = '') +{ + //folder path setup + $target_path = $target_folder; + $thumb_path = $thumb_folder; + + //file name setup + $filename_err = explode('.', $_FILES[$field_name]['name']); + $filename_err_count = count($filename_err); + $file_ext = $filename_err[$filename_err_count - 1]; + if ($file_name != '') { + $fileName = $file_name.'.'.$file_ext; + } else { + $fileName = $_FILES[$field_name]['name']; + } + + //upload image path + $upload_image = $target_path.basename($fileName); + + //upload image + if (move_uploaded_file($_FILES[$field_name]['tmp_name'], $upload_image)) { + //thumbnail creation + if ($thumb == true) { + $thumbnail = $thumb_path.$fileName; + list($width, $height) = getimagesize($upload_image); + $thumb_create = imagecreatetruecolor($thumb_width, $thumb_height); + switch ($file_ext) { + case 'jpg': + $source = imagecreatefromjpeg($upload_image); + break; + case 'jpeg': + $source = imagecreatefromjpeg($upload_image); + break; + + case 'png': + $source = imagecreatefrompng($upload_image); + break; + case 'gif': + $source = imagecreatefromgif($upload_image); + break; + default: + $source = imagecreatefromjpeg($upload_image); + } + + imagecopyresized($thumb_create, $source, 0, 0, 0, 0, $thumb_width, $thumb_height, $width, $height); + switch ($file_ext) { + case 'jpg' || 'jpeg': + imagejpeg($thumb_create, $thumbnail, 100); + break; + case 'png': + imagepng($thumb_create, $thumbnail, 100); + break; + + case 'gif': + imagegif($thumb_create, $thumbnail, 100); + break; + default: + imagejpeg($thumb_create, $thumbnail, 100); + } + } + + return $fileName; + } else { + return false; + } +} + +function getPeriode($waktu, $before = false) +{ + $interval = 5 * 60; //10 menit + $timeStart = strtotime(date('d-m-Y 00:00:00')); + $timeEnd = strtotime(date('d-m-Y 23:59:59')); + + $inTime = true; + $i = 1; + $periode = ''; + $periodeBefore = ''; + while ($inTime) { + $time = $timeStart + ($i * $interval); + $timeBefore = $time - $interval; + $timeNext = $time + $interval; + + if (($waktu >= $time) && ($waktu < $timeNext)) { + $periode = date('H:i:s', $time).' - '.date('H:i:s', $timeNext); + $periodeBefore = date('H:i:s', $timeBefore).' - '.date('H:i:s', $time); + + $inTime = false; + } + + //stop looing kalau belum jam start + if ($time < $timeStart) { + $inTime = false; + } + + //stop looping kalau udh lewat + if ($time > $timeEnd) { + $inTime = false; + } + //echo $time.'
'; + //array_push($arrTime,$time); + ++$i; + } + if ($before) { + return array( + 'now' => $periode, + 'before' => $periodeBefore, + ); + } else { + return $periode; + } +} + +function utf8ize($d) +{ + if (is_array($d)) { + foreach ($d as $k => $v) { + $d[$k] = utf8ize($v); + } + } elseif (is_string($d)) { + return utf8_encode($d); + } + + return $d; +}