diff --git a/B09_Estimation/B09_Estimation_BillOfQuantities.py b/B09_Estimation/B09_Estimation_BillOfQuantities.py index add44313..3c42e1ac 100644 --- a/B09_Estimation/B09_Estimation_BillOfQuantities.py +++ b/B09_Estimation/B09_Estimation_BillOfQuantities.py @@ -25,6 +25,7 @@ from typing import Any from B09_Estimation.B09_Estimation_Guards import ( check_excluded_rows_not_priced, + check_included_materials_not_listed, check_free_haul_not_priced, check_haul_volume_within_cut, ) @@ -61,6 +62,16 @@ class HandoffWorkItem: ground_class: str = "" #: 반영률(%) — B08 이 이미 곱했으면 산출근거에만 적고 **여기서 또 곱하지 않는다**. application_ratio_pct: Decimal | None = None + #: 반영률 적용 **전** 수량. 산출근거에만 쓴다. + quantity_gross: Decimal | None = None + #: 성·절토처럼 율이 갈리는 경우의 몫별 율·수량 — 문장 파싱 없이 그대로 그린다. + application_ratio_breakdown: dict | None = None + quantity_breakdown: dict | None = None + #: 묶음 줄(옹벽처럼 품셈에 그 공종이 없는 것) — 무엇으로 이루어지는지. + composite_parts: tuple = () + #: 묶음인데 아직 못 채운 조각 — 「단가 없음」과 「물량 없음」을 갈라 적는다. + composite_not_ready: tuple = () + structure_kind: str = "" @property def display_name(self) -> str: @@ -192,6 +203,12 @@ def parse_handoff(payload: dict[str, Any]) -> tuple[list[HandoffWorkItem], list[ haul_equipment=row.get("haul_equipment"), # ⚠ 있으면 **적기만** 한다 — 곱하기는 B08 한 곳에서만(2026-09-08 이견 ①). application_ratio_pct=_decimal(row.get("application_ratio_pct"), None), + quantity_gross=_decimal(row.get("quantity_gross"), None), + application_ratio_breakdown=row.get("application_ratio_breakdown"), + quantity_breakdown=row.get("quantity_breakdown"), + composite_parts=tuple(row.get("composite_parts") or ()), + composite_not_ready=tuple(row.get("composite_not_ready") or ()), + structure_kind=row.get("structure_kind") or "", ) for row in payload["work_items"] ] @@ -271,6 +288,7 @@ def build_bill( # 정렬은 마스터의 `sort_order`(256 간격)를 그대로 따른다 — 우리가 다시 매기지 않는다. used: list[tuple[tuple[int, ...], HandoffWorkItem, list[_MasterNode]]] = [] orphans: list[HandoffWorkItem] = [] + composites: list[HandoffWorkItem] = [] for item in work_items: if not item.in_bill: # ⚠ 코드 유무보다 **먼저** 가른다. 보정량계는 공종코드가 없어서가 아니라 @@ -278,6 +296,11 @@ def build_bill( # 줄」로 잘못 읽힌다. result.excluded.append(_excluded_row(item)) continue + if (item.composite_parts or item.composite_not_ready) and not item.work_item_code: + # 묶음 줄 — 품셈에 그 공종이 없어 **조각을 합쳐** 한 줄로 세운다 + # (옹벽 = 타설 + 거푸집 + 철근 + 잡석). 「코드 없음」으로 세면 안 된다. + composites.append(item) + continue if not item.work_item_code or item.work_item_code not in index: orphans.append(item) continue @@ -321,14 +344,26 @@ def build_bill( emitted.setdefault(leaf.code, item_no) result.rows.append(_leaf_row(item_no, leaf, item, unit_prices, result)) + # ── 1-2) 묶음 줄 ────────────────────────────────────────────────────────── + for item in composites: + counters[""] = counters.get("", 0) + 1 + result.rows.append(_composite_row(str(counters[""]), item, unit_prices, result)) + # ── 2) 공종을 못 고른 줄 — 이름째 남긴다 ──────────────────────────────────── for item in orphans: + # 구조물 줄은 사유가 다르다 — 품셈에 그 공종이 없어 **전개식(원단위)** 이 있어야 + # 조각으로 설 수 있다. 「코드가 없다」로만 적으면 무엇을 해야 하는지 안 보인다. + reason = ( + "구조물 전개식(원단위)이 없어 조각을 못 세웠습니다 — B08 원단위 필요." + if item.origin == "structure" + else "공종을 못 골랐습니다 — B08 인계에 공종코드가 없습니다." + ) result.missing.append( { "name": item.display_name, "unit": item.unit, "quantity": str(item.quantity), - "reason": "공종을 못 골랐습니다 — B08 인계에 공종코드가 없습니다.", + "reason": reason, } ) @@ -339,6 +374,15 @@ def build_bill( # ── 4) 검사 — `in_bill=false` 줄에 금액이 붙지 않았는가 ────────────────────── check_excluded_rows_not_priced(rows=[r.as_dict() for r in result.excluded]) + # ㉦ 큰돌쌓기 품에 포함된 자재(고임돌·채움콘크리트)를 따로 세지 않았는가. + check_included_materials_not_listed( + work_item_codes=[row.code or "" for row in result.rows], + materials=[ + {"material_name": m.material_name, "source_structure": list(m.source_structure)} + for m in materials + ], + ) + # ㉡ **무대(20 m 이내)에 단가가 붙지 않았는가** (PLAN 8-7 ㉡). # 줄 자체는 실무 서식대로 남기되 **금액을 매기지 않는다** — 품에 이미 들어 있다. # 2026-09-08: B08 이 운반을 실물로 내기 시작해 이 검사가 처음으로 실제로 돈다. @@ -380,6 +424,77 @@ def _haul_price_of(item: HandoffWorkItem, result: BillResult) -> Decimal: return _ZERO +def _composite_row( + item_no: str, + item: HandoffWorkItem, + unit_prices: UnitPriceBuild, + result: BillResult, +) -> BillRow: + """묶음 줄 — 조각들의 `단가 × 조각수량` 을 더해 **1단위 단가**를 만든다. + + 옹벽처럼 품셈에 그 공종이 없는 것은 **조각을 합친 것이 곧 그 줄의 단가**다 + (PLAN 9-3 「제목 + 상세」 한 쌍). 조각이 하나라도 비면 **금액을 만들지 않는다** — + 절반짜리 단가가 서는 것이 가장 위험하다. + """ + row = BillRow( + item_no=item_no, + level=1, + code=None, + name=item.name, + spec=item.spec, + unit=item.unit, + quantity=item.quantity, + in_bill=item.in_bill, + ) + missing_parts: list[str] = [] + money = None + for part in item.composite_parts: + code = str(part.get("code") or "") + amount = _decimal(part.get("quantity"), None) + if not code or amount is None or f"B-{code}" not in unit_prices.book.titles: + missing_parts.append(code or str(part.get("name") or "이름 없음")) + continue + scaled = unit_prices.book.resolve(f"B-{code}").scaled(amount) + money = scaled if money is None else money + scaled + + reasons: list[str] = [] + for pending in item.composite_not_ready: + # 「단가 없음」과 「물량 없음」을 가른다 — 사유가 다르면 할 일도 다르다. + if isinstance(pending, str): + missing_parts.append(pending) + continue + label = str(pending.get("code") or pending.get("name") or "이름 없음") + why = str(pending.get("reason") or pending.get("note") or "") + missing_parts.append(label) + if why: + reasons.append(f"{label}: {why}") + + if missing_parts or money is None: + detail_text = "; ".join(reasons[:3]) or ", ".join(missing_parts[:4]) + row.note = f"묶음 조각이 덜 찼습니다 — {detail_text}" + result.missing.append( + { + "name": row.name, + "unit": row.unit, + "quantity": str(item.quantity), + "reason": ( + f"묶음 조각 미확보 ({len(missing_parts)}건)" + + (f" — {reasons[0]}" if reasons else "") + ), + } + ) + return row + + line = money.scaled(item.quantity) + row.unit_price_krw = round_at(money.total, OutputPlace.UNIT_PRICE_ROW) + row.amount_krw = round_at(line.total, OutputPlace.BOQ_ROW) + row.material_krw = line.material + row.labor_krw = line.labor + row.expense_krw = line.expense + row.note = f"묶음 {len(item.composite_parts)}조각 합계" + return row + + def _excluded_row(item: HandoffWorkItem) -> BillRow: """검산용 줄(`in_bill=false`). **수량만 보이고 단가·금액을 안 붙인다.**""" return BillRow( diff --git a/B09_Estimation/B09_Estimation_Guards.py b/B09_Estimation/B09_Estimation_Guards.py index e36d1f69..800ceac2 100644 --- a/B09_Estimation/B09_Estimation_Guards.py +++ b/B09_Estimation/B09_Estimation_Guards.py @@ -205,3 +205,80 @@ def check_excluded_rows_not_priced( f"{Decimal(str(value)):,.0f} 이 붙었습니다 — 그 줄은 수량만 보이고 " "금액을 매기지 않습니다 (PLAN 8-7 ㉡ 와 같은 성격)." ) + + +#: 제잡비 「윗단」 값을 쓴다는 뜻 — 물빼기 파이프를 **설치하는** 경우다. +#: 품셈 13-6-2 [주]③ 「… 상단에는 물빼기 파이프 설치에 관계되는 노무비, 재료비를 +#: 포함한다」. 그러므로 윗단을 쓰면 파이프를 **따로 세면 안 된다**. +OVERHEAD_TIER_WITH_PIPE = "with_pipe" +OVERHEAD_TIER_WITHOUT_PIPE = "without_pipe" + +#: 물빼기 파이프를 가리키는 자재 이름들. **정확 일치**로만 본다 — 넓게 잡으면 +#: 「물구멍 마감재」 같은 정상 자재까지 지운다. +DRAIN_PIPE_NAMES = ("물빼기파이프", "물빼기 파이프", "물구멍", "배수공") + + +def check_drain_pipe_not_double_counted( + *, + overhead_tier: str, + material_names: list[str], + label: str = "돌쌓기", +) -> None: + """㉥ 제잡비 윗단을 쓰면서 물빼기 파이프를 또 세지 않았는가. + + 품셈 13-6-2 [주]③ 이 **윗단 값에 파이프 설치의 노무비·재료비가 포함**된다고 + 적어 두었다. 그 값을 쓰면서 파이프를 자재로 또 실으면 같은 것을 두 번 센다. + + ⚠ 둘 중 하나만 골라야 한다 — 아랫단(파이프 미설치) 값을 쓰고 파이프를 따로 세거나, + 윗단 값을 쓰고 파이프를 안 세거나. + """ + if overhead_tier != OVERHEAD_TIER_WITH_PIPE: + return + tight = {"".join(str(name).split()) for name in material_names} + hit = next( + (name for name in DRAIN_PIPE_NAMES if "".join(name.split()) in tight), + None, + ) + if hit is not None: + raise DoubleCountError( + f"{label}: 제잡비 윗단(물빼기 파이프 설치)을 쓰면서 「{hit}」을 자재로 또 " + "실었습니다 — 윗단 값에 파이프의 노무비·재료비가 이미 들어 있습니다 " + "(품셈 13-6-2 [주]③)." + ) + + +#: 큰돌쌓기(13-6) 품에 **이미 들어 있는** 자재 — 따로 세우면 두 번이다. +#: 근거: 품셈 13-6 [주]① 「고임돌 및 채움 콘크리트 등은 품에 포함」. +#: ⚠ **13-6 한정**이다 — 돌쌓기(13-4)·돌붙임(13-7)에는 이 [주]가 없으므로 +#: 그쪽에서 고임돌이 자재로 오는 것은 정상이다. 넓게 잡으면 정상 자재를 지운다. +BOULDER_INCLUDED_MATERIALS = ("고임돌", "채움콘크리트", "채움 콘크리트") +BOULDER_WORK_ITEM_PREFIX = "FP-13-06" + + +def check_included_materials_not_listed( + *, + work_item_codes: list[str], + materials: list[dict], + name_field: str = "material_name", + source_field: str = "source_structure", + label: str = "큰돌쌓기", +) -> None: + """㉦ 품에 포함된 자재를 따로 세지 않았는가 (품셈 13-6 [주]①). + + 큰돌쌓기 줄이 서 있는데 **그 구조물이 낳은** 고임돌·채움콘크리트가 자재로도 서면 + 같은 것을 두 번 센다. 자재의 `source_structure` 로 **그 구조물에서 온 것만** 본다 — + 다른 구조물(돌쌓기 13-4)의 고임돌은 정상이다. + """ + if not any(str(code).startswith(BOULDER_WORK_ITEM_PREFIX) for code in work_item_codes): + return + for material in materials: + name = "".join(str(material.get(name_field) or "").split()) + if name not in {"".join(x.split()) for x in BOULDER_INCLUDED_MATERIALS}: + continue + sources = material.get(source_field) or [] + if any(label in str(source) for source in sources): + raise DoubleCountError( + f"{label}: 「{material.get(name_field)}」이 자재로도 실렸습니다 — " + "큰돌쌓기 품에 이미 들어 있습니다 (품셈 13-6 [주]① 「고임돌 및 " + "채움 콘크리트 등은 품에 포함」)." + ) diff --git a/B09_Estimation/B09_Estimation_PriceBook.py b/B09_Estimation/B09_Estimation_PriceBook.py index eac9676f..d73ee436 100644 --- a/B09_Estimation/B09_Estimation_PriceBook.py +++ b/B09_Estimation/B09_Estimation_PriceBook.py @@ -145,6 +145,10 @@ class PriceDetail: note: str = "" #: 비율 행(공구손료 등) — 참조 단가의 %로 계산하는 줄. percent_of_parent: Decimal | None = None + #: **노무비 합계**의 %로 붙는 경비 줄 — 제잡비(품셈 13-6-1 [주]③). + #: ⚠ `percent_of_parent` 와 다르다: 밑수가 3분할 전체가 아니라 **노무비만**이고, + #: 결과는 **경비(J)** 로만 들어간다. 「상한」이라 설계자가 낮출 수 있는 값이다. + percent_of_labor: Decimal | None = None @dataclass @@ -191,6 +195,13 @@ class PriceBook: total = Money3() for row in rows: + # ⚠ 비율 줄은 **참조를 풀기 전에** 처리한다 — 자기 자신을 가리키므로 + # 먼저 풀면 순환으로 잡힌다(제잡비 줄이 그렇다). + if row.percent_of_labor is not None: + # 제잡비 — **노무비 합계**의 %가 **경비**로 붙는다(품셈 13-6-1 [주]③). + total = total + Money3(expense=total.labor * row.percent_of_labor / Decimal(100)) + continue + child = self.resolve(row.ref_code, (*_seen, code)) if row.percent_of_parent is not None: # 비율 행 — 지금까지 쌓인 값의 %로 붙는다(공구손료 등). diff --git a/B09_Estimation/B09_Estimation_ResourceAxis.py b/B09_Estimation/B09_Estimation_ResourceAxis.py index 775ef8c4..f4d0e8d9 100644 --- a/B09_Estimation/B09_Estimation_ResourceAxis.py +++ b/B09_Estimation/B09_Estimation_ResourceAxis.py @@ -455,6 +455,9 @@ class AxisResult: rows: list[ResourceRow] = field(default_factory=list) unmatched: list[UnmatchedRow] = field(default_factory=list) skipped_forms: dict[str, int] = field(default_factory=dict) + #: 제잡비 비율(%) — `{공종코드: (윗단, 아랫단)}`. 윗단은 물빼기 파이프 설치, + #: 아랫단은 미설치 (품셈 13-6-2 [주]③). 값이 하나뿐이면 둘이 같다. + overhead_ratio: dict = field(default_factory=dict) #: 자원은 알아봤는데 **값을 못 읽은** 줄이 있는 공종 — 그 단가는 「일부만 선 것」이다. #: 기초잡석 12-25 가 `소할(30%) | 할석공(인) | 0.2 × 30%` 를 못 읽어 부설다짐만으로 #: 107,145 원이 서고 있었다(2026-09-08). **부분 성공이 가장 위험하다.** @@ -481,6 +484,19 @@ def _tidy_resource_name(cell: str) -> str: return tight + sep + tail +#: 장비 줄의 단위 — 시간·대수로 센다. 자재는 kg·매·㎥ 로 센다. +_MACHINE_UNITS = ("시간", "hr", "h", "대", "시 간") + + +def _is_machine_like_row(cells: list[str]) -> bool: + """그 줄이 **장비 몫**인가 — 단위 칸이 시간·대수인지로 본다.""" + for cell in cells: + text = _normalize(cell) + if text and any(text == unit or text.replace(" ", "") == unit for unit in _MACHINE_UNITS): + return True + return False + + def _resolve_cell(catalog: ResourceCatalog, name_cell: str, cells: list[str]): """셀 하나를 카탈로그 한 줄로 푼다 — 세 가지 모양을 차례로 시도한다. @@ -579,6 +595,20 @@ def match_table( name_cell = cells[1] value_cells = cells[2:] + # 제잡비 비율 줄 — 자원이 아니라 **노무비에 붙는 경비율**이다(품셈 [주]③). + if "제잡비" in _normalize(name_cell): + ratios = [ + parse_amount(_normalize(token)) + for cell in value_cells + for token in _RE_ALTERNATIVE.sub(r"", _normalize(cell)).split(" ") + ] + ratios = [x for x in ratios if x is not None] + if ratios: + upper = ratios[0] + lower = ratios[1] if len(ratios) > 1 else ratios[0] + result.overhead_ratio[node["work_item_code"]] = (upper, lower) + continue + # ⚠ **공식 계수를 단 줄은 자원 줄이 아니다.** 「유압식백호우 … | k | 0.9」 처럼 # 같은 줄에 버킷계수가 붙어 오는데, 그 0.9 를 소요량으로 읽으면 **시간당 사용료가 # 0.9시간분** 붙어 이중이 된다(2026-09-08: 이름 표기를 맞추자 측구터파기에 @@ -650,6 +680,14 @@ def match_table( result.unmatched.append( UnmatchedRow(node["work_item_code"], table["pum_table_id"], name_cell, reason) ) + # ⚠ **시간·대수로 세는 줄은 장비 몫**이다 — 못 맞추면 그 공종 단가가 + # 노무만으로 서서 조용히 싸진다(2026-09-08: 초본류 시비가 「트럭(2.5t) + # 2.6시간」을 빼고 33.1원/㎡ 로 섰다). 자재 줄(kg·매)은 이미 알려진 + # 미결이라 막지 않고 드러내기만 한다. + if _is_machine_like_row(value_cells): + result.partial_items[node["work_item_code"]] = ( + f"{_normalize(name_cell)[:20]} (장비 줄)을 못 맞췄습니다" + ) continue try: diff --git a/B09_Estimation/B09_Estimation_ResourceAxis_Transposed.py b/B09_Estimation/B09_Estimation_ResourceAxis_Transposed.py index 50e01c28..38bcfb67 100644 --- a/B09_Estimation/B09_Estimation_ResourceAxis_Transposed.py +++ b/B09_Estimation/B09_Estimation_ResourceAxis_Transposed.py @@ -319,6 +319,11 @@ def match_packed_rows( # 자원으로 **안 풀리는** 줄이면 갈래 라벨 줄로 본다. if not labels: return False + # ⚠ **라벨 줄에는 순수 숫자 칸이 없다.** 「35cm 이하」는 수를 품되 순수 수가 아니고, + # 「자재 | 종 자 | | kg | 0.025」는 순수 수(0.025)가 있는 **자료 줄**이다. + # 이 구분을 안 두면 씨앗뿜어붙이기 표를 라벨 줄로 오해해 표째 가로챈다(2026-09-08 회귀). + if any(parse_amount(cell) is not None for cell in rows[0]): + return False # ⚠ **첫 줄의 어느 칸이라도 자원이면 라벨 줄이 아니다.** 첫 칸만 보면 기초잡석 # 12-25 처럼 「소할(30%) | 할석공(인) | 0.2 × 30%」인 표를 라벨 줄로 오해해 # 표째 가로챈다(2026-09-08: 그 탓에 기초잡석이 다시 막혔다). @@ -352,10 +357,29 @@ def match_packed_rows( for index, cells in enumerate(rows[1:], start=1): if not cells or not cells[0]: continue - names = _packed_names(cells[0]) + # 제잡비 비율 줄 — 자원이 아니라 **노무비에 붙는 경비율**이다(품셈 [주]③). + # 갈래마다 같은 값이 되풀이되므로 **첫 값 칸**만 본다. 「9(9) 3(3)」 = 윗단 9 · 아랫단 3. + if "제잡비" in _normalize_label(cells[0]).replace(" ", ""): + for cell in cells[1:]: + numbers = _packed_numbers(cell) + if numbers: + upper = numbers[0] + lower = numbers[1] if len(numbers) > 1 else numbers[0] + result.overhead_ratio[work_item_code] = (upper, lower) + break + continue + # 규격은 **옆 칸**에 있을 수 있다 — 「굴착기+부착용 집게 | 0.6㎥ | 시간 | …」. side_specs = [cell for cell in cells[1:3] if cell] - resolved = [_resolve_packed(catalog, name, side_specs) for name in names] + # ⚠ **칸 전체를 한 이름으로 먼저 본다** — 「굴착기 (무한궤도)」처럼 이름 안에 + # 공백이 있으면 쪼개서 보다가 통째로 못 푼다(2026-09-08: 찰쌓기 13-6-2 의 + # 장비 몫이 그래서 빠지고 공종이 막혔다). + whole = _resolve_packed(catalog, _normalize_label(cells[0]), side_specs) + if whole: + names, resolved = [_normalize_label(cells[0])], [whole] + else: + names = _packed_names(cells[0]) + resolved = [_resolve_packed(catalog, name, side_specs) for name in names] if not all(resolved): if _packed_numbers(" ".join(cells[1:])): # 수가 있는데 이름을 못 풀었다 — 그 몫이 빠진 채 서면 안 된다. diff --git a/B09_Estimation/B09_Estimation_UI_Page.ts b/B09_Estimation/B09_Estimation_UI_Page.ts index 603cbf96..5dd1e8fe 100644 --- a/B09_Estimation/B09_Estimation_UI_Page.ts +++ b/B09_Estimation/B09_Estimation_UI_Page.ts @@ -673,6 +673,23 @@ interface BillDto { }; } +/** + * 수량 표시 — 소수 **2자리**. 계산은 전정밀 그대로다. + * + * ⚠ 표시값끼리 곱하면 금액이 몇 원 어긋난다(90.51 × 5,288.6 ≠ 화면 금액). 그것이 + * 정상임을 표 아래 문구로 밝힌다 — 밝히지 않으면 「1원 틀린다」는 지적으로 돌아온다. + * 실무 서식이 수량을 몇 자리로 쓰는지는 기준 문서에 없어(미결) 2자리는 잠정이다. + */ +function formatQuantity(value: string | null): string { + if (value === null || value === "") return ""; + const parsed = Number(value); + if (!Number.isFinite(parsed)) return value; + return parsed.toLocaleString("ko-KR", { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }); +} + async function fetchBill(projectId: string): Promise { const response = await fetch( `${API_BASE_URL}/projects/${encodeURIComponent(projectId)}/estimation/bill`, @@ -806,7 +823,7 @@ export async function renderB09Estimation(root: HTMLElement): Promise { indent + row.name, row.spec, row.unit, - row.quantity ?? "", + formatQuantity(row.quantity), row.unit_price_krw ?? "", row.amount_krw ?? "", row.note, @@ -827,6 +844,12 @@ export async function renderB09Estimation(root: HTMLElement): Promise { total.textContent = `${L("B09_Estimation_Boq_Total")}: ${bill.summary.body_total_krw}`; body.append(total); + // 표시 자릿수와 계산 자릿수가 다르다는 것을 숨기지 않는다. + const precision = document.createElement("div"); + precision.className = "b09-hint"; + precision.textContent = L("B09_Estimation_Boq_Precision"); + body.append(precision); + // ⚠ 자재비가 빠진 채 선 합계임을 숨기지 않는다. const shortfall = document.createElement("div"); shortfall.className = "b09-hint"; @@ -838,7 +861,9 @@ export async function renderB09Estimation(root: HTMLElement): Promise { note.className = "b09-hint"; note.textContent = `${L("B09_Estimation_Boq_Excluded")}: ` + - bill.excluded.map((row) => `${row.name} ${row.quantity ?? ""}${row.unit}`).join(", "); + bill.excluded + .map((row) => `${row.name} ${formatQuantity(row.quantity)}${row.unit}`) + .join(", "); body.append(note); } diff --git a/B09_Estimation/B09_Estimation_UnitPrice.py b/B09_Estimation/B09_Estimation_UnitPrice.py index ee62b7ac..f680097b 100644 --- a/B09_Estimation/B09_Estimation_UnitPrice.py +++ b/B09_Estimation/B09_Estimation_UnitPrice.py @@ -295,6 +295,23 @@ def build_unit_prices(axis: AxisResult | None = None) -> UnitPriceBuild: share = _share_of(row) build.book.add_detail(PriceDetail(title_code, ref, row.amount * share)) + # 제잡비 — **노무비 합계의 %가 경비로** 붙는다(품셈 13-6-1 [주]③). + # ⚠ 기본은 **아랫단**(물빼기 파이프 미설치)이다. 윗단을 쓰면 파이프를 따로 세면 + # 안 되므로(㉥ 가드), 그 선택은 설계 조건이 들어올 때 한다. + # ⚠ **「상한」이다** — 곱한 값 이하로 계상하는 값이라 산출근거에 그 사실을 적는다. + ratio = axis.overhead_ratio.get(work_item_code) + if ratio is not None and not variant_key.startswith("__"): + lower = ratio[1] + build.book.add_detail( + PriceDetail( + title_code, + title_code, + _ZERO, + note=f"제잡비 노무비의 {lower}% (상한, 물빼기 파이프 미설치 기준)", + percent_of_labor=lower, + ) + ) + # 장비 몫은 자원 수량이 아니라 **시공능력 공식**으로 온다 (품셈 8-1-4). machine_share = ( _ZERO if variant else _attach_machine_share(build, master, work_item_code, title_code) @@ -504,10 +521,13 @@ def build_summary(build: UnitPriceBuild) -> dict: "median": _money_text(totals[len(totals) // 2]), "max": _money_text(totals[-1]), } + # ⚠ **막아 둔 공종은 여기 안 센다** — 「성분이 빠져 싸다」를 이미 아는 값이라 + # 목록에 남으면 새로 살펴야 할 것과 섞인다. 막힌 것은 `partial_ratio` 로 따로 센다. low = [ {"code": code, "name": title.name, "total": _money_text(money)} for code, title in build.book.titles.items() if title.kind is PriceKind.UNIT_PRICE + and code[2:].split("#")[0] not in build.partial_ratio and (money := build.book.resolve(code).total) < SUSPICIOUSLY_LOW_KRW ] @@ -525,6 +545,8 @@ def build_summary(build: UnitPriceBuild) -> dict: "unit_price_totals": stats, # 값이 서기는 했는데 **크기가 이상한** 것 — 성분이 빠졌을 가능성이 크다. "suspiciously_low": low, + # 성분이 빠져 **금액을 안 만드는** 공종 — 화면이 사유째 보인다. + "blocked_items": len(build.partial_ratio), # 기준 단위가 없는 채로 큰 값 — 값이 틀린 게 아니라 **기준을 모르는 것**이다. "unknown_basis_high": high, "unknown_basis": sum( @@ -579,6 +601,29 @@ def detail_of(build: UnitPriceBuild, code: str) -> dict: money = build.book.resolve(code) rows: list[dict] = [] for detail in build.book.details.get(code, []): + if detail.percent_of_labor is not None: + # 제잡비 — 지금까지 쌓인 **노무비**의 %가 경비로 붙는다. 표시 합계에도 넣어야 + # 화면 합계와 실제 단가가 어긋나지 않는다. + labor_so_far = sum((Decimal(str(r["labor"])) for r in rows), _ZERO) + amount = labor_so_far * detail.percent_of_labor / Decimal(100) + rows.append( + { + "code": detail.ref_code, + "name": "제잡비", + "spec": f"노무비의 {detail.percent_of_labor}%", + "unit": "%", + "quantity": str(detail.percent_of_labor), + "material": "0", + "labor": "0", + "expense": str(amount), + "total": _money_text(amount), + "source": "품셈 [주]", + "drillable": False, + "note": detail.note, + } + ) + continue + child = build.book.title(detail.ref_code) unit_money = build.book.resolve(detail.ref_code) line = unit_money.scaled(detail.quantity) diff --git a/resources/data_cost_resource_axis/resource_axis_2026-01-01.json b/resources/data_cost_resource_axis/resource_axis_2026-01-01.json index fc23d526..9feb02da 100644 --- a/resources/data_cost_resource_axis/resource_axis_2026-01-01.json +++ b/resources/data_cost_resource_axis/resource_axis_2026-01-01.json @@ -124,7 +124,52 @@ "resource_kind": "labor", "resource_name": "특별인부", "resource_spec": "", - "variant": "", + "variant": "0.3m 미만", + "work_item_code": "FP-05-01-01" + }, + { + "alternative_amount": null, + "amount": "0.168", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0092", + "raw_row_index": 1, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "0.3∼0.7m 이하", + "work_item_code": "FP-05-01-01" + }, + { + "alternative_amount": null, + "amount": "0.264", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0092", + "raw_row_index": 1, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "0.8∼1.1m 이하", + "work_item_code": "FP-05-01-01" + }, + { + "alternative_amount": null, + "amount": "0.408", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0092", + "raw_row_index": 1, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "1.2∼1.5m 이하", "work_item_code": "FP-05-01-01" }, { @@ -139,7 +184,52 @@ "resource_kind": "labor", "resource_name": "보통인부", "resource_spec": "", - "variant": "", + "variant": "0.3m 미만", + "work_item_code": "FP-05-01-01" + }, + { + "alternative_amount": null, + "amount": "0.036", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0092", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "0.3∼0.7m 이하", + "work_item_code": "FP-05-01-01" + }, + { + "alternative_amount": null, + "amount": "0.048", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0092", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "0.8∼1.1m 이하", + "work_item_code": "FP-05-01-01" + }, + { + "alternative_amount": null, + "amount": "0.072", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0092", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "1.2∼1.5m 이하", "work_item_code": "FP-05-01-01" }, { @@ -454,7 +544,52 @@ "resource_kind": "labor", "resource_name": "특별인부", "resource_spec": "", - "variant": "", + "variant": "0.3m 미만", + "work_item_code": "FP-05-03-02" + }, + { + "alternative_amount": null, + "amount": "0.24", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0102", + "raw_row_index": 1, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "0.3∼0.7m 이하", + "work_item_code": "FP-05-03-02" + }, + { + "alternative_amount": null, + "amount": "0.40", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0102", + "raw_row_index": 1, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "0.8∼1.1m 이하", + "work_item_code": "FP-05-03-02" + }, + { + "alternative_amount": null, + "amount": "0.57", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0102", + "raw_row_index": 1, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "1.2∼1.5m 이하", "work_item_code": "FP-05-03-02" }, { @@ -469,7 +604,52 @@ "resource_kind": "labor", "resource_name": "보통인부", "resource_spec": "", - "variant": "", + "variant": "0.3m 미만", + "work_item_code": "FP-05-03-02" + }, + { + "alternative_amount": null, + "amount": "0.08", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0102", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "0.3∼0.7m 이하", + "work_item_code": "FP-05-03-02" + }, + { + "alternative_amount": null, + "amount": "0.13", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0102", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "0.8∼1.1m 이하", + "work_item_code": "FP-05-03-02" + }, + { + "alternative_amount": null, + "amount": "0.18", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0102", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "1.2∼1.5m 이하", "work_item_code": "FP-05-03-02" }, { @@ -484,7 +664,52 @@ "resource_kind": "labor", "resource_name": "특별인부", "resource_spec": "", - "variant": "", + "variant": "0.3m 미만", + "work_item_code": "FP-05-03-03" + }, + { + "alternative_amount": null, + "amount": "0.10", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0103", + "raw_row_index": 1, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "0.3∼0.7m 이하", + "work_item_code": "FP-05-03-03" + }, + { + "alternative_amount": null, + "amount": "0.15", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0103", + "raw_row_index": 1, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "0.8∼1.1m 이하", + "work_item_code": "FP-05-03-03" + }, + { + "alternative_amount": null, + "amount": "0.21", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0103", + "raw_row_index": 1, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "1.2∼1.5m 이하", "work_item_code": "FP-05-03-03" }, { @@ -499,7 +724,52 @@ "resource_kind": "labor", "resource_name": "보통인부", "resource_spec": "", - "variant": "", + "variant": "0.3m 미만", + "work_item_code": "FP-05-03-03" + }, + { + "alternative_amount": null, + "amount": "0.03", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0103", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "0.3∼0.7m 이하", + "work_item_code": "FP-05-03-03" + }, + { + "alternative_amount": null, + "amount": "0.05", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0103", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "0.8∼1.1m 이하", + "work_item_code": "FP-05-03-03" + }, + { + "alternative_amount": null, + "amount": "0.07", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0103", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "1.2∼1.5m 이하", "work_item_code": "FP-05-03-03" }, { @@ -622,6 +892,36 @@ "variant": "", "work_item_code": "FP-05-14" }, + { + "alternative_amount": null, + "amount": "0.326", + "amount_unit": "m", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0120", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-05-15" + }, + { + "alternative_amount": null, + "amount": "0.022", + "amount_unit": "m", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0120", + "raw_row_index": 2, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-05-15" + }, { "alternative_amount": null, "amount": "0.00055", @@ -847,6 +1147,36 @@ "variant": "", "work_item_code": "FP-05-24-01" }, + { + "alternative_amount": null, + "amount": "0.0007", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0136", + "raw_row_index": 8, + "resource_code": "1038", + "resource_kind": "labor", + "resource_name": "조경공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-05-24-02" + }, + { + "alternative_amount": null, + "amount": "0.0004", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0136", + "raw_row_index": 9, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-05-24-02" + }, { "alternative_amount": null, "amount": "0.002", @@ -1297,6 +1627,36 @@ "variant": "", "work_item_code": "FP-09-03-01" }, + { + "alternative_amount": null, + "amount": "0.041", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0243", + "raw_row_index": 4, + "resource_code": "1015", + "resource_kind": "labor", + "resource_name": "착암공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-05-01" + }, + { + "alternative_amount": null, + "amount": "0.103", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0243", + "raw_row_index": 5, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-05-01" + }, { "alternative_amount": null, "amount": "0.02", @@ -1372,6 +1732,66 @@ "variant": "", "work_item_code": "FP-09-12-01" }, + { + "alternative_amount": null, + "amount": "1.6", + "amount_unit": "㎥", + "group_ratio_pct": "10", + "pum_form": "requirement", + "pum_table_id": "F0259", + "raw_row_index": 0, + "resource_code": "1017", + "resource_kind": "labor", + "resource_name": "할석공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-12-02" + }, + { + "alternative_amount": null, + "amount": "0.8", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0259", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-12-02" + }, + { + "alternative_amount": null, + "amount": "2.8", + "amount_unit": "㎥", + "group_ratio_pct": "10", + "pum_form": "requirement", + "pum_table_id": "F0260", + "raw_row_index": 0, + "resource_code": "1017", + "resource_kind": "labor", + "resource_name": "할석공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-12-03" + }, + { + "alternative_amount": null, + "amount": "1.266", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0260", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-12-03" + }, { "alternative_amount": null, "amount": "0.23", @@ -1492,6 +1912,66 @@ "variant": "", "work_item_code": "FP-09-13-07" }, + { + "alternative_amount": null, + "amount": "1.8", + "amount_unit": "㎥", + "group_ratio_pct": "10", + "pum_form": "requirement", + "pum_table_id": "F0268", + "raw_row_index": 0, + "resource_code": "1017", + "resource_kind": "labor", + "resource_name": "할석공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-08" + }, + { + "alternative_amount": null, + "amount": "0.9", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0268", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-08" + }, + { + "alternative_amount": null, + "amount": "2", + "amount_unit": "㎥", + "group_ratio_pct": "10", + "pum_form": "requirement", + "pum_table_id": "F0269", + "raw_row_index": 0, + "resource_code": "1017", + "resource_kind": "labor", + "resource_name": "할석공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-09" + }, + { + "alternative_amount": null, + "amount": "1", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0269", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-09" + }, { "alternative_amount": null, "amount": "1.2", @@ -1537,6 +2017,186 @@ "variant": "", "work_item_code": "FP-09-13-12" }, + { + "alternative_amount": null, + "amount": "2.8", + "amount_unit": "㎥", + "group_ratio_pct": "10", + "pum_form": "requirement", + "pum_table_id": "F0273", + "raw_row_index": 0, + "resource_code": "1017", + "resource_kind": "labor", + "resource_name": "할석공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-13" + }, + { + "alternative_amount": null, + "amount": "1.266", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0273", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-13" + }, + { + "alternative_amount": null, + "amount": "3.5", + "amount_unit": "㎥", + "group_ratio_pct": "10", + "pum_form": "requirement", + "pum_table_id": "F0274", + "raw_row_index": 0, + "resource_code": "1017", + "resource_kind": "labor", + "resource_name": "할석공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-14" + }, + { + "alternative_amount": null, + "amount": "1.566", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0274", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-14" + }, + { + "alternative_amount": null, + "amount": "4.2", + "amount_unit": "㎥", + "group_ratio_pct": "10", + "pum_form": "requirement", + "pum_table_id": "F0275", + "raw_row_index": 0, + "resource_code": "1017", + "resource_kind": "labor", + "resource_name": "할석공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-15" + }, + { + "alternative_amount": null, + "amount": "1.866", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0275", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-15" + }, + { + "alternative_amount": null, + "amount": "4.2", + "amount_unit": "㎥", + "group_ratio_pct": "10", + "pum_form": "requirement", + "pum_table_id": "F0276", + "raw_row_index": 0, + "resource_code": "1017", + "resource_kind": "labor", + "resource_name": "할석공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-16" + }, + { + "alternative_amount": null, + "amount": "1.899", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0276", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-16" + }, + { + "alternative_amount": null, + "amount": "5.25", + "amount_unit": "㎥", + "group_ratio_pct": "10", + "pum_form": "requirement", + "pum_table_id": "F0277", + "raw_row_index": 0, + "resource_code": "1017", + "resource_kind": "labor", + "resource_name": "할석공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-17" + }, + { + "alternative_amount": null, + "amount": "2.349", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0277", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-17" + }, + { + "alternative_amount": null, + "amount": "6.3", + "amount_unit": "㎥", + "group_ratio_pct": "10", + "pum_form": "requirement", + "pum_table_id": "F0278", + "raw_row_index": 0, + "resource_code": "1017", + "resource_kind": "labor", + "resource_name": "할석공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-18" + }, + { + "alternative_amount": null, + "amount": "2.799", + "amount_unit": "㎥", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0278", + "raw_row_index": 1, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-09-13-18" + }, { "alternative_amount": null, "amount": "0.1", @@ -2572,6 +3232,36 @@ "variant": "매우복잡", "work_item_code": "FP-12-03" }, + { + "alternative_amount": null, + "amount": "0.07", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0337", + "raw_row_index": 1, + "resource_code": "1007", + "resource_kind": "labor", + "resource_name": "형틀목공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-12-05" + }, + { + "alternative_amount": null, + "amount": "0.03", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0337", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-12-05" + }, { "alternative_amount": null, "amount": "0.002857142857142857142857142857", @@ -2602,6 +3292,66 @@ "variant": "", "work_item_code": "FP-12-07-02" }, + { + "alternative_amount": null, + "amount": "0.0055", + "amount_unit": "m", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0345", + "raw_row_index": 1, + "resource_code": "1039", + "resource_kind": "labor", + "resource_name": "배관공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-12-10" + }, + { + "alternative_amount": null, + "amount": "0.0055", + "amount_unit": "m", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0345", + "raw_row_index": 2, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-12-10" + }, + { + "alternative_amount": null, + "amount": "0.003", + "amount_unit": "m", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0345", + "raw_row_index": 4, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-12-10" + }, + { + "alternative_amount": null, + "amount": "0.13", + "amount_unit": "m", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0345", + "raw_row_index": 7, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-12-10" + }, { "alternative_amount": null, "amount": "0.12", @@ -2634,7 +3384,7 @@ }, { "alternative_amount": null, - "amount": "3", + "amount": "4", "amount_unit": "", "group_ratio_pct": null, "pum_form": "requirement", @@ -2644,7 +3394,22 @@ "resource_kind": "labor", "resource_name": "콘크리트공", "resource_spec": "", - "variant": "", + "variant": "무근콘크리트", + "work_item_code": "FP-12-17-01" + }, + { + "alternative_amount": null, + "amount": "1", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0355", + "raw_row_index": 1, + "resource_code": "1013", + "resource_kind": "labor", + "resource_name": "콘크리트공", + "resource_spec": "", + "variant": "철근콘크리트", "work_item_code": "FP-12-17-01" }, { @@ -2659,7 +3424,22 @@ "resource_kind": "labor", "resource_name": "특별인부", "resource_spec": "", - "variant": "", + "variant": "무근콘크리트", + "work_item_code": "FP-12-17-01" + }, + { + "alternative_amount": null, + "amount": "2", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0355", + "raw_row_index": 2, + "resource_code": "1003", + "resource_kind": "labor", + "resource_name": "특별인부", + "resource_spec": "", + "variant": "철근콘크리트", "work_item_code": "FP-12-17-01" }, { @@ -2674,7 +3454,22 @@ "resource_kind": "labor", "resource_name": "보통인부", "resource_spec": "", - "variant": "", + "variant": "무근콘크리트", + "work_item_code": "FP-12-17-01" + }, + { + "alternative_amount": null, + "amount": "1", + "amount_unit": "", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0355", + "raw_row_index": 3, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "철근콘크리트", "work_item_code": "FP-12-17-01" }, { @@ -2707,6 +3502,36 @@ "variant": "", "work_item_code": "FP-12-17-02" }, + { + "alternative_amount": null, + "amount": "4.2", + "amount_unit": "ton", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0365", + "raw_row_index": 1, + "resource_code": "1008", + "resource_kind": "labor", + "resource_name": "철근공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-12-18" + }, + { + "alternative_amount": null, + "amount": "2.4", + "amount_unit": "ton", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0365", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-12-18" + }, { "alternative_amount": null, "amount": "0.10", @@ -2752,6 +3577,36 @@ "variant": "", "work_item_code": "FP-12-20" }, + { + "alternative_amount": null, + "amount": "0.034", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0368", + "raw_row_index": 1, + "resource_code": "1026", + "resource_kind": "labor", + "resource_name": "방수공", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-12-21" + }, + { + "alternative_amount": null, + "amount": "0.04", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0368", + "raw_row_index": 2, + "resource_code": "1002", + "resource_kind": "labor", + "resource_name": "보통인부", + "resource_spec": "", + "variant": "", + "work_item_code": "FP-12-21" + }, { "alternative_amount": null, "amount": "0.003", @@ -4177,6 +5032,51 @@ "variant": "직경 80㎝이상 ∼100㎝이하", "work_item_code": "FP-13-06-02" }, + { + "alternative_amount": null, + "amount": "0.48", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0420", + "raw_row_index": 4, + "resource_code": "0201-0080", + "resource_kind": "machine", + "resource_name": "굴착기(무한궤도)", + "resource_spec": "0.8", + "variant": "직경 40㎝이상 ∼60㎝미만", + "work_item_code": "FP-13-06-02" + }, + { + "alternative_amount": null, + "amount": "0.44", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0420", + "raw_row_index": 4, + "resource_code": "0201-0080", + "resource_kind": "machine", + "resource_name": "굴착기(무한궤도)", + "resource_spec": "0.8", + "variant": "직경 60㎝이상 ∼80㎝미만", + "work_item_code": "FP-13-06-02" + }, + { + "alternative_amount": null, + "amount": "0.392", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0420", + "raw_row_index": 4, + "resource_code": "0201-0080", + "resource_kind": "machine", + "resource_name": "굴착기(무한궤도)", + "resource_spec": "0.8", + "variant": "직경 80㎝이상 ∼100㎝이하", + "work_item_code": "FP-13-06-02" + }, { "alternative_amount": null, "amount": "0.119", @@ -4312,6 +5212,51 @@ "variant": "직경 80㎝이상 ~100㎝이하", "work_item_code": "FP-13-06-03" }, + { + "alternative_amount": null, + "amount": "0.686", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0421", + "raw_row_index": 4, + "resource_code": "0201-0080", + "resource_kind": "machine", + "resource_name": "굴착기(무한궤도)", + "resource_spec": "0.8", + "variant": "직경 40㎝이상 ~60㎝미만", + "work_item_code": "FP-13-06-03" + }, + { + "alternative_amount": null, + "amount": "0.629", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0421", + "raw_row_index": 4, + "resource_code": "0201-0080", + "resource_kind": "machine", + "resource_name": "굴착기(무한궤도)", + "resource_spec": "0.8", + "variant": "직경 60㎝이상 ~80㎝미만", + "work_item_code": "FP-13-06-03" + }, + { + "alternative_amount": null, + "amount": "0.56", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0421", + "raw_row_index": 4, + "resource_code": "0201-0080", + "resource_kind": "machine", + "resource_name": "굴착기(무한궤도)", + "resource_spec": "0.8", + "variant": "직경 80㎝이상 ~100㎝이하", + "work_item_code": "FP-13-06-03" + }, { "alternative_amount": null, "amount": "0.058", @@ -4447,6 +5392,51 @@ "variant": "직경 80㎝이상 ~100㎝이하", "work_item_code": "FP-13-07-01" }, + { + "alternative_amount": null, + "amount": "0.24", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0422", + "raw_row_index": 4, + "resource_code": "0201-0080", + "resource_kind": "machine", + "resource_name": "굴착기(무한궤도)", + "resource_spec": "0.8", + "variant": "직경 40㎝이상 ~60㎝미만", + "work_item_code": "FP-13-07-01" + }, + { + "alternative_amount": null, + "amount": "0.216", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0422", + "raw_row_index": 4, + "resource_code": "0201-0080", + "resource_kind": "machine", + "resource_name": "굴착기(무한궤도)", + "resource_spec": "0.8", + "variant": "직경 60㎝이상 ~80㎝미만", + "work_item_code": "FP-13-07-01" + }, + { + "alternative_amount": null, + "amount": "0.192", + "amount_unit": "㎡", + "group_ratio_pct": null, + "pum_form": "requirement", + "pum_table_id": "F0422", + "raw_row_index": 4, + "resource_code": "0201-0080", + "resource_kind": "machine", + "resource_name": "굴착기(무한궤도)", + "resource_spec": "0.8", + "variant": "직경 80㎝이상 ~100㎝이하", + "work_item_code": "FP-13-07-01" + }, { "alternative_amount": null, "amount": "0.058", @@ -4957,36 +5947,6 @@ "variant": "", "work_item_code": "FP-13-13-02" }, - { - "alternative_amount": null, - "amount": "0.014", - "amount_unit": "㎥", - "group_ratio_pct": null, - "pum_form": "requirement", - "pum_table_id": "F0442", - "raw_row_index": 1, - "resource_code": "1003", - "resource_kind": "labor", - "resource_name": "특별인부", - "resource_spec": "", - "variant": "", - "work_item_code": "FP-13-13-02" - }, - { - "alternative_amount": null, - "amount": "0.003", - "amount_unit": "㎥", - "group_ratio_pct": null, - "pum_form": "requirement", - "pum_table_id": "F0442", - "raw_row_index": 2, - "resource_code": "1002", - "resource_kind": "labor", - "resource_name": "보통인부", - "resource_spec": "", - "variant": "", - "work_item_code": "FP-13-13-02" - }, { "alternative_amount": null, "amount": "2.80", @@ -5327,15 +6287,15 @@ }, "source_master_file": { "file": "work_item_master_2026-01-01.json", - "sha256": "f80d3ad4bf3ee242d282d8d54d18305e1b89fbbb9fc414c31b95cecc8b84d47f" + "sha256": "08b0c7c26c4aa569ace3b13490b8cbd00606254abb1439894eac750d387bfb03" }, "stats": { - "rows": 354, + "rows": 418, "skipped_forms": { "coefficient": 19, "reference": 56, "undetermined": 75 }, - "unmatched": 1008 + "unmatched": 882 } } \ No newline at end of file diff --git a/resources/data_cost_resource_axis/unmatched_2026-01-01.json b/resources/data_cost_resource_axis/unmatched_2026-01-01.json index 94131a11..fcc78e62 100644 --- a/resources/data_cost_resource_axis/unmatched_2026-01-01.json +++ b/resources/data_cost_resource_axis/unmatched_2026-01-01.json @@ -122,12 +122,6 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-02-01-05" }, - { - "cell": "친환경 비닐랩", - "pum_table_id": "F0055", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-02-01-05" - }, { "cell": "농약 (글리포세이트)", "pum_table_id": "F0055", @@ -2546,72 +2540,12 @@ "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", "work_item_code": "FP-04-02-02" }, - { - "cell": "특 별 인 부", - "pum_table_id": "F0092", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-01-01" - }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0092", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-01-01" - }, { "cell": "비 고", "pum_table_id": "F0093", "reason": "숫자 칸 0 개가 자원 열 2 개와 안 맞아 버렸습니다(자리 밀림 방지).", "work_item_code": "FP-05-01-02" }, - { - "cell": "20 ∼ 26", - "pum_table_id": "F0095", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-01-03" - }, - { - "cell": "27 ∼ 39", - "pum_table_id": "F0095", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-01-03" - }, - { - "cell": "40 ∼ 60", - "pum_table_id": "F0095", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-01-03" - }, - { - "cell": "리어카", - "pum_table_id": "F0097", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-01-05" - }, - { - "cell": "우마차", - "pum_table_id": "F0097", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-01-05" - }, - { - "cell": "2.5톤 트럭", - "pum_table_id": "F0097", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-01-05" - }, - { - "cell": "6톤 트럭", - "pum_table_id": "F0097", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-01-05" - }, - { - "cell": "8톤 트럭", - "pum_table_id": "F0097", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-01-05" - }, { "cell": "지게", "pum_table_id": "F0097", @@ -2648,54 +2582,12 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-03-01" }, - { - "cell": "특 별 인 부", - "pum_table_id": "F0102", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-03-02" - }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0102", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-03-02" - }, - { - "cell": "특 별 인 부", - "pum_table_id": "F0103", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-03-03" - }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0103", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-03-03" - }, { "cell": "특별인부(인)", "pum_table_id": "F0104", "reason": "값 묶음 0 개가 갈래 2 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", "work_item_code": "FP-05-03-04" }, - { - "cell": "18 ∼ 22", - "pum_table_id": "F0108", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-03-05" - }, - { - "cell": "23 ∼ 34", - "pum_table_id": "F0108", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-03-05" - }, - { - "cell": "35 ∼ 50", - "pum_table_id": "F0108", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-03-05" - }, { "cell": "파종상 만들기", "pum_table_id": "F0109", @@ -2774,36 +2666,6 @@ "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", "work_item_code": "FP-05-12" }, - { - "cell": "요소", - "pum_table_id": "F0119", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-14" - }, - { - "cell": "인산", - "pum_table_id": "F0119", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-14" - }, - { - "cell": "보통인부 (채집)", - "pum_table_id": "F0119", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-14" - }, - { - "cell": "보통인부 (심기)", - "pum_table_id": "F0119", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-14" - }, - { - "cell": "새운반", - "pum_table_id": "F0119", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-14" - }, { "cell": "새채집", "pum_table_id": "F0119", @@ -2829,9 +2691,9 @@ "work_item_code": "FP-05-14" }, { - "cell": "보통인부", + "cell": "말뚝", "pum_table_id": "F0120", - "reason": "값 묶음 2 개가 갈래 4 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-15" }, { @@ -2966,18 +2828,6 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-18" }, - { - "cell": "㎥ 당", - "pum_table_id": "F0127", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-19-02" - }, - { - "cell": "100㎡", - "pum_table_id": "F0127", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-19-02" - }, { "cell": "표토채취 | 보통인부 | 0.2인", "pum_table_id": "F0128", @@ -3008,60 +2858,6 @@ "reason": "작업조 표를 못 읽었습니다 — 작업조 줄 「트럭」을 못 풀었습니다", "work_item_code": "FP-05-22-04" }, - { - "cell": "비 료", - "pum_table_id": "F0135", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-01" - }, - { - "cell": "피 복 제", - "pum_table_id": "F0135", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-01" - }, - { - "cell": "침식안정제", - "pum_table_id": "F0135", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-01" - }, - { - "cell": "색 소", - "pum_table_id": "F0135", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-01" - }, - { - "cell": "장비", - "pum_table_id": "F0135", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-01" - }, - { - "cell": "트 럭", - "pum_table_id": "F0135", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-01" - }, - { - "cell": "물 탱 크", - "pum_table_id": "F0135", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-01" - }, - { - "cell": "인력", - "pum_table_id": "F0135", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-01" - }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0135", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-01" - }, { "cell": "종 자", "pum_table_id": "F0135", @@ -3110,58 +2906,52 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-24-01" }, + { + "cell": "종 자", + "pum_table_id": "F0136", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-05-24-02" + }, { "cell": "비 료", "pum_table_id": "F0136", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-24-02" }, { "cell": "피 복 제", "pum_table_id": "F0136", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-24-02" }, { "cell": "침식안정제", "pum_table_id": "F0136", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-24-02" }, { "cell": "색 소", "pum_table_id": "F0136", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-24-02" }, { - "cell": "장비", + "cell": "종자살포기", "pum_table_id": "F0136", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-24-02" }, { "cell": "트 럭", "pum_table_id": "F0136", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-24-02" }, { "cell": "물 탱 크", "pum_table_id": "F0136", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-02" - }, - { - "cell": "인력", - "pum_table_id": "F0136", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-24-02" - }, - { - "cell": "보통인부", - "pum_table_id": "F0136", - "reason": "값 묶음 1 개가 갈래 4 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-24-02" }, { @@ -3170,12 +2960,6 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-05-25" }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0144", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-05-28-01" - }, { "cell": "표시봉 설치", "pum_table_id": "F0147", @@ -3326,42 +3110,12 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-06-05" }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0166", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-06-07-02" - }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0167", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-06-07-03" - }, - { - "cell": "트 럭(2.5t)", - "pum_table_id": "F0167", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-06-07-03" - }, { "cell": "트 럭(2.5t)", "pum_table_id": "F0167", "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-06-07-03" }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0168", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-06-08" - }, - { - "cell": "소 운 반", - "pum_table_id": "F0168", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-06-08" - }, { "cell": "우 드 칩", "pum_table_id": "F0168", @@ -3878,252 +3632,6 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-07-13" }, - { - "cell": "14~16", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "18~20", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "22~24", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "26~28", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "30~32", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "34~36", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "38~40", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "42~44", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "46~48", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "50~52", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "54~56", - "pum_table_id": "F0203", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "14~16", - "pum_table_id": "F0204", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "18~20", - "pum_table_id": "F0204", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "22~24", - "pum_table_id": "F0204", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "26~28", - "pum_table_id": "F0204", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "30~32", - "pum_table_id": "F0204", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "34~36", - "pum_table_id": "F0204", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "38~40", - "pum_table_id": "F0204", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "42~44", - "pum_table_id": "F0204", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "46~48", - "pum_table_id": "F0204", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "14~16", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "18~20", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "22~24", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "26~28", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "30~32", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "34~36", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "38~40", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "42~44", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "46~48", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "50~52", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "54~56", - "pum_table_id": "F0206", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "18~22", - "pum_table_id": "F0207", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "24~26", - "pum_table_id": "F0207", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "28~32", - "pum_table_id": "F0207", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "34~36", - "pum_table_id": "F0207", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "38~42", - "pum_table_id": "F0207", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "44~46", - "pum_table_id": "F0207", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "48~52", - "pum_table_id": "F0207", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "54~56", - "pum_table_id": "F0207", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "58~62", - "pum_table_id": "F0207", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, - { - "cell": "64~66", - "pum_table_id": "F0207", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-02-01" - }, { "cell": "단 위 작 업 별", "pum_table_id": "F0454", @@ -4328,18 +3836,6 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-08-04" }, - { - "cell": "트랩통수거 및 교체", - "pum_table_id": "F0224", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-05" - }, - { - "cell": "트랩철거", - "pum_table_id": "F0224", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-08-05" - }, { "cell": "트랩설치", "pum_table_id": "F0224", @@ -4502,18 +3998,6 @@ "reason": "자원은 알아봤으나 값을 못 읽었습니다 — 단가가 일부만 섭니다.", "work_item_code": "FP-09-02" }, - { - "cell": "보통암", - "pum_table_id": "F0241", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-09-04-01" - }, - { - "cell": "경 암", - "pum_table_id": "F0241", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-09-04-01" - }, { "cell": "대형브레이커+ 유압식백호우 (무한궤도,0.7㎥)", "pum_table_id": "F0241", @@ -4532,48 +4016,42 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-04-01" }, + { + "cell": "폭 약", + "pum_table_id": "F0243", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-05-01" + }, { "cell": "뇌 관", "pum_table_id": "F0243", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-05-01" }, { "cell": "비 트", "pum_table_id": "F0243", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-05-01" }, { - "cell": "인력", + "cell": "화 약 공", "pum_table_id": "F0243", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-05-01" }, { - "cell": "착 암 공", + "cell": "착 암 기", "pum_table_id": "F0243", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-05-01" }, { - "cell": "보통인부", + "cell": "공기압축기", "pum_table_id": "F0243", - "reason": "값 묶음 1 개가 갈래 5 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-05-01" }, - { - "cell": "보통암", - "pum_table_id": "F0244", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-09-05-02" - }, - { - "cell": "경 암", - "pum_table_id": "F0244", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-09-05-02" - }, { "cell": "연 암", "pum_table_id": "F0244", @@ -4653,15 +4131,27 @@ "work_item_code": "FP-09-11-01" }, { - "cell": "보통인부(인)", + "cell": "대형브레이커(㎥/hr)", "pum_table_id": "F0259", - "reason": "값 묶음 1 개가 갈래 3 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-12-02" }, { - "cell": "보통인부(인)", + "cell": "치즐소모(본/hr)", + "pum_table_id": "F0259", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-12-02" + }, + { + "cell": "대형브레이커(㎥/hr)", "pum_table_id": "F0260", - "reason": "값 묶음 1 개가 갈래 3 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-12-03" + }, + { + "cell": "치즐소모량(본/hr)", + "pum_table_id": "F0260", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-12-03" }, { @@ -4701,15 +4191,39 @@ "work_item_code": "FP-09-13-07" }, { - "cell": "보통인부(인)", + "cell": "깨기", "pum_table_id": "F0268", - "reason": "값 묶음 1 개가 갈래 3 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-13-08" }, { - "cell": "보통인부(인)", + "cell": "치즐소모량(본/hr)", + "pum_table_id": "F0268", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-13-08" + }, + { + "cell": "들어내기 | 유압식백호우 (무한궤도,0.7㎥) | 육상 암절취(0~1m)와 동일", + "pum_table_id": "F0268", + "reason": "자원은 알아봤으나 값을 못 읽었습니다 — 단가가 일부만 섭니다.", + "work_item_code": "FP-09-13-08" + }, + { + "cell": "깨기", "pum_table_id": "F0269", - "reason": "값 묶음 1 개가 갈래 3 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-13-09" + }, + { + "cell": "치즐소모량(본/hr)", + "pum_table_id": "F0269", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-13-09" + }, + { + "cell": "들어 내기 | 유압식백호우 (무한궤도,0.7㎥) | 육상 암절취(0~1m)와 동일", + "pum_table_id": "F0269", + "reason": "자원은 알아봤으나 값을 못 읽었습니다 — 단가가 일부만 섭니다.", "work_item_code": "FP-09-13-09" }, { @@ -4761,39 +4275,99 @@ "work_item_code": "FP-09-13-12" }, { - "cell": "보통인부(인)", + "cell": "깨기", "pum_table_id": "F0273", - "reason": "값 묶음 1 개가 갈래 3 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-13-13" }, { - "cell": "보통인부(인)", + "cell": "치즐소모량(본/hr)", + "pum_table_id": "F0273", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-13-13" + }, + { + "cell": "깨기", "pum_table_id": "F0274", - "reason": "값 묶음 1 개가 갈래 3 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-13-14" }, { - "cell": "보통인부(인)", + "cell": "치즐소모량(본/hr)", + "pum_table_id": "F0274", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-13-14" + }, + { + "cell": "들어 내기 | 유압식백호우 (무한궤도,0.7㎥) | 육상 발파암(1~2m)와 동일", + "pum_table_id": "F0274", + "reason": "자원은 알아봤으나 값을 못 읽었습니다 — 단가가 일부만 섭니다.", + "work_item_code": "FP-09-13-14" + }, + { + "cell": "깨기", "pum_table_id": "F0275", - "reason": "값 묶음 1 개가 갈래 3 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-13-15" }, { - "cell": "보통인부(인)", + "cell": "치즐소모량(본/hr)", + "pum_table_id": "F0275", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-13-15" + }, + { + "cell": "들어 내기 | 유압식백호우 (무한궤도,0.7㎥) | 육상 발파암(1~2m)와 동일", + "pum_table_id": "F0275", + "reason": "자원은 알아봤으나 값을 못 읽었습니다 — 단가가 일부만 섭니다.", + "work_item_code": "FP-09-13-15" + }, + { + "cell": "깨기", "pum_table_id": "F0276", - "reason": "값 묶음 1 개가 갈래 4 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-13-16" }, { - "cell": "보통인부(인)", + "cell": "치즐소모량(본/hr)", + "pum_table_id": "F0276", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-13-16" + }, + { + "cell": "깨기", "pum_table_id": "F0277", - "reason": "값 묶음 1 개가 갈래 4 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-13-17" }, { - "cell": "보통인부(인)", + "cell": "치즐소모량(본/hr)", + "pum_table_id": "F0277", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-13-17" + }, + { + "cell": "들어 내기 | 유압식백호우 (무한궤도,0.7㎥) | 용수 발파암(0~1m)와 동일", + "pum_table_id": "F0277", + "reason": "자원은 알아봤으나 값을 못 읽었습니다 — 단가가 일부만 섭니다.", + "work_item_code": "FP-09-13-17" + }, + { + "cell": "깨기", "pum_table_id": "F0278", - "reason": "값 묶음 1 개가 갈래 4 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-13-18" + }, + { + "cell": "치즐소모량(본/hr)", + "pum_table_id": "F0278", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-09-13-18" + }, + { + "cell": "들어 내기 | 유압식백호우 (무한궤도,0.7㎥) | 용수 발파암(0~1m)와 동일", + "pum_table_id": "F0278", + "reason": "자원은 알아봤으나 값을 못 읽었습니다 — 단가가 일부만 섭니다.", "work_item_code": "FP-09-13-18" }, { @@ -4862,12 +4436,6 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-09-19-03" }, - { - "cell": "제잡비율", - "pum_table_id": "F0292", - "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", - "work_item_code": "FP-09-20-01" - }, { "cell": "거리 (m) | 보통인부(인) | 거리 (m) | 보통인부(인) | 비고", "pum_table_id": "F0302", @@ -4970,36 +4538,6 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-10-10-02" }, - { - "cell": "(B)", - "pum_table_id": "F0332", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-01-03" - }, - { - "cell": "(C)", - "pum_table_id": "F0332", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-01-03" - }, - { - "cell": "40", - "pum_table_id": "F0332", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-01-03" - }, - { - "cell": "(B)", - "pum_table_id": "F0332", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-01-03" - }, - { - "cell": "(C)", - "pum_table_id": "F0332", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-01-03" - }, { "cell": "슬 럼 프 | 기준 시공량", "pum_table_id": "F0356", @@ -5043,15 +4581,9 @@ "work_item_code": "FP-12-04" }, { - "cell": "설치 및 해체", + "cell": "문양 스티로폴(자재비 포함)", "pum_table_id": "F0337", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-05" - }, - { - "cell": "보통인부", - "pum_table_id": "F0337", - "reason": "값 묶음 1 개가 갈래 3 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-12-05" }, { @@ -5103,9 +4635,15 @@ "work_item_code": "FP-12-09-03" }, { - "cell": "배관공", + "cell": "유공관 설치", "pum_table_id": "F0345", - "reason": "값 묶음 2 개가 갈래 5 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "work_item_code": "FP-12-10" + }, + { + "cell": "소운반 인부", + "pum_table_id": "F0345", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-12-10" }, { @@ -5192,24 +4730,6 @@ "reason": "값 묶음 0 개가 갈래 4 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", "work_item_code": "FP-12-16" }, - { - "cell": "콘 크 리 트 공", - "pum_table_id": "F0355", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-17-01" - }, - { - "cell": "특 별 인 부", - "pum_table_id": "F0355", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-17-01" - }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0355", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-17-01" - }, { "cell": "콘크리트펌프차", "pum_table_id": "F0355", @@ -5235,53 +4755,17 @@ "work_item_code": "FP-12-17-02" }, { - "cell": "철 근 공", + "cell": "결속선(R=0.9mm)", "pum_table_id": "F0365", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-12-18" }, { - "cell": "보통인부", + "cell": "기구손료(노무비의)", "pum_table_id": "F0365", - "reason": "값 묶음 1 개가 갈래 3 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-12-18" }, - { - "cell": "이음철물", - "pum_table_id": "F0366", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-19" - }, - { - "cell": "조임철물", - "pum_table_id": "F0366", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-19" - }, - { - "cell": "받침철물", - "pum_table_id": "F0366", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-19" - }, - { - "cell": "철 물", - "pum_table_id": "F0366", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-19" - }, - { - "cell": "인력", - "pum_table_id": "F0366", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-19" - }, - { - "cell": "경비", - "pum_table_id": "F0366", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-19" - }, { "cell": "강관(∅48.6mm×2.4mm)", "pum_table_id": "F0366", @@ -5331,15 +4815,9 @@ "work_item_code": "FP-12-20" }, { - "cell": "인력", + "cell": "아스팔트(㏊-500)", "pum_table_id": "F0368", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-12-21" - }, - { - "cell": "보통인부", - "pum_table_id": "F0368", - "reason": "값 묶음 2 개가 갈래 5 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", + "reason": "규격이 없어 같은 이름 여럿 중 고를 수 없음", "work_item_code": "FP-12-21" }, { @@ -5492,12 +4970,6 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-13-02-03" }, - { - "cell": "제 잡비 비율", - "pum_table_id": "F0399", - "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", - "work_item_code": "FP-13-02-03" - }, { "cell": "인 부", "pum_table_id": "F0401", @@ -5541,87 +5013,15 @@ "work_item_code": "FP-13-03-02" }, { - "cell": "25", + "cell": "석공 (인)", "pum_table_id": "F0404", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "값 묶음 0 개가 갈래 6 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", "work_item_code": "FP-13-04-01" }, { - "cell": "30", - "pum_table_id": "F0404", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-01" - }, - { - "cell": "35", - "pum_table_id": "F0404", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-01" - }, - { - "cell": "45", - "pum_table_id": "F0404", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-01" - }, - { - "cell": "55", - "pum_table_id": "F0404", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-01" - }, - { - "cell": "60", - "pum_table_id": "F0404", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-01" - }, - { - "cell": "75", - "pum_table_id": "F0404", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-01" - }, - { - "cell": "25", + "cell": "석 공 (인)", "pum_table_id": "F0409", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-04" - }, - { - "cell": "30", - "pum_table_id": "F0409", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-04" - }, - { - "cell": "35", - "pum_table_id": "F0409", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-04" - }, - { - "cell": "45", - "pum_table_id": "F0409", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-04" - }, - { - "cell": "55", - "pum_table_id": "F0409", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-04" - }, - { - "cell": "60", - "pum_table_id": "F0409", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-04-04" - }, - { - "cell": "75", - "pum_table_id": "F0409", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", + "reason": "값 묶음 0 개가 갈래 6 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", "work_item_code": "FP-13-04-04" }, { @@ -5660,72 +5060,12 @@ "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", "work_item_code": "FP-13-06-01" }, - { - "cell": "제잡비 비율", - "pum_table_id": "F0419", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-06-01" - }, - { - "cell": "굴착기 (무한궤도)", - "pum_table_id": "F0420", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-06-02" - }, - { - "cell": "제잡비 비율", - "pum_table_id": "F0420", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-06-02" - }, - { - "cell": "굴착기 (무한궤도)", - "pum_table_id": "F0421", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-06-03" - }, - { - "cell": "제잡비 비율", - "pum_table_id": "F0421", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-06-03" - }, - { - "cell": "굴착기 (무한궤도)", - "pum_table_id": "F0422", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-07-01" - }, - { - "cell": "제 잡비 비율", - "pum_table_id": "F0422", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-07-01" - }, { "cell": "굴 삭 기 (무한궤도)", "pum_table_id": "F0423", "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", "work_item_code": "FP-13-07-02" }, - { - "cell": "제잡비 비율", - "pum_table_id": "F0423", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-07-02" - }, - { - "cell": "석 공", - "pum_table_id": "F0425", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-09" - }, - { - "cell": "장 비", - "pum_table_id": "F0425", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-09" - }, { "cell": "굴 삭 기", "pum_table_id": "F0425", @@ -5741,13 +5081,7 @@ { "cell": "보 통 인 부 (인)", "pum_table_id": "F0428", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-10-02" - }, - { - "cell": "보 통 인 부 (인) | 3.5m 4.0m 4.5m 5.0m 5.5m 6.0m 6.5m 7.0m 7.5m 8.0m 8.5m 9.0m 10.0m 11.0m 12.0m | 0.75 1.10 1.50 1.93 - - - - - - - - - - -", - "pum_table_id": "F0428", - "reason": "자원은 알아봤으나 값을 못 읽었습니다 — 단가가 일부만 섭니다.", + "reason": "값 묶음 8 개가 갈래 8 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", "work_item_code": "FP-13-10-02" }, { @@ -5792,54 +5126,6 @@ "reason": "숫자 칸 8 개가 자원 열 3 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.", "work_item_code": "FP-13-10-02" }, - { - "cell": "12", - "pum_table_id": "F0430", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-10-02" - }, - { - "cell": "15", - "pum_table_id": "F0430", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-10-02" - }, - { - "cell": "18", - "pum_table_id": "F0430", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-10-02" - }, - { - "cell": "21", - "pum_table_id": "F0430", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-10-02" - }, - { - "cell": "24", - "pum_table_id": "F0430", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-10-02" - }, - { - "cell": "27", - "pum_table_id": "F0430", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-10-02" - }, - { - "cell": "인력(인)", - "pum_table_id": "F0431", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-11-01" - }, - { - "cell": "돌 채 움", - "pum_table_id": "F0431", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-11-01" - }, { "cell": "조약돌량(㎥)", "pum_table_id": "F0431", @@ -5864,18 +5150,6 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-13-11-01" }, - { - "cell": "인력(인)", - "pum_table_id": "F0433", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-11-02" - }, - { - "cell": "돌 채 움", - "pum_table_id": "F0433", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-11-02" - }, { "cell": "조약돌량(㎥)", "pum_table_id": "F0433", @@ -5966,18 +5240,6 @@ "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", "work_item_code": "FP-13-12-01" }, - { - "cell": "특 별 인 부", - "pum_table_id": "F0438", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-12-02" - }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0438", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-12-02" - }, { "cell": "보통구조", "pum_table_id": "F0440", @@ -6005,25 +5267,7 @@ { "cell": "특 별 인 부", "pum_table_id": "F0442", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-13-02" - }, - { - "cell": "보 통 인 부", - "pum_table_id": "F0442", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-13-02" - }, - { - "cell": "굴 삭 기", - "pum_table_id": "F0442", - "reason": "뭉친 자원 줄의 이름을 못 풀었습니다 — 단가가 일부만 섭니다.", - "work_item_code": "FP-13-13-02" - }, - { - "cell": "굴 삭 기", - "pum_table_id": "F0442", - "reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)", + "reason": "값 묶음 1 개가 갈래 2 개와 안 맞습니다 — 자리를 단정할 수 없어 버렸습니다.", "work_item_code": "FP-13-13-02" }, { diff --git a/ui_template/ui_template_locale_b2.ts b/ui_template/ui_template_locale_b2.ts index df7f32db..038fb415 100644 --- a/ui_template/ui_template_locale_b2.ts +++ b/ui_template/ui_template_locale_b2.ts @@ -671,6 +671,10 @@ export const ui_locales_b2 = { B09_Estimation_Tab_CostSheet: ["공사원가계산서", "Cost Statement"], B09_Estimation_Tab_Boq: ["설계내역서", "Bill of Quantities"], B09_Estimation_Boq_Total: ["내역서 합계", "Bill total"], + B09_Estimation_Boq_Precision: [ + "수량 표시는 소수 2자리, 계산은 전정밀 — 표시값끼리 곱하면 끝자리가 다릅니다.", + "Quantities are shown to 2 decimals but computed at full precision — multiplying the shown values gives a slightly different last digit.", + ], B09_Estimation_Boq_Excluded: [ "검산용 줄 — 수량만 보이고 금액을 매기지 않습니다", "Check rows — quantity only, never priced",