validate([ 'search' => ['nullable', 'string', 'max:100'], 'category' => ['nullable', 'string', 'max:100'], 'location' => ['nullable', 'string', 'max:100'], 'starts_at' => ['nullable', 'date', 'required_with:ends_at', 'after:now'], 'ends_at' => ['nullable', 'date', 'required_with:starts_at', 'after:starts_at'], ]); $periodSelected = isset($filters['starts_at'], $filters['ends_at']); $query = $periodSelected ? $availability->availableAssets( CarbonImmutable::parse($filters['starts_at']), CarbonImmutable::parse($filters['ends_at']), ) : SnipeAsset::query() ->where('active', true) ->where('requestable', true) ->whereNull('assigned_id'); $assets = $query ->when($filters['search'] ?? null, function ($query, string $search) { $query->where(function ($query) use ($search) { $query->where('name', 'like', "%{$search}%") ->orWhere('asset_tag', 'like', "%{$search}%") ->orWhere('model_name', 'like', "%{$search}%"); }); }) ->when($filters['category'] ?? null, fn ($query, string $category) => $query->where('category_name', $category)) ->when($filters['location'] ?? null, fn ($query, string $location) => $query->where('location_name', $location)) ->orderBy('name') ->paginate(12) ->withQueryString(); return Inertia::render('assets/index', [ 'assets' => $assets, 'filters' => $filters, 'periodSelected' => $periodSelected, 'categories' => SnipeAsset::query()->where('active', true)->where('requestable', true)->whereNotNull('category_name')->distinct()->orderBy('category_name')->pluck('category_name'), 'locations' => SnipeAsset::query()->where('active', true)->where('requestable', true)->whereNotNull('location_name')->distinct()->orderBy('location_name')->pluck('location_name'), 'lastSyncedAt' => SnipeAsset::max('synced_at'), ]); } }