From 3f4fd66d21bde803696dc87343db96c35c4e59d2 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 20 Sep 2026 01:34:24 +0900 Subject: [PATCH] =?UTF-8?q?feat(master=5Fdata):=20=EB=85=B8=EC=9E=84=20?= =?UTF-8?q?=EB=A7=88=EC=8A=A4=ED=84=B0=ED=99=94=20=E2=80=94=20=EC=9B=90?= =?UTF-8?q?=EB=AC=B8=20md=20=EB=8B=A4=EC=84=AF=20=EA=B0=88=EB=9E=98=20?= =?UTF-8?q?=EB=85=B8=EC=9E=84=20=C2=B7=20=EC=A4=80=EC=9A=A9=EB=8C=80?= =?UTF-8?q?=EC=83=81=20=EC=A7=9D=EC=A7=93=EA=B8=B0=C2=B7=ED=86=B5=ED=95=A9?= =?UTF-8?q?=20=C2=B7=20=EB=AF=B8=EA=B3=B5=ED=91=9C=20=EC=82=B0=EC=A0=95=20?= =?UTF-8?q?=C2=B7=20ESTX=20=ED=95=AD=EB=AA=A9=20=EB=B9=84=EA=B5=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 새 요소 파일(우리 md 에서만 · 판 2026-01-01): 엔지니어링노임 56 · 측량노임 20 · 건설사업관리노임 4 · SW노임 17 · 산림노임 2 — 빌더 build_인력_노임.py · 줄 수·값 md 기계 대조 - 준용대상 49 → 48: 측량중급기술자 옮김(로직 참조 8) · 원문 통합 목록 5 직종 통합 칸(목도 · 특수비계공 · 함석공 · 갱부 · 스레이트공) · 절단공 갈림 · 비슷한 이름 21 후보 - 건설노임 미공표 14 산정{값 · 근거 · 마지막공표} — 원문 회차 평균 그대로 이음 · 석조각공·드잡이공편수 다산소프트와 이음 계열 다름 비고 · 2026-09-01 적용분 확보됨 비고 - 엔진 차례 값 → 준용 → 통합 → 산정 · 호표 출처 · M01 준용 후보 7 노임 파일 · 통합·산정·후보 칸 읽기 전용 - ref/_비교_estx.md 10절: ESTX 378 줄 중 371 짝 · 짝 없는 직종 42 · 일괄 시험 계산 통과 1104 → 1115 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj --- M01_MasterData/M01_MasterData_Store.py | 15 +- M01_MasterData/M01_MasterData_UI_Logic_Api.ts | 2 +- M01_MasterData/M01_MasterData_UI_Rows.ts | 6 +- resources/master_data/_틀.md | 7 +- resources/master_data/ref/_비교_estx.md | 108 +++++ .../master_data/scripts/build_인력_노임.py | 415 ++++++++++++++++++ resources/master_data/scripts/check_master.py | 18 +- .../master_data/scripts/master_formula.py | 21 +- .../master_data/scripts/master_material.py | 3 +- .../master_data/로직_건설품셈_토목4장.json | 16 +- resources/master_data/인력_SW노임.json | 37 ++ resources/master_data/인력_건설노임.json | 84 +++- .../master_data/인력_건설사업관리노임.json | 23 + resources/master_data/인력_산림노임.json | 21 + .../master_data/인력_엔지니어링노임.json | 76 ++++ resources/master_data/인력_준용대상.json | 129 ++++-- resources/master_data/인력_측량노임.json | 39 ++ resources/tester/test_m01_api.py | 4 + resources/tester/test_masterdata_check.py | 38 +- 19 files changed, 988 insertions(+), 74 deletions(-) create mode 100644 resources/master_data/scripts/build_인력_노임.py create mode 100644 resources/master_data/인력_SW노임.json create mode 100644 resources/master_data/인력_건설사업관리노임.json create mode 100644 resources/master_data/인력_산림노임.json create mode 100644 resources/master_data/인력_엔지니어링노임.json create mode 100644 resources/master_data/인력_측량노임.json diff --git a/M01_MasterData/M01_MasterData_Store.py b/M01_MasterData/M01_MasterData_Store.py index 6909b935..103013b6 100644 --- a/M01_MasterData/M01_MasterData_Store.py +++ b/M01_MasterData/M01_MasterData_Store.py @@ -232,7 +232,18 @@ def elements(group: str, q: str, limit: int) -> dict: _PICK = { "procure": "재료_나라장터자재.json", "price": "재료_시중물가.json", - "job": ("인력_건설노임.json", "인력_제조노임.json"), + "job": tuple( + f"인력_{b}.json" + for b in ( + "건설노임", + "제조노임", + "엔지니어링노임", + "측량노임", + "건설사업관리노임", + "SW노임", + "산림노임", + ) + ), } @@ -251,7 +262,7 @@ def _lowest(value) -> object: def pick(kind: str, q: str, limit: int) -> dict: """고르기 창 — `procure` 나라장터자재(ref = 나라장터:<열쇠>) · `price` 시중물가(관급 조달 줄 포함 · ref = 열쇠) - · `job` 값 있는 건설노임·제조노임 직종(ref = 인력:원문:열쇠) · 이름·규격 낱말이 모두 들어간 줄.""" + · `job` 값 있는 공표 노임 직종(건설·제조·엔지니어링·측량·건설사업관리·SW·산림)(ref = 인력:원문:열쇠) · 이름·규격 낱말이 모두 들어간 줄.""" if kind not in _PICK: raise StoreError(404, f"없는 고르기 「{kind}」") words = [_squash(w) for w in q.split()] diff --git a/M01_MasterData/M01_MasterData_UI_Logic_Api.ts b/M01_MasterData/M01_MasterData_UI_Logic_Api.ts index f98b44a0..e5a451bf 100644 --- a/M01_MasterData/M01_MasterData_UI_Logic_Api.ts +++ b/M01_MasterData/M01_MasterData_UI_Logic_Api.ts @@ -81,7 +81,7 @@ export interface CalcLine { 단가: number; 금액: number; 비목: Record; - /** 값 없는 요소를 다른 요소로 셈 — 「준용: <직종>」 */ + /** 값 없는 요소를 다른 값으로 셈 — 「준용: <직종>」 · 「통합: <직종>」 · 「산정: …」 */ 출처?: string; } export type CalcAnswer = diff --git a/M01_MasterData/M01_MasterData_UI_Rows.ts b/M01_MasterData/M01_MasterData_UI_Rows.ts index b1cc92ba..1009721f 100644 --- a/M01_MasterData/M01_MasterData_UI_Rows.ts +++ b/M01_MasterData/M01_MasterData_UI_Rows.ts @@ -58,6 +58,10 @@ function hidden(file: string, col: string): boolean { return JOB.includes(file) && col === "준용"; } +/** 빌더가 원문에서 채운 칸(통합 · 산정 · 후보) — 읽기 전용. */ +const fixed = (file: string, col: string): boolean => + JOB.includes(file) && ["통합", "산정", "후보"].includes(col.split(SEP)[0]); + const HEADS: Record = { [MARKET]: ["조달 값", "조달 기준", "M01_ProcureCol"], [LINKED]: ["M01_PriceCol"], @@ -126,7 +130,7 @@ export function renderRows(host: HTMLElement, file: string, q: string): () => vo ), ); for (const c of cols) { - const editable = !deleted && isScalar(orig[c]); + const editable = !deleted && isScalar(orig[c]) && !fixed(file, c); tr.append( buildCell(show(now[c]), { changed: !same(now[c], orig[c]), diff --git a/resources/master_data/_틀.md b/resources/master_data/_틀.md index 825d79e6..3ac69d64 100644 --- a/resources/master_data/_틀.md +++ b/resources/master_data/_틀.md @@ -12,7 +12,7 @@ - 이름 = `그룹_원문[_장].json` — 날짜 없음 · 마스터는 항상 최신. 예: `인력_건설노임.json` · `소요량_산림품셈_13장.json` · `로직_산림품셈_13장.json` - 그룹 = 인력 · 재료 · 기계 · 소요량 · 계수 · 환율 · 요율 · 로직 -- 원문 이름 = 산림품셈 · 건설품셈 · 건설노임 · 제조노임 · 준용대상 · 나라장터자재 · 오피넷유가 · 시중물가 · 한국은행환율 · 조달청제비율 · 품셈재료 · 자체 +- 원문 이름 = 산림품셈 · 건설품셈 · 건설노임 · 제조노임 · 엔지니어링노임 · 측량노임 · 건설사업관리노임 · SW노임 · 산림노임 · 준용대상 · 나라장터자재 · 오피넷유가 · 시중물가 · 한국은행환율 · 조달청제비율 · 품셈재료 · 자체 - UTF-8 · LF · 들여쓰기 2칸 · 칸 이름은 한글. ## 3. 출처 @@ -38,7 +38,10 @@ - 값이 여럿인 요소(기계)는 `값` 을 묶음으로 — `{ "가격": …, "상각비계수": …, "정비비계수": …, "관리비계수": …, "손료계수": …, "주연료": …, "주연료종류": …, "잡재료율": …, "조종원": …, "조종원직종": … }` · `손료계수` = 원문 「계」. - 묶음 요소는 `단위` · `출처` 도 같은 모양의 묶음. - 원문에 없는 값을 지어 넣지 않음. 원문 「-」 = 칸을 비움(`null`). -- `준용` = 값 없는 요소에 관리자가 고르는 유사 요소 열쇠(같은 원문 열쇠 또는 `그룹:원문:열쇠`) — 엔진은 값이 비면 그 값을 쓰고 호표 출처에 「준용: <이름>」. 값을 확인 못 한 직종(건설노임 미공표 · 공표 노임에 없는 직종)은 모두 이 방식 — 없는 직종은 `인력_준용대상.json`. 준용 값을 미리 채우지 않음. +- `준용` = 값 없는 요소에 관리자가 고르는 유사 요소 열쇠(같은 원문 열쇠 또는 `그룹:원문:열쇠`) — 준용 값을 미리 채우지 않음. 공표 노임에 이름이 온전히 같은 직종이 없으면 `인력_준용대상.json`. +- `통합` = 건설노임 원문 「통합·명칭변경 직종」 목록의 새 직종 `그룹:원문:열쇠` · 갈리면 null + `후보`. `후보` = 비슷한 이름 글(값 안 씀). +- `산정` = 건설노임 미공표 직종의 원문 4-라 값 `{ 값, 근거, 마지막공표[, 비고] }` — 원 미만 처리 안 함. +- 엔진 차례 = 값 → 준용 → 통합 → 산정 · 호표 출처에 「준용: <이름>」 · 「통합: <이름>」 · 「산정: …」. - 원문 이름 대신 번호로 적은 값(`조종원직종` = 노임 번호 「1048」)은 원문 이름을 `비고` 칸에. 재료 값: diff --git a/resources/master_data/ref/_비교_estx.md b/resources/master_data/ref/_비교_estx.md index c176a181..71b16db7 100644 --- a/resources/master_data/ref/_비교_estx.md +++ b/resources/master_data/ref/_비교_estx.md @@ -280,3 +280,111 @@ ESTX 첫 묶음에만 있는 옛 이름 12 — 원문 「2. 임금적용요령 - 목도 · 통합 대상 5 는 원문 「2. 임금적용요령」 통합·명칭 변경 목록에 있음 — 다산소프트 준용이 아닌 원문 준용 길. 우리 `인력_미확보.json` 에 남아 있음(마스터 고치지 않음 · 조사만). - 제조 조사 비슷한 이름(판금원 · 절단원 · 용접원 · 인쇄기능원 등)은 값 10만 원대 — 건설 쪽과 같은 값 없음. + +## (10) 노임 마스터화 — 우리 원문 md ↔ ESTX 노임 전 줄(직종 이름·조사 기준) + +**결론: 직종 항목은 7 조사 모두 맞춰짐.** ESTX 378 줄 가운데 우리 줄과 이름이 같은 짝 346 · 표기만 다른 짝 13 · 원문 옛 이름 짝 12 = 371. 남는 ESTX 7 줄 = 엔지니어링 옛 등급 기능사 3 · 건설사업관리 옛 이름 감리 3 · 제조 오기 1. 우리에만 있는 줄 1(ESTX 오기의 짝). 값이 다른 짝 = 건설 미공표 14(우리 산정은 원 미만 처리 없음) · 제조 129 전부(ESTX 는 앞 회차). + +- 새 파일(우리 md 에서만 · 다산소프트 값 안 씀 · 판 2026-01-01): `인력_엔지니어링노임` 56 · `인력_측량노임` 20 · `인력_건설사업관리노임` 4 · `인력_SW노임` 17 · `인력_산림노임` 2 — 빌더 `scripts/build_인력_노임.py` · 줄 수·값을 md 표와 기계 대조(엔지니어링은 같은 게시물 xls 2025 칸과도 대조). +- 건설노임 판 2026-01-01 그대로 · 비고 「2026-09-01 적용분 확보됨」. + +### 조사별 짝 + +| 조사 | 우리 줄 | ESTX 줄 | 이름 같음 | 표기만 다름 | 옛 이름 | 우리에만 | ESTX 에만 | +|---|---|---|---|---|---|---|---| +| 건설노임 | 132 | 144 | 132 | 0 | 12 | 0 | 0 | +| 엔지니어링노임 | 56 | 59 | 48 | 8 | 0 | 0 | 3 | +| 측량노임 | 20 | 20 | 20 | 0 | 0 | 0 | 0 | +| 건설사업관리노임 | 4 | 7 | 0 | 4 | 0 | 0 | 3 | +| SW노임 | 17 | 17 | 16 | 1 | 0 | 0 | 0 | +| 제조노임 | 129 | 129 | 128 | 0 | 0 | 1 | 1 | +| 산림노임 | 2 | 2 | 2 | 0 | 0 | 0 | 0 | +| 합 | 360 | 378 | 346 | 13 | 12 | 1 | 7 | + +- 이름 같음 = 빈칸·「/」·ESTX 「(제조)」 꼬리만 떼고 같은 이름. +- 표기만 다름: 엔지니어링 부문 없는 「기술사 · 특급~초급기술자 · 고급~초급숙련기술자」 8 = 우리 「…(건설)」(값 같음 · ESTX 가 부문 없는 이름에 건설 부문 값을 둠) · 「특급~초급 건설사업관리기술자」 4 = 원문 「…건설사업관리기술인」 · SW 「IT프로젝트관리자」 = 원문 「IT PM」. +- 옛 이름 12 = 건설노임 원문 통합·명칭변경 목록 — 용접공(일반) · 보링공(지질조사) · 목도 · 건설기계운전기사 · 운전사(운반차) · 운전사(기계) · 기계설치공 · 기계공 · 준설선기관장 · 준설선전기사 · 보통선원 · 고급선원(값 = 새 직종 값). +- ESTX 에만: 엔지니어링 고급·중급·초급기능사(값 = 건설 부문 숙련기술자 · 원문 2025 공표에 기능사 등급 없음) · 수석감리사 · 감리사 · 감리사보(값 = 특급·고급·중급 건설사업관리 · 원문에 없음) · 제조 「금속재료품질시험원」(원문 117 「금속재료제품시험원」의 오기 · 값은 원문 2025년 8월 칸 108,637). + +### 값 다른 짝 (값은 참고) + +| 조사 | 직종 | 우리 | ESTX | 까닭 | +|---|---|---|---|---| +| 건설 | 연마공 | 산정 211,645.83 | 211,645 | 원 미만만 | +| 건설 | 준설선선장 | 산정 244,500.27 | 244,498 | ESTX 단계마다 버림 | +| 건설 | 준설선기관사 | 산정 215,167.20 | 215,165 | 〃 | +| 건설 | 준설선운전사 | 산정 209,443.16 | 209,441 | 〃 | +| 건설 | 선원 | 산정 208,507.96 | 208,506 | 〃 | +| 건설 | 플랜트특수용접공 | 산정 338,645.18 | 338,645 | 원 미만만 | +| 건설 | 플랜트덕트공 | 산정 217,176.17 | 217,174 | ESTX 단계마다 버림 | +| 건설 | 도편수 | 산정 516,566.46 | 516,565 | 〃 | +| 건설 | 드잡이공 | 산정 322,924.87 | 322,923 | 〃 | +| 건설 | 목조각공 | 산정 297,226.57 | 297,221 | 〃 | +| 건설 | 석조각공 | 산정 295,023.87 | 293,753 | 〃 + 이음 계열 다름(ESTX = 2020.1 123종 → 2020.9 127종 평균) | +| 건설 | 드잡이공편수 | 산정 359,448.14 | 357,905 | 〃 + 이음 계열 다름 | +| 건설 | 한식미장공편수 | 산정 374,531.02 | 374,529 | ESTX 단계마다 버림 | +| 건설 | 한식와공편수 | 산정 463,729.90 | 463,729 | 원 미만만 | +| 제조 | 129 줄 전부 | 2026년 3월 조사(적용 2026-07-01) | 앞 회차 | ESTX 118 줄 = 원문 「2025년 8월 조사노임」 칸 · 10 줄 = 원문이 「*」(표본 부족 미공표)인데 ESTX 값 있음(목재건조기계조작원 · 목제품도장원 · 목형원 · 전선원 · 피복원 · 합성수지피막원 · 쇠톱기조작원 · 모형조각기조작원 · 기타공학품질관리사 · 기타공학제품시험원) · 우리 원문 「*」 16 줄은 값 없음 | + +- 엔지니어링 · 측량 · 건설사업관리 · SW · 산림의 짝(표기만 다른 짝 포함)은 값 모두 같음. + +### 건설노임 미공표 14 — 산정 + +- `산정` = {값 · 근거 · 마지막공표 · 비고} · 원문 4-라 · 원 미만 처리 안 함(소수 둘째 자리) · 값은 `미공표직종_추적.md` 5절과 기계 대조. +- 이음 = 원문 회차의 전체직종 평균을 그대로 이음(2020.1→2020.9 = 123종끼리 · 2020.9→2025.1 = 127종 · 이후 132종 · 2024.9→2025.1 = 127종). +- 다산소프트와 이음 계열이 다른 직종 = 석조각공 · 드잡이공편수(산정 비고에 밝힘). +- 2026.9.1 공표값이 있는 연마공 · 플랜트특수용접공 · 도편수 · 한식미장공편수는 비고에 그 값(판 밖). + +### 항목 일치 — 인력_준용대상 49 → 48 + +- 새 노임 파일에 이름이 온전히 같은 직종 = 측량중급기술자 1 — `인력:측량노임:측량중급기술자` 로 옮김(로직 참조 8 곳). +- 원문 통합·명칭변경 목록 = `통합` 칸(엔진이 새 직종 값 · 호표 출처 「통합: <새 직종>」): 목도 → 인력운반공(1045) · 특수비계공 → 비계공(1006) · 함석공 → 덕트공(1043) · 갱부 → 특별인부(1003) · 스레이트공(원문 표기 「슬레이트공」) → 지붕잇기공(1036). +- 절단공 = 원문 연번 7~10 철근공 · 철공 · 철판공 · 철골공 넷으로 갈림 — `통합` null · `후보` 에 넷 · 관리자가 준용으로 고름. +- 비슷한 이름 21 = `후보` 칸(값 안 씀): 기술사 · 특급/고급/중급/초급기술자 → 엔지니어링 7 부문 + 측량 기술계 · 고급/중급/초급숙련기술자 → 엔지니어링 7 부문 · 초급/중급기능사(측량) → 측량초급/중급기능사 · 기능사(도화 · 지도제작 · 항공사진) → 그 분야 기능사 · 중급기능사(지도) → 지도제작중급기능사 · 고급기능사 → 네 분야 · 조종사 → 사업용조종사 · 정비사 → 항공정비사 · 제관공 → 플랜트제관공. +- 엔진 차례 = 값 → 준용(관리자가 골랐으면) → 통합 → 산정. M01 준용 고르기 후보 = 공표 노임 7 파일 · 통합 · 산정 · 후보 칸 읽기 전용. + +### 짝 없는 직종 — 로직이 부르는데 값 길이 없음 + +로직 1,351 줄이 부르는 인력 요소 109 = 건설노임 61 · 준용대상 47 · 측량노임 1. 준용대상 47 가운데 통합으로 풀린 5 를 뺀 42 가 짝 없음(관리자 준용 몫): + +| 직종 | 부르는 로직 줄 | 후보 | +|---|---|---| +| 중급기술자 | 91 | 엔지니어링 7 부문 · 측량 | +| 고급기술자 | 71 | 〃 | +| 초급기술자 | 57 | 〃 | +| 기계기사 | 44 | 없음 | +| 특급기술자 | 30 | 엔지니어링 7 부문 · 측량 | +| 초급기능사(측량) | 24 | 측량초급기능사 | +| 중급기능사(지도제작) | 21 | 지도제작중급기능사 | +| 측량사 | 21 | 없음 | +| 정보처리기사 | 18 | 없음 | +| 기계산업기사 | 14 | 없음 | +| 중급숙련기술자 | 13 | 엔지니어링 7 부문 | +| 산소절단공 | 11 | 없음 | +| 중급기능사(도화) | 7 | 도화중급기능사 | +| 마킹공 | 7 | 없음 | +| 중급기능사(지도) | 5 | 지도제작중급기능사 | +| 절단공 | 4 | 통합 갈림 넷 | +| 제관공 | 4 | 플랜트제관공 | +| 제도공 · 현도공 | 4 · 4 | 없음 | +| 초급기능사(도화) · 초급기능사(지도제작) | 3 · 3 | 그 분야 초급기능사 | +| 시험사1급 · 특수운전공 | 3 · 3 | 없음 | +| 고급숙련기술자 · 초급숙련기술자 · 기술사 | 2 · 2 · 2 | 엔지니어링 7 부문(기술사는 + 측량기술사) | +| 고급기능사(도화) · 중급기능사(측량) | 2 · 2 | 그 분야 기능사 | +| 사진제판공 · 사진식자공 · 공작기계공 · 측량조수 · Belt Conveyor 설치공 | 2 씩 | 없음 | +| 고급기능사 · 중급기능사(항공사진) · 조종사 · 정비사 | 1 씩 | 네 분야 · 항공사진중급기능사 · 사업용조종사 · 항공정비사 | +| 옵셋인쇄공 · 리베팅공 · 측량기사 · 시공측량기사 · 시공측량조수 | 1 씩 | 없음 | + +- 「〃」 1 줄 = 옮길 때 남은 되풀이 기호(부르는 로직 없음). +- 건설노임 미공표 가운데 로직이 부르는 것 = 연마공(4 줄) — 이제 산정 값. + +### 로직 일괄 시험 계산 (1,351 줄 · 줄마다 입력 조합 40 까지 · 같은 스크립트로 전후) + +| 멈춤 까닭 | 전 | 후 | +|---|---|---| +| 통과 | 1,104 | 1,115 | +| 값 없음 · 인력 준용대상 | 119 | 110 | +| 값 없음 · 재료 품셈재료 | 112 | 112 | +| 후보 여럿(레미콘 규격) | 10 | 10 | +| 값 없음 · 건설노임 미공표 | 2 | 0 | +| 맞는 줄 없음 · 0 나누기 | 4 | 4 | diff --git a/resources/master_data/scripts/build_인력_노임.py b/resources/master_data/scripts/build_인력_노임.py new file mode 100644 index 00000000..c6d98447 --- /dev/null +++ b/resources/master_data/scripts/build_인력_노임.py @@ -0,0 +1,415 @@ +"""노임 공표 원문 md → 인력 요소 파일 다섯 · 준용대상 짝짓기 · 건설노임 미공표 산정. + +원문 = resources/knowledge/original/원가계산/노임단가_* (우리 md · ESTX 값 쓰지 않음). +- 인력_엔지니어링노임 · 측량노임 · 건설사업관리노임 · SW노임 · 산림노임 — md 표 그대로 · 줄 수·값을 md 와 기계 대조. +- 인력_준용대상 — 새 노임 직종과 이름이 온전히 같은 줄은 옮김(로직 참조도) · 비슷한 이름은 비고에 후보. + 건설노임 원문 「통합·명칭변경 직종」 목록의 옛 직종은 `통합` = 새 직종 ref(엔진이 그 값을 씀). +- 인력_건설노임 미공표 — `산정` = {값(원 미만 처리 안 함) · 근거 · 마지막공표} · 원문 4-라. + 이음 = 원문 회차의 전체직종 평균을 그대로 이음(미공표직종_추적.md 4절) · 산정값은 같은 md 5절과 대조. + +쓰기: ./venv/Scripts/python.exe resources/master_data/scripts/build_인력_노임.py +""" + +import hashlib +import json +import re +import sys +from collections import Counter +from decimal import ROUND_HALF_UP, Decimal +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from _migrate_base import dump_master # noqa: E402 + +ROOT = Path(__file__).resolve().parents[3] +MD = ROOT / "resources/master_data" +COST = ROOT / "resources/knowledge/original/원가계산" +CAK = COST / "노임단가_건설업_대한건설협회" +WAGE = "원/일" +_INT = re.compile(r"\d{1,3}(?:,\d{3})+") + + +def num(text: str) -> int: + return int(text.replace(",", "")) + + +def cells(line: str) -> list[str]: + return [c.strip() for c in line.strip().strip("|").split("|")] + + +def table_after(text: str, head: str) -> list[list[str]]: + """`head` 로 시작하는 md 표 줄부터 표 끝까지 — 구분 줄 뺌.""" + lines = text.splitlines() + i = next(n for n, x in enumerate(lines) if x.startswith(head)) + out = [] + for x in lines[i:]: + if not x.startswith("|"): + break + if not set(x) <= set("|-: "): + out.append(cells(x)) + return out + + +def origin(path: Path) -> list[dict]: + return [ + { + "경로": path.relative_to(ROOT).as_posix(), + "해시": hashlib.sha256(path.read_bytes()).hexdigest(), + "역할": "primary", + } + ] + + +def row(name: str, value, source: str, **more) -> dict: + return { + "열쇠": name, + "이름": name, + "규격": "", + "단위": WAGE, + "값": value, + "출처": source, + **more, + } + + +# ── 갈래별 노임 ────────────────────────────────────────────────────── +def engineering(): + d = COST / "노임단가_엔지니어링_한국엔지니어링협회" + src = d / "공표문_2025 엔지니어링업체 임금실태조사결과 공표.md" + t = table_after(src.read_text(encoding="utf-8"), "| 구분 |") + parts = [p.replace(r"\*", "") for p in t[0][1:]] # 「기타**」 주석 기호 + rows = [ + row(f"{r[0]}({p})", num(v), f"엔지니어링노임 {r[0]} {p}", 부문=p) + for r in t[1:] + for p, v in zip(parts, r[1:]) + ] + # 같은 게시물 xls(연도별) 2025 칸과 대조 + y = table_after( + (d / "노임단가_연도별_엔지니어링(2025).md").read_text(encoding="utf-8"), "| 년도 |" + ) + xls = {(r[0], p): num(v) for r in y[2:10] for p, v in zip(y[1][-7:], r[-7:])} + assert {(r["이름"].split("(")[0], r["부문"]): r["값"] for r in rows} == xls + head = { + "그룹": "인력", + "원문": "엔지니어링노임", + "판": "2026-01-01", + "공표일": "2025-12-02", + "원천": origin(src), + "비고": [ + "한국엔지니어링협회 2025 엔지니어링업체 임금실태조사결과 공표(기획홍보팀-1515호 · 국가승인통계 제372001호) · 7 기술부문 × 8 기술등급 · 1인 1일 평균임금 · 월평균 근무일수 20.3일", + "이름 = 기술등급(기술부문) · 기타 = 선박·항공우주·금속·화학·광업·농림·산업·해양·수산", + "보고서 표 2 「전체」(기술등급 단순평균)는 공표 노임단가가 아니라 넣지 않음", + ], + } + return src, head, rows + + +def survey(): + src = ( + COST + / "노임단가_측량_한국공간정보산업협회/공표문_2025년도 측량업체 임금실태조사 결과 공표.md" + ) + t = table_after(src.read_text(encoding="utf-8"), "| 구분 |") + rows, top, field = [], "", "" + for r in t[1:]: + if r[0]: + top, field = r[0], r[1] + elif r[1]: + field = r[1] + grade = r[2] + if top == "기술계": + name = "측량기술사" if grade == "기술사" else f"측량{grade}기술자" + elif top == "기능계": + name = f"{field}{grade}기능사" + else: + name = grade + rows.append( + row( + name, + num(r[3]), + f"측량노임 {' '.join(x for x in (top, field if top == '기능계' else '', grade) if x)}", + ) + ) + head = { + "그룹": "인력", + "원문": "측량노임", + "판": "2026-01-01", + "공표일": "2025-12-22", + "원천": origin(src), + "비고": [ + "한국공간정보산업협회 2025년도 측량업체 임금실태조사 결과 공표(국가승인통계 제377001호) · 20 직종 · 1인 1일 · 월평균 근무일수 20.3일", + "이름 = 기술계 「측량<등급>기술자」·측량기술사 · 기능계 「<분야><등급>기능사」 · 기타 원문 그대로 — 원문 칸은 출처에", + ], + } + return src, head, rows + + +def cm(): + src = ( + COST + / "노임단가_건설사업관리_한국건설엔지니어링협회/2026년도_건설사업관리기술인_임금실태조사결과_공표_한국건설엔지니어링협회.md" + ) + t = table_after(src.read_text(encoding="utf-8"), "| 구 분 |") + rows = [] + for r in t[1:]: + grade = r[0].replace(" ", "") + rows.append( + row( + f"{grade}건설사업관리기술인", + num(r[1]), + f"건설사업관리노임 {grade}", + 환산비=float(r[2]), + ) + ) + head = { + "그룹": "인력", + "원문": "건설사업관리노임", + "판": "2026-01-01", + "공표일": "2025-12-29", + "원천": origin(src), + "비고": [ + "한국건설엔지니어링협회 2026년도 건설사업관리기술인 노임가격(정책381-3804호 · 통계청승인 제378001호) · 일임금액", + "환산비 = 원문 Si(고급 = 1.000 기준 등급별 비율 · 소수 넷째 자리 반올림)", + ], + } + return src, head, rows + + +def sw(): + src = ( + COST + / "노임단가_SW기술자_한국인공지능소프트웨어산업협회/2026년_적용_SW기술자_평균임금_공표.md" + ) + t = table_after(src.read_text(encoding="utf-8"), "| 구 분 | 월평균임금") + rows = [] + for r in t[1:]: + mark, name = r[0].split(" ", 1) + n = "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰".index(mark) + 1 + more = {"월평균임금": num(r[1]), "시간평균임금": num(r[3])} + if r[4]: + more["포함직무"] = r[4] + rows.append(row(name, num(r[2]), f"SW노임 {n}", **more)) + head = { + "그룹": "인력", + "원문": "SW노임", + "판": "2026-01-01", + "공표일": "2025-12-19", + "원천": origin(src), + "비고": [ + "한국인공지능·소프트웨어산업협회 2026년 적용 SW기술자 평균임금(통계승인 제375001호) · 값 = 일평균임금(M/D) · 적용 2026-01-01 ~ 2026-12-31", + "⚠ 기본급·제수당·상여금·퇴직급여충당금·법인부담금(4대보험) 모두 포함 — 건설노임(기본급 일급)과 성격 다름", + "일평균 = 월평균 ÷ 20.5일 · 시간평균 = 일평균 ÷ 8시간(원문)", + ], + } + return src, head, rows + + +def forest(): + src = COST / "노임단가_산림_산림청/2026년_나무의사_수목치료기술자_노임단가_알림.md" + text = src.read_text(encoding="utf-8") + rows = [ + row(name, num(v), f"산림노임 {name}") + for name, v in re.findall(r"(나무의사|수목치료기술자) ([\d,]+)원", text) + ] + head = { + "그룹": "인력", + "원문": "산림노임", + "판": "2026-01-01", + "공표일": "2026-01-06", + "원천": origin(src), + "비고": [ + "산림청 2026년 나무의사·수목치료기술자 노임단가 알림(수목진료 표준품셈 예정가격 작성용) · 2025년 소비자물가상승률 2.1% 반영(원문) · 통계 승인 노임 아님", + "판 = 2026년 적용(원문에 적용 시작일 없음 · 1월 1일로 적음)", + ], + } + return src, head, rows + + +def check_md(src: Path, rows: list[dict], table_head: str | None = None) -> None: + """md 의 그 표(없으면 본문) 안 큰 수 모음 ⊇ 파일 값 · 개수 같음.""" + text = src.read_text(encoding="utf-8") + if table_head: + text = "\n".join("|".join(r) for r in table_after(text, table_head)) + have = Counter(num(x) for x in _INT.findall(text)) + got = Counter(r["값"] for r in rows) + assert not (got - have), (src.name, got - have) + print(f" {src.parent.name[5:]}: {len(rows)} 줄 · 값 합 {sum(got.elements()):,} · md 대조 같음") + + +# ── 준용대상 짝짓기 · 통합 ─────────────────────────────────────────── +def merge_list() -> dict[str, list[str]]: + """건설노임 원문 「통합직종」 · 「직종명칭 변경」 표 — 옛 이름 → 새 이름(여럿이면 갈림).""" + text = (CAK / "2026-09-01/2. 임금적용요령.md").read_text(encoding="utf-8") + out: dict[str, list[str]] = {} + lines = [cells(x) for x in text.splitlines() if x.startswith("| ") and "---" not in x] + for r in lines: + if len(r) != 6 or not r[0].isdigit(): + continue + for no, old, new in ((r[0], r[1], r[2]), (r[3], r[4], r[5])): + if not no.isdigit() or not new: + continue + for name in re.split(r"\+", old.replace("
", "").replace(" ", "")): + if name and name != new: + out.setdefault(name, []).append(new) + return out + + +def candidates(name: str, pool: dict[str, str]) -> list[str]: + """비슷한 이름 — 새 이름이 옛 이름 뿌리(괄호 앞)와 괄호 안 말을 모두 품음.""" + m = re.fullmatch(r"(.+?)\((.+)\)", name) + base, qual = (m.group(1), m.group(2)) if m else (name, "") + return [ref for n, ref in pool.items() if n != name and base in n and qual in n] + + +def main(): + books = { + "엔지니어링노임": engineering(), + "측량노임": survey(), + "건설사업관리노임": cm(), + "SW노임": sw(), + "산림노임": forest(), + } + table_heads = { + "엔지니어링노임": "| 구분 |", + "측량노임": "| 구분 |", + "건설사업관리노임": "| 구 분 |", + "SW노임": "| 구 분 | 월평균임금", + } + print("갈래별 노임") + for book, (src, head, rows) in books.items(): + assert len({r["열쇠"] for r in rows}) == len(rows) + check_md(src, rows, table_heads.get(book)) + expect = { + "엔지니어링노임": 56, + "측량노임": 20, + "건설사업관리노임": 4, + "SW노임": 17, + "산림노임": 2, + } + assert {b: len(v[2]) for b, v in books.items()} == expect + + # 이름 → ref (새 다섯 + 건설·제조 공표) + wage = json.loads((MD / "인력_건설노임.json").read_text(encoding="utf-8")) + make = json.loads((MD / "인력_제조노임.json").read_text(encoding="utf-8")) + 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["줄"]} + merges = merge_list() + + alias_path = MD / "인력_준용대상.json" + alias = json.loads(alias_path.read_text(encoding="utf-8")) + 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 + r = {k: v for k, v in r.items() if k not in ("통합", "후보")} + old = name.replace("스레이트", "슬레이트") # 원문 표기 「슬레이트공」 + new = merges.get(old, []) + refs = [old_pool[n] for n in new if n in old_pool] + if len(refs) == 1: + r["통합"] = refs[0] + elif refs: + r["통합"] = None + r["후보"] = "통합 갈림: " + " · ".join(new) + " — 관리자가 준용으로 고름" + near = candidates(name, {**pool, **old_pool}) + if near and "후보" not in r: + r["후보"] = "비슷한 이름: " + " · ".join(near) + 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(): + 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} 곳" + ) + print( + f" 통합 {sum(1 for r in kept if r.get('통합'))} · 통합 갈림 {sum(1 for r in kept if '통합 갈림' in str(r.get('후보')))} · 비슷한 이름 {sum(1 for r in kept if '비슷한' in str(r.get('후보')))}" + ) + + estimate(wage) + + +# ── 건설노임 미공표 산정 ───────────────────────────────────────────── +def estimate(wage: dict) -> None: + text = (CAK / "미공표직종_추적.md").read_text(encoding="utf-8") + steps = [ + (r[0].split(" → ")[0], r[0].split(" → ")[1], r[1], num(r[2]), num(r[3])) + for r in table_after(text, "| 앞 → 뒤 |")[1:] + ] + hist = {r[0].split()[0]: r[1:] for r in table_after(text, "| 직종 | 2020.1.1")[1:]} + dates = table_after(text, "| 직종 | 2020.1.1")[0][1:] + shown = {r[0].split()[0]: r for r in table_after(text, "| 직종 | 마지막 공표")[1:]} + until = "2026.1.1" + n = 0 + for r in wage["줄"]: + if r.get("상태") != "미공표": + continue + vals = hist[r["열쇠"]] + last = max(i for i, v in enumerate(vals) if v != "-" and dates[i] != "2026.9.1") + at, base = dates[last], num(vals[last]) + value, used, start = Decimal(base), [], at + while start != until: + a, b, kinds, top, bottom = next(s for s in steps if s[0] == start) + value = value * top / bottom + used.append(f"{top:,}/{bottom:,}({kinds}종)") + start = b + value = value.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) + want = shown[r["열쇠"]] + assert str(value) == want[4].replace(",", ""), (r["열쇠"], value, want[4]) + note = [] + if want[5] != want[6]: + note.append( + f"다산소프트(ESTX) {want[5]} — 2020.1(123종) → 2020.9 를 127종 평균으로 이음 · 우리는 원문 회차 평균 그대로(123종끼리)" + ) + after = vals[dates.index("2026.9.1")] + if after != "-": + note.append(f"2026.9.1 공표 {after} 있음(뒤 시기 · 판 밖)") + r["산정"] = { + "값": value, + "근거": f"원문 4-라 · {at} 공표 {base:,} × 전체직종 평균 증가율 " + " × ".join(used), + "마지막공표": at, + **({"비고": " · ".join(note)} if note else {}), + } + n += 1 + notes = wage["비고"] + notes[0] = notes[0].replace("(값은 관리자 판단 — 마스터에 짓지 않음)", "(산정 칸)") + notes[:] = [x for x in notes if not x.startswith(("산정 =", "2026-09-01"))] + notes.append( + "산정 = 미공표 직종의 원문 4-라 산정값(원 미만 처리 안 함 · 소수 둘째 자리) — 엔진 차례 값 → 준용(관리자가 골랐으면) → 통합 → 산정 · 호표 출처에 「산정: …」" + ) + notes.append( + "2026-09-01 적용분 확보됨(옛공표 md `2026-09-01/`) — 마스터 판은 2026-01-01 그대로" + ) + head = {k: v for k, v in wage.items() if k != "줄"} + dump_master(MD / "인력_건설노임.json", head, [_plain(r) for r in wage["줄"]]) + print(f"건설노임 미공표 산정 {n} 줄 · 미공표직종_추적.md 5절 값과 같음") + + +def _plain(r: dict) -> dict: + """Decimal → JSON 수(소수 둘째 자리 그대로).""" + out = dict(r) + if "산정" in out: + out["산정"] = {k: float(v) if isinstance(v, Decimal) else v for k, v in out["산정"].items()} + return out + + +if __name__ == "__main__": + main() diff --git a/resources/master_data/scripts/check_master.py b/resources/master_data/scripts/check_master.py index a44dc44e..97ba8c1e 100644 --- a/resources/master_data/scripts/check_master.py +++ b/resources/master_data/scripts/check_master.py @@ -34,6 +34,11 @@ BOOKS = ( "건설품셈", "건설노임", "제조노임", + "엔지니어링노임", + "측량노임", + "건설사업관리노임", + "SW노임", + "산림노임", "준용대상", "나라장터자재", "오피넷유가", @@ -171,12 +176,23 @@ def _check_linked(where: str, row: dict) -> list[str]: def check_links(whole: mf.Master) -> list[str]: - """품셈재료 연결 · 시중물가 조달 연결이 가리키는 줄.""" + """품셈재료 연결 · 시중물가 조달 연결 · 인력 준용·통합이 가리키는 줄.""" out = [] for key, row in whole.index.get(("재료", "품셈재료"), {}).items(): link = row.get("연결") if isinstance(link, str) and link not in whole.index.get(("재료", "시중물가"), {}): out.append(f"재료:품셈재료:{key} · 연결 「{link}」 이 시중물가에 없음") + for (group, book), rows in whole.index.items(): + for key, row in rows.items() if group == "인력" else (): + for col in ("준용", "통합"): + ref = row.get(col) + if ref in (None, ""): + continue + ref = str(ref) if ":" in str(ref) else f"인력:{book}:{ref}" + try: + whole.get(ref) + except mf.FormulaError: + out.append(f"인력:{book}:{key} · {col} 「{ref}」 없는 요소") nara = whole.index.get(("재료", "나라장터자재"), {}) for key, row in whole.index.get(("재료", "시중물가"), {}).items(): source = str(row["값"]["조달"].get("출처") or "") diff --git a/resources/master_data/scripts/master_formula.py b/resources/master_data/scripts/master_formula.py index f5019293..835aba00 100644 --- a/resources/master_data/scripts/master_formula.py +++ b/resources/master_data/scripts/master_formula.py @@ -240,14 +240,23 @@ class Master: return row def value(self, ref: str): - """요소 값 · 준용 이름 — 값이 비고 「준용」(같은 원문 열쇠 또는 `그룹:원문:열쇠`)이 있으면 그 요소 값.""" + """요소 값 · 출처 글 — 값이 비면 준용(관리자가 고른 열쇠) → 통합(원문 통합 직종) → 산정(원문 4-라) 차례. + 준용·통합 = 같은 원문 열쇠 또는 `그룹:원문:열쇠`.""" row = self.get(ref) - alias = row.get("준용") - if row.get("값") is not None or alias in (None, ""): + if row.get("값") is not None: return row.get("값"), None - alias = str(alias) - target = self.get(alias if ":" in alias else ":".join(ref.split(":", 2)[:2] + [alias])) - return target.get("값"), target.get("이름") or alias + for col in ("준용", "통합"): + alias = row.get(col) + if alias not in (None, ""): + alias = str(alias) + target = self.get( + alias if ":" in alias else ":".join(ref.split(":", 2)[:2] + [alias]) + ) + return target.get("값"), f"{col}: {target.get('이름') or alias}" + guess = row.get("산정") + if isinstance(guess, dict) and guess.get("값") is not None: + return guess["값"], f"산정: 원문 4-라 · 마지막 공표 {guess.get('마지막공표')}" + return None, None def logic(self, ref: str) -> dict: return self.get(f"로직:{ref}") diff --git a/resources/master_data/scripts/master_material.py b/resources/master_data/scripts/master_material.py index 2f0a3f0c..99b9d0fc 100644 --- a/resources/master_data/scripts/master_material.py +++ b/resources/master_data/scripts/master_material.py @@ -86,8 +86,7 @@ def element(master: mf.Master, ref: str, env: dict) -> tuple[object, str | None] """요소 값과 출처 — 품셈재료는 연결을 따라가 낮은 값 · 그 밖은 줄의 `값` 그대로(출처 None).""" row = master.get(ref) if not ref.startswith(LINKED): - value, alias = master.value(ref) - return value, f"준용: {alias}" if alias else None + return master.value(ref) link = row.get("연결") if not link: return None, None diff --git a/resources/master_data/로직_건설품셈_토목4장.json b/resources/master_data/로직_건설품셈_토목4장.json index 14119c47..40d6974d 100644 --- a/resources/master_data/로직_건설품셈_토목4장.json +++ b/resources/master_data/로직_건설품셈_토목4장.json @@ -64,7 +64,7 @@ }, { "종류": "인력", - "요소": "인력:준용대상:측량중급기술자", + "요소": "인력:측량노임:측량중급기술자", "이름": "측량중급기술자", "단위": "인", "수량": "찾기(소요량:건설품셈:토목 4-2-1 궤광조립, 구분='측량중급기술자').수량 / 시공량", @@ -121,7 +121,7 @@ }, { "종류": "인력", - "요소": "인력:준용대상:측량중급기술자", + "요소": "인력:측량노임:측량중급기술자", "이름": "측량중급기술자", "단위": "인", "수량": "찾기(소요량:건설품셈:토목 4-2-2 궤도양로, 구분='측량중급기술자').수량 / 시공량", @@ -302,7 +302,7 @@ }, { "종류": "인력", - "요소": "인력:준용대상:측량중급기술자", + "요소": "인력:측량노임:측량중급기술자", "이름": "측량중급기술자", "단위": "인", "수량": "찾기(소요량:건설품셈:토목 4-3-1 궤광조립(콘크리트), 구분=구분, 품목='측량중급기술자').수량 / 시공량", @@ -426,7 +426,7 @@ }, { "종류": "인력", - "요소": "인력:준용대상:측량중급기술자", + "요소": "인력:측량노임:측량중급기술자", "이름": "측량중급기술자", "단위": "인", "수량": "찾기(소요량:건설품셈:토목 4-3-2 궤광거치, 구분='궤광높이기', 품목='측량중급기술자').수량 / 시공량", @@ -457,7 +457,7 @@ }, { "종류": "인력", - "요소": "인력:준용대상:측량중급기술자", + "요소": "인력:측량노임:측량중급기술자", "이름": "측량중급기술자", "단위": "인", "수량": "찾기(소요량:건설품셈:토목 4-3-2 궤광거치, 구분='궤광 정정 및 타설준비', 품목='측량중급기술자').수량 / 시공량", @@ -504,7 +504,7 @@ }, { "종류": "인력", - "요소": "인력:준용대상:측량중급기술자", + "요소": "인력:측량노임:측량중급기술자", "이름": "측량중급기술자", "단위": "인", "수량": "찾기(소요량:건설품셈:토목 4-3-3 타설후 정리, 구분='측량중급기술자').수량 / 시공량", @@ -607,7 +607,7 @@ }, { "종류": "인력", - "요소": "인력:준용대상:측량중급기술자", + "요소": "인력:측량노임:측량중급기술자", "이름": "측량중급기술자", "단위": "인", "수량": "찾기(소요량:건설품셈:토목 4-4-1 분기기 부설, 구분='측량중급기술자').수량 * 할증", @@ -715,7 +715,7 @@ }, { "종류": "인력", - "요소": "인력:준용대상:측량중급기술자", + "요소": "인력:측량노임:측량중급기술자", "이름": "측량중급기술자", "단위": "인", "수량": "만약(이음 == '일단', 찾기(소요량:건설품셈:토목 4-4-2 신축이음매 부설, 구분='측량중급기술자').일단, 찾기(소요량:건설품셈:토목 4-4-2 신축이음매 부설, 구분='측량중급기술자').양단)", diff --git a/resources/master_data/인력_SW노임.json b/resources/master_data/인력_SW노임.json new file mode 100644 index 00000000..e0a049c9 --- /dev/null +++ b/resources/master_data/인력_SW노임.json @@ -0,0 +1,37 @@ +{ + "그룹": "인력", + "원문": "SW노임", + "판": "2026-01-01", + "공표일": "2025-12-19", + "원천": [ + { + "경로": "resources/knowledge/original/원가계산/노임단가_SW기술자_한국인공지능소프트웨어산업협회/2026년_적용_SW기술자_평균임금_공표.md", + "해시": "21d9d4604bbd4c6011fdd6636f5628315591534d586d0e4c9ebabfe70e27c561", + "역할": "primary" + } + ], + "비고": [ + "한국인공지능·소프트웨어산업협회 2026년 적용 SW기술자 평균임금(통계승인 제375001호) · 값 = 일평균임금(M/D) · 적용 2026-01-01 ~ 2026-12-31", + "⚠ 기본급·제수당·상여금·퇴직급여충당금·법인부담금(4대보험) 모두 포함 — 건설노임(기본급 일급)과 성격 다름", + "일평균 = 월평균 ÷ 20.5일 · 시간평균 = 일평균 ÷ 8시간(원문)" + ], + "줄": [ + { "열쇠": "IT기획자", "이름": "IT기획자", "규격": "", "단위": "원/일", "값": 578206, "출처": "SW노임 1", "월평균임금": 11853218, "시간평균임금": 72276, "포함직무": "빅데이터기획자, 인공지능서비스 기획자" }, + { "열쇠": "IT컨설턴트", "이름": "IT컨설턴트", "규격": "", "단위": "원/일", "값": 522340, "출처": "SW노임 2", "월평균임금": 10707960, "시간평균임금": 65292, "포함직무": "정보보호컨설턴트" }, + { "열쇠": "업무분석가", "이름": "업무분석가", "규격": "", "단위": "원/일", "값": 475154, "출처": "SW노임 3", "월평균임금": 9740667, "시간평균임금": 59394 }, + { "열쇠": "데이터분석가", "이름": "데이터분석가", "규격": "", "단위": "원/일", "값": 414600, "출처": "SW노임 4", "월평균임금": 8499309, "시간평균임금": 51825 }, + { "열쇠": "IT PM", "이름": "IT PM", "규격": "", "단위": "원/일", "값": 492039, "출처": "SW노임 5", "월평균임금": 10086804, "시간평균임금": 61505 }, + { "열쇠": "IT아키텍트", "이름": "IT아키텍트", "규격": "", "단위": "원/일", "값": 541621, "출처": "SW노임 6", "월평균임금": 11103230, "시간평균임금": 67703, "포함직무": "SW아키텍트, 데이터아키텍트, Infrastructure아키텍트, 데이터베이스아키텍트, 빅데이터아키텍트, 인공지능아키텍트" }, + { "열쇠": "UI/UX기획/개발자", "이름": "UI/UX기획/개발자", "규격": "", "단위": "원/일", "값": 336666, "출처": "SW노임 7", "월평균임금": 6901660, "시간평균임금": 42083, "포함직무": "UI/UX기획자, UI/UX개발자" }, + { "열쇠": "UI/UX디자이너", "이름": "UI/UX디자이너", "규격": "", "단위": "원/일", "값": 251671, "출처": "SW노임 8", "월평균임금": 5159246, "시간평균임금": 31459 }, + { "열쇠": "응용SW개발자", "이름": "응용SW개발자", "규격": "", "단위": "원/일", "값": 378250, "출처": "SW노임 9", "월평균임금": 7754124, "시간평균임금": 47281, "포함직무": "빅데이터개발자, 인공지능SW개발자" }, + { "열쇠": "시스템SW개발자", "이름": "시스템SW개발자", "규격": "", "단위": "원/일", "값": 284888, "출처": "SW노임 10", "월평균임금": 5840196, "시간평균임금": 35611, "포함직무": "임베디드SW개발자" }, + { "열쇠": "정보시스템운용자", "이름": "정보시스템운용자", "규격": "", "단위": "원/일", "값": 519469, "출처": "SW노임 11", "월평균임금": 10649117, "시간평균임금": 64934, "포함직무": "데이터베이스운용자, NW엔지니어, IT시스템운용자, 빅데이터엔지니어, 인공지능 서비스관리자" }, + { "열쇠": "IT지원기술자", "이름": "IT지원기술자", "규격": "", "단위": "원/일", "값": 252196, "출처": "SW노임 12", "월평균임금": 5170016, "시간평균임금": 31524 }, + { "열쇠": "IT마케터", "이름": "IT마케터", "규격": "", "단위": "원/일", "값": 575293, "출처": "SW노임 13", "월평균임금": 11793500, "시간평균임금": 71912, "포함직무": "SW제품기획자, IT서비스기획자, IT기술영업" }, + { "열쇠": "IT품질관리자", "이름": "IT품질관리자", "규격": "", "단위": "원/일", "값": 538638, "출처": "SW노임 14", "월평균임금": 11042071, "시간평균임금": 67330 }, + { "열쇠": "IT테스터", "이름": "IT테스터", "규격": "", "단위": "원/일", "값": 197714, "출처": "SW노임 15", "월평균임금": 4053137, "시간평균임금": 24714 }, + { "열쇠": "IT감리", "이름": "IT감리", "규격": "", "단위": "원/일", "값": 572934, "출처": "SW노임 16", "월평균임금": 11745154, "시간평균임금": 71617 }, + { "열쇠": "정보보안전문가", "이름": "정보보안전문가", "규격": "", "단위": "원/일", "값": 507887, "출처": "SW노임 17", "월평균임금": 10411680, "시간평균임금": 63486, "포함직무": "정보보호관리자, 침해사고대응전문가" } + ] +} diff --git a/resources/master_data/인력_건설노임.json b/resources/master_data/인력_건설노임.json index 67f3aef1..83548740 100644 --- a/resources/master_data/인력_건설노임.json +++ b/resources/master_data/인력_건설노임.json @@ -11,8 +11,10 @@ } ], "비고": [ - "reliability = 원문 신뢰도 기호: * 조사현장 5개 미만(적용 시 유의) / ** 미조사(임금적용요령 Ⅱ 참조). 없는 레코드 = 정상 공표. 포설공(1018)·일반기계운전사(1050) 등 임도 빈발 직종 포함 — 프로그램은 경고 표시 권장 | 일시간 = 1일 노임 기준 시간 — 원문 4-가: 산업안전보건법 제139조·동법 시행령 제99조 작업 종사 직종(잠수부)은 6시간 · 나머지 8시간 | 미공표(**·- 값 없음) 직종 적용 = 원문 4-다: 조사기관이 공표한 유사 직종 단가에 준하여 적용 가능 · 4-라: 공표 없는 시기는 전후 시기 당해 직종 단가에 전체 평균 노임 증가율을 적용해 산정 가능(값은 관리자 판단 — 마스터에 짓지 않음) | 노임은 기본급여액(일급) — 제수당·상여금·퇴직급여충당금은 예정가격작성기준에 따라 따로 계상(원문 4-나) | 판 = 2026.1.1 적용(2025-12-31 공표) · 차기 공표 예정 2026-09-01 · 원문 = 대한건설협회 2026상반기 건설업 임금실태조사", - "준용 = 미공표 직종에 관리자가 고르는 유사 직종 열쇠(원문 4-다) · 지금은 null · 엔진은 값이 비고 준용이 있으면 그 직종 값을 씀" + "reliability = 원문 신뢰도 기호: * 조사현장 5개 미만(적용 시 유의) / ** 미조사(임금적용요령 Ⅱ 참조). 없는 레코드 = 정상 공표. 포설공(1018)·일반기계운전사(1050) 등 임도 빈발 직종 포함 — 프로그램은 경고 표시 권장 | 일시간 = 1일 노임 기준 시간 — 원문 4-가: 산업안전보건법 제139조·동법 시행령 제99조 작업 종사 직종(잠수부)은 6시간 · 나머지 8시간 | 미공표(**·- 값 없음) 직종 적용 = 원문 4-다: 조사기관이 공표한 유사 직종 단가에 준하여 적용 가능 · 4-라: 공표 없는 시기는 전후 시기 당해 직종 단가에 전체 평균 노임 증가율을 적용해 산정 가능(산정 칸) | 노임은 기본급여액(일급) — 제수당·상여금·퇴직급여충당금은 예정가격작성기준에 따라 따로 계상(원문 4-나) | 판 = 2026.1.1 적용(2025-12-31 공표) · 차기 공표 예정 2026-09-01 · 원문 = 대한건설협회 2026상반기 건설업 임금실태조사", + "준용 = 미공표 직종에 관리자가 고르는 유사 직종 열쇠(원문 4-다) · 지금은 null · 엔진은 값이 비고 준용이 있으면 그 직종 값을 씀", + "산정 = 미공표 직종의 원문 4-라 산정값(원 미만 처리 안 함 · 소수 둘째 자리) — 엔진 차례 값 → 준용(관리자가 골랐으면) → 통합 → 산정 · 호표 출처에 「산정: …」", + "2026-09-01 적용분 확보됨(옛공표 md `2026-09-01/`) — 마스터 판은 2026-01-01 그대로" ], "줄": [ { "열쇠": "1001", "이름": "작업반장", "규격": "", "단위": "원/일", "값": 215907, "출처": "건설노임 1001", "일시간": 8, "상태": "공표" }, @@ -46,7 +48,7 @@ { "열쇠": "1029", "이름": "도장공", "규격": "", "단위": "원/일", "값": 263017, "출처": "건설노임 1029", "일시간": 8, "상태": "공표" }, { "열쇠": "1030", "이름": "내장공", "규격": "", "단위": "원/일", "값": 256883, "출처": "건설노임 1030", "일시간": 8, "상태": "공표" }, { "열쇠": "1031", "이름": "도배공", "규격": "", "단위": "원/일", "값": 227614, "출처": "건설노임 1031", "일시간": 8, "상태": "공표" }, - { "열쇠": "1032", "이름": "연마공", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1032", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, + { "열쇠": "1032", "이름": "연마공", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1032", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 211645.83, "근거": "원문 4-라 · 2025.9.1 공표 210,772 × 전체직종 평균 증가율 279,988/278,832(132종)", "마지막공표": "2025.9.1", "비고": "2026.9.1 공표 208,207 있음(뒤 시기 · 판 밖)"} }, { "열쇠": "1033", "이름": "석공", "규격": "", "단위": "원/일", "값": 268908, "출처": "건설노임 1033", "일시간": 8, "상태": "공표" }, { "열쇠": "1034", "이름": "줄눈공", "규격": "", "단위": "원/일", "값": 211653, "출처": "건설노임 1034", "일시간": 8, "상태": "공표" }, { "열쇠": "1035", "이름": "판넬조립공", "규격": "", "단위": "원/일", "값": 243121, "출처": "건설노임 1035", "일시간": 8, "상태": "공표" }, @@ -66,19 +68,19 @@ { "열쇠": "1049", "이름": "화물차운전사", "규격": "", "단위": "원/일", "값": 238936, "출처": "건설노임 1049", "일시간": 8, "상태": "공표" }, { "열쇠": "1050", "이름": "일반기계운전사", "규격": "", "단위": "원/일", "값": 173995, "출처": "건설노임 1050", "일시간": 8, "신뢰도": "*", "상태": "공표" }, { "열쇠": "1051", "이름": "기계설비공", "규격": "", "단위": "원/일", "값": 241698, "출처": "건설노임 1051", "일시간": 8, "상태": "공표" }, - { "열쇠": "1052", "이름": "준설선선장", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1052", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, - { "열쇠": "1053", "이름": "준설선기관사", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1053", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, - { "열쇠": "1054", "이름": "준설선운전사", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1054", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, - { "열쇠": "1055", "이름": "선원", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1055", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, + { "열쇠": "1052", "이름": "준설선선장", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1052", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 244500.27, "근거": "원문 4-라 · 2023.9.1 공표 231,855 × 전체직종 평균 증가율 270,789/265,516(127종) × 274,286/270,789(127종) × 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", "마지막공표": "2023.9.1"} }, + { "열쇠": "1053", "이름": "준설선기관사", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1053", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 215167.2, "근거": "원문 4-라 · 2023.9.1 공표 204,039 × 전체직종 평균 증가율 270,789/265,516(127종) × 274,286/270,789(127종) × 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", "마지막공표": "2023.9.1"} }, + { "열쇠": "1054", "이름": "준설선운전사", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1054", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 209443.16, "근거": "원문 4-라 · 2023.9.1 공표 198,611 × 전체직종 평균 증가율 270,789/265,516(127종) × 274,286/270,789(127종) × 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", "마지막공표": "2023.9.1"} }, + { "열쇠": "1055", "이름": "선원", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1055", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 208507.96, "근거": "원문 4-라 · 2024.9.1 공표 204,255 × 전체직종 평균 증가율 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", "마지막공표": "2024.9.1"} }, { "열쇠": "1056", "이름": "플랜트배관공", "규격": "", "단위": "원/일", "값": 320480, "출처": "건설노임 1056", "일시간": 8, "상태": "공표" }, { "열쇠": "1057", "이름": "플랜트제관공", "규격": "", "단위": "원/일", "값": 266029, "출처": "건설노임 1057", "일시간": 8, "상태": "공표" }, { "열쇠": "1058", "이름": "플랜트용접공", "규격": "", "단위": "원/일", "값": 292640, "출처": "건설노임 1058", "일시간": 8, "상태": "공표" }, - { "열쇠": "1059", "이름": "플랜트특수용접공", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1059", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, + { "열쇠": "1059", "이름": "플랜트특수용접공", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1059", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 338645.18, "근거": "원문 4-라 · 2025.9.1 공표 337,247 × 전체직종 평균 증가율 279,988/278,832(132종)", "마지막공표": "2025.9.1", "비고": "2026.9.1 공표 334,739 있음(뒤 시기 · 판 밖)"} }, { "열쇠": "1060", "이름": "플랜트기계설치공", "규격": "", "단위": "원/일", "값": 230376, "출처": "건설노임 1060", "일시간": 8, "상태": "공표" }, { "열쇠": "1061", "이름": "플랜트특별인부", "규격": "", "단위": "원/일", "값": 213074, "출처": "건설노임 1061", "일시간": 8, "상태": "공표" }, { "열쇠": "1062", "이름": "플랜트케이블전공", "규격": "", "단위": "원/일", "값": 264269, "출처": "건설노임 1062", "일시간": 8, "상태": "공표" }, { "열쇠": "1063", "이름": "플랜트계장공", "규격": "", "단위": "원/일", "값": 204377, "출처": "건설노임 1063", "일시간": 8, "상태": "공표" }, - { "열쇠": "1064", "이름": "플랜트덕트공", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1064", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, + { "열쇠": "1064", "이름": "플랜트덕트공", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 1064", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 217176.17, "근거": "원문 4-라 · 2024.1.1 공표 210,034 × 전체직종 평균 증가율 274,286/270,789(127종) × 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", "마지막공표": "2024.1.1"} }, { "열쇠": "1065", "이름": "플랜트보온공", "규격": "", "단위": "원/일", "값": 250140, "출처": "건설노임 1065", "일시간": 8, "상태": "공표" }, { "열쇠": "1066", "이름": "제철축로공", "규격": "", "단위": "원/일", "값": 362985, "출처": "건설노임 1066", "일시간": 8, "신뢰도": "*", "상태": "공표" }, { "열쇠": "1067", "이름": "비파괴시험공", "규격": "", "단위": "원/일", "값": 214553, "출처": "건설노임 1067", "일시간": 8, "상태": "공표" }, @@ -109,21 +111,71 @@ { "열쇠": "2001", "이름": "광케이블설치사", "규격": "", "단위": "원/일", "값": 471349, "출처": "건설노임 2001", "일시간": 8, "상태": "공표" }, { "열쇠": "2002", "이름": "H/W시험사", "규격": "", "단위": "원/일", "값": 393090, "출처": "건설노임 2002", "일시간": 8, "상태": "공표" }, { "열쇠": "2003", "이름": "S/W시험사", "규격": "", "단위": "원/일", "값": 446358, "출처": "건설노임 2003", "일시간": 8, "신뢰도": "*", "상태": "공표" }, - { "열쇠": "3001", "이름": "도편수", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3001", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, - { "열쇠": "3002", "이름": "드잡이공", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3002", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, + { "열쇠": "3001", "이름": "도편수", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3001", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 516566.46, "근거": "원문 4-라 · 2024.9.1 공표 506,030 × 전체직종 평균 증가율 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", "마지막공표": "2024.9.1", "비고": "2026.9.1 공표 533,333 있음(뒤 시기 · 판 밖)"} }, + { "열쇠": "3002", "이름": "드잡이공", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3002", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 322924.87, "근거": "원문 4-라 · 2024.1.1 공표 312,305 × 전체직종 평균 증가율 274,286/270,789(127종) × 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", "마지막공표": "2024.1.1"} }, { "열쇠": "3003", "이름": "한식목공", "규격": "", "단위": "원/일", "값": 342273, "출처": "건설노임 3003", "일시간": 8, "신뢰도": "*", "상태": "공표" }, { "열쇠": "3004", "이름": "한식목공조공", "규격": "", "단위": "원/일", "값": 243009, "출처": "건설노임 3004", "일시간": 8, "신뢰도": "*", "상태": "공표" }, { "열쇠": "3005", "이름": "한식석공", "규격": "", "단위": "원/일", "값": 386079, "출처": "건설노임 3005", "일시간": 8, "신뢰도": "*", "상태": "공표" }, { "열쇠": "3006", "이름": "한식미장공", "규격": "", "단위": "원/일", "값": 321230, "출처": "건설노임 3006", "일시간": 8, "상태": "공표" }, { "열쇠": "3007", "이름": "한식와공", "규격": "", "단위": "원/일", "값": 333250, "출처": "건설노임 3007", "일시간": 8, "상태": "공표" }, { "열쇠": "3008", "이름": "한식와공조공", "규격": "", "단위": "원/일", "값": 278180, "출처": "건설노임 3008", "일시간": 8, "신뢰도": "*", "상태": "공표" }, - { "열쇠": "3009", "이름": "목조각공", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3009", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, - { "열쇠": "3010", "이름": "석조각공", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3010", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, + { + "열쇠": "3009", + "이름": "목조각공", + "규격": "", + "단위": "원/일", + "값": null, + "출처": "건설노임 3009", + "일시간": 8, + "신뢰도": "**", + "상태": "미공표", + "준용": null, + "산정": { + "값": 297226.57, + "근거": "원문 4-라 · 2021.1.1 공표 245,000 × 전체직종 평균 증가율 235,815/230,798(127종) × 242,931/235,815(127종) × 248,819/242,931(127종) × 255,426/248,819(127종) × 265,516/255,426(127종) × 270,789/265,516(127종) × 274,286/270,789(127종) × 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", + "마지막공표": "2021.1.1" + } + }, + { + "열쇠": "3010", + "이름": "석조각공", + "규격": "", + "단위": "원/일", + "값": null, + "출처": "건설노임 3010", + "일시간": 8, + "신뢰도": "**", + "상태": "미공표", + "준용": null, + "산정": { + "값": 295023.87, + "근거": "원문 4-라 · 2020.1.1 공표 233,755 × 전체직종 평균 증가율 227,923/222,803(123종) × 230,798/226,947(127종) × 235,815/230,798(127종) × 242,931/235,815(127종) × 248,819/242,931(127종) × 255,426/248,819(127종) × 265,516/255,426(127종) × 270,789/265,516(127종) × 274,286/270,789(127종) × 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", + "마지막공표": "2020.1.1", + "비고": "다산소프트(ESTX) 293,753 — 2020.1(123종) → 2020.9 를 127종 평균으로 이음 · 우리는 원문 회차 평균 그대로(123종끼리)" + } + }, { "열쇠": "3011", "이름": "특수화공", "규격": "", "단위": "원/일", "값": 324326, "출처": "건설노임 3011", "일시간": 8, "신뢰도": "*", "상태": "공표" }, { "열쇠": "3012", "이름": "화공", "규격": "", "단위": "원/일", "값": 322920, "출처": "건설노임 3012", "일시간": 8, "신뢰도": "*", "상태": "공표" }, - { "열쇠": "3013", "이름": "드잡이공편수", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3013", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, - { "열쇠": "3014", "이름": "한식미장공편수", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3014", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, - { "열쇠": "3015", "이름": "한식와공편수", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3015", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null }, + { + "열쇠": "3013", + "이름": "드잡이공편수", + "규격": "", + "단위": "원/일", + "값": null, + "출처": "건설노임 3013", + "일시간": 8, + "신뢰도": "**", + "상태": "미공표", + "준용": null, + "산정": { + "값": 359448.14, + "근거": "원문 4-라 · 2020.1.1 공표 284,800 × 전체직종 평균 증가율 227,923/222,803(123종) × 230,798/226,947(127종) × 235,815/230,798(127종) × 242,931/235,815(127종) × 248,819/242,931(127종) × 255,426/248,819(127종) × 265,516/255,426(127종) × 270,789/265,516(127종) × 274,286/270,789(127종) × 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", + "마지막공표": "2020.1.1", + "비고": "다산소프트(ESTX) 357,905 — 2020.1(123종) → 2020.9 를 127종 평균으로 이음 · 우리는 원문 회차 평균 그대로(123종끼리)" + } + }, + { "열쇠": "3014", "이름": "한식미장공편수", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3014", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 374531.02, "근거": "원문 4-라 · 2024.1.1 공표 362,214 × 전체직종 평균 증가율 274,286/270,789(127종) × 276,020/274,286(127종) × 278,832/276,011(132종) × 279,988/278,832(132종)", "마지막공표": "2024.1.1", "비고": "2026.9.1 공표 395,789 있음(뒤 시기 · 판 밖)"} }, + { "열쇠": "3015", "이름": "한식와공편수", "규격": "", "단위": "원/일", "값": null, "출처": "건설노임 3015", "일시간": 8, "신뢰도": "**", "상태": "미공표", "준용": null, "산정": {"값": 463729.9, "근거": "원문 4-라 · 2025.1.1 공표 457,143 × 전체직종 평균 증가율 278,832/276,011(132종) × 279,988/278,832(132종)", "마지막공표": "2025.1.1"} }, { "열쇠": "3016", "이름": "한식단청공편수", "규격": "", "단위": "원/일", "값": 286887, "출처": "건설노임 3016", "일시간": 8, "신뢰도": "*", "상태": "공표" }, { "열쇠": "3017", "이름": "한식석공조공", "규격": "", "단위": "원/일", "값": 321250, "출처": "건설노임 3017", "일시간": 8, "신뢰도": "*", "상태": "공표" }, { "열쇠": "3018", "이름": "한식미장공조공", "규격": "", "단위": "원/일", "값": 250000, "출처": "건설노임 3018", "일시간": 8, "신뢰도": "*", "상태": "공표" }, diff --git a/resources/master_data/인력_건설사업관리노임.json b/resources/master_data/인력_건설사업관리노임.json new file mode 100644 index 00000000..3ee3d950 --- /dev/null +++ b/resources/master_data/인력_건설사업관리노임.json @@ -0,0 +1,23 @@ +{ + "그룹": "인력", + "원문": "건설사업관리노임", + "판": "2026-01-01", + "공표일": "2025-12-29", + "원천": [ + { + "경로": "resources/knowledge/original/원가계산/노임단가_건설사업관리_한국건설엔지니어링협회/2026년도_건설사업관리기술인_임금실태조사결과_공표_한국건설엔지니어링협회.md", + "해시": "5a35fd8fc62594edcc5409352b712e88d0651abb4ebba267a345d06ed1869f02", + "역할": "primary" + } + ], + "비고": [ + "한국건설엔지니어링협회 2026년도 건설사업관리기술인 노임가격(정책381-3804호 · 통계청승인 제378001호) · 일임금액", + "환산비 = 원문 Si(고급 = 1.000 기준 등급별 비율 · 소수 넷째 자리 반올림)" + ], + "줄": [ + { "열쇠": "특급건설사업관리기술인", "이름": "특급건설사업관리기술인", "규격": "", "단위": "원/일", "값": 399247, "출처": "건설사업관리노임 특급", "환산비": 1.061 }, + { "열쇠": "고급건설사업관리기술인", "이름": "고급건설사업관리기술인", "규격": "", "단위": "원/일", "값": 376400, "출처": "건설사업관리노임 고급", "환산비": 1.0 }, + { "열쇠": "중급건설사업관리기술인", "이름": "중급건설사업관리기술인", "규격": "", "단위": "원/일", "값": 350580, "출처": "건설사업관리노임 중급", "환산비": 0.931 }, + { "열쇠": "초급건설사업관리기술인", "이름": "초급건설사업관리기술인", "규격": "", "단위": "원/일", "값": 287724, "출처": "건설사업관리노임 초급", "환산비": 0.764 } + ] +} diff --git a/resources/master_data/인력_산림노임.json b/resources/master_data/인력_산림노임.json new file mode 100644 index 00000000..cf2c23da --- /dev/null +++ b/resources/master_data/인력_산림노임.json @@ -0,0 +1,21 @@ +{ + "그룹": "인력", + "원문": "산림노임", + "판": "2026-01-01", + "공표일": "2026-01-06", + "원천": [ + { + "경로": "resources/knowledge/original/원가계산/노임단가_산림_산림청/2026년_나무의사_수목치료기술자_노임단가_알림.md", + "해시": "c8e3565e5b34c5f2893f6db20de5de72f9dbbf2816bcff4cdac38efbd651f014", + "역할": "primary" + } + ], + "비고": [ + "산림청 2026년 나무의사·수목치료기술자 노임단가 알림(수목진료 표준품셈 예정가격 작성용) · 2025년 소비자물가상승률 2.1% 반영(원문) · 통계 승인 노임 아님", + "판 = 2026년 적용(원문에 적용 시작일 없음 · 1월 1일로 적음)" + ], + "줄": [ + { "열쇠": "나무의사", "이름": "나무의사", "규격": "", "단위": "원/일", "값": 326359, "출처": "산림노임 나무의사" }, + { "열쇠": "수목치료기술자", "이름": "수목치료기술자", "규격": "", "단위": "원/일", "값": 238447, "출처": "산림노임 수목치료기술자" } + ] +} diff --git a/resources/master_data/인력_엔지니어링노임.json b/resources/master_data/인력_엔지니어링노임.json new file mode 100644 index 00000000..dfd07a29 --- /dev/null +++ b/resources/master_data/인력_엔지니어링노임.json @@ -0,0 +1,76 @@ +{ + "그룹": "인력", + "원문": "엔지니어링노임", + "판": "2026-01-01", + "공표일": "2025-12-02", + "원천": [ + { + "경로": "resources/knowledge/original/원가계산/노임단가_엔지니어링_한국엔지니어링협회/공표문_2025 엔지니어링업체 임금실태조사결과 공표.md", + "해시": "7b384fef6d92fe549cddb661b036b9181025a82913791ba48e00a10247a47d48", + "역할": "primary" + } + ], + "비고": [ + "한국엔지니어링협회 2025 엔지니어링업체 임금실태조사결과 공표(기획홍보팀-1515호 · 국가승인통계 제372001호) · 7 기술부문 × 8 기술등급 · 1인 1일 평균임금 · 월평균 근무일수 20.3일", + "이름 = 기술등급(기술부문) · 기타 = 선박·항공우주·금속·화학·광업·농림·산업·해양·수산", + "보고서 표 2 「전체」(기술등급 단순평균)는 공표 노임단가가 아니라 넣지 않음" + ], + "줄": [ + { "열쇠": "기술사(기계·설비)", "이름": "기술사(기계·설비)", "규격": "", "단위": "원/일", "값": 474467, "출처": "엔지니어링노임 기술사 기계·설비", "부문": "기계·설비" }, + { "열쇠": "기술사(전기)", "이름": "기술사(전기)", "규격": "", "단위": "원/일", "값": 461459, "출처": "엔지니어링노임 기술사 전기", "부문": "전기" }, + { "열쇠": "기술사(정보통신)", "이름": "기술사(정보통신)", "규격": "", "단위": "원/일", "값": 455331, "출처": "엔지니어링노임 기술사 정보통신", "부문": "정보통신" }, + { "열쇠": "기술사(건설)", "이름": "기술사(건설)", "규격": "", "단위": "원/일", "값": 467217, "출처": "엔지니어링노임 기술사 건설", "부문": "건설" }, + { "열쇠": "기술사(환경)", "이름": "기술사(환경)", "규격": "", "단위": "원/일", "값": 456237, "출처": "엔지니어링노임 기술사 환경", "부문": "환경" }, + { "열쇠": "기술사(원자력)", "이름": "기술사(원자력)", "규격": "", "단위": "원/일", "값": 584019, "출처": "엔지니어링노임 기술사 원자력", "부문": "원자력" }, + { "열쇠": "기술사(기타)", "이름": "기술사(기타)", "규격": "", "단위": "원/일", "값": 447658, "출처": "엔지니어링노임 기술사 기타", "부문": "기타" }, + { "열쇠": "특급기술자(기계·설비)", "이름": "특급기술자(기계·설비)", "규격": "", "단위": "원/일", "값": 401407, "출처": "엔지니어링노임 특급기술자 기계·설비", "부문": "기계·설비" }, + { "열쇠": "특급기술자(전기)", "이름": "특급기술자(전기)", "규격": "", "단위": "원/일", "값": 360108, "출처": "엔지니어링노임 특급기술자 전기", "부문": "전기" }, + { "열쇠": "특급기술자(정보통신)", "이름": "특급기술자(정보통신)", "규격": "", "단위": "원/일", "값": 343079, "출처": "엔지니어링노임 특급기술자 정보통신", "부문": "정보통신" }, + { "열쇠": "특급기술자(건설)", "이름": "특급기술자(건설)", "규격": "", "단위": "원/일", "값": 373353, "출처": "엔지니어링노임 특급기술자 건설", "부문": "건설" }, + { "열쇠": "특급기술자(환경)", "이름": "특급기술자(환경)", "규격": "", "단위": "원/일", "값": 362012, "출처": "엔지니어링노임 특급기술자 환경", "부문": "환경" }, + { "열쇠": "특급기술자(원자력)", "이름": "특급기술자(원자력)", "규격": "", "단위": "원/일", "값": 463039, "출처": "엔지니어링노임 특급기술자 원자력", "부문": "원자력" }, + { "열쇠": "특급기술자(기타)", "이름": "특급기술자(기타)", "규격": "", "단위": "원/일", "값": 357676, "출처": "엔지니어링노임 특급기술자 기타", "부문": "기타" }, + { "열쇠": "고급기술자(기계·설비)", "이름": "고급기술자(기계·설비)", "규격": "", "단위": "원/일", "값": 335379, "출처": "엔지니어링노임 고급기술자 기계·설비", "부문": "기계·설비" }, + { "열쇠": "고급기술자(전기)", "이름": "고급기술자(전기)", "규격": "", "단위": "원/일", "값": 311965, "출처": "엔지니어링노임 고급기술자 전기", "부문": "전기" }, + { "열쇠": "고급기술자(정보통신)", "이름": "고급기술자(정보통신)", "규격": "", "단위": "원/일", "값": 315288, "출처": "엔지니어링노임 고급기술자 정보통신", "부문": "정보통신" }, + { "열쇠": "고급기술자(건설)", "이름": "고급기술자(건설)", "규격": "", "단위": "원/일", "값": 310884, "출처": "엔지니어링노임 고급기술자 건설", "부문": "건설" }, + { "열쇠": "고급기술자(환경)", "이름": "고급기술자(환경)", "규격": "", "단위": "원/일", "값": 323993, "출처": "엔지니어링노임 고급기술자 환경", "부문": "환경" }, + { "열쇠": "고급기술자(원자력)", "이름": "고급기술자(원자력)", "규격": "", "단위": "원/일", "값": 395526, "출처": "엔지니어링노임 고급기술자 원자력", "부문": "원자력" }, + { "열쇠": "고급기술자(기타)", "이름": "고급기술자(기타)", "규격": "", "단위": "원/일", "값": 301863, "출처": "엔지니어링노임 고급기술자 기타", "부문": "기타" }, + { "열쇠": "중급기술자(기계·설비)", "이름": "중급기술자(기계·설비)", "규격": "", "단위": "원/일", "값": 300463, "출처": "엔지니어링노임 중급기술자 기계·설비", "부문": "기계·설비" }, + { "열쇠": "중급기술자(전기)", "이름": "중급기술자(전기)", "규격": "", "단위": "원/일", "값": 300452, "출처": "엔지니어링노임 중급기술자 전기", "부문": "전기" }, + { "열쇠": "중급기술자(정보통신)", "이름": "중급기술자(정보통신)", "규격": "", "단위": "원/일", "값": 283343, "출처": "엔지니어링노임 중급기술자 정보통신", "부문": "정보통신" }, + { "열쇠": "중급기술자(건설)", "이름": "중급기술자(건설)", "규격": "", "단위": "원/일", "값": 295138, "출처": "엔지니어링노임 중급기술자 건설", "부문": "건설" }, + { "열쇠": "중급기술자(환경)", "이름": "중급기술자(환경)", "규격": "", "단위": "원/일", "값": 272129, "출처": "엔지니어링노임 중급기술자 환경", "부문": "환경" }, + { "열쇠": "중급기술자(원자력)", "이름": "중급기술자(원자력)", "규격": "", "단위": "원/일", "값": 363751, "출처": "엔지니어링노임 중급기술자 원자력", "부문": "원자력" }, + { "열쇠": "중급기술자(기타)", "이름": "중급기술자(기타)", "규격": "", "단위": "원/일", "값": 261545, "출처": "엔지니어링노임 중급기술자 기타", "부문": "기타" }, + { "열쇠": "초급기술자(기계·설비)", "이름": "초급기술자(기계·설비)", "규격": "", "단위": "원/일", "값": 263602, "출처": "엔지니어링노임 초급기술자 기계·설비", "부문": "기계·설비" }, + { "열쇠": "초급기술자(전기)", "이름": "초급기술자(전기)", "규격": "", "단위": "원/일", "값": 248432, "출처": "엔지니어링노임 초급기술자 전기", "부문": "전기" }, + { "열쇠": "초급기술자(정보통신)", "이름": "초급기술자(정보통신)", "규격": "", "단위": "원/일", "값": 249574, "출처": "엔지니어링노임 초급기술자 정보통신", "부문": "정보통신" }, + { "열쇠": "초급기술자(건설)", "이름": "초급기술자(건설)", "규격": "", "단위": "원/일", "값": 235459, "출처": "엔지니어링노임 초급기술자 건설", "부문": "건설" }, + { "열쇠": "초급기술자(환경)", "이름": "초급기술자(환경)", "규격": "", "단위": "원/일", "값": 246584, "출처": "엔지니어링노임 초급기술자 환경", "부문": "환경" }, + { "열쇠": "초급기술자(원자력)", "이름": "초급기술자(원자력)", "규격": "", "단위": "원/일", "값": 297437, "출처": "엔지니어링노임 초급기술자 원자력", "부문": "원자력" }, + { "열쇠": "초급기술자(기타)", "이름": "초급기술자(기타)", "규격": "", "단위": "원/일", "값": 229278, "출처": "엔지니어링노임 초급기술자 기타", "부문": "기타" }, + { "열쇠": "고급숙련기술자(기계·설비)", "이름": "고급숙련기술자(기계·설비)", "규격": "", "단위": "원/일", "값": 309271, "출처": "엔지니어링노임 고급숙련기술자 기계·설비", "부문": "기계·설비" }, + { "열쇠": "고급숙련기술자(전기)", "이름": "고급숙련기술자(전기)", "규격": "", "단위": "원/일", "값": 301459, "출처": "엔지니어링노임 고급숙련기술자 전기", "부문": "전기" }, + { "열쇠": "고급숙련기술자(정보통신)", "이름": "고급숙련기술자(정보통신)", "규격": "", "단위": "원/일", "값": 273034, "출처": "엔지니어링노임 고급숙련기술자 정보통신", "부문": "정보통신" }, + { "열쇠": "고급숙련기술자(건설)", "이름": "고급숙련기술자(건설)", "규격": "", "단위": "원/일", "값": 281075, "출처": "엔지니어링노임 고급숙련기술자 건설", "부문": "건설" }, + { "열쇠": "고급숙련기술자(환경)", "이름": "고급숙련기술자(환경)", "규격": "", "단위": "원/일", "값": 267856, "출처": "엔지니어링노임 고급숙련기술자 환경", "부문": "환경" }, + { "열쇠": "고급숙련기술자(원자력)", "이름": "고급숙련기술자(원자력)", "규격": "", "단위": "원/일", "값": 360090, "출처": "엔지니어링노임 고급숙련기술자 원자력", "부문": "원자력" }, + { "열쇠": "고급숙련기술자(기타)", "이름": "고급숙련기술자(기타)", "규격": "", "단위": "원/일", "값": 289195, "출처": "엔지니어링노임 고급숙련기술자 기타", "부문": "기타" }, + { "열쇠": "중급숙련기술자(기계·설비)", "이름": "중급숙련기술자(기계·설비)", "규격": "", "단위": "원/일", "값": 241305, "출처": "엔지니어링노임 중급숙련기술자 기계·설비", "부문": "기계·설비" }, + { "열쇠": "중급숙련기술자(전기)", "이름": "중급숙련기술자(전기)", "규격": "", "단위": "원/일", "값": 246556, "출처": "엔지니어링노임 중급숙련기술자 전기", "부문": "전기" }, + { "열쇠": "중급숙련기술자(정보통신)", "이름": "중급숙련기술자(정보통신)", "규격": "", "단위": "원/일", "값": 234317, "출처": "엔지니어링노임 중급숙련기술자 정보통신", "부문": "정보통신" }, + { "열쇠": "중급숙련기술자(건설)", "이름": "중급숙련기술자(건설)", "규격": "", "단위": "원/일", "값": 250087, "출처": "엔지니어링노임 중급숙련기술자 건설", "부문": "건설" }, + { "열쇠": "중급숙련기술자(환경)", "이름": "중급숙련기술자(환경)", "규격": "", "단위": "원/일", "값": 222995, "출처": "엔지니어링노임 중급숙련기술자 환경", "부문": "환경" }, + { "열쇠": "중급숙련기술자(원자력)", "이름": "중급숙련기술자(원자력)", "규격": "", "단위": "원/일", "값": 350319, "출처": "엔지니어링노임 중급숙련기술자 원자력", "부문": "원자력" }, + { "열쇠": "중급숙련기술자(기타)", "이름": "중급숙련기술자(기타)", "규격": "", "단위": "원/일", "값": 226344, "출처": "엔지니어링노임 중급숙련기술자 기타", "부문": "기타" }, + { "열쇠": "초급숙련기술자(기계·설비)", "이름": "초급숙련기술자(기계·설비)", "규격": "", "단위": "원/일", "값": 217582, "출처": "엔지니어링노임 초급숙련기술자 기계·설비", "부문": "기계·설비" }, + { "열쇠": "초급숙련기술자(전기)", "이름": "초급숙련기술자(전기)", "규격": "", "단위": "원/일", "값": 209640, "출처": "엔지니어링노임 초급숙련기술자 전기", "부문": "전기" }, + { "열쇠": "초급숙련기술자(정보통신)", "이름": "초급숙련기술자(정보통신)", "규격": "", "단위": "원/일", "값": 198751, "출처": "엔지니어링노임 초급숙련기술자 정보통신", "부문": "정보통신" }, + { "열쇠": "초급숙련기술자(건설)", "이름": "초급숙련기술자(건설)", "규격": "", "단위": "원/일", "값": 218142, "출처": "엔지니어링노임 초급숙련기술자 건설", "부문": "건설" }, + { "열쇠": "초급숙련기술자(환경)", "이름": "초급숙련기술자(환경)", "규격": "", "단위": "원/일", "값": 192381, "출처": "엔지니어링노임 초급숙련기술자 환경", "부문": "환경" }, + { "열쇠": "초급숙련기술자(원자력)", "이름": "초급숙련기술자(원자력)", "규격": "", "단위": "원/일", "값": 226251, "출처": "엔지니어링노임 초급숙련기술자 원자력", "부문": "원자력" }, + { "열쇠": "초급숙련기술자(기타)", "이름": "초급숙련기술자(기타)", "규격": "", "단위": "원/일", "값": 194317, "출처": "엔지니어링노임 초급숙련기술자 기타", "부문": "기타" } + ] +} diff --git a/resources/master_data/인력_준용대상.json b/resources/master_data/인력_준용대상.json index ee59a959..5dd49ed6 100644 --- a/resources/master_data/인력_준용대상.json +++ b/resources/master_data/인력_준용대상.json @@ -2,39 +2,107 @@ "그룹": "인력", "원문": "준용대상", "판": "2026-09-19", - "비고": "값을 확인 못 한 직종(공표 노임에 없음) — 이름·단위만 · 준용 = 관리자가 고르는 건설노임·제조노임 공표 직종 열쇠(`인력:원문:열쇠`) · 비고 = 이 직종을 요구한 품셈 절", + "비고": "값을 확인 못 한 직종(공표 노임에 이름이 온전히 같은 직종 없음) — 이름·단위만 · 준용 = 관리자가 고르는 공표 직종 열쇠(`인력:원문:열쇠`) · 통합 = 건설노임 원문 「통합·명칭변경 직종」 목록의 새 직종(엔진이 그 값을 씀) · 후보 = 비슷한 이름(값 안 씀) · 비고 = 이 직종을 요구한 품셈 절", "줄": [ - { "열쇠": "중급기술자", "이름": "중급기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 공통 2-9-12 · 2-11-8 · 2-11-9 · 2-12-4 작업편성인원 · 5-1-7 인장 · 건설품셈 유지관리 1-1-2 · 건설품셈 토목 8-1-2 · 건설품셈 토목 8-1-3 · 건설품셈 토목 8-2-1 · 건설품셈 토목 8-2-2 · 건설품셈 토목 8-2-3 · 건설품셈 토목 8-2-4 · 건설품셈 토목 8-2-5 · 건설품셈 토목 8-2-6 · 건설품셈 토목 8-2-7 · 건설품셈 토목 8-3-1 · 건설품셈 토목 8-3-2 · 건설품셈 토목 8-4-1 · 건설품셈 토목 8-4-2 · 건설품셈 토목 8-4-3 · 건설품셈 토목 9-1-1 · 건설품셈 토목 9-1-2 · 건설품셈 토목 9-1-3 · 건설품셈 토목 9-1-4 · 건설품셈 토목 9-1-5 · 건설품셈 토목 9-2-1 · 건설품셈 토목 9-2-2 · 건설품셈 토목 9-2-3 · 건설품셈 토목 9-2-4 · 건설품셈 토목 9-2-5 · 건설품셈 토목 9-2-6 · 건설품셈 토목 9-2-7 · 건설품셈 토목 9-3-1-1 · 건설품셈 토목 9-3-1-2 · 건설품셈 토목 9-3-2 · 건설품셈 토목 9-3-3 · 건설품셈 토목 9-3-4-4 · 건설품셈 토목 9-3-4-5 · 건설품셈 토목 9-3-4-6 · 건설품셈 토목 9-3-4-7 · 건설품셈 토목 9-3-4-8 · 건설품셈 토목 9-3-5 · 건설품셈 토목 9-4-1 · 건설품셈 토목 9-4-2 · 건설품셈 토목 9-4-3-1 · 건설품셈 토목 9-4-3-2 · 건설품셈 토목 9-4-3-3 · 건설품셈 토목 9-4-3-4 · 건설품셈 토목 9-5-1 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-2 · 건설품셈 토목 9-5-3 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-4-9 · 건설품셈 토목 9-5-6-1가 · 건설품셈 토목 9-5-6-1나 · 건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-6-2나 · 건설품셈 토목 9-5-7-2 · 건설품셈 토목 9-5-9 · 건설품셈 공통 3-11-1 · 건설품셈 공통 3-11-2 · 건설품셈 공통 3-11-3 · 건설품셈 공통 3-11-4 · 건설품셈 공통 3-11-5 · 건설품셈 공통 3-7-2", "준용": null }, - { "열쇠": "절단공", "이름": "절단공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 공통 6-2-5 · 건설품셈 기계설비 13-6-11 · 건설품셈 기계설비 13-6-13 · 건설품셈 기계설비 13-6-17", "준용": null }, - { "열쇠": "특수비계공", "이름": "특수비계공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 공통 6-3-6 설치 및 해체(해체) · 건설품셈 기계설비 13-6-8 · 건설품셈 기계설비 13-6-9 · 건설품셈 기계설비 13-6-10 · 건설품셈 기계설비 13-6-11 · 건설품셈 기계설비 13-6-12 · 건설품셈 기계설비 13-6-13 · 건설품셈 기계설비 13-6-14 · 건설품셈 기계설비 13-6-15 · 건설품셈 기계설비 13-6-17 · 건설품셈 기계설비 13-6-16", "준용": null }, - { "열쇠": "초급기술자", "이름": "초급기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 유지관리 2-4-3 · 건설품셈 토목 8-2-4 · 건설품셈 토목 8-2-5 · 건설품셈 토목 8-2-6 · 건설품셈 토목 9-1-1 · 건설품셈 토목 9-1-2 · 건설품셈 토목 9-1-3 · 건설품셈 토목 9-1-4 · 건설품셈 토목 9-1-5 · 건설품셈 토목 9-2-1 · 건설품셈 토목 9-2-2 · 건설품셈 토목 9-2-3 · 건설품셈 토목 9-2-4 · 건설품셈 토목 9-2-5 · 건설품셈 토목 9-2-6 · 건설품셈 토목 9-2-7 · 건설품셈 토목 9-3-1-1 · 건설품셈 토목 9-3-1-2 · 건설품셈 토목 9-3-2 · 건설품셈 토목 9-3-3 · 건설품셈 토목 9-3-4-4 · 건설품셈 토목 9-3-4-5 · 건설품셈 토목 9-3-4-6 · 건설품셈 토목 9-3-4-7 · 건설품셈 토목 9-3-4-8 · 건설품셈 토목 9-3-5 · 건설품셈 토목 9-4-1 · 건설품셈 토목 9-4-2 · 건설품셈 토목 9-4-3-1 · 건설품셈 토목 9-4-3-2 · 건설품셈 토목 9-4-3-3 · 건설품셈 토목 9-4-3-4 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-4 · 건설품셈 토목 9-5-4-5 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-6-1가 · 건설품셈 토목 9-5-6-1나 · 건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-6-2나 · 건설품셈 토목 9-5-7-1 · 건설품셈 토목 9-5-7-2 · 건설품셈 토목 9-5-9", "준용": null }, - { "열쇠": "고급숙련기술자", "이름": "고급숙련기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 8-2-2 · 건설품셈 토목 8-2-7", "준용": null }, - { "열쇠": "중급숙련기술자", "이름": "중급숙련기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 8-2-2 · 건설품셈 토목 8-2-7 · 건설품셈 토목 8-4-1 · 건설품셈 토목 8-4-2 · 건설품셈 토목 8-4-3 · 건설품셈 토목 5-1-3 주①", "준용": null }, - { "열쇠": "초급숙련기술자", "이름": "초급숙련기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 8-2-2 · 건설품셈 토목 8-2-7", "준용": null }, - { "열쇠": "기술사", "이름": "기술사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 8-3-1 · 건설품셈 토목 8-3-2", "준용": null }, - { "열쇠": "특급기술자", "이름": "특급기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 8-3-1 · 건설품셈 토목 8-3-2 · 건설품셈 토목 9-1-1 · 건설품셈 토목 9-1-2 · 건설품셈 토목 9-1-3 · 건설품셈 토목 9-2-1 · 건설품셈 토목 9-2-2 · 건설품셈 토목 9-2-3 · 건설품셈 토목 9-2-4 · 건설품셈 토목 9-2-5 · 건설품셈 토목 9-2-6 · 건설품셈 토목 9-2-7 · 건설품셈 토목 9-3-1-2 · 건설품셈 토목 9-4-3-1 · 건설품셈 토목 9-4-3-2 · 건설품셈 토목 9-4-3-3 · 건설품셈 토목 9-4-3-4 · 건설품셈 토목 9-5-1 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-3 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-4 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-9 · 건설품셈 토목 9-5-9", "준용": null }, - { "열쇠": "고급기술자", "이름": "고급기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 8-3-1 · 건설품셈 토목 8-3-2 · 건설품셈 토목 9-1-1 · 건설품셈 토목 9-1-2 · 건설품셈 토목 9-1-3 · 건설품셈 토목 9-1-4 · 건설품셈 토목 9-1-5 · 건설품셈 토목 9-2-1 · 건설품셈 토목 9-2-2 · 건설품셈 토목 9-2-3 · 건설품셈 토목 9-2-4 · 건설품셈 토목 9-2-5 · 건설품셈 토목 9-2-6 · 건설품셈 토목 9-2-7 · 건설품셈 토목 9-3-1-1 · 건설품셈 토목 9-3-1-2 · 건설품셈 토목 9-3-2 · 건설품셈 토목 9-3-3 · 건설품셈 토목 9-3-4-4 · 건설품셈 토목 9-3-4-5 · 건설품셈 토목 9-3-4-6 · 건설품셈 토목 9-3-4-7 · 건설품셈 토목 9-3-4-8 · 건설품셈 토목 9-3-5 · 건설품셈 토목 9-4-1 · 건설품셈 토목 9-4-2 · 건설품셈 토목 9-4-3-1 · 건설품셈 토목 9-4-3-2 · 건설품셈 토목 9-4-3-3 · 건설품셈 토목 9-4-3-4 · 건설품셈 토목 9-5-1 · 건설품셈 토목 9-5-1-7 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-2 · 건설품셈 토목 9-5-3 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-2 · 건설품셈 토목 9-5-4-3 · 건설품셈 토목 9-5-4-4 · 건설품셈 토목 9-5-4-5 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-4-8 · 건설품셈 토목 9-5-4-9 · 건설품셈 토목 9-5-7-1 · 건설품셈 토목 9-5-9 · 건설품셈 공통 3-11-1 · 건설품셈 공통 3-11-2 · 건설품셈 공통 3-11-3 · 건설품셈 공통 3-11-4 · 건설품셈 공통 3-11-5", "준용": null }, - { "열쇠": "초급기능사(측량)", "이름": "초급기능사(측량)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-1-2 · 건설품셈 토목 9-1-3 · 건설품셈 토목 9-1-4 · 건설품셈 토목 9-1-5 · 건설품셈 토목 9-3-1-1 · 건설품셈 토목 9-3-2 · 건설품셈 토목 9-3-3 · 건설품셈 토목 9-3-4-4 · 건설품셈 토목 9-3-4-5 · 건설품셈 토목 9-3-4-6 · 건설품셈 토목 9-3-4-7 · 건설품셈 토목 9-3-4-8 · 건설품셈 토목 9-3-5 · 건설품셈 토목 9-4-1 · 건설품셈 토목 9-4-2 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-2 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-7", "준용": null }, - { "열쇠": "고급기능사", "이름": "고급기능사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-1", "준용": null }, + { + "열쇠": "중급기술자", + "이름": "중급기술자", + "규격": "", + "단위": "원/일", + "값": null, + "출처": "준용대상", + "비고": "건설품셈 공통 2-9-12 · 2-11-8 · 2-11-9 · 2-12-4 작업편성인원 · 5-1-7 인장 · 건설품셈 유지관리 1-1-2 · 건설품셈 토목 8-1-2 · 건설품셈 토목 8-1-3 · 건설품셈 토목 8-2-1 · 건설품셈 토목 8-2-2 · 건설품셈 토목 8-2-3 · 건설품셈 토목 8-2-4 · 건설품셈 토목 8-2-5 · 건설품셈 토목 8-2-6 · 건설품셈 토목 8-2-7 · 건설품셈 토목 8-3-1 · 건설품셈 토목 8-3-2 · 건설품셈 토목 8-4-1 · 건설품셈 토목 8-4-2 · 건설품셈 토목 8-4-3 · 건설품셈 토목 9-1-1 · 건설품셈 토목 9-1-2 · 건설품셈 토목 9-1-3 · 건설품셈 토목 9-1-4 · 건설품셈 토목 9-1-5 · 건설품셈 토목 9-2-1 · 건설품셈 토목 9-2-2 · 건설품셈 토목 9-2-3 · 건설품셈 토목 9-2-4 · 건설품셈 토목 9-2-5 · 건설품셈 토목 9-2-6 · 건설품셈 토목 9-2-7 · 건설품셈 토목 9-3-1-1 · 건설품셈 토목 9-3-1-2 · 건설품셈 토목 9-3-2 · 건설품셈 토목 9-3-3 · 건설품셈 토목 9-3-4-4 · 건설품셈 토목 9-3-4-5 · 건설품셈 토목 9-3-4-6 · 건설품셈 토목 9-3-4-7 · 건설품셈 토목 9-3-4-8 · 건설품셈 토목 9-3-5 · 건설품셈 토목 9-4-1 · 건설품셈 토목 9-4-2 · 건설품셈 토목 9-4-3-1 · 건설품셈 토목 9-4-3-2 · 건설품셈 토목 9-4-3-3 · 건설품셈 토목 9-4-3-4 · 건설품셈 토목 9-5-1 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-2 · 건설품셈 토목 9-5-3 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-4-9 · 건설품셈 토목 9-5-6-1가 · 건설품셈 토목 9-5-6-1나 · 건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-6-2나 · 건설품셈 토목 9-5-7-2 · 건설품셈 토목 9-5-9 · 건설품셈 공통 3-11-1 · 건설품셈 공통 3-11-2 · 건설품셈 공통 3-11-3 · 건설품셈 공통 3-11-4 · 건설품셈 공통 3-11-5 · 건설품셈 공통 3-7-2", + "준용": null, + "후보": "비슷한 이름: 인력:엔지니어링노임:중급기술자(기계·설비) · 인력:엔지니어링노임:중급기술자(전기) · 인력:엔지니어링노임:중급기술자(정보통신) · 인력:엔지니어링노임:중급기술자(건설) · 인력:엔지니어링노임:중급기술자(환경) · 인력:엔지니어링노임:중급기술자(원자력) · 인력:엔지니어링노임:중급기술자(기타) · 인력:측량노임:측량중급기술자" + }, + { "열쇠": "절단공", "이름": "절단공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 공통 6-2-5 · 건설품셈 기계설비 13-6-11 · 건설품셈 기계설비 13-6-13 · 건설품셈 기계설비 13-6-17", "준용": null, "통합": null, "후보": "통합 갈림: 철근공 · 철공 · 철판공 · 철골공 — 관리자가 준용으로 고름" }, + { "열쇠": "특수비계공", "이름": "특수비계공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 공통 6-3-6 설치 및 해체(해체) · 건설품셈 기계설비 13-6-8 · 건설품셈 기계설비 13-6-9 · 건설품셈 기계설비 13-6-10 · 건설품셈 기계설비 13-6-11 · 건설품셈 기계설비 13-6-12 · 건설품셈 기계설비 13-6-13 · 건설품셈 기계설비 13-6-14 · 건설품셈 기계설비 13-6-15 · 건설품셈 기계설비 13-6-17 · 건설품셈 기계설비 13-6-16", "준용": null, "통합": "인력:건설노임:1006" }, + { + "열쇠": "초급기술자", + "이름": "초급기술자", + "규격": "", + "단위": "원/일", + "값": null, + "출처": "준용대상", + "비고": "건설품셈 유지관리 2-4-3 · 건설품셈 토목 8-2-4 · 건설품셈 토목 8-2-5 · 건설품셈 토목 8-2-6 · 건설품셈 토목 9-1-1 · 건설품셈 토목 9-1-2 · 건설품셈 토목 9-1-3 · 건설품셈 토목 9-1-4 · 건설품셈 토목 9-1-5 · 건설품셈 토목 9-2-1 · 건설품셈 토목 9-2-2 · 건설품셈 토목 9-2-3 · 건설품셈 토목 9-2-4 · 건설품셈 토목 9-2-5 · 건설품셈 토목 9-2-6 · 건설품셈 토목 9-2-7 · 건설품셈 토목 9-3-1-1 · 건설품셈 토목 9-3-1-2 · 건설품셈 토목 9-3-2 · 건설품셈 토목 9-3-3 · 건설품셈 토목 9-3-4-4 · 건설품셈 토목 9-3-4-5 · 건설품셈 토목 9-3-4-6 · 건설품셈 토목 9-3-4-7 · 건설품셈 토목 9-3-4-8 · 건설품셈 토목 9-3-5 · 건설품셈 토목 9-4-1 · 건설품셈 토목 9-4-2 · 건설품셈 토목 9-4-3-1 · 건설품셈 토목 9-4-3-2 · 건설품셈 토목 9-4-3-3 · 건설품셈 토목 9-4-3-4 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-4 · 건설품셈 토목 9-5-4-5 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-6-1가 · 건설품셈 토목 9-5-6-1나 · 건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-6-2나 · 건설품셈 토목 9-5-7-1 · 건설품셈 토목 9-5-7-2 · 건설품셈 토목 9-5-9", + "준용": null, + "후보": "비슷한 이름: 인력:엔지니어링노임:초급기술자(기계·설비) · 인력:엔지니어링노임:초급기술자(전기) · 인력:엔지니어링노임:초급기술자(정보통신) · 인력:엔지니어링노임:초급기술자(건설) · 인력:엔지니어링노임:초급기술자(환경) · 인력:엔지니어링노임:초급기술자(원자력) · 인력:엔지니어링노임:초급기술자(기타) · 인력:측량노임:측량초급기술자" + }, + { "열쇠": "고급숙련기술자", "이름": "고급숙련기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 8-2-2 · 건설품셈 토목 8-2-7", "준용": null, "후보": "비슷한 이름: 인력:엔지니어링노임:고급숙련기술자(기계·설비) · 인력:엔지니어링노임:고급숙련기술자(전기) · 인력:엔지니어링노임:고급숙련기술자(정보통신) · 인력:엔지니어링노임:고급숙련기술자(건설) · 인력:엔지니어링노임:고급숙련기술자(환경) · 인력:엔지니어링노임:고급숙련기술자(원자력) · 인력:엔지니어링노임:고급숙련기술자(기타)" }, + { "열쇠": "중급숙련기술자", "이름": "중급숙련기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 8-2-2 · 건설품셈 토목 8-2-7 · 건설품셈 토목 8-4-1 · 건설품셈 토목 8-4-2 · 건설품셈 토목 8-4-3 · 건설품셈 토목 5-1-3 주①", "준용": null, "후보": "비슷한 이름: 인력:엔지니어링노임:중급숙련기술자(기계·설비) · 인력:엔지니어링노임:중급숙련기술자(전기) · 인력:엔지니어링노임:중급숙련기술자(정보통신) · 인력:엔지니어링노임:중급숙련기술자(건설) · 인력:엔지니어링노임:중급숙련기술자(환경) · 인력:엔지니어링노임:중급숙련기술자(원자력) · 인력:엔지니어링노임:중급숙련기술자(기타)" }, + { "열쇠": "초급숙련기술자", "이름": "초급숙련기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 8-2-2 · 건설품셈 토목 8-2-7", "준용": null, "후보": "비슷한 이름: 인력:엔지니어링노임:초급숙련기술자(기계·설비) · 인력:엔지니어링노임:초급숙련기술자(전기) · 인력:엔지니어링노임:초급숙련기술자(정보통신) · 인력:엔지니어링노임:초급숙련기술자(건설) · 인력:엔지니어링노임:초급숙련기술자(환경) · 인력:엔지니어링노임:초급숙련기술자(원자력) · 인력:엔지니어링노임:초급숙련기술자(기타)" }, + { "열쇠": "기술사", "이름": "기술사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 8-3-1 · 건설품셈 토목 8-3-2", "준용": null, "후보": "비슷한 이름: 인력:엔지니어링노임:기술사(기계·설비) · 인력:엔지니어링노임:기술사(전기) · 인력:엔지니어링노임:기술사(정보통신) · 인력:엔지니어링노임:기술사(건설) · 인력:엔지니어링노임:기술사(환경) · 인력:엔지니어링노임:기술사(원자력) · 인력:엔지니어링노임:기술사(기타) · 인력:측량노임:측량기술사" }, + { + "열쇠": "특급기술자", + "이름": "특급기술자", + "규격": "", + "단위": "원/일", + "값": null, + "출처": "준용대상", + "비고": "건설품셈 토목 8-3-1 · 건설품셈 토목 8-3-2 · 건설품셈 토목 9-1-1 · 건설품셈 토목 9-1-2 · 건설품셈 토목 9-1-3 · 건설품셈 토목 9-2-1 · 건설품셈 토목 9-2-2 · 건설품셈 토목 9-2-3 · 건설품셈 토목 9-2-4 · 건설품셈 토목 9-2-5 · 건설품셈 토목 9-2-6 · 건설품셈 토목 9-2-7 · 건설품셈 토목 9-3-1-2 · 건설품셈 토목 9-4-3-1 · 건설품셈 토목 9-4-3-2 · 건설품셈 토목 9-4-3-3 · 건설품셈 토목 9-4-3-4 · 건설품셈 토목 9-5-1 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-3 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-4 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-9 · 건설품셈 토목 9-5-9", + "준용": null, + "후보": "비슷한 이름: 인력:엔지니어링노임:특급기술자(기계·설비) · 인력:엔지니어링노임:특급기술자(전기) · 인력:엔지니어링노임:특급기술자(정보통신) · 인력:엔지니어링노임:특급기술자(건설) · 인력:엔지니어링노임:특급기술자(환경) · 인력:엔지니어링노임:특급기술자(원자력) · 인력:엔지니어링노임:특급기술자(기타) · 인력:측량노임:측량특급기술자" + }, + { + "열쇠": "고급기술자", + "이름": "고급기술자", + "규격": "", + "단위": "원/일", + "값": null, + "출처": "준용대상", + "비고": "건설품셈 토목 8-3-1 · 건설품셈 토목 8-3-2 · 건설품셈 토목 9-1-1 · 건설품셈 토목 9-1-2 · 건설품셈 토목 9-1-3 · 건설품셈 토목 9-1-4 · 건설품셈 토목 9-1-5 · 건설품셈 토목 9-2-1 · 건설품셈 토목 9-2-2 · 건설품셈 토목 9-2-3 · 건설품셈 토목 9-2-4 · 건설품셈 토목 9-2-5 · 건설품셈 토목 9-2-6 · 건설품셈 토목 9-2-7 · 건설품셈 토목 9-3-1-1 · 건설품셈 토목 9-3-1-2 · 건설품셈 토목 9-3-2 · 건설품셈 토목 9-3-3 · 건설품셈 토목 9-3-4-4 · 건설품셈 토목 9-3-4-5 · 건설품셈 토목 9-3-4-6 · 건설품셈 토목 9-3-4-7 · 건설품셈 토목 9-3-4-8 · 건설품셈 토목 9-3-5 · 건설품셈 토목 9-4-1 · 건설품셈 토목 9-4-2 · 건설품셈 토목 9-4-3-1 · 건설품셈 토목 9-4-3-2 · 건설품셈 토목 9-4-3-3 · 건설품셈 토목 9-4-3-4 · 건설품셈 토목 9-5-1 · 건설품셈 토목 9-5-1-7 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-2 · 건설품셈 토목 9-5-3 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-2 · 건설품셈 토목 9-5-4-3 · 건설품셈 토목 9-5-4-4 · 건설품셈 토목 9-5-4-5 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-4-8 · 건설품셈 토목 9-5-4-9 · 건설품셈 토목 9-5-7-1 · 건설품셈 토목 9-5-9 · 건설품셈 공통 3-11-1 · 건설품셈 공통 3-11-2 · 건설품셈 공통 3-11-3 · 건설품셈 공통 3-11-4 · 건설품셈 공통 3-11-5", + "준용": null, + "후보": "비슷한 이름: 인력:엔지니어링노임:고급기술자(기계·설비) · 인력:엔지니어링노임:고급기술자(전기) · 인력:엔지니어링노임:고급기술자(정보통신) · 인력:엔지니어링노임:고급기술자(건설) · 인력:엔지니어링노임:고급기술자(환경) · 인력:엔지니어링노임:고급기술자(원자력) · 인력:엔지니어링노임:고급기술자(기타) · 인력:측량노임:측량고급기술자" + }, + { + "열쇠": "초급기능사(측량)", + "이름": "초급기능사(측량)", + "규격": "", + "단위": "원/일", + "값": null, + "출처": "준용대상", + "비고": "건설품셈 토목 9-1-2 · 건설품셈 토목 9-1-3 · 건설품셈 토목 9-1-4 · 건설품셈 토목 9-1-5 · 건설품셈 토목 9-3-1-1 · 건설품셈 토목 9-3-2 · 건설품셈 토목 9-3-3 · 건설품셈 토목 9-3-4-4 · 건설품셈 토목 9-3-4-5 · 건설품셈 토목 9-3-4-6 · 건설품셈 토목 9-3-4-7 · 건설품셈 토목 9-3-4-8 · 건설품셈 토목 9-3-5 · 건설품셈 토목 9-4-1 · 건설품셈 토목 9-4-2 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-2 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-7", + "준용": null, + "후보": "비슷한 이름: 인력:측량노임:측량초급기능사" + }, + { "열쇠": "고급기능사", "이름": "고급기능사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-1", "준용": null, "후보": "비슷한 이름: 인력:측량노임:측량고급기능사 · 인력:측량노임:지도제작고급기능사 · 인력:측량노임:도화고급기능사 · 인력:측량노임:항공사진고급기능사" }, { "열쇠": "정보처리기사", "이름": "정보처리기사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-1-7 · 건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-2 · 건설품셈 토목 9-5-4-3 · 건설품셈 토목 9-5-4-4 · 건설품셈 토목 9-5-4-5 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-4-8 · 건설품셈 토목 9-5-9", "준용": null }, - { "열쇠": "중급기능사(항공사진)", "이름": "중급기능사(항공사진)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-1-7", "준용": null }, - { "열쇠": "고급기능사(도화)", "이름": "고급기능사(도화)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-11", "준용": null }, - { "열쇠": "중급기능사(도화)", "이름": "중급기능사(도화)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-9", "준용": null }, - { "열쇠": "초급기능사(도화)", "이름": "초급기능사(도화)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-11", "준용": null }, - { "열쇠": "중급기능사(지도제작)", "이름": "중급기능사(지도제작)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-2 · 건설품셈 토목 9-5-4-3 · 건설품셈 토목 9-5-4-4 · 건설품셈 토목 9-5-4-5 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-5 · 건설품셈 토목 9-5-6-1가 · 건설품셈 토목 9-5-6-1나 · 건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-6-2나 · 건설품셈 토목 9-5-7-1 · 건설품셈 토목 9-5-7-2", "준용": null }, - { "열쇠": "중급기능사(측량)", "이름": "중급기능사(측량)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-4-8", "준용": null }, - { "열쇠": "조종사", "이름": "조종사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-4-9", "준용": null }, - { "열쇠": "정비사", "이름": "정비사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-4-9", "준용": null }, - { "열쇠": "중급기능사(지도)", "이름": "중급기능사(지도)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-9", "준용": null }, - { "열쇠": "초급기능사(지도제작)", "이름": "초급기능사(지도제작)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-6-1가 · 건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-7-2", "준용": null }, + { "열쇠": "중급기능사(항공사진)", "이름": "중급기능사(항공사진)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-1-7", "준용": null, "후보": "비슷한 이름: 인력:측량노임:항공사진중급기능사" }, + { "열쇠": "고급기능사(도화)", "이름": "고급기능사(도화)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-11", "준용": null, "후보": "비슷한 이름: 인력:측량노임:도화고급기능사" }, + { "열쇠": "중급기능사(도화)", "이름": "중급기능사(도화)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-9", "준용": null, "후보": "비슷한 이름: 인력:측량노임:도화중급기능사" }, + { "열쇠": "초급기능사(도화)", "이름": "초급기능사(도화)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-4-1 · 건설품셈 토목 9-5-4-11", "준용": null, "후보": "비슷한 이름: 인력:측량노임:도화초급기능사" }, + { "열쇠": "중급기능사(지도제작)", "이름": "중급기능사(지도제작)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-2 · 건설품셈 토목 9-5-4-3 · 건설품셈 토목 9-5-4-4 · 건설품셈 토목 9-5-4-5 · 건설품셈 토목 9-5-4-6 · 건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-5 · 건설품셈 토목 9-5-6-1가 · 건설품셈 토목 9-5-6-1나 · 건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-6-2나 · 건설품셈 토목 9-5-7-1 · 건설품셈 토목 9-5-7-2", "준용": null, "후보": "비슷한 이름: 인력:측량노임:지도제작중급기능사" }, + { "열쇠": "중급기능사(측량)", "이름": "중급기능사(측량)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-4-7 · 건설품셈 토목 9-5-4-8", "준용": null, "후보": "비슷한 이름: 인력:측량노임:측량중급기능사" }, + { "열쇠": "조종사", "이름": "조종사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-4-9", "준용": null, "후보": "비슷한 이름: 인력:측량노임:사업용조종사" }, + { "열쇠": "정비사", "이름": "정비사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-4-9", "준용": null, "후보": "비슷한 이름: 인력:측량노임:항공정비사" }, + { "열쇠": "중급기능사(지도)", "이름": "중급기능사(지도)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-10 · 건설품셈 토목 9-5-4-10 · 건설품셈 토목 9-5-4-11 · 건설품셈 토목 9-5-4-12 · 건설품셈 토목 9-5-4-9", "준용": null, "후보": "비슷한 이름: 인력:측량노임:지도제작중급기능사" }, + { "열쇠": "초급기능사(지도제작)", "이름": "초급기능사(지도제작)", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-6-1가 · 건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-7-2", "준용": null, "후보": "비슷한 이름: 인력:측량노임:지도제작초급기능사" }, { "열쇠": "사진제판공", "이름": "사진제판공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-7-2", "준용": null }, { "열쇠": "사진식자공", "이름": "사진식자공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-6-2가 · 건설품셈 토목 9-5-7-2", "준용": null }, { "열쇠": "옵셋인쇄공", "이름": "옵셋인쇄공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 9-5-7-2", "준용": null }, - { "열쇠": "함석공", "이름": "함석공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-3-2", "준용": null }, + { "열쇠": "함석공", "이름": "함석공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-3-2", "준용": null, "통합": "인력:건설노임:1043" }, { "열쇠": "기계산업기사", "이름": "기계산업기사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-4-4 · 건설품셈 기계설비 13-5-4 · 건설품셈 기계설비 13-5-5 · 건설품셈 기계설비 13-6-5 · 건설품셈 기계설비 13-6-6 · 건설품셈 기계설비 13-6-7 · 건설품셈 기계설비 13-7-5 · 건설품셈 기계설비 13-7-6 · 건설품셈 기계설비 13-7-7 · 건설품셈 기계설비 13-10-2 · 건설품셈 기계설비 13-10-3 · 건설품셈 기계설비 13-11-1 · 건설품셈 기계설비 13-11-2 · 건설품셈 기계설비 13-11-3", "준용": null }, - { "열쇠": "기계기사", "이름": "기계기사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-5-1 · 건설품셈 기계설비 13-5-2 · 건설품셈 기계설비 13-5-8 · 건설품셈 기계설비 13-5-9 · 건설품셈 기계설비 13-5-10 · 건설품셈 기계설비 13-6-1 · 건설품셈 기계설비 13-6-2 · 건설품셈 기계설비 13-6-3 · 건설품셈 기계설비 13-6-4 · 건설품셈 기계설비 13-6-8 · 건설품셈 기계설비 13-6-9 · 건설품셈 기계설비 13-6-10 · 건설품셈 기계설비 13-6-11 · 건설품셈 기계설비 13-6-12 · 건설품셈 기계설비 13-6-13 · 건설품셈 기계설비 13-6-14 · 건설품셈 기계설비 13-6-15 · 건설품셈 기계설비 13-6-17 · 건설품셈 기계설비 13-6-16 · 건설품셈 기계설비 13-7-1 · 건설품셈 기계설비 13-7-2 · 건설품셈 기계설비 13-7-3 · 건설품셈 기계설비 13-7-4 · 건설품셈 기계설비 13-7-8 · 건설품셈 기계설비 13-7-9 · 건설품셈 기계설비 13-7-10 · 건설품셈 기계설비 13-7-14 · 건설품셈 기계설비 13-7-15 · 건설품셈 기계설비 13-7-18 · 건설품셈 기계설비 13-7-19 · 건설품셈 기계설비 13-7-20 · 건설품셈 기계설비 13-7-21 · 건설품셈 기계설비 13-7-16 · 건설품셈 기계설비 13-7-17 · 건설품셈 기계설비 13-7-22 · 건설품셈 기계설비 13-8-1 · 건설품셈 기계설비 13-8-2 · 건설품셈 기계설비 13-8-4 · 건설품셈 기계설비 13-8-5 · 건설품셈 기계설비 13-8-6 · 건설품셈 기계설비 13-8-7", "준용": null }, - { "열쇠": "측량사", "이름": "측량사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 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 }, - { "열쇠": "제관공", "이름": "제관공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-5-4 · 건설품셈 기계설비 13-10-3 · 건설품셈 기계설비 13-11-3", "준용": null }, + { + "열쇠": "기계기사", + "이름": "기계기사", + "규격": "", + "단위": "원/일", + "값": null, + "출처": "준용대상", + "비고": "건설품셈 기계설비 13-5-1 · 건설품셈 기계설비 13-5-2 · 건설품셈 기계설비 13-5-8 · 건설품셈 기계설비 13-5-9 · 건설품셈 기계설비 13-5-10 · 건설품셈 기계설비 13-6-1 · 건설품셈 기계설비 13-6-2 · 건설품셈 기계설비 13-6-3 · 건설품셈 기계설비 13-6-4 · 건설품셈 기계설비 13-6-8 · 건설품셈 기계설비 13-6-9 · 건설품셈 기계설비 13-6-10 · 건설품셈 기계설비 13-6-11 · 건설품셈 기계설비 13-6-12 · 건설품셈 기계설비 13-6-13 · 건설품셈 기계설비 13-6-14 · 건설품셈 기계설비 13-6-15 · 건설품셈 기계설비 13-6-17 · 건설품셈 기계설비 13-6-16 · 건설품셈 기계설비 13-7-1 · 건설품셈 기계설비 13-7-2 · 건설품셈 기계설비 13-7-3 · 건설품셈 기계설비 13-7-4 · 건설품셈 기계설비 13-7-8 · 건설품셈 기계설비 13-7-9 · 건설품셈 기계설비 13-7-10 · 건설품셈 기계설비 13-7-14 · 건설품셈 기계설비 13-7-15 · 건설품셈 기계설비 13-7-18 · 건설품셈 기계설비 13-7-19 · 건설품셈 기계설비 13-7-20 · 건설품셈 기계설비 13-7-21 · 건설품셈 기계설비 13-7-16 · 건설품셈 기계설비 13-7-17 · 건설품셈 기계설비 13-7-22 · 건설품셈 기계설비 13-8-1 · 건설품셈 기계설비 13-8-2 · 건설품셈 기계설비 13-8-4 · 건설품셈 기계설비 13-8-5 · 건설품셈 기계설비 13-8-6 · 건설품셈 기계설비 13-8-7", + "준용": null + }, + { + "열쇠": "측량사", + "이름": "측량사", + "규격": "", + "단위": "원/일", + "값": null, + "출처": "준용대상", + "비고": "건설품셈 기계설비 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 + }, + { "열쇠": "제관공", "이름": "제관공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-5-4 · 건설품셈 기계설비 13-10-3 · 건설품셈 기계설비 13-11-3", "준용": null, "후보": "비슷한 이름: 인력:건설노임:1057" }, { "열쇠": "공작기계공", "이름": "공작기계공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-6-1 · 건설품셈 기계설비 13-6-2", "준용": null }, { "열쇠": "리베팅공", "이름": "리베팅공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-6-4", "준용": null }, { "열쇠": "마킹공", "이름": "마킹공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-6-8 · 건설품셈 기계설비 13-6-9 · 건설품셈 기계설비 13-6-10 · 건설품셈 기계설비 13-6-11 · 건설품셈 기계설비 13-6-13 · 건설품셈 기계설비 13-6-15 · 건설품셈 기계설비 13-6-17", "준용": null }, @@ -49,9 +117,8 @@ { "열쇠": "시공측량기사", "이름": "시공측량기사", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-6-14", "준용": null }, { "열쇠": "시공측량조수", "이름": "시공측량조수", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-6-14", "준용": null }, { "열쇠": "Belt Conveyor 설치공", "이름": "Belt Conveyor 설치공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-10-1", "준용": null }, - { "열쇠": "목도", "이름": "목도", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-10-4", "준용": null }, - { "열쇠": "스레이트공", "이름": "스레이트공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-11-2", "준용": null }, - { "열쇠": "측량중급기술자", "이름": "측량중급기술자", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 4-2-1 · 건설품셈 토목 4-2-2 · 건설품셈 토목 4-3-1 · 건설품셈 토목 4-3-2 · 건설품셈 토목 4-3-3 · 건설품셈 토목 4-4-1 · 건설품셈 토목 4-4-2", "준용": null }, - { "열쇠": "갱부", "이름": "갱부", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 6-7-5", "준용": null } + { "열쇠": "목도", "이름": "목도", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-10-4", "준용": null, "통합": "인력:건설노임:1045" }, + { "열쇠": "스레이트공", "이름": "스레이트공", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 기계설비 13-11-2", "준용": null, "통합": "인력:건설노임:1036" }, + { "열쇠": "갱부", "이름": "갱부", "규격": "", "단위": "원/일", "값": null, "출처": "준용대상", "비고": "건설품셈 토목 6-7-5", "준용": null, "통합": "인력:건설노임:1003" } ] } diff --git a/resources/master_data/인력_측량노임.json b/resources/master_data/인력_측량노임.json new file mode 100644 index 00000000..e2908c4a --- /dev/null +++ b/resources/master_data/인력_측량노임.json @@ -0,0 +1,39 @@ +{ + "그룹": "인력", + "원문": "측량노임", + "판": "2026-01-01", + "공표일": "2025-12-22", + "원천": [ + { + "경로": "resources/knowledge/original/원가계산/노임단가_측량_한국공간정보산업협회/공표문_2025년도 측량업체 임금실태조사 결과 공표.md", + "해시": "05de8debb66e8180495021b31efe223c0a944b99d2adf53969f552ea0d10084b", + "역할": "primary" + } + ], + "비고": [ + "한국공간정보산업협회 2025년도 측량업체 임금실태조사 결과 공표(국가승인통계 제377001호) · 20 직종 · 1인 1일 · 월평균 근무일수 20.3일", + "이름 = 기술계 「측량<등급>기술자」·측량기술사 · 기능계 「<분야><등급>기능사」 · 기타 원문 그대로 — 원문 칸은 출처에" + ], + "줄": [ + { "열쇠": "측량기술사", "이름": "측량기술사", "규격": "", "단위": "원/일", "값": 442679, "출처": "측량노임 기술계 기술사" }, + { "열쇠": "측량특급기술자", "이름": "측량특급기술자", "규격": "", "단위": "원/일", "값": 326774, "출처": "측량노임 기술계 특급" }, + { "열쇠": "측량고급기술자", "이름": "측량고급기술자", "규격": "", "단위": "원/일", "값": 289265, "출처": "측량노임 기술계 고급" }, + { "열쇠": "측량중급기술자", "이름": "측량중급기술자", "규격": "", "단위": "원/일", "값": 251596, "출처": "측량노임 기술계 중급" }, + { "열쇠": "측량초급기술자", "이름": "측량초급기술자", "규격": "", "단위": "원/일", "값": 215609, "출처": "측량노임 기술계 초급" }, + { "열쇠": "측량고급기능사", "이름": "측량고급기능사", "규격": "", "단위": "원/일", "값": 259647, "출처": "측량노임 기능계 측량 고급" }, + { "열쇠": "측량중급기능사", "이름": "측량중급기능사", "규격": "", "단위": "원/일", "값": 235899, "출처": "측량노임 기능계 측량 중급" }, + { "열쇠": "측량초급기능사", "이름": "측량초급기능사", "규격": "", "단위": "원/일", "값": 200786, "출처": "측량노임 기능계 측량 초급" }, + { "열쇠": "지도제작고급기능사", "이름": "지도제작고급기능사", "규격": "", "단위": "원/일", "값": 268435, "출처": "측량노임 기능계 지도제작 고급" }, + { "열쇠": "지도제작중급기능사", "이름": "지도제작중급기능사", "규격": "", "단위": "원/일", "값": 242957, "출처": "측량노임 기능계 지도제작 중급" }, + { "열쇠": "지도제작초급기능사", "이름": "지도제작초급기능사", "규격": "", "단위": "원/일", "값": 198089, "출처": "측량노임 기능계 지도제작 초급" }, + { "열쇠": "도화고급기능사", "이름": "도화고급기능사", "규격": "", "단위": "원/일", "값": 300967, "출처": "측량노임 기능계 도화 고급" }, + { "열쇠": "도화중급기능사", "이름": "도화중급기능사", "규격": "", "단위": "원/일", "값": 236885, "출처": "측량노임 기능계 도화 중급" }, + { "열쇠": "도화초급기능사", "이름": "도화초급기능사", "규격": "", "단위": "원/일", "값": 229483, "출처": "측량노임 기능계 도화 초급" }, + { "열쇠": "항공사진고급기능사", "이름": "항공사진고급기능사", "규격": "", "단위": "원/일", "값": 299990, "출처": "측량노임 기능계 항공사진 고급" }, + { "열쇠": "항공사진중급기능사", "이름": "항공사진중급기능사", "규격": "", "단위": "원/일", "값": 270554, "출처": "측량노임 기능계 항공사진 중급" }, + { "열쇠": "항공사진초급기능사", "이름": "항공사진초급기능사", "규격": "", "단위": "원/일", "값": 237664, "출처": "측량노임 기능계 항공사진 초급" }, + { "열쇠": "사업용조종사", "이름": "사업용조종사", "규격": "", "단위": "원/일", "값": 313877, "출처": "측량노임 기타 사업용조종사" }, + { "열쇠": "항법사", "이름": "항법사", "규격": "", "단위": "원/일", "값": 303861, "출처": "측량노임 기타 항법사" }, + { "열쇠": "항공정비사", "이름": "항공정비사", "규격": "", "단위": "원/일", "값": 288757, "출처": "측량노임 기타 항공정비사" } + ] +} diff --git a/resources/tester/test_m01_api.py b/resources/tester/test_m01_api.py index e9e5a43f..eed21458 100644 --- a/resources/tester/test_m01_api.py +++ b/resources/tester/test_m01_api.py @@ -254,6 +254,10 @@ def test_고르기_나라장터_시중물가_직종(client: TestClient) -> None: == "인력:제조노임:1" ) assert all(i["값"] is not None for i in _get(client, "/api/m01/pick", kind="job")["items"]) + assert ( + _get(client, "/api/m01/pick", kind="job", q="기술사(건설)")["items"][0]["ref"] + == "인력:엔지니어링노임:기술사(건설)" + ) def test_못_이은_줄만_거름(client: TestClient) -> None: diff --git a/resources/tester/test_masterdata_check.py b/resources/tester/test_masterdata_check.py index b559f3ba..6274c391 100644 --- a/resources/tester/test_masterdata_check.py +++ b/resources/tester/test_masterdata_check.py @@ -609,7 +609,7 @@ def test_범위규칙_이상이하(): def test_미공표_준용(): - """값 없는 직종에 준용 열쇠 — 그 직종 값으로 셈 · 호표 출처에 「준용: 이름」 · 준용 없으면 멈춤.""" + """값 없는 직종 — 차례 값 → 준용 → 통합 → 산정 · 호표 출처에 「준용: 이름」·「통합: 이름」·「산정: …」 · 다 없으면 멈춤.""" files = cm.load() lines = [ { @@ -621,11 +621,15 @@ def test_미공표_준용(): } ] files["_시험"] = {"그룹": "로직", "원문": "시험", "줄": [{"열쇠": "준용", "호표": lines}]} + row = next(r for r in files["인력_건설노임.json"]["줄"] if r["열쇠"] == "1032") + assert row["값"] is None and "준용" in row and row["산정"]["값"] == Decimal("211645.83") + got = mf.run(mf.Master(files), "시험:준용", {}) + assert got["줄"][0]["출처"] == "산정: 원문 4-라 · 마지막 공표 2025.9.1" + guess = row.pop("산정") with pytest.raises(mf.FormulaError): mf.run(mf.Master(files), "시험:준용", {}) - row = next(r for r in files["인력_건설노임.json"]["줄"] if r["열쇠"] == "1032") - assert row["값"] is None and "준용" in row - row["준용"] = Decimal(1002) # M01 이 수로 적어도 열쇠로 읽음 + row["산정"] = guess + row["준용"] = Decimal(1002) # M01 이 수로 적어도 열쇠로 읽음 · 산정보다 앞 got = mf.run(mf.Master(files), "시험:준용", {}) assert got["줄"][0]["출처"] == "준용: 보통인부" assert got["노무비"] == 2 * Decimal(172068) @@ -636,6 +640,32 @@ def test_미공표_준용(): mf.run(mf.Master(files), "시험:준용", {}) alias["준용"] = "인력:건설노임:1002" assert mf.run(mf.Master(files), "시험:준용", {})["줄"][0]["출처"] == "준용: 보통인부" + lines[0]["요소"] = "인력:준용대상:갱부" # 원문 통합 목록의 옛 직종 — 새 직종 값 + got = mf.run(mf.Master(files), "시험:준용", {}) + assert got["줄"][0]["출처"] == "통합: 특별인부" + + +def test_노임_갈래_파일_원문_대조(): + """엔지니어링·측량·건설사업관리·SW·산림 노임 — 줄 수 · 이름 표본 · 준용대상에서 측량중급기술자 옮김.""" + files = cm.load() + count = { + b: len(files[f"인력_{b}.json"]["줄"]) + for b in ("엔지니어링노임", "측량노임", "건설사업관리노임", "SW노임", "산림노임") + } + assert count == { + "엔지니어링노임": 56, + "측량노임": 20, + "건설사업관리노임": 4, + "SW노임": 17, + "산림노임": 2, + } + whole = mf.Master(files) + assert whole.value("인력:엔지니어링노임:기술사(건설)")[0] == 467217 + assert whole.value("인력:측량노임:측량중급기술자")[0] == 251596 + assert whole.value("인력:건설사업관리노임:특급건설사업관리기술인")[0] == 399247 + assert whole.value("인력:SW노임:IT PM")[0] == 492039 + assert whole.value("인력:산림노임:나무의사")[0] == 326359 + assert "측량중급기술자" not in {r["열쇠"] for r in files["인력_준용대상.json"]["줄"]} def test_품셈재료_연결_낮은_값과_출처(whole):