user()->can('shopfloor.view')) { abort(403); } $business_id = $request->session()->get('user.business_id'); $events = DowntimeEvent::forBusiness($business_id) ->with('workCenter') ->latest('started_at') ->paginate(20); $workCenters = WorkCenter::forBusiness($business_id)->where('status', 'active')->orderBy('name')->pluck('name', 'id'); return view('shopfloor::downtime.index', compact('events', 'workCenters')); } public function store(Request $request) { if (! auth()->user()->can('shopfloor.downtime.create')) { abort(403); } $business_id = $request->session()->get('user.business_id'); $validated = $request->validate([ 'work_center_id' => 'required|integer|exists:sf_work_centers,id', 'reason_code' => 'required|string|max:50', 'reason_category' => 'required|in:planned,unplanned', 'started_at' => 'required|date', 'ended_at' => 'nullable|date|after_or_equal:started_at', 'notes' => 'nullable|string', ]); $startedAt = \Carbon\Carbon::parse($validated['started_at']); $endedAt = ! empty($validated['ended_at']) ? \Carbon\Carbon::parse($validated['ended_at']) : null; $durationMinutes = $endedAt ? $startedAt->diffInMinutes($endedAt) : null; DowntimeEvent::create([ 'business_id' => $business_id, 'work_center_id' => $validated['work_center_id'], 'reason_code' => $validated['reason_code'], 'reason_category' => $validated['reason_category'], 'started_at' => $startedAt, 'ended_at' => $endedAt, 'duration_minutes' => $durationMinutes, 'notes' => $validated['notes'] ?? null, ]); return redirect()->action([self::class, 'index'])->with('status', ['success' => 1, 'msg' => __('shopfloor::lang.downtime_recorded')]); } public function end(Request $request, $id) { if (! auth()->user()->can('shopfloor.downtime.create')) { abort(403); } $business_id = $request->session()->get('user.business_id'); $event = DowntimeEvent::forBusiness($business_id)->whereNull('ended_at')->findOrFail($id); $endedAt = now(); $event->update([ 'ended_at' => $endedAt, 'duration_minutes' => $event->started_at->diffInMinutes($endedAt), ]); return redirect()->action([self::class, 'index'])->with('status', ['success' => 1, 'msg' => __('shopfloor::lang.downtime_ended')]); } }