会議室の予約管理をする際にダブルブッキングを防ぎたい

背景・実現したいこと

 会議室の予約管理アプリを作成したいと考えています。このとき同じ会議室が同じ時間に重複して予約されないようにしたいです。例えば下の例で言えば、既に「2名会議室」が「2022/11/04 18:00~19:00」で予約されている場合に(そのようなデータをもつレコードが既に存在する場合に)、保存しようとするとエラーが発生するような形が理想です。

  • kintoneの標準機能で解決できる
  • このプラグインを使うと解決できる
  • このような流れでプログラムを書けば解決できる

などどのような意見でも良いので助言頂けると幸いです。よろしくお願いします。

 

 

以下のような形で実装できるかと思います。

(() => {
    'use strict';

    kintone.events.on([
        'app.record.create.submit', 'app.record.edit.submit'
    ], async (event) => {
        let record = event.record, appId = event.appId;
        let getRecordsParam = {
            app: appId,
          query: `開始時刻 < "${record['終了時刻'].value}" and 終了時刻 > "${record['開始時刻'].value}" and 会議室名 in ("${record['会議室名'].value}")`
        };
      let getRecords = await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', getRecordsParam);

        if (getRecords.records.length) event.error = `${getRecords.records[0]['会議室名'].value}の予約が重複しています`;

        return event;
    });
})();

mls-hashimoto様

ご回答ありがとうございます。保存時にこのアプリの特定の条件を満たすレコードを取得して、その配列(?)の長さが0でない場合にエラーを出すという考えですね?確かにこの方法であればダブルブッキングを防げそうです。プログラムまで書いて頂き誠にありがとうございます。ただ頂いたプログラムをアップロードして動かしたところ 404 (Not Found)のエラーがコンソールに発生し保存できませんでした。

プログラムの中で変更した点はミスだと思われる「終了時刻 > “${record[‘開始時刻’]}”」→「終了時刻 > “${record[‘開始時刻’].value}”」という変更のみです。どうやらqueryの部分で404と出てきてしまうようなのですが問題箇所がわかりますでしょうか?

kz さま

申し訳ありません。typoがありました。

kintone.api.url('/k/v1/recods.json'

kintone.api.url('/k/v1/records.json'

mls-hashimoto様

ご返信ありがとうございます。上記の修正を加えたところ期待通りに動くことが確認できました。具体的なプログラムまで作成して頂き大変感謝いたします。ありがとうございました。

1つ気になるのは、このプログラムはレコードの保存時に特定の条件を満たすレコードを取得し、そのレコードの数によってエラーを発出していると思うのですが、これはこのアプリのレコードの数が多くなった時(例えば数万レコードが記録されている場合)、レコードの保存時にかなり時間がかかってしまうのではないか?とうことです。それともqueryの部分でフィルタリングがしっかりかけられていれば(今回の例では重複して会議室を予約することはできないので最大でも1件のレコードしかヒットしない)、レコード保存時にスムーズに保存できる(もしくはスムーズにエラーが発生する)のでしょうか?レコードの数が多くなった時に、レコードの保存に毎回かなりの時間がかかってしまうとするなら少し気になるところです。

 

kz さま

こちら に記載されていますが、クエリも1件しか取得しなものになっているので、フィールドの構成によりますが数万件程度であれば問題ないと思われます。

それでも気になる場合は、
①APIのリクエストボディに「取得するフィールド(fields)」を追加
②レコードが溜まってきたら古いレコードは削除(csv書き出しでバックアップ)
③年度別等で別のアプリに変更

あたりが解決策かと思います。

mls-hashimoto様

ご返信ありがとうございます。ヘルプ記事へのリンクありがとうございます。見させて頂きました。

さらに解決策までご提示いただきありがとうございます。確かに過去の予約状況などはアプリに残しておく必要はないのでダウンロードして削除してしまうのも良いですね。わかりました。ありがとうございます。

以前にもmls-hashimoto様にアドバイス頂いたことがあります。この度もご協力頂きありがとうございました。大変助かりました。感謝いたします。