user()?->active === true; } /** @return array> */ public function rules(): array { $maxAssets = app(ReservationPolicy::class)->integer('reservation.max_assets'); return [ 'purpose' => ['required', 'string', 'min:10', 'max:2000'], 'usage_location' => ['required', 'string', 'max:255'], 'starts_at' => ['required', 'date', 'after:now'], 'ends_at' => ['required', 'date', 'after:starts_at'], 'asset_ids' => ['required', 'array', 'min:1', "max:{$maxAssets}"], 'asset_ids.*' => ['required', 'integer', 'distinct', 'exists:snipe_assets,id'], 'terms_accepted' => ['accepted'], ]; } /** @return list */ public function after(): array { return [function (Validator $validator): void { if ($validator->errors()->hasAny(['starts_at', 'ends_at'])) { return; } $policy = app(ReservationPolicy::class); $startsAt = CarbonImmutable::parse((string) $this->input('starts_at')); $endsAt = CarbonImmutable::parse((string) $this->input('ends_at')); $minNotice = $policy->integer('reservation.min_notice_hours'); $maxDuration = $policy->integer('reservation.max_duration_hours'); if ($startsAt->lessThan(now()->addHours($minNotice))) { $validator->errors()->add('starts_at', "A requisição exige pelo menos {$minNotice} horas de antecedência."); } if ($startsAt->diffInMinutes($endsAt) > $maxDuration * 60) { $validator->errors()->add('ends_at', "A duração máxima permitida é de {$maxDuration} horas."); } }]; } }