第479話:スクリプト工程に「日割り計算」をさせるときの注意

2016年4月18日
「日割り請求書」を自動化したい。

家賃、水道料金、クラウドサービス。。。どんな分野であっても「請求書発行プロセス」は、非常に重要な業務だ。ミスは許されない。与信調査や住所入力は人間が行うにしても、「日割り計算」の部分はコンピュータに任せたい。
  • 確かに、コンピュータは機械だ。
  • およそ、ミスは無い。
  • そして、速い。
ただ一方で、、、「3分の1」を3倍させたら「0.999」にしかならない、という極めてオバカサンな一面も併せ持つ。電卓であれ、スパコンであれ、あまり大差ない。(あぁ、J言語ユーザさん等からの反論が聞こえる…)


以下のワークフローは、「月額利用料 10,000円 のサービス」に対する日割計算を自動化している。

「YYYY年MM月にX日間ご利用いただいた」と言う情報を入力すれば、「請求額PDFの自動生成まで」が自動化される、というシンプルなサンプルフローだ。

この例は、業務フロー図を見れば一目瞭然だが、簡単の為に「承認工程」や「差戻工程」すら設定されていない。非常にプレーンな業務プロセスだ。ただ、であるが故に、「自動でプリントアウトする」や「自動で添付メール送信する」といった応用システムを開発する際のベースとして有用といえる。

[請求書発行フロー]



コンピュータは「分数」が苦手だ。「3分の1」ですらキチンと認識できない。

足し算や掛け算といった「計算」によって、さらに混乱の度を深めてしまうケースもある。

ちなみに、実社会ではあまり活躍の場がない「分数のママで計算させるためのソフト」は、プログラミングの教材としてもしばしば利用されるが、「分数の入力」や「分数の表示」の時点で、かなりの創意工夫が必要となる。(さらに「約分」や「通分」は奥が深い…)


このワークフローにある自動工程では、そんなコンピュータに「月額利用料金」を「31」や「30」で割るという処理をさせている。基本的には、小数点以下の数字を切り捨てることなく保持し続け、最後に丸める(四捨五入する)という方法となっている。

ちなみに、、、安易に「小数点以下切り捨て」にすると、(実際切り捨てるべきシーンは少なくないのだが)、たとえば「31日の利用の場合に月額利用料金(10000円)にならない」という状態になり、イロイロと条件式を決めていく必要があるので注意が必要だ。

[請求書発行フロー:「1.ご利用日数の入力」画面]

▼スクリプト工程『日割計算』の設定 (サーバサイド JavaScript)
//// == ワークフローデータの参照 / Retrieving ==
var monthlyCharge = data.get("●") - 0; // javascript Number
var targetYearMonth = data.get("●"); // (*1)
var daysOfUse = data.get("●") - 0; // javascript Number
// *1: M230. com.questetra.bpms.util.AddableDate() 

//// == 演算 / Calculating ==
var daysOfMonth = targetYearMonth.getLastDateInMonth().getDate();
var perDiem = monthlyCharge / daysOfMonth;
var billing = perDiem * daysOfUse; 

//// == ワークフローデータへの代入 / Updating ==
retVal.put("●", java.math.BigDecimal( daysOfMonth ) );
var perDiemJmode = new java.math.BigDecimal( perDiem ).setScale(2, java.math.BigDecimal.ROUND_HALF_UP);
retVal.put("●", java.math.BigDecimal( perDiemJmode ) );
var billingJmode = new java.math.BigDecimal( billing ).setScale(0, java.math.BigDecimal.ROUND_HALF_UP);
retVal.put("●", java.math.BigDecimal( billingJmode ) );

<データ項目一覧画面>


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

[英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