fix(axis): 미판정 표 형태를 사람이 가름 — 66표 판정·까닭 한 줄, 찰쌓기(인력) 막힘 풀림

자동 판정이 못 가른 76표 중 64표와 오판 2표(13-4-4 뒷길이 표준·표준경사)를 표 머리·바로 위 본문 단위로 가름.
생산량형 8 · 소요량형 1 · 계수 23 · 참조 34. 못 가른 13표는 미판정으로 남김.
표 번호와 절 번호를 함께 대조해 원천 차례가 밀리면 빌드를 멈춤. 일위대가 금액 변화 없음.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW6Jdsh18WPtYUR6THZJqn
This commit is contained in:
2026-09-13 21:56:39 +09:00
co-authored by Claude Opus 5
parent 644640ee59
commit cacbb08f10
7 changed files with 386 additions and 1753 deletions
@@ -33,6 +33,8 @@ from datetime import datetime, timezone
from pathlib import Path
from typing import Any
from B08_Quantity.B08_Quantity_Build_WorkItemMaster_Forms import judged_form
ROOT = Path(__file__).resolve().parent.parent
SOURCE = ROOT / "resources" / "data_cost_input_value" / "pum_forest_2026.json"
OUT_DIR = ROOT / "resources" / "data_work_item_master"
@@ -609,6 +611,8 @@ def build() -> dict[str, Any]:
number = section_number(section)
chapter = number.split("-")[0] if number else None
form, why = detect_form(table, chapter)
# 사람이 가른 형태가 자동 판정을 이긴다 — 표마다 까닭 한 줄(미판정 표 판정, 2026-09-13).
form, why = judged_form(table["table_id"], number) or (form, why)
# ⚠ **본문이 정본이다.** 표 안을 긁는 쪽은 보조 — 비고에 적힌 다른 기준
# (「10㎡당」 같은 참고 문구)을 그 표의 밑수로 잘못 물어 온다.
# 실제로 13-3-1 이 본문 `(단위: ㎥당)` 인데 표 안 긁기가 `10㎡` 를 물어 왔다.
@@ -0,0 +1,158 @@
"""공종 마스터 — **사람이 가른 표 형태** (2026-09-13 축 C 1장 · 미판정 표 판정).
자동 판정(`detect_form`)이 못 가르거나(undetermined 76표) 잘못 가른 표만 싣는다.
표마다 **왜 그렇게 갈랐는지 한 줄** — 원문 `(산림청고시 제2025-82호) 산림사업 표준품셈.md`.
⚠⚠ 뒤집히면 20배 틀림 — `productivity`(1÷값) / `requirement`(값÷밑수)는 **표 머리와 표 바로 위
본문의 단위 표현**으로만 가른다. 행 이름·비고의 직종 이름에 끌려 읽지 않는다.
⚠ **못 가른 표는 싣지 않는다** — undetermined 로 남는다(막갈이 깊이표·드론운반 인원 등 밑수 불명).
⚠ `coefficient`·`reference` 로 가른 표는 일위대가 줄로 안 읽힌다(자원 축이 건너뜀) — 시공능력
공식 계수는 형태와 상관없이 공식 읽기가 표를 직접 본다.
⚠ 표 번호는 원천 차례로 매긴 것이라 **절 번호를 함께 대조**한다 — 어긋나면 빌드를 멈춘다.
"""
from __future__ import annotations
#: 표 번호 → (절 번호, 형태, 까닭).
FORM_JUDGMENTS: dict[str, tuple[str, str, str]] = {
# ── 제2장 재료 기준 ─────────────────────────────────────────────
"F0044": (
"2-1-1",
"reference",
"기계별 주연료(/일·대)·잡품(%) — 행이 자원이 아니라 기계, 재료비 산출 기준",
),
"F0045": ("2-1-1", "reference", "위와 같은 모양(2드럼 케이블윈치)"),
"F0047": (
"2-1-2",
"reference",
"기계별 경유(/일·대)·잡품(%) — [주]③ 「1일당 소요량」, 행이 기계",
),
"F0048": ("2-1-3", "reference", "머리 「소요비용(원)」 — 품이 아니라 교체 1회당 금액"),
"F0054": ("2-1-5", "requirement", "본문 「(본당)」 + 행 「소금처리량(g)」 — 본당 재료 소요량"),
"F0063": (
"2-1-13",
"reference",
"「소모율 0.00125개/hr」 — 기계 시간당 소모품, 공종 밑수가 아님",
),
# ── 제5장 조림·녹화 ─────────────────────────────────────────────
"F0100": ("5-3-1", "reference", "수종별 묘목 규격(소·중·대묘) 표"),
"F0101": ("5-3-1", "reference", "간장·근원경 규격 기준 표"),
"F0105": ("5-3-4", "coefficient", "지주목 미설치 감률 「인력품의 10%·20%"),
"F0107": ("5-3-5", "coefficient", "위와 같은 감률(흉고직경 표)"),
"F0137": ("5-24-2", "reference", "머리 「종자배합비율(%)」 조견표"),
"F0138": ("5-24-2", "reference", "위와 같은 조견표(기타 적용지역)"),
"F0146": ("5-29", "coefficient", "행이 K(버킷계수)·f·E·Cm — 굴착기 작업량 공식 계수"),
# ── 제7장 수확·운재 ─────────────────────────────────────────────
"F0187": ("7-9-2", "coefficient", "본문 「(단위 : %)」 — 집재재적·거리별 수집량 증가율"),
"F0189": ("7-11", "productivity", "표 바로 위 「(㎥/1대, 1일)」 — 대당 일 작업량"),
"F0190": ("7-11", "productivity", "위와 같음(최대집재거리 80m 이하)"),
"F0194": ("7-13", "reference", "검척 산출 예시(말구직경×개수) 표"),
"F0196": (
"7-15-1",
"productivity",
"표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량, 「회수」 줄은 참고",
),
"F0197": (
"7-15-2",
"productivity",
"표 바로 위 「(㎥/1대, 1일)」 — 「운재량」 줄이 작업량, [주]① 1대 1일",
),
"F0198": ("7-16", "productivity", "표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량"),
"F0199": ("7-17", "productivity", "표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량"),
"F0200": ("7-18", "productivity", "표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량"),
# ── 제8장 방제 ──────────────────────────────────────────────────
"F0205": ("8-2-1", "reference", "약제 이름·제형 목록"),
"F0208": ("8-2-2", "reference", "선정약제 목록 + 원액 주입량(㎖/㎝) 기준 — 품 표는 따로 있음"),
"F0212": ("8-2-3", "reference", "위와 같은 선정약제 목록"),
"F0216": ("8-2-4", "reference", "위와 같은 선정약제 목록"),
"F0218": ("8-2-5", "reference", "위와 같은 선정약제 목록"),
"F0453": (
"8-2-3",
"reference",
"〔부록 2〕 산림사업별 적용 가능 공종 목록 — 절 경계가 밀려 붙음",
),
"F0220": (
"8-3",
"productivity",
"머리 「벌목조재 (㎥/인)·무더기 훈증 (RM/인)·그루터기 박피 (본/인)」 — 인당 작업량",
),
"F0221": ("8-3", "coefficient", "본문 「(단위: %)」 — 수종·직경별 지조율"),
"F0222": ("8-3", "coefficient", "머리 「비율(수간재적의 %)」 — 근주재적 산정율"),
"F0227": ("8-6-1", "reference", "기종별 희석배수별 약제량(L, 1회) — 살포 계산표"),
"F0231": ("8-6-3", "reference", "희석배수별 약제소요량(㎖) — 물의 양 대비 계산표"),
# ── 제9장 토공 — 시공능력 공식 계수 ────────────────────────────
"F0281": ("9-15-1", "coefficient", "행이 K·f·E·Cm — [주]② Q1=3600×q×K×f×E/Cm"),
"F0282": ("9-15-2", "coefficient", "행이 T·L·E·q — 불도저 작업량 공식 계수"),
"F0284": ("9-16-2", "coefficient", "행이 V·W·E·D — [주]② Q=1000×V×W×E×D×f/N"),
"F0285": ("9-16-3", "coefficient", "흡입준비·운반·흡입·대기 시간 — 살수차 사이클 시간"),
"F0287": ("9-18", "coefficient", "행이 K·f·E·Cm — [주]① Q1=3600×q×K×f×E/Cm"),
"F0295": ("9-22", "coefficient", "행이 K·f·E·Cm — [주]③ Q1=3600×q×K×f×E/Cm"),
# ── 제10장 운반 ─────────────────────────────────────────────────
"F0300": ("10-3-3", "reference", "「운반비·하차비」 적용 항목 — 값이 없는 구성 안내"),
"F0301": ("10-4", "coefficient", "t1·t2·t3·t4 — 트레일러 운반 사이클 시간"),
"F0308": ("10-7-4", "coefficient", "1사이클당 운반량 q — 모노레일 공식 계수"),
"F0309": ("10-7-4", "coefficient", "본문 「(단위: 분/1회당)」 — 적재·짐부리기 시간"),
"F0316": ("10-9-1", "reference", "규격별 1회당 표준 운반량(kg·개·㎡) — 적재 기준"),
"F0319": ("10-11", "coefficient", "행이 L·E·q0 — [주]② q=3.2×e, Cm 공식 계수"),
"F0320": ("10-12-1", "coefficient", "행이 K·E0·Cm — 굴착기 적재 공식 계수"),
"F0321": ("10-12-1", "coefficient", "적재·t2·적하 시간 — 덤프트럭 사이클 공식 계수"),
"F0324": (
"10-13-2",
"reference",
"드론운반 단가산출 항목(준비시간·왕복비행시간 식) — [주] 일본 산출 예",
),
# ── 제11·12장 ───────────────────────────────────────────────────
"F0328": ("11-4", "coefficient", "행이 q·k·f·E — [주]① Q=3600×q×k×f×E/Cm"),
"F0358": ("12-2", "reference", "시설유형 Type-Ⅰ~Ⅳ 적용 기준 설명"),
"F0360": ("12-2", "reference", "현장조건 Type-Ⅰ~Ⅲ 적용 기준 설명"),
"F0388": ("12-34-4", "reference", "「재료비 JOINT FILLER」 항목만 — 값이 없는 구성 안내"),
"F0390": ("12-36", "reference", "제작비·운송비·설치비 「견적처리」"),
"F0392": ("12-38-1", "coefficient", "사용횟수별 잔존율(12회 25%·25회 10%)"),
"F0394": ("12-38-2", "coefficient", "부자재 요율 「주자재비의 24%·52%·79%"),
"F0396": ("12-38-3", "reference", "설치 유형(복잡·보통·간단) 적용 시설 설명"),
# ── 제13장 구조물 ───────────────────────────────────────────────
"F0400": ("13-2-3", "reference", "큰돌 직경별 뒷길이 기준(㎝)"),
"F0406": (
"13-3",
"reference",
"〈돌쌓기의 개수 및 중량의 표준〉 — [주] 인력 돌쌓기·돌붙임 기준",
),
"F0408": (
"13-4-3",
"reference",
"고임돌 소요량(㎥/㎡) — 자재 원단위표(B08 고임돌표가 씀). 품으로 세우면 자재를 두 번 셈",
),
"F0410": (
"13-4-4",
"reference",
"[주]① 채움 콘크리트 소요량(㎥/㎡) — 자재 원단위표(B08 채움표가 씀). 품이면 두 번 셈",
),
"F0411": ("13-4-4", "reference", "[주]⑨ 성토 뒤채움 조약돌 두께(㎝) 기준"),
"F0412": (
"13-4-4",
"reference",
"[주]⑩ 뒷길이 표준(㎝) — 자동 판정이 「(m)」에 걸려 소요량형으로 오판",
),
"F0413": (
"13-4-4",
"reference",
"[주]⑪ 표준경사(1:n) — 자동 판정이 소요량형으로 오판, 찰쌓기(인력)를 막음",
),
"F0429": ("13-10-2", "coefficient", "[주]⑥ 관입률별 계수"),
"F0439": ("13-12-2", "coefficient", "[주]⑦ 높이·기울기 할증(%)"),
"F0446": ("13-15-2", "reference", "작업조건(어려운·쉬운) 구분 기준"),
}
def judged_form(table_id: str, number: str | None) -> tuple[str, str] | None:
"""사람이 가른 `(형태, 까닭)`. 없으면 `None`. 절 번호가 어긋나면 멈춘다."""
found = FORM_JUDGMENTS.get(table_id)
if found is None:
return None
section, form, why = found
if section != number:
raise ValueError(
f"표 형태 판정 {table_id} 의 절 {section} 이 원천의 {number} 와 다릅니다 — "
"원천 표 차례가 바뀌었으니 판정을 다시 대조할 것"
)
return form, f"사람 판정 — {why}"
@@ -1,7 +1,7 @@
{
"schema_version": "1.0",
"dataset_id": "data_work_item_master_manifest",
"generated_at": "2026-09-13T19:52:49+09:00",
"generated_at": "2026-09-13T21:50:44+09:00",
"built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py",
"source": {
"dataset_id": "pum_forest",
@@ -12,18 +12,18 @@
"files": [
{
"file": "work_item_master_2026-01-01.json",
"sha256": "6d1b46ce4e619f0f828dbf111e05a50c0bc22cff969fca1e38d5736f6e7dd440",
"size_bytes": 861142
"sha256": "9da259311e5b24c92c8423b423d2b0f4b0b2bb3e7fc2a4eb41aec9cae25b6dc0",
"size_bytes": 862856
},
{
"file": "form_undetermined_2026-01-01.json",
"sha256": "7334dab9385bc1615a9cdb557ba814482e9a63d83b9e1232946918bfd8b5577f",
"size_bytes": 37139
"sha256": "c835699596bf57ffbda9f72a773a72116ebe48c2a2f79ae232ba5784ec9842c7",
"size_bytes": 6447
},
{
"file": "basis_missing_2026-01-01.json",
"sha256": "bc3b92c991e03ddd6a2ca837e4a03a0729e3022fb783f741e6c504f5cb3a2813",
"size_bytes": 15905
"sha256": "f850742268dcfb1bcc878e8b062ef44bc6a11d773074163ebb8ba1dec21a6d0d",
"size_bytes": 16790
}
]
}
@@ -352,6 +352,18 @@
"pum_form": "requirement",
"line": 3673
},
{
"pum_table_id": "F0189",
"section": "7-11. 동력상하차기(우드그래플) 집재-수확",
"pum_form": "productivity",
"line": 3723
},
{
"pum_table_id": "F0190",
"section": "7-11. 동력상하차기(우드그래플) 집재-수확",
"pum_form": "productivity",
"line": 3731
},
{
"pum_table_id": "F0191",
"section": "7-11. 동력상하차기(우드그래플) 집재-수확",
@@ -364,6 +376,36 @@
"pum_form": "requirement",
"line": 3763
},
{
"pum_table_id": "F0196",
"section": "7-15-1. 수확",
"pum_form": "productivity",
"line": 3864
},
{
"pum_table_id": "F0197",
"section": "7-15-2 숲가꾸기, 병해충방제",
"pum_form": "productivity",
"line": 3878
},
{
"pum_table_id": "F0198",
"section": "7-16. 소형 포워더 운재",
"pum_form": "productivity",
"line": 3898
},
{
"pum_table_id": "F0199",
"section": "7-17. 소형트럭 운재",
"pum_form": "productivity",
"line": 3912
},
{
"pum_table_id": "F0200",
"section": "7-18. 지조운반(포워더 활용)",
"pum_form": "productivity",
"line": 3926
},
{
"pum_table_id": "F0202",
"section": "8-1-2. 약제주입병",
@@ -442,6 +484,12 @@
"pum_form": "requirement",
"line": 4320
},
{
"pum_table_id": "F0220",
"section": "8-3. 소각, 매몰, 훈증, 박피",
"pum_form": "productivity",
"line": 4348
},
{
"pum_table_id": "F0224",
"section": "8-5. 페르몬 유인트랩",
@@ -646,18 +694,6 @@
"pum_form": "requirement",
"line": 7087
},
{
"pum_table_id": "F0412",
"section": "13-4-4. 찰쌓기(인력)",
"pum_form": "requirement",
"line": 7174
},
{
"pum_table_id": "F0413",
"section": "13-4-4. 찰쌓기(인력)",
"pum_form": "requirement",
"line": 7185
},
{
"pum_table_id": "F0424",
"section": "13-8. 막돌쌓기",
File diff suppressed because it is too large Load Diff
@@ -2,7 +2,7 @@
"schema_version": "1.0",
"dataset_id": "work_item_master_forest",
"effective_date": "2026-01-01",
"generated_at": "2026-09-13T19:52:49+09:00",
"generated_at": "2026-09-13T21:50:44+09:00",
"dataset_version": {
"dataset_id": "pum_forest",
"effective_date": "2026-01-01",
@@ -20,9 +20,9 @@
"tables_total": 475,
"tables_attached": 456,
"tables_orphan": 19,
"form_undetermined": 77,
"form_undetermined": 13,
"basis_found": 204,
"basis_missing": 116,
"basis_missing": 122,
"basis_grouped": 48
},
"orphan_tables": [
@@ -4625,8 +4625,8 @@
"pum_table_id": "F0044",
"section": "2-1-1. 휘발유․오일",
"source_line": 1340,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 기계별 주연료(ℓ/일·대)·잡품(%) — 행이 자원이 아니라 기계, 재료비 산출 기준",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -4658,8 +4658,8 @@
"pum_table_id": "F0045",
"section": "2-1-1. 휘발유․오일",
"source_line": 1346,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 위와 같은 모양(2드럼 케이블윈치)",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -4736,8 +4736,8 @@
"pum_table_id": "F0047",
"section": "2-1-2. 경유",
"source_line": 1361,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 기계별 경유(ℓ/일·대)·잡품(%) — [주]③ 「1일당 소요량」, 행이 기계",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -4858,8 +4858,8 @@
"pum_table_id": "F0048",
"section": "2-1-3. 우드그래플 소모품",
"source_line": 1387,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 머리 「소요비용(원)」 — 품이 아니라 교체 1회당 금액",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -5129,8 +5129,8 @@
"pum_table_id": "F0054",
"section": "2-1-5. 약제(농약) 및 친환경비닐랩",
"source_line": 1477,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "requirement",
"form_basis": "사람 판정 — 본문 「(본당)」 + 행 「소금처리량(g)」 — 본당 재료 소요량",
"basis_quantity": 1.0,
"basis_unit": "본",
"basis_source": "본문",
@@ -5660,8 +5660,8 @@
"pum_table_id": "F0063",
"section": "2-1-13. 파쇄",
"source_line": 1586,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 「소모율 0.00125개/hr」 — 기계 시간당 소모품, 공종 밑수가 아님",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -13940,8 +13940,8 @@
"pum_table_id": "F0100",
"section": "5-3-1. 나무식재",
"source_line": 2230,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 수종별 묘목 규격(소·중·대묘) 표",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -14031,8 +14031,8 @@
"pum_table_id": "F0101",
"section": "5-3-1. 나무식재",
"source_line": 2242,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 간장·근원경 규격 기준 표",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -14346,8 +14346,8 @@
"pum_table_id": "F0105",
"section": "5-3-4. 교목식재(나무높이)",
"source_line": 2306,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 지주목 미설치 감률 「인력품의 10%·20%」",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -14551,8 +14551,8 @@
"pum_table_id": "F0107",
"section": "5-3-5. 교목식재(흉고직경)",
"source_line": 2342,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 위와 같은 감률(흉고직경 표)",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -16555,8 +16555,8 @@
"pum_table_id": "F0137",
"section": "5-24-2. 뿜어붙이기-기계/마사토",
"source_line": 2814,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 머리 「종자배합비율(%)」 조견표",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -16650,8 +16650,8 @@
"pum_table_id": "F0138",
"section": "5-24-2. 뿜어붙이기-기계/마사토",
"source_line": 2831,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 위와 같은 조견표(기타 적용지역)",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -17203,8 +17203,8 @@
"pum_table_id": "F0146",
"section": "5-29. 복사이식",
"source_line": 2941,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 행이 K(버킷계수)·f·E·Cm — 굴착기 작업량 공식 계수",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -20328,8 +20328,8 @@
"pum_table_id": "F0187",
"section": "7-9-2. 숲가꾸기, 소나무재선충병방제",
"source_line": 3692,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 본문 「(단위 : %)」 — 집재재적·거리별 수집량 증가율",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -20469,8 +20469,8 @@
"pum_table_id": "F0189",
"section": "7-11. 동력상하차기(우드그래플) 집재-수확",
"source_line": 3723,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "productivity",
"form_basis": "사람 판정 — 표 바로 위 「(㎥/1대, 1일)」 — 대당 일 작업량",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -20548,8 +20548,8 @@
"pum_table_id": "F0190",
"section": "7-11. 동력상하차기(우드그래플) 집재-수확",
"source_line": 3731,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "productivity",
"form_basis": "사람 판정 — 위와 같음(최대집재거리 80m 이하)",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -20796,8 +20796,8 @@
"pum_table_id": "F0194",
"section": "7-13. 검척",
"source_line": 3834,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 검척 산출 예시(말구직경×개수) 표",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -20996,8 +20996,8 @@
"pum_table_id": "F0196",
"section": "7-15-1. 수확",
"source_line": 3864,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "productivity",
"form_basis": "사람 판정 — 표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량, 「회수」 줄은 참고",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -21081,8 +21081,8 @@
"pum_table_id": "F0197",
"section": "7-15-2 숲가꾸기, 병해충방제",
"source_line": 3878,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "productivity",
"form_basis": "사람 판정 — 표 바로 위 「(㎥/1대, 1일)」 — 「운재량」 줄이 작업량, [주]① 1대 1일",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -21163,8 +21163,8 @@
"pum_table_id": "F0198",
"section": "7-16. 소형 포워더 운재",
"source_line": 3898,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "productivity",
"form_basis": "사람 판정 — 표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -21248,8 +21248,8 @@
"pum_table_id": "F0199",
"section": "7-17. 소형트럭 운재",
"source_line": 3912,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "productivity",
"form_basis": "사람 판정 — 표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -21330,8 +21330,8 @@
"pum_table_id": "F0200",
"section": "7-18. 지조운반(포워더 활용)",
"source_line": 3926,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "productivity",
"form_basis": "사람 판정 — 표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -21927,8 +21927,8 @@
"pum_table_id": "F0205",
"section": "8-2-1. 소나무재선충병",
"source_line": 4014,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 약제 이름·제형 목록",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -22314,8 +22314,8 @@
"pum_table_id": "F0208",
"section": "8-2-2. 솔잎혹파리",
"source_line": 4063,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 선정약제 목록 + 원액 주입량(㎖/㎝) 기준 — 품 표는 따로 있음",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -22960,8 +22960,8 @@
"pum_table_id": "F0212",
"section": "8-2-3. 솔껍질깍지벌레",
"source_line": 4166,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 위와 같은 선정약제 목록",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -24273,8 +24273,8 @@
"pum_table_id": "F0453",
"section": "8-2-3 굴착기(2025)」를 참조하여 적용계수를 달리 적용하도록 한다.",
"source_line": 7907,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 〔부록 2〕 산림사업별 적용 가능 공종 목록 — 절 경계가 밀려 붙음",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -25491,8 +25491,8 @@
"pum_table_id": "F0216",
"section": "8-2-4. 솔나방",
"source_line": 4268,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 위와 같은 선정약제 목록",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -25725,8 +25725,8 @@
"pum_table_id": "F0218",
"section": "8-2-5. 푸사리움가지마름병",
"source_line": 4309,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 위와 같은 선정약제 목록",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -25959,8 +25959,8 @@
"pum_table_id": "F0220",
"section": "8-3. 소각, 매몰, 훈증, 박피",
"source_line": 4348,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "productivity",
"form_basis": "사람 판정 — 머리 「벌목조재 (㎥/인)·무더기 훈증 (RM/인)·그루터기 박피 (본/인)」 — 인당 작업량",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -26268,8 +26268,8 @@
"pum_table_id": "F0221",
"section": "8-3. 소각, 매몰, 훈증, 박피",
"source_line": 4386,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 본문 「(단위: %)」 — 수종·직경별 지조율",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -26464,8 +26464,8 @@
"pum_table_id": "F0222",
"section": "8-3. 소각, 매몰, 훈증, 박피",
"source_line": 4406,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 머리 「비율(수간재적의 %)」 — 근주재적 산정율",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -26841,8 +26841,8 @@
"pum_table_id": "F0227",
"section": "8-6-1. 유인헬기방제",
"source_line": 4485,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 기종별 희석배수별 약제량(L, 1회) — 살포 계산표",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -27288,8 +27288,8 @@
"pum_table_id": "F0231",
"section": "8-6-3. 지상방제",
"source_line": 4569,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 희석배수별 약제소요량(㎖) — 물의 양 대비 계산표",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -31008,8 +31008,8 @@
"pum_table_id": "F0281",
"section": "9-15-1. 답(畓)구간",
"source_line": 5273,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 행이 K·f·E·Cm — [주]② Q1=3600×q×K×f×E/Cm",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -31071,8 +31071,8 @@
"pum_table_id": "F0282",
"section": "9-15-2. 답(畓)외구간",
"source_line": 5290,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 행이 T·L·E·q — 불도저 작업량 공식 계수",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -31248,8 +31248,8 @@
"pum_table_id": "F0284",
"section": "9-16-2. 노체다짐",
"source_line": 5326,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 행이 V·W·E·D — [주]② Q=1000×V×W×E×D×f/N",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -31321,8 +31321,8 @@
"pum_table_id": "F0285",
"section": "9-16-3. 살수",
"source_line": 5344,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 흡입준비·운반·흡입·대기 시간 — 살수차 사이클 시간",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -31499,8 +31499,8 @@
"pum_table_id": "F0287",
"section": "9-18. 층따기",
"source_line": 5395,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 행이 K·f·E·Cm — [주]① Q1=3600×q×K×f×E/Cm",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -32059,8 +32059,8 @@
"pum_table_id": "F0295",
"section": "9-22. 섞기",
"source_line": 5531,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 행이 K·f·E·Cm — [주]③ Q1=3600×q×K×f×E/Cm",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -32338,8 +32338,8 @@
"pum_table_id": "F0300",
"section": "10-3-3. 혼합골재",
"source_line": 5600,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 「운반비·하차비」 적용 항목 — 값이 없는 구성 안내",
"basis_quantity": 1.0,
"basis_unit": "㎥",
"basis_source": "본문",
@@ -32387,8 +32387,8 @@
"pum_table_id": "F0301",
"section": "10-4. 중기운반",
"source_line": 5611,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — t1·t2·t3·t4 — 트레일러 운반 사이클 시간",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -32976,8 +32976,8 @@
"pum_table_id": "F0308",
"section": "10-7-4. 모노레일 운반",
"source_line": 5741,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 1사이클당 운반량 q — 모노레일 공식 계수",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -33018,8 +33018,8 @@
"pum_table_id": "F0309",
"section": "10-7-4. 모노레일 운반",
"source_line": 5755,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 본문 「(단위: 분/1회당)」 — 적재·짐부리기 시간",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -33456,8 +33456,8 @@
"pum_table_id": "F0316",
"section": "10-9-1. 자재의 1회당 표준 운반량",
"source_line": 5861,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 규격별 1회당 표준 운반량(kg·개·㎡) — 적재 기준",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -33703,8 +33703,8 @@
"pum_table_id": "F0319",
"section": "10-11. 불도저 운반",
"source_line": 5902,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 행이 L·E·q0 — [주]② q=3.2×e, Cm 공식 계수",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -33834,8 +33834,8 @@
"pum_table_id": "F0320",
"section": "10-12-1. 토사",
"source_line": 5935,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 행이 K·E0·Cm — 굴착기 적재 공식 계수",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -33891,8 +33891,8 @@
"pum_table_id": "F0321",
"section": "10-12-1. 토사",
"source_line": 5958,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 적재·t2·적하 시간 — 덤프트럭 사이클 공식 계수",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -34090,8 +34090,8 @@
"pum_table_id": "F0324",
"section": "10-13-2. 인력운반",
"source_line": 6013,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 드론운반 단가산출 항목(준비시간·왕복비행시간 식) — [주] 일본 산출 예",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -34327,8 +34327,8 @@
"pum_table_id": "F0328",
"section": "11-4. 쇄석·혼합석 부설",
"source_line": 6071,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 행이 q·k·f·E — [주]① Q=3600×q×k×f×E/Cm",
"basis_quantity": 1.0,
"basis_unit": "㎥",
"basis_source": "본문",
@@ -34869,8 +34869,8 @@
"pum_table_id": "F0358",
"section": "12-2 표면 마무리를 따른다.",
"source_line": 6538,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 시설유형 Type-Ⅰ~Ⅳ 적용 기준 설명",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -34950,8 +34950,8 @@
"pum_table_id": "F0360",
"section": "12-2 표면 마무리를 따른다.",
"source_line": 6551,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 현장조건 Type-Ⅰ~Ⅲ 적용 기준 설명",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -38906,8 +38906,8 @@
"pum_table_id": "F0388",
"section": "12-34-4. 채움재(T=20m/m)",
"source_line": 6877,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 「재료비 JOINT FILLER」 항목만 — 값이 없는 구성 안내",
"basis_quantity": 1.0,
"basis_unit": "㎡",
"basis_source": "본문",
@@ -39011,8 +39011,8 @@
"pum_table_id": "F0390",
"section": "12-36. P.C BOX 설치",
"source_line": 6895,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 제작비·운송비·설치비 「견적처리」",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -39149,8 +39149,8 @@
"pum_table_id": "F0392",
"section": "12-38-1. 사용횟수",
"source_line": 6915,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 사용횟수별 잔존율(12회 25%·25회 10%)",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -39251,8 +39251,8 @@
"pum_table_id": "F0394",
"section": "12-38-2. 사용수량",
"source_line": 6932,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — 부자재 요율 「주자재비의 24%·52%·79%」",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -39351,8 +39351,8 @@
"pum_table_id": "F0396",
"section": "12-38-3. 설치 및 해체",
"source_line": 6954,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 설치 유형(복잡·보통·간단) 적용 시설 설명",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -39612,8 +39612,8 @@
"pum_table_id": "F0400",
"section": "13-2-3. 큰돌 채집",
"source_line": 7006,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 큰돌 직경별 뒷길이 기준(㎝)",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -39767,8 +39767,8 @@
"pum_table_id": "F0406",
"section": "13-3. 기초다짐 및 뒤채움’ 항을 적용한다.",
"source_line": 7094,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 〈돌쌓기의 개수 및 중량의 표준〉 — [주] 인력 돌쌓기·돌붙임 기준",
"basis_quantity": 1.0,
"basis_unit": "㎡",
"basis_source": "본문",
@@ -40337,8 +40337,8 @@
"pum_table_id": "F0408",
"section": "13-4-3. 고임돌 소요량",
"source_line": 7128,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 고임돌 소요량(㎥/㎡) — 자재 원단위표(B08 고임돌표가 씀). 품으로 세우면 자재를 두 번 셈",
"basis_quantity": 1.0,
"basis_unit": "㎡",
"basis_source": "본문",
@@ -40581,8 +40581,8 @@
"pum_table_id": "F0410",
"section": "13-4-4. 찰쌓기(인력)",
"source_line": 7152,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — [주]① 채움 콘크리트 소요량(㎥/㎡) — 자재 원단위표(B08 채움표가 씀). 품이면 두 번 셈",
"basis_quantity": 1.0,
"basis_unit": "㎡",
"basis_source": "본문",
@@ -40638,8 +40638,8 @@
"pum_table_id": "F0411",
"section": "13-4-4. 찰쌓기(인력)",
"source_line": 7166,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — [주]⑨ 성토 뒤채움 조약돌 두께(㎝) 기준",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -40677,8 +40677,8 @@
"pum_table_id": "F0412",
"section": "13-4-4. 찰쌓기(인력)",
"source_line": 7174,
"pum_form": "requirement",
"form_basis": "값 단위 '(m)'",
"pum_form": "reference",
"form_basis": "사람 판정 — [주]⑩ 뒷길이 표준(㎝) — 자동 판정이 「(m)」에 걸려 소요량형으로 오판",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -40727,8 +40727,8 @@
"pum_table_id": "F0413",
"section": "13-4-4. 찰쌓기(인력)",
"source_line": 7185,
"pum_form": "requirement",
"form_basis": "값 단위 '(m)'",
"pum_form": "reference",
"form_basis": "사람 판정 — [주]⑪ 표준경사(1:n) — 자동 판정이 소요량형으로 오판, 찰쌓기(인력)를 막음",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -41848,8 +41848,8 @@
"pum_table_id": "F0429",
"section": "13-10-2. 나무 말뚝박기",
"source_line": 7483,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — [주]⑥ 관입률별 계수",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -42654,8 +42654,8 @@
"pum_table_id": "F0439",
"section": "13-12-2. 지오셀(사면보강)",
"source_line": 7640,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "coefficient",
"form_basis": "사람 판정 — [주]⑦ 높이·기울기 할증(%)",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -43124,8 +43124,8 @@
"pum_table_id": "F0446",
"section": "13-15-2. 목책 설치",
"source_line": 7738,
"pum_form": "undetermined",
"form_basis": "헤더·첫 행에 단위·밑수·직종 표지 없음",
"pum_form": "reference",
"form_basis": "사람 판정 — 작업조건(어려운·쉬운) 구분 기준",
"basis_quantity": null,
"basis_unit": null,
"basis_source": null,
@@ -201,3 +201,37 @@ def test_콘크리트_포장_작업조는_두께마다_시공량으로_나눈다
assert _codes(result, "20㎝") == {"1019": Decimal("0.03"), "1002": Decimal("0.03")}
assert _codes(result, "40㎝")["1019"] == Decimal("0.015")
assert {r.amount_unit for r in result.rows} == {""} # 시공량 열 머리의 단위
def test_사람이_가른_표_형태는_까닭을_달고_절_번호가_어긋나면_멈춘다():
"""미판정 표 판정(2026-09-13) — 못 가른 표는 싣지 않고, 표 차례가 밀리면 조용히 안 씀."""
import json
from pathlib import Path
import pytest
from B08_Quantity.B08_Quantity_Build_WorkItemMaster_Forms import FORM_JUDGMENTS, judged_form
assert judged_form("F0413", "13-4-4")[0] == "reference"
assert judged_form("F9999", "1-1") is None
with pytest.raises(ValueError):
judged_form("F0413", "13-4-5")
assert all(why for _, _, why in FORM_JUDGMENTS.values())
# 마스터에 실렸고, 파형강관 12-11-3 처럼 못 가른 표는 미판정으로 남는다
path = Path("resources/data_work_item_master/work_item_master_2026-01-01.json")
tables = {
t["pum_table_id"]: t
for n in json.loads(path.read_text(encoding="utf-8"))["work_items"]
for t in n["tables"]
}
assert tables["F0413"]["pum_form"] == "reference"
assert tables["F0189"]["pum_form"] == "productivity"
assert tables["F0349"]["pum_form"] == "undetermined"
def test_인력_찰쌓기는_표준경사_표에_막히지_않는다():
from B09_Estimation.B09_Estimation_UnitPrice import cached_build
build = cached_build()
assert "FP-13-04-04" not in build.partial_ratio
assert build.book.resolve("B-FP-13-04-04#깬돌·골쌓기·뒷길이45㎝").labor > 0