Private/New-AtwsDefinition.ps1
Function New-AtwsDefinition { Begin { $EntityName = '#EntityName' # Enable modern -Debug behavior If ($PSCmdlet.MyInvocation.BoundParameters['Debug'].IsPresent) {$DebugPreference = 'Continue'} Write-Debug ('{0}: Begin of function' -F $MyInvocation.MyCommand.Name) $ProcessObject = @() } Process { $Fields = Get-AtwsFieldInfo -Entity $EntityName If ($InputObject) { Write-Verbose ('{0}: Copy Object mode: Setting ID property to zero' -F $MyInvocation.MyCommand.Name) $CopyNo = 1 Foreach ($Object in $InputObject) { # Create a new object and copy properties $NewObject = New-Object Autotask.$EntityName # Copy every non readonly property $FieldNames = $Fields.Where({$_.Name -ne 'id'}).Name If ($PSBoundParameters.ContainsKey('UserDefinedFields')) { $FieldNames += 'UserDefinedFields' } Foreach ($Field in $FieldNames) { $NewObject.$Field = $Object.$Field } If ($NewObject -is [Autotask.Ticket]) { Write-Verbose ('{0}: Copy Object mode: Object is a Ticket. Title must be modified to avoid duplicate detection.' -F $MyInvocation.MyCommand.Name) $Title = '{0} (Copy {1})' -F $NewObject.Title, $CopyNo $CopyNo++ $NewObject.Title = $Title } $ProcessObject += $NewObject } } Else { Write-Debug ('{0}: Creating empty [Autotask.{1}]' -F $MyInvocation.MyCommand.Name, $EntityName) $ProcessObject += New-Object Autotask.$EntityName } Foreach ($Parameter in $PSBoundParameters.GetEnumerator()) { $Field = $Fields | Where-Object {$_.Name -eq $Parameter.Key} If ($Field -or $Parameter.Key -eq 'UserDefinedFields') { If ($Field.IsPickList) { If($Field.PickListParentValueField) { $ParentField = $Fields.Where{$_.Name -eq $Field.PickListParentValueField} $ParentLabel = $PSBoundParameters.$($ParentField.Name) $ParentValue = $ParentField.PickListValues | Where-Object {$_.Label -eq $ParentLabel} $PickListValue = $Field.PickListValues | Where-Object {$_.Label -eq $Parameter.Value -and $_.ParentValue -eq $ParentValue.Value} } Else { $PickListValue = $Field.PickListValues | Where-Object {$_.Label -eq $Parameter.Value} } $Value = $PickListValue.Value } Else { $Value = $Parameter.Value } Foreach ($Object in $ProcessObject) { $Object.$($Parameter.Key) = $Value } } } $Caption = $MyInvocation.MyCommand.Name $VerboseDescrition = '{0}: About to create {1} {2}(s). This action cannot be undone.' -F $Caption, $ProcessObject.Count, $EntityName $VerboseWarning = '{0}: About to create {1} {2}(s). This action may not be undoable. Do you want to continue?' -F $Caption, $ProcessObject.Count, $EntityName If ($PSCmdlet.ShouldProcess($VerboseDescrition, $VerboseWarning, $Caption)) { $Result = New-AtwsData -Entity $ProcessObject } } End { Write-Debug ('{0}: End of function, returning {1} {2}(s)' -F $MyInvocation.MyCommand.Name, $Result.count, $EntityName) Return $Result } } |