第557話:様々なAPIと通信する全自動請求フロー

2017年10月16日

業務:大量の月末請求

月末のカード請求業務が、ヌケモレなく実施されるようになった!

それぞれのお客様への「請求金額」について、、、いつ誰が入力し、いつ誰が承認したのか、全てがリアルタイムに捕捉できるようになった。しかも、クレジット会社 API (Stripe API)にアクセスしてくれる「自動工程」のおかげで、ワークフローシステムからダイレクトにカード課金される。つまり、経理システムへの「二重入力」といった二度手間もなくなった。

課題:人間依存の低減

しかし、、、この業務プロセス(第556話)は、いまだ「人間のデータ入力」に依存している。つまり、肝心の「課金額」の入力については人間(担当営業)が担当している。

たしかに、「お客様情報」は自動でセットされているし、「カード請求コード」(Stripe CustomerID)だって予めセットされている。更には「請求作業の一覧」もヌケモレなく引き受け待ちリストに表示されているので、複数人で協調して請求作業を行うこともカンタンになっている。つまり「入力の省力化」については、かなり高いレベルで実現できているとは思うのだが。。。

もっとも「課金額」(請求額)の情報は、ワークフローシステムから見て「外部システム」にあたる「売上管理システム」にある。なんとかして売上集計を自動取得させることはできないものか? (「APIエコノミー」が叫ばれる今日、業務プロセス改善の行きつく先は「無人化」だと思う。。。)

[クレジットカード課金プロセス-再帰呼出&全自動]



解決:売上集計システムとの自動連携

業務プロセス管理活動(BPM活動)に取り組んで1年もすれば、「入力作業の省力化」という目標を、「入力作業の無人化」(人間の排除)に昇華させたくなるものです。

つまり、定義したワークフロー図(プロセス図)にある『ヒューマン工程』(水色四角アイコン)を、全て『サービス工程』(灰色四角アイコン:自動工程)に置き換えられれば、、、「人間のミス」や「人間の処理スピード」を想定する必要が無くなります。その結果、たとえば承認や確認といったダブルチェック工程も不要となり、たとえば休日や営業時間外であっても滞留することがなくなります。延いては、ビジネスの急拡大期(スケールアウト期)に至って「人材不足」に陥る心配もなくなることでしょう。


ここで紹介した業務プロセス定義は、第556話の『クレジットカード課金プロセス』(Stripe カード課金業務)をアレンジし、全工程を無人化したものです。

基本的には、
  • [1.課金額の入力]というヒューマン工程が[販売実績の取得]という自動工程と[1.請求先情報の編集]というヒューマン工程に分解(分割)され、
  • [2.課金承認]というヒューマン工程が[2.課金モニタ]というヒューマン工程に置き換えられています。
一見すると『ヒューマン工程』が減っていないようにも見えますが、新しく配置されたヒューマン工程には締切時刻が設定され、締切時刻になれば自動的に次の工程に進捗する設定となっています。つまり、情報に変化があった場合にのみ操作するヒューマン工程になっており、平時においては人間は関与しません。(タイマー境界イベントのあるヒューマン工程)

考察:完全自動化で注意すべき事

BPMシステム/ワークフローシステムにおける自動処理(自動工程)は、案件進捗をコントロールするワークフローエンジン(サーバサイド)によって実現されます。

この例では新たに毎月の「課金額」(請求額)が自動工程において自動取得されるようになっています(販売実績の取得)。難点としては、売上管理システムと通信するスクリプトが必要になってくるところでしょう。すなわち、プログラミング知識が必要となってきます。また売上管理システム側にも「金額をレスポンスするAPI」が実装されている必要もあります。
※「売上管理システム」としては、いわゆる「売上管理クラウド」だけでなく、「EDIシステム」といった商取引プラットフォーム、さらには「Google Sheets」や「Cybozu kintone」といった簡易データベースなどが想定されます。(EDI: Electronic Data Interchange)

なお、全ての工程が自動化され、業務プロセス全体が無人処理されるようになった場合にも、人間の関与は重要です。

すなわち、(1)人間がきちんとモニタリングすること、(2)自動処理エラー時に人間がリカバリーするフローを考えておくこと、が重要といえるでしょう。たとえば、この例では「課金実績の取得日時」から「予定通知日時」が[2.課金モニタ]を操作できる時間になっています。これは何らかのエラーが検知された際に「処理中止」などの措置を取ることが想定されています。


▼スクリプト工程『販売実績の取得』の設定例 (サーバサイド JavaScript)
/// Sum of a series of numbers in a Google Spreadsheet (ver. 20171011)
/// (c) 2017, Questetra, Inc. (the MIT License)

//// == OAuth2 config ==
// Authorization Endpoint URL: https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force
// Token Endpoint URL: https://accounts.google.com/o/oauth2/token
// Scope: https://www.googleapis.com/auth/spreadsheets
// Consumer Key: (via Google Developers Console)
// Consumer Secret: (via Google Developers Console)

var token = httpClient.getOAuth2Token( "Google-Sheets" );


//// == ワークフローデータの参照 / Data Retrieving ==
var driveFileId = "zxcv123EXAMPLE321vnm";
var monthYear = engine.findDataByName( "販売実績の取得日時" ).toString() + ""; // "2017-12-30 12:34"
    monthYear = monthYear.slice(0,7); // "2017-12"
var customerEmail = engine.findDataByName( "Email" ) + ""; // "bill@example.com"
var sheetRange = "A:C"; // A:customerEmail, B:amount, C:description


//// == 演算 / Calculating ==
// preparing for API Request
var apiRequest = httpClient.begin(); // HttpRequestWrapper
// com.questetra.bpms.core.event.scripttask.HttpClientWrapper

// preparing for API Request (OAuth2 Token)
apiRequest = apiRequest.bearer( token );

// preparing for API Request (Path parameters)
var apiUri = "https://sheets.googleapis.com/v4/spreadsheets/";
    apiUri += driveFileId;
    apiUri += "/values/";
    apiUri += monthYear;
    apiUri += "!";
    apiUri += sheetRange;

// preparing for API Request (Query parameters)
// (no set)

// preparing for API Request (JSON Body, Form Parameters)
// (no set)

// Request to the API (GET)
var response = apiRequest.get( apiUri ); // HttpResponseWrapper
var httpStatus = response.getStatusCode() + "";
var accessLog = "---GET request--- " + httpStatus + "\n";
accessLog += response.getResponseAsString() + "\n";
var responseObj = JSON.parse( response.getResponseAsString() );

// Retrieve Properties from Response-JSON
var sumOfSales = 0;
var listOfCharge = "";
if( httpStatus === "200" ){
  for( var i = 0; i < responseObj.values.length; i++ ){
    if( responseObj.values[i][0] === customerEmail ){
      sumOfSales += parseFloat( responseObj.values[i][1] );
      listOfCharge += responseObj.values[i][2] + ", ";
    }
  }
}

// Error Handling
// (no action)


//// == Data Updating / ワークフローデータへの代入 ==
engine.setDataByNumber( "28", listOfCharge );
engine.setDataByNumber( "8", java.math.BigDecimal( sumOfSales ) );
[クレジットカード課金プロセス-再帰呼出&全自動:「2.課金モニタ」画面]
<データ項目一覧画面>
[雛形ダウンロード (無料)] <類似プロセス> ≪関連記事≫ [英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