Newer
Older
client_dwatch / lib / fixtures / schedules.ts
import type { Schedule } from "@/lib/types";

/** ★fixtures のスケジュールは必ずシリアルを持つ★(API の型は0台の清掃エリアで `null` を許す。指示書BB U2。型で固定・データは変えない) */
export type FixtureSchedule = Schedule & { serial_number: string };

/**
 * スケジュールのサンプルデータ(Pudu Cloud由来。D-Watchは参照のみ)
 *
 * weekdays は「日月火水木金土」の7桁。清掃する曜日が 1。
 *   毎日     = 1111111
 *   月水金   = 0101010
 *   平日のみ = 0111110
 *   土日のみ = 1000001
 *
 * docs/fixtures.md §8 のケース
 *   - 曜日パターン(毎日 / 月水金 / 平日のみ / 土日のみ)
 *   - 有効・無効(active の true / false)
 *   - 日跨ぎ(23:30開始〜00:30終了)
 *
 * ★無効スケジュールは「連続日数カウント」の対象外★
 *   判定ロジックの確認にも使うので、active=false のデータは消さないこと。
 *
 * ---------------------------------------------------------------------------
 * ★D-050: 既定(当日)の schedule_progress を「正常」に保つための制約★
 * ★★2026-10-29(案B)でダッシュボードはこの制約に依らなくなった★★ — `schedule_progress.planned` は
 *   対象日(直近モードは前日)の清掃ログの行数になり、`clean_schedules`(このファイル)を読まない。
 *   下の説明は当時の経緯(`/schedules` 画面の fixtures としては引き続き有効)。
 *
 * `computeScheduleProgress`(lib/dashboard/aggregate.ts)の `planned` は
 * 「その日の曜日に該当する active なスケジュールの総数」であり、**施設ごとの対応は見ない**
 * (どの施設のログかは一切参照しない、フラットな件数カウント)。
 *
 * 一方 `lib/fixtures/clean-logs.ts` の当日分(daysBack=0 の boundaryCases 10施設10行 +
 * ★結果待ちの pendingCases 1行(D-173)★)は実行日からの相対生成で、**曜日に関係なく毎日必ず11行**になる
 * (_helpers.ts の `at()` 参照)。
 *
 * この2つを常に一致させる(=画面を開くたびに data.anomaly が出ないようにする)には、
 * 「有効スケジュールの曜日該当件数」が**どの曜日であっても常に11件**になっている必要がある。
 *
 * 単純に全スケジュールを「毎日」にすると 月水金/平日のみ/土日のみ という
 * パターンのバリエーション(§8で要求)が有効データとして残せなくなる。
 * そこで、曜日パターンを持つ有効スケジュール同士を**互いに補完する組**にして
 * 「どちらか片方は必ず1件該当する」形にしている。
 *
 *   - id25(平日のみ = 0111110)+ id26(土日のみ = 1000001)
 *       月〜金 と 土日 で全曜日を過不足なくカバーする補完ペア → 常に合計1件
 *   - id23(月水金 = 0101010)+ id30(日火木土 = 1010101、id23の反転)
 *       月水金 と それ以外 で全曜日を過不足なくカバーする補完ペア → 常に合計1件
 *
 * 残りは「毎日(1111111)」の有効スケジュール9件(id21,22,27,28,29,31,32,33,34)。
 * 補完ペア2組(各常に1件)+毎日9件 = どの曜日でも常に11件。
 * ★id34 は D-173 で追加★(当日の結果待ちの行 施設11 を足して当日ログが11行になったため)。
 *
 * id24(施設6・無効)は元々の「無効スケジュール」デモとしてそのまま残している
 * (active=false なのでこの合計には影響しない)。
 *
 * id31/32/33 は、当日ログ(施設9・10・12)に対応するスケジュールが元々
 * 1件も存在しなかったため新規追加したもの(★制約:この件数調整のために
 * lib/fixtures/clean-logs.ts 側は変更していない★)。
 *
 * 検証手順(docs/fixtures.md §12 参照):
 *   GET /api/dashboard (date省略・当日)→ planned=11, completed=9, anomaly無し
 *   (★D-173 で当日ログが11行になった。うち出発なし2行=施設12の出発失敗・施設11の結果待ち★)
 * ---------------------------------------------------------------------------
 */
