"""부대시설 다섯 줄 — 법이 요구하는데 안 내던 것 (2026-09-09 사용자 확정 ⑬). ⚠ 겨누는 것 여섯 ① 다섯 줄이 **개소를 안 넣어도 선다** — 빠진 것이 화면에 보이게 ② 개소를 **지어내지 않는다** — `연장÷500` 같은 산식을 쓰지 않음 ③ ⚠ 사유를 **갈라 적는다** — 「품셈에 공종이 없음」과 「개소 미입력」은 할 일이 다름 ④ 법정 의무인 줄은 **그 사실이 사유에 적힌다** ⑤ 공종이 있는 하나(가설창고)는 **값이 서고 코드가 붙는다** ⑥ 인계에도 **실려 나간다** — 빼면 받는 쪽이 빠진 줄을 못 봄 """ from __future__ import annotations import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[2] sys.path.insert(0, str(ROOT)) from B08_Quantity.B08_Quantity_Engine_Handoff import build_handoff # noqa: E402 from B08_Quantity.B08_Quantity_Engine_Preparation import ( # noqa: E402 STATUS_READY, ancillary_rows, build_table, ) def 줄(counts: dict | None = None) -> dict: return {row["item"]: row for row in ancillary_rows(counts)} def test_다섯_줄이_개소_없이도_선다() -> None: rows = 줄() assert set(rows) == { "국가지점번호판", "임도 안내판", "차단기", "가설창고(컨테이너)", "수방대책 자재", } assert all(row["amount"] is None for row in rows.values()) def test_개소를_지어내지_않는다() -> None: """⚠ 임도규정이 「필요시 거리를 조정」이라 `연장÷500` 은 확정 산식이 아니다.""" for row in 줄().values(): assert row["amount"] is None assert "개소가 아직 입력되지 않았습니다" in row["reason"] def test_사유를_갈라_적는다() -> None: """⚠ 「품셈에 공종이 없음」과 「개소 미입력」은 **다음에 할 일이 다르다**.""" rows = 줄({"national_point_sign": 3}) sign = rows["국가지점번호판"] assert sign["amount"] == 3.0 # 개소는 채워졌으니 그 사유는 사라지고, 공종이 없다는 사유만 남는다. assert "개소가 아직 입력되지 않았습니다" not in sign["reason"] assert "품셈에 그 이름의 공종이 없음" in sign["reason"] def test_법정_의무가_사유에_적힌다() -> None: rows = 줄() assert "법정 의무" in rows["국가지점번호판"]["reason"] assert "제26조제5항" in rows["국가지점번호판"]["reason"] assert "법정 의무" in rows["임도 안내판"]["reason"] # 차단기는 교본만 있고 법령에 없다 — 「법정」이라 적으면 거짓이 된다. assert "법정 의무" not in rows["차단기"]["reason"] def test_공종이_있는_하나는_값이_선다() -> None: row = 줄({"site_container": 2})["가설창고(컨테이너)"] assert (row["work_item_code"], row["amount"], row["status"]) == ("FP-11-01", 2.0, STATUS_READY) def test_준비공_표와_인계에_함께_실린다() -> None: """⚠ 빼면 받는 쪽이 「빠진 줄」을 못 본다 — 값이 없어도 사유와 함께 간다.""" table = build_table({}, [], [], None, None, {"site_container": 1}) names = [row["item"] for row in table["rows"]] assert "국가지점번호판" in names rows = build_handoff(preparation_table=table)["work_items"] handed = {row["name"]: row for row in rows} assert "국가지점번호판" in handed assert handed["국가지점번호판"]["in_bill"] is False assert handed["가설창고(컨테이너)"]["work_item_code"] == "FP-11-01"