🦒

kintone|日付から平日なのか休日/祝日なのか判別する

2021/04/29に公開

プログラムを作るのが苦手なプログラマーが
mykintoneをチョビットずつ便利に改善していく過程を投稿していきます。

先週くらいから、子供の日々の一言メモみたいなものを
mykintoneのアプリに登録しています。
1年くらい継続してから見返すときっと良いものになっていると思う笑

📝子供ひとことメモ アプリ


こんな感じで写真と一言メモと機嫌などなどをポチポチ登録しています。

📝今回のチョビット便利

既に↑の画像には設定されていますが、日付フィールドに設定された値から、その日付が平日なのか祝日なのかを判別する仕組みです。

あとで見返すときに、平日だったか祝日だったか確認できた方が、その時の印象が変わってくるかなと思って追加してみました。


種別フィールドに「平日」なのか「休日・祝日」なのかを設定します。

余談ですが、曜日フィールドは↓のURLで紹介されている計算式で取得しています。
Qiita|@kentaro1sh11様|kintoneの標準機能のみで曜日を自動計算する

📝利用したライブラリ

📝参考にしたウェブページ

cybozu developer network|kintoneカスタマイズで、holiday_jp-jsを使って営業日/休業日を判定する
↑ほぼこのweb記事の内容を流用しています。

📝トリガー

  • app.record.edit.change.日付
  • app.record.create.change.日付
  • mobile.app.record.edit.change.日付
  • mobile.app.record.create.change.日付
  • app.record.create.show
  • mobile.app.record.create.show

モバイルでも動作させたいので、編集・新規作成時に日付フィールドが変更された場合に発火するように↑の6つのイベントをトリガーとします。
「app.record.create.show」と「mobile.app.record.create.show」は、日付フィールドに初期設定される日付の値を元に種別フィールドの値を更新したいがために追加しています。
※フィールドの初期値は変更として認識されないため。

📝ソースコード

(function () {
  "use strict";

  // 曜日を列挙
  const DAYS = {
    SUNDAY: 0,
    MONDAY: 1,
    TUESDAY: 2,
    WEDNESDAY: 3,
    THURSDAY: 4,
    FRIDAY: 5,
    SATURDAY: 6,
  };

  // 独自の休日設定
  const CUSTOM_HOLIDAYS = [
    {
      date: '12/29',
      name: '年末年始'
    },
    {
      date: '12/30',
      name: '年末年始'
    },
    {
      date: '12/31',
      name: '年末年始'
    },
    {
      date: '1/1',
      name: '年末年始'
    },
    {
      date: '1/2',
      name: '年末年始'
    },
    {
      date: '1/3',
      name: '年末年始'
    }
  ];

  // 日の種別
  const DAY_TYPE = {
    WEEKDAY: '平日',
    HOLIDAY: '休日・祝日'
  };

  // 保育園の状態
  const STATUS = {
      GO: '通',
      SICK: '休',
      HOLIDAY: '無'
  };

  // 編集画面にて、日付フィールドが変更されたタイミングで処理を実施
  kintone.events.on(
    [
      "app.record.edit.change.日付",
      "app.record.create.change.日付",
      "mobile.app.record.edit.change.日付",
      "mobile.app.record.create.change.日付",
      "app.record.create.show",
      "mobile.app.record.create.show",
    ],
    (event) => {
      getDayInfo(event);
      return event;
    }
  );

  /***
   * 日付フィールドに設定された日付の情報を取得
   * @type {getDayInfo}
   */
  const getDayInfo = ((event) => {
    // レコードの日付フィールドから日付の値を取得
    const DATE = new Date(event.record['日付'].value);

    let dayInfoString = DAY_TYPE.WEEKDAY;

    // 休日・祝日の場合は、休日を設定
    if(isHoliday((DATE))){
      dayInfoString = DAY_TYPE.HOLIDAY;
    }

    // 種別フィールドに値を設定
    event.record['種別'].value = dayInfoString;

    // 保育園フィールドの値を更新する
    if(dayInfoString === DAY_TYPE.HOLIDAY){
      event.record['保育園'].value = STATUS.HOLIDAY;
    } else {
      event.record['保育園'].value = STATUS.GO;
    }

  });

  /***
   * カスタム祝日の取得
   * @type {function(*=): {date: string, name: string} | {date: string, name: string} | {date: string, name: string} | {date: string, name: string} | {date: string, name: string}}
   */
  const getCustomHoliday = ((date) => {
    // dayjsで「MM/DD」にフォーマット
    const MONTH_AND_DAY = dayjs(date).format('MM/DD');

    // カスタム祝日に設定された日付がある場合は、その値をtrue/ない場合はfalse
    return CUSTOM_HOLIDAYS.find((customHoliday) => {
      return customHoliday.date === MONTH_AND_DAY;
    });
  });

  /***
   * 休日・祝日チェック
   * @type {(function(*=): (boolean))|*}
   */
  const isHoliday = ((date) => {
    // 祝日の場合
    if(holiday_jp.isHoliday(date)){
      return  true;
    }

    // カスタム祝日の場合
    if(getCustomHoliday((date))){
      return  true;
    }

    // 土曜・日曜の場合
    if(date.getDay() === DAYS.SUNDAY ||
    date.getDay() === DAYS.SATURDAY){
      return true;
    }

    // それ以外
    return false;
  });
})();

↑のソースではついでに「保育園」フィールドの値も「種別」フィールドの値にあわせて更新しています。

📝やってみた・・・

1.新規登録ボタンを押下します。
 日付フィールドの初期値は登録日に設定しています。
2021/4/29は、昭和の日なので祝日判断されています。

2.日付フィールドを「2021/4/30」に更新します。
 2021/4/30は、平日なので、平日判断された結果、種別フィールドが「平日」に変更されています。

📝最後に・・・

アドバイスは常時募集しております。お待ちしております
<(_ )><( )><( )><( )><( _)>

Discussion