183 lines
6.0 KiB
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;
|
|
}
|
|
}
|
|
}
|