feat(master_data): 건설품셈 토목 6장(관부설 및 접합) 로직 36줄 · 식 읽기 「K.P」 점 · 자체 재료 2개

- 6-2~6-8 전 절: 일당 표는 인력 ÷ 시공량 · 양중장비 8시간 ÷ 시공량 · 단위당 표는 품 그대로
- 시공조건 B·C 요율(6-1-1 8): 부설·접합·도장 절만 — 일당은 시공량 133·200% · 단위당은 품 75·50%
- 압륜 가산 · 8m 직관 크레인 가산 · 단수 감 · 절단 작업 비율 · 공구손료 요율 구간 — 설계자 입력
- 6-7-5 강관압입추진공: 장비조립(소요일수) · 추진(m당 = 일당 편성 ÷ 작업능력) · 조명시설
- 식 읽기: 표 열쇠 안 영문자 사이 점(「K.P」「T.S」)은 칸 부르기로 안 봄
- 8장 손료 고르기에 유압잭 · 조종원 없음 고르기에 발전기 100㎾ · 재료_자체 IV전선 2.0㎜ · 백열등 100W
- 막힘: 갱부(건설노임 요소 없음) · 6-8-4 공구손료 2%(소요량 계수 표 없음) — 비고

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
2026-09-19 18:45:44 +09:00
co-authored by Claude Opus 5
parent 51fcaf9a81
commit bcfbc8b574
5 changed files with 2789 additions and 4 deletions
@@ -129,7 +129,11 @@ class _Parser:
elif depth == 0 and ch == ",":
break
elif depth == 0 and ch == "." and not self.s[self.i + 1 : self.i + 2].isdigit():
break
around = self.s[self.i - 1 : self.i] + self.s[self.i + 1 : self.i + 2]
if not (
around.isascii() and around.isalpha() and len(around) == 2
): # 「K.P」「T.S」 는 열쇠 글자
break
elif depth == 0 and re.match(r"\s[-+*/<>=!]", self.s[self.i : self.i + 2]):
break
self.i += 1
@@ -318,7 +318,8 @@
"2106-0003",
"2106-0005",
"3302-0038",
"4430-0400"
"4430-0400",
"7505-0100"
]
},
{
@@ -405,7 +406,12 @@
"7730-0050",
"5401-0017",
"6105-0190",
"6202-0060"
"6202-0060",
"5204-0200",
"5204-0300",
"5204-0400",
"5204-0500",
"5204-0600"
]
}
],
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -85,6 +85,8 @@
{ "열쇠": "차선도색 프라이머", "이름": "프라이머", "규격": "융착식 도료 차선도색용", "단위": "kg", "값": null, "출처": "자체", "비고": "건설품셈 토목 1-8-9 융착식 도료 수동식 재료" },
{ "열쇠": "낙석방지망 철망", "이름": "철망", "규격": "낙석방지망용", "단위": "㎡", "값": null, "출처": "자체", "비고": "건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)" },
{ "열쇠": "결속선", "이름": "결속선", "규격": "", "단위": "m", "값": null, "출처": "자체", "비고": "건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)" },
{ "열쇠": "에폭시", "이름": "에폭시", "규격": "", "단위": "kg", "값": null, "출처": "자체", "비고": "건설품셈 토목 1-9-4 낙석방지망 재료(참고자료) · 포켓식만" }
{ "열쇠": "에폭시", "이름": "에폭시", "규격": "", "단위": "kg", "값": null, "출처": "자체", "비고": "건설품셈 토목 1-9-4 낙석방지망 재료(참고자료) · 포켓식만" },
{ "열쇠": "IV전선 2.0㎜", "이름": "IV전선", "규격": "2.0㎜", "단위": "m", "값": null, "출처": "자체", "비고": "건설품셈 토목 6-7-5 강관압입추진공 조명시설" },
{ "열쇠": "백열등 100W", "이름": "백열등", "규격": "100W", "단위": "EA", "값": null, "출처": "자체", "비고": "건설품셈 토목 6-7-5 강관압입추진공 조명시설" }
]
}
@@ -21,6 +21,7 @@ SAMPLES = [
"로직_건설품셈_공통8장.json",
"로직_건설품셈_토목1장.json",
"로직_건설품셈_토목2장.json",
"로직_건설품셈_토목6장.json",
"로직_산림품셈_03장.json",
"로직_산림품셈_04장.json",
"로직_산림품셈_05장.json",
@@ -283,6 +284,13 @@ def test_칸_이름_정리_뒤_기계_줄(whole):
assert qty["진동롤러(핸드가이드식) 0.7ton"] == 0
def test_토목_관부설_시공조건_요율(whole):
"""토목 6-2-2 — 열쇠 「K.P」 점을 식이 읽음 · 시공조건 B 는 시공량 133%."""
given = {"관경": 80, "시공조건": "시공조건 B", "압륜가산": 0, "요율구간": "300mm이하"}
got = mf.run(whole, "건설품셈:6-2-2 K.P 메커니컬 접합 및 부설 인력", given)
assert round(got[""][0]["수량"], 4) == round(Decimal(3) / (Decimal(13) * Decimal("1.33")), 4)
def test_범위_입력은_막음(whole):
with pytest.raises(mf.FormulaError):
mf.run(