documents/generate: suporte a edicao in-place + linkage documento_id

document_generated.documento_id (FK pra documents) estava sempre NULL
no INSERT — sem isso nao da pra rastrear qual generated belongs to
qual documents row, impossibilitando re-edicao.

DocumentGenerate.service saveGeneratedDocument:
- Modo create (default): INSERT em documents PRIMEIRO pra capturar
  doc.id, depois INSERT em document_generated com documento_id setado.
- Modo edit (editingDocId param novo): UPDATE in-place — substitui
  PDF no Storage (novo path), atualiza bucket_path/tamanho/nome em
  documents (preserva id+audit), atualiza dados_preenchidos+pdf_path
  em document_generated. Se nao houver registro generated (doc legado),
  INSERT vinculando ao documents.id. Cleanup best-effort do PDF antigo.
- Nova fn loadGeneratedFromDocId(documentoId): busca template_id +
  dados_preenchidos pra pre-popular o dialog de edicao.

useDocumentGenerate.generateAndSave: ganha 2o param editingDocId que
passa pro service.

Backfill SQL pra docs antigos: match dg.pdf_path = d.bucket_path +
tenant/patient guard. 3 docs linkados no DB local, 5 ficaram orfaos
(paths que nao existem mais em documents — cleanup antigo).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-22 13:42:24 -03:00
parent fff70e4a71
commit 342defecde
3 changed files with 174 additions and 24 deletions
@@ -99,9 +99,12 @@ export function useDocumentGenerate() {
// ── Gerar PDF (client-side) ────────────────────────────
/**
* Gera PDF blob, faz download, salva no Storage + banco.
* Gera PDF blob, salva no Storage + banco.
* @param {string} patientId
* @param {string|null} editingDocId - se setado, UPDATE no doc existente
* (in-place replace de PDF + metadados, preserva documents.id e audit).
*/
async function generateAndSave(patientId) {
async function generateAndSave(patientId, editingDocId = null) {
if (!selectedTemplate.value) throw new Error('Nenhum template selecionado.');
loading.value = true;
@@ -119,7 +122,8 @@ export function useDocumentGenerate() {
dadosPreenchidos: { ...variables.value },
pdfBlob: blob,
templateNome,
templateTipo: selectedTemplate.value.tipo
templateTipo: selectedTemplate.value.tipo,
editingDocId
});
generatedDocs.value.unshift(result);
return result;