Appearance
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)
- Usuário seleciona um workflow na toolbar
- Preenche dados nos steps (parts, model, documents, etc.)
- Clica no botão Salvar
- Modal aparece pedindo o nome do contrato
- Usuário preenche o nome e confirma
POST /contractsé chamado com snapshot completo dos dados- Backend retorna o
contractId - Store atualiza
currentContractId - Feedback de sucesso exibido
Próximas vezes (atualizar contrato)
- Usuário modifica dados em qualquer step
- Clica no botão Salvar
PUT /contracts/{id}é chamado com snapshot completo- Feedback de sucesso exibido
Carregar contrato existente
- Usuário acessa rota
/contracts/:id/edit GET /contracts/{id}/detailcarrega todos os dados- Store é populado com dados de todos os steps
- 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) ePUT(atualizar) - Gerenciar estados de loading e feedback
- Expor
isDirtypara indicar mudanças não salvas
Estado no Store
Novas propriedades no contractDetail store:
isSaving: boolean, save em andamentoisDirty: boolean, mudanças não salvaslastSavedAt: Date | null, timestamp do último save
Novos métodos:
saveContract(name): criar contrato (POST)updateContract(): atualizar contrato (PUT)save(): decide entre create/updateloadFullDetail(id): carregar contrato completo para ediçãobuildSavePayload(): 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
- Usuário preenche todos os steps até documents
- Salva o contrato
- Botão muda para "Enviar para Revisão" (azul)
- Ao clicar:
PUT /contracts/{id}comstatus: 'in_review' - Backend detecta a mudança de status e envia e-mail para revisores
- Status muda para
in_review - Steps anteriores ficam bloqueados para edição (diretiva
v-lock-step)
Fluxo: Publicar
- Contrato salvo e o próximo step é
uploadousignature - Botão muda para "Publicar" (verde)
- Ao clicar:
PUT /contracts/{id}comstatus: 'published' - Backend detecta a mudança de status e envia notificação para as partes
- Status muda para
published - 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
- O botão Salvar fica habilitado assim que um workflow é selecionado
- Na primeira vez, o modal de nome é obrigatório
- Nas próximas vezes, salva direto sem modal
- Navegação entre steps não aciona save, dados ficam no store local
- O step Upload só permite upload de arquivos se o contrato já foi salvo
- O nome do contrato pode ser editado no modal (futuro: inline na toolbar)
- Após "Enviar para Revisão" ou "Publicar", steps anteriores ficam bloqueados
- O botão dinâmico reflete o próximo step do fluxo, não o step atual