Skip to content

Workflows Module - Módulo de Fluxos de Trabalho ​

Visão Geral ​

O módulo de Workflows permite criar configurações predefinidas de fluxos de trabalho para contratos. Um workflow define quais etapas estarão ativas e suas configurações, podendo ser aplicado na criação de novos contratos.


Status do Workflow ​

typescript
type WorkflowStatus = 'draft' | 'published'
StatusDescrição
draftRascunho - workflow em edição
publishedPublicado - workflow ativo para uso

Etapas do Workflow (Steps) ​

O sistema possui 6 etapas predefinidas que correspondem ao fluxo de criação de contratos:

OrdemKeyNomeObrigatóriaPosição FixaDescrição
1partsPartesSimPrimeiraDefinição das partes do contrato
2modelModeloSimSegundaSeleção do template/modelo
3documentsDocumentosNãoVariávelConfiguração de documentos para upload/download
4revisionRevisãoNãoVariávelConfiguração de revisores internos
5uploadUploadAutoVariávelUpload de documentos pelas partes (auto-gerenciado)
6signatureAssinaturaSimÚltimaColeta de assinaturas

Regras de Posicionamento ​

  • parts: Sempre na primeira posição
  • model: Sempre na segunda posição
  • signature: Sempre na última posição
  • upload: Step auto-gerenciado - aparece automaticamente quando há documentos para upload configurados em documentsConfig

Types do Domain ​

Tipos Principais ​

typescript
// src/domain/workflow/types.ts

type WorkflowStatus = 'draft' | 'published'

type StepKey = 'parts' | 'model' | 'documents' | 'revision' | 'upload' | 'signature'

type PartFieldKey = 'name' | 'email' | 'document' | 'phone' | 'cnpj' | 'razao_social' | 'cpf'

type VariableSourceType = 'part_field' | 'predefined'

type StepPropertyType = 'boolean' | 'select' | 'number' | 'text'

type FixedPosition = 'first' | 'second' | 'last'

type SignatureGroupType = 'parts' | 'internal' | 'custom'

Workflow ​

typescript
type Workflow = BaseEntity & {
  name: string
  description?: string
  status: WorkflowStatus
  steps: WorkflowStep[]
  documentsConfig?: DocumentRequirement[]
  modelConfig?: ModelStepConfig
  revisionConfig?: RevisionStepConfig
  signatureConfig?: SignatureStepConfig
}

WorkflowStep ​

typescript
type WorkflowStep = {
  id: string                    // UUID
  key: StepKey
  name: string
  order: number
  parentId: string              // ID do step anterior
  isEnabled: boolean
  isRequired: boolean
  properties: StepProperty[]
}

type StepProperty = {
  key: string
  label: string                 // Chave de i18n
  type: StepPropertyType
  value: boolean | string | number
  options?: StepPropertyOption[]
}

Configurações por Etapa ​

ModelStepConfig ​

Configuração do template e mapeamento de variáveis:

typescript
type ModelStepConfig = {
  templateId: string            // ID do template selecionado
  partGroups: PartGroup[]       // Grupos de partes
  variableAssignments: VariableAssignment[]  // Mapeamento de variáveis
}

type PartGroup = {
  id: string
  name: string
  members: PartGroupMember[]
}

type PartGroupMember = {
  id: string
  name: string
  avatar?: string
}

type VariableAssignment = {
  variableName: string          // Nome da variável no template
  sourceType: VariableSourceType  // 'part_field' ou 'predefined'
  partGroupId?: string          // Se sourceType = 'part_field'
  partField?: PartFieldKey      // Campo do grupo (name, email, cpf, etc.)
  predefinedValue?: string      // Se sourceType = 'predefined'
}

DocumentsStepConfig ​

Configuração de documentos para upload/download:

typescript
type DocumentRequirement = {
  id: string                    // UUID
  name: string
  description?: string
  isRequired: boolean
  isDownload: boolean           // true = documento para download, false = para upload
  downloadFile?: DocumentFile   // Se isDownload = true
  acceptedFormats: string[]     // ['pdf', 'jpg', 'png', etc.]
  maxFileSize: number           // Em MB
}

type DocumentFile = {
  fileName: string
  fileId?: string
  fileUrl?: string
}

RevisionStepConfig ​

Configuração de revisores internos:

typescript
type RevisionStepConfig = {
  reviewers: ReviewerMember[]
}

