skl/app/Http/Controllers/Pelaporan/AL/ALController.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);
}
}