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

747 lines
25 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\Ipal;
use App\Models\IpalParameter;
use App\Models\Spl_AL;
use App\Models\NilaiKomponen;
use App\Models\Pelaporan\Lampiran;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Gate;
use Carbon\Carbon;
/**
* Controller untuk Parameter Laporan Pengelolaan Air Limbah
*
* @author Muammar <official.muammar@gmail.com>
*/
class IpalParameterController extends Controller
{
/**
* Display parameter table
*
* @param int $idMcIpal
* @return \Illuminate\Http\Response
*/
public function table($idMcIpal)
{
// Check authorization
if (!Gate::allows('pelaporan.view')) {
abort(403);
}
// Get IPAL data
$ipal = Ipal::getOneBy(['IpalId' => $idMcIpal]);
$data = [
'IpalId' => $idMcIpal,
'NamaIpal' => $ipal->nama
];
// If mcipal_parameter is empty, fill it based on refipal_parameter
$parameter = IpalParameter::getOneBy(['IpalId' => $idMcIpal]);
if (!$parameter) {
$refIpalParam = IpalParameter::getRefIpalParam($ipal->idrefipal);
if ($refIpalParam) {
foreach ($refIpalParam as $row) {
$dataMcIpalParam = [
'IpalId' => $idMcIpal,
'RefIpalParameterId' => $row->id,
'Nama' => $row->nama,
'Satuan' => $row->satuan,
'BakuMutuJenis' => $row->bakumutu_jenis,
'BakuMutuNilai1' => $row->bakumutu_nilai1,
'BakuMutuNilai2' => $row->bakumutu_nilai2,
'BatasEmisi' => $row->batasemisi
];
$idMcIpalParam = IpalParameter::insertMcIpalParam($dataMcIpalParam);
// Insert data to mchasiluji_al
$this->_insertHasilUji($idMcIpal, $idMcIpalParam);
}
$this->_updateNilaiA6($ipal->idmcpelaporan);
$this->_updateNilaiA7($ipal->idmcpelaporan);
$this->_updateNilaiSpl($ipal->idmcpelaporan);
if (!$this->_cekIpalKomunal($ipal->idmcpelaporan)) {
$this->_updateNilaiSkl($ipal->idmcpelaporan);
}
}
}
return view('pelaporan.ipal.parameter.index', $data);
}
/**
* Function to get data for datatable
*
* @param int $idMcIpal
* @return \Illuminate\Http\JsonResponse
*/
public function getData($idMcIpal)
{
$dataParameter = IpalParameter::getData($idMcIpal);
$data = [];
$no = 1;
foreach ($dataParameter as $row) {
if ($row->bakumutu_nilai2) {
$bakumutu = $row->bakumutu_nilai1 . ' - ' . $row->bakumutu_nilai2;
} else {
$bakumutu = $row->bakumutu_nilai1;
}
$data[] = [
$no,
$row->nama,
$row->satuan,
$bakumutu,
($row->batasemisi != NULL ? floatval($row->batasemisi) : ''),
$row->id
];
$no++;
}
$response = [
'data' => $data,
'recordsTotal' => count($data)
];
return response()->json($response);
}
/**
* Function to add new parameter
*
* @param int $idMcIpal
* @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
*/
public function add(Request $request, $idMcIpal)
{
// Check authorization
if (!Gate::allows('pelaporan.edit')) {
abort(403);
}
if ($request->has('action')) {
$response = $this->_insertUpdate($idMcIpal, 'insert', $request);
$ipal = Ipal::getOneBy(['IpalId' => $idMcIpal]);
$this->_updateNilaiA6($ipal->idmcpelaporan);
$this->_updateNilaiA7($ipal->idmcpelaporan);
$this->_updateNilaiSpl($ipal->idmcpelaporan);
if (!$this->_cekIpalKomunal($ipal->idmcpelaporan)) {
$this->_updateNilaiSkl($ipal->idmcpelaporan);
}
return response()->json($response);
}
$data['IpalId'] = $idMcIpal;
return view('pelaporan.ipal.parameter.add', $data);
}
/**
* Function to edit parameter
*
* @param Request $request
* @param int $idMcIpalParam
* @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
*/
public function edit(Request $request, $idMcIpalParam)
{
// Check authorization
if (!Gate::allows('pelaporan.edit')) {
abort(403);
}
if ($request->has('action')) {
$response = $this->_insertUpdate($idMcIpalParam, 'update', $request);
return response()->json($response);
} else {
$data['param'] = IpalParameter::getOneBy(['id' => $idMcIpalParam]);
return view('pelaporan.ipal.parameter.edit', $data);
}
}
/**
* Function to delete parameter
*
* @param Request $request
* @param int $idMcIpalParam
* @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
*/
public function delete(Request $request, $idMcIpalParam)
{
// Check authorization
if (!Gate::allows('pelaporan.edit')) {
abort(403);
}
if ($request->has('action')) {
$idRefIpalParam = IpalParameter::getOneBy(['id' => $idMcIpalParam])->idrefipal_parameter;
// Data for logging
$ipalParameter = IpalParameter::getOneBy(['id' => $idMcIpalParam]);
$idMcIpal = $ipalParameter->idmcipal;
$idMcPelaporan = Ipal::getOneBy(['id' => $idMcIpal])->idmcpelaporan;
$pelaporan = Pelaporan::findOrFail($idMcPelaporan);
$perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan);
$namaIpal = Ipal::getOneBy(['id' => $idMcIpal])->nama;
$namaIpalParameter = $ipalParameter->nama;
// Delete ipal parameter and hasiluji from database
IpalParameter::deleteMcIpalParam(['id' => $idMcIpalParam]);
Ipal::deleteHasilUji(['idmcipal_parameter' => $idMcIpalParam]);
if ($request->input('ref_delete')) {
IpalParameter::disableRefIpalParam($idRefIpalParam);
}
$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 . ' - Parameter Uji Lab ' .
$namaIpalParameter;
Log::info('LOG_DELETE', ['message' => $aktivitas, 'module' => 'pelaporan']);
$response = ['message' => 'Parameter Berhasil Dihapus', 'status' => 'success'];
return response()->json($response);
} else {
$param = IpalParameter::getOneBy(['id' => $idMcIpalParam]);
$ipal = Ipal::getOneBy(['id' => $param->idmcipal]);
$data = [
'idmcipal_param' => $idMcIpalParam,
'nomor_ipal' => $ipal->nomor,
'nama_ipal' => $ipal->nama,
'nama_param' => $param->nama
];
return view('pelaporan.ipal.parameter.delete', $data);
}
}
/**
* Function to insert into or update table mcipal_parameter and refipal_parameter
*
* @param int $id if insert then $id = $idmcipal if update then $id = $idmcipal_parameter
* @param string $action insert or update
* @param Request $request
* @return array $response
*/
private function _insertUpdate($id, $action, Request $request)
{
$post = $request->all();
if ($post['nama'] !== "" && $post['satuan'] !== "") {
if ($post['bakumutu'] == 1) {
$bakumutuJenis = 'Angka Tunggal';
$bakumutuNilai1 = $post['angka_tunggal'];
$bakumutuNilai2 = '';
if (!is_numeric($bakumutuNilai1)) {
$response = ['message' => 'Data belum lengkap', 'status' => 'error'];
return $response;
}
if (!(isset($post['batasemisi']) && $post['batasemisi'])) {
$response = ['message' => 'Beban pencemaran maksimum wajib diisi', 'status' => 'error'];
return $response;
}
} else if ($post['bakumutu'] == 2) {
$bakumutuJenis = 'Rentang Angka';
$bakumutuNilai1 = $post['nilai1'];
$bakumutuNilai2 = $post['nilai2'];
if (!(is_numeric($bakumutuNilai1) && is_numeric($bakumutuNilai2))) {
$response = ['message' => 'Data belum lengkap', 'status' => 'error'];
return $response;
}
if (!(isset($post['batasemisi']) && $post['batasemisi'])) {
$response = ['message' => 'Beban pencemaran maksimum wajib diisi', 'status' => 'error'];
return $response;
}
} else if ($post['bakumutu'] == 3) {
$bakumutuJenis = 'Positif/Negatif';
$bakumutuNilai1 = $post['bakumutu_3'];
$bakumutuNilai2 = '';
if (!$bakumutuNilai1) {
$response = ['message' => 'Data belum lengkap', 'status' => 'error'];
return $response;
}
} else if ($post['bakumutu'] == 4) {
$bakumutuJenis = 'Tanpa Baku Mutu';
$bakumutuNilai1 = '-';
$bakumutuNilai2 = '';
}
$dataRefIpalParam = [
'nama' => $post['nama'],
'satuan' => $post['satuan'],
'bakumutu_jenis' => $bakumutuJenis,
'bakumutu_nilai1' => $bakumutuNilai1,
'bakumutu_nilai2' => $bakumutuNilai2,
'batasemisi' => (($post['bakumutu'] == 3 || $post['batasemisi'] === '') ? NULL : $post['batasemisi'])
];
$dataMcIpalParam = $dataRefIpalParam;
if ($action == 'insert') {
$idRefIpal = Ipal::getOneBy(['id' => $id])->idrefipal;
$dataRefIpalParam['idrefipal'] = $idRefIpal;
$dataRefIpalParam['del'] = 'n';
$idRefIpalParam = IpalParameter::insertRefIpalParam($dataRefIpalParam);
$dataMcIpalParam['idmcipal'] = $id;
$dataMcIpalParam['idrefipal_parameter'] = $idRefIpalParam;
$idMcIpalParam = IpalParameter::insertMcIpalParam($dataMcIpalParam);
// Insert data to mchasiluji_al
$this->_insertHasilUji($id, $idMcIpalParam);
// Log activity
$idMcPelaporan = Ipal::getOneBy(['id' => $id])->idmcpelaporan;
$pelaporan = Pelaporan::findOrFail($idMcPelaporan);
$perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan);
$namaIpal = Ipal::getOneBy(['id' => $id])->nama;
$namaIpalParameter = $dataMcIpalParam['nama'];
$aktivitas = 'Pelaporan AL - ' . $perusahaan->nama . ' - Tahun ' . $pelaporan->tahun . ' - Periode ' .
$pelaporan->periode . ' - Nama IPAL ' . $namaIpal . ' - Parameter Uji Lab ' .
$namaIpalParameter;
Log::info('LOG_CREATE', ['message' => $aktivitas, 'module' => 'pelaporan']);
} elseif ($action == 'update') {
IpalParameter::updateMcIpalParam($id, $dataMcIpalParam);
if (isset($post['ref_save'])) {
$idRefIpalParam = IpalParameter::getOneBy(['id' => $id])->idrefipal_parameter;
IpalParameter::updateRefIpalParam($idRefIpalParam, $dataRefIpalParam);
}
// Log activity
$ipalParameter = IpalParameter::getOneBy(['id' => $id]);
$idMcIpal = $ipalParameter->idmcipal;
$idMcPelaporan = Ipal::getOneBy(['id' => $idMcIpal])->idmcpelaporan;
$pelaporan = Pelaporan::findOrFail($idMcPelaporan);
$perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan);
$namaIpal = Ipal::getOneBy(['id' => $idMcIpal])->nama;
$namaIpalParameter = $ipalParameter->nama;
$aktivitas = 'Pelaporan AL - ' . $perusahaan->nama . ' - Tahun ' . $pelaporan->tahun . ' - Periode ' .
$pelaporan->periode . ' - Nama IPAL ' . $namaIpal . ' - Parameter Uji Lab ' .
$namaIpalParameter;
Log::info('LOG_EDIT', ['message' => $aktivitas, 'module' => 'pelaporan']);
}
$response = ['message' => 'Parameter Berhasil Disimpan', 'status' => 'success'];
} else {
$response = ['message' => 'Data belum lengkap', 'status' => 'error'];
}
return $response;
}
/**
* Insert hasil uji for new parameter
*
* @param int $idMcIpal
* @param int $idMcIpalParam
* @return void
*/
private function _insertHasilUji($idMcIpal, $idMcIpalParam)
{
$ipal = Ipal::getOneBy(['id' => $idMcIpal]);
$pelaporan = Pelaporan::findOrFail($ipal->idmcpelaporan);
$dataHasilUji = [];
$bulan = 0;
if ($pelaporan->idrefperiodepelaporan == 1) {
$bulan = 1;
} elseif ($pelaporan->idrefperiodepelaporan == 2) {
$bulan = 4;
} elseif ($pelaporan->idrefperiodepelaporan == 3) {
$bulan = 7;
} elseif ($pelaporan->idrefperiodepelaporan == 4) {
$bulan = 10;
}
for ($i = 0; $i < 3; $i++) {
$dataHasilUji[] = [
'idmcipal' => $idMcIpal,
'tahun' => $pelaporan->tahun,
'idrefperusahaan' => $pelaporan->idrefperusahaan,
'idmcipal_parameter' => $idMcIpalParam,
'bulan' => $this->_mcMonth($bulan)
];
$bulan++;
}
Ipal::insertHasilUji($dataHasilUji);
}
/**
* 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;
}
if (count($allIpal)) {
$nilaiA6 = $jmlNilaiIpal / count($allIpal);
} else {
$nilaiA6 = 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)
{
$pelaporan = Pelaporan::findOrFail($idMcPelaporan);
$allIpal = Ipal::getData($idMcPelaporan);
$periode = $pelaporan->idrefperiodepelaporan;
$bulanAwal = (($periode - 1) * 3) + 1;
$jmlNilaiIpal = 0;
foreach ($allIpal as $row) {
$jmlNilaiParam = 0;
$params = IpalParameter::getData($row->id);
$tambahNilai = false;
for ($i = 0; $i < 3; $i++) {
foreach ($params as $param) {
$filter = [
'idmcipal_parameter' => $param->id,
'bulan' => $this->_mcMonth($bulanAwal + $i)
];
$hasilUji = Ipal::getHasilUjiBy($filter);
$tambahNilai = false;
if ($hasilUji->nilai) {
if ($hasilUji->nilai == '*') {
$tambahNilai = true;
} elseif ($hasilUji->debit != NULL && $param->bakumutu_jenis != 'Positif/Negatif') {
if ($hasilUji->bebanemisi > $param->batasemisi) {
$tambahNilai = false;
break;
} else {
$tambahNilai = true;
}
} else {
if ($param->bakumutu_jenis == 'Angka Tunggal') {
if ($hasilUji->nilai > $param->bakumutu_nilai1) {
$tambahNilai = false;
break;
}
} elseif ($param->bakumutu_jenis == 'Rentang Angka') {
if ($hasilUji->nilai < $param->bakumutu_nilai1 || $hasilUji->nilai > $param->bakumutu_nilai2) {
$tambahNilai = false;
break;
}
} elseif ($param->bakumutu_jenis == 'Positif/Negatif') {
if (strtolower($hasilUji->nilai) != strtolower($param->bakumutu_nilai1)) {
$tambahNilai = false;
break;
}
}
$tambahNilai = true;
}
} else {
$tambahNilai = false;
break;
}
}
if ($tambahNilai) {
$jmlNilaiParam += 100;
}
}
$nilaiIpal = $jmlNilaiParam / 3;
$jmlNilaiIpal += $nilaiIpal;
}
if (count($allIpal)) {
$nilaiA7 = $jmlNilaiIpal / count($allIpal);
} else {
$nilaiA7 = 0;
}
$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') {
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++;
}
} elseif ($param->bakumutu_jenis == 'Tanpa Baku Mutu') {
$memenuhiBakumutu++;
}
}
}
}
$totalParam = $jmlParam * 3;
$melebihiBakumutuEmisi = $totalParam - $memenuhiBakumutu - $memenuhiBatasEmisi;
if ($totalParam) {
$nilaiSpl = 100 - (($melebihiBakumutuEmisi / $totalParam) * 100);
} else {
$nilaiSpl = 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) {
if ($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);
}
/**
* 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] ?? '';
}
}