Skip to content
ryokohbato edited this page Mar 28, 2022 · 8 revisions

簡単な説明は、例会講座の話 (Scrapbox) にある。

以下に仕様書を示す。各バージョンごとの仕様の差分は、それぞれのページを参照されたい。

仕様書

テーブルの構造

Slack User ID 登録日 希望曜日 担当日 割り当てグループ 割り当て日 割り当て状態 割り当てメッセージのタイムスタンプ
U01U7S3UFAB 20211107 1 20211128 20211128 20211107 10 1640084405.000900
create table reikai_kouza (id varchar(30), registration_date int, preferred_day_of_week tinyint, assigned_date int, assignment_group int, announced_date int, announcement_status tinyint, message_ts varchar(20));

各値の型と概要

Slack User ID (VARCHAR(30))

大きめに、英数字 30 文字程度までとしておく (VARCHARには長さプレフィックスが含まれる)

登録日 (INT)

整数型 (20210107のように保存)
システムへの登録日

希望曜日 (TINYINT)

未回答 = -1, どちらも = 1, 月曜 = 2, 木曜 = 3

担当日 (INT)

登録日と同じ形式

割り当てグループ (INT)

登録日と同じ形式
割り当てグループの日付は発表日を表す。
この値は、延期した場合にのみ延期先の日付で更新され、それ以外の場合は更新されない。

割り当て日 (INT)

システムにより割り当てが行われ、Slack上で通知が行われた日付

割り当て状態 (TINYINT)

日時指定が行われたかどうか、およびそれにたいして何らかのアクションがあったかを表す
0 = 未割り当て, 1 = 返信なし, 2 = キャンセル, 3 = 延期, 10 = 対処済み

割り当てメッセージのタイムスタンプ (VARCHAR(20))

割り当て時に送信されるメッセージのタイムスタンプ

システムの動作

毎日動作するもの

追加の割り当て → 更新 → 割り当て → 公開・告知の順にチェック・実行される。

割り当て

毎週 月、木曜日にそれぞれ1回実行され、1週間で2名に割り当てが行われる。 割り当てグループで探索して、既に1人以上いれば割り当てない。

延期により決定した担当日を優先し、残った枠について振り分けを行う。 振り分けの条件は以下の通り

登録日から3ヶ月以上経過している かつ 希望曜日である (「未回答」は「どちらでも」と同じ扱い) かつ 割り当てグループから3ヶ月以上経過している かつ 割り当て状態が0

条件に一致する部員がいなければ、何も行わない。

Slackに送信したら、割り当て状態を1に、割り当てグループを対象の担当日の日付で、割り当て日をその日付でそれぞれ更新する。

  1. 返答があった場合
    ボタンを押せないようにしておく。

    その日付で確定された場合: 割り当てグループの日付で担当日を登録し、割り当て状態を10に更新。
    延期の場合: 延期先の日付で担当日を登録し、割り当て状態を3に更新。(割り当てグループの更新は、追加の割り当て時に行う) 当該の割り当てグループは追加の割り当ての対象となる。
    スキップした場合: 割り当て状態を2に更新。追加の割り当ての対象となる。

  2. 返答がなかった場合
    2日間待って返答がなかった場合、追加の割り当ての対象となる。ボタンを押せないようにする。

追加の割り当て

追加の割り当ては、「現在の日付から3週間以内 かつ 現在の日付から2週間以上先」を満たす割り当てグループにのみ実行される。
現在の日付からみて2週間先よりも直近」の割り当てグループに対しても同様の操作を行うが、割り当ての呼び出しは行わない。

追加の割り当ては以下の条件で発生する。

割り当て状態が1 かつ 割り当て日から2日が経過している または 割り当て状態が2である または 割り当て状態が3である

割り当て状態が1のとき

割り当てグループはもとの値を引き継ぎ、割り当て日は実際の日付で更新する。
ボタンを押せないようにした上で、もとの部員の割り当て状態を10に更新する。

割り当て状態が2のとき

割り当てグループはもとの値を引き継ぎ、割り当て日は実際の日付で更新する。
もとの部員の割り当て状態を10に更新する。

割り当て状態が3のとき

割り当てグループはもとの値を引き継ぎ、割り当て日は実際の日付で更新する。
もとの部員の割り当てグループを延期先の日付 (担当日) で更新した上で、割り当て状態を10に更新する。

更新

登録日から3ヶ月以上経過しているを満たす全員が、割り当て状態が10になったら、全員の割り当て状態を0に更新する。

希望日調査

登録日から2ヶ月半が経過したら、自動的に送付する。
既存の部員には前もって送付するため、単独で実行可能になっていると良い。

担当者情報の公開・告知

担当日の1週間前に #active で担当者が公開される。担当日だけでなく、割り当て状態も併せて確認する。(将来的な実装の足かせにならないように、なるべく厳密な判定をする)

説明と割り当ての予告

新しい例会講座システムの説明を送信する。既存の部員に対してはシステムの稼働前に一斉送信、新規の部員にはデータベースへの登録時に送信する。

スラッシュコマンド

登録確認

/reikai-kouza-check を用いて、現在登録されている例会講座の担当日を確認できる。

単にDBから担当日を取得して、現在の日付より後の値になっていればそれを通知すればよい。

例会講座の登録キャンセル

例会講座の担当を登録した翌日から (そのままの日付で登録した場合は当日から) 講座担当日の前日までの間は、登録のキャンセルが可能である。スラッシュコマンド /reikai-kouza-cancel を使用して手続きを行う。 手続きは、「担当日が今日より先の日付 かつ 割り当て状態が10または0 かつ 9:45~10:15の間ではない」を満たす場合のみ行うことができる。

割り当て状態が10のとき

割り当て状態を10から2に書き換えるとともに、担当日を-1に設定する。

割り当て状態が0のとき

担当日を-1に設定する。

名簿の処理

既存の部員への対応

システムの稼働時のみ実行される。 登録日は実際の日付の6ヶ月前、希望曜日は-1 (未回答)、担当日は-1、割り当てグループは実際の日付の6ヶ月前、割り当て日は実際の日付の6ヶ月前、割り当て状態は0で追加する。
同時に、希望曜日を聞く。

新規の部員への対応

1日1回更新される。

名簿に追加があった場合、以下のとおりに追加する。
登録日は実際の日付、希望曜日は-1 (未回答)、割り当てグループは実際の日付の6ヶ月前、割り当て日は実際の日付の6ヶ月前、割り当て状態は0で追加する。
また同時に、Slack上で3ヶ月後から割り当てがある旨の告知をしておく。
約2ヶ月半経ったら希望曜日を聞く。

名簿から削除する場合は、そのまま部員の情報を消す。

既知の問題

  • システムの稼働時、入部したての部員も対象となる。 (影響範囲が限定的であるため、対応は見送り)
  • 延期日が被ってしまった場合、現状は人数の過剰状態に対して対応する手段がない
  • 例会の開催がない日にも割り当てが発生する

仕様が変わると不具合が起きそうなポイント

  • 割り当てグループから3ヶ月以上としている点 (現状、延期は2週間程度までしか想定していないため)
  • 既存の部員の登録時、登録日と割り当てグループを実際の日付の6ヶ月前にしている点 (3ヶ月以上前の日付にしておかないと、指名の対象にならない)
  • 新規部員の登録時、割り当てグループを実際の日付の6ヶ月前にしている。 (上記と同等の理由)

その他

日付情報は、全て外部から呼び出しと同時に指定する。これは、各種検証やサーバーメンテナンスに対応するための措置である。