FirstAccessRegisterRequest.php 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. <?php
  2. namespace App\Http\Requests;
  3. use App\Enums\UserTypeEnum;
  4. use App\Models\User;
  5. use App\Support\Cpf;
  6. use Illuminate\Foundation\Http\FormRequest;
  7. use Illuminate\Validation\Rule;
  8. use Illuminate\Validation\Rules\Password;
  9. class FirstAccessRegisterRequest extends FormRequest
  10. {
  11. protected function prepareForValidation(): void
  12. {
  13. if ($this->has('cpf')) {
  14. $this->merge(['cpf' => Cpf::digits($this->input('cpf'))]);
  15. }
  16. if ($this->has('registration')) {
  17. $this->merge(['registration' => trim((string) $this->input('registration'))]);
  18. }
  19. }
  20. public function rules(): array
  21. {
  22. $user = $this->existingUser();
  23. $userId = $user?->id;
  24. return [
  25. 'token' => 'required|string',
  26. 'registration' => ['required', 'string', 'max:255', Rule::unique('users', 'registration')->ignore($userId)],
  27. 'name' => 'required|string|min:3|max:120',
  28. 'last_name' => 'required|string|min:3|max:120',
  29. 'cpf' => ['required', 'string', 'digits:11', Rule::unique('users', 'cpf')->ignore($userId)],
  30. 'email' => ['required', 'email', 'max:255', Rule::unique('users', 'email')->ignore($userId)],
  31. 'phone' => 'required|string|max:20',
  32. 'position_id' => 'required|integer|exists:positions,id',
  33. 'sector_id' => 'required|integer|exists:sectors,id',
  34. 'password' => ['required', 'confirmed', Password::min(8)->mixedCase()->numbers()],
  35. // Obrigatória apenas quando a administração ainda não cadastrou uma foto para o associado.
  36. 'photo' => ['nullable', Rule::requiredIf(fn(): bool => !$user?->photo_path), 'image', 'max:5120'],
  37. ];
  38. }
  39. /**
  40. * Associado que já existe com este crachá — as regras de unicidade ignoram o próprio registro.
  41. */
  42. private function existingUser(): ?User
  43. {
  44. return User::where('type', UserTypeEnum::ASSOCIADO)
  45. ->where('registration', $this->input('registration'))
  46. ->first();
  47. }
  48. }