startOfDay(); $end = now()->addDay()->startOfDay(); return Inertia::render('operations/index', [ 'operationallyConfigured' => $snipeIt->isOperationallyConfigured(), 'reservations' => Reservation::query() ->with([ 'requester:id,name,email,department,snipe_user_id', 'items.asset:id,snipe_asset_id,name,asset_tag,status_id,status_name,location_id,location_name', 'items.handoverRecords:id,reservation_item_id,type,operator_id,condition,notes,created_at', 'items.handoverRecords.operator:id,name', ]) ->whereIn('status', [ ReservationStatus::Approved, ReservationStatus::Ready, ReservationStatus::Delivered, ReservationStatus::InUse, ReservationStatus::Returned, ReservationStatus::Overdue, ReservationStatus::Incident, ]) ->where(function ($query) use ($start, $end) { $query->where(function ($query) use ($start, $end) { $query->where('starts_at', '<', $end)->where('ends_at', '>', $start); })->orWhereIn('status', [ ReservationStatus::Delivered, ReservationStatus::InUse, ReservationStatus::Returned, ReservationStatus::Overdue, ReservationStatus::Incident, ]); }) ->orderByRaw("CASE WHEN status IN ('overdue', 'incident') THEN 0 ELSE 1 END") ->orderBy('starts_at') ->limit(50) ->get(), ]); } public function prepare(Request $request, Reservation $reservation, HandoverService $service): RedirectResponse { $service->markReady($reservation, $request->user()); return back()->with('success', "Requisição {$reservation->reference} preparada."); } public function deliver(Request $request, Reservation $reservation, HandoverService $service): RedirectResponse { $data = $request->validate([ 'snipe_user_id' => ['required', 'integer', 'min:1'], 'condition' => ['required', 'string', 'min:3', 'max:500'], 'notes' => ['nullable', 'string', 'max:1000'], ]); $service->deliver( $reservation, $request->user(), (int) $data['snipe_user_id'], $data['condition'], $data['notes'] ?? null, ); return back()->with('success', "Entrega de {$reservation->reference} registada no portal e no Snipe-IT."); } public function returnEquipment(Request $request, Reservation $reservation, HandoverService $service): RedirectResponse { $data = $request->validate([ 'condition' => ['required', 'string', 'min:3', 'max:500'], 'notes' => ['nullable', 'string', 'max:1000'], ]); $service->returnEquipment($reservation, $request->user(), $data['condition'], $data['notes'] ?? null); return back()->with('success', "Devolução de {$reservation->reference} registada no portal e no Snipe-IT."); } public function complete(Request $request, Reservation $reservation, HandoverService $service): RedirectResponse { $service->complete($reservation, $request->user()); return back()->with('success', "Requisição {$reservation->reference} concluída."); } public function noShow(Request $request, Reservation $reservation, HandoverService $service): RedirectResponse { $data = $request->validate(['notes' => ['required', 'string', 'min:3', 'max:1000']]); $service->markNoShow($reservation, $request->user(), $data['notes']); return back()->with('success', "Falta registada em {$reservation->reference}."); } public function overdue(Request $request, Reservation $reservation, HandoverService $service): RedirectResponse { $data = $request->validate(['notes' => ['required', 'string', 'min:3', 'max:1000']]); $service->markOverdue($reservation, $request->user(), $data['notes']); return back()->with('success', "Atraso registado em {$reservation->reference}."); } public function incident( Request $request, Reservation $reservation, ReservationItem $item, HandoverService $service, ): RedirectResponse { $data = $request->validate([ 'notes' => ['required', 'string', 'min:5', 'max:1000'], 'blocked_until' => ['nullable', 'date', 'after:now'], ]); $service->reportIncident( $reservation, $item, $request->user(), $data['notes'], isset($data['blocked_until']) ? CarbonImmutable::parse($data['blocked_until']) : null, ); return back()->with('success', "Incidente registado em {$reservation->reference}."); } }