diff --git a/resources/knowledge/original/원가계산/노임단가_직종대응_근거.md b/resources/knowledge/original/원가계산/노임단가_직종대응_근거.md index ae48fd88..43ad510e 100644 --- a/resources/knowledge/original/원가계산/노임단가_직종대응_근거.md +++ b/resources/knowledge/original/원가계산/노임단가_직종대응_근거.md @@ -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` 준용 칸을 고침 — 값은 빌더가 준용 직종에서 다시 채움. diff --git a/resources/master_data/_틀.md b/resources/master_data/_틀.md index c9323756..8d0b6199 100644 --- a/resources/master_data/_틀.md +++ b/resources/master_data/_틀.md @@ -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」)은 원문 이름을 `비고` 칸에. diff --git a/resources/master_data/scripts/build_인력_노임.py b/resources/master_data/scripts/build_인력_노임.py index cb31f1df..ecbfe3f6 100644 --- a/resources/master_data/scripts/build_인력_노임.py +++ b/resources/master_data/scripts/build_인력_노임.py @@ -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()) diff --git a/resources/master_data/scripts/check_master.py b/resources/master_data/scripts/check_master.py index c75282fb..34002383 100644 --- a/resources/master_data/scripts/check_master.py +++ b/resources/master_data/scripts/check_master.py @@ -40,7 +40,6 @@ BOOKS = ( "건설사업관리노임", "SW노임", "산림노임", - "준용대상", "유가전력", "자재품목", "한국은행환율", @@ -48,6 +47,7 @@ BOOKS = ( "품셈재료", "질의회신", "엔산법", + "공간정보법", "자체", ) DIVISIONS = { diff --git a/resources/master_data/scripts/master_keys.py b/resources/master_data/scripts/master_keys.py index df736f7a..98a86dd1 100644 --- a/resources/master_data/scripts/master_keys.py +++ b/resources/master_data/scripts/master_keys.py @@ -131,7 +131,6 @@ LABOR = { "건설사업관리노임": "건설사업관리", "SW노임": "SW", "산림노임": "산림", - "준용대상": "미확보", } MERGED = { "인력": ("인력.json", "구분", LABOR), diff --git a/resources/master_data/인력.json b/resources/master_data/인력.json index 08231091..69713e23 100644 --- a/resources/master_data/인력.json +++ b/resources/master_data/인력.json @@ -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" } ] } diff --git a/resources/tester/test_m01_api.py b/resources/tester/test_m01_api.py index e41f8511..f97ecd2a 100644 --- a/resources/tester/test_m01_api.py +++ b/resources/tester/test_m01_api.py @@ -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") diff --git a/resources/tester/test_masterdata_check.py b/resources/tester/test_masterdata_check.py index 58df726d..ac9f56fa 100644 --- a/resources/tester/test_masterdata_check.py +++ b/resources/tester/test_masterdata_check.py @@ -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