fix(B09): 성토·성토면다짐에 단가가 서게 함 — 금액 없이 내역에 서 있던 두 줄

물량은 인계로 오는데 단가가 없어 성토 13,150.2㎥·성토면다짐 12,350.3㎡ 가 금액 없이
서 있었음. 원문에는 값이 다 있고 막힌 까닭만 서로 달랐음.

- 노체포설(9-16-1): 기종이 [주]에만 있어 못 골랐음 → 흙깎기와 같은 장비 칸을 둠
  (무한궤도 굴착기 0.7㎥, [주]① 그대로. 화면에서 바꿀 수 있음).
- 비탈면 다짐(9-17-1): 표가 한 장도 없고 값이 절 제목에 있음(A = 77.7 ㎡/시간)
  → 제목·[주]에만 있는 작업량을 싣는 자리를 두고 원문 문구를 줄에 남김.
- 부착 콤팩터(0240-0007)는 카탈로그에 이름이 비어 있어 손료가 안 붙고 있었음 —
  이름 대신 분류번호로도 가림(조합 사용 넷은 그대로, 목록을 넓히지 않음).

금액: 성토 59,477,858원 · 성토면다짐 17,827,251원 (합 77,305,109원)이 새로 섬.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-09 21:59:46 +09:00
co-authored by Claude Opus 5
parent 704a10b648
commit 4a6254ba98
4 changed files with 182 additions and 5 deletions
@@ -255,10 +255,44 @@ def _machine_by_name(text: str, preferred_spec: str) -> tuple[str, str] | None:
return (hits[0][0], hits[0][1].name) if len(hits) == 1 else None
#: ⚠ **표가 아니라 절 제목·[주]에 작업량이 적힌 자리.**
#: 9-17-1 은 표가 **아예 없고** 제목 줄이 값을 든다 — 「9-17-1. 비탈면 다짐 : **A = 77.7 ㎡/시간**」.
#: 공종 마스터는 표만 절에 붙이므로 이런 자리는 **표가 0장인 공종**으로 남아 단가가 안 섰다
#: (2026-09-09 밤 실측: 성토면다짐 12,350.3㎡ 가 금액 없이 내역에 서 있었다).
#: ⚠ **값을 지어내지 않는다** — 아래 수·기종은 전부 원문 문구 그대로이고 그 문구를 함께 싣는다.
#: ⓘ 마스터가 제목의 작업량까지 싣게 되는 날 이 표는 지운다(그때는 표 쪽이 정본).
SOURCE_TEXT_CAPACITY: dict[str, tuple[dict[str, Any], ...]] = {
"FP-09-17-01": (
{
"machine_code": "0201-0070",
"machine_name": "굴착기(무한궤도)",
"capacity_per_hour": Decimal("77.7"),
"cell": "비탈면 다짐 A(㎡/hr)",
"source_text": (
"산림사업 표준품셈 9-17-1 「비탈면 다짐 : A = 77.7 ㎡/시간」 · "
"[주]② 「굴착기 부착용 유압식 진동 콤펙터와 굴착기(0.7㎥)를 적용한다」"
),
},
{
"machine_code": "0240-0007",
"machine_name": "유압식 진동콤팩터(굴착기 부착용, 0.7)",
"capacity_per_hour": Decimal("77.7"),
"cell": "비탈면 다짐 A(㎡/hr) — 부착 콤팩터",
"source_text": (
"산림사업 표준품셈 9-17-1 [주]② — 굴착기와 **함께** 도는 부착 장비라 "
"같은 작업량으로 붙는다(품셈 제8장 [주]⑤ 조합 사용)."
),
},
),
}
def direct_capacity_rows(node: dict[str, Any]) -> list[dict[str, Any]]:
"""그 공종에서 **시간당 작업량을 직접 준 기계 줄**들.
돌려주는 것 — 기계 이름 칸 · 기종 코드/이름 · 시간당 작업량 · 묶음 배분율(%) · 원문 문구.
⚠ 표에서 읽은 것에 더해 **절 제목·[주]에만 적힌 자리**(`SOURCE_TEXT_CAPACITY`)도 함께 낸다.
"""
from B09_Estimation.B09_Estimation_MachineProductivity import parse_measure
@@ -299,4 +333,22 @@ def direct_capacity_rows(node: dict[str, Any]) -> list[dict[str, Any]]:
"row_cells": [c for c in cells if c],
}
)
# 절 제목·[주]에만 있는 자리 — 표에서 이미 잡혔으면 **덧붙이지 않는다**(두 번 세지 않게).
already = {row["machine_code"] for row in found}
for entry in SOURCE_TEXT_CAPACITY.get(str(node.get("work_item_code") or ""), ()):
if entry["machine_code"] in already:
continue
found.append(
{
"cell": entry["cell"],
"machine_code": entry["machine_code"],
"machine_name": entry["machine_name"],
"capacity_per_hour": entry["capacity_per_hour"],
"ratio_pct": None,
"table_id": "",
"row_cells": [],
"source_text": entry["source_text"],
}
)
return found