sigd/app/Services/DashboardService.php

104 lines
3.5 KiB
PHP

<?php
namespace App\Services;
use App\Models\ActivityCrf;
use App\Models\ReferenceGwp;
use Illuminate\Support\Collection;
class DashboardService
{
public function getDashboardData($inventoryYear)
{
$gwpData = $this->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),
'emisiIppu' => $sectorSums->get('ippu', 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();
}
}