From a76652a485e7c7635fbfe3e5caa1fac765f3a0f7 Mon Sep 17 00:00:00 2001 From: ericko-cyber Date: Mon, 7 Jul 2025 13:23:49 +0700 Subject: [PATCH] up up --- app/Controllers/Admin/Siswa.php | 143 +++++++++++++----- app/Controllers/Admin/Tahun.php | 116 +++++++++----- app/Views/admin/siswa/edit.php | 59 ++++++-- app/Views/admin/tahun/tambah.php | 48 ++---- .../staff_keuangan/input_tagihan/index.php | 4 +- assets/template/template-siswa.xlsx | Bin 6401 -> 8567 bytes .../file/1751868964_fbee9982b9a1b785f9a6.xlsx | Bin 0 -> 9282 bytes .../file/1751869344_c4e1c9165e33b9457c7b.xlsx | Bin 0 -> 9282 bytes 8 files changed, 251 insertions(+), 119 deletions(-) create mode 100644 assets/upload/file/1751868964_fbee9982b9a1b785f9a6.xlsx create mode 100644 assets/upload/file/1751869344_c4e1c9165e33b9457c7b.xlsx diff --git a/app/Controllers/Admin/Siswa.php b/app/Controllers/Admin/Siswa.php index 7b22ab0..9c925d5 100644 --- a/app/Controllers/Admin/Siswa.php +++ b/app/Controllers/Admin/Siswa.php @@ -156,67 +156,107 @@ class Siswa extends BaseController } } - // Fungsi untuk edit data siswa public function edit($id_siswa) { $m_siswa = new Siswa_model(); $siswa = $m_siswa->detail($id_siswa); - if ($this->request->getMethod() === 'post' && $this->validate([ + $rules = [ 'nama_siswa' => 'required', + 'nis' => 'required', + 'jenis_kelamin' => 'required', + 'kategori' => 'required', + 'status_siswa' => 'required', + 'id_tahun' => 'required', + 'id_kelas' => 'required', + 'telepon' => 'required', + 'email' => 'required|valid_email', + + // Validasi gambar 'gambar' => [ + 'permit_empty', 'ext_in[gambar,jpg,jpeg,gif,png,svg]', 'max_size[gambar,4096]', ], - ])) { - // Penanganan unggah gambar (update) + + // Validasi ortu dan wali sebagai input opsional + 'nama_ayah' => 'permit_empty', + 'telepon_ayah' => 'permit_empty', + 'nama_ibu' => 'permit_empty', + 'telepon_ibu' => 'permit_empty', + 'nama_wali' => 'permit_empty', + 'telepon_wali' => 'permit_empty', + ]; + + $messages = [ + 'required' => '{field} wajib diisi.', + 'valid_email' => 'Format email tidak valid.', + 'ext_in' => 'Format gambar tidak didukung (hanya jpg, jpeg, png, gif, svg).', + 'max_size' => 'Ukuran gambar maksimal 4MB.', + ]; + + if ($this->request->getMethod() === 'post' && $this->validate($rules, $messages)) { + // Ambil data input + $nama_ayah = $this->request->getPost('nama_ayah'); + $telepon_ayah = $this->request->getPost('telepon_ayah'); + $nama_ibu = $this->request->getPost('nama_ibu'); + $telepon_ibu = $this->request->getPost('telepon_ibu'); + $nama_wali = $this->request->getPost('nama_wali'); + $telepon_wali = $this->request->getPost('telepon_wali'); + + // Validasi logika ortu/wali + if (empty($nama_ayah) && empty($nama_ibu) && empty($nama_wali)) { + session()->setFlashdata('error', 'Jika nama ayah dan ibu kosong, maka nama wali wajib diisi.'); + return redirect()->back()->withInput(); + } + + if (empty($telepon_ayah) && empty($telepon_ibu) && empty($telepon_wali)) { + session()->setFlashdata('error', 'Jika telepon ayah dan ibu kosong, maka telepon wali wajib diisi.'); + return redirect()->back()->withInput(); + } + + // Penanganan unggah gambar $gambar = $this->request->getFile('gambar'); if ($gambar && $gambar->isValid() && !$gambar->hasMoved()) { $namabaru = $gambar->getRandomName(); - $gambar->move(WRITEPATH . 'uploads', $namabaru); // Simpan file di folder "uploads" + $gambar->move(WRITEPATH . 'uploads', $namabaru); } else { - // Jika tidak ada gambar baru yang diunggah, gunakan gambar lama - $namabaru = $siswa->gambar; // Ambil gambar lama jika tidak ada gambar baru + $namabaru = $siswa->gambar; } - // Membuat slug otomatis jika slug kosong - $slug_siswa = $siswa->slug_siswa; - if (empty($slug_siswa)) { - $slug_siswa = $this->createSlug($this->request->getPost('nama_siswa')); // Jika slug kosong, buat slug - } + // Slug otomatis + $slug_siswa = $siswa->slug_siswa ?: $this->createSlug($this->request->getPost('nama_siswa')); - // Menangkap data jenis pembiayaan - $jenis_pembiayaan = $this->request->getPost('jenis_pembiayaan'); - - // Menyimpan perubahan data + // Data yang akan disimpan $data = [ 'nama_siswa' => $this->request->getPost('nama_siswa'), - 'slug_siswa' => $slug_siswa, // Masukkan slug_siswa + 'slug_siswa' => $slug_siswa, 'nis' => $this->request->getPost('nis'), 'jenis_kelamin' => $this->request->getPost('jenis_kelamin'), 'telepon' => $this->request->getPost('telepon'), 'email' => $this->request->getPost('email'), - 'gambar' => $namabaru, // Simpan nama gambar + 'gambar' => $namabaru, 'status_siswa' => $this->request->getPost('status_siswa'), 'id_tahun' => $this->request->getPost('id_tahun'), 'id_kelas' => $this->request->getPost('id_kelas'), - 'nama_ayah' => $this->request->getPost('nama_ayah'), - 'telepon_ayah' => $this->request->getPost('telepon_ayah'), - 'nama_ibu' => $this->request->getPost('nama_ibu'), - 'telepon_ibu' => $this->request->getPost('telepon_ibu'), - 'kategori' => $jenis_pembiayaan, // Menyimpan jenis pembiayaan + 'nama_ayah' => $nama_ayah, + 'telepon_ayah' => $telepon_ayah, + 'nama_ibu' => $nama_ibu, + 'telepon_ibu' => $telepon_ibu, + 'nama_wali' => $nama_wali, + 'telepon_wali' => $telepon_wali, + 'kategori' => $this->request->getPost('kategori'), ]; - // Menyimpan data ke database if ($m_siswa->update($id_siswa, $data)) { - $this->session->setFlashdata('sukses', 'Data telah disimpan'); + session()->setFlashdata('sukses', 'Data siswa berhasil diperbarui.'); } else { - $this->session->setFlashdata('error', 'Terjadi kesalahan, data tidak bisa disimpan'); + session()->setFlashdata('error', 'Terjadi kesalahan saat menyimpan data.'); } return redirect()->to(base_url('admin/siswa')); } else { - // Kirim data ke view untuk menampilkan form edit dengan data yang sudah ada + // Jika validasi gagal atau belum disubmit $data = [ 'title' => 'Edit Siswa: ' . $siswa->nama_siswa, 'siswa' => $siswa, @@ -232,7 +272,6 @@ class Siswa extends BaseController $m_kelas = new Kelas_model(); $m_tahun = new Tahun_model(); - $kelas = $m_kelas->listing(); $tahun = $m_tahun->listing(); @@ -255,12 +294,11 @@ class Siswa extends BaseController $filepath = WRITEPATH . '../assets/upload/file/' . $filename; $ext = $file->getClientExtension(); - // Pilih reader berdasarkan ekstensi file if ($ext == 'csv') { $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Csv'); } elseif ($ext == 'xls') { $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xls'); - } else { // xlsx + } else { $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); } @@ -269,6 +307,7 @@ class Siswa extends BaseController $worksheet = $spreadsheet->getActiveSheet(); $i = 1; + $errors = []; foreach ($worksheet->getRowIterator() as $row) { $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(false); @@ -278,8 +317,32 @@ class Siswa extends BaseController $cells[] = $cell->getValue(); } - if ($i > 1) { // Lewati header - if (empty($cells[1])) { + if ($i > 1) { + if (empty($cells[1])) { // Lewati jika NIS kosong + $i++; + continue; + } + + // Ambil data ortu/wali + $nama_ayah = $cells[7]; + $nama_ibu = $cells[8]; + $nama_wali = $cells[9]; + $telepon_wali = $cells[10]; + $telepon_ayah = $cells[11]; + $telepon_ibu = $cells[12]; + + // Validasi jika nama ayah & ibu kosong, maka nama wali wajib + if (empty($nama_ayah) && empty($nama_ibu) && empty($nama_wali)) { + $errors[] = "Baris ke-$i: Nama wali wajib diisi jika nama ayah dan ibu kosong."; + } + + // Validasi jika telepon ayah & ibu kosong, maka telepon wali wajib + if (empty($telepon_ayah) && empty($telepon_ibu) && empty($telepon_wali)) { + $errors[] = "Baris ke-$i: Telepon wali wajib diisi jika telepon ayah dan ibu kosong."; + } + + // Skip insert jika ada error + if (!empty($errors)) { $i++; continue; } @@ -298,10 +361,12 @@ class Siswa extends BaseController 'password_hint' => null, 'jenis_kelamin' => $cells[5], 'isi' => $cells[6], - 'nama_ayah' => $cells[7], - 'nama_ibu' => $cells[8], - 'telepon_ayah' => $cells[9], - 'telepon_ibu' => $cells[10], + 'nama_ayah' => $nama_ayah, + 'nama_ibu' => $nama_ibu, + 'nama_wali' => $nama_wali, + 'telepon_wali' => $telepon_wali, + 'telepon_ayah' => $telepon_ayah, + 'telepon_ibu' => $telepon_ibu, 'kelompok' => null, 'gambar' => null, 'status_siswa' => 'Aktif', @@ -315,6 +380,11 @@ class Siswa extends BaseController $i++; } + if (!empty($errors)) { + $this->session->setFlashdata('error', implode('
', $errors)); + return redirect()->back()->withInput(); + } + $this->session->setFlashdata('sukses', 'Data siswa berhasil diimpor.'); return redirect()->to(base_url('admin/siswa')); } else { @@ -328,6 +398,7 @@ class Siswa extends BaseController } } + public function proses() { $m_siswa = new Siswa_model(); diff --git a/app/Controllers/Admin/Tahun.php b/app/Controllers/Admin/Tahun.php index 1844e51..e013e08 100644 --- a/app/Controllers/Admin/Tahun.php +++ b/app/Controllers/Admin/Tahun.php @@ -1,4 +1,5 @@ -listing(); $total = $m_tahun->total(); // Start validasi - if($this->request->getMethod() === 'post' && $this->validate( + if ($this->request->getMethod() === 'post' && $this->validate( [ 'nama_tahun' => 'required|min_length[1]|is_unique[tahun.nama_tahun]', - ])) { + ] + )) { // masuk database - $data = [ 'id_user' => $this->session->get('id_user'), - 'nama_tahun' => $this->request->getPost('nama_tahun'), - 'tahun_mulai' => $this->request->getPost('tahun_mulai'), - 'tahun_selesai' => $this->request->getPost('tahun_selesai'), - 'keterangan' => $this->request->getPost('keterangan') - ]; + $data = [ + 'id_user' => $this->session->get('id_user'), + 'nama_tahun' => $this->request->getPost('nama_tahun'), + 'tahun_mulai' => $this->request->getPost('tahun_mulai'), + 'tahun_selesai' => $this->request->getPost('tahun_selesai'), + 'keterangan' => $this->request->getPost('keterangan') + ]; $m_tahun->tambah($data); // masuk database - $this->session->setFlashdata('sukses','Data telah ditambah'); + $this->session->setFlashdata('sukses', 'Data telah ditambah'); return redirect()->to(base_url('admin/tahun')); - }else{ - $data = [ 'title' => 'Master Tahun Ajaran: '.$total->total, - 'tahun' => $tahun, - 'content' => 'admin/tahun/index' - ]; - echo view('admin/layout/wrapper',$data); + } else { + $data = [ + 'title' => 'Master Tahun Ajaran: ' . $total->total, + 'tahun' => $tahun, + 'content' => 'admin/tahun/index' + ]; + echo view('admin/layout/wrapper', $data); } } // edit public function edit($id_tahun) { - + $m_tahun = new Tahun_model(); $tahun = $m_tahun->detail($id_tahun); // Start validasi - if($this->request->getMethod() === 'post' && $this->validate( + if ($this->request->getMethod() === 'post' && $this->validate( [ - 'nama_tahun' => 'required|min_length[1]', - ])) { - - $data = [ 'id_tahun' => $id_tahun, - 'id_user' => $this->session->get('id_user'), - 'nama_tahun' => $this->request->getPost('nama_tahun'), - 'tahun_mulai' => $this->request->getPost('tahun_mulai'), - 'tahun_selesai' => $this->request->getPost('tahun_selesai'), - 'keterangan' => $this->request->getPost('keterangan') - ]; + 'nama_tahun' => 'required|min_length[1]', + ] + )) { + + $data = [ + 'id_tahun' => $id_tahun, + 'id_user' => $this->session->get('id_user'), + 'nama_tahun' => $this->request->getPost('nama_tahun'), + 'tahun_mulai' => $this->request->getPost('tahun_mulai'), + 'tahun_selesai' => $this->request->getPost('tahun_selesai'), + 'keterangan' => $this->request->getPost('keterangan') + ]; $m_tahun->edit($data); // masuk database - $this->session->setFlashdata('sukses','Data telah diedit'); + $this->session->setFlashdata('sukses', 'Data telah diedit'); return redirect()->to(base_url('admin/tahun')); - }else{ - $data = [ 'title' => 'Edit Tahun Ajaran: '.$tahun->nama_tahun, - 'tahun' => $tahun, - 'content' => 'admin/tahun/edit' - ]; - echo view('admin/layout/wrapper',$data); + } else { + $data = [ + 'title' => 'Edit Tahun Ajaran: ' . $tahun->nama_tahun, + 'tahun' => $tahun, + 'content' => 'admin/tahun/edit' + ]; + echo view('admin/layout/wrapper', $data); } } + public function tambah() + { + $m_tahun = new \App\Models\Tahun_model(); + + // Validasi input + if ($this->request->getMethod() === 'post' && $this->validate([ + 'nama_tahun' => 'required|min_length[1]|is_unique[tahun.nama_tahun]', + 'tahun_mulai' => 'required|numeric', + 'tahun_selesai' => 'required|numeric', + ])) { + // Data yang disimpan ke database + $data = [ + 'id_user' => $this->session->get('id_user'), + 'nama_tahun' => $this->request->getPost('nama_tahun'), + 'tahun_mulai' => $this->request->getPost('tahun_mulai'), + 'tahun_selesai' => $this->request->getPost('tahun_selesai'), + 'keterangan' => $this->request->getPost('keterangan'), + 'tanggal_update' => date('Y-m-d H:i:s') + ]; + + $m_tahun->tambah($data); + + $this->session->setFlashdata('sukses', 'Data tahun ajaran berhasil ditambahkan'); + return redirect()->to(base_url('admin/tahun/index')); + } else { + // Validasi gagal + return redirect()->back()->withInput()->with('errors', $this->validator->getErrors()); + } + } + + // delete public function delete($id_tahun) { - + $m_tahun = new Tahun_model(); $data = ['id_tahun' => $id_tahun]; $m_tahun->delete($data); // masuk database - $this->session->setFlashdata('sukses','Data telah dihapus'); + $this->session->setFlashdata('sukses', 'Data telah dihapus'); return redirect()->to(base_url('admin/tahun')); } -} \ No newline at end of file +} diff --git a/app/Views/admin/siswa/edit.php b/app/Views/admin/siswa/edit.php index da75a7b..8fbfe16 100644 --- a/app/Views/admin/siswa/edit.php +++ b/app/Views/admin/siswa/edit.php @@ -1,4 +1,5 @@ -id_siswa)); -echo csrf_field(); +echo form_open_multipart(base_url('admin/siswa/edit/' . $siswa->id_siswa)); +echo csrf_field(); ?>

