第464話:立替金精算依頼を回す(基本業務パック)

2016年1月4日

2016年版の「基本業務パック」を考える。

今回はシリーズ第3弾、シンプルな「立替金精算フロー」(経費申請フロー)を紹介する。


このワークフローは、「スマホ撮影」した領収書画像をメールすることで開始される。(メール開始)

立替金精算といえば、月末に「一括」して申請する仕組みの会社が多いとは思うが、この例は「逐次」に申請してもらう形だ。領収書画像との対応を管理しやすくするところに主眼がある。つまるところ、タクシー代や飲食代などの領収書を取得した瞬間にメール申請する業務フローだ。注意すべきは、会社用メールアドレス(ワークフローの[ログインID])で送信しなければならない点といえる。

(Google Apps などのクラウド型メールシステムを導入している企業であれば難しい話ではない)

ちなみに、改めて言うまでもない事かも知れないが、このワークフローは「スマホ撮影の領収書画像で領収書原本を破棄できるようになる制度」(2017年1月ごろ)を見越した業務プロセスだ。

2016年版の「基本業務パック」に入れるには「時期尚早感」もあるが、来たるべき「領収書スマホ撮影」の時代にむけて、次世代の「あるべき姿」を先取りすることは非常に有意といえるだろう。積極的に試運転し、運用上の様々な課題を事前に整理しておきたい。(2016年中は「領収書原本」を保管する必要があるので注意が必要。なお、2015年10月に開始された制度は「スキャナ読取の領収書画像」という点で異なる)

[立替金精算フロー]

もう少し具体的に、2017年1月以降の実運用を想定すれば、、、領収書を撮影する前に「サイン」(自署)が必要となるだろう。

つまり、「複数回請求」や「多事業請求」などの不正を防ぐために、領収書原本に「名前」と「精算月」を書き込んだうえで撮影させるべきだ。これは慣れるまでに時間がかかるかも知れない。だが「数年後のビジネスシーン」を空想するに、ごく普通の行為になっている様な気がする。

なお、
  • 「メール Subject」の文字列が『件名』(摘要)に、
  • 「メール本文」全体が『備考』に、
それぞれ自動的にセットされる、という設定になっている。また、
  • 「本文1行目」に数値があれば『立替金額』に、
  • 「本文2行目」に日付(20160101)があれば『立て替えた日』に、
  • 「本文3行目」に費目分類の文字列があれば『費目分類』に、
それぞれ自動的にセットされる、という設定にもなっている。詳細な申請データは、最初の工程〔1.申請する(追記修正)〕にて入力することが想定されているが、全てをメール申請だけで完了させることも可能だ。


たとえば、旅費交通費など「領収書の添付が不要な経費」の申請であれば、
> Subject: 烏丸御池⇔大阪(地下鉄、JR)
> 1540
というメールを送るだけで良い。

<当テンプレにおける費目分類>
電車バス タクシー 新幹線飛行機 宿泊費 広告宣伝費 消耗品費 租税公課 交際接待費 会議費 通信費 諸会費 新聞図書費


PS1: 実際に送信するメールアドレスはワークフロー基盤ごとに異なる。稼働中の[プロセスモデル]の詳細設定を参照し、アドレス帳に登録して欲しい。(例: bill.m123.karasuma-oike-000@questetra-bpms.appspotmail.com ) また、自社のメールサーバの設定を行い、より覚えやすいエイリアスに紐づけるのも良いだろう。(例: bi@example.com )

