/**
* `facilities.contract`(10桁の文字列。D-080)↔ 契約フラグの変換。
*
* ★数値として比較しないこと★ — `Number("0000000000")` は例外を出さずに `0` になり、
* `contract === 3` のような比較は絶対に真にならない。結果として全施設が
* 「契約なし」になるが、例外もテスト失敗も出ない(D-080)。
*
* ここでは文字の完全一致(`contract[i] === "1"`)だけで判定する。
* 桁位置は `lib/config/index.ts` の `CONTRACT_DIGITS` から読み、ここに直書きしない。
*/
import { CONTRACT_DIGITS } from "@/lib/config";
export interface ContractFlags {
monitoring_enabled: boolean;
d_security_enabled: boolean;
}
const CONTRACT_LENGTH = 10;
/**
* `contract` 文字列からフラグを取り出す。
*
* ★桁が足りない文字列・空文字・10桁を超える文字列でも例外を投げない★
* 該当する桁が存在しなければ `undefined === "1"` は `false` になり、自然に「契約なし」扱いになる。
*/
export function parseContract(contract: string): ContractFlags {
return {
d_security_enabled: contract[CONTRACT_DIGITS.dSecurity] === "1",
monitoring_enabled: contract[CONTRACT_DIGITS.dWatch] === "1",
};
}
/**
* フラグから `contract` 文字列(10桁)を組み立てる(seed が fixtures から逆算するときに使う)。
*/
export function buildContract(flags: ContractFlags): string {
const digits = Array<string>(CONTRACT_LENGTH).fill("0");
if (flags.d_security_enabled) digits[CONTRACT_DIGITS.dSecurity] = "1";
if (flags.monitoring_enabled) digits[CONTRACT_DIGITS.dWatch] = "1";
return digits.join("");
}