# ÉPICO 1 — NÚCLEO DE IDENTIDADE E AUTENTICAÇÃO

Funcionalidade pai: **Check-in de Usuários no Sistema**  
Persona principal: **Usuário autenticado** Versão: 1.5 (revisada) Data: 07/08/2026

## 1. Visão Geral do Épico

### 1.1 O que inclui

Este épico é a fundação de todo o fluxo de check-in de usuários no sistema Gemed. Ele contempla:

- Tela de login com documento único (CPF no Brasil) e senha
- Validação de credenciais do usuário
- Controle de tentativas de login com limite e bloqueio parametrizáveis
- Bloqueio temporário após número parametrizado de tentativas falhas (atualmente 5) por período parametrizado (atualmente 15 minutos)
- Fluxo de recuperação de senha via código de verificação (enviado por e-mail ou celular)
- Redefinição de senha com critérios de complexidade parametrizáveis
- Registro de histórico de senhas para política de não reutilização (quantidade parametrizável)
- Encerramento de sessão (logout)

### 1.2 Dependências

Este épico não possui dependências funcionais de outros épicos — é a base do sistema. Pode ser desenvolvido em paralelo com o E2 (Auto-cadastro Público), pois ambos utilizam a mesma estrutura de dados de usuário e a mesma lógica de armazenamento de senha.

### 1.3 Paralelização

E2 (Auto-cadastro Público) pode ser construído simultaneamente, pois compartilha a mesma estrutura de dados e a mesma lógica de criptografia de senha.

## 2. Regras de Negócio

### RN-CIU-001 — Documento único como chave de identificação

O usuário é identificado de forma unívoca pelo seu documento único. No Brasil, o CPF é a chave de identificação. Em outros países, o sistema deve adaptar para o documento local equivalente (passaporte, SSN, etc.). O documento é exclusivo — um mesmo documento não pode pertencer a dois usuários diferentes. O login é feito com o documento único + senha.

### RN-CIU-009 — Autenticação

A autenticação valida documento único + senha. O sistema localiza o usuário pelo documento informado e valida a senha utilizando mecanismo de hash + salt (detalhado na Seção 4.1). Usuários excluídos logicamente são tratados como inexistentes — a autenticação falha com mensagem genérica, sem revelar que o usuário foi excluído.

Após autenticação bem-sucedida, o sistema avalia os vínculos ativos do usuário:

1. Se possui 1 vínculo ativo — entra direto na clínica, carrega perfil de acesso e monta menu lateral. Direciona para o cockpit do profissional conforme seu tipo (médico → Central do Médico, enfermeira → cockpit da enfermagem, etc.). Se o tipo de profissional não tiver um cockpit específico definido, o sistema carrega apenas o perfil e o menu lateral, sem uma tela ativa.
2. Se possui múltiplos vínculos ativos — direciona para a tela de seleção de clínica (Épico 6).
3. Se possui 0 vínculos ativos — direciona para a página de Meu Perfil (Épico 4) com banner informativo (MSG-I01).

### RN-CIU-010 — Tentativas de login (parametrizável)

O sistema controla tentativas de login falhas de forma parametrizada. Os parâmetros são:

- Quantidade de tentativas (atualmente 5) — número máximo de tentativas falhas consecutivas antes do bloqueio
- Minutos de bloqueio (atualmente 15) — duração do bloqueio temporário em minutos

Quando o usuário atinge o limite de tentativas falhas, o sistema bloqueia novas tentativas pelo período parametrizado. A cada login bem-sucedido, o contador de tentativas é zerado. Após o bloqueio expirar, o usuário pode tentar novamente.

### RN-CIU-016 — Sem validação de formato nem máscara no login

No fluxo de login, o sistema não aplica máscara visual nem validação de formato no campo de documento. O campo aceita qualquer texto digitado de forma livre — letras, números, símbolos, qualquer combinação. Isso evita dar pistas a quem está tentando acessar o sistema sobre:

- Se o documento tem formato válido (indicando que o sistema reconhece aquele CPF)
- Se o documento existe na base (diferenciando "formato inválido" de "credenciais incorretas")

A única resposta para qualquer falha de login é a mensagem genérica MSG-E01 (ver Seção 10), sem distinguir a causa.

