Public/CrmTypes.ps1

### CRM Types ###
function New-CrmMoney{
# .ExternalHelp Campgemini.Xrm.Data.PowerShell.Help.xml
 [CmdletBinding()]
    PARAM(        
        [parameter(Mandatory=$true, Position=0)]
        [double]$Value
    )
    $crmMoney = New-Object -TypeName Microsoft.Xrm.Sdk.Money
    $crmMoney.Value = $Value
    $crmMoney
    return
}

function New-CrmOptionSetValue{
# .ExternalHelp Campgemini.Xrm.Data.PowerShell.Help.xml
 [CmdletBinding()]
    PARAM(        
        [parameter(Mandatory=$true, Position=0)]
        [int]$Value
    )
    $crmOptionSetValue = [Microsoft.Xrm.Sdk.OptionSetValue]::new()
    $crmOptionSetValue.Value = $Value
    $crmOptionSetValue
    return
}

function New-CrmEntityReference{
# .ExternalHelp Campgemini.Xrm.Data.PowerShell.Help.xml
 [CmdletBinding()]
    PARAM(        
        [parameter(Mandatory=$true, Position=0)]
        [string]$EntityLogicalName,
        [parameter(Mandatory=$true, Position=1)]
        [guid]$Id
    )
    $crmEntityReference = [Microsoft.Xrm.Sdk.EntityReference]::new()
    $crmEntityReference.LogicalName = $EntityLogicalName
    $crmEntityReference.Id = $Id
    $crmEntityReference
    return
}

function Convert-CrmValueForSdk {
    [CmdletBinding()]
    PARAM(
        [parameter(Mandatory=$false)]
        [AllowNull()]
        $Value,

        [parameter(Mandatory=$false)]
        [AllowNull()]
        $OriginalValue
    )

    if($null -eq $Value) { return $null }

    if($OriginalValue -is [Microsoft.Xrm.Sdk.OptionSetValue]) {
        if($Value -is [Microsoft.Xrm.Sdk.OptionSetValue]) { return $Value }
        return (New-Object Microsoft.Xrm.Sdk.OptionSetValue([Int32]$Value))
    }

    if($OriginalValue -is [Microsoft.Xrm.Sdk.Money]) {
        if($Value -is [Microsoft.Xrm.Sdk.Money]) { return $Value }
        return (New-Object Microsoft.Xrm.Sdk.Money([decimal]$Value))
    }

    if($OriginalValue -is [bool]) {
        if($Value -is [bool]) { return $Value }
        return [bool]::Parse([string]$Value)
    }

    if($OriginalValue -is [DateTime]) {
        if($Value -is [DateTime]) { return $Value }
        return [DateTime]::Parse([string]$Value)
    }

    if($OriginalValue -is [decimal]) {
        if($Value -is [decimal]) { return $Value }
        return [decimal]::Parse([string]$Value)
    }

    if($OriginalValue -is [Single]) {
        if($Value -is [Single]) { return $Value }
        return [Single]::Parse([string]$Value)
    }

    if($OriginalValue -is [Int32]) {
        if($Value -is [Int32]) { return $Value }
        return [Int32]::Parse([string]$Value)
    }

    return $Value
}

function Test-CrmValuesEquivalent {
    [CmdletBinding()]
    PARAM(
        [parameter(Mandatory=$false)]
        [AllowNull()]
        $CurrentValue,

        [parameter(Mandatory=$false)]
        [AllowNull()]
        $OriginalValue
    )

    if($null -eq $CurrentValue -and $null -eq $OriginalValue) { return $true }
    if($null -eq $CurrentValue -or $null -eq $OriginalValue) { return $false }

    if($OriginalValue -is [Microsoft.Xrm.Sdk.OptionSetValue]) {
        if($CurrentValue -is [Microsoft.Xrm.Sdk.OptionSetValue]) { return ($CurrentValue.Value -eq $OriginalValue.Value) }
        if($CurrentValue -is [Int32]) { return ($CurrentValue -eq $OriginalValue.Value) }
    }

    if($OriginalValue -is [Microsoft.Xrm.Sdk.Money]) {
        if($CurrentValue -is [Microsoft.Xrm.Sdk.Money]) { return ($CurrentValue.Value -eq $OriginalValue.Value) }
        if($CurrentValue -is [decimal] -or $CurrentValue -is [Int32]) { return ([decimal]$CurrentValue -eq $OriginalValue.Value) }
    }

    if($OriginalValue -is [Microsoft.Xrm.Sdk.EntityReference]) {
        if($CurrentValue -is [Microsoft.Xrm.Sdk.EntityReference]) { return ($CurrentValue.Id -eq $OriginalValue.Id) }
        return ($CurrentValue -eq $OriginalValue.Name)
    }

    return ($CurrentValue -eq $OriginalValue)
}