# Épico 3 — Convite e Vínculo — Especificação (v3.4)

**Documentos deste épico:** [01 - Definição](./01%20-%20Defini%C3%A7%C3%A3o%20v3.4.md) (v3.4) · [02 - Especificação](./02%20-%20Especifica%C3%A7%C3%A3o%20v3.4.md) (v3.4) · Protótipo (Seção 3): **pendente**, ainda não produzido — telas a prototipar: Cadastro de Convite, Tela de Conclusão de Cadastro, Tela de Aceite do Vínculo, Mensagem de Bloqueio · [04 - Mapeamento de Banco de Dados](./04%20-%20Mapeamento%20de%20Banco%20de%20Dados%20v3.4.md) (v3.4). Este épico faz parte do documento guarda-chuva [Check-in de Usuários](../00%20-%20Guarda-chuva%20v2.18.md).

---

## SEÇÃO 2 — ESPECIFICAÇÃO

### Histórias de Usuário

**US-CIU-004 — Administrador convida profissional**
Como administrador da clínica, quero cadastrar o CPF, nome, e-mail e celular de um profissional e disparar um convite, para formalizar seu vínculo com a clínica assim que ele aceitar — reaproveitando a conta dele se ele já for cadastrado no Gemed.

**US-CIU-005 — Profissional aceita vínculo com a clínica**
Como profissional convidado, quero completar meu cadastro (se for a primeira vez) ou apenas fazer login (se já tiver conta), ler as regras básicas do sistema e aceitar explicitamente o vínculo com a clínica que me convidou, para começar a trabalhar nela assim que meu perfil de acesso for definido.

### Descrição Funcional Detalhada

#### Cadastro de Convite (visão do administrador)

Propósito: permitir que o administrador da clínica cadastre um profissional e dispare o convite de vínculo. O cadastro de convite é uma ação dentro da tela mais ampla de "cadastro de usuários da clínica" (gestão de usuários pelo administrador); essa tela mais ampla — listagem, edição de perfis, desativação — não é o foco deste épico, que documenta apenas o formulário mínimo do convite.

Layout (mobile first):

- Campo "CPF" — input com máscara automática 000.000.000-00, validação de dígitos verificadores (reaproveita RN-CIU-004 do E2)
- Campo "Nome completo" — input text, obrigatório (campo Nome é NOT NULL na tabela Usuario)
- Campo "E-mail" — input email, validação de formato
- Campo "Celular" — input com máscara parametrizada por país (RN-CIU-020, reaproveitada do E2)
- Campo "Perfil de acesso" (select, opcional) — lista de perfis (ClientePerfilAcesso) cadastrados para a clínica
- Campo "Clínica(s)" (multi-select, condicional) — visível apenas quando um Perfil de acesso é selecionado; lista as `ClienteEmpresa` **ativas** do Cliente do administrador logado (uma desativada não é uma opção válida — confirmado pelo solicitante). Quando o Cliente tem apenas 1 `ClienteEmpresa` ativa, o campo não aparece — ela é associada automaticamente, sem exigir seleção
- Botão primário "Enviar convite" (MSG-B3-01)

Comportamento:

- Ao sair do campo CPF, o sistema verifica se já existe um usuário ativo com esse CPF. Se existir, o formulário informa isso ao administrador (MSG-I3-02) e desabilita a edição dos campos Nome/E-mail/Celular, que passam a exibir os dados já cadastrados (o administrador não pode alterar dados de uma conta que já existe só por estar convidando-a para sua clínica)
- Ao sair do campo CPF, o sistema também verifica se já existe convite pendente (Situacao = 'C') para esse CPF nesta mesma clínica. Se existir, exibe MSG-E3-01 e impede o envio de um convite duplicado
- Ao selecionar um Perfil de acesso, o campo "Clínica(s)" se torna obrigatório (quando o Cliente tem mais de 1 `ClienteEmpresa`) — não é possível enviar o convite com Perfil de acesso selecionado e nenhuma clínica marcada (MSG-E3-06)
- Ao enviar: cria (ou reaproveita) o registro de Usuario, cria o vínculo (UsuarioCliente, Situacao = 'C'), o registro de token de convite e, se Perfil de acesso e clínica(s) foram selecionados, um registro em ClientePerfilAcessoUsuario por clínica marcada; dispara o e-mail e exibe toast de sucesso MSG-S3-01

