sigd/app/Services/Emisi/Waste4C2aService.php

151 lines
4.9 KiB
PHP

<?php
namespace App\Services\Emisi;
use App\Models\ActivityCrf;
use App\Models\ReferenceEf;
use App\Models\Waste4APre;
use App\Models\Waste4C1;
use App\Models\Waste4C2a;
use App\Services\SigdCrudService;
class Waste4C2aService extends SigdCrudService
{
private $sectorCode = 'waste';
private $formCode = 'sampah';
public function __construct(Waste4C2a $model)
{
$this->model = $model;
}
public function save($code, $inventoryYear)
{
try {
$dataBatch = [];
$ws = $this->getWs($code);
$years = activityYearRange($inventoryYear);
if ($ws && class_basename($ws->model) == 'Waste4C2a') {
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;
}
}
public function calcAndSave($inventoryYear, $activityYear, $ws)
{
# deklarasi variabel
$dataForms = [];
$wsCode = $ws->ws_code;
$items = ['kertas', 'tekstil', 'nappies', 'karet_kulit', 'plastik', 'anorganik_lainnya'];
$activities = [];
$open_burned = 0;
# inisialisasi data aktivitas
foreach ($items as $item) {
$activities[$item . '_composition'] = 0;
$activities[$item . '_dry_matter'] = 0;
}
try {
# ambil data aktivitas
$ws4a_pre = Waste4APre::whereIn('activity', ['composition', 'dry_matter'])
->where('inventory_year', $inventoryYear)->where('activity_year', $activityYear)
->rowActive()->get();
foreach ($ws4a_pre as $row) {
foreach ($items as $item) {
$activities[$item . '_' . $row->activity] = $row->$item;
}
}
$ws4c1 = Waste4C1::where('inventory_year', $inventoryYear)->where('activity_year', $activityYear)
->rowActive()->first();
$msw_b = $ws4c1->msw_b ?? 0;
$no = 1;
foreach ($items as $item) {
$open_burned = $activities[$item . '_composition'] * $msw_b / 100;
$ef_carbon_f = ReferenceEf::getValue($item, 'carbon_f');
$ef_fossil_carbon_f = ReferenceEf::getValue($item, 'fossil_carbon_f');
$ef_oxidation_f = ReferenceEf::getValue($item, 'oxidation_f');
$ef_cf = ReferenceEf::getValue($item, 'cf');
$co2 = $open_burned * ($activities[$item . '_dry_matter'] / 100) * $ef_carbon_f * $ef_fossil_carbon_f * $ef_oxidation_f * $ef_cf;
$dataForm = [
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'category' => $wsCode,
'activity_code' => $item,
'composition' => $activities[$item . '_composition'],
'msw_b' => $msw_b,
'open_burned' => $open_burned,
'dry_matter' => $activities[$item . '_dry_matter'],
'ef_carbon_f' => $ef_carbon_f,
'ef_fossil_carbon_f' => $ef_fossil_carbon_f,
'ef_oxidation_f' => $ef_oxidation_f,
'ef_cf' => $ef_cf,
'co2' => $co2,
'row_num' => $no++,
];
$this->createOrUpdate([
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'category' => $wsCode,
'activity_code' => $item,
'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 = array_sum(array_column($dataForms, 'co2'));
// $ch4 = null;
// $n2o = null;
$dataForm = [
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'sector' => $this->sectorCode,
'ws_code' => '4C',
'co2' => $co2,
// 'ch4' => $ch4,
// 'n2o' => $n2o,
];
$this->createOrUpdate([
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'sector' => $this->sectorCode,
'ws_code' => '4C',
'row_status' => 1,
], $dataForm, ActivityCrf::class);
} catch (\Exception $e) {
throw $e;
}
}
}