*/ class IpalController extends Controller { /** * Display a listing of IPAL data. * * @param int $idPelaporan * @return \Illuminate\Http\Response */ public function data($idPelaporan) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } // Load models and data $pelaporan = Pelaporan::findOrFail($idPelaporan); // Prepare data for view $data = [ 'PelaporanId' => $idPelaporan, 'NamaPerusahaan' => $pelaporan->perusahaan, 'Tahun' => $pelaporan->tahun, 'Periode' => $pelaporan->periode, 'Editable' => Pelaporan::checkEditable($idPelaporan, 'AL') && Gate::allows('pelaporan.edit'), ]; // Get IPAL komunal status $ipalKomunal = Spl_AL::getStatusMcKomunal($idPelaporan); $data['IpalKomunal'] = $ipalKomunal ? $ipalKomunal->tersambung : 'Tidak'; // Check if IPAL data exists and create from reference if not $dataIpal = Ipal::getData($idPelaporan); if (!$dataIpal) { $refIpal = Ipal::getRefIpal($pelaporan->idrefperusahaan); if ($refIpal) { foreach ($refIpal as $row) { $insertData = [ 'PelaporanId' => $idPelaporan, 'RefIpalId' => $row->id, 'Nomor' => $row->nomor, 'Nama' => $row->nama, 'Lampiran' => $row->lampiran, 'IzinTerbit' => $row->izin_terbit, 'IzinHabis' => $row->izin_habis, 'Sumber' => $row->sumber, 'Kapasitas' => $row->kapasitas, 'Teknologi' => $row->teknologi, 'BadanAir' => $row->badanair ]; Ipal::insertMcIpal($insertData); } } } return view('pelaporan.ipal.index', $data); } /** * Get data for datatable. * * @param int $idPelaporan * @return \Illuminate\Http\JsonResponse */ public function getData($idPelaporan) { $dataIpal = Ipal::getData($idPelaporan); $data = []; foreach ($dataIpal as $row) { $data[] = [ $row->nomor, $row->nama, 0, 0, 0, 0, $row->id ]; } $response = [ 'data' => $data, 'recordsTotal' => count($data) ]; return response()->json($response); } /** * Add new IPAL. * * @param int $idPelaporan * @param Request $request * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse */ public function addIpal(Request $request, $idPelaporan) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } if ($request->has('action')) { try { $pelaporan = Pelaporan::findOrFail($idPelaporan); $idrefperusahaan = $pelaporan->idrefperusahaan; if ($request->filled('nomor') && $request->filled('nama')) { DB::beginTransaction(); try { $dataRefIpal = [ 'PerusahaanId' => $idrefperusahaan, 'Nomor' => $request->input('nomor'), 'Nama' => $request->input('nama'), 'Lampiran' => '', 'IzinTerbit' => '0000-00-00', 'IzinHabis' => '0000-00-00', 'Sumber' => '', 'Kapasitas' => 0, 'Teknologi' => '', 'BadanAir' => '', 'IsPublish' => '0' ]; $idRefIpal = Ipal::insertRefIpal($dataRefIpal); $dataMcIpal = [ 'PelaporanId' => $idPelaporan, 'RefIpalId' => $idRefIpal, 'Nomor' => $request->input('nomor'), 'Nama' => $request->input('nama'), 'Lampiran' => '', 'IzinTerbit' => '0000-00-00', 'IzinHabis' => '0000-00-00', 'Sumber' => '', 'Kapasitas' => 0, 'Teknologi' => '', 'BadanAir' => '' ]; Ipal::insertMcIpal($dataMcIpal); $this->_updateRerataSyaratTeknis($idPelaporan); $this->_updateNilaiA6($idPelaporan); $this->_updateNilaiA7($idPelaporan); $this->_updateNilaiSpl($idPelaporan); if (!$this->_cekIpalKomunal($idPelaporan)) { $this->_updateNilaiSkl($idPelaporan); } // Log activity $perusahaan = Pelaporan::getPerusahaan($idrefperusahaan); $aktivitas = 'Pelaporan AL - ' . $perusahaan->nama . ' - Tahun ' . $pelaporan->tahun . ' - Periode ' . $pelaporan->periode . ' - Nama IPAL ' . $dataMcIpal['Nama']; DB::commit(); Log::info('LOG_CREATE', ['message' => $aktivitas, 'module' => 'pelaporan']); $response = ['message' => 'Data IPAL Berhasil Disimpan', 'status' => 'success']; return response()->json($response); } catch (\Exception $e) { DB::rollBack(); Log::error('Error adding IPAL: ' . $e->getMessage(), [ 'pelaporan_id' => $idPelaporan, 'module' => 'pelaporan' ]); $response = ['message' => 'Gagal menyimpan data IPAL: ' . $e->getMessage(), 'status' => 'error']; return response()->json($response); } } else { $response = ['message' => 'Nomor atau Nama IPAL belum diisi', 'status' => 'error']; return response()->json($response); } } catch (\Exception $e) { Log::error('Error processing IPAL request: ' . $e->getMessage(), [ 'pelaporan_id' => $idPelaporan, 'module' => 'pelaporan' ]); $response = ['message' => 'Terjadi kesalahan saat memproses data: ' . $e->getMessage(), 'status' => 'error']; return response()->json($response); } } else { $data['PelaporanId'] = $idPelaporan; return view('pelaporan.ipal.index', $data); } } /** * Edit IPAL. * * @param Request $request * @param int $idMcIpal * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse */ public function edit(Request $request, $idMcIpal) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } if ($request->has('action')) { if ($request->filled('nomor') && $request->filled('nama')) { $data = [ 'Nomor' => $request->input('Nomor'), 'Nama' => $request->input('nNama') ]; Ipal::editMcIpal($idMcIpal, $data); if ($request->has('ref_save')) { $idRefIpal = Ipal::getOneBy(['id' => $idMcIpal])->idrefipal; Ipal::editRefIpal($idRefIpal, $data); } // Log activity $idmcpelaporan = Ipal::getOneBy(['id' => $idMcIpal])->idmcpelaporan; $pelaporan = Pelaporan::findOrFail($idmcpelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $aktivitas = 'Pelaporan AL - ' . $perusahaan->nama . ' - Tahun ' . $pelaporan->tahun . ' - Periode ' . $pelaporan->periode . ' - Nama IPAL ' . $data['nama']; Log::info('LOG_EDIT', ['message' => $aktivitas, 'module' => 'pelaporan']); $response = ['message' => 'Data IPAL berhasil diubah', 'status' => 'success']; } else { $response = ['message' => 'Nomor atau Nama IPAL belum diisi', 'status' => 'error']; } return response()->json($response); } else { $dataIpal = Ipal::getOneBy(['id' => $idMcIpal]); $data = [ 'idmcipal' => $idMcIpal, 'nomor' => $dataIpal->nomor, 'nama' => $dataIpal->nama ]; return view('pelaporan.ipal.edit_ipal', $data); } } /** * Delete IPAL. * * @param Request $request * @param int $idMcIpal * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse */ public function delete(Request $request, $idMcIpal) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } if ($request->has('action')) { $idRefIpal = Ipal::getOneBy(['id' => $idMcIpal])->idrefipal; // Get data for logging $idmcpelaporan = Ipal::getOneBy(['id' => $idMcIpal])->idmcpelaporan; $pelaporan = Pelaporan::findOrFail($idmcpelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $namaIpal = Ipal::getOneBy(['id' => $idMcIpal])->nama; // Delete IPAL Ipal::deleteMcIpal($idMcIpal); if ($request->has('ref_delete')) { Ipal::disableRefIpal($idRefIpal); } // Delete IPAL parameters, hasil uji and lampiran IpalParameter::deleteMcIpalParam(['idmcipal' => $idMcIpal]); Ipal::deleteHasilUji(['idmcipal' => $idMcIpal]); Ipal::deleteLampiranHasilUji(['idmcipal' => $idMcIpal]); // Delete nilai komponen for syarat teknis Ipal::deleteNilaiKomponen(['idmcipal' => $idMcIpal]); // Delete lampiran for komponen syarat teknis Lampiran::deleteFile(['idmcipal' => $idMcIpal]); // Delete lampiran files $notAllowedChar = [' ', '.', '/', '-', ',', ':']; $noInduk = $perusahaan->nomorinduk; $tahun = $pelaporan->tahun; $periode = strtolower(str_replace($notAllowedChar, '_', $pelaporan->periode)); $urlLampiran = 'data_perusahaan/' . $noInduk . '/lampiran' . '/' . 'al' . '/' . $tahun . '_' . $periode . '/' . str_replace($notAllowedChar, '_', $namaIpal) . '/'; $this->_recursiveRmdir(storage_path('app/public/' . $urlLampiran)); // Update values $this->_updateRerataSyaratTeknis($idmcpelaporan); $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; Log::info('LOG_DELETE', ['message' => $aktivitas, 'module' => 'pelaporan']); $response = ['message' => 'Data IPAL berhasil dihapus', 'status' => 'success']; return response()->json($response); } else { $dataIpal = Ipal::getOneBy(['id' => $idMcIpal]); $data = [ 'idmcipal' => $idMcIpal, 'nomor' => $dataIpal->nomor, 'nama' => $dataIpal->nama ]; return view('pelaporan.ipal.delete_ipal', $data); } } /** * Edit persyaratan teknis. * * @param Request $request * @param int $idMcIpal * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse */ public function syaratTeknis(Request $request, $idMcIpal) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } $ipal = Ipal::getOneBy(['id' => $idMcIpal]); $idmcpelaporan = $ipal->idmcpelaporan; $pelaporan = Pelaporan::findOrFail($idmcpelaporan); $data = [ 'nama_ipal' => $ipal->nama, 'idmcipal' => $idMcIpal ]; if ($request->has('action')) { $dataHasil = $request->input('hasil'); if ($dataHasil) { foreach ($dataHasil as $refkomponen => $refhasil) { $nilai = Ipal::getNilaiByIdRefHasil($refhasil); $filter = [ 'idmcpelaporan' => $idmcpelaporan, 'idrefkomponen' => $refkomponen, 'idmcipal' => $idMcIpal ]; $dataUpdate = [ 'idrefhasil' => $refhasil, 'nilai' => $nilai ]; Ipal::updateNilaiSyaratTeknis($filter, $dataUpdate); } $this->_updateRerataSyaratTeknis($idmcpelaporan); $this->_updateNilaiSkl($idmcpelaporan); } $response = ['message' => 'Persyaratan Teknis berhasil Disimpan', 'status' => 'success']; return response()->json($response); } else { $idrefpelaporan = 2; $dataTable = Komponen::getDataRef($idrefpelaporan); unset($dataTable['data'][0]); unset($dataTable['data'][3]); $daftarKomponen = []; foreach ($dataTable['data'] as $key => $c) { foreach ($c['komponen'] as $kex => $x) { $daftarKomponen[] = $kex; } } $allNilaiKomponen = []; foreach ($daftarKomponen as $komponen) { $idkomponen = Ipal::getIdRefKomponen($komponen); $filterKomponen = [ 'idmcpelaporan' => $idmcpelaporan, 'idrefkomponen' => $idkomponen, 'idmcipal' => $idMcIpal ]; $nilaiKomponen = Ipal::getNilaiKomponen($filterKomponen); $allNilaiKomponen[$komponen] = $nilaiKomponen; } $data['nilai_komponen'] = $allNilaiKomponen; $data['rowspan_1'] = $dataTable['total_rows'] + 1; $data['data_table'] = $dataTable['data']; $data['idmcpelaporan'] = $idmcpelaporan; $data['idrefpelaporan'] = $idrefpelaporan; return view('pelaporan.ipal.syarat_teknis', $data); } } /** * Add data pendukung. * * @param Request $request * @param int $idMcIpal * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse */ public function addDataPendukung(Request $request, $idMcIpal) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } if ($request->has('action')) { $validator = Validator::make($request->all(), [ 'nomor' => 'required|string', 'lintang' => 'required|string', 'bujur' => 'required|string' ]); if ($validator->passes()) { $data = [ 'nomor' => $request->input('nomor'), 'izin_terbit' => $request->filled('izin_terbit') ? date('Y-m-d', strtotime($request->input('izin_terbit'))) : '0000-00-00', 'izin_habis' => $request->filled('izin_habis') ? date('Y-m-d', strtotime($request->input('izin_habis'))) : '0000-00-00', 'kapasitas' => $request->input('kapasitas'), 'sumber' => $request->input('sumber'), 'teknologi' => $request->input('teknologi'), 'badanair' => $request->input('badanair'), 'debit_maksimum' => $request->input('debitmax') == '' ? null : $request->input('debitmax'), 'lintang' => $request->input('lintang') == '' ? null : $request->input('lintang'), 'bujur' => $request->input('bujur') == '' ? null : $request->input('bujur') ]; $pathLampiran = ''; if ($request->hasFile('lampiran')) { $pathLampiran = $this->_uploadFile($idMcIpal, $request->file('lampiran')); if ($pathLampiran != 'max filesize exceeded') { $data['lampiran'] = $pathLampiran; } } Ipal::editMcIpal($idMcIpal, $data); if ($request->has('ref_save')) { $idRefIpal = Ipal::getOneBy(['id' => $idMcIpal])->idrefipal; Ipal::editRefIpal($idRefIpal, $data); } // Log activity $idmcpelaporan = Ipal::getOneBy(['id' => $idMcIpal])->idmcpelaporan; $pelaporan = Pelaporan::findOrFail($idmcpelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $namaIpal = Ipal::getOneBy(['id' => $idMcIpal])->nama; $aktivitas = 'Pelaporan AL - ' . $perusahaan->nama . ' - Tahun ' . $pelaporan->tahun . ' - Periode ' . $pelaporan->periode . ' - Data Pendukung IPAL ' . $namaIpal; Log::info('LOG_EDIT', ['message' => $aktivitas, 'module' => 'pelaporan']); if ($pathLampiran == 'max filesize exceeded') { $response = ['message' => 'Ukuran file lampiran melebihi 20 MB. Lampiran tidak tersimpan.', 'status' => 'error']; } else { $response = ['message' => 'Berhasil menambah data pendukung', 'status' => 'success']; } return response()->json($response); } else { return response()->json([ 'error' => [ 'type' => 'validation', 'messages' => $validator->errors() ] ]); } } else { $ipal = Ipal::getOneBy(['id' => $idMcIpal]); $data = [ 'nama_lampiran' => '', 'data_ipal' => $ipal, 'idmcipal' => $idMcIpal ]; if ($ipal) { $lampiranPath = $ipal->lampiran; if ($lampiranPath && File::exists(public_path($lampiranPath))) { $listLampiranPath = explode('/', $lampiranPath); $namaLampiran = end($listLampiranPath); $data['nama_lampiran'] = $namaLampiran; $data['url_lampiran'] = url($lampiranPath); $data['ukuran_lampiran'] = $this->_formatBytes(File::size(public_path($lampiranPath))); } } return view('pelaporan.ipal.add_data_pendukung', $data); } } /** * Delete lampiran data pendukung. * * @param Request $request * @param int $idMcIpal * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse */ public function deleteLampiranDataPendukung(Request $request, $idMcIpal) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } $data['idmcipal'] = $idMcIpal; if ($request->has('action')) { $dataIpal = Ipal::getOneBy(['id' => $idMcIpal]); Ipal::editMcIpal($idMcIpal, ['lampiran' => '']); if ($request->has('ref_delete')) { $idRefIpal = Ipal::getOneBy(['id' => $idMcIpal])->idrefipal; Ipal::editRefIpal($idRefIpal, ['lampiran' => '']); } $response = ['message' => 'Lampiran data pendukung berhasil dihapus', 'status' => 'success']; return response()->json($response); } else { return view('pelaporan.ipal.delete_lampiran_data_pendukung', $data); } } /** * Show hasil uji form. * * @param int $idMcIpal * @return \Illuminate\Http\Response */ public function hasilUji($idMcIpal) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } $ipal = Ipal::getOneBy(['id' => $idMcIpal]); $pelaporan = Pelaporan::findOrFail($ipal->idmcpelaporan); $data = [ 'idmcipal' => $idMcIpal, 'nama_ipal' => $ipal->nama ]; $listParam = IpalParameter::getData($idMcIpal); $nilaiHasilUji = []; $bebanEmisi = []; foreach ($listParam as $row) { $nilai = Ipal::getNilaiHasilUji($pelaporan->idrefperusahaan, $pelaporan->tahun, $row->idrefipal_parameter); $hasilUji = []; $bebanEmisiParameter = []; if ($row->bakumutu_nilai2) { $bakumutu = $row->bakumutu_nilai1 . ' - ' . $row->bakumutu_nilai2; } else { $bakumutu = $row->bakumutu_nilai1; } $hasilUji = []; $hasilUji['bakumutu'] = $bakumutu; foreach ($nilai as $item) { $hasilUji[$item->bulan] = $item->nilai; $bebanEmisiParameter[$item->bulan] = $item->bebanemisi; } $nilaiHasilUji[$row->id] = $hasilUji; $bebanEmisi[$row->id] = $bebanEmisiParameter; } $lampiranExists = []; $debit = []; for ($i = 1; $i <= 12; $i++) { $allLampiran = Ipal::getLampiranHasilUji([ 'b.idrefipal' => $ipal->idrefipal, 'a.idrefperusahaan' => $pelaporan->idrefperusahaan, 'a.bulan' => $this->_mcMonth($i), 'a.tahun' => $pelaporan->tahun ]); $lampiranExists[$i-1] = false; if ($allLampiran) { foreach ($allLampiran as $lampiran) { if (File::exists($lampiran->dokumen)) { $lampiranExists[$i-1] = true; break; } } } $debit[$i] = Ipal::getDebitBy([ 'b.idrefipal' => $ipal->idrefipal, 'a.idrefperusahaan' => $pelaporan->idrefperusahaan, 'a.bulan' => $this->_mcMonth($i), 'a.tahun' => $pelaporan->tahun ]); } $data['periode'] = $pelaporan->idrefperiodepelaporan; $data['tahun'] = $pelaporan->tahun; $data['params'] = $listParam; $data['hasiluji'] = $nilaiHasilUji; $data['bebanemisi'] = $bebanEmisi; $data['lampiran'] = $lampiranExists; $data['debit'] = $debit; $data['debitmax'] = $ipal->debit_maksimum ? $ipal->debit_maksimum : 0; $hasilUjiEmpty = true; if ($ipal && $ipal->lintang && $ipal->bujur) { $hasilUjiEmpty = false; } $data['hasil_uji_empty'] = $hasilUjiEmpty; return view('pelaporan.ipal.hasil_uji', $data); } /** * Save hasil uji. * * @param Request $request * @param int $idMcIpal * @return \Illuminate\Http\JsonResponse */ public function saveHasilUji(Request $request, $idMcIpal) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } $ipal = Ipal::getOneBy(['id' => $idMcIpal]); $periode = Pelaporan::findOrFail($ipal->idmcpelaporan)->idrefperiodepelaporan; $params = Ipal::getNamaParam($idMcIpal); $bulanAwal = (($periode - 1) * 3) + 1; $nilaiParam = $request->input('param'); $debit = $request->input('debit'); $nilaiExist = false; foreach ($params as $row) { for ($i = 0; $i < 3; $i++) { $bulan = $bulanAwal + $i; $nilai = null; if (isset($nilaiParam[$row->id][$bulan]) && $nilaiParam[$row->id][$bulan] != '') { $nilai = $nilaiParam[$row->id][$bulan]; $nilaiExist = true; } $bebanEmisi = null; if ($nilai !== null && is_numeric($nilai) && isset($debit[$bulan]) && $debit[$bulan] && $row->batasemisi !== null) { $bebanEmisi = ($debit[$bulan] * $nilai) / 1000; } $data = [ 'nilai' => $nilai, 'debit' => (isset($debit[$bulan]) && $debit[$bulan] != '') ? $debit[$bulan] : null, 'bebanemisi' => $bebanEmisi ]; Ipal::updateHasilUji($row->id, $this->_mcMonth($bulan), $data); } } $this->_updateNilaiA6($ipal->idmcpelaporan); $this->_updateNilaiA7($ipal->idmcpelaporan); $this->_updateNilaiSpl($ipal->idmcpelaporan); if (!$this->_cekIpalKomunal($ipal->idmcpelaporan)) { $this->_updateNilaiSkl($ipal->idmcpelaporan); } // Update mcverifikasi table if ($nilaiExist) { $filter = [ 'idmcpelaporan' => $ipal->idmcpelaporan, 'idrefpelaporan' => 2 ]; $dataUpdate = [ 'verifikasi' => 1, 'tanggal' => now()->format('Y-m-d H:i:s'), 'oleh' => Auth::id() ]; Pelaporan::updateStatusVerifikasi($filter, $dataUpdate); } // Log activity $idmcpelaporan = Ipal::getOneBy(['id' => $idMcIpal])->idmcpelaporan; $pelaporan = Pelaporan::findOrFail($idmcpelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $namaIpal = $ipal->nama; $aktivitas = 'Pelaporan AL - ' . $perusahaan->nama . ' - Tahun ' . $pelaporan->tahun . ' - Periode ' . $pelaporan->periode . ' - Nama IPAL ' . $namaIpal . ' - Data Hasil Uji Lab'; Log::info('LOG_EDIT', ['message' => $aktivitas, 'module' => 'pelaporan']); $response = ['message' => 'Data Hasil Uji Berhasil Disimpan', 'status' => 'success']; return response()->json($response); } /** * Check lampiran hasil uji. * * @param int $idMcIpal * @param int $bulan * @return \Illuminate\Http\JsonResponse */ public function cekLampiranHasilUji($idMcIpal, $bulan) { $ipal = Ipal::getOneBy(['id' => $idMcIpal]); $pelaporan = Pelaporan::findOrFail($ipal->idmcpelaporan); $idrefperusahaan = $pelaporan->idrefperusahaan; $allLampiran = Ipal::getLampiranHasilUji([ 'a.idmcipal' => $idMcIpal, 'a.idrefperusahaan' => $idrefperusahaan, 'a.bulan' => $this->_mcMonth($bulan) ]); $response = ['lampiran' => false]; if ($allLampiran) { foreach ($allLampiran as $lampiran) { if (File::exists($lampiran->dokumen)) { $response['lampiran'] = true; break; } } } return response()->json($response); } /** * Synchronize IPAL data. * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function sinkronisasiIpal(Request $request) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } $idmcpelaporan = $request->input('id'); $allIpal = Ipal::getData($idmcpelaporan); $pelaporan = Pelaporan::findOrFail($idmcpelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $allRefIpal = Ipal::getRefIpal($pelaporan->idrefperusahaan); // Delete all mcipal $notAllowedChar = [' ', '.', '/', '-', ',', ':']; $noInduk = $perusahaan->nomorinduk; $tahun = $pelaporan->tahun; $periode = strtolower(str_replace($notAllowedChar, '_', $pelaporan->periode)); $bulanAwal = (($pelaporan->idrefperiodepelaporan - 1) * 3) + 1; foreach ($allIpal as $ipal) { $idmcipal = $ipal->id; // Delete ipal parameter, nilai hasiluji dan lampiran hasil uji IpalParameter::deleteMcIpalParam(['idmcipal' => $idmcipal]); Ipal::deleteHasilUji(['idmcipal' => $idmcipal]); Ipal::deleteLampiranHasilUji(['idmcipal' => $idmcipal]); // Delete nilai komponen-komponen syarat teknis Ipal::deleteNilaiKomponen(['idmcipal' => $idmcipal]); // Delete lampiran komponen-komponen syarat teknis Lampiran::deleteFile(['idmcipal' => $idmcipal]); // Delete lampiran files $namaIpal = Ipal::getOneBy(['id' => $idmcipal])->nama; $urlLampiran = 'data_perusahaan/' . $noInduk . '/lampiran' . '/' . 'al' . '/' . $tahun . '_' . $periode . '/' . str_replace($notAllowedChar, '_', $namaIpal) . '/'; $this->_recursiveRmdir(storage_path('app/public/' . $urlLampiran)); Ipal::deleteMcIpal($idmcipal); } // Add mcipal from refipal $allRefIpal = Ipal::getRefIpal($pelaporan->idrefperusahaan); foreach ($allRefIpal as $refipal) { // Add ipal $insertData = [ 'idmcpelaporan' => $idmcpelaporan, 'idrefipal' => $refipal->id, 'nomor' => $refipal->nomor, 'nama' => $refipal->nama, 'lampiran' => $refipal->lampiran, 'izin_terbit' => $refipal->izin_terbit, 'izin_habis' => $refipal->izin_habis, 'sumber' => $refipal->sumber, 'kapasitas' => $refipal->kapasitas, 'teknologi' => $refipal->teknologi, 'badanair' => $refipal->badanair ]; $idmcipal = Ipal::insertMcIpal($insertData); // Add parameter ipal $refipalParam = IpalParameter::getRefIpalParam($refipal->id); foreach ($refipalParam as $row) { $dataMcIpalParam = [ 'idmcipal' => $idmcipal, 'idrefipal_parameter' => $row->id, 'nama' => $row->nama, 'satuan' => $row->satuan, 'bakumutu_jenis' => $row->bakumutu_jenis, 'bakumutu_nilai1' => $row->bakumutu_nilai1, 'bakumutu_nilai2' => $row->bakumutu_nilai2, 'batasemisi' => $row->batasemisi ]; $idmcipalParam = IpalParameter::insertMcIpalParam($dataMcIpalParam); // Insert data to mchasiluji_al $dataHasilUji = []; for ($i = 0; $i < 3; $i++) { $dataHasilUji[] = [ 'idmcipal' => $idmcipal, 'tahun' => $pelaporan->tahun, 'idrefperusahaan' => $pelaporan->idrefperusahaan, 'idmcipal_parameter' => $idmcipalParam, 'bulan' => $this->_mcMonth($bulanAwal + $i) ]; } Ipal::insertHasilUji($dataHasilUji); } } $this->_updateRerataSyaratTeknis($idmcpelaporan); $this->_updateNilaiA6($idmcpelaporan); $this->_updateNilaiA7($idmcpelaporan); $this->_updateNilaiSpl($idmcpelaporan); if (!$this->_cekIpalKomunal($idmcpelaporan)) { $this->_updateNilaiSkl($idmcpelaporan); } $response = ['message' => 'Sinkronisasi Berhasil', 'status' => 'success']; return response()->json($response); } /** * 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; } $nilaiA6 = count($allIpal) ? $jmlNilaiIpal / count($allIpal) : 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) { $nilaiA7 = Ipal::getNilaiA7($idmcpelaporan); $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' && $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; 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 && $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); } /** * Update rerata syarat teknis. * * @param int $idmcpelaporan * @return void */ private function _updateRerataSyaratTeknis($idmcpelaporan) { $daftarKomponen = ['A1', 'A2', 'A3', 'A4', 'A5']; foreach ($daftarKomponen as $komponen) { $idkomponen = Ipal::getIdRefKomponen($komponen); // Calculate average for each component $nilaiKomponen = Ipal::getNilaiSyaratTeknis([ 'idmcpelaporan' => $idmcpelaporan, 'idrefkomponen' => $idkomponen, 'idmcipal !=' => null ]); $jmlNilai = 0; foreach ($nilaiKomponen as $row) { $jmlNilai += $row->nilai; } $jmlIpal = count(Ipal::getData($idmcpelaporan)); $rerataNilai = $jmlIpal ? $jmlNilai / $jmlIpal : 0; // Update average for each component $filter = [ 'idmcpelaporan' => $idmcpelaporan, 'idrefkomponen' => $idkomponen, 'idmcipal' => null ]; $dataUpdate = [ 'idrefhasil' => 0, 'nilai' => $rerataNilai ]; Ipal::updateNilaiSyaratTeknis($filter, $dataUpdate); } } /** * Upload file. * * @param int $idMcIpal * @param \Illuminate\Http\UploadedFile $file * @return string */ private function _uploadFile($idMcIpal, $file) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } $dataIpal = Ipal::getOneBy(['id' => $idMcIpal]); $pelaporan = Pelaporan::findOrFail($dataIpal->idmcpelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $notAllowedChar = [' ', '.', '/', '-', ',', ':']; $noInduk = $perusahaan->nomorinduk; $tahun = $pelaporan->tahun; $periode = strtolower(str_replace($notAllowedChar, '_', $pelaporan->periode)); $noIpal = $dataIpal->nomor; $dirUpload = 'data_perusahaan/' . $noInduk . '/lampiran' . '/' . 'al' . '/' . 'A6' . '/' . $tahun . '_' . $periode . '/data_pendukung' . '/' . $noIpal . '/'; // Create directory if it doesn't exist if (!Storage::disk('public')->exists($dirUpload)) { Storage::disk('public')->makeDirectory($dirUpload, 0777, true); } $filesize = $file->getSize(); // If filesize > 20 MB if ($filesize / pow(1024, 2) > 20) { return 'max filesize exceeded'; } $name = $file->getClientOriginalName(); $ext = $file->getClientOriginalExtension(); $baseName = pathinfo($name, PATHINFO_FILENAME); $newName = $baseName . '_' . date('Ymd_His') . '.' . $ext; // Delete old file if exists if ($dataIpal->lampiran && Storage::disk('public')->exists($dataIpal->lampiran)) { Storage::disk('public')->delete($dataIpal->lampiran); } // Store new file $path = $file->storeAs($dirUpload, $newName, 'public'); return $path; } /** * Recursively remove directory. * * @param string $dir * @return void */ private function _recursiveRmdir($dir) { if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { if (filetype($dir . "/" . $object) == "dir") { $this->_recursiveRmdir($dir . "/" . $object); } else { unlink($dir . "/" . $object); } } } reset($objects); rmdir($dir); } } /** * Format bytes to human readable format. * * @param int $bytes * @param int $precision * @return string */ private function _formatBytes($bytes, $precision = 2) { $units = ['B', 'KB', 'MB', 'GB', 'TB']; $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1); $bytes /= pow(1024, $pow); return round($bytes, $precision) . ' ' . $units[$pow]; } /** * 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] ?? ''; } }