1+ # ################################################
2+ # HelloID-Conn-Prov-Target-AFAS-Profit-Employees-Import
3+ # PowerShell V2
4+ # ################################################
5+
6+ # Enable TLS1.2
7+ [System.Net.ServicePointManager ]::SecurityProtocol = [System.Net.ServicePointManager ]::SecurityProtocol -bor [System.Net.SecurityProtocolType ]::Tls12
8+
9+ function Get-AFASConnectorData {
10+ param (
11+ [parameter (Mandatory = $true )]$Token ,
12+ [parameter (Mandatory = $true )]$BaseUri ,
13+ [parameter (Mandatory = $true )]$Connector ,
14+ [parameter (Mandatory = $true )]$OrderByFieldIds ,
15+ [parameter (Mandatory = $true )]$Filter ,
16+ [parameter (Mandatory = $true )][ref ]$data
17+ )
18+
19+ try {
20+ Write-Verbose " Starting downloading objects through get-connector [$connector ]"
21+ $encodedToken = [System.Convert ]::ToBase64String([System.Text.Encoding ]::ASCII.GetBytes($Token ))
22+ $authValue = " AfasToken $encodedToken "
23+ $Headers = @ { Authorization = $authValue }
24+ $Headers.Add (" IntegrationId" , " 45963_140664" ) # Fixed value - Tools4ever Partner Integration ID
25+
26+ $take = 1000
27+ $skip = 0
28+
29+ $uri = $BaseUri + " /connectors/" + $Connector + " ?$filter &skip=$skip &take=$take &orderbyfieldids=$OrderByFieldIds "
30+
31+ $dataset = Invoke-RestMethod - Method Get - Uri $uri - Headers $Headers - UseBasicParsing
32+
33+ foreach ($record in $dataset.rows ) { [void ]$data.Value.add ($record ) }
34+
35+ $skip += $take
36+ while (@ ($dataset.rows ).count -eq $take ) {
37+ $uri = $BaseUri + " /connectors/" + $Connector + " ?$filter &skip=$skip &take=$take &orderbyfieldids=$OrderByFieldIds "
38+
39+ $dataset = Invoke-RestMethod - Method Get - Uri $uri - Headers $Headers - UseBasicParsing
40+
41+ $skip += $take
42+
43+ foreach ($record in $dataset.rows ) { [void ]$data.Value.add ($record ) }
44+ }
45+ Write-Verbose " Downloaded [$ ( $data.Value.count ) ] records through get-connector [$connector ]"
46+ }
47+ catch {
48+ $data.Value = $null
49+
50+ $ex = $PSItem
51+ $errorMessage = Get-ErrorMessage - ErrorObject $ex
52+
53+ Write-Verbose " Error at Line [$ ( $ex.InvocationInfo.ScriptLineNumber ) ]: $ ( $ex.InvocationInfo.Line ) . Error: $ ( $errorMessage.VerboseErrorMessage ) "
54+
55+ throw " Error querying data from [$uri ]. Error Message: $ ( $errorMessage.AuditErrorMessage ) "
56+ }
57+ }
58+
59+ function Resolve-HTTPError {
60+ [CmdletBinding ()]
61+ param (
62+ [Parameter (Mandatory ,
63+ ValueFromPipeline
64+ )]
65+ [object ]$ErrorObject
66+ )
67+ process {
68+ $httpErrorObj = [PSCustomObject ]@ {
69+ FullyQualifiedErrorId = $ErrorObject.FullyQualifiedErrorId
70+ MyCommand = $ErrorObject.InvocationInfo.MyCommand
71+ RequestUri = $ErrorObject.TargetObject.RequestUri
72+ ScriptStackTrace = $ErrorObject.ScriptStackTrace
73+ ErrorMessage = ' '
74+ }
75+ if ($ErrorObject.Exception.GetType ().FullName -eq ' Microsoft.PowerShell.Commands.HttpResponseException' ) {
76+ $httpErrorObj.ErrorMessage = $ErrorObject.ErrorDetails.Message
77+ }
78+ elseif ($ErrorObject.Exception.GetType ().FullName -eq ' System.Net.WebException' ) {
79+ $httpErrorObj.ErrorMessage = [System.IO.StreamReader ]::new($ErrorObject.Exception.Response.GetResponseStream ()).ReadToEnd()
80+ }
81+ Write-Output $httpErrorObj
82+ }
83+ }
84+
85+ function Resolve-AFASErrorMessage {
86+ [CmdletBinding ()]
87+ param (
88+ [Parameter (Mandatory ,
89+ ValueFromPipeline
90+ )]
91+ [object ]$ErrorObject
92+ )
93+ process {
94+ try {
95+ $errorObjectConverted = $ErrorObject | ConvertFrom-Json - ErrorAction Stop
96+
97+ if ($null -ne $errorObjectConverted.externalMessage ) {
98+ $errorMessage = $errorObjectConverted.externalMessage
99+ }
100+ else {
101+ $errorMessage = $errorObjectConverted
102+ }
103+ }
104+ catch {
105+ $errorMessage = " $ ( $ErrorObject.Exception.Message ) "
106+ }
107+
108+ Write-Output $errorMessage
109+ }
110+ }
111+
112+ function Get-ErrorMessage {
113+ [CmdletBinding ()]
114+ param (
115+ [Parameter (Mandatory ,
116+ ValueFromPipeline
117+ )]
118+ [object ]$ErrorObject
119+ )
120+ process {
121+ $errorMessage = [PSCustomObject ]@ {
122+ VerboseErrorMessage = $null
123+ AuditErrorMessage = $null
124+ }
125+
126+ if ( $ ($ErrorObject.Exception.GetType ().FullName -eq ' Microsoft.PowerShell.Commands.HttpResponseException' ) -or $ ($ErrorObject.Exception.GetType ().FullName -eq ' System.Net.WebException' )) {
127+ $httpErrorObject = Resolve-HTTPError - ErrorObject $ErrorObject
128+
129+ if (-not [String ]::IsNullOrEmpty($httpErrorObject.ErrorMessage )) {
130+ $errorMessage.VerboseErrorMessage = $httpErrorObject.ErrorMessage
131+ $errorMessage.AuditErrorMessage = Resolve-AFASErrorMessage - ErrorObject $httpErrorObject.ErrorMessage
132+ }
133+ else {
134+ $errorMessage.VerboseErrorMessage = $ErrorObject.Exception.Message
135+ $errorMessage.AuditErrorMessage = $ErrorObject.Exception.Message
136+ }
137+ }
138+
139+ # If error message empty, fall back on $ex.Exception.Message
140+ if ([String ]::IsNullOrEmpty($errorMessage.VerboseErrorMessage )) {
141+ $errorMessage.VerboseErrorMessage = $ErrorObject.Exception.Message
142+ }
143+ if ([String ]::IsNullOrEmpty($errorMessage.AuditErrorMessage )) {
144+ $errorMessage.AuditErrorMessage = $ErrorObject.Exception.Message
145+ }
146+
147+ Write-Output $errorMessage
148+ }
149+ }
150+ # endregion functions
151+
152+ try {
153+ Write-Information ' Starting AFAS Employees account entitlement import'
154+
155+ # Query persons / accounts
156+ $importedAccounts = [System.Collections.ArrayList ]::new()
157+
158+ # Filter - Determine what defines an account entitlement, copy from AFAS Connect cURL
159+ $Filter = " filterfieldids=Email_werk&filtervalues=%5Bis%20niet%20leeg%5D&operatortypes=9"
160+
161+ Get-AFASConnectorData - Token $ ($actionContext.Configuration.Token ) - BaseUri $ ($actionContext.Configuration.BaseUri ) - Connector $ ($actionContext.Configuration.GetConnector ) - OrderByFieldIds " Medewerker" ([ref ]$importedAccounts ) - Filter $Filter
162+
163+ foreach ($importedAccount in $importedAccounts ) {
164+ $data = @ {}
165+
166+ $importedAccount | Add-Member - MemberType NoteProperty - Name " EmAd" - Value $ ($importedAccount.Email_werk ) - Force
167+
168+ foreach ($field in $actionContext.ImportFields ) {
169+ $data [$field ] = $importedAccount ." $field "
170+ }
171+
172+ # Return the result
173+ Write-Output @ {
174+ AccountReference = $importedAccount.Medewerker
175+ DisplayName = $importedAccount.DisplayName
176+ UserName = $importedAccount.Email_werk
177+ Enabled = $false
178+ Data = $data
179+ }
180+ }
181+
182+ Write-Information ' AFAS Employees account entitlement import completed'
183+ } catch {
184+ $ex = $PSItem
185+ $errorMessage = Get-ErrorMessage - ErrorObject $ex
186+
187+ Write-Warning " Error at Line [$ ( $ex.InvocationInfo.ScriptLineNumber ) ]: $ ( $ex.InvocationInfo.Line ) . Error: $ ( $errorMessage.VerboseErrorMessage ) "
188+ Write-Error " Could not import AFAS Employees account entitlements. Error: $ ( $errorMessage.VerboseErrorMessage ) "
189+ }
0 commit comments