525 lines
17 KiB
PHP
525 lines
17 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Pelaporan\AL;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Komponen;
|
|
use App\Models\Spl_AL;
|
|
use App\Models\Ipal;
|
|
use App\Models\IpalParameter;
|
|
use App\Models\HasilUjiAL;
|
|
use App\Models\LampiranAL;
|
|
use App\Models\NilaiKomponen;
|
|
use App\Models\PelaporanDate;
|
|
use App\Models\Catatan;
|
|
use App\Models\Pelaporan\Lampiran;
|
|
use App\Models\Pelaporan\Pelaporan;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Gate;
|
|
use Barryvdh\DomPDF\Facade\Pdf;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
/**
|
|
* Controller untuk Laporan Pengelolaan Air Limbah
|
|
*
|
|
* @author Muammar <official.muammar@gmail.com>
|
|
*/
|
|
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);
|
|
}
|
|
}
|