MIF_E31211958/app/Controllers/Penilaian.php

293 lines
10 KiB
PHP

<?php
namespace App\Controllers;
use Dompdf\Dompdf;
use Dompdf\Options;
use App\Models\ModelPenilaian;
use App\Models\ModelDetailPenilaian;
use App\Models\ModelGuru;
use App\Models\ModelKriteria;
use App\Models\ModelAbsensi;
use App\Models\ModelAmal;
use App\Models\ModelSurat;
use App\Models\ModelJurnal;
class Penilaian extends BaseController
{
protected $PenilaianModel;
protected $DetailPenilaianModel;
protected $GuruModel;
protected $KriteriaModel;
protected $AbsensiModel;
protected $AmalModel;
protected $SuratModel;
protected $JurnalModel;
function __construct()
{
$this->PenilaianModel = new ModelPenilaian();
$this->DetailPenilaianModel = new ModelDetailPenilaian();
$this->GuruModel = new ModelGuru();
$this->KriteriaModel = new ModelKriteria();
$this->AbsensiModel = new ModelAbsensi();
$this->AmalModel = new ModelAmal();
$this->SuratModel = new ModelSurat();
$this->JurnalModel = new ModelJurnal();
}
public function index()
{
$bulan_selected = $this->request->getPost('bulan');
$tahun_selected = $this->request->getPost('tahun');
if (session()->has('nip') && session()->has('username')) {
$data = array(
'body' => 'Penilaian/list',
'username' => session('username'),
'nama' => session('nama'),
'nip' => session('nip'),
'hak_akses' => session('hak_akses'),
'bulan_selected' => $bulan_selected,
'tahun_selected' => $tahun_selected,
'nilaiBelum' => $this->DetailPenilaianModel->getPenilaianBelum(),
);
if ($bulan_selected !== null || $tahun_selected !== null) {
// Jika kategori dipilih, ambil data penilaian sesuai kategori
$data['nilaiSudah'] = $this->DetailPenilaianModel->getPenilaianSudah($bulan_selected, $tahun_selected);
} else {
$bulan_selected = date('m');
$tahun_selected = date('Y');
// Jika kategori tidak dipilih, inisialisasi $perhitungan dengan array kosong
$data['nilaiSudah'] = $this->DetailPenilaianModel->getPenilaianSudah($bulan_selected, $tahun_selected);
}
return view('index', $data);
} else {
// Jika pengguna belum login, arahkan ke halaman login
return redirect()->to(base_url() . 'login');
}
}
public function insert()
{
// Ambil data bulan dan tahun dari form atau dari inputan mana pun yang sesuai dengan implementasi Anda
$bulan = $this->request->getPost('bulan');
$tahun = $this->request->getPost('tahun');
// Simpan data penilaian ke dalam tabel penilaian
$dataPenilaian = [
'bulan' => $bulan,
'tahun' => $tahun,
];
if ($this->PenilaianModel->insert_penilaian($dataPenilaian)) {
// Ambil Id Penilaian
$idPenilaian = $this->PenilaianModel->insertID();
// Ambil semua data guru dari tabel guru
$dataGuru = $this->GuruModel->getGuru();
// Simpan data detail penilaian ke dalam tabel detail_penilaian
foreach ($dataGuru as $guru) {
$dataDetailPenilaian = [
'id_penilaian' => $idPenilaian,
'nip' => $guru->nip,
];
$insertDetail = $this->DetailPenilaianModel->insert($dataDetailPenilaian);
if (!$insertDetail) {
session()->setFlashdata('error', 'Gagal Menambahkan Data');
return redirect()->to(base_url() . 'penilaian/list');
}
}
session()->setFlashdata('success', 'Berhasil Menambahkan Data');
return redirect()->to(base_url() . 'penilaian/list');
} else {
session()->setFlashdata('error', 'Gagal Menambahkan Data');
return redirect()->to(base_url() . 'penilaian/list');
}
}
public function edit($id)
{
if (session()->has('nip') && session()->has('username')) {
$data_detailPenilaian = new ModelDetailPenilaian();
$detailPenilaian = $data_detailPenilaian->getById($id)->getRow();
if ($detailPenilaian) {
$bulanSekarang = $detailPenilaian->bulan; // Bulan sekarang (1-12)
$tahunSekarang = $detailPenilaian->tahun; // Tahun sekarang
$nip = $detailPenilaian->nip;
// Ambil data absensi 3 bulan terakhir
$rekapAbsensi = $this->AbsensiModel->getRekapAbsensi($bulanSekarang, $tahunSekarang, $nip);
// Ambil data amal yaumi 3 bulan terakhir
$rekapAmal = $this->AmalModel->getRekapAmal($bulanSekarang, $tahunSekarang, $nip);
// Ambil data jurnal mengajar 3 bulan terakhir
$rekapJurnal = $this->JurnalModel->getRekapJurnal($bulanSekarang, $tahunSekarang, $nip);
// Ambil data surat tugas 3 bulan terakhir
$rekapTugas = $this->SuratModel->getRekapTugas($nip);
// Ambil data surat panitia 3 bulan terakhir
$rekapPanitia = $this->SuratModel->getRekapPanitia($nip);
$data = array(
'body' => 'Penilaian/edit',
'username' => session('username'),
'nama' => session('nama'),
'nip' => session('nip'),
'hak_akses' => session('hak_akses'),
'data' => $detailPenilaian,
'rekap_absensi' => $rekapAbsensi,
'rekap_amal' => $rekapAmal,
'rekap_tugas' => $rekapTugas,
'rekap_panitia' => $rekapPanitia,
'rekap_jurnal' => $rekapJurnal,
);
return view('index', $data);
} else {
// Handle jika detailPenilaian tidak ditemukan
return redirect()->to(base_url() . 'error');
}
} else {
// Jika pengguna belum login, arahkan ke halaman login
return redirect()->to(base_url() . 'login');
}
}
public function update($id)
{
$nip_penilai = $this->request->getVar('nip_penilai');
$tanggal = date('Y-m-d');
$k1 = $this->request->getVar('k1');
$k2 = $this->request->getVar('k2');
$k3 = $this->request->getVar('k3');
$k4 = $this->request->getVar('k4');
$k5 = $this->request->getVar('k5');
$k6 = $this->request->getVar('k6');
$k7 = $this->request->getVar('k7');
$k8 = $this->request->getVar('k8');
$k9 = $this->request->getVar('k9');
// Hitung nilai hasil
$hasil = $this->hitungHasil($k1, $k2, $k3, $k4, $k5, $k6, $k7, $k8, $k9);
$data = $this->DetailPenilaianModel->update($id, [
'nip_penilai' => $nip_penilai,
'tanggal' => $tanggal,
'k1' => $k1,
'k2' => $k2,
'k3' => $k3,
'k4' => $k4,
'k5' => $k5,
'k6' => $k6,
'k7' => $k7,
'k8' => $k8,
'k9' => $k9,
'hasil' => $hasil,
'status' => 1,
]);
if ($data == true) {
return redirect()->to(base_url() . 'penilaian/list')->with('success', 'Penilaian Berhasil!');
} else {
return redirect()->to(base_url() . 'penilaian/edit')->with('error', 'Penilaian Gagal!');
}
}
private function hitungHasil($k1, $k2, $k3, $k4, $k5, $k6, $k7, $k8, $k9)
{
// Ambil bobot dari tabel kriteria
$bobot = [
'k1' => $this->getBobotByKode('K1'),
'k2' => $this->getBobotByKode('K2'),
'k3' => $this->getBobotByKode('K3'),
'k4' => $this->getBobotByKode('K4'),
'k5' => $this->getBobotByKode('K5'),
'k6' => $this->getBobotByKode('K6'),
'k7' => $this->getBobotByKode('K7'),
'k8' => $this->getBobotByKode('K8'),
'k9' => $this->getBobotByKode('K9'),
];
// Normalisasi nilai
$normalizedValues = [];
foreach (['K1', 'K2', 'K3', 'K4', 'K5', 'K6', 'K7', 'K8', 'K9'] as $kodeKriteria) {
$kriteria = strtolower($kodeKriteria); // Konversi kode kriteria menjadi huruf kecil
$normalizedValues[$kriteria] = $this->normalisasi(${$kriteria}, $kodeKriteria);
}
// Hitung nilai hasil
$hasil = 0;
foreach ($normalizedValues as $kriteria => $value) {
$hasil += $value * $bobot[$kriteria];
}
return $hasil;
}
private function getBobotByKode($kode)
{
// Ambil bobot dari tabel kriteria berdasarkan kode kriteria
// Implementasi ini bergantung pada struktur tabel dan model Anda
// Gantilah dengan cara yang sesuai untuk aplikasi Anda
return $this->KriteriaModel->getBobotByKode($kode);
}
private function normalisasi($nilai, $kriteria)
{
// Ambil tipe kriteria (benefit atau cost) dari tabel kriteria berdasarkan kode kriteria
$tipe = $this->KriteriaModel->getTipeByKode($kriteria);
// Tentukan nilai maksimum dan minimum berdasarkan tipe kriteria
$max = ($tipe == 'Benefit') ? 4 : 1;
$min = ($tipe == 'Benefit') ? 1 : 4;
// Normalisasi nilai
if ($tipe == 'Benefit') {
$normalisasi = $nilai / $max;
} else {
$normalisasi = $min / $nilai;
}
return $normalisasi;
}
public function delete($id)
{
$this->DetailPenilaianModel->delete($id);
return redirect()->to(base_url() . 'kriteria/list')->with('success', 'Data Berhasil Dihapus!');
}
public function indexCetak()
{
return view('Penilaian/cetak');
}
public function cetakPenilaian($id)
{
$data_detailPenilaian = new ModelDetailPenilaian();
$data['data'] = $data_detailPenilaian->getById($id)->getRow();
$data['dataP'] = $data_detailPenilaian->getByIdPenilai($id)->getRow();
// Mulai pembuatan PDF
$dompdf = new Dompdf();
$options = new Options();
$dompdf->set_option('isRemoteEnabled', true);
// Muat HTML ke Dompdf
$dompdf->loadHtml(view('Penilaian/cetak',$data));
// Atur ukuran dan orientasi halaman (opsional)
$dompdf->setPaper('A4', 'portrait');
// Render PDF
$dompdf->render();
// Output PDF ke browser atau simpan di server
$dompdf->stream("output.pdf", ["Attachment" => false]);
// Jika ingin menyimpan PDF ke server, gunakan:
// $dompdf->output();
}
}