Esta regra está alinhada com a prática de segurança contra enumeração de usuários — o atacante não consegue descobrir quais CPFs estão cadastrados apenas observando o comportamento do formulário de login.

## 3. Histórias de Usuário

### US-CIU-003 — Login com documento único

Como usuário autenticado, quero fazer login com meu CPF e senha, para acessar o sistema e iniciar meu trabalho na clínica.

### US-CIU-009 — Recuperação de senha

Como usuário que esqueceu a senha, quero recuperá-la via e-mail ou celular com código de verificação, para voltar a acessar o sistema sem precisar de suporte.

## 4. Descrição Funcional Detalhada

### 4.1 Tela de Login

#### Propósito:

Autenticar o usuário no sistema via documento único + senha.

#### Layout (mobile first):

- Logo do Gemed centralizado no topo
- Campo de texto "Usuário" — input sem máscara, placeholder MSG-P01
- Campo de senha "Senha" — input com toggle de visibilidade (ícone olho), placeholder MSG-P02
- Botão primário "Entrar" (MSG-B01) — largura total, cor primary-pure (#00E676)
- Link terciário "Esqueci minha senha" (MSG-B02) — abaixo do botão, alinhado ao centro
- Link terciário "Cadastrar-se" (MSG-B03) — abaixo, alinhado ao centro

#### Comportamento de campos (aplicável a todos os inputs do sistema):

Todo campo de input possui um placeholder que é o nome do campo. Quando o usuário clica no campo para digitar, o placeholder some e se torna um label acima do campo (colado à borda superior do campo). Portanto, as descrições de campos não citam o label separadamente — o label é sempre igual ao placeholder.

#### Mecanismo de autenticação (detalhe técnico):

1. O sistema recebe o documento e a senha digitada pelo usuário
2. O sistema localiza o registro na tabela Usuario pelo documento informado (considerando apenas registros com RemovidoEm nulo — exclusão lógica)
3. Se o registro não existe (ou foi excluído logicamente), a autenticação falha com mensagem genérica (RN-CIU-016)
4. Se o registro existe, o sistema utiliza o Salt armazenado na tabela Usuario para gerar o Hash da senha digitada
5. O sistema compara o Hash gerado com o Hash armazenado na tabela Usuario
6. Se os hashes coincidem, a autenticação é bem-sucedida
7. Se os hashes não coincidem, a autenticação falha com mensagem genérica (RN-CIU-016)

A senha é armazenada exclusivamente como hash + salt — nunca em texto plano. Os campos utilizados na tabela Usuario são:

- Hash (varchar) — hash da senha gerado com o salt
- Salt (varchar) — valor aleatório único por usuário usado no processo de hashing

Nota sobre exclusão lógica: O conceito de campo Status foi abolido das tabelas IpSeguranca. A exclusão lógica utiliza a estrutura padrão da infraestrutura: o campo RemovidoEm (datetimeoffset) registra a data e hora da exclusão, e o campo UsuarioIdRemovido (uniqueidentifier) identifica quem fez a exclusão. Um registro é considerado ativo quando RemovidoEm é nulo. Um registro é considerado excluído/inativo quando RemovidoEm possui uma data/hora preenchida.

#### Comportamento:

- O campo de documento aceita qualquer texto de forma livre — letras, números, símbolos, qualquer combinação. Não aplica máscara, não valida formato, não restringe entrada (RN-CIU-016). O campo é um input text comum sem nenhum tipo de formatação ou restrição de caracteres.
- O botão "Entrar" fica desabilitado (disabled) enquanto ambos os campos estiverem vazios
- Ao submeter, o botão exibe estado loading (spinner) e fica desabilitado
- Em caso de erro, exibe toast error abaixo do botão "Entrar" com a mensagem MSG-E01
- Após atingir o limite de tentativas falhas (parametrizado em QuantidadeTentativas, atualmente 5), exibe toast error MSG-E02 e o botão "Entrar" fica desabilitado pelo período parametrizado
- Em caso de sucesso, o sistema direciona para:

- 0 vínculos ativos: página de Meu Perfil com banner MSG-I01
- 1 vínculo ativo: direto para o cockpit do profissional conforme seu tipo (médico → Central do Médico, enfermeira → cockpit da enfermagem, etc.). Se o tipo de profissional não tiver um cockpit específico definido, o sistema carrega apenas o perfil e o menu lateral, sem uma tela ativa.
- Múltiplos vínculos ativos: tela de seleção de clínica (Épico 6)

Estados visuais:

- Default: campos vazios, botão desabilitado
- Focus: borda do input muda para border-medium (2px) solid neutral-darker (#01013B). Todo texto em edição exibe cor neutral-dark (#012856).
- Loading: botão com spinner, todos os campos desabilitados
- Error: toast error exibido abaixo do botão "Entrar", campos permanecem preenchidos (exceto senha que é limpa)
- Blocked: botão desabilitado com mensagem de bloqueio temporário

Decisão de design: A tela de login é minimalista e mobile first porque é a porta de entrada usada diariamente. Campos grandes (input-height: 56px) facilitam o uso no celular. A ausência de máscara e restrição no campo de documento (RN-CIU-016) evita dar pistas a atacantes sobre o formato esperado ou a existência do documento na base. O campo aceita qualquer entrada para não diferenciar "formato inválido" de "documento não encontrado".

### 4.2 Tela de Recuperação de Senha

Propósito: Permitir que o usuário recupere o acesso via código de verificação enviado por e-mail ou celular.

Fluxo em 2 etapas:

#### Etapa 1 — Solicitação

- Campo de documento (input text, sem máscara, sem validação de formato — RN-CIU-016. O campo aceita qualquer texto livre, igual ao campo de login)
- Texto orientador: MSG-T01
- Botão "Enviar código" (MSG-B04)
- Comportamento: ao enviar, o sistema verifica se o documento existe na tabela Usuario (considerando apenas registros com RemovidoEm nulo). Se existe, gera um código de 6 dígitos e envia por e-mail e/ou celular (conforme dados cadastrados na tabela Usuario — campos eMail e Telefone). Se não existe, exibe a mesma mensagem de sucesso para não revelar que o documento não existe: MSG-S01.
- Após enviar, direciona para a etapa 2

#### Etapa 2 — Verificação e nova senha

- Campo de login/documento (input text, sem máscara — o usuário deve reinformar o documento para dupla verificação, garantindo que quem está redefinindo a senha é o mesmo que solicitou o código)
- Campo de código (input text, 6 dígitos, placeholder MSG-P04)
- Campo de nova senha (input password, com toggle de visibilidade e indicador de força)
- Campo de confirmar senha (input password, com toggle de visibilidade)
- Indicador de força da senha (barra progress que muda de cor: vermelho → amarelo → verde conforme critérios atendidos)
- Lista de critérios de complexidade (checkbox visuais que marcam automaticamente conforme a senha atende cada critério)
- Botão "Redefinir senha" (MSG-B05, desabilitado até documento preenchido, código com 6 dígitos, senha válida e confirmação igual)
- Link "Reenviar código" (MSG-B06)
- Comportamento: ao redefinir, o sistema valida que o documento informado corresponde ao documento que solicitou o código na etapa 1, valida o código, atualiza Hash + Salt em Usuario, registra a senha anterior em UsuarioSenhaHistorico, exibe toast success MSG-S02 e redireciona para a tela de login
- Se o documento informado na etapa 2 não corresponder ao documento da etapa 1, exibe toast error MSG-E07

Critérios de complexidade da nova senha — parametrizados via tabela UsuarioSenhaParametros (IpSeguranca):

|   |   |   |
|---|---|---|
|**Parâmetro (campo na tabela)**|**Descrição**|**Valor atual**|
|**TamanhoMinimo**|Quantidade mínima de caracteres na senha|8|
|**MinimoCaracterEspecial**|Quantidade mínima de caracteres especiais|1|
|**MinimoLetraMaiuscula**|Quantidade mínima de letras maiúsculas|1|
|**MinimoLetraMinuscula**|Quantidade mínima de letras minúsculas|1|
|**MinimoNumero**|Quantidade mínima de números (dígitos)|1|
|**CaracteresEspeciais**|Caracteres especiais válidos aceitos|!@#$%^&*-_+=?;:\||

O sistema consulta estes parâmetros em tempo real ao validar a nova senha. A interface de critérios visuais (checkbox que marcam automaticamente) deve refletir os valores parametrizados — se o administrador alterar MinimoCaracterEspecial para 2, a interface passa a exigir e exibir "2 caracteres especiais".

Decisão de design: O fluxo de recuperação não revela se o documento existe (mesma prática do login — RN-CIU-016). O código tem 6 dígitos por ser um padrão familiar (SMS OTP). A etapa 2 exige o campo de login para dupla verificação — garante que quem está redefinindo a senha é o mesmo que solicitou o código, evitando ataques de session hijacking no fluxo de recuperação. A redefinição exige os critérios de complexidade parametrizados na tabela UsuarioSenhaParametros para manter consistência com o auto-cadastro (E2). O histórico de senhas em UsuarioSenhaHistorico permite implementar política de não reutilização de senhas recentes.

## 5. Critérios de Aceitação

### US-CIU-003 — Login com documento único

**CA-003.1**: Dado que estou na tela de login, quando informo CPF e senha corretos, então o sistema me autentica e direciona para a próxima tela conforme o número de vínculos ativos (Meu Perfil, seleção de clínica ou cockpit do profissional).

**CA-003.2**: Dado que informei CPF ou senha incorretos, quando submeto, então o sistema exibe a mensagem MSG-E01 sem distinguir qual campo está errado.

**CA-003.3**: Dado que falhei o número parametrizado de vezes seguidas (QuantidadeTentativas, atualmente 5), quando tento novamente, então o sistema bloqueia pelo período parametrizado (MinutosBloqueado, atualmente 15 minutos) e exibe a mensagem MSG-E02.

**CA-003.4**: Dado que o bloqueio expirou, quando tento novamente com credenciais corretas, então o sistema me autentica normalmente e zera o contador TentativasLogin.

**CA-003.5**: Dado que o campo de documento não tem máscara nem validação de formato, quando digito o CPF sem pontos e traços, então o sistema aceita e processa normalmente.

**CA-003.6**: Dado que tenho 0 vínculos ativos, quando faço login com sucesso, então sou direcionado para a página de Meu Perfil com o banner MSG-I01 visível.

**CA-003.7**: Dado que tenho 1 vínculo ativo, quando faço login com sucesso, então entro direto na clínica e sou direcionado para o cockpit do meu tipo de profissional. Se não houver cockpit específico para meu tipo, o sistema carrega apenas o perfil e o menu lateral, sem tela ativa.

**CA-003.8**: Dado que tenho múltiplos vínculos ativos, quando faço login com sucesso, então sou direcionado para a tela de seleção de clínica.

**CA-003.9**: Dado que o campo RemovidoEm do usuário está preenchido (exclusão lógica), quando tento logar, então o sistema exibe a mensagem MSG-E01 sem revelar que o usuário foi excluído.

**CA-003.10**: Dado que o toast error aparece abaixo do botão "Entrar", quando informo credenciais inválidas, então o toast é exibido na posição abaixo do botão, não no topo da tela.

### US-CIU-009 — Recuperação de senha

**CA-009.1**: Dado que informei um documento cadastrado (RemovidoEm nulo), quando solicito recuperação, então recebo um código de 6 dígitos por e-mail ou celular.

**CA-009.2**: Dado que informei um documento não cadastrado, quando solicito recuperação, então o sistema exibe a mensagem MSG-S01 (sem revelar que não existe).

**CA-009.3**: Dado que recebi o código, quando informo o documento novamente na etapa 2, o código correto dentro do prazo de validade e uma nova senha que atende todos os critérios parametrizados em UsuarioSenhaParametros, então a senha é redefinida, o registro é salvo em UsuarioSenhaHistorico e posso fazer login com a nova senha.

**CA-009.4**: Dado que informei um código incorreto, quando tento redefinir, então o sistema exibe a mensagem MSG-E03 e não redefine a senha.

**CA-009.5**: Dado que informei uma senha que não atende os critérios de complexidade parametrizados em UsuarioSenhaParametros (TamanhoMinimo, MinimoCaracterEspecial, MinimoLetraMaiuscula, MinimoLetraMinuscula, MinimoNumero), quando tento redefinir, então o botão "Redefinir senha" permanece desabilitado.

**CA-009.6**: Dado que informei senhas diferentes nos campos "nova senha" e "confirmar senha", quando saio do campo, então o sistema exibe a mensagem MSG-E05.

**CA-009.7**: Dado que o código de recuperação expirou (prazo parametrizado em MinutosValidadeNovaSolicitacao, atualmente 15 minutos), quando tento redefinir, então o sistema exibe a mensagem MSG-E04.

**CA-009.8**: Dado que QuantidadeMemoria está parametrizado (atualmente 7), quando tento redefinir com uma senha igual a uma das últimas 7 senhas armazenadas em UsuarioSenhaHistorico, então o sistema exibe a mensagem MSG-E06.

**CA-009.9**: Dado que QuantidadeMemoria está definido como 0, quando redefino a senha, então o sistema não armazena histórico em UsuarioSenhaHistorico e não valida senhas anteriores — qualquer senha que atenda os critérios de complexidade é aceita.

**CA-009.10**: Dado que informei um documento diferente na etapa 2 daquele informado na etapa 1, quando tento redefinir, então o sistema exibe a mensagem MSG-E07 e não redefine a senha.

## 6. Fluxos de Exceção

### EX-E1.01— Serviço de autenticação indisponível

- Gatilho: Back-end de autenticação não responde
- Comportamento: Toast error MSG-E08 exibido abaixo do botão "Entrar". Botão volta ao estado default
- Recuperação: Usuário tenta novamente após alguns instantes

### EX-E1.02 — Código de recuperação expirado

- Gatilho: Usuário informa código de recuperação após o prazo de validade parametrizado em MinutosValidadeNovaSolicitacao (atualmente 15 minutos)
- Comportamento: Mensagem inline MSG-E04
- Recuperação: Usuário clica em "Reenviar código" (MSG-B06) e recebe um novo

### EX-E1.03 — Usuário com exclusão lógica (RemovidoEm preenchido)

- Gatilho: Usuário tenta logar mas o campo RemovidoEm na tabela Usuario está preenchido (registro excluído logicamente)
- Comportamento: Mensagem genérica MSG-E01 (não revela que o usuário foi excluído — RN-CIU-016)
- Recuperação: Usuário deve contatar o suporte Gemed ou o administrador da clínica

### EX-E1.04 — Nova senha igual a senha recente

- Gatilho: Usuário tenta redefinir senha com um valor igual a uma das últimas senhas armazenadas em UsuarioSenhaHistorico (quantidade controlada por QuantidadeMemoria)
- Comportamento: Toast error MSG-E06
- Recuperação: Usuário define uma senha diferente que atenda os critérios de complexidade

### EX-E1.05 — Caractere especial não permitido

- Gatilho: Usuário utiliza um caractere especial que não está na lista parametrizada em CaracteresEspeciais
- Comportamento: O critério "Caracteres especiais" na lista visual não é marcado como atendido, e o botão "Redefinir senha" permanece desabilitado
- Recuperação: Usuário utiliza apenas caracteres da lista parametrizada (atualmente: !@#$%^&*-_+=?;:|)

### EX-E1.06 — Documento divergente na etapa 2 de recuperação

- Gatilho: Usuário informa um documento na etapa 2 diferente do documento informado na etapa 1 da recuperação de senha
- Comportamento: Toast error MSG-E07. Botão "Redefinir senha" permanece desabilitado
- Recuperação: Usuário informa o mesmo documento utilizado na etapa 1

## 7. Validações de Campos

|   |   |   |   |   |   |
|---|---|---|---|---|---|
|**Campo**|**Tela**|**Tipo**|**Obrigatório**|**Formato/Regra**|**Mensagem de erro**|
|**Documento (login)**|Login|Texto sem máscara|Sim|Aceita qualquer texto livre — sem validação de formato (RN-CIU-016)|N/A — erro genérico MSG-E01|
|**Senha (login)**|Login|Password|Sim|Não vazio|N/A — erro genérico MSG-E01|
|**Documento (recuperação etapa 1)**|Recuperação Etapa 1|Texto sem máscara|Sim|Aceita qualquer texto livre — sem validação de formato (RN-CIU-016)|N/A — mensagem genérica MSG-S01|
|**Documento (recuperação etapa 2)**|Recuperação Etapa 2|Texto sem máscara|Sim|Deve ser igual ao documento informado na etapa 1|MSG-E07|
|**Código de recuperação**|Recuperação Etapa 2|Texto numérico|Sim|Exatamente 6 dígitos|MSG-E03|
|**Nova senha**|Recuperação Etapa 2|Password|Sim|TamanhoMinimo (8) + MinimoCaracterEspecial (1) + MinimoLetraMaiuscula (1) + MinimoLetraMinuscula (1) + MinimoNumero (1) + CaracteresEspeciais (!@#$%^&*-_+=?;:\|) — todos parametrizados em UsuarioSenhaParametros|Indicador visual de critérios não atendidos|
|**Confirmar senha**|Recuperação Etapa 2|Password|Sim|Deve ser igual ao campo Nova Senha|MSG-E05|

## 8. Mapeamento de Componentes de Interface

|   |   |   |   |   |
|---|---|---|---|---|
|**Componente**|**Variante**|**Estado(s)**|**Tokens aplicados**|**Onde aparece**|
|**Input (text)**|Bordered|default, focus, error, disabled|input-height: 56px, radius-m (8px), neutral-light border (#BECADC), neutral-darker focus border (#01013B), texto em edição neutral-dark (#012856)|Documento (login), Documento (recuperação etapa 1 e 2), Código|
|**Input (password)**|Bordered com toggle|default, focus, error|Mesmos tokens do input text + ícone olho clicável (toggle de visibilidade)|Senha (login), Nova senha, Confirmar senha|
|**Button**|Primary|default, hover, loading, disabled|btn-height: 40px, primary-pure bg (#00E676), base-pure text (#FFFFFF), radius-m (8px)|Entrar (MSG-B01), Enviar código (MSG-B04), Redefinir senha (MSG-B05)|
|**Button**|Tertiary|default, hover|Transparent bg, primary-pure text (#00E676)|Esqueci minha senha (MSG-B02), Cadastrar-se (MSG-B03), Reenviar código (MSG-B06)|
|**Toast**|Default, Success, Error|animation: toast-in (300ms)|neutral-dark bg (#012856) / secondary-dark bg (#0091EA) / error-pure bg (#F44336)|Feedback de login (abaixo do botão "Entrar"), recuperação, bloqueio|
|**Progress**|Linear|default|radius-pill, neutral-lighter track (#E5EAF0), primary-pure bar (#00E676)|Indicador de força de senha|
|**Checkbox**|Default|default, checked, disabled|20px box, primary-pure (#00E676) quando checked|Lista de critérios de complexidade da senha|

## 9. Integração com Backend

### 9.1 Autenticação

|   |   |   |   |   |   |
|---|---|---|---|---|---|
|**Função**|**Método**|**Path**|**Request Body**|**Response Body**|**Códigos HTTP**|
|**Login**|POST|/api/auth/login|{ documento: string, senha: string }|{ token: string, usuario: { id: uuid, nome: string, apelido: string, caminhoFoto: string }, vinculos: [{ clienteBDId: uuid, clienteNome: string, clienteLogo: string, situacao: string }], convitesPendentes: number }|200 (sucesso), 401 (credenciais inválidas), 423 (bloqueado por tentativas)|
|**Logout**|POST|/api/auth/logout|{ token: string }|{ success: true }|200|

### 9.2 Recuperação de Senha

|   |   |   |   |   |   |
|---|---|---|---|---|---|
|**Função**|**Método**|**Path**|**Request Body**|**Response Body**|**Códigos HTTP**|
|**Solicitar recuperação**|POST|/api/auth/recuperar-senha|{ documento: string }|{ success: true } (sempre retorna sucesso, mesmo se documento não existir)|200|
|**Redefinir senha**|POST|/api/auth/redefinir-senha|{ documento: string, codigo: string, novaSenha: string }|{ success: true }|200 (sucesso), 400 (código inválido, código expirado, documento divergente, senha reutilizada, critérios não atendidos)|

### 9.3 Mapeamento de Tabelas

|   |   |   |
|---|---|---|
|**Tabela**|**Banco**|**Campos utilizados neste épico**|
|**Usuario**|IpSeguranca|Id, Usuario (login=CPF), CPF, Nome, Apelido, CaminhoFoto, Hash, Salt, DataSenha, TentativasLogin, DHBloqueio, Token, RemovidoEm, UsuarioIdRemovido|
|**UsuarioSenhaHistorico**|IpSeguranca|UsuarioId, DataSenha, Hash, Salt|
|**UsuarioCliente**|IpSeguranca|UsuarioId, ClienteBDId, Situacao, RemovidoEm (consultado apenas para verificar vínculos ativos após login)|
|**UsuarioSenhaParametros**|IpSeguranca|QuantidadeTentativas, MinutosBloqueado, TamanhoMinimo, MinimoCaracterEspecial, MinimoLetraMaiuscula, MinimoLetraMinuscula, MinimoNumero, CaracteresEspeciais, MinutosValidadeNovaSolicitacao, QuantidadeMemoria|

## 10. Catálogo de Mensagens do Sistema (Multilíngue)

Todas as mensagens exibidas ao usuário neste épico, com suas traduções para os três idiomas suportados. As mensagens inline no documento (Seções 2 a 6) referenciam os IDs desta seção.

### 10.1 Mensagens de erro

|   |   |   |   |   |
|---|---|---|---|---|
|**ID**|**Contexto**|**pt-BR**|**en-US**|**es-419**|
|**MSG-E01**|Falha de login (qualquer causa)|"Usuário ou senha inválidos."|"Invalid username or password."|"Usuario o contraseña inválidos."|
|**MSG-E02**|Bloqueio por tentativas|"Muitas tentativas. Tente novamente em [X] minutos."|"Too many attempts. Try again in [X] minutes."|"Demasiados intentos. Inténtelo de nuevo en [X] minutos."|
|**MSG-E03**|Código de recuperação inválido|"Código inválido."|"Invalid code."|"Código inválido."|
|**MSG-E04**|Código de recuperação expirado|"Código expirado. Solicite um novo código."|"Code expired. Request a new code."|"Código expirado. Solicite un nuevo código."|
|**MSG-E05**|Senhas não coincidem|"As senhas não coincidem."|"Passwords do not match."|"Las contraseñas no coinciden."|
|**MSG-E06**|Nova senha igual a recente|"A nova senha não pode ser igual a uma senha utilizada recentemente."|"The new password cannot be the same as a recently used password."|"La nueva contraseña no puede ser igual a una contraseña utilizada recientemente."|
|**MSG-E07**|Documento divergente na etapa 2|"Documento não corresponde ao informado na solicitação."|"Document does not match the one provided in the request."|"El documento no coincide con el informado en la solicitud."|
|**MSG-E08**|Serviço indisponível|"Não foi possível conectar ao servidor. Tente novamente em alguns instantes."|"Could not connect to the server. Please try again in a few moments."|"No fue posible conectar al servidor. Inténtelo de nuevo en unos momentos."|

### 10.2 Mensagens de sucesso

|   |   |   |   |   |
|---|---|---|---|---|
|**ID**|**Contexto**|**pt-BR**|**en-US**|**es-419**|
|**MSG-S01**|Recuperação solicitada (sempre exibida, mesmo se documento não existe)|"Se o documento estiver cadastrado, você receberá um código de verificação."|"If the document is registered, you will receive a verification code."|"Si el documento está registrado, recibirá un código de verificación."|
|**MSG-S02**|Senha redefinida|"Senha redefinida com sucesso!"|"Password successfully reset!"|"¡Contraseña restablecida con éxito!"|

### 10.3 Mensagens informativas

|   |   |   |   |   |
|---|---|---|---|---|
|**ID**|**Contexto**|**pt-BR**|**en-US**|**es-419**|
|**MSG-I01**|Banner — sem vínculo ativo|"Você não está vinculado a nenhuma clínica ativa. Aguarde um convite ou entre em contato com o administrador da clínica onde você trabalha."|"You are not linked to any active clinic. Wait for an invitation or contact the administrator of the clinic where you work."|"No está vinculado a ninguna clínica activa. Espere una invitación o comuníquese con el administrador de la clínica donde trabaja."|

### 10.4 Placeholders

|   |   |   |   |   |
|---|---|---|---|---|
|**ID**|**Campo**|**pt-BR**|**en-US**|**es-419**|
|**MSG-P01**|Campo "Usuário" (login)|"Digite seu login"|"Enter your login"|"Ingrese su login"|
|**MSG-P02**|Campo "Senha" (login)|"Senha"|"Password"|"Contraseña"|
|**MSG-P03**|Campo "Documento" (recuperação etapa 1)|"Digite seu login"|"Enter your login"|"Ingrese su login"|
|**MSG-P04**|Campo "Código" (recuperação etapa 2)|"Código"|"Código"|"Código"|

### 10.5 Textos orientadores

|   |   |   |   |   |
|---|---|---|---|---|
|**ID**|**Contexto**|**pt-BR**|**en-US**|**es-419**|
|**MSG-T01**|Recuperação — texto orientador etapa 1|"Informe seu login. Enviaremos um código de verificação para o e-mail ou celular cadastrado."|"Enter your login. We will send a verification code to your registered email or phone."|"Ingrese su login. Enviaremos un código de verificación a su correo electrónico o teléfono registrado."|

### 10.6 Rótulos de botões e links

|   |   |   |   |   |
|---|---|---|---|---|
|**ID**|**Elemento**|**pt-BR**|**en-US**|**es-419**|
|**MSG-B01**|Botão primário (login)|"Entrar"|"Sign in"|"Ingresar"|
|**MSG-B02**|Link (login)|"Esqueci minha senha"|"Forgot my password"|"Olvidé mi contraseña"|
|**MSG-B03**|Link (login)|"Cadastrar-se"|"Sign up"|"Registrarse"|
|**MSG-B04**|Botão (recuperação etapa 1)|"Enviar código"|"Send code"|"Enviar código"|
|**MSG-B05**|Botão (recuperação etapa 2)|"Redefinir senha"|"Reset password"|"Restablecer contraseña"|
|**MSG-B06**|Link (recuperação etapa 2)|"Reenviar código"|"Resend code"|"Reenviar código"|

## 11. Conformidade SBIS

### ECF.17.19 — Mensagens do sistema

Estágio: 1 (Clínica/ambulatório) — obrigatório

Descrição do requisito: "Todas as mensagens sob controle do S-RES devem ser apresentadas em linguagem não técnica ao usuário, em português do Brasil. Mensagens técnicas (sistemas operacionais, banco de dados, componentes de segurança, etc) ou em outros idiomas e que possam ser tratadas pelo S-RES não devem ser apresentadas em seu conteúdo original."

Como é atendido neste épico: Todas as mensagens exibidas ao usuário estão catalogadas na Seção 10 em linguagem não técnica, em português do Brasil (com suporte multilíngue para en-US e es-419). Mensagens técnicas de banco de dados, infraestrutura ou componentes de segurança são capturadas pelo back-end e nunca exibidas ao usuário. O front-end exibe apenas as mensagens amigáveis pré-definidas no catálogo.

## 12. Metadados do Épico

|   |   |
|---|---|
|**Atributo**|**Valor**|
|**Prioridade**|Must Have — fundação do sistema, sem este épico nenhum outro funciona|
|**Complexidade**|Média — fluxos bem definidos, tabelas já existem, parametrização via UsuarioSenhaParametros|
|**Dependências**|Nenhuma (épico base)|
|**Paraleliza com**|E2 (Auto-cadastro Público) — compartilha estrutura de dados e lógica de criptografia de senha|
|**Histórias de usuário**|2 (US-CIU-003, US-CIU-009)|
|**Critérios de aceitação**|19|
|**Fluxos de exceção**|6 (EX-006, EX-007, EX-010, EX-011, EX-012, EX-013)|
|**Endpoints**|4|
|**Telas**|2 (Login, Recuperação de Senha em 2 etapas)|
|**Tabelas utilizadas**|4 (Usuario, UsuarioSenhaHistorico, UsuarioCliente, UsuarioSenhaParametros)|
|**Mensagens catalogadas**|20 (8 erros, 2 sucessos, 1 informativa, 4 placeholders, 1 texto orientador, 6 rótulos)|