AppointmentRequest.php 2.4 KB

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