"""공종 마스터 — **사람이 가른 표 형태** (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": ( # 2026-09-14 절 8-2-3 → 14-2 — 원본이 [주] 「…8-2-3 굴착기(2025)」…」 를 절로 읽던 것을 # 앞 절 이어받기로 고치자 부록 앞 마지막 절(14-2)로 옮겨 감. 부록엔 절 번호가 없어 여전히 # 제자리가 아님 — 참고표라 값에 안 닿음. "14-2", "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"), # 2026-09-14 절 12-2 → 12-17-1 — 원본이 펌프카 타설 [주] 「…12-2 표면 마무리를 따른다.」 를 # 절 제목으로 읽어 12-2 에 붙어 있던 표(빌더가 앞 절 이어받기로 고침). 형태 판정은 그대로. "F0358": ("12-17-1", "reference", "시설유형 Type-Ⅰ~Ⅳ 적용 기준 설명"), "F0360": ("12-17-1", "reference", "현장조건 Type-Ⅰ~Ⅲ 적용 기준 설명"), "F0385": ( "12-34-1", "requirement", "인력(인)·기계(대, Q=5.4㎥/hr) 소요량 표 — 「별도계상」 은 레미콘 자재 줄 비고일 뿐", ), "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}"