sigd/app/Services/Emisi/Waste4B1Service.php

145 lines
4.4 KiB
PHP

<?php
namespace App\Services\Emisi;
use App\Models\ActivityCrf;
use App\Models\ActivityForm;
use App\Models\ActivityFormDetail;
use App\Models\ReferenceEf;
use App\Models\Waste4B1;
use App\Services\SigdCrudService;
class Waste4B1Service extends SigdCrudService
{
private $sectorCode = 'waste';
private $formCode = 'sampah';
public function __construct(Waste4B1 $model)
{
$this->model = $model;
}
public function save($code, $inventoryYear)
{
try {
$dataBatch = [];
$ws = $this->getWs($code);
$years = activityYearRange($inventoryYear);
if ($ws && class_basename($ws->model) == 'Waste4B1') {
foreach ($years as $year) {
$dataBatch = array_merge($dataBatch, $this->calcAndSave($inventoryYear, $year, $ws));
}
} else {
throw new \Exception("Forbidden");
}
return $dataBatch;
} catch (\Exception $e) {
throw $e;
}
}
private function getKomposBasedOnInventoryYear($inventoryYear, $activityYear)
{
$form = ActivityForm::where('inventory_year', $inventoryYear)
->where('sector', 'waste')->where('form_code', 'pengelolaan_sampah')->whereNull('agency_id')
->rowActive()->first();
if ($form) {
$activityFormDetail = ActivityFormDetail::where('form_id', $form->id)
->where('activity_year', $activityYear)
->where('activity_code', 'kompos')
->rowActive()
->first();
return $activityFormDetail ? $activityFormDetail->activity_value : 0;
}
return 0;
}
public function calcAndSave($inventoryYear, $activityYear, $ws)
{
// Initialize variables
$dataForms = [];
$sector = $this->sectorCode;
$code = $this->formCode;
$wsCode = $ws->ws_code;
try {
$activity = 'timbulan_sampah';
$value = ActivityFormDetail::getValue($inventoryYear, $activityYear, $sector, $code, $activity);
$kompos = $this->getKomposBasedOnInventoryYear($inventoryYear, $activityYear);
$num_waste = $value / 1000 * $kompos / 100;
$ef = ReferenceEf::getValue($activity, 'ef_ch4', 'kompos');
$ch4 = $num_waste * 0.5053375 * $ef / 1000;
$ch4_recovery = 0.00;
$ch4_final = $ch4 - $ch4_recovery;
$no = 1;
$dataForm = [
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'activity_code' => $activity,
'category' => $wsCode,
'value' => $value,
'kompos' => $kompos,
'num_waste' => $num_waste,
'ef' => $ef,
'ch4' => $ch4,
'ch4_recovery' => $ch4_recovery,
'ch4_final' => $ch4_final,
'row_num' => $no++,
];
$this->createOrUpdate([
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'activity_code' => $activity,
'category' => $wsCode,
'row_status' => 1,
], $dataForm);
$dataForms[] = $dataForm;
$this->saveCrfEmission($inventoryYear, $activityYear, $ws, $dataForms);
return $dataForms;
} catch (\Exception $e) {
throw $e;
}
}
private function saveCrfEmission($inventoryYear, $activityYear, $ws, $dataForms)
{
try {
$co2 = null;
$ch4 = array_sum(array_column($dataForms, 'ch4_final'));
// $n2o = null;
$dataForm = [
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'sector' => $this->sectorCode,
'ws_code' => '4B',
'co2' => $co2,
'ch4' => $ch4,
// 'n2o' => $n2o,
];
$this->createOrUpdate([
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'sector' => $this->sectorCode,
'ws_code' => '4B',
'row_status' => 1,
], $dataForm, ActivityCrf::class);
} catch (\Exception $e) {
throw $e;
}
}
}