fix(data): 4바퀴 기초값 — 각재 비율 지어낸 것 뺌 · 손료 칸 밀림 · 전문공사 300억 이상 · 제조 노임 상위업종

브레인 4바퀴. 원문을 열어 하나씩 확인한 뒤 고침. **값(숫자)은 원문 그대로, 자리·이름만 맞춤.**

**① 거푸집 「각재」 비율 여섯 — 지어낸 것이라 뺌**
  원문 12-4(F0336)는 **「합 판」 한 줄에 두 열**(재료별% · 노무비%)을 적고 「각 재」 줄엔 비율이 없음.
  각재 자리에 있던 값이 **합판 줄의 노무비 열과 한 자도 안 다름** — 다른 열을 갖다 쓴 것이었음.
  ⇒ `plywood` → `plywood_material_pct` · 노무비 열은 `plywood_labor_pct` 로 제자리 ·
    각재는 `timber_absent` 로 **비워 두고 사유**(옛 값도 함께 남김)

**② 기계 손료 5202·5203 칸 밀림** — 규격 열이 둘·셋인 표라 한 칸(5202)·두 칸(5203) 밀려
  상각비율 자리에 내용시간(800·4,000)이 들어가 있었음. 원문 건설 8장 L2617~2633 대로 여덟 줄 맞춤

**③ 전문공사 일반관리비 300억 이상** — 마지막 구간이 「100억-300억 미만」으로 닫혀 **300억 넘는
  전문공사가 어느 구간에도 안 걸렸음.** 원본 XLSX 대로 300~1000억 · 1000억 이상(둘 다 4.5%)을 더함.
  ⚠ 대조 시험의 구간 지도(`SPECIAL_PRICE`)에도 그 둘이 없어 원문 쪽에서도 안 잡히고 있었음 — 함께 채움

**④ 제조 노임 115~123 상위업종** — 「품질 관리 / 하위업종」인데 하위만 담아 반쪽이었음(아홉 줄).
  원문(중소기업중앙회 조사표)대로 채움. 노임 값은 안 건드림

**⑤ 덤프 토사 E0 는 0.60 이 맞음** — 원문 10-12-1 은 식에 `E0=0.75` 를 적지만 바로 아래 [주]⑤
  「굴착기의 작업능력 산정 비교」 표가 `E0 | 토사 | 0.60(불량)` 비고에 **「임 도」** 라고 못박음. 근거를 자료에 적음
**⑥ 이형철근** — 원문이 범위 「6~7」로 적은 것을 `alt_rate_range` 로 함께 실음(쓰는 값은 7 그대로)

