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 = @() # Set up TimeZone offset handling If (-not($script:ESToffset)) { $Now = Get-Date $ESTzone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Eastern Standard Time") $ESTtime = [System.TimeZoneInfo]::ConvertTimeFromUtc($Now.ToUniversalTime(), $ESTzone) $script:ESToffset = (New-TimeSpan -Start $ESTtime -End $Now).TotalHours } } 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 } ElseIf ($Field.Type -eq 'datetime') { $TimePresent = $Parameter.Value.Hour -gt 0 -or $Parameter.Value.Minute -gt 0 -or $Parameter.Value.Second -gt 0 -or $Parameter.Value.Millisecond -gt 0 If ($Field.Name -like "*DateTime" -or $TimePresent) { # Yes, you really have to ADD the difference $Value = $Parameter.Value.AddHours($script:ESToffset) } } Else { $Value = $Parameter.Value } Foreach ($Object in $ProcessObject) { $Object.$($Parameter.Key) = $Value } } } $Result = New-AtwsData -Entity $ProcessObject # The API documentation explicitly states that you can only use the objects returned # by the .create() function to get the new objects ID. # so to return objects with accurately represents what has been created we have to # get them again by id $NewObjectFilter = 'id -eq {0}' -F ($Result.Id -join ' -or id -eq ') $Result = Get-AtwsData -Entity $EntityName -Filter $NewObjectFilter } End { Write-Debug ('{0}: End of function' -F $MyInvocation.MyCommand.Name) If ($PSCmdLet.ParameterSetName -eq 'Input_Object') { # Verify copy mode Foreach ($Object in $Result) { If ($InputObject.Id -contains $Object.Id) { Write-Warning ('{0}: Autotask detected new object as duplicate of {1} with Id {2} and tried to update object, not create a new copy. ' -F $MyInvocation.MyCommand.Name, $EntityName, $Object.Id) } } } Return $Result } } |