model = $model; } public function save($inventoryYear) { try { $dataBatch = []; $years = activityYearRange($inventoryYear); foreach ($years as $year) { $dataBatch = array_merge($dataBatch, $this->calcAndSave($inventoryYear, $year)); } return $dataBatch; } catch (\Exception $e) { throw $e; } } private function calcPlnEmission($inventoryYear, $activityYear) { $dataForms = []; $activities = []; $sectorCode = 'energy'; $formCode = 'pln'; try { // Initialize activities $formSetting = $this->getDataSettingFormDetail($sectorCode, $formCode); foreach ($formSetting as $row) $activities[$row->activity_code] = 0; // Get data activities $formActivity = $this->getActivityFormDetailsByYear($inventoryYear, $activityYear, $sectorCode, $formCode); foreach ($formActivity as $row) $activities[$row->activity_code] = $row->activity_value ?? 0; $ef_listrik_terkoreksi = $activities['ef_listrik_terkoreksi']; $no = 1; foreach ($activities as $activity => $value) { if ($activity != 'ef_listrik_terkoreksi') { $co2_ton = $value * $ef_listrik_terkoreksi; $co2_gg = $co2_ton / 1000; $dataForm = [ 'inventory_year' => $inventoryYear, 'activity_year' => $activityYear, 'activity_code' => $activity, 'value' => $value, 'ef_listrik_terkoreksi' => $ef_listrik_terkoreksi, 'co2_ton' => $co2_ton, 'co2_gg' => $co2_gg, 'row_num' => $no++, ]; $this->createOrUpdate([ 'inventory_year' => $inventoryYear, 'activity_year' => $activityYear, 'activity_code' => $activity, 'row_status' => 1, ], $dataForm, EnergyPLN::class); $dataForms[] = $dataForm; } } } catch (\Exception $e) { throw $e; } } private function getDataGpcList() { $query = ReferenceGpc::rowActive()->orderByRowNum()->get(); return $query; } public function calcAndSave($inventoryYear, $activityYear) { $dataForms = []; $activities = []; try { $this->calcPlnEmission($inventoryYear, $activityYear); // Get data activities $formActivity = $this->getActivityFormDetailsByYear($inventoryYear, $activityYear, 'waste', 'kependudukan'); foreach ($formActivity as $row) $activities[$row->activity_code] = $row->activity_value ?? 0; $gpc_output['inventory_year'] = $inventoryYear; $gpc_output['activity_year'] = $activityYear; $gpc_output['population'] = $activities['jumlah_penduduk'] ?? 0; $gpc_output['area'] = $activities['luas_wilayah'] ?? 0; $gpc_output['gdp'] = $activities['pdb'] ?? 0; $gpcList = $this->getDataGpcList(); foreach ($gpcList as $gpc) { $columnName = strtolower(str_replace('.', '_', $gpc->gpc_code)); $gpc_output[$columnName] = null; // Handle PLN listrik sector if (strpos($gpc->sub_sector, 'pln_listrik_') === 0) { list(, $activityCode) = explode('_', $gpc->sub_sector, 2); $pln = EnergyPLN::rowActive() ->where('activity_code', $activityCode) ->where('inventory_year', $inventoryYear) ->where('activity_year', $activityYear) ->first(); $gpc_output[$columnName] = $pln->co2_gg ?? null; continue; } // Handle transportation sector if ($gpc->sector === 'transportation' && $gpc->sub_sector !== null) { $transCategories = TransportationCategory::getTransportationCategories($gpc->sub_sector); $activities = Energy1A::rowActive()->where('category', $gpc->ipcc_code) ->where('inventory_year', $inventoryYear)->where('activity_year', $activityYear) ->whereIn('activity_code', $transCategories)->get(); $co2eq = $this->calculateCO2eq($activities); $gpc_output[$columnName] = $co2eq ?? null; continue; } // Handle CRF (3A, 3B, 3C) related IPCC codes if (!is_null($gpc->ipcc_code)) { if (in_array($gpc->ipcc_code, ['3A', '3B', '3C'])) { $gpc_output[$columnName] = $this->getCrfSumForCode($gpc->ipcc_code, $inventoryYear, $activityYear); } else { $crf = ActivityCrf::rowActive()->where('ws_code', $gpc->ipcc_code) ->where('inventory_year', $inventoryYear)->where('activity_year', $activityYear) ->first(); $gpc_output[$columnName] = $crf->co2eq ?? null; } continue; } // Handle energy_gpc sector if ($gpc->sector === 'energy_gpc') { $gpc_output[$columnName] = $this->getEnergyGpcValue($columnName, $gpc, $inventoryYear, $activityYear); } } $this->createOrUpdate([ 'inventory_year' => $inventoryYear, 'activity_year' => $activityYear, 'row_status' => 1, ], $gpc_output); $dataForms[] = $gpc_output; return $dataForms; } catch (\Exception $e) { throw $e; } } private function calculateCO2eq($activities) { $co2 = $activities->sum('emission_co2'); $ch4 = $activities->sum('emission_ch4'); $n2o = $activities->sum('emission_n2o'); $gwp = $this->getGWPValues(); return ($co2 ? $co2 * $gwp['CO2']->value : 0) + ($ch4 ? $ch4 * $gwp['CH4']->value : 0) + ($n2o ? $n2o * $gwp['N2O']->value : 0); } // Helper function to handle CRF code 3A, 3B, 3C queries private function getCrfSumForCode($ipccCode, $inventoryYear, $activityYear) { $crfQuery = ActivityCrf::rowActive()->where('inventory_year', $inventoryYear)->where('activity_year', $activityYear); if ($ipccCode == '3B') { $crfQuery->where('ws_code', 'like', '3B%')->orWhere('ws_code', '3C1'); } elseif ($ipccCode == '3C') { $crfQuery->where('ws_code', 'like', '3C%')->where('ws_code', '!=', '3C1'); } else { $crfQuery->where('ws_code', 'like', '3A%'); } return $crfQuery->sum('co2eq') ?: null; } // Helper function to handle energy_gpc values based on gpc code and subsector private function getEnergyGpcValue($gpcCode, $gpc, $inventoryYear, $activityYear) { if ($gpcCode == 'i_4_1') { $gpcQ = ActivityGpc::rowActive()->where('gpc_code', $gpcCode) ->where('inventory_year', $inventoryYear)->where('activity_year', $activityYear) ->first(); return (float)$gpcQ->co2eq != 0.0 ? $gpcQ->co2eq : ActivityFormDetail::getValue($inventoryYear, $activityYear, $gpc->sector, 'penyulingan', 'emisi_minyak_mentah') ?? null; } if (in_array($gpcCode, ['i_7_1', 'i_8_1'])) { return ActivityFormDetail::getValue($inventoryYear, $activityYear, $gpc->sector, $gpc->sub_sector, 'emisi') ?? null; } $crf = ActivityGpc::rowActive() ->where('sector', $gpc->sector)->where('gpc_code', $gpcCode) ->where('inventory_year', $inventoryYear)->where('activity_year', $activityYear) ->first(); return $crf->co2eq ?? null; } }