20時から翌2時の枠と、23時からの枠が両方通った理由

20:00〜02:00 の枠と 23:00〜23:30 の枠が、同じキャストの同じ日に両方とも保存できた。重なっているのに、だ。 昨日の予告どおり、勤務時間の入力の話を書く。うちのデリヘル管理ツールでは、勤務の終わりを「25:00(翌1:00)」のように24を超えた時刻で選ぶ。 深夜まで働く店で「翌日の1時」を日付つきで入力させるのは無理があるからで、この表記自体は7月に4つの画面をひとつの部品にまとめたときに入れた。 管理者のキャスト管理とドライバー管理は行を足して日付を手で打つ方式、本人用の2画面は毎日時刻を打ち直す方式で、4つとも入力の仕方が違っていた。 直近14日を曜日つきの固定行にして、基本の時間帯を1回選んで全日・平日・週末へ流し込む形に揃えた。終わりの選択肢は 29:30(翌5:30)までにしてある。

キャスト管理画面の勤務時間エディタ。上部に「基本の時間帯を選んで、出勤する日へまとめて適用できます」と 17:00〜25:00(翌1:00)のプルダウン、全日に適用・平日に適用・週末に適用・すべて休みにのボタン。その下に 9/12(土)〜9/20(日) の行が並び、月〜金にチェックが入って 17:00〜25:00(翌1:00)、土日は「休み」
終わりの時刻は「25:00(翌1:00)」のように24時を超えて選ぶ。保存するときは 01:00 に戻して送る(画面はデモデータです)。

画面は25時、保存は1時、判定は文字列

画面で 25:00 を選んでも、サーバーへ送るのは従来どおりの 01:00 で、受け取った側が「終わりが始まりより前なら翌日」と読み替える。 送る形を変えなかったのは、前からある保存の仕組みをそのまま使うためだった。ところがその保存側の重なりチェックが、 同じ日付の枠を開始時刻で並べて、隣どうしの時刻の文字を大小比較しているだけだった。 20:00〜02:00 の次に 23:00〜23:30 が来ると、「23:00」は「02:00」より後ろの文字列なので重なっていないと判定される。 日付をまたぐ組み合わせ、たとえば 22:00〜翌4:00 と翌日の 02:00〜06:00 は、日付が違うので比べられもしない。 ドライバー側にいたってはチェック自体が無かった。8月の頭にグループ会社機能を総点検していて見つけ、 枠を日付と時刻から実際の日時の区間に直してから重なりを見る部品を作り、キャストとドライバーの両方をそこへ通すようにした。 17:00 で終わる枠と 17:00 から始まる枠は重なりではない、という境界もこのとき決めた。

8月21日には本番で保存が全滅した。原因は2つ重なっていて、ひとつは開始を終わりより後ろへ動かしたときの表示。 18:00 終わりのまま開始を 20:00 に変えると、25時表記に直した値が 42:00 になり選択肢に無い。画面は先頭の選択肢を出すのに中身は 18:00 のままで、 「20:00〜翌18:00」の22時間の枠として送っていた。もうひとつは、管理画面が過去のシフトまでフォームへ流し込み、 エディタが窓の外の行をそのまま送り返し、保存側は今日以降しか消さないので、保存するたびに過去分が増えていたこと。 増えた複製どうしが直したばかりの重なりチェックに掛かって、正しく入力しても「勤務時間が重複しています」で止まる。 チェックを厳しくしたぶん、入力側の小さなずれが全部そこで露見した格好で、上限の 29:30 へ丸める・過去の行は受け付けない、の2つで塞いだ。

明日は、系列店を掛け持ちするキャストのシフトを店をまたいで見て、重なりを止める話。