Mensageria — Especificação (v1.16)
Documentos desta funcionalidade: 01 - Definição (v1.16) · 02 - Especificação (v1.16) · 03 - Protótipo (v1.16, código em 03 - Protótipo v1.16.html) · 04 - Mapeamento de Banco de Dados (v1.16) · Cenários de Teste (v1.16) · 05 - Registro de Decisões (v1.16)
Regras de negócio: RN-MSG-001 a RN-MSG-036, definidas no documento 01 e referenciadas aqui por ID. Regras de outras funcionalidades: RN-CM-015 e RN-CM-022 (Central do Médico), RN-AGM-018 (Agenda do Médico). Decisões transversais: DT-001 (data e fuso da clínica), DT-005, DT-006 (resolver vale para todos), DT-008 (ícones só Lucide ou react-icons), DT-011 (tradução de termos), DT-012 (idioma da clínica).
Marcação: [PROPOSTA] é sugestão do Designer que aguarda decisão do solicitante (ver 05 - Registro de Decisões).
2.1 Premissa de design
Cada decisão de interface vem de um momento do workflow descrito no documento 01 (item 1.5):
- Ler rápido entre atendimentos (médico): cartões iguais no painel e na lista, uma linha por informação, sem rolagem horizontal.
- Saber se o recado foi visto (recepção): última mensagem e seu autor sempre no cartão; estado e quem finalizou na conversa.
- Distinguir pessoa de sistema na hora: ícone de pessoa ou de sino no cartão, antes de ler o texto.
- Aviso de não lida que não compete com o resto: borda lateral discreta mais texto da mensagem em peso médio (a cor sozinha não basta; D-MSG-053).
- Encerrar só depois de abrir: resolver e descartar ficam dentro da conversa, com confirmação, porque a ação vale para todos e não tem “desfazer” (RN-MSG-008). O cartão só abre a conversa (D-MSG-047).
Mobile first: a largura mínima de referência é 360 px; alvos de toque de pelo menos 44 px; o painel e a lista usam coluna única.
2.2 Histórias de usuário
| ID | História |
|---|---|
| US-MSG-01 | Como recepcionista, quero enviar um recado ao médico com paciente, processo e prazo, para que ele reconheça o assunto sem me ligar. |
| US-MSG-02 | Como profissional, quero ver minhas conversas abertas, das não lidas para as lidas, para tratar primeiro o que acabou de chegar ou vence. |
| US-MSG-03 | Como profissional, quero responder na própria conversa, para manter tudo em ordem cronológica. |
| US-MSG-04 | Como profissional, quero resolver ou descartar uma conversa, para tirá-la da minha lista e das dos demais participantes. |
| US-MSG-05 | Como remetente, quero ver o estado da conversa e quem a finalizou, para não precisar perguntar. |
| US-MSG-06 | Como membro de equipe, quero receber as mensagens enviadas à equipe e ver o que os colegas fizeram, para não duplicar o trabalho. |
| US-MSG-07 | Como profissional, quero enviar uma mensagem a mim mesmo, para registrar um lembrete. |
| US-MSG-08 | Como médico, quero abrir o prontuário, a prescrição ou a consulta a partir da conversa, para chegar ao contexto com um clique. |
| US-MSG-09 | Como profissional, quero distinguir alertas do sistema de recados de colegas, e resolvê-los ou descartá-los sem responder. |
| US-MSG-10 | Como gestor, quero que as ações de mensageria fiquem registradas na trilha de auditoria, para atender ao SBIS. |
2.3 Descrição funcional por tela
2.3.1 Cartão de conversa (componente compartilhado)
Usado no painel da Central, na aba “Abertas” e na aba “Finalizadas”. Estrutura, de cima para baixo:
- Ícone à esquerda (círculo de 36 px, como o avatar da Central): pessoa (Lucide
user) quando a última mensagem é de um usuário; sino (Lucidebell) quando é do sistema. Sem foto e sem iniciais (decisão do solicitante, 05/11/2026). - Linha 1, a última mensagem (maior destaque, D-MSG-053): “autor: texto da última mensagem” em até 2 linhas (corpo, 14 px,
--color-neutral-darker; o autor em--color-neutral-dark), truncada com reticências. Autor = “Você” (MSG-TMSG-15), nome do usuário ou “Sistema” (MSG-TMSG-29). Equipe (D-MSG-054, RN-MSG-030): quando o autor da última mensagem é membro da equipe a que a conversa foi endereçada e respondeu em nome dela, o nome da equipe vem entre parênteses, por exemplo “Sandra (Farmácia Oncológica)”; vale também para o próprio usuário, “Você (Enfermagem de Infusão)” [PROPOSTA]. Mesma regra nas mensagens da conversa (2.3.5). À direita, o horário da última mensagem, relativo ao momento atual (RN-MSG-035, D-MSG-032): no mesmo dia e há menos de 1 hora, “Há x min” (MSG-TMSG-39); no mesmo dia, “Há x h” (MSG-TMSG-40); em dia anterior, data e hora. No fuso da clínica (RN-MSG-005), com “dia” de calendário. Quando a última mensagem é do próprio usuário, vem antes da data e hora o ícone Lucidecheck(enviada;--color-neutral-pure) oucheck-check(lida por pelo menos um dos outros participantes;--color-secondary-dark[PROPOSTA]), de 16 px, com o rótulo MSG-TMSG-31 “Enviada” ou MSG-TMSG-32 “Lida” para leitor de tela e dica. - Linha 2, o título da conversa (segundo destaque): o assunto, em uma linha, 12 px,
--color-neutral-dark, truncado com reticências. - Linha 3, contexto (menor destaque): primeiro o chip do grau de urgência, só quando informado (RN-MSG-034, 2.3.8), pequeno, o único elemento com cor cheia; depois, em texto de 12 px sem chip,
--color-neutral-pure, com ícone Lucide de 14 px. Links (D-MSG-054): paciente (user), que leva ao prontuário do paciente; processo, quando houver e não for do tipo Paciente (prescriçãopill, documentofile-text, registro clínicoclipboard-list), com o texto do item escolhido (a identificação da prescrição, o nome do documento ou “data · modelo · profissional”), que leva a esse item. Texto sem link: prazo “Responder até {dt}” (clock) ou, vencido, “Vencida desde {dt}” (triangle-alert,--color-error-dark, peso médio; é o único texto de contexto colorido); “Resolvida” ou “Descartada” na aba “Finalizadas”. Ordem do conteúdo: mensagem, título, urgência, outras informações (D-MSG-053). O cartão não tem chip de estado de envio (Enviada, Lida, Respondida): a última mensagem e o seu autor já mostram se houve resposta, e o ícone do horário mostra se a mensagem do usuário foi lida (D-MSG-023). - Sem botão de ação (D-MSG-047): o cartão abre o modal (no painel) ou a página da conversa (na lista) ao ser tocado em qualquer ponto, menos nos links de paciente e de processo (D-MSG-054). Para não haver link dentro de botão (HTML inválido e confuso para leitor de tela), o cartão é um contêiner com um botão que cobre todo o cartão (nome acessível: não lida, autor, mensagem e assunto) e, por cima dele, os links [PROPOSTA]. Cada link tem área de toque de 44 x 44 px (Design System; Central 2.8), maior que o texto, e nome acessível “Abrir prontuário: {paciente}” (MSG-BMSG-12) ou “Abrir prescrição/documento/registro clínico: {item}” (MSG-BMSG-13, 15, 16). “Resolvido” e “Descartado” existem só dentro da conversa (2.3.5), para que a leitura venha antes de encerrar, em especial nos alertas do sistema.
- Não lida (RN-MSG-017): borda esquerda de 3 px em
--color-secondary-dark(6,1:1 no tema claro e 11,1:1 no escuro) e texto da última mensagem em peso médio, como no painel da Central (D-CM-045, D-MSG-021); o ícone de carta (mail) deixou de existir (D-MSG-053) e o leitor de tela recebe o texto MSG-TMSG-10. Cartão lido: borda esquerda transparente e texto em peso normal. - Clínica (RN-MSG-025): quando o usuário atende em mais de uma clínica, o nome curto da clínica de origem, com o ícone Lucide
building-2de 14 px e texto de 12 px em--color-neutral-pure, sem chip (Central, D-CM-064, D-CM-066). Com uma só clínica, não aparece. - Aparência do cartão (D-MSG-045, D-MSG-053): cartões separados entre si, cada um com cantos arredondados (
--radius-m, 8 px), borda de 1 px em--color-base-darke espaço vertical entre eles (--sp-2), fundo--color-base-darkao passar o mouse, como os cartões do painel da Central (D-CM-045). O estado “não lida” muda só a borda esquerda (item 6). O painel tem cabeçalho com fundo--color-base-dark, altura mínima de 52 px e a contagem em pílula neutra clara, como os painéis da Central. Vale para o painel e para a lista (abas Abertas e Finalizadas).
Estados do cartão (cartão separado, com cantos arredondados, item 8): padrão, não lida, vencida, finalizada (sem botão), foco (anel de foco do Design System), pressionado. Em modo escuro, usar os tokens do Design System; nenhuma cor fixa no código.
2.3.2 Painel de Mensagens (Central do Médico)
- Título “Mensagens” (link para a lista) com a contagem de conversas abertas.
- Todas as conversas abertas, sem limite de cartões (RN-MSG-001, RN-MSG-002), na ordem de RN-MSG-002. O painel tem rolagem própria, como os demais painéis da Central (Especificação da Central, 2.5), e o título é o link para a lista (D-MSG-049). Não há link “Ver todas as mensagens”.
- Estado vazio: “Nenhuma conversa em aberto.” (MSG-TMSG-02).
- Estado de carregamento: esqueleto de cartões. Falha de atualização: faixa de sem conexão do Design System (reuso do texto da Central).
- Atualização automática a cada 1 minuto (como o painel atual da Central, RN-CM-017).
2.3.3 Tela de Mensagens (lista)
- Acesso: item de menu “Mensagens” e link do painel.
- Linha de fuso da clínica no topo (MSG-TAGM-09; destacada com MSG-TAGM-10 quando o aparelho está em outro fuso), como na Agenda (RN-MSG-005).
- Botão “Nova mensagem” (primário:
--color-primary-strongcom texto--color-on-primary-strong, Lucideplus); aparece só para quem tem o direito Enviar (RN-MSG-024). - Duas abas com contagem: “Abertas” e “Finalizadas” (RN-MSG-011).
- Ordem em “Abertas” (RN-MSG-002): primeiro as não lidas, depois as lidas pendentes; em cada grupo, a mais nova primeiro, usando a chave “maior entre a última mensagem e o prazo”.
- Ordem em “Finalizadas” [PROPOSTA]: pela data e hora da finalização, da mais nova para a mais antiga (P-MSG-11).
- Paginação por rolagem, 20 por página [PROPOSTA]. Estado vazio por aba (MSG-TMSG-02 e MSG-TMSG-03).
2.3.4 Nova mensagem
Campos, nesta ordem, com rótulo fixo acima (sem rótulo flutuante). Os campos de busca (destinatário, paciente e item do processo) seguem o comportamento de 2.3.9:
| Campo | Obrigatório | Regra |
|---|---|---|
| Destinatário | sim | Busca com autocomplete (RN-MSG-036; D-MSG-038): o usuário digita o nome e escolhe um resultado; seleção única. Os resultados vêm em dois grupos, “Equipes” primeiro (com o número de membros) e “Pessoas” depois (inclui o usuário, marcado “(você)”). RN-MSG-007, RN-MSG-015 |
| Assunto | sim | Até 200 caracteres, com contador |
| Mensagem | sim | Texto livre, até 2000 caracteres, com contador “n/2000” no componente de texto (D-MSG-030); o mesmo limite e contador no campo de resposta |
| Opcionais | — | Subtítulo “Opcionais” (MSG-LMSG-20) antes dos quatro campos seguintes, nesta ordem (D-MSG-040) |
| Grau de urgência | não | Quatro botões de rádio lado a lado (“Rotina”, “Urgente”, “Quanto antes”, “Imediato”), nenhum marcado por padrão; tocar na opção marcada a desmarca (volta a “Não informado”). Texto de ajuda: o grau não pode ser alterado depois do envio (MSG-TMSG-37 e 38). Formato do controle: [PROPOSTA, E-MSG-016]. RN-MSG-034 |
| Prazo para resposta | não | Um único campo de data e hora, com máscara do idioma da clínica, 24 h (RN-MSG-012), que aceita só datas existentes (31/02 é recusado com MSG-EMSG-05). Não pode ser anterior ao envio (RN-MSG-004) |
| Paciente | não | Busca com autocomplete pelo nome (a mesma da Central, 2.8.8); uma seleção. RN-MSG-020, RN-MSG-036 |
| Processo relacionado | não | Atalho rápido para o objeto a que se quer direcionar quem lê. Um só tipo por conversa: Paciente (prontuário), Prescrição, Documento ou Registro clínico (D-MSG-035, 037). Escolha em três etapas (D-MSG-036): (1) o paciente, que é o campo “Paciente” do formulário; (2) o tipo de objeto (lista de quatro opções), que só habilita depois do paciente; (3) o item, por busca com autocomplete entre os do paciente escolhido (RN-MSG-036): Prescrição, pela identificação da prescrição (qualquer parte do texto); Documento, pelo nome, exibido com a data; Registro clínico, pela data do evento, exibido com a data, o modelo e o profissional, com tratamento e apelido (D-MSG-050, 051; origem dos dados em 04, 4.4.1). O tipo Paciente não tem etapa 3. Trocar o paciente zera o tipo e o item [PROPOSTA, E-MSG-020]. RN-MSG-021 |
Botões: “Enviar” (primário) e “Cancelar”. “Enviar” fica desabilitado enquanto a requisição está em curso. Sucesso: volta à lista, não à conversa, e mostra “Mensagem enviada.” (MSG-TMSG-26). O padrão de botões é o do Design System, seção 12 (D-MSG-022): um só preenchido por região, em verde escuro; “Cancelar” com contorno.
2.3.5 Conversa (página e modal)
Mesmo conteúdo na página (a partir da lista) e no modal (a partir do painel). No celular o modal é uma folha inferior; em telas largas, caixa centralizada.
- Estado: chip “Resolvida” ou “Descartada” só quando a conversa está finalizada (MSG-TMSG-08 e 09). Nas conversas abertas, cada mensagem do usuário mostra o ícone
checkoucheck-checkao lado da data e hora, com a mesma regra do cartão [PROPOSTA]. - Mensagens: o autor de cada mensagem segue a regra de equipe do cartão (2.3.1, item 2; RN-MSG-030).
- Cabeçalho: botão Voltar (Lucide
arrow-left) sempre à esquerda; assunto; linhas “De” e “Para” (RN-MSG-006; MSG-TMSG-12, 13, 14); chips e links (grau de urgência quando informado; paciente e processo como links; prazo; e, se finalizada, Resolvida ou Descartada); processo, quando houver (RN-MSG-021), como link na mesma linha de chips e links do cabeçalho, com o texto do item (não há mais botão “Abrir …”; D-MSG-054); o paciente também é link, para o prontuário. No tipo Paciente, o atalho é o próprio link do paciente. - Conversa finalizada: linha “Resolvida por {name} em {dt}” ou “Descartada por {name} em {dt}” (MSG-TMSG-16/17), sem campo de resposta e sem botões, com o aviso MSG-TMSG-19 (RN-MSG-009).
- Mensagens: em ordem cronológica; as do usuário logado alinhadas à direita; cada uma com autor, data e hora. Mensagens do sistema com o sino e “Sistema”. Mensagem do sistema acrescentada a um alerta aberto (autor nulo, sequência maior que 1) rotulada “Atualização do sistema” [PROPOSTA, MSG-TMSG-30]; o tipo gravado é sempre
Response(04, 4.1). - Campo de resposta (RN-MSG-019): placeholder “Escreva uma resposta…” (MSG-LMSG-14) e botão “Responder” (Lucide
send). Ausente em conversa finalizada e em alerta do sistema (aviso MSG-TMSG-20, RN-MSG-010). - Ações: “Resolvido” e “Descartado”, cada uma com confirmação (2.3.6).
- Ao abrir, a conversa é marcada como lida para o usuário (RN-MSG-017).
2.3.6 Confirmação de resolver e descartar
Caixa de diálogo com os textos já existentes da Central (reuso): título, corpo e botão de confirmação de MSG_resolveConfirm* e MSG_discardConfirm*. Foco inicial em “Cancelar”; Esc cancela. Depois de confirmar: toast “Conversa resolvida.” (MSG-TMSG-24) ou “Conversa descartada.” (MSG-TMSG-25); a conversa sai da aba “Abertas” e do painel (RN-MSG-001).
2.3.7 Regras de apresentação da ordem e do estado
- Ordem: dentro de cada camada (não lidas, lidas pendentes), primeiro o grau de urgência (Imediato, Quanto antes, Urgente, Rotina e, por último, sem grau, que conta como 0) e, dentro do mesmo grau, a chave de data
max(dataHoraUltimaMensagem, prazo)quando há prazo; senão,dataHoraUltimaMensagem. Empate: a mais recente criada primeiro (RN-MSG-002, D-MSG-026). - Horário relativo do cartão (RN-MSG-035):
agorae a data da mensagem são convertidos para o fuso da clínica (serverNow, nunca o relógio do aparelho). Mesmo dia de calendário:x = minutos decorridosse menor que 60 (“Há x min”), senãox = horas decorridas(“Há x h”). Outro dia: data e hora no formato do idioma. [PROPOSTA, E-MSG-019]: x é o inteiro por truncamento, com mínimo de 1 min; dentro da conversa, o horário de cada mensagem continua em data e hora; o texto relativo é recalculado a cada atualização automática de 1 minuto. - Vencida:
prazo < agoraem conversa aberta, incluindo alertas do sistema. Calculado na API com a hora do servidor (serverNow), nunca com o relógio do aparelho. - Não lida para o usuário: existe mensagem de sequência maior que a última lida por ele. Quem acabou de enviar ou responder tem a conversa como lida.
- Participante: quem enviou, ou quem está entre os destinatários copiados no envio. Só participantes veem a conversa (RN-MSG-031); a clínica da conversa é a do remetente (RN-MSG-025).
2.3.8 Grau de urgência (RN-MSG-034)
Chip de urgência, família nova do Design System para alertas que pedem ação (seção 13; D-MSG-027). Aparece só quando a conversa tem grau, no cartão (painel, Abertas e Finalizadas), como primeiro item da linha de contexto, antes do paciente e do prazo, e no cabeçalho da conversa, depois do chip do paciente e antes do de prazo [PROPOSTA, E-MSG-017]. O texto visível é só o nome do grau (“Rotina”, “Urgente”, “Quanto antes”, “Imediato”; MSG-IND-1 a 4), porque “Urgência Urgente” seria repetido; o título e o nome acessível são “Grau de urgência: {nome}” (MSG-TMSG-36) [PROPOSTA, E-MSG-022]. Ícone Lucide flag de 14 px, peso font-weight-medium, altura mínima de 24 px, raio de pílula. No cartão, o chip é o único elemento de contexto com fundo colorido (paciente e prazo viram texto; D-MSG-053).
| Valor | Nome | Preenchimento | Texto e ícone | Contorno | Ícone |
|---|---|---|---|---|---|
stat | Imediato | --color-alert-fill | --color-base-pure (5,0:1 no claro; 4,6:1 no escuro) | nenhum | flag preenchida |
asap | Quanto antes | --color-error-light | --color-error-dark (5,5:1 no claro; 6,3:1 no escuro) | 1 px --color-error-dark | flag só contorno |
urgent | Urgente | --color-neutral-lighter | --color-neutral-dark (12,1:1 no claro; 8,8:1 no escuro) | nenhum | flag só contorno |
routine | Rotina | transparente | --color-neutral-dark | 1 px --color-neutral-light | flag só contorno |
A correspondência dos quatro valores com os quatro estilos do Design System (seção 13), do mais forte ao mais discreto, é [PROPOSTA, E-MSG-022]; as cores e contrastes são os já aprovados (D-MSG-027).
O grau Rotina também aparece como chip (D-MSG-043). Sem amarelo: o amarelo é do prazo (highlight), e no tema escuro um chip amarelo para o penúltimo nível chamava mais atenção do que o último (D-MSG-027). O contorno é decorativo; a informação está no texto e no ícone. Cada tema usa os tokens do próprio tema; nenhuma cor fixa no código.
2.3.9 Campos de busca com autocomplete (RN-MSG-036)
Decisão do solicitante (D-MSG-038): destinatário, paciente e item do processo são campos de busca com autocomplete. Os detalhes abaixo são [PROPOSTA, E-MSG-021]:
- Busca: a cada digitação, com atraso de 300 ms; sem texto, mostra as primeiras 8 opções (no destinatário, equipes primeiro). Ignora maiúsculas e acentos; vários termos separados por espaço, todos devem aparecer (“20/10 ana”).
- Resultados: até 8, em lista abaixo do campo; no destinatário, os grupos “Equipes” (MSG-LMSG-03) e “Pessoas” (MSG-LMSG-02) com cabeçalho; havendo mais, o aviso MSG-TMSG-42; sem resultado, MSG-TMSG-41.
- Chaves de busca e exibição do item (D-MSG-050): Prescrição: busca em
Prescricao.Identificacao, por qualquer parte do texto; mostra a identificação e, como apoio, a data da prescrição. Documento: busca pelo nome; mostra o nome e a data. Registro clínico: busca pela data do evento, em “dd/mm” ou “dd/mm/aaaa” (por exemplo “21/10” ou “21/10/2026”); mostra data do evento, modelo e profissional (tratamento e apelido, por exemplo “Dr. Carlos”; ordem confirmada, D-MSG-052). Paciente: busca pelo nome. Cada tipo busca só no campo indicado (não busca nos outros campos mostrados). A busca ignora maiúsculas e acentos e combina vários termos (RN-MSG-036). Colunas e tabelas em 04, 4.4.1. - Escolha: clicar ou tocar no resultado, ou Enter no resultado destacado; o campo passa a mostrar o rótulo escolhido. Digitar de novo limpa a escolha.
- Teclado e leitor de tela: padrão de caixa de combinação (campo com papel
combobox, lista com papellistbox,aria-expanded,aria-activedescendant); setas movem o destaque, Enter escolhe, Esc fecha; alvo de toque dos resultados de pelo menos 44 px. - Ordem dos itens do processo: pela data do evento, do mais recente ao mais antigo (Documento, pela data exibida; Registro clínico, pela data do registro; Prescrição, pela data da prescrição). A direção é [PROPOSTA]; a regra de ordem pode mudar quando esses módulos forem detalhados (D-MSG-044; P-MSG-34).
- API: as buscas são feitas no servidor (2.8.7 a 2.8.9), com
qelimit.
2.4 Critérios de aceitação
| ID | Critério | História | RN |
|---|---|---|---|
| CA-MSG-001.1 | Dado que tenho conversas abertas lidas e não lidas, quando abro o painel, então vejo todas elas como cartões, os não lidos primeiro, e cada grupo da mais nova para a mais antiga | US-MSG-02 | RN-MSG-001, 002 |
| CA-MSG-001.2 | Dado duas conversas lidas, uma com prazo mais recente do que a última mensagem da outra, que não tem prazo, então a de prazo vem primeiro | US-MSG-02 | RN-MSG-002 |
| CA-MSG-001.3 | Dado que as conversas abertas não cabem na altura do painel, então o painel rola dentro do próprio quadro, sem limite de cartões e sem link “Ver todas as mensagens” | US-MSG-02 | RN-MSG-001; D-MSG-049 |
| CA-MSG-001.4 | Dado que não há conversa aberta, então o painel mostra “Nenhuma conversa em aberto.” | US-MSG-02 | RN-MSG-001 |
| CA-MSG-001.5 | Dado uma conversa resolvida ou descartada, então ela não aparece no painel e aparece na aba “Finalizadas” | US-MSG-04 | RN-MSG-001, 011 |
| CA-MSG-002.1 | Dado uma conversa cujo prazo passou, então o cartão mostra o chip “Vencida desde {dt}”; ao resolvê-la ou descartá-la o chip some | US-MSG-02 | RN-MSG-003 |
| CA-MSG-002.2 | Dado um alerta do sistema com prazo vencido, então ele também mostra “Vencida” | US-MSG-09 | RN-MSG-003 |
| CA-MSG-002.3 | Dado que informo um prazo anterior ao momento do envio, então o formulário mostra MSG-EMSG-04 e a API recusa com 400, mesmo se a validação do formulário for contornada | US-MSG-01 | RN-MSG-004 |
| CA-MSG-002.4 | Dado que o aparelho está em fuso diferente do da clínica, então os horários são os da clínica e a linha de fuso aparece destacada | US-MSG-02 | RN-MSG-005 |
| CA-MSG-003.1 | Dado uma conversa não lida, então o cartão mostra a borda lateral e a última mensagem em peso médio; depois de aberta, ambos somem | US-MSG-02 | RN-MSG-017 |
| CA-MSG-003.2 | Dado que outro participante leu a conversa, então ela continua não lida para mim | US-MSG-06 | RN-MSG-017 |
| CA-MSG-003.3 | Dado que acabei de enviar uma mensagem, então a conversa não aparece como não lida para mim | US-MSG-01 | RN-MSG-017 |
| CA-MSG-004.1 | Dado a última mensagem de um usuário, então o cartão mostra o ícone de pessoa; se do sistema, o sino e “Sistema:“ | US-MSG-09 | RN-MSG-014, 028 |
| CA-MSG-004.2 | Dado a primeira linha do cartão, então ela mostra “autor: texto” da última mensagem, em até 2 linhas, com “Você”, o nome ou “Sistema”; o assunto vem logo abaixo, em texto menor | US-MSG-05 | RN-MSG-018; D-MSG-053 |
| CA-MSG-005.1 | Dado que abro a conversa e escolho “Resolvido”, então aparece a confirmação com foco em “Cancelar”; ao confirmar, a conversa é resolvida para todos os participantes | US-MSG-04 | RN-MSG-008 |
| CA-MSG-005.2 | Dado que sou o remetente, então também posso resolver ou descartar | US-MSG-04 | RN-MSG-008 |
| CA-MSG-005.3 | Dado uma conversa de equipe finalizada por um membro, então todos os membros a veem finalizada, com o nome de quem finalizou | US-MSG-06 | RN-MSG-018 |
| CA-MSG-005.4 | Dado uma conversa finalizada, então a tela não mostra campo de resposta nem botões de ação, e a API recusa resposta e nova finalização com 409 | US-MSG-04 | RN-MSG-009 |
| CA-MSG-005.5 | Dado que finalizo uma conversa sem que ninguém tenha respondido, então nenhuma mensagem é criada e o cabeçalho mostra “Resolvida por {name} em {dt}“ | US-MSG-04 | RN-MSG-009 |
| CA-MSG-006.1 | Dado um alerta do sistema, então não há campo de resposta, aparece MSG-TMSG-20, e a API recusa resposta com 409 | US-MSG-09 | RN-MSG-010 |
| CA-MSG-007.1 | Dado que abro “Nova mensagem”, então vejo meu nome na lista de pessoas como “(você)” e posso enviar a mim mesmo | US-MSG-07 | RN-MSG-007 |
| CA-MSG-007.2 | Dado uma mensagem a uma equipe da qual faço parte, então eu a recebo como os demais membros | US-MSG-06 | RN-MSG-015 |
| CA-MSG-007.3 | Dado que um usuário entrou na equipe depois do envio, então ele não vê a conversa | US-MSG-06 | RN-MSG-015 |
| CA-MSG-008.1 | Dado o formulário com destinatário, assunto ou mensagem vazios, então aparecem MSG-EMSG-01, 02 e 03 e nada é enviado | US-MSG-01 | RN-MSG-015, 027 |
| CA-MSG-008.2 | Dado que informo a data do prazo sem a hora, então aparece MSG-EMSG-05 com o formato esperado | US-MSG-01 | RN-MSG-012 |
| CA-MSG-008.3 | Dado que escolho um processo, então só um tipo pode ser escolhido por conversa (Paciente, Prescrição, Documento ou Registro clínico) | US-MSG-08 | RN-MSG-020, 021 |
| CA-MSG-009.1 | Dado uma conversa com processo, então o processo aparece como link com o texto do item, no cartão e no cabeçalho da conversa, e leva ao módulo; se o usuário não tiver acesso, o módulo de destino mostra a recusa | US-MSG-08 | RN-MSG-021 |
| CA-MSG-010.1 | Dado um usuário sem o direito Visualizar (mesmo que tenha Enviar), então o item de menu e o painel não aparecem e todas as chamadas da API retornam 403 | US-MSG-10 | RN-MSG-024 |
| CA-MSG-010.2 | Dado um usuário com Visualizar e sem Enviar, então o botão “Nova mensagem” e o campo de resposta não aparecem e a API recusa o envio com 403; ele ainda pode resolver e descartar [PROPOSTA, P-MSG-12] | US-MSG-10 | RN-MSG-024 |
| CA-MSG-010.3 | Dado qualquer ação (enviar, ler, responder, resolver, descartar), então um registro de auditoria é gravado sem o conteúdo da mensagem e sem identificação do paciente | US-MSG-10 | RN-MSG-023 |
| CA-MSG-011.1 | Dado o idioma da clínica, então todos os textos aparecem nesse idioma (pt-BR, en-US ou es-419) | todas | RN-MSG-013 |
| CA-MSG-012.1 | Dado uma mensagem enviada, então não existe ação de editar ou excluir o texto | US-MSG-03 | RN-MSG-022 |
| CA-MSG-012.2 | Dado que o módulo de origem repete o pedido do mesmo alerta, então nenhuma conversa duplicada é criada | US-MSG-09 | RN-MSG-029 |
| CA-MSG-013.1 | Dado uma anomalia que persiste depois de o alerta anterior ser resolvido, então o módulo pode abrir nova conversa ligada à anterior; a anterior continua finalizada | US-MSG-09 | RN-MSG-016 |
| CA-MSG-014.1 | Dado que respondo em conversa endereçada à minha equipe, então minhas mensagens mostram “Nome (Equipe)”; se não sou da equipe, mostram só o nome | US-MSG-03 | RN-MSG-030 |
| CA-MSG-016.1 | Dado que a última mensagem da conversa é do usuário e não é de alerta do sistema, então o cartão mostra check quando nenhum outro participante leu até ela e check-check quando pelo menos um leu; num autoenvio, check-check desde o envio | US-MSG-05 | RN-MSG-016, 018 |
| CA-MSG-016.2 | Dado que outro participante respondeu, então o cartão passa a mostrar a resposta como última mensagem, com o autor e a data e hora, e o sinal de não lida; o cartão não tem chip “Respondida” nem ícone de lida | US-MSG-05 | RN-MSG-016, 017 |
| CA-MSG-017.1 | Dado que abro “Nova mensagem”, então o grau de urgência é opcional, vem sem seleção e oferece “Rotina”, “Urgente”, “Quanto antes” e “Imediato”; tocar na opção marcada a desmarca | US-MSG-01 | RN-MSG-034 |
| CA-MSG-017.2 | Dado uma conversa enviada sem grau, então nenhum chip de urgência aparece em nenhuma tela | US-MSG-01 | RN-MSG-034 |
| CA-MSG-017.3 | Dado uma conversa com grau, então o chip com o nome do grau (por exemplo, “Imediato”) aparece no cartão (painel, Abertas e Finalizadas) e no cabeçalho da conversa, para quem enviou e para os destinatários | US-MSG-02 | RN-MSG-034 |
| CA-MSG-017.4 | Dado uma conversa já enviada, então nenhuma tela nem endpoint altera o grau, e uma resposta ou uma atualização do sistema não o muda | US-MSG-03 | RN-MSG-034 |
| CA-MSG-017.5 | Dado conversas da mesma camada com graus diferentes e sem grau, então a ordem é Imediato, Quanto antes, Urgente, Rotina e sem grau, e dentro do mesmo grau a mais recente primeiro | US-MSG-02 | RN-MSG-002, 034 |
| CA-MSG-017.6 | Dado um alerta do sistema cujo módulo de origem informou o grau, então o chip é o mesmo das conversas de pessoas; sem grau informado, não aparece chip | US-MSG-09 | RN-MSG-028, 034 |
| CA-MSG-017.7 | Dado um envio com urgencyLevel diferente de routine, urgent, asap e stat, então a API recusa com 400 e a mensagem MSG-EMSG-13; urgencyLevel ausente ou nulo é aceito | US-MSG-01 | RN-MSG-034 |
| CA-MSG-017.8 | Dado os temas claro e escuro, então cada nível tem texto com contraste mínimo de 4,5:1, o nível é identificável sem a cor (texto e ícone) e o leitor de tela anuncia “urgência {nome}“ | todas | RN-MSG-034 |
| CA-MSG-018.1 | Dado uma conversa cuja última mensagem foi enviada hoje há menos de 1 hora, então o cartão mostra “Há x min” | US-MSG-02 | RN-MSG-035 |
| CA-MSG-018.2 | Dado uma última mensagem enviada hoje há 1 hora ou mais, então o cartão mostra “Há x h” | US-MSG-02 | RN-MSG-035 |
| CA-MSG-018.3 | Dado uma última mensagem de dia anterior (dia de calendário da clínica), então o cartão mostra data e hora, mesmo que tenha menos de 1 hora; dentro da conversa o horário é sempre data e hora | US-MSG-02 | RN-MSG-035 |
| CA-MSG-018.4 | Dado o campo de mensagem ou de resposta, então o contador mostra “n/2000”, o campo não aceita o caractere 2001 e a API recusa texto maior com 400 | US-MSG-01 | RN-MSG-032; D-MSG-030 |
| CA-MSG-018.5 | Dado uma anomalia que se agrava, quando o módulo de origem publica um novo alerta com o novo grau, então o alerta anterior fica Descartado (ação sem usuário, autor exibido como “Sistema”) e a nova conversa fica ligada a ele | US-MSG-09 | RN-MSG-016, 034 |
| CA-MSG-019.1 | Dado o formulário sem paciente, então o campo de tipo de processo fica desabilitado | US-MSG-08 | RN-MSG-021 |
| CA-MSG-019.2 | Dado um paciente escolhido e o tipo Prescrição, Documento ou Registro clínico, então aparece o campo do item, só com os itens desse paciente; enviar sem item mostra MSG-EMSG-14 | US-MSG-08 | RN-MSG-021 |
| CA-MSG-019.3 | Dado o tipo Paciente, então não há campo de item, e o atalho da conversa leva ao prontuário do paciente | US-MSG-08 | RN-MSG-021 |
| CA-MSG-019.4 | Dado processo já escolhido, quando troco o paciente, então o tipo e o item são limpos | US-MSG-08 | RN-MSG-021 (E-MSG-020) |
| CA-MSG-020.1 | Dado que abro “Nova mensagem”, então os campos vêm nesta ordem: Destinatário, Assunto, Mensagem e, sob o subtítulo “Opcionais”, Grau de urgência, Prazo para resposta, Paciente e Processo relacionado | US-MSG-01 | D-MSG-040 |
| CA-MSG-020.2 | Dado o campo Destinatário, quando digito parte do nome, então vejo os resultados que contêm o texto, com “Equipes” antes de “Pessoas”, e escolho um | US-MSG-01 | RN-MSG-036, 007, 015 |
| CA-MSG-020.3 | Dado o campo Paciente, quando digito parte do nome, então vejo os pacientes que o contêm | US-MSG-08 | RN-MSG-036, 020 |
| CA-MSG-020.4 | Dado o item do processo, então a busca usa: Prescricao.Identificacao, por qualquer parte do texto (Prescrição); o nome (Documento, exibido com a data); a data (Registro clínico, exibido com data, modelo e profissional); vários termos são combinados | US-MSG-08 | RN-MSG-036, 021; D-MSG-050 |
| CA-MSG-020.5 | Dado uma busca sem resultado, então aparece MSG-TMSG-41; dado mais resultados que o limite, então aparece MSG-TMSG-42 | US-MSG-01 | RN-MSG-036 |
| CA-MSG-020.6 | Dado o teclado, então as setas movem o destaque, Enter escolhe e Esc fecha a lista, e o leitor de tela anuncia o campo como caixa de combinação com o número de resultados | US-MSG-01 | RN-MSG-036; 2.10 |
| CA-MSG-021.1 | Dado uma conversa com grau routine, então o chip “Rotina” aparece como os demais graus | US-MSG-02 | RN-MSG-034 |
| CA-MSG-021.2 | Dado o painel ou a lista, então os cartões são separados entre si, com cantos arredondados e borda de 1 px, e não linhas coladas com divisória | US-MSG-02 | 2.3.1, item 8 |
| CA-MSG-021.3 | Dado a lista de itens do processo, então vem do mais recente ao mais antigo pela data do evento | US-MSG-08 | RN-MSG-036 |
| CA-MSG-021.4 | Dado o cartão no painel ou na lista, então não há botão de ação nele; só a conversa aberta oferece “Resolvido” e “Descartado” | US-MSG-04 | D-MSG-047 |
| CA-MSG-021.5 | Dado o cartão com paciente e/ou processo, então o nome do paciente é um link para o prontuário e o processo é um link para o item (prescrição, documento ou registro clínico); tocar num link não abre a conversa, e tocar no resto do cartão a abre | US-MSG-08 | D-MSG-054 |
| CA-MSG-021.6 | Dado uma conversa de equipe cuja última mensagem foi escrita por um membro da equipe, então o autor mostra o nome da equipe entre parênteses, no cartão e na conversa | US-MSG-05 | RN-MSG-030; D-MSG-054 |
| CA-MSG-031.1 | Dado um usuário que não é participante, então a API responde 404 e a conversa não aparece em nenhuma lista | US-MSG-10 | RN-MSG-031 |
| CA-MSG-015.1 | Dado o tema escuro, então todos os componentes usam os tokens do Design System e atendem ao contraste mínimo | todas | RN-MSG-027 |
2.5 Fluxos de exceção
| ID | Gatilho | Comportamento | Recuperação |
|---|---|---|---|
| EX-MSG-01 | Falha ao carregar o painel ou a lista (erro de servidor) | Estado de erro no lugar da lista com MSG-EMSG-07 e botão “Tentar novamente” | O botão repete a consulta |
| EX-MSG-02 | Falha de conexão na atualização automática | Os dados anteriores permanecem; aparece a faixa de sem conexão (reuso da Central) | A faixa some na próxima atualização bem-sucedida |
| EX-MSG-03 | Falha ao enviar (rede ou servidor) | O formulário permanece preenchido; aparece MSG-EMSG-08. Falha ao responder, resolver ou descartar: MSG-EMSG-12 | O usuário repete “Enviar”; a API usa uma chave de requisição para não duplicar |
| EX-MSG-04 | Conversa finalizada por outro participante enquanto o usuário escreve ou age | A API responde 409; a tela recarrega a conversa e mostra o estado final com MSG-TMSG-19 | Nenhuma; a resposta digitada permanece visível para copiar |
| EX-MSG-05 | Conversa inexistente ou de outro usuário | 404 (sem revelar se existe); a tela mostra MSG-EMSG-09 e volta à lista | Voltar |
| EX-MSG-06 | Usuário sem permissão | 403; tela de acesso negado padrão do sistema | — |
| EX-MSG-07 | Destinatário inativo, equipe sem membros ativos ou equipe inativa no momento do envio | A API recusa com 422; o formulário mostra MSG-EMSG-10 | Escolher outro destinatário |
| EX-MSG-08 | Paciente ou processo informado não existe ou não pertence à clínica | A API recusa com 422; o formulário mostra MSG-EMSG-11 | Corrigir a seleção |
| EX-MSG-09 | Tentativa de editar o remetente, o conteúdo, o paciente ou o processo depois do envio | Não há endpoint; qualquer tentativa direta retorna 405 | — |
2.6 Validações de campos
| Campo | Tipo | Formato e limites | Obrigatório | Mensagem |
|---|---|---|---|---|
| Destinatário | pessoa ou equipe | id inteiro (pessoa) ou uuid (equipe); da mesma clínica; com direito Visualizar (pessoa) ou ativa (equipe) | sim | MSG-EMSG-01, 10 |
| Assunto | texto | 1 a 200 caracteres, sem só espaços | sim | MSG-EMSG-02 |
| Grau de urgência | texto | routine, urgent, asap ou stat (sempre minúsculas, como no HL7; outra grafia é recusada com 400); ausente ou nulo = Não informado | não | MSG-EMSG-13 |
| Mensagem | texto | 1 a 2000 caracteres (D-MSG-030), sem só espaços | sim | MSG-EMSG-03 |
| Paciente | inteiro | existente na clínica | não | MSG-EMSG-11 |
| Processo | tipo + chave | um só tipo; Paciente (prontuário), Prescricao, Documento ou RegistroClinico; exige paciente; o item é obrigatório, exceto no tipo Paciente (chave = paciente); novos tipos entram sem mudança de estrutura | não | MSG-EMSG-11, 14 |
| Prazo | data e hora | formato do idioma da clínica, 24 h; convertido para UTC pelo fuso da clínica; ≥ momento do envio | não | MSG-EMSG-04, 05 |
| Resposta | texto | 1 a 2000 caracteres (D-MSG-030) | sim, ao responder | MSG-EMSG-03 |
Toda validação é repetida no servidor (SBIS NGS1.05.02); a do formulário é só conveniência.
2.7 Mapeamento de componentes de interface
Variantes, estados e tokens do Design System. Cores só por token.
| Componente | Variante | Estados | Observações |
|---|---|---|---|
| Cartão de conversa | Lista (altura livre, até 5 linhas) | padrão, não lida, vencida, finalizada, foco, pressionado | 2.3.1 |
| Ícone de origem | Círculo 40 px, user ou bell | padrão | Sem foto |
| Chip de paciente | secondary-light / secondary-dark | padrão | Nome (social, se houver) |
| Chip de prazo | highlight (futuro) ou error (vencida) | padrão | Texto e ícone, nunca só cor |
| Chip de urgência | alert-fill (Imediato), error-light com contorno (Quanto antes), neutral-lighter (Urgente), contorno neutro (Rotina) | padrão | 2.3.8 e Design System, seção 13. Ícone flag, texto e cor, nunca só a cor |
| Seletor de grau de urgência | Quatro botões de rádio, com o nome | padrão, marcado, foco, desabilitado (enquanto o envio está em curso) | 2.3.4; alvo de toque de 44 px |
| Campo de busca (autocomplete) | Campo de texto com lista de resultados | padrão, com foco, buscando, com resultados, sem resultado, desabilitado (tipo de processo sem paciente) | 2.3.9; alvo de toque dos resultados de 44 px |
| Chip de estado | Resolvida (verde), Descartada (contorno) | padrão | Só em Finalizadas e na conversa |
| Botões “Resolvido”/“Descartado” na conversa | Resolvido: primário (verde escuro); Descartado: secundário (contorno); um só preenchido por região | idem | Confirmação: Cancelar com contorno e foco inicial; Resolver primário; Descartar com o estilo de ação destrutiva, ainda não definido no Design System (seção 12) |
| Abas Abertas/Finalizadas | Abas do Design System com contagem | ativa, inativa, foco | |
| Campo de data e hora | Campo único mascarado, altura 56 | vazio, preenchido, erro, desabilitado | 2.3.4; componente React a definir (P-MSG-04, em aberto) |
| Seleção de destinatário | Lista agrupada Pessoas/Equipes | aberta, fechada, erro | |
| Busca de paciente | A da Central | idem | |
| Modal de conversa | Folha inferior (celular) / caixa (largura) | aberto, fechando | |
| Diálogo de confirmação | Padrão do sistema | foco em Cancelar | |
| Faixa de sem conexão | Padrão do Design System | visível, oculta | |
| Esqueleto | Cartões | carregando |
2.8 Integração com o backend
Todos os endpoints exigem usuário autenticado e clínica ativa; retornam 401 sem sessão e 403 sem o direito necessário. Datas em ISO 8601 UTC; a API também devolve serverNow e o fuso da clínica, e o front-end formata no fuso da clínica (DT-001). Ids de conversa e de mensagem são uuid; ids de usuário e de paciente são inteiros.
2.8.1 Listar conversas
- Função: conversas do usuário logado, por aba.
- GET
/api/v1/conversations?tab=open|closed&limit=20&cursor= - Response 200:
{ "serverNow": "...Z", "timeZone": "America/Sao_Paulo", "counts": { "open": 7, "closed": 31 }, "items": [ ConversationSummary ], "nextCursor": "…|null" } - ConversationSummary:
{ id, subject, sourceType: "user|system", clinic: { id, shortName }|null, lastAuthor: { id|null, name, onBehalfOfTeam|null }, lastMessage, lastMessageAt, deadline|null, overdue: boolean, urgencyLevel: { key: "routine|urgent|asap|stat", name }|null, unread: boolean, readByOthers: boolean|null, status, patient: { id, preferredName, legalName }|null, process: { type, key }|null, closedBy: { id, name }|null, closedAt|null } readByOthers: só tem valor quando a última mensagem é do usuário (nulo em alerta do sistema e quando a última é de outra pessoa). É verdadeiro quando algum outro participante temUltimaSequenciaLidamaior ou igual à sequência dessa mensagem; num autoenvio, é verdadeiro. Calculado na consulta, sem coluna nova (04, 4.1).- Escopo de clínica (RN-MSG-025, DT-013): para o médico, as conversas das clínicas do cliente em que ele atende; para os demais profissionais, só as da clínica do login.
clinicvem preenchido quando o usuário atende em mais de uma clínica e é nulo caso contrário (D-CM-064). urgencyLevel: nulo quando “Não informado”.keyé o valor do domínio HL7 (routine,urgent,asapoustat) enamejá vem traduzido para o idioma da clínica, deIpTerminologia.IndicadoreseTermoTraducao(DT-011, DT-012); o front-end não mantém a lista de nomes. A ordem do grau (do menos ao mais urgente:routine,urgent,asap,stat) é aplicada no servidor. [PROPOSTA de contrato, E-MSG-018, revista por D-MSG-039]- Ordem: em
open, a de 2.3.7 (grau de urgência e depois a chave de data; calculada no servidor); emclosed, porclosedAtdecrescente. O painel usalimit=4. - BD:
mensageria.Conversa,ConversaDestinatario,ConversaLeitura,Mensagem,ConversaAcao;Paciente; IpSeguranca.Usuario (04, 4.1 e 4.2). - Códigos: 200, 400 (aba ou cursor inválido), 401, 403.
- Paginação [PROPOSTA]: o cursor é a posição na ordem calculada (grupo, grau, chave, id). Como abrir uma conversa a muda de grupo, uma conversa pode aparecer em duas páginas seguidas ou ser pulada; o front remove duplicados por
ide recarrega a primeira página ao voltar à lista. - Atualização automática: o front consulta a cada 1 minuto (painel e aba aberta). O endpoint específico da Central (
GET /api/v1/cockpit/doctor/conversations) permanece, e o contrato dele deve ser alinhado a este (P-MSG-09).
2.8.2 Detalhar conversa
- GET
/api/v1/conversations/{id} - Response 200:
{ id, subject, sourceType, moduleOrigin|null, sender: { id|null, name }, recipient: { type: "user|team", userId|null, teamId|null, name, memberCount|null, isSelf }, patient, process, deadline, overdue, urgencyLevel, status, closedBy, closedAt, canReply: boolean, canClose: boolean, messages: [ { id, sequence, author: { id|null, name, onBehalfOfTeam|null }, content, createdAt, readByOthers: boolean|null } ] } - O tipo gravado da mensagem é sempre
Response(Log de Mudanças, 26/10/2026); a mensagem inicial é a desequence1 e a mensagem do sistema temauthor.idnulo. canReplyé falso em conversa finalizada, em alerta do sistema e para quem não tem o direito Enviar;canCloseé falso em conversa finalizada.- Códigos: 200, 401, 403, 404 (inexistente ou fora da participação).
2.8.3 Criar conversa
- POST
/api/v1/conversations(cabeçalhoIdempotency-Key, opção B de P-MSG-25: guardada emAlertaPublicacaocomModuloOrigem = 'User', sem comparação do conteúdo; ver 04 L-06) - Request:
{ recipient: { type: "user|team", id }, subject, content, patientId|null, process: { type, key }|null, deadline|null, urgencyLevel: "routine|urgent|asap|stat"|null } - Efeito: cria
Conversa(statusSent, grau de urgência do pedido),Mensagem(sequência 1, tipoResponse), copia os destinatários (ConversaDestinatario), grava a leitura do remetente, a açãoSende o evento de auditoria; tudo em uma transação. - Response 201:
{ id }. Códigos: 400 (validação, inclusive prazo anterior ao envio), 401, 403 (sem Enviar ou sem Visualizar), 422 (destinatário, paciente ou processo inválido), Chave repetida: 200 com oidda conversa já criada, sem comparar o conteúdo (opção B, D-MSG-020); por isso uma chave repetida com texto diferente também devolve a conversa antiga e o texto novo é ignorado. A chave vale por usuário: a Mensageria grava{IdUsuario}:{Idempotency-Key}[PROPOSTA].
2.8.4 Marcar como lida
- POST
/api/v1/conversations/{id}/read— atualiza a leitura do usuário para a última sequência e, se o status eraSente o usuário não é o remetente, muda paraRead. Idempotente: só grava açãoReade auditoria quando a leitura avança, comStatusNovoigual ao status atual. A conversa passa aReadquando um destinatário que não é o remetente a abre pela primeira vez; num autoenvio, nasceRead. Códigos: 204, 401, 403, 404.
2.8.5 Responder
- POST
/api/v1/conversations/{id}/reply - Request:
{ content }. Efeito: novaMensagem(Response),UltimaSequencia + 1, statusResponded, leitura do autor atualizada, açãoResponse, auditoria. Em equipe, o autor é gravado com a equipe de origem quando é membro (RN-MSG-030). - Response 201:
{ messageId, sequence }. Códigos: 400, 401, 403 (sem Enviar), 404, 409 (finalizada ou alerta do sistema).
2.8.6 Resolver e descartar
- PATCH
/api/v1/conversations/{id}/resolvee/discard. Sem corpo. Efeito: statusResolvedouDismissed, açãoResolveouDismisscom o usuário, auditoria. Nenhuma mensagem é criada (RN-MSG-009). Códigos: 204, 401, 403, 404, 409 (já finalizada; a resposta traz quem finalizou e quando). - Concorrência: se a versão da conversa mudou por outra causa (leitura ou resposta), a API relê e repete; só devolve 409 se a conversa já estiver finalizada. O primeiro pedido de finalização vence e o segundo recebe 409 (EX-MSG-04). Resolver e descartar exigem o direito Visualizar (E-MSG-010).
2.8.7 Destinatários possíveis
- GET
/api/v1/conversations/recipients?q=&limit=8—{ teams: [ { id, name, memberCount } ], people: [ { id, name, isSelf } ], hasMore }(equipes antes das pessoas; RN-MSG-036). Exige o direito Enviar (e Visualizar). Pessoas: usuários ativos da clínica com o direito Visualizar, inclusive o próprio. Equipes: ativas, com pelo menos um membro ativo.qignora maiúsculas e acentos; semq, devolve as primeiras opções. Códigos: 200, 401, 403.
2.8.8 Busca de paciente
- Reuso de
GET /api/v1/patients/search(Central do Médico), por nome, comqelimit=8; devolvehasMorepara o aviso MSG-TMSG-42 (se o serviço atual não tiver o limite, ele é acrescentado).
2.8.9 Opções de processo [PROPOSTA]
- GET
/api/v1/conversations/process-options?patientId=&type=&q=&limit=8—patientIdobrigatório. Semtype:{ types: [ "Paciente|Prescricao|Documento|RegistroClinico" ] }(etapa 2). Comtype:{ options: [ { key, label, detail }], hasMore }, só os itens do paciente, filtrados porq(etapa 3): Prescrição, porPrescricao.Identificacaoem qualquer parte do texto (labelé a identificação;detail, a data da prescrição); Documento, por nome (labelé o nome;detail, a data); Registro clínico, por data (labelé data, modelo e profissional); cada tipo filtra só pelo seu campo (D-MSG-050); no tipoPacientedevolve só o próprio paciente. Cada módulo fornece os seus itens e novos tipos entram sem mudar a mensageria. Tipo desconhecido (por exemploAgenda): 400 MSG-EMSG-11. A mensageria só consolida (P-MSG-07).
2.8.10 Publicação de alerta pelo sistema [PROPOSTA]
- Interface de integração entre módulos (serviço interno, não exposta ao front-end):
PublishAlert { clinicId, moduleOrigin, idempotencyKey, recipient: { type, id }, subject, content, patientId?, process?, deadline?, urgencyLevel?, previousConversationId? }. - Efeito: cria
ConversacomOrigemTipo = System, aMensageminicial (sem autor), os destinatários, o registro emAlertaPublicacaoe o evento emOutboxEvento. Uma segunda chamada com a mesma chave (clínica, módulo, chave) devolve a conversa já criada (RN-MSG-029). - Anomalia que persiste (RN-MSG-016): com a conversa aberta, o módulo chama
AppendAlertUpdate { conversationId, idempotencyKey, content }(semurgencyLevel: o grau da conversa não muda, RN-MSG-034). Anomalia que se agrava (D-MSG-033): o módulo publica um novo alerta, com o novo grau epreviousConversationId, e descarta o anterior; o descarte grava a açãoDismisssem usuário (IdUsuarioAtornulo, 04, ConversaAcao), exibida como “Descartada por Sistema”. [PROPOSTA de mecanismo, E-MSG-019]: chamadaDismissAlert { conversationId, idempotencyKey }, que acrescenta uma mensagem do sistema, de tipoResponsee autor nulo (cada atualização tem a sua chave, registrada emAlertaPublicacao); com a conversa finalizada, chamaPublishAlertcompreviousConversationId. A interface recusapreviousConversationIdque aponte para conversa ainda aberta.
2.9 Catálogo de mensagens e termos de interface (i18n)
Os textos são cadastrados como termos traduzíveis (DT-011) e exibidos no idioma da clínica (DT-012). Variáveis entre chaves: {dt} data e hora no fuso e idioma da clínica; {name} nome; {n} número de membros; {fmt} formato esperado. Os IDs marcados “reuso” já existem em outras funcionalidades e não devem ser duplicados. MSG-TMSG-35 é a forma singular de MSG-TMSG-14 (um membro). IDs numerados com saltos (por exemplo, MSG-TMSG-04) não são reaproveitados.
| ID | Uso | pt-BR | en-US | es-419 |
|---|---|---|---|---|
| MSG-TMSG-01 | Texto | Mensagens | Messages | Mensajes |
| MSG-TMSG-02 | Texto | Nenhuma conversa em aberto. | No open conversations. | No hay conversaciones abiertas. |
| MSG-TMSG-03 | Texto | Nenhuma conversa finalizada. | No closed conversations. | No hay conversaciones finalizadas. |
| MSG-TMSG-05 | Texto | Responder até {dt} | Reply by {dt} | Responder hasta {dt} |
| MSG-TMSG-06 | Texto | Vencida desde {dt} | Overdue since {dt} | Vencida desde {dt} |
| MSG-TMSG-07 | Texto | Aberta | Open | Abierta |
| MSG-TMSG-08 | Texto | Resolvida | Resolved | Resuelta |
| MSG-TMSG-09 | Texto | Descartada | Discarded | Descartada |
| MSG-TMSG-10 | Texto | Não lida | Unread | No leída |
| MSG-TMSG-11 | Texto | Alerta do sistema | System alert | Alerta del sistema |
| MSG-TMSG-12 | Texto | De | From | De |
| MSG-TMSG-13 | Texto | Para | To | Para |
| MSG-TMSG-14 | Texto | Equipe {name} · {n} membros | Team {name} · {n} members | Equipo {name} · {n} miembros |
| MSG-TMSG-15 | Texto | Você | You | Usted |
| MSG-TMSG-16 | Texto | Resolvida por {name} em {dt} | Resolved by {name} on {dt} | Resuelta por {name} el {dt} |
| MSG-TMSG-17 | Texto | Descartada por {name} em {dt} | Discarded by {name} on {dt} | Descartada por {name} el {dt} |
| MSG-TMSG-19 | Texto | Esta conversa foi finalizada. Não é possível responder. | This conversation is closed. You can no longer reply. | Esta conversación está finalizada. Ya no es posible responder. |
| MSG-TMSG-20 | Texto | Alertas do sistema não recebem resposta. | System alerts cannot be replied to. | Las alertas del sistema no admiten respuesta. |
| MSG-TMSG-24 | Texto | Conversa resolvida. | Conversation resolved. | Conversación resuelta. |
| MSG-TMSG-25 | Texto | Conversa descartada. | Conversation discarded. | Conversación descartada. |
| MSG-TMSG-26 | Texto | Mensagem enviada. | Message sent. | Mensaje enviado. |
| MSG-TMSG-27 | Texto | Resposta enviada. | Reply sent. | Respuesta enviada. |
| MSG-TMSG-29 | Texto | Sistema | System | Sistema |
| MSG-TMSG-30 | Texto | Atualização do sistema | System update | Actualización del sistema |
| MSG-TMSG-31 | Texto | Enviada | Sent | Enviada |
| MSG-TMSG-32 | Texto | Lida | Read | Leída |
| MSG-TMSG-34 | Texto | (você) | (you) | (usted) |
| MSG-TMSG-35 | Texto | Equipe {name} · 1 membro | Team {name} · 1 member | Equipo {name} · 1 miembro |
| MSG-TMSG-36 | Texto (título e nome acessível do chip) | Grau de urgência: {name} | Urgency level: {name} | Grado de urgencia: {name} |
| MSG-TMSG-37 | Texto | Nenhum grau selecionado: a conversa será enviada sem grau. Depois do envio, o grau não pode ser alterado. | No level selected: the conversation is sent without an urgency level. It cannot be changed after sending. | Ningún grado seleccionado: la conversación se enviará sin grado de urgencia. No se puede cambiar después del envío. |
| MSG-TMSG-38 | Texto | Depois do envio, o grau não pode ser alterado. | It cannot be changed after sending. | No se puede cambiar después del envío. |
| MSG-TMSG-39 | Texto | Há {n} min | {n} min ago | Hace {n} min |
| MSG-TMSG-40 | Texto | Há {n} h | {n} h ago | Hace {n} h |
| MSG-TMSG-41 | Texto | Nenhum resultado para “{q}”. | No results for “{q}”. | Sin resultados para “{q}”. |
| MSG-TMSG-42 | Texto | Há mais resultados. Refine a busca. | There are more results. Refine your search. | Hay más resultados. Refine la búsqueda. |
| MSG-LMSG-01 | Rótulo | Destinatário | Recipient | Destinatario |
| MSG-LMSG-02 | Rótulo | Pessoas | People | Personas |
| MSG-LMSG-03 | Rótulo | Equipes | Teams | Equipos |
| MSG-LMSG-04 | Placeholder | Selecione | Select | Seleccione |
| MSG-LMSG-05 | Rótulo | Assunto | Subject | Asunto |
| MSG-LMSG-06 | Rótulo | Mensagem | Message | Mensaje |
| MSG-LMSG-07 | Rótulo | Paciente (opcional) | Patient (optional) | Paciente (opcional) |
| MSG-LMSG-08 | Rótulo | Prazo para resposta (opcional) | Reply deadline (optional) | Plazo de respuesta (opcional) |
| MSG-LMSG-09 | Rótulo | Processo relacionado (opcional) | Related process (optional) | Proceso relacionado (opcional) |
| MSG-LMSG-10 | Opção | Paciente | Patient | Paciente |
| MSG-LMSG-11 | Placeholder | dd/mm/aaaa hh:mm | mm/dd/yyyy hh:mm | dd/mm/aaaa hh:mm |
| MSG-LMSG-12 | Opção | Prescrição | Prescription | Prescripción |
| MSG-LMSG-13 | Opção | Nenhum | None | Ninguno |
| MSG-LMSG-14 | Placeholder | Escreva uma resposta… | Write a reply… | Escriba una respuesta… |
| MSG-LMSG-15 | Opção | Consulta (sem uso desde a v1.5; Agenda saiu, D-MSG-037) | Appointment | Consulta |
| MSG-LMSG-16 | Rótulo | Grau de urgência (opcional) | Urgency level (optional) | Grado de urgencia (opcional) |
| MSG-LMSG-17 | Opção | Documento | Document | Documento |
| MSG-LMSG-18 | Opção | Registro clínico | Clinical record | Registro clínico |
| MSG-LMSG-19 | Rótulo | Item do processo | Process item | Elemento del proceso |
| MSG-LMSG-20 | Subtítulo | Opcionais | Optional | Opcionales |
| MSG-LMSG-21 | Marcador do campo | Digite para buscar | Type to search | Escriba para buscar |
| MSG-LMSG-22 | Marcador do campo | Identificação da prescrição (qualquer parte) | Prescription ID (any part) | Identificación de la prescripción (cualquier parte) |
| MSG-LMSG-23 | Marcador do campo | Nome do documento | Document name | Nombre del documento |
| MSG-LMSG-24 | Marcador do campo | Data do registro, por exemplo 21/10/2026 | Record date, for example 21/10/2026 | Fecha del registro, por ejemplo 21/10/2026 |
| MSG-LMSG-25 | Marcador do campo | Nome do paciente | Patient name | Nombre del paciente |
| MSG-IND-1 | Termo (Indicadores), chave routine | Rotina | Routine | Rutina |
| MSG-IND-2 | Termo (Indicadores), chave urgent | Urgente | Urgent | Urgente |
| MSG-IND-3 | Termo (Indicadores), chave asap | Quanto antes | ASAP | Cuanto antes |
| MSG-IND-4 | Termo (Indicadores), chave stat | Imediato | STAT | Inmediato |
| MSG-EMSG-01 | Erro | Informe o destinatário. | Select a recipient. | Indique el destinatario. |
| MSG-EMSG-02 | Erro | Informe o assunto. | Enter a subject. | Indique el asunto. |
| MSG-EMSG-03 | Erro | Escreva a mensagem. | Write the message. | Escriba el mensaje. |
| MSG-EMSG-04 | Erro | O prazo não pode ser anterior ao momento do envio. | The deadline cannot be earlier than the moment of sending. | El plazo no puede ser anterior al momento del envío. |
| MSG-EMSG-05 | Erro | Informe data e hora completas ({fmt}). | Enter a complete date and time ({fmt}). | Indique fecha y hora completas ({fmt}). |
| MSG-EMSG-07 | Erro | Não foi possível carregar as mensagens. Tente novamente. | Could not load messages. Try again. | No fue posible cargar los mensajes. Intente de nuevo. |
| MSG-EMSG-08 | Erro | Não foi possível enviar. Tente novamente. | Could not send. Try again. | No fue posible enviar. Intente de nuevo. |
| MSG-EMSG-09 | Erro | Conversa não encontrada. | Conversation not found. | Conversación no encontrada. |
| MSG-EMSG-10 | Erro | Este destinatário não pode receber mensagens agora. | This recipient cannot receive messages right now. | Este destinatario no puede recibir mensajes ahora. |
| MSG-EMSG-11 | Erro | Paciente ou processo inválido. | Invalid patient or process. | Paciente o proceso no válido. |
| MSG-EMSG-12 | Erro | Não foi possível concluir a ação. Tente novamente. | Could not complete the action. Try again. | No fue posible completar la acción. Intente de nuevo. |
| MSG-EMSG-13 | Erro | Grau de urgência inválido. | Invalid urgency level. | Grado de urgencia no válido. |
| MSG-EMSG-14 | Erro | Escolha o item do processo. | Choose the process item. | Elija el elemento del proceso. |
| MSG-BMSG-01 | Botão | Nova mensagem | New message | Nuevo mensaje |
| MSG-BMSG-02 | Botão | Enviar | Send | Enviar |
| MSG-BMSG-03 | Botão | Cancelar | Cancel | Cancelar |
| MSG-BMSG-04 | Botão | Voltar | Back | Volver |
| MSG-BMSG-05 | Botão | Responder | Reply | Responder |
| MSG-BMSG-06 | Botão | Resolvido | Resolved | Resuelto |
| MSG-BMSG-07 | Botão | Descartado | Discarded | Descartado |
| MSG-BMSG-08 | Aba | Abertas | Open | Abiertas |
| MSG-BMSG-09 | Aba | Finalizadas | Closed | Finalizadas |
| MSG-BMSG-10 | Link | (sem uso desde a v1.10: o painel não tem mais o link “Ver todas as mensagens”; D-MSG-049) | — | — |
| MSG-BMSG-11 | Botão | Fechar | Close | Cerrar |
| MSG-BMSG-12 | Botão | Abrir prontuário | Open medical record | Abrir historia clínica |
| MSG-BMSG-13 | Botão | Abrir prescrição | Open prescription | Abrir prescripción |
| MSG-BMSG-14 | Botão | Abrir consulta (sem uso desde a v1.5) | Open appointment | Abrir consulta |
| MSG-BMSG-15 | Botão | Abrir documento | Open document | Abrir documento |
| MSG-BMSG-16 | Botão | Abrir registro clínico | Open clinical record | Abrir registro clínico |
| MSG-BMSG-15 | Botão | Tentar novamente | Try again | Intentar de nuevo |
| MSG_resolveConfirmTitle (reuso, Central) | Confirmação | Resolver conversa? | Resolve conversation? | ¿Resolver la conversación? |
| MSG_resolveConfirmBody (reuso) | Confirmação | A conversa será marcada como resolvida para todos os destinatários. | The conversation will be marked as resolved for all recipients. | La conversación se marcará como resuelta para todos los destinatarios. |
| MSG_resolveConfirmOk (reuso) | Confirmação | Resolver | Resolve | Resolver |
| MSG_discardConfirmTitle (reuso) | Confirmação | Descartar conversa? | Discard conversation? | ¿Descartar la conversación? |
| MSG_discardConfirmBody (reuso) | Confirmação | A conversa será descartada para todos os destinatários. | The conversation will be discarded for all recipients. | La conversación se descartará para todos los destinatarios. |
| MSG_discardConfirmOk (reuso) | Confirmação | Descartar | Discard | Descartar |
| MSG-TAGM-09 (reuso, Agenda) | Fuso | Fuso horário: {name} ({gmt}) | Time zone: {name} ({gmt}) | Huso horario: {name} ({gmt}) |
| MSG-TAGM-10 (reuso, Agenda) | Fuso | — diferente do fuso deste aparelho | — different from this device’s time zone | — distinto del huso de este dispositivo |
| MSG_connectionLost (reuso, Central) | Faixa | Sem conexão — dados atualizados às {hh:mm} | No connection — data updated at {hh:mm} | Sin conexión — datos actualizados a las {hh:mm} |
Nota: o texto da faixa de sem conexão deve ser conferido contra o catálogo da Central antes da implementação (a versão acima reproduz o padrão da Agenda, MSG-TAGM-03).
2.10 Acessibilidade
- Cartão: um único elemento clicável (link ou botão) com nome acessível “assunto, autor, última mensagem, data, estado (não lida, vencida), grau de urgência (quando informado)”.
- A borda de não lida é decorativa; a informação equivalente está no nome acessível (“não lida”) e no texto oculto “Não lida” lido antes da mensagem.
- Chip de urgência: o nome do grau é o texto visível, o título e o nome acessível são “Grau de urgência: {nome}” e o ícone é decorativo; a cor reforça, mas nunca é o único sinal; contraste do texto de pelo menos 4,5:1 em cada nível e tema (2.3.8). Seletor de grau: grupo de rádio com legenda “Grau de urgência (opcional)”; as setas mudam a opção e a barra de espaço na opção marcada a desmarca. Campos de busca: padrão de caixa de combinação (2.3.9).
- Confirmação: foco inicial em “Cancelar”, Esc cancela, foco volta ao elemento que abriu o diálogo.
- Campo de data e hora com rótulo, máscara anunciada (“dd/mm/aaaa hh:mm”) e mensagem de erro associada ao campo.
- Atualização automática não anuncia a lista inteira; só a mudança de contagem de não lidas.
- Contraste mínimo de 4,5:1 para texto e 3:1 para elementos não textuais, nos temas claro e escuro. Alvo de toque de 44 px.
- Respeitar a preferência de reduzir movimento.
2.11 Conformidade SBIS (detalhamento)
Requisitos identificados no documento 01 (item 1.10), conferidos contra o arquivo de requisitos SBIS v5.2 (coluna do estágio para clínica/ambulatório). Atende = coberto pelo desenho; Parcial = depende de proposta pendente; Não se aplica = justificado.
| Requisito (estágio) | Como é atendido | Situação |
|---|---|---|
| NGS1.03.01 (1) Impedir acesso de não autorizados | Todos os endpoints exigem sessão autenticada; participação na conversa verificada no servidor (404 fora da participação) | Atende |
| NGS1.03.03 (1) Perfis e permissões | Direitos Visualizar e Enviar no perfil de acesso (seeds em 04, item 4.6) | Atende, depende dos seeds [PROPOSTA] |
| NGS1.03.04 (2) Segregação por tipo de operação | Visualizar e Enviar independentes; resolver e descartar seguem Visualizar [PROPOSTA, P-MSG-12] | Parcial até decisão |
| NGS1.03.09 (1) Identidade única | Toda mensagem e ação guarda o usuário; o remetente é imutável (RN-MSG-014); alerta guarda o módulo | Atende |
| NGS1.05.01 (1) Comunicação segura | Tráfego exclusivamente por canal seguro entre o front-end e a API | Atende (padrão da plataforma) |
| NGS1.05.02 (1) Processamento no servidor | Ordem, “vencida”, “não lida”, permissões e todas as validações no servidor (2.6, 2.8) | Atende |
| NGS1.06.01 (1) SGBD | Dados no banco do cliente (04) | Atende |
| NGS1.07.01 (1) Auditoria contínua | Evento de auditoria para envio, leitura, resposta, resolução e descarte | Atende, depende do componente de auditoria |
| NGS1.07.02 (1) Proteção da trilha | A trilha de auditoria fica na trilha central de segurança (E-MSG-009), fora do schema da mensageria. O acesso à trilha só por auditor ou administrador pertence ao componente de auditoria. A integridade do histórico da conversa (cascata de exclusão) é a lacuna L-02 do Mapeamento | Atende, depende do componente de auditoria |
| NGS1.07.03 (1) Eventos registrados | Eventos listados acima, com o módulo gerador nos alertas (04, L-03) | Atende |
| NGS1.07.05 (1) Informações do registro | Usuário, data e hora, identificador da conversa e tipo de ação. Lacuna: endereço de origem não está na tabela de ações (04, L-01) | Parcial |
| NGS1.07.06 (1) Privacidade na trilha | Nem o texto da mensagem nem a identificação do paciente entram na trilha; só identificadores | Atende |
| ECF.15.01 (2) Notas vinculadas a paciente | Associação opcional a paciente (RN-MSG-020), exibida no cartão. O requisito pede a nota visível no prontuário; a conversa não aparece no prontuário (RN-MSG-026) | Parcial |
| ECF.15.02 (3) Notas para o profissional | Mensagem a si mesmo ou a outro profissional | Atende |
| ECF.15.03 (3) Mensagens coletivas | Envio a equipes (RN-MSG-015). Não há envio agendado | Parcial |
| ECF.17.01 (1) Profissional responsável pelo evento | Autor de cada mensagem e ator de cada ação | Atende |
| ECF.17.02 (1) Registro de tempo | Data e hora de cada mensagem e ação, em UTC, exibidas no fuso da clínica | Atende |
| ECF.17.03 (1) Tempo da ocorrência | Data e hora de cada mensagem e ação gravadas no momento em que ocorrem; não há registro retroativo | Atende |
| ECF.17.04 (1) Cronologia de eventos | Mensagens por sequência; ações por data e hora. A ordem da lista de conversas (2.3.3) é de prioridade, não cronológica | Parcial |
| ECF.17.05 (1) Consistência cronológica | O prazo não pode ser anterior ao envio (RN-MSG-004), validado no servidor | Atende |
| ECF.17.18 (1) Idioma | O requisito exige todos os textos em português do Brasil. O pt-BR é completo; en-US e es-419 complementam (RN-MSG-013, D-MSG-019). Os termos vindos do banco passam por TermoTraducao (DT-011); o pt-BR precisa ter todas as linhas | Atende, com a carga de pt-BR completa (CT-MSG-265) |
| ECF.17.18 e ECF.17.19 aplicados ao grau de urgência (1) | Os quatro nomes existem em pt-BR (Rotina, Urgente, Quanto antes, Imediato), en-US e es-419, cadastrados em TermoTraducao (MSG-IND-1 a 4); o pt-BR é completo | Atende, depende do seed (04, item 4.6) |
| ECF.17.19 (1) Mensagens do sistema | Catálogo de mensagens em linguagem não técnica (2.9), com o pt-BR completo | Atende (CT-MSG-265) |
Pendência herdada da Central do Médico: P-CM-026(a), em que o consultor jurídico quer a mensageria fora do escopo SBIS, segue em aberto; esta especificação documenta o caso em que ela está dentro.
Histórico de Versões
- v1.0 (22/10/2026) — Criação da Especificação da Mensageria, a pedido do solicitante, a partir da Definição v1.0, do documento anexado “Especificação Funcional Consolidado, Serviço de Comunicação Entre Profissionais, v1.0” (12/08/2026), da auditoria das telas implementadas (21/10/2026), do redesenho e das decisões de 21 e 22/10/2026 (que prevalecem nas divergências). Incorpora e substitui o documento “(MSG-Redesenho) Regras e textos 22-10-2026”, cujo conteúdo foi absorvido (cartão 2.3.1, telas 2.3.2 a 2.3.6, catálogo 2.9). Decisões do solicitante refletidas: o usuário recebe mensagens da equipe da qual faz parte (P-MSG-02); data e hora em um campo único, componente React em aberto (P-MSG-04); o padrão de cor dos botões fica em aberto (P-MSG-01); ordem das abertas por “maior entre última mensagem e prazo” (aceita a sugestão). Conformidade SBIS conferida contra o arquivo de requisitos (resposta a P-MSG-05): lacunas L-01 e L-02 do Mapeamento. Itens [PROPOSTA] novos nesta versão: limite de 4000 caracteres, paginação de 20, ordem de “Finalizadas”, processo condicionado a paciente, Idempotency-Key, interface de publicação de alerta, MSG-TMSG-30 e textos de erro MSG-EMSG-07 a 11. Revisão por Dois Críticos: ver entrada seguinte.
- v1.0, revisão por Dois Críticos (22/10/2026) — Crítico técnico independente, 43 achados, conferidos contra o DDL, o arquivo de requisitos SBIS e o protótipo executado. Aplicados: estado Enviada, Lida e Respondida visível (CA-MSG-016.1, textos MSG-TMSG-31 a 35) e regra de leitura e autoenvio; contrato de atualização de alerta alinhado a RN-MSG-016 (
AppendAlertUpdate); idempotência do envio condicionada à nova estrutura (04, L-06); regras novas na Definição (RN-MSG-031 a 033); Enviar exige Visualizar; concorrência de finalização sem 409 indevido; paginação com ordem mutável; conformidade SBIS corrigida (ECF.17.18 e 17.19 exigem português do Brasil, ECF.17.04 parcial, ECF.17.03 e 17.05 acrescentados, ECF.14.36 retirado, NGS1.07.02 reescrito); CA-MSG-001.2 reescrito; protótipo corrigido (envio volta à lista, atalho no modal, validação de data, estrutura HTML). Registrados como risco ou questão aberta: efeito da ordem por prazo distante (um lembrete com prazo em meses fica no topo do seu grupo; o vencido afunda abaixo de mensagens novas), uso da fila de eventos, índice por remetente e idioma (P-MSG-24). Não aplicados: nenhum falso positivo claro; “Esc sempre chama render” e foco no diálogo ficam para a revisão de UI/UX da versão aprovada. - v1.1 (27/10/2026) — Respostas do solicitante e alinhamento com a Central do Médico v5.15, DT-013 e o Log de Mudanças: (1) borda de não lida de 3 px em
secondary-dark, como na Central (P-MSG-09, D-CM-045); (2) cartão com a linha da clínica quando o usuário atende em mais de uma (DT-013, D-CM-064) eclinicno contrato; (3) botões: um só preenchido por região, em verde escuro (--color-primary-strong), secundário com contorno, “Resolvido” do cartão com contorno (P-MSG-01, Design System seção 12); (4) idempotência do envio pela opção B, sem comparar o conteúdo, e chave por usuário [PROPOSTA] (P-MSG-25); (5) tipo gravado da mensagem sempreResponse, semInitialnemUpdate(Log de Mudanças, 26/10/2026); (6) ECF.17.18 e 17.19 atendidos com o pt-BR completo (P-MSG-24). Em aberto: o selo de estado do cartão (P-MSG-13). - v1.2 (27/10/2026) — Respostas do solicitante (P-MSG-13, P-MSG-29): (1) o cartão não tem mais chip de estado de envio; mostra assunto e data e hora à direita (mantidos assim por decisão do solicitante), “autor: mensagem” e, quando a última mensagem é do usuário,
checkoucheck-check(D-MSG-023); (2)readByOthersno contrato; (3) CA-MSG-016.1 reescrito e CA-MSG-016.2 novo; (4) MSG-TMSG-33 (“Respondida”) retirado do catálogo; MSG-TMSG-31 e 32 passam a ser rótulos dos ícones; (5) o ícone também aparece nas mensagens do usuário dentro da conversa [PROPOSTA]. - v1.3 (28/10/2026) — Grau de urgência (D-MSG-025 a 027): nova seção 2.3.8 (chip, quatro níveis e tokens); campo no formulário (2.3.4) e validação (2.6); chip no cartão e no cabeçalho (2.3.1, 2.3.5); ordem por grau antes da data (2.3.7, 2.8.1); contrato com
urgencyna listagem, no detalhe, na criação e emPublishAlert(semurgencyemAppendAlertUpdate); critérios CA-MSG-017.1 a 017.8; textos MSG-TMSG-36 a 38, MSG-LMSG-16, MSG-IND-1 a 4 e MSG-EMSG-13; acessibilidade e SBIS (ECF.17.18 e 17.19). A colunaGrauUrgenciae os seeds deIndicadoressão [PROPOSTA] (04, L-09 e L-10). - v1.4 (28/10/2026) — Respostas do solicitante ao Registro v1.3 (D-MSG-029 a 034): horário relativo no cartão pela regra da Central (2.3.1, 2.3.7; RN-MSG-035); limite de 2000 caracteres com contador na mensagem e na resposta (2.3.4, 2.6); processo como atalho de um só tipo por conversa, sem depender do paciente, com tipo Documento (2.3.4, 2.6, 2.8.9; RN-MSG-021); alerta que se agrava abre nova conversa e descarta a anterior (2.8.10); critérios CA-MSG-018.1 a 018.5 e CA-MSG-008.3 reescrito; textos MSG-TMSG-39 e 40, MSG-LMSG-17 e MSG-BMSG-15. Contrato de
urgencye formato do chip confirmados. - v1.5 (28/10/2026) — Respostas do solicitante ao P-MSG-33 (D-MSG-035 a 037): tipo Paciente (prontuário), Prescrição, Documento e Registro clínico; Agenda sai; escolha em três etapas (paciente, tipo, item) com o processo exigindo paciente; 2.3.4, 2.6, 2.8.9, CA-MSG-008.3 e 019.1 a 019.4; textos MSG-LMSG-10 (Paciente), 18, 19, MSG-BMSG-16 e MSG-EMSG-14.
- v1.6 (28/10/2026) — Grau de urgência no domínio HL7 (
Routine,Urgent,ASAP,STAT; Rotina, Urgente, Quanto antes, Imediato), chip só com o nome, contrato comkey(D-MSG-039; 2.3.8, 2.6, 2.8); formulário com a nova ordem (Destinatário, Assunto, Mensagem e, em “Opcionais”, grau, prazo, paciente e processo; D-MSG-040); destinatário, paciente e item do processo por busca com autocomplete (nova 2.3.9, D-MSG-038; 2.8.7 a 2.8.9); CA-MSG-020.1 a 020.6; textos MSG-LMSG-20 a 25, MSG-TMSG-41 e 42, MSG-IND-1 a 4 e MSG-TMSG-36 atualizados. - v1.7 (29/10/2026) — Respostas do solicitante: Rotina aparece como chip (2.3.8; D-MSG-043); itens do processo por data do evento (2.3.9; D-MSG-044); aparência do cartão separado, com cantos arredondados, como na Central (2.3.1, item 8; D-MSG-045); CA-MSG-021.1 a 021.3.
- v1.9 (29/10/2026) — Campo do grau na API e no código passa de
urgencyaurgencyLevel(2.6, 2.8; D-MSG-048). A colunaGrauUrgencianão muda. - v1.8 (29/10/2026) — Botão “Resolvido” retirado do cartão (2.3.1 item 5, 2.10, tabela de componentes; CA-MSG-005.1 e 021.4; D-MSG-047); chaves do grau em minúsculas na API e na tabela de chips (D-MSG-046).
- v1.10 (29/10/2026) — Painel sem limite de 4 cartões e sem o link “Ver todas as mensagens”; rolagem própria como os demais painéis da Central (2.3.2; CA-MSG-001.1 e 001.3; MSG-BMSG-10 sem uso; D-MSG-049).
- v1.11 (29/10/2026) — Campos de busca e de exibição do item do processo corrigidos: Prescrição por
Prescricao.Identificacao(qualquer parte), Documento por nome (exibe nome e data), Registro clínico por data (exibe data, modelo e profissional) (formulário; 2.3.9; CA-MSG-020.4; 2.8.9; MSG-LMSG-22 a 24; D-MSG-050). - v1.12 (30/10/2026) — Registro clínico: data do evento, modelo e profissional com origem definida (D-MSG-051; 04, 4.4.1). Documento sem mudança, por ora.
- v1.13 (30/10/2026) — Registro clínico: formato da busca por data e ordem do profissional confirmados (D-MSG-052).
- v1.14 (30/10/2026) — Sem mudança de conteúdo; acompanha a correção do Mapeamento (nome da coluna
SegurancaUsuarioId). - v1.15 (05/11/2026) — Novo visual do cartão e do cabeçalho do painel, alinhados à Central: ordem de importância mensagem, título, urgência, demais informações; paciente e prazo em texto sem chip; sem ícone de carta; avatar de 36 px (2.3.1 itens 1 a 4, 6 e 8; 2.3.8; CA-MSG-004.2; D-MSG-053).
- v1.16 (05/11/2026) — Paciente e processo como links (cartão e cabeçalho; no lugar do botão “Abrir …”); nome da equipe junto ao autor da última mensagem e das mensagens; cartão com botão sobreposto e links de 44 px (2.3.1 itens 2, 4 e 5; 2.3.5; CA-MSG-009.1, 021.5 e 021.6; D-MSG-054).