sigd/app/Http/Controllers/Tool/CalculationController.php

151 lines
5.2 KiB
PHP

<?php
namespace App\Http\Controllers\Tool;
use App\Enums\ActivityType;
use App\Enums\SigdStatus;
use App\Http\Controllers\Controller;
use App\Models\ActivityLock;
use App\Services\Tool\CalculationService;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;
class CalculationController implements HasMiddleware
{
protected $service;
public function __construct(CalculationService $service)
{
$this->service = $service;
}
public static function middleware(): array
{
return [
//new Middleware('permission:/tool/calculation'),
];
}
public function index(Request $request)
{
if ($request->ajax()) {
$query = $this->service->getRawAll();
// Apply category filter if a category is selected
if ($request->has('sectorFilter') && $request->sectorFilter != '' && $request->sectorFilter != 'SEMUA SEKTOR') {
$query = $query->where($request->sectorFilter, true);
}
if ($request->has('inventoryYearFilter') && $request->inventoryYearFilter != '' && $request->inventoryYearFilter != 'SEMUA TAHUN') {
$query = $query->where('inventory_year', $request->inventoryYearFilter);
}
$result = datatables()->of($query)
->addColumn('sector', function ($row) {
return $row->sector;
})
->addColumn('duration', function ($row) {
if ($row->finished_time === null || $row->executed_time === null) {
return '';
}
// Parse the date-time strings into Carbon instances
$start = Carbon::parse($row->executed_time);
$end = Carbon::parse($row->finished_time);
// Calculate the difference in seconds
$diffInSeconds = $start->diffInSeconds($end);
// Format the duration as HH:MM:SS
$hours = floor($diffInSeconds / 3600);
$minutes = floor(($diffInSeconds % 3600) / 60);
$seconds = $diffInSeconds % 60;
return sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);
})
->editColumn('created_at', function ($row) {
return $row->created_at->format('d-m-Y H:i:s')
?? '';
})
->editColumn('executed_time', function ($row) {
if ($row->executed_time === null) {
return '';
}
return $row->executed_time->format('d-m-Y H:i:s');
})
->editColumn('finished_time', function ($row) {
if ($row->finished_time === null) {
return '';
}
return $row->finished_time->format('d-m-Y H:i:s');
})
->addColumn('status', function ($row) {
$status = SigdStatus::from($row->calculation_status);
return $status->badge() ?? '';
})
->rawColumns(['status', 'sector', 'duration'])
->make(true);
return $result;
}
$sectors = $this->service->getSectors();
return view('tool.calculation.index', compact('sectors'));
}
public function create()
{
return view('tool.calculation.create');
}
public function store(Request $request)
{
// Validate the form data
$request->validate([
'inventory_year' => 'required|integer|min:2000|max:' . date('Y'),
'energy' => 'boolean',
'agriculture' => 'boolean',
'folu' => 'boolean',
'waste' => 'boolean',
'ippu' => 'boolean',
]);
$isLocked = ActivityLock::isLocked($request->inventory_year);
if ($isLocked) {
return back()->withErrors(['error' => 'Kalkulasi Emisi gagal disimpan. Tahun Inventory dikunci.']);
}
try {
$data = $request->all();
$data['energy'] = $request->has('energy') ? 1 : 0;
$data['agriculture'] = $request->has('agriculture') ? 1 : 0;
$data['folu'] = $request->has('folu') ? 1 : 0;
$data['waste'] = $request->has('waste') ? 1 : 0;
$data['ippu'] = $request->has('ippu') ? 1 : 0;
$this->service->create($data);
logUserActivity(ActivityType::CALCULATION_EMISI);
return redirect()->route('calculation.index')->with('success', 'Kalkulasi Emisi berhasil ditambahkan.');
} catch (\Exception $e) {
return back()->withErrors(['error' => 'Kalkulasi Emisi gagal disimpan. Silakan coba lagi. Error: ' . $e->getMessage()]);
}
}
public function getActivityYearRange(Request $request)
{
$inventoryYear = (int) $request->query('inventoryYear');
$years = activityYearRange($inventoryYear);
return response()->json([
'years' => $years
]);
}
}