パーソナルトレーナーのシフトと予約枠を連動させる設計。指名予約、複数店舗の掛け持ち、休憩と移動時間を空き枠の計算に入れる
パーソナルジムの
この
想定している
シフトと予約枠を連動させるには、空き枠を保存せずに計算する
トレーナーの
空き枠を
元に
| データ | 中身 | 変える人 |
|---|---|---|
| トレーナー | 名前、 |
運営の |
| 勤務の |
日付、 |
管理者、 |
| 予約 | 会員、 |
会員、 |
| ふさがっている |
休憩、 |
管理者、 |
| メニュー | 所要時間、 |
運営の |
この
空き枠は「シフト−予約−準備−休憩−移動」の残りから求める
空き枠の
- 勤務の
時間帯を 取り出す。 その 日、 その 店舗に いる シフトの 開始から 終了まで - 入っている
予約を 予約の引く。 時間だけでなく、 メニューに 決めた 前後の 準備の 時間も 含めて 引く - ふさがっている
時間を 休憩、引く。 研修、 清掃などの 時間 - 移動の
時間を 同じ引く。 日に 別の 店舗の 予定が ある 場合、 その前後に 移動の 時間を 引く - 残りの
時間に、 メニューの選ばれた メニューが 収まる 開始時刻を 並べる。 所要時間と 前後の 準備を 足した 長さが 入るかで 判定する - 開始時刻の
刻みを 30分ごとなど、そろえる。 店で 決めた 刻みに 合う 時刻だけを 出す
ポイントは、
開始時刻の
トレーナー指名の予約は、指名ありとおまかせで空き枠の出し方を変える
トレーナーの
| 予約の種類 | 空き枠の |
予約を |
|---|---|---|
| 指名あり | 指名された |
その |
| おまかせ | メニューを |
確定の |
| 前回と |
前回の |
会員が |
おまかせの
割り
指名に
複数店舗を掛け持ちするトレーナーは、1本の時間軸で予定を持つ
複数の
1本の
- 店舗の
間の 移動時間を 表に する。 「店舗A→店舗B」の 移動に かかる 時間を、 店舗の 組み合わせごとに 持つ。 行きと 帰りで 違う 場合も 分けて 持てるように する - 店舗が
変わる 同じ前後に、 移動の 時間を 自動で 置く。 日に A店の シフトの あとに B店の シフトが ある 場合、 A店の 最後の 予約の 終わりから、 B店の 最初の 予約の 始まりまでに、 移動時間以上の 空きが あるかを 確かめる - シフト自体の
重なりを 同じ登録の 時点で 止める。 時間帯に 2つの 店舗の シフトを 入れようとしたら、 保存させない
移動の
会員の
休憩は、予約で埋まる前に時間を確保しておく
休憩は、
雇用している
| 確かめる |
仕組みでの |
|---|---|
| 勤務の |
シフトの |
| 休憩が |
休憩が |
| 休憩の |
予約の |
| 休憩を |
動かした |
業務委託の
その
同時に押された予約が重ならないよう、データベースで止める
二重予約を
PostgreSQL なら、btree_gist 拡張を
CREATE EXTENSION IF NOT EXISTS btree_gist;
-- 予約。手がふさがる時間(前後の準備を含む)を busy に入れる
CREATE TABLE booking (
id bigserial PRIMARY KEY,
trainer_id bigint NOT NULL,
store_id bigint NOT NULL,
member_id bigint NOT NULL,
menu_id bigint NOT NULL,
starts_at timestamptz NOT NULL, -- 会員に見せる開始
ends_at timestamptz NOT NULL, -- 会員に見せる終了
busy tstzrange NOT NULL, -- 準備を含めた、ふさがる時間
status text NOT NULL DEFAULT 'confirmed',
-- 取り消した予約は重なりの判定から外す
EXCLUDE USING gist (trainer_id WITH =, busy WITH &&)
WHERE (status = 'confirmed')
);この
範囲の[開始, 終了))にbusy に
シフトを変えるときは、入っている予約との食い違いを保存の前に見せる
シフトを
仕組みと
シフトを
作り始める前に、この表の空欄を埋めておく
ここまでの
| 項目 | 決めること |
|---|---|
| 開始時刻の |
何分ごとの |
| メニューごとの |
前と |
| 指名の |
指名あり・ |
| おまかせの |
誰から |
| 店舗の |
店舗の |
| 休憩 | 勤務の |
| 業務委託の |
受付可能な |
| 二重予約の |
データベースの |
| シフト変更の |
は |
株式会社bundlyzeは、
出典
次の
- 厚生労働省
「労働時間・休日」 :休憩の最低限 (6時間を 超える 場合は 45分、 8時間を 超える 場合は 1時間) - 厚生労働省
「フリーランスと :労働者性のして 安心して 働ける 環境を、 整備する ための ガイドライン」 (確かめよう労働条件) 判断の 考え方 - PostgreSQL Documentation「Range Types」:範囲の
型、 排他制約、 btree_gist との 組み合わせ
よくある質問
空き枠は、あらかじめ予約枠の表として作っておくほうが簡単ではありませんか?
最初は
業務委託のトレーナーにも、システムでシフトを割り当てていいですか?
業務委託の
同じ時間に2人の会員が同じトレーナーを予約しようとしたら、どうなりますか?
画面で