*/ class ALController extends Controller { const ID_REFPELAPORAN = 2; /** * Menampilkan halaman laporan */ public function laporan($idPelaporan) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } // Load models $pelaporan = Pelaporan::findOrFail($idPelaporan); // Set breadcrumb data $breadcrumb = $this->_generateBreadcrumb('Pelaporan'); // Get editable status $editable = $this->_isEditable($idPelaporan, 'AL') && Gate::allows('pelaporan.edit'); // Check IPAL Komunal status $ipalKomunal = $this->_getIpalKomunalStatus($idPelaporan); $lampiranSk = 0; $verifikasiSk = ''; $ketSk = ''; if ($ipalKomunal) { if ($ipalKomunal->tersambung == 'Iya') { $sk = Lampiran::getKomponenByKode('SK'); if ($sk) { $lampiranSk = $this->_cekLampiranSk($idPelaporan, $sk->id) ? 1 : 0; } } // Verifikasi surat kerjasama $idKomponenSk = Lampiran::getKomponenByKode('SK')->id; $komponenSk = Ipal::getNilaiKomponen([ 'idmcpelaporan' => $idPelaporan, 'idrefkomponen' => $idKomponenSk ]); if (!$editable && $komponenSk) { if ($komponenSk->verifikasi !== null) { $verifikasiSk = $komponenSk->verifikasi == '1' ? 'Approved' : 'Not Approved'; } $ketSk = $komponenSk->keterangan; } } // Prepare data for view $data = [ 'breadcrumb' => $breadcrumb, 'NamaPerusahaan' => $pelaporan->perusahaan, 'Tahun' => $pelaporan->tahun, 'periode' => $pelaporan->periode, 'editable' => $editable, 'lampiran_sk' => $lampiranSk, 'verifikasi_sk' => $verifikasiSk, 'ipal_komunal' => $ipalKomunal ? $ipalKomunal->tersambung : '', 'ket_sk' => $ketSk, 'idmcpelaporan' => $idPelaporan, 'catatan' => Komponen::getCatatan($idPelaporan, self::ID_REFPELAPORAN) ]; return view('pelaporan.al', $data); } /** * Function to load al table */ public function table($idPelaporan) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } // Load pelaporan data $pelaporan = Pelaporan::findOrFail($idPelaporan); // Get reference data $getData = Komponen::getDataRef(self::ID_REFPELAPORAN); $dataTable = $getData['data']; $rowspan1 = $getData['total_rows'] + 1; // Get nilai komponen $nilaiKomponen = Komponen::getNilaiKomponen($idPelaporan, self::ID_REFPELAPORAN); // Get nilai komponen A6 and A7 $komponenCodes = ['A6', 'A7']; $nilaiData = []; foreach ($komponenCodes as $code) { $nilaiData['nilai_' . $code] = ''; $idRefKomponen = Ipal::getIdRefKomponen($code); $filter = [ 'idmcpelaporan' => $idPelaporan, 'idrefkomponen' => $idRefKomponen ]; $nilaiKomponenValue = Ipal::getNilaiKomponen($filter); if ($nilaiKomponenValue) { $nilaiData['nilai_' . $code] = $nilaiKomponenValue->nilai; } } // Get nilai syarat teknis $kodeSyaratTeknis = ['A1', 'A2', 'A3', 'A4', 'A5']; $nilaiSyaratTeknis = []; foreach ($kodeSyaratTeknis as $kode) { $idKomponen = Ipal::getIdRefKomponen($kode); $komponenSyaratTeknis = Ipal::getNilaiKomponen([ 'idmcpelaporan' => $idPelaporan, 'idmcipal' => null, 'idrefkomponen' => $idKomponen ]); $nilaiSyaratTeknis[$kode] = $komponenSyaratTeknis ? $komponenSyaratTeknis->nilai : 0; } // Update nilai SPL $this->_updateNilaiSpl($idPelaporan); $spl = number_format($pelaporan->spl_al, 2, '.', ' '); $splAl = Ipal::getNilaiSpl($idPelaporan); $spl2 = $splAl ? number_format($splAl->nilaispl, 2, '.', ' ') : 0; // Prepare data for view $data = array_merge($nilaiData, [ 'data_table' => $dataTable, 'rowspan_1' => $rowspan1, 'nilai_komponen' => $nilaiKomponen, 'nilai_syarat_teknis' => $nilaiSyaratTeknis, 'spl' => $spl, 'spl_2' => $spl2, 'idmcpelaporan' => $idPelaporan, 'idrefpelaporan' => self::ID_REFPELAPORAN ]); return view('pelaporan.al_table', $data); } /** * Display SPL data */ public function spl($idPelaporan) { // Load pelaporan data $pelaporan = Pelaporan::findOrFail($idPelaporan); $spl = Ipal::getNilaiSpl($idPelaporan); // Prepare data for view $data = [ 'NamaPerusahaan' => $pelaporan->perusahaan, 'Tahun' => $pelaporan->tahun, 'periode' => $pelaporan->periode, 'spl' => $spl ]; return view('pelaporan.spl_al', $data); } /** * Check if there are attachments */ public function cekAdaLampiran($idPelaporan) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } $response = Lampiran::cekAdaLampiran($idPelaporan, self::ID_REFPELAPORAN); return response()->json($response); } /** * Check for surat kerjasama */ public function cekSuratKerjasama($idPelaporan) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } $sk = Lampiran::getKomponenByKode('SK'); if ($sk) { $lampiranSk = $this->_cekLampiranSk($idPelaporan, $sk->id); $response = ['lampiran' => $lampiranSk ? true : false]; } else { $response = ['lampiran' => false]; } return response()->json($response); } /** * Save AL data */ public function simpan(Request $request, $idPelaporan) { // Check authorization if (!Gate::allows('pelaporan.view') || !Gate::allows('pelaporan.edit')) { abort(403); } $dataCatatan = $request->input('catatan'); $dataHasil = []; if ($request->has('hasil')) { foreach ($request->input('hasil') as $row => $value) { $dataHasil[$row] = $value; } } if (!empty($dataHasil)) { Komponen::updateHasil($idPelaporan, self::ID_REFPELAPORAN, $dataHasil); } // Update SKL nilai if provided if ($request->has('skl-nilai')) { $nilaiSkl = $request->input('skl-nilai'); Pelaporan::updateNilaiSkl($idPelaporan, self::ID_REFPELAPORAN, $nilaiSkl); Pelaporan::updateAvgSkl($idPelaporan); } // Update status IPAL Komunal $statusIpalKomunal = $request->input('ipal_komunal', 'Tidak'); $this->_updateStatusIpalKomunal($idPelaporan, $statusIpalKomunal); // Save catatan Komponen::simpanCatatan($idPelaporan, self::ID_REFPELAPORAN, $dataCatatan); // Update mcpelaporan_date Pelaporan::updateTanggalPelaporan([ 'id_mcpelaporan' => $idPelaporan, 'id_refpelaporan' => self::ID_REFPELAPORAN ], now()->toDateString()); // Update table mcverifikasi $filter = [ 'idmcpelaporan' => $idPelaporan, 'idrefpelaporan' => self::ID_REFPELAPORAN ]; $dataUpdate = [ 'verifikasi' => 1, 'tanggal' => now()->format('Y-m-d H:i:s'), 'oleh' => Auth::id() ]; Pelaporan::updateStatusVerifikasi($filter, $dataUpdate); // Log activity $pelaporan = Pelaporan::findOrFail($idPelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $aktivitas = 'Pelaporan AL - ' . $perusahaan->nama . ' - Tahun ' . $pelaporan->tahun . ' - Periode ' . $pelaporan->periode; Log::info('LOG_EDIT', ['message' => $aktivitas, 'module' => 'pelaporan']); $response = [ 'message' => 'Data Pengelolaan Air Limbah berhasil disimpan', 'status' => 'success' ]; return response()->json($response); } /** * Export data to PDF */ public function exportPdf($idPelaporan) { // Check authorization if (!Gate::allows('pelaporan.export')) { abort(403); } // Load pelaporan data $pelaporan = Pelaporan::findOrFail($idPelaporan); // Prepare data for PDF $getData = Komponen::getDataRef(self::ID_REFPELAPORAN); $dataTable = $getData['data']; $rowspan1 = $getData['total_rows'] + 1; $nilaiKomponen = Komponen::getNilaiKomponen($idPelaporan, self::ID_REFPELAPORAN); $catatan = Komponen::getCatatan($idPelaporan, self::ID_REFPELAPORAN); // Get IPAL Komunal status $ipalKomunal = $this->_getIpalKomunalStatus($idPelaporan); $lampiranSk = 0; $komponenSk = null; if ($ipalKomunal) { $statusIpalKomunal = $ipalKomunal->tersambung; // Check lampiran surat kerjasama $sk = Lampiran::getKomponenByKode('SK'); if ($sk) { $lampiranSk = $this->_cekLampiranSk($idPelaporan, $sk->id); if ($lampiranSk) { $komponenSk = Ipal::getNilaiKomponen([ 'idmcpelaporan' => $idPelaporan, 'idrefkomponen' => $sk->id ]); $lampiranSk = 1; } } } else { $statusIpalKomunal = 'Tidak'; } // Get syarat teknis values $syaratTeknis = ['A1', 'A2', 'A3', 'A4', 'A5']; $nilaiSyaratTeknis = []; foreach ($syaratTeknis as $kode) { $idKomponen = Ipal::getIdRefKomponen($kode); $komponenSyaratTeknis = Ipal::getNilaiKomponen([ 'idmcpelaporan' => $idPelaporan, 'idmcipal' => null, 'idrefkomponen' => $idKomponen ]); $nilaiSyaratTeknis[$kode] = $komponenSyaratTeknis ? $komponenSyaratTeknis->nilai : 0; } // Get SKL and SPL values $skl = Pelaporan::getNilaiSkl($idPelaporan, self::ID_REFPELAPORAN); $spl = $ipalKomunal && $ipalKomunal->tersambung == 'Iya' ? 100 : number_format($pelaporan->spl_al, 2, '.', ' '); // Generate PDF $pdf = PDF::loadView('pelaporan.al_pdf', [ 'NamaPerusahaan' => $pelaporan->perusahaan, 'Tahun' => $pelaporan->tahun, 'periode' => $pelaporan->periode, 'data_table' => $dataTable, 'rowspan_1' => $rowspan1, 'nilai_komponen' => $nilaiKomponen, 'catatan' => $catatan, 'ipal_komunal' => $statusIpalKomunal, 'lampiran_sk' => $lampiranSk, 'komponen_sk' => $komponenSk, 'skl' => $skl, 'spl' => $spl, 'nilai_syarat_teknis' => $nilaiSyaratTeknis ]); return $pdf->download('Laporan_al_' . $pelaporan->perusahaan . '_' . $pelaporan->tahun . '_' . $pelaporan->periode . '.pdf'); } /** * Update nilai SPL */ private function _updateNilaiSpl($idPelaporan) { $allIpal = Ipal::getData($idPelaporan); $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 each 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' && $param->batasemisi) { 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++; } } } } } $totalParam = $jmlParam * 3; $melebihiBakuMutuEmisi = $totalParam - $memenuhiBakuMutu - $memenuhiBatasEmisi; $nilaiSpl = $totalParam ? 100 - (($melebihiBakuMutuEmisi / $totalParam) * 100) : 0; // Save or update nilai SPL $splAl = Ipal::getNilaiSpl($idPelaporan); if ($splAl) { $data = [ 'diuji' => $totalParam, 'melebihi' => $melebihiBakuMutuEmisi, 'nilaispl' => $nilaiSpl ]; Ipal::updateNilaiSpl($idPelaporan, $data); } else { $data = [ 'idmcpelaporan' => $idPelaporan, 'diuji' => $totalParam, 'melebihi' => $melebihiBakuMutuEmisi, 'nilaispl' => $nilaiSpl ]; Ipal::insertNilaiSpl($data); } } /** * Generate breadcrumb */ private function _generateBreadcrumb($module) { // Implementation of breadcrumb generation return ['Home' => route('home'), 'Pelaporan' => route('pelaporan.index')]; } /** * Check if report is editable */ private function _isEditable($idPelaporan, $module) { // Implementation to check if report is editable return Pelaporan::checkEditable($idPelaporan, $module); } /** * Get Ipal Komunal status */ private function _getIpalKomunalStatus($idPelaporan) { return Spl_AL::getStatusMcKomunal($idPelaporan); } /** * Check Lampiran SK */ private function _cekLampiranSk($idPelaporan, $skId) { return LampiranAL::cekLampiranSk($idPelaporan, $skId); } /** * Update status IPAL Komunal */ private function _updateStatusIpalKomunal($idPelaporan, $status) { // Update IPAL komunal status Spl_AL::updateStatusMcKomunal($idPelaporan, $status); // If connected to IPAL komunal and has SK if ($status == 'Iya') { $sk = Lampiran::getKomponenByKode('SK'); if ($sk) { $lampiranSk = $this->_cekLampiranSk($idPelaporan, $sk->id); if ($lampiranSk) { Pelaporan::updateNilaiSkl($idPelaporan, 2, 100); Pelaporan::updateAvgSkl($idPelaporan); Pelaporan::updateNilaiSpl($idPelaporan, 2, 100); Pelaporan::updateAvgSpl($idPelaporan); return; } } } // Otherwise, calculate regular SPL value $spl = Ipal::getNilaiSpl($idPelaporan); if ($spl) { Pelaporan::updateNilaiSpl($idPelaporan, 2, $spl->nilaispl); } else { Pelaporan::updateNilaiSpl($idPelaporan, 2, 0); } Pelaporan::updateAvgSpl($idPelaporan); } }