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

2015年12月14日
前回は『法人番号システム』(Web-API 機能)との連携事例を公開した。

◇2015-12-07: 顧客マスタを「法人番号システム Web-API」でクリーニング

この業務プロセスは、「取引先の商号が変更されていないか」を、毎週自動チェックする仕組みだ。日曜日の朝6時に自動的に開始される。人間は、「顧客マスター」(XML)に修正すべき点が発生したことを、自然と検知できる。

ただ「全ての取引先が法人番号を持っている」と言う前提に立っている。つまり、全ての取引先について、1件1件「Web-API 機能」に問い合わせているのだ。現実には『法人番号』を持たない取引先(個人事業主や海外企業など)も存在する。


以下の業務プロセス定義では、「顧客マスター」にダミー番号「9999999999999」(13桁の9)の存在を許容する。

すなわち、海外顧客など法人番号を持たない取引先は「13桁の9」を登録するというルールだ。また『Web-API 機能』へのリクエストも、10件ずつ行う仕組みになっている。


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



[スクリプト工程]などの自動工程を活用すると、「無人化」「高速化」などの大きなメリットがある。

しかし一方で、「自動化」の程度に比例して、「HTTP 通信の知識」や「JavaScript の知識」などが必要となってくる。すなわち、「メンテナンスできる人が限られてしまう」という新たなリスクが発生してしまう。

この例では、2つの[スクリプト工程]において、50行程度と100行程の JavaScript がセットされている。

確かにそれほど複雑なスクリプトではない。また、この例に限って言えば「修正が必要となるケース」は想定しづらいだろう。が、しかし、それでも、あらかじめワークフロー運用における「リスク」について、しっかり考察したうえで活用すべきなのだろう。

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

▼スクリプト工程『Count # of clientsXML』の設定サンプル (サーバサイド JavaScript)
//// == ワークフローデータの参照 / 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 = "";  
var iRequestCorporateNumbers = ""; // javascript string 
var iCorporateNames = ""; 

for (j = 0; j < numOfClients; j++){ 
  clientsCorporateNumbers += optionsList.get(j).getValue().substr(7, 13) + "\n"; 
  clientsCorporateNames += optionsList.get(j).getDisplay() + "\n"; 

  if ( j < 10 ){ // 最大10件分をセット(法人番号はコンマで接続) 
    if ( optionsList.get(j).getValue().substr(7, 13) != "9999999999999" ){ 
      iRequestCorporateNumbers += optionsList.get(j).getValue().substr(7, 13) + ","; 
      iCorporateNames += optionsList.get(j).getDisplay() + "\n"; 
    } 
  } 
} 
if ( iRequestCorporateNumbers == "" ){ // 法人番号が一つもセットされなかった場合 
  iRequestCorporateNumbers = "6130001031686"; 
  iCorporateNames = "株式会社クエステトラ"; 
} 

var numOfLoops = 0; // javascript number 
numOfLoops = Math.ceil(numOfClients / 10) ; // 10件ずつループでの必要何回 


//// == ワークフローデータへの代入 / Updating == 
retVal.put("1", java.math.BigDecimal(numOfClients) );  
retVal.put("2", java.math.BigDecimal(numOfLoops) );  
retVal.put("3", clientsCorporateNumbers ); 
retVal.put("4", clientsCorporateNames ); 
retVal.put("5", java.math.BigDecimal(0) ); // i=0 
retVal.put("6", iRequestCorporateNumbers ); // 初回リクエスト 
retVal.put("7", iCorporateNames ); // 初回リクエスト分の商号一覧 
retVal.put("11", "vvv Check Log vvv\n" ); // null 状態を解除 

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


▼スクリプト工程『Res Chk / Req Prep』の設定サンプル (サーバサイド JavaScript)
//// == ワークフローデータの参照 / Retrieving == 
var i = 0; // javascript number 
i = data.get("5") - 0; 
var iRequestCorporateNumbers= ""; // javascript string 
iRequestCorporateNumbers = data.get("6") + ""; 
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 

// 次の10件をセットするために 
var numOfClients = 0; // javascript number 
numOfClients = data.get("1") - 0; 
var clientsCorporateNumbers = ""; // javascript string 
var clientsCorporateNames = "";  
clientsCorporateNumbers = data.get("3") + ""; // (multi-lines) 
clientsCorporateNames = data.get("4") + ""; 


//// == 演算 / Calculating == 
var xmlCorporationCount = 0; // javascript number 
xmlCorporationCount = iResponseXML.count - 0; 

var iResponseCorporateNames = ""; // javascript string 
var array = iCorporateNames.split("\n"); 
var arrayNumber = iRequestCorporateNumbers.split(","); 

// リクエスト順(AAA,BBB,)とレスポンス順(xml)は一致しない 
for ( j = 0; j < xmlCorporationCount; j++ ){  
  var k = 0; 
  for ( k = 0; k < 10; k++ ){ 
    if ( iResponseXML.corporation[k].corporateNumber == arrayNumber[j] ){ 
      break; 
    } 
  } 
  iResponseCorporateNames += iResponseXML.corporation[k].name + "\n"; 

  if( array[j] == iResponseXML.corporation[k].name ){ 
    diffLog += "ok: "; 
  } else { 
    diffLog += "NG: "; 
  } 
  diffLog += array[j] + " is " + iResponseXML.corporation[k].name + "\n";  
} 

// 次の10件をセット 
var nextiRequestCorporateNumbers = "";  
var nextiCorporateNames = ""; // javascript string 
var array2 = clientsCorporateNumbers.split("\n"); 
var array3 = clientsCorporateNames.split("\n"); 

var request10 = 10; // javascript number 
if ( (i+2) * 10 > numOfClients ){ 
  request10 = numOfClients - (i+1) * 10; // 最終ループは負 
} 

if ( request10 > 0 ){ 
  for ( j = 0; j < request10; j++ ){ 
    if ( array2[(i+1)*10+j] != "9999999999999" ){ 
      nextiRequestCorporateNumbers += array2[(i+1)*10+j] + ","; 
      nextiCorporateNames += array3[(i+1)*10+j] + "\n"; 
    } 
  } 
  if ( nextiRequestCorporateNumbers == "" ){ // 法人番号が一つもセットされなかった場合 
    nextiRequestCorporateNumbers = "6130001031686"; 
    nextiCorporateNames = "株式会社クエステトラ"; 
  } 

  retVal.put("6", nextiRequestCorporateNumbers ); 
  retVal.put("7", nextiCorporateNames ); 
} 


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

<データ項目一覧画面>


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

[英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