*/ class IpalParameterController extends Controller { /** * Display parameter table * * @param int $idMcIpal * @return \Illuminate\Http\Response */ public function table($idMcIpal) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } // Get IPAL data $ipal = Ipal::getOneBy(['IpalId' => $idMcIpal]); $data = [ 'IpalId' => $idMcIpal, 'NamaIpal' => $ipal->nama ]; // If mcipal_parameter is empty, fill it based on refipal_parameter $parameter = IpalParameter::getOneBy(['IpalId' => $idMcIpal]); if (!$parameter) { $refIpalParam = IpalParameter::getRefIpalParam($ipal->idrefipal); if ($refIpalParam) { foreach ($refIpalParam as $row) { $dataMcIpalParam = [ 'IpalId' => $idMcIpal, 'RefIpalParameterId' => $row->id, 'Nama' => $row->nama, 'Satuan' => $row->satuan, 'BakuMutuJenis' => $row->bakumutu_jenis, 'BakuMutuNilai1' => $row->bakumutu_nilai1, 'BakuMutuNilai2' => $row->bakumutu_nilai2, 'BatasEmisi' => $row->batasemisi ]; $idMcIpalParam = IpalParameter::insertMcIpalParam($dataMcIpalParam); // Insert data to mchasiluji_al $this->_insertHasilUji($idMcIpal, $idMcIpalParam); } $this->_updateNilaiA6($ipal->idmcpelaporan); $this->_updateNilaiA7($ipal->idmcpelaporan); $this->_updateNilaiSpl($ipal->idmcpelaporan); if (!$this->_cekIpalKomunal($ipal->idmcpelaporan)) { $this->_updateNilaiSkl($ipal->idmcpelaporan); } } } return view('pelaporan.ipal.parameter.index', $data); } /** * Function to get data for datatable * * @param int $idMcIpal * @return \Illuminate\Http\JsonResponse */ public function getData($idMcIpal) { $dataParameter = IpalParameter::getData($idMcIpal); $data = []; $no = 1; foreach ($dataParameter as $row) { if ($row->bakumutu_nilai2) { $bakumutu = $row->bakumutu_nilai1 . ' - ' . $row->bakumutu_nilai2; } else { $bakumutu = $row->bakumutu_nilai1; } $data[] = [ $no, $row->nama, $row->satuan, $bakumutu, ($row->batasemisi != NULL ? floatval($row->batasemisi) : ''), $row->id ]; $no++; } $response = [ 'data' => $data, 'recordsTotal' => count($data) ]; return response()->json($response); } /** * Function to add new parameter * * @param int $idMcIpal * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse */ public function add(Request $request, $idMcIpal) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } if ($request->has('action')) { $response = $this->_insertUpdate($idMcIpal, 'insert', $request); $ipal = Ipal::getOneBy(['IpalId' => $idMcIpal]); $this->_updateNilaiA6($ipal->idmcpelaporan); $this->_updateNilaiA7($ipal->idmcpelaporan); $this->_updateNilaiSpl($ipal->idmcpelaporan); if (!$this->_cekIpalKomunal($ipal->idmcpelaporan)) { $this->_updateNilaiSkl($ipal->idmcpelaporan); } return response()->json($response); } $data['IpalId'] = $idMcIpal; return view('pelaporan.ipal.parameter.add', $data); } /** * Function to edit parameter * * @param Request $request * @param int $idMcIpalParam * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse */ public function edit(Request $request, $idMcIpalParam) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } if ($request->has('action')) { $response = $this->_insertUpdate($idMcIpalParam, 'update', $request); return response()->json($response); } else { $data['param'] = IpalParameter::getOneBy(['id' => $idMcIpalParam]); return view('pelaporan.ipal.parameter.edit', $data); } } /** * Function to delete parameter * * @param Request $request * @param int $idMcIpalParam * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse */ public function delete(Request $request, $idMcIpalParam) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } if ($request->has('action')) { $idRefIpalParam = IpalParameter::getOneBy(['id' => $idMcIpalParam])->idrefipal_parameter; // Data for logging $ipalParameter = IpalParameter::getOneBy(['id' => $idMcIpalParam]); $idMcIpal = $ipalParameter->idmcipal; $idMcPelaporan = Ipal::getOneBy(['id' => $idMcIpal])->idmcpelaporan; $pelaporan = Pelaporan::findOrFail($idMcPelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $namaIpal = Ipal::getOneBy(['id' => $idMcIpal])->nama; $namaIpalParameter = $ipalParameter->nama; // Delete ipal parameter and hasiluji from database IpalParameter::deleteMcIpalParam(['id' => $idMcIpalParam]); Ipal::deleteHasilUji(['idmcipal_parameter' => $idMcIpalParam]); if ($request->input('ref_delete')) { IpalParameter::disableRefIpalParam($idRefIpalParam); } $this->_updateNilaiA6($idMcPelaporan); $this->_updateNilaiA7($idMcPelaporan); $this->_updateNilaiSpl($idMcPelaporan); if (!$this->_cekIpalKomunal($idMcPelaporan)) { $this->_updateNilaiSkl($idMcPelaporan); } // Log activity $aktivitas = 'Pelaporan AL - ' . $perusahaan->nama . ' - Tahun ' . $pelaporan->tahun . ' - Periode ' . $pelaporan->periode . ' - Nama IPAL ' . $namaIpal . ' - Parameter Uji Lab ' . $namaIpalParameter; Log::info('LOG_DELETE', ['message' => $aktivitas, 'module' => 'pelaporan']); $response = ['message' => 'Parameter Berhasil Dihapus', 'status' => 'success']; return response()->json($response); } else { $param = IpalParameter::getOneBy(['id' => $idMcIpalParam]); $ipal = Ipal::getOneBy(['id' => $param->idmcipal]); $data = [ 'idmcipal_param' => $idMcIpalParam, 'nomor_ipal' => $ipal->nomor, 'nama_ipal' => $ipal->nama, 'nama_param' => $param->nama ]; return view('pelaporan.ipal.parameter.delete', $data); } } /** * Function to insert into or update table mcipal_parameter and refipal_parameter * * @param int $id if insert then $id = $idmcipal if update then $id = $idmcipal_parameter * @param string $action insert or update * @param Request $request * @return array $response */ private function _insertUpdate($id, $action, Request $request) { $post = $request->all(); if ($post['nama'] !== "" && $post['satuan'] !== "") { if ($post['bakumutu'] == 1) { $bakumutuJenis = 'Angka Tunggal'; $bakumutuNilai1 = $post['angka_tunggal']; $bakumutuNilai2 = ''; if (!is_numeric($bakumutuNilai1)) { $response = ['message' => 'Data belum lengkap', 'status' => 'error']; return $response; } if (!(isset($post['batasemisi']) && $post['batasemisi'])) { $response = ['message' => 'Beban pencemaran maksimum wajib diisi', 'status' => 'error']; return $response; } } else if ($post['bakumutu'] == 2) { $bakumutuJenis = 'Rentang Angka'; $bakumutuNilai1 = $post['nilai1']; $bakumutuNilai2 = $post['nilai2']; if (!(is_numeric($bakumutuNilai1) && is_numeric($bakumutuNilai2))) { $response = ['message' => 'Data belum lengkap', 'status' => 'error']; return $response; } if (!(isset($post['batasemisi']) && $post['batasemisi'])) { $response = ['message' => 'Beban pencemaran maksimum wajib diisi', 'status' => 'error']; return $response; } } else if ($post['bakumutu'] == 3) { $bakumutuJenis = 'Positif/Negatif'; $bakumutuNilai1 = $post['bakumutu_3']; $bakumutuNilai2 = ''; if (!$bakumutuNilai1) { $response = ['message' => 'Data belum lengkap', 'status' => 'error']; return $response; } } else if ($post['bakumutu'] == 4) { $bakumutuJenis = 'Tanpa Baku Mutu'; $bakumutuNilai1 = '-'; $bakumutuNilai2 = ''; } $dataRefIpalParam = [ 'nama' => $post['nama'], 'satuan' => $post['satuan'], 'bakumutu_jenis' => $bakumutuJenis, 'bakumutu_nilai1' => $bakumutuNilai1, 'bakumutu_nilai2' => $bakumutuNilai2, 'batasemisi' => (($post['bakumutu'] == 3 || $post['batasemisi'] === '') ? NULL : $post['batasemisi']) ]; $dataMcIpalParam = $dataRefIpalParam; if ($action == 'insert') { $idRefIpal = Ipal::getOneBy(['id' => $id])->idrefipal; $dataRefIpalParam['idrefipal'] = $idRefIpal; $dataRefIpalParam['del'] = 'n'; $idRefIpalParam = IpalParameter::insertRefIpalParam($dataRefIpalParam); $dataMcIpalParam['idmcipal'] = $id; $dataMcIpalParam['idrefipal_parameter'] = $idRefIpalParam; $idMcIpalParam = IpalParameter::insertMcIpalParam($dataMcIpalParam); // Insert data to mchasiluji_al $this->_insertHasilUji($id, $idMcIpalParam); // Log activity $idMcPelaporan = Ipal::getOneBy(['id' => $id])->idmcpelaporan; $pelaporan = Pelaporan::findOrFail($idMcPelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $namaIpal = Ipal::getOneBy(['id' => $id])->nama; $namaIpalParameter = $dataMcIpalParam['nama']; $aktivitas = 'Pelaporan AL - ' . $perusahaan->nama . ' - Tahun ' . $pelaporan->tahun . ' - Periode ' . $pelaporan->periode . ' - Nama IPAL ' . $namaIpal . ' - Parameter Uji Lab ' . $namaIpalParameter; Log::info('LOG_CREATE', ['message' => $aktivitas, 'module' => 'pelaporan']); } elseif ($action == 'update') { IpalParameter::updateMcIpalParam($id, $dataMcIpalParam); if (isset($post['ref_save'])) { $idRefIpalParam = IpalParameter::getOneBy(['id' => $id])->idrefipal_parameter; IpalParameter::updateRefIpalParam($idRefIpalParam, $dataRefIpalParam); } // Log activity $ipalParameter = IpalParameter::getOneBy(['id' => $id]); $idMcIpal = $ipalParameter->idmcipal; $idMcPelaporan = Ipal::getOneBy(['id' => $idMcIpal])->idmcpelaporan; $pelaporan = Pelaporan::findOrFail($idMcPelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $namaIpal = Ipal::getOneBy(['id' => $idMcIpal])->nama; $namaIpalParameter = $ipalParameter->nama; $aktivitas = 'Pelaporan AL - ' . $perusahaan->nama . ' - Tahun ' . $pelaporan->tahun . ' - Periode ' . $pelaporan->periode . ' - Nama IPAL ' . $namaIpal . ' - Parameter Uji Lab ' . $namaIpalParameter; Log::info('LOG_EDIT', ['message' => $aktivitas, 'module' => 'pelaporan']); } $response = ['message' => 'Parameter Berhasil Disimpan', 'status' => 'success']; } else { $response = ['message' => 'Data belum lengkap', 'status' => 'error']; } return $response; } /** * Insert hasil uji for new parameter * * @param int $idMcIpal * @param int $idMcIpalParam * @return void */ private function _insertHasilUji($idMcIpal, $idMcIpalParam) { $ipal = Ipal::getOneBy(['id' => $idMcIpal]); $pelaporan = Pelaporan::findOrFail($ipal->idmcpelaporan); $dataHasilUji = []; $bulan = 0; if ($pelaporan->idrefperiodepelaporan == 1) { $bulan = 1; } elseif ($pelaporan->idrefperiodepelaporan == 2) { $bulan = 4; } elseif ($pelaporan->idrefperiodepelaporan == 3) { $bulan = 7; } elseif ($pelaporan->idrefperiodepelaporan == 4) { $bulan = 10; } for ($i = 0; $i < 3; $i++) { $dataHasilUji[] = [ 'idmcipal' => $idMcIpal, 'tahun' => $pelaporan->tahun, 'idrefperusahaan' => $pelaporan->idrefperusahaan, 'idmcipal_parameter' => $idMcIpalParam, 'bulan' => $this->_mcMonth($bulan) ]; $bulan++; } Ipal::insertHasilUji($dataHasilUji); } /** * Update nilai A6 * * @param int $idMcPelaporan * @return void */ private function _updateNilaiA6($idMcPelaporan) { $pelaporan = Pelaporan::findOrFail($idMcPelaporan); $allIpal = Ipal::getData($idMcPelaporan); $periode = $pelaporan->idrefperiodepelaporan; $bulanAwal = (($periode - 1) * 3) + 1; $jmlNilaiIpal = 0; foreach ($allIpal as $row) { $jmlNilaiParam = 0; for ($i = 0; $i < 3; $i++) { $filter = [ 'idmcipal' => $row->id, 'bulan' => $this->_mcMonth($bulanAwal + $i), 'nilai !=' => 'NULL' ]; $hasilUji = Ipal::getHasilUjiBy($filter); if ($hasilUji) { $jmlNilaiParam += 100; } } $nilaiIpal = $jmlNilaiParam / 3; $jmlNilaiIpal += $nilaiIpal; } if (count($allIpal)) { $nilaiA6 = $jmlNilaiIpal / count($allIpal); } else { $nilaiA6 = 0; } $idRefKomponen = Ipal::getIdRefKomponen('A6'); $filter = [ 'idmcpelaporan' => $idMcPelaporan, 'idrefkomponen' => $idRefKomponen ]; if (Ipal::getNilaiKomponen($filter)) { $data = ['nilai' => $nilaiA6]; Ipal::updateNilaiKomponen($filter, $data); } else { $data = [ 'idmcpelaporan' => $idMcPelaporan, 'idrefkomponen' => $idRefKomponen, 'idrefhasil' => 0, 'nilai' => $nilaiA6 ]; Ipal::insertNilaiKomponen($data); } } /** * Update nilai A7 * * @param int $idMcPelaporan * @return void */ private function _updateNilaiA7($idMcPelaporan) { $pelaporan = Pelaporan::findOrFail($idMcPelaporan); $allIpal = Ipal::getData($idMcPelaporan); $periode = $pelaporan->idrefperiodepelaporan; $bulanAwal = (($periode - 1) * 3) + 1; $jmlNilaiIpal = 0; foreach ($allIpal as $row) { $jmlNilaiParam = 0; $params = IpalParameter::getData($row->id); $tambahNilai = false; for ($i = 0; $i < 3; $i++) { foreach ($params as $param) { $filter = [ 'idmcipal_parameter' => $param->id, 'bulan' => $this->_mcMonth($bulanAwal + $i) ]; $hasilUji = Ipal::getHasilUjiBy($filter); $tambahNilai = false; if ($hasilUji->nilai) { if ($hasilUji->nilai == '*') { $tambahNilai = true; } elseif ($hasilUji->debit != NULL && $param->bakumutu_jenis != 'Positif/Negatif') { if ($hasilUji->bebanemisi > $param->batasemisi) { $tambahNilai = false; break; } else { $tambahNilai = true; } } else { if ($param->bakumutu_jenis == 'Angka Tunggal') { if ($hasilUji->nilai > $param->bakumutu_nilai1) { $tambahNilai = false; break; } } elseif ($param->bakumutu_jenis == 'Rentang Angka') { if ($hasilUji->nilai < $param->bakumutu_nilai1 || $hasilUji->nilai > $param->bakumutu_nilai2) { $tambahNilai = false; break; } } elseif ($param->bakumutu_jenis == 'Positif/Negatif') { if (strtolower($hasilUji->nilai) != strtolower($param->bakumutu_nilai1)) { $tambahNilai = false; break; } } $tambahNilai = true; } } else { $tambahNilai = false; break; } } if ($tambahNilai) { $jmlNilaiParam += 100; } } $nilaiIpal = $jmlNilaiParam / 3; $jmlNilaiIpal += $nilaiIpal; } if (count($allIpal)) { $nilaiA7 = $jmlNilaiIpal / count($allIpal); } else { $nilaiA7 = 0; } $idRefKomponen = Ipal::getIdRefKomponen('A7'); $filter = [ 'idmcpelaporan' => $idMcPelaporan, 'idrefkomponen' => $idRefKomponen ]; if (Ipal::getNilaiKomponen($filter)) { $data = ['nilai' => $nilaiA7]; Ipal::updateNilaiKomponen($filter, $data); } else { $data = [ 'idmcpelaporan' => $idMcPelaporan, 'idrefkomponen' => $idRefKomponen, 'idrefhasil' => 0, 'nilai' => $nilaiA7 ]; Ipal::insertNilaiKomponen($data); } } /** * Update nilai SPL * * @param int $idMcPelaporan * @return void */ private function _updateNilaiSpl($idMcPelaporan) { $allIpal = Ipal::getData($idMcPelaporan); $jmlParam = 0; $memenuhiBakumutu = 0; $memenuhiBatasEmisi = 0; foreach ($allIpal as $ipal) { $params = IpalParameter::getData($ipal->id); $jmlParam += count($params); $allHasilUji = Ipal::getAllHasilUjiBy([ 'idmcipal' => $ipal->id, 'nilai !=' => NULL ]); // Check all hasil uji against bakumutu foreach ($allHasilUji as $hasilUji) { $param = IpalParameter::getOneBy(['id' => $hasilUji->idmcipal_parameter]); if ($hasilUji->nilai == '*') { $memenuhiBakumutu++; } elseif ($hasilUji->debit != NULL && $param->bakumutu_jenis != 'Positif/Negatif') { if ($hasilUji->bebanemisi <= $param->batasemisi) { $memenuhiBatasEmisi++; } } else { if ($param->bakumutu_jenis == 'Angka Tunggal') { if ($hasilUji->nilai <= $param->bakumutu_nilai1) { $memenuhiBakumutu++; } } elseif ($param->bakumutu_jenis == 'Rentang Angka') { if ($hasilUji->nilai >= $param->bakumutu_nilai1 && $hasilUji->nilai <= $param->bakumutu_nilai2) { $memenuhiBakumutu++; } } elseif ($param->bakumutu_jenis == 'Positif/Negatif') { if (strtolower($hasilUji->nilai) == strtolower($param->bakumutu_nilai1)) { $memenuhiBakumutu++; } } elseif ($param->bakumutu_jenis == 'Tanpa Baku Mutu') { $memenuhiBakumutu++; } } } } $totalParam = $jmlParam * 3; $melebihiBakumutuEmisi = $totalParam - $memenuhiBakumutu - $memenuhiBatasEmisi; if ($totalParam) { $nilaiSpl = 100 - (($melebihiBakumutuEmisi / $totalParam) * 100); } else { $nilaiSpl = 0; } if (Ipal::getNilaiSpl($idMcPelaporan)) { $data = [ 'diuji' => $totalParam, 'melebihi' => $melebihiBakumutuEmisi, 'nilaispl' => $nilaiSpl ]; Ipal::updateNilaiSpl($idMcPelaporan, $data); } else { $data = [ 'idmcpelaporan' => $idMcPelaporan, 'diuji' => $totalParam, 'melebihi' => $melebihiBakumutuEmisi, 'nilaispl' => $nilaiSpl ]; Ipal::insertNilaiSpl($data); } Pelaporan::updateNilaiSpl($idMcPelaporan, 2, $nilaiSpl); Pelaporan::getAvgSpl($idMcPelaporan); } /** * Check if IPAL is komunal * * @param int $idMcPelaporan * @return bool */ private function _cekIpalKomunal($idMcPelaporan) { $ipalKomunal = Spl_AL::getStatusMcKomunal($idMcPelaporan); if ($ipalKomunal) { if ($ipalKomunal->tersambung == 'Iya') { $sk = Lampiran::getKomponenByKode('SK'); if ($sk) { $lampiranSk = Spl_AL::cekLampiranSk($idMcPelaporan, $sk->id); if ($lampiranSk) { return true; } } } } return false; } /** * Update nilai SKL * * @param int $idMcPelaporan * @return void */ private function _updateNilaiSkl($idMcPelaporan) { $totalNilai1 = 0; $totalNilai2 = 0; $totalNilai3 = 0; $kelompok1 = ['A1', 'A2', 'A3', 'A4']; $kelompok2 = ['A5']; $kelompok3 = ['A6', 'A7', 'A8', 'A9', 'A10']; for ($i = 1; $i <= 10; $i++) { $komponen = 'A' . $i; $idRefKomponen = Ipal::getIdRefKomponen($komponen); $nilaiKomponen = Ipal::getNilaiKomponen([ 'idmcpelaporan' => $idMcPelaporan, 'idrefkomponen' => $idRefKomponen, 'idmcipal' => NULL ]); if ($nilaiKomponen) { if (in_array($komponen, $kelompok1)) { $totalNilai1 += $nilaiKomponen->nilai; } elseif (in_array($komponen, $kelompok2)) { $totalNilai2 += $nilaiKomponen->nilai; } else { $totalNilai3 += $nilaiKomponen->nilai; } } } $skl = (15 * ($totalNilai1 / count($kelompok1)) / 100) + (15 * ($totalNilai2 / count($kelompok2)) / 100) + (70 * ($totalNilai3 / count($kelompok3)) / 100); Pelaporan::updateNilaiSkl($idMcPelaporan, 2, $skl); Pelaporan::updateAvgSkl($idMcPelaporan); } /** * Convert month number to name * * @param int $monthNum * @return string */ private function _mcMonth($monthNum) { $months = [ 1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April', 5 => 'May', 6 => 'June', 7 => 'July', 8 => 'August', 9 => 'September', 10 => 'October', 11 => 'November', 12 => 'December' ]; return $months[$monthNum] ?? ''; } }