AppointmentRequest.php 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. namespace App\Http\Requests;
  3. use App\Enums\AppointmentStatusEnum;
  4. use App\Enums\PartnerAgreementServiceTypeEnum;
  5. use App\Enums\PartnerAgreementTypeEnum;
  6. use App\Enums\UserDependentStatusEnum;
  7. use App\Enums\UserTypeEnum;
  8. use App\Models\Appointment;
  9. use App\Rules\ExactAdvanceDays;
  10. use Illuminate\Foundation\Http\FormRequest;
  11. use Illuminate\Support\Facades\Auth;
  12. use Illuminate\Validation\Rule;
  13. class AppointmentRequest extends FormRequest
  14. {
  15. public const CONSULTA_ADVANCE_DAYS = 2;
  16. public function rules(): array
  17. {
  18. $partnerExists = Rule::exists('partner_agreements', 'id')
  19. ->where('type', PartnerAgreementTypeEnum::AGREEMENT->value)
  20. ->whereNull('deleted_at');
  21. $serviceExists = Rule::exists('partner_agreement_services', 'id')
  22. ->where('type', PartnerAgreementServiceTypeEnum::CONSULTA->value)
  23. ->whereNull('deleted_at')
  24. ->when(
  25. $this->filled('partner_agreement_id'),
  26. fn($rule) => $rule->where('partner_agreement_id', $this->input('partner_agreement_id')),
  27. );
  28. $dependentExists = Rule::exists('user_dependents', 'id')
  29. ->where('responsible_user_id', $this->appointmentOwnerId())
  30. ->where('status', UserDependentStatusEnum::APPROVED->value)
  31. ->whereNull('deleted_at');
  32. $rules = [
  33. 'user_id' => 'sometimes|integer|exists:users,id',
  34. 'user_dependent_id' => ['sometimes', 'nullable', 'integer', $dependentExists],
  35. 'partner_agreement_id' => ['sometimes', 'integer', $partnerExists],
  36. 'partner_agreement_service_id' => ['sometimes', 'integer', $serviceExists],
  37. 'date' => 'sometimes|date',
  38. 'time' => 'sometimes|date_format:H:i',
  39. 'observations' => 'sometimes|nullable|string',
  40. 'status' => ['sometimes', Rule::enum(AppointmentStatusEnum::class)],
  41. ];
  42. if ($this->isMethod('post')) {
  43. $rules['user_id'] = 'required|integer|exists:users,id';
  44. $rules['partner_agreement_id'] = ['required', 'integer', $partnerExists];
  45. $rules['partner_agreement_service_id'] = ['required', 'integer', $serviceExists];
  46. $rules['date'] = ['required', 'date'];
  47. if (in_array(Auth::user()?->type, [UserTypeEnum::ASSOCIADO, UserTypeEnum::PARCEIRO,], true)) {
  48. $rules['date'][] = new ExactAdvanceDays(self::CONSULTA_ADVANCE_DAYS);
  49. }
  50. $rules['time'] = 'required|date_format:H:i';
  51. }
  52. return $rules;
  53. }
  54. private function appointmentOwnerId(): ?int
  55. {
  56. if ($this->filled('user_id')) {
  57. return (int) $this->input('user_id');
  58. }
  59. if ($this->route('id')) {
  60. return Appointment::find($this->route('id'))?->user_id;
  61. }
  62. return Auth::id();
  63. }
  64. }