type ReviewerMember = {
  id: string
  userId: string               // ID do funcionário
  name: string
  email: string
  avatar?: string
  isRequired: boolean
  order: number
}

SignatureStepConfig ​

Configuração de grupos de assinatura:

typescript
type SignatureStepConfig = {
  groups: SignatureGroup[]
  signatureOrder: 'internal_first' | 'parts_first' | 'custom'
}

type SignatureGroup = {
  id: string
  name: string
  type: SignatureGroupType      // 'parts' | 'internal' | 'custom'
  order: number
  isFixed: boolean
  members: SignerMember[]
}

type SignerMember = {
  id: string
  userId?: string              // Somente para type 'internal'
  name: string
  email: string
  avatar?: string
  order: number
}

Endpoints da API ​

Listagem e CRUD ​

EndpointMétodoDescrição
/workflowsGETLista workflows com filtros opcionais
/workflows/:idGETRetorna um workflow pelo ID
/workflowsPOSTCria um novo workflow
/workflows/:idPUTAtualiza um workflow existente
/workflows/:idDELETERemove um workflow

Query Parameters para GET /workflows ​

ParâmetroTipoObrigatórioDescrição
searchstringNãoFiltro por nome (case insensitive)
statusWorkflowStatusNãoFiltro por status: draft, published

Payloads ​

typescript
type CreateWorkflowPayload = {
  name: string
  description?: string
  status?: WorkflowStatus
  steps: Omit<WorkflowStep, 'id'>[]
  documentsConfig?: DocumentRequirement[]
  modelConfig?: ModelStepConfig
  revisionConfig?: RevisionStepConfig
  signatureConfig?: SignatureStepConfig
}

type UpdateWorkflowPayload = Partial<CreateWorkflowPayload> & {
  id: string
}

Services ​

typescript
// src/modules/workflows/services/workflows.ts

// Listagem
getWorkflowsService(params?: Partial<WorkflowFilter>)

// CRUD
getWorkflowByIdService(id: string)
createWorkflowService(payload: CreateWorkflowPayload)
updateWorkflowService({ id, ...payload }: UpdateWorkflowPayload)
deleteWorkflowService(id: string)

Stores ​

Store de Listagem ​

typescript
// src/modules/workflows/stores/workflows.ts

// Estado
items: Workflow[]
total: number
loading: boolean
search: string
status: WorkflowStatus | 'all'

// Métodos
loadWorkflows(params?: WorkflowFilter)
setSearch(filters: WorkflowFilter)
deleteWorkflow(id: string)
reset()

Store do Editor ​

typescript
// src/modules/workflows/stores/workflowEditor.ts

// Estado Principal
isLoading: boolean
isSaving: boolean
workflowId: string | undefined
workflowName: string
workflowDescription: string
workflowStatus: WorkflowStatus

// Steps
flowSteps: WorkflowStep[]           // Steps no fluxo
availableSteps: WorkflowStep[]      // Steps disponíveis para adicionar
selectedStepKey: StepKey | null
showPropertiesPanel: boolean

// Configurações
selectedTemplate: Template | null
modelStepConfig: ModelStepConfig
documentsConfig: DocumentRequirement[]
revisionConfig: RevisionStepConfig
signatureConfig: SignatureStepConfig

// Computed
isEditing: boolean
canSave: boolean
selectedStep: WorkflowStep | undefined
flowStepsCount: number
uploadRequiredDocuments: DocumentRequirement[]  // Documentos para upload
shouldShowUploadStep: boolean                    // Se deve exibir step de upload

// Métodos de Steps
initializeSteps()                    // Inicializa com steps padrão
selectStep(stepKey)                  // Abre painel de propriedades
closePropertiesPanel()               // Fecha painel
addStepToFlow(stepKey, position?)    // Adiciona step ao fluxo
removeStepFromFlow(stepKey)          // Remove step do fluxo
reorderFlowSteps(newOrder)           // Reordena steps
updateStepProperty(stepKey, key, value)

// Métodos de Template/Model
setSelectedTemplate(template)
openTemplateSelector()
closeTemplateSelector()
refreshTemplate()
addPartGroup(name?)
duplicatePartGroup(groupId)
refreshPartGroup(groupId)
removePartGroup(groupId)
setVariableAssignment(groupId, variableName, sourceType, partField?, predefinedValue?)
removeVariableAssignment(groupId, variableName)

