-- Importacao da doc da aba Documentos do paciente (Fase 2) -- Gerado a partir de development/saas-docs/03-documentos-paciente-melissa.json BEGIN; DO $IMPORT$ DECLARE v_doc_id uuid; BEGIN INSERT INTO public.saas_docs ( titulo, conteudo, categoria, exibir_no_faq, tipo_acesso, pagina_path, ordem, ativo, medias ) VALUES ( 'Documentos do paciente', $HTML$

Documentos do paciente

A aba Documentos do prontuário (em /melissa/paciente?id=...&tab=documentos) centraliza tudo que está vinculado àquele paciente: arquivos enviados por upload, documentos gerados a partir de templates (atestados, declarações, recibos, laudos…), e tudo que precisa ser compartilhado ou assinado.

1. Layout 2-col

A página tem 2 colunas:

No mobile (<1024px), a sidebar vira um drawer acessado pelo botão "Tipos" no header.

2. Toolbar (header)

3 botões no topo:

3. Upload de arquivo

Click no botão Upload abre um dialog que aceita:

Após o upload, o arquivo aparece na lista do tipo escolhido (ou "Outro" se você não selecionou).

4. Tipos de documento (sidebar)

Cada documento é classificado em um tipo. Tipos disponíveis:

O contador ao lado de cada tipo mostra quantos docs daquele tipo o paciente tem. Tipos vazios ficam com opacidade reduzida.

5. Gerar a partir de template

Click no botão Gerar abre o DocumentGenerateDialog em 3 passos:

  1. Selecionar template: grid com todos os templates ativos (globais + do tenant). Click num card seleciona.
  2. Editar variáveis: os campos do template aparecem com FloatLabel. Variáveis que vêm do sistema (nome do paciente, CRP do terapeuta, CNPJ da clínica etc) já vêm preenchidas automaticamente. Banner no topo conta "X de Y preenchidos". Campos vazios mostram um hint embaixo explicando onde cadastrar o dado (ex: "Perfil → Registro Profissional").
  3. Preview: iframe sandboxed renderizando o HTML do template com as vars substituídas. Daqui você pode voltar pra editar, só baixar o PDF (sem salvar no sistema), ou salvar como documento do paciente.
💡 Auto-fill cobre: dados do paciente, terapeuta (incluindo registro profissional formatado tipo "CRP 12345/SP"), clínica/tenant (incluindo CNPJ formatado), data atual em formato curto e por extenso, e — se a sessão for vinculada — valor da sessão em número e por extenso.

6. Editar um documento gerado (re-edição in-place)

Documentos gerados a partir de template podem ser re-editados mantendo o mesmo registro (ID, audit trail e link com o paciente preservados). Click em Editar no card do doc ou na sidebar do preview:

  1. O sistema busca o template original + os valores que você usou na primeira geração
  2. Abre o dialog em modo edição (header amber "Editar documento") pulando direto pro passo 2 (variáveis pré-preenchidas)
  3. Você ajusta o que precisar → Preview → Substituir documento
  4. O PDF é regenerado e substitui o anterior no Storage; o doc fica com o mesmo ID, audit trail intacto

Documento legado (sem registro de geração ou que era um upload): o dialog mostra um toast e cai no fluxo normal de "selecione um template". Ao salvar, ele linka o doc existente ao novo template/valores.

7. Preview do documento

Click num card abre o DocumentPreviewDialog:

8. Compartilhar

Gera um link público temporário pro paciente acessar o documento sem precisar de login. Configurável:

O status compartilhado fica visível na sidebar de detalhes do preview.

9. Assinar

Fluxo de assinatura eletrônica (modal). O documento original recebe uma página adicional de assinatura com timestamp e identificação do signatário. A assinatura é registrada em document_signatures com hash do conteúdo original (proof of integrity).

10. Excluir e recuperar

Excluir é soft-delete: o documento ganha deleted_at mas o arquivo permanece no Storage e o registro fica preservado por 5 anos (compliance LGPD/CFP). Pra recuperar, vá em Configurações → Lixo de documentos.

⚠️ Notas pro desenvolvedor

O componente MelissaPatientDocuments.vue reusa do features/documents:

O linkage document_generated.documento_id (FK pra documents) é o que viabiliza a re-edição in-place. Docs gerados antes da migration de linkage precisam do backfill SQL em database-novo/tmp/backfill-document-generated-link.sql.

$HTML$, 'Documentos', true, 'usuario', '/melissa/paciente', 3, true, '[{"tipo": "imagem", "url": ""}]'::jsonb ) RETURNING id INTO v_doc_id; INSERT INTO public.saas_faq_itens (doc_id, pergunta, resposta, ordem, ativo) VALUES (v_doc_id, 'Como envio um documento que já existe (PDF/imagem do paciente)?', $FAQ$Na aba Documentos do prontuário, click no botão Upload (azul, no canto superior direito). Você pode arrastar o arquivo pra área do dialog ou clicar pra selecionar. Antes de enviar, preencha o tipo, descrição e tags se quiser — assim o doc já vai pra categoria certa na sidebar.$FAQ$, 0, true), (v_doc_id, 'Como gero um documento (atestado, declaração, recibo) a partir de template?', $FAQ$Click no botão Gerar no header da aba Documentos do paciente. O dialog abre em 3 passos: (1) escolha o template, (2) confira as variáveis pré-preenchidas (e ajuste se necessário), (3) preview e Salvar documento. O PDF é gerado e salvo automaticamente no prontuário.$FAQ$, 1, true), (v_doc_id, 'As variáveis (CRP, nome, CNPJ etc) preenchem sozinhas mesmo?', $FAQ$Sim, sempre que possível. O sistema busca: dados do paciente (nome, CPF, RG, endereço, telefone, email…), do terapeuta (nome, email, telefone, e o registro profissional formatado tipo CRP 12345/SP), da clínica (nome, endereço, telefone, CNPJ formatado), data atual em formato curto e por extenso. Se você abriu o gerador a partir de uma sessão, os dados da sessão (valor, data) também entram. Campos vazios mostram embaixo um hint dizendo onde cadastrar o dado faltante.$FAQ$, 2, true), (v_doc_id, 'Posso editar um documento gerado sem refazer tudo do zero?', $FAQ$Sim. Click em Editar no card do documento (ou na sidebar do preview). O dialog abre em modo edição com o template original já selecionado e todos os valores que você usou anteriormente preenchidos. Você ajusta o que precisa, confere o preview e click em Substituir documento. O PDF é regenerado e substitui o anterior, mas o ID e o audit trail do doc continuam os mesmos.$FAQ$, 3, true), (v_doc_id, 'Posso editar um documento que foi feito por upload (não por template)?', $FAQ$Sim, mas o fluxo é diferente: como não há template original, o sistema mostra um aviso e abre o dialog em modo "selecione um template". Ao salvar, ele substitui o arquivo enviado por um PDF gerado e linka ao novo template. Útil pra "converter" um upload manual em algo padronizado. Se você só quer trocar o arquivo, exclua o doc e faça upload do novo.$FAQ$, 4, true), (v_doc_id, 'Como compartilho um documento com o paciente sem ele precisar logar?', $FAQ$No preview, click em Compartilhar. Um dialog gera um link público temporário com opção de tempo de expiração (1h, 24h, 7 dias, custom) e senha opcional. O paciente acessa pelo link, sem login. O status fica visível na sidebar de detalhes do doc.$FAQ$, 5, true), (v_doc_id, 'Como assino eletronicamente um documento?', $FAQ$No preview, click em Assinar. O fluxo adiciona uma página de assinatura ao PDF com timestamp e identificação. A assinatura é registrada com hash do conteúdo original — qualquer alteração posterior invalida a integridade. Ideal pra laudos, declarações e atestados que precisam de validade legal.$FAQ$, 6, true), (v_doc_id, 'Excluí um documento por engano, dá pra recuperar?', $FAQ$Sim. Exclusão é soft-delete — o documento ganha um marcador deleted_at mas continua no banco e o arquivo permanece no Storage. Pra recuperar, vá em Configurações → Lixo de documentos. O período de retenção é de 5 anos (compliance LGPD e regulamentação CFP), depois o arquivo é purgado permanentemente.$FAQ$, 7, true), (v_doc_id, 'Por que alguns documentos aparecem na categoria "Outro"?', $FAQ$Documentos enviados por upload sem tipo definido caem em "Outro" automaticamente. Documentos gerados a partir de templates cujo tipo não está mapeado pras categorias padrão (declarações, atestados, laudos, etc) também — exemplos: contrato de prestação de serviços, autorização para gravação, termo de consentimento. Você pode mover o doc pra outra categoria editando o tipo na hora do upload ou via menu de ações no card.$FAQ$, 8, true), (v_doc_id, 'Quais formatos de arquivo posso fazer upload?', $FAQ$PDF, imagens (JPG, PNG, WebP, GIF), documentos Office (DOCX, XLSX, PPTX), texto simples (TXT, CSV) e formatos compactados (ZIP). Pra qualquer formato fora dessa lista, salve como PDF antes. O preview inline só funciona pra PDF e imagens — outros formatos mostram a opção "Baixar arquivo" no lugar.$FAQ$, 9, true), (v_doc_id, 'Como o sistema garante que o documento não vaza pra outros profissionais?', $FAQ$Cada documento tem um campo de visibilidade: Privado (só você vê), Compartilhado com supervisor (você + seu supervisor) ou Compartilhado com portal do paciente (o paciente também vê pelo portal). O default é Privado. RLS (Row Level Security) no banco bloqueia leitura por terceiros, independente da visibilidade. URLs do Storage são assinadas e expiram em 1h.$FAQ$, 10, true), (v_doc_id, 'Os botões da sidebar do preview (Baixar/Editar/Compartilhar/Assinar/Excluir) não funcionavam, foi corrigido?', $FAQ$Sim. Bug conhecido até 2026-05-22: o DocumentPreviewDialog emitia os 5 eventos mas o componente pai não os escutava, então nada acontecia ao clicar. Agora todos os 5 botões funcionam normalmente e o de Editar abre o dialog de geração em modo edição.$FAQ$, 11, true); RAISE NOTICE 'Doc criada: id=%, faq_itens=12', v_doc_id; END; $IMPORT$; COMMIT;