AutoMate Technisch Help

Workflows v2 Architectuur

Workflows 2.0 is de moderne vervanger van de eerder gebruikte Azure Functions-gebaseerde Orchestrators (inmiddels verwijderd). De execution engine draait op Hangfire en is volledig geïntegreerd in AutoMate.API. Alle automatiseringslogica wordt als workflow definitie geïmplementeerd.

Architectuur

filters voldaan

filters niet voldaan

ja, hire date in toekomst

nee

Trigger event
Formulier / IAM Sync

WorkflowTriggerService

WorkflowsRepository
GetActiveWorkflowsByTriggerAsync

WorkflowFilterEvaluator
EvaluateFilters

Hangfire BatchJob.StartNew

Workflow overgeslagen

WorkflowDispatcherJob

OnboardingDateType
= StartDate?

BatchJob.Schedule
WorkflowTriggerActivityJob

BatchJob.Enqueue
WorkflowTriggerActivityJob

Activity Jobs
Action / Communication / Condition

WorkflowNotificationService
SignalR hub

Registratie

Alle services worden geregistreerd via WorkflowsSetup.AddWorkflowServices():

services.AddScoped<IWorkflowsRepository, WorkflowsRepository>(); services.AddSingleton<IWorkflowNotificationService, WorkflowNotificationService>(); services.AddScoped<IWorkflowFilterEvaluator, WorkflowFilterEvaluator>(); services.AddScoped<IWorkflowTriggerService, WorkflowTriggerService>();

Hangfire jobs worden automatisch door Hangfire opgelost — ze hoeven niet handmatig als DI-registratie te worden toegevoegd.

Triggers

Workflows worden gestart door twee trigger streams:

Trigger type

Bron

Hangfire job

EmployeeOnboarding

AutoMate Formulier (nieuw medewerker)

FormEmployeeWorkflowTriggerJob.RunForCreatedAsync

EmployeeUpdated

AutoMate Formulier (medewerker gewijzigd)

FormEmployeeWorkflowTriggerJob.RunForUpdatedAsync

EmployeeOffboarded

AutoMate Formulier (accountEnabled → false)

FormEmployeeWorkflowTriggerJob.RunForUpdatedAsync

IAM Sync events

IAM HR Sync pipeline

WorkflowTriggerService.TriggerMatchingWorkflowsAsync

Wanneer een medewerker via het formulier wordt bijgewerkt en accountEnabled verandert naar false, worden zowel een EmployeeOffboarded - als een EmployeeUpdated-trigger afgevuurd binnen dezelfde batch.

WorkflowTriggerService

WorkflowTriggerService is de centrale service voor alle trigger streams. De methode TriggerMatchingWorkflowsAsync zoekt alle actieve workflow definities op die overeenkomen met het trigger type en doorloopt de filter evaluatie:

var workflows = await workflowsRepo.GetActiveWorkflowsByTriggerAsync( request.TenantId, request.TriggerType, ct);

Per matching workflow wordt een Hangfire batch aangemaakt en een execution record opgeslagen in de database. Wanneer WorkflowTriggers:DryRunMode op true staat in configuratie, worden werkelijke executions overgeslagen en alleen gelogd.

Tenant ID wordt via IMultiTenantService.GetTenantId() verkregen uit de X-Tenant-Id header — nooit uit de request body.

Filter Evaluatie

WorkflowFilterEvaluator.EvaluateFilters bepaalt of een workflow getriggerd wordt voor een specifieke medewerker. De evaluatie werkt op de TriggerNodeDataDto die in de workflow definitie payload is opgeslagen.

Filter logic

  • EnableFilter = false of geen regels: workflow triggert altijd

  • FilterLogic = "And": alle regels moeten voldaan zijn

  • FilterLogic = "Or": minimaal één regel moet voldaan zijn

Ondersteunde operators

Code

Operator

Beschrijving

0

Equals

Case-insensitieve vergelijking

1

NotEquals

Ongelijk aan waarde

2

Contains

Bevat substring (case-insensitief)

3

NotContains

Bevat substring niet

4

StartsWith

Begint met waarde

5

EndsWith

Eindigt met waarde

6

GreaterThan

Groter dan (numeriek, datum, of string)

7

LessThan

Kleiner dan (numeriek, datum, of string)

8

IsEmpty

Veld is leeg of null

9

IsNotEmpty

Veld heeft een waarde

10

IsChanged

Veld staat in de lijst van gewijzigde velden

Veldpaden ondersteunen dot-notatie voor geneste waarden (bijv. manager.displayName). Het frontend stuurt paden in de notatie [employee.jobTitle] — de evaluator strip automatisch de bracket-notatie en het employee.-prefix.

Execution Flow

WorkflowTriggerService maakt execution aan

WorkflowDispatcherJob start direct

