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: '[email protected]',
        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: '[email protected]', 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