knowledge(마스터): 미확보 9 직종을 사용자 지정 추정으로 · 구분 미확보 뺌

- 인력.json — 절단공·사진제판공·사진식자공·측량사·측량기사·시공측량기사·측량조수·시공측량조수·특수운전공 상태 「추정」 · 값은 준용 직종 노임 · 출처는 근거 문서 · 비고 한마디
- 구분 「미확보」 등록부·빌더 짝짓기 없앰 · check_master BOOKS 에 공간정보법
- 근거 md 에 「사용자 지정 추정」 절
- 로직 일괄 시험 계산 통과 1,109 → 1,119 · 멈춤 245 → 235

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
2026-09-20 20:27:44 +09:00
co-authored by Claude Opus 5
parent 5160cea9ac
commit 819c5019ec
8 changed files with 46 additions and 91 deletions
@@ -126,3 +126,22 @@
- 측량기사·측량사 — 대응표에 이미 다른 경로로 확인돼 있어 안티그래비티 주장과 상충. 기존 대응표를 따름.
- 특수운전공 — "기계설비운전원"이란 이름 자체 없음.
- 절단공의 "제관공(플랜트)" 절반 — 2010 통합표는 절단공을 철골공行으로만 명시.
## 사용자 지정 추정 (2026-09-20 · 미확보 9 직종)
> 원문이 이름을 맞대지 않아 확정 못 한 9 직종 — 사용자가 준용 직종을 지정(대부분 폐지되었거나 쓰임이 드문 직종). 마스터 `인력.json` 상태 「추정」 · 값은 준용 직종 노임 그대로 · 구분은 건설업.
| 옛 직종 | 준용(키) | 출처(마스터) | 비고 | 까닭 |
|---|---|---|---|---|
| 절단공 | 철판공(LB000010) | 건설노임 통합표 2010.1 | 철근공·철공·철판공·철골공 중 추정 | 2010 통합표가 네 갈래로 나눔 — 그 가운데 하나를 사용자가 고름 |
| 사진제판공 | 전자조판원(LB000161) | 제조노임 직종해설 29호 | 폐지 직종 | 작업범위(제판·조판)가 29호와 가까움 |
| 사진식자공 | 전자조판원(LB000161) | 제조노임 직종해설 29호 | 폐지 직종 | 위와 같음 |
| 측량사 | 측량중급기술자(LB000321) | 공간정보법 시행령 별표5 | 구 측량사 자격 추정 | 옛 측량사 자격을 측량 기술계 중급으로 봄 |
| 측량기사 | 측량초급기술자(LB000322) | 공간정보법 시행령 별표5 | — | 별표5 1호 기술자 기준 |
| 시공측량기사 | 측량초급기술자(LB000322) | 공간정보법 시행령 별표5 | 2009 폐지 직종 | 위와 같음 |
| 측량조수 | 보통인부(LB000002) | 건설노임 직종 조정 2009 | 측부 폐지 · 보통인부 추정 | 옛 측부가 사라져 보조 노무로 봄 |
| 시공측량조수 | 보통인부(LB000002) | 건설노임 직종 조정 2009 | 측부 폐지 · 보통인부 추정 | 위와 같음 |
| 특수운전공 | 일반기계운전사(LB000050) | 건설품셈 기계설비 13-06 | 공표 이력 없음 | 품셈 노무 항목만 실존 · 공표 노임코드 없음 |
- 마스터 구분 「미확보」 는 비어 등록부에서 뺌 — 빌더의 미확보 짝짓기도 없앰.
- 틀리면 사용자가 `인력.json` 준용 칸을 고침 — 값은 빌더가 준용 직종에서 다시 채움.
+4 -4
View File
@@ -23,7 +23,7 @@
- 장 파일 — 장 번호는 두 자리 · 장 제목은 원문 본문 폴더 이름 그대로 · 부문은 이름에 넣지 않음.
- 장 파일 머리 — `부문`(건설품셈만 · 공통 · 토목 · 건축 · 기계설비 · 유지관리) · `차례`(그룹 안 목록 차례: 산림 1~14장 → 건설 공통 → 토목 → 건축 → 기계설비 → 유지관리).
- 원문 이름 = 산림품셈 · 건설품셈 · 건설노임 · 제조노임 · 엔지니어링노임 · 측량노임 · 건설사업관리노임 · SW노임 · 산림노임 · 준용대상 · 유가전력 · 자재품목 · 한국은행환율 · 조달청제비율 · 품셈재료 · 자체
- 원문 이름 = 산림품셈 · 건설품셈 · 건설노임 · 제조노임 · 엔지니어링노임 · 측량노임 · 건설사업관리노임 · SW노임 · 산림노임 · 유가전력 · 자재품목 · 한국은행환율 · 조달청제비율 · 품셈재료 · 자체
## 3. 키
@@ -89,16 +89,16 @@
```
- 인력은 **열 한 벌** — 키 · 원문번호 · 구분 · 상세구분 · 이름 · 규격 · 단위 · 값 · 출처 · 일시간 · 상태 · 옛이름 · 비고 · 준용 · 모든 줄이 모든 칸(없으면 `null` · 빈 목록).
- 인력 `구분` = 건설업 · 제조업 · 엔지니어링 · 측량 · 건설사업관리 · SW · 산림 · 미확보 · 구분별 원문·기관·판·공표일·원천·상세구분·비고는 머리 `구분` 묶음.
- 인력 `구분` = 건설업 · 제조업 · 엔지니어링 · 측량 · 건설사업관리 · SW · 산림 · 구분별 원문·기관·판·공표일·원천·상세구분·비고는 머리 `구분` 묶음.
- 새 조사 = 머리 `구분` 에 한 항목 더하고 줄을 붙이면 끝 · 키는 LB 일련번호 이어 받음.
- `상세구분` = 제조업 업종 · 엔지니어링 부문 · 측량 기술계/기능계 분야 — 없으면 `null` · 목록은 머리에.
- `상태` = 공표 · 산정(미공표 직종의 원문 4-라 값을 `값` 에 넣음 · 근거는 `비고` 한 줄) · 미공표(원문에 값 없음) · 미확보(공표 노임에 같은 직종 없음) · 추정(원문이 이름을 맞대지 않아 작업 범위로 짐작한 대응 — `구분` 대응 직종 · `준용` 에 그 직종 키 · `값`·`단위`·`일시간` 은 빌더가 준용 직종에서 채움 · 근거 문서는 `출처` 짧게).
- `상태` = 공표 · 산정(미공표 직종의 원문 4-라 값을 `값` 에 넣음 · 근거는 `비고` 한 줄) · 미공표(원문에 값 없음) · 미확보(공표 노임에 같은 직종 없음) · 추정(원문이 이름을 맞대지 않아 작업 범위로 짐작한 대응 — `준용` 대응 직종 · `구분` 은 관리자가 정함 · `값`·`단위`·`일시간` 은 빌더가 준용 직종에서 채움 · 근거 문서는 `출처` 짧게).
- `일시간` = 1일 노임 기준 시간 — 8 · 잠수부만 6(원문 4-가).
- 기계 `세부분류` = 건설품셈 · 산림품셈 · 세부분류별 원문·판·주는 머리 `세부분류` 묶음.
- 값이 여럿인 요소(기계)는 `값` 을 묶음으로 — `{ "가격": …, "상각비계수": …, "정비비계수": …, "관리비계수": …, "손료계수": …, "주연료": …, "주연료종류": …, "잡재료율": …, "조종원": …, "조종원직종": … }` · `손료계수` = 원문 「계」.
- 묶음 요소는 `단위` · `출처` 도 같은 모양의 묶음.
- 원문에 없는 값을 지어 넣지 않음. 원문 「-」 = 칸을 비움(`null`).
- `준용` = 모든 줄의 공통 칸 — 관리자가 고르는 다른 요소 키 · 준용 값을 미리 채우지 않음. 공표 노임에 이름이 온전히 같은 직종이 없으면 구분 「미확보」.
- `준용` = 모든 줄의 공통 칸 — 관리자가 고르는 다른 요소 키 · 준용 값을 미리 채우지 않음. 공표 노임에 이름이 온전히 같은 직종이 없으면 상태 「추정」 · 준용에 대응 직종 키.
- `옛이름` = 품셈이 쓰는 옛 직종명 목록(읽기 전용) · 이름 바뀜·통합 근거가 선 것은 준용이 아니라 현행 줄에 바로 적음 · 이력은 그 줄 `비고` · 근거는 `노임단가_직종대응_근거.md`.
- 엔진 차례 = 준용이 있으면 그 요소 값 · 없으면 제 값 · 호표 출처에 「준용: <이름>」 · 상태 「추정」 은 제 값을 쓰고 호표 출처에 「추정(준용: <이름>)」.
- 원문 이름 대신 번호로 적은 값(`조종원직종` = 노임 원문번호 「1048」)은 원문 이름을 `비고` 칸에.
@@ -1,11 +1,10 @@
"""노임 공표 원문 md → 인력 요소 파일 다섯 · 미확보 짝짓기 · 건설노임 미공표 산정.
"""노임 공표 원문 md → 인력 요소 파일 다섯 · 건설노임 미공표 산정 · 추정 줄 되채움.
원문 = resources/knowledge/original/원가계산/노임단가_* (우리 md · ESTX 값 쓰지 않음).
- 모든 줄이 같은 열 한 벌(`_틀.md` 인력) · 제조업 업종·엔지니어링 부문·측량 분야는 「상세구분」.
- 인력_엔지니어링노임 · 측량노임 · 건설사업관리노임 · SW노임 · 산림노임 — md 표 그대로 · 줄 수·값을 md 와 기계 대조.
옛이름·비고·준용은 다시 지어도 그대로 이어받음(`carry`).
- 인력_준용대상(구분 「미확보」) — 새 노임 직종과 이름이 온전히 같은 줄은 옮김(로직 참조도).
건설노임 원문 「통합·명칭변경 직종」 목록의 옛 직종은 현행 줄 `옛이름` 으로 옮겼음.
- 상태 「추정」 줄(옛·폐지 직종) — 관리자가 고른 준용 직종에서 값·단위·일시간을 되채움.
- 인력_건설노임 미공표 — 원문 4-라 산정값을 「값」 에 넣고 상태 「산정」 · 근거는 비고 한 줄.
이음 = 원문 회차의 전체직종 평균을 그대로 이음(미공표직종_추적.md 4절) · 산정값은 같은 md 5절과 대조.
- 인력_제조노임 미공표 — 조사월마다 전체 평균 증가율을 곱하며 원 미만 버림(건설 4-라 방식 준용 · 제조 원문에 규정 없음).
@@ -260,7 +259,7 @@ def check_md(src: Path, rows: list[dict], table_head: str | None = None) -> None
print(f" {src.parent.name[5:]}: {len(rows)} 줄 · 값 합 {sum(got.elements()):,} · md 대조 같음")
# ── 미확보 짝짓기 ────────────────────────────────────────────────────
# ── 관리자 칸 잇기 ────────────────────────────────────────────────────
def carry(rows: list[dict], kind: str, old: list[dict]) -> None:
"""관리자·근거가 채운 칸(옛이름 · 비고 · 준용)은 다시 지어도 그대로 — 이름으로 맞댐."""
had = {r["이름"]: r for r in old if r.get("구분") == kind}
@@ -300,36 +299,9 @@ def main():
}
assert {b: len(v[2]) for b, v in books.items()} == expect
# 이름 → ref (새 다섯 + 건설·제조 공표)
wage = mk.old_view("인력_건설노임.json")
make = mk.old_view("인력_제조노임.json")
pool = {r["이름"]: f"인력:{b}:{r['열쇠']}" for b, (_, _, rows) in books.items() for r in rows}
old_pool = {r["이름"]: f"인력:{d['원문']}:{r['열쇠']}" for d in (wage, make) for r in d[""]}
now = json.loads((MD / "인력.json").read_text(encoding="utf-8"))[""]
applied = { # 현행 줄이 이미 품은 옛 직종명(`_틀.md` 인력 값 · 옛이름)
name for r in now for name in (r.get("옛이름") or [])
} - { # 갈린 직종(절단공)은 옛이름이면서 미확보로도 남음 — 지우지 않음
r["이름"] for r in now if r.get("구분") == "미확보"
}
alias_path = MD / "인력_준용대상.json"
alias = mk.old_view(alias_path.name)
moved, kept = {}, []
for r in alias[""]:
name = r["이름"]
if name in pool:
moved[f"인력:준용대상:{r['열쇠']}"] = pool[name]
continue
assert name not in old_pool, name
if name in applied: # 이미 현행 줄 「옛이름」 으로 옮긴 직종 — 미확보로 다시 만들지 않음
continue
kept.append(r)
alias["비고"] = [
"값을 확인 못 한 직종(공표 노임에 이름이 온전히 같은 직종 없음) — 이름·단위만"
" · 비고 = 이 직종을 요구한 품셈 절 · 비슷한 이름도 비고에"
]
head = {k: v for k, v in alias.items() if k != ""}
dump_master(alias_path, head, kept)
for book, (src, head, rows) in books.items():
carry(rows, mk.LABOR[book], now)
@@ -337,20 +309,6 @@ def main():
rows += [r for r in mk.old_view(f"인력_{book}.json")[""] if r.get("상태") == "추정"]
dump_master(MD / f"인력_{book}.json", head, rows)
# 로직 참조 옮김 — 긴 열쇠부터
n_ref = 0
for path in sorted(MD.glob("로직_*.json")):
text = path.read_text(encoding="utf-8")
new = text
for old in sorted(moved, key=len, reverse=True):
n_ref += new.count(old)
new = new.replace(old, moved[old])
if new != text:
path.write_bytes(new.encode("utf-8"))
print(
f"미확보 {len(alias[''])} → 옮김 {len(moved)} {sorted(moved.values())} · 남김 {len(kept)} · 로직 참조 {n_ref}"
)
estimate(wage)
estimate_make(make)
print("새 틀로 받음", mk.adopt())
@@ -40,7 +40,6 @@ BOOKS = (
"건설사업관리노임",
"SW노임",
"산림노임",
"준용대상",
"유가전력",
"자재품목",
"한국은행환율",
@@ -48,6 +47,7 @@ BOOKS = (
"품셈재료",
"질의회신",
"엔산법",
"공간정보법",
"자체",
)
DIVISIONS = {
@@ -131,7 +131,6 @@ LABOR = {
"건설사업관리노임": "건설사업관리",
"SW노임": "SW",
"산림노임": "산림",
"준용대상": "미확보",
}
MERGED = {
"인력": ("인력.json", "구분", LABOR),
+10 -33
View File
@@ -2,7 +2,7 @@
"그룹": "인력",
"비고": [
"열 한 벌 = 키 · 원문번호 · 구분 · 상세구분 · 이름 · 규격 · 단위 · 값 · 출처 · 일시간 · 상태 · 옛이름 · 비고 · 준용 — 모든 줄이 모든 칸을 가짐(없으면 null · 빈 목록)",
"상태 = 공표 · 산정(원문 4-라 산정값을 값에 넣음 · 근거는 비고) · 미공표(원문에 값 없음) · 미확보(공표 노임에 같은 직종 없음) · 추정(원문이 이름을 맞대지 않아 작업 범위로 짐작 · 구분·값·단위·일시간은 준용 직종 것 · 준용에 그 직종 키 · 근거 문서는 출처)",
"상태 = 공표 · 산정(원문 4-라 산정값을 값에 넣음 · 근거는 비고) · 미공표(원문에 값 없음) · 미확보(공표 노임에 같은 직종 없음) · 추정(원문이 이름을 맞대지 않아 작업 범위로 짐작 · 값·단위·일시간은 준용 직종 것 · 구분은 관리자가 정함 · 준용에 그 직종 키 · 근거 문서는 출처)",
"준용 = 관리자가 고르는 다른 직종 키 — 있으면 엔진이 그 직종 값을 씀(값이 있어도 앞섬) · 없으면 값 · 호표 출처에 「준용: <이름>」 · 상태 「추정」 은 제 값을 쓰고 「추정(준용: <이름>)」",
"새 조사 = 머리 「구분」 에 한 항목(원문 · 기관 · 판 · 공표일 · 원천 · 상세구분) 더하고 줄을 붙이면 끝 · 키는 LB 일련번호 이어 받음",
"옛이름 = 품셈이 쓰는 옛 직종명 목록(읽기 전용) · 근거 resources/knowledge/original/원가계산/노임단가_직종대응_근거.md"
@@ -225,14 +225,6 @@
],
"상세구분": [],
"비고": ["산림청 2026년 나무의사·수목치료기술자 노임단가 알림(수목진료 표준품셈 예정가격 작성용) · 2025년 소비자물가상승률 2.1% 반영(원문) · 통계 승인 노임 아님", "판 = 2026년 적용(원문에 적용 시작일 없음 · 1월 1일로 적음)"]
},
"미확보": {
"원문": "준용대상",
"기관": null,
"판": "2026-09-19",
"원천": [],
"상세구분": [],
"비고": ["값을 확인 못 한 직종(공표 노임에 이름이 온전히 같은 직종 없음) — 이름·단위만 · 비고 = 이 직종을 요구한 품셈 절 · 비슷한 이름도 비고에"]
}
},
"줄": [
@@ -596,38 +588,23 @@
{ "키": "LB000358", "원문번호": "정보보안전문가", "구분": "SW", "상세구분": null, "이름": "정보보안전문가", "규격": "", "단위": "원/일", "값": 507887, "출처": "SW노임 17", "일시간": 8, "상태": "공표", "옛이름": [], "비고": null, "준용": null },
{ "키": "LB000359", "원문번호": "나무의사", "구분": "산림", "상세구분": null, "이름": "나무의사", "규격": "", "단위": "원/일", "값": 326359, "출처": "산림노임 나무의사", "일시간": 8, "상태": "공표", "옛이름": [], "비고": null, "준용": null },
{ "키": "LB000360", "원문번호": "수목치료기술자", "구분": "산림", "상세구분": null, "이름": "수목치료기술자", "규격": "", "단위": "원/일", "값": 238447, "출처": "산림노임 수목치료기술자", "일시간": 8, "상태": "공표", "옛이름": [], "비고": null, "준용": null },
{ "키": "LB000362", "원문번호": "절단공", "구분": "미확보", "상세구분": null, "이름": "절단공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "일시간": 8, "상태": "미확보", "옛이름": [], "비고": "건설품셈 기계설비 13-6-11 · 건설품셈 기계설비 13-6-13 · 건설품셈 기계설비 13-6-17", "준용": null },
{ "키": "LB000362", "원문번호": "절단공", "구분": "건설업", "상세구분": null, "이름": "절단공", "규격": "", "단위": "원/일", "값": 221481, "출처": "건설노임 통합표 2010.1", "일시간": 8, "상태": "추정", "옛이름": [], "비고": "철근공·철공·철판공·철골공 중 추정", "준용": "LB000010" },
{ "키": "LB000373", "원문번호": "정보처리기사", "구분": "엔지니어링", "상세구분": "정보통신", "이름": "정보처리기사", "규격": "", "단위": "원/일", "값": 249574, "출처": "엔산법 시행령 별표2", "일시간": 8, "상태": "추정", "옛이름": [], "비고": null, "준용": "LB000292" },
{ "키": "LB000384", "원문번호": "사진제판공", "구분": "미확보", "상세구분": null, "이름": "사진제판공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "일시간": 8, "상태": "미확보", "옛이름": [], "비고": "건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-7-2", "준용": null },
{ "키": "LB000385", "원문번호": "사진식자공", "구분": "미확보", "상세구분": null, "이름": "사진식자공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "일시간": 8, "상태": "미확보", "옛이름": [], "비고": "건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-7-2", "준용": null },
{ "키": "LB000384", "원문번호": "사진제판공", "구분": "건설업", "상세구분": null, "이름": "사진제판공", "규격": "", "단위": "원/일", "값": 106954, "출처": "제조노임 직종해설 29호", "일시간": 8, "상태": "추정", "옛이름": [], "비고": "폐지 직종", "준용": "LB000161" },
{ "키": "LB000385", "원문번호": "사진식자공", "구분": "건설업", "상세구분": null, "이름": "사진식자공", "규격": "", "단위": "원/일", "값": 106954, "출처": "제조노임 직종해설 29호", "일시간": 8, "상태": "추정", "옛이름": [], "비고": "폐지 직종", "준용": "LB000161" },
{ "키": "LB000386", "원문번호": "옵셋인쇄공", "구분": "제조업", "상세구분": "출판․인쇄", "이름": "옵셋인쇄공", "규격": "", "단위": "원/일", "값": 121205, "출처": "제조노임 직종해설 31호", "일시간": 8, "상태": "추정", "옛이름": [], "비고": null, "준용": "LB000163" },
{
"키": "LB000390",
"원문번호": "측량사",
"구분": "미확보",
"상세구분": null,
"이름": "측량사",
"규격": "",
"단위": "원/일",
"값": null,
"출처": "준용대상",
"일시간": 8,
"상태": "미확보",
"옛이름": [],
"비고": "건설품셈 기계설비 13-5-2 · 건설품셈 기계설비 13-5-8 · 건설품셈 기계설비 13-6-1 · 건설품셈 기계설비 13-6-2 · 건설품셈 기계설비 13-6-3 · 건설품셈 기계설비 13-6-4 · 건설품셈 기계설비 13-6-6 · 건설품셈 기계설비 13-6-7 · 건설품셈 기계설비 13-6-8 · 건설품셈 기계설비 13-6-10 · 건설품셈 기계설비 13-6-12 · 건설품셈 기계설비 13-6-16 · 건설품셈 기계설비 13-7-1 · 건설품셈 기계설비 13-7-2 · 건설품셈 기계설비 13-7-4 · 건설품셈 기계설비 13-9-2 · 건설품셈 기계설비 13-10-2 · 건설품셈 기계설비 13-10-3 · 건설품셈 기계설비 13-11-3",
"준용": null
},
{ "키": "LB000390", "원문번호": "측량사", "구분": "건설업", "상세구분": null, "이름": "측량사", "규격": "", "단위": "원/일", "값": 251596, "출처": "공간정보법 시행령 별표5", "일시간": 8, "상태": "추정", "옛이름": [], "비고": "구 측량사 자격 추정", "준용": "LB000321" },
{ "키": "LB000391", "원문번호": "제관공", "구분": "건설업", "상세구분": null, "이름": "제관공", "규격": "", "단위": "원/일", "값": 266029, "출처": "건설품셈 기계설비 13-06", "일시간": 8, "상태": "추정", "옛이름": [], "비고": null, "준용": "LB000057" },
{ "키": "LB000392", "원문번호": "공작기계공", "구분": "제조업", "상세구분": "공작기계 조작", "이름": "공작기계공", "규격": "", "단위": "원/일", "값": 123489, "출처": "제조노임 직종해설 70·85호", "일시간": 8, "상태": "추정", "옛이름": [], "비고": "밀링원일 수 있음", "준용": "LB000202" },
{ "키": "LB000394", "원문번호": "마킹공", "구분": "건설업", "상세구분": null, "이름": "마킹공", "규격": "", "단위": "원/일", "값": 266029, "출처": "건설품셈 기계설비 13-06", "일시간": 8, "상태": "추정", "옛이름": [], "비고": null, "준용": "LB000057" },
{ "키": "LB000395", "원문번호": "산소절단공", "구분": "건설업", "상세구분": null, "이름": "산소절단공", "규격": "", "단위": "원/일", "값": 266029, "출처": "건설품셈 기계설비 13-06", "일시간": 8, "상태": "추정", "옛이름": [], "비고": null, "준용": "LB000057" },
{ "키": "LB000396", "원문번호": "측량기사", "구분": "미확보", "상세구분": null, "이름": "측량기사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "일시간": 8, "상태": "미확보", "옛이름": [], "비고": "건설품셈 기계설비 13-6-8", "준용": null },
{ "키": "LB000396", "원문번호": "측량기사", "구분": "건설업", "상세구분": null, "이름": "측량기사", "규격": "", "단위": "원/일", "값": 215609, "출처": "공간정보법 시행령 별표5", "일시간": 8, "상태": "추정", "옛이름": [], "비고": null, "준용": "LB000322" },
{ "키": "LB000397", "원문번호": "시험사1급", "구분": "건설업", "상세구분": null, "이름": "시험사1급", "규격": "", "단위": "원/일", "값": 199588, "출처": "건설노임 명칭변경표 2010.1", "일시간": 8, "상태": "추정", "옛이름": [], "비고": null, "준용": "LB000068" },
{ "키": "LB000398", "원문번호": "특수운전공", "구분": "미확보", "상세구분": null, "이름": "특수운전공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "일시간": 8, "상태": "미확보", "옛이름": [], "비고": "건설품셈 기계설비 13-6-8 · 건설품셈 기계설비 13-6-9", "준용": null },
{ "키": "LB000398", "원문번호": "특수운전공", "구분": "건설업", "상세구분": null, "이름": "특수운전공", "규격": "", "단위": "원/일", "값": 173995, "출처": "건설품셈 기계설비 13-06", "일시간": 8, "상태": "추정", "옛이름": [], "비고": "공표 이력 없음", "준용": "LB000050" },
{ "키": "LB000400", "원문번호": "제도공", "구분": "제조업", "상세구분": "CAD설계", "이름": "제도공", "규격": "", "단위": "원/일", "값": 160065, "출처": "제조노임 직종해설 1호", "일시간": 8, "상태": "추정", "옛이름": [], "비고": null, "준용": "LB000133" },
{ "키": "LB000401", "원문번호": "현도공", "구분": "건설업", "상세구분": null, "이름": "현도공", "규격": "", "단위": "원/일", "값": 266029, "출처": "건설품셈 기계설비 13-06", "일시간": 8, "상태": "추정", "옛이름": [], "비고": null, "준용": "LB000057" },
{ "키": "LB000402", "원문번호": "측량조수", "구분": "미확보", "상세구분": null, "이름": "측량조수", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "일시간": 8, "상태": "미확보", "옛이름": [], "비고": "건설품셈 기계설비 13-6-12 · 건설품셈 기계설비 13-6-16", "준용": null },
{ "키": "LB000403", "원문번호": "시공측량기사", "구분": "미확보", "상세구분": null, "이름": "시공측량기사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "일시간": 8, "상태": "미확보", "옛이름": [], "비고": "건설품셈 기계설비 13-6-14", "준용": null },
{ "키": "LB000404", "원문번호": "시공측량조수", "구분": "미확보", "상세구분": null, "이름": "시공측량조수", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "일시간": 8, "상태": "미확보", "옛이름": [], "비고": "건설품셈 기계설비 13-6-14", "준용": null }
{ "키": "LB000402", "원문번호": "측량조수", "구분": "건설업", "상세구분": null, "이름": "측량조수", "규격": "", "단위": "원/일", "값": 172068, "출처": "건설노임 직종 조정 2009", "일시간": 8, "상태": "추정", "옛이름": [], "비고": "측부 폐지 · 보통인부 추정", "준용": "LB000002" },
{ "키": "LB000403", "원문번호": "시공측량기사", "구분": "건설업", "상세구분": null, "이름": "시공측량기사", "규격": "", "단위": "원/일", "값": 215609, "출처": "공간정보법 시행령 별표5", "일시간": 8, "상태": "추정", "옛이름": [], "비고": "2009 폐지 직종", "준용": "LB000322" },
{ "키": "LB000404", "원문번호": "시공측량조수", "구분": "건설업", "상세구분": null, "이름": "시공측량조수", "규격": "", "단위": "원/일", "값": 172068, "출처": "건설노임 직종 조정 2009", "일시간": 8, "상태": "추정", "옛이름": [], "비고": "측부 폐지 · 보통인부 추정", "준용": "LB000002" }
]
}
+1 -1
View File
@@ -328,7 +328,7 @@ def test_구분_목록(client: TestClient) -> None:
"""구분 목록 API — 파일 머리에 등록된 갈래 그대로(화면이 목록을 안 품음)."""
got = _get(client, "/api/m01/subs", file=LABOR)
names = [s["name"] for s in got["subs"]]
assert got["slot"] == "구분" and names[0] == "건설업" and names[-1] == "미확보"
assert got["slot"] == "구분" and names[0] == "건설업" and names[-1] == "산림"
survey = next(s for s in got["subs"] if s["name"] == "측량")
assert survey["book"] == "측량노임" and "기능계 도화" in survey["details"]
machine = _get(client, "/api/m01/subs", file="기계.json")
+8 -6
View File
@@ -612,9 +612,9 @@ def test_미공표_준용():
got = mf.run(mf.Master(files), "GX999999", {})
assert got[""][0]["출처"] == "준용: 보통인부"
assert got["노무비"] == 2 * Decimal(172068)
lines[0]["요소"] = "LB:절단공" # 공표 노임에 없는 직종(미확보) — 준용을 골라야 값이 섬
lines[0]["요소"] = "LB:절단공" # 값도 준용도 없으면 멈춤 — 준용을 골라야 값이 섬
alias = mf.Master(files).get("LB:절단공")
assert alias[""] is None and alias["준용"] is None and alias["구분"] == "미확보"
alias["상태"], alias[""], alias["준용"] = "미확보", None, None
with pytest.raises(mf.FormulaError):
mf.run(mf.Master(files), "GX999999", {})
alias["준용"] = common
@@ -633,6 +633,9 @@ def test_추정은_준용_값에_표시(whole):
assert row[""] == target[""] and row["단위"] == target["단위"]
assert row["출처"] == "건설품셈 기계설비 13-06"
assert whole.value("LB:제관공") == (target[""], "추정(준용: 플랜트제관공)")
cut = whole.get("LB:절단공") # 사용자 지정 추정(옛 미확보 9 직종)
assert cut["상태"] == "추정" and cut["출처"] == "건설노임 통합표 2010.1"
assert whole.value("LB:절단공") == (whole.get("LB:1010")[""], "추정(준용: 철판공)")
def test_노임_갈래_파일_원문_대조():
@@ -642,18 +645,17 @@ def test_노임_갈래_파일_원문_대조():
rows = data[""]
count = {b: sum(r["구분"] == b for r in rows) for b in data["구분"]}
assert count == {
"건설업": 137, # 추정 5 = 제관공·마킹공·현도공·산소절단공·시험사1급
"건설업": 146, # 추정 14 = 제관공류 5 + 사용자 지정 9(옛 미확보)
"제조업": 132, # 추정 3 = 제도공·공작기계공·옵셋인쇄공
"엔지니어링": 57, # 추정 1 = 정보처리기사
"측량": 20,
"건설사업관리": 4,
"SW": 17,
"산림": 2,
"미확보": 9, # 원문이 대응을 정하지 않은 직종만 남김
}
assert {tuple(r) for r in rows} == {cm.LABOR_COLS}
# 「미공표」 는 남지 않음 — 건설·제조 미공표 직종은 모두 「산정」(원 미만 버림)
assert {r["상태"] for r in rows} == set(cm.LABOR_STATUS) - {"미공표"}
# 「미공표」·「미확보」 는 남지 않음 — 미공표는 「산정」(원 미만 버림) · 미확보는 「추정」
assert {r["상태"] for r in rows} == set(cm.LABOR_STATUS) - {"미공표", "미확보"}
whole = mf.Master(files)
assert whole.value("LB:기술사(건설)")[0] == 467217
assert whole.value("LB:측량중급기술자")[0] == 251596