**Motivador:** o formulário inclui nome e celular além de CPF e e-mail porque o administrador normalmente tem esses dados em mãos no momento da contratação/onboarding, e coletá-los aqui evita que o profissional precise redigitá-los na tela de conclusão de cadastro. Nome é obrigatório porque a tabela Usuario não permite esse campo vazio — não é uma escolha de UX, é uma restrição de dados.

#### Tela de Conclusão de Cadastro

Propósito: permitir que um profissional, cuja conta foi criada pelo administrador mas ainda não tem senha, complete seus dados e defina sua senha.

Layout (mobile first), estrutura em 2 etapas (mais enxuta que o wizard do E2, pois os dados básicos já vêm preenchidos):

**Etapa 1 — Confirmar dados e completar cadastro**

- CPF, Nome, E-mail, Celular — pré-preenchidos com os dados informados pelo administrador, editáveis (para o caso de erro de digitação do administrador)
- Checkbox/Switch "Sou profissional de saúde" (MSG-C2-01, reaproveitada do E2) — se marcado, exibe o complemento profissional (mesmos campos e regras do E2, RN-CIU-017/019: tipo de profissional, conselho, especialidades, CBO)
- Seção de dados avançados (opcional, mesmos campos do E2, RN-CIU-018/021) — colapsável, pode ser pulada

**Etapa 2 — Definição de senha**

- Campos de senha e confirmação, indicador de força e lista de critérios — idênticos ao E2, Etapa 3 (RN-CIU-006)
- Botão "Concluir cadastro" (MSG-B3-04)

Comportamento: ao concluir, o sistema atualiza o registro de Usuario existente (não cria um novo) com os dados confirmados/completados e a senha definida, autentica automaticamente (RN-CIU-022) e direciona para a tela de aceite do vínculo.

**Motivador:** a estrutura em 2 etapas (em vez das 3 do E2) reflete que os dados básicos já chegam preenchidos — não há necessidade de uma etapa dedicada só a eles. Os campos ficarem editáveis, mesmo pré-preenchidos, é uma salvaguarda contra erro de digitação do administrador — sem isso, um CPF ou e-mail errado ficaria sem correção possível pela própria pessoa.

#### Tela de Aceite do Vínculo

Propósito: permitir que o profissional aceite formalmente o vínculo com a clínica que o convidou (aplica-se apenas a quem não tem nenhum vínculo ativo — RN-CIU-014).

Layout (mobile first):

- Nome e logo da(s) clínica(s) (`ClienteEmpresa`) já associadas ao vínculo pelo Perfil de acesso selecionado no convite; se o convite ainda não teve Perfil de acesso/clínica selecionados, exibe nome e logo do Cliente convidante como identificação genérica **[PROPOSTA — regra de fallback, não confirmada explicitamente pelo solicitante]**
- Texto com as regras básicas de uso da aplicação (MSG-T3-02) **[PROPOSTA — conteúdo textual completo não fornecido pelo solicitante]**
- Checkbox de aceite obrigatório: "Li e aceito o vínculo com [nome da clínica]" (MSG-C3-01)
- Botão primário "Aceitar vínculo" (MSG-B3-02) — desabilitado até o checkbox ser marcado
- Link/botão secundário "Agora não" (MSG-B3-03)

Comportamento:

- Ao marcar o checkbox, o botão "Aceitar vínculo" é habilitado
- Ao clicar em "Aceitar vínculo": atualiza `UsuarioCliente.Situacao` para 'V', executa a verificação de Perfil de acesso (RN-CIU-015) e direciona o profissional conforme o resultado
- Se o profissional clicar em "Agora não", retorna à sua página atual sem alterar o Situacao (permanece 'C'); a tela de aceite volta a ser exibida no próximo login, enquanto o convite não expirar (RN-CIU-024)

**Motivador:** o aceite exige uma ação explícita porque o vínculo implica acesso a dados de pacientes da clínica.

