第460話:顧客マスタを「法人番号システム Web-API」でクリーニング

2015年12月7日
『会社名(商号)が変わります』
『グループ再編で取引会社が変わります』

取引先から「社名変更の通知ハガキ」が届くことは多い。しかし、この手のハガキだけを頼りに「取引先マスタ」のメンテナンスを行う、、、と言うのは、実に心もとない。

2015年12月1日、日本政府は『法人番号システム』の『Web-API 機能』を稼働させた。

もし、アプリケーション側が「取引先の法人番号」(13桁数字)を把握していれば、取引先の商号や所在地等の登記情報をいつでも参照できる。加えて「商号変更」「吸収合併」「会社解散」などの変化情報(処理区分)についても検知できるようになったのだ。


以下のワークフロー定義は、この『Web-API 機能』を活用し「商号変更」を自動検知する仕組みだ。

ここでは、ワークフロー基盤に「取引先マスタ」(Business-Connection.xml)が存在していることを前提にしている。つまり、「取引先マスタ」に登録されている商号が登記情報と同一であるかを確認している。毎週日曜日の朝に自動実行される設定だ。

[取引先マスタ登録商号の自動チェック]



取引先が多くなってくると「取引先マスタ」のメンテナンス作業もバカにならない。

場合によっては「知らない間に取引先会社が消滅していた」なんて事もあるだろう。このワークフロー定義は、何といっても、完全に無人化されている点が秀逸だ。

ただこの例で注意したいのは「1回の Web-API リクエスト」が、1つの「法人番号」について行われている点だ。Questetra で稼働させる場合、「総ステップ数:500まで」の制限がある。つまり「取引先マスタ」が約160社までであれば問題なく活用できるが、それ以上が想定される場合には別途工夫が必要となる。(次回に続く)

PS
なお、Web-API へのリクエスト部分には「アプリケーションID」が必要となる。この「アプリケーションID」は各社にて申請が必要だ。業務テンプレート(.qar)の[リクエスト送信イベント]では「APPLICATIONID」と設定されているが、稼働前に書き換える必要がある。

PS2
なお、v10.4(2015年11月2日)までの Questetra では『XML 形式のレスポンス』が格納できない状態だった。(つまり "MIME type: application/xml なレスポンス" が想定されていない状態だった)。しかし、v10.4.1(2015年12月7日)以降は『XML 形式のレスポンス』も[文字列型データ]に格納できるようになっている。

[取引先マスタ登録商号の自動チェック:「1. Confirm / 確認」画面]


▼[リクエスト送信イベント]の設定サンプル
  • アクセスURL: https://api.houjin-bangou.nta.go.jp/1/num [固定値]
  • HTTP Method: GET [固定値]
  • 送信パラメータ:
    • id: APPLICATIONID [固定値]
    • number: {requestId}
    • type: 12 [固定値] (ファイル形式 XML )
    • history: 0 [固定値] (変更履歴を含まない)

▼自動工程「Count # of clientsXML」のサンプルコード(サーバーサイド)
//// == ワークフローデータの参照 / Retrieving ==
// [共通ファイル]に登録されている XML ファイル (M319)
// returns "List<ItemView>" 
optionsList = itemDao.findAll("Business-Connections.xml", true);

//// == 演算 / Calculating ==
var numOfClients = 0; // javascript number
numOfClients = optionsList.size(); // 登録されている取引先数

var clientsCorporateNumbers = ""; // javascript string
var clientsCorporateNames = ""; 
for (j = 0; j < numOfClients; j++){
  clientsCorporateNumbers += optionsList.get(j).getValue().substr(7, 13) + "¥n";
  clientsCorporateNames += optionsList.get(j).getDisplay() + "¥n";
}

//// == ワークフローデータへの代入 / Updating ==
retVal.put("1", java.math.BigDecimal(numOfClients) ); // この例ではループ回数と同じ
retVal.put("2", java.math.BigDecimal(numOfClients) ); // numOfClients == numOfLoops
retVal.put("3", clientsCorporateNumbers );
retVal.put("4", clientsCorporateNames );

retVal.put("5", java.math.BigDecimal(0) ); // i=0
retVal.put("11", "vvv Check Log vvv¥n" ); // null 状態を解除

if( numOfClients == 0 ){
  retVal.put("11", "Business-Connections.xml: no such file ?" ); 
}

▼自動工程「Request Prep」のサンプルコード(サーバーサイド)
//// == ワークフローデータの参照 / Retrieving ==
var i = 0; // javascript number
i = data.get("5") - 0;

var clientsCorporateNumbers = ""; // javascript string
var clientsCorporateNames = ""; 
clientsCorporateNumbers = data.get("3") + ""; // (multi-lines)
clientsCorporateNames = data.get("4") + ""; 

//// == 演算 / Calculating ==
var iRequestCorporateNumbers = ""; // javascript string
var array = clientsCorporateNumbers.split("¥n");
iRequestCorporateNumbers = array[i]; 

var iCorporateNames = ""; // javascript string
var array2 = clientsCorporateNames.split("¥n");
iCorporateNames = array2[i];

//// == ワークフローデータへの代入 / Updating ==
retVal.put("6", iRequestCorporateNumbers );
retVal.put("7", iCorporateNames );

▼自動工程「Respose Chk / i++」のサンプルコード(サーバーサイド)
//// == ワークフローデータの参照 / Retrieving ==
var i = 0; // javascript number
i = data.get("5") - 0;
var iCorporateNames = ""; // javascript string
iCorporateNames = data.get("7") + "";
var diffLog = ""; // javascript string
diffLog = data.get("11") + "";

var iResponseTmp = ""; // javascript string
iResponseTmp = data.get("8") + ""; 
iResponseTmp = iResponseTmp.replace(/^<¥?xml¥s+version¥s*=¥s*(["'])[^¥1]+¥1[^?]*¥?>/, "");
// E4X bug 336551
var iResponseXML = new XML(iResponseTmp); // javascript xml

//// == 演算 / Calculating ==
var iResponseCorporateNames = ""; // javascript string
iResponseCorporateNames += iResponseXML.corporation[0].name;

diffLog += iCorporateNames + " is " + iResponseCorporateNames; 

if(iCorporateNames == iResponseCorporateNames){
  diffLog += ": ok" + "¥n";
} else {
  diffLog += ": NG" + "¥n";
}

// for XML debug
//diffLog += " lastUpdateDate: " + iResponseXML.lastUpdateDate + "¥n"; 
//diffLog += " count: " + iResponseXML.count + "¥n"; 
//diffLog += " divideNumber: " + iResponseXML.divideNumber + "¥n"; 
//diffLog += " divideSize: " + iResponseXML.divideSize + "¥n"; 
//diffLog += " sequenceNumber - " + iResponseXML.corporation[0].sequenceNumber + "¥n"; 
//diffLog += " process - " + iResponseXML.corporation[0].process + "¥n"; 
//diffLog += " updateDate - " + iResponseXML.corporation[0].updateDate + "¥n"; 
//diffLog += " changeDate - " + iResponseXML.corporation[0].changeDate + "¥n"; 
//diffLog += " name - " + iResponseXML.corporation[0].name + "¥n"; 

//// == ワークフローデータへの代入 / Updating ==
retVal.put("5", java.math.BigDecimal(i + 1) );
retVal.put("10", iResponseCorporateNames );
retVal.put("11", diffLog );

<データ項目一覧画面>


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

[英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