Newer
Older
client_dwatch / lib / db / fixture-prechecks.ts
/**
 * fixtures 版 `prechecks()` の絞り込み(指示書AC ★段階4★。段階2 D-5 の作法をそのまま真似る)。
 *
 * ★★`USE_FIXTURES` の true/false で件数が変わってはいけない★★(指示書AC 禁止事項6)。
 *   Prisma 版が SQL に降ろした条件(日付範囲・施設ID)と ★同じ意味★ をここで再現します。
 *
 * ★絞り込み規則の「正」は `filterPrechecksByDate()`(`lib/prechecks/query.ts`)★ —
 *   ここも Prisma 側もその ★写し★ です(指示書AC C-5)。
 *   ★★`filterPrechecksByDate()` を外さないこと★★。
 *
 * ★★2種類の行(`precheck` / `launch_failed`)を同じ条件で絞る★★ —
 *   fixtures では ★どちらの行も `scheduled_at` に「本清掃の予定時刻」が入っている★ので、
 *   ★種別で分岐せず1つの条件で済みます★(Prisma 版が親の本清掃行の `start_at` で
 *   両方を絞るのと同じ意味。`PrecheckDbQuery` の型コメント)。
 *   ★★`detected_at` で絞らないこと★★ — `severity: "precheck"` の行は
 *   `detected_at`(検知時刻)が予定時刻の60分前なので、★日をまたぐ行が消えます★。
 *
 * ★DBアクセスを混ぜない純粋関数★(テストから直接呼べるようにするため。
 * `lib/db/fixture-clean-logs.ts` / `lib/db/fixture-area-completions.ts` と同じ流儀)。
 */
import type { PrecheckDbQuery, PrecheckItem } from "@/lib/types";

/**
 * ★日付の比較は文字列のまま行う★ — `scheduled_at` は ISO8601(+09:00)なので
 * ★先頭10文字が JST の日付そのもの★ になり、実行環境のタイムゾーンに依存しません
 * (`filterPrechecksByDate()` / `filterFixtureCleanLogs()` と同じ作法)。
 * ★`new Date()` を挟むと、Prisma 版が壁時計値で絞っているのと基準がずれます★。
 */
export function filterFixturePrechecks(
  rows: readonly PrecheckItem[],
  query: PrecheckDbQuery
): PrecheckItem[] {
  return rows.filter((row) => {
    const date = row.scheduled_at.slice(0, 10);
    // ★★`!== null` で分岐すること★★(罠1と同じ形。`?` や `||` で書くと条件が静かに消える)
    if (query.date_from !== null && date < query.date_from) return false;
    // ★`date_to` はその日を**含む**(`dbDateRange()` の `lt` = 翌日 00:00 と同じ意味)★
    if (query.date_to !== null && date > query.date_to) return false;
    // ★★`!== null` で分岐すること★★(罠1)— `query.facility_ids?.length` と書くと
    //   `[]`(分類で絞って0件ヒット)が「指定なし=全件」に化ける。
    //   ★Prisma 版の `facility_id: { in: [...] }` と同じ意味★(禁止事項6)。
    if (query.facility_ids !== null && !query.facility_ids.includes(row.facility_id)) {
      return false;
    }
    return true;
  });
}