工程の無人化による生産性向上
前々回記事と前回記事では、ワークフローシステムから「PayPal 請求システム」をコントロールする仕組みを紹介しました。これらの仕組み(ワークフローアプリ)には、フロー図の途中に自動工程(Addonサービス工程)が配置されています。つまり、請求案件がこれらの工程に流れ着く度に、
- 『PayPal請求書』を生成せよ(PayPal Create)
- 『PayPal請求書』を送信せよ(PayPal Send)
- 『PayPal請求書』の決済ステータスは何か?(PayPal Check)
今日では、この例のような「決済システム」(*1)に限らず、様々な情報システムの操作が自動化され、生産性向上が図られています。たとえば「Storageシステム」(*2)への見積書保存や、「表計算システム・データ管理システム」(*3)での商品マスタ管理などが代表的な例と言えるでしょう。
*1: PayPal, Stripe, etc. *2: Dropbox, Box, Google Drive, etc. *3 Google SpreadSheet, Kintone, etc.
<設定画面:Paypal Create>
<設定画面:Paypal Send>
<設定画面:Paypal Check>
#プロセスオーナーはAddon自動工程のプロパティを設定するだけで良くなった(プログラミング知識が必要なくなった)という点も普及要因
どの様な状態変化まで無人対応させるべきか
しかし工程の無人化は「メリットばかり」ではありません。たとえば前回記事では、電子請求書のステータスが『PAID』(支払い済み)になるまで確認し続ける(ループし続ける)という業務フローになっていました。
確かにヒトは介在しないので「確認作業」そのものには人的コストは発生しません。
しかしながら、もし「発注キャンセル」や「他の決済方法での送金」といった事象が発生しているのなら、場合によっては「出荷処理」という業務を止める必要があるかも知れません。場合によっては「売上計上」という処理にも修正が必要になってくるかも知れません。やはり「影響度×発生確率」が大きい状態変化ついては、業務プロセス定義として「想定外」のままにするのではなく、できるだけ「想定の範囲内」にしたい所です。
以下の業務プロセス定義では、比較的発生頻度の高い「CANCELLEDステータス」(キャンセル)について考慮されています。すなわち、支払いが拒否された場合などにアラートメールを発信する、という工夫が追加されています。
[Paypal請求書発行プロセス-キャンセル通知]
ヒトがやるべき仕事は限られる
業務フロー図を見れば明らかですが、[Paypal Check]工程は12時間おきに処理されます。- 『PayPal請求書』の決済ステータスは何か?(PayPal Check)
注目すべきはステータスが『CANCELLED』(支払いキャンセル)になった際に、自動的に確認ループを抜けアラートメールが発信される点です。
もちろん、アラートメールから「なぜキャンセルになったのか」までは分かりません。(1)発注自体がミスだったのか、(2)請求額が合意できていなかったのか、(3)銀行送金で対応してしまったのか、その〔理由確認〕は、ヒトの仕事(ヒューマン工程)として発生することになります。(第4工程)
API 時代の自動化
ちなみに、もし「PayPal 支払」ではなく「銀行送金」や「手渡し」で対応されるケースが多くなった場合、どうすれば良いのでしょう。発生件数が小数であれば、逐一手動で『PayPal請求書』を削除すれば良いかも知れません。しかしそれでもミスの発生は大きなリスクです。間違った『PayPal請求書』を削除してしまうとオオゴトにもなりかねません。そのような処理が多くなってきたあかつきには、業務プロセス定義を拡張し「削除リクエスト」が自動送信されるような「Addonサービス工程」を追加配置すべきです。
しかし、PayPal Invoicing API 側には「Cancel sent invoice」や「Mark invoice as paid」といったメソッドが用意されているものの、あらゆる「Addonサービス工程」がネット上から入手できるとは限りません。
<PayPal Invoicing API>
- Create draft invoice ← [PayPal Create]
- Send invoice ← [PayPal Send]
- Show invoice details ← [PayPal Check]
- Update invoice
- Send invoice reminder
- Delete draft invoice
- Cancel sent invoice
- Mark invoice as paid
- Mark invoice as refunded
- List merchant invoices
- Search for invoices
- Generate QR code
- Generate invoice number
その様なケースでは「Addonサービス工程」を自作することも選択肢の一つです。実際の自作方法はマニュアルを参照していただく必要がありますが、
- ミスが許されない処理、
- 効率化すべき処理、
▼「サービス工程」の自作例(PayPal Check)
<?xml version="1.0" encoding="UTF-8"?><service-task-definition> <label>PayPal Invoicing Status</label> <label locale="ja">PayPal 請求書 ステータス確認</label> <configs> <config name="conf_ClientId_Secret" required="true" form-type="TEXTAREA"> <label>A: Set CLIENT-ID and SECRET for PayPal-REST-API (2-lines)</label> <label locale="ja">A: PayPal-REST-API の Client ID と SECRET を2行に分けてセットしてください</label> </config> <config name="conf_DataIdB" required="true" form-type="SELECT" select-data-type="STRING_TEXTFIELD"> <label>B: Select STRING DATA for Paypal Invoice ID</label> <label locale="ja">B: Paypal Invoce ID が格納されている文字列型データを選択してください</label> </config> <config name="conf_DataIdC" required="true" form-type="SELECT" select-data-type="STRING_TEXTFIELD"> <label>C: Select STRING DATA for Paypal Invoice Status (update)</label> <label locale="ja">C: Paypal Invoce Status が格納される文字列型データを選択してください (更新)</label> </config> <config name="conf_DataIdD" required="false" form-type="SELECT" select-data-type="STRING_TEXTFIELD"> <label>D: Select STRING DATA for Payment Timestamp (update)</label> <label locale="ja">D: 支払タイムスタンプが格納される文字列型データを選択してください (更新)</label> </config> <config name="conf_DataIdE" required="false" form-type="SELECT" select-data-type="DECIMAL"> <label>E: Select NUMBER DATA for Payment Amount (update)</label> <label locale="ja">E: 支払金額が格納される数値型データを選択してください (更新)</label> </config> </configs> <script><![CDATA[ // PayPal Invoicing Status (ver. 20170603) // (c) 2017, Questetra, Inc. (the MIT License) //// == 工程コンフィグの参照 / Config Retrieving == var clientId_secret = configs.get( "conf_ClientId_Secret" ) + ""; var array_clientId_secret = clientId_secret.split("\n"); var clientId = array_clientId_secret[0]; var secret = array_clientId_secret[1]; var dataIdB = configs.get( "conf_DataIdB" ); var dataIdC = configs.get( "conf_DataIdC" ) + ""; var dataIdD = configs.get( "conf_DataIdD" ) + ""; var dataIdE = configs.get( "conf_DataIdE" ) + ""; //// == ワークフローデータの参照 / Data Retrieving == var paypalId = data.get( dataIdB ) + ""; //// == 演算 / Calculating == // Get OAuth Token with Client Credentials var uri = "https://api.paypal.com/v1/oauth2/token"; var response = httpClient.begin() .basic( clientId, secret ) .formParam( "grant_type", "client_credentials" ) .post( uri ); var oauthTokenObj = JSON.parse( response.getResponseAsString() ); var oauthToken = oauthTokenObj.access_token; // Show Invoice Details var uriDetail = "https://api.paypal.com/v1/invoicing/invoices/" + paypalId; var responseDetail = httpClient.begin() .bearer( oauthToken ) .get( uriDetail ); var paypalInvoiceObj = JSON.parse( responseDetail.getResponseAsString() ); var paypalInvoiceStatus = paypalInvoiceObj.status; //// == ワークフローデータへの代入 / Data Updating == retVal.put( dataIdC, paypalInvoiceStatus ); // DRAFT, SENT, PAID, etc if( dataIdD !== "" ){ if ( paypalInvoiceStatus == "PAID" ){ retVal.put( dataIdD, paypalInvoiceObj.payments[0].date ); } } if( dataIdE !== "" ){ if ( paypalInvoiceStatus == "PAID" ){ var amountValue = parseFloat( paypalInvoiceObj.payments[0].amount.value ); retVal.put( dataIdE, java.math.BigDecimal( amountValue ) ); } } ///retVal.put( "q_accessLog", responseDetail.getResponseAsString() ); // for debug ]]></script> <icon> iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABc0lEQVRYR+2WQW6CUBCG55cViUntDbxB7QmqOzMseoTqSWpPUnuDNoEXl9ygeILaG9AEwgqmeaQYxCoY+rQLZsPiwZv//cPM+0AXDlw4P3UCdhwYj8cD27ZvTJYlSZK17/thkSMXwMwjInoGoJ/GQ0QCIporpQJMp9OhZVnvRDQQkS8i0osmYwTgiojCNE1vwcyvAO6J6MXzvJnJzMXejuMsiehBRN60gFAriuP4ulwbk0J+XP8QkQ0cxxGdzPO8s7Zkkff/CDBp+bG9tw50ArqfsHOg6gAzLwA8Ft0hIk9KqUW1W5jZB3BX10UAJq7r+qVxnA/Ag4PoBAH6/hjWCciybLlarTZ/LqAu8aH12lF8ggNHS1C1vrEDTU/GzEdLULV+T8CFr+PPLZCIyFIpNW968jbv7QCJhoNerxcUmHQOJCvwL8uy0RZKAWhMMkrEJdfWIjLLobRspcbyfr9vlIyjKAr2sLxNPdt+e1YO/E1sJ+AbULfr6IobKF4AAAAASUVORK5CYII= </icon> </service-task-definition>
<モデリング動画8倍速>
[雛形ダウンロード (無料)]
- 業務テンプレート:Paypal請求書発行プロセス-キャンセル通知
- Addon-XML:PayPal Create、PayPal Send、PayPal Check
- 第525話:自動工程から OAuth2 リクエストを送出させる方法 (2017-03-06)
- 第527話:自動工程で PayPal Invoicing API を呼ぶ (2017-03-21)
- 第529話:PayPal業務のサブルーチン化 (2017-04-03)
- M415 自動工程: 業務プロセス定義で利用可能な自動工程を追加する (使い方)
- M207 データ項目: データ項目の初期値があらかじめ入力されているように設定する (使い方)
- M401 業務の流れ: 申請と差戻対応の工程を分け “手戻り” をモニタリングしやすいように設定する (使い方)
- M416 自動工程: 業務プロセス定義で利用可能な自動工程を自作する (使い方)
[英文記事 (English Entry) ]
0 件のコメント :
コメントを投稿