#### Mensagem de Bloqueio — Sem Perfil de Acesso

Ícone de aviso (não de erro), texto MSG-I3-01, orientando a aguardar ou contatar o administrador da clínica.

### Critérios de Aceitação

**US-CIU-004 — Administrador convida profissional**

**CA-004.1**: Dado que estou na tela de cadastro de convite, quando informo CPF, nome, e-mail e celular válidos e clico em "Enviar convite", então o sistema cria o Usuario (sem senha) e o vínculo (Situacao = 'C'), envia o e-mail e exibe o toast MSG-S3-01.

**CA-004.2**: Dado que informo um CPF que já pertence a um usuário ativo, quando saio do campo, então os campos Nome/E-mail/Celular são preenchidos com os dados existentes e ficam bloqueados para edição, e o convite reaproveita esse usuário em vez de criar um novo.

**CA-004.3**: Dado que já existe um convite pendente (Situacao = 'C') para o CPF informado nesta clínica, quando tento enviar um novo convite para o mesmo CPF, então o sistema exibe MSG-E3-01 e não cria um convite duplicado.

**CA-004.4**: Dado que selecionei um Perfil de acesso e ao menos uma clínica ao criar o convite, quando o profissional aceita o vínculo, então o perfil e a(s) clínica(s) selecionados já estão associados ao vínculo, sem exibir a mensagem de bloqueio da RN-CIU-015.

**CA-004.5**: Dado que selecionei um Perfil de acesso mas nenhuma clínica (num Cliente com mais de 1 `ClienteEmpresa`), quando tento enviar o convite, então o sistema exibe MSG-E3-06 e não envia o convite até que ao menos uma clínica seja marcada.

**US-CIU-005 — Profissional aceita vínculo com a clínica**

**CA-005.1**: Dado que cliquei no link de um convite e minha conta (criada pelo administrador) ainda não tem senha, quando acesso o link, então sou direcionado para a tela de conclusão de cadastro, não para o wizard de auto-cadastro público nem para o login.

**CA-005.2**: Dado que cliquei no link de um convite e minha conta já tem senha definida, quando acesso o link, então sou direcionado para a tela de login.

**CA-005.3**: Dado que concluí a tela de conclusão de cadastro, quando defino minha senha e confirmo, então sou autenticado automaticamente e direcionado para a tela de aceite do vínculo, não para Meu Perfil.

**CA-005.4**: Dado que fiz login (E1), não tenho nenhum vínculo ativo e havia um convite pendente para meu usuário, quando a autenticação é bem-sucedida, então sou direcionado para a tela de aceite do vínculo antes de qualquer outro destino.

**CA-005.5**: Dado que estou na tela de aceite do vínculo, quando marco o checkbox e clico em "Aceitar vínculo", então `UsuarioCliente.Situacao` passa para 'V' e o sistema verifica meu Perfil de acesso.

**CA-005.6**: Dado que cliquei em "Aceitar vínculo" e já existe Perfil de acesso associado, quando o aceite é processado, então sou direcionado para o cockpit do meu tipo de profissional.

**CA-005.7**: Dado que cliquei em "Aceitar vínculo" e não existe Perfil de acesso associado, quando o aceite é processado, então vejo a mensagem de bloqueio orientando a aguardar ou contatar o administrador.

**CA-005.8**: Dado que estou na tela de aceite do vínculo, quando clico em "Agora não", então `Situacao` permanece 'C' e retorno à minha página atual.

**CA-005.9**: Dado que o convite associado ao meu usuário expirou (RN-CIU-024), quando acesso o link do e-mail, então o link não funciona mais e vejo a mensagem MSG-E3-03.

### Fluxos de Exceção

**EX-E3-01 — Convite duplicado para o mesmo CPF na mesma clínica**
Gatilho: administrador tenta criar um convite para um CPF com convite pendente (Situacao = 'C') na mesma clínica. Comportamento: mensagem inline MSG-E3-01; botão "Enviar convite" permanece desabilitado até o CPF ser alterado. Recuperação: administrador cancela o convite existente antes de criar um novo, ou aguarda o aceite/expiração.

