| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- <?php
- namespace App\Http\Requests;
- use App\Enums\AppointmentStatusEnum;
- use App\Enums\PartnerAgreementTypeEnum;
- use App\Enums\UserDependentStatusEnum;
- use App\Models\Appointment;
- use Illuminate\Foundation\Http\FormRequest;
- use Illuminate\Support\Facades\Auth;
- use Illuminate\Validation\Rule;
- class AppointmentRequest extends FormRequest
- {
- public function rules(): array
- {
- $partnerExists = Rule::exists('partner_agreements', 'id')
- ->where('type', PartnerAgreementTypeEnum::AGREEMENT->value)
- ->whereNull('deleted_at');
- $serviceExists = Rule::exists('partner_agreement_services', 'id')
- ->whereNull('deleted_at')
- ->when(
- $this->filled('partner_agreement_id'),
- fn ($rule) => $rule->where('partner_agreement_id', $this->input('partner_agreement_id')),
- );
- $dependentExists = Rule::exists('user_dependents', 'id')
- ->where('responsible_user_id', $this->appointmentOwnerId())
- ->where('status', UserDependentStatusEnum::APPROVED->value)
- ->whereNull('deleted_at');
- $rules = [
- 'user_id' => 'sometimes|integer|exists:users,id',
- 'user_dependent_id' => ['sometimes', 'nullable', 'integer', $dependentExists],
- 'partner_agreement_id' => ['sometimes', 'integer', $partnerExists],
- 'partner_agreement_service_id' => ['sometimes', 'integer', $serviceExists],
- 'date' => 'sometimes|date',
- 'time' => 'sometimes|date_format:H:i',
- 'observations' => 'sometimes|nullable|string',
- 'status' => ['sometimes', Rule::enum(AppointmentStatusEnum::class)],
- ];
- if ($this->isMethod('post')) {
- $rules['user_id'] = 'required|integer|exists:users,id';
- $rules['partner_agreement_id'] = ['required', 'integer', $partnerExists];
- $rules['partner_agreement_service_id'] = ['required', 'integer', $serviceExists];
- }
- return $rules;
- }
- private function appointmentOwnerId(): ?int
- {
- if ($this->filled('user_id')) {
- return (int) $this->input('user_id');
- }
- if ($this->route('id')) {
- return Appointment::find($this->route('id'))?->user_id;
- }
- return Auth::id();
- }
- }
|