diff --git a/src/features/documents/components/DocumentGenerateDialog.vue b/src/features/documents/components/DocumentGenerateDialog.vue index 361a120..82c7e10 100644 --- a/src/features/documents/components/DocumentGenerateDialog.vue +++ b/src/features/documents/components/DocumentGenerateDialog.vue @@ -13,12 +13,19 @@ import { ref, watch, computed } from 'vue' import { useToast } from 'primevue/usetoast' import { useDocumentGenerate } from '../composables/useDocumentGenerate' import { useDocumentTemplates } from '../composables/useDocumentTemplates' +import { loadGeneratedFromDocId } from '@/services/DocumentGenerate.service' const props = defineProps({ visible: { type: Boolean, default: false }, patientId: { type: String, default: null }, patientName: { type: String, default: '' }, - agendaEventoId: { type: String, default: null } + agendaEventoId: { type: String, default: null }, + // Modo edicao: ID de um documents.id existente. Quando setado, o dialog + // busca o template_id + dados_preenchidos do document_generated vinculado, + // pre-seleciona o template e popula as variaveis. Save vira UPDATE + // in-place (preserva documents.id e audit). Doc sem registro generated + // (uploaded direto) cai no flow normal de "select template". + editingDocId: { type: String, default: null } }) const emit = defineEmits(['update:visible', 'generated']) @@ -52,13 +59,48 @@ const { // ── Reset ao abrir ────────────────────────────────────────── watch(() => props.visible, async (v) => { - if (v) { - step.value = 'select' - reset() - await Promise.all([ - fetchTemplates(), - props.patientId ? loadVariables(props.patientId, props.agendaEventoId) : Promise.resolve() - ]) + if (!v) return; + step.value = 'select' + reset() + await Promise.all([ + fetchTemplates(), + props.patientId ? loadVariables(props.patientId, props.agendaEventoId) : Promise.resolve() + ]) + + // Modo edicao: tenta carregar o registro do generated, pre-seleciona + // template e popula vars com dados_preenchidos (sobrescreve auto-vars + // — preserva customizacao anterior do user). Se nao houver linkage + // (doc uploaded direto), continua no flow normal de "select template". + if (props.editingDocId) { + const gen = await loadGeneratedFromDocId(props.editingDocId) + if (gen?.template_id) { + try { + await selectTemplate(gen.template_id) + // Merge: dados_preenchidos override auto-loaded variables. + // Mantemos as vars que o user nao tinha customizado da vez + // anterior (pra caso o template tenha vars novas adicionadas + // depois) — pegamos as keys auto + sobrescreve com generated. + const saved = gen.dados_preenchidos || {} + Object.entries(saved).forEach(([k, val]) => { + setVariable(k, val == null ? '' : String(val)) + }) + step.value = 'edit' + } catch (e) { + toast.add({ + severity: 'warn', + summary: 'Template original não encontrado', + detail: 'Selecione um template para regenerar o documento.', + life: 3500 + }) + } + } else { + toast.add({ + severity: 'info', + summary: 'Documento legado', + detail: 'Sem dados de edição. Selecione um template para regenerar.', + life: 3500 + }) + } } }) @@ -109,8 +151,15 @@ function onVarChange(key, val) { async function onGenerate() { try { - const result = await generateAndSave(props.patientId) - toast.add({ severity: 'success', summary: 'Documento salvo', detail: 'Disponível nos documentos do paciente.', life: 3000 }) + const result = await generateAndSave(props.patientId, props.editingDocId || null) + toast.add({ + severity: 'success', + summary: props.editingDocId ? 'Documento atualizado' : 'Documento salvo', + detail: props.editingDocId + ? 'PDF substituído com os novos valores.' + : 'Disponível nos documentos do paciente.', + life: 3000 + }) emit('generated', result) close() } catch (e) { @@ -153,10 +202,10 @@ function close() {