6
Tabelas
2
Buckets
7
Services
3
Composables
~10
Componentes
5
Feature flags
1
Banco de Dados — Migrations
Tabelas, RLS policies, indexes, triggers
Migration Tabela / Objeto O que faz Campos principais
005_create_documents_tables.sql documents Arquivo vinculado a paciente. Path no Supabase Storage, tipo/categoria, visibilidade, tags, soft delete com retencao LGPD. Tabela central do modulo. O campo storage_bucket indica qual bucket do Storage contem o arquivo (documents ou generated-docs), permitindo que PDFs gerados aparecam na mesma listagem.
id patient_id tenant_id owner_id bucket_path storage_bucket nome_original mime_type tamanho_bytes tipo_documento categoria descricao tags[] visibilidade compartilhado_portal compartilhado_supervisor agenda_evento_id session_note_id enviado_pelo_paciente status_revisao revisado_por revisado_em uploaded_by uploaded_at deleted_at deleted_by retencao_ate
document_access_logs Log imutavel de quem visualizou ou baixou cada arquivo. Conformidade CFP e LGPD. Sem UPDATE/DELETE — somente INSERT e SELECT.
id documento_id acao user_id ip user_agent acessado_em
document_signatures Assinaturas eletronicas. Cada signatario (paciente, responsavel, terapeuta) tem seu registro com IP, timestamp e hash do documento.
id documento_id signatario_tipo signatario_id ordem status ip user_agent assinado_em hash_documento
document_share_links Links temporarios assinados para compartilhar documento com profissional externo sem conta no sistema. Prazo e limite de usos.
id documento_id token expira_em usos_max usos criado_por criado_em
006_create_document_templates.sql document_templates Templates de documentos (declaracao de comparecimento, atestado, recibo etc.). Corpo HTML com variaveis. Templates globais do sistema + personalizados por tenant com logo/cabecalho.
id tenant_id nome_template tipo corpo_html variaveis[] is_global owner_id logo_url cabecalho_html rodape_html ativo
document_generated Cada PDF gerado a partir de um template. Guarda os dados usados no preenchimento e o path do PDF resultante no Storage.
id template_id patient_id tenant_id dados_preenchidos pdf_path gerado_em gerado_por
2
Supabase Storage — Buckets
Bucket Uso Path pattern
documents Arquivos enviados por terapeuta ou paciente (PDF, imagem, DOCX, etc.) {tenant_id}/{patient_id}/{timestamp}-{filename}
generated-docs PDFs gerados pelo sistema a partir de templates. Referenciado tanto por document_generated (snapshot) quanto por documents (listagem do paciente) via campo storage_bucket. {tenant_id}/{patient_id}/{template_nome_sanitizado}_{timestamp}.pdf
3
Services — Camada de dados
src/services/ — seguem o padrao Medicos.service.js (getOwnerId + getActiveTenantId + CRUD)
Arquivo O que faz
Documents.service.js CRUD completo de documentos: upload ao Storage + insert no banco, listagem por paciente com filtros (tipo, categoria, tags), soft delete com retencao, restauracao, download com URL assinada
DocumentTemplates.service.js CRUD de templates: criar/editar templates (globais e por tenant), listar variaveis disponiveis, duplicar template, ativar/desativar
DocumentGenerate.service.js Gerar PDF a partir de template: preencher variaveis com dados do paciente/sessao, renderizar HTML para PDF via pdf.service.js (jsPDF + html2canvas-pro), salvar no bucket generated-docs, registrar em document_generated E automaticamente na tabela documents (para aparecer na listagem do paciente). Nomes de arquivo sanitizados (sem acentos) para compatibilidade com Supabase Storage.
pdf.service.js Servico de geracao de PDF client-side usando jsPDF + html2canvas-pro. Substitui pdfmake que apresenta incompatibilidade com Vite (UMD vs ESM — getBlob/getBuffer travam silenciosamente). Recebe HTML completo, renderiza em canvas oculto (scale 1.5, JPEG 85%), gera PDF A4 com paginacao automatica. Retorna Blob para upload/download.
DocumentSignatures.service.js Criar solicitacao de assinatura, registrar assinatura (IP, hash, timestamp, user_agent), consultar status de cada signatario, verificar integridade via hash
DocumentShareLinks.service.js Gerar link temporario com token, validar token no acesso, registrar uso, expirar link
DocumentAuditLog.service.js Registrar log de acesso (visualizacao/download) e consultar historico de acessos por documento
4
Composables — Logica reativa
src/features/documents/composables/
Arquivo O que faz
useDocuments.js State reativo: lista de documentos do paciente, loading, filtros ativos (tipo, categoria, tags), operacoes CRUD, refresh automatico apos upload/delete
useDocumentTemplates.js State reativo: lista de templates disponiveis (globais + tenant), preview com dados ficticios, variaveis extraidas do corpo HTML
useDocumentGenerate.js Logica de geracao: carregar dados do paciente/sessao, mapear variaveis, chamar servico de geracao, retornar URL do PDF
5
Paginas & Componentes Vue
src/features/documents/
Arquivo Tipo O que faz
DocumentsListPage.vue Pagina Pagina principal — lista todos os documentos do paciente com DataTable, filtros (tipo, categoria, tags), botoes de upload, preview, download. Hero header sticky com stats rapidos.
DocumentUploadDialog.vue Dialog Upload de arquivo — drag & drop ou seletor, campos: tipo do documento, categoria, descricao, tags, vinculo com sessao (opcional), visibilidade. Validacao de tamanho e tipo de arquivo.
DocumentPreviewDialog.vue Dialog Preview inline — renderiza PDF/imagem no dialog. Botoes: download, compartilhar, solicitar assinatura, excluir. Exibe metadados (tipo, tags, quem enviou, data).
DocumentTemplatesPage.vue Pagina Gestao de templates — lista templates disponiveis (globais + do tenant), criar novo, editar, duplicar, ativar/desativar. Cards com preview do template.
DocumentTemplateEditor.vue Componente Editor de template — edicao do corpo HTML (editor rich text), insercao de variaveis via dropdown, preview ao vivo com dados ficticios, config de cabecalho/rodape/logo.
DocumentGenerateDialog.vue Dialog Gerar documento — selecionar template, campos preenchidos automaticamente com dados do paciente/sessao, edicao manual se necessario, preview final via iframe sandbox, botao "Salvar documento" (salva online, sem download automatico). Botao "So baixar" gera PDF local sem salvar no banco.
DocumentSignatureDialog.vue Dialog Solicitar assinatura — adicionar signatarios (paciente, responsavel, terapeuta), definir ordem, enviar link por email/whatsapp, acompanhar status de cada signatario.
DocumentShareDialog.vue Dialog Compartilhar — gerar link temporario com prazo (24h, 48h, 7d) e limite de usos, copiar link, enviar por email. Exibe links ja criados com status.
components/DocumentCard.vue Componente Card reutilizavel de documento — thumbnail (icone por tipo ou preview de imagem), nome, tipo, data, tags, menu de acoes (3 dots).
components/DocumentTagsInput.vue Componente Input de tags livres — chips editaveis com autocomplete baseado em tags ja usadas pelo terapeuta. Criacao de novas tags inline.
6
Integracao com Prontuario (arquivo existente)
Arquivo existente Alteracao
src/features/patients/prontuario/PatientProntuario.vue Adicionar aba/secao "Documentos" que renderiza DocumentsListPage filtrada pelo patient_id atual. Botao rapido de upload direto do prontuario.
7
Rotas
Adicionadas em routes.therapist.js e routes.clinic.js
Rota Pagina Descricao
/therapist/documents DocumentsListPage.vue Lista geral de documentos (todos os pacientes do terapeuta)
/therapist/documents/templates DocumentTemplatesPage.vue Gestao de templates do terapeuta
/therapist/patients/:id/documents DocumentsListPage.vue Documentos de um paciente especifico (via props)
/clinic/documents/templates DocumentTemplatesPage.vue Templates da clinica (admin configura templates compartilhados)
8
Menus de Navegacao
Arquivo Item adicionado Onde no menu
therapist.menu.js "Documentos" — icon: pi-file, to: /therapist/documents Grupo "Pacientes", abaixo de "Tags"
therapist.menu.js "Templates" — icon: pi-file-edit, to: /therapist/documents/templates Sub-item de Documentos
clinic.menu.js "Templates de Documentos" — icon: pi-file-edit, to: /clinic/documents/templates Grupo "Configuracoes"
9
SaaS — Feature Flags
Inseridas em saas_features e vinculadas aos planos via plan_features
Feature key Descricao Planos
documents.upload Upload de arquivos a pacientes — funcionalidade base Free + Pro
documents.templates Templates de documentos (declaracao, atestado, recibo etc.) Pro
documents.signatures Assinatura eletronica (TCLE, consentimentos) Pro
documents.share_links Links temporarios para compartilhamento externo Pro
documents.patient_portal Paciente visualiza e envia documentos pelo portal Pro
10
Seed Data — Templates Padrao
Arquivo O que insere
seed_015_document_templates.sql 4 templates globais (is_global = true) com corpo HTML e variaveis mapeadas:
Declaracao de Comparecimento Atestado Psicologico Relatorio de Acompanhamento Recibo de Pagamento
Variaveis dos templates: {{paciente_nome}}, {{paciente_cpf}}, {{data_sessao}}, {{hora_inicio}}, {{hora_fim}}, {{terapeuta_nome}}, {{terapeuta_crp}}, {{clinica_nome}}, {{clinica_endereco}}, {{valor}}, {{data_atual}}, entre outras. Cada template define quais variaveis utiliza no campo variaveis[].
Decisao tecnica — Motor PDF: pdfmake foi substituido por jsPDF + html2canvas-pro. O pdfmake (UMD) trava silenciosamente com Vite (ESM) — createPdf().getBlob()/getBuffer() nunca retornam, mesmo com optimizeDeps configurado. A solucao final usa html2canvas-pro (fork com suporte a cores oklch do PrimeVue/Tailwind) para renderizar o HTML preenchido em canvas, e jsPDF para converter em PDF A4 com paginacao. Resultado: ~200-400KB por documento (JPEG 85%, scale 1.5).
!
Ordem de Execucao Sugerida
Fase O que Depende de
1 Migrations (tabelas, RLS, triggers, indexes)
2 Buckets no Supabase Storage Fase 1
3 Services (camada de dados) Fase 1 + 2
4 Composables (logica reativa) Fase 3
5 Componentes e Paginas Vue Fase 4
6 Rotas, menus, feature flags Fase 5
7 Integracao com Prontuario Fase 5
8 Seed data (templates padrao) Fase 1