Get-IbReport.psm1

<#
.Synopsis
Importing transaction history from Interactive Brokers.
 
.Description
The `Get-IbReport` cmdlet import transaction history from Interactive Brokers using flex query version 3 API.
Interactive Brokers provides two types of statements. The Activity Flex and Trade Confirms Flex.
Activity Flex statement provides daily data with all information at the end of the day (Total equity, open positions, trades, cash transactions etc.)
Trade Confirms Flex provides the trades only but it is refreshed immediately after the trade is confirmed.
 
.Parameter Query
Flex query ID of Interactive Brokers.
 
.Parameter Token
Your flex web service token in Interactive Brokers.
 
.Example
Get-IbReport -Query 123456
 
.Example
Get-IbReport 123456
 
.Example
Get-IbReport 123456 | Sort-Object settledate | Select-Object -Last 15 | Format-Table
 
.LINK
Online version: https://www.interactivebrokers.com/en/software/am/am/reports/flex_web_service_version_3.htm
Project homepage: https://github.com/scout249/Interactive-Brokers-Powershell
#>


function Get-IbReport {
  [CmdletBinding()]
  param(
    [string]$Query,
    [switch]$Token
  )
  $path = [Environment]::GetFolderPath('ApplicationData')
  $Colors = @{
    ForegroundColor = "White"
    BackgroundColor = "Red"
  }
  if ($token -ne $true) {
    if ((Test-Path "$path\IbToken.txt") -ne $true) {
      Write-Host "Please run 'Get-IbReport -Token' to provide Interactive Brokers token (Missing)" @colors
    }
    elseif ($query -eq '') {
      Write-Host "Please run 'Get-IbReport -Query <<YOUR QUERY ID>>' to provide Interactive Brokers query ID (Missing)" @colors
    }
    else {
      ## Define variables
      $ib_token = Get-Content "$path\IbToken.txt"
      $ib_version = 3
      $init_url = "https://gdcdyn.interactivebrokers.com/Universal/servlet/FlexStatementService.SendRequest"
      $getdata_url = "https://gdcdyn.interactivebrokers.com/Universal/servlet/FlexStatementService.GetStatement"

      #Authenticate to server
      $Body = @{
        t = $ib_token
        q = $query
        v = $ib_version
      }


      try { $response = Invoke-WebRequest $init_url -Body $Body -Method 'POST' } catch { Write-Host @colors $_.Exception.Response.StatusCode.Value__ $_.Exception.Response.StatusCode }


      [xml]$ib_ref = $response.Content

      $status = $ib_ref.FlexStatementResponse.status
      $errorCode = $ib_ref.FlexStatementResponse.ErrorCode
      $errorMessage = $ib_ref.FlexStatementResponse.ErrorMessage

      if ($status -eq "Fail") {
        Write-Host "$errorCode $status $errorMessage" @colors
      }

      else {

        # Display IB Response Code
        # $ib_ref.FlexStatementResponse.ReferenceCode

        #Retrieve statement data
        $Body = @{
          q = $ib_ref.FlexStatementResponse.ReferenceCode
          t = $ib_token
          v = $ib_version
        }
        $response = Invoke-WebRequest $getdata_url -Body $Body -Method 'POST'
        [xml]$xml = $response.Content

        #TCF
        if ($xml.FlexQueryResponse.type -eq "TCF") {
          $result = $xml.FlexQueryResponse.FlexStatements.FlexStatement.TradeConfirms.TradeConfirm
        }

        #AF
        if ($xml.FlexQueryResponse.type -eq "AF") {
          $result = $xml.FlexQueryResponse.FlexStatements.FlexStatement.ChangeInDividendAccruals.ChangeInDividendAccrual
        }

        #Print result
        return $result
      }
    }
  }
  else {
    Read-Host -Prompt "`nPlease provide token" | Out-File $path\IbToken.txt -Force
    Write-Host "`nYou can now run this with -Query to get report information" -ForegroundColor Green
    Write-Host "If you need to change the token, please run 'Get-IbReport -token' again`n" -ForegroundColor Green
  }
}
Export-ModuleMember -Function Get-IbReport