skl/app/Http/Controllers/Pelaporan/AL/IpalController.php

1319 lines
44 KiB
PHP

<?php
namespace App\Http\Controllers\Pelaporan\AL;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Pelaporan;
use App\Models\Spl_AL;
use App\Models\Ipal;
use App\Models\IpalParameter;
use App\Models\HasilUjiAL;
use App\Models\Komponen;
use App\Models\NilaiKomponen;
use App\Models\LampiranAL;
use App\Models\Pelaporan\Lampiran;
use Carbon\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
/**
* Controller untuk IPAL
*
* @author Beti Tuntari <beti.tuntari@gmail.com>
*/
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] ?? '';
}
}