getActiveGwpRecords()->keyBy('ghg_code'); $years = activityYearRange($inventoryYear, false, 10); $crfData = ActivityCrf::with(['ws.form', 'sektor']) ->where('inventory_year', $inventoryYear) ->whereBetween('activity_year', [$years[0], end($years)]) ->orderBy('ws_code', 'asc')->get(); $aggregatedData = $this->aggregateCrfData($crfData, $gwpData); return [ 'cardData' => $this->calculateCardData($aggregatedData, $inventoryYear), 'barData' => $this->calculateBarData($aggregatedData, $years), 'pieData' => $this->calculatePieData($aggregatedData, $inventoryYear), 'tableData' => $this->calculateTableData($aggregatedData, $inventoryYear), 'inventoryYear' => $inventoryYear, ]; } private function aggregateCrfData(Collection $crfData, Collection $gwpData) { return $crfData->map(function ($data) use ($gwpData) { $sector = $data->sector; $name = $sector === 'energy' ? $data->ws->form->name : $data->sektor->name; return [ 'year' => $data->activity_year, 'sector' => $sector, 'name' => $name, 'co2eq' => $data->co2eq, 'co2' => $data->co2, 'ch4' => $data->ch4, 'n2o' => $data->n2o, ]; }); } private function calculateCardData(Collection $aggregatedData, $inventoryYear) { $sectorSums = $aggregatedData->where('year', $inventoryYear - 1)->groupBy('sector')->map->sum('co2eq'); return [ 'totalEmisi' => $aggregatedData->where('year', $inventoryYear - 1)->sum('co2eq'), 'emisiEnergi' => $sectorSums->get('energy', 0), 'emisiPertanian' => $sectorSums->get('agriculture', 0), 'emisiLahan' => $sectorSums->get('folu', 0), 'emisiLimbah' => $sectorSums->get('waste', 0), ]; } private function calculateBarData(Collection $aggregatedData, array $years) { return array_map(function ($year) use ($aggregatedData) { $yearlyData = $aggregatedData->where('year', $year)->groupBy('name')->map->sum('co2eq'); $total = $yearlyData->sum(); return [ 'year' => $year, 'total' => $total, 'emisi' => $yearlyData, ]; }, $years); } private function calculatePieData(Collection $aggregatedData, $inventoryYear) { return $aggregatedData->where('year', $inventoryYear - 1)->groupBy('name')->map->sum('co2eq'); } private function calculateTableData(Collection $aggregatedData, $inventoryYear) { return $aggregatedData->where('year', $inventoryYear - 1)->groupBy('name')->map(function ($groupedData) { return [ 'co2eq' => $groupedData->sum('co2eq'), 'co2' => $groupedData->sum('co2'), 'ch4' => $groupedData->sum('ch4'), 'n2o' => $groupedData->sum('n2o'), ]; }); } private function getActiveGwpRecords() { return ReferenceGwp::whereHas('ar', function ($query) { $query->isActive(); })->get(); } }