入力された休日を自動的に書き換える方法

たとえば『出荷期限』に「休日」が入力されてしまっていた場合に、その日付データが自動的に「営業日」に補正される仕組みについて紹介します。(選択肢 XML /サービスタスク Addon 活用)

こんにちは、古久保です。

2017年は、祝祭日の振替休日が1日しかないようです。
2018年は、4日あるようなので大型連休でエンジョイするのは2018年までとっておくのが良いようです。

Questetra BPM Suite のサービスは、2009年から開始しています。
開始当初から

「営業日」を日付入力の際に考慮(入力チェック)に入れたい。
締切日や作業納期を営業日で(間違いなく)運用できるようにしたい。

という要望を聞いてきました。
現在でも日付入力の際のチェックについては、実現していません。
(イロイロと思うところあろうと思いますが、ご勘弁を)

しかしながら、様々な機能を組み合わせて

「営業日」を考慮した入力日付の補正

を行うことが可能です。(入力チェックではなく日付入力の後工程で補正

<実現イメージ:土曜日・日曜日補正>
実現イメージ:土曜日・日曜日補正

<実現イメージ:祝祭日補正>
実現イメージ:祝祭日補正

この実現方法をご紹介したいと思います。

◆実現方法概要(選択肢 XML /サービスタスク Addon 活用)

仕様的には、

日付型プロセスデータ項目が祝祭日、土曜日、日曜日の指定されていると「前倒し補正」「後倒し補正」指定に沿って日付を補正する。

でおおよそ要望にお応えできるのではないかと考えます。
また、隠れた要望として、「様々な業務で使用される可能性がある」が考えられますのでうまく使いまわせられる仕組みが求められそうです。

その上で、実現方法としては、

* 祝祭日情報は、選択肢 XML に持たせる。
* サービスタスク Addon を用いた自動処理工程(日付データ補正サービス)で祝祭日、土日指定日付の補正を行う。

が現実的な実現方法ではないかと思います。

<実現プロセスモデル図>
実現プロセスモデル図

◆祝祭日情報(選択肢 XML)実装例

「様々な業務で使用される可能性がある」ことも考えまして共有プロセスモデルファイルとすることが良いでしょう。

設定方法は、以下を参照して下さい。

複数の業務プロセス定義から参照される選択肢XMLを登録する
データ項目定義における選択肢型データは、 “候補リスト” を設定する必要があるデータ項目です。もし、[システム管理権限] をもつユーザが当該リストをシステム登録しておけば、各プロセスモデルから参照設定できる様になります。モデリングの効率化や、候補リストの一元管理を実現できます。

http://www.questetra.com/ja/tour/m3/m319/

<祝祭日情報(選択肢 XML)設定内容例>

<items>
  <item value="2017-01-01" display="元旦" />
  <item value="2017-01-02" display="元日振替休日" />
  <item value="2017-01-09" display="成人の日" />
  <item value="2017-02-11" display="建国記念の日" />
  <item value="2017-03-20" display="春分の日" />
  <item value="2017-04-01" display="★クエステトラ創業記念日★" />
  <item value="2017-04-29" display="昭和の日" />
  <item value="2017-05-03" display="憲法記念日" />
  <item value="2017-05-04" display="みどりの日" />
  <item value="2017-05-05" display="こどもの日" />
  <item value="2017-07-17" display="海の日" />
  <item value="2017-08-11" display="山の日" />
  <item value="2017-09-18" display="敬老の日" />
  <item value="2017-09-23" display="秋分の日" />
  <item value="2017-10-09" display="体育の日" />
  <item value="2017-11-03" display="文化の日" />
  <item value="2017-11-23" display="勤労感謝の日" />
  <item value="2017-12-23" display="天皇誕生日" />
</items>

日本の祝祭日の他に例として、2017年4月1日に「クエステトラ創業記念日」を追加しています。

◆日付データ補正サービス(サービスタスク Addon)実装例

サービスタスクの設定としては以下のようなイメージとなります。
(祝祭日情報の選択肢 XML のファイル名は “HolidayList” としています)

<サービスタスク Addon 設定イメージ>
サービスタスク Addon 設定イメージ

設定内容の注意点としては、以下です。

* 「補正日付データ」については、「指定日付データ」と同じデータ項目でも問題ありません。
(その場合、上書きされます。)
* 「祝祭日補正種別」は、【半角】”-“(前倒し日補正)もしくは”+”(後倒し日補正)でその他の文字列の場合は、”-“(前倒し日補正)に扱われます。

<サービスタスク Addon 実装例>

<?xml version="1.0" encoding="UTF-8"?><service-task-definition>

<label locale="ja">日付データ補正サービス</label>

<configs>
  <config name="conf_HolidayMasterFile" required="true" form-type="TEXTFIELD">
    <label>祝祭日マスタファイル名</label>
  </config>
  <config name="conf_TargetDate" required="true" form-type="SELECT" select-data-type="DATE">
    <label>指定日付データ(日付型データ項目)</label>
  </config>
  <config name="conf_CorrectDate" required="true" form-type="SELECT" select-data-type="DATE">
    <label>補正日付データ(日付型データ項目)</label>
  </config>
  <config name="conf_HolidayCorrectValue" required="true" form-type="TEXTFIELD">
    <label>祝祭休日補正種別 前営業日:"-" 後営業日:"+"</label>
  </config>
</configs>

<script><![CDATA[
// 祝祭日、土日曜日日付補正スクリプト(ver. 20170209)
// 補正値/祝祭日データを元に日付を補正する
// 祝祭休日補正種別(前営業日:"-" 後営業日:"+")指定にて補正
// 例: 2017年03月20日(月)祝日 前営業日補正 の場合、2017年03月17日(金)に補正
// 例: 2017年05月06日(土)    前営業日補正 の場合、2017年05月02日(火)に補正
// 例: 2017年05月03日(水)祝日 後営業日補正 の場合、2017年05月08日(月)に補正
// (c) 2017, Questetra, Inc. (the MIT License)

//// == 工程コンフィグの参照 / Config Retrieving ==
var holidayMasterFileName = configs.get( "conf_HolidayMasterFile" ); // return 選択肢マスタファイル名
var targetDateNum = configs.get( "conf_TargetDate" );   // (returns Number)
var correctDateNum = configs.get( "conf_CorrectDate" ); // (returns Number)
var holidayCorrectKind = configs.get( "conf_HolidayCorrectValue" );  // (returns Number)

//// == ワークフローデータの参照,定義 / Data Retrieving, Data Define ==
var targetDate = data.get(targetDateNum);
var formatter = new java.text.SimpleDateFormat("yyyy-MM-dd");
var targetDateString = formatter.format(targetDate);

//// == 演算 / Calculating ==
while ((itemDao.findByValue(holidayMasterFileName,true,targetDateString) == null)||(targetDate.getDay() != 6)||(targetDate.getDay() != 0)){
    targetDateString = formatter.format(targetDate);
    // 祝祭日チェック・補正
    if (itemDao.findByValue(holidayMasterFileName,true,targetDateString) != null){
        if (holidayCorrectKind == "+"){
            targetDate = targetDate.addDays(1);
        }else{
            targetDate = targetDate.addDays(-1);
        }
    }
    // 土曜日チェック・補正
    if (targetDate.getDay() == 6){
        if (holidayCorrectKind == "+"){
            targetDate = targetDate.addDays(2);
        }else{
            targetDate = targetDate.addDays(-1);
        }
    }
    // 日曜日チェック・補正
    if (targetDate.getDay() == 0){
        if (holidayCorrectKind == "+"){
            targetDate = targetDate.addDays(1);
        }else{
            targetDate = targetDate.addDays(-2);
        }
    }
}

//// == ワークフローデータへの代入 / Data Updating ==
retVal.put(correctDateNum,targetDate);

]]></script>


<icon>
(★省略★)
</icon>

</service-task-definition>

◆あとがき

サービスタスク Addon を使用することで他のプロセスモデルへの展開も比較的容易になります。
実装自身も比較的シンプルでありますので他にも補正ルールがあるのであれば改良も容易ではないかと思います。

サービスタスク Addon の利用については、以下をご参照下さい。

業務プロセス定義で利用可能な自動工程を追加する
“文字数とハッシュ値を取得する” といった処理工程を自動化したい場合、標準の[サービス工程]や[イベント]だけでは表現できません([スクリプト工程]を利用することになります)。しかし、予め “文字数カウント-addon.xml” や “SHAハッシュ-addon.xml” といった[アドオンXML]をインポートしておけば、簡単に処理工程の自動化を実現することができます。(Service-Task Addon)

http://www.questetra.com/ja/tour/m4/m415/

より効率的な自動処理の実装として、一度、利用や改善のご検討を頂ければと思います。
ご検討時のご相談は、お気軽にお声掛け下さい。

祝日のルールについては、コチラ(内閣府:国民の祝日について)を御覧下さい。

2017-02-28

Masato Furukubo の紹介

Questetra, Inc. Sales Department
Masato Furukubo の投稿をすべて表示

あわせて読みたい
50.Questetra Tips の前の記事 失敗しない!選択肢 XML 更新作業とは?(サービスタスク Addon編)
50.Questetra Tips の次の記事 コンビニ印刷サービスとクラウド BPM との連携事例
Masato Furukubo の他の記事 承認工程を「メール返信」に置き換える方法

アーカイブ

 RSS