第542話:PayPal Invoice 連携で、ラクラク請求業務(3)

2017年7月3日

工程の無人化による生産性向上

前々回記事前回記事では、ワークフローシステムから「PayPal 請求システム」をコントロールする仕組みを紹介しました。

これらの仕組み(ワークフローアプリ)には、フロー図の途中に自動工程(Addonサービス工程)が配置されています。つまり、請求案件がこれらの工程に流れ着く度に、
  • 『PayPal請求書』を生成せよ(PayPal Create)
  • 『PayPal請求書』を送信せよ(PayPal Send)
  • 『PayPal請求書』の決済ステータスは何か?(PayPal Check)
といった「リクエスト」がワークフローシステムから自動的に発信されます。言い換えれば「電子請求書の生成」「電子請求書の送信」「電子請求書のステータス確認」といった経理業務が「無人化」されています。(PayPal Invoicing API との REST/OAuth2 通信)

今日では、この例のような「決済システム」(*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)
そして「PayPal からのレスポンス」から、当該電子請求書のステータスが自動的に上書きされます。もしステータスが『PAID』(支払い済み)になっていれば正常に終了します。(そして、この例では単に終了していますが、この後に「出荷する」や「サービスを提供する」といった工程が続くケースや別プロセスが起動されるケースも想定されます)


注目すべきはステータスが『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サービス工程」を自作することも選択肢の一つです。実際の自作方法はマニュアルを参照していただく必要がありますが、
  • ミスが許されない処理、
  • 効率化すべき処理、
なのであれば、積極的に検討すべきかもしれません。そして、もし「他社でも使ってもらってイイよ」という広い心をお持ちなのであれば、是非その設定ファイル(Addon-XML)を世界公開していただければと思います。


▼「サービス工程」の自作例(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倍速>


[雛形ダウンロード (無料)]
<類似プロセス>
≪関連記事≫

[英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