From f4f7136357197c33aea48320a7d7db6cca8dd47e Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 9 Sep 2026 12:42:46 +0900 Subject: [PATCH] =?UTF-8?q?fix(B08):=20=EC=A4=80=EB=B9=84=EA=B3=B5=20?= =?UTF-8?q?=EC=B6=95=20=EA=B0=90=EC=82=AC=20=EC=85=8B=20=E2=80=94=20?= =?UTF-8?q?=EB=A9=B4=EC=A0=81=200=20=EB=A7=89=EC=9D=8C=20=C2=B7=20?= =?UTF-8?q?=ED=91=9C=ED=86=A0=20=EB=8C=80=EC=83=81=20=EC=96=B4=EA=B8=8B?= =?UTF-8?q?=EB=82=A8=20=EC=82=AC=EC=9C=A0=20=C2=B7=20=EA=B7=9C=EC=A4=80?= =?UTF-8?q?=ED=8B=80=20=EC=A4=80=EC=9A=A9=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 표토제거: 대상 면적 0 ㎡ 에 0 ㎥ 를 「값 있음」으로 내고 있었음. 0 은 「없음」과 구별이 안 되고 받는 쪽이 「표토가 없는 노선」으로 읽음. 두께 미입력은 이미 막고 있었는데 면적 0 만 통과하던 자리. 운반 줄은 제거를 밑수로 삼아 함께 막힘. - 표토 대상 면적이 별표2 문언과 두 방향으로 어긋남 — 법은 「노면·절토대상지」인데 우리는 절토·성토 사면적을 다 더하고 노면(연장 × 노폭)은 안 셈. 성토대상지는 별표2 (7) 이 「제거·정리」로만 두어 운반·적치 의무를 안 검. 값은 그대로 두고 사유로만 드러냄 — 실무 확인 사항이라 임의로 확정하지 않음. - 비탈 규준틀 재료량이 「수평 값 준용」인 사실이 상수 주석에만 있고 화면 근거에는 없었음 — 값이 서면 어디서 온 값인지 안 보이던 자리. Co-Authored-By: Claude Opus 5 (1M context) --- .../B08_Quantity_Engine_Preparation.py | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/B08_Quantity/B08_Quantity_Engine_Preparation.py b/B08_Quantity/B08_Quantity_Engine_Preparation.py index 9c1a82c0..52642610 100644 --- a/B08_Quantity/B08_Quantity_Engine_Preparation.py +++ b/B08_Quantity/B08_Quantity_Engine_Preparation.py @@ -146,6 +146,22 @@ def _topsoil_row(slope: dict[str, float], thickness_m: float | None) -> dict[str 쓴다(사면 계열의 면고르기 면적과 같은 자리). """ area = float(slope.get("face_dressing_fill", 0.0)) + float(slope.get("face_dressing_cut", 0.0)) + # ⚠ 면적이 0 이면 **0 ㎥ 를 「값 있음」으로 내지 않는다** — 0 은 「없음」과 구별이 안 되고, + # 받는 쪽이 「표토가 없는 노선」으로 읽는다. 절·성토 사면적이 0 인 임도는 성립하지 + # 않으므로 이 자리는 사실상 **사면표가 아직 안 선 것**이다(2026-09-09 감사에서 잡음). + if area <= 0: + return { + "group": "준비공", + "item": "표토제거", + "unit": "㎥", + "amount": None, + "status": STATUS_PENDING, + "reason": ( + "대상 면적이 0 ㎡ 입니다 — 사면표(면고르기 면적)가 아직 서지 않았습니다. " + "0 ㎥ 로 내면 「표토가 없는 노선」으로 읽히므로 값을 세우지 않습니다" + ), + "work_item_code": "FP-09-15", + } if thickness_m is None or float(thickness_m) <= 0: return { "group": "준비공", @@ -168,11 +184,26 @@ def _topsoil_row(slope: dict[str, float], thickness_m: float | None) -> dict[str "unit": "㎥", "amount": area * thickness, "status": STATUS_READY, - "reason": f"사면적 {area:,.1f}㎡ × 두께 {thickness:g}m (품셈 9-15)", + "reason": (f"사면적 {area:,.1f}㎡ × 두께 {thickness:g}m (품셈 9-15) · {TOPSOIL_AREA_GAP}"), "work_item_code": "FP-09-15", } +#: ⚠⚠ **대상 면적이 법 문언과 어긋난다**(2026-09-09 준비공 축 감사에서 잡음). +#: 별표2 Ⅰ.2.차.(6) 은 대상을 **「노면·절토대상지」**로 못박고, 성토대상지는 (7) 에서 +#: 「표토 등은 **제거·정리**한다」로 따로 두어 **운반·적치 의무를 안 건다.** +#: 우리는 `face_dressing_cut + face_dressing_fill` 로 **절토·성토 사면적을 다 더하고** +#: **노면(연장 × 노폭)은 안 센다** — 두 방향으로 어긋난 셈이다. +#: ㉡ 계열(「또는」을 다 더함) — 성토 사면까지 운반·적치 물량에 실림 +#: 빠짐 — 노면 표토가 아예 안 섬(법이 첫째로 든 대상) +#: ⚠ **값을 임의로 고치지 않는다** — 실무가 사면적 한 덩이로 잡는지, 노면을 따로 잡는지가 +#: 사용자·실무자 확인 사항이다. 지금은 **사유로 드러내기만** 한다. +TOPSOIL_AREA_GAP = ( + "⚠ 대상 면적 확인 필요 — 별표2 는 「노면·절토대상지」로 두는데 우리는 절토·성토" + " **사면적을 다 더하고 노면은 안 셈**. 성토대상지는 별표2 (7) 이 「제거·정리」로만 두어" + " 운반·적치 의무를 안 검. 실무 확인 뒤 대상을 확정할 것" +) + #: 표토 운반·적치 — ⚠ **법이 요구하는데 우리가 제거만 세고 있던 자리**(2026-09-09). #: 시행규칙 별표2 Ⅰ.2.차.(6)·Ⅰ.3.카.(6): #: 「노면·절토대상지에 있는 입목…과 그 뿌리, **표토는 전량 제거한 후** 강우 시 유실되거나 @@ -434,6 +465,13 @@ def frame_material_rows( "basis": ( f"{frame.get('item')} {float(count):g}개소 × {per_ea:g}{unit}/개소" f" ({picked}) · {FRAME_MATERIAL_SOURCE}" + # ⚠ 준용이라는 사실이 상수 주석에만 있고 **화면 근거에는 없던** + # 자리다 — 값이 서면 어디서 온 값인지 안 보인다(2026-09-09 감사). + + ( + " · ⚠ 비탈 규준틀 재료량은 그 시트에 없어 **수평 값을 준용**함" + if str(frame.get("item")) == "비탈 규준틀" + else "" + ) + (f" · 손율 {loss}%(품셈 [주]③)" if loss else "") ), }