// Métodos de Documentos
updateDocumentsConfig(documents)     // Atualiza e sincroniza upload step
syncUploadStepVisibility()           // Adiciona/remove upload step automaticamente

// Persistência
loadWorkflow(id)                     // Carrega workflow existente
saveWorkflow()                       // Salva (cria ou atualiza)
activateWorkflow()                   // Muda status para 'published' e salva
reset()                              // Limpa estado

Mocks (MSW) ​

Os mocks utilizam MSW (Mock Service Worker). Os dados estão em:

src/mocks/
├── data/
│   └── workflows.ts          # Array de workflows mockados
└── handlers/
    └── workflows.ts          # Handlers MSW para endpoints

Exemplo de Workflow Mockado ​

typescript
{
  id: 'a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d',
  name: 'Contratação de Prestador PJ',
  description: 'Fluxo padrão para contratação de prestadores de serviço pessoa jurídica',
  status: 'published',
  steps: [
    {
      id: 'f1e2d3c4-b5a6-4789-0123-456789abcdef',
      key: 'parts',
      name: 'Partes',
      order: 1,
      parentId: '',
      isEnabled: true,
      isRequired: true,
      properties: []
    },
    // ... outros steps
  ],
  modelConfig: {
    templateId: 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
    partGroups: [
      { id: 'pg-pj-001', name: 'Empresa Contratante', members: [] },
      { id: 'pg-pj-002', name: 'Prestador PJ', members: [] }
    ],
    variableAssignments: [
      { variableName: 'razao_social_contratante', sourceType: 'part_field', partGroupId: 'pg-pj-001', partField: 'razao_social' },
      { variableName: 'valor_mensal', sourceType: 'predefined', predefinedValue: 'R$ 5.000,00' }
    ]
  },
  documentsConfig: [
    {
      id: 'd1c2b3a4-9876-4fed-cba9-876543210fed',
      name: 'Contrato Social',
      description: 'Última alteração do contrato social da empresa',
      isRequired: true,
      isDownload: false,
      acceptedFormats: ['pdf'],
      maxFileSize: 10
    }
  ],
  revisionConfig: {
    reviewers: [
      {
        id: 'rv-pj-001',
        userId: 's4t5a6f7-f8i9-4d01-2345-678901234abc',
        name: 'Ana Paula Silva',
        email: 'ana.silva@empresa.com',
        isRequired: true,
        order: 1
      }
    ]
  },
  signatureConfig: {
    groups: [
      {
        id: 'sg-pj-001',
        name: 'Diretoria',
        type: 'internal',
        order: 1,
        isFixed: true,
        members: [
          { id: 'sm-pj-001', userId: 's6t7a8f9-f0i1-4d23-4567-890123456cde', name: 'Diretor Executivo', email: 'diretor@empresa.com', order: 1 }
        ]
      },
      {
        id: 'sg-pj-002',
        name: 'Partes Contratantes',
        type: 'parts',
        order: 2,
        isFixed: true,
        members: []
      }
    ],
    signatureOrder: 'internal_first'
  },
  createdAt: new Date('2024-01-15'),
  updatedAt: new Date('2024-03-10')
}

Componentes ​

Páginas ​

ComponentePathDescrição
ListWorkflows.vue/workflows/listListagem com tabela e filtros
EditWorkflow.vue/workflows/new, /workflows/:idEditor com timeline

Componentes de Listagem ​

ComponenteDescrição
TableHeader.vueFiltros e botão "Novo Fluxo"
WorkflowFilters.vueSelect de status
WorkflowTableList.vueTabela com n-data-table

Componentes do Editor ​

ComponenteDescrição
WorkflowToolbar.vueNome, status e ações (salvar, publicar, excluir)
WorkflowTimeline.vueTimeline horizontal com steps
TimelineStepCard.vueCard individual de cada step
StepPropertiesPanel.vueDrawer lateral para configurar propriedades

Componentes de Configuração por Step ​

ComponenteStepDescrição
ModelStepConfig.vuemodelSeleção de template e mapeamento de variáveis
DocumentsStepConfig.vuedocumentsLista e formulário de documentos
RevisionStepConfig.vuerevisionConfiguração de revisores
UploadStepConfig.vueuploadExibe documentos configurados (read-only)
SignatureStepConfig.vuesignatureConfiguração de grupos de assinatura
StepCommonProperties.vuetodosPropriedades comuns (requirePreviousCompletion)

Composables ​

typescript
// src/modules/workflows/composables/

