Merge remote-tracking branch 'origin/dev' into sub_laptop_4

This commit is contained in:
2026-09-22 17:45:50 +09:00
58 changed files with 1049 additions and 548 deletions
@@ -9,7 +9,7 @@
* ========================================================================== */
import { FORD_MANNING_N, FORD_SLOPE } from "@config/config_frontend";
import revetmentSabang from "../resources/master_data/ref/수량_사방기슭막이치수_사방기술교본_2026-01-01.json";
import revetmentSabang from "../resources/data_masonry/revetment_sabang_2026-01-01.json";
/* ── 유입구 구조 ──────────────────────────────────────────────────────────── */
+2 -2
View File
@@ -1,6 +1,6 @@
/* =============================================================================
* B06_Section_UI_Cross_Lean.ts
* 횡단도 벽 전면 기울기 — 품셈 13-4-4 [주]⑪ 표준경사 표(`resources/master_data/old/3_품셈_산림_돌쌓기경사_*`)를
* 횡단도 벽 전면 기울기 — 품셈 13-4-4 [주]⑪ 표준경사 표(`resources/data_masonry/masonry_slope_*`)를
* 읽는 자리 하나(2026-09-14 B5 · B08 과 한 벌). 표 읽기 식은 `common_util_masonry_slope.ts`(파이썬 짝).
*
* 따로 뗀 까닭 — 표(JSON)를 가져오는 모듈을 상수 파일에 두면 그 상수를 쓰는 기하 조각을 Node 로
@@ -10,7 +10,7 @@
* ========================================================================== */
import { type WallLeanInput, wallLeanRatio } from "../common_util/common_util_masonry_slope";
import masonrySlope from "../resources/master_data/old/3_품셈_산림_돌쌓기경사_13-4-4_2026-01-01.json";
import masonrySlope from "../resources/data_masonry/masonry_slope_2026-01-01.json";
/** 벽 전면 기울기 n — 표를 못 고르면 종전 0.3. */
export function leanOf(input: WallLeanInput): number {
+2 -2
View File
@@ -21,8 +21,8 @@ logger = logging.getLogger(__name__)
ROOT = Path(__file__).resolve().parents[1]
# 번들이 낡았는지 재는 대상 — 기하 계통이 걸쳐 있는 폴더 + 구조물도 식 풀이(B08, 2026-09-13).
SOURCE_DIRS = ("B05_Profile", "B06_Section", "B08_Quantity", "common_util")
# 번들에 박히는 자료(JSON) — 벽 전면 기울기 표준경사 표(2026-09-14 B5). 표만 바뀌어도 다시 빌드.
SOURCE_DATA_DIRS = ("resources/master_data/old",)
# 번들에 박히는 자료(JSON) — 벽 전면 기울기 표준경사 표·기슭막이 치수 표(2026-09-14 B5). 표만 바뀌어도 다시 빌드.
SOURCE_DATA_DIRS = ("resources/data_masonry",)
# 번들 만들기·실행 상한(초). 실측 번들 실행 0.1초, 빌드 3초 수준이라 넉넉하다.
BUILD_TIMEOUT_S = 300
RUN_TIMEOUT_S = 600
@@ -500,19 +500,23 @@ def _add_machine_layers(
@lru_cache(maxsize=1)
def load_basis_missing(
file_name: str = "2_공종_산림_밑수없음_2026-01-01.json",
file_name: str = "기준수량없음_산림품셈_2026-01-01.json",
) -> dict[str, str]:
"""B08 이 낸 **밑수 못 찾은 표** 목록 — `{표 번호: 절 이름}`.
「10㎡당」 같은 기준을 원문에서 못 찾은 표다. 1 단위당으로 단정하면 곱셈이
10배·100배 틀리므로(떼채취가 실제로 100배였다) 그 표를 쓰는 공종은
**금액을 안 만든다**.
2026-09-22 — old/ 스냅샷 대신 최상위 마스터로 옮김(PLAN 7-5 ⑤ · 브레인 판정).
⚠ `root` 계산이 파일이 `old_code/` 로 옮겨진 뒤(PLAN 7-3) 한 단 부족해 있었음 —
조용히 빈 딕셔너리를 돌려주던 것을 여기서 같이 바로잡음(3단 위가 프로젝트 뿌리).
"""
import json
import os
root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
path = os.path.join(root, "resources", "master_data", "old", file_name)
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
path = os.path.join(root, "resources", "master_data", file_name)
if not os.path.exists(path):
return {}
with open(path, encoding="utf-8") as handle:
@@ -22,10 +22,10 @@ from pathlib import Path
from typing import Any
ALIAS_FILE = (
Path(__file__).resolve().parents[1]
Path(__file__).resolve().parents[2]
/ "resources"
/ "master_data"
/ "ref"
/ "old"
/ "공종_자원별칭_실무_2026-01-01.json"
)
AXES = frozenset({"resource", "variant"})
@@ -20,7 +20,7 @@ from functools import lru_cache
from pathlib import Path
from typing import Any, Iterable
MASTER_DIR = Path(__file__).resolve().parent.parent / "resources" / "master_data" / "old"
MASTER_DIR = Path(__file__).resolve().parent.parent.parent / "resources" / "master_data" / "old"
#: 우리가 세운 공종·구조물 — 난수 코드가 곧 불변 열쇠
_STABLE_CODE = re.compile(r"^AX-(?:WK|ST)-[0-9a-f]{8}$")
@@ -19,7 +19,7 @@ from functools import lru_cache
from pathlib import Path
from typing import Any
FOLDER = Path(__file__).resolve().parent.parent / "resources" / "master_data" / "old"
FOLDER = Path(__file__).resolve().parent.parent.parent / "resources" / "master_data" / "old"
CONFIRMED = "확정"
#: 표 `policy.both_precedence` 낱말 → 그 행의 열쇠 칸
_KEY_COLUMN = {"forest": "forest_key", "construction": "const_key"}
@@ -1,142 +0,0 @@
# -*- coding: utf-8 -*-
"""B06 벽 전면 기울기도 **품셈 표준경사 표**를 읽음 — B5 (2026-09-14 브레인 판정 「양쪽 다 이 표를」).
앞서 B06 횡단도는 벽(관 유입·유출 · 독립 기슭막이 · 다단 추가 · C군 벽)을 **1:0.3 붙박이**로 그렸고
B08 은 품셈 13-4-4 [주]⑪ 표(원문 L7185~7191)로 셈 — 메쌓기 성토 H2.5 에서 1:0.3 ↔ 1:0.35 로 갈림.
재는 것(브레인: 고치기 전 코드에서 빨강부터)
① 네 갈래 — 직고 구간 × 성토/절토 × 메/찰 (+ 사용자 칸 `face_slope_ratio`·`face_role`, 못 가르면 종전 0.3)
TS 짝 `common_util_masonry_slope.ts` 을 실제로 돌려 파이썬 `face_slope_ratio` 와 한 칸씩 대조.
② 기하가 그 값을 씀 — 벽 모양 파일에서 붙박이 `REVET_LEAN_RATIO` 곱이 사라지고 벽마다 기울기를 받음.
"""
from __future__ import annotations
import itertools
import json
import re
import shutil
import subprocess
import sys
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parents[2]
if str(ROOT) not in sys.path:
sys.path.insert(0, str(ROOT))
from B08_Quantity.B08_Quantity_Engine_UnitQuantity_StoneSpec import ( # noqa: E402
face_slope_ratio,
load_slope_table,
)
from common_util.common_util_structure_face_role import structure_face_role_of # noqa: E402
TSC = ROOT / "config" / "node_modules" / "typescript" / "bin" / "tsc"
TS_FILE = ROOT / "common_util" / "common_util_masonry_slope.ts"
FORMS = ("돌쌓기(찰)", "돌쌓기(메)", "콘크리트")
HEIGHTS = (1.0, 1.5, 2.5, 3.0, 4.0, 6.0, 7.5)
MODES = ("left_cut", "right_cut", "both_cut", "both_fill", None)
SIDES = (None, "자동(성토 쪽)", "좌", "우", "양쪽")
OVERRIDES = ({}, {"face_role": "절토"}, {"face_slope_ratio": 0.5})
_RUNNER = """
const { readFileSync, writeFileSync } = require("node:fs");
const { wallLeanRatio } = require("./common_util_masonry_slope.js");
const input = JSON.parse(readFileSync(process.argv[2], "utf8"));
const out = input.cases.map((c) => wallLeanRatio(input.table, c));
writeFileSync(process.argv[3], JSON.stringify(out));
"""
def _cases() -> list[dict]:
cases = []
for form, height, mode, side, extra in itertools.product(
FORMS, HEIGHTS, MODES, SIDES, OVERRIDES
):
cases.append(
{"form": form, "height_m": height, "section_mode": mode, "side": side, **extra}
)
return cases
def _python(case: dict) -> float:
"""B08 이 그 벽을 셀 때의 기울기 — 돌쌓기 형태만 표, 나머지는 종전 0.3."""
wet = {"돌쌓기(찰)": True, "돌쌓기(메)": False}.get(case["form"])
if wet is None:
return 0.3
options = {k: case[k] for k in ("side", "face_role", "face_slope_ratio") if k in case}
face, reason = structure_face_role_of(case["section_mode"], options)
ratio, _basis = face_slope_ratio(
options, wet=wet, height_m=case["height_m"], face=face, face_reason=reason
)
return ratio
@pytest.mark.skipif(shutil.which("node") is None or not TSC.is_file(), reason="node·tsc 없음")
def test_네_갈래_표를_TS_가_파이썬과_같게_읽는다(tmp_path: Path) -> None:
assert TS_FILE.is_file(), "TS 짝이 아직 없음 — B06 이 표를 안 읽는다"
out = tmp_path / "js"
subprocess.run( # noqa: S603 — 고정 실행 파일
[
"node",
str(TSC),
str(TS_FILE),
"--outDir",
str(out),
"--module",
"commonjs",
"--target",
"es2022",
"--ignoreConfig",
],
cwd=str(ROOT),
check=True,
capture_output=True,
)
(out / "runner.cjs").write_text(_RUNNER, encoding="utf-8")
cases = _cases()
payload = tmp_path / "in.json"
result = tmp_path / "out.json"
payload.write_text(
json.dumps({"table": load_slope_table(), "cases": cases}, ensure_ascii=False),
encoding="utf-8",
)
subprocess.run( # noqa: S603
["node", str(out / "runner.cjs"), str(payload), str(result)],
cwd=str(ROOT),
check=True,
capture_output=True,
)
got = json.loads(result.read_text(encoding="utf-8"))
wrong = [
(case, ts, _python(case))
for case, ts in zip(cases, got, strict=True)
if abs(ts - _python(case)) > 1e-9
]
assert not wrong, wrong[:5]
# 갈래가 실제로 갈렸는지 — 한 값만 나와 같아지는 것을 막음(메 성토 H2.5 0.35 · 찰 절토 H1.0 0.2)
assert {round(v, 2) for v in got} >= {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5}
GEOMETRY = [
"B06_Section_UI_Cross_Culvert_Geom.ts",
"B06_Section_UI_Cross_Wall.ts",
"B06_Section_UI_Cross_Culvert_Extra.ts",
"B06_Section_UI_Cross_Culvert_Solve.ts",
]
def test_횡단도가_최신_표준경사_판을_읽는다() -> None:
const = (ROOT / "B06_Section" / "B06_Section_UI_Cross_Lean.ts").read_text(encoding="utf-8")
latest = sorted((ROOT / "resources" / "master_data" / "old").glob("3_품셈_산림_돌쌓기경사_*.json"))[-1].name
imported = re.search(r'from "\.\./resources/master_data/old/(3_품셈_산림_돌쌓기경사_[^"]+)"', const)
assert imported and imported.group(1) == latest
def test_벽_모양이_붙박이_기울기를_안_곱한다() -> None:
"""벽 모양 파일마다 `REVET_LEAN_RATIO *` 곱이 남아 있으면 그 벽은 아직 1:0.3 붙박이."""
for name in GEOMETRY:
source = (ROOT / "B06_Section" / name).read_text(encoding="utf-8")
assert not re.search(r"REVET_LEAN_RATIO\s*[*/]", source), name
+11 -2
View File
@@ -1,5 +1,5 @@
{
"다음": {"LB": 409, "EQ": 655, "RT": 20, "MN": 7000, "MT": 30710, "MO": 74, "MP": 364, "FX": 6, "CF": 159, "QF": 477, "GF": 252, "CC": 341, "GC": 1104, "QC": 2060, "GX": 1, "UA": 2},
"다음": {"LB": 409, "EQ": 655, "RT": 20, "MN": 7000, "MT": 30719, "MO": 74, "MP": 364, "FX": 6, "CF": 159, "QF": 477, "GF": 252, "CC": 341, "GC": 1104, "QC": 2060, "GX": 1, "UA": 2},
"폐기": {"MT000001": "자재품목 휘발유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000002": "자재품목 경유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000003": "자재품목 선박용경유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000004": "자재품목 중유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000005": "자재품목 등유 — 값이 비고 글뿐 · 유가 테이블로 감", "LB000399": "이름 「〃」 — 직종이 아니라 되풀이 기호 · 소요량 13-6-9 에서 윗줄 직종으로 바로잡음", "MN": "재료_나라장터자재 — old 로 옮김 · 로직은 자재품목·품셈재료로 갈아 끼움", "LB000372": "미확보 고급기능사 — 측량노임 항공사진고급기능사 옛이름으로 옮김", "LB000393": "미확보 리베팅공 — 건설노임 철골공 옛이름으로 옮김(2010 통합표 연번10)", "LB000405": "미확보 Belt Conveyor 설치공 — 품셈 13-10-1 주② 배분으로 다섯 직종에 나눔", "MT000006": "자재품목 전력 — 재료_유가전력 전력 줄로 감", "MT000007": "자재품목 전력 — 재료_유가전력 전력 줄로 감", "LB000368": "미확보 기술사 — 기술사(건설) 옛이름으로 옮김", "LB000369": "미확보 특급기술자 — 특급기술자(건설) 옛이름으로 옮김", "LB000370": "미확보 고급기술자 — 고급기술자(건설) 옛이름으로 옮김", "LB000361": "미확보 중급기술자 — 중급기술자(건설) 옛이름으로 옮김", "LB000364": "미확보 초급기술자 — 초급기술자(건설) 옛이름으로 옮김", "LB000365": "미확보 고급숙련기술자 — 고급숙련기술자(건설) 옛이름으로 옮김", "LB000366": "미확보 중급숙련기술자 — 중급숙련기술자(건설) 옛이름으로 옮김", "LB000367": "미확보 초급숙련기술자 — 초급숙련기술자(건설) 옛이름으로 옮김", "LB000389": "미확보 기계기사 — 초급기술자(기계·설비) 옛이름으로 옮김", "LB000388": "미확보 기계산업기사 — 초급숙련기술자(기계·설비) 옛이름으로 옮김", "MO000055": {"원문번호": "주택용저압:기본_200이하", "파일": "재료_유가전력.json"}, "MO000056": {"원문번호": "주택용저압:기본_201~400", "파일": "재료_유가전력.json"}, "MO000057": {"원문번호": "주택용저압:기본_400초과", "파일": "재료_유가전력.json"}, "MO000059": {"원문번호": "주택용저압:전력량_다음200", "파일": "재료_유가전력.json"}, "MO000060": {"원문번호": "주택용저압:전력량_400초과", "파일": "재료_유가전력.json"}, "MO000061": {"원문번호": "주택용저압:월간최저요금", "파일": "재료_유가전력.json"}, "MO000062": {"원문번호": "일반용갑I저압:기본", "파일": "재료_유가전력.json"}, "MO000063": {"원문번호": "일반용갑I저압:전력량_여름철", "파일": "재료_유가전력.json"}, "MO000064": {"원문번호": "일반용갑I저압:전력량_봄가을철", "파일": "재료_유가전력.json"}, "MO000065": {"원문번호": "일반용갑I저압:전력량_겨울철", "파일": "재료_유가전력.json"}, "MO000066": {"원문번호": "산업용갑I저압:기본", "파일": "재료_유가전력.json"}, "MO000067": {"원문번호": "산업용갑I저압:전력량_여름철", "파일": "재료_유가전력.json"}, "MO000068": {"원문번호": "산업용갑I저압:전력량_봄가을철", "파일": "재료_유가전력.json"}, "MO000069": {"원문번호": "산업용갑I저압:전력량_겨울철", "파일": "재료_유가전력.json"}, "MO000070": {"원문번호": "임시전력갑:기본요금적용", "파일": "재료_유가전력.json"}, "MO000071": {"원문번호": "임시전력갑:전력량요금적용", "파일": "재료_유가전력.json"}, "MO000072": {"원문번호": "임시전력갑:월간최저요금", "파일": "재료_유가전력.json"}},
"키": {
"CC000001": {"원문번호": "공통 1-3-1 콘크리트 및 포장용 재료", "파일": "계수_건설품셈_01장_적용기준.json"},
@@ -36582,6 +36582,15 @@
"MT030706": {"원문번호": "품셈재료 MP000003 전국", "파일": "재료_자재품목.json"},
"MT030707": {"원문번호": "품셈재료 MP000003 지역별", "파일": "재료_자재품목.json"},
"MT030708": {"원문번호": "품셈재료 MP000005 전국", "파일": "재료_자재품목.json"},
"MT030709": {"원문번호": "품셈재료 MP000005 지역별", "파일": "재료_자재품목.json"}
"MT030709": {"원문번호": "품셈재료 MP000005 지역별", "파일": "재료_자재품목.json"},
"MT030710": {"원문번호": "품셈재료 MP000209", "파일": "재료_자재품목.json"},
"MT030711": {"원문번호": "품셈재료 MP000214", "파일": "재료_자재품목.json"},
"MT030712": {"원문번호": "품셈재료 MP000040", "파일": "재료_자재품목.json"},
"MT030713": {"원문번호": "품셈재료 MP000094", "파일": "재료_자재품목.json"},
"MT030714": {"원문번호": "품셈재료 MP000202", "파일": "재료_자재품목.json"},
"MT030715": {"원문번호": "품셈재료 MP000205", "파일": "재료_자재품목.json"},
"MT030716": {"원문번호": "품셈재료 MP000206", "파일": "재료_자재품목.json"},
"MT030717": {"원문번호": "품셈재료 MP000207", "파일": "재료_자재품목.json"},
"MT030718": {"원문번호": "품셈재료 MP000208", "파일": "재료_자재품목.json"}
}
}
+9 -9
View File
@@ -17,7 +17,7 @@
| -------------------- | --------------------------------------------------------------------------------------- |
| 인력 | `인력.json` 하나 — 줄마다 `구분` |
| 기계 | `기계.json` 하나 — 줄마다 `원문` |
| 재료 | `재료_<원문>.json` — 자재품목 · 유가전력 · 품셈재료 |
| 재료 | `재료_<원문>.json` — 자재품목 · 유가전력 |
| 환율 · 요율 | `환율_한국은행환율.json` · `요율_조달청제비율.json` |
| 소요량 · 계수 · 로직 | `<그룹>_<원문>_<NN>장_<장 제목>.json` — 예 `소요량_건설품셈_10장_창호_및_유리공사.json` |
@@ -37,7 +37,7 @@
| LB | 인력 | QF · QC | 소요량 산림 · 건설 |
| MT | 재료 자재품목 | CF · CC | 계수 산림 · 건설 |
| MO | 재료 유가 | RT | 요율 |
| MP | 재료 품셈재료 | GF · GC · GX | 로직 산림 · 건설 · 자체 |
| MP | 재료 품셈재료(old/ — PLAN 7-4b) | GF · GC · GX | 로직 산림 · 건설 · 자체 |
| EQ | 기계 | | |
- 빌더는 옛 모양(`열쇠` · 원문별 파일)으로 쓰고 끝에 `scripts/master_keys.py` 의 `adopt` 를 부름 — 키·원문번호·한 테이블·장 파일 이름으로 받음. 옛 이름으로 읽기는 `old_view`.
@@ -119,10 +119,8 @@
- 유류·전력은 뗌 — 유가·전기요금은 `재료_유가전력`(유류는 값이 비고 글뿐 · 중유는 받지 않음).
- `재료_유가전력` · `환율_한국은행환율` 도 열 한 벌 — 키 · 원문번호 · 구분 · 상세구분 · 이름 · 규격 · 단위 · 값 · 출처 · 비고. 유가전력 `구분` = 유류 · 전력 · `상세구분` = 유류(지역 이름) · 전력(계약종별) · `규격` = 기준일(유류 수집일 · 전력 시행일). 환율은 `규격` = 기준일 · 구분·상세구분 비움.
- 로직 호표가 자재품목 키(`MT…`)를 바로 가리키면 그 줄의 값 열 가운데 낮은 값 — **시험 계산용**.
- `재료_품셈재료` = 품셈이 부르는 재료 목록 — `{ 키, 원문번호, 이름, 규격, 단위, 요구절: [출처 모양], 연결, 고르기 }` · 값 칸 없음.
- `고르기` = 그 재료가 자재품목 어느 묶음인지 — 재료 고르기 조건 `{ 구분, 상세구분[, 규격] }`(7장) · 못 가리면 `null` 에 비고 「고르기 없음(까닭)」. 채우기 = `scripts/build_품셈재료_고르기.py`(자재품목을 가른 바로 그 품명 글자 규칙 · 묶음 목록 `ref/_묶음_자재품목.md`) · 손으로 바로잡은 줄은 그 스크립트 `OVERRIDE` 에. `연결` 이 이미 있는 줄은 비움 — 옛 방식 그대로 씀.
- 로직 재료 줄 일괄 변환 = `scripts/build_로직_재료_고르기.py` — 호표 요소 `MP…` 를 그 줄의 `고르기` 조건으로 바꿈 · 고르기가 빈 줄과 `{이름}` 이 낀 원문번호 줄은 그대로 둠.
- `연결` = 자재품목·유가전력 키 하나 · 후보 조건 `{ 이름, 규격, 지역: "입력" }`(지역이 갈리는 레미콘·골재·아스콘) · `{ 이름, 계약종별: "입력" }`(전력 — 로직 입력 `전력 계약종별`) · `null`(아직 못 이음).
- `재료_품셈재료`(PLAN 7-4b 뒤 절반 — `old/` 로 옮김 · 살아 있는 마스터엔 안 읽힘 · 자료로만 둠) = 품셈이 부르는 재료 목록이던 것 — `{ 키, 원문번호, 이름, 규격, 단위, 요구절: [출처 모양], 연결, 고르기 }` · 값 칸 없음. 로직 호표·덧줄의 `MP…` 직접 참조는 다 걷어 자재품목 고르기 조건(7장)이나 대표 키로 바꿈 — 아래 두 줄은 그 옮기던 때의 자취.
- `연결` = 자재품목·유가전력 키 하나 · 후보 조건 `{ 이름, 규격, 지역: "입력" }`(지역이 갈리는 레미콘·골재·아스콘) · `{ 이름, 계약종별: "입력" }`(전력 — 로직 입력 `전력 계약종별`) · `null`(못 이음). 이 지역·계약종별 조건 묶음은 이제 7장의 고르기 조건(`PICK_KEYS` 의 `지역`·`계약종별`)에 그대로 들어가 호표에 바로 박힘 — 품셈재료 간접 없이 `master_material._region`·`_tariff` 가 품.
- 단가 = 연결된 줄의 값 열 다섯 가운데 낮은 값 · 호표 결과 줄에 `출처`(`<키>.<열>`) — **시험 계산용**. 후보 조건 = 품명 뿌리가 `이름` 으로 끝남 · 이름에 로직 입력 `자재지역` 글자 · 단위 같음 · 규격이 둘 이상 갈리면 멈춤 「후보 여럿」 · 그 지역 줄이 없으면 가까운 시군을 고르지 않고 멈춤 「지역 값 없음」.
## 6. 표형 요소 (소요량 · 계수)
@@ -220,15 +218,17 @@
}
```
- 조건 칸 = `구분`(반드시) · `상세구분` · `규격` · `대표` · 그 밖의 칸은 두지 않음. `종류` 는 「재료」만.
- 조건 칸 = `구분`(반드시 — `지역`·`계약종별` 조건은 예외) · `상세구분` · `이름` · `규격` · `대표` · `지역`("입력" 만) · `계약종별`("입력" 만) · 그 밖의 칸은 두지 않음. `종류` 는 「재료」만.
- `지역`·`계약종별` 조건(PLAN 7-4b 뒤 절반) = 구분·상세구분 없이 `이름` 하나로 자재품목(지역)·유가전력(계약종별)을 넓게 찾음 — 옛 품셈재료 `연결` 묶음과 같은 모양·같은 매칭(`master_material._region`·`_tariff`) · 로직 입력 `자재지역`·`전력 계약종별` 이 계산 때 좁힘 · 값은 `null`(지역·전력 마스터에 안 굳힘).
- 구분·상세구분 = 자재품목 줄의 같은 이름 칸과 똑같이 적음(묶음 목록은 `ref/_묶음_자재품목.md`).
- 규격 조건 = 원문이 규격을 밝힌 것만 좁힘 — 낱말이 **모두** 든 줄이 후보(「D300」 · 「D300 B종」) · 대소문자·빈칸·`φ` 는 안 가림. 원문이 규격을 안 밝히면 칸을 두지 않음.
- 이름 조건 = 구분·상세구분·규격이 같아도 품명이 갈리는 자재품목을 가를 때만 둠(예: 파형강관 커플링밴드 vs 접속티 — 둘 다 관경만 규격에 있어 규격 조건으로는 안 갈림). 규격과 같은 방식(낱말이 **모두** 이름에 든 줄) — 대소문자·빈칸은 안 가림.
- 대표 줄 = 관리자가 고른 자재품목 키 — 시험 계산이 그 줄의 값을 씀. 조건 밖 키는 검사가 잡음.
- 후보는 **호표 줄 단위와 같은 자재품목 줄만** — 단위가 다르면 다른 물건(우드칩 ㎥ · 원목후로링 ㎡). 조건 안 줄이 모두 다른 단위면 `check_master 단위` 가 알림.
- 조건 값에 `{입력}` 을 넣을 수 있음 — `"규격": "{관경}"` 은 계산 때 입력값으로 채워짐(검사에서는 그 칸을 뺌).
- 대표가 없으면 시험 계산은 **조건 안 값 있는 첫 줄** · 로직 입력 `자재지역` 이 있으면 이름에 그 지역이 든 줄부터(레미콘·골재처럼 지역이 갈리는 품목).
- 실제 줄 고르기는 프로젝트 몫 — 후보 목록은 `GET /api/m01/materials`(화면·테스트 컨테이너가 같이 씀).
- 옛 방식(품셈재료 키 `MP…` · 자재품목 키 `MT…`)도 그대로 돎 — 품셈재료 `고르기` 칸이 빈 줄(연결이 이미 있는 줄 · 짝 못 찾은 줄)과 `{이름}` 이 낀 원문번호 줄은 계속 옛 방식.
- 옛 방식(자재품목 키를 호표에 바로 적은 `MT…`)도 그대로 돎 — 그 줄은 그 자재품목 줄 값을 바로 씀. 품셈재료 간접(`MP…`)은 PLAN 7-4b 뒤 절반에서 다 걷음(위 4장) — 남았던 22줄(색소·에폭시·버너·퓨즈 등)도 자재품목 새 줄이나 대표 키로 이음.
- 근거가 덜 선 줄은 `비고` 칸에 적음 — 「환산 근거 미확인」.
- 입력 칸 = `이름`(반드시) · `설명` · `단위` · `고르기`·`범위`(둘 중 하나까지) · `출처`(원문 절) · `비고` · `시험입력`은 줄 머리에 따로.
@@ -248,7 +248,7 @@
- 로직 부르기 — `로직(GC000871, 기계='0201-0070')` · 돈 로직의 결과는 비목 묶음 `.노무비` `.재료비` `.경비` `.계` · 돈 아닌 로직은 수 하나.
- 입력 · 중간 · 비목 합은 이름 그대로.
- 덧줄에서만 `줄.'호표 줄 이름'` = 그 호표 줄의 금액 — 비목 합에서 한 줄만 빼는 식에 씀(`GF000185` 콘크리트다짐).
- 후보 조건 품셈재료를 쓰는 로직(부르는 로직 포함)은 입력 `자재지역` 을 두고 하위 로직에 `자재지역=자재지역` 으로 넘김 — `지역` 은 유가 고르기.
- 지역 고르기 조건(7장 `지역: "입력"`)을 쓰는 로직(부르는 로직 포함)은 입력 `자재지역` 을 두고 하위 로직에 `자재지역=자재지역` 으로 넘김 — `지역` 은 유가 고르기.
- 쓸 수 있는 것 — `+ - * /` · 괄호 · 비교 `< <= > >= == !=` · `그리고` `또는` · `찾기` · `로직` · `만약(조건, 참, 거짓)` · `올림` `버림` `반올림`(자리) · `최소` `최대`. 그 밖은 쓰지 않음.
- 로직이 돌고 도는 참조를 만들지 않음.
- 사람이 읽는 자리(M01 화면 · 검사 알림)는 키 옆에 이름.
@@ -0,0 +1,45 @@
기계 · 전체,키,원문번호,세부분류,이름,규격,단위,단위›가격,단위›내용시간,단위›연간표준가동시간,단위›상각비율,단위›정비비율,단위›연간관리비율,단위›상각비계수,단위›정비비계수,단위›관리비계수,단위›손료계수,단위›주연료,단위›주연료종류,단위›잡재료율,단위›조종원,단위›조종원직종,값,값›가격,값›내용시간,값›연간표준가동시간,값›상각비율,값›정비비율,값›연간관리비율,값›상각비계수,값›정비비계수,값›관리비계수,값›손료계수,값›주연료,값›주연료종류,값›잡재료율,값›조종원,값›조종원직종,출처,출처›가격,출처›내용시간,출처›연간표준가동시간,출처›상각비율,출처›정비비율,출처›연간관리비율,출처›상각비계수,출처›정비비계수,출처›관리비계수,출처›손료계수,출처›주연료,출처›주연료종류,출처›잡재료율,출처›조종원,출처›조종원직종,비고,원문,원문›8-4-2 주연료,원문›8-4-4 주연료,단위›주연료2,단위›주연료2종류,값›주연료2,값›주연료2종류,출처›주연료2,출처›주연료2종류,원문›8-4-5 주연료,원문›8-4-6 주연료,원문›8-4-8 주연료,단위›준설선선장,단위›준설선기관사,단위›선원,값›준설선선장,값›준설선기관사,값›선원,출처›준설선선장,출처›준설선기관사,출처›선원,원문›8-3-10 내용시간,원문›8-4-9 잡재료,단위›고급선원,값›고급선원,출처›고급선원,단위›장비가격,값›장비가격,출처›장비가격,단위›취득가액,값›취득가액,출처›취득가액,단위›시간당손료계수,값›시간당손료계수,출처›시간당손료계수,
기계 · 세부분류=건설품셈,키,원문번호,세부분류,이름,규격,단위,단위›가격,단위›내용시간,단위›연간표준가동시간,단위›상각비율,단위›정비비율,단위›연간관리비율,단위›상각비계수,단위›정비비계수,단위›관리비계수,단위›손료계수,단위›주연료,단위›주연료종류,단위›잡재료율,단위›조종원,단위›조종원직종,값,값›가격,값›내용시간,값›연간표준가동시간,값›상각비율,값›정비비율,값›연간관리비율,값›상각비계수,값›정비비계수,값›관리비계수,값›손료계수,값›주연료,값›주연료종류,값›잡재료율,값›조종원,값›조종원직종,출처,출처›가격,출처›내용시간,출처›연간표준가동시간,출처›상각비율,출처›정비비율,출처›연간관리비율,출처›상각비계수,출처›정비비계수,출처›관리비계수,출처›손료계수,출처›주연료,출처›주연료종류,출처›잡재료율,출처›조종원,출처›조종원직종,비고,원문,원문›8-4-2 주연료,원문›8-4-4 주연료,단위›주연료2,단위›주연료2종류,값›주연료2,값›주연료2종류,출처›주연료2,출처›주연료2종류,원문›8-4-5 주연료,원문›8-4-6 주연료,원문›8-4-8 주연료,단위›준설선선장,단위›준설선기관사,단위›선원,값›준설선선장,값›준설선기관사,값›선원,출처›준설선선장,출처›준설선기관사,출처›선원,원문›8-3-10 내용시간,원문›8-4-9 잡재료,단위›고급선원,값›고급선원,출처›고급선원,,,,,,,,,,
기계 · 세부분류=산림품셈,키,원문번호,세부분류,이름,규격,단위,단위›손료계수,값,값›손료계수,출처,출처›손료계수,비고,단위›장비가격,값›장비가격,출처›장비가격,단위›취득가액,값›취득가액,출처›취득가액,단위›시간당손료계수,값›시간당손료계수,출처›시간당손료계수,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
요율_조달청제비율 · 전체,키,원문번호,이름,값,값›rate_percent,값›base,출처,값›brackets,값›annual_rates,값›rate_from_2033_percent,값›base_without_owner_supplied_material,값›base_with_owner_supplied_material,값›minimum_total_construction_amount_krw,값›manager_thresholds,값›base_rule,값›embedded_in,값›amount_bracket,값›minimum_estimated_amount_krw,값›forest_road_selection_status,값›forest_road_candidates,값›all_work_types,값›general_construction,값›specialty_construction,값›base_note,값›typical_forest_road_applicability,값›civil_landscape_industrial,값›specialty_electric_communication_fire_other,값›basis,값›specialty_note,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
인력 · 전체,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,일시간,상태,옛이름,비고,준용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
인력 · 조사=건설업,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,일시간,상태,옛이름,비고,준용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
인력 · 조사=제조업,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,일시간,상태,옛이름,비고,준용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
인력 · 조사=엔지니어링,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,일시간,상태,옛이름,비고,준용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
인력 · 조사=측량,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,일시간,상태,옛이름,비고,준용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
인력 · 조사=건설사업관리,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,일시간,상태,옛이름,비고,준용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
인력 · 조사=SW,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,일시간,상태,옛이름,비고,준용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
인력 · 조사=산림,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,일시간,상태,옛이름,비고,준용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
인력 · 조사=준용대상,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,일시간,상태,옛이름,비고,준용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
재료_나라장터자재 · 전체,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,분류코드,공시일시,공시번호,사업구분코드,사업구분,부가세,가격종류,인도조건,분야,비고,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
재료_시중물가 · 전체,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,비고,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
재료_오피넷유가 · 전체,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,비고,,상품코드,지역코드,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
환율_한국은행환율 · 전체,키,원문번호,구분,상세구분,이름,규격,단위,값,출처,비고,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
계수_건설품셈(파일 전체 합침) · 표 머리,키,원문번호,구분,상세구분,이름,기준,출처,조건,값칸,줄,주,범위규칙,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
계수_산림품셈(파일 전체 합침) · 표 머리,키,원문번호,구분,상세구분,이름,기준,출처,조건,값칸,줄,주,범위규칙,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
로직_건설품셈(파일 전체 합침) · 로직 머리,키,원문번호,이름,결과단위,출처,소유,입력,중간,호표,덧줄,끝수,비고,결과,결과›식,결과›출처,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
로직_건설품셈(파일 전체 합침) · 입력 줄,이름,고르기,출처,비고,단위,범위,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
로직_건설품셈(파일 전체 합침) · 중간 줄,이름,식,출처,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
로직_건설품셈(파일 전체 합침) · 호표 줄,종류,요소,이름,단위,수량,비목,비고,출처,규격,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
로직_건설품셈(파일 전체 합침) · 덧줄 줄,이름,식,비목,출처,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
로직_산림품셈(파일 전체 합침) · 로직 머리,키,원문번호,이름,결과단위,출처,소유,입력,중간,호표,덧줄,끝수,비고,결과,결과›식,결과›출처,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
로직_산림품셈(파일 전체 합침) · 입력 줄,이름,고르기,단위,출처,범위,비고,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
로직_산림품셈(파일 전체 합침) · 중간 줄,이름,식,출처,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
로직_산림품셈(파일 전체 합침) · 호표 줄,종류,요소,이름,단위,수량,비목,출처,비고,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
로직_산림품셈(파일 전체 합침) · 덧줄 줄,이름,식,비목,출처,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
소요량_건설품셈(파일 전체 합침) · 표 머리,키,원문번호,구분,상세구분,이름,기준,출처,조건,값칸,줄,주,그룹,범위규칙,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
소요량_산림품셈(파일 전체 합침) · 표 머리,키,원문번호,구분,상세구분,이름,기준,출처,조건,값칸,줄,주,그룹,범위규칙,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
* 건설업의 산정근거는 비고에 산정값은 값에 입력,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
"* 조사는 구분으로 열제목 변경, 업종과 부문은 상세구분으로 편입",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
"* 일하는 시간은 내용이 없는 경우 8시간으로 반영(별도로 언급이 없으면 8시간, 잠수부? 만 6시간)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
* 준용은 공통 항목 다시말해 변경할 수도 있음.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
"* 시중물가의 시중값과 조달값은 필요없음, 나중에 프로젝트 내부에 내역세작성시 필요한 내용, ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
* 품셈재료 품목은 품셈원문에서 사용한 품목가이드 이고 시중물가와 나라장터자재에 있어야하는 정보를 사용하여 계산되어야함. 테이블은 삭제 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
* 오피넷 유가에는 구분과 상세구분은 지역으로 사용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
* 오피넷 유가의 상품코드와 지역코드는 어디에 사용되는지 확인. 필요없으면 삭제하는게.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
* 오피넛 유가의 기준일은 규격 열을 사용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
* 환율의 기준일은 규격 열을 사용,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1 기계 · 전체 키 원문번호 세부분류 이름 규격 단위 단위›가격 단위›내용시간 단위›연간표준가동시간 단위›상각비율 단위›정비비율 단위›연간관리비율 단위›상각비계수 단위›정비비계수 단위›관리비계수 단위›손료계수 단위›주연료 단위›주연료종류 단위›잡재료율 단위›조종원 단위›조종원직종 값 값›가격 값›내용시간 값›연간표준가동시간 값›상각비율 값›정비비율 값›연간관리비율 값›상각비계수 값›정비비계수 값›관리비계수 값›손료계수 값›주연료 값›주연료종류 값›잡재료율 값›조종원 값›조종원직종 출처 출처›가격 출처›내용시간 출처›연간표준가동시간 출처›상각비율 출처›정비비율 출처›연간관리비율 출처›상각비계수 출처›정비비계수 출처›관리비계수 출처›손료계수 출처›주연료 출처›주연료종류 출처›잡재료율 출처›조종원 출처›조종원직종 비고 원문 원문›8-4-2 주연료 원문›8-4-4 주연료 단위›주연료2 단위›주연료2종류 값›주연료2 값›주연료2종류 출처›주연료2 출처›주연료2종류 원문›8-4-5 주연료 원문›8-4-6 주연료 원문›8-4-8 주연료 단위›준설선선장 단위›준설선기관사 단위›선원 값›준설선선장 값›준설선기관사 값›선원 출처›준설선선장 출처›준설선기관사 출처›선원 원문›8-3-10 내용시간 원문›8-4-9 잡재료 단위›고급선원 값›고급선원 출처›고급선원 단위›장비가격 값›장비가격 출처›장비가격 단위›취득가액 값›취득가액 출처›취득가액 단위›시간당손료계수 값›시간당손료계수 출처›시간당손료계수
2 기계 · 세부분류=건설품셈 키 원문번호 세부분류 이름 규격 단위 단위›가격 단위›내용시간 단위›연간표준가동시간 단위›상각비율 단위›정비비율 단위›연간관리비율 단위›상각비계수 단위›정비비계수 단위›관리비계수 단위›손료계수 단위›주연료 단위›주연료종류 단위›잡재료율 단위›조종원 단위›조종원직종 값 값›가격 값›내용시간 값›연간표준가동시간 값›상각비율 값›정비비율 값›연간관리비율 값›상각비계수 값›정비비계수 값›관리비계수 값›손료계수 값›주연료 값›주연료종류 값›잡재료율 값›조종원 값›조종원직종 출처 출처›가격 출처›내용시간 출처›연간표준가동시간 출처›상각비율 출처›정비비율 출처›연간관리비율 출처›상각비계수 출처›정비비계수 출처›관리비계수 출처›손료계수 출처›주연료 출처›주연료종류 출처›잡재료율 출처›조종원 출처›조종원직종 비고 원문 원문›8-4-2 주연료 원문›8-4-4 주연료 단위›주연료2 단위›주연료2종류 값›주연료2 값›주연료2종류 출처›주연료2 출처›주연료2종류 원문›8-4-5 주연료 원문›8-4-6 주연료 원문›8-4-8 주연료 단위›준설선선장 단위›준설선기관사 단위›선원 값›준설선선장 값›준설선기관사 값›선원 출처›준설선선장 출처›준설선기관사 출처›선원 원문›8-3-10 내용시간 원문›8-4-9 잡재료 단위›고급선원 값›고급선원 출처›고급선원
3 기계 · 세부분류=산림품셈 키 원문번호 세부분류 이름 규격 단위 단위›손료계수 값 값›손료계수 출처 출처›손료계수 비고 단위›장비가격 값›장비가격 출처›장비가격 단위›취득가액 값›취득가액 출처›취득가액 단위›시간당손료계수 값›시간당손료계수 출처›시간당손료계수
4 요율_조달청제비율 · 전체 키 원문번호 이름 값 값›rate_percent 값›base 출처 값›brackets 값›annual_rates 값›rate_from_2033_percent 값›base_without_owner_supplied_material 값›base_with_owner_supplied_material 값›minimum_total_construction_amount_krw 값›manager_thresholds 값›base_rule 값›embedded_in 값›amount_bracket 값›minimum_estimated_amount_krw 값›forest_road_selection_status 값›forest_road_candidates 값›all_work_types 값›general_construction 값›specialty_construction 값›base_note 값›typical_forest_road_applicability 값›civil_landscape_industrial 값›specialty_electric_communication_fire_other 값›basis 값›specialty_note
5 인력 · 전체 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 일시간 상태 옛이름 비고 준용
6 인력 · 조사=건설업 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 일시간 상태 옛이름 비고 준용
7 인력 · 조사=제조업 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 일시간 상태 옛이름 비고 준용
8 인력 · 조사=엔지니어링 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 일시간 상태 옛이름 비고 준용
9 인력 · 조사=측량 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 일시간 상태 옛이름 비고 준용
10 인력 · 조사=건설사업관리 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 일시간 상태 옛이름 비고 준용
11 인력 · 조사=SW 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 일시간 상태 옛이름 비고 준용
12 인력 · 조사=산림 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 일시간 상태 옛이름 비고 준용
13 인력 · 조사=준용대상 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 일시간 상태 옛이름 비고 준용
14 재료_나라장터자재 · 전체 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 분류코드 공시일시 공시번호 사업구분코드 사업구분 부가세 가격종류 인도조건 분야 비고
15 재료_시중물가 · 전체 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 비고
16 재료_오피넷유가 · 전체 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 비고 상품코드 지역코드
17
18 환율_한국은행환율 · 전체 키 원문번호 구분 상세구분 이름 규격 단위 값 출처 비고
19 계수_건설품셈(파일 전체 합침) · 표 머리 키 원문번호 구분 상세구분 이름 기준 출처 조건 값칸 줄 주 범위규칙
20 계수_산림품셈(파일 전체 합침) · 표 머리 키 원문번호 구분 상세구분 이름 기준 출처 조건 값칸 줄 주 범위규칙
21 로직_건설품셈(파일 전체 합침) · 로직 머리 키 원문번호 이름 결과단위 출처 소유 입력 중간 호표 덧줄 끝수 비고 결과 결과›식 결과›출처
22 로직_건설품셈(파일 전체 합침) · 입력 줄 이름 고르기 출처 비고 단위 범위
23 로직_건설품셈(파일 전체 합침) · 중간 줄 이름 식 출처
24 로직_건설품셈(파일 전체 합침) · 호표 줄 종류 요소 이름 단위 수량 비목 비고 출처 규격
25 로직_건설품셈(파일 전체 합침) · 덧줄 줄 이름 식 비목 출처
26 로직_산림품셈(파일 전체 합침) · 로직 머리 키 원문번호 이름 결과단위 출처 소유 입력 중간 호표 덧줄 끝수 비고 결과 결과›식 결과›출처
27 로직_산림품셈(파일 전체 합침) · 입력 줄 이름 고르기 단위 출처 범위 비고
28 로직_산림품셈(파일 전체 합침) · 중간 줄 이름 식 출처
29 로직_산림품셈(파일 전체 합침) · 호표 줄 종류 요소 이름 단위 수량 비목 출처 비고
30 로직_산림품셈(파일 전체 합침) · 덧줄 줄 이름 식 비목 출처
31 소요량_건설품셈(파일 전체 합침) · 표 머리 키 원문번호 구분 상세구분 이름 기준 출처 조건 값칸 줄 주 그룹 범위규칙
32 소요량_산림품셈(파일 전체 합침) · 표 머리 키 원문번호 구분 상세구분 이름 기준 출처 조건 값칸 줄 주 그룹 범위규칙
33
34 * 건설업의 산정근거는 비고에 산정값은 값에 입력
35 * 조사는 구분으로 열제목 변경, 업종과 부문은 상세구분으로 편입
36 * 일하는 시간은 내용이 없는 경우 8시간으로 반영(별도로 언급이 없으면 8시간, 잠수부? 만 6시간)
37 * 준용은 공통 항목 다시말해 변경할 수도 있음.
38
39 * 시중물가의 시중값과 조달값은 필요없음, 나중에 프로젝트 내부에 내역세작성시 필요한 내용,
40 * 품셈재료 품목은 품셈원문에서 사용한 품목가이드 이고 시중물가와 나라장터자재에 있어야하는 정보를 사용하여 계산되어야함. 테이블은 삭제
41
42 * 오피넷 유가에는 구분과 상세구분은 지역으로 사용
43 * 오피넷 유가의 상품코드와 지역코드는 어디에 사용되는지 확인. 필요없으면 삭제하는게.
44 * 오피넛 유가의 기준일은 규격 열을 사용
45 * 환율의 기준일은 규격 열을 사용
@@ -20,7 +20,7 @@
{ "키": "MP000009", "원문번호": "이형철근 SD300 D13", "이름": "이형철근", "규격": "SD300, D13", "단위": "ton", "요구절": ["산림품셈 12-12"], "연결": "MT014463", "고르기": null, "비고": "연결: 이형철근(SD300) D13 전국 줄" },
{ "키": "MP000010", "원문번호": "원형철근 ∅29㎜", "이름": "원형철근", "규격": "∅29㎜, L=500㎜", "단위": "ton", "요구절": ["산림품셈 12-30-2"], "연결": null, "고르기": {"구분": "철근·강재", "상세구분": "철근"}, "비고": "자재품목에 같은 품명 없음" },
{ "키": "MP000011", "원문번호": "강봉 D32㎜", "이름": "강봉", "규격": "D32㎜, L=1000㎜", "단위": "EA", "요구절": ["산림품셈 12-30-1"], "연결": null, "고르기": null, "비고": "강봉보강재뿐 · 값은 m — EA 아님 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000012", "원문번호": "사다리", "이름": "사다리", "규격": "∅19㎜ 아연도금 및 스테인레스", "단위": "ton", "요구절": ["산림품셈 12-16"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 단위 ton · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000012", "원문번호": "사다리", "이름": "사다리", "규격": "∅19㎜ 아연도금 및 스테인레스", "단위": "ton", "요구절": ["산림품셈 12-16"], "연결": "MT030600", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030600)로 이음 · 값 미확보" },
{ "키": "MP000013", "원문번호": "고철", "이름": "고철", "규격": "", "단위": "kg", "요구절": ["산림품셈 9-8-1 주4", "산림품셈 12-34-3"], "연결": null, "고르기": null, "비고": "경량·중량·STS·알루미늄 갈림 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000014", "원문번호": "폼타이", "이름": "폼타이(Form Tie)", "규격": "D형 1/2인치", "단위": "본", "요구절": ["산림품셈 12-4 주⑦", "건설품셈 공통 6-3-1 주④"], "연결": null, "고르기": null, "비고": "폼타이 값은 「조」 — 본 환산 안 함 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000015", "원문번호": "문양 스티로폴", "이름": "문양 스티로폴(자재비 포함)", "규격": "", "단위": "㎡", "요구절": ["산림품셈 12-5"], "연결": null, "고르기": {"구분": "단열·보온", "상세구분": "단열재"}, "비고": "자재품목에 같은 품명 없음" },
@@ -35,20 +35,20 @@
{ "키": "MP000024", "원문번호": "고무링 ∅800㎜", "이름": "고무링(VR관)", "규격": "∅800㎜", "단위": "개", "요구절": ["산림품셈 12-11-1"], "연결": "MT009721", "고르기": null, "비고": "연결: VR관고무링 D800 이름·규격 같음" },
{ "키": "MP000025", "원문번호": "흄관 ∅800㎜", "이름": "흄관", "규격": "∅800㎜", "단위": "m", "요구절": ["산림품셈 12-11-2-1"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "흄관", "규격": "Φ800mm", "대표": "MT014981"}, "비고": "A·B형 갈림 · 값은 「본」 — m 아님" },
{ "키": "MP000026", "원문번호": "파형강관 ∅800㎜", "이름": "파형강관", "규격": "∅800㎜", "단위": "m", "요구절": ["산림품셈 12-11-3"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "파형강관"}, "비고": "두께 1.6·2.0·2.7T 갈림 — 원문 없음" },
{ "키": "MP000027", "원문번호": "커플링밴드 ∅800㎜", "이름": "커플링밴드(파형강관)", "규격": "∅800㎜", "단위": "EA", "요구절": ["산림품셈 12-11-3 주①"], "연결": "MT015309", "고르기": null, "비고": "연결: 파형강관 커플링밴드 Φ800 관급 줄" },
{ "키": "MP000027", "원문번호": "커플링밴드 ∅800㎜", "이름": "커플링밴드(파형강관)", "규격": "∅800㎜", "단위": "EA", "요구절": ["산림품셈 12-11-3 주①"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "파형강관", "이름": "파형강관 커플링밴드(관급)", "규격": "Φ800mm", "대표": "MT015309"}, "비고": "일감35 — 규격(관경)만으론 접속티와 안 갈려 이름 조건을 더함" },
{ "키": "MP000028", "원문번호": "VR관 ∅1000㎜", "이름": "VR관(소켓식)", "규격": "∅1000㎜", "단위": "m", "요구절": ["산림품셈 12-11-1"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "PVC관"}, "비고": "VR관 값은 「본」 — m 환산 안 함" },
{ "키": "MP000029", "원문번호": "고무링 ∅1000㎜", "이름": "고무링(VR관)", "규격": "∅1000㎜", "단위": "개", "요구절": ["산림품셈 12-11-1"], "연결": "MT009723", "고르기": null, "비고": "연결: VR관고무링 D1000 이름·규격 같음" },
{ "키": "MP000030", "원문번호": "흄관 ∅1000㎜", "이름": "흄관", "규격": "∅1000㎜", "단위": "m", "요구절": ["산림품셈 12-11-2-1"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "흄관", "규격": "Φ1000mm", "대표": "MT014983"}, "비고": "A·B형 갈림 · 값은 「본」 — m 아님" },
{ "키": "MP000031", "원문번호": "파형강관 ∅1000㎜", "이름": "파형강관", "규격": "∅1000㎜", "단위": "m", "요구절": ["산림품셈 12-11-3"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "파형강관"}, "비고": "두께 1.6·2.0·2.7T 갈림 — 원문 없음" },
{ "키": "MP000032", "원문번호": "커플링밴드 ∅1000㎜", "이름": "커플링밴드(파형강관)", "규격": "∅1000㎜", "단위": "EA", "요구절": ["산림품셈 12-11-3 주①"], "연결": "MT015311", "고르기": null, "비고": "연결: 파형강관 커플링밴드 Φ1000 관급 줄" },
{ "키": "MP000032", "원문번호": "커플링밴드 ∅1000㎜", "이름": "커플링밴드(파형강관)", "규격": "∅1000㎜", "단위": "EA", "요구절": ["산림품셈 12-11-3 주①"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "파형강관", "이름": "파형강관 커플링밴드(관급)", "규격": "Φ1000mm", "대표": "MT015311"}, "비고": "일감35 — 규격(관경)만으론 접속티와 안 갈려 이름 조건을 더함" },
{ "키": "MP000033", "원문번호": "VR관 ∅1200㎜", "이름": "VR관(소켓식)", "규격": "∅1200㎜", "단위": "m", "요구절": ["산림품셈 12-11-1"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "PVC관"}, "비고": "VR관 값은 「본」 — m 환산 안 함" },
{ "키": "MP000034", "원문번호": "고무링 ∅1200㎜", "이름": "고무링(VR관)", "규격": "∅1200㎜", "단위": "개", "요구절": ["산림품셈 12-11-1"], "연결": "MT009725", "고르기": null, "비고": "연결: VR관고무링 D1200 이름·규격 같음" },
{ "키": "MP000035", "원문번호": "흄관 ∅1200㎜", "이름": "흄관", "규격": "∅1200㎜", "단위": "m", "요구절": ["산림품셈 12-11-2-1"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "흄관", "규격": "Φ1200mm", "대표": "MT014985"}, "비고": "A·B형 갈림 · 값은 「본」 — m 아님" },
{ "키": "MP000036", "원문번호": "파형강관 ∅1200㎜", "이름": "파형강관", "규격": "∅1200㎜", "단위": "m", "요구절": ["산림품셈 12-11-3"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "파형강관"}, "비고": "두께 1.6·2.0·2.7T 갈림 — 원문 없음" },
{ "키": "MP000037", "원문번호": "커플링밴드 ∅1200㎜", "이름": "커플링밴드(파형강관)", "규격": "∅1200㎜", "단위": "EA", "요구절": ["산림품셈 12-11-3 주①"], "연결": "MT015313", "고르기": null, "비고": "연결: 파형강관 커플링밴드 Φ1200 관급 줄" },
{ "키": "MP000038", "원문번호": "지수활제", "이름": "지수활제", "규격": "", "단위": "g", "요구절": ["산림품셈 12-11-1"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000037", "원문번호": "커플링밴드 ∅1200㎜", "이름": "커플링밴드(파형강관)", "규격": "∅1200㎜", "단위": "EA", "요구절": ["산림품셈 12-11-3 주①"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "파형강관", "이름": "파형강관 커플링밴드(관급)", "규격": "Φ1200mm", "대표": "MT015313"}, "비고": "일감35 — 규격(관경)만으론 접속티와 안 갈려 이름 조건을 더함" },
{ "키": "MP000038", "원문번호": "지수활제", "이름": "지수활제", "규격": "", "단위": "g", "요구절": ["산림품셈 12-11-1"], "연결": "MT030601", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030601)로 이음 · 값 미확보" },
{ "키": "MP000039", "원문번호": "모르타르 1:2", "이름": "접합몰탈", "규격": "1:2", "단위": "㎥", "요구절": ["산림품셈 12-11-2-1", "건설품셈 건축 2-1-4", "건설품셈 건축 3-2-2"], "연결": null, "고르기": {"구분": "시멘트·골재", "상세구분": "모르타르", "규격": "1:2"}, "비고": "자재품목에 같은 품명 없음" },
{ "키": "MP000040", "원문번호": "스틸그레이팅", "이름": "집수정 뚜껑", "규격": "스틸그레이팅", "단위": "개", "요구절": ["산림품셈 12-15"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000040", "원문번호": "스틸그레이팅", "이름": "집수정 뚜껑", "규격": "스틸그레이팅", "단위": "개", "요구절": ["산림품셈 12-15"], "연결": "MT030712", "고르기": null, "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목 새 줄(MT030712)로 이음 · 값 미확보" },
{ "키": "MP000041", "원문번호": "원형거푸집 벽체", "이름": "원형거푸집(PE 10회)", "규격": "벽체", "단위": "조", "요구절": ["산림품셈 12-16"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000042", "원문번호": "원형거푸집 스라브 및 기초", "이름": "원형거푸집(PE 10회)", "규격": "스라브 및 기초", "단위": "조", "요구절": ["산림품셈 12-16"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000043", "원문번호": "철물", "이름": "철물(강관비계)", "규격": "", "단위": "개", "요구절": ["산림품셈 12-19"], "연결": null, "고르기": {"구분": "거푸집·가설재", "상세구분": "동바리·비계"}, "비고": "이음·조임·받침 철물 갈림" },
@@ -56,41 +56,41 @@
{ "키": "MP000045", "원문번호": "강관동바리 외관", "이름": "강관동바리 외관", "규격": "60.6㎜×2.3㎜", "단위": "본", "요구절": ["산림품셈 12-20"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000046", "원문번호": "아스팔트 ㏊-500", "이름": "아스팔트", "규격": "㏊-500", "단위": "kg", "요구절": ["산림품셈 12-21"], "연결": null, "고르기": {"구분": "아스콘·포장", "상세구분": "아스팔트"}, "비고": "AP-3·AP-5 갈림 — 원문 규격과 안 맞음" },
{ "키": "MP000047", "원문번호": "PVC 파이프 50㎜", "이름": "P.V.C 파이프", "규격": "50㎜", "단위": "", "요구절": ["산림품셈 12-22"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "PVC관", "규격": "50mm"}, "비고": "원문 단위 없음 — 못 맞댐" },
{ "키": "MP000048", "원문번호": "JOINT FILLER", "이름": "JOINT FILLER", "규격": "", "단위": "㎡", "요구절": ["산림품셈 12-27-2", "산림품셈 12-34-4"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000048", "원문번호": "JOINT FILLER", "이름": "JOINT FILLER", "규격": "", "단위": "㎡", "요구절": ["산림품셈 12-27-2", "산림품셈 12-34-4"], "연결": "MT030602", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030602)로 이음 · 값 미확보" },
{ "키": "MP000049", "원문번호": "JOINT FILLER 접착제", "이름": "접착제(JOINT FILLER)", "규격": "", "단위": "kg", "요구절": ["산림품셈 12-27-2"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "접착·혼화"}, "비고": "접착제 종류 갈림" },
{ "키": "MP000050", "원문번호": "실런트", "이름": "실런트", "규격": "20×25㎜", "단위": "kg", "요구절": ["산림품셈 12-27-3"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000051", "원문번호": "에폭시 접착제 콘크리트용", "이름": "에폭시 접착제", "규격": "콘크리트용", "단위": "kg", "요구절": ["산림품셈 12-28"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "접착·혼화"}, "비고": "에폭시 접착제 GF800 한 줄 — 규격 다름" },
{ "키": "MP000052", "원문번호": "스페이셔 몰탈 블록", "이름": "스페이셔(몰탈 블록)", "규격": "", "단위": "", "요구절": ["산림품셈 12-29"], "연결": null, "고르기": null, "비고": "원문 단위 없음 — 못 맞댐 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000052", "원문번호": "스페이셔 몰탈 블록", "이름": "스페이셔(몰탈 블록)", "규격": "", "단위": "", "요구절": ["산림품셈 12-29"], "연결": "MT030603", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030603)로 이음 · 값 미확보" },
{ "키": "MP000053", "원문번호": "PVC 파이프 Ø35㎜", "이름": "P.V.C 파이프", "규격": "Ø35㎜", "단위": "m", "요구절": ["산림품셈 12-30-1"], "연결": null, "고르기": {"구분": "관·이음관", "상세구분": "PVC관"}, "비고": "자재품목에 같은 품명 없음" },
{ "키": "MP000054", "원문번호": "탄성고무받침", "이름": "탄성고무받침", "규격": "150×150×15", "단위": "㎡", "요구절": ["산림품셈 12-30-2"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000055", "원문번호": "스티로폴 T20㎜", "이름": "스티로폴", "규격": "T=20㎜", "단위": "㎡", "요구절": ["산림품셈 12-30-2"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000056", "원문번호": "TAR PAPER", "이름": "TAR PAPER", "규격": "T=15㎜", "단위": "㎡", "요구절": ["산림품셈 12-30-2"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000057", "원문번호": "채움재 아스팔트", "이름": "채움재(아스팔트)", "규격": "", "단위": "㎥", "요구절": ["산림품셈 12-30-2"], "연결": null, "고르기": null, "비고": "아스팔트 값은 kg — ㎥ 환산 안 함 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000055", "원문번호": "스티로폴 T20㎜", "이름": "스티로폴", "규격": "T=20㎜", "단위": "㎡", "요구절": ["산림품셈 12-30-2"], "연결": "MT030604", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030604)로 이음 · 값 미확보" },
{ "키": "MP000056", "원문번호": "TAR PAPER", "이름": "TAR PAPER", "규격": "T=15㎜", "단위": "㎡", "요구절": ["산림품셈 12-30-2"], "연결": "MT030605", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030605)로 이음 · 값 미확보" },
{ "키": "MP000057", "원문번호": "채움재 아스팔트", "이름": "채움재(아스팔트)", "규격": "", "단위": "㎥", "요구절": ["산림품셈 12-30-2"], "연결": "MT030606", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030606)로 이음 · 값 미확보" },
{ "키": "MP000058", "원문번호": "다웰바캡", "이름": "다웰바캡", "규격": "D=50㎜", "단위": "m", "요구절": ["산림품셈 12-30-2"], "연결": null, "고르기": {"구분": "교량·구조부속", "상세구분": "보강재·정착"}, "비고": "자재품목에 같은 품명 없음" },
{ "키": "MP000059", "원문번호": "물끊기 홈 재료", "이름": "물끊기 홈(NOTCH) 재료", "규격": "", "단위": "", "요구절": ["산림품셈 12-31"], "연결": null, "고르기": null, "비고": "원문 단위 없음 — 못 맞댐 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000060", "원문번호": "하드너", "이름": "콘크리트 표면 강화재(하드너)", "규격": "", "단위": "", "요구절": ["산림품셈 12-35"], "연결": null, "고르기": null, "비고": "원문 단위 없음 — 못 맞댐 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000060", "원문번호": "하드너", "이름": "콘크리트 표면 강화재(하드너)", "규격": "", "단위": "", "요구절": ["산림품셈 12-35"], "연결": "MT030607", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030607)로 이음 · 값 미확보" },
{ "키": "MP000061", "원문번호": "소재", "이름": "소재(원목)", "규격": "", "단위": "㎥", "요구절": ["산림품셈 10-8-2"], "연결": null, "고르기": null, "비고": "대·중·소경목 갈림 — 원문 지름 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000062", "원문번호": "각재·판재", "이름": "각재·판재", "규격": "", "단위": "㎥", "요구절": ["산림품셈 10-8-2"], "연결": null, "고르기": null, "비고": "미송·외송 갈림 · 각재와 판재 둘 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000063", "원문번호": "목재", "이름": "목재(규준틀)", "규격": "", "단위": "㎥", "요구절": ["산림품셈 11-2", "산림품셈 11-3", "건설품셈 공통 2-5-4", "건설품셈 공통 2-11-1 재료량"], "연결": null, "고르기": {"구분": "목재", "상세구분": "각재·판재", "대표": "MT000409"}, "비고": "규준틀 목재 줄 없음 — 합성목재뿐" },
{ "키": "MP000064", "원문번호": "줄눈 모르타르", "이름": "줄눈메꿈 모르타르", "규격": "", "단위": "㎥", "요구절": ["산림품셈 13-4-4 주④", "산림품셈 13-5-1 주③"], "연결": null, "고르기": {"구분": "시멘트·골재", "상세구분": "모르타르"}, "비고": "자재품목에 같은 품명 없음" },
{ "키": "MP000065", "원문번호": "틈메우기돌", "이름": "틈메우기돌", "규격": "", "단위": "㎥", "요구절": ["산림품셈 13-5-1 주④"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000066", "원문번호": "철망태", "이름": "철망태(사각형 돌망태)", "규격": "", "단위": "㎥", "요구절": ["산림품셈 13-11-4"], "연결": null, "고르기": {"구분": "매트·토목섬유", "상세구분": "돌망태·사방"}, "비고": "개비온 값은 「조」 — ㎥ 환산 안 함" },
{ "키": "MP000065", "원문번호": "틈메우기돌", "이름": "틈메우기돌", "규격": "", "단위": "㎥", "요구절": ["산림품셈 13-5-1 주④"], "연결": "MT030608", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030608)로 이음 · 값 미확보" },
{ "키": "MP000066", "원문번호": "철망태", "이름": "철망태(사각형 돌망태)", "규격": "", "단위": "㎥", "요구절": ["산림품셈 13-11-4"], "연결": "MT004110", "고르기": null, "비고": "PLAN 7-4b: 개비온 값은 「조」 — ㎥ 환산 안 함 · 후보 5줄(사석류) 가운데 돌망태에 넣는 망태석 300mm(MT004110)로 이음(정확한 짝 아님)" },
{ "키": "MP000067", "원문번호": "돌망태 채움재", "이름": "채움재(돌망태)", "규격": "", "단위": "㎥", "요구절": ["산림품셈 13-11-4"], "연결": null, "고르기": {"구분": "매트·토목섬유", "상세구분": "돌망태·사방"}, "비고": "돌망태 채움돌 값 줄 없음" },
{ "키": "MP000068", "원문번호": "농약(Fluroxypyr-meptyl+Triclypyr-TEA 미탁제)", "이름": "농약", "규격": "Fluroxypyr-meptyl+Triclypyr-TEA 미탁제", "단위": "병", "요구절": ["산림품셈 2-1-5-1", "산림품셈 6-4-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000069", "원문번호": "우드칩", "이름": "우드칩(목재칩)", "규격": "", "단위": "㎥", "요구절": ["산림품셈 6-8"], "연결": null, "고르기": null, "비고": "우드칩 값은 「포」 — ㎥ 환산 안 함 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000070", "원문번호": "깃발", "이름": "깃발", "규격": "", "단위": "개", "요구절": ["산림품셈 8-6-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000070", "원문번호": "깃발", "이름": "깃발", "규격": "", "단위": "개", "요구절": ["산림품셈 8-6-1"], "연결": "MT030609", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030609)로 이음 · 값 미확보" },
{ "키": "MP000071", "원문번호": "폭약", "이름": "폭약", "규격": "", "단위": "㎏", "요구절": ["건설품셈 공통 3-3-7", "건설품셈 공통 3-3-9"], "연결": null, "고르기": null, "비고": "지름·제품별 갈림 — 원문 규격 없음 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000072", "원문번호": "뇌관", "이름": "뇌관", "규격": "", "단위": "개", "요구절": ["건설품셈 공통 3-3-7", "건설품셈 공통 3-3-9"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "화약", "대표": "MT005677"}, "비고": "전기뇌관 각선 길이 갈림" },
{ "키": "MP000073", "원문번호": "비트", "이름": "비트(소형브레이커 천공)", "규격": "", "단위": "개", "요구절": ["건설품셈 공통 3-3-7", "건설품셈 공통 3-3-9"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"}, "비고": "코어·버튼·착암기 비트 갈림" },
{ "키": "MP000074", "원문번호": "초류종자", "이름": "종자(초류)", "규격": "", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": null, "고르기": {"구분": "식생·종자", "상세구분": "종자", "대표": "MT006651"}, "비고": "초종별 갈림 — 원문 「초류」 만" },
{ "키": "MP000075", "원문번호": "복합비료", "이름": "비료", "규격": "복합비료", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": "MT006489", "고르기": null, "비고": "연결: 복합비료 규격 없는 kg 줄" },
{ "키": "MP000076", "원문번호": "피복제", "이름": "피복제", "규격": "화이버/펄프류", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000077", "원문번호": "침식방지안정제", "이름": "침식방지안정제", "규격": "합성접착제", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000078", "원문번호": "착색제", "이름": "색소", "규격": "착색제", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": null, "고르기": null, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT006740) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000076", "원문번호": "피복제", "이름": "피복제", "규격": "화이버/펄프류", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": "MT030610", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030610)로 이음 · 값 미확보" },
{ "키": "MP000077", "원문번호": "침식방지안정제", "이름": "침식방지안정제", "규격": "합성접착제", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": "MT030611", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030611)로 이음 · 값 미확보" },
{ "키": "MP000078", "원문번호": "착색제", "이름": "색소", "규격": "착색제", "단위": "㎏", "요구절": ["건설품셈 공통 4-1-3 재료량"], "연결": "MT006740", "고르기": null, "비고": "PLAN 7-4b: 후보 1줄(착색제, M-Green)뿐이라 그대로 이음" },
{ "키": "MP000079", "원문번호": "차선도색 프라이머", "이름": "프라이머", "규격": "융착식 도료 차선도색용", "단위": "kg", "요구절": ["건설품셈 토목 1-8-9 융착식 도료 수동식 재료", "건설품셈 유지관리 2-1-15 4 자재수량"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "도료"}, "비고": "자재품목 후보 19줄 — 지역·규격 선택 필요 (MT003562, MT003588, MT003600 외)" },
{ "키": "MP000080", "원문번호": "낙석방지망 철망", "이름": "철망", "규격": "낙석방지망용", "단위": "㎡", "요구절": ["건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)"], "연결": null, "고르기": null, "비고": "자재품목 후보 6줄 — 지역·규격 선택 필요 (MT006697, MT007164, MT007165 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000081", "원문번호": "결속선", "이름": "결속선", "규격": "", "단위": "m", "요구절": ["건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)"], "연결": null, "고르기": {"구분": "철근·강재", "상세구분": "철선", "대표": "MT000194"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT007332)" },
{ "키": "MP000082", "원문번호": "에폭시", "이름": "에폭시", "규격": "", "단위": "kg", "요구절": ["건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)"], "연결": null, "고르기": null, "비고": "포켓식만 · 자재품목 후보 4줄 — 지역·규격 선택 필요 (MT007705, MT007706, MT007931 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000082", "원문번호": "에폭시", "이름": "에폭시", "규격": "", "단위": "kg", "요구절": ["건설품셈 토목 1-9-4 낙석방지망 재료(참고자료)"], "연결": "MT007705", "고르기": null, "비고": "PLAN 7-4b: 후보 4줄(주입용 습식·건식·씰링용) 가운데 낙석방지망 앵커 주입에 흔한 주입용 습식으로 이음(사용자 확정 — 값 없어도 넘어감)" },
{ "키": "MP000083", "원문번호": "에폭시 신구콘크리트 접착제", "이름": "Epoxy 신구-콘크리트 접착제", "규격": "", "단위": "kg", "요구절": ["건설품셈 공통 6-1-5"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "접착·혼화"}, "비고": "자재품목에 같은 품명 없음" },
{ "키": "MP000084", "원문번호": "에폭시 콘크리트고무 접착제", "이름": "Epoxy-콘크리트 고무 접착제", "규격": "", "단위": "kg", "요구절": ["건설품셈 공통 6-1-5"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "접착·혼화"}, "비고": "자재품목에 같은 품명 없음" },
{ "키": "MP000085", "원문번호": "폼타이 9.5㎜", "이름": "폼타이(Form Tie)", "규격": "9.5㎜", "단위": "본", "요구절": ["건설품셈 공통 6-3-1 주④"], "연결": null, "고르기": null, "비고": "폼타이 값은 「조」 — 본 환산 안 함 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
@@ -102,14 +102,14 @@
{ "키": "MP000091", "원문번호": "합성수지 원형맨홀거푸집 ø1200", "이름": "합성수지(P.E) 원형 맨홀 거푸집", "규격": "ø1200", "단위": "조", "요구절": ["건설품셈 공통 6-3-5 주④"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000092", "원문번호": "합성수지 원형맨홀거푸집 ø1500", "이름": "합성수지(P.E) 원형 맨홀 거푸집", "규격": "ø1500", "단위": "조", "요구절": ["건설품셈 공통 6-3-5 주④"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000093", "원문번호": "합성수지 원형맨홀거푸집 ø1800", "이름": "합성수지(P.E) 원형 맨홀 거푸집", "규격": "ø1800", "단위": "조", "요구절": ["건설품셈 공통 6-3-5 주④"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000094", "원문번호": "쉬즈관", "이름": "쉬즈관", "규격": "", "단위": "m", "요구절": ["건설품셈 공통 6-4-1 주④", "건설품셈 공통 6-4-2 주④"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000095", "원문번호": "조립식 가설건축물 BASECHANNEL", "이름": "BASECHANNEL", "규격": "두께 2.0㎜ 이상", "단위": "m", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000096", "원문번호": "조립식 가설건축물 TOPCHANNEL", "이름": "TOPCHANNEL", "규격": "두께 2.0㎜ 이상", "단위": "m", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000094", "원문번호": "쉬즈관", "이름": "쉬즈관", "규격": "", "단위": "m", "요구절": ["건설품셈 공통 6-4-1 주④", "건설품셈 공통 6-4-2 주④"], "연결": "MT030713", "고르기": null, "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목 새 줄(MT030713)로 이음 · 값 미확보" },
{ "키": "MP000095", "원문번호": "조립식 가설건축물 BASECHANNEL", "이름": "BASECHANNEL", "규격": "두께 2.0㎜ 이상", "단위": "m", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": "MT030612", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030612)로 이음 · 값 미확보" },
{ "키": "MP000096", "원문번호": "조립식 가설건축물 TOPCHANNEL", "이름": "TOPCHANNEL", "규격": "두께 2.0㎜ 이상", "단위": "m", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": "MT030613", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030613)로 이음 · 값 미확보" },
{ "키": "MP000097", "원문번호": "조립식 가설건축물 외부PANEL(벽)", "이름": "외부PANEL(벽)", "규격": "1,200×2,400㎜", "단위": "매", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000098", "원문번호": "조립식 가설건축물 외부PANEL (창문)", "이름": "외부PANEL (창문)", "규격": "1,200×2,400㎜", "단위": "매", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000099", "원문번호": "조립식 가설건축물 외부PANEL (철재문)", "이름": "외부PANEL (철재문)", "규격": "1,200×2,400㎜", "단위": "매", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000100", "원문번호": "조립식 가설건축물 내부PANEL(벽)", "이름": "내부PANEL(벽)", "규격": "1,200×2,400㎜", "단위": "매", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000101", "원문번호": "조립식 가설건축물 내부PANEL (목재문)", "이름": "내부PANEL (목재문)", "규격": "1,200×2,400㎜", "단위": "매", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000101", "원문번호": "조립식 가설건축물 내부PANEL (목재문)", "이름": "내부PANEL (목재문)", "규격": "1,200×2,400㎜", "단위": "매", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": "MT030614", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030614)로 이음 · 값 미확보" },
{ "키": "MP000102", "원문번호": "조립식 가설건축물 PANEL JOINT(AL-BAR)", "이름": "PANEL JOINT(AL-BAR)", "규격": "L=2,400㎜", "단위": "조", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000103", "원문번호": "조립식 가설건축물 CANOPY(출입구채양)", "이름": "CANOPY(출입구채양)", "규격": "600×1,200㎜", "단위": "매", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000104", "원문번호": "조립식 가설건축물 박공PANEL", "이름": "박공PANEL", "규격": "", "단위": "매", "요구절": ["건설품셈 공통 2-2-3 주자재"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
@@ -121,7 +121,7 @@
{ "키": "MP000110", "원문번호": "콘테이너형 가설건축물 3.0x3.0m", "이름": "콘테이너형 가설건축물", "규격": "3.0x3.0m", "단위": "개", "요구절": ["건설품셈 공통 2-2-3", "건설품셈 공통 2-3-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000111", "원문번호": "콘테이너형 가설건축물 3.0x6.0m", "이름": "콘테이너형 가설건축물", "규격": "3.0x6.0m", "단위": "개", "요구절": ["건설품셈 공통 2-2-3", "건설품셈 공통 2-3-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000112", "원문번호": "콘테이너형 가설건축물 3.0x9.0m", "이름": "콘테이너형 가설건축물", "규격": "3.0x9.0m", "단위": "개", "요구절": ["건설품셈 공통 2-2-3", "건설품셈 공통 2-3-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000113", "원문번호": "축중계", "이름": "축중계(이동식)", "규격": "", "단위": "대", "요구절": ["건설품셈 공통 2-2-6"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000113", "원문번호": "축중계", "이름": "축중계(이동식)", "규격": "", "단위": "대", "요구절": ["건설품셈 공통 2-2-6"], "연결": "MT030615", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030615)로 이음 · 값 미확보" },
{ "키": "MP000114", "원문번호": "조립말비계 가새", "이름": "조립말비계 가새", "규격": "L1518-2개", "단위": "조", "요구절": ["건설품셈 공통 2-7-6 재료량"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000115", "원문번호": "조립말비계 수평띠장", "이름": "조립말비계 수평띠장", "규격": "L1829", "단위": "개", "요구절": ["건설품셈 공통 2-7-6 재료량"], "연결": null, "고르기": {"구분": "거푸집·가설재", "상세구분": "동바리·비계"} },
{ "키": "MP000116", "원문번호": "조립말비계 손잡이기둥", "이름": "조립말비계 손잡이기둥", "규격": "", "단위": "개", "요구절": ["건설품셈 공통 2-7-6 재료량"], "연결": null, "고르기": {"구분": "거푸집·가설재", "상세구분": "동바리·비계"} },
@@ -137,28 +137,28 @@
{ "키": "MP000126", "원문번호": "플라잉넷 사다리", "이름": "사다리(플라잉넷)", "규격": "폭 30㎝×길이 3m 기준", "단위": "m", "요구절": ["건설품셈 공통 2-8-2 재료량"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000127", "원문번호": "철골 안전망 보강재", "이름": "보강재(철골 안전망)", "규격": "", "단위": "m", "요구절": ["건설품셈 공통 2-8-7 재료량"], "연결": null, "고르기": {"구분": "안전시설", "상세구분": "낙석방지·휀스"} },
{ "키": "MP000128", "원문번호": "보호망", "이름": "보호망", "규격": "", "단위": "㎡", "요구절": ["건설품셈 공통 2-8-8 재료량", "건설품셈 공통 2-8-9 재료량"], "연결": null, "고르기": {"구분": "매트·토목섬유", "상세구분": "부직포·토목섬유"} },
{ "키": "MP000129", "원문번호": "보호막", "이름": "보호막", "규격": "", "단위": "㎡", "요구절": ["건설품셈 공통 2-10-1 재료량"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000129", "원문번호": "보호막", "이름": "보호막", "규격": "", "단위": "㎡", "요구절": ["건설품셈 공통 2-10-1 재료량"], "연결": "MT030616", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030616)로 이음 · 값 미확보" },
{ "키": "MP000130", "원문번호": "방진망", "이름": "방진망", "규격": "", "단위": "㎡", "요구절": ["건설품셈 공통 2-10-2 재료량"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000131", "원문번호": "풀", "이름": "풀(보양지)", "규격": "", "단위": "kg", "요구절": ["건설품셈 공통 2-11-1 재료량", "건설품셈 건축 5-3-7"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT008075"} },
{ "키": "MP000132", "원문번호": "토목섬유 매트", "이름": "매트(합성수지 토목섬유)", "규격": "", "단위": "㎡", "요구절": ["건설품셈 공통 5-2-1 매트고정 재료량"], "연결": null, "고르기": {"구분": "매트·토목섬유", "상세구분": "부직포·토목섬유"}, "비고": "매트 종류 갈림 — 원문은 재질만" },
{ "키": "MP000133", "원문번호": "PP로프 9㎜", "이름": "P.P로프", "규격": "9㎜", "단위": "m", "요구절": ["건설품셈 공통 5-2-1 매트고정 재료량"], "연결": null, "고르기": {"구분": "볼트·앵커·철물", "상세구분": "와이어로프·클램프", "규격": "9mm"}, "비고": "자재품목 후보 6줄 — 지역·규격 선택 필요 (MT007584, MT007585, MT007586 외)" },
{ "키": "MP000134", "원문번호": "모래주머니", "이름": "모래주머니", "규격": "", "단위": "개", "요구절": ["건설품셈 공통 5-2-1 매트고정 재료량"], "연결": null, "고르기": null, "비고": "자재품목에 같은 품명 없음 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000134", "원문번호": "모래주머니", "이름": "모래주머니", "규격": "", "단위": "개", "요구절": ["건설품셈 공통 5-2-1 매트고정 재료량"], "연결": "MT030617", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030617)로 이음 · 값 미확보" },
{ "키": "MP000135", "원문번호": "철근 19㎜", "이름": "철근", "규격": "19㎜", "단위": "m", "요구절": ["건설품셈 공통 5-2-1 매트고정 재료량"], "연결": null, "고르기": null, "비고": "철근 값은 Ton — m 환산 안 함 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000136", "원문번호": "드레인 보드", "이름": "드레인 보드(연직배수재)", "규격": "", "단위": "m", "요구절": ["건설품셈 공통 5-2-3 주②"], "연결": null, "고르기": {"구분": "매트·토목섬유", "상세구분": "부직포·토목섬유", "대표": "MT006388"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT006388)" },
{ "키": "MP000137", "원문번호": "지오콤포지트", "이름": "지오콤포지트", "규격": "6.0㎜", "단위": "㎡", "요구절": ["건설품셈 공통 5-4-1 재료량"], "연결": null, "고르기": {"구분": "매트·토목섬유", "상세구분": "부직포·토목섬유"} },
{ "키": "MP000138", "원문번호": "벤토나이트매트", "이름": "벤토나이트매트", "규격": "6.0㎜", "단위": "㎡", "요구절": ["건설품셈 공통 5-4-1 재료량"], "연결": null, "고르기": null, "비고": "S·LS·K 갈림 · 값은 6.5㎜ · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000139", "원문번호": "HDPE 시트", "이름": "HDPE 시트", "규격": "2∼2.5㎜", "단위": "㎡", "요구절": ["건설품셈 공통 5-4-1 재료량"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000139", "원문번호": "HDPE 시트", "이름": "HDPE 시트", "규격": "2∼2.5㎜", "단위": "㎡", "요구절": ["건설품셈 공통 5-4-1 재료량"], "연결": "MT030618", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030618)로 이음 · 값 미확보" },
{ "키": "MP000140", "원문번호": "아세틸렌(ℓ)", "이름": "아세틸렌", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 공통 6-2-5"], "연결": "MT003164", "고르기": null, "비고": "연결: 아세틸렌 ℓ 줄 하나" },
{ "키": "MP000141", "원문번호": "노면파쇄기 팁(날)", "이름": "팁(날)", "규격": "노면파쇄기 절삭용", "단위": "개", "요구절": ["건설품셈 유지관리 2-1-3 주④", "건설품셈 유지관리 2-1-4 주④", "건설품셈 유지관리 2-1-5 주②"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스", "대표": "MT007928"} },
{ "키": "MP000142", "원문번호": "프로판가스", "이름": "프로판가스", "규격": "", "단위": "kg", "요구절": ["건설품셈 유지관리 2-1-15 4 자재수량"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT003175)" },
{ "키": "MP000143", "원문번호": "서비스볼트", "이름": "서비스볼트", "규격": "", "단위": "본", "요구절": ["건설품셈 건축 1-1-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000144", "원문번호": "보조강재", "이름": "보조강재", "규격": "", "단위": "㎏", "요구절": ["건설품셈 건축 1-1-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000144", "원문번호": "보조강재", "이름": "보조강재", "규격": "", "단위": "㎏", "요구절": ["건설품셈 건축 1-1-2"], "연결": "MT030619", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030619)로 이음 · 값 미확보" },
{ "키": "MP000145", "원문번호": "CO_2 와이어", "이름": "CO_2 와이어", "규격": "", "단위": "㎏", "요구절": ["건설품셈 건축 1-1-4", "건설품셈 건축 1-2-5"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스"} },
{ "키": "MP000146", "원문번호": "탄산가스", "이름": "탄산가스", "규격": "", "단위": "㎏", "요구절": ["건설품셈 건축 1-1-4", "건설품셈 건축 1-2-5"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스"}, "비고": "자재품목 후보 2줄 — 지역·규격 선택 필요 (MT003173, MT003174)" },
{ "키": "MP000147", "원문번호": "잠호용접와이어", "이름": "잠호용접와이어", "규격": "", "단위": "㎏", "요구절": ["건설품셈 건축 1-1-4"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스"} },
{ "키": "MP000148", "원문번호": "FLUX", "이름": "FLUX", "규격": "", "단위": "㎏", "요구절": ["건설품셈 건축 1-1-4"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000148", "원문번호": "FLUX", "이름": "FLUX", "규격": "", "단위": "㎏", "요구절": ["건설품셈 건축 1-1-4"], "연결": "MT030620", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030620)로 이음 · 값 미확보" },
{ "키": "MP000149", "원문번호": "보통볼트 가조임", "이름": "보통볼트", "규격": "가조임", "단위": "본", "요구절": ["건설품셈 건축 1-2-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000150", "원문번호": "질석", "이름": "질석", "규격": "", "단위": "㎏", "요구절": ["건설품셈 건축 1-4-3"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000150", "원문번호": "질석", "이름": "질석", "규격": "", "단위": "㎏", "요구절": ["건설품셈 건축 1-4-3"], "연결": "MT030621", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030621)로 이음 · 값 미확보" },
{ "키": "MP000151", "원문번호": "시멘트벽돌 19×9×5.7㎝", "이름": "시멘트벽돌", "규격": "19×9×5.7㎝", "단위": "매", "요구절": ["건설품셈 건축 2-1-1"], "연결": null, "고르기": {"구분": "콘크리트제품", "상세구분": "경계석·블록", "대표": "MT005769"}, "비고": "자재품목 후보 17줄 — 지역·규격 선택 필요 (MT005760, MT005761, MT005762 외)" },
{ "키": "MP000152", "원문번호": "모르타르 1:3", "이름": "모르타르", "규격": "1:3", "단위": "㎥", "요구절": ["건설품셈 건축 2-1-1", "건설품셈 건축 2-1-2", "건설품셈 건축 2-2-1", "건설품셈 건축 2-2-2", "건설품셈 건축 3-2-1"], "연결": null, "고르기": {"구분": "시멘트·골재", "상세구분": "모르타르", "규격": "1:3"}, "비고": "자재품목 후보 11줄 — 지역·규격 선택 필요 (MT000287, MT000292, MT000297 외)" },
{ "키": "MP000153", "원문번호": "치장벽돌 19×9×5.7㎝", "이름": "치장벽돌", "규격": "19×9×5.7㎝", "단위": "매", "요구절": ["건설품셈 건축 2-1-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
@@ -177,15 +177,15 @@
{ "키": "MP000166", "원문번호": "중밀도섬유판 걸레받이", "이름": "중밀도섬유판 걸레받이", "규격": "", "단위": "m", "요구절": ["건설품셈 건축 5-3-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000167", "원문번호": "접착제 걸레받이용", "이름": "접착제", "규격": "걸레받이용", "단위": "㎏", "요구절": ["건설품셈 건축 5-3-5"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "접착·혼화"}, "비고": "자재품목 후보 15줄 — 지역·규격 선택 필요 (MT003315, MT003320, MT003363 외)" },
{ "키": "MP000168", "원문번호": "초배지", "이름": "초배지", "규격": "", "단위": "㎡", "요구절": ["건설품셈 건축 5-3-7"], "연결": null, "고르기": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "대표": "MT008074"}, "비고": null },
{ "키": "MP000169", "원문번호": "정배지", "이름": "정배지", "규격": "", "단위": "㎡", "요구절": ["건설품셈 건축 5-3-7"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000169", "원문번호": "정배지", "이름": "정배지", "규격": "", "단위": "㎡", "요구절": ["건설품셈 건축 5-3-7"], "연결": "MT030622", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030622)로 이음 · 값 미확보" },
{ "키": "MP000170", "원문번호": "단열재", "이름": "단열재", "규격": "", "단위": "㎡", "요구절": ["건설품셈 건축 5-4-1", "건설품셈 건축 5-4-2", "건설품셈 건축 5-4-3", "건설품셈 건축 5-4-4", "건설품셈 건축 5-4-6", "건설품셈 건축 5-4-7"], "연결": null, "고르기": {"구분": "단열·보온", "상세구분": "단열재"}, "비고": "자재품목 후보 66줄 — 지역·규격 선택 필요 (MT007760, MT007761, MT007762 외)" },
{ "키": "MP000171", "원문번호": "접착제 단열재용", "이름": "접착제", "규격": "단열재용", "단위": "㎏", "요구절": ["건설품셈 건축 5-4-1", "건설품셈 건축 5-4-2", "건설품셈 건축 5-4-4", "건설품셈 건축 5-4-7"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "접착·혼화"}, "비고": "자재품목 후보 15줄 — 지역·규격 선택 필요 (MT003315, MT003320, MT003363 외)" },
{ "키": "MP000172", "원문번호": "알루미늄핀", "이름": "알루미늄핀", "규격": "", "단위": "개", "요구절": ["건설품셈 건축 5-4-4"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000172", "원문번호": "알루미늄핀", "이름": "알루미늄핀", "규격": "", "단위": "개", "요구절": ["건설품셈 건축 5-4-4"], "연결": "MT030623", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030623)로 이음 · 값 미확보" },
{ "키": "MP000173", "원문번호": "방습필름 폭 0.9m", "이름": "방습필름", "규격": "폭 0.9m", "단위": "㎡", "요구절": ["건설품셈 건축 5-4-8"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000174", "원문번호": "단열판", "이름": "단열판", "규격": "", "단위": "㎡", "요구절": ["건설품셈 건축 5-4-9"], "연결": null, "고르기": {"구분": "단열·보온", "상세구분": "단열재"} },
{ "키": "MP000175", "원문번호": "접착제 외벽단열용", "이름": "접착제", "규격": "외벽단열용", "단위": "㎏", "요구절": ["건설품셈 건축 5-4-9"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "접착·혼화"}, "비고": "자재품목 후보 15줄 — 지역·규격 선택 필요 (MT003315, MT003320, MT003363 외)" },
{ "키": "MP000176", "원문번호": "표준보강메시", "이름": "표준보강메시", "규격": "", "단위": "㎡", "요구절": ["건설품셈 건축 5-4-9"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000177", "원문번호": "고강도메시", "이름": "고강도메시", "규격": "", "단위": "㎡", "요구절": ["건설품셈 건축 5-4-9"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000176", "원문번호": "표준보강메시", "이름": "표준보강메시", "규격": "", "단위": "㎡", "요구절": ["건설품셈 건축 5-4-9"], "연결": "MT030624", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030624)로 이음 · 값 미확보" },
{ "키": "MP000177", "원문번호": "고강도메시", "이름": "고강도메시", "규격": "", "단위": "㎡", "요구절": ["건설품셈 건축 5-4-9"], "연결": "MT030625", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030625)로 이음 · 값 미확보" },
{ "키": "MP000178", "원문번호": "방수시트", "이름": "방수시트", "규격": "", "단위": "㎡", "요구절": ["건설품셈 건축 6-3-1", "건설품셈 건축 6-3-2", "건설품셈 건축 6-3-3"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "방수·실링"}, "비고": "자재품목 후보 2줄 — 지역·규격 선택 필요 (MT006814, MT006815)" },
{ "키": "MP000179", "원문번호": "벤토나이트방수재 매트", "이름": "벤토나이트방수재", "규격": "매트 1219×4570×6.4㎜", "단위": "㎡", "요구절": ["건설품셈 건축 6-5-3"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "방수·실링"} },
{ "키": "MP000180", "원문번호": "벤토나이트방수재 시트", "이름": "벤토나이트방수재", "규격": "시트 1220×6700×4.5㎜", "단위": "㎡", "요구절": ["건설품셈 건축 6-5-3"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "방수·실링"} },
@@ -209,29 +209,29 @@
{ "키": "MP000198", "원문번호": "앵커 1/2〃", "이름": "앵커", "규격": "1/2〃", "단위": "개", "요구절": ["건설품셈 기계설비 2-2-6"], "연결": null, "고르기": {"구분": "볼트·앵커·철물", "상세구분": "앵커"}, "비고": "자재품목 후보 2줄 — 지역·규격 선택 필요 (MT002657, MT002688)" },
{ "키": "MP000199", "원문번호": "블라인드리벳", "이름": "블라인드리벳", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 2-2-6"], "연결": null, "고르기": {"구분": "볼트·앵커·철물", "상세구분": "볼트·너트"} },
{ "키": "MP000200", "원문번호": "철물 D22 철근", "이름": "철물", "규격": "D22 철근", "단위": "㎏", "요구절": ["건설품셈 기계설비 2-2-6"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000201", "원문번호": "실리콘(㎏)", "이름": "실리콘", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 2-2-6"], "연결": null, "고르기": null, "비고": "자재품목 실리콘실란트는 ℓ — ㎏ 환산 안 함 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000202", "원문번호": "IV전선 2.0㎜", "이름": "IV전선", "규격": "2.0㎜", "단위": "m", "요구절": ["건설품셈 토목 6-7-5 강관압입추진공 조명시설"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000203", "원문번호": "백열등 100W", "이름": "백열등", "규격": "100W", "단위": "EA", "요구절": ["건설품셈 토목 6-7-5 강관압입추진공 조명시설"], "연결": null, "고르기": {"구분": "전기·통신", "상세구분": "부속·기타", "규격": "100W"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT008751)" },
{ "키": "MP000201", "원문번호": "실리콘(㎏)", "이름": "실리콘", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 2-2-6"], "연결": "MT030626", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030626)로 이음 · 값 미확보" },
{ "키": "MP000202", "원문번호": "IV전선 2.0㎜", "이름": "IV전선", "규격": "2.0㎜", "단위": "m", "요구절": ["건설품셈 토목 6-7-5 강관압입추진공 조명시설"], "연결": "MT030714", "고르기": null, "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목은 ㎟ 단면(지름 아님)이라 짝 없어 새 줄(MT030714)로 이음 · 값 미확보" },
{ "키": "MP000203", "원문번호": "백열등 100W", "이름": "백열등", "규격": "100W", "단위": "EA", "요구절": ["건설품셈 토목 6-7-5 강관압입추진공 조명시설"], "연결": "MT008751", "고르기": null, "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 후보 1줄뿐이라 그대로 이음(MT008751)" },
{ "키": "MP000204", "원문번호": "일체식 방수시트", "이름": "일체식 방수시트", "규격": "부직포 부착 터널 방수시트", "단위": "㎡", "요구절": ["건설품셈 토목 3-4-1 터널 방수 재료량"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "방수·실링"} },
{ "키": "MP000205", "원문번호": "바퀴숫돌 단면용", "이름": "바퀴숫돌", "규격": "단면용 A36m B11호 A150×8×22 KSL 6501", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000206", "원문번호": "바퀴숫돌 측면용", "이름": "바퀴숫돌", "규격": "측면용 A24 QWV1호 A205×25×25 KSL 6501", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000207", "원문번호": "바퀴숫돌 평면용", "이름": "바퀴숫돌", "규격": "평면용 A24 QWV1호 A205×25×25 KSL 6501", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000208", "원문번호": "바퀴숫돌 최종용", "이름": "바퀴숫돌", "규격": "최종용 A24 QWV 5호 A205×22×22", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000209", "원문번호": "압접가열용 버너", "이름": "버너", "규격": "압접가열용", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": null, "고르기": null, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT009352) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000210", "원문번호": "압접버너용 노즐", "이름": "노즐", "규격": "압접버너용", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000211", "원문번호": "테르밋용재", "이름": "테르밋용재", "규격": "점화용", "단위": "포", "요구절": ["건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000212", "원문번호": "테르밋 몰드", "이름": "몰드", "규격": "테르밋 용접용", "단위": "개", "요구절": ["건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000213", "원문번호": "테르밋 골무", "이름": "골무", "규격": "테르밋 용접용", "단위": "개", "요구절": ["건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000214", "원문번호": "테르밋 퓨즈", "이름": "퓨즈", "규격": "테르밋 용접용", "단위": "개", "요구절": ["건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)"], "연결": null, "고르기": null, "비고": "자재품목 후보 5줄 — 지역·규격 선택 필요 (MT009288, MT009289, MT009290 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000215", "원문번호": "강교 용접봉", "이름": "용접봉", "규격": "강교 제작용", "단위": "㎏", "요구절": ["건설품셈 토목 5-1-3 기타재료 소요량"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스"}, "비고": "자재품목 후보 12줄 — 지역·규격 선택 필요 (MT003186, MT003187, MT003188 외)" },
{ "키": "MP000216", "원문번호": "철구(Shot ball)", "이름": "철구(Shot ball)", "규격": "", "단위": "㎏", "요구절": ["건설품셈 토목 5-2-1 소재 표면처리", "건설품셈 기계설비 9-2-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000205", "원문번호": "바퀴숫돌 단면용", "이름": "바퀴숫돌", "규격": "단면용 A36m B11호 A150×8×22 KSL 6501", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": "MT030715", "고르기": null, "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목 새 줄(MT030715)로 이음 · 값 미확보" },
{ "키": "MP000206", "원문번호": "바퀴숫돌 측면용", "이름": "바퀴숫돌", "규격": "측면용 A24 QWV1호 A205×25×25 KSL 6501", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": "MT030716", "고르기": null, "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목 새 줄(MT030716)로 이음 · 값 미확보" },
{ "키": "MP000207", "원문번호": "바퀴숫돌 평면용", "이름": "바퀴숫돌", "규격": "평면용 A24 QWV1호 A205×25×25 KSL 6501", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": "MT030717", "고르기": null, "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목 새 줄(MT030717)로 이음 · 값 미확보" },
{ "키": "MP000208", "원문번호": "바퀴숫돌 최종용", "이름": "바퀴숫돌", "규격": "최종용 A24 QWV 5호 A205×22×22", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": "MT030718", "고르기": null, "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목 새 줄(MT030718)로 이음 · 값 미확보" },
{ "키": "MP000209", "원문번호": "압접가열용 버너", "이름": "버너", "규격": "압접가열용", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": "MT030710", "고르기": null, "비고": "PLAN 7-4b: 후보 1줄(개장로용 가스버너, 915만원)은 산업용 화덕이라 다른 물건 — 새 줄(MT030710)로 이음 · 값 미확보" },
{ "키": "MP000210", "원문번호": "압접버너용 노즐", "이름": "노즐", "규격": "압접버너용", "단위": "개", "요구절": ["건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)"], "연결": "MT030627", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030627)로 이음 · 값 미확보" },
{ "키": "MP000211", "원문번호": "테르밋용재", "이름": "테르밋용재", "규격": "점화용", "단위": "포", "요구절": ["건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)"], "연결": "MT030628", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030628)로 이음 · 값 미확보" },
{ "키": "MP000212", "원문번호": "테르밋 몰드", "이름": "몰드", "규격": "테르밋 용접용", "단위": "개", "요구절": ["건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)"], "연결": "MT030629", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030629)로 이음 · 값 미확보" },
{ "키": "MP000213", "원문번호": "테르밋 골무", "이름": "골무", "규격": "테르밋 용접용", "단위": "개", "요구절": ["건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)"], "연결": "MT030630", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030630)로 이음 · 값 미확보" },
{ "키": "MP000214", "원문번호": "테르밋 퓨즈", "이름": "퓨즈", "규격": "테르밋 용접용", "단위": "개", "요구절": ["건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)"], "연결": "MT030711", "고르기": null, "비고": "PLAN 7-4b: 후보 다섯(전선퓨즈·통형퓨즈·고리퓨즈)이 모두 전기용이라 다른 물건 — 새 줄(MT030711)로 이음 · 값 미확보" },
{ "키": "MP000215", "원문번호": "강교 용접봉", "이름": "용접봉", "규격": "강교 제작용", "단위": "㎏", "요구절": ["건설품셈 토목 5-1-3 기타재료 소요량"], "연결": "MT003191", "고르기": null, "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 후보 12줄(용접봉 전기·산소·스테인레스 등) 가운데 일반용 전기 용접봉 KS E4311(MT003191)로 이음" },
{ "키": "MP000216", "원문번호": "철구(Shot ball)", "이름": "철구(Shot ball)", "규격": "", "단위": "㎏", "요구절": ["건설품셈 토목 5-2-1 소재 표면처리", "건설품셈 기계설비 9-2-1"], "연결": "MT030631", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030631)로 이음 · 값 미확보" },
{ "키": "MP000217", "원문번호": "무기질아연말샵프라이머", "이름": "무기질아연말 샵프라이머", "규격": "도막두께 20μm", "단위": "ℓ", "요구절": ["건설품셈 토목 5-2-1 소재 표면처리"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000218", "원문번호": "철편(Grit)", "이름": "철편(Grit)", "규격": "", "단위": "㎏", "요구절": ["건설품셈 토목 5-2-2 제품 표면처리"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000218", "원문번호": "철편(Grit)", "이름": "철편(Grit)", "규격": "", "단위": "㎏", "요구절": ["건설품셈 토목 5-2-2 제품 표면처리"], "연결": "MT030632", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030632)로 이음 · 값 미확보" },
{ "키": "MP000219", "원문번호": "규사 함유량80%", "이름": "규사", "규격": "규사함유량 80%", "단위": "㎥", "요구절": ["건설품셈 기계설비 9-2-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000220", "원문번호": "동력 Brush", "이름": "동력 Brush", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 9-2-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000221", "원문번호": "Wire Brush", "이름": "Wire Brush", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 9-2-1", "건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000220", "원문번호": "동력 Brush", "이름": "동력 Brush", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 9-2-1"], "연결": "MT030633", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030633)로 이음 · 값 미확보" },
{ "키": "MP000221", "원문번호": "Wire Brush", "이름": "Wire Brush", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 9-2-1", "건설품셈 기계설비 13-11-5"], "연결": "MT030634", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030634)로 이음 · 값 미확보" },
{ "키": "MP000222", "원문번호": "스레트실테이프 13㎜", "이름": "스레트실테이프", "규격": "13㎜", "단위": "㎝", "요구절": ["건설품셈 기계설비 11-1-3", "건설품셈 기계설비 11-3-3"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000223", "원문번호": "컴파운드", "이름": "컴파운드", "규격": "", "단위": "g", "요구절": ["건설품셈 기계설비 11-1-3", "건설품셈 기계설비 11-3-3"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000223", "원문번호": "컴파운드", "이름": "컴파운드", "규격": "", "단위": "g", "요구절": ["건설품셈 기계설비 11-1-3", "건설품셈 기계설비 11-3-3"], "연결": "MT030635", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030635)로 이음 · 값 미확보" },
{ "키": "MP000224", "원문번호": "싱글코아바렐 보링용", "이름": "싱글코아바렐", "규격": "보링용", "단위": "개", "요구절": ["건설품셈 토목 8-1-2"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"}, "비고": "자재품목 후보 2줄 — 지역·규격 선택 필요 (MT007894, MT007906)" },
{ "키": "MP000225", "원문번호": "메탈크라운비트 보링용", "이름": "메탈크라운비트", "규격": "보링용", "단위": "개", "요구절": ["건설품셈 토목 8-1-2", "건설품셈 토목 8-1-3"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"}, "비고": "자재품목 후보 3줄 — 지역·규격 선택 필요 (MT007897, MT007910, MT007923)" },
{ "키": "MP000226", "원문번호": "쵸핑비트 보링용", "이름": "쵸핑비트", "규격": "보링용", "단위": "개", "요구절": ["건설품셈 토목 8-1-2"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"}, "비고": "자재품목 후보 2줄 — 지역·규격 선택 필요 (MT007898, MT007909)" },
@@ -243,14 +243,14 @@
{ "키": "MP000232", "원문번호": "메탈리밍쉘 보링용", "이름": "메탈리밍쉘", "규격": "보링용", "단위": "개", "요구절": ["건설품셈 토목 8-1-3"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT007902)" },
{ "키": "MP000233", "원문번호": "다이아몬드리밍쉘 보링용", "이름": "다이아몬드리밍쉘", "규격": "보링용", "단위": "개", "요구절": ["건설품셈 토목 8-1-3"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"}, "비고": "자재품목 후보 2줄 — 지역·규격 선택 필요 (MT007905, MT007918)" },
{ "키": "MP000234", "원문번호": "코아리프터 보링용", "이름": "코아리프터", "규격": "보링용", "단위": "개", "요구절": ["건설품셈 토목 8-1-3"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"} },
{ "키": "MP000235", "원문번호": "슈 표준관입시험용", "이름": "슈", "규격": "표준관입시험용", "단위": "개", "요구절": ["건설품셈 토목 8-2-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000235", "원문번호": "슈 표준관입시험용", "이름": "슈", "규격": "표준관입시험용", "단위": "개", "요구절": ["건설품셈 토목 8-2-1"], "연결": "MT030636", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030636)로 이음 · 값 미확보" },
{ "키": "MP000236", "원문번호": "샘플러 표준관입시험용", "이름": "샘플러", "규격": "표준관입시험용", "단위": "개", "요구절": ["건설품셈 토목 8-2-1"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"} },
{ "키": "MP000237", "원문번호": "신월튜브 자연시료 채취용", "이름": "신월튜브", "규격": "자연시료 채취용", "단위": "개", "요구절": ["건설품셈 토목 8-2-3"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"} },
{ "키": "MP000238", "원문번호": "베인 블레이드 대형 75×150×3㎜", "이름": "베인 블레이드", "규격": "대형 75×150×3㎜", "단위": "개", "요구절": ["건설품셈 토목 8-2-2"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"} },
{ "키": "MP000239", "원문번호": "베인 전용로드 ø16×750", "이름": "베인 전용로드", "규격": "ø16×750", "단위": "본", "요구절": ["건설품셈 토목 8-2-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000240", "원문번호": "로드 ø40.5×1m", "이름": "로드", "규격": "ø40.5×1m", "단위": "본", "요구절": ["건설품셈 토목 8-2-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000241", "원문번호": "표준사 평판재하시험용", "이름": "표준사", "규격": "평판재하시험용", "단위": "㎏", "요구절": ["건설품셈 토목 8-2-4"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000242", "원문번호": "단독콘 정재하시험용", "이름": "단독콘", "규격": "정재하시험용", "단위": "개", "요구절": ["건설품셈 토목 8-2-6"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000239", "원문번호": "베인 전용로드 ø16×750", "이름": "베인 전용로드", "규격": "ø16×750", "단위": "본", "요구절": ["건설품셈 토목 8-2-2"], "연결": "MT030637", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030637)로 이음 · 값 미확보" },
{ "키": "MP000240", "원문번호": "로드 ø40.5×1m", "이름": "로드", "규격": "ø40.5×1m", "단위": "본", "요구절": ["건설품셈 토목 8-2-2"], "연결": "MT030638", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030638)로 이음 · 값 미확보" },
{ "키": "MP000241", "원문번호": "표준사 평판재하시험용", "이름": "표준사", "규격": "평판재하시험용", "단위": "㎏", "요구절": ["건설품셈 토목 8-2-4"], "연결": "MT030639", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030639)로 이음 · 값 미확보" },
{ "키": "MP000242", "원문번호": "단독콘 정재하시험용", "이름": "단독콘", "규격": "정재하시험용", "단위": "개", "요구절": ["건설품셈 토목 8-2-6"], "연결": "MT030640", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030640)로 이음 · 값 미확보" },
{ "키": "MP000243", "원문번호": "윙비트 대구경 보링용", "이름": "윙비트", "규격": "대구경 보링용", "단위": "개", "요구절": ["건설품셈 토목 8-4-1", "건설품셈 토목 8-4-2"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"}, "비고": "자재품목 후보 8줄 — 지역·규격 선택 필요 (MT005696, MT005697, MT005698 외)" },
{ "키": "MP000244", "원문번호": "벤토나이트 보링 이수용", "이름": "벤토나이트", "규격": "보링 이수용", "단위": "㎏", "요구절": ["건설품셈 토목 8-4-1", "건설품셈 토목 8-4-2"], "연결": null, "고르기": null, "비고": "자재품목 후보 3줄 — 지역·규격 선택 필요 (MT007622, MT007623, MT007624) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000245", "원문번호": "기포제 대구경 보링용", "이름": "기포제", "규격": "대구경 보링용", "단위": "ℓ", "요구절": ["건설품셈 토목 8-4-2"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "접착·혼화", "대표": "MT000097"}, "비고": "자재품목 후보 2줄 — 지역·규격 선택 필요 (MT000097, MT007754)" },
@@ -258,119 +258,119 @@
{ "키": "MP000247", "원문번호": "버튼비트 대구경 보링용", "이름": "버튼비트", "규격": "대구경 보링용", "단위": "개", "요구절": ["건설품셈 토목 8-4-2"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"}, "비고": "자재품목 후보 5줄 — 지역·규격 선택 필요 (MT005691, MT005692, MT005693 외)" },
{ "키": "MP000248", "원문번호": "보온 성형물", "이름": "보온 성형물", "규격": "", "단위": "m", "요구절": ["건설품셈 기계설비 13-3-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000249", "원문번호": "보온용 철선", "이름": "철선", "규격": "", "단위": "m", "요구절": ["건설품셈 기계설비 13-3-1"], "연결": null, "고르기": {"구분": "철근·강재", "상세구분": "철선", "대표": "MT000194"}, "비고": "굵기(#8~#20) 갈림 — 원문 규격 없음" },
{ "키": "MP000250", "원문번호": "Lagging Sheet", "이름": "Lagging Sheet", "규격": "", "단위": "㎡", "요구절": ["건설품셈 기계설비 13-3-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000250", "원문번호": "Lagging Sheet", "이름": "Lagging Sheet", "규격": "", "단위": "㎡", "요구절": ["건설품셈 기계설비 13-3-1"], "연결": "MT030641", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030641)로 이음 · 값 미확보" },
{ "키": "MP000251", "원문번호": "Sheet Metal Screw", "이름": "Sheet Metal Screw", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-3-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000252", "원문번호": "기계유", "이름": "기름", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-4-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000253", "원문번호": "코크스", "이름": "코크스", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2", "건설품셈 기계설비 13-6-4"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000254", "원문번호": "Sand Paper 각종", "이름": "Sand Paper", "규격": "각종", "단위": "Sh", "요구절": ["건설품셈 기계설비 13-6-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000255", "원문번호": "여과기 14\"×14〃", "이름": "여과기", "규격": "14\"×14〃", "단위": "Sh", "요구절": ["건설품셈 기계설비 13-6-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000253", "원문번호": "코크스", "이름": "코크스", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2", "건설품셈 기계설비 13-6-4"], "연결": "MT030642", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030642)로 이음 · 값 미확보" },
{ "키": "MP000254", "원문번호": "Sand Paper 각종", "이름": "Sand Paper", "규격": "각종", "단위": "Sh", "요구절": ["건설품셈 기계설비 13-6-1"], "연결": "MT030643", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030643)로 이음 · 값 미확보" },
{ "키": "MP000255", "원문번호": "여과기 14\"×14〃", "이름": "여과기", "규격": "14\"×14〃", "단위": "Sh", "요구절": ["건설품셈 기계설비 13-6-1"], "연결": "MT030644", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030644)로 이음 · 값 미확보" },
{ "키": "MP000256", "원문번호": "걸레 특상품", "이름": "걸레", "규격": "특상품", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000257", "원문번호": "세유 C-3", "이름": "세유", "규격": "C-3", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000258", "원문번호": "Grease", "이름": "Grease", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2", "건설품셈 기계설비 13-10-2", "건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000259", "원문번호": "Machine oil", "이름": "Machine oil", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2", "건설품셈 기계설비 13-10-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000260", "원문번호": "Gasoline", "이름": "Gasoline", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000261", "원문번호": "Galvanized wire #8∼#16", "이름": "Galvanized wire", "규격": "#8∼#16", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000262", "원문번호": "Grinding Wheel 8\"ø×25m/m t", "이름": "Grinding Wheel", "규격": "8\"ø×25m/m t", "단위": "EA", "요구절": ["건설품셈 기계설비 13-6-1"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000257", "원문번호": "세유 C-3", "이름": "세유", "규격": "C-3", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-1"], "연결": "MT030645", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030645)로 이음 · 값 미확보" },
{ "키": "MP000258", "원문번호": "Grease", "이름": "Grease", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2", "건설품셈 기계설비 13-10-2", "건설품셈 기계설비 13-11-5"], "연결": "MT030646", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030646)로 이음 · 값 미확보" },
{ "키": "MP000259", "원문번호": "Machine oil", "이름": "Machine oil", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2", "건설품셈 기계설비 13-10-2"], "연결": "MT030647", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030647)로 이음 · 값 미확보" },
{ "키": "MP000260", "원문번호": "Gasoline", "이름": "Gasoline", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2"], "연결": "MT030648", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030648)로 이음 · 값 미확보" },
{ "키": "MP000261", "원문번호": "Galvanized wire #8∼#16", "이름": "Galvanized wire", "규격": "#8∼#16", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2"], "연결": "MT030649", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030649)로 이음 · 값 미확보" },
{ "키": "MP000262", "원문번호": "Grinding Wheel 8\"ø×25m/m t", "이름": "Grinding Wheel", "규격": "8\"ø×25m/m t", "단위": "EA", "요구절": ["건설품셈 기계설비 13-6-1"], "연결": "MT030650", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030650)로 이음 · 값 미확보" },
{ "키": "MP000263", "원문번호": "비닐세트 0.1t×2m", "이름": "비닐세트", "규격": "0.1t×2m", "단위": "m", "요구절": ["건설품셈 기계설비 13-6-1"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "소모품"} },
{ "키": "MP000264", "원문번호": "소창직", "이름": "소창직", "규격": "", "단위": "m", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "소모품"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT010153)" },
{ "키": "MP000265", "원문번호": "보일유", "이름": "보일유", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000265", "원문번호": "보일유", "이름": "보일유", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-2"], "연결": "MT030651", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030651)로 이음 · 값 미확보" },
{ "키": "MP000266", "원문번호": "시너", "이름": "시너", "규격": "", "단위": "ℓ", "요구절": ["산림품셈 12-28", "건설품셈 공통 6-1-5", "건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-9", "건설품셈 기계설비 13-6-16", "건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000267", "원문번호": "광명단", "이름": "광명단", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-1", "건설품셈 기계설비 13-6-3", "건설품셈 기계설비 13-6-4", "건설품셈 기계설비 13-6-5", "건설품셈 기계설비 13-6-6", "건설품셈 기계설비 13-10-3"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "도료", "대표": "MT003376"} },
{ "키": "MP000268", "원문번호": "조합페인트", "이름": "조합페인트", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-1"], "연결": null, "고르기": null, "비고": "자재품목 후보 12줄 — 지역·규격 선택 필요 (MT003366, MT003367, MT003368 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000269", "원문번호": "세유 0∼3", "이름": "세유", "규격": "0∼3", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000269", "원문번호": "세유 0∼3", "이름": "세유", "규격": "0∼3", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030652", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030652)로 이음 · 값 미확보" },
{ "키": "MP000270", "원문번호": "시너 에나멜용", "이름": "시너", "규격": "에나멜용", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000271", "원문번호": "Wire brush 각종 3/8∼1.6\"", "이름": "Wire brush", "규격": "각종 3/8∼1.6\"", "단위": "EA", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000272", "원문번호": "Hack saw blade 12\"", "이름": "Hack saw blade", "규격": "12\"", "단위": "EA", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000273", "원문번호": "Drill 1.6ø∼3.8ø", "이름": "Drill", "규격": "1.6ø∼3.8ø", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000274", "원문번호": "Grinder wheel 8\"ø∼25m/m t", "이름": "Grinder wheel", "규격": "8\"ø∼25m/m t", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000275", "원문번호": "File 각종", "이름": "File", "규격": "각종", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000276", "원문번호": "Oil stone 각종(황 중 세)", "이름": "Oil stone", "규격": "각종(황, 중, 세)", "단위": "Sh", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000271", "원문번호": "Wire brush 각종 3/8∼1.6\"", "이름": "Wire brush", "규격": "각종 3/8∼1.6\"", "단위": "EA", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030653", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030653)로 이음 · 값 미확보" },
{ "키": "MP000272", "원문번호": "Hack saw blade 12\"", "이름": "Hack saw blade", "규격": "12\"", "단위": "EA", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030654", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030654)로 이음 · 값 미확보" },
{ "키": "MP000273", "원문번호": "Drill 1.6ø∼3.8ø", "이름": "Drill", "규격": "1.6ø∼3.8ø", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030655", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030655)로 이음 · 값 미확보" },
{ "키": "MP000274", "원문번호": "Grinder wheel 8\"ø∼25m/m t", "이름": "Grinder wheel", "규격": "8\"ø∼25m/m t", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030656", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030656)로 이음 · 값 미확보" },
{ "키": "MP000275", "원문번호": "File 각종", "이름": "File", "규격": "각종", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030657", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030657)로 이음 · 값 미확보" },
{ "키": "MP000276", "원문번호": "Oil stone 각종(황 중 세)", "이름": "Oil stone", "규격": "각종(황, 중, 세)", "단위": "Sh", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030658", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030658)로 이음 · 값 미확보" },
{ "키": "MP000277", "원문번호": "목탄 6000ℓ", "이름": "목탄", "규격": "6,000ℓ", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT006278"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT006278)" },
{ "키": "MP000278", "원문번호": "가스용접봉 2ø", "이름": "가스용접봉", "규격": "2ø", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스"} },
{ "키": "MP000279", "원문번호": "신주용접봉 각종", "이름": "신주용접봉", "규격": "각종", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스"} },
{ "키": "MP000280", "원문번호": "Sand Paper", "이름": "Sand Paper", "규격": "", "단위": "Sh", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000281", "원문번호": "광목", "이름": "광목", "규격": "", "단위": "m", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000280", "원문번호": "Sand Paper", "이름": "Sand Paper", "규격": "", "단위": "Sh", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030659", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030659)로 이음 · 값 미확보" },
{ "키": "MP000281", "원문번호": "광목", "이름": "광목", "규격": "", "단위": "m", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030660", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030660)로 이음 · 값 미확보" },
{ "키": "MP000282", "원문번호": "비닐시트 3m×3m", "이름": "비닐시트", "규격": "3m×3m", "단위": "Sh", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000283", "원문번호": "방청페인트 DR-80", "이름": "방청페인트", "규격": "DR-80", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": {"구분": "도료·방수·접착", "상세구분": "도료", "대표": "MT003378"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT003378)" },
{ "키": "MP000284", "원문번호": "페인트 노루표", "이름": "페인트", "규격": "노루표", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "자재품목 후보 47줄 — 지역·규격 선택 필요 (MT003366, MT003367, MT003368 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000285", "원문번호": "땜납 50 : 50", "이름": "땜납", "규격": "50 : 50", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "자재품목 후보 2줄 — 지역·규격 선택 필요 (MT001251, MT001252) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000286", "원문번호": "붕사", "이름": "붕사", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000287", "원문번호": "Compound 절연용", "이름": "Compound", "규격": "절연용", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000288", "원문번호": "3-Bond 밀착제 No.2", "이름": "3-Bond", "규격": "밀착제 No.2", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000285", "원문번호": "땜납 50 : 50", "이름": "땜납", "규격": "50 : 50", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT001252", "고르기": null, "비고": "PLAN 7-4b: 봉땜납 후보 둘(Sn10%·Sn30%) — 원문 50:50 과 정확히는 안 맞아 더 가까운 Sn30% 로 이음(사용자 확정 — 값 없어도 넘어감)" },
{ "키": "MP000286", "원문번호": "붕사", "이름": "붕사", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030661", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030661)로 이음 · 값 미확보" },
{ "키": "MP000287", "원문번호": "Compound 절연용", "이름": "Compound", "규격": "절연용", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030662", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030662)로 이음 · 값 미확보" },
{ "키": "MP000288", "원문번호": "3-Bond 밀착제 No.2", "이름": "3-Bond", "규격": "밀착제 No.2", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-2"], "연결": "MT030663", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030663)로 이음 · 값 미확보" },
{ "키": "MP000289", "원문번호": "함석 #31×3'×6'", "이름": "함석", "규격": "#31×3'×6'", "단위": "매", "요구절": ["건설품셈 기계설비 13-6-3"], "연결": null, "고르기": null, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT003499) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000290", "원문번호": "Nozzle", "이름": "Nozzle", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-3", "건설품셈 기계설비 13-6-6"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000290", "원문번호": "Nozzle", "이름": "Nozzle", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-3", "건설품셈 기계설비 13-6-6"], "연결": "MT030664", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030664)로 이음 · 값 미확보" },
{ "키": "MP000291", "원문번호": "페인트 에나멜", "이름": "페인트", "규격": "에나멜", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-4", "건설품셈 기계설비 13-6-5"], "연결": null, "고르기": null, "비고": "자재품목 후보 47줄 — 지역·규격 선택 필요 (MT003366, MT003367, MT003368 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000292", "원문번호": "함석 #31×3×6", "이름": "함석", "규격": "#31×3×6", "단위": "대", "요구절": ["건설품셈 기계설비 13-6-6"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000293", "원문번호": "세유", "이름": "세유", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-7", "건설품셈 기계설비 13-10-2", "건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000294", "원문번호": "전기용접", "이름": "전기용접", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-8"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000295", "원문번호": "탄소봉", "이름": "탄소봉", "규격": "", "단위": "본", "요구절": ["건설품셈 기계설비 13-6-8"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000296", "원문번호": "Grinder 12\"ø", "이름": "Grinder", "규격": "12\"ø", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-8"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000297", "원문번호": "돌 65×305", "이름": "돌", "규격": "65×305", "단위": "매", "요구절": ["건설품셈 기계설비 13-6-8"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000298", "원문번호": "Film 2회", "이름": "Film", "규격": "2회", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-8"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000299", "원문번호": "탄소봉 8ø×350㎜", "이름": "탄소봉", "규격": "8ø×350㎜", "단위": "본", "요구절": ["건설품셈 기계설비 13-6-9", "건설품셈 기계설비 13-6-10"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000293", "원문번호": "세유", "이름": "세유", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-7", "건설품셈 기계설비 13-10-2", "건설품셈 기계설비 13-11-5"], "연결": "MT030665", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030665)로 이음 · 값 미확보" },
{ "키": "MP000294", "원문번호": "전기용접", "이름": "전기용접", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-8"], "연결": "MT030666", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030666)로 이음 · 값 미확보" },
{ "키": "MP000295", "원문번호": "탄소봉", "이름": "탄소봉", "규격": "", "단위": "본", "요구절": ["건설품셈 기계설비 13-6-8"], "연결": "MT030667", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030667)로 이음 · 값 미확보" },
{ "키": "MP000296", "원문번호": "Grinder 12\"ø", "이름": "Grinder", "규격": "12\"ø", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-8"], "연결": "MT030668", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030668)로 이음 · 값 미확보" },
{ "키": "MP000297", "원문번호": "돌 65×305", "이름": "돌", "규격": "65×305", "단위": "매", "요구절": ["건설품셈 기계설비 13-6-8"], "연결": "MT030669", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030669)로 이음 · 값 미확보" },
{ "키": "MP000298", "원문번호": "Film 2회", "이름": "Film", "규격": "2회", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-8"], "연결": "MT030670", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030670)로 이음 · 값 미확보" },
{ "키": "MP000299", "원문번호": "탄소봉 8ø×350㎜", "이름": "탄소봉", "규격": "8ø×350㎜", "단위": "본", "요구절": ["건설품셈 기계설비 13-6-9", "건설품셈 기계설비 13-6-10"], "연결": "MT030671", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030671)로 이음 · 값 미확보" },
{ "키": "MP000300", "원문번호": "규사", "이름": "규사", "규격": "", "단위": "㎥", "요구절": ["건설품셈 기계설비 13-6-9", "건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000301", "원문번호": "노즐", "이름": "노즐", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-9", "건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000302", "원문번호": "탈에폭시레신", "이름": "탈에폭시레신", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-9"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000303", "원문번호": "그라인더돌 12\"ø", "이름": "그라인더돌", "규격": "12\"ø", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-10", "건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000304", "원문번호": "Film 65×305", "이름": "Film", "규격": "65×305", "단위": "매", "요구절": ["건설품셈 기계설비 13-6-10"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000305", "원문번호": "Tar epoxy", "이름": "Tar epoxy", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-10"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000306", "원문번호": "마린B/T(선박도로용)", "이름": "마린B/T(선박도로용)", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-10"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000301", "원문번호": "노즐", "이름": "노즐", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-9", "건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": "MT030672", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030672)로 이음 · 값 미확보" },
{ "키": "MP000302", "원문번호": "탈에폭시레신", "이름": "탈에폭시레신", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-9"], "연결": "MT030673", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030673)로 이음 · 값 미확보" },
{ "키": "MP000303", "원문번호": "그라인더돌 12\"ø", "이름": "그라인더돌", "규격": "12\"ø", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-10", "건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": "MT030674", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030674)로 이음 · 값 미확보" },
{ "키": "MP000304", "원문번호": "Film 65×305", "이름": "Film", "규격": "65×305", "단위": "매", "요구절": ["건설품셈 기계설비 13-6-10"], "연결": "MT030675", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030675)로 이음 · 값 미확보" },
{ "키": "MP000305", "원문번호": "Tar epoxy", "이름": "Tar epoxy", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-10"], "연결": "MT030676", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030676)로 이음 · 값 미확보" },
{ "키": "MP000306", "원문번호": "마린B/T(선박도로용)", "이름": "마린B/T(선박도로용)", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-10"], "연결": "MT030677", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030677)로 이음 · 값 미확보" },
{ "키": "MP000307", "원문번호": "함석 #32×3'×6'", "이름": "함석", "규격": "#32×3'×6'", "단위": "매", "요구절": ["건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-13", "건설품셈 기계설비 13-6-17"], "연결": null, "고르기": null, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT003499) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000308", "원문번호": "Zinc primer 15μ", "이름": "Zinc primer", "규격": "15μ", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000309", "원문번호": "Tar Epoxy 125μ", "이름": "Tar Epoxy", "규격": "125μ", "단위": "㎾h", "요구절": ["건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000310", "원문번호": "Tar Epoxy 2회", "이름": "Tar Epoxy", "규격": "2회", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-12"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000308", "원문번호": "Zinc primer 15μ", "이름": "Zinc primer", "규격": "15μ", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": "MT030678", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030678)로 이음 · 값 미확보" },
{ "키": "MP000309", "원문번호": "Tar Epoxy 125μ", "이름": "Tar Epoxy", "규격": "125μ", "단위": "㎾h", "요구절": ["건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": "MT030679", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030679)로 이음 · 값 미확보" },
{ "키": "MP000310", "원문번호": "Tar Epoxy 2회", "이름": "Tar Epoxy", "규격": "2회", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-12"], "연결": "MT030680", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030680)로 이음 · 값 미확보" },
{ "키": "MP000311", "원문번호": "전기용접봉", "이름": "전기용접봉", "규격": "", "단위": "㎾h", "요구절": ["건설품셈 기계설비 13-6-13"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000312", "원문번호": "함석(Template) #32×3'×6'", "이름": "함석(Template)", "규격": "#32×3'×6'", "단위": "매", "요구절": ["건설품셈 기계설비 13-6-15"], "연결": null, "고르기": null, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT003499) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000313", "원문번호": "연마석 12\"ø", "이름": "연마석", "규격": "12\"ø", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-15"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000314", "원문번호": "drill 1/4\"", "이름": "drill", "규격": "1/4\"", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-15"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000315", "원문번호": "drill 11/15\"", "이름": "drill", "규격": "11/15\"", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-15"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000314", "원문번호": "drill 1/4\"", "이름": "drill", "규격": "1/4\"", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-15"], "연결": "MT030681", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030681)로 이음 · 값 미확보" },
{ "키": "MP000315", "원문번호": "drill 11/15\"", "이름": "drill", "규격": "11/15\"", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-15"], "연결": "MT030682", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030682)로 이음 · 값 미확보" },
{ "키": "MP000316", "원문번호": "Bite", "이름": "Bite", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-15"], "연결": null, "고르기": {"구분": "기계·설비", "상세구분": "기계류"}, "비고": null },
{ "키": "MP000317", "원문번호": "톱날", "이름": "톱날", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-6-15"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000318", "원문번호": "함석 31×3×6", "이름": "함석", "규격": "31×3×6", "단위": "매", "요구절": ["건설품셈 기계설비 13-6-9"], "연결": null, "고르기": null, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT003499) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000319", "원문번호": "Tar Epoxy 1회도장", "이름": "Tar Epoxy", "규격": "1회도장", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-16"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000319", "원문번호": "Tar Epoxy 1회도장", "이름": "Tar Epoxy", "규격": "1회도장", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-16"], "연결": "MT030683", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030683)로 이음 · 값 미확보" },
{ "키": "MP000320", "원문번호": "가루비누", "이름": "가루비누", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-7-22"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000321", "원문번호": "걸레", "이름": "걸레", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-10-2", "건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000322", "원문번호": "페인트 유성", "이름": "페인트", "규격": "유성", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-10-3"], "연결": null, "고르기": null, "비고": "자재품목 후보 47줄 — 지역·규격 선택 필요 (MT003366, MT003367, MT003368 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000323", "원문번호": "용접봉(전기)", "이름": "용접봉(전기)", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스"}, "비고": "자재품목 후보 12줄 — 지역·규격 선택 필요 (MT003186, MT003187, MT003188 외)" },
{ "키": "MP000324", "원문번호": "용접봉(산소)", "이름": "용접봉(산소)", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스"}, "비고": "자재품목 후보 12줄 — 지역·규격 선택 필요 (MT003186, MT003187, MT003188 외)" },
{ "키": "MP000325", "원문번호": "M/C OIL", "이름": "M/C OIL", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000326", "원문번호": "Grinder Wheel", "이름": "Grinder Wheel", "규격": "", "단위": "매", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000327", "원문번호": "Oil Stone", "이름": "Oil Stone", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000328", "원문번호": "File", "이름": "File", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000325", "원문번호": "M/C OIL", "이름": "M/C OIL", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030684", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030684)로 이음 · 값 미확보" },
{ "키": "MP000326", "원문번호": "Grinder Wheel", "이름": "Grinder Wheel", "규격": "", "단위": "매", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030685", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030685)로 이음 · 값 미확보" },
{ "키": "MP000327", "원문번호": "Oil Stone", "이름": "Oil Stone", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030686", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030686)로 이음 · 값 미확보" },
{ "키": "MP000328", "원문번호": "File", "이름": "File", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030687", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030687)로 이음 · 값 미확보" },
{ "키": "MP000329", "원문번호": "아연도철선", "이름": "아연도철선", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": {"구분": "철근·강재", "상세구분": "철선"}, "비고": "굵기별 갈림 — 원문 규격 없음" },
{ "키": "MP000330", "원문번호": "Drill", "이름": "Drill", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000330", "원문번호": "Drill", "이름": "Drill", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030688", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030688)로 이음 · 값 미확보" },
{ "키": "MP000331", "원문번호": "사포", "이름": "사포", "규격": "", "단위": "매", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000332", "원문번호": "비닐시드", "이름": "비닐시드", "규격": "", "단위": "㎡", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000333", "원문번호": "용접장갑", "이름": "용접장갑", "규격": "", "단위": "족", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000334", "원문번호": "Compound", "이름": "Compound", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000335", "원문번호": "3-Bond", "이름": "3-Bond", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000336", "원문번호": "Seal Tape", "이름": "Seal Tape", "규격": "", "단위": "통", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000337", "원문번호": "백묵", "이름": "백묵", "규격": "", "단위": "통", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000338", "원문번호": "석필", "이름": "석필", "규격": "", "단위": "통", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000334", "원문번호": "Compound", "이름": "Compound", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030689", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030689)로 이음 · 값 미확보" },
{ "키": "MP000335", "원문번호": "3-Bond", "이름": "3-Bond", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030690", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030690)로 이음 · 값 미확보" },
{ "키": "MP000336", "원문번호": "Seal Tape", "이름": "Seal Tape", "규격": "", "단위": "통", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030691", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030691)로 이음 · 값 미확보" },
{ "키": "MP000337", "원문번호": "백묵", "이름": "백묵", "규격": "", "단위": "통", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030692", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030692)로 이음 · 값 미확보" },
{ "키": "MP000338", "원문번호": "석필", "이름": "석필", "규격": "", "단위": "통", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030693", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030693)로 이음 · 값 미확보" },
{ "키": "MP000339", "원문번호": "함석", "이름": "함석", "규격": "", "단위": "매", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT003499) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000340", "원문번호": "흑 Welder Glass", "이름": "흑 Welder Glass", "규격": "", "단위": "연", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000341", "원문번호": "백 Welder Glass", "이름": "백 Welder Glass", "규격": "", "단위": "연", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000342", "원문번호": "오스터날", "이름": "오스터날", "규격": "", "단위": "SET", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000343", "원문번호": "탭", "이름": "탭", "규격": "", "단위": "SET", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000344", "원문번호": "다이스", "이름": "다이스", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000345", "원문번호": "정", "이름": "정", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000340", "원문번호": "흑 Welder Glass", "이름": "흑 Welder Glass", "규격": "", "단위": "연", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030694", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030694)로 이음 · 값 미확보" },
{ "키": "MP000341", "원문번호": "백 Welder Glass", "이름": "백 Welder Glass", "규격": "", "단위": "연", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030695", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030695)로 이음 · 값 미확보" },
{ "키": "MP000342", "원문번호": "오스터날", "이름": "오스터날", "규격": "", "단위": "SET", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030696", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030696)로 이음 · 값 미확보" },
{ "키": "MP000343", "원문번호": "탭", "이름": "탭", "규격": "", "단위": "SET", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030697", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030697)로 이음 · 값 미확보" },
{ "키": "MP000344", "원문번호": "다이스", "이름": "다이스", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030698", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030698)로 이음 · 값 미확보" },
{ "키": "MP000345", "원문번호": "정", "이름": "정", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030699", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030699)로 이음 · 값 미확보" },
{ "키": "MP000346", "원문번호": "용접면", "이름": "용접면", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000347", "원문번호": "용접홀다", "이름": "용접홀다", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000348", "원문번호": "용접앞치마", "이름": "용접앞치마", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000349", "원문번호": "Center Punch", "이름": "Center Punch", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000349", "원문번호": "Center Punch", "이름": "Center Punch", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030700", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030700)로 이음 · 값 미확보" },
{ "키": "MP000350", "원문번호": "써비스볼트", "이름": "써비스볼트", "규격": "", "단위": "본", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000351", "원문번호": "대강", "이름": "대강", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000352", "원문번호": "유지", "이름": "유지", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000353", "원문번호": "Washer", "이름": "Washer", "규격": "", "단위": "매", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000351", "원문번호": "대강", "이름": "대강", "규격": "", "단위": "㎏", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030701", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030701)로 이음 · 값 미확보" },
{ "키": "MP000352", "원문번호": "유지", "이름": "유지", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030702", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030702)로 이음 · 값 미확보" },
{ "키": "MP000353", "원문번호": "Washer", "이름": "Washer", "규격": "", "단위": "매", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": "MT030703", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030703)로 이음 · 값 미확보" },
{ "키": "MP000354", "원문번호": "페인트(표기용)", "이름": "페인트(표기용)", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": null, "비고": "자재품목 후보 47줄 — 지역·규격 선택 필요 (MT003366, MT003367, MT003368 외) · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000355", "원문번호": "페인트붓(표기용)", "이름": "페인트붓(표기용)", "규격": "", "단위": "개", "요구절": ["건설품셈 기계설비 13-11-5"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT008178"}, "비고": "자재품목 후보 1줄 — 지역·규격 선택 필요 (MT008178)" },
{ "키": "MP000356", "원문번호": "벤토나이트알갱이", "이름": "벤토나이트알갱이", "규격": "", "단위": "kg", "요구절": ["건설품셈 건축 6-5-3"], "연결": "MT007749", "고르기": null, "비고": "연결: 자재품목 한 줄" },
{ "키": "MP000357", "원문번호": "카트리지 화약", "이름": "카트리지", "규격": "화약", "단위": "개", "요구절": ["건설품셈 건축 6-5-3"], "연결": "MT007751", "고르기": null, "비고": "연결: 자재품목 한 줄" },
{ "키": "MP000358", "원문번호": "전력", "이름": "전력", "규격": "", "단위": "㎾h", "요구절": ["건설품셈 기계설비 13-2-4", "건설품셈 기계설비 13-6-3", "건설품셈 기계설비 13-6-6"], "연결": {"이름": "전력량요금", "계약종별": "입력"}, "고르기": null, "비고": "연결: 유가전력 전력 줄 · 계약종별은 로직 입력 「전력 계약종별」 — 품셈·계약예규에 계약종별 규정 없음(전력비는 실비 계상) · 시험 계산은 그 계약종별 전력량요금 가운데 낮은 값" },
{ "키": "MP000359", "원문번호": "중유", "이름": "중유", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-9", "건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": null, "고르기": null, "비고": "중유는 받지 않기로 함 — 미연결 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" },
{ "키": "MP000359", "원문번호": "중유", "이름": "중유", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-9", "건설품셈 기계설비 13-6-11", "건설품셈 기계설비 13-6-17"], "연결": "MT030704", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030704)로 이음 · 값 미확보" },
{ "키": "MP000360", "원문번호": "징크프라이머", "이름": "징크프라이머", "규격": "", "단위": "ℓ", "요구절": ["건설품셈 기계설비 13-6-9"], "연결": "MT003383", "고르기": null, "비고": "연결: 자재품목 한 줄" },
{ "키": "MP000361", "원문번호": "동 및 동합금용 용접봉 BCUP3", "이름": "동 및 동합금용 용접봉", "규격": "BCUP3", "단위": "㎏", "요구절": ["건설품셈 기계설비 1-2-1"], "연결": null, "고르기": {"구분": "잡재료", "상세구분": "용접·가스"}, "비고": "자재품목에 같은 품명 없음" },
{ "키": "MP000362", "원문번호": "폴리에틸렌필름 0.04㎜", "이름": "폴리에틸렌필름", "규격": "t=0.04㎜", "단위": "㎡", "요구절": ["건설품셈 건축 6-5-3"], "연결": null, "고르기": null, "비고": "자재품목 PE 필름은 0.03·0.05㎜ — 0.04㎜ 없음 · 고르기 없음(자재품목 그 묶음에 같은 단위·이름 줄이 없음)" },
{ "키": "MP000363", "원문번호": "아스팔트싱글 336×1,000×3㎜", "이름": "아스팔트싱글", "규격": "336×1,000×3㎜", "단위": "매", "요구절": ["건설품셈 건축 7-1-5"], "연결": null, "고르기": null, "비고": "자재품목 슁글은 ㎡ — 매 환산 안 함 · 고르기 없음(자재품목 묶음에 짝이 없음 — 관리자가 화면에서 이음)" }
{ "키": "MP000363", "원문번호": "아스팔트싱글 336×1,000×3㎜", "이름": "아스팔트싱글", "규격": "336×1,000×3㎜", "단위": "매", "요구절": ["건설품셈 건축 7-1-5"], "연결": "MT030705", "고르기": null, "비고": "PLAN 7-4b: 자재품목 새 줄(MT030705)로 이음 · 값 미확보" }
]
}
@@ -2,7 +2,7 @@
`scripts/build_자재품목_분류.py` 가 만든 표 — 손으로 고치지 않음.
- 구분 24 · 상세구분 100 · 미분류 25 줄 (전체 30702 줄)
- 구분 24 · 상세구분 100 · 미분류 25 줄 (전체 30711 줄)
## 규칙
@@ -14,9 +14,9 @@
## 구분별 상세구분 (줄 수)
### 관·이음관 (7151)
### 관·이음관 (7152)
PE관 2907 · 이음쇠·부속 1003 · 주철관 828 · 강관 705 · PVC관 461 · 파형강관 417 · 유리섬유·FRP관 398 · 흄관 222 · 동관·스텐관 133 · 단열이중관 77
PE관 2907 · 이음쇠·부속 1003 · 주철관 828 · 강관 706 · PVC관 461 · 파형강관 417 · 유리섬유·FRP관 398 · 흄관 222 · 동관·스텐관 133 · 단열이중관 77
### 식생·종자 (6128)
@@ -42,9 +42,9 @@ PE관 2907 · 이음쇠·부속 1003 · 주철관 828 · 강관 705 · PVC관 46
볼트·너트 526 · 와이어로프·클램프 208 · 앵커 189 · 못 41 · 철근커플러 38
### 전기·통신 (900)
### 전기·통신 (902)
케이블·전선 319 · 판넬·차단기 163 · 전선관·트레이 139 · 조명·전등 133 · 제어·계측기기 89 · 부속·기타 57
케이블·전선 320 · 판넬·차단기 164 · 전선관·트레이 139 · 조명·전등 133 · 제어·계측기기 89 · 부속·기타 57
### 밸브·수도자재 (761)
@@ -58,13 +58,13 @@ PE관 2907 · 이음쇠·부속 1003 · 주철관 828 · 강관 705 · PVC관 46
화물운임 552 · 시험·검사 62 · 폐기물 61 · 상하차 2
### 기계·설비 (626)
### 기계·설비 (627)
기계류 267 · 보일러·공조 172 · 놀이·운동·시설물 109 · 측정·시험기기 68 · 소방·가스 10
기계류 267 · 보일러·공조 173 · 놀이·운동·시설물 109 · 측정·시험기기 68 · 소방·가스 10
### 맨홀·수로·그레이팅 (602)
### 맨홀·수로·그레이팅 (603)
수로관 283 · 그레이팅 169 · 맨홀 150
수로관 283 · 그레이팅 169 · 맨홀 151
### 시멘트·골재 (588)
@@ -90,9 +90,9 @@ PE관 2907 · 이음쇠·부속 1003 · 주철관 828 · 강관 705 · PVC관 46
각재·판재 168 · 목재덱 161 · 합판 78 · 판재 24
### 잡재료 (313)
### 잡재료 (317)
소모품 231 · 용접·가스 36 · 고철·기타금속 31 · 화약 13 · 용수 2
소모품 235 · 용접·가스 36 · 고철·기타금속 31 · 화약 13 · 용수 2
### 단열·보온 (284)
@@ -0,0 +1,119 @@
# B05·B06 이 old/·ref 파일 여섯을 읽는 진짜 까닭
읽기 전용 분석 — 코드·데이터 하나도 안 고침.
`ref/_분석_안쓰는마스터.md`(sub1)가 「B05·B06 이 old/·ref 파일 여섯을 읽음」이라 적은 것을 한 줄 한 줄
따라가 다시 봄. **결론부터 — 여섯 가운데 실제로 B05·B06 화면을 돌리는 건 둘뿐**이고, 나머지 넷은
B08·B09(끊긴 옛 코드)만 쓰는 것을 sub1 이 잘못 묶은 것.
## 파일 하나씩
### ① `old/2_공종_건설_마스터_2026-01-01.json` · `old/2_공종_산림_마스터_2026-01-01.json`
- **읽는 코드** — `common_util/common_util_work_item_key.py` 41째 줄(`MASTER_DIR.glob("2_공종_*_마스터_*.json")`).
이 모듈을 실제로 부르는 곳은 `old_code/B08_Quantity/B08_Quantity_Engine_Handoff.py` 254째 줄과
`old_code/B09_Estimation/B09_Estimation_BillOfQuantities_Input.py` 뿐 — **B05·B06 코드 어디에도
`common_util_work_item_key` 를 부르는 줄이 없음**(직접 검색해 확인).
- **B05·B06 과 닿는 유일한 자리** — `common_util_node_bundle.py` 가 `resources/master_data/old/` 의
`*.json` **수정 시각**을 통째로 지켜봄(내용은 안 읽음·「낡음」 판정만). 이 파일도 그 34개 가운데
하나라 시각은 보이지만, **화면에 쓰이는 값은 하나도 없음**.
- **언제 들어왔나** — 파일 자체는 2026-09-17 커밋 `642a5be9`(건설)·`8f3a01cd`(work_item_key.py) —
제목 그대로 **B08 인계 출구·B09 인계 입구 두 곳에서만 쓰려고 만든 것**(B08·B09 작업 중 생김, 사용자 말과 일치).
2026-09-19 `0e6412fe` 로 `master_data/` 첫 층에서 `old/` 로 옮겨짐(B05·B06 과는 무관한 정리).
- **안 읽으면** — B05·B06 은 **아무 일도 없음**(원래 안 읽으므로). old_code 의 B08·B09 인계 계산이
다시 붙을 때만 문제(지금은 라우터가 끊겨 안 돌아감).
- **갈래 — ㉮ 그냥 걷어도 됨**(B05·B06 기준).
### ② `old/2_공종_산림건설_연결_2026-01-01.json`
- **읽는 코드** — `common_util/common_util_work_item_link.py` 42째 줄(`FOLDER.glob("2_공종_산림건설_연결_*.json")`).
부르는 곳은 `old_code/B09_Estimation/B09_Estimation_BillOfQuantities_Input.py`·
`B09_Estimation_BillOfQuantities.py` 뿐 — 역시 B05·B06 은 안 부름.
- **언제** — 2026-09-17 `06e1f4ef` — 「산림·건설 어느 품을 쓸지 표가 정함」, B09 인계 규칙(사용자 말과 일치).
- **안 읽으면** — B05·B06 무관. old_code B09 재연결 때만 문제.
- **갈래 — ㉮ 그냥 걷어도 됨**(B05·B06 기준).
### ③ `old/3_품셈_산림_돌쌓기경사_13-4-4_2026-01-01.json`
- **읽는 코드** — `B06_Section_UI_Cross_Lean.ts` 13째 줄이 이 파일을 바로 import 해 `leanOf()` 함수를
만듦(16~18째 줄). 그 함수를 `B06_Section_UI_Cross_Culvert_Geom.ts`(178·629째 줄)와
`B06_Section_UI_Cross_Revetment.ts`(201·291째 줄)가 불러 씀.
- **화면에 쓰는 자리** — 횡단도(단면도)에서 **관 유입·유출부·독립 기슭막이·다단 벽**을 그릴 때 벽
전면의 기울기(1:n)를 정함 — 품셈 13-4-4 [주]⑪ 「돌쌓기 표준경사」 표(직고 4단계 × 성토/절토 ×
메쌓기/찰쌓기 = 16칸). **사용자에게 보이는 것은 횡단도 벽의 실제 기울어진 모양 그 자체**임.
- **언제 들어왔나(중요)** — 기능은 2026-09-14 커밋 `0e609e69` 로 처음 생겼는데, 그때 import 경로는
`resources/data_masonry/masonry_slope_2026-01-01.json` — **B08·B09 와 무관한 이 기능만의 전용 폴더**였음.
2026-09-19 커밋 `ebd148c4`(제목 「옛 자료 폴더 이동 뒤 서버 불러오기 복구」)가 `data_masonry/` 를
통째로 `master_data/old/` 로 옮기는 정리를 하면서 import 경로만 기계적으로 따라 고침 —
**B08·B09 를 만들며 들어간 게 아니라, B08·B09 정리(사용자 말 그대로) 때 엉뚱하게 같이 쓸려 들어간 것**.
- **안 읽으면** — 파일이 없어지면 TS import 가 못 찾아 **번들 빌드 자체가 깨짐**(횡단도를 그리는 화면
코드 전체가 안 뜸) — 이 파일이 있는데 표에 맞는 칸이 없을 때만 코드가 「종전 0.3」 으로 조용히
후퇴함(주석 확인) — 어느 쪽이든 심각.
- **마스터로 갈음되는지** — `계수_산림품셈_13장_구조물.json` 안에 13-4-4 표가 이미 있으나(CF000140)
그건 **주④⑤⑥⑦⑨**(줄눈메꿈·물구멍·뒷채움) 표이고, 이 파일이 쓰는 건 **주⑪ 표준경사**(다른 절) —
**지금 마스터는 이 표를 안 가지고 있음. 갈음 안 됨.**
- **갈래 — ㉰ 걷으면 기능이 없어짐**(화면 자체가 못 뜸). 지킬 파일.
- **덤 — 지킴 시험도 같이 쓸려 들어감** — `resources/tester/test_b06_wall_lean_table.py` 가
이 표의 최신 판을 대조하는 시험인데, `old_code/B08_Quantity_Engine_UnitQuantity_StoneSpec` 을
같이 읽는 바람에(B08 쪽 대조도 겸함) `old_code/resources/tester/` 로 함께 옮겨져 **지금은 안 돌아감**
— B06 쪽 지킴이 비어 있음.
### ④ `ref/공종_자원별칭_실무_2026-01-01.json`
- **읽는 코드** — `common_util/common_util_aliases.py` 29째 줄.
- **부르는 곳** — 전부 `old_code/`(B08_Quantity_Engine_Handoff_Mapping · B09_Estimation_UnitPrice ·
ResourceAxis_Join · MachineProductivity 계열) + `resources/tester/test_b09_fuel_kind_vibrator.py` ·
`resources/tester/test_b08_root_removal_excavator.py` 둘. **B05·B06 화면 코드는 전혀 안 부름.**
- **⚠ 그 시험 둘은 지금 이미 깨져 있음** — 실제로 `pytest --collect-only` 로 돌려 확인:
`ModuleNotFoundError: No module named 'B09_Estimation.B09_Estimation_UnitPrice'`(B08 도 같은 증상).
B08·B09 가 `old_code/` 로 옮겨간 뒤 이 시험 둘의 import 만 안 고쳐져 지금은 **아예 실행이 안 됨** —
sub1 문서의 「시험이 지킴」은 이제 사실이 아님(시험이 죽어서 지키는 게 없음).
- **갈래 — ㉮ 그냥 걷어도 됨**(B05·B06 기준). 단 시험 둘은 이 파일과 무관하게 이미 고장 나 있어
별도 정리 필요(이 일감 범위 밖 — 한 줄만 남김).
### ⑤ `ref/수량_사방기슭막이치수_사방기술교본_2026-01-01.json`
- **읽는 코드** — `B05_Profile_UI_Drainage_Facility_Fields.ts` 12째 줄이 바로 import.
256~268째 줄 `sabangBasisLines()` 가 이 표에서 「높이 규칙·계획비탈 표준비·둑마루 두께 기준·
뒷채움 조약돌 두께」 네 줄을 뽑아 문장으로 만듦.
- **화면에 쓰는 자리** — `createRevetSideGroup()`(270~301째 줄)이 이 문장을 **독립 기슭막이 입력칸
바로 밑에 안내문(근거)으로 보여줌** — 계산에 쓰이는 수치가 아니라 **사용자가 값을 넣을 때 보는
설명 문구**. `B05_Profile_UI_Drainage_Facility.ts`(본체 폼)가 이 조각을 불러 써서 실제 화면에 붙음.
- **언제 들어왔나** — 기능은 2026-09-14 `ad63dd8f`(제목에 `feat(b05,b06,b08)` — B05 화면 근거와
B08 사유가 「같은 파일」을 보게 지었다고 명시)로 생겼고, 그때 경로는 `resources/data_masonry/
revetment_sabang_2026-01-01.json` — 전용 폴더. 2026-09-19 `ebd148c4`(③과 같은 커밋)가 `master_data/ref/`
로 옮기며 경로만 고침. **B05 몫으로 함께 설계된 파일이 정리 때 ref/ 로 쓸려 들어간 것.**
- **안 읽으면** — 파일이 없으면 TS import 가 못 찾아 **B05 배수시설 서브폼 빌드가 깨짐**(계곡 통과
시설 입력 화면 전체가 못 뜸). 있어도 삭제하면 근거 문구 네 줄이 사라짐 — 계산 값 자체는 안
바뀌지만 「왜 이 값을 제안하는지」 사용자가 못 봄.
- **마스터로 갈음되는지** — 지금 마스터에 「독립 기슭막이 근거」에 해당하는 표가 없음(품셈이 아니라
**사방기술교본**이 원출처라 산림품셈 계수·소요량 파일에 안 실림). 갈음 안 됨.
- **갈래 — ㉰ 걷으면 기능이 없어짐**. 지킬 파일.
- **덤 — 지킴 시험도 함께 쓸려 들어감** — `resources/tester/test_b05_revetment_sabang_basis.py` 도
`old_code/B08_Quantity_Engine_Pipe` 를 같이 읽어(B08 사유 대조 겸함) `old_code/resources/tester/` 로
옮겨짐 — 지금은 안 돌아가 B05 쪽 지킴도 비어 있음.
## 한 줄 요약표
| 파일 | B05·B06 이 실제로 읽나 | 언제·왜 들어왔나 | 갈래 |
|---|---|---|---|
| 공종_건설_마스터 · 공종_산림_마스터 | 아니오(old_code 만) | 09-17 B08·B09 인계용으로 만듦 | ㉮ 걷어도 됨 |
| 공종_산림건설_연결 | 아니오(old_code 만) | 09-17 B09 인계 규칙 | ㉮ 걷어도 됨 |
| 돌쌓기경사_13-4-4(품셈 표준경사) | **예 — B06 횡단도 벽 기울기** | 09-14 전용 폴더에서 만듦 → 09-19 old/ 로 쓸려 옮겨짐 | ㉰ 못 걷음 |
| 공종_자원별칭_실무 | 아니오(old_code + 죽은 시험 2개) | — | ㉮ 걷어도 됨 |
| 수량_사방기슭막이치수 | **예 — B05 근거 문구** | 09-14 전용 폴더에서 만듦 → 09-19 ref/ 로 쓸려 옮겨짐 | ㉰ 못 걷음 |
## 걷는 차례 제안
1. **먼저** — 공종_건설_마스터·공종_산림_마스터·공종_산림건설_연결·공종_자원별칭_실무 넷은 B05·B06 과
무관하니 이 넷 때문에 `old/`·`ref/` 를 못 건드릴 이유는 없음(다른 일감의 old/ 정리 그대로 진행 가능).
2. **돌쌓기경사·사방기슭막이치수 둘은 자리를 옮김** — `old/`·`ref/`(정리 대상 폴더) 밖에 전용 자리를
새로 줌(예: 옛 이름 그대로 `resources/data_masonry/` 되살리기, 또는 `resources/master_data/` 안에
「old 아님」이 분명한 이름). 옮길 때 고칠 곳 — TS import 경로 2줄(`B06_Section_UI_Cross_Lean.ts` 13째,
`B05_Profile_UI_Drainage_Facility_Fields.ts` 12째) · `common_util_node_bundle.py` 의
`SOURCE_DATA_DIRS`(새 폴더도 보게).
3. **죽은 지킴 시험 둘을 살림** — `test_b06_wall_lean_table.py`·`test_b05_revetment_sabang_basis.py` 를
`old_code/resources/tester/` 에서 `resources/tester/` 로 되돌리고, B08 쪽만 읽는 줄(대조 부분)은
빼거나 손봐 **B05·B06 몫만** 다시 돌게 함 — 지금은 이 표가 바뀌어도 아무 시험도 안 잡아 줌.
4. 이 순서대로 하면 `old/`·`ref/` 안에 더는 B05·B06 이 읽는 파일이 없어져, 남은 정리(PLAN 7-4·7-5)를
B05·B06 걱정 없이 진행할 수 있음.
@@ -31,3 +31,12 @@
- **지금 당장은 문제 없음** — 산림 쪽 기본 파일명으로 매번 정상 작동, 시험도 그 경로로 통과 중.
- **잠재 문제 하나**: `load_basis_missing()`은 파일이 없으면 예외 없이 **빈 딕셔너리로 조용히 넘어감**(516~517행 `if not os.path.exists(path): return {}`). `old/` 를 지우는 날(그게 이 폴더들의 최종 목표) 이 함수를 안 옮기고 그대로 두면 **에러 하나 없이 밑수 검사가 통째로 사라짐** — 10배·100배 틀린 금액이 아무 경고 없이 내역서에 설 수 있음. 걷기 전에 반드시 먼저 옮겨야 할 항목으로 표시해 둠.
- 건설 벌(3,164줄)은 이미 아무도 안 읽어 지금 걷어도 즉시 영향 없음 — 다만 건설 견적 기능이 나중에 켜질 때 필요한지는 그때 확인.
## 고친 뒤 (2026-09-22 PLAN 7-5 ⑤ · 브레인 판정 「새 마스터 JSON 쪽」)
- 이 문서를 쓴 뒤(일감 34) `B09_Estimation_UnitPrice.py` 자체가 7-3 에서 **`old_code/` 로 통째로 옮겨짐** — 지금은 부르는 살아 있는 자리가 0(다시 짤 때 참고용).
- 그래도 데이터는 최상위 마스터로 옮김 — `resources/master_data/기준수량없음_산림품셈_2026-01-01.json`(옛 `old/2_공종_산림_밑수없음_2026-01-01.json`, 산림 벌만 — 건설 벌은 원래부터 안 읽혀 그대로 `old/` 에 둠).
- `load_basis_missing()` 의 기본 파일명·자리를 새 파일로 바꿈 — 겸사겸사 **숨은 버그 하나 바로잡음**: 7-3 이 파일을 `old_code/` 로 옮기며 뿌리 경로 계산(`dirname` 두 번)이 한 단 모자라져, 그동안 조용히 빈 딕셔너리만 돌려주고 있었음(경고했던 「old/ 지우는 날 조용히 사라짐」이 이미 벌어져 있었던 셈).
- 견본 대조 — 새 자리에서 79건 읽힘(`F0042`·`F0447` 등 값 대조 확인), old/ 옛 자리는 파일 자체가 없어짐(git mv 로 옮김, 복제 안 함).
- `check_master.py` 의 「틀」 검사는 이 파일 하나만 이름으로 면제(8장 표·요소 틀에 안 맞는 특수 자료라 억지로 맞추지 않음) — `check_master.py 틀` 전체 재실행 0건 확인.
- `test_b09_table_reading_2.py`(직접 단위시험)는 `conftest.py` 의 `test_b09_*` 제외 글롭에 이미 걸려 있어 안 돎 — B09 를 마스터 얼개로 다시 짤 때 같이 되살릴 것(이번 범위 밖).
@@ -32,6 +32,11 @@
결론 — 완전히 같은 검사를 옮겨 합칠 기존 자리는 없음. 옮긴다면 **자리(마스터 JSON이냐 코드 상수냐)를 새로 정하는 일**임.
## 고친 뒤 (2026-09-22 — 브레인 판정: 갈래 A)
- 「값이니 코드 상수보다 마스터가 맞음」 판정대로 갈래 A(새 마스터 JSON)로 옮김 — `resources/master_data/기준수량없음_산림품셈_2026-01-01.json`.
- 8장 표·요소 틀에 억지로 맞추지 않음(구조를 건드리면 값을 지어낼 위험) — `schema_version`·`items` 모양 그대로 옮기고, `check_master.py` 「틀」 검사는 이 파일 하나만 이름으로 면제. 자세한 건 `ref/_분석_UnitPrice.md` 「고친 뒤」.
## ④ 옮긴다면 어디 — 두 갈래(고르지 않음)
**갈래 A — 새 마스터 JSON으로(`resources/master_data/` 최상위, M01 이 관리)**
@@ -0,0 +1,160 @@
# 안 쓰는 마스터 자료 분석 (PLAN 7-4 앞 절반)
읽기 전용 분석 — 목록만 뽑음 · **파일·코드는 하나도 안 옮김**(다음 일감 몫).
## ① M01 화면이 실제로 읽는 파일
읽기 사슬 — `M01_MasterData_Router.py` → `Store.py` → `check_master.load(FOLDER)`
(`FOLDER = resources/master_data`). `load()` 는 밑줄(`_`)로 시작하는 파일만 빼고
**첫 층 `*.json` 전부**를 매 요청마다 통째로 읽음 — 갈래를 가려 고르지 않음.
- **최상위 `*.json` 145개** — 로직 54 · 소요량 56 · 계수 27 · 재료 3(자재품목·품셈재료·유가전력) ·
환율·일위대가조합·인력·기계·요율 각 1. **전부 `load()` 가 읽음 — 목록 밖인 최상위 json 은 하나도 없음.**
- **`_키대장.json`** — `load()` 는 건너뛰지만 `master_keys.py`(`BOOK`)가 새 키를 줄 때 따로 읽음 → 실제로 읽힘.
- **엔진·검사 스크립트 8개** — `check_master.py`(695) · `master_combo.py`(141) · `master_copy.py`(298) ·
`master_keys.py`(426) · `master_text.py`(285) · `master_formula.py`(767) · `master_material.py`(224) ·
`master_draft.py`(641) — `Store.py`·`Store_Cache.py`·`Store_Make.py` 가 부르는 사슬.
**「목록」 = 최상위 json 145 + `_키대장.json` + 위 스크립트 8개.** 이 밖의 파일만 ②에서 가름.
## ② 목록 밖 파일 갈래
### `scripts/` — 37개(46 항목 중 `__pycache__` 빼고, 위 8개 제외)
모두 **㉯ 검사·빌더만 읽음** — 서버는 안 부르지만 사람이 손으로 돌리는 도구라 옮기면 그 도구가 깨짐.
| 갈래 | 파일(줄 수) |
|---|---|
| 빌더(정본을 원자료에서 다시 만듦) 16 | build_계수_산림품셈_01장_추가(641) · build_기계_건설품셈(660) · build_로직_재료_고르기(78) · build_소요량_건설품셈_공통2장(688) · build_소요량_건설품셈_공통3장(611) · build_소요량_건설품셈_기계설비(62) · build_소요량_건설품셈_토목(167) · build_시설자재가격(86) · build_요율(427) · build_용도(223) · build_인력_노임(416) · build_자재품목_분류(688) · build_재료_유가전력(227) · build_재료_자재품목(156) · build_품셈재료_고르기(185) · build_환율(90) |
| 빌더가 부르는 공통 부품(직접 안 돌림) 12 | _md표_읽기(307) · _migrate_base(472) · _migrate_keys(317) · _계수_공통2장(149) · _설비_계수(179) · _설비_손(12) · _설비_읽기(131) · _설비_표(389) · _토목_계수(100) · _토목_손(204) · _토목_읽기(194) · _토목_표(322) |
| 관급단가 갱신 사슬(서로 부름) 5 | update_관급단가(723) · update_관급단가_기타(240) · update_관급단가_느슨(371) · update_관급단가_보강(182) · update_관급단가_합침(170) |
| 읽기 전용 분석 도구 4 | analyze_식_복사(155, `ref/_설계_식_복사.md` 근거) · compare_estx(486) · 로직_복잡도_재기(53) · check_값없는줄(120, 일감 이전 것) |
### `old/` — 37개(json 34 · py 3)
PLAN 7-4 의 가정(「B08·B09 를 옮긴 뒤라 `old/` 의존이 줄었을 것」)은 **일부만 맞음** —
`old/` 는 지금도 살아 있는 화면이 읽는 자리가 있음.
- **㉰ 화면이 지금도 읽음 — 4개(옮기면 그 화면이 깨짐)**
- `2_공종_건설_마스터_2026-01-01.json` · `2_공종_산림_마스터_2026-01-01.json` —
`common_util_work_item_key.py`(글롭 `2_공종_*_마스터_*.json`) →
`B05_Profile_Corridor_Prebuild.py` · `B06_Section_Router_HaulPlan.py` · `B06_Section_Server_Calc_Prebuild.py`
- `2_공종_산림건설_연결_2026-01-01.json` — `common_util_work_item_link.py` → 위와 같은 화면
- `3_품셈_산림_돌쌓기경사_13-4-4_2026-01-01.json` — `B06_Section_UI_Cross_Lean.ts` 가 **직접 import**
(횡단도 벽 전면 기울기 표준경사)
- 덤 — `common_util_node_bundle.py` 가 `old/` 의 모든 `*.json` 수정 시각을 지켜봄(내용은 안 읽고
「낡음」 판정만 — 하나라도 바뀌면 TS 번들을 다시 지음)
- **㉯ old_code(끊긴 B08·B09·Z01)만 읽음 — 12개** — 지금 화면과는 무관.
`old_code/` 는 `main.py` 에서 라우터가 끊겨 있어(PLAN 7-3) 실제로는 안 돌지만, 그 코드를 지우기 전엔
참조가 남음: `1_기초_노임_건설업`·`1_기초_유가_시도별`·`1_기초_유가_전국평균`·`1_기초_자재_시설공통`·
`1_기초_제비율_토목`·`2_공종_산림_밑수없음`·`3_품셈_건설_기계경비기준_8장`·`3_품셈_건설_기계운전경비`·
`3_품셈_건설_표전체`·`3_품셈_산림_계수`·`3_품셈_산림_자원목록보충`·`3_품셈_산림_표전체`
- **㉮ 아무도 안 읽음 — 21개** — 살아 있는 화면도 old_code 도 안 부름:
`1_기초_노임_제조업`(1168) · `1_기초_환율_일별`(45) · `2_공종_건설_밑수없음`(3164) ·
`2_공종_건설_열쇠대장`(12948) · `2_공종_건설_형태미정`(4702) · `2_공종_산림_열쇠대장`(4519) ·
`2_공종_산림_자원줄`(6300) · `2_공종_산림_자원줄못맞춤`(2988) · `2_공종_산림_형태미정`(6) ·
`2_공종_산림건설_줄구실기준`(112) · `3_품셈_산림_거푸집사용횟수_1-7-1`(184) ·
`3_품셈_산림_돌쌓기규격갈래_13-4`(54) · `3_품셈_산림_돌쌓기뒷길이_13-4-4`(40) ·
`3_품셈_산림_목재구조갈래_13-13-1`(80) · `3_품셈_산림_철근가공갈래_12-3`(101) ·
`3_품셈_산림건설_기계작업량`(387) · `4_화면_이름표`(9656) · `재료_나라장터자재`(7034) ·
`_build_mach.py`(455) · `_build_mat_price.py`(103) · `_build_pum.py`(198)
⚠ 이 21개는 **이미 `old/` 안**이라 「옮길 후보」가 아니라 「지울 후보」 — 삭제 판단은 7-5·사용자 몫.
### `ref/` — 67개(md 58 · json 8 · csv 1)
md 58개는 **코드가 안 읽음**(사람·AI 가 보는 설계·검증 기록) — 이 분석은 「코드가 읽는지」 만 가르므로
md 하나하나가 「아직 쓸모 있나」 는 이 일감 범위 밖으로 둠(임의 결정 — 막히면 정하고 한 줄 남기라는 규칙을 따름).
json·csv 9개는 갈래가 갈림:
| 파일(줄 수) | 갈래 | 읽는 곳 |
|---|---|---|
| 공종_자원별칭_실무_2026-01-01(167) | ㉰ 시험이 읽음 | `common_util_aliases.py` → 시험 `test_b09_fuel_kind_vibrator.py`·`test_b08_root_removal_excavator.py` |
| 수량_사방기슭막이치수_사방기술교본_2026-01-01 | ㉰ 화면이 읽음 | `B05_Profile_UI_Drainage_Facility_Fields.ts` 가 직접 import |
| _관급_보강_후보.json | ㉯ 도구가 씀 | `update_관급단가_보강.py`·`update_관급단가_합침.py` |
| 공종_수량연결_실무_2026-01-01(691) | ㉯ old_code 만 | `old_code/B08_Quantity_Engine_Handoff_Mapping.py` |
| 수량_구조물원단위_울진_2026-01-01(652) | ㉯ old_code 만 | `old_code/B08_Quantity_Engine_ObservedUnit.py` |
| 품셈_산림_돌종류계수_울진_2026-01-01(164) | ㉯ old_code 만 | `old_code/B08_Quantity_Engine_UnitQuantity_StoneSpec.py` |
| 품셈_산림_재료할증_울진_2026-01-01(181) | ㉯ old_code 만 | `old_code/B08_Quantity_Engine_MaterialSummary.py` |
| _열목록_화면표.csv(45) | **㉮ 아무도 안 읽음** | 없음 |
| 수량_돌쌓기찰라이브러리_소광리_2026-01-01(285) | **㉮ 아무도 안 읽음** | 없음 |
## ③ `old/`·`ref/` 도 같은 잣대 — 이미 ②에 담음
## ④ 옮길 후보(파일 이름·줄 수) — 지금 아무도 안 읽는 것만
### 강한 후보 — 진짜 아무도 안 읽음(옮겨도 깨질 자리 없음)
| 파일 | 자리 | 줄 수 | 깨질 자리 |
|---|---|---|---|
| _원문목록.json | resources/master_data/ | 201 | 없음 — 단, `ref/_걷을_옛코드.md` 가 미래 B09 색인 후보로 이미 언급함(지우진 말고 old/ 로만) |
| _열목록_화면표.csv | resources/master_data/ref/ | 45 | 없음 |
| 수량_돌쌓기찰라이브러리_소광리_2026-01-01.json | resources/master_data/ref/ | 285 | 없음 |
### 약한 후보 — old_code(끊긴 라우터)만 읽음(old_code 를 먼저 걷어야 안전)
| 파일 | 자리 | 줄 수 | 깨질 자리 |
|---|---|---|---|
| 공종_수량연결_실무_2026-01-01.json | ref/ | 691 | old_code/B08_Quantity_Engine_Handoff_Mapping.py(지금은 안 돌아감) |
| 수량_구조물원단위_울진_2026-01-01.json | ref/ | 652 | old_code/B08_Quantity_Engine_ObservedUnit.py |
| 품셈_산림_재료할증_울진_2026-01-01.json | ref/ | 181 | old_code/B08_Quantity_Engine_MaterialSummary.py |
| 품셈_산림_돌종류계수_울진_2026-01-01.json | ref/ | 164 | old_code/B08_Quantity_Engine_UnitQuantity_StoneSpec.py |
### 절대 옮기면 안 되는 것 — 6개
`old/` 4개(공종 마스터 2·공종 산림건설 연결 1·돌쌓기경사 1) + `ref/` 2개(공종_자원별칭_실무·수량_사방기슭막이치수) —
B05·B06 화면과 시험 2개가 지금도 부름.
## 한 줄 결론
- 최상위 `*.json` 145개·엔진 스크립트 8개는 전부 M01 이 읽어 옮길 후보가 없음.
- `scripts/` 37개도 전부 살아 있는 빌더·검사 도구라 옮길 후보 없음.
- 진짜 옮길 후보는 **3개(531줄)** + old_code 정리 뒤에나 옮길 수 있는 **4개(1,688줄)** 뿐 —
PLAN 7-4 가 기대한 것보다 훨씬 작음.
- `old/` 는 이미 4개 파일로 B05·B06 화면을 떠받치고 있어 **7-5 에서 `old/` 를 통째로 지우면 안 됨** —
7-4 세 번째 체크(공종 마스터를 `old/` 에 두되 버리지 않음)와도 들어맞음.
- `old/` 안의 21개(54,244줄)는 이미 옮겨져 있고 아무도 안 읽음 — 「지울 후보」 로 7-5·사용자 몫에 넘김.
## 고친 뒤 (2026-09-22 PLAN 7-4·7-5)
**① 다시 훑은 결과 — 품셈재료 이관·B05B06 자료 복귀로 그림이 바뀜**
- 품셈재료(`재료_품셈재료.json`)가 7-4b 에서 이미 `old/` 로 옮겨짐 — 로직의 MP 직접참조는 0.
- B05·B06 전용 자료 둘(돌쌓기경사·사방기슭막이치수)이 옛 자료 정리 때 실수로 `old/`·`ref/` 에 같이 쓸려 들어간 것을 되짚어 `resources/data_masonry/`(옛 이름)로 되돌림 — 바로 앞 일감.
- 그 결과 「절대 옮기면 안 되는 것 6개」 가운데 **진짜 살아 있던 건 그 둘뿐**(B05·B06 화면이 직접 읽음). 공종 마스터 2·공종 산림건설 연결·공종 자원별칭은 `common_util_work_item_key.py`·`common_util_work_item_link.py`·`common_util_aliases.py` 를 거쳐 old_code(끊긴 B08·B09)만 읽고 있었음 — B05·B06 은 안 읽음(`ref/_분석_B05B06_옛자료.md` 가 코드로 확인).
**② 아무도 안 읽는 파일 7개를 `old/` 로 옮김(지우지 않음)**
| 파일 | 옛 자리 | 줄 수 | 옮기기 전 재확인 |
|---|---|---|---|
| `_원문목록.json` | `resources/master_data/` | 201 | 코드 0곳(문서만 언급) |
| `_열목록_화면표.csv` | `ref/` | 45 | 코드 0곳 |
| `수량_돌쌓기찰라이브러리_소광리_2026-01-01.json` | `ref/` | 285 | 코드 0곳 |
| `공종_수량연결_실무_2026-01-01.json` | `ref/` | 691 | old_code(`B08_Quantity_Engine_Handoff_Mapping.py`)만 — old_code 자체가 안 돎 |
| `수량_구조물원단위_울진_2026-01-01.json` | `ref/` | 652 | old_code(`B08_Quantity_Engine_ObservedUnit.py`)만 |
| `품셈_산림_재료할증_울진_2026-01-01.json` | `ref/` | 181 | old_code(`B08_Quantity_Engine_MaterialSummary.py`)만 |
| `품셈_산림_돌종류계수_울진_2026-01-01.json` | `ref/` | 164 | old_code(`B08_Quantity_Engine_UnitQuantity_StoneSpec.py`)만 |
| `공종_자원별칭_실무_2026-01-01.json`(167) | `ref/` | 167 | `common_util_aliases.py` → old_code 5곳 + 시험 2개(이미 `ModuleNotFoundError` 로 깨져 있었음 — 실제로 도는 자리 0) |
임의 결정 한 줄 — 「약한 후보(old_code 정리 뒤에나)」로 미뤄 뒀던 4개도, B08·B09 가 이미 7-3 에서 통째로 `old_code/` 로 옮겨져 **아무것도 안 부르는 게 확인돼** 이번에 같이 옮김(더 미룰 까닭 없음).
**③④ old/·ref 를 아직 읽는 코드 — 전부 센 목록**
| 자리 | 파일 | 무엇을 읽나 | 왜 | 끊을 수 있나 |
|---|---|---|---|---|
| 살아 있던 공용 모듈 | `common_util_work_item_key.py` | `old/2_공종_*_마스터_*.json` | old_code(B08 인계·B09 인계)만 부름 | **끊음** — `old_code/common_util/` 로 옮김(경로 계산만 한 단 보정, 가리키는 대상은 그대로 `old/` 공종 마스터) |
| 살아 있던 공용 모듈 | `common_util_work_item_link.py` | `old/2_공종_산림건설_연결_*.json` | old_code(B09 청구서)만 부름 | **끊음** — 위와 같이 옮김 |
| 살아 있던 공용 모듈 | `common_util_aliases.py` | `ref/공종_자원별칭_실무` | old_code + 깨진 시험 2 | **끊음** — `old_code/common_util/` 로 옮기고 대상 파일도 `old/` 로 |
| 시험(살아 있던 자리, 이미 깨짐) | `test_b09_fuel_kind_vibrator.py`·`test_b08_root_removal_excavator.py` | 위 aliases 경유 | B08·B09 옛 엔진(ModuleNotFoundError) | **끊음** — `old_code/resources/tester/` 로 옮김(7-3 이 놓친 것) |
| 빌더 도구 | `resources/master_data/scripts/_migrate_base.py` | `old/` 여럿 | 옛 인력·재료 값을 새 표로 한 번 옮긴 대조 밑감 | 못 끊음 — 이관이 옳았는지 되짚는 게 이 도구의 목적 |
| 빌더 도구 | `build_시설자재가격.py` | `ref/_없는_재료.md` | `--count` 로 몇 줄 남았는지 셈 | 못 끊음 — 사람이 손으로 돌리는 검사 도구 |
| 빌더 도구 | `update_관급단가_보강.py` | `ref/_관급_보강_후보.json`(씀) | 관급단가 보강 후보를 파일로 냄 | 못 끊음 — 출력 자리일 뿐 |
| 이관 대조 시험 | `test_masterdata_check.py`·`test_자재품목_분류.py` | `old/재료_품셈재료.json` | 7-4b 이관(옛→새)이 맞았는지 옛 값과 대조 | 못 끊음 — 대조가 시험의 목적 자체 |
| 원가계산 엔진(옛 코드) | `old_code/B09_Estimation/B09_Estimation_UnitPrice.py`(`load_basis_missing`) | `old/2_공종_산림_밑수없음` → **새 최상위 마스터로 이관**(아래 ⑤) | 밑수(기준수량) 없는 표를 가려냄 | 이관함 — 자리는 최상위로, 함수는 old_code 에 그대로(다시 짤 때 참고) |
**⑥ 끝 수 — `old/`·`ref/` 를 읽는 코드**
- **실제로 돌아가는 로직 코드 = 0곳**(오늘 셋 다 끊음).
- 남은 것은 성격이 다른 둘뿐 — 사람이 손으로만 돌리는 검사·빌더 도구 **5곳**(전부터 그랬음, 자동으로 안 돎) · 이관이 맞았는지 대조하는 시험 **2곳**(끊으면 검사 자체가 없어짐).
- `old/` 안의 나머지(공종 마스터 2·산림건설 연결·21개 안 읽는 옛 파일)는 삭제 후보로 그대로 사용자 몫에 남김.
@@ -1,12 +1,14 @@
# -*- coding: utf-8 -*-
"""로직 호표의 재료 줄을 「고르기 조건」 으로 바꿈 — 요소 「MP……」·「MT……」 를 조건 묶음으로.
· 바탕 셋 —
· 바탕 넷 —
① 재료_품셈재료.json 의 「고르기」 칸 (`scripts/build_품셈재료_고르기.py` 가 채움)
② 자재품목 줄을 바로 가리키는 「MT……」 — 그 줄의 구분·상세구분·규격 + 대표 = 그 줄
③ 연결이 자재품목 키 하나인 품셈재료 「MP……」 — 그 자재품목 줄로 ② 와 같게
④ 연결이 지역·계약종별 조건 묶음(모래 · 자갈 · 전력)인 품셈재료 — 그 묶음을 호표에
그대로 박음(PLAN 7-4b 뒤 절반 · `master_material._region`·`_tariff` 가 품셈재료
간접 없이 바로 풂)
②③ 은 대표 줄이 옛 요소와 같은 줄이라 금액이 그대로임(고르기 화면만 열림)
· 고르기 칸이 비고 연결도 지역·계약종별을 계산 때 푸는 줄(모래 · 자갈 · 전력)은 옛 방식 그대로 둠
· 줄 텍스트의 「"요소": "MP……"」 한 줄만 바꿈 — 나머지 글자·차례 그대로
· 다시 돌려도 같은 결과(이미 바뀐 줄은 건드릴 것이 없음)
@@ -38,12 +40,18 @@ def _cond_of(row: dict) -> dict | None:
def _picks() -> dict[str, dict]:
"""요소 키 → 고르기 조건 — 품셈재료 고르기 칸 · 자재품목 줄 · 연결이 키 하나인 품셈재료."""
"""요소 키 → 고르기 조건 — 품셈재료 고르기 칸 · 자재품목 줄 · 연결이 키 하나인 품셈재료 ·
연결이 지역·계약종별 조건 묶음인 품셈재료(그 묶음을 그대로 호표에 박음 — PLAN 7-4b 뒤 절반)."""
market = {str(r["키"]): r for r in json.loads(MARKET.read_text(encoding="utf-8"))["줄"]}
picks = {key: cond for key, row in market.items() if (cond := _cond_of(row))}
for row in json.loads(SRC.read_text(encoding="utf-8"))["줄"]:
link = row.get("연결")
cond = row.get("고르기") or (picks.get(link) if isinstance(link, str) else None)
if isinstance(link, str):
cond = row.get("고르기") or picks.get(link)
elif isinstance(link, dict) and (link.get("지역") == "입력" or link.get("계약종별") == "입력"):
cond = link
else:
cond = row.get("고르기")
if cond:
picks[str(row["키"])] = cond
return picks
@@ -62,6 +62,8 @@ DIVISIONS = {
_FILE = re.compile(
rf"^(?:(인력|기계)|({'|'.join(mf.GROUPS)})_({'|'.join(BOOKS)})(?:_(\d\d)장_(.+))?)\.json$"
)
#: 8장 틀에 안 맞는 특수 최상위 파일(표·요소가 아닌 다른 모양) — 틀 검사에서 뺌(PLAN 7-5 ⑤).
SPECIAL_FILES = {"기준수량없음_산림품셈_2026-01-01.json"}
_SOURCE = re.compile(
rf"^(?:자체|(?:{'|'.join(b for b in BOOKS if b not in ('건설품셈', '자체'))})(?:\s\S.*)?|건설품셈 (?:{'|'.join(DIVISIONS)}) \S.*)$"
)
@@ -253,6 +255,8 @@ def check_combo_form(name: str, data: dict) -> list[str]:
def check_form(name: str, data: dict) -> list[str]:
if name == mcb.FILE:
return check_combo_form(name, data)
if name in SPECIAL_FILES:
return []
m = _FILE.match(name)
if not m:
return [
@@ -16,7 +16,7 @@ LINKED = "MP" # 품셈재료 테이블ID
MARKET = "MT" # 자재품목 테이블ID
PRICED = "MO" # 유가전력 테이블ID — 값 한 칸
SLOTS = ("물가자료", "유통물가", "물가정보", "거래가격", "관급") # 자재품목 값 열
PICK_KEYS = ("구분", "상세구분", "규격", "대표") # 재료 고르기 조건 칸 (`_틀.md` 7장)
PICK_KEYS = ("구분", "상세구분", "이름", "규격", "대표", "지역", "계약종별") # 재료 고르기 조건 칸 (`_틀.md` 7장)
REGION = "자재지역" # 로직 입력 — 「지역」 은 유가 고르기가 씀
TARIFF = "전력 계약종별" # 로직 입력 — 품셈·계약예규에 계약종별 규정 없음
_UNITS = {"ea": "개", "ton": "톤", "t": "톤", "l": "ℓ", "리터": "ℓ", "set": "조", "세트": "조"}
@@ -64,11 +64,11 @@ def _market_index(master: mf.Master) -> list[tuple[str, str, str, str, str]]:
return master._market
def _tariff(master: mf.Master, ref: str, row: dict, env: dict) -> list[str]:
"""후보 조건{이름 · 계약종별: 입력} — 유가전력 전력 줄 가운데 그 계약종별·이름으로 시작하는 줄."""
cond = row["연결"]
def _tariff(master: mf.Master, label_ref, cond: dict, env: dict) -> list[str]:
"""후보 조건{이름 · 계약종별: 입력} — 유가전력 전력 줄 가운데 그 계약종별·이름으로 시작하는 줄.
`label_ref` 는 알림 글에 쓸 자리(호표 줄의 고르기 조건 · 또는 품셈재료 옛 키)."""
if TARIFF not in env:
raise mf.FormulaError(f"「{master.label(ref)}」 입력 「{TARIFF}」 없음")
raise mf.FormulaError(f"「{master.label(label_ref)}」 입력 「{TARIFF}」 없음")
want, kind = plain(cond["이름"]), plain(env[TARIFF])
hits = [
key
@@ -79,29 +79,26 @@ def _tariff(master: mf.Master, ref: str, row: dict, env: dict) -> list[str]:
and one.get("값") is not None
]
if not hits:
raise mf.FormulaError(f"「{master.label(ref)}」 계약종별 값 없음 — {env[TARIFF]}")
raise mf.FormulaError(f"「{master.label(label_ref)}」 계약종별 값 없음 — {env[TARIFF]}")
return hits
def _candidates(master: mf.Master, ref: str, row: dict, env: dict) -> list[str]:
def _region(master: mf.Master, label_ref, cond: dict, env: dict, unit) -> list[str]:
"""후보 조건{이름 · 규격 · 지역: 입력} — 뿌리가 이름으로 끝나고 이름에 지역 글자 · 단위 같음."""
cond = row["연결"]
if cond.get("계약종별") == "입력":
return _tariff(master, ref, row, env)
if cond.get("지역") == "입력" and REGION not in env:
raise mf.FormulaError(f"「{master.label(ref)}」 입력 「{REGION}」 없음")
raise mf.FormulaError(f"「{master.label(label_ref)}」 입력 「{REGION}」 없음")
region = plain(env.get(REGION, "")) if cond.get("지역") == "입력" else ""
want, spec, unit = plain(cond["이름"]), plain_spec(cond.get("규격")), plain_unit(row["단위"])
want, spec, unit_p = plain(cond["이름"]), plain_spec(cond.get("규격")), plain_unit(unit)
hits = [
(s, key)
for root, name, s, u, key in _market_index(master)
if root.endswith(want) and region in name and u == unit and (not spec or s == spec)
if root.endswith(want) and region in name and u == unit_p and (not spec or s == spec)
]
hits = [(s, key) for s, key in hits if _offers(master, key)]
if not hits:
raise mf.FormulaError(f"「{master.label(ref)}」 지역 값 없음 — {env.get(REGION)}")
raise mf.FormulaError(f"「{master.label(label_ref)}」 지역 값 없음 — {env.get(REGION)}")
if len({s for s, _ in hits}) > 1:
raise mf.FormulaError(f"「{master.label(ref)}」 후보 여럿 — 규격 선택 필요 ({len(hits)}줄)")
raise mf.FormulaError(f"「{master.label(label_ref)}」 후보 여럿 — 규격 선택 필요 ({len(hits)}줄)")
return [key for _, key in hits]
@@ -131,16 +128,18 @@ def by_class(master: mf.Master) -> dict[str, dict]:
def candidates(
master: mf.Master, cond: dict, env: dict | None = None, unit: str | None = None
) -> list[str]:
"""고르기 조건 안 자재품목 키 — 구분 · 상세구분 · 규격 낱말이 모두 든 줄 · 파일 차례대로.
"""고르기 조건 안 자재품목 키 — 구분 · 상세구분 · 이름 · 규격 낱말이 모두 든 줄 · 파일 차례대로.
`unit` 을 주면 그 단위(호표 줄 단위)와 같은 줄만 — 단위가 다르면 다른 물건.
입력 `자재지역` 이 있으면 이름에 그 지역이 든 줄만(그런 줄이 없으면 조건 안 전부)."""
want = [plain_spec(w) for w in str(cond.get("규격") or "").split()]
want_name = [plain(w) for w in str(cond.get("이름") or "").split()]
detail = cond.get("상세구분")
need = plain_unit(unit) if unit else ""
hits = [
key
for key, row in by_class(master).get(cond.get("구분"), {}).items()
if (not detail or row.get("상세구분") == detail)
and all(w in plain(row.get("이름")) for w in want_name)
and all(w in plain_spec(row.get("규격")) for w in want)
and (not need or plain_unit(row.get("단위")) == need)
]
@@ -181,8 +180,18 @@ def check_unit(master: mf.Master, where: str, cond: dict, unit: str | None) -> l
def check_pick(master: mf.Master, where: str, cond: dict, unit: str | None = None) -> list[str]:
"""고르기 조건 검사 — 칸 이름 · 구분·상세구분이 자재품목에 있는지 · 대표 줄 · 후보 0.
값에 `{입력}` 이 든 칸(관경 등)은 계산 때 채워지므로 검사에서 뺌."""
if set(cond) - set(PICK_KEYS) or not cond.get("구분"):
값에 `{입력}` 이 든 칸(관경 등)은 계산 때 채워지므로 검사에서 뺌.
지역·계약종별 조건은 구분 없이 이름 하나로 자재품목·유가전력을 넓게 찾음(_region · _tariff)
— 여기서는 이름 칸만 있는지 봄(후보 0 은 계산 때 판단)."""
if set(cond) - set(PICK_KEYS):
return [f"{where} · 재료 고르기 조건 모양 「{cond}」 — {' · '.join(PICK_KEYS)}"]
if ("지역" in cond and cond["지역"] != "입력") or (
"계약종별" in cond and cond["계약종별"] != "입력"
):
return [f"{where} · 재료 고르기 조건 모양 「{cond}」 — 지역·계약종별은 늘 「입력」"]
if cond.get("지역") == "입력" or cond.get("계약종별") == "입력":
return [] if cond.get("이름") else [f"{where} · 재료 고르기 조건 「{cond}」 — 이름 없음"]
if not cond.get("구분"):
return [f"{where} · 재료 고르기 조건 모양 「{cond}」 — {' · '.join(PICK_KEYS)}"]
cond = static(cond)
if not cond.get("구분"): # 구분 자체가 `{입력}` — 계산 때 채워져 여기서 좁힐 것이 없음
@@ -205,7 +214,17 @@ def element(
master: mf.Master, ref, env: dict, unit: str | None = None
) -> tuple[object, str | None]:
"""요소 값과 출처 — 자재품목은 제 줄, 품셈재료는 연결을 따라가 낮은 값 · 그 밖은 줄의 `값`.
`ref` 가 고르기 조건 묶음이면 대표 줄(없으면 단위 같은 조건 안 첫 줄)로 풂."""
`ref` 가 고르기 조건 묶음이면 대표 줄(없으면 단위 같은 조건 안 첫 줄)로 풂.
조건에 지역·계약종별 이 「입력」 이면 구분·상세구분 없이 이름 하나로 넓게 찾음(_region · _tariff)
— 호표 줄에 바로 써도 품셈재료 간접 없이 풀림(PLAN 7-4b 뒤 절반)."""
if isinstance(ref, dict) and (ref.get("계약종별") == "입력" or ref.get("지역") == "입력"):
keys = (
_tariff(master, ref, ref, env)
if ref.get("계약종별") == "입력"
else _region(master, ref, ref, env, unit)
)
offers = [x for key in keys for x in _offers(master, key)]
return min(offers, key=lambda x: x[0]) if offers else (None, None)
if isinstance(ref, dict):
ref = pick(master, ref, env, unit)
row = master.get(ref)
@@ -216,7 +235,12 @@ def element(
link = row.get("연결")
if not link:
return None, None
keys = [link] if isinstance(link, str) else _candidates(master, ref, row, env)
if isinstance(link, str):
keys = [link]
elif link.get("계약종별") == "입력":
keys = _tariff(master, ref, link, env)
else:
keys = _region(master, ref, link, env, row["단위"])
offers = [x for key in keys for x in _offers(master, key)]
return min(offers, key=lambda x: x[0]) if offers else (None, None)
@@ -4296,7 +4296,7 @@
},
{
"종류": "재료",
"요소": "MP000082",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "규격": "M-Poxy I(습식)", "대표": "MT007705"},
"이름": "에폭시",
"단위": "kg",
"수량": "만약(방지망 == '포켓식', 찾기(QC000569, 구분='에폭시').수량, 0)",
@@ -95,7 +95,7 @@
},
{
"종류": "재료",
"요소": "MP000144",
"요소": {"구분": "철근·강재", "상세구분": "형강", "대표": "MT030619"},
"이름": "보조강재",
"단위": "㎏",
"수량": "만약(부재 == 'H형강부재', 찾기(QC001188, 재료='보조강재').H형강부재, 찾기(QC001188, 재료='보조강재').전용접부재)",
@@ -212,7 +212,7 @@
},
{
"종류": "재료",
"요소": "MP000148",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "대표": "MT030620"},
"이름": "FLUX",
"단위": "㎏",
"수량": "만약(용접방식 == '자동용접', 환산용접길이 * 찾기(QC001190, 재료='FLUX').자동용접, 0)",
@@ -1198,7 +1198,7 @@
},
{
"종류": "재료",
"요소": "MP000150",
"요소": {"구분": "단열·보온", "상세구분": "단열재", "대표": "MT030621"},
"이름": "질석",
"단위": "㎏",
"수량": "찾기(QC001208, 구분='질석').수량",
@@ -47,7 +47,7 @@
"호표": [
{
"종류": "재료",
"요소": "MP000095",
"요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "규격": "두께 2.0㎜ 이상", "대표": "MT030612"},
"이름": "BASECHANNEL 두께:2.0㎜이상",
"단위": "m",
"수량": "찾기(QC000012, 구분='BASECHANNEL', 종류=주자재종류).수량 * 손율 / 100",
@@ -55,7 +55,7 @@
},
{
"종류": "재료",
"요소": "MP000096",
"요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "규격": "두께 2.0㎜ 이상", "대표": "MT030613"},
"이름": "TOPCHANNEL 두께:2.0㎜이상",
"단위": "m",
"수량": "찾기(QC000012, 구분='TOPCHANNEL', 종류=주자재종류).수량 * 손율 / 100",
@@ -107,7 +107,7 @@
},
{
"종류": "재료",
"요소": "MP000101",
"요소": {"구분": "목재", "상세구분": "각재·판재", "규격": "1,200×2,400㎜", "대표": "MT030614"},
"이름": "내부PANEL (목재문) 1,200×2,400㎜",
"단위": "매",
"수량": "만약(종류 == '사무실', 찾기(QC000012, 구분='내부PANEL (목재문)', 종류=주자재종류).수량 * 손율 / 100, 0)",
@@ -291,7 +291,7 @@
"호표": [
{
"종류": "재료",
"요소": "MP000113",
"요소": {"구분": "기계·설비", "상세구분": "측정·시험기기", "대표": "MT030615"},
"이름": "축중계(이동식)",
"단위": "대",
"수량": "찾기(QC000018, 구분='손율', 기간=기간).값 / 100",
@@ -3954,7 +3954,7 @@
},
{
"종류": "재료",
"요소": "MP000129",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "대표": "MT030616"},
"이름": "보호막",
"단위": "㎡",
"수량": "찾기(QC000130, 구분='보호막').수량",
@@ -695,7 +695,7 @@
},
{
"종류": "재료",
"요소": "MP000201",
"요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "대표": "MT030626"},
"이름": "실리콘",
"단위": "㎏",
"수량": "찾기(QC001430, 구분='실리콘').수량",
@@ -838,7 +838,7 @@
},
{
"종류": "재료",
"요소": "MP000209",
"요소": {"구분": "기계·설비", "상세구분": "보일러·공조", "규격": "압접가열용", "대표": "MT030710"},
"이름": "버너 압접가열용",
"단위": "개",
"수량": "찾기(QC000648, 품명='버너', 레일규격=레일규격, 규격='압접가열용').수량",
@@ -847,7 +847,7 @@
},
{
"종류": "재료",
"요소": "MP000210",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "규격": "압접버너용", "대표": "MT030627"},
"이름": "노즐 압접버너용",
"단위": "개",
"수량": "찾기(QC000648, 품명='노즐', 레일규격=레일규격, 규격='압접버너용').수량",
@@ -858,7 +858,7 @@
"덧줄": [
{
"이름": "기타 소모품·재료비",
"식": "((찾기(QC000648, 품명='아세틸렌', 레일규격=레일규격).수량) * MT003163 + (찾기(QC000648, 품명='산소', 레일규격=레일규격, 규격='KSM 1101, 99.5%').수량 * 1000) * MT003165 + (찾기(QC000648, 품명='바퀴숫돌', 레일규격=레일규격, 규격='단면용 A36m B11호 A150×8×22 KSL 6501').수량) * MP000205 + (찾기(QC000648, 품명='바퀴숫돌', 레일규격=레일규격, 규격='측면용 A24 QWV1호 A205×25×25 KSL 6501').수량) * MP000206 + (찾기(QC000648, 품명='바퀴숫돌', 레일규격=레일규격, 규격='평면용 A24 QWV1호 A205×25×25 KSL 6501').수량) * MP000207 + (찾기(QC000648, 품명='바퀴숫돌', 레일규격=레일규격, 규격='최종용 A24 QWV 5호 A205×22×22').수량) * MP000208 + (찾기(QC000648, 품명='버너', 레일규격=레일규격, 규격='압접가열용').수량) * MP000209 + (찾기(QC000648, 품명='노즐', 레일규격=레일규격, 규격='압접버너용').수량) * MP000210) * 기타재료 / 100",
"식": "((찾기(QC000648, 품명='아세틸렌', 레일규격=레일규격).수량) * MT003163 + (찾기(QC000648, 품명='산소', 레일규격=레일규격, 규격='KSM 1101, 99.5%').수량 * 1000) * MT003165 + (찾기(QC000648, 품명='바퀴숫돌', 레일규격=레일규격, 규격='단면용 A36m B11호 A150×8×22 KSL 6501').수량) * MT030715 + (찾기(QC000648, 품명='바퀴숫돌', 레일규격=레일규격, 규격='측면용 A24 QWV1호 A205×25×25 KSL 6501').수량) * MT030716 + (찾기(QC000648, 품명='바퀴숫돌', 레일규격=레일규격, 규격='평면용 A24 QWV1호 A205×25×25 KSL 6501').수량) * MT030717 + (찾기(QC000648, 품명='바퀴숫돌', 레일규격=레일규격, 규격='최종용 A24 QWV 5호 A205×22×22').수량) * MT030718 + (찾기(QC000648, 품명='버너', 레일규격=레일규격, 규격='압접가열용').수량) * MT030710 + (찾기(QC000648, 품명='노즐', 레일규격=레일규격, 규격='압접버너용').수량) * MT030627) * 기타재료 / 100",
"비목": "재료비",
"출처": "건설품셈 토목 4-5-1 참고자료 주①"
}
@@ -914,7 +914,7 @@
},
{
"종류": "재료",
"요소": "MP000211",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "규격": "점화용", "대표": "MT030628"},
"이름": "테르밋용재 점화용",
"단위": "포",
"수량": "찾기(QC000650, 품명='테르밋용재', 레일규격=레일규격, 규격='점화용').수량",
@@ -923,7 +923,7 @@
},
{
"종류": "재료",
"요소": "MP000212",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "규격": "테르밋 용접용", "대표": "MT030629"},
"이름": "몰드",
"단위": "개",
"수량": "찾기(QC000650, 품명='몰드', 레일규격=레일규격).수량",
@@ -932,7 +932,7 @@
},
{
"종류": "재료",
"요소": "MP000213",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "규격": "테르밋 용접용", "대표": "MT030630"},
"이름": "골무",
"단위": "개",
"수량": "찾기(QC000650, 품명='골무', 레일규격=레일규격).수량",
@@ -941,7 +941,7 @@
},
{
"종류": "재료",
"요소": "MP000214",
"요소": {"구분": "전기·통신", "상세구분": "판넬·차단기", "규격": "테르밋 용접용", "대표": "MT030711"},
"이름": "퓨즈",
"단위": "개",
"수량": "찾기(QC000650, 품명='퓨즈', 레일규격=레일규격).수량",
@@ -970,7 +970,7 @@
"덧줄": [
{
"이름": "기타 소모품·재료비",
"식": "((찾기(QC000650, 품명='테르밋용재', 레일규격=레일규격, 규격='점화용').수량) * MP000211 + (찾기(QC000650, 품명='몰드', 레일규격=레일규격).수량) * MP000212 + (찾기(QC000650, 품명='골무', 레일규격=레일규격).수량) * MP000213 + (찾기(QC000650, 품명='퓨즈', 레일규격=레일규격).수량) * MP000214 + (찾기(QC000650, 품명='산소', 레일규격=레일규격).수량 * 1000) * MT003165 + (찾기(QC000650, 품명='프로판가스', 레일규격=레일규격).수량) * MT003176) * 기타재료 / 100",
"식": "((찾기(QC000650, 품명='테르밋용재', 레일규격=레일규격, 규격='점화용').수량) * MT030628 + (찾기(QC000650, 품명='몰드', 레일규격=레일규격).수량) * MT030629 + (찾기(QC000650, 품명='골무', 레일규격=레일규격).수량) * MT030630 + (찾기(QC000650, 품명='퓨즈', 레일규격=레일규격).수량) * MT030711 + (찾기(QC000650, 품명='산소', 레일규격=레일규격).수량 * 1000) * MT003165 + (찾기(QC000650, 품명='프로판가스', 레일규격=레일규격).수량) * MT003176) * 기타재료 / 100",
"비목": "재료비",
"출처": "건설품셈 토목 4-5-2 참고자료 주①"
}
@@ -199,7 +199,7 @@
},
{
"종류": "재료",
"요소": "MP000076",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "규격": "화이버/펄프류", "대표": "MT030610"},
"이름": "피복제(화이버/펄프류)",
"단위": "㎏",
"수량": "찾기(QC000274, 구분='피복제').수량 / 100",
@@ -208,7 +208,7 @@
},
{
"종류": "재료",
"요소": "MP000077",
"요소": {"구분": "식생·종자", "상세구분": "비료·토양개량", "규격": "합성접착제", "대표": "MT030611"},
"이름": "침식방지안정제(합성접착제)",
"단위": "㎏",
"수량": "안정제량 / 100",
@@ -217,7 +217,7 @@
},
{
"종류": "재료",
"요소": "MP000078",
"요소": {"구분": "도료·방수·접착", "상세구분": "접착·혼화", "규격": "색소(M-Green)", "대표": "MT006740"},
"이름": "색소(착색제)",
"단위": "㎏",
"수량": "찾기(QC000274, 구분='색소').수량 / 100",
@@ -137,7 +137,7 @@
"덧줄": [
{
"이름": "잡품·기타",
"식": "(찾기(QC000664, 품명='용접봉').수량 * MP000215 + 찾기(QC000664, 품명='산소').수량 * 1000 * MT003165 + 찾기(QC000664, 품명='LPG가스').수량 * MT003176) * 잡품 / 100",
"식": "(찾기(QC000664, 품명='용접봉').수량 * MT003191 + 찾기(QC000664, 품명='산소').수량 * 1000 * MT003165 + 찾기(QC000664, 품명='LPG가스').수량 * MT003176) * 잡품 / 100",
"비목": "재료비",
"출처": "건설품셈 토목 5-1-3 주②"
}
@@ -164,7 +164,7 @@
},
{
"종류": "재료",
"요소": "MP000216",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030631"},
"이름": "철구(Shot ball)",
"단위": "㎏",
"수량": "찾기(QC000665, 구분='철구(Shot ball)').수량",
@@ -204,7 +204,7 @@
},
{
"종류": "재료",
"요소": "MP000218",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030632"},
"이름": "철편(Grit)",
"단위": "㎏",
"수량": "찾기(QC000666, 구분='철편(Grit)').수량",
@@ -2402,7 +2402,7 @@
},
{
"종류": "재료",
"요소": "MP000134",
"요소": {"구분": "시멘트·골재", "상세구분": "골재", "대표": "MT030617"},
"이름": "모래주머니",
"단위": "개",
"수량": "찾기(QC000334, 구분='육상부설').모래주머니 / 100",
@@ -5355,7 +5355,7 @@
},
{
"종류": "재료",
"요소": "MP000139",
"요소": {"구분": "관·이음관", "상세구분": "PE관", "규격": "2∼2.5㎜", "대표": "MT030618"},
"이름": "HDPE 시트",
"단위": "㎡",
"수량": "만약(재료 == 'HDPE시트', 찾기(QC000399, 구분='HDPE 시트').수량, 0)",
@@ -1122,7 +1122,7 @@
},
{
"종류": "재료",
"요소": "MP000169",
"요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "대표": "MT030622"},
"이름": "정배지",
"단위": "㎡",
"수량": "찾기(QC001269, 바탕면=바탕면).정배지",
@@ -1502,7 +1502,7 @@
},
{
"종류": "재료",
"요소": "MP000172",
"요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "대표": "MT030623"},
"이름": "알루미늄핀",
"단위": "개",
"수량": "찾기(QC001278, 구분='알루미늄핀').수량",
@@ -1873,7 +1873,7 @@
},
{
"종류": "재료",
"요소": "MP000176",
"요소": {"구분": "철근·강재", "상세구분": "철망·와이어메쉬", "대표": "MT030624"},
"이름": "표준보강메시",
"단위": "㎡",
"수량": "찾기(QC001288, 구분='외벽단열').표준보강메시",
@@ -1946,7 +1946,7 @@
},
{
"종류": "재료",
"요소": "MP000177",
"요소": {"구분": "철근·강재", "상세구분": "철망·와이어메쉬", "대표": "MT030625"},
"이름": "고강도메시",
"단위": "㎡",
"수량": "찾기(QC001288, 구분='하부보강').고강도메시",
@@ -2078,7 +2078,7 @@
},
{
"이름": "잡재료",
"식": "(찾기(QC000707).IV전선 * MP000202 + 찾기(QC000707).백열등 * MP000203) * 2 / 100",
"식": "(찾기(QC000707).IV전선 * MT030714 + 찾기(QC000707).백열등 * MT008751) * 2 / 100",
"비목": "재료비",
"출처": "건설품셈 토목 6-7-5 주⑤"
}
@@ -1189,7 +1189,7 @@
},
{
"종류": "재료",
"요소": "MP000004",
"요소": {"이름": "모래", "규격": "", "지역": "입력"},
"이름": "구멍땜 모래",
"단위": "㎥",
"수량": "구멍땜 * 찾기(QC000430).모래 / 100",
@@ -2463,7 +2463,7 @@
},
{
"이름": "잡재료 및 소모재료",
"식": "MP000094 * 5 / 100",
"식": "MT030713 * 5 / 100",
"비목": "재료비",
"출처": "건설품셈 공통 6-4-1 주④"
}
@@ -3021,7 +3021,7 @@
},
{
"이름": "잡재료 및 소모재료",
"식": "MP000094 * 5 / 100",
"식": "MT030713 * 5 / 100",
"비목": "재료비",
"출처": "건설품셈 공통 6-4-2 주④"
}
@@ -340,7 +340,7 @@
},
{
"종류": "재료",
"요소": "MP000363",
"요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "규격": "336×1,000×3㎜", "대표": "MT030705"},
"이름": "아스팔트싱글",
"단위": "매",
"수량": "찾기(QC001317, 구분='아스팔트싱글', 규격='336×1.000×3㎜').수량",
@@ -337,7 +337,7 @@
},
{
"종류": "재료",
"요소": "MP000235",
"요소": {"구분": "기계·설비", "상세구분": "측정·시험기기", "규격": "표준관입시험용", "대표": "MT030636"},
"이름": "슈",
"단위": "개",
"수량": "찾기(QC000779, 종별='슈').수량",
@@ -531,7 +531,7 @@
},
{
"종류": "재료",
"요소": "MP000239",
"요소": {"구분": "기계·설비", "상세구분": "측정·시험기기", "규격": "ø16×750", "대표": "MT030637"},
"이름": "베인 전용로드",
"단위": "본",
"수량": "찾기(QC000780, 종별='재료비', 세목='전용로드(ø16×750)').수량",
@@ -540,7 +540,7 @@
},
{
"종류": "재료",
"요소": "MP000240",
"요소": {"구분": "기계·설비", "상세구분": "측정·시험기기", "규격": "ø40.5×1m", "대표": "MT030638"},
"이름": "로드",
"단위": "본",
"수량": "찾기(QC000780, 종별='재료비', 세목='로드(ø40.5×1m)').수량",
@@ -596,7 +596,7 @@
},
{
"종류": "재료",
"요소": "MP000241",
"요소": {"구분": "기계·설비", "상세구분": "측정·시험기기", "규격": "평판재하시험용", "대표": "MT030639"},
"이름": "표준사",
"단위": "㎏",
"수량": "찾기(QC000782, 종별='표준사').수량",
@@ -685,7 +685,7 @@
},
{
"종류": "재료",
"요소": "MP000242",
"요소": {"구분": "기계·설비", "상세구분": "측정·시험기기", "규격": "정재하시험용", "대표": "MT030640"},
"이름": "단독콘",
"단위": "개",
"수량": "찾기(QC000785, 종별='단독콘').수량",
@@ -270,7 +270,7 @@
},
{
"종류": "재료",
"요소": "MP000216",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030631"},
"이름": "steel shot",
"단위": "㎏",
"수량": "만약(구분 == 'Shot Blast', 강구수량, 0)",
@@ -289,7 +289,7 @@
},
{
"종류": "재료",
"요소": "MP000220",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030633"},
"이름": "동력 Brush",
"단위": "개",
"수량": "만약(구분 == 'Power Tool', 0.03, 0)",
@@ -307,7 +307,7 @@
},
{
"종류": "재료",
"요소": "MP000221",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030634"},
"이름": "Wire Brush",
"단위": "개",
"수량": "만약(구분 == 'Wire Brush', 0.016, 0)",
@@ -60,7 +60,7 @@
},
{
"종류": "재료",
"요소": "MP000004",
"요소": {"이름": "모래", "규격": "", "지역": "입력"},
"이름": "모래",
"단위": "㎥",
"수량": "찾기(QC001347, 배합용적비=배합용적비).모래",
@@ -533,7 +533,7 @@
},
{
"종류": "재료",
"요소": "MP000004",
"요소": {"이름": "모래", "규격": "", "지역": "입력"},
"이름": "모래",
"단위": "㎥",
"수량": "찾기(QC001358, 구분='모래').수량",
@@ -233,7 +233,7 @@
},
{
"종류": "재료",
"요소": "MP000223",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030635"},
"이름": "컴파운드",
"단위": "g",
"수량": "만약(규격 == 'ø20', 찾기(QC001578, '구경(㎜)'='ø20').컴파운드, 만약(규격 == '25', 찾기(QC001578, '구경(㎜)'='25').컴파운드, 만약(규격 == '32', 찾기(QC001578, '구경(㎜)'='30').컴파운드, 만약(규격 == '40', 찾기(QC001578, '구경(㎜)'='40').컴파운드, 찾기(QC001578, '구경(㎜)'='50').컴파운드))))",
@@ -516,7 +516,7 @@
},
{
"종류": "재료",
"요소": "MP000223",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030635"},
"이름": "컴파운드",
"단위": "g",
"수량": "찾기(QC001583, '구경(㎜)'='컴파운드(g)', 항목=만약(구분 == 'ø15㎜', 'ø15', 'ø20∼25')).수량",
@@ -2415,7 +2415,7 @@
},
{
"종류": "재료",
"요소": "MP000358",
"요소": {"이름": "전력량요금", "계약종별": "입력"},
"이름": "전력",
"단위": "㎾h",
"수량": "찾기(QC001638, '두께(㎜)'=두께, '자세 및 직종'=자세, 구분='소요전력(㎾h)').수량",
@@ -2521,7 +2521,7 @@
},
{
"종류": "재료",
"요소": "MP000358",
"요소": {"이름": "전력량요금", "계약종별": "입력"},
"이름": "전력",
"단위": "㎾h",
"수량": "찾기(QC001641, '두께(㎜)'=두께, '자세 및 직종'=자세, 구분='전력소비량(㎾h)').수량",
@@ -2635,7 +2635,7 @@
},
{
"종류": "재료",
"요소": "MP000358",
"요소": {"이름": "전력량요금", "계약종별": "입력"},
"이름": "전력",
"단위": "㎾h",
"수량": "찾기(QC001642, '두께(㎜)'=두께, '자세 및 직종'=자세, 구분='소요전력(㎾h)').수량",
@@ -2744,7 +2744,7 @@
},
{
"종류": "재료",
"요소": "MP000358",
"요소": {"이름": "전력량요금", "계약종별": "입력"},
"이름": "전력",
"단위": "㎾h",
"수량": "찾기(QC001639, '자세 및 직종 두께(㎜)'=두께, 구분=만약(용접면 == '하향한면', '하향한면 용접', '하향양면 용접')).'소요전력(㎾h)'",
@@ -2853,7 +2853,7 @@
},
{
"종류": "재료",
"요소": "MP000358",
"요소": {"이름": "전력량요금", "계약종별": "입력"},
"이름": "전력",
"단위": "㎾h",
"수량": "찾기(QC001640, '자세 및 직종 두께(㎜)'=두께, 구분=만약(용접면 == '하향한면', '하향한면 용접', '하향양면 용접')).'소요전력(㎾h)'",
@@ -3195,7 +3195,7 @@
},
{
"종류": "재료",
"요소": "MP000250",
"요소": {"구분": "콘크리트제품", "상세구분": "경계석·블록", "대표": "MT030641"},
"이름": "Lagging Sheet",
"단위": "㎡",
"수량": "만약(보온두께 == '30mm이하', 찾기(QC001650, 'Pipe Size mm'=관경, 구분='직관의물량').'Lagging Sheet', 만약(보온두께 == '31mm∼40mm', 찾기(QC001651, 'Pipe Size mm'=관경, 구분='직관의물량').'Lagging Sheet', 만약(보온두께 == '41mm∼60mm', 찾기(QC001652, 'Pipe Size mm'=관경, 구분='직관의물량').'Lagging Sheet', 만약(보온두께 == '61mm∼75mm', 찾기(QC001653, 'Pipe Size mm'=관경, 구분='직관의물량').'Lagging Sheet', 찾기(QC001654, 'Pipe Size mm'=관경, 구분='직관의물량').'Lagging Sheet')))) * 만약(부위 == '관(m당)', 1, 0)",
@@ -7763,7 +7763,7 @@
},
{
"종류": "재료",
"요소": "MP000253",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030642"},
"이름": "코크스",
"단위": "㎏",
"수량": "9",
@@ -7772,7 +7772,7 @@
},
{
"종류": "재료",
"요소": "MP000254",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "각종", "대표": "MT030643"},
"이름": "Sand Paper",
"단위": "Sh",
"수량": "3.125",
@@ -7781,7 +7781,7 @@
},
{
"종류": "재료",
"요소": "MP000255",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "14\"×14〃", "대표": "MT030644"},
"이름": "여과기",
"단위": "Sh",
"수량": "3",
@@ -7799,7 +7799,7 @@
},
{
"종류": "재료",
"요소": "MP000257",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "C-3", "대표": "MT030645"},
"이름": "세유",
"단위": "ℓ",
"수량": "2.2",
@@ -7808,7 +7808,7 @@
},
{
"종류": "재료",
"요소": "MP000258",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030646"},
"이름": "Grease",
"단위": "㎏",
"수량": "0.2",
@@ -7817,7 +7817,7 @@
},
{
"종류": "재료",
"요소": "MP000259",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030647"},
"이름": "Machine oil",
"단위": "ℓ",
"수량": "0.7",
@@ -7826,7 +7826,7 @@
},
{
"종류": "재료",
"요소": "MP000260",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030648"},
"이름": "Gasoline",
"단위": "ℓ",
"수량": "0.24",
@@ -7835,7 +7835,7 @@
},
{
"종류": "재료",
"요소": "MP000261",
"요소": {"구분": "철근·강재", "상세구분": "철선", "규격": "#8∼#16", "대표": "MT030649"},
"이름": "Galvanized wire",
"단위": "㎏",
"수량": "0.5",
@@ -7844,7 +7844,7 @@
},
{
"종류": "재료",
"요소": "MP000262",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "8\"ø×25m/m t", "대표": "MT030650"},
"이름": "Grinding Wheel",
"단위": "EA",
"수량": "0.375",
@@ -7871,7 +7871,7 @@
},
{
"종류": "재료",
"요소": "MP000265",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030651"},
"이름": "보일유",
"단위": "ℓ",
"수량": "0.008",
@@ -8178,7 +8178,7 @@
},
{
"종류": "재료",
"요소": "MP000269",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "0∼3", "대표": "MT030652"},
"이름": "세유",
"단위": "ℓ",
"수량": "0.73",
@@ -8187,7 +8187,7 @@
},
{
"종류": "재료",
"요소": "MP000260",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030648"},
"이름": "Gasoline",
"단위": "ℓ",
"수량": "0.73",
@@ -8196,7 +8196,7 @@
},
{
"종류": "재료",
"요소": "MP000265",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030651"},
"이름": "보일유",
"단위": "ℓ",
"수량": "0.069",
@@ -8205,7 +8205,7 @@
},
{
"종류": "재료",
"요소": "MP000259",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030647"},
"이름": "Machine oil",
"단위": "ℓ",
"수량": "0.365",
@@ -8214,7 +8214,7 @@
},
{
"종류": "재료",
"요소": "MP000258",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030646"},
"이름": "Grease",
"단위": "㎏",
"수량": "0.175",
@@ -8232,7 +8232,7 @@
},
{
"종류": "재료",
"요소": "MP000261",
"요소": {"구분": "철근·강재", "상세구분": "철선", "규격": "#8∼#16", "대표": "MT030649"},
"이름": "Galvanized wire",
"단위": "㎏",
"수량": "0.73",
@@ -8241,7 +8241,7 @@
},
{
"종류": "재료",
"요소": "MP000271",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "각종 3/8∼1.6\"", "대표": "MT030653"},
"이름": "Wire brush",
"단위": "EA",
"수량": "0.292",
@@ -8250,7 +8250,7 @@
},
{
"종류": "재료",
"요소": "MP000272",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "12\"", "대표": "MT030654"},
"이름": "Hack saw blade",
"단위": "EA",
"수량": "0.438",
@@ -8259,7 +8259,7 @@
},
{
"종류": "재료",
"요소": "MP000273",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "규격": "1.6ø∼3.8ø", "대표": "MT030655"},
"이름": "Drill",
"단위": "㎏",
"수량": "0.018",
@@ -8268,7 +8268,7 @@
},
{
"종류": "재료",
"요소": "MP000274",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "8\"ø∼25m/m t", "대표": "MT030656"},
"이름": "Grinder wheel",
"단위": "㎏",
"수량": "0.022",
@@ -8277,7 +8277,7 @@
},
{
"종류": "재료",
"요소": "MP000275",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "각종", "대표": "MT030657"},
"이름": "File",
"단위": "㎏",
"수량": "0.218",
@@ -8286,7 +8286,7 @@
},
{
"종류": "재료",
"요소": "MP000276",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "각종(황, 중, 세)", "대표": "MT030658"},
"이름": "Oil stone",
"단위": "Sh",
"수량": "0.055",
@@ -8295,7 +8295,7 @@
},
{
"종류": "재료",
"요소": "MP000253",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030642"},
"이름": "코크스",
"단위": "㎏",
"수량": "0.328",
@@ -8360,7 +8360,7 @@
},
{
"종류": "재료",
"요소": "MP000280",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030659"},
"이름": "Sand Paper",
"단위": "Sh",
"수량": "0.11",
@@ -8369,7 +8369,7 @@
},
{
"종류": "재료",
"요소": "MP000281",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030660"},
"이름": "광목",
"단위": "m",
"수량": "0.402",
@@ -8423,7 +8423,7 @@
},
{
"종류": "재료",
"요소": "MP000285",
"요소": {"구분": "잡재료", "상세구분": "고철·기타금속", "규격": "Sn 30%", "대표": "MT001252"},
"이름": "땜납",
"단위": "㎏",
"수량": "0.055",
@@ -8432,7 +8432,7 @@
},
{
"종류": "재료",
"요소": "MP000286",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "대표": "MT030661"},
"이름": "붕사",
"단위": "㎏",
"수량": "0.016",
@@ -8441,7 +8441,7 @@
},
{
"종류": "재료",
"요소": "MP000287",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "절연용", "대표": "MT030662"},
"이름": "Compound",
"단위": "㎏",
"수량": "0.073",
@@ -8450,7 +8450,7 @@
},
{
"종류": "재료",
"요소": "MP000288",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "밀착제 No.2", "대표": "MT030663"},
"이름": "3-Bond",
"단위": "㎏",
"수량": "0.007",
@@ -8736,7 +8736,7 @@
},
{
"종류": "재료",
"요소": "MP000004",
"요소": {"이름": "모래", "규격": "", "지역": "입력"},
"이름": "모래",
"단위": "㎥",
"수량": "0.262",
@@ -8745,7 +8745,7 @@
},
{
"종류": "재료",
"요소": "MP000290",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030664"},
"이름": "Nozzle",
"단위": "개",
"수량": "0.5",
@@ -8763,7 +8763,7 @@
},
{
"종류": "재료",
"요소": "MP000358",
"요소": {"이름": "전력량요금", "계약종별": "입력"},
"이름": "전력",
"단위": "㎾h",
"수량": "370",
@@ -9041,7 +9041,7 @@
},
{
"종류": "재료",
"요소": "MP000004",
"요소": {"이름": "모래", "규격": "", "지역": "입력"},
"이름": "모래",
"단위": "㎥",
"수량": "0.242",
@@ -9050,7 +9050,7 @@
},
{
"종류": "재료",
"요소": "MP000290",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030664"},
"이름": "Nozzle",
"단위": "개",
"수량": "0.5",
@@ -9068,7 +9068,7 @@
},
{
"종류": "재료",
"요소": "MP000358",
"요소": {"이름": "전력량요금", "계약종별": "입력"},
"이름": "전력",
"단위": "㎾h",
"수량": "310",
@@ -9373,7 +9373,7 @@
},
{
"종류": "재료",
"요소": "MP000253",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030642"},
"이름": "코크스",
"단위": "㎏",
"수량": "27",
@@ -9710,7 +9710,7 @@
},
{
"종류": "재료",
"요소": "MP000253",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030642"},
"이름": "코크스",
"단위": "㎏",
"수량": "27",
@@ -10289,7 +10289,7 @@
},
{
"종류": "재료",
"요소": "MP000004",
"요소": {"이름": "모래", "규격": "", "지역": "입력"},
"이름": "모래",
"단위": "㎥",
"수량": "0.242",
@@ -10298,7 +10298,7 @@
},
{
"종류": "재료",
"요소": "MP000290",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030664"},
"이름": "Nozzle",
"단위": "개",
"수량": "0.5",
@@ -10316,7 +10316,7 @@
},
{
"종류": "재료",
"요소": "MP000358",
"요소": {"이름": "전력량요금", "계약종별": "입력"},
"이름": "전력",
"단위": "㎾h",
"수량": "306",
@@ -10552,7 +10552,7 @@
},
{
"종류": "재료",
"요소": "MP000293",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030665"},
"이름": "세유",
"단위": "ℓ",
"수량": "3",
@@ -10799,7 +10799,7 @@
},
{
"종류": "재료",
"요소": "MP000294",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "대표": "MT030666"},
"이름": "전기용접",
"단위": "㎏",
"수량": "9.77",
@@ -10808,7 +10808,7 @@
},
{
"종류": "재료",
"요소": "MP000295",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "대표": "MT030667"},
"이름": "탄소봉",
"단위": "본",
"수량": "3.67",
@@ -10836,7 +10836,7 @@
},
{
"종류": "재료",
"요소": "MP000296",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "규격": "12\"ø", "대표": "MT030668"},
"이름": "Grinder",
"단위": "개",
"수량": "0.815",
@@ -10845,7 +10845,7 @@
},
{
"종류": "재료",
"요소": "MP000297",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "65×305", "대표": "MT030669"},
"이름": "돌",
"단위": "매",
"수량": "4.9",
@@ -10854,7 +10854,7 @@
},
{
"종류": "재료",
"요소": "MP000298",
"요소": {"구분": "기계·설비", "상세구분": "측정·시험기기", "규격": "2회", "대표": "MT030670"},
"이름": "Film",
"단위": "㎏",
"수량": "405",
@@ -11064,7 +11064,7 @@
},
{
"종류": "재료",
"요소": "MP000299",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "규격": "8ø×350㎜", "대표": "MT030671"},
"이름": "탄소봉",
"단위": "본",
"수량": "6",
@@ -11082,7 +11082,7 @@
},
{
"종류": "재료",
"요소": "MP000359",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030704"},
"이름": "중유",
"단위": "ℓ",
"수량": "0.023",
@@ -11091,7 +11091,7 @@
},
{
"종류": "재료",
"요소": "MP000301",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030672"},
"이름": "노즐",
"단위": "개",
"수량": "0.38",
@@ -11118,7 +11118,7 @@
},
{
"종류": "재료",
"요소": "MP000302",
"요소": {"구분": "도료·방수·접착", "상세구분": "접착·혼화", "대표": "MT030673"},
"이름": "탈에폭시레신",
"단위": "ℓ",
"수량": "2.05",
@@ -11318,7 +11318,7 @@
},
{
"종류": "재료",
"요소": "MP000299",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "규격": "8ø×350㎜", "대표": "MT030671"},
"이름": "탄소봉",
"단위": "본",
"수량": "3.53",
@@ -11346,7 +11346,7 @@
},
{
"종류": "재료",
"요소": "MP000303",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "12\"ø", "대표": "MT030674"},
"이름": "그라인더돌",
"단위": "개",
"수량": "0.5",
@@ -11355,7 +11355,7 @@
},
{
"종류": "재료",
"요소": "MP000304",
"요소": {"구분": "기계·설비", "상세구분": "측정·시험기기", "규격": "65×305", "대표": "MT030675"},
"이름": "Film",
"단위": "매",
"수량": "4.8",
@@ -11364,7 +11364,7 @@
},
{
"종류": "재료",
"요소": "MP000305",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "대표": "MT030676"},
"이름": "Tar epoxy",
"단위": "ℓ",
"수량": "1.81",
@@ -11373,7 +11373,7 @@
},
{
"종류": "재료",
"요소": "MP000306",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "대표": "MT030677"},
"이름": "마린B/T(선박도로용)",
"단위": "ℓ",
"수량": "0.96",
@@ -11644,7 +11644,7 @@
},
{
"종류": "재료",
"요소": "MP000359",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030704"},
"이름": "중유",
"단위": "D/M",
"수량": "0.0018",
@@ -11653,7 +11653,7 @@
},
{
"종류": "재료",
"요소": "MP000301",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030672"},
"이름": "노즐",
"단위": "개",
"수량": "0.037",
@@ -11662,7 +11662,7 @@
},
{
"종류": "재료",
"요소": "MP000308",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "규격": "15μ", "대표": "MT030678"},
"이름": "Zinc primer",
"단위": "㎏",
"수량": "0.14",
@@ -11671,7 +11671,7 @@
},
{
"종류": "재료",
"요소": "MP000309",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "규격": "125μ", "대표": "MT030679"},
"이름": "Tar Epoxy",
"단위": "㎾h",
"수량": "550",
@@ -11680,7 +11680,7 @@
},
{
"종류": "재료",
"요소": "MP000303",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "12\"ø", "대표": "MT030674"},
"이름": "그라인더돌",
"단위": "개",
"수량": "0.3",
@@ -11903,7 +11903,7 @@
},
{
"종류": "재료",
"요소": "MP000310",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "규격": "2회", "대표": "MT030680"},
"이름": "Tar Epoxy",
"단위": "ℓ",
"수량": "0.536",
@@ -12565,7 +12565,7 @@
},
{
"종류": "재료",
"요소": "MP000314",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "규격": "1/4\"", "대표": "MT030681"},
"이름": "drill",
"단위": "개",
"수량": "0.96",
@@ -12574,7 +12574,7 @@
},
{
"종류": "재료",
"요소": "MP000315",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "규격": "11/15\"", "대표": "MT030682"},
"이름": "drill",
"단위": "개",
"수량": "0.96",
@@ -12865,7 +12865,7 @@
},
{
"종류": "재료",
"요소": "MP000359",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030704"},
"이름": "중유",
"단위": "D/M",
"수량": "0.019",
@@ -12874,7 +12874,7 @@
},
{
"종류": "재료",
"요소": "MP000301",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030672"},
"이름": "노즐",
"단위": "개",
"수량": "0.4",
@@ -12883,7 +12883,7 @@
},
{
"종류": "재료",
"요소": "MP000308",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "규격": "15μ", "대표": "MT030678"},
"이름": "Zinc primer",
"단위": "ℓ",
"수량": "0.36",
@@ -12892,7 +12892,7 @@
},
{
"종류": "재료",
"요소": "MP000309",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "규격": "125μ", "대표": "MT030679"},
"이름": "Tar Epoxy",
"단위": "㎾h",
"수량": "420",
@@ -12901,7 +12901,7 @@
},
{
"종류": "재료",
"요소": "MP000303",
"요소": {"구분": "잡재료", "상세구분": "소모품", "규격": "12\"ø", "대표": "MT030674"},
"이름": "그라인더돌",
"단위": "개",
"수량": "0.33",
@@ -13299,7 +13299,7 @@
},
{
"종류": "재료",
"요소": "MP000319",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "규격": "1회도장", "대표": "MT030683"},
"이름": "Tar Epoxy",
"단위": "ℓ",
"수량": "7.06",
@@ -18133,7 +18133,7 @@
},
{
"종류": "재료",
"요소": "MP000293",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030665"},
"이름": "세유",
"단위": "ℓ",
"수량": "2",
@@ -18142,7 +18142,7 @@
},
{
"종류": "재료",
"요소": "MP000258",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030646"},
"이름": "Grease",
"단위": "㎏",
"수량": "0.2",
@@ -18151,7 +18151,7 @@
},
{
"종류": "재료",
"요소": "MP000259",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030647"},
"이름": "Machine oil",
"단위": "ℓ",
"수량": "0.7",
@@ -19094,7 +19094,7 @@
},
{
"종류": "재료",
"요소": "MP000293",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030665"},
"이름": "세유",
"단위": "ℓ",
"수량": "(만약(공사 == '기기', 0.73, 만약(공사 == '철골', 0.07, 만약(공사 == '배관', 0.07, 만약(공사 == 'Belt & Conveyor', 0.2, 만약(공사 == 'Heater & Tank', 0.05, 만약(공사 == 'Pump & Fan', 0.73, 만약(공사 == 'Crane 류', 2, 0))))))))",
@@ -19103,7 +19103,7 @@
},
{
"종류": "재료",
"요소": "MP000325",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030684"},
"이름": "M/C OIL",
"단위": "ℓ",
"수량": "(만약(공사 == '기기', 0.365, 만약(공사 == '철골', 0.04, 만약(공사 == '배관', 4.6, 만약(공사 == 'Belt & Conveyor', 0.1, 만약(공사 == 'Heater & Tank', 0.02, 만약(공사 == 'Pump & Fan', 0.36, 만약(공사 == 'Crane 류', 0.7, 0))))))))",
@@ -19112,7 +19112,7 @@
},
{
"종류": "재료",
"요소": "MP000221",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030634"},
"이름": "Wire Brush",
"단위": "EA",
"수량": "(만약(공사 == '기기', 0.292, 만약(공사 == '철골', 0.15, 만약(공사 == '배관', 0.05, 만약(공사 == 'Belt & Conveyor', 0.1, 만약(공사 == 'Heater & Tank', 0.1, 만약(공사 == 'Pump & Fan', 0.3, 만약(공사 == 'Crane 류', 0.1, 0))))))))",
@@ -19121,7 +19121,7 @@
},
{
"종류": "재료",
"요소": "MP000326",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030685"},
"이름": "Grinder Wheel",
"단위": "매",
"수량": "(만약(공사 == '기기', 0.022, 만약(공사 == '철골', 0.05, 만약(공사 == '배관', 0.05, 만약(공사 == 'Belt & Conveyor', 0.05, 만약(공사 == 'Heater & Tank', 0.05, 만약(공사 == 'Pump & Fan', 0.02, 만약(공사 == 'Crane 류', 0.05, 0))))))))",
@@ -19130,7 +19130,7 @@
},
{
"종류": "재료",
"요소": "MP000327",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030686"},
"이름": "Oil Stone",
"단위": "개",
"수량": "(만약(공사 == '기기', 0.055, 만약(공사 == '철골', 0.02, 만약(공사 == '배관', 0.05, 만약(공사 == 'Belt & Conveyor', 0.02, 만약(공사 == 'Heater & Tank', 0.02, 만약(공사 == 'Pump & Fan', 0.15, 만약(공사 == 'Crane 류', 0.02, 0))))))))",
@@ -19139,7 +19139,7 @@
},
{
"종류": "재료",
"요소": "MP000328",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030687"},
"이름": "File",
"단위": "개",
"수량": "(만약(공사 == '기기', 0.218, 만약(공사 == '철골', 0.2, 만약(공사 == '배관', 0.1, 만약(공사 == 'Belt & Conveyor', 0.1, 만약(공사 == 'Heater & Tank', 0.1, 만약(공사 == 'Pump & Fan', 0.2, 만약(공사 == 'Crane 류', 0.1, 0))))))))",
@@ -19157,7 +19157,7 @@
},
{
"종류": "재료",
"요소": "MP000330",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030688"},
"이름": "Drill",
"단위": "개",
"수량": "(만약(공사 == '기기', 0.018, 만약(공사 == '철골', 0.04, 만약(공사 == '배관', 0.02, 만약(공사 == 'Belt & Conveyor', 0.02, 만약(공사 == 'Heater & Tank', 0.02, 만약(공사 == 'Pump & Fan', 0.02, 만약(공사 == 'Crane 류', 0.02, 0))))))))",
@@ -19166,7 +19166,7 @@
},
{
"종류": "재료",
"요소": "MP000258",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030646"},
"이름": "Grease",
"단위": "㎏",
"수량": "(만약(공사 == '기기', 0.175, 만약(공사 == '철골', 0.05, 만약(공사 == '배관', 0.02, 만약(공사 == 'Belt & Conveyor', 0.05, 만약(공사 == 'Heater & Tank', 0.05, 만약(공사 == 'Pump & Fan', 0.2, 만약(공사 == 'Crane 류', 0.2, 0))))))))",
@@ -19220,7 +19220,7 @@
},
{
"종류": "재료",
"요소": "MP000334",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030689"},
"이름": "Compound",
"단위": "㎏",
"수량": "(만약(공사 == '기기', 0.073, 만약(공사 == '철골', 0.05, 만약(공사 == '배관', 0.07, 만약(공사 == 'Belt & Conveyor', 0.05, 만약(공사 == 'Heater & Tank', 0.05, 만약(공사 == 'Pump & Fan', 0.073, 만약(공사 == 'Crane 류', 0.05, 0))))))))",
@@ -19229,7 +19229,7 @@
},
{
"종류": "재료",
"요소": "MP000335",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030690"},
"이름": "3-Bond",
"단위": "㎏",
"수량": "(만약(공사 == '기기', 0.007, 만약(공사 == '철골', 0.05, 만약(공사 == '배관', 0.07, 만약(공사 == 'Belt & Conveyor', 0.05, 만약(공사 == 'Heater & Tank', 0.05, 만약(공사 == 'Pump & Fan', 0.07, 만약(공사 == 'Crane 류', 0.05, 0))))))))",
@@ -19238,7 +19238,7 @@
},
{
"종류": "재료",
"요소": "MP000336",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030691"},
"이름": "Seal Tape",
"단위": "통",
"수량": "(만약(공사 == '기기', 0.1, 만약(공사 == '철골', 0.1, 만약(공사 == '배관', 0.87, 만약(공사 == 'Belt & Conveyor', 0.1, 만약(공사 == 'Heater & Tank', 0.1, 만약(공사 == 'Pump & Fan', 0.1, 만약(공사 == 'Crane 류', 0.1, 0))))))))",
@@ -19247,7 +19247,7 @@
},
{
"종류": "재료",
"요소": "MP000337",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030692"},
"이름": "백묵",
"단위": "통",
"수량": "(만약(공사 == '기기', 0.1, 만약(공사 == '철골', 0.2, 만약(공사 == '배관', 0.1, 만약(공사 == 'Belt & Conveyor', 0.15, 만약(공사 == 'Heater & Tank', 0.15, 만약(공사 == 'Pump & Fan', 0.15, 만약(공사 == 'Crane 류', 0.15, 0))))))))",
@@ -19256,7 +19256,7 @@
},
{
"종류": "재료",
"요소": "MP000338",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030693"},
"이름": "석필",
"단위": "통",
"수량": "(만약(공사 == '기기', 0.2, 만약(공사 == '철골', 0.3, 만약(공사 == '배관', 0.2, 만약(공사 == 'Belt & Conveyor', 0.2, 만약(공사 == 'Heater & Tank', 0.2, 만약(공사 == 'Pump & Fan', 0.2, 만약(공사 == 'Crane 류', 0.2, 0))))))))",
@@ -19278,7 +19278,7 @@
},
{
"종류": "재료",
"요소": "MP000340",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030694"},
"이름": "흑 Welder Glass",
"단위": "연",
"수량": "(만약(공사 == '기기', 0.01, 만약(공사 == '철골', 0.05, 만약(공사 == '배관', 0.01, 만약(공사 == 'Belt & Conveyor', 0.01, 만약(공사 == 'Heater & Tank', 0.01, 만약(공사 == 'Pump & Fan', 0.01, 만약(공사 == 'Crane 류', 0.01, 0))))))))",
@@ -19287,7 +19287,7 @@
},
{
"종류": "재료",
"요소": "MP000341",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030695"},
"이름": "백 Welder Glass",
"단위": "연",
"수량": "(만약(공사 == '기기', 0.1, 만약(공사 == '철골', 0.2, 만약(공사 == '배관', 0.1, 만약(공사 == 'Belt & Conveyor', 0.2, 만약(공사 == 'Heater & Tank', 0.2, 만약(공사 == 'Pump & Fan', 0.1, 만약(공사 == 'Crane 류', 0.2, 0))))))))",
@@ -19296,7 +19296,7 @@
},
{
"종류": "재료",
"요소": "MP000342",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030696"},
"이름": "오스터날",
"단위": "SET",
"수량": "(만약(공사 == '기기', 0.05, 만약(공사 == '철골', 0.05, 만약(공사 == '배관', 0.3, 만약(공사 == 'Belt & Conveyor', 0.05, 만약(공사 == 'Heater & Tank', 0.05, 만약(공사 == 'Pump & Fan', 0.05, 만약(공사 == 'Crane 류', 0.05, 0))))))))",
@@ -19305,7 +19305,7 @@
},
{
"종류": "재료",
"요소": "MP000343",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030697"},
"이름": "탭",
"단위": "SET",
"수량": "(만약(공사 == '기기', 0.05, 만약(공사 == '철골', 0.05, 만약(공사 == '배관', 0.05, 만약(공사 == 'Belt & Conveyor', 0.05, 만약(공사 == 'Heater & Tank', 0.05, 만약(공사 == 'Pump & Fan', 0.05, 만약(공사 == 'Crane 류', 0.05, 0))))))))",
@@ -19314,7 +19314,7 @@
},
{
"종류": "재료",
"요소": "MP000344",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030698"},
"이름": "다이스",
"단위": "개",
"수량": "(만약(공사 == '기기', 0.05, 만약(공사 == '철골', 0.05, 만약(공사 == '배관', 0.05, 만약(공사 == 'Belt & Conveyor', 0.05, 만약(공사 == 'Heater & Tank', 0.05, 만약(공사 == 'Pump & Fan', 0.05, 만약(공사 == 'Crane 류', 0.05, 0))))))))",
@@ -19323,7 +19323,7 @@
},
{
"종류": "재료",
"요소": "MP000345",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030699"},
"이름": "정",
"단위": "개",
"수량": "(만약(공사 == '기기', 0.1, 만약(공사 == '철골', 0.2, 만약(공사 == '배관', 0.05, 만약(공사 == 'Belt & Conveyor', 0.05, 만약(공사 == 'Heater & Tank', 0.05, 만약(공사 == 'Pump & Fan', 0.1, 만약(공사 == 'Crane 류', 0.05, 0))))))))",
@@ -19359,7 +19359,7 @@
},
{
"종류": "재료",
"요소": "MP000349",
"요소": {"구분": "기계·설비", "상세구분": "기계류", "대표": "MT030700"},
"이름": "Center Punch",
"단위": "개",
"수량": "(만약(공사 == '기기', 0.02, 만약(공사 == '철골', 0.02, 만약(공사 == '배관', 0.02, 만약(공사 == 'Belt & Conveyor', 0.02, 만약(공사 == 'Heater & Tank', 0.02, 만약(공사 == 'Pump & Fan', 0.02, 만약(공사 == 'Crane 류', 0.02, 0))))))))",
@@ -19377,7 +19377,7 @@
},
{
"종류": "재료",
"요소": "MP000351",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030701"},
"이름": "대강",
"단위": "㎏",
"수량": "(만약(공사 == '기기', 0.02, 만약(공사 == '철골', 0.1, 만약(공사 == '배관', 0.02, 만약(공사 == 'Belt & Conveyor', 0.1, 만약(공사 == 'Heater & Tank', 0.1, 만약(공사 == 'Pump & Fan', 0.02, 만약(공사 == 'Crane 류', 0.1, 0))))))))",
@@ -19386,7 +19386,7 @@
},
{
"종류": "재료",
"요소": "MP000352",
"요소": {"구분": "잡재료", "상세구분": "소모품", "대표": "MT030702"},
"이름": "유지",
"단위": "ℓ",
"수량": "(만약(공사 == '기기', 0.07, 만약(공사 == '철골', 0.1, 만약(공사 == '배관', 0.07, 만약(공사 == 'Belt & Conveyor', 0.07, 만약(공사 == 'Heater & Tank', 0.07, 만약(공사 == 'Pump & Fan', 0.07, 만약(공사 == 'Crane 류', 0.07, 0))))))))",
@@ -19395,7 +19395,7 @@
},
{
"종류": "재료",
"요소": "MP000353",
"요소": {"구분": "볼트·앵커·철물", "상세구분": "볼트·너트", "대표": "MT030703"},
"이름": "Washer",
"단위": "매",
"수량": "(만약(공사 == '기기', 0.3, 만약(공사 == '철골', 0.5, 만약(공사 == '배관', 0.3, 만약(공사 == 'Belt & Conveyor', 0.3, 만약(공사 == 'Heater & Tank', 0.3, 만약(공사 == 'Pump & Fan', 0.3, 만약(공사 == 'Crane 류', 0.3, 0))))))))",
@@ -287,7 +287,7 @@
{ "종류": "재료", "요소": "MO:휘발유:{지역}", "이름": "휘발유(양수기)", "단위": "ℓ", "수량": "휘발유", "비목": "재료비", "출처": "산림품셈 2-1-8" },
{
"종류": "재료",
"요소": "MP000070",
"요소": {"구분": "안전시설", "상세구분": "표지판·지주", "대표": "MT030609"},
"이름": "깃발",
"단위": "개",
"수량": "찾기(QF000016, 구분='깃발').수량 / 찾기(CF000090, 구분='1일 살포면적 소형헬기').적용",
@@ -2081,11 +2081,12 @@
},
{
"종류": "재료",
"요소": "MP:VR관 ∅{관경}㎜",
"요소": {"구분": "관·이음관", "상세구분": "PVC관", "규격": "D={관경}mm"},
"이름": "VR관",
"단위": "m",
"수량": "찾기(QF000370, 구분='VR관', 관경=관경).적용",
"비목": "재료비"
"단위": "본",
"수량": "찾기(QF000370, 구분='VR관', 관경=관경).적용 / 2.5",
"비목": "재료비",
"비고": "본↔m — 1본 = 2.5m(PLAN 7-4b · 자재품목 VR관 비고에 출처)"
},
{
"종류": "재료",
@@ -2097,7 +2098,7 @@
},
{
"종류": "재료",
"요소": "MP000038",
"요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "대표": "MT030601"},
"이름": "지수활제",
"단위": "g",
"수량": "찾기(QF000370, 구분='지수활제', 관경=관경).적용",
@@ -2484,7 +2485,12 @@
},
{
"종류": "재료",
"요소": "MP:커플링밴드 ∅{관경}㎜",
"요소": {
"구분": "관·이음관",
"상세구분": "파형강관",
"이름": "파형강관 커플링밴드(관급)",
"규격": "Φ{관경}mm"
},
"이름": "커플링밴드",
"단위": "EA",
"수량": "만약(커플링밴드 == '필요', 1 / 6, 0)",
@@ -2493,7 +2499,7 @@
},
{
"종류": "재료",
"요소": "MP000004",
"요소": {"이름": "모래", "규격": "", "지역": "입력"},
"이름": "모래부설(또는 양질토사)",
"단위": "㎥",
"수량": "모래량",
@@ -3390,7 +3396,7 @@
"덧줄": [
{
"이름": "집수정 뚜껑 설치비",
"식": "뚜껑수 * MP000040 * 5 / 100",
"식": "뚜껑수 * MT030712 * 5 / 100",
"비목": "노무비",
"출처": "산림품셈 12-15"
}
@@ -3721,7 +3727,7 @@
},
{
"종류": "재료",
"요소": "MP000012",
"요소": {"구분": "거푸집·가설재", "상세구분": "동바리·비계", "규격": "∅19㎜ 아연도금 및 스테인레스", "대표": "MT030600"},
"이름": "사다리(∅19㎜ 아연도금 및 스테인레스)",
"단위": "ton",
"수량": "사다리량",
@@ -3938,7 +3944,7 @@
},
{
"종류": "재료",
"요소": "MP000004",
"요소": {"이름": "모래", "규격": "", "지역": "입력"},
"이름": "모래",
"단위": "㎥",
"수량": "찾기(QF000385, 배합비=배합비).모래",
@@ -3946,7 +3952,7 @@
},
{
"종류": "재료",
"요소": "MP000006",
"요소": {"이름": "자갈", "규격": "", "지역": "입력"},
"이름": "자갈",
"단위": "㎥",
"수량": "찾기(QF000385, 배합비=배합비).자갈",
@@ -4867,7 +4873,7 @@
"호표": [
{
"종류": "재료",
"요소": "MP000048",
"요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "대표": "MT030602"},
"이름": "JOINT FILLER",
"단위": "㎡",
"수량": "찾기(QF000400, 구분='자재 - JOINT FILLER').적용",
@@ -4979,7 +4985,7 @@
"호표": [
{
"종류": "재료",
"요소": "MP000052",
"요소": {"구분": "시멘트·골재", "상세구분": "모르타르", "대표": "MT030603"},
"이름": "스페이셔(몰탈 블록)",
"단위": "",
"수량": "수량",
@@ -5147,7 +5153,7 @@
},
{
"종류": "재료",
"요소": "MP000055",
"요소": {"구분": "단열·보온", "상세구분": "단열재", "규격": "T=20㎜", "대표": "MT030604"},
"이름": "스티로폴(T=20㎜)",
"단위": "㎡",
"수량": "스티로폴면적",
@@ -5155,7 +5161,7 @@
},
{
"종류": "재료",
"요소": "MP000056",
"요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "규격": "T=15㎜", "대표": "MT030605"},
"이름": "TAR PAPER(T=15㎜)",
"단위": "㎡",
"수량": "타르페이퍼면적",
@@ -5163,7 +5169,7 @@
},
{
"종류": "재료",
"요소": "MP000057",
"요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "대표": "MT030606"},
"이름": "채움재(아스팔트)",
"단위": "㎥",
"수량": "찾기(QF000405, 구분='재료 - 채움재(아스팔트)').적용",
@@ -5447,7 +5453,7 @@
"호표": [
{
"종류": "재료",
"요소": "MP000048",
"요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "대표": "MT030602"},
"이름": "JOINT FILLER(T=20㎜)",
"단위": "㎡",
"수량": "1",
@@ -5473,7 +5479,7 @@
"호표": [
{
"종류": "재료",
"요소": "MP000060",
"요소": {"구분": "도료·방수·접착", "상세구분": "도료", "대표": "MT030607"},
"이름": "하드너",
"단위": "",
"수량": "하드너량",
@@ -792,7 +792,7 @@
},
{
"종류": "재료",
"요소": "MP000065",
"요소": {"구분": "석재", "상세구분": "조경석·자연석", "대표": "MT030608"},
"이름": "틈메우기돌",
"단위": "㎥",
"수량": "찾기(QF000432, 뒷길이=뒷길이, 종별=만약(돌 == '조약돌 및 야면석' 또는 돌 == '호박돌 및 야면석', '야면석', 돌)).소요량 * 틈메우기율 / 100",
@@ -1710,7 +1710,7 @@
"덧줄": [
{
"이름": "잡재료",
"식": "찾기(QF000460, 구분='자재', 명칭='철망태').수량 * MP000066 * 찾기(QF000460, 구분='자재', 명칭='잡재료').수량 / 100",
"식": "찾기(QF000460, 구분='자재', 명칭='철망태').수량 * MT004110 * 찾기(QF000460, 구분='자재', 명칭='잡재료').수량 / 100",
"비목": "재료비",
"출처": "산림품셈 13-11-4"
}
+10 -1
View File
@@ -30722,6 +30722,15 @@
{ "키": "MT030706", "구분": "시멘트·골재", "상세구분": "골재", "이름": "모래(건조상태·전국)", "규격": "건조상태", "단위": "kg", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000003 · 산림품셈 12-1-3 주⑤", "비고": "품셈재료에서 옮김 · 값 미확보 · 전국 대표 값 자리(지역 갈림은 아래 줄)", "면수": null },
{ "키": "MT030707", "구분": "시멘트·골재", "상세구분": "골재", "이름": "모래(건조상태·지역별)", "규격": "건조상태", "단위": "kg", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000003 · 산림품셈 12-1-3 주⑤", "비고": "품셈재료에서 옮김 · 값 미확보 · 지역마다 값이 다름 — 필요한 지역마다 관리자가 줄을 더 만들어야 함", "면수": null },
{ "키": "MT030708", "구분": "시멘트·골재", "상세구분": "골재", "이름": "자갈(건조상태·전국)", "규격": "", "단위": "kg", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000005 · 산림품셈 12-1-3 주⑤", "비고": "품셈재료에서 옮김 · 값 미확보 · 전국 대표 값 자리(지역 갈림은 아래 줄)", "면수": null },
{ "키": "MT030709", "구분": "시멘트·골재", "상세구분": "골재", "이름": "자갈(건조상태·지역별)", "규격": "", "단위": "kg", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000005 · 산림품셈 12-1-3 주⑤", "비고": "품셈재료에서 옮김 · 값 미확보 · 지역마다 값이 다름 — 필요한 지역마다 관리자가 줄을 더 만들어야 함", "면수": null }
{ "키": "MT030709", "구분": "시멘트·골재", "상세구분": "골재", "이름": "자갈(건조상태·지역별)", "규격": "", "단위": "kg", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000005 · 산림품셈 12-1-3 주⑤", "비고": "품셈재료에서 옮김 · 값 미확보 · 지역마다 값이 다름 — 필요한 지역마다 관리자가 줄을 더 만들어야 함", "면수": null },
{ "키": "MT030710", "구분": "기계·설비", "상세구분": "보일러·공조", "이름": "버너", "규격": "압접가열용", "단위": "개", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000209 · 건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)", "비고": "PLAN 7-4b: 자재품목 후보 1줄(MT009352 개장로용 가스버너, 915만원)은 산업용 화덕이라 다른 물건 — 못 이어 새 줄 · 값 미확보", "면수": null },
{ "키": "MT030711", "구분": "전기·통신", "상세구분": "판넬·차단기", "이름": "퓨즈", "규격": "테르밋 용접용", "단위": "개", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000214 · 건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)", "비고": "PLAN 7-4b: 자재품목 후보 다섯(전선퓨즈·통형퓨즈·고리퓨즈)이 모두 전기용이라 다른 물건 — 못 이어 새 줄 · 값 미확보", "면수": null },
{ "키": "MT030712", "구분": "맨홀·수로·그레이팅", "상세구분": "맨홀", "이름": "집수정 뚜껑", "규격": "스틸그레이팅", "단위": "개", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000040 · 산림품셈 12-15", "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목에 짝 없어 새 줄 · 값 미확보", "면수": null },
{ "키": "MT030713", "구분": "관·이음관", "상세구분": "강관", "이름": "쉬즈관", "규격": "", "단위": "m", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000094 · 건설품셈 공통 6-4-1 주④; 건설품셈 공통 6-4-2 주④", "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목에 짝 없어 새 줄 · 값 미확보", "면수": null },
{ "키": "MT030714", "구분": "전기·통신", "상세구분": "케이블·전선", "이름": "IV전선", "규격": "2.0㎜", "단위": "m", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000202 · 건설품셈 토목 6-7-5 강관압입추진공 조명시설", "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목은 ㎟ 단면(지름 아님)이라 짝 없어 새 줄 · 값 미확보", "면수": null },
{ "키": "MT030715", "구분": "잡재료", "상세구분": "소모품", "이름": "바퀴숫돌", "규격": "단면용 A36m B11호 A150×8×22 KSL 6501", "단위": "개", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000205 · 건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)", "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목에 짝 없어 새 줄 · 값 미확보", "면수": null },
{ "키": "MT030716", "구분": "잡재료", "상세구분": "소모품", "이름": "바퀴숫돌", "규격": "측면용 A24 QWV1호 A205×25×25 KSL 6501", "단위": "개", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000206 · 건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)", "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목에 짝 없어 새 줄 · 값 미확보", "면수": null },
{ "키": "MT030717", "구분": "잡재료", "상세구분": "소모품", "이름": "바퀴숫돌", "규격": "평면용 A24 QWV1호 A205×25×25 KSL 6501", "단위": "개", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000207 · 건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)", "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목에 짝 없어 새 줄 · 값 미확보", "면수": null },
{ "키": "MT030718", "구분": "잡재료", "상세구분": "소모품", "이름": "바퀴숫돌", "규격": "최종용 A24 QWV 5호 A205×22×22", "단위": "개", "물가자료": null, "유통물가": null, "물가정보": null, "거래가격": null, "관급": null, "출처": "품셈재료 MP000208 · 건설품셈 토목 4-5-1 가스압접 소모재료(참고자료)", "비고": "PLAN 7-4b: 덧줄 식에 박힌 재료 — 자재품목에 짝 없어 새 줄 · 값 미확보", "면수": null }
]
}
@@ -1,8 +1,9 @@
# -*- coding: utf-8 -*-
"""독립 기슭막이 치수 한 벌 — B05 칸 밑 근거와 B08 사유가 **같은 파일**을 읽음 (2026-09-14 브레인 판정).
"""독립 기슭막이 치수 — B05 칸 밑 근거가 표(`resources/data_masonry/revetment_sabang_*.json`)를 읽음.
한 자리 = `resources/data_masonry/수량_사방기슭막이치수_*.json`. TS 는 판 이름을 import 로 박으므로 판이
바뀌면 import 도 옮겨야 함 — 여기서 최신 판과 대조. 쪽·줄 번호가 사유에 그대로 실리는지도 봄.
2026-09-22 sub1: B08 쪽 사유 대조(`B08_Quantity_Engine_Pipe.own_revetment_basis` 등)는 B08 이
`old_code/` 로 끊기며 같이 죽었음 — 그 대조 시험은 빼고, **B05 몫**(TS 가 최신판을 읽는지 ·
그 판이 쓰는 칸이 실제로 있는지 · 높이 칸이 제안 없이 설계자 입력인지)만 되살림.
"""
from __future__ import annotations
@@ -16,12 +17,7 @@ ROOT = Path(__file__).resolve().parents[2]
if str(ROOT) not in sys.path:
sys.path.insert(0, str(ROOT))
from B08_Quantity.B08_Quantity_Engine_Pipe import ( # noqa: E402
own_height_unconfirmed,
own_revetment_basis,
)
DATA_DIR = ROOT / "resources" / "master_data" / "ref"
DATA_DIR = ROOT / "resources" / "data_masonry"
FIELDS = (ROOT / "B05_Profile" / "B05_Profile_UI_Drainage_Facility_Fields.ts").read_text(
encoding="utf-8"
)
@@ -29,13 +25,13 @@ CHROME = (ROOT / "B06_Section" / "B06_Section_UI_Cross_Card_Chrome.ts").read_tex
def test_TS_가_최신_판을_읽는다() -> None:
latest = sorted(DATA_DIR.glob("수량_사방기슭막이치수_*.json"))[-1].name
imported = re.search(r'from "\.\./resources/master_data/ref/(수량_사방기슭막이치수_[^"]+)"', FIELDS)
latest = sorted(DATA_DIR.glob("revetment_sabang_*.json"))[-1].name
imported = re.search(r'from "\.\./resources/data_masonry/(revetment_sabang_[^"]+)"', FIELDS)
assert imported and imported.group(1) == latest
def test_TS_가_쓰는_칸이_파일에_있다() -> None:
latest = sorted(DATA_DIR.glob("수량_사방기슭막이치수_*.json"))[-1]
latest = sorted(DATA_DIR.glob("revetment_sabang_*.json"))[-1]
data = json.loads(latest.read_text(encoding="utf-8"))
items = data["items"]
assert data["scope"] and "사방(계류) 교본 기준" in data["scope"]
@@ -45,13 +41,6 @@ def test_TS_가_쓰는_칸이_파일에_있다() -> None:
assert "L7164" in items["backfill_pebble"]["source"]
def test_B08_사유가_같은_근거를_쪽_줄_번호로() -> None:
basis = own_revetment_basis()
for ref in ("2-나:141", "3-가:181", "2-나:129", "3-가:151", "2-나:143", "L7164~7171"):
assert ref in basis, ref
assert "2-나:141" in own_height_unconfirmed()
def test_B05_높이_칸은_제안_없이_설계자_입력() -> None:
assert 'height: "",' in FIELDS and '"설계자 입력"' in FIELDS
assert "기슭막이 높이 없음 — 근입만 그림" in CHROME
@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
"""B06 벽 전면 기울기도 **품셈 표준경사 표**를 읽음 — B5 (2026-09-14 브레인 판정 「양쪽 다 이 표를」).
2026-09-22 sub1: B08 쪽 파이썬 대조(`B08_Quantity_Engine_UnitQuantity_StoneSpec`)는 B08 이
`old_code/` 로 끊기며 같이 죽었음 — 그 대조 시험은 빼고, **B06 몫**(표 경로가 최신판인지 ·
벽 모양이 붙박이 기울기를 더는 안 곱하는지)만 되살림.
"""
from __future__ import annotations
import re
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
if str(ROOT) not in sys.path:
sys.path.insert(0, str(ROOT))
DATA_DIR = ROOT / "resources" / "data_masonry"
GEOMETRY = [
"B06_Section_UI_Cross_Culvert_Geom.ts",
"B06_Section_UI_Cross_Wall.ts",
"B06_Section_UI_Cross_Culvert_Extra.ts",
"B06_Section_UI_Cross_Culvert_Solve.ts",
]
def test_횡단도가_최신_표준경사_판을_읽는다() -> None:
const = (ROOT / "B06_Section" / "B06_Section_UI_Cross_Lean.ts").read_text(encoding="utf-8")
latest = sorted(DATA_DIR.glob("masonry_slope_*.json"))[-1].name
imported = re.search(r'from "\.\./resources/data_masonry/(masonry_slope_[^"]+)"', const)
assert imported and imported.group(1) == latest
def test_벽_모양이_붙박이_기울기를_안_곱한다() -> None:
"""벽 모양 파일마다 `REVET_LEAN_RATIO *` 곱이 남아 있으면 그 벽은 아직 1:0.3 붙박이."""
for name in GEOMETRY:
source = (ROOT / "B06_Section" / name).read_text(encoding="utf-8")
assert not re.search(r"REVET_LEAN_RATIO\s*[*/]", source), name
+11 -12
View File
@@ -369,12 +369,6 @@ def test_구분_목록(client: TestClient) -> None:
assert steel["details"]
def test_못_이은_줄만_거름(client: TestClient) -> None:
every = _get(client, "/api/m01/rows", file="재료_품셈재료.json", size=500)
cut = _get(client, "/api/m01/rows", file="재료_품셈재료.json", size=500, unlinked=1)
assert 0 < cut["total"] < every["total"] and not any(r["연결"] for r in cut["rows"])
def test_재료_고르기_줄_단가는_대표_자재품목의_낮은_값(client: TestClient) -> None:
"""옛 「MP:시멘트」 줄이 고르기 조건+대표로 바뀜 — 값은 대표 자재품목 줄의 낮은 값."""
one = _get(client, "/api/m01/logic", key=key_of("GC000628"))
@@ -384,11 +378,17 @@ def test_재료_고르기_줄_단가는_대표_자재품목의_낮은_값(client
def test_전력은_계약종별을_골라야_값이_섬(client: TestClient) -> None:
"""후보 조건 「계약종별: 입력」 — 화면에선 값 없음 · 계산 때 로직 입력으로 정해짐."""
"""후보 조건 「계약종별: 입력」(PLAN 7-4b 뒤 절반 — 품셈재료 간접 없이 호표에 바로 박음) —
계산은 로직 입력으로 값이 섬(mf.element 로 직접 확인). 화면 단가 미리보기(_pick_brief)는
구분·상세구분 자리로만 후보를 찾아 지역·계약종별 조건은 아직 못 다뤄 None — 아는 구멍."""
one = _get(client, "/api/m01/logic", key=key_of("GC000893"))
power = one["prices"][key_of("MP:전력")]
assert power["값"] is None and power["출처"] is None
cond = {"이름": "전력량요금", "계약종별": "입력"}
assert one["prices"][store.cm.mf.cond_text(cond)] is None
assert "전력 계약종별" in {x["이름"] for x in one["logic"]["입력"]}
with pytest.raises(store.cm.mf.FormulaError, match="전력 계약종별"):
store.cm.mf.element(store.cm.master(), cond, {})
value, source = store.cm.mf.element(store.cm.master(), cond, {"전력 계약종별": "주택용 저압"})
assert value is not None and source
def test_하위_거름과_참조_이름(client: TestClient) -> None:
@@ -400,9 +400,8 @@ def test_하위_거름과_참조_이름(client: TestClient) -> None:
assert {r["상세구분"] for r in field["rows"]} == {"기능계 도화"}
machine = _get(client, "/api/m01/rows", file="기계.json", size=500, sub="산림품셈")
assert 0 < machine["total"] < 100 and {r["원문"] for r in machine["rows"]} == {"산림품셈"}
linked = _get(client, "/api/m01/rows", file="재료_품셈재료.json", size=500)
keyed = [r for r in linked["rows"] if isinstance(r["연결"], str)]
assert keyed and all(linked["refs"][r["연결"]] for r in keyed)
# 참조 이름(refs) 확인은 예전에 재료_품셈재료.json 「연결」로 했음 — PLAN 7-4b 뒤 절반이
# 그 파일을 old/ 로 옮겨(살아 있는 마스터 밖) 이 자리에서는 더 못 봄
def test_자재품목_저장은_띄어쓰기를_안_바꿈(client: TestClient) -> None:
+107 -22
View File
@@ -1,5 +1,6 @@
"""마스터 데이터 검사 도구 — 견본 셋 손 계산 · 견본 파일 검사 통과 (`resources/master_data/scripts/check_master.py`)."""
import json
import sys
from decimal import ROUND_HALF_UP, Decimal
from pathlib import Path
@@ -432,8 +433,6 @@ def test_토목_보링_심도_가산():
files["재료_자재품목.json"]["줄"].append(
{"키": "MT999999", "원문번호": "가짜", "물가자료": Decimal(1000)}
)
for row in files["재료_품셈재료.json"]["줄"]:
row["연결"] = row["연결"] or "MT999999" # 못 이은 재료 — 시험용 가짜 연결
given = {"층": "점토층", "규격": "BX", "깊이": 35, "심도가산율": 5}
got = mf.run(mf.Master(files), "GC000431", given)
qty = {x["이름"]: x["수량"] for x in got["줄"]}
@@ -695,20 +694,49 @@ def test_노임_갈래_파일_원문_대조():
def test_품셈재료_연결_낮은_값과_출처(whole):
"""연결 하나 — 값 열 다섯 가운데 낮은 값 · 출처 = 「<키>.<열>」."""
"""연결 하나 — 값 열 다섯 가운데 낮은 값 · 출처 = 「<키>.<열>」.
재료_품셈재료.json 은 PLAN 7-4b 뒤 절반이 old/ 로 옮겨 살아 있는 마스터엔 없음 —
element() 의 옛길(품셈재료 간접)이 여전히 도는지 자체 마스터로 확인."""
row = whole.get("MT004176") # 시멘트
low = min(row[s] for s in mm.SLOTS if row.get(s) is not None)
value, source = mf.element(whole, "MP:시멘트", {})
files = cm.load(["재료_자재품목.json"]) | {
"재료_품셈재료.json": {
"그룹": "재료",
"원문": "품셈재료",
"줄": [{"키": "MP900001", "이름": "시멘트", "단위": "kg", "연결": "MT004176"}],
}
}
value, source = mf.element(mf.Master(files), "MP900001", {})
assert value == low and source.split(".")[0] == row["키"]
def test_전력은_계약종별로_고름(whole):
"""전력은 자재품목이 아니라 유가전력 줄 — 계약종별은 로직 입력 · 그 안에서 낮은 값."""
"""전력은 자재품목이 아니라 유가전력 줄 — 계약종별은 로직 입력 · 그 안에서 낮은 값.
옛길(품셈재료 연결이 계약종별 조건 묶음)로도 여전히 도는지 자체 마스터로 확인."""
assert whole.index["MT"].get("MT000006") is None # 자재품목 전력 2줄 뺌
files = cm.load(["재료_유가전력.json"]) | {
"재료_품셈재료.json": {
"그룹": "재료",
"원문": "품셈재료",
"줄": [
{
"키": "MP900002",
"이름": "전력",
"단위": "㎾h",
"연결": {"이름": "전력량요금", "계약종별": "입력"},
}
],
}
}
linked = mf.Master(files)
with pytest.raises(mf.FormulaError): # 계약종별 없이는 값이 안 섬
mf.element(whole, "MP:전력", {})
value, source = mf.element(whole, "MP:전력", {mf.TARIFF: "주택용 저압"})
mf.element(linked, "MP900002", {})
value, source = mf.element(linked, "MP900002", {mf.TARIFF: "주택용 저압"})
assert value == 120 and source == "MO000058.값"
# PLAN 7-4b 뒤 절반 — 호표에 조건 묶음을 바로 박아도 같은 길(품셈재료 간접 없이)
cond = {"이름": "전력량요금", "계약종별": "입력"}
value2, source2 = mf.element(whole, cond, {mf.TARIFF: "주택용 저압"})
assert value2 == value and source2 == source
def test_자재품목_열_한_벌():
@@ -735,15 +763,31 @@ def test_자재품목_열_한_벌():
def test_품셈재료_자재지역_후보(whole):
"""지역 재료 — 입력 없음 · 그 지역 줄 없음 · 규격 여럿은 멈춤 · 하나면 낮은 값."""
"""지역 재료 — 입력 없음 · 그 지역 줄 없음 · 규격 여럿은 멈춤 · 하나면 낮은 값.
옛길(품셈재료 연결이 지역 조건 묶음)로도 여전히 도는지 자체 마스터로 확인."""
files = cm.load(["재료_자재품목.json"]) | {
"재료_품셈재료.json": {
"그룹": "재료",
"원문": "품셈재료",
"줄": [
{"키": "MP900003", "이름": "모래", "단위": "㎥", "연결": {"이름": "모래", "규격": "", "지역": "입력"}},
{"키": "MP900004", "이름": "레미콘", "단위": "㎥", "연결": {"이름": "레미콘", "규격": "", "지역": "입력"}},
],
}
}
linked = mf.Master(files)
with pytest.raises(mf.FormulaError, match="입력 「자재지역」 없음"):
mf.element(whole, "MP:모래", {})
mf.element(linked, "MP900003", {})
with pytest.raises(mf.FormulaError, match="지역 값 없음"):
mf.element(whole, "MP:모래", {"자재지역": "울진"})
mf.element(linked, "MP900003", {"자재지역": "울진"})
with pytest.raises(mf.FormulaError, match="후보 여럿"):
mf.element(whole, "MP:레미콘", {"자재지역": "울진"})
value, source = mf.element(whole, "MP:모래", {"자재지역": "수원"})
mf.element(linked, "MP900004", {"자재지역": "울진"})
value, source = mf.element(linked, "MP900003", {"자재지역": "수원"})
assert source.startswith("MT") and value > 0
# PLAN 7-4b 뒤 절반 — 호표에 조건 묶음을 바로 박아도 같은 길(품셈재료 간접 없이)
cond = {"이름": "모래", "규격": "", "지역": "입력"}
value2, source2 = mf.element(whole, cond, {"자재지역": "수원"}, "㎥")
assert value2 == value and source2 == source
# ── 재료 고르기 조건 (`_틀.md` 7장) ────────────────────────────────────
@@ -824,6 +868,40 @@ def test_재료_고르기_조건이_후보를_좁힘():
assert mm.candidates(whole, {"구분": "없는구분"}) == []
def test_재료_고르기_이름_조건이_같은_규격_다른_품명을_가름():
"""일감35 — 규격(관경)만 같고 품명이 다른 줄(커플링밴드 vs 접속티)이 이름 칸으로 갈림."""
files = {
"재료_자재품목.json": {
"줄": [
{
"키": "MT900010",
"구분": "관·이음관",
"상세구분": "파형강관",
"이름": "파형강관 커플링밴드(관급)",
"규격": "Φ800mm",
"단위": "개",
"물가자료": None,
"관급": Decimal(19030),
},
{
"키": "MT900011",
"구분": "관·이음관",
"상세구분": "파형강관",
"이름": "파형강관이음관(관급)-거양",
"규격": "접속티, Φ800mm, 아연도금",
"단위": "개",
"물가자료": None,
"관급": Decimal(216770),
},
]
}
}
whole = mf.Master(files)
cond = {"구분": "관·이음관", "상세구분": "파형강관", "규격": "Φ800mm"}
assert sorted(mm.candidates(whole, cond)) == ["MT900010", "MT900011"] # 이름 없으면 둘 다 걸림
assert mm.candidates(whole, {**cond, "이름": "파형강관 커플링밴드(관급)"}) == ["MT900010"]
def test_재료_고르기_시험계산은_대표_줄_없으면_값_있는_첫_줄():
whole = _pipes()
cond = {"구분": "관·수로", "상세구분": "흄관", "규격": "D300"}
@@ -917,17 +995,25 @@ def test_품셈재료_고르기_칸_검사():
def test_고르기_조건_글자_열쇠():
"""화면 단가 미리보기가 조건 줄을 찾는 이름 — 빈 칸은 빈 글자."""
assert mm.cond_text({"구분": "관·수로", "상세구분": "흄관"}) == "관·수로|흄관||"
assert mm.cond_text({"구분": "레미콘", "대표": "MT900002"}) == "레미콘|||MT900002"
assert mm.cond_text({"구분": "관·수로", "상세구분": "흄관"}) == "관·수로|흄관|||||"
assert mm.cond_text({"구분": "레미콘", "대표": "MT900002"}) == "레미콘||||MT900002||"
def test_품셈재료_고르기_칸이_실파일에_있음():
"""일괄 변환의 바탕 — 모든 품셈재료 줄에 고르기 칸 · 조건은 자재품목 묶음 안."""
whole = cm.master()
def test_품셈재료_고르기_칸이_옛_파일에_있음():
"""일괄 변환의 바탕(옛 자료) — PLAN 7-4b 뒤 절반이 재료_품셈재료.json 을 old/ 로 옮겨
이제 살아 있는 마스터엔 안 읽힘 — 옮기기 전 앞뒤 확인이 남긴 옛 자료 자체를 대고 봄."""
market = cm.load(["재료_자재품목.json"])
old_pm = json.loads(
(cm.MASTER / "old" / "재료_품셈재료.json").read_text(encoding="utf-8"),
parse_float=Decimal,
parse_int=Decimal,
)
whole = mf.Master({**market, "재료_품셈재료.json": old_pm})
rows = whole.index["MP"]
assert rows and all("고르기" in row for row in rows.values())
assert any(isinstance(row["고르기"], dict) for row in rows.values())
assert cm.check_links(whole) == []
assert cm.master().index.get("MP") is None # 살아 있는 마스터엔 이제 없음
def test_로직_일괄_시험계산():
@@ -1068,7 +1154,9 @@ def test_고르기_조건의_모르는_변수를_잡음(whole):
def test_변수_참조_줄은_고르기_조건으로_바뀜(whole):
"""일감24 — `MT:{철선}` 꼴 옛 참조 19줄을 고르기 조건으로 옮김(남은 2줄은 관·단위 사정)."""
"""일감24 — `MT:{철선}` 꼴 옛 참조 19줄을 고르기 조건으로 옮김. VR관(GF000173)은
PLAN 7-4b 뒤 절반에서 1본=2.5m 환산으로, 커플링밴드(GF000176)는 일감35 에서
「이름」 조건으로 마저 옮겨 남은 줄 없음."""
남음 = [
(str(row["키"]), item["요소"])
for data in cm.load().values()
@@ -1079,7 +1167,4 @@ def test_변수_참조_줄은_고르기_조건으로_바뀜(whole):
and item["요소"][:2] in ("MP", "MT")
and "{" in item["요소"]
]
assert sorted(남음) == [
("GF000173", "MP:VR관 ∅{관경}㎜"),
("GF000176", "MP:커플링밴드 ∅{관경}㎜"),
]
assert sorted(남음) == []
+129 -1
View File
@@ -14,7 +14,9 @@ sys.path.insert(0, str(MD / "scripts"))
import build_자재품목_분류 as B # noqa: E402
ROWS = json.loads((MD / "재료_자재품목.json").read_text(encoding="utf-8"))["줄"]
PM = json.loads((MD / "재료_품셈재료.json").read_text(encoding="utf-8"))["줄"]
# PLAN 7-4b 뒤 절반 — 재료_품셈재료.json 은 old/ 로 옮김(살아 있는 마스터엔 안 읽힘) · 이 시험은
# 옮기기 전 일괄 변환이 옳았는지 옛 자료를 대고 보는 것이라 old/ 에서 그대로 읽음
PM = json.loads((MD / "old" / "재료_품셈재료.json").read_text(encoding="utf-8"))["줄"]
# 품셈재료 이름(뿌리) → 자재품목에서 들어가야 할 구분
기대 = {
@@ -66,6 +68,117 @@ PM = json.loads((MD / "재료_품셈재료.json").read_text(encoding="utf-8"))["
"용접봉": "잡재료",
"물": "잡재료",
"고철": "잡재료",
# PLAN 7-4b 뒤 절반 ② — 후보는 있으나 애매해 어제 뺀 것 가운데 셋(값 없어도 넘어감)
"색소": "도료·방수·접착",
"에폭시": "도료·방수·접착",
"땜납": "잡재료",
# PLAN 7-4b 뒤 절반 ④ — 버너·퓨즈는 후보가 물건 자체가 달라 못 이어 새 줄을 만듦
"버너": "기계·설비",
"퓨즈": "전기·통신",
# PLAN 7-4b 뒤 절반 — 덧줄 식에 바로 박혀 있던 나머지 아홉 종(그동안 「요소」 칸만
# 훑어 안 걸렸던 자리) · 새 줄 넷은 이름이 그대로 같아 여기 더함
"집수정 뚜껑": "맨홀·수로·그레이팅",
"쉬즈관": "관·이음관",
"IV전선": "전기·통신",
"바퀴숫돌": "잡재료",
# 철망태(사각형 돌망태)·백열등은 이름이 다른 자재품목 줄(망태석·백열등100W)로 이어
# 뿌리-이름 검사에서 스페이셔와 같은 이유로 뺌(아래 제외_뿌리충돌)
"철망태(사각형 돌망태)": "매트·토목섬유",
"백열등": "전기·통신",
# PLAN 7-4b 뒤 절반 ① — 자재품목에 짝 없던 재료 106종을 새 줄로 만들어 이음(값 미확보)
"3-Bond": "잡재료",
"BASECHANNEL": "건축마감",
"Center Punch": "기계·설비",
"Compound": "잡재료",
"Drill": "기계·설비",
"FLUX": "잡재료",
"File": "잡재료",
"Film": "기계·설비",
"Galvanized wire": "철근·강재",
"Gasoline": "잡재료",
"Grease": "잡재료",
"Grinder": "기계·설비",
"Grinder Wheel": "잡재료",
"Grinder wheel": "잡재료",
"Grinding Wheel": "잡재료",
"HDPE 시트": "관·이음관",
"Hack saw blade": "잡재료",
"JOINT FILLER": "도료·방수·접착",
"Lagging Sheet": "콘크리트제품",
"M/C OIL": "잡재료",
"Machine oil": "잡재료",
"Nozzle": "기계·설비",
"Oil Stone": "잡재료",
"Oil stone": "잡재료",
"Sand Paper": "잡재료",
"Seal Tape": "잡재료",
"TAR PAPER": "도료·방수·접착",
"TOPCHANNEL": "건축마감",
"Tar Epoxy": "도료·방수·접착",
"Tar epoxy": "도료·방수·접착",
"Washer": "볼트·앵커·철물",
"Wire Brush": "잡재료",
"Wire brush": "잡재료",
"Zinc primer": "도료·방수·접착",
"drill": "기계·설비",
"고강도메시": "철근·강재",
"골무": "잡재료",
"광목": "잡재료",
"그라인더돌": "잡재료",
"깃발": "안전시설",
"내부PANEL (목재문)": "목재",
"노즐": "기계·설비",
"다이스": "기계·설비",
"단독콘": "기계·설비",
"대강": "잡재료",
"돌": "잡재료",
"동력 Brush": "잡재료",
"로드": "기계·설비",
"마린B/T(선박도로용)": "도료·방수·접착",
"모래주머니": "시멘트·골재",
"몰드": "잡재료",
"백 Welder Glass": "잡재료",
"백묵": "잡재료",
"베인 전용로드": "기계·설비",
"보일유": "잡재료",
"보조강재": "철근·강재",
"보호막": "도료·방수·접착",
"붕사": "잡재료",
"사다리": "거푸집·가설재",
"석필": "잡재료",
"세유": "잡재료",
"슈": "기계·설비",
"스티로폴": "단열·보온",
"스페이셔(몰탈 블록)": "시멘트·골재",
"실리콘": "도료·방수·접착",
"아스팔트싱글": "건축마감",
"알루미늄핀": "거푸집·가설재",
"여과기": "잡재료",
"오스터날": "기계·설비",
"유지": "잡재료",
"전기용접": "잡재료",
"정": "잡재료",
"정배지": "건축마감",
"중유": "잡재료",
"지수활제": "도료·방수·접착",
"질석": "단열·보온",
"채움재(아스팔트)": "도료·방수·접착",
"철구(Shot ball)": "잡재료",
"철편(Grit)": "잡재료",
"축중계(이동식)": "기계·설비",
"침식방지안정제": "식생·종자",
"컴파운드": "잡재료",
"코크스": "잡재료",
"콘크리트 표면 강화재(하드너)": "도료·방수·접착",
"탄소봉": "잡재료",
"탈에폭시레신": "도료·방수·접착",
"탭": "기계·설비",
"테르밋용재": "잡재료",
"틈메우기돌": "석재",
"표준보강메시": "철근·강재",
"표준사": "기계·설비",
"피복제": "도료·방수·접착",
"흑 Welder Glass": "잡재료",
}
@@ -106,10 +219,25 @@ def test_품셈재료_연결_줄이_제_묶음():
def test_품셈재료_이름과_같은_품명_줄이_한_묶음():
# 「스페이셔(몰탈 블록)」 은 뿌리(「스페이셔」)가 같은 다른 물건(철근 스페이셔, 교량·구조부속)과
# 이름만 겹침 — PLAN 7-4b 뒤 절반이 자재품목 새 줄(시멘트·골재)에 「대표」로 콕 집어 이어
# 실제로는 안 섞임(test_품셈재료_연결_줄이_제_묶음 이 그 연결을 확인) · 이 뿌리-우선 검사만 뺌.
# 색소·에폭시·땜납은 PLAN 7-4b ② — 품셈 이름과 자재품목 이름이 달라(착색제·주입용 에폭시·
# 봉땜납) 대표로 콕 집어 이음 · 뿌리 이름으로는 자재품목에 아예 없어 이 검사 대상 밖.
제외_뿌리충돌 = {
"스페이셔(몰탈 블록)",
"색소",
"에폭시",
"땜납",
"철망태(사각형 돌망태)",
"백열등",
}
idx = collections.defaultdict(list)
for x in ROWS:
idx[_root(x["이름"])].append(x)
for p in PM:
if p["이름"] in 제외_뿌리충돌:
continue
want = 기대.get(p["이름"])
if not want:
continue