Skip to content

Contract Save Flow - Fluxo de Salvamento ​

Visão Geral ​

O salvamento do contrato é feito manualmente via botão Salvar na toolbar. Os dados são mantidos no store local durante a edição e persistidos na API ao clicar salvar.


Fluxo Principal ​

Primeira vez (criar contrato) ​

  1. Usuário seleciona um workflow na toolbar
  2. Preenche dados nos steps (parts, model, documents, etc.)
  3. Clica no botão Salvar
  4. Modal aparece pedindo o nome do contrato
  5. Usuário preenche o nome e confirma
  6. POST /contracts é chamado com snapshot completo dos dados
  7. Backend retorna o contractId
  8. Store atualiza currentContractId
  9. Feedback de sucesso exibido

Próximas vezes (atualizar contrato) ​

  1. Usuário modifica dados em qualquer step
  2. Clica no botão Salvar
  3. PUT /contracts/{id} é chamado com snapshot completo
  4. Feedback de sucesso exibido

Carregar contrato existente ​

  1. Usuário acessa rota /contracts/:id/edit
  2. GET /contracts/{id}/detail carrega todos os dados
  3. Store é populado com dados de todos os steps
  4. Usuário continua editando de onde parou

Dados Salvos por Step ​

Step Parts ​

  • Array de ContractPart (person, role)

Step Model ​

  • modelConfig (templateId, partGroups, variableAssignments)
  • variableValues (valores preenchidos por grupo)
  • selectedTemplate (template escolhido)

Step Documents ​

  • Array de DocumentRequirement (name, isDownload, formats, etc.)
  • Configuração de download files

Step Upload ​

  • Arquivos enviados via endpoint separado (POST multipart)
  • Não faz parte do payload principal de save
  • Aparece automaticamente quando há documentos com isDownload: false

Step Revision ​

  • revisionConfig (reviewers com ordem e obrigatoriedade)

Step Signature ​

  • signatureConfig (groups de assinatura, ordem)

Composable: useContractSave ​

Responsabilidades:

  • Controlar visibilidade do modal de nome
  • Montar o payload de save a partir do store
  • Decidir entre POST (criar) e PUT (atualizar)
  • Gerenciar estados de loading e feedback
  • Expor isDirty para indicar mudanças não salvas

Estado no Store ​

Novas propriedades no contractDetail store:

  • isSaving: boolean, save em andamento
  • isDirty: boolean, mudanças não salvas
  • lastSavedAt: Date | null, timestamp do último save

Novos métodos:

  • saveContract(name): criar contrato (POST)
  • updateContract(): atualizar contrato (PUT)
  • save(): decide entre create/update
  • loadFullDetail(id): carregar contrato completo para edição
  • buildSavePayload(): montar payload a partir do estado atual

Upload de Arquivos ​

O step Upload funciona de forma independente do save geral:

  • Cada upload é enviado individualmente via POST /contracts/{id}/documents/{docId}/files
  • O contrato precisa estar salvo (ter currentContractId) antes de fazer upload
  • Se o contrato ainda não foi salvo, o botão de upload fica desabilitado

Botão Dinâmico na Toolbar ​

O botão principal da toolbar muda de label, cor e ação conforme o estado do contrato:

Lógica de decisão ​

Se contrato nunca salvo         → "Salvar" (default)
Se há alterações não salvas     → "Salvar" (default)
Se próximo step = revision      → "Enviar para Revisão" (primary/azul)
Se próximo step = upload/sig    → "Publicar" (success/verde)
Senão                           → "Salvar" (disabled)

Fluxo: Enviar para Revisão ​

  1. Usuário preenche todos os steps até documents
  2. Salva o contrato
  3. Botão muda para "Enviar para Revisão" (azul)
  4. Ao clicar: PUT /contracts/{id} com status: 'in_review'
  5. Backend detecta a mudança de status e envia e-mail para revisores
  6. Status muda para in_review
  7. Steps anteriores ficam bloqueados para edição (diretiva v-lock-step)

Fluxo: Publicar ​

  1. Contrato salvo e o próximo step é upload ou signature
  2. Botão muda para "Publicar" (verde)
  3. Ao clicar: PUT /contracts/{id} com status: 'published'
  4. Backend detecta a mudança de status e envia notificação para as partes
  5. Status muda para published
  6. Steps anteriores ficam bloqueados para edição

Bloqueio de steps anteriores ​

Quando o contrato entra em etapa de terceiros (revision, upload, signature):

  • Diretiva v-lock-step: remove do DOM botões de ação (add, edit, delete)
  • Diretiva v-lock-field: desabilita inputs, selects e textareas
  • O usuário pode navegar entre steps, mas não pode executar ações de edição
  • O workflow select na toolbar fica desabilitado

Regras ​

  1. O botão Salvar fica habilitado assim que um workflow é selecionado
  2. Na primeira vez, o modal de nome é obrigatório
  3. Nas próximas vezes, salva direto sem modal
  4. Navegação entre steps não aciona save, dados ficam no store local
  5. O step Upload só permite upload de arquivos se o contrato já foi salvo
  6. O nome do contrato pode ser editado no modal (futuro: inline na toolbar)
  7. Após "Enviar para Revisão" ou "Publicar", steps anteriores ficam bloqueados
  8. O botão dinâmico reflete o próximo step do fluxo, não o step atual