6/6
Tabelas
2/2
Buckets
7/7
Services
3/3
Composables
10/10
Componentes
14
Templates seed
Implementado
Parcial / Migration pendente
Nao implementado
1
Upload & Organizacao de Arquivos
Upload de arquivo ao paciente
pronto
PDF, imagem, DOCX. Vinculado ao patient_id. Supabase Storage com path estruturado. Drag & drop + seletor. Validacao de tamanho (50MB) e tipo MIME.
patient_idbucket_pathstorage_bucket nome_originalmime_typetamanho_bytes uploaded_byuploaded_at
Documents.service.js → uploadDocument()
Tipo, categoria & tags
pronto
11 tipos (laudo, receita, exame, atestado, declaracao, recibo, etc.). Categoria livre. Tags[] com autocomplete. Filtros na listagem.
tipo_documentocategoriadescricaotags[]
DB: CHECK constraint + GIN index em tags
Vinculo com sessao
pronto
Arquivo linkado a agenda_eventos (sessao) ou session_note. Colunas nullable — nem todo arquivo tem sessao.
agenda_evento_idsession_note_id
DB: FK para agenda_eventos (ON DELETE SET NULL)
Visibilidade & controle de acesso
pronto
Privado, compartilhado com supervisor, ou visivel no portal do paciente. Granular por arquivo. Expiracao de compartilhamento.
visibilidadecompartilhado_portalcompartilhado_supervisor compartilhado_emexpira_compartilhamento
DB: CHECK (privado | compartilhado_supervisor | compartilhado_portal)
Soft delete com retencao LGPD
pronto
Arquivo "excluido" some da UI mas fica retido por 5 anos (CFP). Colunas de controle + index parcial para listagem ativa.
deleted_atdeleted_byretencao_ate
DB: idx_documents_active (WHERE deleted_at IS NULL)
Preview & download
pronto
Preview inline de PDF e imagens via dialog. Download com URL assinada (60s). Suporte a storage_bucket dinamico (documents ou generated-docs).
DocumentPreviewDialog.vue + getDownloadUrl(path, expires, bucket)
2
Geracao de Documentos (PDF)
Templates de documentos
pronto
16 tipos de template. 14 templates globais no seed. Corpo HTML com {{variaveis}}. Cabecalho/rodape personalizaveis. Templates por tenant + globais do sistema.
nome_templatetipocorpo_html cabecalho_htmlrodape_htmlvariaveis[] is_globallogo_urlativo
document_templates (DB) + seed_015_document_templates.sql
Geracao de PDF (client-side)
pronto
jsPDF + html2canvas-pro (substituiu pdfmake por incompatibilidade com Vite). Renderiza HTML preenchido em canvas, converte para PDF A4 com paginacao. JPEG 85%, scale 1.5. ~200-400KB por documento.
buildFullHtml()htmlToPdfBlob()fillTemplate()
pdf.service.js + DocumentGenerate.service.js
Documento gerado (instancia + listagem)
pronto
Cada PDF gerado: salva snapshot em document_generated (dados preenchidos para auditoria) E automaticamente registra na tabela documents (para aparecer na listagem do paciente). Bucket: generated-docs. Nomes sanitizados (sem acentos).
template_iddados_preenchidospdf_path gerado_emgerado_por→ documents
saveGeneratedDocument() → document_generated + documents
Fluxo de geracao (UI)
pronto
Dialog 3 etapas: selecionar template → editar variaveis (auto-preenchidas com dados paciente/sessao/terapeuta/clinica) → preview via iframe sandbox → "Salvar documento" (online) ou "So baixar" (local).
DocumentGenerateDialog.vue + useDocumentGenerate.js
Dados da clinica no template
parcial
loadClinicData() usa select('*') na tabela tenants. Atualmente so retorna name. Campos phone, contact_email, logradouro, numero, bairro, cidade, estado dependem da migration 003_tenants_address_fields.sql ser aplicada.
Migration pendente: 003_tenants_address_fields.sql
Editor de templates
pronto
Editor rich text para corpo HTML. Insercao de variaveis via dropdown. Preview ao vivo. Config de cabecalho/rodape/logo. Gestao de templates globais e por tenant.
DocumentTemplateEditor.vue + DocumentTemplatesPage.vue
3
Assinatura Eletronica
TCLE & consentimento
db pronto
Tabela document_signatures com rastreamento completo: IP, timestamp, hash SHA-256, user_agent. Suporte a 3 tipos de signatario (paciente, responsavel_legal, terapeuta). 5 status possiveis.
documento_idsignatario_tiposignatario_id ordemstatusip hash_documentoassinado_em
document_signatures (DB) + DocumentSignatures.service.js
UI de assinatura
parcial
Componente DocumentSignatureDialog.vue existe. Service DocumentSignatures.service.js existe. Fluxo completo de envio por link e assinatura pelo paciente ainda precisa ser validado end-to-end.
DocumentSignatureDialog.vue
4
Compartilhamento & Portal do Paciente
Links temporarios de acesso
pronto
Token hex 32 bytes, prazo de expiracao, limite de usos. RLS publica por token valido. Link seguro sem necessidade de login.
tokenexpira_emusos_max usosativocriado_por
document_share_links (DB) + DocumentShareLinks.service.js
Documentos compartilhados com paciente
db pronto
Terapeuta decide quais arquivos ficam visiveis pro paciente. Campos compartilhado_portal e expira_compartilhamento na tabela documents.
compartilhado_portalcompartilhado_emexpira_compartilhamento
Upload pelo paciente
db pronto
Paciente envia exames/laudos pelo portal. Fila de "pendentes de revisao" para o terapeuta aprovar.
enviado_pelo_pacientestatus_revisao revisado_porrevisado_em
5
Auditoria & Conformidade
Log de acesso a arquivos
pronto
Tabela imutavel (somente INSERT + SELECT, sem UPDATE/DELETE). Cada visualizacao ou download registrado. Conformidade CFP e LGPD. Integrado no composable useDocuments (logAccess automatico).
documento_idacaouser_id ipuser_agentacessado_em
document_access_logs (DB) + DocumentAuditLog.service.js
Timeline do paciente
pronto
Triggers automaticos registram na patient_timeline quando: documento uploadado (INSERT em documents) e documento assinado (UPDATE em document_signatures).
DB Triggers: trg_documents_timeline_insert + trg_ds_timeline
!
Pendencias & Migrations Nao Aplicadas
Migration: tenants address fields
pendente
003_tenants_address_fields.sql — adiciona cep, logradouro, numero, complemento, bairro, cidade, estado a tabela tenants. Tambem faltam phone e contact_email. Necessario para preencher variaveis clinica_endereco, clinica_telefone nos templates.
Campo CRP do terapeuta
pendente
Variavel terapeuta_crp nos templates retorna vazio. O campo CRP nao existe na tabela profiles nem em tenant_members. Precisa de migration para adicionar coluna crp em profiles.
Fluxo de assinatura end-to-end
validar
Tabela, service e componente existem. Falta validar: envio de link por email/whatsapp, pagina publica de assinatura, registro de IP/hash, notificacao ao terapeuta quando assinado.
Portal do paciente — visualizacao de docs
validar
Campos compartilhado_portal e visibilidade existem no banco. SharedDocumentPage.vue existe. Falta validar se o portal do paciente (CadastroPacienteExterno) exibe corretamente os documentos compartilhados.
Decisao tecnica — Motor PDF: pdfmake foi substituido por jsPDF + html2canvas-pro. O pdfmake (UMD) trava silenciosamente com Vite (ESM) — createPdf().getBlob()/getBuffer() nunca retornam. html2canvas-pro e um fork open source (MIT) com suporte a cores oklch usadas pelo PrimeVue/Tailwind.