@@ -31,10 +32,10 @@ echo csrf_field();

FOTO SISWA

- gambar == '') { ?> + gambar == '') { ?>
Belum Ada foto
- Foto Siswa + Foto Siswa
@@ -79,6 +80,23 @@ echo csrf_field(); + +
+ +
+
+ kategori ?? '') == 'biasa') ? 'checked' : '' ?> required> + +
+
+ kategori ?? '') == 'beasiswa') ? 'checked' : '' ?> required> + +
+
+
+
@@ -127,7 +145,7 @@ echo csrf_field();
- listing() as $kelas) { ?> + listing() as $kelas) { ?> @@ -172,7 +190,7 @@ echo csrf_field();
- +
@@ -194,7 +212,28 @@ echo csrf_field();
- + +
+
+
+ + +
+
+

DATA ORANG TUA SISWA - WALI

+
+
+
+ +
+ +
+
+ +
+ +
+
@@ -204,4 +243,4 @@ echo csrf_field();
- + \ No newline at end of file diff --git a/app/Views/admin/tahun/tambah.php b/app/Views/admin/tahun/tambah.php index faf4fb6..5170350 100644 --- a/app/Views/admin/tahun/tambah.php +++ b/app/Views/admin/tahun/tambah.php @@ -3,59 +3,42 @@ Tambah Baru

- + + + + +