# Plano de Implementacao — Documentos & Arquivos

Modulo completo: upload, templates, geracao PDF, assinatura eletronica, portal do paciente, auditoria
AgenciaPsi v5 Vue 3 + Supabase 2026-03-30 Status: em andamento
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