Functions/Get-SyncMSPCompleteUsersScriptBlocks.ps1

<#
.SYNOPSIS
    This function returns the script blocks used to sync MSPComplete users.
#>

function Get-SyncMSPCompleteUsersScriptBlocks {
    # Return the script blocks
    return @{
        UnArchiveEntity = {
            # Retrieve the archived user (if it exists)
            $archivedUser = Get-BT_CustomerEndUser -Ticket $mspcObject.CustomerTicket -DisplayName $entity.Expected.DisplayName `
                -IsArchived $true -IsDeleted $false -Environment $environment

            # The archived user doesn't exist
            if (!$archivedUser) {
                return
            }

            # If there are multiple archived users, use the first one
            if ($archivedUser.length -gt 1) {
                $archivedUser = $archivedUser[0]
            }

            # Un-archive the user
            $unArchivedUser = Set-BT_CustomerEndUser -Ticket $mspcObject.CustomerTicket -CustomerEndUser $archivedUser `
                                    -IsArchived $false -Environment $environment
            if (!$unArchivedUser) {
                throw "Failed to un-archive user."
            }
            "success"
        }
        CreateEntity = {
            # Create hash table for params
            $addBTCustomerEndUserParams = @{
                Ticket      = $mspcObject.CustomerTicket
                Environment = $environment
            }

            # Add built-in properties to the params
            Get-MSPCompleteUserPropertyList | ForEach-Object -Process {
                if ($entity.Expected.$_) {
                    $addBTCustomerEndUserParams.Add($_, $entity.Expected.$_)
                }
            }

            # Create the user
            $newUser = Add-BT_CustomerEndUser @addBTCustomerEndUserParams
            if (!$newUser) {
                throw "Failed to create user."
            }

            # Add extended properties to the user
            $extendedPropertyErrors = ""
            $extendedProperties = Get-MSPCompleteUserExtendedPropertyList
            foreach ($property in $extendedProperties) {
                if (![String]::IsNullOrWhiteSpace($entity.Expected.ExtendedProperties.$property)) {
                    $extendedProperty = Add-BT_ExtendedProperty -Ticket $mspcObject.WorkgroupTicket `
                        -ReferenceEntityId $newUser.Id -ReferenceEntityType "CustomerEndUser" -Name $property `
                        -Value $entity.Expected.ExtendedProperties.$property -Environment $environment
                    if (!$extendedProperty) {
                        $extendedPropertyErrors += "Failed to create extended property $($property):$($entity.Expected.ExtendedProperties.$property)."
                        continue
                    }
                }
            }
            if (![String]::IsNullOrWhiteSpace($extendedPropertyErrors)) {
                throw $extendedPropertyErrors
            }
            "success"
        }
        CompareEntities = {
            # Error output is redirected to null to ensure that only the $true/$false result of the compare is returned
            Compare-MSPCompleteUser -ReferenceUser $entity.Expected -ComparisonUser $entity.Current 2>$null
        }
        UpdateEntity = {
            # Create hash table for params
            $setBTCustomerEndUserParams = @{
                Ticket          = $mspcObject.CustomerTicket
                CustomerEndUser = $entity.Current
                Environment     = $environment
            }

            # Add built-in properties to the params
            Get-MSPCompleteUserPropertyList | ForEach-Object -Process {
                if ($entity.Expected.$_) {
                    $setBTCustomerEndUserParams.Add($_, $entity.Expected.$_)
                }
            }

            # Update the user
            $updatedUser = Set-BT_CustomerEndUser @setBTCustomerEndUserParams
            if (!$updatedUser) {
                throw "Failed to update user."
            }

            # Update the user extended properties
            $extendedPropertyErrors = ""
            $extendedProperties = Get-MSPCompleteUserExtendedPropertyList
            foreach ($property in $extendedProperties) {
                # Only update/create if different and the new value is not null or whitespace
                if ($entity.Current.ExtendedProperties.$property -ne $entity.Expected.ExtendedProperties.$property -and ![String]::IsNullOrWhiteSpace($entity.Expected.ExtendedProperties.$property)) {
                    $extendedProperty = Get-BT_ExtendedProperty -Ticket $mspcObject.WorkgroupTicket `
                        -ReferenceEntityId $updatedUser.Id -ReferenceEntityType "CustomerEndUser" `
                        -Name $property -Environment $environment

                    # Update existing extended property
                    if ($extendedProperty) {
                        $extendedProperty = Set-BT_ExtendedProperty -Ticket $mspcObject.WorkgroupTicket `
                            -ExtendedProperty $extendedProperty -Value $entity.Expected.ExtendedProperties.$property -Environment $environment
                        if (!$extendedProperty) {
                            $extendedPropertyErrors += "Failed to update extended property $($property):$($entity.Expected.ExtendedProperties.$property)."
                            continue
                        }
                    }

                    # Create new extended property
                    else {
                        $extendedProperty = Add-BT_ExtendedProperty -Ticket $mspcObject.WorkgroupTicket `
                            -ReferenceEntityId $updatedUser.Id -ReferenceEntityType "CustomerEndUser" `
                            -Name $property -Value $entity.Expected.ExtendedProperties.$property -Environment $environment
                        if (!$extendedProperty) {
                            $extendedPropertyErrors += "Failed to create extended property $($property):$($entity.Expected.ExtendedProperties.$property)."
                            continue
                        }
                    }
                }
            }
            if (![String]::IsNullOrWhiteSpace($extendedPropertyErrors)) {
                throw $extendedPropertyErrors
            }
            "success"
        }
        ArchiveEntity = {
            # Archive the user
            $archivedUser = Set-BT_CustomerEndUser -Ticket $mspcObject.CustomerTicket -CustomerEndUser $entity.Current `
                                -IsArchived $true -Environment $environment
            if (!$archivedUser) {
                throw "Failed to archive user."
            }
            "success"
        }
        DeleteEntity = {
            # Delete the user
            Remove-BT_CustomerEndUser -Ticket $mspcObject.CustomerTicket -Id $entity.Current.Id `
                -Force -Environment $environment
            "success"
        }
    }
}