Public/Functions/UserManagement/Assert-TeamsCallableEntity.ps1

# Module: TeamsFunctions
# Function: VoiceConfig
# Author: David Eberhardt
# Updated: 15-DEC-2020
# Status: PreLive


#TODO Make standalone function:
<#
Add CmdLetBindign
Add switch for returning ID, otherwise BOOLEAN
Add Help block
Add CallStack - Return error if called directly, otherwise warnings
 
#>


function Assert-TeamsCallableEntity {
  <#
    .SYNOPSIS
        Verifies User is ready for Voice Config
  .DESCRIPTION
        Tests whether a specific Module is loaded
  .EXAMPLE
        Test-Module -Module ModuleName
        Will Return $TRUE if the Module 'ModuleName' is loaded
  #>


  [CmdletBinding()]
  [OutputType([Boolean])]
  Param
  (
    [Parameter(Mandatory, HelpMessage = "User Principal Name of the user")]
    [string]$Identity
  )

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

    $Stack = Get-PSCallStack
    $Called = $($Stack.length -ge 3)
  } #begin

  process {
    Write-Verbose -Message "[PROCESS] $($MyInvocation.MyCommand)"

    try {
      $Object = Get-TeamsUserVoiceConfig $Identity
      Write-Verbose -Message "User '$Identity' found"

      if ( $Object.PhoneSystemStatus.Contains('Success')) {
        Write-Verbose -Message "User '$Identity' found and licensed"

        if ( $Object.EnterpriseVoiceEnabled ) {
          Write-Verbose -Message "User '$Identity' found and licensed and enabled for EnterpriseVoice" -Verbose
          return $Object
        }
        elseif ( $(Enable-TeamsUserForEnterpriseVoice -Identity $Identity.UserPrincipalName -Force) ) {
          Write-Verbose -Message "User '$Identity' found and licensed and successfully enabled for EnterpriseVoice" -Verbose
          return $Object
        }
        else {
          if ( $Called ) {
            Write-Warning -Message "User '$Identity' found and licensed, but not enabled for EnterpriseVoice!"
            return
          }
          else {
            Write-Error -Message "User '$Identity' found and licensed, but not enabled for EnterpriseVoice!" -Category InvalidResult -ErrorAction Stop
          }
        }

      }
      else {
        Write-Warning -Message "User '$Identity' found but not licensed (PhoneSystem)" -Verbose
        return
      }
    }
    catch {
      if ( $Called ) {
        Write-Warning -Message "User '$Identity' not found" -Verbose
        return
      }
      else {
        Write-Error -Message "User '$Identity' not found" -Category ObjectNotFound -ErrorAction Stop
      }
    }

  } #process

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