feat: complete administration and reporting

This commit is contained in:
2026-08-04 17:40:52 +01:00
parent d829f34580
commit 7a4ac48aaf
42 changed files with 2595 additions and 76 deletions

View File

@@ -2,7 +2,10 @@
namespace App\Http\Requests;
use App\Domain\Administration\Services\ReservationPolicy;
use Carbon\CarbonImmutable;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validator;
class StoreReservationRequest extends FormRequest
{
@@ -14,14 +17,39 @@ class StoreReservationRequest extends FormRequest
/** @return array<string, list<string>> */
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:10'],
'asset_ids' => ['required', 'array', 'min:1', "max:{$maxAssets}"],
'asset_ids.*' => ['required', 'integer', 'distinct', 'exists:snipe_assets,id'],
'terms_accepted' => ['accepted'],
];
}
/** @return list<callable(Validator): void> */
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.");
}
}];
}
}