👋

Pleasanterの施設予約で予約時間重複チェックをする

2024/10/07に公開

概要

タイトル通りです。
色々検索してみたのですが、プリザンター公式 Ch プリ生#14[1]「同じ施設を同じ時間に予約できないように」を、ほぼそのまま利用しました。

変更点

私の環境では、サーバスクリプト上は GMT、DB の中身は JST になってしまい、想定通りに動作しませんでした。
そのため、JST に変換するコードを追加しています。

また、自レコードを除く所で、context.Id を使っていたのを、model.IssueId に変更しています。

手順

サーバスクリプト次のコードを入れます。
条件は、作成前と更新前にチェックを入れます。

// 利用開始、利用終了の大小比較
if (
  utilities.InRange(model.StartTime) &&
  utilities.InRange(model.StartTime) &&
  model.StartTime >= model.CompletionTime
) {
  context.Error("利用終了が利用開始より前の日時です。");
}
// 利用開始/終了のデータ取得条件生成
// 画面入力値   :         12:00 ----------- 13:00
// 予約済レコード1:11:30 ----------- 12:30
// 予約済レコード2:                  12:30 ----------- 13:30
// 予約済レコード3:             12:20 --- 12:40
// 予約済レコード4:11:30 ----------------------------- 13:30
// 【予約重複】
//  予約済みレコードの開始が画面入力値の終了より小さい かつ 予約済みのレコードの終了が画面入力値の開始より大きい
//   →日付のColumnFilterHashの指定は「以上」「以下」のため、「より大きい」「より小さい」は1秒プラス/マイナスで対応する。
let myStartTimeOwn = new Date(model.StartTime);
myStartTimeOwn.setSeconds(myStartTimeOwn.getSeconds() + 1);
let myEndTimeOwn = new Date(model.CompletionTime);
myEndTimeOwn.setSeconds(myEndTimeOwn.getSeconds() - 1);

// JSTに変換
// myStartTimeOwn.setHours(myStartTimeOwn.getHours() + 9);
// myEndTimeOwn.setHours(myEndTimeOwn.getHours() + 9);

const myStartTimeOwnString = `${myStartTimeOwn.toLocaleDateString("ja-JP", {
  year: "numeric",
  month: "2-digit",
  day: "2-digit",
})} ${myStartTimeOwn.toLocaleTimeString()}`;
const myEndTimeOwnString = `${myEndTimeOwn.toLocaleDateString("ja-JP", {
  year: "numeric",
  month: "2-digit",
  day: "2-digit",
})} ${myEndTimeOwn.toLocaleTimeString()}`;

// 会議室重複の予約済みレコード取得
const myData = {
  View: {
    ColumnFilterHash: {
      ClassB: `[\"${model.ClassB}\"]`,
      StartTime: `[\",${myEndTimeOwnString}\"]`,
      CompletionTime: `[\"${myStartTimeOwnString},\"]`,
    },
  },
};
const myResults = Array.from(items.Get(context.SiteId, JSON.stringify(myData)));

// 更新時の自レコードは除く
let CrrentId = model.IssueId;
const myReservs = myResults.filter(
  (myResults) => myResults.IssueId != CrrentId
);
if (myReservs.length > 0) {
  context.Error("予約時間が重複しています。");
}
脚注
  1. プリ生#14 ↩︎

Discussion