useModelStepConfig()           // Lógica do ModelStepConfig
useDocumentsStepConfig()       // Lógica do DocumentsStepConfig
useRevisionStepConfig()        // Lógica do RevisionStepConfig
useSignatureStepConfig()       // Lógica do SignatureStepConfig
useStepCommonProperties()      // Propriedades comuns entre steps

Exemplo: useDocumentsStepConfig ​

typescript
const {
  viewMode,                    // 'list' | 'form'
  requirements,                // DocumentRequirement[]
  formData,                    // Dados do formulário
  isEditing,                   // Se está editando documento
  hasRequirements,
  canSaveForm,
  canSaveDownloadForm,
  requiredCount,
  optionalCount,
  formatOptions,
  showList,
  openAddForm,
  openEditForm,
  saveForm,
  handleFileUpload,
  removeUploadedFile,
  removeRequirement,
  duplicateRequirement,
  handleSave,
  formatFileSize,
  formatAcceptedFormats,
  initializeFromStore          // Carrega dados do store ao montar
} = useDocumentsStepConfig()

Rotas ​

typescript
// src/modules/workflows/router/index.ts

{
  path: '/workflows/list',
  name: 'list-workflow',
  meta: { menuKey: 'workflow', isListPage: true }
},
{
  path: '/workflows/new',
  name: 'new-workflow',
  meta: { menuKey: 'workflow' }
},
{
  path: '/workflows/:id',
  name: 'edit-workflow',
  meta: { menuKey: 'workflow' }
}

Permissões: Apenas role borrower tem acesso ao módulo de workflows.


Constantes ​

typescript
// src/domain/workflow/constants.ts

export const WORKFLOW_STATUS = {
  draft: 'draft',
  published: 'published'
}

export const STEP_KEYS = {
  parts: 'parts',
  model: 'model',
  documents: 'documents',
  revision: 'revision',
  upload: 'upload',
  signature: 'signature'
}

export const FIXED_POSITION_STEPS = {
  parts: 'first',
  model: 'second',
  signature: 'last'
}

export const STEPS_WITH_CONFIG: StepKey[] = ['model', 'documents', 'revision', 'upload', 'signature']

export const AUTO_MANAGED_STEPS: StepKey[] = ['upload']

export const DOCUMENT_FORMATS = [
  { label: 'PDF', value: 'pdf' },
  { label: 'JPG', value: 'jpg' },
  { label: 'JPEG', value: 'jpeg' },
  { label: 'PNG', value: 'png' },
  { label: 'DOC', value: 'doc' },
  { label: 'DOCX', value: 'docx' }
]

export const DEFAULT_DOCUMENT_FORMATS = ['pdf', 'jpg', 'jpeg', 'png']

export const DEFAULT_MAX_FILE_SIZE = 10  // MB

Propriedades por Step (STEP_PROPERTIES_CONFIG) ​

Model ​

PropriedadeTipoDefaultDescrição
requirePreviousCompletionbooleantrueExigir conclusão da etapa anterior
allowCustomTemplatebooleantruePermitir template personalizado
defaultTemplateIdselect""Template padrão pré-selecionado

Documents ​

PropriedadeTipoDefaultDescrição
requirePreviousCompletionbooleantrueExigir conclusão da etapa anterior
requiredDocumentsnumber0Quantidade de documentos obrigatórios
allowOptionalbooleantruePermitir documentos opcionais

Revision ​

PropriedadeTipoDefaultDescrição
requirePreviousCompletionbooleantrueExigir conclusão da etapa anterior
minReviewersnumber1Mínimo de revisores
requireApprovalbooleantrueExigir aprovação dos revisores

Upload ​

PropriedadeTipoDefaultDescrição
requirePreviousCompletionbooleantrueExigir conclusão da etapa anterior
overdueDaysnumber0Dias para vencimento (0 = sem prazo)
maxFileSizenumber10Tamanho máximo de arquivo (MB)
allowedFormatstext"pdf,doc,docx"Formatos permitidos

Signature ​

PropriedadeTipoDefaultDescrição
requirePreviousCompletionbooleantrueExigir conclusão da etapa anterior
overdueDaysnumber0Dias para vencimento (0 = sem prazo)
signatureTypeselect"electronic"Tipo: electronic ou digital (ICP-Brasil)
requireOrderbooleanfalseExigir ordem de assinatura

Formato de IDs ​

Todos os IDs seguem o formato UUID v4:

a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d