こんにちは。今回のSAP探検記では、SAP Build Process AutomationのワークフローをMicrosoft Office Outlookから起動し、なんちゃってイベント駆動ワークフローを実装してみた内容をお伝えします。間違い等あればコメントでご指摘ください。
はじめに
昨年末、SAP Buildのハンズオンイベントの中で、請求書の承認プロセスをSAP Build Process Automationを用いて実装する場面がありました。
その業務プロセスの中では、財務部の社員の元に届いた請求書を、SAP Build Appsを用いて作成した、写真撮影機能やファイルのアップロード機能を持ったアプリケーションを通してSAP Build Process Automationにアップロードし、承認プロセスを走らせるという実装をしていました。上図に当てはめていえば、Step1-> Step2の間に、「アプリを使って手作業でアップロードする」という作業が挟まっていたのです。
この業務プロセスを自分自身で実装しながら思っていたことがありました。
『正直トリガの部分、もっと自動化の余地があるかも、、』
請求書のpdfファイルがメールの添付ファイルとして送られてくるのであれば、別途用意したアプリケーションを用いてSAP Build Process Automation上にアップロードするのは二度手間になってしまっているのです。
もちろん、請求書がpdfの形で送られてくるとは限りませんし、もしかしたら紙で送られてくるかもしれません。そういった場合に備えて、スキャン機能を持ったアプリケーションを作って、ある程度手作業の部分を残しておくことは必要悪であるとも考えられます。
しかし、今回は技術検証の意味も込めて、自動化に挑戦してみます。
目標点・構想
今回の検証の目的は、請求書のpdfファイルを含むメールが到着したときにこのワークフローを起動させる、すなわち「イベント駆動」で請求書の承認プロセスを開始することです。そのために最初に思いついた方法が、Office365ソフトウェアに組み込んだマクロからSAP Build Process Automationのワークフローを叩くことでした。
実装
今回のシナリオでは、以下の2つの部分でプロセスを実装する必要があります。
- SAP Build Process Automation
- Microsoft Office365 Outlook
SAP Build Process Automationのワークフロー
こちらの部分の実装についても近々ブログを書ければと思いますので、書き次第リンクを貼ります。
ポイントとなる点は以下の通りです。
- 【プロセス】の入力に、”recipient” と “downloadPath” を設定する
- Outlook SDKを用いて自動化を作成する
プロセス入力の設定
メールの受信者を意味する “recipient” と、請求書のpdfファイルのダウンロードパスを意味する “downloadPath” をプロセスに対する入力項目として設定します。これにより、Outlookのマクロ側からこれらの情報を受け取れるようになります。
Outlook SDKによる自動化の実装
実際に自動化を実行するDesktop Agentは、この自動化の設計内容に基づいて、ホストマシン上で自動化を実行します。具体的なステップは以下の通りです。
- プロパティ “recipient” により請求書の受信者のメールアドレスを受け取っているため、そのメールアドレスの受信フォルダを開きます。
- 特定の条件(今回はInvoiceを件名に含むこと)をもとにメールを検索し、
- 添付ファイルをダウンロードします。この際、保存先は プロパティ “downloadPath” により指定されたパスに設定します。
- その後、請求書画像からの情報の抽出ステップが走りますが、今回は割愛し、別のブログで紹介できればと思います。
なお、Desktop Agentのインストールについてはこちらのチュートリアルを参照してください。
Install and Set Up the Desktop Agent 3 | Tutorials for SAP Developers
Microsoft Office Outlookのマクロ
Outlook側では、新規のメールを受信した際に以下のような点をチェックします。
- 件名に「Invoice」が含まれているか
もしも含まれていた場合、前述のSAP Build Process Automationのワークフローを起動します。
起動する方法は次の通りです。
イベント発火のハンドラ
Microsoft Office365 Outlookにおいて「新規のメールを受信したとき」というイベントハンドラは、
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
というものがあらかじめ用意されており、これを今回は利用します。具体的には、この関数の中にSAP Build Process AutomationのAPIを叩くコードを記述していくイメージになります。このハンドラは、ThisOutlookSession というモジュールの中に用意されています。
エンドポイント
以下のSAP Build Process AutomationのAPIエンドポイントに向け、POSTリクエストを送信します。
https://{spa-api-gateway host}/workflow/rest/v1/workflow-instances
ここで、{spa-api-gateway host} の部分については、次のブログを参考に各自の環境に適した値を代入してください。サービスキーの内、”endpoints” -> “api” に格納された値になります。
送信するべきPOSTリクエストの内容については、次の通りです。
リクエストヘッダ
"Authorization": Token
"Content-Type": "application/json"
"Accept": "*/*"
"Accept-Encoding": "gzip, deflate, br"
"Connection": "keep-alive"
なお、ここでのTokenはOAuth2.0のトークンを格納しています。トークンの取得方法としては、先ほどのブログに小さめに記述されていますので、それを参照してください。相応の実装をすれば自動で取得もできそうですが、今回はpostmanを経由して取得しています。
リクエストボディ
{
"definitionId": "{SAP Build Process Automation 定義ID}",
"context": {
"recipient": ol.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress,
"downloadpath": "C:ProcessAutomationOutlookSDK"
}
}
“definitionId” には、SAP Build Process Automationのデプロイ後の定義IDを記述します。調べ方は例のブログに記述があります。
そして “context” の中に、実際にSAP Build Process Automationのプロセスに渡したいデータを格納しています。
- “recipient”:前後のコードがないとわかりにくいですが、自分のメールアドレスを取得しています。
- “downloadpath”:請求書のpdfの保存先を指定しています。Desktop Agentにより、エージェント自身が動いているホストマシン上の指定フォルダにpdfが格納されます。
コード全体
最後に、コードの全体像を示します。
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim objId As Object
Set myNamespace = GetNamespace("MAPI")
Set objId = myNamespace.GetItemFromID(EntryIDCollection)
If InStr(objId.Subject, "Invoice") Then
MsgBox "Triggering Invoice Approval Workflow..."
Dim httpReq As XMLHTTP60
Set httpReq = New XMLHTTP60
Dim Token As String
Token = "Bearer {Postmanで取得したトークン}"
Dim SPAPayload As Object
Set SPAPayload = New Dictionary
Dim context As Object
Set context = New Dictionary
Set ol = CreateObject("outlook.application")
context.Add "recipient", ol.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress
context.Add "downloadpath", "C:ProcessAutomationOutlookSDK"
SPAPayload.Add "definitionId", "{SAP Build Process Automaiton 定義ID}"
SPAPayload.Add "context", context
With httpReq
.Open "POST", "https://{spa-api-gateway URL}/workflow/rest/v1/workflow-instances"
.setRequestHeader "Authorization", Token
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Accept", "*/*"
.setRequestHeader "Accept-Encoding", "gzip, deflate, br"
.setRequestHeader "Connection", "keep-alive"
.Send JsonConverter.ConvertToJson(SPAPayload)
End With
MsgBox httpReq.responseText
Set httpReq = Nothing
End If
End Sub
デモ
おわりに
今回はMicrosoft Office365 Outlookに組み込んだマクロスクリプトからSAP Build Process Automationのプロセスを実行してみるという内容でお送りしました。実際に使うとなるとコンプライアンスなどの観点からなかなか難しいかもしれませんが、技術的に可能であることが確認できました。