Public/Get-AtwsPicklistValue.ps1
<# .COPYRIGHT Copyright (c) Hugo Klemmestad. All rights reserved. Licensed under the MIT license. See https://github.com/ecitsolutions/Autotask/blob/master/LICENSE.md for license information. #> Function Get-AtwsPicklistValue { <# .SYNOPSIS This function gets valid fields for an Autotask Entity .DESCRIPTION This function gets valid fields for an Autotask Entity .INPUTS None. .OUTPUTS [Autotask.Field[]] .EXAMPLE Get-AtwsFieldInfo -Entity Account Gets all valid built-in fields and user defined fields for the Account entity. #> [cmdletbinding( DefaultParameterSetName = 'by_Entity' )] Param ( [Parameter( ParameterSetName = 'by_Entity' )] [Parameter( ParameterSetName = 'as_Labels' )] [Parameter( ParameterSetName = 'as_Values' )] [Alias('UDF')] [switch] $UserDefinedFields, [Parameter( ParameterSetName = 'as_Labels' )] [switch] $Label, [Parameter( ParameterSetName = 'as_Labels' )] [switch] $Quoted, [Parameter( ParameterSetName = 'as_Labels' )] [switch] $Hashtable, [Parameter( ParameterSetName = 'as_Values' )] [switch] $Value, [Parameter( Mandatory = $true, Position = 0, ParameterSetName = 'by_Entity' )] [Parameter( Mandatory = $true, Position = 0, ParameterSetName = 'as_Labels' )] [Parameter( Mandatory = $true, Position = 0, ParameterSetName = 'as_Values' )] [ValidateNotNullOrEmpty()] [ArgumentCompleter({ param($Cmd, $Param, $Word, $Ast, $FakeBound) $script:FieldInfoCache.keys })] [string] $Entity, [Parameter( Mandatory = $true, Position = 1, ParameterSetName = 'by_Entity' )] [Parameter( Mandatory = $true, Position = 1, ParameterSetName = 'as_Labels' )] [Parameter( Mandatory = $true, Position = 2, ParameterSetName = 'as_Values' )] [ValidateNotNullOrEmpty()] [ArgumentCompleter({ param($Cmd, $Param, $Word, $Ast, $FakeBound) if ($FakeBound.UserDefinedFields.IsPresent) { $script:FieldInfoCache[$fakebound.Entity]['UDFinfo'].keys } else { $script:FieldInfoCache[$fakebound.Entity]['PickListFields'] } })] [string] $FieldName, [Parameter( Mandatory = $false, Position = 2, ParameterSetName = 'by_Entity' )] [Parameter( Mandatory = $false, Position = 2, ParameterSetName = 'as_Labels' )] [Parameter( Mandatory = $false, Position = 2, ParameterSetName = 'as_Values' )] [string] $ParentValue ) begin { # Enable modern -Debug behavior if ($PSCmdlet.MyInvocation.BoundParameters['Debug'].IsPresent) { $DebugPreference = 'Continue' } Write-Debug ('{0}: Begin of function' -F $MyInvocation.MyCommand.Name) # Check if we are connected before trying anything if (-not($Script:Atws.integrationsValue)) { # Not connected. Try to connect, prompt for credentials if necessary Write-Verbose ('{0}: Not connected. Calling Connect-AtwsWebApi without parameters for possible autoload of default connection profile.' -F $MyInvocation.MyCommand.Name) Connect-AtwsWebAPI } # Set up regex and replacement variables for curly single quote $pattern = [Char]8217 $replacement = [Char]8217, [Char]8217 -join '' # Prepare an empty container for a result $picklistValues = @() } process { Write-Verbose -Message ('{0}: Looking up detailed Fieldinfo for entity {1}' -F $MyInvocation.MyCommand.Name, $Entity) if ($UserDefinedFields.IsPresent -and $script:FieldInfoCache[$Entity].HasUserDefinedFields) { $infoType = 'UDFinfo' } elseIf ($script:FieldInfoCache[$Entity].HasPicklist) { $infoType = 'FieldInfo' } else { # Nothing to do. Return. return } # Refresh picklists if list is empty if ($null -eq $script:FieldInfoCache[$Entity][$infoType][$FieldName]['PicklistValues']) { # The API returns all fields anyway, so we do not need to specify field name, but we # need to specify userdefinedfields Update-AtwsPicklist -Entity $Entity -UserDefinedFields:$UserDefinedFields.IsPresent } $picklistValues = $script:FieldInfoCache[$Entity][$infoType][$FieldName]['PicklistValues'] Write-Verbose -Message ('{0}: Entity {1} has picklists and field {2} has {3} picklist values.' -F $MyInvocation.MyCommand.Name, $Entity, $FieldName, $picklistValues.byLabel.count) if ($picklistValues.count -gt 0 ) { if ($picklistValues.keys -contains 'byValue') { # No parentfieldname $result = switch ($PSCmdlet.ParameterSetName) { 'by_Entity' { $picklistValues.byValue } 'as_Labels' { if ($Hashtable.IsPresent) { $picklistValues.byLabel } elseIf ($Quoted.IsPresent) { foreach ($item in ($picklistValues.byLabel.keys | Sort-Object)) { "'{0}'" -F $($item -replace "'", "''" -replace $pattern, $replacement) } } else { $picklistValues.byLabel.keys | Sort-Object } } 'as_Values' { $picklistValues.byLabel.values | Sort-Object } } } # Take parentvalue into account elseIf ($ParentValue -and ($script:FieldInfoCache[$Entity][$infoType][$FieldName]['PicklistParentValueField'])) { $ParentPicklistValues = Get-AtwsPicklistValue -Entity $Entity -FieldName $script:FieldInfoCache[$Entity][$infoType][$FieldName]['PicklistParentValueField'] -Label -Hashtable $ParentIndex = $ParentPicklistValues[$ParentValue] $result = switch ($PSCmdlet.ParameterSetName) { 'by_Entity' { $picklistValues[$ParentIndex] } 'as_Labels' { if ($Hashtable.IsPresent) { $picklistValues[$ParentIndex].byLabel } elseIf ($Quoted.IsPresent) { foreach ($item in ($picklistValues[$ParentIndex].byLabel.keys | Sort-Object)) { "'{0}'" -F $($item -replace "'", "''" -replace $pattern, $replacement) } } else { $picklistValues[$ParentIndex].byLabel.keys | Sort-Object } } 'as_Values' { $picklistValues[$ParentIndex].byLabel.values | Sort-Object } } } # We have a picklist with a parentfield, but no parentvalue. Return # hashtable for by_entity and all labels or keys if either is requested else { $result = switch ($PSCmdlet.ParameterSetName) { 'by_Entity' { $picklistValues } 'as_Labels' { if ($Hashtable.IsPresent) { $picklistValues.Values.byLabel } elseIf ($Quoted.IsPresent) { foreach ($item in ($picklistValues.Values.byLabel.keys | Sort-Object)) { "'{0}'" -F $($item -replace "'", "''" -replace $pattern, $replacement) } } else { $picklistValues.Values.byLabel.keys | Sort-Object } } 'as_Values' { $picklistValues.Values.byLabel.values | Sort-Object } } } } } end { Write-Debug ('{0}: End of function' -F $MyInvocation.MyCommand.Name) if ($result.count -gt 0) { return $result } } } |