PowerShell を使用して Authorize.Net トランザクションと QuickBooks を照合する方法



CData Cmdlets for Authorize.Net および QuickBooks を使用すると、PowerShell から各データソースにライブアクセスできます。これにより、トランザクションの照合などの定期タスクを簡単に自動化できます。本記事では、CData Cmdlets を PowerShell で使用して Authorize.Net と QuickBooks 間のトランザクションを照合する方法を説明します。

Authorize.Net への接続


Authorize.Net に接続するには、以下の接続プロパティが必要です。これらの値は、Merchant アカウントにログイン後、Security Settings -> General Settings ページで取得できます。

  • UseSandbox:トランザクションの処理に使用する Authorize.Net API を指定します。本番アカウントを使用する場合、このプロパティは空のままにします。開発者テストアカウントを使用する場合は、'TRUE' に設定します。
  • LoginID:決済ゲートウェイアカウントに関連付けられた API ログイン ID です。このプロパティは、Web サイトトランザクションの送信を認可されていることを認証するために使用されます。この値は、Merchant Interface へのログインに使用するログイン ID とは異なりますのでご注意ください。
  • TransactionKey:決済ゲートウェイアカウントに関連付けられたトランザクションキーです。このプロパティは、Web サイトトランザクションの送信を認可されていることを認証するために使用されます。

必要な接続プロパティを取得したら、PowerShell で QuickBooks データにアクセスする基本的な手順は以下の3つです。

  1. モジュールをインストールします。

    Install-Module AuthorizeNetCmdlets
  2. Authorize.Net に接続します。

    $authorizenet = Connect-AuthNet  -LoginId $LoginId -TransactionKey $TransactionKey

    Cmdlets を初めて使用する場合、インストールのライセンス認証を求められます。
    30日間の無料トライアルを有効にするには 'TRIAL' と入力してください。

  3. 期間の開始日と終了日に基づいて Batches テーブルからデータを取得します。

    $batches =  Select-AuthNet -Connection $authorizenet -Table "SettledBatchList" -Where "SettlementTime >= '$AuthNetStartDate' AND SettlementTime <= '$AuthNetEndDate'"

QuickBooks への接続


ローカルの QuickBooks インスタンスに接続する場合、接続プロパティを設定する必要はありません。

リクエストは Remote Connector を通じて QuickBooks に送信されます。Remote Connector は QuickBooks と同じマシン上で動作し、軽量な組み込み Web サーバーを通じて接続を受け入れます。サーバーは SSL/TLS をサポートしているため、リモートマシンからの安全な接続が可能です。

初回接続時には、QuickBooks で Remote Connector を認可する必要があります。詳細はヘルプドキュメントの「はじめに」の章を参照してください。

必要な接続プロパティを取得したら、PowerShell で QuickBooks データにアクセスする基本的な手順は以下の3つです。

  1. モジュールをインストールします。

    Install-Module QuickBooksCmdlets
  2. QuickBooks に接続します。

    $quickbooks = Connect-QB

    Cmdlets を初めて使用する場合、インストールのライセンス認証を求められます。
    30日間の無料トライアルを有効にするには 'TRIAL' と入力してください。

  3. 期間の開始日と終了日、および顧客名に基づいて Credits、Invoices、Payments テーブルからデータを取得します。

    $invoices = Select-QB -Connection $quickbooks -Table Invoices -Where "CustomerName = '$CustomerName' AND IsPaid = 'False' AND Date >= '$QBStartDate' AND Date <= '$QBEndDate'"
    $credits = Select-QB -Connection $quickbooks -Table CreditMemos -Where "CustomerName = '$CustomerName' AND CreditRemaining > 0"
    $payments = Select-QB -Connection $quickbooks -Table ReceivePayments -Where "CustomerName = '$CustomerName' AND Date >= '$QBStartDate' AND Date <= '$QBEndDate'"

Authorize.Net と QuickBooks トランザクションの照合


Authorize.Net の Batches テーブルと QuickBooks の Invoices、CreditMemos、ReceivePayments テーブルからデータを収集したら、トランザクションの照合を行う準備が整いました。Authorize.Net から返されたバッチを反復処理し、各バッチに関連するすべてのトランザクションを Authorize.Net から取得します。トランザクションを収集したら、関連するアカウントを反復処理し、各トランザクションのステータスを確認します。トランザクションが正常に決済された場合は、照合された請求書の合計金額に加算します。トランザクションが返金として決済された場合は、照合されたクレジットの合計金額に加算します。

トランザクションを反復処理する際、QuickBooks の ReceivePayments テーブル(照合された請求書用)および Checks テーブル(照合されたクレジット用)にプッシュするための支払いまたはクレジット情報を収集します。以下のスクリプトは必ずしも完全ではありませんが、上記のプロセスを示し、CData Cmdlets for Authorize.Net および QuickBooks の有用性を紹介しています。

