has('cpf')) { $this->merge(['cpf' => Cpf::digits($this->input('cpf'))]); } if ($this->has('registration')) { $this->merge(['registration' => trim((string) $this->input('registration'))]); } } public function rules(): array { $user = $this->existingUser(); $userId = $user?->id; return [ 'token' => 'required|string', 'registration' => ['required', 'string', 'max:255', Rule::unique('users', 'registration')->ignore($userId)], 'name' => 'required|string|min:3|max:120', 'last_name' => 'required|string|min:3|max:120', 'cpf' => ['required', 'string', 'digits:11', Rule::unique('users', 'cpf')->ignore($userId)], 'email' => ['required', 'email', 'max:255', Rule::unique('users', 'email')->ignore($userId)], 'phone' => 'required|string|max:20', 'position_id' => 'required|integer|exists:positions,id', 'sector_id' => 'required|integer|exists:sectors,id', 'password' => ['required', 'confirmed', Password::min(8)->mixedCase()->numbers()], 'terms_accepted' => ['accepted'], 'photo' => ['nullable', Rule::requiredIf(fn(): bool => !$user?->photo_path), 'image', 'max:5120'], ]; } /** * Associado que já existe com este crachá — as regras de unicidade ignoram o próprio registro. */ private function existingUser(): ?User { return User::where('type', UserTypeEnum::ASSOCIADO) ->where('registration', $this->input('registration')) ->first(); } }