{ "titulo": "Documentos do paciente", "conteudo": "
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.
A página tem 2 colunas:
\nNo mobile (<1024px), a sidebar vira um drawer acessado pelo botão \"Tipos\" no header.
\n\n3 botões no topo:
\nClick no botão Upload abre um dialog que aceita:
\nApós o upload, o arquivo aparece na lista do tipo escolhido (ou \"Outro\" se você não selecionou).
\n\nCada documento é classificado em um tipo. Tipos disponíveis:
\nO contador ao lado de cada tipo mostra quantos docs daquele tipo o paciente tem. Tipos vazios ficam com opacidade reduzida.
\n\nClick no botão Gerar abre o DocumentGenerateDialog em 3 passos:
\nDocumentos 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:
\n\nDocumento 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.
\n\nClick num card abre o DocumentPreviewDialog:
\nGera um link público temporário pro paciente acessar o documento sem precisar de login. Configurável:
\nO status compartilhado fica visível na sidebar de detalhes do preview.
\n\nFluxo 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).
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.
O componente MelissaPatientDocuments.vue reusa do features/documents:
useDocuments — composable de fetch/CRUD/URLs assinadasDocumentCard, DocumentUploadDialog, DocumentPreviewDialog, DocumentGenerateDialog, DocumentSignatureDialog, DocumentShareDialogO 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.
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.",
"ordem": 7,
"ativo": true
},
{
"pergunta": "Por que alguns documentos aparecem na categoria \"Outro\"?",
"resposta": "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.",
"ordem": 8,
"ativo": true
},
{
"pergunta": "Quais formatos de arquivo posso fazer upload?",
"resposta": "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.",
"ordem": 9,
"ativo": true
},
{
"pergunta": "Como o sistema garante que o documento não vaza pra outros profissionais?",
"resposta": "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.",
"ordem": 10,
"ativo": true
},
{
"pergunta": "Os botões da sidebar do preview (Baixar/Editar/Compartilhar/Assinar/Excluir) não funcionavam, foi corrigido?",
"resposta": "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.",
"ordem": 11,
"ativo": true
}
]
}