OnboardingDateType = StartDate, hire date in toekomst

Hire date bereikt, TriggerActivityJob gestart

Alle activiteiten succesvol afgerond

Fout in activiteit

Pending

Running

Scheduled

Completed

Failed

WorkflowDispatcherJob

WorkflowDispatcherJob is de eerste job in elke Hangfire batch. Hij:

  1. Laadt het execution record en vergrendeld version ID op

  2. Deserialiseert de WorkflowDefinitionDto uit de version payload

  3. Zoekt het trigger node op (Type == "trigger")

  4. Controleert op OnboardingDateType = "StartDate" met een hire date in de toekomst

  5. Enqueued of scheduled de WorkflowTriggerActivityJob via BatchJob.Attach

De workflow versie is vergrendeld op het moment dat de execution aangemaakt wordt — latere publishes van de workflow definitie hebben geen invloed op lopende executions.

Activity Jobs

Na de trigger job worden vervolgjobs via de graph van edges bepaald:

Job

Type node

Beschrijving

WorkflowTriggerActivityJob

trigger

Start node, geeft employee data door

WorkflowActionActivityJob

action

Voert Microsoft 365 acties uit

WorkflowCommunicationActivityJob

communication

Verstuurt berichten (Teams, email)

WorkflowConditionActivityJob

condition

Vertakt op basis van conditie

WorkflowSchedulerJob wordt gebruikt om vervolgstappen met vertraging in te plannen — dit houdt de jobs gelinkt binnen de Hangfire batch.

Endpoints

Alle endpoints vereisen de Workflows policy. Tenant ID wordt verkregen via de X-Tenant-Id header.

Methode

Pad

Beschrijving

POST

/workflows/definitions

Nieuwe workflow definitie aanmaken met initiële draft versie

POST

/workflows/definitions/{definitionId}/publish

Draft publiceren als actieve versie

POST

/workflows/definitions/{definitionId}/trigger

Workflow handmatig triggeren voor een specifieke medewerker

GET

/workflows/executions/{ExecutionId}/status

Gedetailleerde execution status inclusief stappen

GET

/workflows/definitions

Alle workflow definities voor de tenant

GET

/workflows/definitions/{id}

Specifieke workflow definitie

POST

/workflows/executions/{id}/cancel

Lopende execution annuleren

POST

/workflows/executions/{id}/retry

Gefaalde execution opnieuw starten

GET

/workflows/executions

Actieve executions opvragen

GET

/workflows/executions/history

Execution history opvragen

PATCH

/workflows/definitions/{id}/status

Status van workflow definitie bijwerken

PUT

/workflows/definitions/{id}

Workflow definitie bijwerken

DELETE

/workflows/definitions/{id}

Workflow definitie verwijderen

POST

/workflows/definitions/{id}/duplicate

Workflow definitie dupliceren

SignalR Notificaties

WorkflowNotificationService stuurt real-time status updates via SignalR naar het Management Portal. Clients abonneren per tenant via de SubscribeToTenant methode op de hub.

  • Hub URL: /hubs/workflow-executions

  • Hub class: WorkflowExecutionsHub

  • Authenticatie: [Authorize], tenant-validatie in elke hub methode

Events

Event

Payload

Wanneer

ExecutionCreated

{ ExecutionId, DefinitionId, WorkflowName, Timestamp }

Execution aangemaakt via handmatige trigger

ExecutionUpdated

{ ExecutionId, Status, Timestamp }

Execution status gewijzigd

JobUpdated

{ ExecutionId, JobId, Status, Timestamp }

Individuele activiteit stap gewijzigd

MSP-gebruikers met de rol Automate365.Customers.ReadWrite kunnen zich abonneren op klant-tenants. De hub valideert de PartnerTenantId van de gevraagde tenant om te voorkomen dat SystemTenantHasAccess-tenants toegankelijk zijn.

Data Model

WorkflowDefinitionDto

public class WorkflowDefinitionDto { public List<NodeDto> Nodes { get; set; } public List<EdgeDto>? Edges { get; set; } // frontend notatie public List<EdgeDto>? Links { get; set; } // migratie notatie [JsonIgnore] public List<EdgeDto> ActualEdges => Edges ?? Links ?? new(); }

TriggerNodeDataDto

public class TriggerNodeDataDto { public bool IsConfigured { get; set; } public string TriggerType { get; set; } public string? OnboardingDateType { get; set; } // "StartDate" voor hire date scheduling public bool EnableFilter { get; set; } public List<ConditionRuleDto> FilterRules { get; set; } public string FilterLogic { get; set; } // "And" | "Or" }

filterRules kan als JSON-encoded string of als direct array worden opgeslagen in de workflow payload — FilterRulesConverter handelt beide formaten af.

Last modified: 29 May 2026