Functions/Convert-GSuiteUserToMSPCompleteUser.ps1

<#
.SYNOPSIS
    This function converts a GSuite user to a MSPComplete user.
.DESCRIPTION
    This function converts a GSuite user to a MSPComplete user.
    The conversion is accomplished by mapping the GSuite user's properties and extended
    properties to their corresponding MSPComplete properties.
#>

function Convert-GSuiteUserToMSPCompleteUser {
    [CmdletBinding(PositionalBinding=$true)]
    [OutputType([PSCustomObject])]
    param (
        # The GSuite User.
        [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
        [ValidateNotNull()]
        [PSCustomObject]$user
    )

    # Create the MSPComplete user object
    $mspCompleteUser = [PSCustomObject]@{ }

    # Retrieve the mapping from MSPComplete user to GSuite user properties
    $propertyMap = Get-MSPCompleteUserToGSuiteUserPropertyMap

    # Add all properties to the MSPComplete user
    foreach ($property in $propertyMap.GetEnumerator()) {
        # Invoke-Expression is used, because some values are more than one layer under the user object
        # Example : $user.name.fullName
        $value = Invoke-Expression "`$user.$($property.Value)"
        if (![String]::IsNullOrWhiteSpace($value)) {
            $mspCompleteUser | Add-Member -NotePropertyName $property.Name -NotePropertyValue $value
        }
    }

    # Retrieve the map from MSPComplete user extended properties to GSuite user properties
    $extendedPropertyMap = Get-MSPCompleteUserToGSuiteUserExtendedPropertyMap

    # Convert the extended properties to the MSPComplete user
    $mspCompleteUser | Add-Member -NotePropertyName "ExtendedProperties" -NotePropertyValue @{ } -Force

    # Add extended properties to the MSPComplete user
    foreach ($property in $extendedPropertyMap.GetEnumerator()) {
        # Invoke-Expression is used, because some values are more than one layer under the user object
        # Example : $user.organizations.name
        $value = Invoke-Expression "`$user.$($property.Value)"
        if (![String]::IsNullOrWhiteSpace($value)) {
            $mspCompleteUser.ExtendedProperties.Add($property.Name, $value)
        }
    }

    # Add manager email address
    $manager = $user.relations | Where-Object { $_.type -eq "manager" }
    if (![String]::IsNullOrWhiteSpace($manager.value)) {
        $mspCompleteUser.ExtendedProperties.Add("ManagerEmailAddress", $manager.value)
    }

    # Get the home address and add properties
    $workAddress = $user.addresses | Where-Object { $_.type -eq "home" }
    $addressPropertyMap = @{
        AddressLine1    = "streetAddress"
        PostalOrZipCode = "postalCode"
        StateOrProvince = "region"
        City            = "locality"
        CountryOrRegion = "country"
    }
    foreach ($property in $addressPropertyMap.GetEnumerator()) {
        if (![String]::IsNullOrWhiteSpace($workAddress.($property.Value))) {
            $mspCompleteUser.ExtendedProperties.Add($property.Name, $workAddress.($property.Value))
            $mspCompleteUser | Add-Member -NotePropertyName $property.Name -NotePropertyValue $workAddress.($property.Value)
        }
    }

    # Add phone numbers
    $landLinePhone = $user.phones | Where-Object { $_.type -eq "home" }
    if (![String]::IsNullOrWhiteSpace($landLinePhone.value)) {
        $mspCompleteUser.ExtendedProperties.Add("TelephoneNumber", $landLinePhone.value)
    }
    $mobilePhone = $user.phones | Where-Object { $_.type -eq "mobile" }
    if (![String]::IsNullOrWhiteSpace($mobilePhone.value)) {
        $mspCompleteUser.ExtendedProperties.Add("MobilePhoneNumber", $mobilePhone.value)
    }

    # Return the converted user
    return $mspCompleteUser
}