**EX-E3-02 — Falha no envio do e-mail de convite**
Gatilho: serviço de envio de e-mail indisponível ou falha ao entregar. Comportamento: toast error MSG-E3-02 exibido para o administrador; o convite é criado no sistema (Usuario e vínculo já existem), mas o e-mail não foi confirmado como enviado. Recuperação: administrador pode reenviar o convite (gera um novo token, mesmo vínculo).

**EX-E3-03 — Link de convite expirado**
Gatilho: pessoa acessa o link do e-mail após o prazo de validade do token (RN-CIU-024). Comportamento: página informativa exibindo MSG-E3-03, orientando a pessoa a contatar o administrador da clínica. Recuperação: administrador cria um novo convite (novo token) para o mesmo vínculo ou reenvia.

**EX-E3-04 — Link de convite cancelado**
Gatilho: pessoa acessa o link do e-mail depois de o administrador ter cancelado o convite. Comportamento: página informativa exibindo MSG-E3-04. Recuperação: administrador cria um novo convite, se ainda desejar vincular a pessoa.

**EX-E3-05 — Profissional adia o aceite do vínculo**
Gatilho: profissional clica em "Agora não" na tela de aceite. Comportamento: retorna à página atual; `Situacao` permanece 'C'. Recuperação: a tela de aceite é exibida novamente no próximo login ou conclusão de cadastro, enquanto o convite não expirar.

**EX-E3-06 — Erro ao processar o aceite do vínculo**
Gatilho: back-end retorna erro ao tentar atualizar `Situacao` durante o aceite. Comportamento: toast error MSG-E3-05 exibido na tela de aceite; botão "Aceitar vínculo" volta ao estado default. Recuperação: profissional tenta novamente.

**EX-E3-07 — Tentativa de auto-cadastro público (E2) com CPF já convidado**
Gatilho: pessoa com um convite pendente (Situacao = 'C', Usuario ainda sem senha) tenta se auto-cadastrar pela tela pública do E2, em vez de usar o link do e-mail. Comportamento: o E2 já bloquearia por CPF duplicado (RN-CIU-004, dialog MSG-E2-02: "Fazer login ou recuperar senha"). Como a conta não tem senha, nenhuma das duas opções funciona de fato — por isso o dialog de CPF duplicado, ao detectar que o Usuario correspondente está em Situacao = 'C' com Hash nulo, exibe uma terceira orientação — "Você tem um convite pendente. Verifique seu e-mail para completar seu cadastro" — em vez de (ou além de) "Fazer login"/"Recuperar senha". Recuperação: pessoa localiza o e-mail de convite e usa o link correto.

### Validações de Campos

|Campo|Tela|Tipo|Obrigatório|Formato/Regra|Mensagem de erro|
|---|---|---|---|---|---|
|CPF (convite)|Cadastro de convite|Texto com máscara|Sim|11 dígitos + validação de dígitos verificadores (RN-CIU-004)|MSG-E2-01 (reaproveitada do E2)|
|Nome (convite)|Cadastro de convite|Texto|Sim|Mínimo 3 caracteres (mesma regra do E2) — campo NOT NULL em Usuario|MSG-E2-07 (reaproveitada do E2)|
|E-mail (convite)|Cadastro de convite|E-mail|Sim|Formato válido|MSG-E2-03 (reaproveitada do E2)|
|Celular (convite)|Cadastro de convite|Texto com máscara|Sim|Máscara parametrizada por país (RN-CIU-020)|MSG-E2-10 (reaproveitada do E2)|
|Perfil de acesso (convite)|Cadastro de convite|Select|Não|Lista de ClientePerfilAcesso da clínica|N/A|
|Clínica(s) (convite)|Cadastro de convite|Multi-select|Sim, se Perfil de acesso selecionado e o Cliente tem mais de 1 ClienteEmpresa|Lista de ClienteEmpresa do Cliente|MSG-E3-06|
|Campos da Etapa 1 (conclusão de cadastro)|Tela de conclusão de cadastro|Diversos|Conforme RN-CIU-003/017-021|Mesmas regras do E2|Mesmas mensagens do E2 (catálogo Seção 10 do E2)|
|Senha (conclusão de cadastro)|Tela de conclusão de cadastro|Password|Sim|Mesmos critérios do RN-CIU-006|Indicador visual (reaproveitado do E2)|
|Checkbox de aceite|Tela de aceite do vínculo|Checkbox|Sim (para habilitar o botão)|Boolean|N/A — botão permanece desabilitado|