export const schedules: FixtureSchedule[] = [
  {
    id: 21,
    serial_number: "8111R5628060011",
    facility_id: 1,
    facility_name: "メガバリューマート中央本店",
    weekdays: "1111111",
    weekdays_label: "毎日",
    start_time: "02:00",
    end_time: "03:00",
    active: true,
  },
  {
    id: 22,
    serial_number: "8111R5628060022",
    facility_id: 2,
    facility_name: "バリューマート北町店",
    weekdays: "1111111",
    weekdays_label: "毎日",
    start_time: "02:00",
    end_time: "02:45",
    active: true,
  },
  {
    // ★エスカレーション判定の要のデータ★
    // 月水金スケジュール。カレンダー日ではなくスケジュール存在日で連続を数える(D-026)
    // ★D-050: id30 と曜日が補完し合うペア。id23 はそのまま「月水金」で変更していない★
    id: 23,
    serial_number: "8111R5628060044",
    facility_id: 4,
    facility_name: "バリューマート西通り店",
    weekdays: "0101010",
    weekdays_label: "月水金",
    start_time: "03:00",
    end_time: "03:45",
    active: true,
  },
  {
    // 無効スケジュール
    id: 24,
    serial_number: "8111R5628060077",
    facility_id: 6,
    facility_name: "バリューマート南丘駅前店",
    weekdays: "1111111",
    weekdays_label: "毎日",
    start_time: "02:30",
    end_time: "03:15",
    active: false,
  },
  {
    // 平日のみ
    // ★D-050: id26(土日のみ)と補完ペア。月〜金+土日で全曜日を過不足なくカバー★
    id: 25,
    serial_number: "8111R5628060033",
    facility_id: 3,
    facility_name: "メガバリューマート東口店",
    weekdays: "0111110",
    weekdays_label: "平日のみ",
    start_time: "01:30",
    end_time: "02:15",
    active: true,
  },
  {
    // 土日のみ
    // ★D-050: id25(平日のみ)と補完ペア★
    id: 26,
    serial_number: "8111R5628060122",
    facility_id: 8,
    facility_name: "メガバリューマート桜台店",
    weekdays: "1000001",
    weekdays_label: "土日のみ",
    start_time: "02:00",
    end_time: "02:40",
    active: true,
  },
  {
    // 日跨ぎ(23:30 → 00:30)
    id: 27,
    serial_number: "8111R5628060055",
    facility_id: 5,
    facility_name: "メガバリューマート港南総本店",
    weekdays: "1111111",
    weekdays_label: "毎日",
    start_time: "23:30",
    end_time: "00:30",
    active: true,
  },
  {
    // 1施設に複数ロボット(施設7は3台)
    id: 28,
    serial_number: "8111R5628060099",
    facility_id: 7,
    facility_name: "メガバリューマート緑野店",
    weekdays: "1111111",
    weekdays_label: "毎日",
    start_time: "01:30",
    end_time: "02:10",
    active: true,
  },
  {
    id: 29,
    serial_number: "8111R5628060100",
    facility_id: 7,
    facility_name: "メガバリューマート緑野店",
    weekdays: "1111111",
    weekdays_label: "毎日",
    start_time: "01:30",
    end_time: "02:10",
    active: true,
  },
  {
    // 3台目は他の2台と違う曜日パターン、という「複数ロボットで別パターン」の
    // デモを兼ねつつ、id23(月水金)の反転(日火木土)にして曜日補完ペアにしている
    // (★D-050★。以前は id23 と同じ「月水金」だったが、それだと2つの
    // 月水金スケジュールが同じ曜日に重複してカウントされ、曜日によって
    // planned の合計が変動してしまうため変更した)
    id: 30,
    serial_number: "8111R5628060177",
    facility_id: 7,
    facility_name: "メガバリューマート緑野店",
    weekdays: "1010101",
    weekdays_label: "日火木土",
    start_time: "02:00",
    end_time: "02:50",
    active: true,
  },
  {
    // ★D-050で追加★ 当日ログ(boundaryCases)に施設9の行があるのに対応する
    // スケジュールが1件も無かったため追加。毎日・有効。
    id: 31,
    serial_number: "8111R5628060133",
    facility_id: 9,
    facility_name: "メガバリューマート三ツ橋中央ショッピングセンター店",
    weekdays: "1111111",
    weekdays_label: "毎日",
    start_time: "02:30",
    end_time: "03:15",
    active: true,
  },
  {
    // ★D-050で追加★ 施設10も同様(対応するスケジュールが無かった)
    id: 32,
    serial_number: "8111R5628060144",
    facility_id: 10,
    facility_name: "フレッシュタウン大和店",
    weekdays: "1111111",
    weekdays_label: "毎日",
    start_time: "03:00",
    end_time: "03:40",
    active: true,
  },
  {
    // ★D-050で追加★ 施設12も同様(対応するスケジュールが無かった)
    id: 33,
    serial_number: "8111R5628060166",
    facility_id: 12,
    facility_name: "フレッシュタウン湖畔店",
    weekdays: "1111111",
    weekdays_label: "毎日",
    start_time: "03:30",
    end_time: "04:15",
    active: true,
  },
  {
    // ★D-173で追加★ 施設11(川下店)の今日の結果待ちの行(`lib/fixtures/clean-logs.ts` の `pendingCases`)に
    //   対応するスケジュール。★当日の清掃ログが11行になったので、どの曜日でも11件にするため「毎日」で足した★(D-050 の不変条件)
    id: 34,
    serial_number: "8111R5628060155",
    facility_id: 11,
    facility_name: "バリューマート川下店",
    weekdays: "1111111",
    weekdays_label: "毎日",
    start_time: "03:30",
    end_time: "04:30",
    active: true,
  },
];