Private/Merge-VoiceRoutingChainArtefact.ps1

# Module: TeamsFunctions
# Function: Teams Auto Attendant
# Author: David Eberhardt
# Updated: 01-DEC-2020
# Status: Live




function Merge-VoiceRoutingChainArtefact {
  <#
    .SYNOPSIS
        Merges multiple Artefacts of an Online Voice Routing Policy into one Object for display
    .DESCRIPTION
    Helper function to prepare a nested Object of an Online Voice Routing Policy for display
    Used in Get-TeamsVoiceRoutingChain
  .PARAMETER Object
    The input Object to transform
  .PARAMETER Type
    Type of Object (will determine Output)
  .PARAMETER OVRs
    Only valid for Type OPU
  .PARAMETER MGWs
    Only valid for Type OVR
  .INPUTS
    PSCustomObject
  .OUTPUTS
    PSCustomObject
  .NOTES
    All parmeter work with the nested Objects from the Parsed Object
  .LINK
    https://github.com/DEberhardt/TeamsFunctions/tree/main/docs/
  .LINK
    Get-TeamsVoiceRoutingChain
    #>


  [CmdletBinding(DefaultParameterSetName = 'Prompt' )]
  [OutputType([PSCustomObject])]
  param(
    #TEST Whether both Object and Identity work - replicate for Set-TeamsCAP
    [Parameter(Mandatory, HelpMessage = 'Object for Voice Routing Chain')]
    [object[]]$Object,

    [Parameter(Mandatory, HelpMessage = 'Type of Object presented. Determines Output')]
    [ValidateSet('OPU', 'OVR', 'MGW')]
    [string]$Type,

    [Parameter(HelpMessage = "Merged Object of 'MGWs' to be added to OVRs")]
    [Parameter(Mandatory, ParameterSetName = 'OPUs', HelpMessage = "Merged Object of 'MGWs' to be added to OPUs")]
    [AllowNull()]
    [object[]]$OVRs,

    [Parameter(HelpMessage = "Merged Object of 'MGWs' to be added to OVRs")]
    [Parameter(Mandatory, ParameterSetName = 'OVRs', HelpMessage = "Merged Object of 'MGWs' to be added to OVRs")]
    [AllowNull()]
    [object[]]$MGWs

  ) #param

  begin {
    #Show-FunctionStatus -Level Live
    #Write-Verbose -Message "[BEGIN ] $($MyInvocation.MyCommand)"

    $OFS = ''
  } #begin

  process {
    #Write-Verbose -Message "[PROCESS] $($MyInvocation.MyCommand)"
    Write-Verbose -Message "[PROCESS] $($MyInvocation.MyCommand) - Processing Voice Routing Chain Artefact of Type '$Type'"

    $MergedObject = @()
    switch ($Type) {
      'OPU' {
        foreach ($O in $Object) {
          $SingleObject = @()
          $SingleObject = [PsCustomObject][ordered]@{
            PSTypeName         = 'PowerShell.TeamsFunctsions.VoiceRoutingChain.PstnUsage'
            'Name'             = $O
            'OnlineVoiceRoute' = $OVRs
          }
          Add-Member -Force -InputObject $SingleObject -MemberType ScriptMethod -Name ToString -Value {
            [System.Environment]::NewLine + (($this | Format-List * | Out-String) -replace '^\s+|\s+$') + [System.Environment]::NewLine
          }
          $MergedObject += Add-Member -InputObject $SingleObject -TypeName System.Collections.ArrayList -PassThru
        }
        return $MergedObject
      }

      'OVR' {
        foreach ($O in $Object) {
          $SingleObject = @()
          $SingleObject = [PsCustomObject][ordered]@{
            PSTypeName         = 'PowerShell.TeamsFunctsions.VoiceRoutingChain.VoiceRoute'
            'Name'                  = $O.Identity
            'Description'           = $O.Description
            'Priority'              = $O.Priority
            'NumberPattern'         = $O.NumberPattern
            'OnlinePstnGatewayList' = $MGWs
          }
          Add-Member -Force -InputObject $SingleObject -MemberType ScriptMethod -Name ToString -Value {
            [System.Environment]::NewLine + (($this | Format-List * | Out-String) -replace '^\s+|\s+$') + [System.Environment]::NewLine
          }
          $MergedObject += Add-Member -InputObject $SingleObject -TypeName System.Collections.ArrayList -PassThru
        }
        return $MergedObject
      }

      'MGW' {
        foreach ($O in $Object) {
          $SingleObject = @()
          $SingleObject = [PsCustomObject][ordered]@{
            PSTypeName         = 'PowerShell.TeamsFunctsions.VoiceRoutingChain.MediaGateway'
            'Identity'              = $O.Identity
            'SipSignalingPort'      = $O.SipSignalingPort
            'FailoverTimeSeconds'   = $O.FailoverTimeSeconds
            'Enabled'               = $O.Enabled
            'MediaBypass'           = $O.MediaBypass
            'PidfLoSupported'       = $O.PidfLoSupported
            'GatewaySiteId'         = $GatewaySiteId
            'GatewaySiteLbrEnabled' = $GatewaySiteLbrEnabled

            #TranslationRules are also hooked in here but hardly configured.
            # they too could be added as a separate Object here and hooked into the MGW
          }
          Add-Member -Force -InputObject $SingleObject -MemberType ScriptMethod -Name ToString -Value {
            [System.Environment]::NewLine + (($this | Format-List * | Out-String) -replace '^\s+|\s+$') + [System.Environment]::NewLine
          }
          $MergedObject += Add-Member -InputObject $SingleObject -TypeName System.Collections.ArrayList -PassThru
        }
        return $MergedObject
      }
    }

  } #process

  end {
    #Write-Verbose -Message "[END ] $($MyInvocation.MyCommand)"
  } #end

} # Merge-VoiceRoutingChainArtefact