Merge branch 'sub_laptop_2' of C:/Aislo_wt/sub_laptop_2 into main_laptop_1

This commit is contained in:
2026-11-07 17:31:51 +09:00
10 changed files with 2573 additions and 91 deletions
+115
View File
@@ -0,0 +1,115 @@
"""옛 로직 사본 변수표 새로 쓰기 — 한 번 돌리는 도구(PLAN 800-5 · 요구 660-1 · 659-1).
옛 사본(795-5 이전에 찍힌 것) 줄은 변수표(이름 · 기호 · 아래 · 위)가 비었거나 한글 그대로 →
수식 영역에 한글 기호가 보임. 지금 M01 줄의 변수표로 그 줄 변수만 채움:
· 사본 줄에 이미 정한 기호(영문 · 그리스 · 사용자가 고친 것)가 있는 칸 = 그대로
· 기호가 비었거나 열쇠 그대로(한글)인 칸 = M01 칸(이름 · 기호 · 아래 · 위)으로
· M01 에 그 줄 · 그 변수가 없으면 건드리지 않음(= 목록 「못닿음」)
금액 · 셈 = 변수표는 보이기만 → 전후 금액 대조(같을 때만 씀) · 사본 `판`은 줄 지문으로 다시 셈
(M01 줄과 같아지면 `M01새판` 표지도 걷힘).
되돌릴 길 = 쓰기 전 파일 그대로 `--backup` 폴더에(`M02_Copy_Migrate --restore` 로 덮음).
프로젝트 층 문서는 건드리지 않음(굳힌 사본).
./venv/Scripts/python.exe -m M02_MasterTemplete.M02_Copy_Symbols # 보기만
./venv/Scripts/python.exe -m M02_MasterTemplete.M02_Copy_Symbols --apply --backup tmp/800_5
"""
from __future__ import annotations
import json
import shutil
import sys
from pathlib import Path
from typing import Any
from common_util.common_util_json import atomic_write_json
from M02_MasterTemplete import M02_Copy_Migrate as mig
from M02_MasterTemplete import M02_Sangeun_Copy as skc
FIELD = "변수표" # master_equation.FIELD 와 같은 칸
LOOK = ("이름", "기호", "아래", "위")
def _open(entry: Any, name: str) -> bool:
"""사본 칸이 채울 자리 — 없음 · 기호 없음 · 열쇠 그대로(한글 기본)."""
sign = str((entry or {}).get("기호") or "")
return not sign or sign == name
def fill(copy: dict, whole: Any) -> tuple[dict, int, int]:
"""(새 사본, 채운 칸 수, 못 닿은 변수 수) — 줄 `변수표`만 고치고 `판` 다시 셈."""
rows, done, lost = [], 0, 0
for row in copy["로직"]:
key = str(row.get("키"))
live = whole.index.get(key[:2], {}).get(key) or {}
src = live.get(FIELD) if isinstance(live.get(FIELD), dict) else {}
mine = dict(row.get(FIELD) or {})
for part in ("입력", "중간"):
for spec in row.get(part) or []:
name = str(spec.get("이름"))
new = (src or {}).get(name)
if not _open(mine.get(name), name):
continue
if not isinstance(new, dict) or not new.get("기호"):
lost += 1
continue
mine[name] = {**(mine.get(name) or {}), **{k: new[k] for k in LOOK if k in new}}
done += 1
rows.append({**row, FIELD: mine} if mine != (row.get(FIELD) or {}) else row)
return {**copy, "로직": rows, "판": skc._fp(rows)}, done, lost
def check(kind: str, path: Path) -> dict[str, Any]:
"""문서 하나 — {상태: 있음 | 채울것없음 | 같음 | 다름 | 못셈, 채움, 못닿음, 사본?}."""
from M02_MasterTemplete import M02_MasterTemplete_Store as store
doc = json.loads(path.read_bytes())
if not skc.has(doc):
return {"상태": "사본없음"}
try:
with store.at(path.parent.parent):
live = skc.whole_()
new, done, lost = fill(doc[skc.KEY], live)
if not done:
return {"상태": "채울것없음", "못닿음": lost}
clean = mig._clean(kind, doc, path.stem)
before = mig._money(kind, clean, skc.over({skc.KEY: doc[skc.KEY]}, live))
after = mig._money(kind, clean, skc.over({skc.KEY: new}, live))
except Exception as e: # noqa: BLE001 — 못 셈 = 목록(통째로 멈추지 않음)
return {"상태": "못셈", "까닭": str(e) or type(e).__name__}
row = {"상태": "같음" if before == after else "다름", "채움": done, "못닿음": lost}
return {**row, "사본": new} if before == after else {**row, "전": before, "후": after}
def run(apply: bool = False, backup: Path | None = None) -> list[dict[str, Any]]:
"""마스터 · 회사 · 개인 층 문서마다 {어디, 종류, 키, 상태, 씀, …} · `apply` = 같음만 씀."""
if apply and backup is None:
raise ValueError("--apply 는 --backup 폴더가 있어야 함")
out = []
for where_, kind, path, project in mig._files():
if project:
continue
got = check(kind, path)
copy = got.pop("사본", None)
row = {"어디": where_, "종류": kind, "키": path.stem, **got, "씀": False}
if apply and copy:
keep = mig._backup_path(path, backup)
keep.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(path, keep)
atomic_write_json(path, {**json.loads(path.read_bytes()), skc.KEY: copy})
row["씀"] = True
out.append(row)
return out
if __name__ == "__main__": # 브레인 지시 뒤만 --apply
args = sys.argv[1:]
at = Path(args[args.index("--backup") + 1]) if "--backup" in args else None
rows = run("--apply" in args, at)
for one in rows:
if one["상태"] not in ("사본없음", "채울것없음", "같음"):
print(json.dumps(one, ensure_ascii=False, default=str))
count: dict[str, int] = {}
for one in rows:
count[one["상태"]] = count.get(one["상태"], 0) + 1
print(json.dumps(count, ensure_ascii=False), "채움", sum(r.get("채움", 0) for r in rows))
@@ -100,7 +100,7 @@ def definitions(lines: list[dict], row: dict, rows: list[dict], unused) -> list[
name = node.get("칸") or name if kind == "찾기" else name
one = {
"열쇠": key if mine else "",
"기호": (look.get("기호") or name) if not key.startswith("줄.") else name,
"기호": look.get("기호") or name, # 줄 참조도 씌운 기호(master_symbol 한 곳)
"위": look.get("위") or "",
"아래": look.get("아래") or "",
"이름": name,
+480 -18
View File
@@ -352,7 +352,7 @@
}
},
"사본": {
"판": "e60ad06dfe20892e",
"판": "5bcfbe99102ef55d",
"시점": "2026-11-07T15:23:23",
"로직": [
{
@@ -1013,7 +1013,33 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"용수": {
"기호": "Q",
"아래": "용수"
},
"깊이": {
"기호": "H",
"아래": "깊이"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"굴착기": {
"기호": "S",
"아래": "굴착기"
}
}
},
{
"키": "GC000198",
@@ -1135,7 +1161,41 @@
"출처": "건설품셈 공통 6-1-1"
}
],
"끝수": null
"끝수": null,
"변수표": {
"타설방법": {
"기호": "S",
"아래": "타설방법"
},
"구조물": {
"기호": "S",
"아래": "구조물"
},
"소량감률": {
"기호": "r",
"아래": "소량"
},
"굴착기": {
"기호": "S",
"아래": "굴착기"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"콘크리트공": {
"기호": "Q",
"아래": "콘크리트공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000206",
@@ -1204,7 +1264,21 @@
"출처": "건설품셈 공통 6-2-2"
}
],
"끝수": null
"끝수": null,
"변수표": {
"시공량": {
"기호": "Q",
"아래": "시공"
},
"철근공": {
"기호": "Q",
"아래": "철근공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000207",
@@ -1312,7 +1386,33 @@
"출처": "건설품셈 공통 6-2-3"
}
],
"끝수": null
"끝수": null,
"변수표": {
"구분": {
"기호": "S",
"아래": "구분"
},
"호": {
"기호": "S",
"아래": "호"
},
"소량감률": {
"기호": "r",
"아래": "소량"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"철근공": {
"기호": "Q",
"아래": "철근공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000214",
@@ -1388,7 +1488,29 @@
"출처": "건설품셈 공통 6-3-3"
}
],
"끝수": null
"끝수": null,
"변수표": {
"유형": {
"기호": "S",
"아래": "유형"
},
"높이감률": {
"기호": "r",
"아래": "높이"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"형틀목공": {
"기호": "Q",
"아래": "형틀목공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000267",
@@ -1510,7 +1632,41 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000268",
@@ -1727,7 +1883,33 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000270",
@@ -1871,7 +2053,53 @@
"출처": "건설품셈 공통 8-4-8 주⑤"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"집게": {
"기호": "S",
"아래": "집게"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"집게손료": {
"기호": "C",
"아래": "집게"
},
"조합잡재료율": {
"기호": "r",
"아래": "조합잡재료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000677",
@@ -1957,7 +2185,25 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"모래체가름": {
"기호": "S",
"아래": "모래체가름"
},
"배합용적비": {
"기호": "r",
"아래": "배합"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GF000112",
@@ -2078,7 +2324,29 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"인력비율": {
"기호": "r",
"아래": "인력"
},
"기계비율": {
"기호": "r",
"아래": "기계"
},
"작업량": {
"기호": "Q",
"아래": "작업"
}
}
},
{
"키": "GF000156",
@@ -2286,7 +2554,61 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"구분": {
"기호": "S",
"아래": "구분"
},
"믹서": {
"기호": "S",
"아래": "믹서"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"재료배합": {
"기호": "S",
"아래": "재료배합"
},
"골재최대치수": {
"기호": "N",
"아래": "골재최대치"
},
"수중": {
"기호": "S",
"아래": "수중"
},
"모래상태": {
"기호": "S",
"아래": "모래상태"
},
"자갈상태": {
"기호": "S",
"아래": "자갈상태"
},
"모래단위중량": {
"기호": "W",
"아래": "모래단위"
},
"자갈단위중량": {
"기호": "W",
"아래": "자갈단위"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
},
"모래밀도": {
"기호": "ρ",
"아래": "모래"
},
"자갈밀도": {
"기호": "ρ",
"아래": "자갈"
}
}
},
{
"키": "GF000214",
@@ -2348,7 +2670,21 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"단위당": {
"기호": "S",
"아래": "단위당"
},
"소할": {
"기호": "S",
"아래": "소할"
}
}
},
{
"키": "GF000218",
@@ -2435,7 +2771,21 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"규격": {
"기호": "S",
"아래": "규격"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
}
}
},
{
"키": "GF000221",
@@ -2580,7 +2930,37 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"굵은골재최대치수": {
"기호": "N",
"아래": "굵은골재최대"
},
"강도": {
"기호": "σ",
"아래": "강도"
},
"슬럼프": {
"기호": "S",
"아래": "슬럼프"
},
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"돌": {
"기호": "S",
"아래": "돌"
},
"쌓기": {
"기호": "S",
"아래": "쌓기"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
}
}
},
{
"키": "GF000222",
@@ -2732,7 +3112,41 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"굵은골재최대치수": {
"기호": "N",
"아래": "굵은골재최대"
},
"강도": {
"기호": "σ",
"아래": "강도"
},
"슬럼프": {
"기호": "S",
"아래": "슬럼프"
},
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"채움콘크리트량": {
"기호": "Q",
"아래": "채움콘크리트"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
}
}
},
{
"키": "GF000225",
@@ -2884,7 +3298,41 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"굵은골재최대치수": {
"기호": "N",
"아래": "굵은골재최대"
},
"강도": {
"기호": "σ",
"아래": "강도"
},
"슬럼프": {
"기호": "S",
"아래": "슬럼프"
},
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"채움콘크리트량": {
"기호": "Q",
"아래": "채움콘크리트"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
}
}
},
{
"키": "GF000226",
@@ -2983,7 +3431,21 @@
"출처": "산림품셈 13-6-1 주③(상한)"
}
],
"끝수": null
"끝수": null,
"변수표": {
"직경": {
"기호": "D",
"아래": "직경"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
}
}
},
{
"키": "QC000183",
+480 -18
View File
@@ -940,7 +940,7 @@
}
},
"사본": {
"판": "e60ad06dfe20892e",
"판": "5bcfbe99102ef55d",
"시점": "2026-11-07T15:23:23",
"로직": [
{
@@ -1601,7 +1601,33 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"용수": {
"기호": "Q",
"아래": "용수"
},
"깊이": {
"기호": "H",
"아래": "깊이"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"굴착기": {
"기호": "S",
"아래": "굴착기"
}
}
},
{
"키": "GC000198",
@@ -1723,7 +1749,41 @@
"출처": "건설품셈 공통 6-1-1"
}
],
"끝수": null
"끝수": null,
"변수표": {
"타설방법": {
"기호": "S",
"아래": "타설방법"
},
"구조물": {
"기호": "S",
"아래": "구조물"
},
"소량감률": {
"기호": "r",
"아래": "소량"
},
"굴착기": {
"기호": "S",
"아래": "굴착기"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"콘크리트공": {
"기호": "Q",
"아래": "콘크리트공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000206",
@@ -1792,7 +1852,21 @@
"출처": "건설품셈 공통 6-2-2"
}
],
"끝수": null
"끝수": null,
"변수표": {
"시공량": {
"기호": "Q",
"아래": "시공"
},
"철근공": {
"기호": "Q",
"아래": "철근공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000207",
@@ -1900,7 +1974,33 @@
"출처": "건설품셈 공통 6-2-3"
}
],
"끝수": null
"끝수": null,
"변수표": {
"구분": {
"기호": "S",
"아래": "구분"
},
"호": {
"기호": "S",
"아래": "호"
},
"소량감률": {
"기호": "r",
"아래": "소량"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"철근공": {
"기호": "Q",
"아래": "철근공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000214",
@@ -1976,7 +2076,29 @@
"출처": "건설품셈 공통 6-3-3"
}
],
"끝수": null
"끝수": null,
"변수표": {
"유형": {
"기호": "S",
"아래": "유형"
},
"높이감률": {
"기호": "r",
"아래": "높이"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"형틀목공": {
"기호": "Q",
"아래": "형틀목공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000267",
@@ -2098,7 +2220,41 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000268",
@@ -2315,7 +2471,33 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000270",
@@ -2459,7 +2641,53 @@
"출처": "건설품셈 공통 8-4-8 주⑤"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"집게": {
"기호": "S",
"아래": "집게"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"집게손료": {
"기호": "C",
"아래": "집게"
},
"조합잡재료율": {
"기호": "r",
"아래": "조합잡재료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000677",
@@ -2545,7 +2773,25 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"모래체가름": {
"기호": "S",
"아래": "모래체가름"
},
"배합용적비": {
"기호": "r",
"아래": "배합"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GF000112",
@@ -2666,7 +2912,29 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"인력비율": {
"기호": "r",
"아래": "인력"
},
"기계비율": {
"기호": "r",
"아래": "기계"
},
"작업량": {
"기호": "Q",
"아래": "작업"
}
}
},
{
"키": "GF000156",
@@ -2874,7 +3142,61 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"구분": {
"기호": "S",
"아래": "구분"
},
"믹서": {
"기호": "S",
"아래": "믹서"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"재료배합": {
"기호": "S",
"아래": "재료배합"
},
"골재최대치수": {
"기호": "N",
"아래": "골재최대치"
},
"수중": {
"기호": "S",
"아래": "수중"
},
"모래상태": {
"기호": "S",
"아래": "모래상태"
},
"자갈상태": {
"기호": "S",
"아래": "자갈상태"
},
"모래단위중량": {
"기호": "W",
"아래": "모래단위"
},
"자갈단위중량": {
"기호": "W",
"아래": "자갈단위"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
},
"모래밀도": {
"기호": "ρ",
"아래": "모래"
},
"자갈밀도": {
"기호": "ρ",
"아래": "자갈"
}
}
},
{
"키": "GF000214",
@@ -2936,7 +3258,21 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"단위당": {
"기호": "S",
"아래": "단위당"
},
"소할": {
"기호": "S",
"아래": "소할"
}
}
},
{
"키": "GF000218",
@@ -3023,7 +3359,21 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"규격": {
"기호": "S",
"아래": "규격"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
}
}
},
{
"키": "GF000221",
@@ -3168,7 +3518,37 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"굵은골재최대치수": {
"기호": "N",
"아래": "굵은골재최대"
},
"강도": {
"기호": "σ",
"아래": "강도"
},
"슬럼프": {
"기호": "S",
"아래": "슬럼프"
},
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"돌": {
"기호": "S",
"아래": "돌"
},
"쌓기": {
"기호": "S",
"아래": "쌓기"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
}
}
},
{
"키": "GF000222",
@@ -3320,7 +3700,41 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"굵은골재최대치수": {
"기호": "N",
"아래": "굵은골재최대"
},
"강도": {
"기호": "σ",
"아래": "강도"
},
"슬럼프": {
"기호": "S",
"아래": "슬럼프"
},
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"채움콘크리트량": {
"기호": "Q",
"아래": "채움콘크리트"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
}
}
},
{
"키": "GF000225",
@@ -3472,7 +3886,41 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"굵은골재최대치수": {
"기호": "N",
"아래": "굵은골재최대"
},
"강도": {
"기호": "σ",
"아래": "강도"
},
"슬럼프": {
"기호": "S",
"아래": "슬럼프"
},
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"채움콘크리트량": {
"기호": "Q",
"아래": "채움콘크리트"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
}
}
},
{
"키": "GF000226",
@@ -3571,7 +4019,21 @@
"출처": "산림품셈 13-6-1 주③(상한)"
}
],
"끝수": null
"끝수": null,
"변수표": {
"직경": {
"기호": "D",
"아래": "직경"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
}
}
},
{
"키": "QC000183",
+128 -7
View File
@@ -247,7 +247,7 @@
}
},
"사본": {
"판": "d043469fa909537f",
"판": "4066584ac7f0910f",
"시점": "2026-11-07T15:23:23",
"로직": [
{
@@ -573,7 +573,41 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000268",
@@ -790,7 +824,33 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GF000118",
@@ -831,7 +891,13 @@
"식": "반올림(3600 * q0 * K * f * E / Cm, 3)",
"출처": "건설품셈 공통 8-1-4 주①"
},
"끝수": "소수 3자리 사사오입(건설품셈 공통 8-1-4 주①)"
"끝수": "소수 3자리 사사오입(건설품셈 공통 8-1-4 주①)",
"변수표": {
"q0": {
"기호": "q",
"아래": "0"
}
}
},
{
"키": "GF000119",
@@ -896,7 +962,21 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"작업량": {
"기호": "Q",
"아래": "작업"
}
}
},
{
"키": "GF000137",
@@ -982,7 +1062,22 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"t2": {
"이름": "한 번 싣고 내리는 데 드는 시간",
"기호": "t",
"아래": "2"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"운반수단": {
"기호": "S",
"아래": "운반수단"
}
}
},
{
"키": "GF000219",
@@ -1075,7 +1170,33 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"돌": {
"기호": "S",
"아래": "돌"
},
"쌓기": {
"기호": "S",
"아래": "쌓기"
},
"높이": {
"기호": "H",
"아래": "높이"
},
"초과증가율": {
"기호": "r",
"아래": "초과"
},
"증가율": {
"기호": "r",
"아래": "증가율"
}
}
},
{
"키": "QF000307",
+235 -11
View File
@@ -508,7 +508,7 @@
}
},
"사본": {
"판": "75ef826c33aa4cc3",
"판": "bf62fc43e50cd058",
"시점": "2026-11-07T15:23:24",
"로직": [
{
@@ -941,7 +941,33 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"용수": {
"기호": "Q",
"아래": "용수"
},
"깊이": {
"기호": "H",
"아래": "깊이"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"굴착기": {
"기호": "S",
"아래": "굴착기"
}
}
},
{
"키": "GC000363",
@@ -993,7 +1019,13 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"거리": {
"기호": "L",
"아래": "거리"
}
}
},
{
"키": "GC000267",
@@ -1115,7 +1147,41 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000268",
@@ -1332,7 +1398,33 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000270",
@@ -1476,7 +1568,53 @@
"출처": "건설품셈 공통 8-4-8 주⑤"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"집게": {
"기호": "S",
"아래": "집게"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"집게손료": {
"기호": "C",
"아래": "집게"
},
"조합잡재료율": {
"기호": "r",
"아래": "조합잡재료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GF000112",
@@ -1597,7 +1735,29 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"인력비율": {
"기호": "r",
"아래": "인력"
},
"기계비율": {
"기호": "r",
"아래": "기계"
},
"작업량": {
"기호": "Q",
"아래": "작업"
}
}
},
{
"키": "GF000212",
@@ -1648,7 +1808,17 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"단위": {
"기호": "S",
"아래": "단위"
},
"소할": {
"기호": "S",
"아래": "소할"
}
}
},
{
"키": "GF000213",
@@ -1745,7 +1915,29 @@
"출처": "산림품셈 13-2-3 주⑤(상한)"
}
],
"끝수": null
"끝수": null,
"변수표": {
"규격": {
"기호": "S",
"아래": "규격"
},
"발생": {
"기호": "S",
"아래": "발생"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"비율": {
"기호": "r",
"아래": "비율"
}
}
},
{
"키": "GF000218",
@@ -1832,7 +2024,21 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"규격": {
"기호": "S",
"아래": "규격"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
}
}
},
{
"키": "GF000220",
@@ -1931,7 +2137,25 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"잡석량": {
"기호": "Q",
"아래": "잡석"
}
}
},
{
"키": "QC000183",
+480 -18
View File
@@ -1060,7 +1060,7 @@
}
},
"사본": {
"판": "e60ad06dfe20892e",
"판": "5bcfbe99102ef55d",
"시점": "2026-11-07T15:23:24",
"로직": [
{
@@ -1721,7 +1721,33 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"용수": {
"기호": "Q",
"아래": "용수"
},
"깊이": {
"기호": "H",
"아래": "깊이"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"굴착기": {
"기호": "S",
"아래": "굴착기"
}
}
},
{
"키": "GC000198",
@@ -1843,7 +1869,41 @@
"출처": "건설품셈 공통 6-1-1"
}
],
"끝수": null
"끝수": null,
"변수표": {
"타설방법": {
"기호": "S",
"아래": "타설방법"
},
"구조물": {
"기호": "S",
"아래": "구조물"
},
"소량감률": {
"기호": "r",
"아래": "소량"
},
"굴착기": {
"기호": "S",
"아래": "굴착기"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"콘크리트공": {
"기호": "Q",
"아래": "콘크리트공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000206",
@@ -1912,7 +1972,21 @@
"출처": "건설품셈 공통 6-2-2"
}
],
"끝수": null
"끝수": null,
"변수표": {
"시공량": {
"기호": "Q",
"아래": "시공"
},
"철근공": {
"기호": "Q",
"아래": "철근공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000207",
@@ -2020,7 +2094,33 @@
"출처": "건설품셈 공통 6-2-3"
}
],
"끝수": null
"끝수": null,
"변수표": {
"구분": {
"기호": "S",
"아래": "구분"
},
"호": {
"기호": "S",
"아래": "호"
},
"소량감률": {
"기호": "r",
"아래": "소량"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"철근공": {
"기호": "Q",
"아래": "철근공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000214",
@@ -2096,7 +2196,29 @@
"출처": "건설품셈 공통 6-3-3"
}
],
"끝수": null
"끝수": null,
"변수표": {
"유형": {
"기호": "S",
"아래": "유형"
},
"높이감률": {
"기호": "r",
"아래": "높이"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"형틀목공": {
"기호": "Q",
"아래": "형틀목공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000267",
@@ -2218,7 +2340,41 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000268",
@@ -2435,7 +2591,33 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000270",
@@ -2579,7 +2761,53 @@
"출처": "건설품셈 공통 8-4-8 주⑤"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"집게": {
"기호": "S",
"아래": "집게"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"집게손료": {
"기호": "C",
"아래": "집게"
},
"조합잡재료율": {
"기호": "r",
"아래": "조합잡재료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000677",
@@ -2665,7 +2893,25 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"모래체가름": {
"기호": "S",
"아래": "모래체가름"
},
"배합용적비": {
"기호": "r",
"아래": "배합"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GF000112",
@@ -2786,7 +3032,29 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"인력비율": {
"기호": "r",
"아래": "인력"
},
"기계비율": {
"기호": "r",
"아래": "기계"
},
"작업량": {
"기호": "Q",
"아래": "작업"
}
}
},
{
"키": "GF000156",
@@ -2994,7 +3262,61 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"구분": {
"기호": "S",
"아래": "구분"
},
"믹서": {
"기호": "S",
"아래": "믹서"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"재료배합": {
"기호": "S",
"아래": "재료배합"
},
"골재최대치수": {
"기호": "N",
"아래": "골재최대치"
},
"수중": {
"기호": "S",
"아래": "수중"
},
"모래상태": {
"기호": "S",
"아래": "모래상태"
},
"자갈상태": {
"기호": "S",
"아래": "자갈상태"
},
"모래단위중량": {
"기호": "W",
"아래": "모래단위"
},
"자갈단위중량": {
"기호": "W",
"아래": "자갈단위"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
},
"모래밀도": {
"기호": "ρ",
"아래": "모래"
},
"자갈밀도": {
"기호": "ρ",
"아래": "자갈"
}
}
},
{
"키": "GF000214",
@@ -3056,7 +3378,21 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"단위당": {
"기호": "S",
"아래": "단위당"
},
"소할": {
"기호": "S",
"아래": "소할"
}
}
},
{
"키": "GF000218",
@@ -3143,7 +3479,21 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"규격": {
"기호": "S",
"아래": "규격"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
}
}
},
{
"키": "GF000221",
@@ -3288,7 +3638,37 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"굵은골재최대치수": {
"기호": "N",
"아래": "굵은골재최대"
},
"강도": {
"기호": "σ",
"아래": "강도"
},
"슬럼프": {
"기호": "S",
"아래": "슬럼프"
},
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"돌": {
"기호": "S",
"아래": "돌"
},
"쌓기": {
"기호": "S",
"아래": "쌓기"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
}
}
},
{
"키": "GF000222",
@@ -3440,7 +3820,41 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"굵은골재최대치수": {
"기호": "N",
"아래": "굵은골재최대"
},
"강도": {
"기호": "σ",
"아래": "강도"
},
"슬럼프": {
"기호": "S",
"아래": "슬럼프"
},
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"채움콘크리트량": {
"기호": "Q",
"아래": "채움콘크리트"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
}
}
},
{
"키": "GF000225",
@@ -3592,7 +4006,41 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"굵은골재최대치수": {
"기호": "N",
"아래": "굵은골재최대"
},
"강도": {
"기호": "σ",
"아래": "강도"
},
"슬럼프": {
"기호": "S",
"아래": "슬럼프"
},
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"채움콘크리트량": {
"기호": "Q",
"아래": "채움콘크리트"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
}
}
},
{
"키": "GF000226",
@@ -3691,7 +4139,21 @@
"출처": "산림품셈 13-6-1 주③(상한)"
}
],
"끝수": null
"끝수": null,
"변수표": {
"직경": {
"기호": "D",
"아래": "직경"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
}
}
},
{
"키": "QC000183",
+338 -12
View File
@@ -548,7 +548,7 @@
}
},
"사본": {
"판": "ab40c47aaca75ea0",
"판": "c5c52d0e8e6c254c",
"시점": "2026-11-07T15:23:24",
"로직": [
{
@@ -1211,7 +1211,33 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"용수": {
"기호": "Q",
"아래": "용수"
},
"깊이": {
"기호": "H",
"아래": "깊이"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"굴착기": {
"기호": "S",
"아래": "굴착기"
}
}
},
{
"키": "GC000198",
@@ -1333,7 +1359,41 @@
"출처": "건설품셈 공통 6-1-1"
}
],
"끝수": null
"끝수": null,
"변수표": {
"타설방법": {
"기호": "S",
"아래": "타설방법"
},
"구조물": {
"기호": "S",
"아래": "구조물"
},
"소량감률": {
"기호": "r",
"아래": "소량"
},
"굴착기": {
"기호": "S",
"아래": "굴착기"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"시공량": {
"기호": "Q",
"아래": "시공"
},
"콘크리트공": {
"기호": "Q",
"아래": "콘크리트공"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GC000267",
@@ -1455,7 +1515,41 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000268",
@@ -1672,7 +1766,33 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000270",
@@ -1816,7 +1936,53 @@
"출처": "건설품셈 공통 8-4-8 주⑤"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"집게": {
"기호": "S",
"아래": "집게"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"집게손료": {
"기호": "C",
"아래": "집게"
},
"조합잡재료율": {
"기호": "r",
"아래": "조합잡재료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000677",
@@ -1902,7 +2068,25 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"모래체가름": {
"기호": "S",
"아래": "모래체가름"
},
"배합용적비": {
"기호": "r",
"아래": "배합"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
},
"보통인부": {
"기호": "Q",
"아래": "보통인부"
}
}
},
{
"키": "GF000101",
@@ -1987,7 +2171,29 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"인력비율": {
"기호": "r",
"아래": "인력"
},
"기계비율": {
"기호": "r",
"아래": "기계"
},
"작업량": {
"기호": "Q",
"아래": "작업"
}
}
},
{
"키": "GF000156",
@@ -2195,7 +2401,61 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"구분": {
"기호": "S",
"아래": "구분"
},
"믹서": {
"기호": "S",
"아래": "믹서"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"재료배합": {
"기호": "S",
"아래": "재료배합"
},
"골재최대치수": {
"기호": "N",
"아래": "골재최대치"
},
"수중": {
"기호": "S",
"아래": "수중"
},
"모래상태": {
"기호": "S",
"아래": "모래상태"
},
"자갈상태": {
"기호": "S",
"아래": "자갈상태"
},
"모래단위중량": {
"기호": "W",
"아래": "모래단위"
},
"자갈단위중량": {
"기호": "W",
"아래": "자갈단위"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
},
"모래밀도": {
"기호": "ρ",
"아래": "모래"
},
"자갈밀도": {
"기호": "ρ",
"아래": "자갈"
}
}
},
{
"키": "GF000214",
@@ -2257,7 +2517,21 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"단위당": {
"기호": "S",
"아래": "단위당"
},
"소할": {
"기호": "S",
"아래": "소할"
}
}
},
{
"키": "GF000224",
@@ -2356,7 +2630,25 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"잡석량": {
"기호": "Q",
"아래": "잡석"
}
}
},
{
"키": "GF000225",
@@ -2508,7 +2800,41 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"굵은골재최대치수": {
"기호": "N",
"아래": "굵은골재최대"
},
"강도": {
"기호": "σ",
"아래": "강도"
},
"슬럼프": {
"기호": "S",
"아래": "슬럼프"
},
"뒷길이": {
"기호": "L",
"아래": "뒷"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"채움콘크리트량": {
"기호": "Q",
"아래": "채움콘크리트"
},
"자재지역": {
"기호": "S",
"아래": "자재지역"
}
}
},
{
"키": "QC000183",
@@ -23,7 +23,7 @@
],
"본뜬": null,
"사본": {
"판": "4f194aa411764eaf",
"판": "bac248e9d4e944ec",
"시점": "2026-11-07T15:23:21",
"로직": [
{
@@ -304,7 +304,41 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000268",
@@ -521,7 +555,33 @@
"출처": "건설품셈 공통 8-1-6 2"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GC000270",
@@ -665,7 +725,53 @@
"출처": "건설품셈 공통 8-4-8 주⑤"
}
],
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음"
"끝수": "손료 원 미만 버림(건설품셈 공통 8-1-5 12) · 합계 원문 규정 없음",
"변수표": {
"기계": {
"기호": "S",
"아래": "기계"
},
"집게": {
"기호": "S",
"아래": "집게"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"가산비율": {
"기호": "r",
"아래": "가산"
},
"손료": {
"기호": "C",
"아래": "손료"
},
"집게손료": {
"기호": "C",
"아래": "집게"
},
"조합잡재료율": {
"기호": "r",
"아래": "조합잡재료"
},
"연료": {
"기호": "S",
"아래": "연료"
},
"직종": {
"기호": "S",
"아래": "직종"
},
"시간환산": {
"기호": "Q",
"아래": "시간환산"
}
}
},
{
"키": "GF000289",
@@ -798,7 +904,37 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"가슴높이지름": {
"기호": "D",
"아래": "가슴높이"
},
"작업": {
"기호": "S",
"아래": "작업"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"벌목가산": {
"기호": "r",
"아래": "벌목"
},
"보통가산": {
"기호": "r",
"아래": "보통"
},
"장비": {
"기호": "S",
"아래": "장비"
}
}
},
{
"키": "GF000297",
@@ -933,7 +1069,41 @@
}
],
"덧줄": [],
"끝수": null
"끝수": null,
"변수표": {
"흉고직경": {
"기호": "D",
"아래": "흉고"
},
"지주목": {
"기호": "S",
"아래": "지주목"
},
"타이어크레인": {
"기호": "S",
"아래": "타이어크레인"
},
"지역": {
"기호": "S",
"아래": "지역"
},
"보정작업": {
"기호": "S",
"아래": "보정작업"
},
"기계": {
"기호": "S",
"아래": "기계"
},
"감": {
"기호": "Q",
"아래": "감"
},
"굴착기": {
"기호": "S",
"아래": "굴착기"
}
}
},
{
"키": "QF000050",
+140
View File
@@ -0,0 +1,140 @@
# ruff: noqa: F811 — 임시 층 fixture(world)를 test_m02_labor_ref 에서 받아 씀
"""800-5 기호 남은 한글 — 임시 storage 에서만.
① 호표 줄 금액 참조(`줄.`) 기호 = 수식 영역 · 정의 영역 같은 글(한글 0) ② 새 사본 = 이미 새 기호
③ 옛 사본 변수표 새로 씀 = 사용자 고침 칸 그대로 · 금액 같음 · 백업 되돌림 ④ M01 전수 한글 기호(하위 로직 칩 제외) 0.
"""
from __future__ import annotations
import copy
import importlib
import json
import re
from M02_MasterTemplete import M02_Copy_Migrate as mig
from M02_MasterTemplete import M02_Copy_Symbols as sym
from M02_MasterTemplete import M02_Sangeun_Copy as skc
from M01_MasterData import M01_MasterData_Store as m01
from M02_MasterTemplete import M02_Labor_Ref as refs
from M02_MasterTemplete import M02_MasterTemplete_Store as store
from resources.tester.test_m02_labor_ref import world # noqa: F401 — 같은 임시 층
LINE = {"로직": "GC000211", "수량": {"손": 1}} # 변수 많은 합판거푸집
def _make(me):
with store.at(me):
sk = refs.create(
"sangeun",
{"이름": "sub2임시", "단위": "㎡", "바탕": {"로직": "GC000211"}, "더한줄": []},
)["이름"]
path = me / "sangeun" / f"{sk}.json"
raw = {k: v for k, v in json.loads(path.read_bytes()).items() if k != skc.KEY}
path.write_text(json.dumps(raw, ensure_ascii=False), encoding="utf-8")
return {path: raw}
def _mine(rows, olds):
keys = {p.stem for p in olds}
return {r["키"]: r for r in rows if r["어디"].startswith("개인") and r["키"] in keys}
meq = importlib.import_module("master_equation")
HAN = re.compile(r"[가-힣]")
def _walk(tree, out: list) -> None:
if isinstance(tree, dict):
if tree.get("꼴") == "변수":
out.append(tree)
for v in tree.values():
_walk(v, out)
elif isinstance(tree, list):
for v in tree:
_walk(v, out)
def test_줄_참조_기호_같은_글_한글_0():
eq = meq.export(m01.loaded()[1], "GC000211")
refs = []
_walk(eq["줄"], refs)
refs = [v for v in refs if str(v["열쇠"]).startswith("줄.")]
assert refs and all(not HAN.search(v["기호"]) and v["기호"] == "C" for v in refs)
defs = {(d["기호"], d["아래"]): d for d in eq["정의"]}
for v in refs:
d = defs[(v["기호"], v["아래"])]
assert d["갈래"] == "요소" and not HAN.search(d["기호"])
assert any("호표 줄 금액" in c for d in defs.values() for c in d["연결"])
def test_M01_전수_정의_한글_기호는_하위_로직_칩뿐():
whole = m01.loaded()[1]
keys = [r["키"] for d in m01.loaded()[0].values() if d.get("그룹") == "로직" for r in d["줄"]]
for code in keys[::25]:
for d in meq.export(whole, str(code))["정의"]:
assert d["갈래"] == "블록" or not HAN.search(d["기호"]), (code, d["이름"])
def _old(path):
"""사본 변수표를 걷어 옛 사본 흉내 → (옛 문서, 걷은 줄 수)."""
doc = json.loads(path.read_bytes())
cut = 0
for r in doc[skc.KEY]["로직"]:
cut += r.pop(sym.FIELD, None) is not None
doc[skc.KEY]["판"] = skc._fp(doc[skc.KEY]["로직"])
path.write_text(json.dumps(doc, ensure_ascii=False), encoding="utf-8")
return doc, cut
def test_새_사본은_이미_새_기호_옛_사본은_새로_씀(world, tmp_path):
olds = _make(world["personal"])
back = tmp_path / "stamp"
mig.migrate(True, back) # 새 사본 찍음
paths = list(olds)
for p in paths:
rows = json.loads(p.read_bytes())[skc.KEY]["로직"]
assert any(r.get(sym.FIELD) for r in rows) # ② 새 사본 = 변수표 있음
assert {r["상태"] for r in _mine(sym.run(), olds).values()} == {"채울것없음"}
stripped = {p: _old(p) for p in paths}
assert all(cut for _, cut in stripped.values())
# 사용자 고침 칸 하나 — 영문 기호 Z 는 그대로
sk = next(p for p in paths if p.parent.name == "sangeun")
doc = json.loads(sk.read_bytes())
row = next(r for r in doc[skc.KEY]["로직"] if r.get("입력"))
name = str(row["입력"][0]["이름"])
row[sym.FIELD] = {name: {"기호": "Z", "아래": "내것"}}
sk.write_text(json.dumps(doc, ensure_ascii=False), encoding="utf-8")
before = {p: p.read_bytes() for p in paths}
rows = _mine(sym.run(), olds) # 보기만 = 안 씀
assert {r["상태"] for r in rows.values()} == {"같음"} and not any(
r["씀"] for r in rows.values()
)
assert all(p.read_bytes() == b for p, b in before.items())
back = tmp_path / "back"
rows = _mine(sym.run(True, back), olds)
assert all(r["씀"] and r["채움"] > 0 and r["못닿음"] == 0 for r in rows.values())
for p in paths:
for r in json.loads(p.read_bytes())[skc.KEY]["로직"]:
for part in ("입력", "중간"):
for spec in r.get(part) or []:
look = (r.get(sym.FIELD) or {})[str(spec["이름"])]
assert look.get("기호")
if not (r is row and spec["이름"] == name):
assert not HAN.search(look["기호"]), (r["키"], spec["이름"])
now = next(r for r in json.loads(sk.read_bytes())[skc.KEY]["로직"] if r["키"] == row["키"])
assert now[sym.FIELD][name] == {"기호": "Z", "아래": "내것"}
assert {r["상태"] for r in _mine(sym.run(), olds).values()} == {"채울것없음"} # 다시 돌림
mig.restore(back)
assert all(p.read_bytes() == before[p] for p in paths)
def test_채운_줄은_M01_줄_변수표_그대로():
live = m01.loaded()[1]
row = copy.deepcopy(live.logic("GC000211"))
src = row[sym.FIELD]
stripped = {k: v for k, v in row.items() if k != sym.FIELD}
got, done, lost = sym.fill({"로직": [json.loads(json.dumps(stripped, default=str))]}, live)
names = {str(s["이름"]) for k in ("입력", "중간") for s in row[k]}
assert done == len(names & set(src)) and lost == len(names - set(src))
assert all(got["로직"][0][sym.FIELD][n]["기호"] == src[n]["기호"] for n in names & set(src))