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', ]); $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; $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 ]); } }