sigd/app/Services/Emisi/Folu3BService.php

183 lines
6.0 KiB
PHP

<?php
namespace App\Services\Emisi;
use App\Enums\LandCategory;
use App\Models\ActivityCrf;
use App\Models\Folu3B;
use App\Models\ReferenceEf;
use App\Services\SigdCrudService;
class Folu3BService extends SigdCrudService
{
private $sectorCode = 'folu';
private $formCode = 'lahan_mineral';
public function __construct(Folu3B $model)
{
$this->model = $model;
}
public function getDataLandCategories(string $fromKey, string $toKey): array
{
$fromCategory = LandCategory::tryFrom($fromKey);
$toCategory = LandCategory::tryFrom($toKey);
if ($toCategory === null) {
throw new \InvalidArgumentException("Invalid Key: {$toKey}");
}
$dataTo = LandCategory::getSubcategories($toCategory);
if ($fromCategory !== null) {
$dataFrom = LandCategory::getSubcategories($fromCategory);
} else {
$allSubcategories = [];
foreach (LandCategory::cases() as $category) {
if ($category !== $toCategory) {
$allSubcategories = array_merge($allSubcategories, LandCategory::getSubcategories($category));
}
}
$dataFrom = array_diff($allSubcategories, $dataTo);
}
return ['dataFrom' => array_values($dataFrom), 'dataTo' => array_values($dataTo)];
// return $this->getLandActivityCodes($dataFrom, $dataTo);
}
public function getLandActivityCodes($lands1, $lands2)
{
$activityCodes = [];
foreach ($lands1 as $land1) {
foreach ($lands2 as $land2) {
$activityCodes[] = $land1 . '_' . $land2;
}
}
return $activityCodes;
}
public function save($code, $inventoryYear)
{
try {
$dataBatch = [];
$ws = $this->getWs($code);
$years = activityYearRange($inventoryYear);
// $activityYear = $inventoryYear - 1;
list($fromKey, $toKey) = explode('_', $code);
$lands = $this->getDataLandCategories($fromKey, $toKey);
if ($ws && class_basename($ws->model) == 'Folu3B') {
foreach ($years as $year) {
$dataBatch = array_merge($dataBatch, $this->calcAndSave($inventoryYear, $year, $ws, $lands));
}
} else {
throw new \Exception("Forbidden");
}
return $dataBatch;
} catch (\Exception $e) {
throw $e;
}
}
public function calcAndSave($inventoryYear, $activityYear, $ws, $lands)
{
// Initialize variables
$dataForms = [];
$activities = [];
$sector = $this->sectorCode;
$code = $this->formCode;
$wsCode = $ws->ws_code;
$lands1 = $lands['dataFrom'];
$lands2 = $lands['dataTo'];
try {
// Initialize and get data activities
$formActivity = $this->getActivityFormDetailsByYear($activityYear + 1, $activityYear, $sector, $code);
foreach ($formActivity as $row) $activities[$row->activity_code] = $row->activity_value ?? 0;
$no = 1;
foreach ($lands2 as $land2) {
foreach ($lands1 as $land1) {
$activity = $land1 . '_' . $land2;
$area = $activities[$land1 . '_' . $land2] ?? 0;
$ef_agb_before = ReferenceEf::getValue($land1 . '_' . $land1, 'agb');
$c_before = $area * ($ef_agb_before + 0.37);
$ef_agb_after = ReferenceEf::getValue($land2 . '_' . $land2, 'agb');
$c_after = $area * ($ef_agb_after + 0.37);
$c_change = $c_after - $c_before;
$dataForm = [
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'activity_code' => $activity,
'category' => $wsCode,
'before' => $land1,
'after' => $land2,
'area' => $area,
'ef_agb_before' => $ef_agb_before,
'c_before' => $c_before,
'ef_agb_after' => $ef_agb_after,
'c_after' => $c_after,
'c_change' => $c_change,
'row_num' => $no++,
];
$this->createOrUpdate([
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'activity_code' => $activity,
'category' => $wsCode,
'before' => $land1,
'after' => $land2,
'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, 'c_change'));
$co2 = -1 * $co2 * 44 / 12 / 1000;
$ch4 = null;
$n2o = null;
$dataForm = [
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'sector' => $this->sectorCode,
'ws_code' => $ws->ws_code,
'co2' => $co2,
'ch4' => $ch4,
'n2o' => $n2o,
];
$this->createOrUpdate([
'inventory_year' => $inventoryYear,
'activity_year' => $activityYear,
'sector' => $this->sectorCode,
'ws_code' => $ws->ws_code,
'row_status' => 1,
], $dataForm, ActivityCrf::class);
} catch (\Exception $e) {
throw $e;
}
}
}