load->model('pelanggaran_santri_model'); $this->load->library('notif'); // load library Notif is_logged_in(); } public function index() { $data['title'] = 'Pelanggaran Santri'; $data['pelanggaransantri'] = $this->pelanggaran_santri_model->get_data('tb_pelanggaran_santri')->result(); $data['admin'] = $this->db->get_where('admin', ['email' => $this->session->userdata('email')])->row_array(); $this->load->view('templates/header', $data); $this->load->view('templates/sidebar', $data); $this->load->view('admin/pelanggaran_santri'); $this->load->view('templates/footer'); } public function tambah() { $data['title'] = 'Tambah Pelanggaran Santri'; $data['pelanggaransantri'] = $this->pelanggaran_santri_model->get_data('tb_pelanggaran_santri')->result(); $data['admin'] = $this->db->get_where('admin', ['email' => $this->session->userdata('email')])->row_array(); $this->load->view('templates/header', $data); $this->load->view('templates/sidebar', $data); $this->load->view('admin/tambah_pelanggaran_santri', $data); $this->load->view('templates/footer'); } public function print() { // Ambil input dari form $start_input = $this->input->get('start_date'); $end_input = $this->input->get('end_date'); // Ubah format dari dd/mm/yyyy ke Y-m-d if (!empty($start_input) && !empty($end_input)) { $start = date('Y-m-d', strtotime(str_replace('/', '-', $start_input))); $end = date('Y-m-d', strtotime(str_replace('/', '-', $end_input))); // Filter berdasarkan tanggal $data['pelanggaransantri'] = $this->pelanggaran_santri_model->get_filtered_data($start, $end); } else { // Ambil semua data jika tidak ada filter $data['pelanggaransantri'] = $this->db->get('tb_pelanggaran_santri')->result(); } $this->load->view('admin/print_pelanggaran_santri', $data); } public function pdf() { $options = new Options(); $options->set('isHtml5ParserEnabled', true); $dompdf = new Dompdf($options); // Ambil input tanggal dari GET $tanggal_awal_input = $this->input->get('start_date'); $tanggal_akhir_input = $this->input->get('end_date'); // Format ulang dari dd/mm/yyyy ke Y-m-d if (!empty($tanggal_awal_input) && !empty($tanggal_akhir_input)) { $tgl_awal = date('Y-m-d', strtotime(str_replace('/', '-', $tanggal_awal_input))); $tgl_akhir = date('Y-m-d', strtotime(str_replace('/', '-', $tanggal_akhir_input))); // Filter berdasarkan tanggal yang sudah diformat $this->db->where('tanggal >=', $tgl_awal); $this->db->where('tanggal <=', $tgl_akhir); } $data['pelanggaransantri'] = $this->db->get('tb_pelanggaran_santri')->result(); $html = $this->load->view('admin/data_pelanggaran_santri', $data, true); $dompdf->setPaper('A4', 'portrait'); $dompdf->loadHtml($html); $dompdf->render(); $dompdf->stream('pelanggaran_santri.pdf', array("Attachment" => 0)); } public function tambah_aksi() { $this->_rules(); if ($this->form_validation->run() == FALSE) { $this->tambah(); } else { $tanggal_input = $this->input->post('tanggal'); $tanggal_formatted = date('Y-m-d', strtotime(str_replace('/', '-', $tanggal_input))); $data = array( 'id_santri' => $this->input->post('id_santri'), 'NIS' => $this->input->post('NIS'), 'nama_santri' => $this->input->post('nama_santri'), 'kelas_diniyah' => intval($this->input->post('kelas_diniyah')), 'pelanggaran' => $this->input->post('pelanggaran'), 'tanggal' => $tanggal_formatted, 'sanksi' => $this->input->post('sanksi'), 'keterangan' => $this->input->post('keterangan') ); $this->pelanggaran_santri_model->insert_data($data, 'tb_pelanggaran_santri'); $id_santri = $this->input->post('id_santri'); $namaSantri = $this->input->post('nama_santri'); // Kirim notifikasi FCM ke wali santri jika token tersedia $wali = $this->db->get_where('tb_wali_santri', ['id_santri' => $id_santri])->row(); if ($wali) { $token = $this->db->get_where('fcm_tokens', ['id_wali_santri' => $wali->id_wali_santri])->row('token'); if ($token) { $title = 'Nufaku - Pelanggaran Baru'; $body = $namaSantri . ' melakukan pelanggaran baru'; $host = $_SERVER['HTTP_HOST']; if (strpos($host, 'localhost') !== false || strpos($host, '127.0.0.1') !== false) { $host = '192.168.0.80:8080'; // Ganti sesuai IP kamu } $this->load->library('notif'); $notif = new Notif(); $title = 'Nufaku - Pelanggaran Baru'; $body = $namaSantri . ' melakukan pelanggaran baru'; // Tambahkan payload $dataPayload = [ 'type' => 'pelanggaran', 'id_santri' => $id_santri, 'nama_santri' => $namaSantri, 'kelas_diniyah' => $this->input->post('kelas_diniyah'), 'pelanggaran' => $this->input->post('pelanggaran'), 'tanggal' => $tanggal_formatted, 'sanksi' => $this->input->post('sanksi'), 'keterangan' => $this->input->post('keterangan'), 'from_notif' => 'true' ]; $response = $notif->send($token, $title, $body, $dataPayload); log_message('debug', 'RESPON FCM: ' . print_r($response, true)); } } $this->session->set_flashdata('pesan', ''); redirect('pelanggaransantri'); } } public function get_nis_autocomplete() { $term = $this->input->get('term'); $this->db->like('NIS', $term); $this->db->or_like('nama_santri', $term); $query = $this->db->get('tb_santri'); $result = []; $kelas_diniyah = [ 1 => 'Al-Wadhih Banin', 2 => 'Al-Wadhih Banat', 3 => 'Al-Jurūmiyyah Banin', 4 => 'Al-Jurūmiyyah Banat', 5 => 'Al-Imriti Banin', 6 => 'Al-Imriti Banat', 7 => 'Alfiyah Ula Banin', 8 => 'Alfiyah Ula Banat', 9 => 'Alfiyah Tsani Banin', 10 => 'Alfiyah Tsani Banat', 11 => 'Alfiyah Tsalits Banin', 12 => 'Alfiyah Tsalits Banat' ]; foreach ($query->result() as $row) { $kelas_diniyah_text = isset($kelas_diniyah[$row->kelas_diniyah]) ? $kelas_diniyah[$row->kelas_diniyah] : 'Tidak Diketahui'; $result[] = [ 'label' => $row->NIS . ' - ' . $row->nama_santri . ' (' . $kelas_diniyah_text . ')', 'value' => $row->NIS, 'nama_santri' => $row->nama_santri, 'id_santri' => $row->id_santri, 'kelas_diniyah' => $kelas_diniyah_text, // Kirim teksnya ke JS, bukan angkanya 'kelas_diniyah_id' => $row->kelas_diniyah // untuk disimpan ke DB ]; } echo json_encode($result); } public function view($id_santri) { $data['title'] = 'Pelanggaran Santri'; $data['santri'] = $this->db->get_where('tb_santri', ['id_santri' => $id_santri])->row(); $data['pelanggaransantri'] = $this->pelanggaran_santri_model->get_pelanggaran_by_santri($id_santri); $data['admin'] = $this->db->get_where('admin', ['email' => $this->session->userdata('email')])->row_array(); $this->load->view('templates/header'); $this->load->view('templates/sidebar', $data); $this->load->view('admin/detail_pelanggaran_santri', $data); $this->load->view('templates/footer'); } public function edit($id_pelanggaran_santri) { $this->_rules(); if ($this->form_validation->run() == FALSE) { $this->index(); } else { $tanggal_input = $this->input->post('tanggal'); $tanggal_formatted = date('Y-m-d', strtotime(str_replace('/', '-', $tanggal_input))); $data = array( 'id_pelanggaran_santri' => $id_pelanggaran_santri, 'NIS' => $this->input->post('NIS'), 'nama_santri' => $this->input->post('nama_santri'), 'kelas_diniyah' => $this->input->post('kelas_diniyah'), 'pelanggaran' => $this->input->post('pelanggaran'), 'tanggal' => $tanggal_formatted, 'sanksi' => $this->input->post('sanksi'), 'keterangan' => $this->input->post('keterangan') ); $this->pelanggaran_santri_model->update_data($data, 'tb_pelanggaran_santri'); $id_santri = $this->input->post('id_santri'); $namaSantri = $this->input->post('nama_santri'); // Kirim notifikasi FCM ke wali santri jika token tersedia $wali = $this->db->get_where('tb_wali_santri', ['id_santri' => $id_santri])->row(); if ($wali) { $token = $this->db->get_where('fcm_tokens', ['id_wali_santri' => $wali->id_wali_santri])->row('token'); log_message('debug', 'TOKEN FCM DITEMUKAN: ' . $token); if ($token) { $title = 'Nufaku - Pelanggaran Baru'; $body = $namaSantri . ' melakukan pelanggaran baru'; $host = $_SERVER['HTTP_HOST']; $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; // URL backend (digunakan misal dalam notifikasi FCM yang arahkan ke web) $baseUrl = $protocol . $host . base_url(); // base_url() sudah dinamis jika config-nya sudah benar // Jika butuh URL API manual (misalnya untuk disisipkan dalam payload FCM), contoh: $urlApi = $protocol . $host . '/admin-nufa/api/'; $this->load->library('notif'); $notif = new Notif(); $title = 'Nufaku - Pembaruan Pelanggaran'; $body = 'Data pelanggaran milik ' . $namaSantri . ' telah diperbarui'; // Tambahkan payload $dataPayload = [ 'type' => 'pelanggaran', 'id_santri' => $id_santri, 'login_key' => 'id_santri', 'login_value' => $id_santri, 'nama_santri' => $namaSantri, 'kelas_diniyah' => $this->input->post('kelas_diniyah'), 'pelanggaran' => $this->input->post('pelanggaran'), 'tanggal' => $tanggal_formatted, 'sanksi' => $this->input->post('sanksi'), 'keterangan' => $this->input->post('keterangan'), 'from_notif' => 'true', 'detail_url' => $baseUrl . 'pelanggaransantri/detail/' . $id_santri, // misal untuk Android nanti 'api_url' => $urlApi . 'getDataSantri?id_santri=' . $id_santri ]; $response = $notif->send($token, $title, $body, $dataPayload); log_message('debug', 'RESPON FCM: ' . print_r($response, true)); } } $this->session->set_flashdata('pesan', ''); redirect('pelanggaransantri'); } } public function rekap() { $data['title'] = 'Rekap Pelanggaran Santri'; // Ambil semua data pelanggaran $pelanggaransantri = $this->pelanggaran_santri_model->get_data('tb_pelanggaran_santri')->result(); // Proses pengelompokan $rekap = []; foreach ($pelanggaransantri as $row) { $nis = $row->NIS; if (!isset($rekap[$nis])) { $rekap[$nis] = [ 'NIS' => $row->NIS, 'nama_santri' => $row->nama_santri, 'kelas_diniyah' => $row->kelas_diniyah, 'jumlah_pelanggaran' => 0, 'sanksi_ada' => [], 'sanksi_kosong' => [] ]; } $rekap[$nis]['jumlah_pelanggaran']++; if (!empty($row->sanksi)) { $rekap[$nis]['sanksi_ada'][] = $row->sanksi; } else { $rekap[$nis]['sanksi_kosong'][] = $row->pelanggaran; } } $data['rekap'] = $rekap; $data['admin'] = $this->db->get_where('admin', ['email' => $this->session->userdata('email')])->row_array(); // Load tampilan rekap $this->load->view('templates/header', $data); $this->load->view('templates/sidebar', $data); $this->load->view('admin/rekap_pelanggaran', $data); $this->load->view('templates/footer'); } public function rekap_pdf() { $options = new Options(); $options->set('isHtml5ParserEnabled', true); $dompdf = new Dompdf($options); // Ambil data pelanggaran dan rekap $pelanggaransantri = $this->pelanggaran_santri_model->get_data('tb_pelanggaran_santri')->result(); $rekap = []; foreach ($pelanggaransantri as $row) { $nis = $row->NIS; if (!isset($rekap[$nis])) { $rekap[$nis] = [ 'NIS' => $row->NIS, 'nama_santri' => $row->nama_santri, 'kelas_diniyah' => $row->kelas_diniyah, 'jumlah_pelanggaran' => 0, 'sanksi_ada' => [], 'sanksi_kosong' => [] ]; } $rekap[$nis]['jumlah_pelanggaran']++; if (strtolower(trim($row->keterangan)) == 'sudah disanksi') { $rekap[$nis]['sanksi_ada'][] = $row->sanksi; } else { $rekap[$nis]['sanksi_kosong'][] = $row->sanksi; } } $data['rekap'] = $rekap; // Load HTML view sebagai string $html = $this->load->view('admin/rekap_pelanggaran', $data, true); $dompdf->setPaper('A4', 'landscape'); $dompdf->loadHtml($html); $dompdf->render(); $dompdf->stream('rekap_pelanggaran_santri.pdf', array("Attachment" => false)); } public function _rules() { $this->form_validation->set_rules('NIS', 'NIS', 'required', array( 'required' => '%s harus diisi!!' )); $this->form_validation->set_rules('nama_santri', 'Nama Santri', 'required', array( 'required' => '%s harus diisi!!' )); $this->form_validation->set_rules('kelas_diniyah', 'Kelas Diniyah', 'required|numeric|greater_than[0]', array( 'required' => '%s harus diisi!!' )); $this->form_validation->set_rules('pelanggaran', 'Pelanggaran', 'required', array( 'required' => '%s harus diisi!!' )); $this->form_validation->set_rules('tanggal', 'Tanggal', 'required', array( 'required' => '%s harus diisi!!' )); $this->form_validation->set_rules('sanksi', 'Sanksi', 'required', array( 'required' => '%s harus diisi!!' )); $this->form_validation->set_rules('keterangan', 'Keterangan', 'required', array( 'required' => '%s harus diisi!!' )); } public function delete($id) { $where = array('id_pelanggaran_santri' => $id); $this->pelanggaran_santri_model->delete($where, 'tb_pelanggaran_santri'); $this->session->set_flashdata('pesan', ''); redirect('pelanggaransantri'); } }