Ephesoft.Transact.BatchClass.psm1

using module .\Ephesoft.Transact.Common.psm1

<#
.Synopsis
  Gets a list of Ephesoft Transact batch classes
.Description
  Gets the list of Ephesoft Transact batch classes from a Transact instance with web services enabled
.Example
  Get-BatchClassList -Hostname 'transact.some.net' -Credential $Cred
  Connects to the Ephesoft Transact instance at https://transact.some.net and returns data on the list of batch classes available
.Example
  Get-BatchClassList -Hostname 'transact.some.net' -port 8080 -Credential $Cred -UseHTTP -AcknowledgeInsecure
  Connects to the Ephesoft Transact instance at http://transact.some.net on an insecure port (only recommended for local on-box testing) and returns data on the list of batch classes available
.Parameter Hostname
  The hostname where the transact web services API can be reached.
.Parameter Credential
  A PSCredential object containing the username/password used to connect to the Ephesoft Transact instance.
.Parameter Port
  The TCP/IP port to make the connection on if using something other than the standard HTTPS port 443.
.Parameter UseHTTP
  By default, connections are made over HTTPS. Setting this parameter will attempt the connection over http which is only recommended for on-box testing.
.Parameter AckknowledgeInsecure
  By default, connections are made over HTTPS. If forcing an http connection, the call will be rejected unless this parameter is specified.
#>

Function Get-TransactBatchClassList {
  [CmdLetBinding()]
  [OutputType([pscustomobject])]
  param (
    [Parameter (Mandatory = $true)]
    [string] $Hostname,
    [Parameter (Mandatory = $true)]
    [pscredential] $Credential,
    [ValidateRange(1,65535)]
    [int] $Port=443,
    [switch] $UseHTTP,
    [switch] $AcknowledgeInsecure
  )

  # Prepare URL to use
  $endpoint = 'getBatchClassList'
  $uri = Get-TransactURI -Endpoint $endpoint -Port $Port -UseHTTP:$UseHTTP -AcknowledgeInsecure:$AcknowledgeInsecure -Hostname $Hostname

  # TODO - Move this into a function
  # Create Headers for REST Call
  $base64Creds = [System.Convert]::TOBase64String([System.Text.Encoding]::UTF8.GetBytes("$($Credential.Username):$($Credential.GetNetworkCredential().password)"))
  $headers = @{
    "Authorization" = "Basic $base64Creds"
  }

  # Make API Call
  Write-Progress "Getting list of batch classes from $uri"
  Write-Verbose "Getting list of batch classes from $uri"
  $response = Invoke-RestMethod -Method 'GET' -Header $headers -ContentType "application/xml" -URI $uri

  # Return array of batch class objects
  return $response.innerxml | Select-XML -XPath 'Web_Service_Result/Result_Message/Batch_Classes/BatchClass' | Select-Object -ExpandProperty Node
}

<#
.Synopsis
  Imports batch class into Ephesoft Transact
.Description
  Imports a batch class from a .zip file via the Ephesoft Transact web services API
.Example
  Import-TransactBatchClass -Hostname 'mytransactinstance.mycompany.org' -Credential $MyTransactCred -FilePath C:\PathTo\My\BatchClass1.Zip
  Uploads the BatchClass1.zip file into Transact and creates a new Batchclass named 'BatchClass1'.
.Example
  Import-TransactBatchClass -Hostname 'transact.some.net' -Credential $MyTransactCred -FilePath C:\PathTo\My\BatchClass1.Zip -port 8080 -UseHTTP -AcknowledgeInsecure
  Connects to the Ephesoft Transact instance at http://transact.some.net on an insecure port (only recommended for local on-box testing) and creates 'BatchCLass1' using 'BatchCLass1.zip'
.Parameter Credential
  A PSCredential object containing the username/password used to connect to the Ephesoft Transact instance.
.Parameter FilePath
  The full file path to the Ephesoft Transact batch class .zip file to import.
.Parameter Hostname
  The hostname where the transact web services API can be reached.
.Parameter Port
  The TCP/IP port to make the connection on if using something other than the standard HTTPS port 443.
.Parameter Priority
  The priority of the batch class in the Ephesoft Transact application.
.Parameter SharedFoldersPath
  The full file path to the Ephesoft Transact application shared folders directory.
