👋
Pleasanterの施設予約で予約時間重複チェックをする
概要
タイトル通りです。
色々検索してみたのですが、プリザンター公式 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("予約時間が重複しています。");
}
Discussion