### 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)|CPF, Nome, E-mail, Celular (convite e conclusão de cadastro)|
|Select|Default|default, open, selected|input-height: 56px, radius-m (8px), neutral-light border|Perfil de acesso (convite)|
|Button|Primary|default, hover, loading, disabled|btn-height: 40px, primary-pure bg (#00E676), base-pure text (#FFFFFF), radius-m (8px)|Enviar convite (MSG-B3-01), Concluir cadastro (MSG-B3-04), Aceitar vínculo (MSG-B3-02)|
|Button|Tertiary|default, hover|Transparent bg, primary-pure text (#00E676)|Agora não|
|Checkbox|Default|default, checked, disabled|20px box, primary-pure (#00E676) quando checked|Checkbox de aceite (MSG-C3-01), "Sou profissional de saúde" (reaproveitado do E2)|
|Toast|Success, Error|animation: toast-in (300ms)|secondary-dark bg (#0091EA) / error-pure bg (#F44336)|Convite enviado, erro de envio, erro ao aceitar vínculo|
|Banner/Ícone informativo|Info, Warning|default|secondary-pure (#40C4FF) para info / highlight-pure (#FFC400) para aviso|CPF já cadastrado (MSG-I3-02, informativo); mensagem de bloqueio sem Perfil de acesso (aviso)|

### Integração com Backend

|Função|Método|Path|Request Body|Response Body|Códigos HTTP|
|---|---|---|---|---|---|
|Criar convite|POST|/api/convites|{ cpf, nome, email, telefone, clientePerfilAcessoId?, clienteEmpresaIds?: uuid[] }|{ usuarioClienteId: uuid, usuarioReaproveitado: boolean }|201, 400 (Perfil de acesso sem clínica selecionada), 409 (convite duplicado pendente)|
|Validar token de convite|GET|/api/convites/validar?token={token}|—|{ valido: boolean, usuarioClienteId: uuid, cpf, nome, email, temSenha: boolean, clienteNome: string, clienteLogo: string, clienteEmpresas: [{ clienteEmpresaId: uuid, nome: string, caminhoLogo: string }] }|200, 404 (token inválido), 410 (expirado ou cancelado)|
|Concluir cadastro via convite|POST|/api/convites/{usuarioClienteId}/completar-cadastro|{ token, nome?, tipoProfissional?, conselho?, dadosAvancados?, senha }|{ success: true }|200, 400, 410 (expirado)|
|Aceitar vínculo|POST|/api/convites/{usuarioClienteId}/aceitar|{ token }|{ situacao: 'V', temPerfilAcesso: boolean }|200, 400, 410 (expirado)|
|Cancelar convite|DELETE|/api/convites/{usuarioClienteId}|—|{ success: true }|200, 404|
|Reenviar convite|POST|/api/convites/{usuarioClienteId}/reenviar|—|{ success: true }|200, 404, 410|

Nota sobre o endpoint de login (E1): a resposta do endpoint `/api/auth/login` inclui o campo `convitesPendentes: number` (já documentado no E1, 02 - Especificação, seção "Integração com Backend"), calculado como a contagem de vínculos (UsuarioCliente) com Situacao = 'C' e RemovidoEm nulo para o usuário autenticado.

Nota sobre padronização de nomes: o campo `clienteEmpresas` acima usa `clienteEmpresaId` como identificador de cada item — mesmo nome de array e de campo usados pelo E6 (`GET .../clinic-selection` e `POST .../accept-invite`, 02 - Especificação do E6), para que o front-end trate o mesmo conceito (uma `ClienteEmpresa` associada a um convite) de forma consistente nos três lugares onde aparece.

### Catálogo de Mensagens do Sistema e Termos de Interface (i18n)

**Mensagens de erro**

|ID|Contexto|pt-BR|en-US|es-419|
|---|---|---|---|---|
|MSG-E3-01|Convite duplicado pendente|"Já existe um convite pendente para este CPF nesta clínica."|"There is already a pending invitation for this CPF at this clinic."|"Ya existe una invitación pendiente para este CPF en esta clínica."|
|MSG-E3-02|Falha no envio do e-mail de convite|"Não foi possível enviar o e-mail de convite. Tente novamente."|"Could not send the invitation email. Please try again."|"No fue posible enviar el correo de invitación. Inténtelo de nuevo."|
|MSG-E3-03|Link de convite expirado|"Este convite expirou. Entre em contato com o administrador da sua clínica para receber um novo convite."|"This invitation has expired. Contact your clinic's administrator to receive a new invitation."|"Esta invitación ha expirado. Comuníquese con el administrador de su clínica para recibir una nueva invitación."|
|MSG-E3-04|Link de convite cancelado|"Este convite não é mais válido. Entre em contato com o administrador da sua clínica."|"This invitation is no longer valid. Contact your clinic's administrator."|"Esta invitación ya no es válida. Comuníquese con el administrador de su clínica."|
|MSG-E3-05|Erro ao aceitar vínculo|"Não foi possível concluir o vínculo com a clínica. Tente novamente."|"Could not complete the link with the clinic. Please try again."|"No fue posible completar el vínculo con la clínica. Inténtelo de nuevo."|
|MSG-E3-06|Perfil de acesso selecionado sem nenhuma clínica marcada|"Selecione ao menos uma clínica para o perfil de acesso escolhido."|"Select at least one clinic for the chosen access profile."|"Seleccione al menos una clínica para el perfil de acceso elegido."|

**Mensagens de sucesso**

|ID|Contexto|pt-BR|en-US|es-419|
|---|---|---|---|---|
|MSG-S3-01|Convite enviado com sucesso|"Convite enviado com sucesso!"|"Invitation sent successfully!"|"¡Invitación enviada con éxito!"|

**Mensagens informativas**

|ID|Contexto|pt-BR|en-US|es-419|
|---|---|---|---|---|
|MSG-I3-01|Bloqueio — sem Perfil de acesso após aceite|"Seu vínculo com a clínica foi confirmado, mas você ainda não tem um perfil de acesso definido. Aguarde ou entre em contato com o administrador da clínica."|"Your link with the clinic has been confirmed, but you don't have an access profile defined yet. Please wait or contact the clinic's administrator."|"Su vínculo con la clínica ha sido confirmado, pero aún no tiene un perfil de acceso definido. Espere o comuníquese con el administrador de la clínica."|
|MSG-I3-02|CPF já cadastrado (cadastro de convite)|"Este CPF já pertence a um usuário cadastrado no Gemed. O convite será associado à conta existente."|"This CPF already belongs to a registered Gemed user. The invitation will be linked to the existing account."|"Este CPF ya pertenece a un usuario registrado en Gemed. La invitación se asociará a la cuenta existente."|

**Textos orientadores**

|ID|Contexto|pt-BR|en-US|es-419|
|---|---|---|---|---|
|MSG-T3-02|Tela de aceite — regras básicas (placeholder)|**[PROPOSTA — texto completo não fornecido pelo solicitante]** "Antes de continuar, leia as regras básicas de uso do Gemed."|"Before continuing, read the basic rules for using Gemed."|"Antes de continuar, lea las reglas básicas de uso de Gemed."|

**Rótulos de botões e links**

|ID|Elemento|pt-BR|en-US|es-419|
|---|---|---|---|---|
|MSG-B3-01|Botão (cadastro de convite)|"Enviar convite"|"Send invitation"|"Enviar invitación"|
|MSG-B3-02|Botão (tela de aceite)|"Aceitar vínculo"|"Accept link"|"Aceptar vínculo"|
|MSG-B3-03|Link (tela de aceite)|"Agora não"|"Not now"|"Ahora no"|
|MSG-B3-04|Botão (conclusão de cadastro)|"Concluir cadastro"|"Complete registration"|"Finalizar registro"|

**Rótulos de checkbox**

|ID|Elemento|pt-BR|en-US|es-419|
|---|---|---|---|---|
|MSG-C3-01|Checkbox (tela de aceite)|"Li e aceito o vínculo com [clínica]"|"I have read and accept the link with [clinic]"|"He leído y acepto el vínculo con [clínica]"|

### Conformidade SBIS (detalhamento)

**NGS1.03.08 — Gerenciamento de usuários** (estágio 1, obrigatório) — o cadastro de convite é o administrador da clínica gerenciando usuários diretamente pela aplicação: cria a conta do profissional (Usuario) e o vínculo com a clínica (UsuarioCliente).

**NGS1.03.03 — Gerenciamento de perfis** (estágio 1, obrigatório) — este épico consome o gerenciamento de perfis (ClientePerfilAcesso, presumivelmente gerenciado em funcionalidade própria do Contexto de Segurança) tanto na seleção de perfil ao criar o convite quanto na verificação pós-aceite (RN-CIU-015).

**NGS1.03.01 — Impedir acesso por pessoas não autorizadas** (estágio 1, obrigatório) — a mensagem de bloqueio (Descrição Funcional) aplica este requisito diretamente: vínculo aceito (Situacao = 'V') sem Perfil de acesso associado não concede acesso às funcionalidades da clínica.

**NGS1.03.09 — Identidade única da pessoa e responsabilização** (estágio 1, obrigatório) — RN-CIU-011 verifica CPF já cadastrado antes de criar um novo Usuario: o administrador nunca cria uma conta duplicada para uma pessoa que já existe no Gemed.

**ECF.17.19 — Mensagens do sistema** (estágio 1, obrigatório) — todas as mensagens exibidas ao usuário estão catalogadas acima, em linguagem não técnica, em português do Brasil, com suporte multilíngue para en-US e es-419.

---

## Histórico de Versões

- **v3.1** (29/08/2026) — Arquivo criado pela divisão do documento único `(CIU-E3) Convite e Vínculo v3.1.md` em arquivos por seção (ver Skill Designer, "Organização Física: Pasta por Funcionalidade", Lição #18). Conteúdo sem alteração de substância em relação à v3.1 original — apenas reorganização física. Histórico de revisões anterior a esta divisão (v1.0 a v3.1) preservado integralmente no documento original arquivado.
- **v3.2** (14/09/2026) — cadastro de convite passa a pedir a(s) clínica(s) (`ClienteEmpresa`) junto do Perfil de acesso (novo campo "Clínica(s)", multi-select condicional; MSG-E3-06, CA-004.5); tela de aceite do vínculo passa a exibir nome/logo da(s) clínica(s) associadas, com o Cliente como fallback enquanto nenhuma estiver associada; endpoints "Criar convite" e "Validar token de convite" atualizados. Ver RN-CIU-011/015 (Seção 1) para a regra completa.
- **v3.3** (14/09/2026) — três correções sobre a v3.2: (1) referência cruzada obsoleta em "Integração com Backend" — apontava para "(CIU-E1), Seção 9.1", numeração do formato legado de documento único, substituído desde a reconstrução do E1 em 4 arquivos (30/08/2026); corrigida para apontar ao E1, 02 - Especificação, "Integração com Backend"; (2) padronizado o identificador de item em `clienteEmpresas` (endpoint "Validar token de convite") de `id` para `clienteEmpresaId`, e adicionada nota explícita de padronização — mesmo nome de array e de campo agora usados pelo E3 e pelo E6 (`GET .../clinic-selection`, `POST .../accept-invite`) para o mesmo conceito, eliminando a inconsistência de nomes entre os três lugares; (3) removida do corpo de EX-E3-07 a menção "confirmado pelo solicitante em 27/08/2026" — a proveniência já está preservada no Histórico de Versões do documento onde essa decisão foi originalmente tomada, e o corpo de uma regra ou fluxo não deve carregar data/atribuição (convenção de "corpo atemporal" da Skill Designer).
- **v3.4** (14/09/2026) — campo "Clínica(s)" do cadastro de convite passa a listar apenas `ClienteEmpresa` ativas (`RemovidoEm` nulo) — consequência da confirmação do solicitante de que uma clínica desativada não deve ser oferecida como opção. Ver RN-CIU-011 (Seção 1) para a regra completa.
