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)