PS2: 「メール開始」を利用するためには、ワークフロー基盤で設定を「有効」にする必要がある(初期状態は「無効」)。システム管理権限を持ったユーザでログインし、[システム設定]>[プロセスモデル外部連携]>[メッセージ開始イベント(メール)]より、設定を有効にして欲しい。(詳細はこちら => http://www.questetra.com/ja/tour/m3/m318/


[立替金精算フロー:「1.申請する(追記修正)」画面]

▼スクリプト工程『メール解析(自動処理)』の設定サンプル (サーバサイド JavaScript)
//// ▽申請者の特定▽
//// == ワークフローデータの参照 / Retrieving ==
var quserEmail = data.get("16"); // [Mail-From]

//// == 演算 / Calculating ==
var quser = quserDao.findByEmail(quserEmail);
if ( quser != null ){
  var qgrouplist = qgroupDao.findByQuserAndPosition(quser, false );
  // returns List<QgroupView>
  // my group list as Staff-Member

//// == ワークフローデータへの代入 / Updating ==
  if ( qgrouplist.size() != 0 ){
    retVal.put("1", qgrouplist.get(0) ); // ->[立替人所属組織]
  } else {
    retVal.put("1", qgroupDao.findById(1) ); // ->[立替人所属組織]
  }
  retVal.put("2", quser ); // ->[立替人]
}


//// ▽メールの解析▽
//// == ワークフローデータの参照 / Retrieving ==
var mailBody = data.get("7") + ""; // [支払備考]

//// == 演算 / Calculating ==
var array = mailBody.split("\n");
var money = "";
var moneyInt = NaN;
if( array.length >= 1 ){
  money = array[0]; // [立替金額]
  moneyInt = parseInt( money.split(',').join('').trim(), 10 ); 
}
var paydate = "";
if( array.length >= 2 ){
  paydate = array[1]; // [立て替えた日]ex: 20160101
}
var accountCategory = "";
if( array.length >= 3 ){
  accountCategory = array[2]; // [費目分類]ex: 会議費
}


//// == ワークフローデータへの代入 / Updating ==
retVal.put("3", data.get("17") ); // [Mail-Datetime]-> [立替申請時刻]
if ( ! isNaN(moneyInt) ){
  retVal.put("4", java.math.BigDecimal(moneyInt) );
}
if ( paydate.match( /^[0-9]{8}/ ) ){
  retVal.put("5", java.sql.Date.valueOf(
    paydate.substr(0, 4) + "-" +
    paydate.substr(4, 2) + "-" +
    paydate.substr(6, 2) ) );
}

var accountCategorySelect = new java.util.ArrayList();
if ( accountCategory.search("電車") > -1 ){
  accountCategorySelect.add("電車バス");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("バス") > -1 ){
  accountCategorySelect.add("電車バス");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("新幹線") > -1 ){
  accountCategorySelect.add("新幹線飛行機");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("飛行機") > -1 ){
  accountCategorySelect.add("新幹線飛行機");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("宿泊") > -1 ){
  accountCategorySelect.add("宿泊費");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("広告") > -1 ){
  accountCategorySelect.add("広告宣伝費");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("消耗") > -1 ){
  accountCategorySelect.add("消耗品費");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("租税") > -1 ){
  accountCategorySelect.add("租税公課");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("交際") > -1 ){
  accountCategorySelect.add("交際接待費");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("接待") > -1 ){
  accountCategorySelect.add("交際接待費");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("会議") > -1 ){
  accountCategorySelect.add("会議費");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("会費") > -1 ){
  accountCategorySelect.add("諸会費");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("新聞") > -1 ){
  accountCategorySelect.add("新聞図書費");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("本") > -1 ){
  accountCategorySelect.add("新聞図書費");
  retVal.put("6", accountCategorySelect );
} else if ( accountCategory.search("図書") > -1 ){
  accountCategorySelect.add("新聞図書費");
  retVal.put("6", accountCategorySelect );
} 

▼スクリプト工程『補正前記録(自動処理)』の設定サンプル (サーバサイド JavaScript)
//// == ワークフローデータの参照 / Retrieving ==
var quser = data.get("2"); // [立替人]
var selects = data.get("6"); // [費用分類]
var selected = selects.get(0).getDisplay() + ""; // [費用分類]選択値
var money = data.get("4") + ""; // [立替金額]
var moneyInt = parseInt( money.split(',').join('').trim(), 10 ); 

//// == ワークフローデータへの代入 / Updating ==
retVal.put("9", quser.getEmail() ); // [立替人]-> [立替人アドレス]
retVal.put("10", data.get("5") ); // [立て替えた日]-> [計上月]
retVal.put("11", selected ); // [勘定費用分類]
retVal.put("12", java.math.BigDecimal(moneyInt) ); // [精算金額]


<データ項目一覧画面>


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

[英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