# Documentos & Arquivos

Status de implementacao confrontado com o banco de dados
AgenciaPsi v5 Vue 3 + Supabase Atualizado: 2026-03-30
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_id bucket_path storage_bucket nome_original mime_type tamanho_bytes uploaded_by uploaded_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_documento categoria descricao tags[]
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_id session_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.
visibilidade compartilhado_portal compartilhado_supervisor compartilhado_em expira_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_at deleted_by retencao_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_template tipo corpo_html cabecalho_html rodape_html variaveis[] is_global logo_url ativo
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_id dados_preenchidos pdf_path gerado_em gerado_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_id signatario_tipo signatario_id ordem status ip hash_documento assinado_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.
token expira_em usos_max usos ativo criado_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_portal compartilhado_em expira_compartilhamento
Upload pelo paciente
db pronto
Paciente envia exames/laudos pelo portal. Fila de "pendentes de revisao" para o terapeuta aprovar.
enviado_pelo_paciente status_revisao revisado_por revisado_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_id acao user_id ip user_agent acessado_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.