登録不可の判断

投稿失礼いたします。

現在設備レンタルのアプリを作っており、

登録不可の判断のところでうまく設定が出来ないところがあります。

フォーム内のフィールドを説明すると、

・開始時間はレンタルの開始時間(日時)

・終了時間はレンタルの終了時間(日時)

・selectはラジオボタン:A設備、B設備、祝日、休日 四つの選択肢があります。

登録不可は二パターンがあります。

①祝日と休日はレンタル不可(qryInfo)←祝日と休日は事前に登録済み

②同じ時間帯で同じ設備はレンタル不可(qryInfo2)

(function() {
    'use strict';
    const create_submit = ['app.record.create.submit'];
    kintone.events.on(create_submit, function(event) {
        const record = event.record;
        let select_car = record["select"].value;
        //NG判斷
        //start_time
        let start_time = new Date(record["開始時間"].value);
        let start_time_ISO = start_time.toISOString();
        let start_q = new Date(start_time.setHours(0)).toISOString();
        start_q = new Date(start_time.setMinutes(0)).toISOString();
        //end_time
        let end_time = new Date(record["終了時間"].value);
        let end_time_ISO = end_time.toISOString();
        let end_q = new Date(end_time.setDate(end_time.getDate() + 1)).toISOString();
        end_q = new Date(end_time.setHours(0)).toISOString();
        end_q = new Date(end_time.setMinutes(0)).toISOString();
        //query
        let this_appid = kintone.app.getId();
        let qryInfo = `開始時間 >= "${start_q}" and 終了時間 <= "${end_q}" and select in ("祝日","休日")`;
        let qryInfo2 = `開始時間 >= "${start_time_ISO}" and 終了時間 <= "${end_time_ISO}" and select in ("${select_car}")`;
        //console.log(qryInfo);
        return kintone.api(kintone.api.url('/k/v1/records'), 'GET', {
            app: this_appid,
            query: qryInfo
        }).then(function(resp) {
            if (resp.records.length != 0) {
                event.error = "祝日、休日は登録不可"
            } else {
                return kintone.api(kintone.api.url('/k/v1/records'), 'GET', {
                    app: this_appid,
                    query: qryInfo2
                }).then(function(resp) {
                    if (resp.records.length != 0) event.error = "この時間帯はすでにレンタルされました" ;
                    return event;
                }).catch(function(error) {
                    console.log(error)
                });
            }
            return event;
        }).catch(function(error) {
            console.log(error)
        });
        return event;
    });
})()

現在は同じの時間帯で同じ設備はレンタル不可になっているけど、以下の場合だとうまく制御できず、、

A設備は10:00-11:00レンタルして、さらにA設備を10:30-11:00レンタルするとNGにして欲しい。

恐れ入りますが、ご助力いただけないでしょうか。

よろしくお願いいたします。

        let qryInfo2 = `開始時間 > "${start_time_ISO}" and 開始時間 < "${end_time_ISO}" or 終了時間 > "${start_time_ISO}" and 終了時間 < "${end_time_ISO}" and select in ("${select_car}")`;

こういったクエリになるのではないかと思います。

回答ありがとうございます。

やってみましたが、同じ時間帯も前後の時間帯も保存可能になってしまいました。

google で ‘期間が重なっている javascript’ で検索しました。

期間が重複しているかを判定する条件式の導出方法 - yucatio@システムエンジニア
https://yucatio.hatenablog.com/entry/2018/08/16/175914

を参考に

let qryInfo2 = `開始時間 < "${end_time_ISO}" and 終了時間 > "${start_time_ISO}" and select in ("${select_car}")`;

としました。

すでに予約されている時間
10:00-11:00

予約できる
9:30-9:50
13:30-14:30

予約できない
9:58-10:30
9:58-10:10
9:58-11:10
10:15-10:45
10:15-12:00

を確認しました。

サイボウズ Office | 中小企業の“チーム力”を強化するグループウェア
https://office.cybozu.co.jp/

という便利なグループウェアがあって設備予約という仕組みがあるみたいです。

参考資料までありがとうございます。

これで無事動きました。ありがとうございます。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。