IAM HR Sync - Pipeline Architectuur
Overzicht
De IAM HR Sync pipeline gebruikt een dynamische, interface-gedreven architectuur waarbij pre-configuratie checks en job pipelines worden bepaald op basis van de DestinationName uit de tenant sync settings. Dit maakt het mogelijk om verschillende bestemmingen (zoals Entra AD en Entra) te ondersteunen met elk hun eigen checks en job stappen.
Architectuur
Resolutie Flow
Job start en zet tenant context via
IMultiTenantServiceISyncPipelineResolverleestDestinationNameuit tenant settingsResolver zoekt de juiste
ISyncPipelineDefinitionvia keyed DIPreConfigurationCheckRunnervoert alle checks van de pipeline uitBij succes: pipeline jobs worden aan de Hangfire batch gekoppeld
Bij falen: DisableSyncJob of exception, afhankelijk van het failure type
Pipeline Definities
HR --> Entra AD (Hybrid Identity)
Key: "Entra AD" | Class: HrToEntraAdPipelineDefinition
Voor tenants die gebruik maken van een on-premises provisioning agent (Entra Connect Sync of Cloud Sync).
Pre-configuratie Checks:
Check | Volgorde | Failure Type | Beschrijving |
|---|---|---|---|
ProvisioningSchemaCheck | 10 | Fail | Kan het provisioning schema opgehaald worden? |
ProvisioningCredentialsCheck | 20 | Fail | Zijn de API credentials geldig? |
ProvisioningJobActiveCheck | 30 | Disable | Is de provisioning job actief in Azure? |
SchemaHashPresentCheck | 40 | Disable | Is er een schema hash geconfigureerd? |
SchemaHashMatchCheck | 50 | Disable | Komt de schema hash overeen met het live schema? |
EmailConfigurationCheck | 60 | Disable | Is de email configuratie voor initial passwords compleet? |
Job Pipeline (7 stappen):
HR --> Entra (Cloud-only)
Key: "Entra" | Class: HrToEntraPipelineDefinition
Voor tenants die direct via Microsoft Graph API werken, zonder on-premises provisioning agent.
Pre-configuratie Checks:
Check | Volgorde | Failure Type | Beschrijving |
|---|---|---|---|
EmailConfigurationCheck | 60 | Disable | Is de email configuratie voor initial passwords compleet? |
Job Pipeline (6 stappen):
Stap | Job | Status | Beschrijving |
|---|---|---|---|
1 | IamEmployeeGetHrDataJob | Bestaand | HR data ophalen uit source connector |
2 | IamEmployeeTranslateHrDataJob | Bestaand | Data transformeren en valideren |
3 | IamEmployeeCalculateActionsJob | In ontwikkeling | Acties bepalen: aanmaken, wijzigen, deactiveren |
4 | IamEmployeeBatchGraphRequestsJob | In ontwikkeling | Acties uitvoeren via Microsoft Graph API batch endpoint |
5 | IamEmployeeReadEntraChangesJob | Placeholder | Verifieer welke wijzigingen succesvol zijn toegepast in Entra |
6 | IamEmployeeTriggerWorkflowsJob | Bestaand | Workflows triggeren voor verwerkte medewerkers |
Pre-configuratie Check Systeem
Interface: IPreConfigurationCheck
Elke check implementeert IPreConfigurationCheck met de volgende eigenschappen:
Eigenschap | Type | Beschrijving |
|---|---|---|
| string | Unieke naam voor logging en persistentie |
| int | Uitvoeringsvolgorde (laag = eerst) |
| int | Prioriteit bij meerdere failures (laag = wint) |
| string | Label voor audit log entries |
| method | Voert de check uit en retourneert een |
Alle check implementaties zijn internal sealed classes - ze zijn niet bedoeld voor inheritance en zijn alleen toegankelijk binnen de AutoMate.API assembly.
PreCheckConstants
Alle magic strings en numbers worden centraal beheerd in PreCheckConstants:
Nested Class | Doel | Voorbeelden |
|---|---|---|
| Keys voor |
|
| Audit status strings |
|
| Uitvoeringsvolgorde constanten |
|
| Failure prioriteit constanten |
|
Dit voorkomt typo's en maakt refactoring eenvoudiger.
Gedeelde Context
Checks communiceren via PreCheckContext - een shared state container:
Checks draaien sequentieel (op volgorde van Order) omdat latere checks afhankelijk kunnen zijn van de context die eerdere checks schrijven.
PreCheckOutcome Factory Methods
PreCheckOutcome biedt factory methods voor leesbaarheid:
Method | Gebruik |
|---|---|
| Check geslaagd |
| Check gefaald met actie |
| Check overgeslagen (telt als geslaagd) |
Failure Prioriteit
Wanneer meerdere checks falen, bepaalt FailurePriority welke actie wordt genomen:
Prioriteit | Check | Actie |
|---|---|---|
10 | ProvisioningJobActive | Disable sync |
20 | SchemaHashPresent | Disable sync |
21 | SchemaHashMatch | Disable sync |
30 | EmailConfiguration | Disable sync |
50 | ProvisioningSchema / Credentials | Fail (exception) |
Disable = batch annuleren + DisableSyncJob schedulen Fail = batch als failed markeren + exception gooien
Medewerker Draft Validatie
Voordat een EmployeeDraft de provisioning pipeline in gaat, valideert EmployeeDraftValidationService of alle verplichte velden aanwezig zijn. Deze stap vindt plaats aan het einde van de GetHrData-fase, direct nadat de bron-connector de JSONata-transformatie heeft uitgevoerd.
Positie in de pipeline
De validatie wordt aangeroepen vanuit de connector-implementaties (AfasConnector, SapSuccessFactorsConnector) als laatste stap van GetEmployeesAsync. Het geretourneerde SourceFetchResult<Employee> bevat zowel succesvol gevalideerde Employee-objecten als de MappingFailure-records voor afgewezen drafts.
Twee-laags verplicht-velden model
EmployeeDraftValidationService combineert twee categorieën verplichte velden via BuildEffectiveRequiredFields:
Laag | Velden | Configureerbaar |
|---|---|---|
Baseline (hardcoded) |
| Nee — altijd vereist, ongeacht tenant-instellingen |
Tenant-configuratie | Nul of meer extra velden | Ja — opgeslagen als |
De baseline-velden staan als statische constante in de service:
De tenant-specifieke velden worden door de connector uitgelezen uit de sync settings en meegegeven als configuredRequiredFields:
BuildEffectiveRequiredFields voegt de geconfigureerde velden toe aan de baseline, waarbij duplicaten (case-insensitive) worden overgeslagen:
Gedrag bij validatiefouten
Een draft die één of meer verplichte velden mist, wordt niet omgezet naar een Employee-object. In plaats daarvan wordt een MappingFailure aangemaakt met:
De identifier van de draft (voorkeursvolgorde:
Username→Email→DisplayName→"Unknown")Een foutmelding in het formaat
Missing minimum(s): <veld1>, <veld2>De index van de draft in het batch-resultaat
Deze failures worden doorgegeven aan het SourceFetchResult en zijn zichtbaar in de sync-logs. Afgewezen drafts worden niet verwerkt door de downstream pipeline-stappen.
Tenant-configuratie van extra verplichte velden
De tenant-specifieke verplichte velden worden beheerd via IAM_Employee_Sync_Settings.AdditionalRequiredFields en opgeslagen als JSON in de kolom RequiredFieldsJson. De EmployeeSyncSettingsService serialiseert en deserialiseert deze lijst bij het opslaan en ophalen van settings.
Interface
De service is geregistreerd als Scoped via DI en wordt geïnjecteerd in elke connector die ISourceConnector implementeert.
Testdekking
EmployeeDraftValidationService is volledig unit-getest in EmployeeDraftValidationServiceTests met 36+ scenario's, waaronder:
Baseline validatie (ontbrekende
Username,Email,DisplayName)Tenant-specifieke extra velden (aanwezig, afwezig, case-insensitieve matching)
Deduplicatie van baseline- en geconfigureerde velden
Identifier-selectie bij gedeeltelijk ontbrekende gegevens
Doorsturen van bestaande failures uit de draft-mappingfase
TriggerWorkflows - Configureerbare Data Bronnen
De IamEmployeeTriggerWorkflowsJob accepteert parameters die aangeven uit welke voorgaande stap de user data gelezen moet worden:
Pipeline | Primary Step | Secondary Step |
|---|---|---|
Entra AD |
|
|
Entra |
|
|
De Entra AD pipeline gebruikt de backward-compatible 3-parameter RunAsync(tenantId, batchId, pipelineTag) die standaard "ReadLogs" en "UpdateFields" gebruikt. De Entra pipeline gebruikt de 5-parameter variant: RunAsync(tenantId, batchId, pipelineTag, "IamEmployeeReadEntraChanges", null).
Beide pipelines gebruiken nu een gestandaardiseerd formaat (ReadLogsResultData) voor de output van hun respectievelijke "read changes" stappen, wat zorgt voor consistente workflow triggers.
DI Registratie
Alle componenten worden geregistreerd in Program.cs:
De keyed service key komt exact overeen met de DestinationName string in IAM_Employee_Sync_Settings.
Nieuwe Pipeline Toevoegen
Stap 1: Pipeline Definitie
Maak een nieuwe class die ISyncPipelineDefinition implementeert:
Design Guidelines:
internal sealed: Pipeline definities zijn implementation detailsXML docs: Documenteer het doel en de check volgorde
Constructor injection: Inject alle benodigde checks via DI
Stap 2: DI Registratie
Voeg toe aan Program.cs:
Stap 3: Tenant Configuratie
Stel DestinationName = "NieuweDestinatie" in de tenant sync settings.
Nieuwe Check Toevoegen
Stap 1: Constanten toevoegen aan PreCheckConstants
Voeg eerst de benodigde constanten toe:
Stap 2: Check Class
Design Guidelines:
internal sealed: Voorkomt inheritance en beperkt visibility tot assemblynameof()voor Name: Voorkomt typo's en ondersteunt refactoringGebruik constanten: Voor Order, FailurePriority, AuditStatus, ContextKeys
Factory methods: Gebruik
PreCheckOutcome.Success(),Failure(),Skipped()Helper methods: Extract herhaalde CheckFailureAction creatie naar private methods
Stap 3: DI Registratie
Stap 4: Toevoegen aan Pipeline
Inject de check in de pipeline definitie constructor en voeg toe aan de Checks lijst:
Folder Structuur
Gerelateerde Pagina's
IAM HR Sync Jobs - Alle jobs in detail
IAM HR Sync Batch Status Guide - Batch status overzicht
AD Scripts - AD migratie scripts