お世話になります。
プラグインの「カレンダーPlus」を利用して、空いている駐車場の予約を行いたい。
空き駐車場は可変でマスターからルックアップしており、日別表示(リリース別)を表示している。
以下のJSでうまく動作しませんので教えていただきたくお願いいたします。
やりたいことは以下の通りです。
******************
カレンダーplusで駐車区画(KUKAKUBANGO)の利用したい時間帯を
トレースした後、アプリ(駐車場予約)に画面遷移した時に自動入力された
時間の入庫日時(time1)から出庫日時(time2)までの時間(分)を計算し、
time99に自動表示し、利用30分当たり50円の利用料を計算して、
priceへ表示する。但し30分未満は30分へ繰り上げする。
・現在時刻よりも前の時間を指定するとエラー表示する。
・同一区画番号の時間重複不可
・最大12時間の予約とする。但し利用日の3日前に空きがあれば
24時間まで延長予約できる。
・保存ボタン押すと駐車場予約の一覧画面(空き状況)へ戻る
******************
(function( ){
‘use strict’;
const PRICE_PER_30MIN = 50;
const MAX_NORMAL = 12 * 60; // 12時間
const MAX_EXTEND = 24 * 60; // 24時間
const RETURN_VIEW_ID = ‘5951427’; // 一覧ID
/********************************
* 利用時間・料金計算
********************************/
function calculate(record) {
const startVal = record.time1.value;
const endVal = record.time2.value;
if (!startVal || !endVal) {
record.time99.value = null;
record.price.value = null;
return;
}
const start = new Date(startVal);
const end = new Date(endVal);
const now = new Date();
// 現在時刻より前は禁止
if (start < now || end < now) {
record.time1.error = '現在時刻より前の時間は指定できません。';
record.time99.value = null;
record.price.value = null;
return;
}
record.time1.error = null;
// 開始 >= 終了はエラー
if (start >= end) {
record.time2.error = '出庫日時は入庫日時より後を指定してください。';
record.time99.value = null;
record.price.value = null;
return;
}
record.time2.error = null;
// 利用時間(分)
const diffMinutes = Math.ceil((end - start) / (1000 \* 60));
// 利用日までの日数
const daysDiff = Math.floor((start - now) / (1000 \* 60 \* 60 \* 24));
// 最大利用時間
const maxMinutes = (daysDiff <= 3) ? MAX_EXTEND : MAX_NORMAL;
if (diffMinutes > maxMinutes) {
record.time2.error =
(maxMinutes === MAX_EXTEND)
? '利用日の3日前からは最大24時間まで予約可能です。'
: '最大12時間までしか予約できません。';
record.time99.value = null;
record.price.value = null;
return;
}
// 30分単位で切り上げ
const units = Math.ceil(diffMinutes / 30);
record.time99.value = units \* 30;
record.price.value = units \* PRICE_PER_30MIN;
}
/********************************
* カレンダーPlus遷移直後
********************************/
kintone.events.on(‘app.record.create.show’, function (event) {
calculate(event.record);
return event;
});
/********************************
* 日時変更時も再計算
********************************/
kintone.events.on([
'app.record.create.change.time1',
'app.record.create.change.time2',
'app.record.edit.change.time1',
'app.record.edit.change.time2'
], function (event) {
calculate(event.record);
return event;
});
/********************************
* 同一区画番号の時間重複チェック
********************************/
kintone.events.on([
'app.record.create.submit',
'app.record.edit.submit'
], async function (event) {
const record = event.record;
const start = record.time1.value;
const end = record.time2.value;
const place = record.KUKAKUBANGO.value;
const query =
'KUKAKUBANGO = "' + place + '" ' +
'and time1 < "' + end + '" ' +
'and time2 > "' + start + '"';
const resp = await kintone.api(
kintone.api.url('/k/v1/records', true),
'GET',
{ app: kintone.app.getId(), query: query }
);
// 自分自身を除外
if (
resp.records.length > 0 &&
!(resp.records.length === 1 && resp.records\[0\].$id.value === record.$id.value)
) {
event.error = '同一区画番号で予約時間が重複しています。';
}
return event;
});
/********************************
* 更新後に一覧ID=5951427へ遷移
********************************/
kintone.events.on(‘app.record.edit.submit.success’, function () {
location.href =
'/k/' + kintone.app.getId() + '/?view=' + RETURN_VIEW_ID;
});
})();
カレンダーplusから更新フォームに画面遷移したときに計算もしたい