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; } } }