$request->user()->reservations() ->with('items.asset:id,name,asset_tag') ->latest() ->paginate(15), ]); } public function calendar(Request $request): Response { $filters = $request->validate([ 'month' => ['nullable', 'date_format:Y-m'], ]); $month = isset($filters['month']) ? CarbonImmutable::createFromFormat('!Y-m', $filters['month']) : now()->startOfMonth(); $windowEnd = $month->addMonth(); return Inertia::render('reservations/calendar', [ 'month' => $month->format('Y-m'), 'reservations' => $request->user()->reservations() ->with('items.asset:id,name,asset_tag') ->where('starts_at', '<', $windowEnd) ->where('ends_at', '>', $month) ->orderBy('starts_at') ->get(), ]); } public function create(Request $request, AvailabilityService $availability): Response { $period = $request->validate([ 'starts_at' => ['nullable', 'date', 'required_with:ends_at', 'after:now'], 'ends_at' => ['nullable', 'date', 'required_with:starts_at', 'after:starts_at'], ]); $periodSelected = isset($period['starts_at'], $period['ends_at']); $query = $periodSelected ? $availability->availableAssets( CarbonImmutable::parse($period['starts_at']), CarbonImmutable::parse($period['ends_at']), ) : SnipeAsset::query() ->where('active', true) ->where('requestable', true) ->whereNull('assigned_id'); $assets = $query ->orderBy('name') ->get(['id', 'name', 'asset_tag', 'model_name', 'category_name', 'location_name']); $requestedAssetId = $request->integer('asset'); return Inertia::render('reservations/create', [ 'assets' => $assets, 'selectedAssetId' => $assets->contains('id', $requestedAssetId) ? $requestedAssetId : 0, 'period' => $period, 'periodSelected' => $periodSelected, ]); } public function store(StoreReservationRequest $request, ReservationService $service): RedirectResponse { /** @var array{purpose:string, usage_location:string, starts_at:string, ends_at:string, asset_ids:list} $data */ $data = $request->safe()->only(['purpose', 'usage_location', 'starts_at', 'ends_at', 'asset_ids']); $reservation = $service->createPending($request->user(), $data); return to_route('dashboard')->with('success', "Requisição {$reservation->reference} submetida para aprovação."); } public function cancel(Request $request, Reservation $reservation, ReservationService $service): RedirectResponse { $data = $request->validate([ 'reason' => ['required', 'string', 'min:5', 'max:1000'], ]); $service->cancel($reservation, $request->user(), $data['reason']); return back()->with('success', "Requisição {$reservation->reference} cancelada. Os equipamentos ficaram novamente disponíveis."); } }