.Parameter UseHTTP
  By default, connections are made over HTTPS. Setting this parameter will attempt the connection over http which is only recommended for on-box testing.
.Parameter AckknowledgeInsecure
  By default, connections are made over HTTPS. If forcing an http connection, the call will be rejected unless this parameter is specified.
#>

Function Import-TransactBatchClass {
  [CmdLetBinding()]
  [OutputType([pscustomobject])]
  param (
    [Parameter (Mandatory = $true)]
    [pscredential]$Credential,
    [Parameter (Mandatory = $true)]
    [string] $FilePath,
    [Parameter (Mandatory = $true)]
    [string] $Hostname,
    [ValidateRange(1,65535)]
    [int] $Port=443,
    [int] $Priority = 1,
    [string] $SharedFoldersPath = 'C:\Ephesoft\SharedFolders',
    [switch] $UseHTTP,
    [switch] $AcknowledgeInsecure
  )

  # Validate FilePath here to specify custom error message
  if ($FilePath -notmatch '.*\.zip$') {
    throw "Filepath parameter specified must be the full path to a .zip file containing an Ephesoft Transact batch class."
  }

  # Validate the file is found at the specified path
  if (-NOT (Test-Path $FilePath)) {
    throw "Could not find .zip file at $FilePath"
  }

  # Prepare URL to use
  $endpoint = 'importBatchClass'
  $uri = Get-TransactURI -Endpoint $endpoint -Port $Port -UseHTTP:$UseHTTP -AcknowledgeInsecure:$AcknowledgeInsecure -Hostname $Hostname

  # TODO - Move this to a common function
  # Create Headers for REST Call
  $base64Creds = [System.Convert]::TOBase64String([System.Text.Encoding]::UTF8.GetBytes("$($Credential.Username):$($Credential.GetNetworkCredential().password)"))
  $headers = @{
    "Authorization" = "Basic $base64Creds"
  }

  # Update XML Template
  $batchClassName = (Split-Path $FilePath -Leaf).Replace('.zip','')
  $XMLTemplatePath = "$PSScriptRoot\resources\importBatchClassParam.xml"
  $TempXMLPath = Update-XMLTemplate -XMLTemplatePath $XMLTemplatePath -SharedFoldersPath $SharedFoldersPath -BatchClassName $batchClassName -Priority $Priority

  # Get MultiPart Content from .zip file
  $multiPartContent = @($TempXMLPath,$FilePath) | Get-MultiPartFileContent

  # Submit request
  Write-Progress "Importing batch class $batchClassName"
  Write-Verbose "Importing batch class $batchClassName"
  $result = Invoke-RestMethod -Method 'Post' -Header $headers -ContentType "application/xml" -URI $uri -Body $multiPartContent.Content -ErrorAction 'Stop'

  return [pscustomobject] @{
    BatchClassName = $batchClassName
    StatusCode = $result.web_service_result.response_code.HTTP_CODE
    Message = $result.web_service_result.response_code.Result
  }
}

# Internal Functions
Function Update-XMLTemplate {
  [OutputType([string])]
  [CmdLetBinding(SupportsShouldProcess = $true)]
  param (
    [Parameter (Mandatory = $true)]
    [string]$XMLTemplatePath,
    [Parameter (Mandatory = $true)]
    [string]$SharedFoldersPath,
    [Parameter (Mandatory = $true)]
    [string]$BatchClassName,
    [int]$Priority
  )

  # Update XML with Batch Class Name
  [XML]$BCXML = Get-Content $XMLTemplatePath
  $BCXML.ImportBatchClassOptions.Name = $BatchClassName
  $BCXML.ImportBatchClassOptions.Description = $BatchClassName
  $BCXML.ImportBatchClassOptions.UncFolder = "$SharedFoldersPath\$BatchClassName"

  if ($Priority) {
    $BCXML.ImportBatchClassOptions.Priority = $Priority
  }

  if ($PSCmdlet.ShouldProcess($XMLTemplatePath, 'Update Template')) {
    $TempFile = New-Item -ItemType File -Path $env:Temp -Name "tmp$((new-guid).guid.toupper().substring(0,4)).xml"
    $BCXML.Save($TempFile.FullName)
  }
  Return $TempFile.FullName
}