ExactAdvanceDays.php 948 B

1234567891011121314151617181920212223242526272829303132333435
  1. <?php
  2. namespace App\Rules;
  3. use Carbon\Carbon;
  4. use Closure;
  5. use Illuminate\Contracts\Validation\ValidationRule;
  6. /**
  7. * Regra oficial da consulta: a data precisa estar exatamente N dias à frente de hoje.
  8. * A comparação ignora horas — só a data conta.
  9. */
  10. class ExactAdvanceDays implements ValidationRule
  11. {
  12. public function __construct(private int $days) {}
  13. public function validate(string $attribute, mixed $value, Closure $fail): void
  14. {
  15. try {
  16. $date = Carbon::parse($value)->startOfDay();
  17. } catch (\Throwable) {
  18. $fail(__('validation.date', ['attribute' => $attribute]));
  19. return;
  20. }
  21. $expected = Carbon::today()->addDays($this->days);
  22. if (!$date->equalTo($expected)) {
  23. $fail(__('validation.exact_advance_days', [
  24. 'days' => $this->days,
  25. 'date' => $expected->format('d/m/Y'),
  26. ]));
  27. }
  28. }
  29. }