⚠ 기계 이름 뭉개짐·손료표 md 변환 오류는 **코덱스가 md 를 고치는 중**이라 손대지 않음

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsGw1Dz9HmhuAxGisxmDPF
This commit is contained in:
2026-09-18 01:18:24 +09:00
co-authored by Claude Opus 5
parent 635fcbfc84
commit d466bf67cf
14 changed files with 15688 additions and 16047 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,172 +1,184 @@
{
"schema_version": "1.0",
"dataset_id": "formwork_reuse",
"effective_date": "2026-01-01",
"note": "거푸집 사용횟수 — **품셈 1-7-1 원문**이 구조물 종류별로 정해 둔 값이다. 관측값이 아니라 법이므로 실무값으로 갈음하지 않는다.",
"schema_version": "1.0",
"dataset_id": "formwork_reuse",
"effective_date": "2026-01-01",
"note": "거푸집 사용횟수 — **품셈 1-7-1 원문**이 구조물 종류별로 정해 둔 값이다. 관측값이 아니라 법이므로 실무값으로 갈음하지 않는다.",
"source": {
"doc": "산림사업 표준품셈 1-7-1 거푸집 사용",
"table_id": "F0040",
"quote": "2회 T형보, 난간, 특히 복잡한 구조의 교각, 교대, 수문관의 본체 등 복잡한 구조 / 3회 슬래브, 교대, 교각, 옹벽, 파라펫트, 날개벽 등 약간 복잡한 구조 / 4회 측구, 수로, 확대기초, 우물통 등 비교적 간단한 구조 / 6회 수문 또는 관의 기초, 호안 및 보호공의 기초 등 극히 간단한 구조"
},
"policy": {
"b08_delivers": "접촉 면적(㎡) + 사용횟수. **횟수별 재료 환산은 하지 않는다**.",
"b09_applies": "품셈 12-4 의 「사용횟수별 기준수량에 대한 비율(%)」은 일위대가 재료비에 걸린다. B08 이 여기서 곱하면 B09 와 겹쳐 두 번 준다.",
"unlisted_is_flagged": true
},
"reuse_by_class": [
{
"reuse_count": 2,
"class": "복잡한 구조",
"examples": [
"T형보",
"난간",
"복잡한 교각",
"교대",
"수문관 본체"
]
},
{
"reuse_count": 3,
"class": "약간 복잡한 구조",
"examples": [
"슬래브",
"교대",
"교각",
"옹벽",
"파라펫트",
"날개벽"
]
},
{
"reuse_count": 4,
"class": "비교적 간단한 구조",
"examples": [
"측구",
"수로",
"확대기초",
"우물통"
]
},
{
"reuse_count": 6,
"class": "극히 간단한 구조",
"examples": [
"수문 기초",
"관의 기초",
"호안 기초",
"보호공 기초"
]
}
],
"type_map": [
{
"type_id": "retaining_wall",
"reuse_count": 3,
"matched_example": "옹벽",
"note": "원문 3회 줄에 「옹벽」이 그대로 있음"
},
{
"type_id": "pipe_inlet_basin",
"reuse_count": 4,
"matched_example": "거푸집 합판4회",
"note": "그 공종 표가 직접 적은 「거푸집 | 합판4회」 가 정본 — 1-7-1 분류(「호안 및 보호공의 기초」 6회)보다 위(2026-09-14 브레인 ㉯ ②). 앞서 6회로 봤음.",
"basis": "품셈 12-15 집수정 표"
},
{
"type_id": "ford_pavement",
"reuse_count": null,
"note": "물넘이포장은 거푸집이 서지 않는 구조(면 포장) — 대상 아님"
},
{
"type_id": "box_culvert",
"reuse_count": 6,
"matched_example": "관의 기초",
"note": "BOX암거 합판은 **버림 옆면뿐**(본체는 유로폼 — 12-38 유형 「박스」 보통) — 원문 6회 줄 「관의 기초 등 극히 간단한 구조」 · 실무 울진 2×2 「합판6회」 와 같음(2026-09-15)"
}
],
"reuse_ratio_pct": {
"note": "품셈 12-4(표 F0336) 「사용횟수별 기준수량에 대한 비율(%)」. **B09 일위대가가 쓰는 값**이며 B08 은 참고로만 싣는다 — 여기서 곱하면 이중계상. ⚠ 원문은 **「합 판」 한 줄에 두 열**(재료별% · 노무비%)을 적고, 「각 재」 줄에는 비율이 없다.",
"table_id": "F0336",
"plywood_material_pct": {
"1": 100.0,
"2": 57.0,
"3": 46.1,
"4": 40.1,
"5": 37.1,
"6": 34.7
},
"plywood_labor_pct": {
"1": 100.0,
"2": 60.0,
"3": 47.1,
"4": 40.0,
"5": 34.2,
"6": 32.0
},
"timber_absent": {
"why": "⚠ **원문에 각재 비율이 없다.** 앞서 여기 있던 값은 실은 합판 줄의 **노무비(%)** 열을 각재 비율로 잘못 읽은 것이었다(2026-09-18 랩탑 메인 기초값 대조). 그 값은 `plywood_labor_pct` 로 제자리를 찾았고, 각재는 **비워 둔다** — 없는 것을 다른 열로 채우지 않는다.",
"was": {
"1": 100.0,
"2": 60.0,
"3": 47.1,
"4": 40.0,
"5": 34.2,
"6": 32.0
},
"md_row": "「각 재 | ㎥ | 0.038」 — 기준수량만 있고 비율 칸이 비어 있다"
}
},
"shoring": {
"note": "강관동바리(품셈 12-20)는 **슬래브를 떠받칠 때** 필요하다. 옹벽·집수정은 벽체 거푸집만이라 대상이 아니고, BOX암거는 전개식이 동바리 줄을 낸다(2026-09-15).",
"targets_pending": [
"ford_bridge"
],
"why": "세월교는 수량 근거가 없어 슬래브 면적 자체가 안 나온다 — 동바리도 함께 미확보"
},
"euroform_type": {
"note": "유로폼 설치·해체 유형(간단/보통/복잡) — **품셈 12-38-3 [주]④ 원문**이 시설 예시로 갈라 둔다. 거푸집 사용횟수(1-7-1)·철근 갈래(12-3 [주]①)와 같은 자리로, 사람이 고르는 값이 아니다.",
"source": {
"doc": "산림사업 표준품셈 1-7-1 거푸집 사용",
"table_id": "F0040",
"quote": "2회 T형보, 난간, 특히 복잡한 구조의 교각, 교대, 수문관의 본체 등 복잡한 구조 / 3회 슬래브, 교대, 교각, 옹벽, 파라펫트, 날개벽 등 약간 복잡한 구조 / 4회 측구, 수로, 확대기초, 우물통 등 비교적 간단한 구조 / 6회 수문 또는 관의 기초, 호안 및 보호공의 기초 등 극히 간단한 구조"
"doc": "산림사업 표준품셈 12-38-3 설치 및 해체 [주]④",
"table_id": "F0396",
"quote": "복잡 — 토목: 교대, 날개벽 등 복잡하고 보강이 많은 구조 / 보통 — 측구, 수로, 옹벽, 일반적인 벽체, 박스 등 / 간단 — 수문 또는 관의 기초, 건축 매트기초 등 간단한 구조"
},
"policy": {
"b08_delivers": "접촉 면적(㎡) + 사용횟수. **횟수별 재료 환산은 하지 않는다**.",
"b09_applies": "품셈 12-4 의 「사용횟수별 기준수량에 대한 비율(%)」은 일위대가 재료비에 걸린다. B08 이 여기서 곱하면 B09 와 겹쳐 두 번 준다.",
"unlisted_is_flagged": true
},
"reuse_by_class": [
{
"reuse_count": 2,
"class": "복잡한 구조",
"examples": [
"T형보",
"난간",
"복잡한 교각",
"교대",
"수문관 본체"
]
},
{
"reuse_count": 3,
"class": "약간 복잡한 구조",
"examples": [
"슬래브",
"교대",
"교각",
"옹벽",
"파라펫트",
"날개벽"
]
},
{
"reuse_count": 4,
"class": "비교적 간단한 구조",
"examples": [
"측구",
"수로",
"확대기초",
"우물통"
]
},
{
"reuse_count": 6,
"class": "극히 간단한 구조",
"examples": [
"수문 기초",
"관의 기초",
"호안 기초",
"보호공 기초"
]
}
"classes": [
{
"key": "복잡",
"examples": [
"교대",
"날개벽"
],
"daily_area_m2": 25
},
{
"key": "보통",
"examples": [
"측구",
"수로",
"옹벽",
"일반적인 벽체",
"박스"
],
"daily_area_m2": 35
},
{
"key": "간단",
"examples": [
"수문 기초",
"관의 기초",
"매트기초"
],
"daily_area_m2": 40
}
],
"type_map": [
{
"type_id": "retaining_wall",
"reuse_count": 3,
"matched_example": "옹벽",
"note": "원문 3회 줄에 「옹벽」이 그대로 있음"
},
{
"type_id": "pipe_inlet_basin",
"reuse_count": 4,
"matched_example": "거푸집 합판4회",
"note": "그 공종 표가 직접 적은 「거푸집 | 합판4회」 가 정본 — 1-7-1 분류(「호안 및 보호공의 기초」 6회)보다 위(2026-09-14 브레인 ㉯ ②). 앞서 6회로 봤음.",
"basis": "품셈 12-15 집수정 표"
},
{
"type_id": "ford_pavement",
"reuse_count": null,
"note": "물넘이포장은 거푸집이 서지 않는 구조(면 포장) — 대상 아님"
},
{
"type_id": "box_culvert",
"reuse_count": 6,
"matched_example": "관의 기초",
"note": "BOX암거 합판은 **버림 옆면뿐**(본체는 유로폼 — 12-38 유형 「박스」 보통) — 원문 6회 줄 「관의 기초 등 극히 간단한 구조」 · 실무 울진 2×2 「합판6회」 와 같음(2026-09-15)"
}
{
"type_id": "retaining_wall",
"class": "보통",
"matched": "옹벽"
},
{
"type_id": "box_culvert",
"class": "보통",
"matched": "박스"
},
{
"type_id": "pipe_inlet_basin",
"class": "간단",
"matched": "관의 기초",
"note": "⚠ 집수정 벽체까지 간단으로 볼지는 확인 필요 — 거푸집 사용횟수와 같은 물음"
}
],
"reuse_ratio_pct": {
"note": "품셈 12-4 「사용횟수별 기준수량에 대한 비율(%)」. **B09 일위대가가 쓰는 값**이며 B08 은 참고로만 싣는다 — 여기서 곱하면 이중계상.",
"table_id": "F0336",
"plywood": {
"1": 100.0,
"2": 57.0,
"3": 46.1,
"4": 40.1,
"5": 37.1,
"6": 34.7
},
"timber": {
"1": 100.0,
"2": 60.0,
"3": 47.1,
"4": 40.0,
"5": 34.2,
"6": 32.0
}
},
"shoring": {
"note": "강관동바리(품셈 12-20)는 **슬래브를 떠받칠 때** 필요하다. 옹벽·집수정은 벽체 거푸집만이라 대상이 아니고, BOX암거는 전개식이 동바리 줄을 낸다(2026-09-15).",
"targets_pending": [
"ford_bridge"
],
"why": "세월교는 수량 근거가 없어 슬래브 면적 자체가 안 나온다 — 동바리도 함께 미확보"
},
"euroform_type": {
"note": "유로폼 설치·해체 유형(간단/보통/복잡) — **품셈 12-38-3 [주]④ 원문**이 시설 예시로 갈라 둔다. 거푸집 사용횟수(1-7-1)·철근 갈래(12-3 [주]①)와 같은 자리로, 사람이 고르는 값이 아니다.",
"source": {
"doc": "산림사업 표준품셈 12-38-3 설치 및 해체 [주]④",
"table_id": "F0396",
"quote": "복잡 — 토목: 교대, 날개벽 등 복잡하고 보강이 많은 구조 / 보통 — 측구, 수로, 옹벽, 일반적인 벽체, 박스 등 / 간단 — 수문 또는 관의 기초, 건축 매트기초 등 간단한 구조"
},
"classes": [
{
"key": "복잡",
"examples": [
"교대",
"날개벽"
],
"daily_area_m2": 25
},
{
"key": "보통",
"examples": [
"측구",
"수로",
"옹벽",
"일반적인 벽체",
"박스"
],
"daily_area_m2": 35
},
{
"key": "간단",
"examples": [
"수문 기초",
"관의 기초",
"매트기초"
],
"daily_area_m2": 40
}
],
"type_map": [
{
"type_id": "retaining_wall",
"class": "보통",
"matched": "옹벽"
},
{
"type_id": "box_culvert",
"class": "보통",
"matched": "박스"
},
{
"type_id": "pipe_inlet_basin",
"class": "간단",
"matched": "관의 기초",
"note": "⚠ 집수정 벽체까지 간단으로 볼지는 확인 필요 — 거푸집 사용횟수와 같은 물음"
}
],
"reuse_note": "⚠ 12-38-1 「사용횟수」는 **1-7-1 과 다른 자리다.** 1-7-1 은 합판거푸집처럼 **소모성 거푸집을 몇 번 쓰나**(옹벽 3회)이고, 12-38-1 은 유로폼(강재)의 **잔존율 기준**(12회 사용 잔존율 25 % · 25회 사용 잔존율 10 %)으로 **임대료·손료 산정용**이다. 하나로 잇지 않는다.",
"material_unit_note": "유로폼 자재는 12-38-2 가 **10㎡당 패널 0.89매**로 낸다. B08 은 **접촉 면적(㎡)** 으로 보내고 매수 환산은 그 표의 밑수(10㎡)를 아는 B09 가 한다 — B08 이 환산하면 밑수를 두 벌로 들게 된다."
}
"reuse_note": "⚠ 12-38-1 「사용횟수」는 **1-7-1 과 다른 자리다.** 1-7-1 은 합판거푸집처럼 **소모성 거푸집을 몇 번 쓰나**(옹벽 3회)이고, 12-38-1 은 유로폼(강재)의 **잔존율 기준**(12회 사용 잔존율 25 % · 25회 사용 잔존율 10 %)으로 **임대료·손료 산정용**이다. 하나로 잇지 않는다.",
"material_unit_note": "유로폼 자재는 12-38-2 가 **10㎡당 패널 0.89매**로 낸다. B08 은 **접촉 면적(㎡)** 으로 보내고 매수 환산은 그 표의 밑수(10㎡)를 아는 B09 가 한다 — B08 이 환산하면 밑수를 두 벌로 들게 된다."
}
}
@@ -1,386 +1,387 @@
{
"schema_version": "1.0",
"dataset_id": "machine_productivity",
"effective_date": "2026-01-01",
"note": "기계 작업량 밑값 — 코드에 박혀 있던 값을 그대로 옮긴 벌(2026-09-16 사용자 원칙 「마스터 = 관리자가 제어할 값 · 코드 안에 있으면 안 됨」). 값은 한 칸도 안 바꿨다 — 옮기기 전후 금액이 같다.",
"policy": {
"no_value_changed": "코드에 있던 값을 그대로 옮겼다. 원문과의 대조는 시험이 지킨다.",
"formula_stays_in_code": "식(Q = n·q·f·E 따위)은 값이 아니라 로직이라 코드에 둔다 — 계수만 여기 있다.",
"source_tables_mashed": "삽날 용량표는 원문 옮기기에서 절 이름이 뭉개져(`5-3.2-5.5-타 이 어…`) 표로 안 들어왔다. 값은 원문 본문 것이고, 원문 표가 제 모양으로 들어오면 그때 대조한다."
"schema_version": "1.0",
"dataset_id": "machine_productivity",
"effective_date": "2026-01-01",
"note": "기계 작업량 밑값 — 코드에 박혀 있던 값을 그대로 옮긴 벌(2026-09-16 사용자 원칙 「마스터 = 관리자가 제어할 값 · 코드 안에 있으면 안 됨」). 값은 한 칸도 안 바꿨다 — 옮기기 전후 금액이 같다.",
"policy": {
"no_value_changed": "코드에 있던 값을 그대로 옮겼다. 원문과의 대조는 시험이 지킨다.",
"formula_stays_in_code": "식(Q = n·q·f·E 따위)은 값이 아니라 로직이라 코드에 둔다 — 계수만 여기 있다.",
"source_tables_mashed": "삽날 용량표는 원문 옮기기에서 절 이름이 뭉개져(`5-3.2-5.5-타 이 어…`) 표로 안 들어왔다. 값은 원문 본문 것이고, 원문 표가 제 모양으로 들어오면 그때 대조한다."
},
"sources": [
{
"doc": "건설공사 표준품셈 8-2-1 불도저 2.가·나 전진·후진 속도",
"tables": [
"C0426",
"C0427"
],
"role": "primary"
},
"sources": [
{
"doc": "건설공사 표준품셈 8-2-1 불도저 2.가·나 전진·후진 속도",
"tables": [
"C0426",
"C0427"
],
"role": "primary"
},
{
"doc": "건설공사 표준품셈 8-2-1 1.가 삽날 용량 q˚",
"tables": [],
"role": "primary",
"note": "원문 표가 뭉개져 카탈로그에 표로 없음"
},
{
"doc": "산림사업 표준품셈(고시 제2025-82호) 10-12 「1. 적재」·「2. 운반」 식 서식",
"tables": [],
"role": "primary",
"note": "원문이 표가 아니라 채워 넣는 식이라 공종 마스터에 안 실림"
}
],
"variables": {
"dozer_speed": {
"unit": "m/분",
"key": "track+tonnage_ton+gear",
"note": "후진이 「-」인 단은 원문에 값이 없어 담지 않는다(없는 속도로 싸이클이 서면 값이 조용히 틀림).",
"records": [
{
"track": "무한궤도",
"tonnage_ton": "4",
"gear": 1,
"forward_m_per_min": "40",
"reverse_m_per_min": "63"
},
{
"track": "무한궤도",
"tonnage_ton": "4",
"gear": 2,
"forward_m_per_min": "57",
"reverse_m_per_min": "85"
},
{
"track": "무한궤도",
"tonnage_ton": "7",
"gear": 1,
"forward_m_per_min": "43",
"reverse_m_per_min": "53"
},
{
"track": "무한궤도",
"tonnage_ton": "7",
"gear": 2,
"forward_m_per_min": "67",
"reverse_m_per_min": "78"
},
{
"track": "무한궤도",
"tonnage_ton": "7",
"gear": 3,
"forward_m_per_min": "92",
"reverse_m_per_min": "107"
},
{
"track": "무한궤도",
"tonnage_ton": "10",
"gear": 1,
"forward_m_per_min": "42",
"reverse_m_per_min": "50"
},
{
"track": "무한궤도",
"tonnage_ton": "10",
"gear": 2,
"forward_m_per_min": "64",
"reverse_m_per_min": "75"
},
{
"track": "무한궤도",
"tonnage_ton": "10",
"gear": 3,
"forward_m_per_min": "88",
"reverse_m_per_min": "105"
},
{
"track": "무한궤도",
"tonnage_ton": "12",
"gear": 1,
"forward_m_per_min": "40",
"reverse_m_per_min": "48"
},
{
"track": "무한궤도",
"tonnage_ton": "12",
"gear": 2,
"forward_m_per_min": "55",
"reverse_m_per_min": "70"
},
{
"track": "무한궤도",
"tonnage_ton": "12",
"gear": 3,
"forward_m_per_min": "75",
"reverse_m_per_min": "100"
},
{
"track": "무한궤도",
"tonnage_ton": "13",
"gear": 1,
"forward_m_per_min": "40",
"reverse_m_per_min": "48"
},
{
"track": "무한궤도",
"tonnage_ton": "13",
"gear": 2,
"forward_m_per_min": "55",
"reverse_m_per_min": "70"
},
{
"track": "무한궤도",
"tonnage_ton": "19",
"gear": 1,
"forward_m_per_min": "40",
"reverse_m_per_min": "46"
},
{
"track": "무한궤도",
"tonnage_ton": "19",
"gear": 2,
"forward_m_per_min": "55",
"reverse_m_per_min": "70"
},
{
"track": "무한궤도",
"tonnage_ton": "19",
"gear": 3,
"forward_m_per_min": "75",
"reverse_m_per_min": "98"
},
{
"track": "무한궤도",
"tonnage_ton": "32",
"gear": 1,
"forward_m_per_min": "40",
"reverse_m_per_min": "43"
},
{
"track": "무한궤도",
"tonnage_ton": "32",
"gear": 2,
"forward_m_per_min": "52",
"reverse_m_per_min": "58"
},
{
"track": "무한궤도",
"tonnage_ton": "32",
"gear": 3,
"forward_m_per_min": "70",
"reverse_m_per_min": "78"
},
{
"track": "타이어",
"tonnage_ton": "15",
"gear": 1,
"forward_m_per_min": "83",
"reverse_m_per_min": "92"
},
{
"track": "타이어",
"tonnage_ton": "15",
"gear": 2,
"forward_m_per_min": "200",
"reverse_m_per_min": "125"
},
{
"track": "타이어",
"tonnage_ton": "28",
"gear": 1,
"forward_m_per_min": "92",
"reverse_m_per_min": "92"
},
{
"track": "타이어",
"tonnage_ton": "28",
"gear": 2,
"forward_m_per_min": "200",
"reverse_m_per_min": "200"
},
{
"track": "타이어",
"tonnage_ton": "33",
"gear": 1,
"forward_m_per_min": "92",
"reverse_m_per_min": "110"
},
{
"track": "타이어",
"tonnage_ton": "33",
"gear": 2,
"forward_m_per_min": "210",
"reverse_m_per_min": "250"
}
]
},
"dozer_blade": {
"unit": "㎥",
"key": "track+tonnage_ton",
"note": "무한궤도 10·13 톤이 둘 다 1.5 ㎥ 라 용량만으로는 못 가른다 — 속도로 마저 가른다.",
"records": [
{
"track": "무한궤도",
"tonnage_ton": "4",
"blade_m3": "0.5"
},
{
"track": "무한궤도",
"tonnage_ton": "7",
"blade_m3": "1.1"
},
{
"track": "무한궤도",
"tonnage_ton": "10",
"blade_m3": "1.5"
},
{
"track": "무한궤도",
"tonnage_ton": "12",
"blade_m3": "2.0"
},
{
"track": "무한궤도",
"tonnage_ton": "13",
"blade_m3": "1.5"
},
{
"track": "무한궤도",
"tonnage_ton": "19",
"blade_m3": "3.2"
},
{
"track": "무한궤도",
"tonnage_ton": "32",
"blade_m3": "5.5"
},
{
"track": "타이어",
"tonnage_ton": "15",
"blade_m3": "3.1"
},
{
"track": "타이어",
"tonnage_ton": "28",
"blade_m3": "4.0"
},
{
"track": "타이어",
"tonnage_ton": "33",
"blade_m3": "5.7"
}
]
},
"dump_haul": {
"key": "key",
"note": "덤프 운반·적재 식이 쓰는 밑값. 장비 규격이 바뀌면 여기를 고친다.",
"records": [
{
"key": "truck_ton",
"value": "15",
"unit": "ton",
"meaning": "덤프트럭 적재 규격 T"
},
{
"key": "bucket_m3",
"value": "0.7",
"unit": "㎥",
"meaning": "적재기계 버켓 용량 q"
},
{
"key": "loader_cycle_sec",
"value": "20",
"unit": "초",
"meaning": "적재 대기 싸이클 ㎝s"
},
{
"key": "speed_loaded_kmh",
"value": "5",
"unit": "㎞/hr",
"meaning": "적재 주행속도 V1"
},
{
"key": "speed_empty_kmh",
"value": "6",
"unit": "㎞/hr",
"meaning": "공차 주행속도 V2"
},
{
"key": "unload_min",
"value": "1.1",
"unit": "분",
"meaning": "적하 시간 t3"
},
{
"key": "wait_min",
"value": "0.9",
"unit": "분",
"meaning": "대기 시간 t4"
},
{
"key": "cover_min",
"value": "0.5",
"unit": "분",
"meaning": "덮개 시간 t5"
},
{
"key": "loading_cycle_sec",
"value": "22",
"unit": "초",
"meaning": "적재 식 싸이클 ㎝(180°)"
}
]
},
"dump_material": {
"key": "work_item_code",
"note": "10-12 절 재료별 값 — 고른 값·버린 값 사유를 줄에 함께 둔다. 적재 사유는 `loading_note` 로 따로 둔다(운반 줄 사유와 섞지 않음).",
"records": [
{
"work_item_code": "FP-10-12-01",
"label": "토사",
"unit_weight_ton_per_m3": "1.9",
"loose_factor": "1.3",
"bucket_factor": "0.9",
"loader_efficiency": "0.85",
"truck_efficiency": "0.9",
"loading_efficiency": "0.60",
"notes": [
"n 의 Qt = 계산값 T/γt×L(원문 표기 「10/(0.7×K)」의 10 은 토사 어림수 복사로 봄 — 버림)",
"Es = 운반 줄 값(적재 식의 E0 와 다른 기호)"
],
"loading_note": "E0 = 0.60(표 「임도」·10-12-3 [주]③) — 본문 표기 0.75 버림"
},
{
"work_item_code": "FP-10-12-02",
"label": "암절취",
"unit_weight_ton_per_m3": "2.4",
"loose_factor": "1.35",
"bucket_factor": "0.55",
"loader_efficiency": "0.35",
"truck_efficiency": "0.9",
"loading_efficiency": "0.35",
"notes": [
"n 의 Qt = 계산값 T/γt×L(원문 표기 「10/(0.7×K)」의 10 은 토사 어림수 복사로 봄 — 버림) · 원문 10 이면 n 1.18배",
"Es = 운반 줄 값(적재 식의 E0 와 다른 기호)"
],
"loading_note": "E0 = 0.35(본문·표 「파쇄암」 같음)"
},
{
"work_item_code": "FP-10-12-03",
"label": "발파암",
"unit_weight_ton_per_m3": "2.4",
"loose_factor": "1.625",
"bucket_factor": "0.55",
"loader_efficiency": "0.35",
"truck_efficiency": "0.9",
"loading_efficiency": "0.35",
"notes": [
"n 의 Qt = 계산값 T/γt×L(원문 표기 「10/(0.7×K)」의 10 은 토사 어림수 복사로 봄 — 버림)",
"Es = 운반 줄 값(적재 식의 E0 와 다른 기호)",
"E 원문 누락 — 0.9 적용(같은 절 토사·암절취 · 덤프 작업효율)"
],
"loading_note": "E0 = 0.35(10-12-3 [주]③ 「파쇄암 0.35」)"
}
]
}
{
"doc": "건설공사 표준품셈 8-2-1 1.가 삽날 용량 q˚",
"tables": [],
"role": "primary",
"note": "원문 표가 뭉개져 카탈로그에 표로 없음"
},
{
"doc": "산림사업 표준품셈(고시 제2025-82호) 10-12 「1. 적재」·「2. 운반」 식 서식",
"tables": [],
"role": "primary",
"note": "원문이 표가 아니라 채워 넣는 식이라 공종 마스터에 안 실림"
}
],
"variables": {
"dozer_speed": {
"unit": "m/분",
"key": "track+tonnage_ton+gear",
"note": "후진이 「-」인 단은 원문에 값이 없어 담지 않는다(없는 속도로 싸이클이 서면 값이 조용히 틀림).",
"records": [
{
"track": "무한궤도",
"tonnage_ton": "4",
"gear": 1,
"forward_m_per_min": "40",
"reverse_m_per_min": "63"
},
{
"track": "무한궤도",
"tonnage_ton": "4",
"gear": 2,
"forward_m_per_min": "57",
"reverse_m_per_min": "85"
},
{
"track": "무한궤도",
"tonnage_ton": "7",
"gear": 1,
"forward_m_per_min": "43",
"reverse_m_per_min": "53"
},
{
"track": "무한궤도",
"tonnage_ton": "7",
"gear": 2,
"forward_m_per_min": "67",
"reverse_m_per_min": "78"
},
{
"track": "무한궤도",
"tonnage_ton": "7",
"gear": 3,
"forward_m_per_min": "92",
"reverse_m_per_min": "107"
},
{
"track": "무한궤도",
"tonnage_ton": "10",
"gear": 1,
"forward_m_per_min": "42",
"reverse_m_per_min": "50"
},
{
"track": "무한궤도",
"tonnage_ton": "10",
"gear": 2,
"forward_m_per_min": "64",
"reverse_m_per_min": "75"
},
{
"track": "무한궤도",
"tonnage_ton": "10",
"gear": 3,
"forward_m_per_min": "88",
"reverse_m_per_min": "105"
},
{
"track": "무한궤도",
"tonnage_ton": "12",
"gear": 1,
"forward_m_per_min": "40",
"reverse_m_per_min": "48"
},
{
"track": "무한궤도",
"tonnage_ton": "12",
"gear": 2,
"forward_m_per_min": "55",
"reverse_m_per_min": "70"
},
{
"track": "무한궤도",
"tonnage_ton": "12",
"gear": 3,
"forward_m_per_min": "75",
"reverse_m_per_min": "100"
},
{
"track": "무한궤도",
"tonnage_ton": "13",
"gear": 1,
"forward_m_per_min": "40",
"reverse_m_per_min": "48"
},
{
"track": "무한궤도",
"tonnage_ton": "13",
"gear": 2,
"forward_m_per_min": "55",
"reverse_m_per_min": "70"
},
{
"track": "무한궤도",
"tonnage_ton": "19",
"gear": 1,
"forward_m_per_min": "40",
"reverse_m_per_min": "46"
},
{
"track": "무한궤도",
"tonnage_ton": "19",
"gear": 2,
"forward_m_per_min": "55",
"reverse_m_per_min": "70"
},
{
"track": "무한궤도",
"tonnage_ton": "19",
"gear": 3,
"forward_m_per_min": "75",
"reverse_m_per_min": "98"
},
{
"track": "무한궤도",
"tonnage_ton": "32",
"gear": 1,
"forward_m_per_min": "40",
"reverse_m_per_min": "43"
},
{
"track": "무한궤도",
"tonnage_ton": "32",
"gear": 2,
"forward_m_per_min": "52",
"reverse_m_per_min": "58"
},
{
"track": "무한궤도",
"tonnage_ton": "32",
"gear": 3,
"forward_m_per_min": "70",
"reverse_m_per_min": "78"
},
{
"track": "타이어",
"tonnage_ton": "15",
"gear": 1,
"forward_m_per_min": "83",
"reverse_m_per_min": "92"
},
{
"track": "타이어",
"tonnage_ton": "15",
"gear": 2,
"forward_m_per_min": "200",
"reverse_m_per_min": "125"
},
{
"track": "타이어",
"tonnage_ton": "28",
"gear": 1,
"forward_m_per_min": "92",
"reverse_m_per_min": "92"
},
{
"track": "타이어",
"tonnage_ton": "28",
"gear": 2,
"forward_m_per_min": "200",
"reverse_m_per_min": "200"
},
{
"track": "타이어",
"tonnage_ton": "33",
"gear": 1,
"forward_m_per_min": "92",
"reverse_m_per_min": "110"
},
{
"track": "타이어",
"tonnage_ton": "33",
"gear": 2,
"forward_m_per_min": "210",
"reverse_m_per_min": "250"
}
]
},
"dozer_blade": {
"unit": "㎥",
"key": "track+tonnage_ton",
"note": "무한궤도 10·13 톤이 둘 다 1.5 ㎥ 라 용량만으로는 못 가른다 — 속도로 마저 가른다.",
"records": [
{
"track": "무한궤도",
"tonnage_ton": "4",
"blade_m3": "0.5"
},
{
"track": "무한궤도",
"tonnage_ton": "7",
"blade_m3": "1.1"
},
{
"track": "무한궤도",
"tonnage_ton": "10",
"blade_m3": "1.5"
},
{
"track": "무한궤도",
"tonnage_ton": "12",
"blade_m3": "2.0"
},
{
"track": "무한궤도",
"tonnage_ton": "13",
"blade_m3": "1.5"
},
{
"track": "무한궤도",
"tonnage_ton": "19",
"blade_m3": "3.2"
},
{
"track": "무한궤도",
"tonnage_ton": "32",
"blade_m3": "5.5"
},
{
"track": "타이어",
"tonnage_ton": "15",
"blade_m3": "3.1"
},
{
"track": "타이어",
"tonnage_ton": "28",
"blade_m3": "4.0"
},
{
"track": "타이어",
"tonnage_ton": "33",
"blade_m3": "5.7"
}
]
},
"dump_haul": {
"key": "key",
"note": "덤프 운반·적재 식이 쓰는 밑값. 장비 규격이 바뀌면 여기를 고친다.",
"records": [
{
"key": "truck_ton",
"value": "15",
"unit": "ton",
"meaning": "덤프트럭 적재 규격 T"
},
{
"key": "bucket_m3",
"value": "0.7",
"unit": "㎥",
"meaning": "적재기계 버켓 용량 q"
},
{
"key": "loader_cycle_sec",
"value": "20",
"unit": "초",
"meaning": "적재 대기 싸이클 ㎝s"
},
{
"key": "speed_loaded_kmh",
"value": "5",
"unit": "㎞/hr",
"meaning": "적재 주행속도 V1"
},
{
"key": "speed_empty_kmh",
"value": "6",
"unit": "㎞/hr",
"meaning": "공차 주행속도 V2"
},
{
"key": "unload_min",
"value": "1.1",
"unit": "분",
"meaning": "적하 시간 t3"
},
{
"key": "wait_min",
"value": "0.9",
"unit": "분",
"meaning": "대기 시간 t4"
},
{
"key": "cover_min",
"value": "0.5",
"unit": "분",
"meaning": "덮개 시간 t5"
},
{
"key": "loading_cycle_sec",
"value": "22",
"unit": "초",
"meaning": "적재 식 싸이클 ㎝(180°)"
}
]
},
"dump_material": {
"key": "work_item_code",
"note": "10-12 절 재료별 값 — 고른 값·버린 값 사유를 줄에 함께 둔다. 적재 사유는 `loading_note` 로 따로 둔다(운반 줄 사유와 섞지 않음).",
"records": [
{
"work_item_code": "FP-10-12-01",
"label": "토사",
"unit_weight_ton_per_m3": "1.9",
"loose_factor": "1.3",
"bucket_factor": "0.9",
"loader_efficiency": "0.85",
"truck_efficiency": "0.9",
"loading_efficiency": "0.60",
"notes": [
"n 의 Qt = 계산값 T/γt×L(원문 표기 「10/(0.7×K)」의 10 은 토사 어림수 복사로 봄 — 버림)",
"Es = 운반 줄 값(적재 식의 E0 와 다른 기호)"
],
"loading_note": "E0 = 0.60(표 「임도」·10-12-3 [주]③) — 본문 표기 0.75 버림",
"loading_efficiency_basis": "원문 10-12-1 은 식에 `E0=0.75` 를 적지만, 바로 아래 [주]⑤ 「굴착기의 작업능력 산정 비교」 표가 `E0 | 토사 | 0.60(불량)` 의 비고에 **「임 도」** 라고 못박는다 — 임도는 0.60 이 맞다(2026-09-18 원문 L5927·L5938 대조)."
},
{
"work_item_code": "FP-10-12-02",
"label": "암절취",
"unit_weight_ton_per_m3": "2.4",
"loose_factor": "1.35",
"bucket_factor": "0.55",
"loader_efficiency": "0.35",
"truck_efficiency": "0.9",
"loading_efficiency": "0.35",
"notes": [
"n 의 Qt = 계산값 T/γt×L(원문 표기 「10/(0.7×K)」의 10 은 토사 어림수 복사로 봄 — 버림) · 원문 10 이면 n 1.18배",
"Es = 운반 줄 값(적재 식의 E0 와 다른 기호)"
],
"loading_note": "E0 = 0.35(본문·표 「파쇄암」 같음)"
},
{
"work_item_code": "FP-10-12-03",
"label": "발파암",
"unit_weight_ton_per_m3": "2.4",
"loose_factor": "1.625",
"bucket_factor": "0.55",
"loader_efficiency": "0.35",
"truck_efficiency": "0.9",
"loading_efficiency": "0.35",
"notes": [
"n 의 Qt = 계산값 T/γt×L(원문 표기 「10/(0.7×K)」의 10 은 토사 어림수 복사로 봄 — 버림)",
"Es = 운반 줄 값(적재 식의 E0 와 다른 기호)",
"E 원문 누락 — 0.9 적용(같은 절 토사·암절취 · 덤프 작업효율)"
],
"loading_note": "E0 = 0.35(10-12-3 [주]③ 「파쇄암 0.35」)"
}
]
}
}
}
@@ -6004,7 +6004,7 @@
"name_ko": "일반관리비율 — 전문·전기·통신·소방·기타",
"summary": "추정가격 구간마다.",
"shape": "list",
"rows": 4,
"rows": 6,
"columns": [
{
"key": "estimated_price_bracket",
@@ -1,171 +1,181 @@
{
"schema_version": "1.0",
"dataset_id": "material_surcharge",
"original_tables": "resources/data_cost_input_value/coef_2026.json → variables/surcharge_mat — 원문 표가 실린 자리. ⚠ 값이 겹치지만 이원화가 아니다: 저쪽은 원문 보관이고 읽어 쓰는 정본은 여기(rates_pct)다.",
"effective_date": "2026-01-01",
"source": {
"primary": {
"doc": "산림사업 표준품셈 제1장 1-3-1 재료의 할증",
"via": "resources/knowledge/technical_info/01_임도/04_수량분석정보/수량산출_일반.md"
},
"supplementary": {
"doc": "건설공사 표준품셈 1-3-1 재료의 할증('23년 보완)",
"via": "resources/knowledge/original/원가계산/건설공사_표준품셈/01_공통부문/제1장_적용기준.md",
"note": "산림품셈에 없는 자재만 보완용으로 본다(PLAN 8-5). 실린 값은 출처를 pumsem 필드로 구분."
}
"schema_version": "1.0",
"dataset_id": "material_surcharge",
"original_tables": "resources/data_cost_input_value/coef_2026.json → variables/surcharge_mat — 원문 표가 실린 자리. ⚠ 값이 겹치지만 이원화가 아니다: 저쪽은 원문 보관이고 읽어 쓰는 정본은 여기(rates_pct)다.",
"effective_date": "2026-01-01",
"source": {
"primary": {
"doc": "산림사업 표준품셈 제1장 1-3-1 재료의 할증",
"via": "resources/knowledge/technical_info/01_임도/04_수량분석정보/수량산출_일반.md"
},
"policy": {
"no_invented_values": true,
"unknown_material_is_flagged": true
},
"rates_pct": [
{
"material": "시멘트",
"rate": 2,
"condition": "정치식",
"alt_rate": 3,
"alt_condition": "기타",
"pumsem": "forest"
},
{
"material": "잔골재",
"rate": 10,
"alt_rate": 12,
"alt_condition": "기타",
"pumsem": "forest"
},
{
"material": "채움재",
"rate": 10,
"alt_rate": 12,
"alt_condition": "기타",
"pumsem": "forest"
},
{
"material": "굵은골재",
"rate": 3,
"alt_rate": 5,
"alt_condition": "기타",
"pumsem": "forest"
},
{
"material": "모래",
"rate": 6,
"condition": "노반재료",
"pumsem": "forest"
},
{
"material": "부순돌",
"rate": 4,
"condition": "노반재료",
"pumsem": "forest"
},
{
"material": "자갈",
"rate": 4,
"condition": "노반재료",
"pumsem": "forest"
},
{
"material": "점질토",
"rate": 6,
"condition": "노반재료",
"pumsem": "forest"
},
{
"material": "이형철근",
"rate": 3,
"alt_rate": 7,
"alt_condition": "복잡 구조물 주철근",
"pumsem": "forest"
},
{
"material": "원형철근",
"rate": 5,
"pumsem": "forest"
},
{
"material": "강판",
"rate": 10,
"pumsem": "forest"
},
{
"material": "각재",
"rate": 5,
"pumsem": "forest"
},
{
"material": "판재",
"rate": 10,
"pumsem": "forest"
},
{
"material": "레미콘",
"rate": 2,
"condition": "무근",
"alt_rate": 1,
"alt_condition": "철근",
"pumsem": "forest"
},
{
"material": "흄관",
"rate": 3,
"pumsem": "forest"
},
{
"material": "떼",
"rate": 10,
"pumsem": "forest"
},
{
"material": "초화류",
"rate": 10,
"pumsem": "forest"
},
{
"material": "사방용 수목",
"rate": 10,
"pumsem": "forest"
},
{
"material": "원석",
"rate": 30,
"condition": "마름돌용",
"pumsem": "forest"
}
],
"observed_practice": {
"note": "울진 총괄집계 관측 — 참고이지 기본값이 아니다(PLAN 8-10 ★ 법대로).",
"values": {
"모래": 10,
"자갈": 3,
"혼합석": 2,
"시멘트": 2,
"떼": 10
}
},
"candidates_pending_user": {
"note": "건설품셈에서 이름은 찾았으나 **적용 조건이 우리 쓰임과 다른** 것. 지식DB는 근거·후보 가이드이지 값을 확정하는 곳이 아니므로(CLAUDE.md 3장) 엔진은 이 값을 쓰지 않고 「할증률 미확보」로 둔다. 사용자 확정 후 rates_pct 로 옮길 것.",
"items": [
{
"material": "막자갈",
"rate": 4,
"pumsem": "forest",
"listed_in": "산림청고시 제2025-82호 1-3-1 3호 「부순돌ㆍ자갈ㆍ막자갈 4」(건설품셈도 같은 조건)",
"listed_condition": "노상 및 노반재료(선택층·보조기층·기층)",
"our_usage": "돌쌓기 뒤채움",
"why_not_applied": "조문이 쓰임을 노반재료로 못박아 뒤채움에 그 상한을 끌어올 근거가 없음(2026-09-14 브레인 판정 보류 유지 · 사방기술교본도 할증률 없음)"
}
]
},
"not_found": {
"note": "산림·건설 두 품셈의 재료 할증률표를 다 뒤졌으나 **이름이 없는** 자재. 석재 계열은 건설품셈도 해상 사석(기초·피복·뒤채움)과 원석(마름돌용)만 다룬다.",
"materials": ["야면석", "고임돌", "물구멍관", "못"],
"checked": [
"산림품셈 1-3-1 전 19종",
"못 — 산림청고시 제2025-82호 1-3-1 6호 기타재료에 없음(2026-09-14 브레인 확인)",
"건설품셈 1-3-1 1~7호(콘크리트·노반·관기초·토사(해상)·사석(해상)·속채움(해상)·강재류)",
"건설품셈 제7장 돌공사 — 재료 할증률표 없음"
]
"supplementary": {
"doc": "건설공사 표준품셈 1-3-1 재료의 할증('23년 보완)",
"via": "resources/knowledge/original/원가계산/건설공사_표준품셈/01_공통부문/제1장_적용기준.md",
"note": "산림품셈에 없는 자재만 보완용으로 본다(PLAN 8-5). 실린 값은 출처를 pumsem 필드로 구분."
}
},
"policy": {
"no_invented_values": true,
"unknown_material_is_flagged": true
},
"rates_pct": [
{
"material": "시멘트",
"rate": 2,
"condition": "정치식",
"alt_rate": 3,
"alt_condition": "기타",
"pumsem": "forest"
},
{
"material": "잔골재",
"rate": 10,
"alt_rate": 12,
"alt_condition": "기타",
"pumsem": "forest"
},
{
"material": "채움재",
"rate": 10,
"alt_rate": 12,
"alt_condition": "기타",
"pumsem": "forest"
},
{
"material": "굵은골재",
"rate": 3,
"alt_rate": 5,
"alt_condition": "기타",
"pumsem": "forest"
},
{
"material": "모래",
"rate": 6,
"condition": "노반재료",
"pumsem": "forest"
},
{
"material": "부순돌",
"rate": 4,
"condition": "노반재료",
"pumsem": "forest"
},
{
"material": "자갈",
"rate": 4,
"condition": "노반재료",
"pumsem": "forest"
},
{
"material": "점질토",
"rate": 6,
"condition": "노반재료",
"pumsem": "forest"
},
{
"material": "이형철근",
"rate": 3,
"alt_rate": 7,
"alt_condition": "복잡 구조물 주철근",
"pumsem": "forest",
"alt_rate_range": [
6,
7
],
"alt_rate_note": "원문은 복잡 구조물 주철근 할증을 **범위 「6~7」**로 적는다. 쓰는 값은 위 끝 7 — 범위를 지우지 않고 함께 싣는다(2026-09-18)."
},
{
"material": "원형철근",
"rate": 5,
"pumsem": "forest"
},
{
"material": "강판",
"rate": 10,
"pumsem": "forest"
},
{
"material": "각재",
"rate": 5,
"pumsem": "forest"
},
{
"material": "판재",
"rate": 10,
"pumsem": "forest"
},
{
"material": "레미콘",
"rate": 2,
"condition": "무근",
"alt_rate": 1,
"alt_condition": "철근",
"pumsem": "forest"
},
{
"material": "흄관",
"rate": 3,
"pumsem": "forest"
},
{
"material": "떼",
"rate": 10,
"pumsem": "forest"
},
{
"material": "초화류",
"rate": 10,
"pumsem": "forest"
},
{
"material": "사방용 수목",
"rate": 10,
"pumsem": "forest"
},
{
"material": "원석",
"rate": 30,
"condition": "마름돌용",
"pumsem": "forest"
}
],
"observed_practice": {
"note": "울진 총괄집계 관측 — 참고이지 기본값이 아니다(PLAN 8-10 ★ 법대로).",
"values": {
"모래": 10,
"자갈": 3,
"혼합석": 2,
"시멘트": 2,
"떼": 10
}
},
"candidates_pending_user": {
"note": "건설품셈에서 이름은 찾았으나 **적용 조건이 우리 쓰임과 다른** 것. 지식DB는 근거·후보 가이드이지 값을 확정하는 곳이 아니므로(CLAUDE.md 3장) 엔진은 이 값을 쓰지 않고 「할증률 미확보」로 둔다. 사용자 확정 후 rates_pct 로 옮길 것.",
"items": [
{
"material": "막자갈",
"rate": 4,
"pumsem": "forest",
"listed_in": "산림청고시 제2025-82호 1-3-1 3호 「부순돌ㆍ자갈ㆍ막자갈 4」(건설품셈도 같은 조건)",
"listed_condition": "노상 및 노반재료(선택층·보조기층·기층)",
"our_usage": "돌쌓기 뒤채움",
"why_not_applied": "조문이 쓰임을 노반재료로 못박아 뒤채움에 그 상한을 끌어올 근거가 없음(2026-09-14 브레인 판정 보류 유지 · 사방기술교본도 할증률 없음)"
}
]
},
"not_found": {
"note": "산림·건설 두 품셈의 재료 할증률표를 다 뒤졌으나 **이름이 없는** 자재. 석재 계열은 건설품셈도 해상 사석(기초·피복·뒤채움)과 원석(마름돌용)만 다룬다.",
"materials": [
"야면석",
"고임돌",
"물구멍관",
"못"
],
"checked": [
"산림품셈 1-3-1 전 19종",
"못 — 산림청고시 제2025-82호 1-3-1 6호 기타재료에 없음(2026-09-14 브레인 확인)",
"건설품셈 1-3-1 1~7호(콘크리트·노반·관기초·토사(해상)·사석(해상)·속채움(해상)·강재류)",
"건설품셈 제7장 돌공사 — 재료 할증률표 없음"
]
}
}
@@ -51,40 +51,7 @@
"why": "원문 복잡 구조물 주철근 「6-7」 범위 중 위 끝 7 을 씀 — 범위를 살릴지 사람 확인"
}
},
"formwork_reuse": {
"reuse_ratio_pct/timber": {
"md": {
"각재": "비율 칸 비어 있음",
"합판": {
"재료별(%)": [
"100.0",
"57.0",
"46.1",
"40.1",
"37.1",
"34.7"
],
"노무비(%)": [
"100.0",
"60.0",
"47.1",
"40.0",
"34.2",
"32.0"
]
}
},
"data": [
100.0,
60.0,
47.1,
40.0,
34.2,
32.0
],
"why": "⚠ 원문 12-4 는 각재 줄 비율 칸이 비어 있음 — 이 여섯 값은 합판 줄 「노무비(%)」 열인데 각재(timber)라는 이름이 붙음 · 쓰는 곳 확인 필요"
}
},
"formwork_reuse": {},
"rebar_complexity": {
"classes/복잡": {
"md": "12-3 [주]① 에 없는 예시",
@@ -9,53 +9,7 @@
"*_blind: 시험이 못 보는 자리 — what=무엇 · why=까닭. `안 잰 칸 …` 은 자료에 있는데 원문과 안 맞대는 칸(새 칸이 생기면 빨강).",
"why: 사람이 적은 까닭 — 시험은 맞대기에서 뺌."
],
"labor": {
"제조 115 industry": {
"source": "품질 관리 / 금속 재료",
"data": "금속 재료",
"why": "품질 관리 하위 업종 — 112~114 는 「품질 관리 / 화학 공학」 꼴인데 115~123 은 상위 업종이 빠짐(자료 안 고름)"
},
"제조 116 industry": {
"source": "품질 관리 / 금속 재료",
"data": "금속 재료",
"why": "품질 관리 하위 업종 — 112~114 는 「품질 관리 / 화학 공학」 꼴인데 115~123 은 상위 업종이 빠짐(자료 안 고름)"
},
"제조 117 industry": {
"source": "품질 관리 / 금속 재료",
"data": "금속 재료",
"why": "품질 관리 하위 업종 — 112~114 는 「품질 관리 / 화학 공학」 꼴인데 115~123 은 상위 업종이 빠짐(자료 안 고름)"
},
"제조 118 industry": {
"source": "품질 관리 / 전기· 전자· 기계",
"data": "전기· 전자· 기계",
"why": "품질 관리 하위 업종 — 112~114 는 「품질 관리 / 화학 공학」 꼴인데 115~123 은 상위 업종이 빠짐(자료 안 고름)"
},
"제조 119 industry": {
"source": "품질 관리 / 전기· 전자· 기계",
"data": "전기· 전자· 기계",
"why": "품질 관리 하위 업종 — 112~114 는 「품질 관리 / 화학 공학」 꼴인데 115~123 은 상위 업종이 빠짐(자료 안 고름)"
},
"제조 120 industry": {
"source": "품질 관리 / 전기· 전자· 기계",
"data": "전기· 전자· 기계",
"why": "품질 관리 하위 업종 — 112~114 는 「품질 관리 / 화학 공학」 꼴인데 115~123 은 상위 업종이 빠짐(자료 안 고름)"
},
"제조 121 industry": {
"source": "품질 관리 / 기타 공학",
"data": "기타 공학",
"why": "품질 관리 하위 업종 — 112~114 는 「품질 관리 / 화학 공학」 꼴인데 115~123 은 상위 업종이 빠짐(자료 안 고름)"
},
"제조 122 industry": {
"source": "품질 관리 / 기타 공학",
"data": "기타 공학",
"why": "품질 관리 하위 업종 — 112~114 는 「품질 관리 / 화학 공학」 꼴인데 115~123 은 상위 업종이 빠짐(자료 안 고름)"
},
"제조 123 industry": {
"source": "품질 관리 / 기타 공학",
"data": "기타 공학",
"why": "품질 관리 하위 업종 — 112~114 는 「품질 관리 / 화학 공학」 꼴인데 115~123 은 상위 업종이 빠짐(자료 안 고름)"
}
},
"labor": {},
"machine": {
"가격 0230-0002 machine_name": {
"source": "대형 브레이커",
@@ -496,326 +450,6 @@
"data": null,
"why": "원문 한 칸에 여러 코드가 뭉친 줄 — 자료가 안 옮겨 손료가 없음"
},
"손료 5202-0127 annual_management_ratio": {
"source": 0.1,
"data": 0.55,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0127 annual_standard_hours": {
"source": 800,
"data": 4500,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0127 depreciation_coefficient_1e_minus_7": {
"source": 2000,
"data": 0.1,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0127 depreciation_ratio": {
"source": 0.9,
"data": 800,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0127 economic_life_hours": {
"source": 4500,
"data": null,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0127 maintenance_coefficient_1e_minus_7": {
"source": 1222,
"data": 2000,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0127 maintenance_ratio": {
"source": 0.55,
"data": 0.9,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0127 management_coefficient_1e_minus_7": {
"source": 788,
"data": 1222,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0240 annual_management_ratio": {
"source": 0.1,
"data": 0.55,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0240 annual_standard_hours": {
"source": 800,
"data": 4500,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0240 depreciation_coefficient_1e_minus_7": {
"source": 2000,
"data": 0.1,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0240 depreciation_ratio": {
"source": 0.9,
"data": 800,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0240 economic_life_hours": {
"source": 4500,
"data": null,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0240 maintenance_coefficient_1e_minus_7": {
"source": 1222,
"data": 2000,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0240 maintenance_ratio": {
"source": 0.55,
"data": 0.9,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0240 management_coefficient_1e_minus_7": {
"source": 788,
"data": 1222,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0300 annual_management_ratio": {
"source": 0.1,
"data": 0.55,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0300 annual_standard_hours": {
"source": 800,
"data": 4500,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0300 depreciation_coefficient_1e_minus_7": {
"source": 2000,
"data": 0.1,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0300 depreciation_ratio": {
"source": 0.9,
"data": 800,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0300 economic_life_hours": {
"source": 4500,
"data": 1050,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0300 maintenance_coefficient_1e_minus_7": {
"source": 1222,
"data": 2000,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0300 maintenance_ratio": {
"source": 0.55,
"data": 0.9,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5202-0300 management_coefficient_1e_minus_7": {
"source": 788,
"data": 1222,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-1800 annual_management_ratio": {
"source": 0.1,
"data": 0.9,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-1800 annual_standard_hours": {
"source": 890,
"data": 5.5,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-1800 depreciation_coefficient_1e_minus_7": {
"source": 2250,
"data": 0.6,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-1800 depreciation_ratio": {
"source": 0.9,
"data": 4000,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-1800 economic_life_hours": {
"source": 4000,
"data": null,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-1800 maintenance_coefficient_1e_minus_7": {
"source": 1500,
"data": 0.1,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-1800 maintenance_ratio": {
"source": 0.6,
"data": 890,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-1800 management_coefficient_1e_minus_7": {
"source": 730,
"data": 2250,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2200 annual_management_ratio": {
"source": 0.1,
"data": 0.9,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2200 annual_standard_hours": {
"source": 890,
"data": 8.0,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2200 depreciation_coefficient_1e_minus_7": {
"source": 2250,
"data": 0.6,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2200 depreciation_ratio": {
"source": 0.9,
"data": 4000,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2200 economic_life_hours": {
"source": 4000,
"data": null,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2200 maintenance_coefficient_1e_minus_7": {
"source": 1500,
"data": 0.1,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2200 maintenance_ratio": {
"source": 0.6,
"data": 890,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2200 management_coefficient_1e_minus_7": {
"source": 730,
"data": 2250,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2700 annual_management_ratio": {
"source": 0.1,
"data": 0.9,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2700 annual_standard_hours": {
"source": 890,
"data": 12.0,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2700 depreciation_coefficient_1e_minus_7": {
"source": 2250,
"data": 0.6,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2700 depreciation_ratio": {
"source": 0.9,
"data": 4000,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2700 economic_life_hours": {
"source": 4000,
"data": null,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2700 maintenance_coefficient_1e_minus_7": {
"source": 1500,
"data": 0.1,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2700 maintenance_ratio": {
"source": 0.6,
"data": 890,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-2700 management_coefficient_1e_minus_7": {
"source": 730,
"data": 2250,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-3500 annual_management_ratio": {
"source": 0.1,
"data": 0.9,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-3500 annual_standard_hours": {
"source": 890,
"data": 20.0,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-3500 depreciation_coefficient_1e_minus_7": {
"source": 2250,
"data": 0.6,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-3500 depreciation_ratio": {
"source": 0.9,
"data": 4000,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-3500 economic_life_hours": {
"source": 4000,
"data": null,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-3500 maintenance_coefficient_1e_minus_7": {
"source": 1500,
"data": 0.1,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-3500 maintenance_ratio": {
"source": 0.6,
"data": 890,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-3500 management_coefficient_1e_minus_7": {
"source": 730,
"data": 2250,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-4500 annual_management_ratio": {
"source": 0.1,
"data": 0.9,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-4500 annual_standard_hours": {
"source": 890,
"data": 35.0,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-4500 depreciation_coefficient_1e_minus_7": {
"source": 2250,
"data": 0.6,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-4500 depreciation_ratio": {
"source": 0.9,
"data": 4000,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-4500 economic_life_hours": {
"source": 4000,
"data": null,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-4500 maintenance_coefficient_1e_minus_7": {
"source": 1500,
"data": 0.1,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-4500 maintenance_ratio": {
"source": 0.6,
"data": 890,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5203-4500 management_coefficient_1e_minus_7": {
"source": 730,
"data": 2250,
"why": "규격 칸이 둘(5202)·셋(5203)인 표 — 자료가 칸을 밀려 읽음(가동시간 자리에 내용시간 값 등) · 값 틀림"
},
"손료 5210-0010 economic_life_hours": {
"source": 3600,
"data": null,
@@ -1186,23 +820,7 @@
},
"material": {},
"oil": {},
"rate": {
"rate_overhead.specialty_electric_communication_fire_other[(1000억이상)].rate_percent": {
"source": 4.5,
"data": null,
"why": "원문 BL35 병합 칸이 300억 이상까지 4.5% — 자료는 100억~300억 구간까지만 둠"
},
"rate_overhead.specialty_electric_communication_fire_other[(300억-1000억미만)].rate_percent": {
"source": 4.5,
"data": null,
"why": "원문 BL35 병합 칸이 300억 이상까지 4.5% — 자료는 100억~300억 구간까지만 둠"
},
"셈 원문 값 수": {
"source": 233,
"data": 231,
"why": "위 전문·전기 일반관리비 300억 이상 두 구간이 자료에 없음"
}
},
"rate": {},
"labor_blind": {
"건설 pdf": {
"what": "3. 개별직종 노임단가.md",
+1 -1
View File
@@ -54,7 +54,7 @@ def test_횟수별_비율을_여기서_곱하지_않을것() -> None:
# 3.205 ㎡/m × 10m — 46.1 % 를 곱하지 않았다(2026-09-14 원문 값 3.205 · 전 라이브러리 3.20 → 32.0)
assert abs(euroform["amount"] - 32.05) < 1e-9
# 비율표는 데이터에 있되 값에 안 걸린다.
assert load_formwork_table().reuse_ratio_pct["plywood"]["3"] == 46.1
assert load_formwork_table().reuse_ratio_pct["plywood_material_pct"]["3"] == 46.1
def test_모르는_종류는_지어내지_않고_미확보() -> None:
@@ -218,14 +218,20 @@ def _formwork_reuse(doc: dict, md: dict) -> dict:
label = _sq(row[0])
series[label] = {heads[1]: row[4].split(), heads[2]: row[5].split()}
ratio = doc["reuse_ratio_pct"]
for key, row_label in (("plywood", "합판"), ("timber", "각재")):
# ⚠ 원문은 **「합 판」 한 줄에 두 열**(재료별% · 노무비%)을 적고, 「각 재」 줄엔 비율이 없다.
# 앞서 각재 자리에 노무비 열이 들어가 있었다(2026-09-18 바로잡음) — 열을 이름으로 맞댄다.
합판 = {h: [float(x) for x in v] for h, v in series.get("합판", {}).items() if v}
for key, head in (("plywood_material_pct", "재료별(%)"), ("plywood_labor_pct", "노무비(%)")):
data_val = [ratio[key][str(n)] for n in range(1, 7)]
found = {h: [float(x) for x in v] for h, v in series.get(row_label, {}).items() if v}
if data_val not in found.values():
out[f"reuse_ratio_pct/{key}"] = {
"md": {row_label: found or "비율 칸 비어 있음", "합판": series["합판"]},
"data": data_val,
}
if 합판.get(head) != data_val:
out[f"reuse_ratio_pct/{key}"] = {"md": 합판.get(head), "data": data_val}
# 각재는 **비어 있어야** 한다 — 다른 열을 갖다 쓰면 안 된다
각재 = {h: v for h, v in series.get("각재", {}).items() if v}
if 각재 or "timber" in ratio:
out["reuse_ratio_pct/timber"] = {
"md": 각재 or "비율 칸 비어 있음",
"data": ratio.get("timber", "없음(원문에 없어 비워 둠)"),
}
area = md["tables"]["F0395"]["rows"]
md_area = dict(zip([_sq(x) for x in area[0][:3]], [_num(x) for x in area[1][3:6]]))
for cls in doc["euroform_type"]["classes"]:
@@ -463,7 +463,7 @@ WORK_TYPE = {"토목": "civil", "조경": "landscape", "산업설비(토목)": "
SAFETY_SCALE = {"5억미만": "lt_500_million", "5억~50억미만": "500_million_to_5_billion", "50억이상": "gte_5_billion", "추정금액800억미만건설공사(주공종이토목인경우1,000억)": "gte_5_billion_below_manager_threshold", "추정금액800억이상건설공사(주공종이토목인경우1,000억)": "gte_5_billion_at_or_above_manager_threshold"} # fmt: skip
SAFETY_WORK = {"건축공사": "building", "토목공사": "civil", "중건설공사": "heavy_construction", "특수건설공사": "special_construction"} # fmt: skip
CIVIL_PRICE = {"5억미만": "lt_5_billion", "5억-30억미만": "lt_5_billion", "30억-50억미만": "lt_5_billion", "50억-100억미만": "5_to_30_billion", "100억-300억미만": "5_to_30_billion", "300억-1000억미만": "30_to_100_billion", "1000억이상": "gte_100_billion"} # fmt: skip
SPECIAL_PRICE = {"5억미만": "lt_500_million", "5억-30억미만": "500_million_to_3_billion", "30억-50억미만": "3_to_10_billion", "50억-100억미만": "3_to_10_billion", "100억-300억미만": "10_to_30_billion"} # fmt: skip
SPECIAL_PRICE = {"5억미만": "lt_500_million", "5억-30억미만": "500_million_to_3_billion", "30억-50억미만": "3_to_10_billion", "50억-100억미만": "3_to_10_billion", "100억-300억미만": "10_to_30_billion", "300억-1000억미만": "30_to_100_billion", "1000억이상": "gte_100_billion"} # fmt: skip
#: (라벨 열, 첫 줄, 끝 줄, 값 열, 라벨→자료 구간, 자료 열쇠 틀)
BANDS = [
("B", 67, 82, "AH", {"[1등급]1400억이상": "1|gte_140_billion", "[2등급]900억~1400억미만": "2|90_to_140_billion", "[3등급]570억~900억미만": "3|57_to_90_billion", "[4등급]370억~570억미만": "4|37_to_57_billion", "[5등급]220억~370억미만": "5|22_to_37_billion", "[6등급]140억~220억미만": "6|14_to_22_billion", "[7등급]고시금액~140억미만": "7|official_threshold_to_14_billion", "7등급미만": "below_7|below_official_threshold"}, "rate_goyong.brackets[{}].rate_percent"),
+2 -2
View File
@@ -154,7 +154,7 @@ def test_아홉의_고칠_칸은_값_칸(client: TestClient) -> None:
assert stone["fill_concrete_m3_per_m2/견치돌/75"]["m3_per_m2"] == 0.34
assert stone["backfill_ratio_of_back_length/깬돌"]["ratio"] == 0.5
ratio = {r["@id"]: r for r in _get(client, "formwork_reuse", size=500)["rows"]}
assert ratio["reuse_ratio_pct/plywood/2"]["ratio_pct"] == 57.0
assert ratio["reuse_ratio_pct/plywood_material_pct/2"]["ratio_pct"] == 57.0
assert ratio["reuse_by_class/복잡한 구조"]["reuse_count"] == 2
timber = {r["@id"]: r for r in _get(client, "timber_structure_class", size=500)["rows"]}
assert timber["classes/보통구조 하"]["carpenter"] == 6.285
@@ -185,7 +185,7 @@ def test_고치기도_같은_길(client: TestClient, tmp_path: Path) -> None:
assert "@axis" not in row and "@source" not in row # 안쪽 칸은 안 내보냄
# 같은 칸이 어느 줄에선 값이고 어느 줄에선 축임(사용횟수) — 축인 줄에선 막혀야 함
axis_edit = client.put(
"/api/master-data/base-prices/formwork_reuse/reuse_ratio_pct/plywood/2",
"/api/master-data/base-prices/formwork_reuse/reuse_ratio_pct/plywood_material_pct/2",
json={"values": {"reuse_count": 3}},
)
assert axis_edit.status_code == 400 and "자료 열쇠" in axis_edit.text