#Authorize.Net バッチを反復処理
foreach ($batch in $batches) {

  $batchid = $batch.BatchId

  #このバッチの支払いを検索
  $payment = $payments | Where-Object ReferenceNumber -like "*-$batchid"
  if ($payment) {
    continue
  }

  #このバッチの Authorize.Net トランザクションを検索
  $transactions = Select-AuthNet -Connection $authorizenet -Table "TransactionList" -Where "BatchId = '$batchid'"

  #アカウントを定義
  $accounts = @{
    'one' = "Bank Accounts:Account1";
    'two' = "Bank Accounts:Account2";
  }

  #アカウントを反復処理
  foreach ($e in $accounts.GetEnumerator()) {

    $batchref = "$($e.Name)-$batchid";
    $batchaccount = $e.Value;

    $invoice_appliedto = '';
    $invoice_nomatch = '';

    $credit_appliedto = '';
    $credit_nomatch = '';

    $batch_invoice_total = 0
    $batch_credit_total = 0

    $matched_invoice_total = 0
    $matched_credit_total = 0

    #トランザクションを反復処理
    foreach ($transaction in $transactions) {

      #トランザクションをアカウントにマッチング
      if ($e.Name -eq 'one') {
        if ($transaction.AccountType -ne 'Account1') {continue}
      } else {
        if ($transaction.AccountType -eq 'Account2') {continue}
      }

      #決済金額を取得
      $amount = $transaction.SettleAmount

      #トランザクションは決済されましたか?返金されましたか?
      switch ($transaction.TransactionStatus) {

        "settledSuccessfully" {

          $batch_invoice_total += $amount;

          $invoice = $invoices | Where-Object POnumber -eq $transaction.InvoiceNumber
          if (($invoice | Measure-Object).Count -gt 1) {
            $invoice = $invoice[0]
          }

          if (!$invoice) {
            $invoice_nomatch += " $($transaction.InvoiceNumber)"
            continue
          }

          if ($amount -gt $invoice.Amount) {
            $amount = $invoice.Amount
          }

          $matched_invoice_total += $amount

          #QuickBooks 用の請求書行を準備
          $invoice_appliedto += "<Row>"
          $invoice_appliedto += "<AppliedToPaymentAmount>$amount</AppliedToPaymentAmount>"
          $invoice_appliedto += "<AppliedToRefId>$($invoice.ID)</AppliedToRefId>"
          $invoice_appliedto += "<AppliedToTxnType>Invoice</AppliedToTxnType>"
          $invoice_appliedto += "</Row>`r`n"

          #マッチした請求書をリストから削除
          $invoices = $invoices | Where-Object ID -ne "$($invoice.ID)"
        }

        "refundSettledSuccessfully" {

          $batch_credit_total += $amount;

          $credit = $credits | Where-Object POnumber -eq $transaction.InvoiceNumber
          if (($credit | Measure-Object).Count -gt 1) {
            $credit = $credit[0]
          }

          if (!$credit) {
            $credit_nomatch += " $($transaction.InvoiceNumber)"
            continue
          }

          if ($amount -gt $credit.Amount) {
            $amount = $credit.Amount
          }

          $matched_credit_total += $amount

          #マッチしたクレジットメモをリストから削除
          $credits = $credits | Where-Object ID -ne "$($credit.ID)"

          $pmt = @{
            "Payee"                 = "CRM Customer"
            "Account"               = $batchaccount
            "Date"                  = $batch.SettlementTime
            "ExpenseItemAggregate"  = "<CheckExpenseItems><Row><ExpenseAccount>Accounts Receivable</ExpenseAccount><ExpenseAmount>$($credit.Amount)</ExpenseAmount></Row></CheckExpenseItems>"
            "ApplyCheckToTxnId"     = $credit.ID
            "ApplyCheckToTxnAmount" = $amount
            "Memo"                  = "BATCH $batchref [REFUND]"
          }

          #QuickBooks に新しい小切手を追加
          if (!$TestMode) {
            Add-QB -Connection $qb -Table "Checks" -Columns ([array]$pmt.Keys) -Values ([array]$pmt.Values)
          }
        }

        default {
          Write-Output "UNSUCCESSFUL TRANSACTION (IGNORED): $($transaction.InvoiceNumber) `$$($transaction.SettleAmount)"
        }
      }
    }

    #請求書金額が一致しない場合
    $batchmemo = "BATCH $batchref"
    if ($batch_invoice_total -ne $matched_invoice_total) {
      $batchmemo = "BATCH $batchref ***UNBALANCED*** [`$$($batch_invoice_total - $matched_invoice_total)] $invoice_nomatch"
    }

    #クレジット金額が一致しない場合
    if ($batch_credit_total -ne $matched_credit_total) {
      $batchmemo = "BATCH $batchref ***UNBALANCED*** [`$$($batch_credit_total - $matched_credit_total)] $credit_nomatch"
    }

    #支払いを作成して QuickBooks に追加
    if ($batch_invoice_total -ne 0) {
      if ($invoice_appliedto -ne '') {
        $invoice_appliedto = "<ReceivePaymentsAppliedTo>$invoice_appliedto</ReceivePaymentsAppliedTo>"
      }
      $pmt = @{
        "ReferenceNumber"           = $batchref
        "CustomerName"              = "CRM Customer"
        "Date"                      = $batch.SettlementTime
        "Amount"                    = $batch_invoice_total
        "DepositToAccountName"      = $batchaccount
        "AppliedToAggregate"        = $invoice_appliedto
        "AutoApply"                 = if ($invoice_appliedto -ne '') {"Custom"} else {"FutureTransactions"}
        "Memo"                      = $batchmemo
      }

      if (!$TestMode) {
        $count = Add-QB -Connection $qb -Table "ReceivePayments" -Columns ([array]$pmt.Keys) -Values ([array]$pmt.Values)
      }
    }
  }
}

詳細情報と無料トライアル


CData PowerShell Cmdlets の詳細情報および30日間の無料トライアルのダウンロードについては、Cmdlets ページをご覧ください。いつでも世界レベルのサポートチームがお手伝いいたします。Cmdlets についてご質問がございましたら、お気軽にお問い合わせください。