実働日(営業日)を判定するモジュールを書いてみた

業務系のシステムに携わっている方には馴染み深いと思いますが、
「月初実働3日目に処理」とか「月末最終実働日に処理」とかよくある話ですよね。
この処理をしたい要件が出たのでcpanを漁ってみましたが
見つからなかったので書いてみました。

使い方

SYNOPSYSと同じですが。

  use Calendar::Japanese::Business;

  # 何も指定しなければ、現在の年月で設定されます
  #my $c = Calendar::Japanese::Business->new;

  my $c = Calendar::Japanese::Business->new(
      {
          year           => 2011,
          month          => 5,
          custom_holiday => [2],  # 休日に加えたい日を配列で指定します。
      }
  );

  # 2011/5 の 16実働日 のTimpe::Pieceオブジェクトを取得
  $c->get_date_from_businessday(16); # => 2011/5/27

  # 2011/5/16 の実働日を取得
  $c->get_workday_from_day(16);        # => 7

  # 2011/5 の初回実働日のTime::Pieceオブジェクトを取得
  $c->get_first_date;    # => 2011/5/6

  # 2011/5 の初回実働日を取得(意味なし)
  $c->get_first_workday; # => 1

  # 2011/5 の最終実働日のTime::Pieceオブジェクトを取得
  $c->get_last_date;     # => 2011/5/31

  # 2011/5 の最終実働日を取得
  $c->get_last_workday;  # => 18

  # 2011/5 の実働日一覧
  print Dumper( $c->dump );

休日かどうかの判定は
「土日」+「祝祭日(Calendar::Japanese::Holidayを利用)」
で判定しています。
さらに custom_holiday に設定しておくと
好きな日を休日にすることが可能です(会社の設立記念日など)

使用例

cronなどで直接指定したい場合。
以下のようなスクリプトを用意しておきます。

そしてcronで以下のような設定をしておきます。
例ではcronを毎時0時に実行し、その日の実働日を判定して
「実働3日目」であればmyscript.shを実行します。

0 * * * * perl check_workday.pl -d 3 && sh myscript.sh

Todo

  • モジュール名とかサブルーチン名とか変えるかも、しれない
  • バリデーションとか入れるかもしれない