102 lines
3.5 KiB
PHP
102 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),
|
|
'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();
|
|
}
|
|
}
|