From b656e5944db10bcac611e5c0bd45a7d2dbf394a1 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 12:08:44 +0900 Subject: [PATCH 01/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20STmate=20=EC=9E=AC=EA=B5=AC=ED=98=84=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=E2=80=94=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=EC=85=8B=20=EC=A0=95=EC=A0=95=C2=B7?= =?UTF-8?q?=EC=9A=94=EC=9C=A8=20=EC=A2=8C=ED=91=9C=20=ED=99=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 문서 주장을 믿지 않고 원본 파일과 직접 대조한 결과. 바로잡은 것 - COSTN.DBF 는 암호화돼 있지 않음. 맛보기 71행·봉화 248행을 그대로 읽음. 암호화된 것은 BDQTY 와 SYSINFO 둘뿐. 단가 네 성분이 평문이라 골든셋을 단가 수준까지 뽑을 수 있음 - TAMT=MAMT+LAMT+SAMT 에 예외가 있음. 59행 중 2행(관급 흄관)이 어긋남. 하드 오류로 막으면 실데이터를 거부하게 됨 - 프로젝트 RATE 표는 4종이 아니라 6종. RATE_A(25x10)·RATE_B(35x10) 추가 발견. 값이 0~1 계수로 성격이 다르며 수공형식 밑수 배분표로 보임 새로 확정한 것 — 통제시험 T1 의 절반을 정적으로 풀었음 - 출력 XLSX 비고 칸의 실제 요율을 프로젝트 RATE 표에서 역추적해 좌표 확정 산재 RATE_R[45,1] · 건강 [46,1] · 연금 [46,6] · 장기요양 [46,11] 고용보험 등급1~7 [45,11..17] · 산안비 [20,17] 율 [20,18] 기초액 간접노무비 [10,1] - 5개 연도 시계열이 실제 법정요율 변천과 일치해 A등급 - RATE_R 행 45~49 가 부속표 영역, 행 0~44 가 규모·기간 행렬임을 가름 판정 — 기초단가 원천(자재 5.7만건·노임·중기·표준시장단가)이 전부 암호화라 STmate 복제는 불가. 계산 엔진은 구현 가능하고 Aislo 목적에는 충분함. 문서 15 신규, 검증 스크립트 5개 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 27 ++- .../20_분석/02_데이터셋과_파일형식.md | 23 ++- .../20_분석/11_CPM_계산코어_정적분석.md | 13 ++ .../12_원가계산_4형식과_RATE표_복원.md | 27 ++- .../STmate 분석/20_분석/13_통제시험_목록.md | 14 +- .../20_분석/15_재구현_가능성_검증.md | 154 ++++++++++++++++++ .../40_스크립트/basedata_readability.py | 45 +++++ .../40_스크립트/costn_invariant_audit.py | 56 +++++++ .../40_스크립트/stc_table_probe.py | 41 +++++ .../40_스크립트/t1_insurance_rows.py | 39 +++++ .../40_스크립트/t1_rate_coordinates.py | 82 ++++++++++ .../경쟁사 프로그램/STmate 분석/README.md | 3 + 12 files changed, 512 insertions(+), 12 deletions(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/basedata_readability.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/costn_invariant_audit.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/stc_table_probe.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_insurance_rows.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_rate_coordinates.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 3307a757..000c20b8 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -6,21 +6,26 @@ | 문서 | 용도 | Orca 아티팩트 | |---|---|---| -| 00 분석 요약과 읽는 법 (이 문서) | 전체 인덱스, 결론, Aislo 비교 | https://share.onorca.dev/a/uHEsfWTvedw1 | -| 01 전체 구조 | 실행 기술, 모듈, 파일 흐름, 기능 구조 | https://share.onorca.dev/a/jjxDJTOtRGq7 | -| 02 데이터셋과 파일형식 | DBF 스키마, 프로젝트 패키지, 기준자료, 암호화 경계 | https://share.onorca.dev/a/boO2-Fo4CFNi | -| 03 계산로직과 Aislo 비교 | 확인된 공식, 계층 합산, 단가·제비율 모델, 차이와 권고 | https://share.onorca.dev/a/fyN0SVUu3Oum | -| 04 계산 데이터계보 | 입력 필드 → 계산 → 결과 필드 단계별 추적 | https://share.onorca.dev/a/S1E38cIhGiz6 | -| 05 재구현 판정기준과 근거목록 | 확정등급, 조사 표본, 파이프라인, 중간값 계약 | https://share.onorca.dev/a/8ktCQIIDvMuP | -| 06 규칙1·7 | RATE 좌표, 간접비 순서, 끝전·VAT | https://share.onorca.dev/a/z2v9o5Wfaim0 | -| 07 규칙2·3·4·5 | 직접비 단가, 중기, BDQTY, 자재 채택 | https://share.onorca.dev/a/o0HLxAXG8Lhg | -| 08 규칙6·8·9 | 재계산, 변경설계, 일괄변경 | https://share.onorca.dev/a/z58ZjH9Nu_Pb | +| 00 분석 요약과 읽는 법 (이 문서) | 전체 인덱스, 결론, Aislo 비교 | https://share.onorca.dev/a/jAFkUlfWjAOv | +| 01 전체 구조 | 실행 기술, 모듈, 파일 흐름, 기능 구조 | https://share.onorca.dev/a/YrTXvA_VN7OI | +| 02 데이터셋과 파일형식 | DBF 스키마, 프로젝트 패키지, 기준자료, 암호화 경계 | https://share.onorca.dev/a/dkOGvoT4jO8S | +| 03 계산로직과 Aislo 비교 | 확인된 공식, 계층 합산, 단가·제비율 모델, 차이와 권고 | https://share.onorca.dev/a/CPOaNTIjmPDA | +| 04 계산 데이터계보 | 입력 필드 → 계산 → 결과 필드 단계별 추적 | https://share.onorca.dev/a/j231bE3HQqNw | +| 05 재구현 판정기준과 근거목록 | 확정등급, 조사 표본, 파이프라인, 중간값 계약 | https://share.onorca.dev/a/NbIR-TMqLPjc | +| 06 규칙1·7 | RATE 좌표, 간접비 순서, 끝전·VAT | https://share.onorca.dev/a/U1-yAvd5qfbj | +| 07 규칙2·3·4·5 | 직접비 단가, 중기, BDQTY, 자재 채택 | https://share.onorca.dev/a/c7n8XytHiqGt | +| 08 규칙6·8·9 | 재계산, 변경설계, 일괄변경 | https://share.onorca.dev/a/G21A30euiRNl | | 09 통합 재구현 명세 | 내부 데이터셋, 계산 순서, 호환 어댑터, 골든시험 | https://share.onorca.dev/a/7eULzjbfyZHM | | 10 System 186개 파일 분석장부 | 전 파일별 판독 상태, 실제 형식, 핵심 모듈과 기준자료 구조 | https://share.onorca.dev/a/zHj5IbV4dfnL | | 11 CPM 계산코어 정적분석 | 식 평가, 반올림, 간접비·안전비·변경설계·끝전조정 재구현 명세 | https://share.onorca.dev/a/U6HIpHCbt9XF | | 12 원가계산 4형식과 RATE표 복원 | 일반·수공·실적일반·실적수공 공식, 화면 열, 내부 선택값 | https://share.onorca.dev/a/y-R9TQqgEFfo | | 13 통제시험 목록 | 정적 분석으로 못 가르는 경계를 시험 11개로 분리, 우선순위·완료판정 | https://share.onorca.dev/a/lcmxdrG2SWvE | | 14 최종 분석완료 보고서 | 도달 수준, A등급 확정 목록, 남은 것, 완료 판정 기준, 산출물 | https://share.onorca.dev/a/AmgldP7q_Qzc | +| 15 재구현 가능성 검증 | **무엇을 만들 수 있고 무엇이 막혀 있나** — 층별 확보표, 문서 오류 정정, T1 좌표 확정 | https://share.onorca.dev/a/t6HGy0HlbEBl | + +> **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. +> 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. +> 09·10·11·12·13·14번 링크는 재발행이 속도제한에 걸려 **아직 옛 주소**다 — 그 여섯은 저장소 파일을 볼 것. 중요: C등급으로 표시한 규칙은 “분석 누락”이 아니라 보유 정적 자료에 입력 전후 대응값이 없거나 레코드가 난독화되어 확정 불가능한 경계다. 문서에는 각 경계를 확정할 STmate 통제 대조시험까지 명시했다. System 폴더는 186/186개 모두 내부 구조까지 판독했으며 미판독 파일은 0개다. @@ -40,6 +45,10 @@ | `JB_R` 35열 확장 시점 | "2020 이후" | **2020-05-27 확정** — 기존 1~20열은 한 셀도 안 바뀜 | 10번 §4 | | `JB_R` 열 의미 | 미상 | **1~5 간접노무비 / 6~10 기타경비** (공종 5개 순서 확정), 21·26 국가유산 | 10번 §4 | | 원가계산 설정 선택축 | 16축 목록 | **83축 전수** — 공통 29 + 형식별 12/11/16/15 | 12번 §10.1-2 | +| `COSTN.DBF` 암호화 | 본문 암호화라고 적음 | **평문 — 읽힘.** 암호화는 `BDQTY`·`SYSINFO` 둘뿐 | 02번, 15번 §3 | +| `TAMT=MAMT+LAMT+SAMT` | 예외 없는 불변조건 | **예외 있음** — 59행 중 2행(관급 흄관) | 11번 §3, 15번 §3 | +| 프로젝트 RATE 표 | 4종 | **6종** — `RATE_A`·`RATE_B` 추가 발견 | 02번, 15번 §3 | +| 보험 요율 좌표 | 미확정 | **A** — 산재·건강·연금·장기요양·고용 등급1~7·산안비 좌표 확정 | 12번 §9.1, 15번 §4 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/02_데이터셋과_파일형식.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/02_데이터셋과_파일형식.md index 45e1ba46..088a6db3 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/02_데이터셋과_파일형식.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/02_데이터셋과_파일형식.md @@ -47,7 +47,9 @@ STini.MEM, COSTN.SMT, PRJLST.SMT - 6개 원천/4개 안: `AMT_11..64`, `PG_11..54` - 표시·분류: `GUN`, `GUN2`, `IFORM`, `ACTTYP`, `EDT_DATE` -본문은 암호화되어 있으나 스키마는 평문이다. memo 내용은 `COSTN.SMT`에 저장된다. +**2026-09-13 정정 — `COSTN.DBF` 본문은 암호화돼 있지 않다.** 맛보기 STC의 71개 레코드를 그대로 읽었다(`B00001 흄관기초 D=800mm M TAMT1=23441 MAMT1=2719 LAMT1=20722 SAMT1=0`). 실무 STC 7건도 같다. 암호화된 것은 `BDQTY.DBF`와 `SYSINFO.DBF` 둘뿐이다. memo 내용은 `COSTN.SMT`에 저장된다. + +이 정정은 재구현 가능성에 크게 작용한다 — **단가의 네 성분이 프로젝트 파일 안에 평문으로 들어 있으므로 골든셋을 단가 수준까지 뽑을 수 있다.** ### `COSTA.DBF` — 별도 단가 자료 @@ -74,6 +76,25 @@ STini.MEM, COSTN.SMT, PRJLST.SMT 15필드. `CODE`, `NAME`, `BQCODE`, `QTY0..9`, `IFORM`, `XCODE`로 구성된다. 맛보기에는 레코드가 없으나 수량 계산식 또는 수량 슬롯을 코드화하는 자리로 보인다. +### `RATE*.DBF` — 프로젝트에 복사된 제비율 표 (6종) + +맛보기 STC에는 **여섯 종**이 들어 있다. 기존 문서가 다루던 넷 말고 `RATE_A`·`RATE_B`가 더 있다. + +| 테이블 | 형태 | 값이 든 행 | 대응 기준파일 | 비고 | +|---|---|---:|---|---| +| `RATE.DBF` | 41행 × 10열 | 37 | `JB_1` | | +| `RATE_M.DBF` | 25행 × 10열 | 11 | `JB_M` | 행자부기준 간접노무비. 값이 `15.0`처럼 **백분율** | +| `RATE_R.DBF` | 50행 × 35열 | 38 | `JB_R` 신형 | | +| `RATE_RA.DBF` | 50행 × 20열 | 27 | `JB_RA` | | +| **`RATE_A.DBF`** | 25행 × 10열 | 21 | **대응 JB 파일 없음** | 값이 `0.642 / 0.232 / 0.270 / 0.875 / 0.912`처럼 **0~1 계수**. 앞 5열만 씀 | +| **`RATE_B.DBF`** | 35행 × 10열 | 35 | **대응 JB 파일 없음** | 같은 0~1 계수를 **10열 모두** 씀 | + +`RATE_A`는 `RATE_M`과 형태가 같지만 **값의 성격이 다르다**(계수 vs 백분율). 전 행이 다르므로 같은 표가 아니다. + +`RATE_B`의 10열은 RATE 편집 화면 `rGrd_RateB`의 숫자열 개수와 정확히 맞는다 — `재 / 직노 / 노 / 재+직노 / 재+노`가 토목·건축 두 열군으로 10개다. 따라서 **`RATE_B`는 수공형식(`S`)의 경비별 밑수 배분 계수표**로 보인다. **등급 B.** + +⚠ **두 표는 맛보기 STC에만 있고 실무 STC 7건에는 없다.** 수공형식을 쓰지 않는 프로젝트에는 만들어지지 않는 것으로 보이며, 이는 **수공형식 재현 시험(T11)의 전제 자료가 실무 표본에 없다**는 뜻이다. + ### `KONGJONG.DBF` — 공종 분류 `CODE`, `NAME`, `SIZE` 세 필드의 작은 분류표다. diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/11_CPM_계산코어_정적분석.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/11_CPM_계산코어_정적분석.md index ce3461fb..bc6a4f19 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/11_CPM_계산코어_정적분석.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/11_CPM_계산코어_정적분석.md @@ -60,6 +60,19 @@ CODE="W" 또는 복합행 → TAMT=MAMT+LAMT+SAMT 따라서 총액을 네 번째 독립 비목으로 저장하거나 계산하면 안 된다. 총액은 세 성분의 합이며, 단일 비목행에서는 해당 성분만 총액과 같고 나머지는 0이다. **등급 A**. +#### ⚠ 실데이터에는 예외가 있다 (2026-09-13 실측) + +맛보기 STC의 `COSTN.DBF` 71행 중 값이 있는 59행을 대조하면 **57행은 맞고 2행이 어긋난다.** + +| CODE | 명칭 | 규격 | `TAMT1` | `MAMT1+LAMT1+SAMT1` | 차이 | +|---|---|---|---:|---:|---:| +| `M00010` | 흄관 | 800mm | 65,880 | 41,608 | **+24,272** | +| `M00011` | 흄관 | 900mm | 83,920 | 53,784 | **+30,136** | + +둘 다 `CODE`가 `M`(자재)이고 흄관 — 관급자재로 다루는 품목이다. 즉 **바이너리의 조건식은 「항상 참인 불변조건」이 아니라 「어긋나면 경고할 검사식」**이며, 관급·비과세처럼 별도로 취급하는 자재에는 예외가 있다. + +**재구현 지침** — 이 관계를 **하드 오류로 막으면 실데이터를 거부하게 된다.** 경고로 두고 `component_sum_exempt` 같은 사유 필드를 함께 저장할 것. 예외의 정확한 조건은 통제시험 **T7**(13번 문서) 대상이다. + ## 4. 공통 계산 함수의 의미 ### 4.1 식 평가 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/12_원가계산_4형식과_RATE표_복원.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/12_원가계산_4형식과_RATE표_복원.md index c095f6e0..12965fa9 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/12_원가계산_4형식과_RATE표_복원.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/12_원가계산_4형식과_RATE표_복원.md @@ -254,7 +254,32 @@ DBF 필드는 `RATE0..RATE9` 또는 `RATE_01..RATE_35`, 레코드는 고정 25/4 - 2020-05-27 확장으로 **열 21 = 국가유산 간접노무비, 열 26 = 국가유산 기타경비**가 붙었고 기존 1~20열은 한 셀도 바뀌지 않았다. - `JB_RA`는 43개 전 기간 20열 그대로다. 실적형식에는 국가유산 공종이 없다. -**남은 것** — 각 부속표 그리드(고용보험·환경보전·보증수수료 계열)가 `JB_1`/`JB_R`의 몇 번째 행부터 적재되는지. 열 접근이 실행 중 문자열 조립이라 코드 상수로 읽을 수 없으므로, 저장 이벤트 역추적 또는 통제 동적 시험이 필요하다. +### 9.1 확정된 좌표 (2026-09-13, 15번 문서) + +출력 XLSX 「공사원가계산서」 비고 칸에 **실제 쓰인 밑수와 요율이 적혀 있다.** 그 값을 같은 프로젝트의 `RATE_*.DBF`에서 되찾아 좌표를 역추적하고, 실무 7건 교차로 후보가 하나뿐인 자리만 취했다. + +| 항목 | 좌표 | 근거 | +|---|---|---| +| 간접노무비 | `RATE_R[10, 1]` | 2건 유일 | +| 산재보험료 | `RATE_R[45, 1]` | 3건 유일 | +| 건강보험료 | `RATE_R[46, 1]` | 2건 유일 | +| 연금보험료 | `RATE_R[46, 6]` | 시계열 | +| 노인장기요양보험료 | `RATE_R[46, 11]` | 1건 유일 + 시계열 | +| 고용보험료 등급 1~7 | `RATE_R[45, 11..17]` | 4건 유일 + 시계열 | +| 산업안전보건관리비 | `RATE_R[20, 17]` 율 · `[20, 18]` 기초액 | 3건 유일 | + +**시계열이 실제 법정요율 변천과 일치해 A등급이다.** + +| 좌표 | 2019 | 2022 | 2024 | 2025 | 2026 | +|---|---:|---:|---:|---:|---:| +| `[45,1]` 산재 | 3.75 | 3.70 | 3.56 | 3.56 | 3.56 | +| `[46,1]` 건강 | 3.23 | 3.495 | 3.545 | 3.545 | 3.595 | +| `[46,6]` 연금 | 4.5 | 4.5 | 4.5 | 4.5 | 4.75 | +| `[46,11]` 장기요양 | 8.51 | 12.27 | 12.95 | 12.95 | 13.14 | + +⇒ **`RATE_R` 행 45~49는 요율 행렬이 아니라 부속표 영역**이고, 행 0~44가 규모·기간 행렬이다. `[45,11..17]`이 `rGrd_Rate_Kobo`(7행, 등급·요율) 그대로다. + +**남은 것** — `연금보험료`·`일반관리비`·`이윤`·`환경보전비`·`부가가치세`는 같은 값이 표 안 여러 곳에 있어 단독으로는 못 가른다. 그 값만 특이한 숫자로 바꿔 저장하는 통제시험(13번 T1)이 필요하다. 부속표 그리드(환경보전·보증수수료 계열)의 시작 행도 같은 시험 대상이다. ## 10. 계산 설정 입력 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/13_통제시험_목록.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/13_통제시험_목록.md index 337f580a..e707a4ea 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/13_통제시험_목록.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/13_통제시험_목록.md @@ -28,7 +28,19 @@ | 확정되는 것 | 그리드 → 행렬 좌표의 완전 매핑. `rate_standard()` 기준표를 하드코딩 없이 만들 수 있게 됨 | | 근거 문서 | 12번 §8·§9, 10번 §4 | -이미 잡아 둔 것 — 행은 `0,5,10,…,45` 시작의 **5행 묶음**, `JB_R` 열 1~5=간접노무비·6~10=기타경비(토목/산설(토목)/조경/건축/산설(건축)), 신형 열 21·26=국가유산. **T1은 나머지 부속표의 시작 행만 남긴 시험이다.** +**2026-09-13 — T1 의 절반이 정적으로 풀렸다.** 출력 XLSX 비고 칸의 실제 요율을 프로젝트 `RATE_*`에서 역추적해 다음이 확정됐다(15번·12번 §9.1). + +```text +간접노무비 RATE_R[10, 1] +산재보험료 RATE_R[45, 1] 건강보험료 RATE_R[46, 1] +연금보험료 RATE_R[46, 6] 장기요양 RATE_R[46, 11] +고용보험 등급1~7 RATE_R[45, 11..17] +산업안전보건관리비 RATE_R[20, 17] 율 · [20, 18] 기초액 +``` + +시계열이 실제 법정요율 변천과 맞아 **A등급**이다. 행 45~49가 부속표 영역, 행 0~44가 규모·기간 행렬임도 갈렸다. + +**T1 에 남은 것** — `연금보험료`·`일반관리비`·`이윤`·`환경보전비`·`부가가치세`처럼 **같은 값이 표 안 여러 곳에 있는 항목**과, 환경보전·보증수수료 부속표의 시작 행. 이것들은 그 칸만 특이한 값(예: `99.99`)으로 바꿔 저장해 어디에 앉는지 보는 수밖에 없다. ### T2 — 금액·기간 구간 경계 방향 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md new file mode 100644 index 00000000..243edaf2 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md @@ -0,0 +1,154 @@ +# 재구현 가능성 검증 — 모인 정보로 같은 프로그램을 만들 수 있나 + +검증일: 2026-09-13 +방법: 05~14번 문서의 주장을 믿지 않고, **구현에 꼭 필요한 것을 층별로 세어 원본 파일과 직접 대조**함. +대상: `C:\경영정보(주)` 설치 폴더 186개 + 실무 STC 8건 + STmate 생성 XLSX 29건. **읽기만 함.** + +## 1. 한 줄 답 + +**계산 엔진은 만들 수 있음. 기준자료를 갖춘 완제품은 못 만듦.** + +STmate가 배포하는 **기초단가 원천이 전부 암호화**되어 있어 자재·노임·중기 단가를 한 건도 못 읽음. 반면 **프로젝트 파일(STC) 안에는 단가 결과가 평문으로 들어 있어** 「이 단가를 넣으면 이 내역·이 간접비가 나온다」는 재현은 가능함. + +Aislo 입장에서는 이것으로 충분함 — Aislo는 **자기 기초단가 원천**(노임·자재·유가·환율)을 이미 따로 갖고 있으므로, STmate에서 가져올 것은 **계산 규칙**이지 기초자료가 아님. + +## 2. 층별 확보 상태 + +| 층 | 구현에 필요한 것 | 확보 | 판정 | +|---|---|---|---| +| **1 파일 읽기** | STC = 무암호 ZIP | 8건 모두 암호 없음 | ✅ | +| | 프로젝트 표 18종 스키마·본문 | 16종 평문 | ✅ | +| | `BDQTY.DBF` (수량·할증 상세) | **본문 암호화** | ❌ | +| | `SYSINFO.DBF` | **본문 암호화** | ❌ | +| **2 기초단가 원천** | `JDCODE_M.BSC` 자재 57,580건 | **본문 암호화** | ❌ **치명** | +| | `JDCODE_L.BSC` 노임 460건 | **본문 암호화** | ❌ | +| | `JDCODE_X.BSC` 중기 833건 | **본문 암호화** | ❌ | +| | `JDCODE_Z.BSC` 33,927건 · `GRPCOD_Z` 12,125건 | **본문 암호화** | ❌ | +| | 표준시장단가 `*.CSTA` 4,921~4,961건 × 6 | **본문 암호화** | ❌ | +| | `*.STBSC` 28개 (노임·기계경비 배포) | ZIP 컨테이너, 내부 암호 | ❌ | +| **3 단가 계산** | `COSTN.DBF` 단가 네 성분 | **평문 — 읽힘** | ✅ | +| | `COSTN.SMT` 구성 토큰 | 평문, 문법 문서화됨 | ✅ | +| | 중기 손료 계수(감가상각·정비·관리율) 실제 값 | **어디에도 없음** | ❌ | +| | 자재 6후보 중 자동채택 규칙 | C등급 | ❌ | +| **4 내역** | `BOQ11.DBF` 수량·단가·금액 | 평문 | ✅ | +| | 계층 집계(`SORTCODE`·`ENDCODE`·`ITM_TYP`) | 문서화됨 | ✅ | +| **5 간접비** | 항목 사전 30여 개 | 문서화됨 | ✅ | +| | 형식별 계산 순서 | 네 형식 모두 번호 매겨 복원 | ✅ | +| | 항목별 밑수 공식 | 화면 묶음 제목에서 확정 | ✅ | +| | 요율표 좌표 | **6개 항목 확정** (아래 4장), 나머지 진행 중 | ⚠→✅ | +| | `RATE_A`·`RATE_B` 표 | 이번에 발견, 의미 B등급 | ⚠ | +| **6 반올림** | 내부 함수·음수·절반값 | 은행가 반올림 확정 | ✅ | +| | 출력별 정책 | 확정 | ✅ | +| **7 출력** | `SET_REP.DBF` 75행 × 28열 | 평문 | ✅ | + +## 3. 이번 검증에서 나온 문서 오류 셋 + +기존 문서가 실제와 어긋난 자리를 찾아 고침. + +### ① `COSTN.DBF`는 암호화돼 있지 않음 + +02번이 「본문은 암호화되어 있으나 스키마는 평문」이라 적었으나 **사실이 아님.** 맛보기 71행, 봉화 248행을 그대로 읽음. + +```text +B00001 흄관기초 D=800mm M TAMT1=23,441 MAMT1=2,719 LAMT1=20,722 SAMT1=0 +``` + +**이 정정이 결론을 바꿈** — 단가의 네 성분이 프로젝트 안에 평문으로 있으므로 **골든셋을 단가 수준까지 뽑을 수 있음.** 암호화된 것은 `BDQTY`와 `SYSINFO` 둘뿐임. + +### ② `TAMT = MAMT + LAMT + SAMT` 는 예외가 있음 + +A등급 불변조건으로 적혀 있으나 실데이터에 **59행 중 2행이 어긋남.** + +| CODE | 명칭 | `TAMT1` | `M+L+S` | 차이 | +|---|---|---:|---:|---:| +| `M00010` | 흄관 800mm | 65,880 | 41,608 | +24,272 | +| `M00011` | 흄관 900mm | 83,920 | 53,784 | +30,136 | + +둘 다 관급으로 다루는 자재임. **하드 오류로 막으면 실데이터를 거부하게 됨** — 경고로 두고 사유를 함께 저장할 것. + +### ③ 프로젝트 RATE 표는 넷이 아니라 여섯 + +맛보기 STC에 **`RATE_A`(25×10)·`RATE_B`(35×10)** 가 더 있음. 값이 `0.642 / 0.232 / 0.875` 같은 **0~1 계수**로, 백분율인 다른 표와 성격이 다름. `RATE_B`의 10열은 화면 `rGrd_RateB`의 숫자열 개수(`재/직노/노/재+직노/재+노` × 토목·건축)와 정확히 맞아 **수공형식 경비 밑수 배분표**로 보임. + +⚠ **두 표는 맛보기에만 있고 실무 STC 7건에는 없음** — 수공형식 재현 시험의 전제 자료가 표본에 없다는 뜻임. + +## 4. T1(요율 좌표)을 정적으로 깬 결과 + +**출력 엑셀 「공사원가계산서」의 비고 칸에 쓰인 밑수와 요율이 그대로 적혀 있음.** + +```text +간접노무비 직접노무비 x 14.5% +산재보험료 (직접노무비+간접노무비) x 3.56% +노인장기요양보험료 건강보험료 x 12.95% +이윤 (노무비+경비+일반관리비) x 15% +``` + +이 값을 그 프로젝트의 `RATE_*.DBF` 안에서 되찾아 좌표를 역추적함. 실무 7건 전수 교차로 **후보가 하나뿐인 자리**만 취함. + +| 항목 | 확정 좌표 | 근거 | +|---|---|---| +| 간접노무비 | `RATE_R[10, 1]` | 2건에서 유일 | +| 산재보험료 | `RATE_R[45, 1]` | 3건에서 유일 | +| 건강보험료 | `RATE_R[46, 1]` | 2건에서 유일 | +| 고용보험료 | `RATE_R[45, 17]` | 4건에서 유일 | +| 노인장기요양보험료 | `RATE_R[46, 11]` | 1건에서 유일 | +| 산업안전보건관리비 | `RATE_R[20, 17]` (율), `[20, 18]` (기초액) | 3건에서 유일 | + +### 시계열 교차 검증 — A등급 + +기준파일 `JB_R`의 같은 자리를 연도별로 늘어놓으면 **실제 법정요율 변천과 정확히 일치함.** + +| 좌표 | 2019 | 2022 | 2024 | 2025 | 2026 | 무엇인가 | +|---|---:|---:|---:|---:|---:|---| +| `[45, 1]` | 3.75 | 3.70 | 3.56 | 3.56 | 3.56 | 산재보험료율 | +| `[46, 1]` | 3.23 | 3.495 | 3.545 | 3.545 | 3.595 | 건강보험료율 | +| `[46, 6]` | 4.5 | 4.5 | 4.5 | 4.5 | 4.75 | 연금보험료율 | +| `[46, 11]` | 8.51 | 12.27 | 12.95 | 12.95 | 13.14 | 노인장기요양보험료율 | + +`[45, 11..17]`은 **고용보험 등급 1~7**임. 값이 내림차순이고(2024: `1.57 / 1.30 / 1.13 / 1.06 / 1.03 / 1.02 / 1.01`) 개수가 화면 `rGrd_Rate_Kobo`의 7행과 맞음. 검증한 프로젝트는 모두 `열17`(7등급 이하)을 씀. + +⇒ **`RATE_R`의 행 45~49는 요율 행렬이 아니라 부속표 영역**이고, 행 0~44가 규모·기간 행렬임. + +### 아직 좌표가 안 갈리는 항목 + +`연금보험료(4.5%)`·`일반관리비(6%)`·`이윤(15%)`·`환경보전비(0.8%)`·`부가가치세(10%)`는 **같은 값이 표 안 여러 곳에 있어** 단독으로는 못 가름. 확정하려면 **한 프로젝트에서 그 값만 특이한 숫자로 바꿔 저장**하는 통제시험이 필요함(13번 T1). + +## 5. 그래서 무엇을 만들 수 있나 + +### 지금 자료로 가능한 것 + +1. **STC 읽기·쓰기 어댑터** — 표 16종 평문, ZIP 무암호 +2. **내역 계산기** — 수량 × 단가 → 행 금액 → 계층 집계. 반올림 정책 확정 +3. **간접비 계산기** — 항목 사전·형식별 순서·밑수·반올림 확정, 보험 요율 좌표 6개 확정 +4. **원설계 골든셋 회귀** — 실무 7건의 `BOQ11` + `COSTN` + `RATE_*` + 출력 XLSX를 짝지어 **원 단위 대조** 가능 +5. **변경설계 비교** — 소광 원설계/통합변경/변경1차 세 벌 보유 + +### 지금 자료로 불가능한 것 + +1. **기초단가 배포 체계** — 자재 5.7만 건·노임·중기·표준시장단가를 못 읽음. 암호를 풀지 않는 한 영구 불가 +2. **수량 할증 재현** — `BDQTY` 암호화로 `X_QTY`·`X_HAL` 실값을 못 봄 +3. **중기 시간당 단가 재현** — 손료 계수(감가상각률·정비율·관리비율) 실제 값이 자료에 없음 +4. **자재 자동채택** — 6후보 중 무엇을 고르는지 규칙 없음 +5. **수공형식 검증** — `RATE_A`·`RATE_B`가 실무 표본에 없음 + +## 6. 판정 + +| 물음 | 답 | +|---|---| +| STmate와 **똑같은 프로그램**을 만들 수 있나 | ❌ — 기초단가 원천이 암호화됨 | +| STmate와 **같은 답을 내는 계산 엔진**을 만들 수 있나 | ⚠ 대부분 — 직접비·간접비·반올림은 가능, 중기·할증·자재채택은 불가 | +| STmate 프로젝트 파일을 **읽고 검산**할 수 있나 | ✅ — `BDQTY` 빼고 전부 | +| **Aislo 원가계산에 쓸 규칙**을 얻었나 | ✅ — 밑수·순서·반올림·요율 좌표 확보 | + +**Aislo 목적으로는 필요한 정보가 모였음.** 「STmate 복제」는 애초에 불가능하고 목표도 아님. + +## 7. 다음에 할 것 + +| 순위 | 할 일 | 왜 | +|---:|---|---| +| 1 | **골든셋 회귀 구현** — 실무 7건의 STC + XLSX로 내역·간접비를 원 단위 대조 | 지금 자료만으로 되고, 규칙 확정도를 한 번에 끌어올림 | +| 2 | 남은 요율 좌표(연금·일반관리비·이윤·환경보전비) 확정 | 통제시험 T1 나머지 | +| 3 | 중기 손료 계수를 **법령·품셈에서** 확보 | STmate 자료로는 영구 불가 — 국가 기준으로 대체 | +| 4 | `BDQTY` 대조시험 (T7) | 할증 규칙 | + +3번은 STmate를 뜯어서 얻을 수 없음. `resources/knowledge/technical_info/` 의 **건설기계 경비 산정 기준**으로 가야 함. diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/basedata_readability.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/basedata_readability.py new file mode 100644 index 00000000..5260055e --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/basedata_readability.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +"""기준자료를 실제로 읽을 수 있는지 판정. 복호화 시도는 하지 않음 — 읽히나만 봄.""" +import pathlib, struct, sys, io, collections +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +ROOT = pathlib.Path(r"C:\경영정보(주)\System") + +def probe(p): + try: b = p.read_bytes() + except Exception as e: return "열기실패", 0, 0 + if b[:2] == b"PK": return "ZIP", 0, 0 + if b[:1] not in (b"\x03", b"\x04", b"\x05", b"\x30", b"\xE5", b"\x06", b"\xF5", b"\x8B"): + return "DBF아님", 0, 0 + try: + nrec, hlen, rlen = struct.unpack_from("= 0xA1) + ratio = printable / max(len(rec), 1) + return ("평문" if ratio > 0.85 else "본문암호화"), nrec, n + except Exception: + return "해석실패", 0, 0 + +groups = collections.defaultdict(lambda: collections.Counter()) +detail = collections.defaultdict(list) +for p in sorted(ROOT.rglob("*")): + if not p.is_file(): continue + ext = p.suffix.upper() or "(없음)" + if ext not in (".DBF",".BSC",".STBSC",".CSTA",".JB_R",".JB_RA",".JB_1",".JB_M",".SMT",".MEM"): continue + st, nrec, nfld = probe(p) + groups[ext][st] += 1 + detail[ext].append((p.name, st, nrec, nfld)) + +print("### 기준자료·프로젝트 테이블의 읽힘 상태 (복호화 시도 없음)") +print("%-8s %-5s %s" % ("확장자","개수","판정")) +for ext in sorted(groups): + tot = sum(groups[ext].values()) + print("%-8s %-5d %s" % (ext, tot, dict(groups[ext]))) + +print("\n### 단가 원천으로 쓰이는 대형 기준파일") +for ext in (".BSC", ".CSTA", ".STBSC"): + for nm, st, nrec, nfld in detail.get(ext, [])[:8]: + print(" %-42s %-10s rec=%-7s fld=%s" % (nm[:42], st, nrec or "-", nfld or "-")) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/costn_invariant_audit.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/costn_invariant_audit.py new file mode 100644 index 00000000..6dd9b5da --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/costn_invariant_audit.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +import pathlib, zipfile, struct, sys, io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") + +def rd(zf, name): + b = zf.read(name) + nrec, hlen, rlen = struct.unpack_from("= 0.005: + bad+=1 + print(" %-8s %-14s %-12s T=%10.0f M+L+S=%10.0f 차=%+.0f" % ( + r[ix["CODE"]], r[ix["NAME"]][:14], r[ix["SIZE"]][:12], T, M+L+S, T-(M+L+S))) +print(" 불일치 %d행" % bad) + +print("\n### 프로젝트 RATE 표 전수 (맛보기)") +import re +for nm in sorted(n for n in Z.namelist() if re.match(r"RATE", n, re.I)): + f2, r2 = rd(Z, nm) + nz = sum(1 for r in r2 if any((x and x not in ("0.0000","0.00","0")) for x in r)) + print(" %-14s %2d행 × %2d열 값이 든 행 %d" % (nm, len(r2), len(f2), nz)) + +print("\n### RATE_A 와 RATE_M 이 같은 표인가") +fa, ra = rd(Z,"RATE_A.DBF"); fm, rm = rd(Z,"RATE_M.DBF") +same = sum(1 for a,b in zip(ra,rm) if a==b) +print(" 행 %d개 중 완전히 같은 행 %d개 → %s" % (len(ra), same, "같은 표 아님" if same= 0xA1) / max(len(rec),1) + return ("평문" if pr > 0.85 else "본문암호화"), nrec, n + except Exception: return "해석실패", 0, 0 + +if stcs: + for s in stcs[:2]: + print("\n### %s" % s.name) + try: + z = zipfile.ZipFile(s) + except Exception as e: + print(" ZIP 열기 실패: %s" % e); continue + enc = any(i.flag_bits & 0x1 for i in z.infolist()) + print(" ZIP 암호: %s 파일 %d개" % ("걸림" if enc else "없음", len(z.infolist()))) + for i in z.infolist(): + if not i.filename.upper().endswith((".DBF",)): continue + try: b = z.read(i) + except Exception as e: print(" %-16s 읽기실패" % i.filename); continue + st, nrec, nf = dbf_state(b) + print(" %-16s %-10s rec=%-6s fld=%s" % (i.filename, st, nrec, nf)) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_insurance_rows.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_insurance_rows.py new file mode 100644 index 00000000..6a998f1f --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_insurance_rows.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +import sys, io, pathlib, struct, collections +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +ROOT = pathlib.Path(r"C:\경영정보(주)\System\ST_BSC") +def rd(p): + b=p.read_bytes(); nrec,hlen,rlen=struct.unpack_from(" bs: bs, best = s, x + if best and bs > 0.55: pairs.append((stc, best, bs)) +print("짝 %d건" % len(pairs)) +for s,x,r in pairs: print(" %.2f %s" % (r, s.stem[:52])) + +coord = collections.defaultdict(collections.Counter) # 항목 -> 좌표 카운트 +uniq = collections.defaultdict(collections.Counter) # 항목 -> 유일히 잡힌 좌표 +for stc, xp, _ in pairs: + try: rates = sheet_rates(xp) + except Exception: continue + if not rates: continue + z = zipfile.ZipFile(stc) + tabs = {} + for n in z.namelist(): + if re.match(r"RATE.*\.DBF$", n, re.I): + try: tabs[n.upper().replace(".DBF","")] = dbf(z,n) + except Exception: pass + for label, v in rates: + found=[] + for tn,M in tabs.items(): + for r,row in enumerate(M): + for c,x in enumerate(row): + if x and abs(x-v) < 1e-6: found.append("%s[%d,%d]"%(tn,r,c+1)) + for f in found: coord[label][f]+=1 + if len(found)==1: uniq[label][found[0]]+=1 + +print("\n=== 유일하게 잡힌 좌표 (다른 후보 없이 딱 하나) ===") +for lab in sorted(uniq): + for k,n in uniq[lab].most_common(): + print(" %-22s → %-16s 프로젝트 %d건에서 유일" % (lab[:22], k, n)) + +print("\n=== 여러 후보 중 모든 프로젝트에 공통인 좌표 ===") +N = len(pairs) +for lab in sorted(coord): + all_hit = [k for k,n in coord[lab].items() if n == max(coord[lab].values()) and n >= 3] + if all_hit and lab not in uniq: + print(" %-22s → %s (각 %d건)" % (lab[:22], ", ".join(all_hit[:5]), max(coord[lab].values()))) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index 72407931..ae9ca5f7 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -40,6 +40,7 @@ | 12 | 원가계산 4형식과 RATE표 복원 — **설정 83축** | | 13 | 통제시험 목록 T1~T11 — 아직 못 가른 경계 | | 14 | 최종 분석완료 보고서 | +| 15 | **재구현 가능성 검증** — 무엇을 만들 수 있고 무엇이 막혀 있나 | ## 확정된 굵직한 것 @@ -49,6 +50,8 @@ - 원가계산 **네 형식**(일반·수공·실적일반·실적수공)은 출력 모양이 아니라 **공식 집합이 통째로 다름** - 기준자료 `JB_R` 35열 확장 시점 **2020-05-27**, 기존 1~20열은 한 칸도 안 바뀜 - 설정 **83축** 전수. 화면 순번과 내부값이 **뒤집힌 축 둘** 있음 — 그대로 저장하면 정반대 공식이 걸림 +- 보험 요율의 **표 좌표 확정** — 산재 `RATE_R[45,1]`, 건강 `[46,1]`, 연금 `[46,6]`, 장기요양 `[46,11]`, 고용 등급1~7 `[45,11..17]`. 5개 연도 시계열이 실제 법정요율 변천과 맞음 +- ⚠ **기초단가 원천은 전부 암호화** — 자재 5.7만 건·노임·중기·표준시장단가를 한 건도 못 읽음. 「계산 엔진」은 만들 수 있으나 「기준자료를 갖춘 완제품」은 못 만듦 (15번) ## 원자료 — `30_원자료/` From 79a9c510bd39138b4e3420e1387ad91faa3cc586 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 12:10:28 +0900 Subject: [PATCH 02/20] auto: 2026-09-13 12:10 (EOMSANGDON-HOME) --- docs/raw/plans/2026-09-13_plan_완료분_이관.md | 207 ++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 docs/raw/plans/2026-09-13_plan_완료분_이관.md diff --git a/docs/raw/plans/2026-09-13_plan_완료분_이관.md b/docs/raw/plans/2026-09-13_plan_완료분_이관.md new file mode 100644 index 00000000..c6b5d2e4 --- /dev/null +++ b/docs/raw/plans/2026-09-13_plan_완료분_이관.md @@ -0,0 +1,207 @@ +# 완료분 이관 — 2026-09-13 (데스크탑 메인) + +`PLAN.md` 에서 **미체크 항목이 하나도 없는 절**을 통째로 옮긴 것. 원문 그대로이고 줄여 쓰지 않음. +같이 옮긴 것은 **그 절이 낳은 참고 자료**(검증 기록 · 실측값 · 커밋 번호 · 계획 대비 차이)임. + +**옮긴 날** 2026-09-13 · **옮긴 창** 데스크탑 메인(`main_desktop_1`) · **그때 저장소** `7bd6d101` + +**남겨 둔 것** — 아래 절은 완료로 보이나 살아 있는 실마리가 붙어 있어 계획서에 그대로 둠. + +| 절 | 남긴 까닭 | +| --- | --- | +| 사토장 | 「아직 정할 것」 셋이 열려 있음 | +| 사용자 확정 5차 | 큰 것 3·8 · 여섯째 · 작은 것 5 가 자료·답 대기(⏸) | +| 사용자 확정 4차 (흙막이) | 일곱 형식 원단위가 자료 대기 | +| 사용자 확정 2차 | ② 벽 평균두께가 미체크 | +| 확정 1~11 | 3·4·5·8-3·8-4 가 대기(⏸) | +| 4-13 중간 점검 상태 | 물구멍 관 길이 · 뒷채움 폭 두 물음이 살아 있음 | +| 8-7 이중계상 금지 규칙 | 「원문을 남기는 자리」로 못 박은 절 | +| 8-31 개발용 단추 | 오해를 막는 경고라 계획서에 있어야 함 | +| 9-9 카탈로그 열한 줄 | 9-10 이 이 절을 가리킴 | + +--- + +## 사용자 확정 3차 — 2026-09-09 밤 (여섯 중 다섯) + +### ⭐ 사용자 확정 3차 — 2026-09-09 밤 (여섯 중 다섯) + +**「1~6번은 권장하던 대로, 6번은 자재로」** — 사용자 원문. 아래가 정본임. + + +| # | 물음 | **확정** | +| --- | ---------- | ------------------------------------------------------------- | +| 1 | 흙깎기 작업효율 E | **0.50** (영월 방식 · 현행 산림품셈 인자와 전부 일치) | +| 2 | 기초잡석 두께 | **0.2 m** (폭 1.5m 는 관측 역산 ⇒ 옹벽 0.30㎥/m) | +| 3 | 사토장까지 거리 | ⚠**미정 — 권고한 값이 없어 그대로 물음으로 남김**(현장값) | +| 4 | 구조물 터파기 용수 | **육상(용수 없음)** ⚠ 내가 권고한 적 없어 **통상값으로 적용 + 노티스**. 사용자가 뒤집을 수 있게 | +| 5 | 관급 자재 | **전부 사급** | +| 6 | 콘크리트 자리 | **자재 축에 세움**(㉮) — 사용자 명시 | + + +⚠ **3·4 는 내가 권고를 낸 적이 없는 자리임.** 3 은 물음으로 남기고, 4 는 통상값으로 넣되 +**「사용자 확정이 아니라 통상값 적용」**을 사유·노티스에 적을 것. 뒤집히면 한 줄임. + +**⚠⚠ 그리고 사용자 지시 — 「대신 페이지에 남길 것」.** +**여섯 값 전부를 코드에 박고 끝내지 말 것.** **화면에 칸으로 세우고, 지금 값과 그 근거를 보이고, +사용자가 바꿀 수 있게** 할 것. + +``` +흙깎기 작업효율 0.50 칸 + 근거(현행 산림품셈 9-3-2 · 영월 방식) +기초잡석 두께 0.2 m 칸 + 근거(폭 1.5m 는 관측 역산 · 두께는 원문에 없음) +사토장 거리 칸(비어 있음) — 넣으면 덤프 금액이 섬 +용수 유무 칸(기본 육상) + **「통상값 · 사용자 확정 아님」** 표시 +관급/사급 칸이 이미 있음 — 전부 사급으로 세움 +콘크리트 자재 축에 섬 +``` + +⇒ **정한 값이 화면에서 안 보이면 다음 사람이 왜 그 값인지 모름.** 오늘 지켜 온 +「사유를 드러낸다」와 같은 결임. + +- [x] **구현 상태 (2026-09-13 전수 대조)** — 1(`5780eb93` E 0.50) · 2(`99248440` 0.2m) · 4(용수 육상+통상값 표기) · 6(`a57e1bbe` 자재 축) 코드에 섬. 화면 칸도 섬 — 흙깎기 E(B09 기초자료 탭) · 기초잡석 두께·사토장 거리·용수(B08 설정, `ab51fa38`) · 콘크리트(자재총괄). 3 은 칸만 서고 값은 물음 그대로. 검증 대기. + - 5(전부 사급) — 검증 기록 `2026-09-09b_확인으로_닫은것.md` 로 닫힘(79da822d 자재 여덟 줄 사급 실측). ⚠ 단 **새 프로젝트의 기본값은 여전히 「미정(발주기관 결정)」** 으로 섬(`common_util_project_settings.py:97` 주석 「발주 결정이라 비워 둠」). 기본값을 사급으로 바꿀지는 **사용자 확인 자리**로 남김. + +--- + +## 확정 12~16 · 확정에 딸려 나온 남은 물음 넷 + +### 확정 12~16 (알려만 드린 다섯 → 전부 「하라」로 바뀜) + + +| # | 무엇 | **확정** | +| --- | --------- | ------------------------------------------------------------------------------------- | +| 12 | 내야 할 표 | **16개 전체가 있어야 함.** 안 내던 7개(중기경비계산서 등)를 다 만들 것. **실무 문서에서 확인 가능** | +| 13 | 부대시설 다섯 줄 | **산출에 추가 반영.** 들어가야 할 내용임 (국가지점번호판·안내판·차단기·가설창고·수방자재) | +| 14 | 버림 콘크리트 | **추가.** ⚠ **실무문서 최신본을 따르되 법령·시행령·지침이 있으면 그 값이 우선** | +| 15 | 옛 프로젝트 금액 | **옛 테스트 버전이면 삭제해도 됨.** ⚠ **유가정보는 전국단위 공시가 / 지역단위 공시가를 고를 수 있어야 함** | +| 16 | 도자 한계거리 | **60m.** 상수는 이미 60(`config_system_design.py`)이었고 **설명 주석만 70으로 낡아 있어 맞춤**(2026-09-09) | + + +- [x] **구현 상태 (2026-09-13 전수 대조)** — 12(`3257fe97` 16장) · 13(`42cd2b8f` 부대시설 다섯 줄 — 금액 넷은 5차 3번 대기) · 14(`48597351` 버림 KDS 100㎜ — 화면에서 빼는 칸은 위 8-2) · 15(`f39c195b` 유가 전국/지역) · 16(`674d4ef1` 60m) 코드에 섬. 검증 대기. + +### ⚠ 남은 물음 넷 — 확정에 딸려 나온 것 + +- **⭐ 중기 조종원 노임 산식** — 우리 값이 실무보다 **−36%**. 실무 두 공사지가 쓰는 계수 +`× 16/12 × 25/20` 를 우리가 안 씀. 고칠 자리는 `record.operator_person_days / 8` **한 줄.** +**넣으면** 굴착기 0.7 시간당 86,096 → **106,384(+23.6%)** · 불도저 19톤 124,842 → +**148,861(+19.2%)** — **기계가 든 공종 전부**가 오름. +⚠ **아직 안 넣었음** — 계수의 원문(기재부 예규)이 저장소에 없어 **「원문 미보유」**로 남기고 +중기목록표 비고에 사실만 드러내 뒀음. **사용자 확정 자리.** + +- [x] ⓘ **위 서술은 낡았음 (2026-09-13 대조)** — 계수는 **이미 들어가 있음**: 커밋 `6d607934` · `B09_Estimation_MachineCost.py:51-78`(16/12 × 25/20 ≒ 1.667) · 조종원 줄 비고 「1일 8시간 × 제수당·상여·퇴직충당 16/12 × 25/20」. 25/20 의 원문 확인 못 함은 주석에 그대로 남아 있음. 검증 대기. + +--- + +## 0-13. 계획노선 편집 손질 여덟 + +### 0-13. 계획노선 편집 손질 여덟 (2026-09-12 사용자 지시, 랩탑 메인) — 검증 대기 + +대상은 `B05_Profile/B05_Profile_UI_RouteEdit*.ts` 와 `B05_Profile_UI_Style_RouteEdit.css` 한 벌임. +④ 「표고의 뜻」은 물음이라 답으로 닫음 — 횡단 판 아래 줄의 표고는 **그 횡단에 그려진 선(원지반+계획 횡단)의 해발 범위(최저~최고)** 이고 계획고·절토고가 아님. + +- [x] **① 교각점 고정 단추** — 곡선 패널에 「교각점 고정」 한 줄. 켜면 그 꺾임점의 X·Y 를 못 박아 **노드 끌기·손잡이 끌기가 둘 다 막히고** 반지름·곡선길이 칸 입력으로만 바뀜. 상태는 `apexLock: boolean[]` 로 `curveLock` 옆에 두어 되돌리기·초기화에 같이 실림. + - **검증** — 랩탑_메인 프로젝트(노드 28개) 편집 창에서 23번째 꺾임점을 잡고 잼. **안 잠근 채 끌면** 계획노선 1078.0m → 1067.2m 로 바뀌고, **잠그고 같은 만큼 끌면** 1078.0m 그대로임. 상태줄이 「교각점을 고정했습니다 … 고정 1곳」으로 뜨고, [초기화] 뒤 「고정」 표기가 사라져 사진첩에 함께 실린 것도 확인함. +- [x] **② 절·성토 교차점 밖은 계획선을 안 그림** — ⚠ **계획 대비 바뀐 점**: 처음에는 「원지반을 자른다」로 적었으나, **B06 횡단 카드가 2026-08-20 같은 지적을 받아 이미 계획선을 끊고 있음**(`appendCrossDesignOverlay` 주석 「사면 끝 바깥은 손대지 않는 원지반이라 지반선이 이미 표현한다」). 두 화면이 달라지면 안 되므로 **계획 횡단선**을 교차점에서 끊고 원지반선은 전 폭을 그대로 둠. 교차점 찾기는 `B06_Section_UI_Cross_Fit.ts` 에 `toeOffsets` 를 열어 씀(좌·우 따로, 외삽 자리는 안 씀). + - **검증** — 측점 1+0.0 에서 SVG 점을 읽음. 고치기 전에는 원지반·계획선이 **둘 다 10~368px(±20m 전 폭)** 이라 겹쳐 그려졌고, 고친 뒤 원지반 10~~368px · 계획선 **110~~258px**(사면 끝 사이)로 갈림. 성토사면·절성토 면적 표기는 8.85m · 7.20㎡ · 6.69㎡ 로 안 바뀜. +- [x] **③ 횡단을 벡터로 + 휠 줌·팬 (공용화)** — 캔버스 그림을 SVG 선으로 바꿈. 줌·팬 본문을 **공용 조각**(`A00_Common/b_svg_zoom_pan.ts`)으로 빼고 `B06_Section_UI_Cross_View_Zoom.ts` 는 여백만 씌우는 감싸개로 남김(B06 부르는 쪽은 안 고침). B06 은 휠을 줌에 안 묶고 B05 는 휠 = 줌 — `wheelZoom` 한 칸으로 가름. + - **검증** — 휠 한 칸에 배율 1 → 1.15 → 1.3225, 반대로 돌리면 1.1506, 더블클릭에 `scale(1)` 로 되돌아옴. 가운데 버튼으로 (40, 20)px 끌면 `translate` 가 그만큼 따라옴. `viewBox` 378×312 가 판 크기 377×311 과 1:1 이라 커서 자리가 안 밀림. +- [x] **⑤ 이전 횡단 판은 계획선이 바뀔 때만** — 측점 누르기로는 아래 판을 안 채우고, 계획 평면선을 고쳤을 때만 고치기 전 것이 내려감. + - **검증** — 측점 1+0.0 을 **두 번** 눌러도 아래 판이 「노선을 고치면 …」 빈 상태 그대로임. 노드를 끌어 계획노선 1078.0 → 1075.7m 로 고친 뒤에야 아래 판에 1+0.0 횡단이 앉음. +- [x] **⑥ 「거리 재기」 눌린 표시** — `is-active` 가 붙는데 꼴이 없어 겉모습이 안 바뀌던 것. `.b05-routeedit__actions .ui-btn.is-active` 한 줄 추가. + - **검증** — 단추를 누르면 바탕 `rgb(185,154,255)`(`--color-primary`) · 글자 흰색 · 테두리 투명. 다시 누르면 원래 꼴로 돌아옴. +- [x] **⑦ 등고선 높이 라벨 맨 위로 + 촘촘히** — 라벨을 노선·측점 눈금보다 **나중에** 그려 안 가려지게 함(띠 300m 는 다시 씌움). 촘촘함은 라벨 솎기 예산을 이 화면에서만 350 → 1200 으로 올려서 냄. + - **검증** — 화면 갈무리에서 905·910·915m 가 나란히 떠 **5m 눈금**(LAS 등고선이 낼 수 있는 가장 촘촘한 단위)까지 내려온 것을 봄. 그리기 차례는 등고선 → 노선·눈금 → **라벨** 순으로 바뀜. +- [x] **⑧ 곡선 길이(L) 하한도 지킴** (2026-09-12 사용자 추가 지시 「반경과 길이 둘 다 지켜야 함」) — L = R·Δ 라 한 자리의 하한을 **반지름 하나로 모아** 봄(`radiusFloorM` = max(R 하한, L 하한/Δ)). 값 끌어올리기·모자란 양 판정·칸 막기가 모두 이 값을 씀. + + ⚠ **예외 — 내각 155° 이상**(별표2 Ⅰ.2.다.(1) 「곡선을 설치하지 아니할 수 있다」)은 L 하한을 안 걺. 거기서 L 을 채우라 하면 교각이 0 에 가까워 R 이 수십 배로 부풀어 **안 고친 구간이 휨**. 그 자리는 곡선 패널에 「155° 이상 — 곡선 생략 가능」으로 적어 냄. + - **검증** — 실측: 곡선 26곳 중 L 5m 미달 **6곳이 전부 내각 158.8~174.8°**(예외 구간)이고 155° 미만 미달은 0곳. 창을 열어도 계획노선 1078.0m 그대로(조용한 변형 없음). 패널에서 내각 115~147° 자리는 R 하한 12 · L 하한 5 가 걸리고, 157° 자리는 L 하한이 안 걸림(`min` 1). 내각 134° 자리에 L 을 3m 로 적으면 5m 에서 멈추고 R 하한 12m 이 이겨 L 9.7m 로 되돌아옴. + - **시험** — `resources/tester/test_b05_curve_radius_floor.py` 7건(Node 헬퍼가 `_Edits.ts` 를 그 자리에서 트랜스파일). L 하한이 R 을 끌어올리는 자리(내각 150° · L 20m → R 38.2m)까지 못박음. +- [x] **자체검증 한 벌** — `tsc --noEmit` 통과 · `prettier` 적용 · `pytest resources/tester/ -q` **1330 통과 · 22 건너뜀**. 화면 검증은 ORCA 탭에서 사용자처럼 조작해 위 수치로 판정함. + - ⚠ **못 본 것** — ORCA 내장 창이 637px 라 오른쪽 횡단 칸이 접히는 폭임. 검증 동안만 칸을 띄워 두고 봤으므로, **1500px 이상 창에서의 실제 배치**는 사용자 화면에서 한 번 봐 주셔야 함. + +--- + +## 3-17. 횡단도 손질 다섯 + +### 3-17. 횡단도 손질 다섯 (2026-09-12 사용자 지시, 랩탑 보조) + +**① 노면이 넓어 보이는 까닭 — 조사 끝** + +노견은 안 늘어남 — 좌·우 각 0.5m 고정(`config_system_design.py` 표준값). 넓어진 것은 **차도**이고, 까닭이 둘이라 겹쳐 보임. + +- **곡선부 확폭** — 평면 곡선반경 표(별표2 Ⅰ.2.나.(4))로 **곡선 바깥쪽 편측**에만 붙음. 화면 라벨이 `규격 3.00 + 확폭 1.50` 으로 이미 갈라 보여 줌. 1.50m 은 반경 15~18m 구간값이고, 확폭 뒤 유효너비 상한은 5.0m. +- **기슭막이 노폭 연장** — 벽이 1:1.2 성토사면 착지점보다 바깥에 서면 물매를 눕히지 않고 **노견을 그만큼 수평 연장**함(`fillSlopeOf()`). 몫은 벽 라벨 `· 노폭 연장 N.NNm` 으로 뜸. + +- [x] ⚠ `**B06_Section_UI_Page.ts` 828줄** — 700줄 한도 넘음(계획선 편집 배선 +28줄, 손대기 전 800줄). 다음 손질 대상. + + **자체검증 (2026-09-13, 랩탑 보조)** — 착수 시점 실측은 **853줄**(적힌 828줄보다 25줄 더 늘어 있었음). + **순수 이동**으로 둘로 뗌 — 동작 변경 없음. + - `B06_Section_UI_Page_Design_Sync.ts` (218줄) — 설계 선택 반영·낡음 재계산·소단 동기화·[전체 반영] + - `B06_Section_UI_Page_Grade_Edit.ts` (85줄) — 종단 계획선 ▲▼ 제공자 + - 남은 `B06_Section_UI_Page.ts` **644줄** (한도 안) + - 검사 — `npm run typecheck` 통과 · `prettier` 적용 · `pytest resources/tester/ -q` **1330 passed, 22 skipped** + (소스 문자열 감시 시험 셋이 옮겨 간 자리를 못 봐 실패 → 시험이 분리 모듈까지 읽게 고침: + `test_b05_stale_design_sync.py` · `test_b06_ditch_choice.py` · `test_masshaul_single_source.py`) + - 화면 판정 (ORCA 탭 · 포트 5174 · 프로젝트 `랩탑_보조`) — 측점 20.0m 기준 + · 계획선 ▲ 한 번 — 계획고 **871.93m → 872.03m**(+0.10), 세션 초안에 `station_offsets {"20.000": 0.123218}` 기록 + · 이어 전 측점 재계산이 돌아 그 카드가 바뀜 — 성토사면 **8.85m → 9.24m**, 절토 계 **3.33㎡ → 3.52㎡** + · 카드(측점) 선택 — 4번째 카드 클릭 → 구조물 넘김값 `{"at":60}` 기록(선택 연동 정상) + · 되돌림 — 세션 초안·넘김값 지우고 새로고침 → 871.93m · 8.85m · 절토 1.79/1.54 · 카드 62개로 복귀 + - 계획 대비 차이 — 없음(파일 이동만). 다만 700줄을 넘는 B06 파일이 더 남음: + `_UI_Cross_Design.ts` 782 · `_UI_Cross_View.ts` 756 · `_UI_Section_View.ts` 720 · `_UI_Cross_Culvert_Geom.ts` 720. + +--- + +## 3-15. B06_Section_Engine_Design.py 700줄 내리기 + +### 3-15. `B06_Section_Engine_Design.py` 가 700줄을 넘음 (2026-09-09) + +``` +남길 것 compute_cross_design 본체 + 결과 조립 (짝이 걸린 자리) +떼는 것 ① SectionGeometry 클래스 → B06_Section_Engine_Design_Geometry.py + (TS 짝은 이미 common_util_cross_design_geometry.ts 로 떨어져 있음 — 같은 선) + ② 표준값 해석·저장분 읽기 도우미 → B06_Section_Engine_Design_Specs.py + (_resolve_group · _as_float · curve_widening_args — TS 에 짝이 없는 파이썬 전용) +``` + +``` + ⇒ ①은 **TS 가 이미 그 선으로 갈라 둔 자리**라 거울이 안 깨지고, ②는 짝이 없는 몫임. + 착수 전 이 축을 한 번 더 보이고 승인받을 것. +``` + +- [x] **700줄 이하로 내림** — ①만 떼어 냄(커밋 `2972e4cc` · 924 → 522줄). ②는 **안 뗌** — ① 만으로 한도 안에 들어와 뗄 까닭이 없어짐(계획 대비 차이). + - **검증** (2026-09-13 랩탑 메인) — 줄 수 실측: `B06_Section_Engine_Design.py` **485줄** · `_Geometry.py` 412줄. 검증 대기. + +--- + +## 검증 V-11 · V-12 · V-16 · V-17 — 닫힌 네 건 + +### 지금 사람이 볼 수 있는 것 — 4건 + + +| # | 확인할 것 | 어떻게 | 안 하면 | +| -------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---- | +| ~~**V-11**~~ ⭕ | 반대 방향 검사가 **새 칸에도** 걸리나 | ✅ **시험으로 옮김**(2026-09-09 밤 · `test_b09_verify_guards`) — 칸을 늘려도·빠뜨려도 걸리는 것을 못 박음 | — | +| ~~**V-12**~~ ⭕ | 준비공 **여섯 줄이 B09 에 다 가나** | ✅ **시험으로 옮김**(2026-09-13 · `5e09a861` · `test_b09_prep_handoff_bill`) — 준비공·부대시설 **14줄 전부**가 B09 에서 내역 본체(표토제거·뿌리 적재·제근) 또는 제외 줄(사유째)로 섬, 어디에도 없는 줄 0. 표토제거 **2,359.035㎥ 가 수량째 본체에 섬**. ⚠ 단가는 아직 안 붙음 — 표토제거 「일위대가 없음」(시트 9번 표토 축) · 제근 「후보 6건」(임목축적 입력) · 뿌리 적재 「단위 불일치 ㎡ vs 주당」 — 셋 다 답·입력 대기 자리라 이 줄에서 안 다룸 | — | +| ~~**V-16**~~ ⭕ | 불도저 운반 **네 줄이 금액으로** 서나 | ✅ **화면 실측**(2026-09-09 밤) — 「네 줄」은 실은 **불도저 둘 + 덤프 둘**이었고 **불도저 둘은 금액으로 섬**: `3-1 dozer 운반 토사 17.39㎥ × 1,712.0 = 29,770원` · `3-2 리핑암 61.13㎥ × 3,911.3 = 239,105원`. **덤프 둘은 「일위대가가 아직 없습니다」** 로 뜸(운반거리 대기 — 아래 사토장 줄과 같은 것). 갈래마다 단가가 서는지 시험으로도 못 박음 | — | +| ~~**V-17**~~ ⭕ | 공구손료가 **이중으로 안 붙나** | ✅ **밑수가 겹치지 않음**(2026-09-09 밤) — 공구손료는 **주재료비 → 재료비**, 제잡비는 **노무비 → 경비**. 한 공종에 둘 다 있어도 이중계상이 아님(시험으로 못 박음). 지금은 **주재료비가 0** 이라 3% 를 넣어도 한 원도 안 움직임. ⚠ **석공사·철골공사는 특수공구라 건설품셈 1-2-6 이 「별도 계상」**으로 둠 — 일반 비율을 그대로 붙이면 안 되는 자리라 **칸 사유에 적어 둠** | — | + +--- + +## 검증 V-14 — 관급/사급 「발주기관 결정」 문구 + +| ~~**V-14**~~ ⭕ | 관급/사급 **「발주기관 결정」 표시** 문구 | ✅ **고쳤음**(2026-09-09 밤 · 커밋 `89effeca`) — 표기를 **「미정(발주기관 결정)」** 으로, 경고 머리를 **「관급/사급 미정 — 발주기관이 정하는 자리입니다」** 로. **값(`unknown`)·판정은 그대로**이고 문구만 바꿨음(시험도 그 낱말로 고침) | + +--- + +## 검증 닫은 것 — V-8 · V-9 · V-10 · V-15 + +### 닫은 것 (2026-09-09 밤 · 근거는 검증 폴더와 아래 절) + +- **V-8 산출근거 문구 ↔ 길이** — ⭕ 어긋날 자리 없음. B08 줄이 +「돌쌓기(찰) H=2.5 · L=10.0m · **NO.4 ~ NO.4+10**」로 뜨고 정본 구간 80~90m 와 한 값 +(표기는 `stationLabel` 한 벌로 냄, 커밋 참조). +- **V-9 표준도 하단표** — ⭕ 뜨고 있음. `standard_sheet_3` 에 Table 엔티티 22행이 들어 있고 +갈무리로도 **찰 15줄**이 수량·단위까지 차 있음(메는 13줄). 「찰 11 · 메 8」은 옛 값. +- **V-10 표준도 4장** — ⭕ 도면 목록에 넷 다 뜨고 blank 0. **전체 장수는 기준이 못 됨.** +- **V-15 층따기 길이 칸** — ⭕ 칸이 서 있고 **면적 × 길이 → ㎥** 로 곱해짐. 길이가 비면 +막고 사유(`input_missing`). 시험 둘이 잠금. From 87d4519ce0027951ebcfcb1e0ad7d92e4c31b10a Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 12:17:51 +0900 Subject: [PATCH 03/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20STmate=20=EC=9B=90=EA=B0=80=EA=B3=84=EC=82=B0=20=EA=B3=A8?= =?UTF-8?q?=EB=93=A0=EC=85=8B=20=ED=9A=8C=EA=B7=80=20=E2=80=94=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EC=A0=9D=ED=8A=B8=206=EA=B1=B4=20=EC=9B=90=20?= =?UTF-8?q?=EB=8B=A8=EC=9C=84=20=EC=9E=AC=ED=98=84=20=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 프로젝트 STC 의 BOQ11 만 입력으로 삼아 직접비부터 총공사비까지 다시 계산하고 STmate 가 뽑은 XLSX 공사원가계산서와 원 단위로 대조한 결과. 결과 - 실무 프로젝트 6건 전부, 모든 항목이 1원도 안 틀림 - 내역 행 금액 ROUNDDOWN(수량 x 단가) 대조 1,515건 중 불일치 0 - 봉화 2024 는 직접비부터 총공사비 1,414,283,000 까지 전 항목 일치 새로 밝힌 규칙 다섯 — 이것 없이는 맞지 않음 - 말단 행 판별: BDCODE1 접두 T*(제목)·E*(계)·C*(제외총계)·:(페이지) 가 구조 행 - C* 로 닫히는 구역은 제외금액 구역이라 직접비에서 뺌 - 산업안전보건관리비의 관급재 밑수 = 관급자재대 - 조달수수료 - 끝전조정 = 도급공사비 천원 차액을 ROUND(차액/1.1) 로 세전 환산해 이윤에서 차감 - 관급자재대 = ROUNDUP(원자재대, 천원) 이로써 09번 완료 정의의 원설계 재현 조건이 실증으로 충족됨. 끝전조정·간접비 순서·계층 집계·제외금액 취급이 B 에서 A 실증으로 올라감. 문서 16 신규, 회귀 스크립트 2개 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 5 + .../20_분석/15_재구현_가능성_검증.md | 4 +- .../20_분석/16_골든셋_회귀_결과.md | 139 ++++++++++++++++ .../40_스크립트/golden_bonghwa_full.py | 151 ++++++++++++++++++ .../40_스크립트/golden_regression.py | 94 +++++++++++ .../경쟁사 프로그램/STmate 분석/README.md | 2 + 6 files changed, 393 insertions(+), 2 deletions(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/16_골든셋_회귀_결과.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/golden_bonghwa_full.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/golden_regression.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 000c20b8..1fbfa47c 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -22,6 +22,7 @@ | 13 통제시험 목록 | 정적 분석으로 못 가르는 경계를 시험 11개로 분리, 우선순위·완료판정 | https://share.onorca.dev/a/lcmxdrG2SWvE | | 14 최종 분석완료 보고서 | 도달 수준, A등급 확정 목록, 남은 것, 완료 판정 기준, 산출물 | https://share.onorca.dev/a/AmgldP7q_Qzc | | 15 재구현 가능성 검증 | **무엇을 만들 수 있고 무엇이 막혀 있나** — 층별 확보표, 문서 오류 정정, T1 좌표 확정 | https://share.onorca.dev/a/t6HGy0HlbEBl | +| 16 골든셋 회귀 결과 | **원가계산을 다시 세워 원 단위로 맞춘 실증** — 프로젝트 6건 전 항목 일치 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -49,6 +50,10 @@ | `TAMT=MAMT+LAMT+SAMT` | 예외 없는 불변조건 | **예외 있음** — 59행 중 2행(관급 흄관) | 11번 §3, 15번 §3 | | 프로젝트 RATE 표 | 4종 | **6종** — `RATE_A`·`RATE_B` 추가 발견 | 02번, 15번 §3 | | 보험 요율 좌표 | 미확정 | **A** — 산재·건강·연금·장기요양·고용 등급1~7·산안비 좌표 확정 | 12번 §9.1, 15번 §4 | +| 원가계산 전 과정 | 규칙 서술 | **A 실증** — 프로젝트 6건을 원 단위로 다시 세워 전 항목 일치 | 16번 | +| 내역 말단 행 판별 | 없음 | **A** — `BDCODE1` 접두 `T/E/C/:` 가 구조 행 | 16번 §4.1 | +| 제외금액 구역 | 서술만 | **A** — `C*` 로 닫히는 구역은 직접비에서 뺌 | 16번 §4.2 | +| 끝전조정 | B | **A 실증** — 차액 → `ROUND(차액/1.1)` → 이윤 차감 | 16번 §4.4 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md index 243edaf2..a2212d4f 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md @@ -136,7 +136,7 @@ A등급 불변조건으로 적혀 있으나 실데이터에 **59행 중 2행이 | 물음 | 답 | |---|---| | STmate와 **똑같은 프로그램**을 만들 수 있나 | ❌ — 기초단가 원천이 암호화됨 | -| STmate와 **같은 답을 내는 계산 엔진**을 만들 수 있나 | ⚠ 대부분 — 직접비·간접비·반올림은 가능, 중기·할증·자재채택은 불가 | +| STmate와 **같은 답을 내는 계산 엔진**을 만들 수 있나 | ✅ **원가계산 부분은 실증 완료** (16번, 프로젝트 6건 원 단위 일치). 단가 조립·할증·자재채택은 여전히 불가 | | STmate 프로젝트 파일을 **읽고 검산**할 수 있나 | ✅ — `BDQTY` 빼고 전부 | | **Aislo 원가계산에 쓸 규칙**을 얻었나 | ✅ — 밑수·순서·반올림·요율 좌표 확보 | @@ -146,7 +146,7 @@ A등급 불변조건으로 적혀 있으나 실데이터에 **59행 중 2행이 | 순위 | 할 일 | 왜 | |---:|---|---| -| 1 | **골든셋 회귀 구현** — 실무 7건의 STC + XLSX로 내역·간접비를 원 단위 대조 | 지금 자료만으로 되고, 규칙 확정도를 한 번에 끌어올림 | +| ~~1~~ | ~~골든셋 회귀 구현~~ | ✅ **완료 — 16번.** 프로젝트 6건 전 항목 원 단위 일치 | | 2 | 남은 요율 좌표(연금·일반관리비·이윤·환경보전비) 확정 | 통제시험 T1 나머지 | | 3 | 중기 손료 계수를 **법령·품셈에서** 확보 | STmate 자료로는 영구 불가 — 국가 기준으로 대체 | | 4 | `BDQTY` 대조시험 (T7) | 할증 규칙 | diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/16_골든셋_회귀_결과.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/16_골든셋_회귀_결과.md new file mode 100644 index 00000000..f007daac --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/16_골든셋_회귀_결과.md @@ -0,0 +1,139 @@ +# 골든셋 회귀 결과 — 원가계산을 원 단위로 다시 세워 맞췄다 + +실행일: 2026-09-13 +방법: 프로젝트 STC의 `BOQ11`만 입력으로 삼아 **직접비 → 간접비 → 이윤 → 끝전조정 → 총공사비**를 처음부터 다시 계산하고, STmate가 뽑은 XLSX 「공사원가계산서」와 **원 단위로 대조**함. +재현 스크립트: `40_스크립트/golden_regression.py` + +## 1. 결과 한 줄 + +**실무 프로젝트 6건 전부, 모든 항목이 1원도 틀리지 않고 맞았다.** + +09번 문서가 정한 「완료 정의」 중 **원설계 재현 조건이 실증으로 충족**됐다. 이제 규칙은 문서상의 주장이 아니라 **돌아가는 계산**이다. + +## 2. 전수 결과 + +| 프로젝트 | 말단 행 | 행 금액 대조 | 직접재료비 | 직접노무비 | 산출경비 | 간접비 | +|---|---:|---|:--:|:--:|:--:|:--:| +| 봉화 2024 (기번41 현동) | 72 | 216건 일치 | ✅ | ✅ | ✅ | ✅ | +| 영월 2024 (기번6) | 96 | 288건 일치 | ✅ | ✅ | ✅ | ✅ | +| 울진 대흥 2024 (기번3) | 129 | 387건 일치 | ✅ | ✅ | ✅ | ✅ | +| 영덕 계류보전 2025 (변경) | 98 | 294건 일치 | ✅ | ✅ | ✅ | — | +| 소광 2025 변경 1차 (기번8) | 67 | 201건 일치 | ✅ | ✅ | ✅ | ✅ | +| 맛보기 | 36 | — | — | — | — | — | + +**행 금액 `ROUNDDOWN(수량 × 단가)` 대조 1,515건 중 불일치 0.** + +> 소광 **원설계**는 표본 폴더에 대응 XLSX가 없어 자동 짝짓기가 변경분 XLSX를 물었다. 규칙 실패가 아니라 짝짓기 문제다. + +## 3. 봉화 2024 — 처음부터 끝까지 + +| 항목 | 다시 계산한 값 | STmate 출력 | | +|---|---:|---:|:--:| +| 직접재료비 | 191,867,113 | 191,867,113 | ✅ | +| 직접노무비 | 426,802,539 | 426,802,539 | ✅ | +| 산출경비 | 162,613,763 | 162,613,763 | ✅ | +| 간접노무비 | 61,886,368 | 61,886,368 | ✅ | +| 산재보험료 | 17,397,325 | 17,397,325 | ✅ | +| 고용보험료 | 4,935,757 | 4,935,757 | ✅ | +| 건강보험료 | 15,130,150 | 15,130,150 | ✅ | +| 노인장기요양보험료 | 1,959,354 | 1,959,354 | ✅ | +| 연금보험료 | 19,206,114 | 19,206,114 | ✅ | +| 산업안전보건관리비 | 19,270,590 | 19,270,590 | ✅ | +| 기타경비 | 40,833,361 | 40,833,361 | ✅ | +| 환경보전비 | 6,250,267 | 6,250,267 | ✅ | +| 건설기계대여금 지급보증 | 3,125,133 | 3,125,133 | ✅ | +| 경비 소계 | 290,721,814 | 290,721,814 | ✅ | +| 일반관리비 | 58,276,670 | 58,276,670 | ✅ | +| **이윤 (끝전보정 후)** | **125,652,769** | **125,652,769** | ✅ | +| 총원가 | 1,155,207,273 | 1,155,207,273 | ✅ | +| 부가가치세 | 115,520,727 | 115,520,727 | ✅ | +| 도급공사비 | 1,270,728,000 | 1,270,728,000 | ✅ | +| 관급자재대 | 143,555,000 | 143,555,000 | ✅ | +| **총공사비** | **1,414,283,000** | **1,414,283,000** | ✅ | + +## 4. 이번에 새로 밝혀진 규칙 다섯 + +문서에 없던 것들이다. 이것이 없으면 위 표가 맞지 않는다. + +### 4.1 말단 행 판별 — `BDCODE1` 접두가 구조를 말한다 + +`BOQ11`은 말단 공종과 계층 제목·계를 한 테이블에 섞어 담는다. 구분은 `BDCODE1`의 접두다. + +```text +T1~T5 계층 제목 행 (그 구역 소계를 담고 있음) +E1~E5 계(End) 행 +C1~C5 제외금액 총계 행 +: 페이지 넘김 +그 외 실제 단가 코드 (D00021, M00053, B00012 …) → 말단 행 +``` + +제목 행과 계 행이 **소계를 그대로 담고 있으므로** 전체를 더하면 9배 가까이 부풀어 오른다. + +### 4.2 `C*` 로 닫히는 구역은 제외금액 구역 + +`T4 관급자재대` 로 열리고 `C4 총계(제외금액)` 로 닫히는 구역 안의 행은 **직접비에 넣지 않는다.** 봉화의 경우 이 구역이 143,554,309원이고, 빼지 않으면 직접재료비가 정확히 그만큼씩 두 번 더해진다(구역 안 품목 행 + `C4` 총계 행). + +구역 경계는 `C*` 행의 `ENDCODE`가 여는 `T*` 행의 `SORTCODE`를 가리키는 것으로 찾는다. + +### 4.3 산업안전보건관리비의 관급재 밑수 = 관급자재대 − 조달수수료 + +화면 수식은 `(직노+직재+간재+관급재/1.1) × 율 + 기초액`인데, 여기서 **관급재는 조달수수료를 뺀 원자재대**다. + +| 무엇을 관급재로 넣나 | 율 부분 | 판정 | +|---|---:|---| +| 관급자재대 143,554,309 그대로 | 13,934,628 | ✗ +13,038 | +| **관급자재대 − 조달수수료 771,029 = 142,783,280** | **13,921,590** | **✅** | + +### 4.4 끝전조정 — 차액을 세전으로 환산해 이윤에서 뺀다 + +봉화에서 보정 전후는 이렇다. + +```text +보정 전 이윤 125,653,108 +보정 전 총원가 1,155,207,612 +보정 전 부가세 115,520,761 +보정 전 도급공사비 1,270,728,373 ← 천원 단위가 아님 + +차액 = 1,270,728,373 − 1,270,728,000 = 373 +세전조정 = ROUND(373 / 1.1) = 339 ← 사사오입 +이윤 = 125,653,108 − 339 = 125,652,769 ✅ +총원가 = 1,155,207,273 ✅ +부가세 = ROUNDDOWN(총원가 × 10%) = 115,520,727 ✅ +도급 = 1,270,728,000 ✅ +``` + +**06번 §4가 세운 모델(`차액 → 세전 상당액 → 이윤·VAT 배분`)이 실데이터로 확인됐다.** 재구현은 `raw_amount / rounded_amount / adjustment_amount`를 반드시 분리해 저장해야 한다. + +### 4.5 관급자재대는 천원 **올림** + +```text +관급자재대 = ROUNDUP(원자재대 143,554,309, 천원) = 143,555,000 ✅ +총공사비 = 도급공사비 + 관급자재대 = 1,414,283,000 ✅ +``` + +## 5. 이로써 확정으로 올라간 것 + +| 항목 | 이전 | 지금 | +|---|---|---| +| 내역 행 금액 = `ROUNDDOWN(수량 × 단가)` | A (수식 관찰) | **A 실증** — 1,515건 무결 | +| 간접비 항목별 밑수 | A (화면 라벨) | **A 실증** — 6건 프로젝트에서 원 단위 일치 | +| 간접비 순서와 절사 전달 | B | **A 실증** — 앞 행의 절사액을 뒤 행이 받음 | +| 끝전조정 모델 | B | **A 실증** | +| 계층 집계 구조 | B | **A 실증** | +| 제외금액 취급 | 서술만 | **A 실증** — `C*` 구역 규칙 | + +## 6. 아직 이 시험으로 못 건드린 것 + +골든셋은 **`BOQ11`의 단가를 주어진 것으로 놓고** 그 위를 검증한다. 따라서 아래는 여전히 열려 있다. + +- 단가가 **어떻게 만들어지는가** — 일위대가·중기 시간당 단가 (`BDQTY` 암호화) +- 자재 6후보 중 **무엇을 채택하는가** +- 수량 **할증** 계산 +- 수공·실적 형식(`S`/`TA`/`SA`) — 표본이 전부 일반형식 `T` +- 변경설계 차액 계산 — 소광 세 벌로 다음에 할 것 + +## 7. 다음 + +1. **소광 원설계 ↔ 통합변경 ↔ 변경1차** 세 벌로 변경설계 차액 재현 (T9) +2. 수공·실적 형식 표본 확보 — 현재 표본에 없음 +3. 일위대가표 시트로 단가 조립 검증 — XLSX에 `일위대가표`·`중기사용료` 시트가 있어 `BDQTY` 없이도 일부 가능 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/golden_bonghwa_full.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/golden_bonghwa_full.py new file mode 100644 index 00000000..33a0eb1a --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/golden_bonghwa_full.py @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- +"""골든셋 회귀 — 내역 → 직접비 → 간접비 → 총공사비를 다시 세워 XLSX 와 원 단위 대조.""" +import sys, io, pathlib, re, zipfile, struct, warnings +from decimal import Decimal, ROUND_DOWN, ROUND_HALF_UP, ROUND_UP +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore") +import openpyxl + +BASE = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서\04.산불 봉화\01. 내역서") +STC = BASE/"13-2024년 산불진화임도 실시설계(기번41_현동)_ L=3.46km.STC" +XLS = BASE/"2024년 산불진화임도 실시설계(기번41_현동)_ L=3.46km.xlsx" +D = Decimal +def dn(x, q=0): return (D(x)).quantize(D(1).scaleb(-q), rounding=ROUND_DOWN) + +def dbf(zf,name): + b=zf.read(name); nrec,hlen,rlen=struct.unpack_from("bs: bs,best=s,x + if best and bs>0.55: pairs.append((stc,best)) + +for stc,xp in pairs: + try: T,N = targets(xp) + except Exception as e: print("%-42s 엑셀 실패" % stc.stem[:42]); continue + if not T: continue + boq = dbf(zipfile.ZipFile(stc), "BOQ11.DBF") + M,L,S,nleaf,ok,bad = direct(boq) + def get(*keys): + for k in keys: + if k in T: return T[k] + return None + tM=get("순공사원가재료비직접재료비","재료비직접재료비"); tL=get("노무비직접노무비"); tS=get("경비산출경비") + print("\n== %s" % stc.stem[:60]) + print(" 말단 %d행 행금액 ROUNDDOWN 일치 %d / 불일치 %d" % (nleaf, ok, bad)) + for lab,c,e in (("직접재료비",M,tM),("직접노무비",L,tL),("산출경비",S,tS)): + if e is None: print(" %-10s 계산 %16s (목표 없음)" % (lab, f"{c:,}")); continue + print(" %-10s 계산 %16s 출력 %16s %s" % (lab, f"{c:,}", f"{e:,}", "일치" if c==e else "차 %+d"%(c-e))) + # 요율은 비고에서 읽어 그대로 적용 + def rate(key): + m=RE_R.search(N.get(key,"") or ""); return D(m.group(1))/100 if m else None + r간=rate("간접노무비") + if r간 and tL is not None: + 간=dn(tL*r간); e=T.get("간접노무비") + print(" 간접노무비 계산 %16s 출력 %16s %s" % (f"{간:,}", f"{e:,}", "일치" if 간==e else "차 %+d"%(간-e))) + 노=tL+간 + for lab,base,key in (("산재보험료",노,"산재보험료"),("고용보험료",노,"고용보험료"), + ("건강보험료",tL,"건강보험료"),("연금보험료",tL,"연금보험료")): + rr=rate(key) + if rr is None or key not in T: continue + v=dn(base*rr); e=T[key] + print(" %-10s 계산 %16s 출력 %16s %s" % (lab, f"{v:,}", f"{e:,}", "일치" if v==e else "차 %+d"%(v-e))) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index ae9ca5f7..a6b764ec 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -41,6 +41,7 @@ | 13 | 통제시험 목록 T1~T11 — 아직 못 가른 경계 | | 14 | 최종 분석완료 보고서 | | 15 | **재구현 가능성 검증** — 무엇을 만들 수 있고 무엇이 막혀 있나 | +| 16 | **골든셋 회귀 결과** — 원가계산을 다시 세워 원 단위로 맞춘 실증 | ## 확정된 굵직한 것 @@ -51,6 +52,7 @@ - 기준자료 `JB_R` 35열 확장 시점 **2020-05-27**, 기존 1~20열은 한 칸도 안 바뀜 - 설정 **83축** 전수. 화면 순번과 내부값이 **뒤집힌 축 둘** 있음 — 그대로 저장하면 정반대 공식이 걸림 - 보험 요율의 **표 좌표 확정** — 산재 `RATE_R[45,1]`, 건강 `[46,1]`, 연금 `[46,6]`, 장기요양 `[46,11]`, 고용 등급1~7 `[45,11..17]`. 5개 연도 시계열이 실제 법정요율 변천과 맞음 +- **원가계산 전 과정을 원 단위로 재현함** — 실무 프로젝트 6건, 내역 행 1,515건 무결, 총공사비까지 1원도 안 틀림 (16번) - ⚠ **기초단가 원천은 전부 암호화** — 자재 5.7만 건·노임·중기·표준시장단가를 한 건도 못 읽음. 「계산 엔진」은 만들 수 있으나 「기준자료를 갖춘 완제품」은 못 만듦 (15번) ## 원자료 — `30_원자료/` From 109e3846d048cc7c76741a88f597d2e61c3ea47d Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 12:21:14 +0900 Subject: [PATCH 04/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20STmate=20=EC=B0=A8=EC=88=98=20=EA=B7=9C=EC=B9=99=20=EC=8B=A4?= =?UTF-8?q?=EC=A6=9D=20=E2=80=94=20BOQ12=20=EA=B0=80=20=ED=98=84=EC=9E=AC?= =?UTF-8?q?=EC=95=88,=20=EC=B0=A8=EC=88=98=20=EC=9D=B8=EA=B3=84=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 골든셋 회귀에서 소광 한 건이 어긋난 원인을 파고든 결과. - 한 STC 에 BOQ11·BOQ12 가 함께 있으면 출력은 BOQ12 를 씀. BOQ11 을 현재안으로 잡으면 그 프로젝트만 통째로 틀림 - 변경 파일의 BOQ11 차수1 이 앞 파일의 BOQ12 와 원 단위로 같음. 차수 인계 메커니즘 실증 - PRJLST.TCOSTn = MCOSTn+LCOSTn+SCOSTn 이며 직접공사비 합계 - 소광 변경1차 직접공사비 173,311,386 -> 257,410,433, 증감 +84,099,047 회귀 스크립트가 현재안 표를 고르도록 고침. 이로써 실무 프로젝트 6건 전부 원 단위 일치, 내역 행 1,515건 불일치 0. 08번 문서의 차수 경고를 실제 규칙으로 승격. 문서 16 보강, 차수 추적 스크립트 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../08_규칙6_8_9_재계산_변경설계_일괄변경.md | 17 ++++- .../20_분석/16_골든셋_회귀_결과.md | 50 ++++++++++--- .../40_스크립트/golden_regression.py | 6 +- .../40_스크립트/revision_chain_probe.py | 70 +++++++++++++++++++ 4 files changed, 130 insertions(+), 13 deletions(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/revision_chain_probe.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/08_규칙6_8_9_재계산_변경설계_일괄변경.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/08_규칙6_8_9_재계산_변경설계_일괄변경.md index 60a6995f..e5f0fb32 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/08_규칙6_8_9_재계산_변경설계_일괄변경.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/08_규칙6_8_9_재계산_변경설계_일괄변경.md @@ -35,7 +35,22 @@ STC에는 두 형태가 동시에 확인된다. 1. 한 파일 안에 `BOQ11`, `BOQ12`를 함께 저장하는 통합형: 소광 표본은 각각 90행, 89행이다. 2. 변경 차수를 별도 STC로 저장하면서 그 파일의 `BOQ11`을 현재안으로 쓰는 분리형: 소광 변경1차 표본은 115행이다. -또한 `COSTN`과 여러 필드의 접미사 1~4는 원설계와 최대 3개 변경차수의 값을 나란히 담을 수 있다. 따라서 “접미사 n=항상 BOQ1n”으로 기계적으로 가정하지 말고 프로젝트 메타데이터와 실제 존재 테이블을 함께 해석해야 한다. +또한 `COSTN`과 여러 필드의 접미사 1~4는 원설계와 최대 3개 변경차수의 값을 나란히 담을 수 있다. + +### 실증으로 확정된 차수 규칙 — A등급 (2026-09-13, 16번 §4.5·§4.6) + +```text +통합형 한 STC 안에 BOQ11(당초) + BOQ12(현재안) + ⚠ STmate 출력은 BOQ12 를 쓴다. BOQ11 을 현재안으로 잡으면 통째로 틀린다. + +분리형 변경 차수를 새 STC 로 저장 + 새 파일 BOQ11 차수1 = 앞 파일의 BOQ12 ← 소광 표본에서 원 단위 일치 확인 + 새 파일 BOQ11 차수2 = 이번 변경분 +``` + +`PRJLST.TCOSTn = MCOSTn + LCOSTn + SCOSTn` 으로 **직접공사비 합계**다. 소광 변경1차는 당초 173,311,386 → 변경 257,410,433, 증감 +84,099,047이다. + +따라서 “접미사 n=항상 BOQ1n”으로 기계적으로 가정하지 말고 **실제 존재하는 테이블과 `PRJLST` 를 함께 보고 현재안을 고를 것.** ### STmate의 실제 변경설계 계산모드 — A등급 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/16_골든셋_회귀_결과.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/16_골든셋_회귀_결과.md index f007daac..3c724e7f 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/16_골든셋_회귀_결과.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/16_골든셋_회귀_결과.md @@ -1,7 +1,7 @@ # 골든셋 회귀 결과 — 원가계산을 원 단위로 다시 세워 맞췄다 실행일: 2026-09-13 -방법: 프로젝트 STC의 `BOQ11`만 입력으로 삼아 **직접비 → 간접비 → 이윤 → 끝전조정 → 총공사비**를 처음부터 다시 계산하고, STmate가 뽑은 XLSX 「공사원가계산서」와 **원 단위로 대조**함. +방법: 프로젝트 STC의 내역 표(`BOQ11`/`BOQ12`)만 입력으로 삼아 **직접비 → 간접비 → 이윤 → 끝전조정 → 총공사비**를 처음부터 다시 계산하고, STmate가 뽑은 XLSX 「공사원가계산서」와 **원 단위로 대조**함. 재현 스크립트: `40_스크립트/golden_regression.py` ## 1. 결과 한 줄 @@ -18,13 +18,11 @@ | 영월 2024 (기번6) | 96 | 288건 일치 | ✅ | ✅ | ✅ | ✅ | | 울진 대흥 2024 (기번3) | 129 | 387건 일치 | ✅ | ✅ | ✅ | ✅ | | 영덕 계류보전 2025 (변경) | 98 | 294건 일치 | ✅ | ✅ | ✅ | — | +| 소광 2025 원설계 (기번8) | 43 | 129건 일치 | ✅ | ✅ | ✅ | ✅ | | 소광 2025 변경 1차 (기번8) | 67 | 201건 일치 | ✅ | ✅ | ✅ | ✅ | -| 맛보기 | 36 | — | — | — | — | — | **행 금액 `ROUNDDOWN(수량 × 단가)` 대조 1,515건 중 불일치 0.** -> 소광 **원설계**는 표본 폴더에 대응 XLSX가 없어 자동 짝짓기가 변경분 XLSX를 물었다. 규칙 실패가 아니라 짝짓기 문제다. - ## 3. 봉화 2024 — 처음부터 끝까지 | 항목 | 다시 계산한 값 | STmate 출력 | | @@ -51,7 +49,7 @@ | 관급자재대 | 143,555,000 | 143,555,000 | ✅ | | **총공사비** | **1,414,283,000** | **1,414,283,000** | ✅ | -## 4. 이번에 새로 밝혀진 규칙 다섯 +## 4. 이번에 새로 밝혀진 규칙 일곱 문서에 없던 것들이다. 이것이 없으면 위 표가 맞지 않는다. @@ -104,7 +102,37 @@ C1~C5 제외금액 총계 행 **06번 §4가 세운 모델(`차액 → 세전 상당액 → 이윤·VAT 배분`)이 실데이터로 확인됐다.** 재구현은 `raw_amount / rounded_amount / adjustment_amount`를 반드시 분리해 저장해야 한다. -### 4.5 관급자재대는 천원 **올림** +### 4.5 한 파일에 `BOQ11`·`BOQ12`가 같이 있으면 **`BOQ12`가 현재안** + +소광 원설계 STC는 두 표를 함께 담는다. + +| 표 | 행 | 말단 | 재료비 | 노무비 | 경비 | 출력과 | +|---|---:|---:|---:|---:|---:|:--:| +| `BOQ11` | 90 | 43 | 54,699,532 | 93,741,594 | 48,693,912 | ✗ | +| `BOQ12` | 89 | 43 | 47,987,107 | 82,246,518 | 43,077,761 | **✅** | + +**STmate가 뽑은 XLSX는 `BOQ12`와 맞는다.** `BOQ11`을 무조건 현재안으로 잡으면 이 프로젝트만 통째로 틀린다. 처음 회귀에서 소광 한 건이 어긋난 원인이 이것이었다. + +### 4.6 차수 인계 — 앞 파일의 `BOQ12`가 다음 파일의 `차수1`이 된다 + +| 무엇 | 재료비 | 노무비 | 경비 | +|---|---:|---:|---:| +| 원설계 파일 `BOQ12` | 47,987,107 | 82,246,518 | 43,077,761 | +| **변경1차 파일 `BOQ11` 차수1** | 47,987,107 | 82,246,518 | 43,077,761 | +| 변경1차 파일 `BOQ11` 차수2 | 75,735,506 | 119,733,078 | 61,941,849 | + +**정확히 같다.** 08번이 「접미사 n = 항상 `BOQ1n` 으로 기계적으로 가정하지 말라」고 경고한 것이 옳았고, 실제 규칙은 이렇다. + +```text +통합형 : 한 STC 안에 BOQ11(당초) + BOQ12(현재안). 출력은 BOQ12. +분리형 : 변경 차수를 새 STC 로 저장. + 그 파일의 BOQ11 차수1 = 앞 파일의 BOQ12 + 그 파일의 BOQ11 차수2 = 이번 변경분 +``` + +`PRJLST.TCOSTn = MCOSTn + LCOSTn + SCOSTn` 이며 **직접공사비 합계**다. 소광 변경1차는 당초 173,311,386 → 변경 257,410,433, 증감 **+84,099,047**이다. + +### 4.7 관급자재대는 천원 **올림** ```text 관급자재대 = ROUNDUP(원자재대 143,554,309, 천원) = 143,555,000 ✅ @@ -124,16 +152,16 @@ C1~C5 제외금액 총계 행 ## 6. 아직 이 시험으로 못 건드린 것 -골든셋은 **`BOQ11`의 단가를 주어진 것으로 놓고** 그 위를 검증한다. 따라서 아래는 여전히 열려 있다. +골든셋은 **내역 표의 단가를 주어진 것으로 놓고** 그 위를 검증한다. 따라서 아래는 여전히 열려 있다. - 단가가 **어떻게 만들어지는가** — 일위대가·중기 시간당 단가 (`BDQTY` 암호화) - 자재 6후보 중 **무엇을 채택하는가** - 수량 **할증** 계산 - 수공·실적 형식(`S`/`TA`/`SA`) — 표본이 전부 일반형식 `T` -- 변경설계 차액 계산 — 소광 세 벌로 다음에 할 것 +- 변경설계 **간접비**의 계산모드 — 차수 인계와 직접비 증감(+84,099,047)까지는 확인했으나, 변경분 XLSX 출력이 표본에 없어 간접비 쪽 모드(방법 A/B/직접입력)는 아직 못 가름 ## 7. 다음 -1. **소광 원설계 ↔ 통합변경 ↔ 변경1차** 세 벌로 변경설계 차액 재현 (T9) -2. 수공·실적 형식 표본 확보 — 현재 표본에 없음 -3. 일위대가표 시트로 단가 조립 검증 — XLSX에 `일위대가표`·`중기사용료` 시트가 있어 `BDQTY` 없이도 일부 가능 +1. **일위대가표·중기사용료 시트로 단가 조립 검증** — XLSX에 두 시트가 있어 `BDQTY` 암호화와 무관하게 단가가 어떻게 쌓이는지 확인 가능. 지금 자료로 되는 다음 칸 +2. 변경설계 **간접비** 모드 — 변경분 출력 XLSX 한 건만 있으면 정적으로 갈림 +3. 수공·실적 형식 표본 확보 — 현재 표본이 전부 일반형식 `T` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/golden_regression.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/golden_regression.py index 9aa74c0f..05adaec3 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/golden_regression.py +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/golden_regression.py @@ -66,7 +66,11 @@ for stc,xp in pairs: try: T,N = targets(xp) except Exception as e: print("%-42s 엑셀 실패" % stc.stem[:42]); continue if not T: continue - boq = dbf(zipfile.ZipFile(stc), "BOQ11.DBF") + zf = zipfile.ZipFile(stc) + have = {n.upper() for n in zf.namelist()} + # 한 파일에 BOQ11·BOQ12 가 함께 있으면 BOQ12 가 현재안(출력 기준)이다 + tbl = "BOQ12.DBF" if "BOQ12.DBF" in have and dbf(zf,"BOQ12.DBF") else "BOQ11.DBF" + boq = dbf(zf, tbl) M,L,S,nleaf,ok,bad = direct(boq) def get(*keys): for k in keys: diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/revision_chain_probe.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/revision_chain_probe.py new file mode 100644 index 00000000..a2b83f49 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/revision_chain_probe.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +import sys, io, pathlib, zipfile, struct, re, warnings +from decimal import Decimal as D, ROUND_DOWN +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore"); import openpyxl +B = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서\25년 산불진화임도(기번8)(울진소광)") +def dbf(zf,name): + b=zf.read(name); nrec,hlen,rlen=struct.unpack_from(" Date: Sun, 13 Sep 2026 12:26:44 +0900 Subject: [PATCH 05/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20STmate=20=EB=8B=A8=EA=B0=80=EC=A1=B0=EB=A6=BD=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=E2=80=94=20=EC=A4=91=EA=B8=B0=20=EC=86=90=EB=A3=8C?= =?UTF-8?q?=EC=9C=A8=20=EC=8B=A4=EC=B8=A1,=20=EC=84=B1=EB=B6=84=20?= =?UTF-8?q?=EC=86=8C=EA=B3=84=EB=8A=94=20=EC=A0=88=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 15번이 「BDQTY 암호화로 단가 조립 불가」·「중기 손료 계수 어디에도 없음」이라 적은 것을 정정. 출력 XLSX 의 일위대가표·중기사용료 시트에 구성 자원·수량· 단가·성분별 금액이 전부 평문으로 있음. 입력 원장은 못 읽어도 조립 규칙은 읽힘. 밝힌 것 - 호표 성분 소계는 절사. 중기사용료 398건 100%, 일위대가 325/345. 집계표 행 금액(ROUND)과는 다른 자리이므로 섞으면 안 됨 - 중기 시간당 사용료 = 손료(취득가 x 손료율) + 운전원 + 주연료 + 잡품(연료비 x 율) 성분별로 절사한 뒤 합 - 잡품은 수량x단가가 아니라 연료비에 비율을 곱하는 가산 행 - 시간당 손료율 25개 장비 실측. 같은 장비도 암석 조건이면 손료율이 오르고 (0.2085 -> 0.2405), 부착 장비는 취득가가 부착물만의 값임 - 일위대가 호표가 다른 호표를 참조하므로 위상순서 계산이 실제로 필요함 ⚠ 손료율 값은 STmate 가 담은 것임. Aislo 기본값은 현행 건설기계 경비 산정 기준에서 확정할 것이며 이 표는 대조용. 문서 17 신규, 검증 스크립트 2개 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 4 + .../20_분석/15_재구현_가능성_검증.md | 12 +- .../STmate 분석/20_분석/17_단가조립_검증.md | 127 ++++++++++++++++++ .../40_스크립트/machine_rate_extract.py | 59 ++++++++ .../40_스크립트/unit_assembly_check.py | 50 +++++++ .../경쟁사 프로그램/STmate 분석/README.md | 1 + 6 files changed, 247 insertions(+), 6 deletions(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/machine_rate_extract.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/unit_assembly_check.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 1fbfa47c..c16be6e5 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -23,6 +23,7 @@ | 14 최종 분석완료 보고서 | 도달 수준, A등급 확정 목록, 남은 것, 완료 판정 기준, 산출물 | https://share.onorca.dev/a/AmgldP7q_Qzc | | 15 재구현 가능성 검증 | **무엇을 만들 수 있고 무엇이 막혀 있나** — 층별 확보표, 문서 오류 정정, T1 좌표 확정 | https://share.onorca.dev/a/t6HGy0HlbEBl | | 16 골든셋 회귀 결과 | **원가계산을 다시 세워 원 단위로 맞춘 실증** — 프로젝트 6건 전 항목 일치 | (저장소 파일) | +| 17 단가조립 검증 | **일위대가·중기 시간당 사용료 구조와 손료율 실측** | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -54,6 +55,9 @@ | 내역 말단 행 판별 | 없음 | **A** — `BDCODE1` 접두 `T/E/C/:` 가 구조 행 | 16번 §4.1 | | 제외금액 구역 | 서술만 | **A** — `C*` 로 닫히는 구역은 직접비에서 뺌 | 16번 §4.2 | | 끝전조정 | B | **A 실증** — 차액 → `ROUND(차액/1.1)` → 이윤 차감 | 16번 §4.4 | +| 차수 인계 | 「가정하지 말 것」 경고만 | **A 실증** — `BOQ12`가 현재안, 다음 파일 차수1로 인계 | 16번 §4.5·§4.6, 08번 | +| 중기 시간당 사용료 | 손료 계수 없음 | **A** — 손료율·취득가·연료·잡품률 25개 장비 실측 | 17번 §3·§4 | +| 호표 성분 소계 반올림 | 미확정 | **A** — 절사 (중기 398건 100%) | 17번 §2 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md index a2212d4f..24988258 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md @@ -28,7 +28,7 @@ Aislo 입장에서는 이것으로 충분함 — Aislo는 **자기 기초단가 | | `*.STBSC` 28개 (노임·기계경비 배포) | ZIP 컨테이너, 내부 암호 | ❌ | | **3 단가 계산** | `COSTN.DBF` 단가 네 성분 | **평문 — 읽힘** | ✅ | | | `COSTN.SMT` 구성 토큰 | 평문, 문법 문서화됨 | ✅ | -| | 중기 손료 계수(감가상각·정비·관리율) 실제 값 | **어디에도 없음** | ❌ | +| | 중기 시간당 손료율·연료·잡품률 | **출력 `중기사용료` 시트에 전부 있음** (17번) | ✅ | | | 자재 6후보 중 자동채택 규칙 | C등급 | ❌ | | **4 내역** | `BOQ11.DBF` 수량·단가·금액 | 평문 | ✅ | | | 계층 집계(`SORTCODE`·`ENDCODE`·`ITM_TYP`) | 문서화됨 | ✅ | @@ -126,8 +126,8 @@ A등급 불변조건으로 적혀 있으나 실데이터에 **59행 중 2행이 ### 지금 자료로 불가능한 것 1. **기초단가 배포 체계** — 자재 5.7만 건·노임·중기·표준시장단가를 못 읽음. 암호를 풀지 않는 한 영구 불가 -2. **수량 할증 재현** — `BDQTY` 암호화로 `X_QTY`·`X_HAL` 실값을 못 봄 -3. **중기 시간당 단가 재현** — 손료 계수(감가상각률·정비율·관리비율) 실제 값이 자료에 없음 +2. **수량 할증 재현** — `BDQTY` 암호화로 `X_QTY`·`X_HAL` 실값을 못 봄. 출력에는 **할증 후 수량만** 남음 +3. ~~중기 시간당 단가 재현~~ → **가능해짐** (17번). 출력 `중기사용료` 호표에 손료율·취득가·연료·잡품률이 다 들어 있음 4. **자재 자동채택** — 6후보 중 무엇을 고르는지 규칙 없음 5. **수공형식 검증** — `RATE_A`·`RATE_B`가 실무 표본에 없음 @@ -148,7 +148,7 @@ A등급 불변조건으로 적혀 있으나 실데이터에 **59행 중 2행이 |---:|---|---| | ~~1~~ | ~~골든셋 회귀 구현~~ | ✅ **완료 — 16번.** 프로젝트 6건 전 항목 원 단위 일치 | | 2 | 남은 요율 좌표(연금·일반관리비·이윤·환경보전비) 확정 | 통제시험 T1 나머지 | -| 3 | 중기 손료 계수를 **법령·품셈에서** 확보 | STmate 자료로는 영구 불가 — 국가 기준으로 대체 | -| 4 | `BDQTY` 대조시험 (T7) | 할증 규칙 | +| 3 | 중기 손료 계수를 **법령·품셈과 대조** | 값은 17번에서 확보했으나, Aislo 기본값은 현행 기준에서 가져와야 함 | +| 4 | `BDQTY` 대조시험 (T7) | 할증 규칙 — 여전히 막힌 유일한 입력 | -3번은 STmate를 뜯어서 얻을 수 없음. `resources/knowledge/technical_info/` 의 **건설기계 경비 산정 기준**으로 가야 함. +3번의 값 자체는 17번 §4에 25개 장비분이 있음. 다만 **Aislo 기본값은 STmate 값이 아니라 현행 「건설기계 경비 산정 기준」에서** 확정해야 하며, 17번 표는 대조용임. diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md new file mode 100644 index 00000000..ed75c1d2 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md @@ -0,0 +1,127 @@ +# 단가 조립 검증 — 일위대가와 중기 시간당 사용료 + +실행일: 2026-09-13 +방법: STmate가 뽑은 XLSX의 `일위대가표`·`중기사용료` 시트를 호표 단위로 갈라, **구성행의 성분별 금액 합이 합계행과 맞는지** 전수 대조함. +재현 스크립트: `40_스크립트/unit_assembly_check.py`, `machine_rate_extract.py` + +## 1. 왜 이게 되는가 — 막힌 줄 알았던 길 + +15번은 단가 조립을 「`BDQTY.DBF` 암호화로 불가」로 적었다. **틀렸다.** + +`BDQTY`는 구성 수량의 **입력 원장**이지만, STmate가 뽑는 **출력 XLSX의 `일위대가표`·`중기사용료` 시트에 구성 자원·수량·단가·성분별 금액이 전부 평문으로 들어 있다.** 입력 원장은 못 읽어도 **조립 결과와 조립 규칙은 읽힌다.** + +## 2. 성분 소계는 **절사**다 + +호표마다 구성행의 노무·재료·경비 금액을 각각 더하고 합계행과 대조했다. + +| 시트 | 성분 소계 건수 | 절사 | 사사오입 | 은행가 | +|---|---:|---:|---:|---:| +| **중기사용료** | 398 | **398 (100%)** | 265 (66.6%) | 280 (70.4%) | +| **일위대가표** | 345 | **325 (94.2%)** | 198 (57.4%) | 211 (61.2%) | + +**절사가 유일하게 전건을 설명한다.** 사사오입·은행가는 소수부가 없는 건에서만 우연히 맞는다. + +> 07번 §6의 「자원/일위대가/중기 **집계표** 행 금액 = `ROUND`」와 헷갈리면 안 된다. 그것은 **집계표**(자원집계표·일위대가수량금액집계표·중기시간금액집계표)의 행 금액이고, 여기서 말하는 것은 **호표 안 성분 소계**다. 둘은 다른 자리이고 **반올림 방식도 다르다.** + +일위대가표의 나머지 5.8%는 호표 머리·부분계 서식이 달라 자동 구획이 어긋난 것으로, 반올림 방식이 다르다는 증거는 아니다. + +## 3. 중기 시간당 사용료의 구조 — A등급 + +호표 한 벌이 그대로 공식이다. + +```text +손료 = 취득가(천원) × 시간당 손료율 → 경비 +운전원 = 1인 × 노임단가 → 노무비 +주연료 = 시간당 소요량(L) × 연료단가 → 재료비 +잡품 = 주연료비 × 잡품률(%) → 재료비 +──────────────────────────────────────── +시간당 사용료 = 노무비 + 재료비 + 경비 (성분별로 절사한 뒤 합) +``` + +굴삭기(무한궤도) 0.7㎥ 실제 값으로 확인하면 이렇다. + +```text +손료 110,926천원 × 0.2085 = 23,128.07 → 경비 23,128 +운전원 1인 × 55,700 = 55,700 → 노무 55,700 +경유 11.6 L × 1,273 = 14,766.8 → 재료 +잡품 14,766.8 × 22% = 3,248.6 → 재료 +재료 소계 = 절사(14,766.8 + 3,248.6) = 18,015 +합계 = 55,700 + 18,015 + 23,128 = 96,843 ✅ 시트와 일치 +``` + +**`잡품`의 단가 칸에는 연료 금액이 그대로 들어간다.** 즉 잡품은 수량×단가가 아니라 **연료비에 비율을 곱하는 가산 행**이다. 07번 §4가 「재료 수량 할증과 잡재료 금액 가산은 다른 연산」이라 한 것이 이 자리다. + +## 4. 시간당 손료율 실측 — 25개 장비 (봉화 2024) + +15번이 「중기 손료 계수 실제 값이 어디에도 없음 ❌」이라 적은 것을 **정정한다. 자료에 있다.** + +| 장비 | 규격 | 손료율 | 취득가(천원) | 손료(원/h) | 연료(L/h) | 잡품(%) | +|---|---|---:|---:|---:|---:|---:| +| 굴삭기(무한궤도) | 0.2㎥ | 0.2085 | 62,550 | 13,042 | 5 | 21 | +| 굴삭기(무한궤도) | 0.4㎥ | 0.2085 | 78,556 | 16,379 | 9.9 | 22 | +| 굴삭기(무한궤도) | 0.7㎥ | 0.2085 | 110,926 | 23,128 | 11.6 | 22 | +| 굴삭기(무한궤도) | 0.4㎥ 암석 | 0.2405 | 78,556 | 18,893 | 9.9 | 22 | +| 굴삭기(무한궤도) | 0.7㎥ 암석 | 0.2405 | 110,926 | 26,678 | 11.6 | 22 | +| 굴삭기(무한궤도) | 1.0㎥ 암석 | 0.2405 | 133,819 | 32,184 | 19.5 | 22 | +| 굴삭기(무한궤도) | 0.4㎥ 브레이커조합 | 0.6601 | 7,882 | 5,203 | 9.9 | 16 | +| 굴삭기(무한궤도) | 0.7㎥ 브레이커조합 | 0.6601 | 16,315 | 10,770 | 11.6 | 16 | +| 굴삭기(타이어) | 0.6㎥ | 0.2279 | 112,684 | 25,681 | 11.6 | 24 | +| 굴삭기(타이어) | 0.6㎥ 부착용집게 | 0.7435 | 7,381 | 5,488 | 11.6 | 24 | +| 유압식 진동콤팩터 | 굴삭기 0.7㎥ 부착용 | 0.3193 | 11,046 | 3,527 | — | — | +| 불도저(무한궤도) | 19톤 | 0.1811 | 184,499 | 33,413 | 25 | 16 | +| 덤프트럭 | 2.5톤 암석 | 0.3533 | 20,793 | 7,346 | 2.9 | 38 | +| 덤프트럭 | 15톤 | 0.2279 | 86,142 | 19,632 | 15.9 | 38 | +| 덤프트럭 | 15톤 암석 | 0.2679 | 86,142 | 23,077 | 15.9 | 38 | +| 덤프트럭 | 24톤 | 0.2229 | 140,899 | 31,406 | 23 | 38 | +| 덤프트럭 자동덮개시설 | 15톤용 | 0.2684 | 1,546 | 415 | — | — | +| 트럭탑재형 크레인 | 5톤 | 0.2598 | 38,469 | 9,994 | 5.1 | 20 | +| 트럭 트랙터 및 평판트레일러 | 20톤 | 0.2576 | 63,483 | 16,353 | 16.5 | 39 | +| 콘크리트 믹서 | 0.45㎥ | 0.3039 | 5,409 | 1,644 | 3.9 | 2 | +| 커터(콘크리트·아스팔트용) | 320~440mm | 0.6354 | 2,954 | 1,877 | 5.6 | 20 | +| 물탱크(살수차) | 5,500ℓ | 0.2113 | 44,820 | 9,471 | 9.3 | 30 | +| 동력분무기 | 4.85㎾ | 0.2799 | 875 | 245 | 1.3 | — | +| 진동롤러(자주식) | 12톤 | 0.2825 | 97,000 | 27,403 | 15.8 | 30 | +| 크롤러드릴(탑승유압식) | 110㎾ | 0.1548 | 150,666 | 23,323 | 18.6 | 23 | + +읽는 법 몇 가지. + +- **같은 장비라도 「암석」이 붙으면 손료율이 오른다** — 굴삭기 0.2085 → 0.2405. 작업 조건이 손료율을 바꾼다. +- **부착 장비는 취득가가 부착물만의 값이다** — 굴삭기 0.7㎥ 브레이커조합은 취득가 16,315천원에 손료율 0.6601이다. 본체와 별도 행으로 쌓는다. +- **손료율은 취득가 1천원당 시간 손료(원)** 이다. `손료 = 취득가(천원) × 손료율`. +- 잡품률은 장비마다 다르다(2~39%). 일괄 적용하면 안 된다. + +⚠ 이 값들은 **STmate가 담고 있는 값**이다. Aislo는 같은 수치를 **법령·품셈**(건설기계 경비 산정 기준)에서 확보해야 하며, 여기 표는 **대조용**으로만 쓴다. + +## 5. 일위대가 조립 + +호표는 구성 자원을 나열하고 각 행이 `수량 × 단가`로 성분별 금액을 만든다. 구성 자원은 **다른 호표를 참조할 수 있다.** + +```text +제 6 호표 기슭막이(깬잡석,찰쌓기 L3=45) H=2.0m + 깬잡석채집 2.09 M2 × 30,302 = 63,331 ← 다른 호표 + 깬잡석찰쌓기 2.09 M2 × 58,889 = 123,078 ← 제 1 호표 + 고임돌채집 0.31 M3 × 17,416 = 5,399 + … +``` + +`깬잡석찰쌓기 58,889`가 제 1 호표의 합계와 같다. **호표 사이에 참조가 걸리므로 위상순서로 계산해야 한다** — 09번 §3이 말한 의존 그래프가 실제로 필요하다. + +## 6. 이로써 바뀌는 판정 + +| 항목 | 15번의 판정 | 지금 | +|---|---|---| +| 중기 시간당 단가 재현 | ❌ 손료 계수가 어디에도 없음 | ✅ **호표에 손료율·취득가·연료·잡품률이 전부 있음** | +| 단가 조립 규칙 | ❌ `BDQTY` 암호화로 불가 | ✅ **출력 시트로 조립 규칙·반올림 확인됨** | +| 성분 소계 반올림 | 미확정 | ✅ **절사** (중기 398건 100%) | + +여전히 막힌 것은 **입력 쪽**이다. + +- `BDQTY`의 수량 **할증** 필드(`X_QTY`·`X_HAL`) 실값 — 출력에는 할증 후 수량만 남는다 +- 품셈에서 구성 수량이 **어떻게 뽑혔는가** +- 자재 6후보 중 **채택 규칙** + +## 7. 다음 + +1. 일위대가 호표 사이 **참조 그래프**를 복원해 위상순서 계산을 재현 — 지금 자료로 됨 +2. `단가산출근거` 시트 구조 확인 — 시트는 있으나 이번 구획 규칙으로는 안 잡힘 +3. 자재단가대비표 시트로 **6후보 채택** 단서 찾기 — 시트 이름이 이미 있음 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/machine_rate_extract.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/machine_rate_extract.py new file mode 100644 index 00000000..afa10a50 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/machine_rate_extract.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +"""중기사용료 호표에서 시간당 손료율·연료·잡품률을 뽑는다.""" +import sys, io, pathlib, warnings, re, collections +from decimal import Decimal as D +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore"); import openpyxl +def dec(v): + if v in (None,""): return None + try: return D(str(v)) + except Exception: return None +P = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서\04.산불 봉화\01. 내역서\2024년 산불진화임도 실시설계(기번41_현동)_ L=3.46km.xlsx") +ws = openpyxl.load_workbook(P, data_only=True)["중기사용료"] +rows=[list(r) for r in ws.iter_rows(min_row=1,max_row=ws.max_row,max_col=12,values_only=True)] +호표=[]; cur=None; title=None +for r in rows: + nm=(str(r[0]) if r[0] is not None else "").strip() + k=nm.replace(" ","") + if re.match(r"^제?\d+호표", k): cur=[]; title=None; 호표.append((None,cur)); continue + if cur is None: continue + if k=="합계": + 호표[-1]=(title,cur+[("SUM",r)]); cur=None; continue + if title is None and r[3] and not r[2]: + title=(nm, str(r[1] or "")); continue + cur.append(("ROW",r)) + +print("### 중기 시간당 사용료 구성 — 봉화 2024") +print("%-24s %-14s %9s %12s %10s %8s %8s" % ("장비","규격","손료율","취득가(천원)","손료(원)","연료L/h","잡품%")) +for title, blk in 호표: + if not title: continue + 손료율=취득가=연료=잡품=None + for k,r in blk: + if k!="ROW": continue + u=(str(r[3]) if r[3] else "").strip() + nm=(str(r[0]) if r[0] else "").strip() + if u=="천원": 손료율, 취득가 = dec(r[2]), dec(r[4]) + elif u=="L": 연료 = dec(r[2]) + elif u=="%" and "잡품" in nm: 잡품 = dec(r[2]) + if 손료율 is None: continue + print("%-24s %-14s %9s %12s %10s %8s %8s" % ( + title[0][:24], title[1][:14], 손료율, f"{취득가:,}" if 취득가 else "-", + f"{(손료율*취득가):,.1f}" if (손료율 and 취득가) else "-", + 연료 if 연료 is not None else "-", 잡품 if 잡품 is not None else "-")) + +print("\n### 잡품 = 주연료비 × 율 검산") +ok=bad=0 +for title, blk in 호표: + 연료액=None + for k,r in blk: + if k!="ROW": continue + u=(str(r[3]) if r[3] else "").strip(); nm=(str(r[0]) if r[0] else "").strip() + if u=="L": 연료액 = dec(r[9]) or dec(r[5]) + elif u=="%" and "잡품" in nm: + 율=dec(r[2]); 단=dec(r[4]); 금=dec(r[9]) or dec(r[5]) + if 연료액 is None or 율 is None: continue + exp = 연료액*율/100 + same_base = (단 == 연료액) + if abs(exp-(금 or D(0))) < D("0.05") and same_base: ok+=1 + else: bad+=1 +print(" 잡품 금액 = 연료비 × 율/100 : 일치 %d / 불일치 %d (잡품 단가칸 = 연료비)" % (ok,bad)) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/unit_assembly_check.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/unit_assembly_check.py new file mode 100644 index 00000000..f4ef0194 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/unit_assembly_check.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +"""호표 성분 소계의 반올림 방식을 가른다 — 절사 / 사사오입 / 은행가 / 원값.""" +import sys, io, pathlib, warnings, re, collections +from decimal import Decimal as D, ROUND_DOWN, ROUND_HALF_UP, ROUND_HALF_EVEN +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore"); import openpyxl +def q(x,m): return D(x).quantize(D(1), rounding=m) +def dec(v): + if v in (None,""): return D(0) + try: return D(str(v)) + except Exception: return D(0) +ROOT = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서") + +def scan(path, sheet, stat): + try: wb = openpyxl.load_workbook(path, data_only=True, read_only=True) + except Exception: return + if sheet not in wb.sheetnames: return + ws = wb[sheet] + rows=[list(r) for r in ws.iter_rows(min_row=1,max_row=ws.max_row,max_col=12,values_only=True)] + blk=None + for r in rows: + nm=(str(r[0]) if r[0] is not None else "").strip().replace(" ","") + if re.match(r"^제?\d+호표", nm): blk=[]; continue + if blk is None: continue + if nm=="합계": + # 합계행의 금액칸 위치를 찾는다: 성분 원합과 가장 가까운 칸 + for idx,lab in ((7,"노무"),(9,"재료"),(11,"경비")): + raw = sum(dec(c[idx]) for c in blk) + if raw == 0: continue + cands = {i: dec(r[i]) for i in (idx-1, idx) if r[i] is not None} + for rm, tag in ((ROUND_DOWN,"절사"),(ROUND_HALF_UP,"사사오입"),(ROUND_HALF_EVEN,"은행가")): + v = q(raw, rm) + if v in cands.values(): stat[(sheet,tag)] += 1 + if raw in cands.values(): stat[(sheet,"원값")] += 1 + stat[(sheet,"총")] += 1 + blk=None; continue + blk.append(r) + +stat = collections.Counter() +for p in ROOT.rglob("*.xlsx"): + if p.name.startswith("~$"): continue + for s in ("중기사용료","일위대가표"): scan(p, s, stat) + +for sheet in ("중기사용료","일위대가표"): + tot = stat[(sheet,"총")] + if not tot: continue + print("\n### %s — 성분 소계 %d건" % (sheet, tot)) + for tag in ("절사","사사오입","은행가","원값"): + n = stat[(sheet,tag)] + print(" %-8s %5d건 %5.1f%%" % (tag, n, 100*n/tot)) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index a6b764ec..82a6487c 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -42,6 +42,7 @@ | 14 | 최종 분석완료 보고서 | | 15 | **재구현 가능성 검증** — 무엇을 만들 수 있고 무엇이 막혀 있나 | | 16 | **골든셋 회귀 결과** — 원가계산을 다시 세워 원 단위로 맞춘 실증 | +| 17 | **단가조립 검증** — 일위대가·중기 시간당 사용료 구조, 손료율 실측 | ## 확정된 굵직한 것 From 017c5120b9f2761bffd6d214c9877e53874ee27d Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 12:29:19 +0900 Subject: [PATCH 06/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20STmate=20=EC=9E=90=EC=9E=AC=20=EC=B1=84=ED=83=9D=20=EA=B7=9C?= =?UTF-8?q?=EC=B9=99=20=ED=99=95=EC=A0=95=20=E2=80=94=200=20=EC=95=84?= =?UTF-8?q?=EB=8B=8C=20=ED=9B=84=EB=B3=B4=20=EC=A4=91=20=EC=B5=9C=EC=A0=80?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 07번이 C등급으로 두고 「최저가·최신가·특정 슬롯 우선 중 어느 하나라고 단정할 근거가 없다」 한 항목을 실증으로 확정. 출력 XLSX 의 자재단가대비표에 후보 다섯 칸(조달가격·물가자료·물가정보· 거래가격·견적단가)과 적용 단가·출처가 나란히 있어 직접 검정함. - 실무 6건 전수 186건 중 186건이 후보 최저가와 일치 - 후보 값이 2종 이상인 76건 전부 최저가 - 후보 값이 3종 이상인 36건 전부 최저가 - 최저가가 아닌 후보를 택한 건 0, 후보 밖 값을 쓴 건 0 곁들여 - COSTN 의 여섯 칸 중 여섯 번째가 적용 단가 칸으로 보임 - 후보 없이 적용만 있는 25건은 유가 자료, 적용 0 인 49건은 별도계상 - 남은 것은 사용자 수동 고정 시의 우선순위 (T10) 09번이 꼽은 여섯 호환성 차단점 중 자재 자동채택이 풀림. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 1 + .../07_규칙2_3_4_5_직접비_단가_중기_자재.md | 8 ++- .../STmate 분석/20_분석/17_단가조립_검증.md | 35 +++++++++- .../40_스크립트/material_adoption_test.py | 64 +++++++++++++++++++ 4 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/material_adoption_test.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index c16be6e5..7e6b7296 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -58,6 +58,7 @@ | 차수 인계 | 「가정하지 말 것」 경고만 | **A 실증** — `BOQ12`가 현재안, 다음 파일 차수1로 인계 | 16번 §4.5·§4.6, 08번 | | 중기 시간당 사용료 | 손료 계수 없음 | **A** — 손료율·취득가·연료·잡품률 25개 장비 실측 | 17번 §3·§4 | | 호표 성분 소계 반올림 | 미확정 | **A** — 절사 (중기 398건 100%) | 17번 §2 | +| 자재 6후보 자동채택 | C | **A 실증** — 0 아닌 후보 중 **최저가**. 복수후보 76/76 | 17번 §5.5, 07번 §5 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/07_규칙2_3_4_5_직접비_단가_중기_자재.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/07_규칙2_3_4_5_직접비_단가_중기_자재.md index e21330c2..c8ad48e1 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/07_규칙2_3_4_5_직접비_단가_중기_자재.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/07_규칙2_3_4_5_직접비_단가_중기_자재.md @@ -89,7 +89,13 @@ price_candidate(material_id, revision_id, slot_no, source_name, page, observed_p price_adoption(material_id, revision_id, chosen_slot_no?, adopted_price, method, user_override) ``` -자동선정은 현재 C등급이다. 최저가·최신가·특정 슬롯 우선 중 어느 하나라고 단정할 근거가 없다. 동일 구현 전에는 후보 조합을 통제한 STmate 시험이 필수다: 6개 슬롯에 서로 다른 값, 동률, 0, 공란을 배치하고 채택값과 `PG_1` 변화를 기록한다. +**2026-09-13 — 자동선정은 「0이 아닌 후보 중 최저가」로 확정됐다. A등급 실증.** + +출력 XLSX의 `자재단가대비표`에 후보 다섯 칸과 적용 단가·출처가 나란히 있어 직접 검정했다. 실무 6건 전수에서 **후보 값이 2종 이상인 76건 전부, 3종 이상인 36건 전부 최저가**였고, 최저가가 아닌 후보를 택한 건은 0이다. 상세는 17번 §5.5. + +`COSTN`의 여섯 칸 중 **여섯 번째가 적용 단가 칸**으로 보이며, 이는 「노무 L은 후보6과 채택가가 거의 일치」라는 위 관찰과 맞는다. + +남은 것은 **사용자 수동 고정이 걸렸을 때의 우선순위**다. 표본에는 수동 고정 흔적이 없었다. 통제시험(13번 T10)에서 6개 슬롯에 서로 다른 값·동률·0·공란을 배치하고 수동 고정을 섞어 채택값과 `PG_1` 변화를 기록한다. ## 6. 반올림 경계 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md index ed75c1d2..82fd72db 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md @@ -106,6 +106,38 @@ `깬잡석찰쌓기 58,889`가 제 1 호표의 합계와 같다. **호표 사이에 참조가 걸리므로 위상순서로 계산해야 한다** — 09번 §3이 말한 의존 그래프가 실제로 필요하다. +## 5.5 자재 채택 규칙 — **최저가**, A등급 실증 + +출력 XLSX의 `자재단가대비표` 시트에 **후보 다섯 칸과 적용 단가·출처가 나란히** 있다. + +```text +호표 | 명칭 | 규격 | 단위 | 조달가격 | 물가자료 | 물가정보 | 거래가격 | 견적단가 | 적용단가 | 출처 + 1 | 철못 | N 50 | KG | 0 | 1,665 | 1,935 | 1,680 | 0 | 1,665 | 물자 + 6 | PVC파이프 | VG1 | M | 0 | 4,327 | 4,702 | 3,475 | 0 | 3,475 | 거래 + 19 | 와이어메쉬 | #6 | M2 | 3,546 | 4,970 | 5,510 | 0 | 4,545 | 3,546 | 조달 +``` + +실무 프로젝트 6건 전수로 검정했다. + +| 구분 | 건수 | 적용단가 = 후보 최저 | +|---|---:|---:| +| 전체 (후보 1개 이상) | 186 | **186 (100%)** | +| **후보 값이 2종 이상** | 76 | **76 (100%)** | +| **후보 값이 3종 이상** | 36 | **36 (100%)** | +| 최저가가 아닌 후보를 택한 건 | — | **0** | +| 어느 후보와도 다른 건 | — | **0** | + +⇒ **자동채택은 「0이 아닌 후보 중 최저가」다.** 07번 §5가 「최저가·최신가·특정 슬롯 우선 중 어느 하나라고 단정할 근거가 없다」며 C등급으로 둔 항목이 **실증으로 확정**됐다. + +곁들여 확인된 것. + +- 후보 슬롯은 화면상 **다섯**(조달가격·물가자료·물가정보·거래가격·견적단가)이고, `COSTN`의 `AMT_11..AMT_61` 여섯 칸 중 **여섯 번째가 적용 단가 칸**으로 보인다. 07번이 「노무 L은 후보6과 채택가가 거의 일치」라 관찰한 것과 맞는다. +- 후보가 하나도 없는데 적용 단가만 있는 행이 25건 있다(경유·휘발유 등 **유가 자료**, 별도 배포 단가). +- 적용 단가가 0인 행 49건은 `별도계상`(이형철근·레미콘)·`조달수수료(재료비×0.54%)`처럼 **다른 자리에서 계산되는** 것이다. +- **출처 표시는 슬롯 이름의 축약**이다(물자=물가자료, 물정=물가정보, 거래, 조달, 견적). 슬롯 번호에 기관명을 코드로 박으면 안 된다는 07번 경고는 그대로 유효하다 — `Start8x.Ini`가 표시명을 바꾼다. + +⚠ **사용자 수동 고정이 있으면 이 규칙을 벗어난다.** 표본 6건에는 수동 고정 흔적이 없었을 뿐이며, 수동 우선순위는 여전히 통제시험(T10) 대상이다. + ## 6. 이로써 바뀌는 판정 | 항목 | 15번의 판정 | 지금 | @@ -113,12 +145,13 @@ | 중기 시간당 단가 재현 | ❌ 손료 계수가 어디에도 없음 | ✅ **호표에 손료율·취득가·연료·잡품률이 전부 있음** | | 단가 조립 규칙 | ❌ `BDQTY` 암호화로 불가 | ✅ **출력 시트로 조립 규칙·반올림 확인됨** | | 성분 소계 반올림 | 미확정 | ✅ **절사** (중기 398건 100%) | +| 자재 6후보 채택 | ❌ C등급, 규칙 없음 | ✅ **최저가** — 복수후보 76/76 | 여전히 막힌 것은 **입력 쪽**이다. - `BDQTY`의 수량 **할증** 필드(`X_QTY`·`X_HAL`) 실값 — 출력에는 할증 후 수량만 남는다 - 품셈에서 구성 수량이 **어떻게 뽑혔는가** -- 자재 6후보 중 **채택 규칙** +- 사용자가 **수동 고정**했을 때의 우선순위 (T10) ## 7. 다음 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/material_adoption_test.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/material_adoption_test.py new file mode 100644 index 00000000..51fbc708 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/material_adoption_test.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +"""자재 채택 규칙 검정 — 적용단가가 후보 중 무엇인가.""" +import sys, io, pathlib, warnings, collections +from decimal import Decimal as D +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore"); import openpyxl +def dec(v): + if v in (None,""): return None + try: return D(str(v)) + except Exception: return None +ROOT = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서") +SLOTS = [("조달가격",5),("물가자료",7),("물가정보",9),("거래가격",11),("견적단가",13)] +APPLY = 15 +stat = collections.Counter(); examples=[] +files=0 +for p in sorted(ROOT.rglob("*.xlsx")): + if p.name.startswith("~$"): continue + try: wb = openpyxl.load_workbook(p, data_only=True, read_only=True) + except Exception: continue + if "자재단가대비표" not in wb.sheetnames: continue + files += 1 + ws = wb["자재단가대비표"] + for row in ws.iter_rows(min_row=5, max_row=ws.max_row, max_col=17, values_only=True): + name = row[1] + if not name or not str(name).strip(): continue + cands = {nm: dec(row[i-1]) for nm,i in SLOTS} + nz = {k:v for k,v in cands.items() if v not in (None, D(0))} + app = dec(row[APPLY-1]); src = (str(row[APPLY]) if len(row)>APPLY and row[APPLY] else "").strip() + if app in (None, D(0)): + stat["적용단가 없음(별도계상 등)"] += 1; continue + if not nz: + stat["후보 없이 적용단가만(유가·별도자료)"] += 1; continue + mn = min(nz.values()); mx = max(nz.values()) + if len(set(nz.values())) >= 2: + stat["복수후보 총"] += 1 + if app == mn: stat["복수후보 최저"] += 1 + elif app in nz.values(): stat["복수후보 최저아닌 후보"] += 1 + else: stat["복수후보 후보밖"] += 1 + if len(set(nz.values())) >= 3: + stat["3개이상 총"] += 1 + if app == mn: stat["3개이상 최저"] += 1 + if app == mn: stat["최저가와 일치"] += 1 + elif app == mx: stat["최고가와 일치"] += 1 + elif app in nz.values(): stat["후보 중 하나지만 최저 아님"] += 1 + else: + stat["어느 후보와도 다름"] += 1 + if len(examples)<6: examples.append((p.stem[:26], str(name)[:18], nz, app, src)) + stat["총"] += 1 + +print("### 자재 채택 규칙 검정 — 파일 %d개" % files) +tot = stat["총"] +for k in ("최저가와 일치","후보 중 하나지만 최저 아님","최고가와 일치","어느 후보와도 다름"): + print(" %-24s %4d건 %5.1f%%" % (k, stat[k], 100*stat[k]/tot if tot else 0)) +print(" %-24s %4d건" % ("(후보 없이 적용만)", stat["후보 없이 적용단가만(유가·별도자료)"])) +print(" %-24s %4d건" % ("(적용단가 0/별도계상)", stat["적용단가 없음(별도계상 등)"])) +print(" ── 검정 대상 합계 %d건" % tot) +print() +for k in ("복수후보 총","복수후보 최저","복수후보 최저아닌 후보","복수후보 후보밖","3개이상 총","3개이상 최저"): + print(" %-22s %4d건" % (k, stat[k])) +if examples: + print("\n### 어느 후보와도 다른 예") + for f,n,nz,app,src in examples: + print(" %-26s %-18s 적용 %-10s 출처 %-6s 후보 %s" % (f,n,app,src, + ", ".join("%s=%s"%(k,v) for k,v in nz.items()))) From f45f5a9cd97adfccbe7db03668f06b4f9c24f303 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 12:29:43 +0900 Subject: [PATCH 07/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=2017=EB=B2=88=20=EB=8B=A4=EC=9D=8C=ED=95=A0=EC=9D=BC=EC=97=90?= =?UTF-8?q?=20=ED=98=B8=ED=99=98=EC=84=B1=20=EC=B0=A8=EB=8B=A8=EC=A0=90=20?= =?UTF-8?q?=EC=97=AC=EC=84=AF=20=ED=98=84=ED=99=A9=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../STmate 분석/20_분석/17_단가조립_검증.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md index 82fd72db..ae03b38e 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/17_단가조립_검증.md @@ -157,4 +157,13 @@ 1. 일위대가 호표 사이 **참조 그래프**를 복원해 위상순서 계산을 재현 — 지금 자료로 됨 2. `단가산출근거` 시트 구조 확인 — 시트는 있으나 이번 구획 규칙으로는 안 잡힘 -3. 자재단가대비표 시트로 **6후보 채택** 단서 찾기 — 시트 이름이 이미 있음 +3. 09번 §8이 꼽은 **여섯 호환성 차단점** 가운데 남은 것 정리 + +| # | 차단점 | 상태 | +|---:|---|---| +| 1 | RATE 좌표 라벨·경계 | ⚠ 보험 계열 6개 확정(15번 §4), 규모·기간 좌표는 남음 | +| 2 | `BDQTY` 세부 플래그 | ❌ 암호화 — 유일하게 손 못 댄 입력 | +| 3 | 자재 자동채택 우선순위 | ✅ **최저가 확정** (§5.5) | +| 4 | 중기 내부 절사 시점 | ✅ **성분별 절사 확정** (§2·§3) | +| 5 | UI 명령별 재계산 범위 | ❌ 통제시험 T8 | +| 6 | 일괄변경 수동값 우선순위 | ❌ 통제시험 T10 | From cd3aaef11792984f75b30fb1a5a3d7b3f56a33f6 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 12:42:53 +0900 Subject: [PATCH 08/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20=ED=86=B5=EC=A0=9C=EC=8B=9C=ED=97=98=20=EC=88=98=ED=96=89=20?= =?UTF-8?q?=EB=B6=88=EA=B0=80(=EB=9D=BC=EC=9D=B4=EC=84=A0=EC=8A=A4=20?= =?UTF-8?q?=EC=97=86=EC=9D=8C)=20=EB=B0=98=EC=98=81=20=C2=B7=20=EC=9A=94?= =?UTF-8?q?=EC=9C=A8=20=EB=91=90=20=EB=B6=80=EB=A5=98=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 전제 정정 - STmate 라이선스가 없어 13번 T1~T11 을 띄울 수 없음. 「나중에 시험으로 확정」 계획이 성립하지 않으므로 13번 머리에 못박고, 대체 경로 셋과 그것으로 이미 푼 것을 적음. 목록 자체는 장부 겸 절차서로 남김 - 남은 것을 늘릴 유일한 수단은 표본 늘리기. 특히 수공(S)·실적(TA/SA) 형식 표본이 하나도 없어 그 세 형식은 전혀 검증되지 않음 통제시험 없이 새로 밝힌 것 - 요율 항목이 두 부류임. 고정 칸(보험·산안비·이윤)과 규모·기간에 따라 행이 움직이는 것(간접노무비·기타경비·일반관리비). 뒤쪽은 고정 좌표라는 모델 자체가 틀림 - 이윤 좌표 RATE_R[20,16] 확정 (3건 일치) - 요율이 그 프로젝트 표에 아예 없는 경우가 실재함. 간선임도 간접노무비 14.5%, 소광 이윤 13.435% 가 자기 RATE_R 에 없음 = 사용자 수동 입력. 재구현은 rate_source 를 table(coord)/manual 로 갈라 저장해야 함 교차검증 스크립트 2개 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 3 + .../STmate 분석/20_분석/13_통제시험_목록.md | 27 +++++- .../20_분석/15_재구현_가능성_검증.md | 35 +++++++- .../40_스크립트/t1_band_column_test.py | 27 ++++++ .../t1_cross_project_consistency.py | 85 +++++++++++++++++++ 5 files changed, 173 insertions(+), 4 deletions(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_band_column_test.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_cross_project_consistency.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 7e6b7296..79ea582e 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -59,6 +59,9 @@ | 중기 시간당 사용료 | 손료 계수 없음 | **A** — 손료율·취득가·연료·잡품률 25개 장비 실측 | 17번 §3·§4 | | 호표 성분 소계 반올림 | 미확정 | **A** — 절사 (중기 398건 100%) | 17번 §2 | | 자재 6후보 자동채택 | C | **A 실증** — 0 아닌 후보 중 **최저가**. 복수후보 76/76 | 17번 §5.5, 07번 §5 | +| 이윤 요율 좌표 | 미확정 | **A** — `RATE_R[20,16]`, 3건 일치 | 15번 §4 | +| 요율의 출처 | 표에서 고른다고 가정 | **표에 없는 요율이 실재** — 사용자 수동 입력 경로 필수 | 15번 §4 | +| 통제시험 T1~T11 | 「나중에 수행」 | **수행 불가 — STmate 라이선스 없음.** 표본 늘리기가 유일한 확장 수단 | 13번 머리, 15번 §6 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/13_통제시험_목록.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/13_통제시험_목록.md index e707a4ea..687f2d74 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/13_통제시험_목록.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/13_통제시험_목록.md @@ -2,8 +2,31 @@ > 정적 분석만으로는 확정할 수 없는 경계를 **시험 단위로 갈라 놓은 유일한 목록**이다. 05~12번 문서에 흩어져 있던 "미확정·C등급" 항목을 여기로 모았다. 각 문서는 이제 이 목록을 가리킨다. -기준일: 2026-09-13 -대상: `C:\경영정보(주)` — **원본은 읽기만 한다.** 시험은 프로젝트 **복제본**에서 한다. +기준일: 2026-09-13 (전제 갱신 2026-09-13) +대상: `C:\경영정보(주)` — **원본은 읽기만 한다.** + +## ⛔ 전제 정정 — 이 시험들은 **실행할 수 없다** + +**STmate 라이선스가 없어 프로그램을 띄울 수 없다.** 따라서 아래 T1~T11은 **수행 불가**이며, 「나중에 시험으로 확정한다」는 계획은 성립하지 않는다. + +이 목록은 버리지 않고 **두 가지 용도로 남긴다.** + +1. **무엇이 왜 확정 불가인지**를 항목별로 밝혀 둔 장부 — 어떤 값이 「모르는 것」인지 분명히 해 두어야 Aislo가 그 자리를 정책 플래그로 열어 둘 수 있다. +2. **라이선스가 생기거나 실무자가 대신 눌러 줄 수 있게 되면** 그대로 쓸 절차서. + +**대신 쓸 수 있는 길**은 세 갈래이며, 이미 상당 부분 성과가 났다. + +| 대체 경로 | 무엇을 풀었나 | +|---|---| +| **출력 XLSX 역추적** — 비고 칸에 밑수·요율이 적혀 있음 | 보험 요율 좌표 6개, 이윤 좌표 (15번 §4) | +| **골든셋 회귀** — 내역으로 원가계산을 다시 세워 대조 | 원가계산 전 과정, 끝전조정, 차수 규칙 (16번) | +| **출력 시트 전수 검정** — 일위대가·중기·자재단가대비표 | 성분 절사, 중기 손료율, 자재 채택=최저가 (17번) | + +**표본을 늘리는 것이 통제시험을 대신하는 유일한 확장 수단이다.** 프로젝트마다 공사규모·기간·공종이 다르므로, 표본이 늘수록 좌표와 조건이 저절로 좁혀진다. + +--- + +아래는 라이선스가 생겼을 때를 위한 원 절차서다. 시험은 프로젝트 **복제본**에서 한다. ## 0. 왜 시험이 필요한가 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md index 24988258..66a04c32 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md @@ -109,9 +109,32 @@ A등급 불변조건으로 적혀 있으나 실데이터에 **59행 중 2행이 ⇒ **`RATE_R`의 행 45~49는 요율 행렬이 아니라 부속표 영역**이고, 행 0~44가 규모·기간 행렬임. -### 아직 좌표가 안 갈리는 항목 +### 항목이 두 부류로 갈림 — 통제시험 없이 밝힌 것 -`연금보험료(4.5%)`·`일반관리비(6%)`·`이윤(15%)`·`환경보전비(0.8%)`·`부가가치세(10%)`는 **같은 값이 표 안 여러 곳에 있어** 단독으로는 못 가름. 확정하려면 **한 프로젝트에서 그 값만 특이한 숫자로 바꿔 저장**하는 통제시험이 필요함(13번 T1). +프로젝트 5건의 요율을 각자의 `RATE_*` 표에 겹쳐 보면 항목이 두 갈래로 나뉨. + +**① 고정 칸** — 공사규모·기간과 무관. 전 프로젝트에서 같은 좌표. + +```text +산재보험료 RATE_R[45, 1] 건강보험료 RATE_R[46, 1] +연금보험료 RATE_R[46, 6] 장기요양 RATE_R[46, 11] +고용보험 등급1~7 RATE_R[45, 11..17] +산업안전보건관리비 RATE_R[20, 17] 율 · [20, 18] 기초액 ← 3건 전부 유일 +이윤 RATE_R[20, 16] ← 3건 전부 일치 +``` + +**② 규모·기간에 따라 칸이 움직임** — 간접노무비·기타경비·일반관리비. 전 프로젝트에 공통인 좌표가 **없음.** 행이 `(공사규모 밴드, 공사기간 밴드)`로 정해지므로 고정 좌표라는 모델 자체가 틀림. 열은 공종(토목·산설·조경·건축·산설건축)이고 행이 움직인다. + +### ⚠ 요율이 표에 아예 없는 경우가 실재함 + +| 프로젝트 | 항목 | 쓴 요율 | 그 프로젝트 `RATE_R` 안에 | +|---|---|---:|---| +| 2024 간선임도 (기번3) | 간접노무비 | 14.5% | **없음** | +| 2025 소광 (기번8) | 이윤 | 13.435% | **없음** | + +즉 **사용자가 표를 거치지 않고 요율을 직접 써 넣은 것**이다. 11번 §8이 「순환이 생기면 사용자 수동 확정으로 넘긴다」고 한 경로가 실데이터에 그대로 나타났다. + +**재구현 필수 조건** — 요율을 표에서 못 찾았다고 오류로 막으면 안 된다. `rate_source ∈ {table(coord), manual}` 을 항상 함께 저장하고, 수동값이면 좌표 없이 값만 보존해야 한다. ## 5. 그래서 무엇을 만들 수 있나 @@ -142,6 +165,14 @@ A등급 불변조건으로 적혀 있으나 실데이터에 **59행 중 2행이 **Aislo 목적으로는 필요한 정보가 모였음.** 「STmate 복제」는 애초에 불가능하고 목표도 아님. +### ⛔ 통제시험은 못 함 — 라이선스 없음 + +13번의 T1~T11은 **STmate를 띄워야 하는데 라이선스가 없어 수행 불가**다. 따라서 「나중에 시험으로 확정」이라 미뤄 둔 항목은 **다른 길로 풀거나, 모르는 채로 두고 Aislo에서 정책으로 여는 수밖에 없다.** + +실제로 대체 경로가 잘 들었다 — 출력 XLSX 역추적·골든셋 회귀·출력 시트 전수 검정으로 09번이 꼽은 여섯 차단점 중 **둘을 완전히, 하나를 절반** 풀었다(17번 §7). + +**남은 것을 늘릴 방법은 표본을 늘리는 것 하나뿐이다.** 공사규모·기간·공종·계산형식이 다른 프로젝트가 들어올수록 좌표와 조건이 저절로 좁혀진다. 특히 **수공형식(`S`)·실적형식(`TA`/`SA`) 표본이 하나도 없어** 그 세 형식은 지금 전혀 검증되지 않았다. + ## 7. 다음에 할 것 | 순위 | 할 일 | 왜 | diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_band_column_test.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_band_column_test.py new file mode 100644 index 00000000..c02d4377 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_band_column_test.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +import sys, io, pathlib, re, zipfile, struct, collections, warnings, difflib +warnings.filterwarnings("ignore"); import openpyxl +SRC = open(r"C:\Users\umsan\AppData\Local\Temp\claude\D--aislo-wt-sub\df75230a-b05b-4088-ad34-bb0c9da0a312\scratchpad\t1_consist.py", + encoding="utf-8").read().split("items = collections.Counter()")[0] +SRC = SRC.replace('sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")','') +SRC = "\n".join(l for l in SRC.split("\n") if not l.strip().startswith("print(")) +ns = {} +exec(SRC, ns) +per = ns["per"]; tabs_by_proj = ns["tabs_by_proj"] +out = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +def P(*a): print(*a, file=out) +P("### 규모·기간 의존 항목 — 열이 고정인가 (RATE_R 행 0~44 안)") +for lab in ("간접노무비","기타경비","일반관리비","이윤"): + vals = {k: per[k][lab] for k in per if lab in per[k]} + if len(vals) < 3: continue + colsets=[]; detail=[] + for k,v in vals.items(): + M = tabs_by_proj[k].get("RATE_R") or [] + hits = {(i,j+1) for i,row in enumerate(M[:45]) for j,x in enumerate(row) if x and abs(x-v)<1e-6} + colsets.append({c for _,c in hits}); detail.append((k,v,sorted(hits)[:6])) + common = set.intersection(*colsets) if colsets else set() + P("\n■ %s 관측 %d건, 값 %s" % (lab, len(vals), sorted({v for v in vals.values()}))) + P(" 모든 프로젝트 공통 열: %s" % (sorted(common) or "없음")) + for k,v,h in detail: + P(" %-30s %7.3f%% %s" % (k[:30], v, ", ".join("(%d,%d)"%x for x in h) or "없음")) +out.flush() diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_cross_project_consistency.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_cross_project_consistency.py new file mode 100644 index 00000000..df868766 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/t1_cross_project_consistency.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +"""T1 대체 — 통제시험 없이, 모든 프로젝트에서 동시에 성립하는 좌표만 남긴다.""" +import sys, io, pathlib, re, zipfile, struct, collections, warnings, difflib +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore"); import openpyxl +ROOT = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서") +def dbf(zf,name): + b=zf.read(name); nrec,hlen,rlen=struct.unpack_from("bs: bs,best=s,x + if best and bs>0.55: pairs.append((stc,best)) + +# 항목 -> {프로젝트: 요율} +per = {} +tabs_by_proj = {} +for stc,xp in pairs: + try: r = rates(xp) + except Exception: continue + if not r: continue + z = zipfile.ZipFile(stc); tabs={} + for n in z.namelist(): + if re.match(r"RATE.*\.DBF$", n, re.I): + try: tabs[n.upper().replace(".DBF","")] = dbf(z,n) + except Exception: pass + key = stc.stem[:28] + tabs_by_proj[key]=tabs; per[key]=r + +items = collections.Counter() +for k,r in per.items(): + for lab in r: items[lab]+=1 +print("프로젝트 %d건, 항목별 관측 수" % len(per)) +print() +print("%-22s %5s %6s %s" % ("항목","관측","값종류","전 프로젝트에서 동시에 맞는 좌표")) +print("-"*96) +for lab, cnt in items.most_common(): + vals = {k: per[k][lab] for k in per if lab in per[k]} + if len(vals) < 3: continue + # 후보 좌표: 첫 프로젝트에서 값이 맞는 모든 자리 + first = next(iter(vals)) + cand = set() + for tn, M in tabs_by_proj[first].items(): + for i,row in enumerate(M): + for j,x in enumerate(row): + if x and abs(x-vals[first])<1e-6: cand.add((tn,i,j)) + for k in list(vals)[1:]: + keep=set() + for (tn,i,j) in cand: + M = tabs_by_proj[k].get(tn) + if M and i4: s += " …외 %d" % (len(cand)-4) + print("%-22s %5d %6d %s" % (lab[:22], len(vals), nv, s)) From 94a9412ac8eed184ceb18b0f8ddeba399c8bf7c0 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 13:16:49 +0900 Subject: [PATCH 09/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20=EB=88=84=EB=9D=BD=20=EA=B3=84=EC=82=B0=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=A0=90=EA=B2=80=20=E2=80=94=20=EC=82=AC=EC=8A=AC=20=EC=95=9E?= =?UTF-8?q?=EC=AA=BD=20=EB=84=A4=20=EC=B9=B8=EC=9D=84=20=EC=B1=84=EC=9B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 출력 XLSX 21개 시트 중 검증한 것이 4개뿐이었음. 나머지를 전부 열어 본 결과 계산 사슬 앞쪽이 통째로 비어 있었음. 채운 것 - 노임 일단가 -> 시간당 환산식. 환율및기초자료 시트에 식이 있고 INITIAL 의 RXNM_ 에 문자열로 저장됨. 적용 직종은 COND_ - ⚠ 식은 좌에서 우로 차례로 평가해야 함. 계수를 먼저 곱하면 부동소수점 때문에 1원 틀어짐. 18건 중 좌우순차 18/18, 계수선계산 14/18 - 단가산출 D코드 공식. Q = 3600*q*K*f*E/Cm 로 시간당 작업량을 내고 성분단가 = 절사(중기 시간당 성분단가 / Q, 소수1). Q 는 소수2 로 먼저 확정. 73개 호표에서 발견. 품셈 근거·토질·조합기준이 문자열로 남아 있음 - 계산 설정 스냅샷이 출력 XLSX 의 INITIAL 시트에 통째로 있음. 12번이 「화면 없이는 재현 불가」라 한 것을 정정. JMKN6 = 적용 단가 확인 - 집계표 행 금액은 사사오입 100%. 호표 성분 소계(절사)와 다른 자리임을 수치로 가름 문서 18 신규, 검증 스크립트 2개 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 6 + .../20_분석/15_재구현_가능성_검증.md | 3 + .../20_분석/18_누락_계산로직_점검.md | 152 ++++++++++++++++++ .../40_스크립트/unit_derivation_check.py | 47 ++++++ .../40_스크립트/wage_hourly_check.py | 66 ++++++++ .../경쟁사 프로그램/STmate 분석/README.md | 2 + 6 files changed, 276 insertions(+) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/18_누락_계산로직_점검.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/unit_derivation_check.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/wage_hourly_check.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 79ea582e..4223eb1e 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -24,6 +24,7 @@ | 15 재구현 가능성 검증 | **무엇을 만들 수 있고 무엇이 막혀 있나** — 층별 확보표, 문서 오류 정정, T1 좌표 확정 | https://share.onorca.dev/a/t6HGy0HlbEBl | | 16 골든셋 회귀 결과 | **원가계산을 다시 세워 원 단위로 맞춘 실증** — 프로젝트 6건 전 항목 일치 | (저장소 파일) | | 17 단가조립 검증 | **일위대가·중기 시간당 사용료 구조와 손료율 실측** | (저장소 파일) | +| 18 누락 계산로직 점검 | **사슬에 빠진 칸 찾기** — 노임 환산식·단가산출 Q식·설정 스냅샷·집계표 반올림 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -62,6 +63,11 @@ | 이윤 요율 좌표 | 미확정 | **A** — `RATE_R[20,16]`, 3건 일치 | 15번 §4 | | 요율의 출처 | 표에서 고른다고 가정 | **표에 없는 요율이 실재** — 사용자 수동 입력 경로 필수 | 15번 §4 | | 통제시험 T1~T11 | 「나중에 수행」 | **수행 불가 — STmate 라이선스 없음.** 표본 늘리기가 유일한 확장 수단 | 13번 머리, 15번 §6 | +| 노임 시간당 환산 | **문서에 없었음** | **A** — `일노임 × 설정식`, 식은 `RXNM_`에 문자열 저장 | 18번 §2.1 | +| 식 평가 순서 | 명시 없음 | **A** — **좌→우 순차.** 계수를 먼저 곱하면 1원 틀림 | 18번 §2.1 | +| 단가산출 `D`코드 | **문서에 없었음** | **A** — `Q=3600qKfE/Cm`, 성분 = 절사(시간단가/Q, 소수1) | 18번 §2.2 | +| 계산 설정 스냅샷 | 「화면 없이 재현 불가」 | **출력 XLSX `〓 INITIAL 〓` 에 있음** | 18번 §2.3 | +| 집계표 행 금액 | 서술만 | **A** — 사사오입 100%. 호표 성분 소계(절사)와 다른 자리 | 18번 §2.4 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md index 66a04c32..fc873652 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/15_재구현_가능성_검증.md @@ -27,6 +27,9 @@ Aislo 입장에서는 이것으로 충분함 — Aislo는 **자기 기초단가 | | 표준시장단가 `*.CSTA` 4,921~4,961건 × 6 | **본문 암호화** | ❌ | | | `*.STBSC` 28개 (노임·기계경비 배포) | ZIP 컨테이너, 내부 암호 | ❌ | | **3 단가 계산** | `COSTN.DBF` 단가 네 성분 | **평문 — 읽힘** | ✅ | +| | 노임 일→시간 환산식 | **`환율및기초자료` 시트 + `RXNM_` 설정** (18번) | ✅ | +| | 단가산출 `D`코드 Q식·품셈 인자 | **`단가산출근거` 시트 3,889행** (18번) | ✅ | +| | 계산 설정 스냅샷 | **`〓 INITIAL 〓` 시트** (18번) | ✅ | | | `COSTN.SMT` 구성 토큰 | 평문, 문법 문서화됨 | ✅ | | | 중기 시간당 손료율·연료·잡품률 | **출력 `중기사용료` 시트에 전부 있음** (17번) | ✅ | | | 자재 6후보 중 자동채택 규칙 | C등급 | ❌ | diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/18_누락_계산로직_점검.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/18_누락_계산로직_점검.md new file mode 100644 index 00000000..7ff179cc --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/18_누락_계산로직_점검.md @@ -0,0 +1,152 @@ +# 누락 계산로직 점검 — 사슬에 빠진 칸 찾기 + +점검일: 2026-09-13 +방법: STmate 출력 XLSX의 **21개 시트를 하나씩 세어**, 계산이 일어나는 시트 가운데 아직 확인하지 않은 것을 모두 열어 봄. +재현 스크립트: `40_스크립트/wage_hourly_check.py`, `unit_derivation_check.py` + +## 1. 점검 전 상태 + +21개 시트 중 **검증한 것은 4개뿐**이었다. + +| 확인함 | 미확인 | +|---|---| +| 공사원가계산서 · 설계내역서 · 일위대가표 · 중기사용료 · 자재단가대비표 | **총괄설계내역서 · 일위대가목록표 · 단가산출근거(3,889행) · 단가산출근거목록표 · 환율및기초자료 · 중기목록표 · 집계표 4종 · 목록표 3종 · 〓 INITIAL 〓** | + +가장 큰 시트인 **`단가산출근거` 3,889행이 통째로 미확인**이었다. + +## 2. 빠져 있던 것 넷 + +### 2.1 노임 시간당 환산식 — 완전 미문서화였음 + +`환율및기초자료` 시트에 **일 노임을 시간당으로 바꾸는 식이 그대로** 있다. + +```text +건설기계운전사 267,360 × 1/8*16/12*25/20 → 55,700 (L00008) +화물차운전사 226,709 × 1/8*16/12*25/20 → 47,231 (L00009) +일반기계운전사 161,142 × 1/8*16/12*25/20 → 33,571 (L00010) +``` + +식은 **프로젝트 설정에 문자열로 저장**된다 — `〓 INITIAL 〓` 의 `RXNM_ = 1/8*16/12*25/20`, 적용 직종은 `COND_ = L00008L00009L00010`(코드 11자리씩 이어 붙임). + +**중기사용료의 「운전원 55,700」이 어디서 왔는지가 이것으로 풀린다.** 지금까지는 주어진 값으로만 놓고 있었다. + +#### ⚠ 왼쪽부터 차례로 계산해야 한다 — 안 그러면 1원 틀림 + +| 직종 | 일 노임 | 계수를 먼저 곱함 | **왼쪽부터 차례로** | 출력 | +|---|---:|---:|---:|---:| +| 건설기계운전사 | 267,360 | 55,699 ✗ | **55,700** ✅ | 55,700 | +| 화물차운전사 | 226,709 | 47,231 | 47,231 | 47,231 | +| 일반기계운전사 | 161,142 | 33,571 | 33,571 | 33,571 | + +`1/8*16/12*25/20`을 배정밀도로 미리 곱하면 `0.20833333333333331`이 되어 `267,360 × 계수 = 55,699.9999…` → 절사 시 **55,699**가 된다. 왼쪽부터 차례로 하면 `267360/8=33420 → ×16=534720 → /12=44560 → ×25=1,114,000 → /20=55,700`으로 **모든 단계가 정수**라 정확히 맞는다. + +프로젝트 6건 × 직종 3개 = 18건 전부, **왼쪽부터 계산했을 때만 18/18 일치**한다(계수 선계산은 14/18). + +⇒ **재구현 규칙: 설정에 저장된 식 문자열을 그대로 좌→우 순차 평가할 것. 계수로 접어 두지 말 것.** 11번 §4.1의 `evaluate(template, …)` 계약에 이 조건을 명시해야 한다. + +### 2.2 단가산출(`D` 코드) 공식 — 가장 큰 누락 + +`단가산출근거` 3,889행에 **품셈 근거와 기계 작업량 식이 전부** 있다. + +```text +제 2호표 구조물 터파기(토사) 굴삭기 0.2m3 / m3 + 건설표준품셈 3-1-3(터파기), 11-3(굴삭기) 적용 + 적용토질 : 자갈썩인 기계 및 인력 조합기준 : 기계100% + + q = 0.2 , f = 1/1.175 = 0.85 , K = 0.7 + Cm = 15 sec (90°) , E = 0.60-0.05 = 0.55 + Q = 3600*q*K*f*E/Cm = 15.71 m3/hr + + 노 무 비 : 55,700 / Q = 3,545.5 + 재 료 비 : 7,701 / Q = 490.1 + 경 비 : 13,041 / Q = 830.1 + 소계 4,865.7 +``` + +**구조** + +```text +Q(시간당 작업량) = 3600 × q × K × f × E / Cm +단가 성분[k] = 절사( 중기 시간당 성분단가[k] / Q , 소수 1자리 ) +단가 소계 = 성분 셋의 합 (소수 1자리 유지) +내역에 실릴 때 정수로 절사 +``` + +- `55,700 / 7,701 / 13,041`은 **중기사용료 제1호표(굴삭기 0.2㎥)의 노무·재료·경비 합계** 그대로다. 즉 `중기사용료 → 단가산출 → 일위대가 → 내역`으로 값이 이어진다. +- **`Q`는 소수 2자리로 먼저 확정한 뒤 나눈다.** 원값으로 나누면 어긋난다 (`55,700/15.708 = 3,545.96` ≠ `55,700/15.71 = 3,545.5`). +- 성분단가는 **소수 1자리 절사**다. 6개 프로젝트 211건 중 137건(64.9%)이 이 규칙으로 설명되고, 나머지는 한 호표에 `Q`가 둘 이상인 기계조합 호표라 자동 구획이 어긋난 것이다. + +`Q`식은 73개 호표에서 발견됐다. 토질·조합기준·버킷계수 같은 **품셈 인자가 문자열로 남아 있어**, `BDQTY`가 암호화돼 있어도 **무엇을 근거로 그 수량이 나왔는지는 읽힌다.** + +### 2.3 `〓 INITIAL 〓` — 계산 설정 스냅샷이 출력에 들어 있다 + +12번 §10은 「이 설정 스냅샷 없이는 같은 원본 내역으로도 원가계산 결과를 재현할 수 없다」고 적었다. **그 스냅샷이 출력 XLSX 안에 있다.** + +```text +[공사정보] 33개 M_VER 24.02 · PNAME · PCLAS · SCLAS · K_ORD · PRIPR · ACTYP 1 · ACTOP 2 +[초기값] 52개 P_ORD · EXNM_(환율 8칸) · EXRNM · RXNM_(노임 환산식) · COND_(적용 직종) + KCDNM · JCDNM · ECDNM · ACDNM · BPNNM · ZCDNM + CHGNM · CHBNM · CHNNM · CUTNM · OPTNM(SML) · S_JDA · SUBNM(발주청) +[인쇄정보] 75개 BMSTR · BMKNM(TLMS) · JEMNM(123456) + JMKN1..6 = 조달가격/조달 · 물가자료/물자 · 물가정보/물정 · 거래가격/거래 + · 견적단가/견적 · **적용 단가** + CAP_* 열 제목 13개 +[PREPARE] PREP_VER · PREP_COP(작성기관) · PREP_DATE +``` + +곁들여 확정된 것 둘. + +- **`JMKN6 = 적용 단가`** — 후보 슬롯이 다섯이고 **여섯 번째가 채택가 칸**이라는 17번 §5.5의 추정이 확인됐다. +- **슬롯 이름은 프로젝트 설정에 들어 있다** — 07번이 「슬롯 번호에 가격지 이름을 코드로 고정하지 말라」고 한 경고의 근거가 여기다. + +### 2.4 집계표 반올림 = **사사오입**, 절사 아님 + +호표 성분 소계(절사)와 **다른 자리**임을 수치로 갈랐다. + +| 시트 | 표본 | 사사오입 | 은행가 | 절사 | +|---|---:|---:|---:|---:| +| 재료비수량금액집계표 | 169 | **169 (100%)** | 167 (99%) | 134 (79%) | +| 노무비수량금액집계표 | 62 | **62 (100%)** | 62 (100%) | 32 (52%) | +| 경비수량금액집계표 | 10 | **10 (100%)** | 10 (100%) | 6 (60%) | + +**사사오입만 전건을 설명한다.** 재료비집계표 2건이 은행가와 갈려 둘을 구분해 준다. 07번 §6의 「집계표 = `ROUND`」가 실측으로 확인됐고, 17번 §2의 「호표 성분 소계 = 절사」와 **자리가 다르다**는 점이 분명해졌다. + +## 3. 이로써 드러난 전체 계산 사슬 + +```text +① 일 노임 ─ 설정 식(좌→우 순차) ─→ 시간당 노임 +② 취득가 · 손료율 · 연료 · 잡품률 ──────→ 중기 시간당 사용료 (성분별 절사) +③ 품셈 인자 q·K·f·E·Cm ─ Q=3600qKfE/Cm ─→ 단가산출 D코드 + 성분/Q, 소수1 절사 +④ 자원 · D코드 · 다른 호표 ────────────→ 일위대가 B코드 (성분별 절사) +⑤ 설계수량 × 단가 ─ ROUNDDOWN(정수) ───→ 내역 행 +⑥ 내역 계층 합산 ─ C* 구역 제외 ───────→ 직접비 +⑦ 밑수 × 요율 ─ 행마다 절사, 앞 행 결과를 뒤 행이 참조 ─→ 간접비 +⑧ 일반관리비 → 이윤 → 끝전조정 → 부가세 → 관급(천원 올림) → 총공사비 + (집계표 출력만 사사오입, 나머지는 절사) +``` + +**①~④가 이번에 채워진 칸이다.** 그전에는 ⑤부터만 검증돼 있었다. + +## 4. 아직 안 본 시트 + +계산이 아니라 **목록·표지** 성격이라 우선순위가 낮다. + +| 시트 | 성격 | +|---|---| +| 총괄설계내역서 | 내역서의 공종 상위 집계 — ⑥의 다른 표현 | +| 일위대가목록표 · 단가산출근거목록표 · 중기목록표 | 호표 번호와 이름 색인 | +| 재료비목록표 · 노무비목록표 · 경비목록표 | 자원 코드·단가 색인 | +| 〓 목 차 〓 · ※※안내※※ | 표지 | + +**중기시간금액집계표**는 표본에서 수량·단가·금액 세 쌍을 못 잡아 반올림 판정이 비었다. 다음에 열 위치를 맞춰 다시 볼 것. + +## 5. 이번 점검이 바꾸는 것 + +| 항목 | 이전 | 지금 | +|---|---|---| +| 노임 시간당 환산 | **문서에 없음** | ✅ 식·저장 위치·평가 순서까지 확정 | +| 식 평가 방식 | 명시 없음 | ✅ **좌→우 순차** (계수 선계산 금지) | +| 단가산출 `D`코드 | **문서에 없음** | ✅ Q식·나눗셈·소수1 절사 | +| 계산 설정 스냅샷 | 「화면 없이는 재현 불가」 | ✅ **출력 XLSX `〓 INITIAL 〓` 에 있음** | +| 집계표 반올림 | 서술만 | ✅ **사사오입 100%** — 호표 절사와 다른 자리 | diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/unit_derivation_check.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/unit_derivation_check.py new file mode 100644 index 00000000..8dcf8a5a --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/unit_derivation_check.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +"""단가산출근거 — Q식과 성분단가 = 시간단가/Q 의 반올림 규칙을 전수 확인.""" +import sys, io, pathlib, warnings, re, collections +from decimal import Decimal as D, ROUND_DOWN, ROUND_HALF_UP +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore"); import openpyxl +ROOT = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서") +NUM = r"([\d,]+(?:\.\d+)?)" +RE_Q = re.compile(r"Q\s*=\s*([0-9.*/\sqKfECm+\-]+?)\s*=\s*"+NUM) +RE_C = re.compile(r"(노\s*무\s*비|재\s*료\s*비|경\s*비)\s*:\s*"+NUM+r"\s*/\s*Q\s*=\s*"+NUM) +def d(s): return D(s.replace(",","")) + +stat=collections.Counter(); ex=[] +for p in sorted(ROOT.rglob("*.xlsx")): + if p.name.startswith("~$"): continue + try: wb=openpyxl.load_workbook(p,data_only=True,read_only=True) + except Exception: continue + if "단가산출근거" not in wb.sheetnames: continue + curQ=None + for row in wb["단가산출근거"].iter_rows(min_row=1,max_row=wb["단가산출근거"].max_row,max_col=3,values_only=True): + txt = " ".join(str(c) for c in row[:2] if isinstance(c,str)) + if not txt: continue + if re.search(r"제\s*\d+\s*호표", txt): curQ=None; continue + m=RE_Q.search(txt) + if m: + curQ = d(m.group(2)); stat["Q식 발견"]+=1; continue + for mm in RE_C.finditer(txt): + if curQ in (None, D(0)): continue + 시간단가 = d(mm.group(2)); 결과 = d(mm.group(3)) + raw = 시간단가/curQ + for pl,tag in ((1,"소수1"),(0,"정수")): + for rm,rt in ((ROUND_DOWN,"절사"),(ROUND_HALF_UP,"사사오입")): + if raw.quantize(D(1).scaleb(-pl), rounding=rm) == 결과: stat[(tag,rt)]+=1 + stat["성분 총"]+=1 + if len(ex)<4 and raw.quantize(D("0.1"),rounding=ROUND_DOWN)!=결과: + ex.append((p.stem[:22], 시간단가, curQ, raw, 결과)) + +print("### 단가산출근거 — Q식과 성분단가") +print(" Q식 발견 %d개, 성분단가 식 %d개" % (stat["Q식 발견"], stat["성분 총"])) +t=stat["성분 총"] +if t: + print("\n 성분단가 = 시간당 성분단가 / Q 의 반올림") + for pl in ("소수1","정수"): + for rt in ("절사","사사오입"): + n=stat[(pl,rt)] + print(" %-5s %-5s %5d건 %5.1f%%" % (pl, rt, n, 100*n/t)) +for e in ex: print(" ✗ %-22s %s / %s = %s ≠ %s" % e) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/wage_hourly_check.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/wage_hourly_check.py new file mode 100644 index 00000000..eae6062d --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/wage_hourly_check.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +"""누락 확인 ① 노임 시간당 환산식 ② 집계표 반올림 ③ INITIAL 설정""" +import sys, io, pathlib, warnings, re, collections +from decimal import Decimal as D, ROUND_DOWN, ROUND_HALF_UP, ROUND_HALF_EVEN +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore"); import openpyxl +def dec(v): + if v in (None,""): return None + try: return D(str(v)) + except Exception: return None +def q(x,m): return D(x).quantize(D(1), rounding=m) +ROOT = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서") +XL=[p for p in sorted(ROOT.rglob("*.xlsx")) if not p.name.startswith("~$")] + +print("### ① 노임 시간당 환산식 — 환율및기초자료 시트") +for p in XL: + try: wb=openpyxl.load_workbook(p,data_only=True,read_only=True) + except Exception: continue + if "환율및기초자료" not in wb.sheetnames: continue + ws=wb["환율및기초자료"] + rows=[list(r) for r in ws.iter_rows(min_row=1,max_row=ws.max_row,max_col=10,values_only=True)] + print("\n-- %s" % p.stem[:52]) + for r in rows: + nm = r[2] if len(r)>2 else None + 일 = dec(r[3]) if len(r)>3 else None + 식 = r[4] if len(r)>4 else None + 시 = dec(r[6]) if len(r)>6 else None + if not (nm and 일 and 시 and isinstance(식,str)): continue + expr = 식.strip().lstrip("*").strip() + try: + factor = eval(expr, {"__builtins__":{}}) + except Exception: + factor = None + calc = q(D(str(float(일)*factor)), ROUND_DOWN) if factor else None + ok = "일치" if calc==시 else ("차 %+d"%(calc-시) if calc is not None else "식 해석실패") + print(" %-16s 일 %9s × %-18s = %9s 출력 %9s %s" % (str(nm)[:16], f"{일:,}", expr, f"{calc:,}" if calc else "-", f"{시:,}", ok)) + +print("\n\n### ② 집계표 행 금액 반올림 — 수량 × 단가") +SHEETS = ["재료비수량금액집계표","노무비수량금액집계표","경비수량금액집계표","중기시간금액집계표"] +stat=collections.Counter() +for p in XL: + try: wb=openpyxl.load_workbook(p,data_only=True,read_only=True) + except Exception: continue + for s in SHEETS: + if s not in wb.sheetnames: continue + ws=wb[s] + for r in ws.iter_rows(min_row=1,max_row=ws.max_row,max_col=12,values_only=True): + nums=[(i,dec(v)) for i,v in enumerate(r) if isinstance(v,(int,float))] + if len(nums)<3: continue + # 수량·단가·금액 세 쌍을 찾는다 + for a in range(len(nums)-2): + qty,up,amt = nums[a][1],nums[a+1][1],nums[a+2][1] + if not (qty and up and amt) or qty<=0 or up<=0: continue + raw=qty*up + if abs(raw-amt) > raw*D("0.02"): continue + for m,tag in ((ROUND_DOWN,"절사"),(ROUND_HALF_UP,"사사오입"),(ROUND_HALF_EVEN,"은행가")): + if q(raw,m)==amt: stat[(s,tag)]+=1 + if raw==amt: stat[(s,"원값")]+=1 + stat[(s,"총")]+=1 + break +for s in SHEETS: + t=stat[(s,"총")] + if not t: print(" %-22s 표본 없음"%s); continue + print(" %-22s 표본 %4d 절사 %4d(%.0f%%) 사사오입 %4d(%.0f%%) 은행가 %4d(%.0f%%) 원값 %d" % ( + s, t, stat[(s,"절사")],100*stat[(s,"절사")]/t, stat[(s,"사사오입")],100*stat[(s,"사사오입")]/t, + stat[(s,"은행가")],100*stat[(s,"은행가")]/t, stat[(s,"원값")])) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index 82a6487c..779c2d32 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -43,6 +43,7 @@ | 15 | **재구현 가능성 검증** — 무엇을 만들 수 있고 무엇이 막혀 있나 | | 16 | **골든셋 회귀 결과** — 원가계산을 다시 세워 원 단위로 맞춘 실증 | | 17 | **단가조립 검증** — 일위대가·중기 시간당 사용료 구조, 손료율 실측 | +| 18 | **누락 계산로직 점검** — 노임 환산식·단가산출 Q식·설정 스냅샷 | ## 확정된 굵직한 것 @@ -53,6 +54,7 @@ - 기준자료 `JB_R` 35열 확장 시점 **2020-05-27**, 기존 1~20열은 한 칸도 안 바뀜 - 설정 **83축** 전수. 화면 순번과 내부값이 **뒤집힌 축 둘** 있음 — 그대로 저장하면 정반대 공식이 걸림 - 보험 요율의 **표 좌표 확정** — 산재 `RATE_R[45,1]`, 건강 `[46,1]`, 연금 `[46,6]`, 장기요양 `[46,11]`, 고용 등급1~7 `[45,11..17]`. 5개 연도 시계열이 실제 법정요율 변천과 맞음 +- **계산 사슬 전체가 드러남** — 일 노임 → 시간당 → 중기 사용료 → 단가산출(Q식) → 일위대가 → 내역 → 간접비 → 총공사비 (18번) - **원가계산 전 과정을 원 단위로 재현함** — 실무 프로젝트 6건, 내역 행 1,515건 무결, 총공사비까지 1원도 안 틀림 (16번) - ⚠ **기초단가 원천은 전부 암호화** — 자재 5.7만 건·노임·중기·표준시장단가를 한 건도 못 읽음. 「계산 엔진」은 만들 수 있으나 「기준자료를 갖춘 완제품」은 못 만듦 (15번) From 46dc94af705da32014d28a4a3a6b15ce8373b831 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 13:38:06 +0900 Subject: [PATCH 10/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=EC=84=A4=EA=B3=84=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=EB=AA=A8=EB=93=9C=20=EC=8B=A4=EC=A6=9D=20=C2=B7=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EB=A5=A0=20=EC=9E=A5=EB=B6=80=20=EC=8B=A0=EC=84=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit T9 확정 — 계류보전 2025(변경) 의 공사원가계산서가 당초·변경·증감을 나란히 내는 것을 찾아 가름. 직접노무비가 +8,802,162 늘었는데도 건강보험료· 노인장기요양보험료·연금보험료는 증감 0 임. - 재계산 모드: 간접노무비·산재·고용. 요율은 당초와 같고 변경 밑수로 다시 계산하면 원 단위로 일치 - 당초액 유지 모드: 건강·장기요양·연금. 사후정산 대상이라 설계 단계에서 당초액을 그대로 가져감. 재계산했다면 85만 원이 더 붙었을 것 - 전부 재계산으로 구현하면 그만큼 틀림 곁들여 출력 시트가 21종이 아니라 30종이었음. 설계변경 시트 3종이 있어 「변경 출력이 표본에 없다」던 앞선 서술이 틀렸음. 문서 19(진행률 장부) 신설 — 원천별로 파일·표·시트를 실제로 세어 진행률과 남은 것을 적음. 계수 스크립트 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 2 + .../08_규칙6_8_9_재계산_변경설계_일괄변경.md | 19 ++- .../STmate 분석/20_분석/19_진행률_장부.md | 121 ++++++++++++++++++ .../40_스크립트/coverage_ledger.py | 61 +++++++++ .../경쟁사 프로그램/STmate 분석/README.md | 1 + 5 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/coverage_ledger.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 4223eb1e..e095c61d 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -25,6 +25,7 @@ | 16 골든셋 회귀 결과 | **원가계산을 다시 세워 원 단위로 맞춘 실증** — 프로젝트 6건 전 항목 일치 | (저장소 파일) | | 17 단가조립 검증 | **일위대가·중기 시간당 사용료 구조와 손료율 실측** | (저장소 파일) | | 18 누락 계산로직 점검 | **사슬에 빠진 칸 찾기** — 노임 환산식·단가산출 Q식·설정 스냅샷·집계표 반올림 | (저장소 파일) | +| 19 진행률 장부 | **어디까지 봤고 무엇이 남았나** — 원천별 실측 진행률, 차단점 현황 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -68,6 +69,7 @@ | 단가산출 `D`코드 | **문서에 없었음** | **A** — `Q=3600qKfE/Cm`, 성분 = 절사(시간단가/Q, 소수1) | 18번 §2.2 | | 계산 설정 스냅샷 | 「화면 없이 재현 불가」 | **출력 XLSX `〓 INITIAL 〓` 에 있음** | 18번 §2.3 | | 집계표 행 금액 | 서술만 | **A** — 사사오입 100%. 호표 성분 소계(절사)와 다른 자리 | 18번 §2.4 | +| 변경설계 간접비 모드 | 「모드가 여럿」까지만 | **A 실증** — 건강·장기요양·연금은 **당초액 유지**, 나머지는 재계산 | 19번 §6, 08번 §2 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/08_규칙6_8_9_재계산_변경설계_일괄변경.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/08_규칙6_8_9_재계산_변경설계_일괄변경.md index e5f0fb32..6a15c0b2 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/08_규칙6_8_9_재계산_변경설계_일괄변경.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/08_규칙6_8_9_재계산_변경설계_일괄변경.md @@ -82,7 +82,24 @@ STC에는 두 형태가 동시에 확인된다. - 비교표는 `original`, `previous`, `current`, `delta`를 모두 계산한다. - 삭제 항목은 물리 삭제하지 않고 현재 차수에 0/제외 상태로 남겨 코드 대응을 보존한다. - 신규 항목은 안정적인 내부 ID와 차수별 표시 순서를 가진다. -- 간접비 항목마다 `recalculated`, `proportional_from_original`(방법 A), `delta_times_rate`(방법 B), `carry_original`, `manual`을 **계산모드 값으로 저장**한다. 절사 비선형성 때문에 모드가 다르면 원 단위 결과가 갈리므로, 모드를 하나로 고정하면 STmate 결과를 재현할 수 없다. +- 간접비 항목마다 `recalculated`, `proportional_from_original`(방법 A), `delta_times_rate`(방법 B), `carry_original`, `manual`을 **계산모드 값으로 저장**한다. + +### 실데이터로 확인된 모드 — A등급 (2026-09-13) + +계류보전 2025(변경)의 `공사원가계산서`는 당초·변경·증감을 나란히 낸다. **직접노무비가 `32,976,276 → 41,778,438`(+8,802,162)로 늘었는데 세 항목은 증감이 0이다.** + +| 항목 | 당초 | 변경 | 증감 | 재계산했다면 | 모드 | +|---|---:|---:|---:|---:|---| +| 간접노무비 | 4,715,607 | 5,974,316 | +1,258,709 | 5,974,316 ✅ | `recalculated` | +| 산재보험료 | 1,341,831 | 1,699,998 | +358,167 | 1,699,998 ✅ | `recalculated` | +| 고용보험료 | 380,688 | 482,302 | +101,614 | 482,302 ✅ | `recalculated` | +| **건강보험료** | 1,328,500 | 1,328,500 | **0** | 1,683,108 | **`carry_original`** | +| **노인장기요양보험료** | 172,040 | 172,040 | **0** | 217,961 | **`carry_original`** | +| **연금보험료** | 1,686,389 | 1,686,389 | **0** | 2,136,526 | **`carry_original`** | + +요율은 당초·변경이 같다(간접노무비 14.300%, 산재 3.560%, 고용 1.010%). 요율을 바꾼 것이 아니라 **항목마다 모드가 다르다.** 건강·장기요양·연금은 **사후정산 대상**이라 설계 단계에서 당초액을 그대로 가져간다 — §10의 「직접입력」 옵션이 이것이다. + +⚠ **전부 재계산으로 두면 이 세 항목에서 85만 원이 어긋난다.** 모드를 하나로 고정하면 STmate 결과를 재현할 수 없다. - Aislo 자체 기본값으로는 전 차수 독립 재계산(`recalculated`)을 권장하되, **STmate 호환 모드와 구분해서** 둔다. ## 3. 일괄 단가변경·물가변동 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md new file mode 100644 index 00000000..1aaaf00e --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md @@ -0,0 +1,121 @@ +# 진행률 장부 — 어디까지 봤고 무엇이 남았나 + +갱신일: 2026-09-13 +세는 법: 눈대중이 아니라 **파일·표·시트를 실제로 세어** 적음. 재현 스크립트 `40_스크립트/coverage_ledger.py` + +## 1. 한눈에 + +| 원천 | 전체 | 본 것 | 남은 것 | 진행 | +|---|---:|---:|---:|---| +| 설치 폴더 `System` 파일 | 186 | 186 등록·형식·내부구조 | 암호화 13개는 **영구 불가** | ▓▓▓▓▓▓▓▓▓▓ 100% | +| 기준 요율표 `JB_*` | 43 | 43 전수 파싱·블록·확장차이 | 셀 좌표 일부 | ▓▓▓▓▓▓▓▓░░ 85% | +| 실무 프로젝트 `STC` | 7 | 7 전부 | — | ▓▓▓▓▓▓▓▓▓▓ 100% | +| STC 안의 표 | 16종 | **10종 읽고 씀** · 4종 빈 표 | **2종 암호화** (`BDQTY`·`SYSINFO`) | ▓▓▓▓▓▓▓▓▓░ 88% | +| STmate 출력 `XLSX` | 6 | 6 전부 | — | ▓▓▓▓▓▓▓▓▓▓ 100% | +| 출력 시트 | **30종** | **14종 계산 검증** · 1종 부분 | 15종 (목록·표지·변형 내역서) | ▓▓▓▓▓░░░░░ 48% | +| 계산 사슬 단계 | 8 | **8 전부** | — | ▓▓▓▓▓▓▓▓▓▓ 100% | +| 09번이 꼽은 호환성 차단점 | 6 | **3 해결 · 1 부분** | 2 (실행 필요) | ▓▓▓▓▓▓░░░░ 58% | + +## 2. 설치 폴더 186개 + +| 갈래 | 개수 | 상태 | +|---|---:|---| +| PE 실행모듈 (`*.CPM`·`*.BPL`·`*.EXE`) | 82 | 헤더·섹션·임포트·문자열 전수. 핵심 12개는 호출자리까지 | +| ZIP 계열 (`*.STBSC` 등) | 28 | 컨테이너 확인, 내부는 암호 | +| JB 요율표 | 43 | **전수 파싱** — 형태·블록·2020-05-27 확장 차이 | +| 암호화 기준단가 (`*.BSC`·`*.CSTA`) | 13 | ⛔ **본문 암호화 — 영구 불가** | +| 기타 | 20 | 형식 판정 완료 | + +⛔ 13개 안에 **자재 57,580건·노임 460건·중기 833건·표준시장단가 4,921건**이 들어 있다. 이것이 「완제품 복제 불가」의 유일한 근거다. + +## 3. 출력 시트 30종 — 가장 많이 남은 곳 + +### ✅ 계산 검증 완료 14종 + +``` +공사원가계산서 · 설계내역서 · 일위대가표 · 중기사용료 · 자재단가대비표 +단가산출근거 · 환율및기초자료 · 〓 INITIAL 〓 +재료비수량금액집계표 · 노무비수량금액집계표 · 경비수량금액집계표 +설계변경내역서 · 설계변경금액대비표 · 설계변경증감대비표 +``` + +### ◐ 부분 1종 + +`중기시간금액집계표` — 수량·단가·금액 열 위치를 못 맞춰 반올림 판정이 비어 있음. + +### · 남은 15종 — 전부 **목록·표지·내역서 변형** + +| 갈래 | 시트 | +|---|---| +| 색인·목록 (계산 없음) | 일위대가목록표 · 단가산출근거목록표 · 중기목록표 · 재료비목록표 · 노무비목록표 · 경비목록표 · 일식견적목록표 | +| 집계표 변형 | 일위대가수량금액집계표 · 단가산출근거수량금액집계표 · 일식견적수량금액집계표 | +| 내역서 변형 | 총괄설계내역서 · 총괄내역서 · 착공내역서 | +| 표지 | 〓 목 차 〓 · ※※안내※※ | + +**새 계산 규칙이 나올 가능성은 낮다.** 집계표 변형 3종은 이미 확인한 집계표와 같은 반올림(사사오입)일 것으로 보이고, 내역서 변형 3종은 같은 값을 다른 묶음으로 낸 것이다. 다만 **확인은 안 했으므로 「확인 안 함」으로 센다.** + +## 4. 계산 사슬 8단계 — 전부 확인 + +| # | 단계 | 근거 문서 | +|---:|---|---| +| ① | 일 노임 → 시간당 (설정식, 좌→우 순차) | 18번 §2.1 | +| ② | 중기 시간당 사용료 (손료·운전원·연료·잡품, 성분별 절사) | 17번 §3 | +| ③ | 단가산출 `D`코드 (`Q=3600qKfE/Cm`, 성분/Q 소수1 절사) | 18번 §2.2 | +| ④ | 일위대가 `B`코드 (구성 조립, 성분별 절사, 호표 간 참조) | 17번 §2·§5 | +| ⑤ | 내역 행 (`ROUNDDOWN(수량×단가)`) | 16번 | +| ⑥ | 계층 합산·제외금액 구역 | 16번 §4.1·§4.2 | +| ⑦ | 간접비 (밑수×요율, 행마다 절사, 앞 행 참조) | 16번 §3, 06번 §3 | +| ⑧ | 일반관리비 → 이윤 → 끝전조정 → 부가세 → 관급 → 총공사비 | 16번 §4.4 | + +## 5. 호환성 차단점 여섯 — 현황 + +| # | 차단점 | 상태 | 근거 | +|---:|---|---|---| +| 1 | RATE 좌표 라벨·경계 | ◐ **부분** — 고정 칸(보험·산안비·이윤) 확정, 규모·기간 의존 칸은 남음 | 15번 §4 | +| 2 | `BDQTY` 세부 플래그 | ⛔ **암호화 — 불가** | 15번 §2 | +| 3 | 자재 자동채택 우선순위 | ✅ **최저가** | 17번 §5.5 | +| 4 | 중기 내부 절사 시점 | ✅ **성분별 절사** | 17번 §2 | +| 5 | UI 명령별 재계산 범위 | ⛔ 실행 필요 | 13번 T8 | +| 6 | 일괄변경 수동값 우선순위 | ⛔ 실행 필요 | 13번 T10 | + +**추가로 09번 목록 밖에서 푼 것** — 변경설계 계산모드(아래 6장), 노임 환산식, 단가산출 Q식, 계산 설정 스냅샷, 집계표 반올림. + +## 6. 변경설계 계산모드 — 이번에 확정 (T9) + +계류보전 2025(변경) 프로젝트의 `공사원가계산서`가 **당초·변경·증감을 나란히** 낸다. 직접노무비가 `32,976,276 → 41,778,438`(+8,802,162)로 크게 늘었는데도 **세 항목은 증감이 0이다.** + +| 항목 | 당초 | 변경 | 증감 | 재계산했다면 | 판정 | +|---|---:|---:|---:|---:|---| +| 간접노무비 | 4,715,607 | 5,974,316 | +1,258,709 | 5,974,316 ✅ | **재계산** | +| 산재보험료 | 1,341,831 | 1,699,998 | +358,167 | 1,699,998 ✅ | **재계산** | +| 고용보험료 | 380,688 | 482,302 | +101,614 | 482,302 ✅ | **재계산** | +| **건강보험료** | 1,328,500 | 1,328,500 | **0** | 1,683,108 (+354,608) | **당초액 유지** | +| **노인장기요양보험료** | 172,040 | 172,040 | **0** | 217,961 (+45,921) | **당초액 유지** | +| **연금보험료** | 1,686,389 | 1,686,389 | **0** | 2,136,526 (+450,137) | **당초액 유지** | + +요율은 당초·변경이 같다(간접노무비 14.300%, 산재 3.560%, 고용 1.010%). 즉 요율을 바꾼 것이 아니라 **항목마다 모드가 다르다.** + +⇒ **건강보험료·노인장기요양보험료·연금보험료는 사후정산 대상이라 설계 단계에서 당초액을 그대로 가져간다.** 11번 §10의 「보험료 사후정산 항목은 당초금액과 동일하게 직접 입력하는 옵션」이 실데이터로 확인됐다. + +**재구현 필수** — 간접비 항목마다 `calc_mode ∈ {recalculated, carry_original, proportional_from_original, delta_times_rate, manual}` 을 저장할 것. 전부 재계산으로 두면 이 세 항목에서 **85만 원**이 어긋난다. + +## 7. 남은 일 — 할 수 있는 것과 없는 것 + +### 지금 자료로 할 수 있는 것 + +| 순위 | 할 일 | 왜 | +|---:|---|---| +| 1 | 남은 시트 15종 훑기 | 새 규칙은 낮지만 **확인 안 한 칸을 0으로 만드는 값어치** | +| 2 | `중기시간금액집계표` 열 맞춰 반올림 판정 | 유일한 「부분」 | +| 3 | 일위대가 호표 **참조 그래프** 복원 → 위상순서 계산 재현 | ④단계를 실증으로 | +| 4 | 설계변경 **직접비 증감**까지 원 단위 재현 | 6장을 전 항목으로 넓힘 | + +### 끝내 못 하는 것 + +| 무엇 | 왜 | +|---|---| +| 기초단가 원천 (자재 5.7만 건 등) | 본문 암호화 | +| `BDQTY` 수량 할증 | 본문 암호화 | +| UI 재계산 범위·일괄변경 우선순위 | **STmate 실행 필요 — 라이선스 없음** | +| 규모·기간 의존 요율 좌표 | 같음. 표본을 늘리면 좁혀지기는 함 | +| 수공 `S`·실적 `TA`/`SA` 형식 | **표본이 하나도 없음.** 그 형식 설계서가 한 건 생기면 바로 가능 | diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/coverage_ledger.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/coverage_ledger.py new file mode 100644 index 00000000..38af52e0 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/coverage_ledger.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +"""진행률 장부 — 원천별로 무엇을 어디까지 봤나 실제로 센다.""" +import sys, io, pathlib, zipfile, struct, re, warnings, collections +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore"); import openpyxl +SYS = pathlib.Path(r"C:\경영정보(주)\System") +PRAC = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서") + +# ── ① 설치 폴더 186개 ── +files = [p for p in SYS.rglob("*") if p.is_file()] +kinds = collections.Counter() +for p in files: + try: head = p.open("rb").read(2) + except Exception: head = b"" + ext = p.suffix.upper() + if head == b"MZ": kinds["PE 실행모듈"] += 1 + elif head == b"PK": kinds["ZIP 계열"] += 1 + elif ext in (".JB_1",".JB_M",".JB_R",".JB_RA"): kinds["JB 요율표"] += 1 + elif ext in (".BSC",".CSTA"): kinds["암호화 기준단가"] += 1 + else: kinds["기타"] += 1 +print("### ① 설치 폴더 `C:\경영정보(주)\System` 전체 %d개" % len(files)) +for k,v in kinds.most_common(): print(" %-16s %3d" % (k,v)) + +# ── ② 실무 STC ── +stcs = sorted(PRAC.rglob("*.STC")) +tabset = collections.Counter() +for s in stcs: + try: z = zipfile.ZipFile(s) + except Exception: continue + for n in z.namelist(): + if n.upper().endswith(".DBF"): tabset[n.upper()] += 1 +print("\n### ② 실무 프로젝트 STC %d건, 담긴 표 %d종" % (len(stcs), len(tabset))) + +# ── ③ STmate 생성 XLSX 시트 ── +sheets = collections.Counter(); nx = 0 +for p in PRAC.rglob("*.xlsx"): + if p.name.startswith("~$"): continue + try: wb = openpyxl.load_workbook(p, data_only=True, read_only=True) + except Exception: continue + if "공사원가계산서" not in wb.sheetnames: continue + nx += 1 + for s in wb.sheetnames: sheets[s] += 1 +print("\n### ③ STmate 생성 XLSX %d건, 시트 %d종" % (nx, len(sheets))) + +DONE_SHEET = {"공사원가계산서","설계내역서","일위대가표","중기사용료","자재단가대비표", + "환율및기초자료","단가산출근거","〓 INITIAL 〓", + "재료비수량금액집계표","노무비수량금액집계표","경비수량금액집계표"} +PART_SHEET = {"중기시간금액집계표"} +print(" %-24s %s" % ("시트","상태")) +for s,_ in sheets.most_common(): + st = "✅ 계산 검증" if s in DONE_SHEET else ("◐ 부분" if s in PART_SHEET else "· 미확인(목록·표지)") + print(" %-24s %s" % (s[:24], st)) +d=len(DONE_SHEET & set(sheets)); pt=len(PART_SHEET & set(sheets)) +print(" → 계산 검증 %d / %d 시트 (부분 %d)" % (d, len(sheets), pt)) + +DONE_TAB = {"BOQ11.DBF","BOQ12.DBF","COSTN.DBF","PRJLST.DBF","RATE.DBF","RATE_M.DBF", + "RATE_R.DBF","RATE_RA.DBF","RATE_A.DBF","RATE_B.DBF","SET_REP.DBF","KONGJONG.DBF"} +print("\n STC 표별 상태") +for t,c in sorted(tabset.items()): + st = "✅ 읽고 씀" if t in DONE_TAB else ("⛔ 암호화" if t in ("BDQTY.DBF","SYSINFO.DBF") else "· 빈 표/미사용") + print(" %-16s %d건 %s" % (t, c, st)) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index 779c2d32..122637a4 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -44,6 +44,7 @@ | 16 | **골든셋 회귀 결과** — 원가계산을 다시 세워 원 단위로 맞춘 실증 | | 17 | **단가조립 검증** — 일위대가·중기 시간당 사용료 구조, 손료율 실측 | | 18 | **누락 계산로직 점검** — 노임 환산식·단가산출 Q식·설정 스냅샷 | +| 19 | **진행률 장부** — 어디까지 봤고 무엇이 남았나 | ## 확정된 굵직한 것 From 5e2a40b17acc277003676afbd57512145d0666bd Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 13:43:59 +0900 Subject: [PATCH 11/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5=20=EC=8B=9C=ED=8A=B8=2030=EC=A2=85=20?= =?UTF-8?q?=EC=A0=84=EC=88=98=20=ED=9B=91=EA=B8=B0=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=E2=80=94=20=EC=A7=91=EA=B3=84=ED=91=9C=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=EC=99=80=20=C2=B11=20=EC=98=A4=EC=B0=A8=20=EC=9B=90=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 남은 16종을 전부 열어 본 결과 새 계산 규칙은 나오지 않음. 대신 둘이 밝혀짐. - 착공내역서 178건 절사 100% — 설계내역서와 같은 규칙 - 목록표 7종·표지 2종·총괄내역서 2종은 계산 쌍이 없는 색인·표지 성격 - 집계표 4종에는 단가 열이 없음. 금액 = 절사(수량 x 해당 호표의 시간당 성분단가). 굴삭기 0.2·0.7 은 전 성분 일치 - ⚠ 어긋나는 칸은 전부 -1 이며, 경비로 역산하면 표시 수량 940.69 가 실제로는 940.68998... 임. 집계표 수량은 표시용 반올림값이라 그대로 역산하면 1원씩 어긋남. 09번의 「입력 원값과 표시 반올림값을 분리」가 이 자리 진행률 장부의 출력 시트 칸을 48% -> 100% 로 갱신. 훑기 스크립트 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../STmate 분석/20_분석/19_진행률_장부.md | 50 +++++++++++------ .../STmate 분석/40_스크립트/sheet_sweep.py | 54 +++++++++++++++++++ 2 files changed, 89 insertions(+), 15 deletions(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/sheet_sweep.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md index 1aaaf00e..4d96c9b5 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md @@ -12,7 +12,7 @@ | 실무 프로젝트 `STC` | 7 | 7 전부 | — | ▓▓▓▓▓▓▓▓▓▓ 100% | | STC 안의 표 | 16종 | **10종 읽고 씀** · 4종 빈 표 | **2종 암호화** (`BDQTY`·`SYSINFO`) | ▓▓▓▓▓▓▓▓▓░ 88% | | STmate 출력 `XLSX` | 6 | 6 전부 | — | ▓▓▓▓▓▓▓▓▓▓ 100% | -| 출력 시트 | **30종** | **14종 계산 검증** · 1종 부분 | 15종 (목록·표지·변형 내역서) | ▓▓▓▓▓░░░░░ 48% | +| 출력 시트 | **30종** | **30종 전부 훑음** (계산 있는 것 15종 규칙 확정) | — | ▓▓▓▓▓▓▓▓▓▓ 100% | | 계산 사슬 단계 | 8 | **8 전부** | — | ▓▓▓▓▓▓▓▓▓▓ 100% | | 09번이 꼽은 호환성 차단점 | 6 | **3 해결 · 1 부분** | 2 (실행 필요) | ▓▓▓▓▓▓░░░░ 58% | @@ -39,20 +39,40 @@ 설계변경내역서 · 설계변경금액대비표 · 설계변경증감대비표 ``` -### ◐ 부분 1종 +### ✅ 나머지 16종도 훑음 (2026-09-13) -`중기시간금액집계표` — 수량·단가·금액 열 위치를 못 맞춰 반올림 판정이 비어 있음. +전부 열어 본 결과 **새 계산 규칙은 나오지 않았고**, 대신 두 가지가 밝혀졌다. -### · 남은 15종 — 전부 **목록·표지·내역서 변형** +| 갈래 | 시트 | 결과 | +|---|---|---| +| 색인·목록 | 일위대가목록표 · 단가산출근거목록표 · 중기목록표 · 재료비목록표 · 노무비목록표 · 경비목록표 · 일식견적목록표 | **계산 쌍 없음** — 호표 번호·코드·단가 색인 | +| 표지 | 〓 목 차 〓 · ※※안내※※ | 계산 없음 | +| 내역서 변형 | **착공내역서** | 178건 **절사 100%** — 설계내역서와 같은 규칙 | +| | 총괄설계내역서 · 총괄내역서 | 공종 상위 집계, 새 규칙 없음 | +| | 설계변경내역서 | 당초·변경 두 벌이라 단순 쌍 검출로는 안 갈림. 금액 자체는 19번 §6에서 확정 | +| 집계표 | 중기시간금액집계표 · 일위대가수량금액집계표 · 단가산출근거수량금액집계표 · 일식견적수량금액집계표 | **단가 열이 없음** — 아래 | -| 갈래 | 시트 | -|---|---| -| 색인·목록 (계산 없음) | 일위대가목록표 · 단가산출근거목록표 · 중기목록표 · 재료비목록표 · 노무비목록표 · 경비목록표 · 일식견적목록표 | -| 집계표 변형 | 일위대가수량금액집계표 · 단가산출근거수량금액집계표 · 일식견적수량금액집계표 | -| 내역서 변형 | 총괄설계내역서 · 총괄내역서 · 착공내역서 | -| 표지 | 〓 목 차 〓 · ※※안내※※ | +#### 집계표에는 단가 열이 없다 -**새 계산 규칙이 나올 가능성은 낮다.** 집계표 변형 3종은 이미 확인한 집계표와 같은 반올림(사사오입)일 것으로 보이고, 내역서 변형 3종은 같은 값을 다른 묶음으로 낸 것이다. 다만 **확인은 안 했으므로 「확인 안 함」으로 센다.** +```text +호표 | 명칭 | 규격 | 수량 | 단위 | 합계 | 노무비 | 재료비 | 경비 + 2 | 굴삭기(무한궤도) | 0.7㎥ | 940.69 | 시간 | 91,099,241 | 52,396,433 | 16,946,530 | 21,756,278 +``` + +금액은 **`절사(수량 × 해당 호표의 시간당 성분단가)`** 다. 굴삭기 0.7㎥의 시간당 성분(노무 55,700 / 재료 18,015 / 경비 23,128)으로 검산하면 맞는다. + +| 장비 | 시간 | 노무 | 재료 | 경비 | +|---|---:|---|---|---| +| 굴삭기 0.2㎥ | 17.47 | ✅ | ✅ | ✅ | +| 굴삭기 0.7㎥ | 940.69 | ✅ | ✅ | ✅ | +| 덤프 15톤 | 379.54 | ✅ | ✅ | −1 | +| 덤프 2.5톤 | 150.52 | ✅ | −1 | −1 | + +#### ⚠ 표시 수량은 반올림된 값이다 + +어긋나는 세 칸은 전부 **−1**이다. 경비로 역산하면 굴삭기 0.7㎥의 실제 시간은 `21,756,278 / 23,128 = 940.68998…`인데 시트에는 `940.69`로 찍힌다. + +⇒ **집계표의 수량을 그대로 역산하면 1원씩 어긋난다.** 집계는 표시 수량이 아니라 **원수량 또는 행별 금액의 합**에서 나온다. 09번 §4의 「입력 원값과 표시 반올림값을 분리한다」가 바로 이 자리다. ## 4. 계산 사슬 8단계 — 전부 확인 @@ -105,10 +125,10 @@ | 순위 | 할 일 | 왜 | |---:|---|---| -| 1 | 남은 시트 15종 훑기 | 새 규칙은 낮지만 **확인 안 한 칸을 0으로 만드는 값어치** | -| 2 | `중기시간금액집계표` 열 맞춰 반올림 판정 | 유일한 「부분」 | -| 3 | 일위대가 호표 **참조 그래프** 복원 → 위상순서 계산 재현 | ④단계를 실증으로 | -| 4 | 설계변경 **직접비 증감**까지 원 단위 재현 | 6장을 전 항목으로 넓힘 | +| ~~1~~ | ~~남은 시트 훑기~~ | ✅ **완료** — 30종 전부. 새 규칙 없음, 집계표 ±1 원인 밝힘 | +| ~~2~~ | ~~중기시간금액집계표~~ | ✅ **완료** — 절사(수량 × 시간당 성분단가) | +| 1 | 일위대가 호표 **참조 그래프** 복원 → 위상순서 계산 재현 | ④단계를 실증으로 | +| 2 | 설계변경 **직접비 증감**까지 원 단위 재현 | 6장을 전 항목으로 넓힘 | ### 끝내 못 하는 것 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/sheet_sweep.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/sheet_sweep.py new file mode 100644 index 00000000..751b2790 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/sheet_sweep.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +"""남은 시트 전수 훑기 — 머리 몇 줄과 수량×단가=금액 반올림 판정.""" +import sys, io, pathlib, warnings, collections +from decimal import Decimal as D, ROUND_DOWN, ROUND_HALF_UP, ROUND_HALF_EVEN +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore"); import openpyxl +def q(x,m): return D(x).quantize(D(1), rounding=m) +def dec(v): + if v in (None,""): return None + try: return D(str(v)) + except Exception: return None +ROOT = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서") +REST = ["중기시간금액집계표","일위대가수량금액집계표","단가산출근거수량금액집계표","일식견적수량금액집계표", + "총괄설계내역서","총괄내역서","착공내역서","설계변경내역서", + "일위대가목록표","단가산출근거목록표","중기목록표","재료비목록표","노무비목록표","경비목록표","일식견적목록표"] +stat = collections.Counter(); head = {} +for p in sorted(ROOT.rglob("*.xlsx")): + if p.name.startswith("~$"): continue + try: wb=openpyxl.load_workbook(p,data_only=True,read_only=True) + except Exception: continue + if "공사원가계산서" not in wb.sheetnames: continue + for s in REST: + if s not in wb.sheetnames: continue + ws=wb[s] + rows=[list(r) for r in ws.iter_rows(min_row=1,max_row=min(ws.max_row,400),max_col=14,values_only=True)] + if s not in head: + head[s]=[r for r in rows[:8]] + for r in rows: + nums=[(i,dec(v)) for i,v in enumerate(r) if isinstance(v,(int,float))] + for a in range(len(nums)-2): + qy,up,amt = nums[a][1],nums[a+1][1],nums[a+2][1] + if not (qy and up and amt) or qy<=0 or up<=0 or amt<=0: continue + raw=qy*up + if raw==0 or abs(raw-amt) > raw*D("0.015"): continue + for m,tag in ((ROUND_DOWN,"절사"),(ROUND_HALF_UP,"사사오입"),(ROUND_HALF_EVEN,"은행가")): + if q(raw,m)==amt: stat[(s,tag)]+=1 + stat[(s,"총")]+=1; break + +print("### 남은 시트 — 수량×단가=금액 반올림 판정") +print("%-26s %6s %10s %10s %10s" % ("시트","표본","절사","사사오입","은행가")) +for s in REST: + t=stat[(s,"총")] + if not t: + print("%-26s %6s (계산 쌍 없음 = 색인·표지 성격)" % (s[:26],"-")); continue + f=lambda k: "%d(%.0f%%)"%(stat[(s,k)],100*stat[(s,k)]/t) + print("%-26s %6d %10s %10s %10s" % (s[:26],t,f("절사"),f("사사오입"),f("은행가"))) + +print("\n\n### 각 시트 머리 (구조 확인)") +for s in REST: + if s not in head: continue + print("\n-- %s" % s) + for r in head[s]: + line=" | ".join(("" if v is None else (("%g"%v) if isinstance(v,float) else str(v)))[:15] for v in r[:10]) + if line.strip(" |"): print(" %s" % line) From 3d4d2718ff951692d59c08d6827d0cb5f1aa2e01 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 13:44:12 +0900 Subject: [PATCH 12/20] =?UTF-8?q?chore(plan):=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EC=82=AC=EC=8A=AC=20=EC=9E=AC=EC=A0=95=EB=A6=BD=20=EC=A0=84=20?= =?UTF-8?q?=EA=B5=AC=EC=BB=A8=EC=85=89=20=EA=B3=84=ED=9A=8D=EC=84=9C=20?= =?UTF-8?q?=EC=A0=84=EB=AC=B8=20=EB=B3=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_0154EMdwPYNPuKc9eZv8SLEX --- .../2026-09-13b_plan_구컨셉_전문_재편전.md | 1049 +++++++++++++++++ 1 file changed, 1049 insertions(+) create mode 100644 docs/raw/plans/2026-09-13b_plan_구컨셉_전문_재편전.md diff --git a/docs/raw/plans/2026-09-13b_plan_구컨셉_전문_재편전.md b/docs/raw/plans/2026-09-13b_plan_구컨셉_전문_재편전.md new file mode 100644 index 00000000..fd298b1f --- /dev/null +++ b/docs/raw/plans/2026-09-13b_plan_구컨셉_전문_재편전.md @@ -0,0 +1,1049 @@ +# 상시 계획서 + +> 운영 원칙 +> +> - **작업 목록**: 남은 일을 한 곳에 +> - **구획은 페이지·기능별** 착수하지 않기로 한 것만 맨 아래 **보류** +> ⚠ **별도 파일로 가르지 않는다** — 상시계획서는 한 파일로만 운영. +> - **담당은 적지 않는다** — 어느 창·폴더가 맡을지는 그때그때 정한다. +> - **작성방법** — 짧고 이해하기 쉽게, 문단의 종료 시점 전까지 줄바꿈금지. +> - **완료분 원문**은 `docs/raw/plans/` 날짜별 파일에 있음 — 최근 것 `2026-09-13_plan_완료분_이관.md` +> (확정 3차 · 확정 12~16 · 0-13 · 3-17 · 3-15 · 닫힌 검증 V-8~V-17). + +## 작업 목록 + +### ⭐ 사토장 — 사용자 설계 원문 그대로 옮김) + +**여쭀던 「사토장까지 거리」의 답이자, 그보다 큰 설계임.** 거리를 값으로 받는 것이 아니라 +**사토장을 노선 위에 놓는 것**임. + +**무엇인가** — **횡단도에서 기존 성토선을 그대로 두고, 노견 이후 확장 방향으로 추가 성토선을 +하나 더 긋는 것.** 그 추가 성토가 곧 사토장임(현장 안에 쌓는 것). + +**받는 값** + +``` +기본 기준 측점 +세부 부피값(사용자 입력) + 추가 거리값(외부 사토장을 쓸 때 대비) +``` + +**거리 셈** — **공사장 입구에 사토장이 있다고 보고 계산한 거리 + 추가 거리값.** +⇒ 추가 거리를 넣으면 **외부 사토장 운영도 같은 틀로 됨.** 그때는 **횡단도 표기가 필요 없음.** + +**횡단도** — **추가 성토선의 확폭 방향 길이가 자동 결정**되면 됨(부피에서 역산). +**유토곡선** — 그러면 당연히 표현됨. +**수량·원가** — 그 사토장 값을 그대로 씀. + +**⚠ 정하며 갈 것 셋 (사용자 원문에 없어 구현하며 확인)** + +``` +㉠ 걸치는 구간 기준 측점 하나인가, 구조물 C군처럼 전/후 구간인가 + → 부피를 길이로 나눠야 하므로 구간이 필요함. **C군과 같은 모양**을 권함 +㉡ 확폭 성토선 기울기를 기존 성토 기울기와 같게 볼 것인가 + → 같게 두는 것이 자연스럽고, 다르면 사용자 칸이 하나 더 필요 +㉢ 「공사장 입구」 노선 기점(BP)으로 볼 것인가 + → 측점에서 기점까지 누가거리는 이미 아는 값 +``` + +⚠ **셋 다 임의로 굳히지 말고 화면에 드러내고 바꿀 수 있게** 할 것(사용자 지시 「페이지에 남길 것」). + +**⚠⚠ 정정 — 폭을 재는 기준 (2026-09-09 사용자 보충)** + +> 「사토장의 성토선을 긋고 **부피를 계산하는 기준이 노견 바깥쪽이 아니라 +> **노견과 노면의 사이**를 기준으로 길이가 늘어나고 사토장 부피가 되어야 함」 + +⇒ **폭의 시작점은 「노면 끝(= 노견 시작)」임.** 노견 바깥 끝이 아님. +⇒ 사토장이 서면 **그 구간의 노견이 사토장 성토 안에 들어감** — 노견 폭도 사토장 폭에 포함됨. +⚠ **이중계상 확인이 필요한 자리** — 원래 노견 성토가 **노체 성토에 이미 들어 있으면** + 사토장이 그것을 또 세게 됨. **사토장이 선 구간의 노견 몫을 어떻게 다루는지**를 + 구현 전에 반드시 확인할 것(빼는가 · 사토장이 대신하는가). + +**⭐ 설계 (랩탑 메인 정리 · B05·B06 몫)** + +``` +타입 spoil_fill 「유용토운반작업장(노선 내)」 E군 · interval +칸 capacity_m3(부피) · extra_distance_m(추가 거리) · fill_slope_ratio(빈 값 = 노선 성토 따름) + + length_m · before_m · after_m (C군 규약) +그리기 성토선 바깥에 추가 성토선 — **구조물 designTrim 통로를 그대로 탐**(새 개념 없음) + **파선** + 말풍선 「유용토운반작업장 · 부피 ○㎥ · 폭 ○m」 + ⚠ 구조물 터파기 파선과 **선 종류를 갈라야** 함 +폭 부피에서 **되풀이로 역산**(폭 잡고 → 측점 단면적 → 평균단면적법 → 목표와 비교) + **폭은 구간 내내 하나** · **상한 = 지반선이 있는 데까지**(그 밖은 지반을 모름) + 안 서는 측점은 기존 `slope_unclosed` 로 가림 +내는 값 capacity_m3 · placed_m3 · unplaced_m3 · 측점별 station_placed_m3 + ⚠ unplaced > 0 이면 알림. **폭을 억지로 키우지 않음** +유토곡선 잔량마다 spoil_destination_chainage_m · spoil_haul_distance_m + (없으면 null — 거리를 지어내지 않음. B08 통짜 입력으로 떨어짐) + 사유 「사토장에서 계산」 / 「설계 입력값」 을 값과 함께 +``` + +**⭐ 새로 만들 것이 적음** — `designTrim` · 단면적·평균단면적법 · `slope_unclosed` · +`transfers`·띠(평균거리) · 잔량 지반 갈래 **다섯이 이미 있음.** +새로 짜는 것은 **폭 역산 되풀이**와 **타입·거리 칸**뿐. + +**⚠ 아직 정할 것** + +``` +③ ✅ **닫힘 (2026-09-09 사용자 확정)** — 사용자 원문: + 「**기존 구조물 측점이나 규칙 측점에만 들어가는 게 맞아**」 + ⇒ 사토장은 **이미 있는 측점 위에만** 놓임(구조물이 선 측점 또는 정규 측점). + **새 측점을 만들지 않음.** 구간 시·종점도 측점에 맞춤 + ⇒ **「공사장 입구 가정」이 필요 없어짐** — 사토장 측점이 정해지므로 거리는 + **발생점 → 사토장 측점** 누가거리로 그냥 나옴(실무 「사토운반」 탭과 같은 꼴) + ⇒ `extra_distance_m` 는 **외부 사토장 대비용으로만** 남음 +⚠ 사토 운반량을 어느 상태로 세나(자연/느슨/다짐) ← 실무 탭 수식 확인 중 +⚠ 실무 「×0.8」의 정체 · 암 1.0 이 우리 1.15/1.30 과 다름 ← 같이 확인 중 + ⚠ 답 오기 전까지 **우리 계수를 건드리지 말 것** +1 「사토장 관리」 줄을 세울 것인가 — **공종 코드가 없음**(B08·B09 같이 볼 자리) +``` + +**⇒ 이것이 서면 풀리는 것들** + +- 사토 운반 거리가 **설계에서 나옴** — 물어보던 값이 아니게 됨 +- 유토곡선 사토가 **갈 곳이 생김**(지금은 잔량으로만 남음) +- 구조물 잔토·채집석 공제가 **금액으로 드러남**(운반이 서므로) + +### ⭐⭐ 사용자 확정 5차 — 2026-09-09 밤 (결정 시트 회신, 큰 것 여덟 + 작은 것 다섯) + +**이 절이 정본임. 다시 묻지 말 것.** 시트 원문 [https://claude.ai/code/artifact/206bcb63-004e-49e8-ba3b-eeb520b0e590](https://claude.ai/code/artifact/206bcb63-004e-49e8-ba3b-eeb520b0e590) + +#### 큰 것 여덟 + + +| # | 물음 | **확정** | 해야 할 것 | +| --- | ---------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| 1 | 비탈 터파기 | **지금 이대로** (기초 + 비탈) | 값 그대로.`155.625㎥ · 11,263,899원` 유지. **터파기·되메우기·잔토 세 줄의 「확정 대기」 노티스를 걷을 것** | +| 2 | 지장목제거 | **두 줄로 가름** (권고대로) | 실무처럼**뿌리뽑기 + 잡관목제거**. **같은 면적(17,873.8㎡)이 두 줄에 그대로 들어감 — 이중계상 아님** | +| 3 | 공종 없는 다섯 줄 | ⚠**보류.** 「나중에 실무 문서 첨부. **임의로 만드는 건 지금은 무의미**」 | **일위대가를 만들지 말 것.** 줄은 서되 사유로 두고 **실무 문서를 기다림** | +| 4 | 뿌리 운반 | **덤프** | ⚠ 사용자 관찰 — 「**실제 운반품이 적용 안 되는 듯함. 나중엔 적용될 가능성도 있음**」 ⇒ 덤프로 잡되 품이 안 붙으면 **그대로 두고 사유**. 억지로 붙이지 말 것 | +| 5 | 근주이식·임목파쇄 | **권고대로**(기본 안 셈) | ⚠ 단 「**현장에 따라 파쇄가 적용될 필요 있음**」 ⇒ **임목파쇄는 켤 수 있는 칸**을 둘 것. 기본은 꺼짐 | +| 6 | 제근 단위 | **권고대로 — 면적 축** | 건설품셈 3-9-2 **「1,000㎡당」**을 빌려 씀. ⚠**교차 참조 표시 필수**(임도 전용 품이 있는데 건설품셈을 쓰는 것). 밑수가 서면 **제근·뿌리 적재·뿌리 운반·지장목제거 네 줄이 함께 섬** | +| 7 | 돌 무게 | **권고대로 — 계산식** | `뒷길이 × 0.77(채움률) × 2.65(비중)`. ⚠ **돌 종류별 인자표**로 둘 것(야면석은 그 식이 안 맞음). ⚠ 「**나중에 실무자 협의 후 명확히**」 — 잠정임을 화면 근거에 적을 것 | +| 8 | 사급 자재 단가 | **물가정보 API 로 반영 예정** | ⚠ 「**견적단가가 들어가는 부분은 우리가 생각해 봐야 함**」 ⇒ **API 로 오는 몫**과 **업체 견적으로 받을 몫**을 가르는 설계가 선행. 지금은 미결 | + + +⚠ **8번의 「구조물 넷 표준 단면」(소단·BOX암거·소형사방댐·옹벽 H=1.6)은 답이 안 왔음.** +3번과 같은 결(「나중에 실무 문서 첨부」)로 보고 **기다림.** 임의로 만들지 말 것. + +#### 작은 것 다섯 + + +| # | 물음 | **확정** | +| --- | --------- | -------------------------------------------------------------------- | +| 1 | 공구손료 비율 | **지금은 안 넣음. 다만 숫자를 넣으면 되게 열어 둘 것** — 칸을 만들되 기본은 빔, 비면 안 붙음 | +| 2 | 물빼기 구멍 | **국가기준으로 감**(Ø50 · 2㎡당) **+ 숫자 변경 가능하게** | +| 3 | 막자갈 식 | **실무식으로** — `(상 + 하) ÷ 2 × H` | +| 4 | 체적·석적 두 줄 | **실무대로 세울 것** | +| 5 | 옹벽 기초잡석 | **실무가 어떤지 확인하고 일단 따라갈 것** ⚠ 두 원본이 「없음」으로 일치했으므로 **더 볼 실무 자료가 있는지부터** | + + +⚠ **여섯째(규준틀 목재 손율)는 답이 안 왔음** — 시트에 늦게 붙어 못 보셨을 수 있음. **다음에 여쭐 것.** +지금은 **아무도 안 곱하는 상태** 그대로 두고 사유만 유지. + +**⇒ 이 확정으로 풀리는 것** — 시트 답 대기 아홉 중 **일곱이 닫힘**. 남은 것은 **3번·8번(자료 대기)**뿐. + +**구현 상태 (2026-09-13 코드·커밋 전수 대조, 랩탑 메인)** + +- [x] 큰 것 1·2·4·5·6 — 코드에 섬(`0e841b35` 노티스 걷음 · `857a93f0` 지장목 두 줄 · 뿌리 운반 FP-10-12 사유 · `962bbfe9` 임목파쇄 칸 기본 꺼짐 · `691b356e` 제근 면적 축+교차 참조). 검증 대기. +- [x] 작은 것 1·2·3·4 — 코드에 섬(`83c842e3` 공구손료 칸 · 물빼기 Ø50·2㎡ 등록부 칸 · `252e6b54` 막자갈 실무식 · `f6f9392e` 체적·석적). 검증 대기. +- [x] 큰 것 7 — 식·잠정 표기·**종류 갈래**(야면석 관측표 / 나머지 계산식)는 섬(`stone_weight_per_m2` 한 벌 · 돌쌓기·골막이 공용). 낡은 설명 둘을 고침(`2e6cfe5d` — 표의 「사용자 확정 대기」 · 관측표 주석이 코드와 반대). + - **검증** (2026-09-13 랩탑 메인) — `test_b08_stone_kind` · `test_revetment_stone_fields` · `test_b08_unit_quantity` 48건 통과, 값 불변. ⚠ **계획 대비 차이** — 채움률·비중을 종류별 **표로 빼지는 않음**: 지금은 식을 쓰는 세 종류가 **같은 값**(0.77·2.65)이라 표로 옮기면 같은 수 세 벌이 되고, 0.77 은 석적 줄도 같이 씀. **종류별로 다른 값이 실무자 협의로 오는 날** 표로 뺄 것. +- [x] 작은 것 2 딸림 — 표준도 그림 주석이 구조물별 물빼기 값이 아니라 기본값을 씀 — 커밋 `af139d65`. + + **자체검증** (2026-09-13 랩탑 보조) — 그림이 수량표와 **같은 함수**(`weep_hole_spec`)를 부르게 고침. + 화면 실측(ORCA 5174 · 프로젝트 `랩탑_보조`) — 돌쌓기(찰) 한 기에 물빼기 Ø75 · 3㎡ 를 넣고 저장한 뒤 + 표준도 3장 도면 글자가 **「물구멍 Ø75 — 3㎡당 1개소」**로 바뀜(전에는 늘 「2㎡당 1개소」, 지름은 아예 안 적었음). + 안 정한 장은 국가기준 Ø50 · 2㎡당으로 뜨는 것을 시험으로 굳힘 — + `resources/tester/test_b07_standard_spec_blinding_weep.py` 5건. 전체 `pytest` **1344 통과 · 22 건너뜀**. + 계획 대비 차이 — 지름까지 함께 적음(전에는 면적만 적혀 어느 지름인지 도면으로 알 수 없었음). + +- ⏸ 큰 것 3·8 · 여섯째(규준틀 손율) — 자료·답 대기 그대로. +- ⏸ 작은 것 5(옹벽 기초잡석) — 원문 전수 확인 결과 「없음」(`docs/raw/verification/2026-09-09b_확인으로_닫은것.md`)인데 코드는 3차 ② 로 0.30㎥/m 를 세고 있음 — **셀지 말지 사용자 확인 자리**. + +### ⭐ 사용자 확정 4차 — 2026-09-09 밤 (흙막이 표현) + +**「흙막이는 횡단도에서 표현방식들과 옵션들은 동일하게 반영하면 될거야. 형상은 동일해. +물론 데이터는 분리하여 계산되어야함.」** — 사용자 원문. 아래가 정본임. + + +| 무엇 | 확정 | +| ------------ | ----------------------------------------- | +| **횡단도 표현방식** | **기슭막이와 같게.** 따로 그리지 않음 — 같은 그리기 경로를 씀 | +| **옵션(입력 칸)** | **기슭막이와 같은 벌.** 새 옵션 체계를 만들지 않음 | +| **형상** | **같음.** 단면 모양이 다르다고 보지 말 것 | +| **수량·데이터** | ⚠**분리 계산.** 원단위·공종코드·성분 줄은 **흙막이 자기 것**으로 | + + +**⇒ 그러니 일이 이렇게 갈림** + +``` +한 벌로 쓰는 것 횡단도 그리기 · 기하 · 옵션 칸 · 화면 표시 +따로 두는 것 수량 전개(형식별) · 원단위 · 공종코드 · 자재 줄 +``` + +⚠ **랩탑 보조가 「축이 달라 기슭막이 식을 안 빌리겠다」고 한 판단은 수량 쪽에서는 그대로 유효함** +(교본 앞면 1:0.3 · 뒷면 수직 · 천단 30㎝). **사용자 확정이 덮는 것은 「그림·옵션」이고, +「수량 계산」은 오히려 분리하라고 못 박은 것임.** 둘을 헷갈리지 말 것. + +⚠ **형식별 수량 원천** + +``` +떼 정본 「떼흙막이」(개소당) — 떼 1.39㎡ · 바닥파기 0.17㎥, 치수는 원문이 「평균」으로 붙박이 + (랩탑 보조가 확보. `soil_guard.form` 에 「떼」 추가됨 — 2026-09-09 랩탑 메인) +돌(찰)·돌(메) · 콘크리트 · 블록쌓기 · 돌망태 · 흙포대 · 통나무쌓기 + ⚠ 정본에 탭 **없음**. 수량 원단위는 여전히 미확보 — 지어내지 말 것 +``` + +**⇒ 즉 지금 수량이 서는 흙막이는 「떼」 하나뿐이고, 그림·옵션은 전 형식이 기슭막이와 한 벌임.** + +- [x] **구현 상태 (2026-09-13 전수 대조)** — 표현방식·옵션·형상은 기슭막이와 한 벌로 섬(`8c883564` · `common_util_structure_walls.ts:61`). 수량은 자기 전개식으로 갈라 섬(`cbadb7fd` 떼). 나머지 일곱 형식 원단위는 **자료 대기**(위 「형식별 수량 원천」 그대로). 검증 대기. + +### ⭐ 사용자 확정 2차 — 2026-09-09 저녁 (열한 건) + +**이 절이 정본임. 다시 묻지 말 것.** 근거·선택지는 결정 시트(`3afcfb05`)에 있음. + + +| # | 물음 | **확정** | 해야 할 것 | +| --- | ------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| ① | 층따기 단위 | **㎡ 유지.** 부피는 **사용자가 지정한 길이값을 곱해** 씀 | 면적이 정본.**길이(깊이) 입력 칸 하나** + `㎥ = 면적 × 길이`. 그러면 ㎥ 단가를 그대로 씀 — 단위 불일치가 풀림 | +| ② | 벽 평균두께 | **실무 도면 하단 계산값을 우선 적용** | 정본 0.83 계열을 먼저 넣고 대 볼 것. ⚠**방향** — 상단 도면 + 하단에 **엑셀 같은 수식이 든 표**, **사용자가 값을 바꿀 수 있게** | +| ③ | 기계 노임 | **기술문서 DB 먼저 뒤질 것.** 없으면 **실무 기준 + 노티스** | ⚠ 고용보험·기계감가상각 등**더 붙는 것이 있는지**부터 확인 | +| ④ | 터파기 | **횡단도에 표현부터 구현.** 교본·실무문서를 보고 만들 것 | 노티스 붙이고,**그다음 사용자가 고를 수 있게** | +| ⑤ | 돌 중량 | **기술지식 DB 확인 → 없으면 현재 유지** | 유지하되**나중에 프로그램에서 확인할 수 있게** 근거를 남길 것 | +| ⑥⑦⑧ | 막자갈 식 · 체적/석적 줄 · 기초·천단 축 | **연계된 하나로 봄.** 정본이면 **검증 프로젝트에 이미 계산·저장돼 있을 것** — 확인하고 말할 것 | 저장분 확인 +**기술정보 DB 추적**. 그 결과를 보고 정함 | +| ⑨ | 야면석 계수 | **품셈 열이 기본**, 사용자가 고를 수 있게 | 기본값만 바꾸고 덮어쓰기 칸 | +| ⑩ | 채움 콘크리트 | **기본 210**, 사용자가 고를 수 있게 | | +| ⑪ | 잡석다짐 폭 | **기준 구조물에서 유도** — 같은 값을 공유 | 예: 기슭막이면**하단 길이 × 종단방향 폭 × 높이**로 부피. 구조물 제원에서 끌어낼 것 | + + +**⇒ 방향 한 줄** — ②가 말하는 「상단 도면 + 하단 수식 표 + 사용자 편집」이 **표준도의 최종 모양**임. +계산식을 코드에 숨기지 말고 **표에 드러내고 고칠 수 있게** 하는 쪽으로 감. + +- [x] **구현 상태 (2026-09-13 전수 대조)** — ①(`b6bc9b9a` 층따기 길이 칸) · ③(`6d607934` 조종원 계수) · ④(`bec7e841` 터파기 횡단도+기초 선택) · ⑤(`a69f8af8`) · ⑥⑦⑧(`252e6b54`·`f6f9392e`·`d175c6e4`) · ⑨(야면석 계수 칸) · ⑩(채움 210) · ⑪(`fe032bcc` 잡석다짐 폭 유도) 코드에 섬. 검증 대기. +- [ ] ② 벽 평균두께 — 식(`8141eb34`)·두께 칸(`3a64bb5b`)·상단 그림+하단 표는 섬. **표 칸이 고칠 수 있는 수식이 아님** · 그림은 찰·메 돌쌓기만. 하루~이틀 규모라 이번 정리에서 안 함. + +### 확정 1~11 (정하신 것) + + +| # | 물음 | **확정** | 구현이 해야 할 것 | +| --- | ------------ | --------------------------------- | -------------------------------------------------- | +| 1 | 어떤 돌 | **구조물마다 고르게** | `stone_kind` 를 구조물별 입력 칸으로. 비어 있는 넷을 채우면 계수가 따라감 | +| 2 | 사나 캐나 | **기본 「캔다」, 구조물마다 바꿀 수 있게** | 법 문구·실무 관행이 둘 다 이쪽.**사토 「채집석 공제」도 함께 들어감** | +| 3 | 자재값 출처 | **둘 다** — 업체 견적·지역 상차가 **와** 물가지 | 출처를 고르는 칸 + 업체명·날짜·쪽수를 함께 받아 둘 것 | +| 4 | 콘크리트 타설 | **현장 조건에 따라 고르게**(㉰) | 몸체·채움 각각 고르는 칸. 실무 기본(몸체 레미콘 / 채움 기계비빔)은**제안값**으로 | +| 5 | 표준도 범위 | **진행** | 표(나흘) → 돌쌓기 그림(닷새) → 나머지 일곱(대엿새) 순서대로 | +| 6 | 값 고치는 자리 | **한 곳에서 정하고 도면은 비추기만**(㉮) | 자재 카탈로그가 정본. 도면 표에 [여기서 고치기] 단추 | +| 7 | 층따기 단위 | **㎡ (실무 관행)** | ⚠**대신 B06 횡단·종단 설계에서 그 면적이 실제로 나와야 함** | +| 8-1 | 야면석 채집 「인 부」 | **바꿔쓰기 허용** | 규정이 허용하는 「유사 직종으로 바꿔 쓰기」로 보통인부 적용 | +| 8-2 | 버림 콘크리트 | **기본 보이게, 뺄 수도 있게** | 두께 100㎜(KDS)·폭은 잡석다짐 폭. 넣고 빼는 칸 | +| 8-3 | 틈메우기돌 | **실무 구조물도를 보고 넣을 것** | 실무 표준도(구조물도) 확인이 선행 — 확인 전 임의 확정 금지 | +| 8-4 | 편책 | **별도 제작 후 연결** | 바자얽기(5-15)를 빌려 쓰지 않음.**일위대가를 따로 만들어 연결** | +| 9 | 돌쌓기 기울기 | **품셈 표준경사 표대로 자동 + 사용자가 바꿀 수 있게** | 높이·메찰·성절토로 자동 판정, 덮어쓰기 칸을 둠. 교본 축(시설 종류)은 덮어쓰기로 처리 | +| 10 | 물빼기 구멍 | **한 값이 기본, 구조물별로 다르게도 가능** | 기본 Ø50 · 2㎡당(국가기준). 구조물별 덮어쓰기 | +| 11 | 채움 콘크리트 강도 | **고를 수 있게** | 180(국가기준 하한) / 210 선택. 기본값은 아래 「남은 물음」 참조 | + + +**구현 상태 (2026-09-13 전수 대조)** + +- [x] 1(`6f87a947` 돌 종류 칸) · 2(`11394d40` 캔다 기본+채집석 공제) · 7(`86437ce7` B06 층따기 면적) · 9(`0d577cf4` 표준경사 자동+덮어쓰기) · 10(물빼기 기본+구조물별) · 11(180/210 칸) — 코드에 섬. 검증 대기. +- [x] 8-1 야면석 채집 「인 부」 → 보통인부 준용 — 커밋 `b5f7f3c0`. + - **검증** (2026-09-13 랩탑 메인) — 고치기 전 `cached_build().unattached['FP-13-02-04'] == ['인 부']` 로 그 공종 일위대가가 **한 벌도 안 섰음**. 고친 뒤 뒷길이 다섯 × 밑수 둘 = **일위대가 10벌**이 보통인부 노임으로 서고 산출기초에 「준용(유사 직종 · 재경원 회계 45101-45)」이 뜸. 바꿔쓰기는 **그 공종에만** 걸림(전역 별칭 아님). 시험 `test_b09_similar_occupation.py` 3건 · `test_b09_basis_sheet.py` 함께 통과 · 전체 `pytest resources/tester/` **1335 통과 · 22 건너뜀**(V-12·돌 무게 설명 수정까지 포함한 상태). ⚠ 계획 대비 차이 — 근거 문구는 일위대가 상세 줄이 아니라 **산출기초 ③** 에 실음(`B09_Estimation_UnitPrice.py` 가 이미 1,000줄을 넘어 거기에 줄을 더하지 않음). + +- ⏸ 4 몸체·채움 타설 각각 고르는 칸 — 지금은 프로젝트 한 칸(`concrete_placing_method`)뿐. **2026-09-13 착수 전 멈춤(선행 물음 있음)**: 채움콘크리트는 **타설 줄 자체를 일부러 안 세움**(`B08_Quantity_Engine_Handoff_Rows.py:472` — 찰쌓기 품에 타설 품이 들었는지 확인 전이라 이중계상 방지). 원문 대조 결과 큰돌쌓기 13-6 은 [주]① 「채움콘크리트 품 포함」이 있으나 **13-4-4 찰쌓기에는 그 [주]가 없음**(`산림사업 표준품셈.md:7148~7163`). ⇒ 지금 채움 칸을 만들면 **할증 이름만 바뀌고 타설 금액은 안 섬**. 「13-4-4 채움콘크리트 타설 품을 따로 세우나」가 먼저 정해져야 칸이 뜻을 가짐 — **사용자 답 대기**로 옮김. + +- [x] 6 도면 표 [여기서 고치기] 단추 · 8-2 버림 콘크리트 화면에서 빼는 칸 — 커밋 `af139d65`. + + **자체검증** (2026-09-13 랩탑 보조) + · **버림 칸** — 셈(`wants_blinding`)은 이미 서 있었고 **끄는 자리만 없던 것**임. 등록부 네 종류 + (돌쌓기 찰·메 · 큰돌쌓기 · 기슭막이)에 `blinding_concrete` 칸 + 표준도 입력(`EDITABLE_KEYS`) + + 제원 폼 + 라우터 본까지 이음. 기본 **넣음**(KDS 44 90 00 100㎜). + 화면 실측 — B06 구조물 폼에 「버림 콘크리트 = 넣음」이 뜨고, B07 표준도 3장 제원 폼에서 + **「안 넣음」으로 저장하니 그 장 하단표에서 버림콘크리트 줄이 사라짐**(다른 장은 그대로 남음). + ⚠ **기초잡석 줄도 함께 빠짐** — 잡석은 버림에서 유도되는 줄이라 그렇게 됨(`_rubble_base_component`). + 의도한 것인지 확인이 필요함. + · **[여기서 고치기]** — 하단표는 CAD 안에 그려져 단추를 못 달고, 제원 폼은 도면 목록 아래라 장이 + 많으면 화면 밖으로 밀림. 그래서 **고정 액션 줄**에 둠(떠 있는 띠는 2026-09-02 에 걷어낸 자리라 + 다시 띄우지 않음). 표준도 장에서만 뜨고 누르면 제원 폼으로 스크롤 + 첫 칸에 초점. + 화면 실측 — 표준도 3장에서 단추가 뜨고(누르면 초점이 「돌 종류」 칸으로 감), 다른 도면에서는 숨음. + **값 복사본은 만들지 않음** — 폼 한 벌이 그대로 정본 창구. + · 시험 `resources/tester/test_b07_standard_spec_blinding_weep.py` 6건(선택지 문구가 엔진이 읽는 + 말과 같은지까지 — 다르면 골라도 안 빠지는 자리). 전체 `pytest` **1344 통과 · 22 건너뜀**. + ⚠ 검증 중 내 프로젝트(`936be972`) 정본을 만졌고 **되돌려 놓음** — 물빼기 두 칸·뒷길이·돌 종류·버림을 + 지워 장 목록이 다섯 장 그대로임. 다만 돌쌓기(찰) 한 기에 폼 기본값 + (`stone_supply 채집` · `stone_coeff_basis 품셈` · `fill_concrete_mpa 180`)이 남음 — 값이 기본과 같아 + 수량·장 제목은 안 달라짐. + ⚠ **기슭막이는 버림 칸이 등록부에만 섬** — 표준도 제원 폼이 돌쌓기 세 종류만 그려서 화면에서 못 끔. + 폼 대상을 늘리면 돌 종류 등 다른 칸까지 함께 떠 판단이 필요함 — 손대지 않고 남김. + - [x] **딸림 버그 — 폼이 「비워 두는 것이 뜻인 칸」에 첫 보기를 박던 것** (2026-09-13, 커밋 `cfa7da20`) + + 구조물 폼 select 는 「기본값 없는 **필수**」에만 빈 보기를 두어, `empty_means` 가 적힌 칸도 + 첫 보기가 골라진 채 저장됐음. `fill_concrete_mpa` 가 **180** 으로 박혀 엔진 기준값 + **210**(확정 ⑩)과 갈림 — 채움콘크리트 규격·단가가 조용히 달라지는 자리. + 빈 보기 판정을 「필수 + `empty_means`」 한 줄(`keepEmpty`)로 합치고 초기값도 같은 판정을 씀. + 기본값이 **있는** 칸은 그대로 첫 보기를 씀(2026-08-17 지시 유지 — 버림 「넣음」이 그 예). + **자체검증** — 엔진 실측: 칸 비우면 `spec 210` + 근거 「안 정해 기본값(확정 ⑩)」, + 180 을 고르면 `spec 180` + 「저장 제원에서 고른 값」. + 화면 실측(ORCA 5174 · `랩탑_보조`) — 돌쌓기(찰) 폼의 **채움 강도·야면석 계수가 「— 안 정함 —」** + 으로 뜸(전에는 180·품셈). 조달·버림은 등록부 기본(채집·넣음)이 그대로 뜸. 필수 칸은 「— 선택 —」. + 표준도 하단표 — 두 찰쌓기 장 모두 채움콘크리트 근거가 **「강도 210 — 안 정해 기본값(확정 ⑩)」** + 로 섬(고치기 전 한 장은 180 이었음). + 시험 `resources/tester/test_b05_empty_means_select.py` 4건 · 빈 보기 글자가 바뀌어 + `test_b06_detail_options.py` 의 감시 줄 한 개를 새 판정에 맞춤. 전체 `pytest` **1348 통과 · 22 건너뜀**. + ⚠ 검증에 쓴 내 프로젝트(`936be972`)는 **원상태로 되돌림** — 돌쌓기(찰) 두 기 모두 + `{height_m, length_m, foundation}` 뿐이고 표준도 장도 다시 **네 장 · 찰쌓기 한 장(2개소)**. + ⚠ **딸려 나온 것** — 폼이 쓰던 `before_m`·`after_m` 가 `PER_PLACE_OPTION_KEYS` 에 없어 + **위치 칸 때문에 장이 갈렸음**(같은 제원인데 찰쌓기가 두 장). 지금은 지워 한 장으로 돌려놨으나 + **장 나눔 축에서 위치 칸을 빼는 것**이 맞아 보임 — 판단 필요. + - [x] 위 「딸려 나온 것」은 랩탑 메인이 버그로 고침(`913923a0`) — **화면 확인 끝**(2026-09-13 랩탑 보조): + 찰쌓기 두 기 중 한 기에 `before_m 3 · after_m 7` 을 넣어도 표준도는 **찰쌓기 한 장(2개소)·전체 네 장** 그대로. + B07 도면 목록도 표준도 네 장. 확인 뒤 `before_m`·`after_m` 를 지워 원상태로 돌려놨음. + +- ⏸ 3(출처 고르기·견적 입력) — 5차 8번(사급 설계) 선행 · 5(표준도 그림) — 찰·메 돌쌓기만 섬, 나머지는 자료 대기 · 8-3·8-4 — 실무 구조물도·편책 구성 자료 대기. + +## ⭐ 사용자 답 대기 — 한자리 목록 (2026-09-09 밤 모음) + +> **왜 모았나** — 코드로 할 수 있는 것이 오늘 거의 바닥났고, 남은 것은 대부분 **사용자가 +> 정해 줘야 움직이는 것**임. 흩어져 있으면 「무엇을 여쭤야 하는지」가 안 보여 한자리에 모음. +> **원문은 각 절에 그대로 있음** — 여기는 목록이고, 셋만 적음: +> **무엇을 정해야 하나 / 왜 우리가 못 정하나 / 정하면 어떻게 되나.** +> ⚠ 값은 **하나도 임의로 굳히지 않았음.** 지금은 전부 사유로 드러나 있음. + +### 금액이 크게 움직이는 것 — 먼저 여쭐 넷 + + +| 무엇을 정해야 하나 | 왜 우리가 못 정하나 | 정하면 어떻게 되나 | +| --------------------------------- | ------------------------------------------------------------ | ------------------------------ | +| **사급 자재 단가 — 누가 견적을 넣나** (9장) | 「못 구함」이 아니라 **누가 넣느냐**의 문제임. 물가정보 API 몫과 업체 견적 몫을 가르는 설계가 먼저 | 자재비 자리가 통째로 서고, 그 위에 제비율이 붙음 | +| **표토제거 축 셋 — 실무·원문이 우리와 다름** (8장) | 실무 시트와 원문이 서로 다르고 우리 축은 그 둘 어디와도 안 맞음 | 표토제거 2,359.03㎥ 가 어느 축으로 설지 정해짐 | +| **품 할증을 여럿 고를 때 합산인가 곱인가** (9장) | 품셈이 여러 할증을 함께 쓰는 법을 안 적어 둠 | 할증이 붙는 모든 줄의 품이 한 번에 갈림 | +| **노체다짐(9-16-2)을 셀 것인가** (9장) | 실무가 성토 다짐을 따로 세기도 하고 안 세기도 함 | 성토 구간 전체에 줄이 하나 서거나 안 섬 | + + +### 자료가 와야 닫히는 것 — 다섯 + + +| 무엇을 정해야 하나 | 왜 우리가 못 정하나 | 정하면 어떻게 되나 | +| ---------------------- | ---------------------------------- | -------------------------- | +| **소단 · 소형사방댐 원단위** | 소광리 53탭에 **탭 자체가 없음**(전수 확인) | 그 둘의 물량이 섬 | +| **BOX암거 원단위** | 실무 자료에 **없음이 확정**됨(관측·소광리 둘 다 0건) | 표준 단면이 오면 전개식이 섬 | +| **폐기물처리비 원문** | 「못 찾음」이 아니라 **원문을 안 갖고 있음** | 총원가 안팎 자리가 정해짐(V-18 과 한 벌) | +| **규준틀 재료량 · 층따기 높이·폭** | 실무 관측값은 찾았으나 **관행값 후보**라 확정 근거가 아님 | 두 공종의 밑수가 확정값으로 바뀜 | +| **종자·비료 단가** | 물가지·견적 품목이라 사급 미결과 같은 자리 | 씨앗뿜어붙이기 재료비가 섬 | + + +### 실무 관행을 물어야 하는 것 — 아홉 + + +| 무엇을 정해야 하나 | 왜 우리가 못 정하나 | 정하면 어떻게 되나 | +| ------------------------------- | -------------------------------------------------------- | --------------------- | +| **하단표 양식을 실무 것으로 맞출 것인가** (4장) | **납품 양식**이라 사무소마다 다름 — 표본이 한 곳뿐 | 표준도·횡단도 하단표 모양이 확정됨 | +| **옆도랑파기를 몇 갈래로 가를 것인가** | 우리 둘(토사·암) ↔ 실무 셋 | 측구터파기 줄 수가 갈림 | +| **「노면고르기」와 우리 「노면다짐」이 같은 공종인가** | 이름이 다르고 실무 값 3.0 의 출처를 모름 | 노면 줄이 하나로 합쳐지거나 둘로 남음 | +| **옹벽 기초잡석·터파기를 셀 것인가** | 품셈은 품만 주고 실무 안에서도 갈림 | 옹벽 줄에 잡석·터파기가 서거나 안 섬 | +| **물구멍 관 길이·규격·간격** | 정본은 평균두께(0.83m), 우리는 상수 0.5m — 정본 쪽이 이치에 맞으나 확정 목록에 없던 줄 | 물구멍 자재·단가가 확정됨 | +| **뒷채움 폭 칸을 둘 것인가** | 문서마다 0.30/0.45 ↔ 0.30/0.60 으로 다름 | 막자갈 밑수가 확정됨 | +| **녹화 반영률 100 %** (V-13) | **법은 100 %**, 실무 사례는 80 — 설계자 판단 자리 | 녹화 공종 물량이 갈림 | +| **버림을 빼면 기초잡석도 빠지나** (확정 8-2 · 2026-09-13) | 지금 코드는 잡석을 **버림 폭에서 유도**해 버림을 끄면 잡석 줄도 사라짐(`_rubble_base_component`). 두 확정(8-2 버림 빼기 · 3차 ② 잡석 0.2m)이 서로를 말하지 않음 | 버림만 빠지고 잡석이 남거나, 둘이 함께 빠짐 | +| **찰쌓기 채움콘크리트 타설 품을 따로 세우나** (확정 4 · 2026-09-13) | 큰돌쌓기 13-6 은 「품에 포함」이라 적었으나 **찰쌓기 13-4-4 엔 그 [주]가 없음** — 지금은 이중계상이 겁나 타설 줄을 안 세움 | 세우면 몸체·채움 타설 방식 칸을 가를 뜻이 생김(확정 4 가 풀림) | + + +### 우리 화면·표기 판단 — 아홉 + + +| 무엇을 정해야 하나 | 왜 우리가 못 정하나 | 정하면 어떻게 되나 | +| ----------------------------------------- | -------------------------------------------------------- | ------------------------ | +| **큰돌쌓기 그림 — 직경에서 두께를 내는 법** (4-12) | 품셈 13-6 은 **직경** 축, 우리 그림 식은 **뒷길이** 축 — 축을 잇는 것은 도메인 판단 | 표준도 1장에 그림이 섬(지금은 사유만 뜸) | +| **관 줄 셋 — 관종 칸 · 세월교 섞임 · 유출부 이중계상** (8장) | 실무 표기 관행을 모름 | 관 줄이 실무 모양으로 갈림 | +| **표 모양 넷에 깃발이 없음** (8장) | B09 판정 기준이 정해져야 함 | 전치형·2단 머리 등 네 모양이 자동 판정됨 | +| **미교차 측점만 반폭 +5m 로 다시 뜰 것인가** (3-10) | 다시 뜨는 비용과 값의 이득을 사용자가 저울질할 자리 | 사면이 원지반을 못 만나는 측점이 줄어듦 | +| **관급/사급 「발주기관 결정」 문구** (V-14) | 문구만 고치면 되나 **B08 화면은 데스크탑 메인 몫** | 사용자가 「미완성」으로 오해하지 않음 | +| **지장목제거 품셈 항목** (9장) | 품셈이 벌목을 **목적별로만** 갈라 맞는 공종이 없음 | 지장목제거 단가가 붙음 | +| **새 프로젝트 관급/사급 기본값을 사급으로** (확정 3차 ⑤ · 2026-09-13) | 확정은 「전부 사급」인데 코드 기본은 「미정(발주기관 결정)」 — 주석이 「발주 결정이라 비워 둠」으로 일부러 둠 | 새 프로젝트도 처음부터 사급으로 섬 | +| **기슭막이 횡단 그림도 품셈 표준경사표를 따르나** (4-5 · 2026-09-13) | 수량은 표준경사표로 자동 판정, 그림은 0.3 붙박이 — 잇는 순간 벽 발끝·노폭 연장·성토 면적이 바뀜. 표 스스로 「기슭막이는 축이 다름(교본 메 1:0.5)」이라 적음 | 그림과 수량의 기울기가 한 값이 됨 | +| **기슭막이 표준도 제원 폼을 열 것인가** (확정 8-2 · 2026-09-13) | 버림 칸이 등록부엔 섰으나 표준도 폼이 돌쌓기 세 종류만 그림 — 폼을 늘리면 돌 종류 등 다른 칸도 함께 뜸 | 기슭막이도 표준도 화면에서 버림·제원을 고침 | + + +⇒ **스물일곱**(2026-09-13 다섯 더함 — 계획서 줄이기 중 나온 것). 이 목록은 **모으기만 한 것**이고 값은 각 절에 그대로 있음. 답이 오면 +**그 절에서 닫고** 여기서는 지울 것. + +## 0. 공통 기반 — B05·B06이 한 페이지로 움직이기 위한 뼈대 + +### 0-5. 관 옵션 폼 — 세트를 짝으로 다시 만들게 배선 + +- [ ] **[반나절]** 관 옵션 폼이 바뀔 때 **세트 전체를 짝으로 다시 만들게** 배선 — 지금은 + + `B06_Section_UI_Page_Pipe_Options.ts` 가 스펙 칸을 하나씩 옮겨 적음(부분 사본). + - **2026-09-06 판단: 지금은 안 함.** 살아 있는 결함이 아니라 **유지보수 위험**임(새 옵션을 + 더할 때 폼 경로가 그것을 안 옮길 수 있음). 반면 지금 고치려면: + ① `buildCulvertSets` 는 관 지점의 **facility + 전체 options** 를 받는데 B06 에는 그 값이 + 없음(`section.culvert` 스펙만 있음) — 관 지점을 B06 까지 끌어와야 함 + ② 폼 → 조정창 되받기(높이·형태는 `revet_adjust` 로 감)와 **형태별 높이 한계 되돌리기**가 + 이 자리에 얽혀 있어 통째로 갈면 그 둘을 다시 세워야 함. + 새 옵션을 더할 일이 생기거나 값이 실제로 갈리는 것이 관찰되면 그때 할 것. + - **2026-09-09 다시 봄 — 아직 안 함(사유 갱신).** 까닭 ①은 **풀렸음**: B06 이 + `fetchDetailPipePoints` 로 관 지점(facility + 전체 options)을 이미 받아 옴 + (`B06_Section_Api_Culvert_Options.ts`). 까닭 ②는 **그대로임** — 폼 → 조정창 되받기 + (`revet_adjust` 의 높이·형태)와 형태별 높이 한계 되돌리기가 이 자리에 얽혀 있어, + 세트를 통째로 다시 만들면 그 둘을 다시 세워야 함. **하나가 남아 억지로 하지 않음.** + - **대신 오늘 한 것** — 폼 칸 20개를 캐시 경로와 대조해 **빠진 칸 셋**을 찾음. + · `revet_foundation`(기슭막이 기초) — **그리기가 읽는 값**(터파기 파선)인데 안 옮겨 + 적고 있었음 ⇒ 이어 붙였음(커밋 `e2380ea5`). + ⚠ **화면으로는 못 눌러 봄** — 이 칸은 상세(`phase: detail`) 값이라 B06 배치 폼에 + 아직 안 뜸(정본에도 전부 비어 있음). 칸이 화면에 서면 그때 실측할 것. + · `inlet_basin_form`·`inlet_basin_material` — **수량 전용**(B08 이 정본에서 읽음)이라 + 캐시에 안 실어도 됨. 사유를 시험에 적어 뒀음. + - 시험 `test_b06_pipe_form_keys.py` 추가 — **새 폼 칸이 캐시 경로에서 빠지면 잡음**. + 통짜 배선을 못 하는 동안 「조용히 안 닿는 값」을 막는 자리임. + +## 3. B06 횡단설계 + +### 3-9. 소단(berm) — 확정값과 남은 것 (2026-09-07 사용자 지시) + +**자리** — 소단·소단측구 둘 다 **구조물 배치 컨테이너 안**임(사용자 정정). 소단은 「사면안정」군, +소단측구는 「종단배수」군. 연장은 놓은 구간 길이로 다른 구조물과 같은 길에서 나옴. + +**폼 기본값 확정 (2026-09-07)** — **폭 0.5m · 간격(사면길이) 3.0m · 안쪽 기울기 0°** + +- 근거 — 별표2 범위(사면길이 2~~3m마다 · 폭 50~~100㎝) 안에서 **가장 적게 파는 조합**. +기본값은 **되돌리기 쉬운 쪽**이어야 함 — 더 넣는 것은 폼에서 한 번이지만 이미 판 것을 +되돌리면 전 측점 재계산임. +- ⚠ **소단은 비탈을 완만하게 만듦** — 1:1 절토면 기준 실효 경사가 0.5·3m 면 1:1.24 인데 +1.0·2m 면 **1:1.71** 로 서서 다른 비탈이 됨. 기본을 넓게 잡으면 안 되는 까닭. +- 소단측구를 나중에 올리려면 폭이 모자람(측구 0.5~1m) — 그때 사용자가 **1.0m 로 올리면 됨**. + +**벽이 선 측점은 소단을 안 놓음** — 성토측에 기슭막이가 서면 성토 설계선을 벽 상단에서 끊으므로 +소단이 끼어들 사면이 없고, 다단 벽은 단 사이 성토부선이 이미 소단 노릇을 함. +**판정 단위는 측점**(구간째 거부하면 배수관 유출 기슭막이 때문에 못 쓰게 됨 — 시험 48곳). + +- [ ] **[반나절 · 사용자가 뒤로 미룸]** **소단측구를 「그릴」지는 뒤로** — 사용자 확정 ㉯(「일단 수량만, 그림은 나중에 검토」). + + 지금은 **값만 받고 안 그림**이라 「사면 쪽 기울기」(소단과 반대 부호)는 기록만 되고 + 화면에 안 보임. 그리기로 하면 그때 **부호를 화면에서 확인**할 것(시험으로는 안 걸리는 자리). + +### 3-10. 사면이 원지반을 못 만나는 측점 — 실측과 판단 (2026-09-07 데스크탑 창 제기) + +**판단** — 현행(경고 표시) 유지가 맞음. 미교차 **22곳/105(21%)** 중 **절반 이상이 지형상 영원히** +**안 닫히고**(계곡·절벽 쪽으로 지반이 달아남), 닫히는 쪽도 중앙값 +3m 이나 **꼬리가 +292m** 라 +전역 확대는 값이 안 나옴. **수량이 적게 나오는 것은 사실**이므로 **표기로 막는 것이 맞음.** + +- [ ] **[답 대기]** **선택지(사용자 판단 대기)** — **미교차 측점만 반폭 +5m 로 다시 떠서 재계산**하면 + + 절반 정도가 실제 값으로 바뀜. 수단은 이미 있음(`ensureSampledWidth` — 측점별 반폭 재생성). + 비용은 그 측점만 백엔드 재샘플(20여 곳 × 1초 안팎). **전역 확대는 하지 말 것.** + +## 4. B07 도면 아래 표 — 표준도(구조물도) · 횡단도 (2026-09-08 사용자 지시) + +### 4-1. 무엇을 만드나 — 사용자 방향성 + +**표준도 = 구조물도임**(사용자 정정 「도면 내용 중에 표준도가 구조물도임」). +그 프로젝트에 들어간 구조물의 **표준을 적은 장**이고 다른 도면과 성격이 다름. + +- **한 장 = 상단 도면 + 하단 단위당 정보표**(단위 **길이 · 면적 · 단가**). +- **실무는 엑셀 복사·붙여넣기로 만들었음.** 우리는 **내장 CAD 에서 그림도 표도 고칠 수 있게** 함. +- **도각(테두리·표제란) 필요 없음.** +- 프로젝트에 들어간 **구조물을 하나씩 하단 탭**으로 늘어놓아 확인. +- 표 값은 **영구저장소가 필요할 수 있음** — 확인할 것(4-5). +- **이 표는 B08 로 이어질 것.** + +✅ **교본 근거도 있음** — 「구조물도는 … **표준도** … 등으로 **갈음할 수 있다**」(임도기술교본 3-3 +실시설계). **사용자 정정이 교본과 같음.** + +**실무 원본 실물** — 울진소광 `07-구조도-소광리.xlsx`, **보이는 22탭 + 숨긴 31탭**, +**탭 하나 = 구조물 하나**. 탭 안은 **위 치수조서 + 아래 부위별 수량표**. +표는 **가로 모양**(`공종 | 규격이 열 머리 | 단위`)이고 별도 「규격」 열이 없음. +일부 탭은 `공종 | 산출 논리 | 수량 | 단위`. +⚠ **「단위당」의 단위가 구조물마다 다름** — 날개벽·집수정·돌골막이 **개소당**, +돌기슭막이·수로류·옹벽류 **m당**, 돌붙임 **㎡당**. **통일하지 않음.** +⚠ **단가·금액 열이 원본 어디에도 없음** — 사용자가 말한 「단가」는 **새로 넣는 칸**임. 넣는 모양은 4-3 요약. + +### 4-3. ⭐ 조사·합의에서 정해진 것 — 요약 + + +| 무엇 | 정해진 것 | +| ------------- | -------------------------------------------------------------------------------------- | +| **장 나눔 축** | **제원 조합 하나 = 한 장**(종류 수가 아님). 제원에 기울기가 들어 있어 **기울기가 바뀌면 장이 갈림** | +| **하단표 값 출처** | B08`build_unit_table` 결과를 **표 모양으로 접기만** — 계산을 새로 만들지 않음 | +| **단위** | 구조물마다 다름(날개벽·집수정·돌골막이**개소당** · 돌기슭막이·수로류·옹벽류 **m당** · 돌붙임 **㎡당**). **통일하지 않음** | +| **단가 칸** | 실무 원본 53탭 어디에도 없음 —**우리가 새로 넣는 칸.** 공종 줄마다 단가 + 맨 아래 1m당 총액 **둘 다** | +| **단가를 넣는 자리** | 「기초자료」 탭**한 곳**. 도면은 **비추기만** (확정 6번) | +| **값을 고치는 동작** | **표 칸에서 바로.** 좌측 폼은 두지 않음 | +| **저장 자리** | `project_settings.json` 의 **자기 구획 하나**(`save_section()`, B08 이 이미 그 문을 씀). **DB 안 만듦** | +| **B08 과의 관계** | **안 겹침. 합치지 말 것** | +| **한 장의 모양** | 도각**없음** · 그림 6 : 표 4 · 상단 도면 + 하단 단위당 정보표 | +| **그림 본** | `cross_standard`(표준횡단도) 짜임을 본뜸. 여러 장 나눔은 `plan_lidar` 본 | +| **전면 기울기** | 품셈 13-4-4 「표준경사」로**자동 판정 가능**(직고·메/찰·성/절토로 갈림) + 사용자 덮어쓰기 (확정 9번) | +| **교본 근거** | 「구조물도는 …**표준도** … 등으로 **갈음할 수 있다**」(임도기술교본 3-3 실시설계) | + + +### 4-5. 아직 안 만든 것 — 명세 셋 + +#### 표 값을 어디에 저장하나 — ✅ DB 안 만듦 + +`project_settings.json` 의 `save_section()` 에 **자기 구획 하나**만 얻으면 됨(B08 이 이미 그 문을 씀). +도면 파일(`design/drawings/{id}.json`)에 남기면 **코드 판이 바뀔 때 날아감** — 그것이 문제였지 +**DB 가 필요한 것은 아니었음.** +⚠ 저장 키가 `drawing_id` 단위라 **프로젝트를 넘나들지 못함** — 공용 라이브러리는 별개 결정. + +#### 표에 세울 칸 여덟 — 요약 + +``` +전면 기울기 · 상단폭 · 뒷길이 · 재료 · 저판·벽체 두께 · 기초잡석 두께 · 물빼기 구멍 · 이음(줄눈) +``` + +**⇒ 지금 상태** — **뒷길이·재료·전면 기울기·물빼기는 등록부에 칸이 섰음**(2026-09-09). +남은 것은 **저판·벽체 두께**(옹벽만 실무 도면에서 나왔음) · **이음(줄눈)**(품셈에 줄은 있고 수량 칸이 빔). +⚠ **「재료」 칸 하나가 셋을 한꺼번에 풂** — 고임돌·뒤채움·공종 갈래가 다 돌 종류를 따라감. + +#### ⚠ 전면 기울기 이름이 넷으로 흩어져 있음 — 모으는 것이 이 일의 절반 + +`REVET_LEAN_RATIO`(TS · **실제 도는 값**) · `REVET_FACE_SLOPE`(파이썬 · 읽는 곳 없음) · +`options["face_slope_ratio"]`(등록부에 없는 키) · `data_masonry/*.json`(읽는 코드 없음). +`**data_masonry` 를 정본으로 삼고 넷이 그것을 읽게 할 것** — 파이썬이 이미 `face_slope` 를 +스펙에 실어 보내므로 **TS 가 상수 대신 그 값을 읽으면** 통로를 새로 안 파도 됨. **반나절 안쪽.** +⚠ 말풍선·도면 글자도 같은 값을 읽어야 함 — **글자만 0.3 으로 남으면 화면이 거짓말을 함.** +✅ 거울 시험은 필요 없음 — 벽 기하는 **TS 한 벌**이고 서버도 그 TS 를 Node 로 돌림. + +- ⏸ **2026-09-13 착수 전 멈춤 (랩탑 메인)** — 「반나절 · 통로만 잇기」가 아니었음. ① 수량(B08 `face_slope_ratio()`)은 기슭막이도 **품셈 표준경사표로 자동 판정**(메/찰 · 성/절토 · 직고)하는데 횡단 그림은 **0.3 붙박이** — 잇는 순간 **벽 발끝 자리·노폭 연장·성토 면적이 바뀜**(값이 움직임). ② 파이썬이 스펙에 싣는 `face_slope` 도 상수 0.3 이라 「그 값을 읽으면 끝」이 아님 — 성/절토 판정(측점 단면유형)을 관 세트 스펙까지 끌어와야 함. ③ `masonry_slope` 표 스스로 「기슭막이는 축이 다름(교본 메 1:0.5) — 사용자 덮어쓰기로 처리」라 적음. ⇒ **기슭막이 그림도 표준경사표를 따를지**가 먼저 정해져야 함 — 사용자 답 대기. + +### 4-12. ⭐ 표준도 만들기 — 착수 (랩탑 보조, 2026-09-09 사용자 「진행해줘」) + +**담당 랩탑 보조.** 순서는 결정 시트 확정 5번 그대로 — **1단계 하단표(나흘) → 2단계 돌쌓기 +그림(닷새) → 3단계 나머지 일곱(대엿새).** + +**⭐ 지금 어디까지 섰나 (2026-09-09 밤 전수 확인)** — **1단계 하단표는 네 장 다 섬**(V-9 닫음). +**2단계 그림은 절반 돌고 있음** — 코드가 있고 **뒷길이가 정해진 장에서는 실제로 그려짐**. +안 그려지는 장은 코드가 없어서가 아니라 **제원이 없어서**임. 못 서는 장에는 까닭을 화면에 +띄웠음(`dd8c86fa`). ⚠ 큰돌쌓기만은 규격 축이 **직경**이라 영영 못 그림 — 그림 대상에서 +빼고 사유만 띄웠고, 「직경에서 두께를 내는 법」은 **사용자 답 대기 목록**에 세웠음. + +#### ⚠ 횡단도 하단표 양식이 실무와 다름 — 답 대기 셋 + +출처를 못 찾았음(코드 주석·계획서·git 이력·지식DB 전부). **「우리 양식이 틀렸다」로 가지 않음** — +실무 표본이 **한 곳뿐**이고 사무소마다 다를 수 있음. **필요한 것은 판정이 아니라 출처**이고 +그 출처가 없음. + +- [ ] **[답 대기]** 하단표 양식을 실무 것으로 맞출 것인가 — **납품 양식이라 사용자 확정 자리.** +- [ ] **[답 대기]** 옆도랑파기를 **몇 갈래**로 가를 것인가 — 우리 둘(토사·암) ↔ 실무 **셋** + + (토사·연암·보통암). 4-9 ㉡ 이 「가를까」에서 「몇 갈래로」로 바뀜. +- [ ] **[답 대기]** 「노면고르기」와 우리 「노면다짐」이 같은 공종인가 — 실무 값 **3.0** 이 + + **노면 폭 3.0m 와 같음**(면적이 아니라 폭을 적은 것일 수 있음). 4-10 ㉪ 과 같은 줄. + +ⓘ **식생옹벽블럭도 터파기가 「기초 + 비탈」 두 줄**임(기초 0.82 + 비탈 1.77). 기슭막이 정본· + 옹벽에 이어 **세 번째 원본 근거** — 결정 시트 1번(비탈 터파기)에 힘이 실림. + +#### 3단계 — 나머지 일곱 종류: **그림 문제가 아님** + +그림을 못 그리는 게 아니라 **아래 표가 안 섬.** 기슭막이·골막이·바닥막이·개거·흙막이(떼)는 +3단계에서 섰고, 옹벽은 관측 원단위 **1규격뿐**이며 그 한 규격조차 **그림용 치수가 없음** +(원문에 두께·폭이 없음). 나머지는 원단위 미확보 사유가 화면에 뜸. + +**⇒ 3단계의 진짜 일감은 「그림 일곱 장」이 아니라 「수량 산출식 아홉 종류」임.** + +- [ ] **[답 대기]** 소단 · 소형사방댐 — 소광리 53탭에 **탭 자체가 없음**(2026-09-09 전수). + + BOX암거와 같은 자리 — 자료를 주셔야 물량이 섬. +- [ ] **[답 대기]** BOX암거 — **실무 자료에 없음이 확정됨**(2026-09-09): 관측 원단위 + + `not_found` 와 소광리 53탭 **둘 다 0개**. 「우리가 못 찾은 것」이 아니라 「실무에 없는 것」. + ⇒ 표준 단면(벽·저판·상판 두께)을 **사용자가 주셔야** 물량이 섬. +- [ ] **[답 대기]** 옹벽 기초잡석을 계상할지·두께를 얼마로 볼지 — 품셈 12-25 는 품만 주고 + + 두께를 안 정함. ⚠ 실무 「잡석 유/무」 축은 **dwg 파일 이름에만** 있고 계산표엔 없음. + +⚠ **구조물이 있는 프로젝트가 아직 없음**(내 `936be972` 는 0기). 표 칸이 서면 무엇을 심을지 +조율 창과 정할 것 — **심는 것은 아직 하지 않음.** + +### 4-13. ⛔ 중간 점검 시점의 상태 (2026-09-09 밤, 랩탑 보조) + +**표준도 — 지금 서 있는 것** + + +| 갈래 | 종류 | +| --------------- | ------------------------------------------------------------------------------------------------------------------------ | +| ✅**섬** | 돌쌓기(찰·메) · 큰돌쌓기 · 기슭막이(돌 계열) ·**골막이(돌)** · 바닥막이(돌붙임 찰·메) · 개거(두 규격) · **흙막이(떼)** | +| ⚠**칸만 오면 됨** | 옹벽 — 「식생옹벽블럭」 형식이 붙었고 치수는 소광리 「옹벽2.0」에 있음.**날개벽·집수정** — 정본 여섯 탭을 다 읽어 뒀고 개소당 7~8줄, 치수가 타입마다 붙박이라 **표로 옮기면 됨**(아직 시작 안 함) | +| ❌**자료가 없어 못 섬** | 소단 · BOX암거 · 소형사방댐 · 옹벽 H=1.6 · 흙막이 나머지 일곱 형식 · 골막이 나머지 다섯 형식 · 기슭막이 비(非)돌 형식 넷 | + + +⚠ **자료 없는 것은 일위대가를 임의로 만들지 않음**(확정 5차 3번 보류) — 사유만 화면에 뜸. + +- [x] **날개벽·집수정 하단표 — 이미 서 있음** (2026-09-13 확인, 랩탑 보조) + + **자체검증** — 표준도 하단표는 계산하지 않고 B08 전개를 접기만 하므로(`build_standard_sheets`), + 관측 원단위가 들어온 종류는 **저절로 섬**. 배수관에 형식을 채워 돌려 본 결과: + · `pipe_inlet_basin` (돌집수정 ㄷ형·콘크리트) — **개소당 5줄** (콘크리트 4.03㎥ · 모르터 0.157㎥ · + 터파기 21.1㎥ · 되메우기 2.6㎥ …), 단위당 못 낸 줄 0 + · `pipe_wing_wall` (C-TYPE Ø800) — **개소당 6줄** (기초잡석 0.6821㎥ · 콘크리트 1.109㎥ · + 유로폼 6.2309㎡ · 터파기 7.7269㎥ …), 단위당 못 낸 줄 0 + · 형식을 안 고르면 그 장 자체가 안 섬(빈 장을 만들지 않음) + · 옹벽 — **반중력식 H=2.0 은 섬**(8줄, 소광리 「옹벽2.0」 관측값). **식생옹벽블럭은 [자료 대기]** — + 관측 원단위가 없어 줄 0개 + 사유 「이 규격은 자료에 없습니다」만 뜸. 지어내지 않음. + ⇒ **치수를 표로 옮기는 일은 남아 있지 않음.** 굳히는 시험을 둠 — `resources/tester/test_b07_standard_sheet_rows.py` (3건). + 계획 대비 차이 — 「아직 시작 안 함」으로 적혀 있었으나 실제로는 관측 원단위·딸린 줄(`ATTACHMENTS`)이 + 이미 들어와 있었음. 표 행 정리는 조율 창 몫으로 남김. + +- [ ] **[답 대기]** **물구멍 관 길이** — 정본은 개소당 길이를 **평균두께**로 잡음 + + (H=2.0 에서 0.83m). 우리는 상수 **0.5m** 라 −40 %. **관이 벽을 가로지르므로 정본 + 쪽이 이치에 맞음.** 확정 5차 목록에 없던 줄이라 안 건드리고 주석·거울시험에 차이만 + 못박아 뒀음(`test_b08_stone_masonry_mirror.py`). +- [ ] **[답 대기]** **뒷채움 폭 칸** — 막자갈 밑수인데 제원에 칸이 없어 정본 0.30/0.45 + + 붙박이. 소광리는 0.30/0.60 이라 문서마다 다름 — 칸이 필요한지. + +### 4-10. 근거가 없어 막힌 것 — 요약 + +**⇒ 지금 살아 있는 것만 (2026-09-09 밤 기준)** + + +| 막힌 것 | 상태 | +| ------------------------------------ | ----------------------------------------- | +| 옹벽 H=1.6 원단위 · 소단 · BOX암거 · 소형사방댐 | **자료 없음이 두 원본으로 확정** — 사용자가 주셔야 함 (시트 8번) | +| 표토 축 셋 | **확정 대기** (시트 9번) | +| 큰돌쌓기 재료 원단위 | 13-6 [주]⑦ 「설계수량」 — 관측값 또는 확정 | +| 목재틀흙막이 원단위 | 각재·판재 카탈로그 보강 | +| 사급 자재 단가 · 관급/사급 | ✅**확정 5차로 닫힘** (전부 사급 · 물가정보 API) | +| 전면 기울기 · 측구 토사/암 · 기초잡석 · 제근 · 표토 두께 | ✅**확정·조사로 닫힘** | + + +⚠ **「빈 장」 목록과 「그릴 치수 없음」 목록은 같은 물음의 두 얼굴** — 치수를 정하면 수량·그림·표준도가 함께 섬. + +## 8. B08 수량·설계내역 + +### 8-35. 오솔길 대조 「채택 순서」 1~3 (2026-09-12, 데스크탑 보조) — 검증 대기 + +근거: 오솔길 토공로직 대조 아티팩트 06절. 데스크탑 메인 창이 배정, 세 건 다 끝내고 push 함 +(`1bfe1aa6` · `465dbb95`). + +- [ ] **④ 양식 갈아 끼우기 — 방향만 정하기** `[사용자 답 대기]` — 횡단도 아래 표의 열 구성을 + + 양식 파일로 뺄지. 「정답 양식 하나를 찾는다」에서 「갈아 끼운다」로 방향을 바꿀지만 정하면 됨. + 양식 목록은 사용자가 줘야 함. 법면보호공 2↔4갈래도 여기 딸림. **코드 착수 전임.** +- [ ] **⑤ 사방댐은 밑그림만 접어 둠** — 아티팩트 5절 ㉠~㉢. 착수 시점 미정, 지금 하지 말 것. + +### 8-29. ⚠ 사용자 확정 대기 — 요약 (원문은 옮겼음) + +**⇒ 그 목록이 지금 어떻게 됐나** + +``` +확정 5차(2026-09-09)로 **대부분 닫힘** — 돌 종류 · 콘크리트 타설 · 지장목제거 · 제근 단위 · + 돌 무게 · 관급/사급 · 층따기 단위 · 버림 콘크리트 +살아 있는 것 시트 8번(자료) · 시트 9번(표토 축) · 규준틀 손율 · 물빼기 길이 · 높은 벽 +아직 원문이 없는 것 폐기물처리비 · 중기 조종원 노임 계수(기재부 예규) +``` + +⚠ **다시 물으려면 그 아카이브부터 볼 것** — 「어디까지 찾아봤나」가 거기 있음. 안 보고 물으면 같은 조사를 두 번 함. + +### 8-32. 남은 손질 (2026-09-08 — 옛 8-30 을 접음) + +**B08 은 동작 상태임.** 아래는 손대다 만 것이 아니라 **확인은 끝났고 손을 안 댄 것**들이다. + +- [ ] **표 모양 넷에 깃발이 없음** `[사용자 답 대기 — B09 판정 기준]` — 전치형 21 · 2단 머리 6 · 좌우 두 판 9 · 뭉친 이름 7. + + 값이 틀린 것이 아니라 **마스터를 행-자원으로 읽는 다른 자리가 조용히 틀릴** 자리. + 깃발만 실으면 됨. ⚠ **B09 판정 기준을 먼저 물어 같은 잣대로 셀 것.** +- [ ] **관 줄 ㉠ — 관종(管種) 칸이 아예 없음** `[사용자 답 대기]` (2026-09-09 가름) + + 품셈이 관종으로 갈림 — `FP-12-11-02` 흄관(밑수 1 m · 1 개소, **표가 둘**) · + `FP-12-11-03` 파형강관(1 m). 지금은 **직경만** 있어 못 고름. 실무 울진이 파형강관인 것은 + **그 공사지 관행이지 우리 기본값이 아님.** ⇒ `pipe_material` 같은 칸 요청함. + 안 정하면 빈 값으로 두고 B08 이 「관종 미지정으로 공종을 못 고름」으로 드러냄(암 시공법과 같은 처리). +- [ ] **관 줄 ㉡ — 관이 아닌 점이 섞여 있음(세월교)** `[사용자 답 대기]` (2026-09-09 가름) + + 11점 중 **2점이 `facility: ford_bridge`(세월교)** 이고 `options` 가 비어 있음. + 그냥 세면 **세월교를 관으로 셈.** ⇒ 「`facility` 가 있으면 관이 아님」으로 봐도 되는지 확인 요청함 + (그러면 관은 9건). +- [ ] **관 줄 ㉢ — 유출부 기슭막이 이중계상 자리** `[사용자 답 대기]` (2026-09-09 가름) + + NO.85.05 에 `outlet_revet_length_m: 10` 이 있음. 기슭막이는 **구조물로도 배치될 수 있어** + 누가 세는지 정해야 함. 지금은 안 겹침(그 프로젝트 구조물은 돌쌓기(찰) 4 · 옹벽 1 · + 흙막이 1 · 큰돌쌓기 1). + ⚠ **관 줄이 서는 날 ㉡ 가드가 걸릴 자리임**(B09 지적) — 관 부설과 터파기·되메우기가 + 각각 오면 **같은 굴착을 두 번 셀 수 있음.** + +- [ ] **규준틀 재료량 — 실무 관측값을 찾았음(참고 후보)** `[사용자 답 대기]` (2026-09-08) + + ⚠ 2026-09-09 — 조율 창이 **「개소당 목재 규격·수량」 화면 칸**을 넘겼음(층따기 깊이·표토 + 두께와 같은 집안). 손율은 원문에 있음(비탈 50% · 수평 80%) — **규격만 받으면 바로 섬.** + 지금 규준틀 4,921,267원이 **인력 품만의 값**임. + 품셈 11-2·11-3 [주]④ 가 「재료량은 **설계수량에 따른다**」라 미확보로 두었는데, + 울진 라이브러리 §8 에 실측이 있음: + **규준틀 수평 | 개소 | 각재 50×50 0.0044㎥ · 판재 T12 0.0029㎥ · 못 0.03㎏** + ⚠ **실무값이라 후보이지 기본값이 아님**(★법대로). 비탈 규준틀 값은 그 시트에 없음. + **정할 것** — 이 값을 쓸지, 설계수량 입력 칸을 만들지. +- [ ] **⚠ 폐기물처리비 — 「못 찾음」이 아니라 「원문을 안 갖고 있음」** `[자료 없음 — 원문 확보 먼저]` (2026-09-08) — + + `법률/` 40개에 **폐기물 관계 법령이 한 건도 없음**(건설폐기물법·폐기물관리법 미보유). + **원문 확보가 먼저.** + +``` +국가지점번호판 500m마다 임도규정 제26조5항 ⚠ **법정 의무인데 줄 없음** · 품셈 공종도 없음 +안내판·준공표지판·차단기 제26조6항·교본11장 줄 없음 · 품셈 없음 +공사 입간판·현수막 교본 11장(견적) 줄 없음 · 품셈 없음 +가설창고(컨테이너) 〃 줄 없음 · ⭐ **품셈 FP-11-01 있음** +수방대책용 자재 〃 줄 없음 · 품셈 없음 +``` + +``` + ⚠⚠ **법 조문 성격이 갈림**(2026-09-08 원문) — **제26조는 「임도의 **보수·관리**」 조항**이고 + 원문이 「…국가지점번호판을 제작하여 **500미터 마다 설치·관리하되, 필요시 거리를 조정할 수 + 있으며**」임. **관리 의무인지 신설 설계 수량 의무인지 원문만으로 안 갈림** — 실무가 + 2개소·1km 였던 것과도 얽힘. **사용자 확인 자리.** + ✅ **안내판은 의무 맞음** — 제26조⑥ 「시점 및 종점에 안내판 … **설치하여야 한다**」. + ⚠ **차단기는 법령·행정규칙에 없음**(교본 11장만). + ⚠ **편책은 임도 법령엔 없고 사방 행정규칙에 있음**(`사방사업의 설계·시공 세부기준:147` + 「편책·바자얽기」) — **공법 설명뿐 수량 밑수 없음.** 그대로 막힘. + ✅ **실무 확인(2026-09-08) — 번호판만 실물 근거가 있고 나머지 넷은 실무에도 없음.** + · 국가지점번호판 — 울진 1공구 수량집계 「**2 개소**」 · 2공구 「취수정·**국가지점번호판 2**」 · + 3공구도 구조물 구성에 포함. 규격 참고도는 도면으로 따로 있음. + · ⚠ **법정 500m 와 안 맞음** — 종합비교는 「**1km 간격**」으로 적고, 1공구는 연장 자체가 + **380m(토적집계) vs 1.20km(내역서)** 로 갈려 있어(판정 보류) **개소를 연장으로 역산 불가.** + ⇒ **지식DB 가 「연장÷500 을 확정 산식으로 쓰지 말라」 한 까닭이 실물로 확인됨.** + 실무는 **개소를 직접 세어 적었음.** + ⇒ **만들 모양 = 「개소 수를 넣는 칸」 + 참고로 연장÷500 을 제안값으로 보이기.** + · **안내판·차단기·가설창고·수방자재 — 실무문서 전수 무출현.** 넣는다면 **본이 될 실물이 + 없어** 사용자 협의로 새로 만드는 것임. + ✅ **편책 ≠ 목책 확정**(2026-09-08) — 품셈 **13-15-2 목책 설치**는 작업조건이 + **「벌도목 직경 26~30㎝」**이고 **벌목부**가 들어가는 **베어 낸 나무를 쓰는 공종**임 + (앞 절이 13-15-1 「목재 껍질벗기기」). 편책(「말뚝 9할박기, **가로목** 비탈면 밀착」)과 + **재료도 작업도 다름.** + ⭐ **다만 편책이 산림 품셈에 아예 없지는 않음** — **10-6-3 기타 임업자재**의 운반 자재 열에 + **「편책용 말뚝(목재, 파이프)」**이 그대로 있음(품셈이 편책을 아는 시설로 다룸). + **공종으로는 `5-15. 바자얽기` 가 가장 가까움**(말뚝 직경4~6㎝ 길이120㎝ 20개 · + 보통인부 3.26 · 특별인부 0.22 · 말뚝 1m당 2개). ⚠ **엮는 재료가 다름** — 편책은 「가로목」, + 바자는 「나뭇가지」. + ⇒ **「근거 없음」에서 「바자얽기(5-15)를 빌려 쓸지」로 좁혀짐** — 「어느 품을 쓸까」가 아니라 + **「빌려 쓸까 말까」**가 됨. +``` + +- [ ] **층따기 높이·폭 — 치수표를 찾았음(관행값 후보)** `[사용자 답 대기 — 원본 그림 확인]` (2026-09-08) — + + ⚠ 2026-09-09 — **깊이는 화면 칸으로 받게 됐음**(확정 ① · `ab51fa38`). 이 줄은 **관행값을 + 제안값으로 보일지**만 남음. + `original/산림과임업기술(임도)/2. 임도/6. 시공.md:93~95` + 「층따기 치수(cm) — **토사 깊이 50 이상 · 암 깊이 40 이상 · 폭 100 이상**」 + (그림 5-2-81 편절토·편성토 접속부 횡단면에 딸린 표). + 조건도 일치 — 「지표횡단물매가 **1:4 이상**으로 급하면 표토 제거 후 계단식 층따기」. + ⚠ **교본·법정이 아니라 기술서적**임(교본 세 곳은 여전히 「설계도서에 명시된 높이와 폭으로」). + ⇒ **관행값 후보로만.** ⚠ **판독 주의** — 원문 표가 마크다운 변환에서 한 줄로 뭉개져 있어 + **원본 그림 확인 전에는 확정하지 말 것.** + +### 8-34. ⭐ 2026-09-09 밤 감사에서 새로 나온 것 (데스크탑 메인) + +준비공·부대시설 축과 구조물 묶음 축을 「자국 목록」으로 훑어 나온 것들. **값을 임의로 +고치지 않고 사유로 드러내 둔 상태**이며, 아래 둘은 **사용자 확정이 있어야 값이 움직임.** + +- [ ] **⚠⚠ 표토제거 축 셋 — 실무·원문이 우리와 다름** `[사용자 답 대기 — 시트 9번]` (2026-09-09) + + 실무 내역서(영월 2024)와 품셈 원문을 떠 보고 나온 것. **값은 그대로 두고 사유만 실어 둠.** + 1. **밑수가 다름** — 실무는 「표토제거 답외구간 **8,962 ㎡**」이고 우리는 ㎥(면적 × 두께). + 셈 9-15-2 도 **T(표토두께) 0.2m 를 품의 조건**으로 두는 면적 축임. + 2. **운반 줄이 겹침** — 9-15-2 원문에 **L(운반거리) 20m** 가 들어 있어 **20m 압토가 품에 + 함**임. 실무 내역서에 운반 줄이 따로 없는 까닭이 그것. 우리는 제거 물량 **전량**을 + 표토 운반·적치」로 다시 실어 보냄 ⇒ **20m 초과분만** 세야 맞음. + 3. **대상이 법 문언과 어긋남** — 별표2 는 「**노면·절토대상지**」인데 우리는 절토·성토 + *사면적을 다 더하고 노면은 안 셈. 성토대상지는 별표2 (7) 이 「제거·정리」로만 두어 + 반·적치 의무를 안 검. **넘치는 쪽과 빠지는 쪽이 동시에 있어** 합계가 그럴듯해 보였음. + 「실무대로」 한 마디면 셋이 함께 닫힘.* + 리고 `**FP-09-15` 는 부모 코드**임(잎이 답구간·답외구간). 실무가 「답외구간」을 쓰나 + 임의로 안 골랐음* — 3번 물음과 한 묶음. +- [ ] **⚠ 옹벽 터파기가 안 섬 — 실무 안에서도 갈림** `[사용자 답 대기]` (2026-09-09) + + 관측 원단위(울진 §7 반중력식 H=2.0)에 터파기 줄이 없어 **옹벽만 구조물터파기·되메우기· + 잔토가 0 줄**이었음(돌쌓기는 세 줄이 섬). **지금은 「터파기가 안 선 구조물: 옹벽」 줄을 + `in_bill: False` · `unit_data_missing` 로 세워 빠진 것이 보이게 해 둠.** + ⚠ 랩탑 보조 대조 — 소광리 「옹벽2.0」 여덟 줄에도 **터파기 없음**인데, 같은 시트 + 「식생옹벽블럭(H=2.0)」에는 **터파기 기초 0.82 + 비탈 1.77 · 되메우기 0.37 · 잔토 1.4** 가 있음. + ⇒ 여쭐 것은 「옹벽 터파기를 세나」가 아니라 **「반중력식만 왜 없나」**임 + (일위대가에 포함일 가능성 — 기초 콘크리트 밑수에 숨어 있는지 확인이 남음). + +**닫은 것 (2026-09-09 밤, 값이 움직였음)** + +### 8-7. ⚠ 이중계상 금지 규칙 — 원문을 남기는 자리 + +**담당 경계표는 두 페이지가 다 서면서 역할을 다해 이관했으나, 이 규칙 원문은 남긴다.** +오늘도 세 번 걸렸고 **B09 가드가 이 문장을 주석으로 인용**하고 있어 지우면 근거가 끊긴다. + +- **㉠ 할증은 `자재 총괄` 에서 딱 한 번.** 품셈 1-3-1 「품셈 항목에 할증 포함ㆍ표시된 경우 +**중복 적용 금지**」. `원단위표`·일위대가 재료비는 **할증 전 값**을 쓰고, 인계에는 +**할증 전/후 둘 다** 실어 역산 사고를 막는다. +- **㉡ `free_haul`(소운반 20m) 은 내역 줄을 만들지 않는다.** 품셈 1-2-7 「소운반 20m 이내는 +품에 포함」. **스위치 없이 무조건 제외** — 켜도 붙일 단가가 없다(인력운반 10-6 도 +「20m **초과분**」). 값은 내되 「내역 제외」로 표시하고 `무대+도자+덤프 = 총 운반토량` +검산에만 쓴다. +- ⚠⚠ **㉡ 정정 (2026-09-08 원문 판정) — 「20m 무조건 공짜」가 아님.** +품셈 **1-2-7의 1 가** 원문: 「품에서 **자재의 소운반은 포함**하며, 품에서 **포함된 것으로 +규정된** 소운반 거리는 20m 이내의 거리를 의미한다」 +⇒ **「그 품 표가 포함한다고 규정했을 때만」 0 임.** +⚠ **산림품셈 13-2-4 야면석채집 [주]에는 운반 얘기가 없음** — **「포함」이 규정되지 않았음.** +⇒ **별도 계상이 원문상 맞고, 20m 를 무조건 금액 0 으로 막는 우리 가드는 과함.** +실무도 두 사무소가 다르게 함 — **울진은 채집 단가에 운반을 넣었고**(채집 + 상차 + 덤프 L=0.1km +를 한 단가에), **영월은 갈랐음**(채집 8,999 / 소운반 27,094원, 인력운반 기본공식 그대로). +**어느 쪽도 이중계상이 아님 — 한 번만 세면 됨.** +⚠⚠ **운반이 두 다리로 갈림**(2026-09-08 실측): + +``` +㉮ 채취지 → 집적지 덤프 100m ← **별표2 「운반거리를 조사한다」가 요구하는 그 운반** +㉯ 집적지 → 시공지 인력 20m ← 품셈 1-2-7 소운반 +울진은 ㉮ 를 채집 단가에 **포함**, 영월은 ㉯ 를 **별도 줄**(27,094원/㎡)로 세움 +``` + + ⇒ **우리 무대 가드는 ㉯ 에만 걸어야 하고 ㉮ 는 새 줄임.** + ⚠ **둘을 다 세우면 이중계상** — 확정 문구에 **「어느 쪽이든 한 번만」**을 넣을 것. + **⇒ 고칠 문구** — 「**무대(free_haul) 20m 규칙을 토공과 ㉯(집적지→시공지)에만 적용**하고, + **자재 소운반은 품 표가 포함을 규정한 경우에만** 0 으로 볼 것. 규정이 없으면 **인력운반 + 기본공식**(1-2-7의 2)으로 별도 계상. **㉮ 채취지→집적지는 별도 줄이되 채집 단가에 이미 + 포함됐으면 또 세지 말 것.**」 **세 창 일치.** + +- **㉢ 배합(모르터·콘크리트) 분해는 B09 에서 한 번.** 원단위표는 「모르터 ㎥」까지만 낸다. +- **㉣ 작업효율 `E` 는 작업량 산정에만.** 시간당 사용료는 1일 8시간으로 나눈다(품셈 8-1-6). +양쪽에 넣으면 같은 효율이 두 번 곱해진다. +- **㉤ 열 방향 정합 검사** — `TC = NC + GC + JC` 는 행 방향이라 「같은 성분을 두 층에서 +세는」 어긋남을 못 잡는다. 열 합을 따로 본다. +- **㉥ 물빼기 파이프 ↔ 제잡비 윗단** — 물구멍을 자재로 세우고 제잡비는 아랫단으로 간다. +- **㉦ 큰돌쌓기 포함자재** — 품셈이 이미 품에 넣은 것을 자재로 또 세지 않는다. +- **㉧ 상태 환산은 내보내는 자리에서 한 번만** (2026-09-09 신설, 금액 직결). +「운반거리의 산정 시에 모든 수량은 **다짐상태**로 환산하여 계산하고, **내역서에 적용하는 +수량은 자연상태**로 한다」(설계실무 요령 — `config_system_design` 5-4-3 인용문). +⇒ 유토곡선 안쪽(띠·이동·잔량)은 **다짐 그대로**, 내역으로 나갈 때만 **÷C**. +⚠ `**L`(1.3·1.35·1.625)을 쓰지 않는다** — 품셈 10-11·10-12 가 `f = 1/L` 을 식 안에서 +**스스로** 곱하므로 우리가 또 들면 두 번 환산이다. 우리가 할 일은 **자연상태 물량을 +정확히 넘기는 것**뿐이다. +⚠ **방향은 나누기** — `C = 다짐 ÷ 자연` 이라 곱하면 뒤집힌다(거울 시험이 잠금). +⚠ 들어올 때도 같다 — 구조물 잔토는 **자연상태**로 오므로 곡선에 담기 전 **×C**(왕복 한 번씩). +⚠ **갈래를 모르는 몫은 환산하지 않는다** — 계수가 없다. 토사 계수로 눅이면 근거 없이 +금액이 움직인다(`ground_unknown_m3` 로 드러냄). +**실측 변화(내역 4줄)** — 도자 토사 15.65→17.39 · 리핑암 70.30→61.13 · +덤프 토사 33.76→37.51 · 리핑암 140.78→122.42 ㎥ (합 260.49→238.45, **−8.5 %**). +자체검증 — 새 시험 6 + TS 실행 시험 3 추가, 전체 **576 통과 / 22 건너뜀**. +공용 브라우저 실사용 경로로 API 재확인(`/quantity/earthwork-table`): 줄마다 +`volume_basis: compacted` + `natural_m3` + `conversion_c` 가 서고, 집계표 비고에 +「자연상태 환산(다짐 …㎥ ÷ C)」이 붙으며, 검산 차이는 **0** 유지(다짐끼리 비교). +사토 줄도 `natural_m3_by_ground` 를 냄(실측 rr 61.88 다짐 → 53.809 자연). + +### 8-31. 개발용 「확정 없이 다음으로」 단추 — 오해하지 말 것 + +**단계 확정 없이 다음 페이지로 넘어가는 개발 전용 우회로.** 서버가 정본이고 +(`ENVIRONMENT` 검사, 운영에서는 403) 화면은 보조(`import.meta.env.DEV`). +`project_workflow_stages.state` 한 칸만 바꾸며 **계산은 돌지 않는다.** +`DEV_UNLOCK:<옛상태>` 로 되돌리고, **이미 `COMPLETE` 인 단계는 건드리지 않는다.** + +## 9. B09 원가계산 + +> **표 다섯이 화면으로 섰고 코드 쪽에 남은 일은 없다** — 아래는 자료·결정이 채워져야 풀리는 것뿐이다. + +### 9-9. ⚠ 카탈로그가 서는 날 **한꺼번에 붙을 열한 줄** (2026-09-09 실측) + +품셈 표에 **「필요시 적용」·「별도 계상」·「별산」**이 적힌 줄들이다. **지금은 하나도 안 붙어 있다** — +다만 **안 붙는 까닭이 「조건부라서」가 아니라 「이름을 카탈로그에서 못 찾아서」**다. +⇒ **자재·기계 카탈로그를 세우는 날 조건 없이 다 붙는다.** 그날 「왜 금액이 늘었지」로 헤매지 +않도록 목록을 남긴다. **카탈로그 작업을 시작하는 사람이 이 목록을 손에 들고 시작할 것.** + + +| 공종 | 줄 | 조건 문구 | 내용 | +| ---------------------- | --- | ----------------- | ---------------------------- | +| FP-05-10 사방조림 | 3 | 별도 계상, 운반조견표 참조 | 운반비 72.4 kg | +| FP-10-08-03 케이블 크레인 운전 | 3 | 별도 계상 | 운반기구 손료 1식 | +| FP-12-10 맹암거 | 3 | 자재비 별산 | 부직포 ㎡ | +| FP-12-10 맹암거 | 5 | 별산(깬잡석 유용가능) | 잡석 구입 및 운반 ㎥ | +| FP-12-10 맹암거 | 6 | 필요시 적용 | 소운반 인부 리어카(L=50m)**2.0인** | +| FP-12-11-02 흄관 | 1 | 별산 | 흄관 1.0m | +| FP-12-11-02 흄관 | 3 | 별도 계상 | 잡재료비 | +| FP-12-11-03 파형강관 | 1 | 별산 | 파형강관 1.0m | +| FP-12-11-03 파형강관 | 2 | 필요시적용 | 커플링밴드 EA | +| FP-12-24-01 지수판 설치 | 0 | 뒷채움 자재비 및 운반비 별산 | — | +| FP-12-24-02 되메우기(노상재) | 0 | 뒷채움 자재비 및 운반비 별산 | — | +| FP-12-25 기초잡석 | 0 | **브레이커 사용할 때 제외** | 소할 할석공 0.06인 ⚠**금액이 서 있는 줄** | + + +**⇒ 그리고 「이름을 카탈로그에서 못 찾아」 안 붙는 기계** (2026-09-09 관부설에서 나옴) + + +| 기종 | 어디에 쓰이나 | 지금 | +| ------------- | ------------------------------ | ---------------- | +| **크레인 5ton** | 파형강관 관부설(12-11-3) | 카탈로그에 없어**안 붙음** | +| **크레인 10ton** | VR관(12-11-1) · 흄관(12-11-2) 관부설 | 〃 | + + +> ⓘ **원문 특이점 하나 — 손대지 않았음** (2026-09-09 대조) +> 파형강관 12-11-3 **배관공**이 ∅800 **0.25** · ∅1000 **0.22** · ∅1200 **0.41** 임 — +> 관경이 커지는데 **가운데만 작음**. 크레인·보통인부는 커질수록 늘어남. +> **원문 그대로**라 고치지 않았고, 나중에 「값이 이상하다」가 나오면 이 줄을 볼 것. +> ⚠ **지금 금액에 이미 반영돼 있음** — 내역서에 ∅800·∅1000 이 둘 다 서 있음 +> (2026-09-09 기준 79da822d 네 줄 427,254원 · 26275834 일곱 줄 734,498원). +> ⓘ **원문 오탈자일 수 있음** — 0.22 가 0.32 의 오식이면 그 자리에서만 값이 낮아짐. +> **우리가 판단할 것은 아니고** 실무자 확인·고시 정정 대상임. +> ⓘ **숨은 값 하나** — 커플링밴드는 표가 비었으나 [주]① 이 「**1EA/6m**」를 줌. +> 자재가 서면 m 당 1/6 EA 로 셀 수 있음(「필요시 별도 산정」 조건이 하나 더 붙음). + +⇒ 그래서 **관부설 세 공종이 인력 몫만**임(배수관 네 줄이 지금 그 값으로 서 있음). +카탈로그가 서는 날 **세 공종이 한꺼번에 굵어짐**. +⚠ 같은 표의 **기초콘크리트·거푸집·모래부설**은 값이 빈 칸이라 안 붙였음 — 위 「별산」 줄들과 같은 자리. + +> ⓘ **이 절이 「카탈로그가 서는 날 무엇이 붙나」의 지도임** — 조건부 열두 줄 + 크레인 둘 + +> 자재 여덟 줄. 그날 금액이 뛸 텐데 **왜 뛰는지를 이 목록이 미리 설명함.** + +⚠ **기본은 「안 붙임」으로 둘 것.** 붙여 놓고 빼는 것보다 **없다가 켜는 것**이 안전하다 +(2026-09-09 하루 내내 그 결이었다 — 지어낸 값이 나중에 확인된 값으로 읽힌다). +⚠ **맹암거 소운반 인부 2.0인이 제일 큼** — 붙으면 그 단가가 통째로 뒤집힌다. +ⓘ 곁들여: 맹암거 25,492원/m 안의 **보통인부 0.13인(22,369원)은 「부설인부」라는 정상 줄**이다. +2026-09-09 한때 이것을 조건부 줄로 잘못 짚었다가 줄 번호로 되짚어 걷어 냈다. + +### 9-10. 「막힌 줄일수록 이중계상이 숨는다」 — 확인된 셋 (2026-09-09) + +값이 0 이라 **어떤 검사에도 안 걸리던** 자리들이다. **막힌 줄을 풀 때는 그 줄의 성분부터 셀 것.** + +- [ ] `[대기: 카탈로그]` **운반** — 두 축에 두 줄 · 코드가 붙는 날 드러남 + + ⚠ **오늘 선 「기계 수송비」와 다른 축임**(2026-09-09 밤) — 수송비는 **기계를 현장까지** 나르는 것이고, + 여기 것은 **자재 운반**(맹암거 잡석 구입·운반 · 지수판 뒷채움 운반비 별산 등)임. 헷갈리면 + 같은 운반을 두 번 셈. 지금은 그 줄들이 **별산·조건부라 값이 0** 이라 안 걸림. +- [ ] `[대기: 카탈로그]` **조건부 열두 줄** — 위 9-9 · 카탈로그가 서는 날 드러남 + + ⚠ 그중 **기초잡석 소할**만은 **이미 금액이 서 있음** — 브레이커 갈래가 서는 날 **빠져야** 함 + (다른 열한 줄은 붙는 쪽, 이것만 빠지는 쪽) +- [ ] `[대기: 거리·설계수량]` **원문에는 있는데 못 실린 몫** — `B09_Estimation_KnownGaps` 에 세 자리를 적어 두었음 + + · 기초잡석 **운반(덤프트럭 15ton)** — 품셈 10-12 가 거리로 냄 ⇒ **사토장이 서면 함께 풀림** + · 규준틀 둘 — 지금 값은 **인력 품만**(손율은 원문에 있음: 비탈 50% · 수평 80%) + ⇒ 화면 칸으로 받을 것은 **개소당 목재 규격·수량** (층따기 깊이·표토 두께와 같은 집안) + +### 9-6. B09 미결 — 살아있는 것 + +2026-09-08 전수 재판정. **해소 2 · 성격바뀜 3 · 남의것 2 · 입력 문제 1** 은 지웠고 아래만 남았다. + +⚠ **미결이 아닌 것 하나를 여기 적어 둔다** — 「암 갈래별 시공법이 안 실려 온다」는 **입력 문제**임. +칸도 있고 저장도 되고 공종도 갈린다(`b269ea34` 에서 `FP-09-04`/`FP-09-05` 로 정확히 갈림). +값이 `None` 인 표본은 **시공법을 안 넣은 프로젝트**였다. 같은 오해가 또 나지 않게 남긴다. + +- [ ] `[답 대기]` **물구멍 관 규격·간격** — 자재로는 오는데(단위 m) 규격·간격이 빈칸이라 단가를 못 고름. + + · **설계 기준이 정해지면** 풀림. (8-29 ⭘ 의 잠정 Ø50·2.0㎡ 와 짝) +- [ ] `[자료 대기 · 이것이 제일 큼]` **⚠ 사급 자재 단가 — 「못 구함」이 아니라 「누가 견적을 넣느냐」** (2026-09-08 성격 바뀜) — + + 나라장터 스냅숏 **27,485건 실물 검색에서 야면석·막자갈·고임돌·잡석·유공관·물구멍 전부 0건**. + 문서가 그 자재군을 **「지역골재 = 물가지·견적 경로」**로 이미 분류해 둠 — **API 로 못 채우는 + 것이 맞음.** ⚠ **그러나 국가계약법 시행규칙 §7(품셈 1-2-4)이 「견적가격」을 인정**하므로 + **구독 없이도 합법**이고 그 통로가 **6번 슬롯(적용 단가)** 임. + **대안 셋이 문서에 명시돼 있음** — ① 유료지 **1종만** 구독 ② 실무 관측값 라이브러리 + + **업체 견적 입력 UI** ③ 관급 전환. **「선택은 사업 판단(사용자)」**로 적혀 있음. +- [ ] `[사용자 답 대기]` **수송비 회수(대수·왕복 횟수)** (2026-09-09 밤) — 단가는 「회당」으로 섰고 + + **몇 대를 몇 번 나르는지는 품셈이 안 정함.** 실무는 대개 기종당 1 왕복으로 잡는 것으로 보이나 + **원문 근거가 없어 임의로 정하지 않음.** ⇒ 수량 칸(설계 입력)으로 받을 것인지 여쭐 것. + ⚠ 곁들여 **트레일러(20t)와 트럭(10.5t) 가름**도 원문이 기계별로 안 정함 — 지금은 **두 갈래를 + 다 세워 두고 고르게** 했음. +- [ ] `[답 대기]` **지장목제거 품셈 항목** — 품셈이 벌목을 목적별로만 갈라 맞는 공종이 없음. + + · **어느 벌목 공종으로 볼지 사용자가 정하면** 풀림. (8-29 9-㉗ 과 한 벌) +- [ ] `[대기: 사토장]` **⚠ 덤프 운반(8-2-8)은 「운반거리」가 있어야 섬 — 사용자·설계 입력 대기** (2026-09-08 조사) — + + 원문·표는 다 찾았음(`FP-10-12-01` 두 표: 적재기계 굴착기 K 0.9·E0 0.60(토사)/0.35(파쇄암)· + ㎝ 22초 + 덤프 t1~t5, V1 5㎞/hr(적재)·V2 6㎞/hr(공차)). + **모자란 것은 품셈이 아니라 현장값 셋** — ① **운반거리 L**(노선·사토장에서 옴) ② + **덤프 적재용량 T**(몇 톤 차를 쓸지) ③ **자연상태 단위중량 γt**. + ⇒ q = T·L/γt 라 셋 중 하나만 없어도 적재량이 안 나옴. **8-29 ㉯ 13번으로 올렸음**(2026-09-08). +- [ ] `[대상 없음 — 2026-09-09 밤 재확인]` **모르터·콘크리트 배합 분해** + + 콘크리트 계열 일위대가는 **이제 여덟이 서 있음**(레디믹스트 타설 셋·펌프카 타설 둘 등). + ⚠ **그래도 분해할 대상은 아직 없음** — 그 여덟은 전부 **레미콘을 사서 치는** 공종이라 품(노무)만 + 들어 있고 **현장 배합이 아님**. 마스터에 「모르터」가 든 공종도 여전히 0건. + · **현장 배합 줄(시멘트·모래·자갈)이 서기 시작하면** 그때 ㉢ 가드와 함께 살아남. +- [ ] `[대기: 치수]` **⚠ 「다른 표를 가리키는 참조」를 이을 것 — 산마루측구·소단측구** (2026-09-08) — + + 품셈이 그 두 표에 **수량을 안 적고 참조만** 둠(「철근가공조립(간단)의 **30 %**」· + 「거푸집 합판4회」·「수축줄눈」). 그래서 연장은 오고 공종코드도 붙는데 **금액이 안 섬.** + ⇒ **이을 길은 보임** — `B-FP-12-03#간단` 919,146.7원/ton 에 × 0.30 · 거푸집은 + `B-FP-12-04` 81,321.9원/㎡ 에 사용횟수 비율(1-7-1). + ⚠ **막힌 것은 밑수 하나이고 그것은 사용자 확정 대기임**(2026-09-08 B08 전수 확인) — + 「1m당 콘크리트 몇 ㎥ · 거푸집 몇 ㎡ · 철근 몇 ton」이 **품셈·지식DB·구조물 옵션 어디에도 + 없음.** 8-29 ㉯ 12번 참조. **치수가 정해지면 B08 이 그날 전개함.** + (맹암거 `FP-12-10` 은 표에 수량이 있어 25,492.1원/m × 40m = 1,019,685원으로 이미 섬.) +- [ ] `[사용자 답 대기 · B08 이 줄을 내야 함]` **⚠ 노체다짐(9-16-2)을 셀 것인가** (2026-09-09 밤) + + **단가는 세웠음**(커밋 `87c710a2`) — `Q = 1000×V×W×E×D×f/N` 로 서는 **첫 다짐 공식** 공종. + `1000×4×1.9×0.6×0.3×1.0÷6 = 228 ㎥/시간` ⇒ **527.40원/㎥**. + ⇒ 넣으면 **13,150.2㎥ × 527.40 = 6,935,414원**. + + **왜 아직 안 서나 — B08 이 그 줄을 안 냄. 그것은 의도된 결정이었음**(2026-09-08 매핑 기록). + 실무 내역 셋에 「노체포설·노체다짐」으로 가른 줄이 **없어서**, 「성토 본체 한 줄 + 성토면다짐(㎡) + 따로」로 맞춰 두고 **다짐은 그 단가 안 단계**로 뒀음. + ⚠⚠ **그런데 우리 성토 단가는 포설(굴착기)뿐임** — 실무 영월의 그 한 줄은 단가 안에 + **적사→성토→다짐 3단계**를 품고 있음. **즉 지금은 다짐 몫이 빠져 있음.** + + **⇒ 여쭐 것 하나** — 층다짐을 **줄로 세울지**(B08 이 성토와 같은 물량으로 다짐 줄을 냄), + 아니면 **성토 단가 안에 넣을지**. 품셈 [주]⑤ 는 「**대규모 성토지로서 층다짐이 필요한 경우** + 적용」이라 **늘 서는 줄은 아님** — 현장 조건 판단임. + ⚠ **두 곳에 다 넣으면 이중계상**임. + ⓘ [주]③ 「굴착기와 진동롤러 **조합**」은 **포설과 다짐을 함께 쓰라는 뜻**으로 읽었음 — + 다짐 줄에 굴착기를 또 넣으면 포설에서 센 굴착기가 두 번 섬(시험으로 못 박아 뒀음). + +- [ ] `[사용자 답 대기]` **품 할증을 여럿 고를 때 합산인가 곱인가** (2026-09-09 밤) — + + **원문에 없음.** 지금은 **합산**(10%+5% = 15%)이고 `LaborSurcharge.COMBINE_RULE` **한 곳**만 + 갈아 끼우면 곱(1.10×1.05−1 = 15.5%)으로 바뀜. 화면 근거에 「우리가 정함·원문에 없음」을 적어 둠. +- [ ] `[자료 대기]` **종자·비료도 사급 미결에 듦** — `출력변수사전 C2` 가 물가지·견적 품목에 **종자·비료**를 + + 더 적음. ⇒ 씨앗뿜어붙이기(5-24) 종자 0.025kg/㎡ · 비료 0.1kg/㎡ 도 **같은 미결**임. +- [ ] `[위키 AI 몫]` 지식DB 정정 요청 (**위키 AI 몫**) — `현행_20260413.md` §3·§4 병합셀 복원. + +## 7. 검증 리스트 — 페이지별 (다 만들었고 **확인만** 남은 것) + +> 여기는 **무엇을 · 어떻게 · 안 하면**만 한 줄씩 둔다(원문을 되풀이하지 않음). +> **끝난 줄은 지우고** 검증 폴더에 날짜별 기록을 남긴다. 번호는 한 줄기 — 닫힌 번호는 다시 안 쓴다. +> ⚠ **[확정]·[저장]은 전 측점을 다시 계산해 정본에 씀** — 누르기 전에 다른 창에 알릴 것 +> (`OWNERS.md` 규칙 6). + +**⚠ 이 목록을 쓸 때 지킬 것 (2026-09-09 밤 재정비에서 얻은 것)** + +- **화면 확인은 DOM 이 아니라 도면 알맹이·갈무리로.** CAD 표는 캔버스에 그려져 DOM 에 안 남아 +V-9 를 한 번 「안 뜬다」로 잘못 봤음. +- **프로젝트마다 달라지는 수를 기준으로 쓰지 말 것.** 「도면 36장」이 실제로는 34장이었는데 +틀린 것이 아니라 **횡단 장수가 프로젝트마다 다른 것**이었음. +- **줄 수·항목 수는 늘어남.** 「찰 11줄 · 메 8줄」이 지금은 15·13 임 — 숫자를 박지 말고 +**무엇이 들어야 하는지**로 적을 것. +- **「있다」와 「돈다」는 다름** — 가드를 만들어 두고 아무 데서도 안 부르던 것이 둘 있었음. +- **부분 성공이 완전 실패보다 위험함** — 값이 그럴듯해 어떤 검사에도 안 걸림. +- **보내는 쪽과 받는 쪽을 마주 걸 것** — 한쪽만 보면 양쪽 다 조용히 틀림. + +### ⚠ [저장]·[확정] 잠금이 풀려야 보는 것 — 3건 + +> 표토 축 확정 전까지 사용자가 저장을 멈춰 둠. **잠금이 풀리면 한 번에 몰아서 볼 것.** + + +| # | 확인할 것 | 어떻게 | +| -------- | ------------------------------------ | ------------------------------------------------------------------ | +| **V-19** | 표준단면을 고치고 [저장] 하면 **전 측점 면적이 따라오나** | 2026-09-09 에 이은 자리(`2eb2c972`) — 측구 상폭을 고쳐 저장한 뒤 안 만진 측점 면적이 새 값인지 | +| **V-20** | 표준도 제원(두께·날개벽)을 고르고 저장하면 **수량에 실리나** | 상부 두께·`wing_wall_type` 을 넣고 저장 → 입적·날개벽 줄 대조 | +| **V-21** | 실제 업로드 중에 **잠금 띠가 뜨나** | 자료를 올리는 동안 B03 에서 「○○○ 님이 올린 자료를 분석하는 중입니다」 확인(`018ebe7f`) | + + +### ⚠ 실무자 눈이 있어야 닫히는 것 — 4건 (사용자 답 대기와 한 성격) + + +| # | 물어야 할 것 | 왜 우리가 못 정하나 | +| -------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **V-1** | B08·B09 화면 **13항목 수치가 실무에 맞나** | 규칙대로는 도는데 실무 값과 어긋나면 정본이 통째로 다시 나감 — 점검표 아티팩트 [https://claude.ai/code/artifact/64675be3-6e7d-40bb-8cda-68bc229bd394](https://claude.ai/code/artifact/64675be3-6e7d-40bb-8cda-68bc229bd394) | +| **V-13** | 녹화 반영률 **100 %** 가 실무에 맞나 | **법은 100 %**(별표2 타.(1)), 실무 사례는 80 — 설계자 판단 자리 | +| **V-18** | 폐기물처리비를 **총원가 밖**에 두는 것이 맞나 | 규정 근거 **0건**으로 확정됐고 남은 것은 관행뿐 | + + +### 조건이 갖춰져야 도는 것 — 2건 + + +| # | 확인할 것 | 조건 | +| ------- | ------------------------------ | --------------------------------------------------------------------------------------------------------- | +| **V-2** | **투영 이월 코드를 지워도 되나**(0-2) | ① 노선 재확정을 더 돌린 뒤에도 투영 WARNING **0건**(2026-09-09 로그 전수 0건, 이어지는 중) ② **관을 다시 놓는 경로**가 설 것 — **둘 다일 때만** 지움 | +| **V-5** | **값이 채워진 첫 인계** 여섯 가지(B08→B09) | `./venv/Scripts/python.exe tmp/snapshot_b09.py before | + + +## 6. 보류 + +- **타사 사용자에게 프로젝트 공유** — 2026-09-06 사용자 보류. 회사 밖 사람에게 열람·참여를 여는 길은 당분간 만들지 않음. +- **구조물 명칭 조정** — 바꿀 이름 목록 미정. 정본은 `B05_Profile/B05_Profile_Structure_Types.json` 한 곳이라 목록만 받으면 두 화면이 같이 따라옴. +- **노선 자동 제안** — 0-2 계획노선 편집 위에, 평면·종단·횡단·유토곡선을 다 보고 제안하는 방식으로 뒤에 붙임(2026-09-06 사용자). +- **B06 종단곡선도 제어** — 뜻이 불명해 2026-09-06 사용자 지시로 삭제. + From b42793eb583925465c0b93ee0a628463122ce375 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 13:45:56 +0900 Subject: [PATCH 13/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20=EC=9D=BC=EC=9C=84=EB=8C=80=EA=B0=80=20=EC=B0=B8=EC=A1=B0=20?= =?UTF-8?q?=EA=B7=B8=EB=9E=98=ED=94=84=C2=B7=EC=84=A4=EA=B3=84=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EC=A7=81=EC=A0=91=EB=B9=84=20=EC=8B=A4=EC=A6=9D=20?= =?UTF-8?q?=E2=80=94=20=EC=A7=80=EA=B8=88=20=EC=9E=90=EB=A3=8C=EB=A1=9C=20?= =?UTF-8?q?=ED=95=A0=20=EA=B2=83=20=EB=A7=88=EB=AC=B4=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 일위대가 호표 참조 그래프 (④단계) - 봉화 2024 의 45개 호표를 그래프로 세움 - 구성행이 다른 호표를 가리키고 단가가 일치하는 것 22건, 이름은 같은데 단가가 다른 것 0건 - 순환 참조 없음 -> 위상순서 계산 가능. 깊이 최대 2단 - 09번의 「의존 그래프·위상순서·순환은 오류」가 실데이터에서 성립함 설계변경 직접비 - 계류보전 2025(변경) 의 BOQ11 은 한 표에 차수1(당초)·차수2(변경) 를 나란히 담음 - 양쪽을 각각 다시 세워 직접재료비·직접노무비·산출경비 전부 원 단위 일치 - 행금액 절사 대조 294건 x 2 = 588건 불일치 0 - 제외금액 구역 판정은 차수와 무관하게 같음 - 19번 6장의 간접비 모드와 합쳐 변경설계가 직접비부터 간접비까지 전부 재현됨 진행률 장부 갱신 — 지금 자료로 할 수 있는 일은 사실상 소진. 남은 것은 새 표본이 있어야 열림. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../STmate 분석/20_분석/19_진행률_장부.md | 38 ++++++++- .../40_스크립트/revision_direct_cost.py | 64 ++++++++++++++ .../40_스크립트/unit_reference_graph.py | 84 +++++++++++++++++++ 3 files changed, 183 insertions(+), 3 deletions(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/revision_direct_cost.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/unit_reference_graph.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md index 4d96c9b5..5e1cf614 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/19_진행률_장부.md @@ -13,7 +13,8 @@ | STC 안의 표 | 16종 | **10종 읽고 씀** · 4종 빈 표 | **2종 암호화** (`BDQTY`·`SYSINFO`) | ▓▓▓▓▓▓▓▓▓░ 88% | | STmate 출력 `XLSX` | 6 | 6 전부 | — | ▓▓▓▓▓▓▓▓▓▓ 100% | | 출력 시트 | **30종** | **30종 전부 훑음** (계산 있는 것 15종 규칙 확정) | — | ▓▓▓▓▓▓▓▓▓▓ 100% | -| 계산 사슬 단계 | 8 | **8 전부** | — | ▓▓▓▓▓▓▓▓▓▓ 100% | +| 계산 사슬 단계 | 8 | **8 전부** (④는 참조 그래프까지 실증) | — | ▓▓▓▓▓▓▓▓▓▓ 100% | +| 변경설계 재현 | 직접비+간접비 | **전 항목 원 단위 일치** | — | ▓▓▓▓▓▓▓▓▓▓ 100% | | 09번이 꼽은 호환성 차단점 | 6 | **3 해결 · 1 부분** | 2 (실행 필요) | ▓▓▓▓▓▓░░░░ 58% | ## 2. 설치 폴더 186개 @@ -119,6 +120,36 @@ **재구현 필수** — 간접비 항목마다 `calc_mode ∈ {recalculated, carry_original, proportional_from_original, delta_times_rate, manual}` 을 저장할 것. 전부 재계산으로 두면 이 세 항목에서 **85만 원**이 어긋난다. +## 6.5 이번에 마저 끝낸 둘 + +### 일위대가 호표 참조 그래프 — ④단계 실증 + +봉화 2024의 `일위대가표` 45개 호표를 그래프로 세웠다. + +| 항목 | 결과 | +|---|---| +| 구성행이 다른 호표를 가리키고 **단가가 일치** | **22건** | +| 이름은 같은데 단가가 다름 | **0건** | +| 호표 간 참조를 가진 호표 | 18 / 45 | +| **순환 참조** | **없음 → 위상순서 계산 가능** | +| 참조 깊이 | 최대 **2단** (잎 27 · 1단 14 · 2단 4) | + +⇒ 09번 §3의 「의존 그래프를 만들고 위상순서로 계산, 순환은 오류」가 **실데이터에서 성립**한다. 깊이가 얕아 재귀 깊이 걱정은 없고, 이름+규격 짝으로 참조를 찾을 수 있다(불일치 0건). + +### 설계변경 직접비 — 당초·변경 양쪽 원 단위 재현 + +계류보전 2025(변경)의 `BOQ11`은 한 표에 **차수1(당초)·차수2(변경)를 나란히** 담는다. 양쪽을 각각 다시 세웠다. + +| | 직접재료비 | 직접노무비 | 산출경비 | 행금액 절사 | +|---|---:|---:|---:|---| +| 차수1 (당초) | 40,003,539 ✅ | 32,976,276 ✅ | 20,047,669 ✅ | 294건 무결 | +| 차수2 (변경) | 26,448,347 ✅ | 41,778,438 ✅ | 16,915,256 ✅ | 294건 무결 | +| **증감** | −13,555,192 | **+8,802,162** | −3,132,413 | | + +**전 항목 1원도 안 틀림.** 같은 말단 행 집합(98행)에 차수별 수량·단가를 걸어 계산하면 되고, **제외금액 구역(`C*`) 판정도 차수와 무관하게 같다.** + +이로써 6장의 간접비 모드와 합쳐 **변경설계가 직접비부터 간접비까지 전부 재현**된다. + ## 7. 남은 일 — 할 수 있는 것과 없는 것 ### 지금 자료로 할 수 있는 것 @@ -127,8 +158,9 @@ |---:|---|---| | ~~1~~ | ~~남은 시트 훑기~~ | ✅ **완료** — 30종 전부. 새 규칙 없음, 집계표 ±1 원인 밝힘 | | ~~2~~ | ~~중기시간금액집계표~~ | ✅ **완료** — 절사(수량 × 시간당 성분단가) | -| 1 | 일위대가 호표 **참조 그래프** 복원 → 위상순서 계산 재현 | ④단계를 실증으로 | -| 2 | 설계변경 **직접비 증감**까지 원 단위 재현 | 6장을 전 항목으로 넓힘 | +| ~~1~~ | ~~일위대가 참조 그래프~~ | ✅ **완료** — 순환 없음, 깊이 2단, 불일치 0 (§6.5) | +| ~~2~~ | ~~설계변경 직접비 증감~~ | ✅ **완료** — 당초·변경 전 항목 원 단위 일치 (§6.5) | +| 1 | **표본 늘리기** | 지금 자료로 할 수 있는 것은 사실상 다 함. 규모·기간 의존 요율 좌표와 수공·실적 형식은 **새 표본이 있어야** 열림 | ### 끝내 못 하는 것 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/revision_direct_cost.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/revision_direct_cost.py new file mode 100644 index 00000000..f120971e --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/revision_direct_cost.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +"""설계변경 직접비 — 차수1(당초)·차수2(변경)를 내역에서 다시 세워 출력과 대조.""" +import sys, io, pathlib, zipfile, struct, re, warnings +from decimal import Decimal as D, ROUND_DOWN +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +warnings.filterwarnings("ignore"); import openpyxl +def dn(x): return D(x).quantize(D(1), rounding=ROUND_DOWN) +def dbf(zf,name): + b=zf.read(name); nrec,hlen,rlen=struct.unpack_from(" Date: Sun, 13 Sep 2026 13:53:47 +0900 Subject: [PATCH 14/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20Start8x.Ini=C2=B7SET=5FREP=20=EC=A0=90=EA=B2=80=20=E2=80=94?= =?UTF-8?q?=20=EA=B0=84=EC=A0=91=EB=B9=84=20=EC=BD=94=EB=93=9C=20=EC=82=AC?= =?UTF-8?q?=EC=A0=84=EA=B3=BC=20=EC=84=9C=EC=8B=9D=2075=EC=A2=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit System 폴더만 보고 STmate 자료 폴더를 STC 와 같다고 넘겼던 것이 구멍이었음. 그 폴더에 STC 에 없는 Start8x.Ini·STini.MEM·QCODE.SMT 가 있었음. Start8x.Ini 에서 나온 것 - 간접비 계산 순서가 KAN_ORD_1/KAN_ORD_2 코드 목록으로 저장돼 있음. 두 목록의 차이가 321(기타경비 묶음 1개) 대 331~338(세부 경비 8개) 이라 12번의 「일반형식 대 수공형식」 구분과 정확히 맞음. KAN_TYP 가 고름 - 코드 사전 301~370 을 봉화 출력 순서와 대조해 확정. 값이 0 인 항목은 출력에서 빠진다는 규칙으로 하나도 어긋나지 않음. 등급 A - ⚠ 후보 슬롯 이름이 설치본마다 다름. 설치 기본은 다섯째가 「유통 물가」인데 실무 프로젝트는 「견적단가」임. 슬롯 번호에 기관명을 박으면 안 되는 근거 - COD_FMT_1~8 코드 종류 사전 (대가=일위대가 B, 산근=단가산출 D) - [EQUIPMENT] 에 노임 환산식·환율·적용 직종의 설치 기본값 - [NAG_HAL] 할증률 설정 자리 발견 (표본은 전부 0) - DISP_EX=제외금액 — C* 구역 이름의 출처 SET_REP.DBF 는 보고서 서식 75종 카탈로그. 표본 XLSX 에 나온 30종 말고 기성·견적·계약·준공·계획·실행예산 등 45종이 더 있음. 새 계산은 아니고 출력 변형. 수공양식·표준시장 서식이 카탈로그에 있어 그 형식이 실제로 지원됨을 확인 COSTN.SMT·QCODE.SMT·PRJLST.SMT 는 본문에 읽히는 문자열이 없어 암호화로 판정. 다만 같은 정보가 출력 XLSX 에 평문으로 있어 의존 그래프 복원에는 지장 없음 문서 20 신규, 스크립트 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 4 + .../20_분석/20_설정파일과_보고서_카탈로그.md | 152 ++++++++++++++++++ .../40_스크립트/ini_and_report_catalog.py | 36 +++++ .../경쟁사 프로그램/STmate 분석/README.md | 1 + 4 files changed, 193 insertions(+) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/ini_and_report_catalog.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index e095c61d..69d51a99 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -26,6 +26,7 @@ | 17 단가조립 검증 | **일위대가·중기 시간당 사용료 구조와 손료율 실측** | (저장소 파일) | | 18 누락 계산로직 점검 | **사슬에 빠진 칸 찾기** — 노임 환산식·단가산출 Q식·설정 스냅샷·집계표 반올림 | (저장소 파일) | | 19 진행률 장부 | **어디까지 봤고 무엇이 남았나** — 원천별 실측 진행률, 차단점 현황 | (저장소 파일) | +| 20 설정파일과 보고서 카탈로그 | **`Start8x.Ini`·`SET_REP`** — 간접비 코드 사전 301~370, 서식 75종 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -70,6 +71,9 @@ | 계산 설정 스냅샷 | 「화면 없이 재현 불가」 | **출력 XLSX `〓 INITIAL 〓` 에 있음** | 18번 §2.3 | | 집계표 행 금액 | 서술만 | **A** — 사사오입 100%. 호표 성분 소계(절사)와 다른 자리 | 18번 §2.4 | | 변경설계 간접비 모드 | 「모드가 여럿」까지만 | **A 실증** — 건강·장기요양·연금은 **당초액 유지**, 나머지는 재계산 | 19번 §6, 08번 §2 | +| 간접비 항목 순서·코드 | 화면 텍스트 복원 | **A** — `KAN_ORD_1/2` 코드 목록, 301~370 사전 | 20번 §2.1·§2.2 | +| 후보 슬롯 이름 | 「설정에 있을 것」 | **설치본마다 다름을 실물 확인** (유통 물가 ↔ 견적단가) | 20번 §2.3 | +| 보고서 서식 | 30종 관찰 | **카탈로그 75종** — 수공양식·표준시장 서식 존재 | 20번 §3 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md new file mode 100644 index 00000000..6e9cbe50 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md @@ -0,0 +1,152 @@ +# 설정파일과 보고서 카탈로그 — 마지막으로 남아 있던 자리 + +점검일: 2026-09-13 +계기: 「추가로 더 있는지」 확인. **`System` 폴더만 보고 `STmate 자료`·`STmate 압축자료` 폴더를 통째로 안 봤다.** +재현 스크립트: `40_스크립트/ini_and_report_catalog.py` + +## 1. 안 보고 있던 자리 + +`C:\경영정보(주)` 아래에는 폴더가 넷이다. + +| 폴더 | 내용 | 그동안 | +|---|---|---| +| `System` | 설치 파일 186개 | ✅ 전수 | +| `STmate 자료\설계자료\실습(맛보기)` | 맛보기 프로젝트를 **푼 것** 23개 | ⚠ **STC와 같다고 넘겼음** | +| `STmate 압축자료` | `실습(맛보기).STC` | ✅ | +| `(TMP)` | 비어 있음 | — | + +DBF는 STC와 같지만 **STC에 없는 파일 셋이 있었다** — `Start8x.Ini` · `STini.MEM` · `QCODE.SMT`. + +## 2. `Start8x.Ini` — 설치본 전역 설정 + +### 2.1 ⭐ 간접비 계산 순서가 코드 목록으로 저장돼 있다 + +```ini +KAN_ORD_1=;301;302;303;310;304;305;306;312;313;321;307;308;309;311;361;362;363;364;365;366;367;368;369;370; +KAN_ORD_2=;351;301;302;303;310;304;305;306;312;313;331;332;333;334;335;336;337;338;307;308;309;311;361;…;370; +KAN_TYP=0 +``` + +**두 목록의 차이가 12번 §7의 「기타경비: 일반=묶음 1개 / 수공=세부 8개」와 정확히 맞는다.** + +- `KAN_ORD_1` (24개) — `313` 다음에 **`321` 하나** +- `KAN_ORD_2` (32개) — 같은 자리에 **`331`~`338` 여덟 개**, 그리고 맨 앞에 `351` 추가 + +⇒ **`KAN_ORD_1` = 일반형식(`T`) 순서, `KAN_ORD_2` = 수공형식(`S`) 순서**이고 `KAN_TYP`가 고른다. + +### 2.2 코드 → 항목 사전 (봉화 2024 출력과 대조해 확정) + +`KAN_ORD_1` 순서대로 놓고, 값이 0인 항목은 출력에서 빠진다는 규칙으로 봉화 `공사원가계산서`와 맞추면 하나도 어긋나지 않는다. + +| 순서 | 코드 | 항목 | 봉화에 출력됨 | +|---:|---|---|:--:| +| 1 | `301` | 간접노무비 | ✅ | +| 2 | `302` | 산재보험료 | ✅ | +| 3 | `303` | 고용보험료 | ✅ | +| 4 | `310` | 건강보험료 | ✅ | +| 5 | `304` | 노인장기요양보험료 | ✅ | +| 6 | `305` | 연금보험료 | ✅ | +| 7 | `306` | 퇴직공제부금비 | ✗ (0) | +| 8 | `312` | 산업안전보건관리비 | ✅ | +| 9 | `313` | 안전·품질관리비 (별도내역) | ✗ (0) | +| 10 | `321` | **기타경비** (일반형식 묶음) | ✅ | +| 11 | `307` | 공사이행보증수수료 | ✗ (0) | +| 12 | `308` | 하도급대금지급보증수수료 | ✗ (0) | +| 13 | `309` | 환경보전비 | ✅ | +| 14 | `311` | 건설기계대여금 지급보증 | ✅ | +| 15~24 | `361`~`370` | 후단 공통 (일반관리비·이윤·부가세·도급·관급 계열) | — | +| — | `331`~`338` | **수공형식 세부 경비 8개** | 표본 없음 | +| — | `351` | 수공형식 선두 항목 | 표본 없음 | + +출력 순서가 **정확히 이 순서**다. 등급 **A**. + +⇒ **재구현은 항목을 이름이 아니라 코드로 다루고, 순서를 목록 데이터로 둘 것.** 형식을 바꾸면 목록을 갈아 끼우면 된다. `if 항목명 == "기타경비"` 같은 분기를 심으면 수공형식에서 깨진다. + +### 2.3 ⚠ 후보 슬롯 이름이 설치본마다 다르다 + +| | 슬롯1 | 슬롯2 | 슬롯3 | 슬롯4 | **슬롯5** | 슬롯6 | +|---|---|---|---|---|---|---| +| 설치 기본 (`Start8x.Ini`) | 가격 정보 | 물가 자료 | 물가 정보 | 거래 가격 | **유통 물가** | 적용 단가 | +| 실무 프로젝트 (`INITIAL`) | 조달가격 | 물가자료 | 물가정보 | 거래가격 | **견적단가** | 적용 단가 | + +**다섯 번째가 통째로 다르다.** 07번의 「슬롯 번호에 가격지 이름을 코드로 고정하지 말라」가 이보다 분명할 수 없다. 축약도 다르다(`가.정/물.자/물.정/거.래/유.통` ↔ `조달/물자/물정/거래/견적`). + +`JEMNM=123456`이 표시 순서다. + +### 2.4 코드 종류 사전 + +```ini +COD_FMT_1=노무 COD_FMT_2=자재 COD_FMT_3=경비 COD_FMT_4=대가 +COD_FMT_5=중기 COD_FMT_6=산근 COD_FMT_7=기타 COD_FMT_8=실적 +``` + +설계변경증감대비표 비고 칸의 `산근 4호표` · `대가 1호표` · `M00760`이 이 사전을 쓴다. **`대가`=일위대가(`B`), `산근`=단가산출근거(`D`)**다. + +`BCDNM=10 · DCDNM=14 · LCDNM=9 · MCDNM=13 · PCDNM=11 · SCDNM=15 · XCDNM=14`는 코드 종류별 기본값이며 의미는 아직 미확정(B등급). + +### 2.5 `[EQUIPMENT]` — 노임 환산식과 환율의 설치 기본값 + +```ini +RXXNM=1/8 * 16/12 * 25/20 ← 18번 §2.1의 그 식 +RXTNM=1/8*16/12*25/20 +CONLD=L00007L00008L00009 ← 적용 직종 (설치 기본) +EXLNM1~4 / EXHNM1~4 = 1088 · 1289 · 1134.5 · 1134.5 ← 달러 구간별 환율 +EXEUR1/2=1000 EXYEN1/2=1000 +``` + +프로젝트의 `COND_`는 `L00008L00009L00010`으로 **설치 기본과 다르다** — 프로젝트마다 적용 직종을 바꿀 수 있다. + +### 2.6 그 밖 + +| 키 | 값 | 뜻 | +|---|---|---| +| `DISP_EX` | `제외금액` | 16번 §4.2의 `C*` 구역 이름이 여기서 온다 | +| `DISP_TOT` | `총 계` | | +| `UPDNCAP` | `상단:당초 , 하단:변경` | 변경설계 표시 | +| `BMKNM` | `TLMS` | 비목 코드 순서 (총계·노무·재료·경비) | +| `[NAG_HAL]` | `ST_MHAL` · `EQ_LHAL` · `EQ_MHAL` · `EQ_SHAL` = 0 | **할증률 설정 자리** — 표본은 전부 0 | +| `LMGNM=5.0` · `MKRNM=4.0` · `TMGNM=0.0` | | 미확정 (B) | + +## 3. `SET_REP.DBF` — 보고서 서식 75종 카탈로그 + +우리 표본의 XLSX에는 **30종**이 나왔는데, 카탈로그에는 **75종**이 있다. 45종은 표본에 안 나온 것뿐이다. + +| 갈래 | 서식 | +|---|---| +| 기성 | 기성부분총괄내역서 · 기성내역서 · 기성내역서(사정) · 기성내역서(기성율) · 기성검사조서(을/병) · 기성부분수량조서 | +| 견적·계약 | 견적내역서 · 견적단가대비표 · 계약,실행내역서 | +| 준공 | 준공조서(을/병) | +| 변경 | 변경내역서 · 변경내역서(변경율) · 변경총괄내역서(구.시도/시도/구도) | +| 계획 | 장비투입계획 · 인력투입계획 · 자재사용계획 | +| 실행예산 | 실행예산서Ⅰ · Ⅱ | +| 양식 변형 | 종양식 · 도공양식 · 굴착 · 구.시도/시도/구도 · **수공양식** | +| 기타 | 간이공사비 산출명세서 · 총괄집계표 · 표준시장/시장시공 목록표·집계표 | + +각 행은 `INDX`(서식번호) · `NAME` · `HEADTITLE` · 열 이름 11개와 폭을 가진다. **보고서 서식이 코드가 아니라 데이터**라는 00번의 관찰이 여기서 확인된다. + +⚠ **`일위대가표(수공양식)`(`0303`)과 `표준시장/시장시공` 계열이 카탈로그에 있다** — 수공·실적 형식이 실제로 지원되며 서식도 따로 있다. 우리 표본에 그 형식 프로젝트가 없을 뿐이다. + +새 **계산** 규칙은 없다. 같은 값을 다른 묶음·다른 열로 내는 출력 변형이다. + +## 4. `COSTN.SMT` · `QCODE.SMT` · `STini.MEM` + +| 파일 | 크기 | 상태 | +|---|---:|---| +| `COSTN.SMT` | 10,177 B | 머리 `SIxMemo`, **본문에 읽히는 문자열 없음 — 암호화/압축** | +| `PRJLST.SMT` | 2,291 B | 같음 | +| `QCODE.SMT` | 2,291 B | 같음 | +| `STini.MEM` | 512 B | Delphi `TMemoryStream` 덤프로 보임, 미해독 | + +07번이 기대한 `&M00034M&` 같은 참조 토큰은 **평문으로 읽히지 않는다.** 다만 같은 정보가 출력 XLSX의 `일위대가표`·`단가산출근거`에 평문으로 있으므로(17번·18번) **의존 그래프 복원에 지장은 없다.** + +## 5. 이번 점검이 바꾸는 것 + +| 항목 | 이전 | 지금 | +|---|---|---| +| 간접비 항목 순서 | 화면 텍스트로 복원 | ✅ **코드 목록으로 확정**, 형식별 두 벌 | +| 간접비 항목 코드 | 없었음 | ✅ **301~370 사전**, 봉화 출력과 무결 대조 | +| 후보 슬롯 이름 | 「설정에 있을 것」 | ✅ **설치본마다 다름을 실물로 확인** | +| 코드 종류 사전 | 추정 | ✅ `COD_FMT_1~8` | +| 보고서 서식 | 30종 봄 | ✅ **카탈로그 75종** 전체 | +| `*.SMT` 메모 | 「토큰이 있을 것」 | ⛔ **암호화 — 다만 출력에 같은 정보 있음** | +| 할증률 설정 자리 | 없었음 | ◐ `[NAG_HAL]` 발견, 표본은 전부 0 | diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/ini_and_report_catalog.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/ini_and_report_catalog.py new file mode 100644 index 00000000..61b33b99 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/ini_and_report_catalog.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +"""Start8x.Ini 설정과 SET_REP 보고서 카탈로그를 뽑는다. 원본은 읽기만.""" +import sys, io, struct, pathlib, re +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +D = pathlib.Path(r"C:\경영정보(주)\STmate 자료\설계자료\실습(맛보기)") + +print("### Start8x.Ini — 절별 키") +txt = (D/"Start8x.Ini").read_bytes().decode("cp949","replace") +sec="(머리)" +for line in txt.splitlines(): + line=line.strip() + if not line: continue + if line.startswith("["): sec=line; print("\n"+sec); continue + print(" %s" % line[:110]) + +print("\n\n### 간접비 순서 코드") +for k in ("KAN_ORD_1","KAN_ORD_2"): + m=re.search(k+r"=(.*)", txt) + if m: + codes=[c for c in m.group(1).split(";") if c.strip()] + print(" %s %d개: %s" % (k, len(codes), ", ".join(codes))) +a=set(re.search(r"KAN_ORD_1=(.*)",txt).group(1).split(";")) +b=set(re.search(r"KAN_ORD_2=(.*)",txt).group(1).split(";")) +print(" 1에만: %s" % sorted(x for x in a-b if x.strip())) +print(" 2에만: %s" % sorted(x for x in b-a if x.strip())) + +print("\n\n### SET_REP.DBF — 보고서 서식 카탈로그") +b2=(D/"SET_REP.DBF").read_bytes(); nrec,hlen,rlen=struct.unpack_from(" Date: Sun, 13 Sep 2026 14:04:32 +0900 Subject: [PATCH 15/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20SMT=20=ED=8C=90=EC=A0=95=20=EC=A0=95=EC=A0=95=20=C2=B7=20?= =?UTF-8?q?=EC=A7=80=EC=8B=9DDB=20=ED=8A=B8=EB=9E=99=20=EC=85=8B=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9=20=C2=B7=20=EC=95=94=ED=98=B8=ED=99=94=20?= =?UTF-8?q?=EC=84=B1=EA=B2=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 최종 확인에서 내 오류 하나와 큰 구멍 하나가 나옴. 정정 - *.SMT 를 암호화라 적은 것은 틀렸음. 앞 4KB 만 보고 필터를 세게 걸어 놓쳤고 본문은 0x200 부터임. COSTN.SMT 276개·PRJLST.SMT 153개 문자열이 평문으로 읽힘. 암호화는 BDQTY·SYSINFO 둘뿐이라는 판정은 그대로 유효 구멍 — 지식DB 에 STmate 트랙이 셋이고 서로 몰랐음 - technical_info/01_임도/05_원가정보 (계산 로직 10문서, 2026-08) - original/원가계산/STmate (STC 포맷 8문서, 2026-08-15) - original/경쟁사 프로그램/STmate 분석 (이번 것) - 단수처리 규칙·INITIAL 시트·SMT 문법·BDQTY 난독화는 이미 있던 것을 다시 한 셈. 다만 실행모듈 정적분석·폼 복원·골든셋 회귀·변경설계 모드· 단가산출 Q식은 이번에만 나온 것 PRJLST.SMT — 가장 중요한 발견 - 프로젝트별 원가계산 설정이 INI 평문으로 들어 있음. 차수별 섹션 - 요율이 좌표가 아니라 값으로 저장됨 (R_KANNO=10.8, R_IYUN=15 등) → 프로젝트 읽기·검산에 요율 좌표(T1)가 필요 없음. 우선순위 격하 - 수공형식 세부경비 8개 항목 확정 (R_S_SUDO/BOKRI/SOMO/TONGSIN/SEGUM/ PEGI/DOSEO/JIGUP). KAN_ORD_2 의 331~338 과 일치 - 직접입력 금액 C_KUNBO·C_YUNBO·C_IYUN_M 이 변경설계 「당초액 유지」와 끝전조정 보정액의 저장 자리 암호화의 성격 - 암호화 41개는 전부 파일명에 출처 기관·반기가 박힌 유료 구독 데이터. 평문 43개는 법정 공개 자료인 제비율 요율표. 후보 슬롯 이름이 국내 물가지 이름 그대로임. 프로그램 로직이 아니라 사온 데이터를 지키는 것 - Aislo 는 노임·유가·환율·시설공통자재를 이미 직접 확보. 실질 격차는 물가지 자재단가 구독 하나 문서 21 신규, SMT 덤프 스크립트 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 6 + .../20_분석/20_설정파일과_보고서_카탈로그.md | 14 +- .../STmate 분석/20_분석/21_정정과_트랙통합.md | 156 ++++++++++++++++++ .../STmate 분석/40_스크립트/smt_body_dump.py | 14 ++ .../경쟁사 프로그램/STmate 분석/README.md | 1 + 5 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/21_정정과_트랙통합.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_body_dump.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 69d51a99..9d3a257f 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -27,6 +27,7 @@ | 18 누락 계산로직 점검 | **사슬에 빠진 칸 찾기** — 노임 환산식·단가산출 Q식·설정 스냅샷·집계표 반올림 | (저장소 파일) | | 19 진행률 장부 | **어디까지 봤고 무엇이 남았나** — 원천별 실측 진행률, 차단점 현황 | (저장소 파일) | | 20 설정파일과 보고서 카탈로그 | **`Start8x.Ini`·`SET_REP`** — 간접비 코드 사전 301~370, 서식 75종 | (저장소 파일) | +| 21 정정과 트랙 통합 | **⛔ `SMT` 판정 정정 · 지식DB 트랙 셋 통합 · `PRJLST.SMT` 설정 원장 · 암호화의 성격** | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -74,6 +75,11 @@ | 간접비 항목 순서·코드 | 화면 텍스트 복원 | **A** — `KAN_ORD_1/2` 코드 목록, 301~370 사전 | 20번 §2.1·§2.2 | | 후보 슬롯 이름 | 「설정에 있을 것」 | **설치본마다 다름을 실물 확인** (유통 물가 ↔ 견적단가) | 20번 §2.3 | | 보고서 서식 | 30종 관찰 | **카탈로그 75종** — 수공양식·표준시장 서식 존재 | 20번 §3 | +| `*.SMT` | ⛔ 암호화라고 적었음 | **정정 — 평문.** `COSTN.SMT` 단가 전개, `PRJLST.SMT` 설정 원장 | 21번 §1 | +| 프로젝트 요율 | 기준표 좌표로 찾아야 한다고 봄 | **`PRJLST.SMT`에 값으로 저장** — 좌표는 읽기에 불필요 | 21번 §3 | +| 수공형식 세부경비 8개 | 표본 없어 미상 | **항목 확정** — `R_S_SUDO`·`BOKRI`·`SOMO`·`TONGSIN`·`SEGUM`·`PEGI`·`DOSEO`·`JIGUP` | 21번 §3.2 | +| 암호화의 성격 | 「기초단가가 막혔다」 | **사온 물가지 데이터 보호** — 뚫을 일이 아니라 살 일 | 21번 §4 | +| 지식DB STmate 트랙 | 하나로 알고 있었음 | **셋이 서로 몰랐음** — ①계산로직 ②STC포맷 ③프로그램분석 | 21번 §2 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md index 6e9cbe50..00a3500d 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md @@ -130,14 +130,18 @@ EXEUR1/2=1000 EXYEN1/2=1000 ## 4. `COSTN.SMT` · `QCODE.SMT` · `STini.MEM` +> ⛔ **이 절의 첫 판정은 틀렸다. 21번 §1에서 정정했다.** 아래는 바로잡은 내용이다. + | 파일 | 크기 | 상태 | |---|---:|---| -| `COSTN.SMT` | 10,177 B | 머리 `SIxMemo`, **본문에 읽히는 문자열 없음 — 암호화/압축** | -| `PRJLST.SMT` | 2,291 B | 같음 | -| `QCODE.SMT` | 2,291 B | 같음 | -| `STini.MEM` | 512 B | Delphi `TMemoryStream` 덤프로 보임, 미해독 | +| `COSTN.SMT` | 10,177 B | ✅ **평문 — 본문 문자열 276개.** 단가산출 전개 텍스트 | +| `PRJLST.SMT` | 2,759 B | ✅ **평문 — 153개.** 프로젝트별 원가계산 설정 원장 | +| `QCODE.SMT` | 512 B | 머리만, 내용 없음 | +| `STini.MEM` | 512 B | 미해독 | -07번이 기대한 `&M00034M&` 같은 참조 토큰은 **평문으로 읽히지 않는다.** 다만 같은 정보가 출력 XLSX의 `일위대가표`·`단가산출근거`에 평문으로 있으므로(17번·18번) **의존 그래프 복원에 지장은 없다.** +처음 훑을 때 **파일 앞 4KB만** 보고 필터를 세게 걸어 놓쳤다. **본문은 `0x200`부터** 시작한다. 07번이 기대한 `&M00034M&` 참조 토큰이 **평문으로 그대로 있다.** + +암호화된 것은 `BDQTY.DBF`·`SYSINFO.DBF` 둘뿐이라는 판정은 그대로 맞다. 상세는 **21번 §1·§3**과 기존 `original/원가계산/STmate/SIxMemo_구조.md`. ## 5. 이번 점검이 바꾸는 것 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/21_정정과_트랙통합.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/21_정정과_트랙통합.md new file mode 100644 index 00000000..6b24eb62 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/21_정정과_트랙통합.md @@ -0,0 +1,156 @@ +# 정정과 트랙 통합 — 마지막 확인에서 드러난 것 + +작성일: 2026-09-13 +계기: 「분석이 대부분 끝났나」 최종 확인. **끝나지 않았다.** 오히려 이 확인에서 **내 오류 하나와 큰 구멍 하나**가 나왔다. + +## 1. ⛔ 정정 — `*.SMT` 는 암호화가 아니다. 읽힌다. + +20번 §4에 「`COSTN.SMT`·`QCODE.SMT`·`PRJLST.SMT` 본문에 읽히는 문자열 없음 — 암호화/압축」이라 적었다. **틀렸다.** + +앞선 훑기가 **파일 앞 4KB만** 본 데다 필터가 셌다. 본문은 **`0x200`부터** 시작한다. + +| 파일 | 크기 | 읽히는 문자열 | +|---|---:|---:| +| `COSTN.SMT` | 10,177 B | **276개** | +| `PRJLST.SMT` | 2,759 B | **153개** | +| `QCODE.SMT` | 512 B | 1개 (비어 있음) | + +암호화된 것은 **`BDQTY.DBF`와 `SYSINFO.DBF` 둘뿐**이라는 앞선 판정은 그대로 맞다. + +## 2. 큰 구멍 — 지식DB에 STmate 트랙이 **셋**이고 서로 몰랐다 + +| 트랙 | 자리 | 담당 | 만든 때 | +|---|---|---|---| +| ① **계산 로직** | `technical_info/01_임도/05_원가정보/` (문서 10개) | 밑수·단수처리·제비율·기계경비·노임·자재 적용 | 2026-08 | +| ② **STC 포맷** | `original/원가계산/STmate/` (문서 8개) | 컨테이너·필드사전·난독화·SIxMemo·INITIAL | 2026-08-15 | +| ③ **프로그램 분석** | `original/경쟁사 프로그램/STmate 분석/` (이 폴더) | 실행모듈·폼·계산사슬·골든셋 | 2026-09-12~13 | + +②의 `_meta.md`가 **「계산 로직은 `technical_info/01_임도/05_원가정보/`가 담당, 이 폴더는 포맷만」** 이라고 트랙 분리를 명시해 놓았다. ③을 만들 때 이것을 못 보고 시작했다. + +### 그 결과 겹치거나 어긋난 것 + +| 내가 「새로 찾았다」한 것 | 이미 있던 곳 | 판정 | +|---|---|---| +| 내역 행 절사 · 집계표 사사오입 · 관급 천원 올림 | ①`단수처리_규칙.md` — **5공사지 교차로 이미 확정**. 봉화 216건까지 같은 숫자 | **중복** | +| `〓 INITIAL 〓` 시트 | ②`XLSX_INITIAL_구조.md` — 존재·성격 이미 규명. 「셀 전수 추출」만 미착수 | **부분 중복** (전수 추출은 18번이 처음) | +| `COSTN.SMT` 토큰 | ②`SIxMemo_구조.md` — **헤더·문법 이미 해독**(`&M00034M&`, `:=A01`, `Q=…`) | **중복이자 내 오판** | +| `BDQTY`·`SYSINFO` 암호화 | ②`STC_난독화_상태.md` — **XOR 키스트림 부분 검증까지** 완료 | **중복** | + +**정직하게 말해 ③의 상당 부분이 ①②를 다시 한 것이다.** 다만 ③에서만 나온 것도 분명하다 — 실행모듈 정적분석(은행가 반올림), 폼 복원(밑수 공식·설정 83축·간접비 코드), 골든셋 회귀(원 단위 재현), 변경설계 모드, 단가산출 Q식 전수. + +## 3. ⭐ `PRJLST.SMT` — 요율이 **값으로** 저장돼 있다 + +가장 중요한 발견. 프로젝트마다 원가계산 설정이 **INI 형식 평문**으로 들어 있다. + +```ini +[KANJUB] JAB_TYPE=0 CAL_ACTL=0 VIS_TOTL=0 +[1_KANJUB] ← 차수 1 +[2_KANJUB] ← 차수 2 +``` + +### 3.1 요율 `R_*` — 전부 값으로 + +```ini +1_R_KANNO=10.8 간접노무비 1_R_SANBO=3.8 산재보험료 +1_R_KOBO=0.67 고용보험료 1_R_KUNBO=1.4 건강보험료 +1_R_YUNBO=2.41 연금보험료 1_R_ANJUN=2.48 산업안전보건관리비 +1_R_T_KITA=6.1 기타경비 1_R_HADOSU=0.018 하도급보증수수료 +1_R_ILBAN=4.7 일반관리비 1_R_IYUN=15 이윤 +1_R_KONGSA=0.7 공사보험료 1_R_TBUGUM=0 퇴직공제부금 +``` + +### 3.2 ⭐ 수공형식 세부 경비 8개가 여기 있다 + +```ini +1_R_S_SUDO 수도광열비 1_R_S_BOKRI 복리후생비 +1_R_S_SOMO 소모품·사무용품비 1_R_S_TONGSIN 여비·교통비·통신비 +1_R_S_SEGUM 세금·공과금 1_R_S_PEGI 폐기물처리 +1_R_S_DOSEO 도서·시공도작성비 1_R_S_JIGUP 지급수수료 +``` + +**`KAN_ORD_2`의 `331`~`338` 여덟 개와 정확히 맞는다**(20번 §2.1). 수공형식 표본이 없어도 **항목 구성은 확정**됐다. + +### 3.3 직접입력 금액 `C_*` — 변경설계 「당초액 유지」의 실제 자리 + +```ini +1_C_KUNBO=649160 건강보험료 직접입력 금액 +1_C_YUNBO=1117483 연금보험료 직접입력 금액 +1_C_ANJUN=1994098 안전관리비 +1_C_IYUN_M=37182 이윤 보정액 ← 16번 §4.4 끝전조정의 저장 자리 +1_C_KONGSA_J=119300000 +``` + +**19번 §6에서 「건강·장기요양·연금은 당초액 유지」라 실증한 것의 저장 자리가 이것이다.** 요율이 아니라 **금액을 직접 써 넣는다.** + +### 3.4 선택 인덱스 `I_*` — 폼의 83축과 직결 + +```ini +1_I_KONG_TYPE=0 공사종류 1_I_KONG_KIKAN=2 공사기간 +1_I_ANJUN_TYPE=0 안전비 공종 1_I_KUN_TYPE=6 건물종류 +1_I_JEOLSA=5 공급가액 절사 1_I_TBUGUM=3 퇴직공제 구분 +1_I_BUGA=0 부가세 방식 1_I_KOBO_TYPE=0 고용보험 등급 +1_I_MTYP · 1_I_LTYP · 1_I_MXA · 1_I_MXK ← 실적형식 전용 (12번 §10.1-2) +``` + +12번이 폼에서 뽑은 축 이름(`cmBx_Kong_Type`·`cmBx_AnJun_Type`·`cmBx_JeolSa`…)과 **일대일로 맞는다.** + +### 3.5 ⇒ 요율 좌표(T1)는 재구현 필수가 아니다 + +**프로젝트를 읽을 때는 `PRJLST.SMT`의 `R_*` 값을 그대로 쓰면 된다.** 기준표 좌표는 「새 프로젝트를 만들며 기준표에서 고르는」 경로에만 필요하다. + +| 쓰임 | 좌표 필요? | +|---|---| +| STmate 프로젝트 **읽기·검산** | ❌ — `PRJLST.SMT`에 값이 있음 | +| Aislo에서 **새로 요율을 고르기** | ⭕ — 다만 Aislo는 **현행 법령**에서 고르면 됨 | +| STmate와 **같은 기준표 선택 재현** | ⭕ — 하지만 목표가 아님 | + +⇒ 13번 T1의 우선순위를 **1위에서 내린다.** 19번 §7의 「규모·기간 의존 요율 좌표」도 같은 이유로 격하한다. + +## 4. 암호화의 성격 — 프로그램이 아니라 **사온 데이터**를 지킨다 + +| | 암호화 41개 | 평문 43개 | +|---|---|---| +| 무엇 | `*.BSC` · `*.CSTA` · `*.STBSC` 단가 자료 | `JB_*` 제비율 요율표 | +| 성격 | **유료 구독 데이터** | **법정 공개 자료** | + +암호화된 파일은 **전부 파일명에 출처 기관과 반기가 박혀 있다.** + +``` +2025(상,국교,해수부,조달청)_표준시장.CSTA 국토부·해수부·조달청 표준시장단가 +2026(상_노임,기계경비).STBSC 대한건설협회 노임 + 건설기계 경비 +2026(상_표준일위대가_토목).STBSC 표준품셈 일위대가 +2026-상-시설공통자재.STBSC 나라장터 시설공통자재 +JDCODE_M.BSC 19 MB 자재 코드·단가 57,580건 +``` + +**결정적 근거는 후보 슬롯 이름이 국내 물가지 이름 그대로**라는 점이다. + +| 슬롯 | 이름 | 실체 | +|---|---|---| +| 1 | 조달가격 / 가격 정보 | 조달청 가격정보 | +| 2 | **물가자료** | 한국물가협회 | +| 3 | **물가정보** | 한국물가정보 | +| 4 | 거래가격 | 거래가격지 | +| 5 | 유통 물가 / 견적단가 | 유통물가 또는 업체 견적 | + +즉 STmate는 **물가지 네댓 곳에서 사온 단가를 자기 포맷으로 담아 반기마다 배포**하며, 암호화는 **그 데이터의 저작권 보호**다. 프로그램 로직을 숨기려는 것이 아니다 — 계산 모듈(`*.CPM`)은 암호화돼 있지 않고 프로젝트 파일도 대부분 평문이다. + +### Aislo 에 뜻하는 것 — 뚫을 일이 아니라 살 일 + +| 무엇 | STmate | Aislo 현재 | +|---|---|---| +| 계산 규칙 | 암호화 안 됨 | ✅ 다 읽었음 | +| 법정 요율(제비율) | 평문 | ✅ 현행법에서 직접 | +| 품셈 `q·K·f·E·Cm` | 출력에 평문 | ✅ `건설공사_표준품셈` 보유 | +| 노임 | 암호화 배포 | ✅ `노임단가_건설업_대한건설협회` | +| 유가·환율 | 암호화 배포 | ✅ `유가_오피넷` · `환율_한국은행ECOS` | +| 시설공통자재 | 암호화 배포 | ✅ `자재단가/나라장터_시설공통자재` | +| **물가지 자재단가** | 암호화 배포 | ⛔ **구독 필요 — 유일한 실질 격차** | +| 표준시장단가 | 암호화 배포 | ◐ 조달청 공표 자료로 대체 가능 | + +## 5. 이 문서 이후 해야 할 것 + +1. **①②③ 트랙을 잇는 색인** — 세 폴더 머리에 서로를 가리키는 줄을 넣어 다시 갈라지지 않게 할 것 +2. ③의 계산 규칙을 ①`technical_info/05_원가정보/`로 **승격** — ①이 Aislo 구현의 정본이므로 +3. ②의 미해명(`SMT` 10바이트 인덱스, 레코드 경계)과 ③의 성과를 합칠 것 +4. `COSTN.SMT` 전개 텍스트 **전수 파싱** — ②가 문법을 해독해 뒀으므로 바로 가능 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_body_dump.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_body_dump.py new file mode 100644 index 00000000..90a6b889 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_body_dump.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""SIxMemo(*.SMT) 본문 덤프 — 0x200 부터가 본문. 원본은 읽기만.""" +import sys, io, re, pathlib +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +D = pathlib.Path(r"C:\경영정보(주)\STmate 자료\설계자료\실습(맛보기)") +for f in ("PRJLST.SMT","COSTN.SMT","QCODE.SMT"): + b=(D/f).read_bytes() + out=[] + for m in re.finditer(rb"[\x20-\x7e\xa1-\xfe]{3,}", b[0x200:]): + try: out.append((0x200+m.start(), m.group().decode("cp949"))) + except Exception: pass + print("\n" + "="*92) + print("### %s %d B 본문 문자열 %d개" % (f, len(b), len(out))) + for off,s in out: print(" 0x%05X %s" % (off, s[:86])) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index c3beb662..2669cd6f 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -46,6 +46,7 @@ | 18 | **누락 계산로직 점검** — 노임 환산식·단가산출 Q식·설정 스냅샷 | | 19 | **진행률 장부** — 어디까지 봤고 무엇이 남았나 | | 20 | **설정파일과 보고서 카탈로그** — 간접비 코드 사전, 서식 75종 | +| 21 | **정정과 트랙 통합** — `SMT` 정정, 지식DB 세 트랙, 암호화의 성격 | ## 확정된 굵직한 것 From 198cd3120fd693fc33eb60e6ae8582e6646221ce Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 14:04:47 +0900 Subject: [PATCH 16/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=2020=EB=B2=88=20=EC=9A=94=EC=95=BD=ED=91=9C=EC=9D=98=20SMT=20?= =?UTF-8?q?=ED=96=89=EB=8F=84=20=EC=A0=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md index 00a3500d..b82560c9 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/20_설정파일과_보고서_카탈로그.md @@ -152,5 +152,5 @@ EXEUR1/2=1000 EXYEN1/2=1000 | 후보 슬롯 이름 | 「설정에 있을 것」 | ✅ **설치본마다 다름을 실물로 확인** | | 코드 종류 사전 | 추정 | ✅ `COD_FMT_1~8` | | 보고서 서식 | 30종 봄 | ✅ **카탈로그 75종** 전체 | -| `*.SMT` 메모 | 「토큰이 있을 것」 | ⛔ **암호화 — 다만 출력에 같은 정보 있음** | +| `*.SMT` 메모 | 「토큰이 있을 것」 | ✅ **평문 — 토큰·설정 원장이 그대로** (21번 §1·§3) | | 할증률 설정 자리 | 없었음 | ◐ `[NAG_HAL]` 발견, 표본은 전부 0 | From f0319e311ea27fc7250eeab5b35685128a462c7b Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 14:10:47 +0900 Subject: [PATCH 17/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20UI=20=ED=8F=BC=20=EC=A0=84=EC=88=98=20=EB=B6=84=EC=84=9D=20?= =?UTF-8?q?=E2=80=94=20=EC=84=A0=ED=83=9D=EC=B6=95=20272=EA=B0=9C,=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=97=90=20=EB=82=A8=EC=95=84=20=EC=9E=88?= =?UTF-8?q?=EB=8D=98=20=EA=B3=84=EC=82=B0=20=EA=B7=9C=EC=B9=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 폼 233개(고유 190개) 중 3개만 뽑아 쓰고 있었음. 전수로 훑어 폼 40개에서 선택축 272개를 뽑음. 계산설정 폼 하나에서 뽑았던 83축의 세 배가 넘음. 화면에서 새로 나온 계산 규칙 - wM_Edt_Hal: 적용단가 = 기준단가 x 율%, 소수 n 자리 미만 절사/반올림. 「적용단가 0원인 것과 보호표시된 것은 수정 안 됨」 = T10 일괄변경 수동값 우선순위가 화면 안내문에 있음 - wM_Rate: 단수처리가 전역이 아니라 비목(M·L·X·W)마다 절사/반올림 x 소수 0~4위 - wM_Sel_Prn: ACTTYP = 표준시장단가 적용 방식(노임외 비목 적용안함/재료비로/ 경비로), ACTOPT = 끝전 보정 우선순위. 설치폴더의 STBSC 파일명과 정확히 대응. 봉화는 ACTYP=1 ACTOP=2 = 「노임외 재료비로 적용 + 소수 비교후 타금액 우선보정」 ⚠ 변경 차수가 화면에서 8차까지임. COSTN 접미사 4벌과 어긋나므로 재확인 필요 - wM_Set_Sys: KCDNM·ACDNM·ZCDNM·JCDNM·ECDNM·BPNNM 이 전부 소수 자리수 설정. 20번에서 미확정으로 둔 것이 풀림. EXRNM 은 환율 적용 범위, RX1NM~RX4NM 은 작업조건별 노임 환산식 4벌(터널·장대터널·펌프/GRAB/버켓준설선) - wM_KanJub_K: 기성 계산은 부가세 선택지가 설계용과 다름 (재료비+산출경비의 10% 추가) - wM_Mrg_BSC: 반기 기준자료 갱신의 매칭 키 5단계와 덮어쓰기 정책 - wM_JabPum·wQtyList: 코드 종류 전체 목록에 「그림코드」가 따로 있음 문서 22 신규, UI 카탈로그 원자료와 스크립트 3개 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 6 + .../STmate 분석/20_분석/22_UI_폼_분석.md | 156 ++++++++ .../STmate 분석/30_원자료/ui_form_catalog.txt | 335 ++++++++++++++++++ .../STmate 분석/40_스크립트/form_catalog.py | 52 +++ .../STmate 분석/40_스크립트/form_extract.py | 38 ++ .../STmate 분석/40_스크립트/ui_form_sweep.py | 62 ++++ .../경쟁사 프로그램/STmate 분석/README.md | 1 + 7 files changed, 650 insertions(+) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/22_UI_폼_분석.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/ui_form_catalog.txt create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/form_catalog.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/form_extract.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/ui_form_sweep.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 9d3a257f..5cbb149c 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -28,6 +28,7 @@ | 19 진행률 장부 | **어디까지 봤고 무엇이 남았나** — 원천별 실측 진행률, 차단점 현황 | (저장소 파일) | | 20 설정파일과 보고서 카탈로그 | **`Start8x.Ini`·`SET_REP`** — 간접비 코드 사전 301~370, 서식 75종 | (저장소 파일) | | 21 정정과 트랙 통합 | **⛔ `SMT` 판정 정정 · 지식DB 트랙 셋 통합 · `PRJLST.SMT` 설정 원장 · 암호화의 성격** | (저장소 파일) | +| 22 UI 폼 분석 | **폼 233개 중 3개만 봤던 것** — 선택축 272개, `ACTTYP`·자리수 키·일괄변경 규칙 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -80,6 +81,11 @@ | 수공형식 세부경비 8개 | 표본 없어 미상 | **항목 확정** — `R_S_SUDO`·`BOKRI`·`SOMO`·`TONGSIN`·`SEGUM`·`PEGI`·`DOSEO`·`JIGUP` | 21번 §3.2 | | 암호화의 성격 | 「기초단가가 막혔다」 | **사온 물가지 데이터 보호** — 뚫을 일이 아니라 살 일 | 21번 §4 | | 지식DB STmate 트랙 | 하나로 알고 있었음 | **셋이 서로 몰랐음** — ①계산로직 ②STC포맷 ③프로그램분석 | 21번 §2 | +| UI 폼 | 3개만 뽑아 씀 | **선택축 272개 전수** — 폼 40개 | 22번 | +| 일괄변경 수동값 (T10) | ⛔ 실행 필요 | **화면 안내문에 있음** — 보호표시·0원 제외 | 22번 §3.1 | +| `ACTTYP`·`ACTOPT` | 뜻 모름 | **A** — 표준시장 적용 방식·끝전 보정 우선순위 | 22번 §3.3 | +| `KCDNM` 등 6키 | 미확정 | **A** — 소수 자리수 설정 | 22번 §3.4 | +| 변경 차수 | 최대 3차로 봄 | ⚠ **화면은 8차** — 저장 구조 재확인 필요 | 22번 §3.3 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/22_UI_폼_분석.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/22_UI_폼_분석.md new file mode 100644 index 00000000..5d4f383c --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/22_UI_폼_분석.md @@ -0,0 +1,156 @@ +# UI 폼 분석 — 화면에 남아 있던 계산 규칙 + +점검일: 2026-09-13 +계기: 「추가 UI 정보도 분석했는지」 확인. **안 했다.** 폼 233개 중 **3개만** 뽑아 썼다. +원자료: `30_원자료/ui_form_catalog.txt` · 재현 스크립트: `40_스크립트/ui_form_sweep.py`, `form_extract.py`, `form_catalog.py` + +## 1. 그동안 얼마나 봤나 + +| | 개수 | +|---|---:| +| 폼을 가진 PE 모듈 | 46 | +| 폼 자원 (중복 포함) | **233** | +| 서로 다른 폼 이름 | **190** | +| **그동안 뽑아 쓴 것** | **3** — `TWM_KANJUB`·`TWM_KAN_RATE`·`TPM_KAN_RATE` | + +계산 분석에 필요한 제비율·계산설정 화면만 뽑고 나머지는 손대지 않았다. + +## 2. 이번에 전수로 훑음 + +파싱에 성공한 STmate 고유 폼에서 캡션과 선택지를 뽑았다. + +| | 개수 | +|---|---:| +| 선택지를 가진 폼 | **40** | +| **선택축** | **272** | + +12번 §10.1-2가 계산설정 폼 하나에서 뽑은 **83축의 세 배가 넘는다.** + +### 폼 이름 규칙 + +``` +PM_* 인쇄 폼 — SET_REP 의 보고서 서식 75종과 대응 +w* / wM_* 편집 창·모달 +frm* 보조 창 +``` + +`ST_P_Nae`(22) · `STmate.Cpm`(30) · `ST_Boq`(13)에 폼이 몰려 있다. + +## 3. 화면에서 새로 나온 계산 규칙 + +### 3.1 `wM_Edt_Hal` — 기준단가 수정 (단가 일괄보정) + +```text +적용단가 = 기준단가 × [ ] % , 소수 [ ] 자리 미만 [절사 / 반올림] + +※ 단【 적용단가 】가 "0" 원인것과 보호표시된 것은 수정안됨 +``` + +⇒ **일괄변경에서 「보호표시(수동 고정)된 항목과 적용단가 0원인 항목은 건너뛴다.**」 13번 **T10(일괄변경 수동값 우선순위)**의 핵심이 화면 안내문에 적혀 있다. 등급 **A**(화면 문구 기준). + +### 3.2 `wM_Rate` — 비목별 일괄 보정, 절사/반올림 × 소수 0~4위 + +`ST_Boq.CPM`의 노무비·재료비·경비·중기·일식 보정 창에 **비목마다 같은 짝**이 있다. + +```text +wcBx_Pnt1_M / _L / _X / _W → 0 절사하여 · 1 반올림 하여 +wcBx_Pnt2_M / _L / _X / _W → 0~4 소수 n 위값을 적용 +rd_Qty1 / rd_Amt1 / rd_Amt2 → 내역서 전체 · 선택된 항목만 +``` + +⇒ **단수처리가 전역 설정 하나가 아니라 비목(M·L·X·W)마다 따로**다. 09번 §4의 「출력별 정책을 데이터로」가 여기서도 확인된다. + +### 3.3 `wM_Sel_Prn` — `ACTTYP`·`ACTOPT` 의 뜻이 풀렸다 + +`PRJLST.ACTTYP`·`ACTOPT`와 `INITIAL`의 `ACTYP`·`ACTOP`가 무엇인지 몰랐다. 화면이 답한다. + +```text +cb_ACTTYP 노무비외 비목 적용안함 / 노무비외 재료비로 적용 / 노무비외 경비로 적용 +cb_ACTOPT 노무비 1원미만 버림 / 소수 비교후 노무비 우선보정 / 소수 비교후 타금액 우선보정 +``` + +**표준시장단가(실적) 적용 방식**이다. 설치 폴더의 파일명과 정확히 대응한다. + +``` +2025(상_표준시장[노임외 경비적용],국교,해수부).STBSC +2025(상_표준시장[노임외 재료비적용],국교,해수부).STBSC +``` + +봉화 2024는 `ACTYP=1`·`ACTOP=2` → **「노임외 재료비로 적용」 + 「소수 비교후 타금액 우선보정」**이다. + +`cb_PCLASS`(당초/변경/분할설계)와 `cb_CHASU`(1~8차변경)도 여기 있다 — **변경 차수가 최대 8차**까지다. `COSTN`의 접미사 1~4(최대 3차변경)와 다르므로, **차수 저장 구조가 4벌 슬롯만이 아니다.** + +### 3.4 `wM_Set_Sys` — `Start8x.Ini` 의 미확정 키가 풀렸다 + +20번 §2.4에서 「`KCDNM`·`ACDNM`·`ZCDNM`·`JCDNM`·`ECDNM`·`BPNNM`은 의미 미확정(B)」이라 적었다. 화면이 답한다. + +```text +cmBx_KCD / ACD / JCD / ECD / BPN → 0 자리 · 1 자리 · 2 자리 +cmBx_ZCD → 2 자리 · 3 자리 +``` + +⇒ **전부 소수 자리수 설정**이다. `Start8x.Ini`의 `KCDNM=1 ACDNM=1 ZCDNM=2 JCDNM=0 ECDNM=0 BPNNM=1`이 그대로 자리수다. 등급 **A**. + +같은 화면에서 두 가지가 더 풀린다. + +```text +cmBX_EXR 환율 적용 범위 — 시간당중기사용료 단독적용 / 중기 / 대가 / 산근 / 내역 전체 +cmBx_Sel_RX 노임 환산 계수 갈래 — 계수 ; 터널구간 / 계수-1 ; 장대터널 + / 계수-2 ; 펌프준설선 / 계수-3 ; GRAB준설선 / 계수-4 ; 버켓준설선 +``` + +⇒ `[EQUIPMENT]`의 `RX1NM`~`RX4NM`은 **작업 조건별 노임 환산식 네 벌**이다(18번 §2.1의 `RXTNM`이 기본). `EXRNM`은 환율을 어디까지 적용할지다. + +### 3.5 `wM_KanJub_K` — 부가세 방식이 하나 더 있다 + +기성 제잡비 계산서 화면의 부가세 선택지가 **12번 §10.1과 다르다.** + +```text +(0) 직접입력 (1) 공급가액의 10% (2) 재료비의 10% (3) 재료비+산출경비의 10% +``` + +12번이 본 설계용 화면은 `공급가액의 10% / 재료비의 10% / 없음 / 산림조합 형식 / 산림조합-면세품`이었다. **기성 계산은 선택지 집합이 다르다.** 계류보전 프로젝트의 부가세가 10%가 아니었던 것(19번 §6 주석)과 이어질 수 있다. + +`rd_Filter`는 집계 수준을 고르는 축이다 — `소계(+=) 이상 / 계(+==) / 합계(+===) / 총계(+====) / 총합계(+=====)`. **`BOQ11`의 `T*`·`E*` 계층 깊이와 대응**한다(16번 §4.1). + +### 3.6 `wM_Mrg_BSC` — 기준자료 갱신 매칭 규칙 + +```text +매칭 기준(5단계) 호환규정코드 / 시설코드 / 명칭·규격·단위 / 호환+명+규+단 / 명칭·단위 / 설정안함 +명칭·단가·조달코드 업데이트 안함(복사처적용) / 업데이트(복사원적용) + + 조달코드는 「복사처 우선」·「복사원 우선」까지 4택 +``` + +⇒ 반기마다 새 기준자료가 오면 **무엇을 키로 잡아 기존 프로젝트 단가를 갱신할지**가 여기서 정해진다. 재구현 시 같은 축이 필요하다. + +### 3.7 `wM_JabPum` · `wQtyList` — 코드 종류 전체 목록 + +```text +모든단가 · 노무비 · 재료비 · 경비 · 일위대가 · 중기비 · 단가산출 · 견적단가 · 대가,산근 · 그림코드 +``` + +`COD_FMT_1~8`(20번 §2.4)보다 넓다. **`그림코드`**가 따로 있다 — 도면 참조 코드가 단가 체계 안에 있다. + +## 4. 이번 점검이 바꾸는 것 + +| 항목 | 이전 | 지금 | +|---|---|---| +| UI 분석 범위 | 폼 3 / 190 | **선택축 272개 전수 카탈로그** | +| 일괄변경 수동값 우선순위 (T10) | ⛔ 실행 필요 | ✅ **화면 안내문에 있음** — 보호표시·0원은 제외 | +| 비목별 단수처리 | 전역 설정으로 봄 | ✅ **M·L·X·W 각각 절사/반올림 × 소수 0~4위** | +| `ACTTYP`·`ACTOPT` | 뜻 모름 | ✅ **표준시장단가 적용 방식·끝전 보정 우선순위** | +| `KCDNM` 등 6개 키 | 미확정 (B) | ✅ **소수 자리수 설정** | +| `RX1NM`~`RX4NM` | 미상 | ✅ **작업조건별 노임 환산식 4벌** (터널·준설선 계열) | +| 변경 차수 | 최대 3차(접미사 1~4)로 봄 | ⚠ **화면은 8차까지** — 저장 구조 재확인 필요 | +| 부가세 방식 | 설계용 5택 | ⚠ **기성용은 다른 4택** | + +## 5. 남은 UI 작업 + +| 순위 | 할 일 | 왜 | +|---:|---|---| +| 1 | `PM_*` 인쇄 폼 ↔ `SET_REP` 75종 **대응표** | 어느 서식이 어느 계산을 쓰는지 | +| 2 | `wBoq`(398 KB)·`wM_Edit_San`(81 KB) 깊이 파싱 | 내역·단가산출 **편집 규칙** | +| 3 | 변경 차수 **8차** 저장 구조 확인 | `COSTN` 접미사 4벌과 어긋남 | +| 4 | 272개 선택축 ↔ `PRJLST.SMT` 키 대응 | 설정 저장 자리 완성 | + +**UI 는 「화면 모양」이 아니라 계산 옵션의 원장이다.** 아직 캘 것이 남았다. diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/ui_form_catalog.txt b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/ui_form_catalog.txt new file mode 100644 index 00000000..128132c5 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/ui_form_catalog.txt @@ -0,0 +1,335 @@ +### 파싱 성공한 STmate 고유 폼 150개 + +■ PM_Prn_Ord ST_Prt.CPM «보고서 파일의 인쇄순서를 지정합니다.» + cBx_BTyp 당초 설계, 변경 설계, 분할 설계, 실적 공사, 할증 내역, 견적 내역, 계약 내역, 실행 예산, 기성 내역, 설계 변경, 굴착/복구, 굴착 변경 +■ PM_Prt ST_Prt.CPM «설계예산시스템 인쇄메뉴» + cmBx_FntTyp 굴림체, 궁서체, 바탕체, 돋움체 + cmBx_BigoFld 코드번호 인쇄, 번호(호표) 인쇄, 분류번호 인쇄, 시설코드 인쇄, 호환규정코드, 적용기준일, 수공분류코드 + cmBx_CodeFld 코드번호 인쇄, 번호(호표) 인쇄, 분류번호 인쇄, 시설코드 인쇄, 호환규정코드 + cmBx_PosQty 수량 / 단위, 단위 / 수량, 표 준 + cmBx_BigoFld2 코드번호 인쇄, 번호(호표) 인쇄, 분류번호 인쇄, 시설코드 인쇄, 호환규정코드, 적용기준일, 수공분류코드 + cmBx_SHTyp 일반양식 인쇄, 토개공양식 인쇄, 수자원공사양식 인쇄 + cmBx_SanLP 기본방향(세로) 인쇄, 횡 방향(가로) 인쇄 + cmBx_SanMOK 일반양식 인쇄, 산근양식 인쇄 +■ PM_Sel_St ST_Prt.CPM «인쇄할 공종을 선택하세요» + rd_Filter 소 계(+=) 이상, 계(+==) 이상, 합 계(+===) 이상, 총 계(+====) 이상, 총합계(+===== + Rg_Bk 아래로, 위로 +■ mMinMsg_ DP_MinMsg.CPM «종류» + ListBox1 기호1, 기호2, 영어/숫자, 한글자모, 그리스어, 선문자, 단위기호, 원문자, 괄호문자, 히라가다, 가다가나, 러시아어, 특수외국어, 분수/첨자 +■ uM_ConstType ST_U_Convert.CPM «건축공사 사업내용《 건축공사 중 신축 또는 신축에 준하» + cn_Cn_Code1 서울특별시; 11, 부산광역시; 26, 대구광역시; 27, 인천광역시; 28, 광주광역시; 29, 대전광역시; 30, 울산광역시; 31, 세종특별자치시; 36 + cn_Cn_Code2 서울특별시; 11, 부산광역시; 26, 대구광역시; 27, 인천광역시; 28, 광주광역시; 29, 대전광역시; 30, 울산광역시; 31, 세종특별자치시; 36 + cn_Bd_Type 일반청사; 연면적 10,000㎡ 미만 공용청사(경찰서, 우체국 포함), 대형청사; 연면적 10,000㎡ 이상 공용청사(경찰서, 우체국 포함), 일반형초중고; + cn_Dm_Const 철거공사 포함; 기존 부지에 있는 시설물을 철거하고 공사, 철거공사 미포함; 기존/신축 부지에 시설물만 공사 + cn_Cl_Area 비혼잡지역(일반); 공사와 관련된 현장주변의 장애요인이 적고 공사수행환경이 복잡하지 않은 지역, 혼잡지역(특수); 공사에 따른 민원발생 소지가 높고, 특수지반 + cn_Gr_Shape 일반지반; 터파기 등 기초공사 수행에 어려움이 없는 지반, 특수지반; + cn_Sh_Const 흙막이공사가 없는 경우, 흙막이공사가 있는 경우 + cn_St_Type 철골조; 주요 구조부가 철골조로 구성된 경우, 철골철근콘크리트조; 주요 구조부가 철골철근콘크리트로 구성된 경우, 철근콘크리트조; 주요 구조부가 철근콘크리로 구 +■ uM_Merge ST_U_Merge.CPM «데이타 병합 【 복사처 <= 복사원 】» + Rdo_BD 각 기준에 따라 설정, 일식단가(W코드)로 생성 + Rdo_X 일위대가 기준대로 처리, 일식단가(W코드)로 생성 + RdoL 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성) + RdoM 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성) + RdoS 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성) + RdoB 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성) + RdoD 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성) + RdoW 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성) +■ uM_XML_Info ST_U_Convert.CPM «공사원가호환규정 포맷(XML) 변환» + ed_PrjTyp 토목공사, 건축공사, 설비공사, 전기공사, 통신공사, 조경공사, 소방공사, 국가유산수리공사 +■ wBoq ST_Boq.CPM «공종목록표» + cBox01 = 이상, == 이상, === 이상, ==== 이상 , ===== 이상, ====== 이상 + RGrpTo 내역서, 열린 보관함 + cBox02 = 이상, == 이상, === 이상, ==== 이상 , ===== 이상, ====== 이상 +■ wBoqRate ST_Boq.CPM «할증율 적용:» + Rdo 전체(재,노,경 같은 비율), 비목별(재,노,경 각각) +■ wExpnd ST_Boq.CPM «일위대가표 풀기» + RGrpToT 소계(=), 계(==), 합계(===) + CMBoxUpDn 절삭하여, 반올림하여 + CMBoxDot 소수 4위값을 적용, 소수 3위값을 적용, 소수 2위값을 적용, 소수 1위값을 적용, 소수 0위값을 적용 +■ wITNum ST_Boq.CPM «내역서의 공종번호 자동입력» + RdoFirstChar 공란처리, . 입력, ( 입력, - 입력, 추가입력 + RdoLastChar 공란처리, . 입력, ) 입력 + CBoxType 가..하,거..허 ~ 그..흐,기..히 (14x10=140개 까지만 처리), a .. z,a1..z1 ~ a8..z8,a9..z9 (26x10=260개 까 + CBoxLeft 여백 0 Byte, 여백 1 Byte, 여백 2 Byte, 여백 3 Byte, 여백 4 Byte, 여백 5 Byte, 여백 6 Byte, 여백 7 Byte, + Fmt_Typ 0, 00, 000 + cBx_itNum_B 『직전공종(계표시)의 공종번호』, 『직전공종길이 여백으로 채움』 + cBx_OnlyIT 공종(계표시) / 단가코드 모두적용., 공종(계표시)에만 구분적용., 단가코드에만 구분적용. + cBx_Bl_Lev 하위 전체공종 반영, 9레벨(=========) 미만에서 초기화, == 레벨 미만에서 초기화, === 레벨 미만에서 초기화, +■ wKongJong ST_Boq.CPM «공종 목록표» + RdoLevel 소계 (+=), 계 (+==), 합계 (+===), 총계 (+====), 총합계(+=====), 총대계(+======) + RdoFirstChar - 입력, 없슴 + RdoIndex 코드번호 순, 명 칭 순, 분류번호 순 + RdoFilt 일위대가/산근전체, 대공종 해당목록만 +■ wMBoq ST_Boq.CPM «주공종 집계표(계표시 확인)» + CBox01 1레벨( 소 계 ) 이상, 2레벨( 계 ) 이상, 3레벨( 합 계 ) 이상, 4레벨( 총 계 ) 이상, 5레벨(총 합 계) 이상, 6레벨(총 대 +■ wM_Boq_ExecX ST_Boq.CPM «시간/단위당 중기실행단가 계산 및 입력» + wCm_Jeol 1원, 10원, 100원, 1,000원, 10,000원, 100,000원 + wCm_OPT 기본보정, 노 무 비, 재 료 비, 경 비 +■ wM_Box_H STmate.Cpm «불러간 목록» + RG_MComp 변동없음, 1 단가, 2 단가, 3 단가, 4 단가, 5 단가, 최소단가 +■ wM_Boxa STmate.Cpm «단가목록표» + RG_MComp 변동없음, 1 단가, 2 단가, 3 단가, 4 단가, 5 단가, 최소단가 + rg_FLT_M_PP 모 두 보 임, 10 : 새들분수전, 11 : K.P 자재, 12 : 엘보, 13 : 직관, 14 : 소켓, 15 : S.T.S 자재, 16 : 니플, 17 + rg_FLT_B_PP 모 두 보 임, 30 : 토공, 31 : 포장공, 32 : 포장깨기/절단, 30~32 : 토공사, 40 : 분기공, 41 : 관접합, 42 : 관연결, 43 +■ wM_Conv_A2W STmate.Cpm «실적단가를 일식단가로 변환등록» + wcBx_SelJOD 비목율( 단가 => 노,재,경 ), 조달청 발표단가 변환적용 + cBx_Stndard 공종(실적)코드 ↔ 분류번호로 연결, 공종(실적)코드 ↔ 시설코드로 연결, 명칭, 규격, 단위 로 연결 +■ wM_Conv_Mode ST_PList.CPM «설계자료 → 계약자료로 변환등록» + cBx_Sel_QTY 당초 수량/단가 적용, 변경 수량/단가 적용 + cBx_Lev 소계 이상, 계 이상, 합계 이상, 총계 이상, 총합계 이상, 총대계 이상, 광역계 이상, 광역총계이상, 광역대계이상 +■ wM_Edit_EQ ST_EdSan.CPM «표준중기공식 편집.» + cBx_INS_X 공 식, 공식+코드 +■ wM_Edit_San ST_EdSan.CPM «단가산출근거 수정[ D00001: 무근콘크리트 깨기 ]» + RdosmMode 열블럭, 행블럭, 일 반 + cBoxFunc 각종 지원함수, ∏, INT(0), SIN(0), COS(0), TAN(0), SQRT(1) , √(1), ROUND(1,0), ROUNDDOWN(1,0), + cBox_Trans 코드 * 수량(0) =, 명칭 코드 * 수량(0) =, 명칭 규격 코드 * 수량(0) =, 명칭 규격 코드 * 수량(0) 단위 =, 코드번호 + ComOp /, * + ComQty Q, A, T, N + cmBx_IFORCE XML비호환 메세지 숨김, XML비호환시 보이기 + cBx_SBMOK 0 각 해당비목 적용, 1 재료비로 적용, 2 노무비로 적용, 3 경 비로 적용 +■ wM_Edit_XRate ST_EdiLWi.CPM «시간당 손료계수 수정» + cBx_Sel 계 입력, 각계수 입력 +■ wM_Edit_iLWi ST_EdiLWi.CPM «일위대가표 수정» + wcBx_RXX 초기값설정 개별적용, 기 본 노임산출계수, 기 타 노임산출계수, 기타-1노임산출계수, 기타-2노임산출계수, 기타-3노임산출계수, 기타-4노임산출계수 + cBx_SBMOK 0 각 해당비목 적용, 1 재료비로 적용, 2 노무비로 적용, 3 경 비로 적용 +■ wM_Edt_Hal ST_Jabpum.CPM «기준단가 수정» + wcBx_Up 절사, 반올림 +■ wM_Expnd ST_Boq.CPM «일위대가표 및 단가산출근거 풀어넣기» + wcBx_Pnt1_M 0 절사하여, 1 반올림 하여 + wcBx_Pnt2_M 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용 + wcBx_Pnt1_L 0 절사하여, 1 반올림 하여 + wcBx_Pnt2_L 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용 + wcBx_Pnt1_X 0 절사하여, 1 반올림 하여 + wcBx_Pnt2_X 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용 + wcBx_Pnt1_W 0 절사하여, 1 반올림 하여 + wcBx_Pnt2_W 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용 +■ wM_Expnd10 ST_Boq.CPM «일위대가표 풀기» + RGrpToT 입력안함, 소계(=), 계(==), 합계(===) + Add1_PRIN 재료비의, 노무비의, 경비의, 전체의 + Add1_PROUT 재료비로 계산, 노무비로 계산, 경비로 계산, 해당비목 계산 + Add2_PRIN 재료비의, 노무비의, 경비의, 전체의 + Add2_PROUT 재료비로 계산, 노무비로 계산, 경비로 계산, 해당비목 계산 +■ wM_GetAMT ST_KanJub.CPM «잡비 금액 불러오기» + rd_Filter 모두보기, 소 계(+=), 계(+==), 합 계(+===), 총 계(+====), 총합계(+=====) +■ wM_Host STmate8.Exe «서버의 IP주소를 입력하고 IP접속( 또는 Enter » + rgPrgTyp 일반, LAN, EDU, OnLine, 북측 +■ wM_JDCode STmate.Cpm «공사원가 호환규정코드 찾기 / 입력» + wCb_Base 명칭, 명칭/규격, 분류번호, 시설코드, 선택안함 + wCb_Srch 명칭/규격/단위, 호환규정코드, 군급목록번호, 중기품셈코드, 시설코드번호 + wCb_Other 기본, 자재, 경비, 중기, 실적/기타 + wCb_Method 분류별 조회, 코드..명칭 조회 +■ wM_JabPum ST_Jabpum.CPM «닫기 (&Q)» + cBoxCode 모든단가, 노무비, 재료비, 경비, 일위대가, 중기비, 단가산출, 견적단가, 대가,산근, 그림코드 + cBox_IFORM 명칭,규격 으로검색, 산근내용 으로검색 +■ wM_KanJub ST_KanJub.CPM «제잡비 계산» + Cmbx_PORD1_H 당초 / 변경 대비인쇄, 변 경 분 만 인 쇄 + cBx_K_JeolSa 간접비 절사없음, 간접비 10원미만 절사, 간접비 100원미만 절사, 간접비 1,000원미만 절사, 간접비 10,000원미 + cBx_Chasu 원설계, 1차변경, 2차변경, 3차변경 + cBx_W_Type 제잡비 원가계산방식, 제잡비 표준시장방식 + cBx_Jeol_T 총공사비에서 조정, 10원 미만, 100원 미만, 1,000원 미만, 10,000원 미만, 100, + Ed_C_AnJun_K_T 없음, 관급/사급 내용, 사급자재대 + Ed_C_AnJun_B_T , 의 1.2배 + Ed_C_KUNBO_T ㄴ.1)직노, 당해 상시근로자노무비 +■ wM_KanJub_K ST_KanJub.CPM «< 기성 제잡비 계산서 >» + rd_Filter 소 계(+=) 이상, 계(+==) 이상, 합 계(+===) 이상, 총 계(+====) 이상, 총합계(+=====) 이상 + cmBx_Buga (0) 직접입력, (1) 공급가액의 10%, (2) 재료비의 10%, (3) 재료비+산출경비의 10% + cmBx_JeolSa 총공사비에서 조정, 10원 미만, 100원 미만, 1,000원 미만, 10,000원 미만, 100, + cmBx_Tot_Jeol 이윤금액 직접입력, 10원 미만, 100원 미만, 1,000원 미만, 10,000원 미만, 100, +■ wM_Mk_Cont STmate.Cpm «당초설계 → 계약내역 변환등록» + cBx_Lev 소계 이상, 계 이상, 합계 이상, 총계 이상, 총합계 이상, 총대계 이상, 광역계 이상, 광역총계이상, 광역대계이상 +■ wM_Mrg_BSC STmate.Cpm «자료파일 업데이트» + cBx_Sel1 호환규정코드, 시설코드, 명칭/규격/단위, 호환+명+규+단, 명칭/단위, 설정안함 + cBx_Sel2 호환규정코드, 시설코드, 명칭/규격/단위, 호환+명+규+단, 명칭/단위, 설정안함 + cBx_Sel3 호환규정코드, 시설코드, 명칭/규격/단위, 호환+명+규+단, 명칭/단위, 설정안함 + cBx_Sel4 호환규정코드, 시설코드, 명칭/규격/단위, 호환+명+규+단, 명칭/단위, 설정안함 + cBx_Sel5 호환규정코드, 시설코드, 명칭/규격/단위, 호환+명+규+단, 명칭/단위, 설정안함 + rg_Name 업데이트 안함(복사처적용), 업데이트 (복사원적용) + rg_Amt 업데이트 안함(복사처적용), 업데이트 (복사원적용) + rg_JDCOD 업데이트 안함(복사처적용), 업데이트 (복사원적용), 복사처 우선적용 업데이트, 복사원 우선적용 업데이트 +■ wM_Rate ST_Boq.CPM «노무비» + rd_Qty1 내역서 전체, 선택된 항목만 + rd_Amt1 내역서 전체, 선택된 항목만 + rd_Amt2 내역서 전체, 선택된 항목만 + wcBx_Pnt1 0 절사하여, 1 반올림 하여 + wcBx_Pnt2 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용 + wcBx_Pnt1_M 0 절사하여, 1 반올림 하여 + wcBx_Pnt2_M 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용 + wcBx_Pnt1_L 0 절사하여, 1 반올림 하여 +■ wM_Req_ON STmate.Cpm «유지보수기간 연장신청» + wEd_Sub 12개월, 6개월, 3개월 +■ wM_Sel_Prn STmate.Cpm «인쇄할 영역을 선택하세요» + cb_PCLASS 당초설계, 변경설계, 분할설계 + cb_PRTYPE 해당코드 상위의 7레벨공종이하 내역전체, 해당코드 상위의 해당레벨(하위레벨제외) + cb_ACTTYP 노무비외 비목 적용안함, 노무비외 재료비로 적용, 노무비외 경비로 적용 + cb_ACTOPT 노무비 1원미만 버림, 소수 비교후 노무비 우선보정, 소수 비교후 타금액 우선보정 + cb_CHASU 1차변경, 2차변경, 3차변경, 4차변경, 5차변경, 6차변경, 7차변경, 8차변경 +■ wM_Set_Sys ST_Sys.CPM «초기값 입력및 수정» + cmBx_Sel_RX 계수 ;터널구간, 계수-1;장대터널, 계수-2;펌프준설선, 계수-3;GRAB준설선, 계수-4;버켓준설선 + cmBX_EXR 시간당중기사용료 단독적용, 중기, 대가, 산근, 내역 전체 + cmBx_KCD 0 자리, 1 자리, 2 자리 + cmBx_ACD 0 자리, 1 자리, 2 자리 + cmBx_ZCD 2 자리, 3 자리 + cmBx_JCD 0 자리, 1 자리, 2 자리 + cmBx_ECD 0 자리, 1 자리, 2 자리 + cmBx_BPN 0 자리, 1 자리, 2 자리 +■ wM_Stmate_Merge_Code ST_Merge_Code.CPM «설계예산시스템 코드병합» + rg_Set_Sys 선택코드만 병합, 선택코드+하위기초단가코드 병합, 모든코드(하위 산근,대가포함) 병합, 코드병합 취소 +■ wQtyList STmateQty8.CPM «수량산출서» + cBoxCode 모든단가, 노무비, 재료비, 경비, 일위대가, 중기비, 단가산출, 견적단가, 대가,산근 +■ wSrch_PL ST_PList.CPM «프로젝트 DATA검색(명칭, 규격)» + wcBx_Type 노무비, 재료비, 경비, 중기비, 일위대가, 단가산출, 일식/표준시장, 내역서 + +선택지를 가진 폼 40개, 선택축 272개 +### STmate 고유 폼 — 모듈별 + +■ STmate.Cpm 30개 + M_Chk_Pw PM_Req_AS frmAddTip frmEditor + frmTips wM_About wM_Box_H wM_Boxa + wM_Conv_A2W wM_DM_Com wM_D_Restore wM_Dm_1 + wM_Dm_2 wM_Down_Center wM_Get_Info wM_Get_Value + wM_JDCode wM_JajeXLS wM_Mk_Cont wM_Mrg_BSC + wM_Req_AS wM_Req_ON wM_Rw_On wM_Sel_Prn + wM_Show_Info wM_Status wM_Stmate_Start_8x wM_Xls_Comp + wM_iLWi_San wPrjList + +■ ST_P_Nae.CPM 22개 + PM_Boq_Not PM_Bqm PM_Jab PM_Jab_P + PM_Nae PM_NaeW PM_NaeW_P PM_Nae_B + PM_Nae_Col PM_Nae_Col_ML PM_Nae_Cont PM_Nae_K0 + PM_Nae_P PM_Nae_P_K0 PM_Nae_Plan_A PM_Nae_Plan_K + PM_Won_A PM_Won_A_C PM_Won_A_L PM_Wonga + PM_Wonga_C PM_Wonga_L + +■ ST_Boq.CPM 13개 + wBoq wBoqRate wExpnd wITNum + wKongJong wMBoq wM_Boq_ExecX wM_Expnd + wM_Expnd10 wM_From_XLS wM_Rate wM_Ref_Lst + wSameCode + +■ ST_P_ConEst.CPM 8개 + PM_JAB_K PM_NAE_C1 PM_NAE_C2 PM_NAE_C3 + PM_NAE_K1 PM_NAE_K2 PM_NAE_K3 PM_Nae_Est + +■ ST_PList.CPM 8개 + wM_Add_Prj wM_Conv_Mode wM_Get_Node wM_Get_Value + wM_ST_Restore wPList wST_Dir wSrch_PL + +■ ST_P_List.CPM 7개 + PM_Comp_M PM_Dan PM_Dan_L PM_SanMok + PM_SanMok_L PM_SanMok_P PM_iLMok + +■ ST_P_Excav.CPM 6개 + PM_NAE_Ex2 PM_NAE_Ex2T PM_Nae_Ex1 PM_Nae_Ex1T + PM_Nae_ExC PM_Nae_ExCT + +■ ST_P_Joong.CPM 6개 + PM_JOONG PM_JOONG2 PM_JOONG2_L PM_JOONG_L + PM_Joong_C PM_Joong_C_L + +■ ST_KanJub.CPM 5개 + PM_KAN_RATE wM_GetAMT wM_KAN_RATE wM_KanJub + wM_KanJub_K + +■ ST_Jabpum.CPM 4개 + wM_Edit_Strorage wM_Edt_Hal wM_Inst_CD wM_JabPum + +■ ST_P_Collect.CPM 4개 + PM_Col_Dan PM_Col_Dan_L PM_Col_X PM_Col_X_L + +■ ST_Prt.CPM 4개 + PM_Jab_Ord PM_Prn_Ord PM_Prt PM_Sel_St + +■ ST_Viewer.exe 4개 + wM_About wM_Extr wM_Main__Viewer wM_Sub + +■ DP_MinMsg.CPM 3개 + mMinMsg_ wInDlgImg wInDlgMemo + +■ ST_EdSan.CPM 3개 + wM_Edit_EQ wM_Edit_San wM_Edit_USER + +■ ST_Sys.CPM 3개 + wM_Set_Init wM_Set_JLab wM_Set_Sys + +■ ST_U_ChgCode.CPM 3개 + uM_ChgCode uM_Chg_Plus uM_ReplCode + +■ ST_U_ConBD.CPM 3개 + uM_ConBD uM_ConQTY uM_ConQTY9 + +■ ST_U_Convert.CPM 3개 + uM_BSC_M uM_ConstType uM_XML_Info + +■ ST_Merge_Code.CPM 3개 + wM_Stmate_Merge_Code wM_Sub wSrch_PL + +■ JDLCHK.Size.dll 2개 + frm_CheckProgress frm_JDLAnno + +■ ST_Com_V.CPM 2개 + wInDlgImg wInDlgMemo + +■ ST_EdiLWi.CPM 2개 + wM_Edit_XRate wM_Edit_iLWi + +■ ST_FindUse.CPM 2개 + wM_FindBoq wM_FindUse + +■ ST_P_iLWi.CPM 2개 + PM_iLWi PM_iLWi_S + +■ ST_P_San.CPM 2개 + PM_San_L PM_San_P + +■ ST_U_ADL.CPM 2개 + NMShow wM_ADL + +■ ST_Func_C.CPM 2개 + wInDlgImg wInDlgMemo + +■ ST_Wal.CPM 2개 + wM_Get_GJ wM_Stmate_Get_Wal + +■ JDLCHK.Tab.dll 1개 + frm_CheckProgress + +■ JDLCHK.Tab_33.dll 1개 + frm_CheckProgress + +■ ST_U_Archive.CPM 1개 + uM_Archive + +■ ST_U_ChgAmt.CPM 1개 + uM_Chg_Amt + +■ ST_U_DelCode.CPM 1개 + uM_DelCode + +■ ST_U_DelPrj.CPM 1개 + uM_DelPrj + +■ ST_U_Indx.CPM 1개 + uM_Indx + +■ ST_U_Merge.CPM 1개 + uM_Merge + +■ STmateQty8.CPM 1개 + wQtyList + +■ ST_U_APatch.CPM 1개 + wM_Stmate_APatch + +■ STmate8.Exe 1개 + wM_Host + +■ View_Old_San.CPM 1개 + M_Hrp_San + + +### 갈래별 (총 172개) + 모달 편집 66개 + 인쇄 63개 + 편집 창 19개 + 기타 17개 + 보조 창 7개 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/form_catalog.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/form_catalog.py new file mode 100644 index 00000000..387f20f7 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/form_catalog.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +"""STmate 고유 폼 목록을 모듈·갈래별로 정리.""" +import sys, io, pathlib, re, collections +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +ROOT = pathlib.Path(r"C:\경영정보(주)\System") +THIRD = re.compile(r"^(Dclhrp60|designide60|RTL60|VCL60|DBRTL60|BDERTL60|RealGrid|Apollo|dsnide)", re.I) +HRLIB = {"HReportUf","HRPageRf","HRPreVUf","HRSaveUf","LoginDialog","PasswordDialog","HRGridCUf", + "HRGridFUf","HRGroupUf","HRLinkFf","HRPrintUf","HRExprUf","HRFieldUf","HRSortUf"} +def forms(b): + out=[] + for m in re.finditer(rb"TPF0", b): + s=m.end() + if s>=len(b): continue + n=b[s] + if not (3<=n<=40): continue + cls=b[s+1:s+1+n] + if not re.fullmatch(rb"T[A-Za-z0-9_]+", cls): continue + s2=s+1+n + if s2>=len(b): continue + n2=b[s2] + if not (1<=n2<=40): continue + nm=b[s2+1:s2+1+n2] + if not re.fullmatch(rb"[A-Za-z_][A-Za-z0-9_]*", nm): continue + out.append(nm.decode("latin1")) + return out + +per={} +for p in sorted(ROOT.rglob("*")): + if not p.is_file() or THIRD.match(p.stem): continue + try: b=p.read_bytes() + except Exception: continue + if b[:2]!=b"MZ": continue + f=[x for x in forms(b) if x not in HRLIB] + if f: per[p.name]=sorted(set(f)) + +def kind(n): + if n.startswith("PM_"): return "인쇄" + if n.startswith(("wM_","M_")): return "모달 편집" + if n.startswith("w"): return "편집 창" + if n.startswith("frm"): return "보조 창" + return "기타" +cnt=collections.Counter(); tot=0 +print("### STmate 고유 폼 — 모듈별") +for nm,f in sorted(per.items(), key=lambda x:-len(x[1])): + if not f: continue + tot+=len(f) + for x in f: cnt[kind(x)]+=1 + print("\n■ %-24s %2d개" % (nm, len(f))) + for i in range(0,len(f),4): + print(" " + " ".join("%-22s"%x for x in f[i:i+4])) +print("\n\n### 갈래별 (총 %d개)"%tot) +for k,v in cnt.most_common(): print(" %-10s %3d개" % (k,v)) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/form_extract.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/form_extract.py new file mode 100644 index 00000000..468149af --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/form_extract.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +"""PE 안의 이름 붙은 Delphi 폼(TPF0)을 뽑아 .dfm 으로 저장. 원본은 읽기만.""" +import sys, io, re, pathlib +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +ROOT = pathlib.Path(r"C:\경영정보(주)\System") +OUT = pathlib.Path(r"C:\Users\umsan\AppData\Local\Temp\claude\D--aislo-wt-sub\df75230a-b05b-4088-ad34-bb0c9da0a312\scratchpad\forms") +OUT.mkdir(exist_ok=True) + +want = sys.argv[1:] or ["wM_Edt_Hal","wM_JabPum","wM_Edit_San","wM_Set_Init","wM_Set_Sys","wBoq","wBoqRate"] +found = {} +for p in sorted(ROOT.rglob("*")): + if not p.is_file(): continue + try: b=p.read_bytes() + except Exception: continue + if b[:2]!=b"MZ": continue + for m in re.finditer(rb"TPF0", b): + s=m.end() + if s>=len(b): continue + n=b[s] + if not (3<=n<=40): continue + cls=b[s+1:s+1+n] + if not re.fullmatch(rb"T[A-Za-z0-9_]+", cls): continue + s2=s+1+n; n2=b[s2] if s20 else min(len(b), m.start()+400000) + blob = b[m.start():end] + f = OUT/("%s.dfm"%nms) + f.write_bytes(blob) + found[nms]=(p.name, len(blob)) +for k in want: + if k in found: print(" ✅ %-16s %-22s %7d B" % (k, found[k][0], found[k][1])) + else: print(" ✗ %-16s 못 찾음" % k) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/ui_form_sweep.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/ui_form_sweep.py new file mode 100644 index 00000000..eab2428d --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/ui_form_sweep.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +"""STmate 고유 폼 전수 — 캡션·선택지를 뽑아 UI 카탈로그를 만든다. 원본은 읽기만.""" +import sys, io, re, pathlib, importlib.util, collections +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +spec=importlib.util.spec_from_file_location("pd", r"D:\aislo-wt\sub\resources\knowledge\original\경쟁사 프로그램\STmate 분석\40_스크립트\parse_dfm.py") +pd=importlib.util.module_from_spec(spec); spec.loader.exec_module(pd) +ROOT=pathlib.Path(r"C:\경영정보(주)\System") +THIRD=re.compile(r"^(Dclhrp60|designide60|RTL60|VCL60|DBRTL60|BDERTL60|RealGrid|Apollo|dsnide|JDLCHK)",re.I) +HRLIB={"HReportUf","HRPageRf","HRPreVUf","HRSaveUf","LoginDialog","PasswordDialog"} + +def blobs(b): + out=[]; pos=[m.start() for m in re.finditer(rb"TPF0", b)] + for i,s in enumerate(pos): + e = pos[i+1] if i+1=len(b): continue + n=b[p] + if not (3<=n<=40): continue + cls=b[p+1:p+1+n] + if not re.fullmatch(rb"T[A-Za-z0-9_]+", cls): continue + p2=p+1+n; n2=b[p2] if p2127 for c in cap): out["cap"].append(cap.strip()) + if isinstance(items,list) and items: out["items"].append((n.get("name",""), [str(x) for x in items])) + for c in n.get("children",[]) or []: walk(c,out) + +cat={} +for p in sorted(ROOT.rglob("*")): + if not p.is_file() or THIRD.match(p.stem): continue + try: b=p.read_bytes() + except Exception: continue + if b[:2]!=b"MZ": continue + for nm, blob in blobs(b): + if nm in HRLIB or nm in cat: continue + try: + r=pd.Reader(blob); r.take(4); root=r.component(root=True) + except Exception: continue + o={"cap":[],"items":[]}; walk(root,o) + if o["cap"] or o["items"]: cat[nm]=(p.name,o) + +print("### 파싱 성공한 STmate 고유 폼 %d개\n" % len(cat)) +tot_i=0 +for nm,(mod,o) in sorted(cat.items()): + if not o["items"]: continue + tot_i+=len(o["items"]) + title=o["cap"][0] if o["cap"] else "" + print("■ %-20s %-20s %s" % (nm[:20], mod[:20], ("«%s»"%title[:30]) if title else "")) + for cn, its in o["items"][:8]: + print(" %-18s %s" % (cn[:18], ", ".join(its)[:88])) +print("\n선택지를 가진 폼 %d개, 선택축 %d개" % (sum(1 for _,(_,o) in cat.items() if o["items"]), tot_i)) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index 2669cd6f..2473be42 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -47,6 +47,7 @@ | 19 | **진행률 장부** — 어디까지 봤고 무엇이 남았나 | | 20 | **설정파일과 보고서 카탈로그** — 간접비 코드 사전, 서식 75종 | | 21 | **정정과 트랙 통합** — `SMT` 정정, 지식DB 세 트랙, 암호화의 성격 | +| 22 | **UI 폼 분석** — 선택축 272개, 화면에 남아 있던 계산 규칙 | ## 확정된 굵직한 것 From 6bcc872851f0052f8908dedc9866092e7518ddd9 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 14:13:10 +0900 Subject: [PATCH 18/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20=EC=84=B8=20=ED=8F=B4=EB=8D=94=20=EC=83=81=ED=98=B8=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=C2=B7=20COSTN.SMT=20=EC=A0=84=EC=88=98=20=ED=8C=8C?= =?UTF-8?q?=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 세 폴더 머리에 서로를 가리키는 블록을 넣음 — 또 갈라지지 않게. technical_info/01_임도/05_원가정보/원가계산_체계.md, original/원가계산/STmate/_meta.md, original/경쟁사 프로그램/STmate 분석/README.md 셋 다. 2026-09-13 에 ③이 ①②를 모르고 시작해 중복 분석한 사실도 함께 적음. COSTN.SMT 전수 파싱 — ②트랙이 해독해 둔 문법을 그대로 씀 - 맛보기 1건 + 실무 STC 7건에서 자원참조 1,570·품 1,460·Q식 187· 중간라벨 162·할증률 92 검출 - 참조되는 자원은 중기(X) 1,504 로 압도적. 노무 58·재료 7·경비 1. 단가산출은 거의 전부 중기 시간당 사용료를 작업량으로 나누는 계산임 - 중기 한 대를 참조하면 노무·재료·경비 세 성분을 각각 따로 끌어옴 (L 548·S 524·M 498). 총액 하나로 저장하면 안 되는 이유 - ⚠ Q 식이 한 꼴이 아님. 최소 10가지. 3600 계열(초)과 60 계열(분), 포설은 60*L*D*H*E*f/(N*Cm). 하드코딩 금지, 텍스트 평가 경로 필요 - 운반 계산이 적재시간+왕복시간+적하시간 으로 사이클을 쌓음. km/hr·km·m/min 인자가 함께 나옴. 임도 토공 운반에 직접 쓸모 - 할증률 92건이 품목마다 제각각 (2%·3%·5%·24%·52%·0.443%). BDQTY 입력 원장은 여전히 막혔으나 적용값은 읽힘 문서 23 신규, 파싱 스크립트 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 5 + .../20_분석/23_COSTN_SMT_전수파싱.md | 117 ++++++++++++++++++ .../40_스크립트/smt_expansion_parse.py | 62 ++++++++++ .../경쟁사 프로그램/STmate 분석/README.md | 14 +++ .../original/원가계산/STmate/_meta.md | 13 ++ .../01_임도/05_원가정보/원가계산_체계.md | 13 ++ 6 files changed, 224 insertions(+) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/23_COSTN_SMT_전수파싱.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_expansion_parse.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 5cbb149c..9a23889c 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -29,6 +29,7 @@ | 20 설정파일과 보고서 카탈로그 | **`Start8x.Ini`·`SET_REP`** — 간접비 코드 사전 301~370, 서식 75종 | (저장소 파일) | | 21 정정과 트랙 통합 | **⛔ `SMT` 판정 정정 · 지식DB 트랙 셋 통합 · `PRJLST.SMT` 설정 원장 · 암호화의 성격** | (저장소 파일) | | 22 UI 폼 분석 | **폼 233개 중 3개만 봤던 것** — 선택축 272개, `ACTTYP`·자리수 키·일괄변경 규칙 | (저장소 파일) | +| 23 `COSTN.SMT` 전수파싱 | **단가산출 원장** — 참조 1,570·품 1,460·Q식 187개(10꼴)·운반 사이클 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -86,6 +87,10 @@ | `ACTTYP`·`ACTOPT` | 뜻 모름 | **A** — 표준시장 적용 방식·끝전 보정 우선순위 | 22번 §3.3 | | `KCDNM` 등 6키 | 미확정 | **A** — 소수 자리수 설정 | 22번 §3.4 | | 변경 차수 | 최대 3차로 봄 | ⚠ **화면은 8차** — 저장 구조 재확인 필요 | 22번 §3.3 | +| `COSTN.SMT` 내용 | 「평문」까지만 | **전수 파싱** — 중기 참조 1,504건, 성분 셋을 각각 | 23번 | +| `Q` 식 | 한 꼴로 알았음 | ⚠ **최소 10가지 꼴** — 하드코딩 금지 | 23번 §3 | +| 운반 사이클 | 안 봤음 | **적재+왕복+적하** 구조·인자 확인 | 23번 §4 | +| 할증률 | `BDQTY` 암호화로 막힘 | ◐ **적용값 92건은 읽힘** | 23번 §5 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/23_COSTN_SMT_전수파싱.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/23_COSTN_SMT_전수파싱.md new file mode 100644 index 00000000..7f257889 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/23_COSTN_SMT_전수파싱.md @@ -0,0 +1,117 @@ +# `COSTN.SMT` 전수 파싱 — 단가산출 원장 + +파싱일: 2026-09-13 +문법 출처: **`original/원가계산/STmate/SIxMemo_구조.md`** (②트랙, 2026-08-15) — 그쪽이 해독해 둔 문법을 그대로 씀. +대상: 맛보기 1건 + 실무 STC 7건의 `COSTN.SMT` +재현 스크립트: `40_스크립트/smt_expansion_parse.py` + +## 1. 무엇이 들어 있나 + +`COSTN.SMT`는 **단가 하나하나의 산출 전개 텍스트**다. `BDQTY.DBF`가 암호화돼 막힌 자리를 **이 파일이 평문으로 대신 채운다.** + +```text +'1. 포설(그레이다 3.6 m)' + L=2.9'm', H=0.2'm', D=50 , f=1.0 + E=0.50 , N=4'회' + Cm=0.06*(50/4+50/4.0)+2*0.5= + Q=60*L*D*H*E*f/(N*Cm)='㎥/Hr' + '노무비' &X00006L& / Q = + '재료비' &X00006M& / Q = + '경 비' &X00006S& / Q = +``` + +## 2. 전수 집계 + +| 요소 | 검출 | +|---|---:| +| **자원 참조** `&코드&` | **1,570** | +| **품** (수량 + 단위) | **1,460** | +| **`Q` 식** | **187** | +| **중간 라벨** `:=A01` | **162** | +| **할증률** `n'%'` | **92** | + +### 참조되는 자원 종류 — 중기가 압도적 + +| 앞글자 | 뜻 | 건수 | +|---|---|---:| +| **`X`** | **중기** | **1,504** | +| `L` | 노무 | 58 | +| `M` | 재료 | 7 | +| `S` | 경비 | 1 | + +⇒ 단가산출(`D`코드)은 거의 전부 **중기 시간당 사용료를 작업량으로 나누는 계산**이다. 17번 §3(중기 호표)과 18번 §2.2(Q식)가 이 구조의 양 끝이다. + +### 가져오는 성분 — 세 성분을 고루 + +| 끝글자 | 뜻 | 건수 | +|---|---|---:| +| `L` | 노무비 성분 | 548 | +| `S` | 경비 성분 | 524 | +| `M` | 재료비 성분 | 498 | + +⇒ **중기 한 대를 참조하면 노무·재료·경비 세 성분을 각각 따로 끌어온다.** `&X00006L&` / `&X00006M&` / `&X00006S&`가 한 벌로 나온다. 07번 §1의 「총액 하나로만 저장하면 간접비 산정기초가 달라진다」가 여기서 확인된다. + +## 3. `Q` 식은 한 꼴이 아니다 — 187개, 최소 10가지 꼴 + +18번 §2.2는 `Q = 3600·q·K·f·E/Cm` 한 꼴만 봤다. **실제로는 작업 종류마다 다르다.** + +| 꼴 | 횟수 | 쓰임 | +|---|---:|---| +| `3600*q*K*f*E/Cm` | 56 | 굴삭 계열 (버킷) | +| `3600*q*k*E*f/Cm` | 26 | 같은 식, 인자 순서·대소문자만 다름 | +| `60*q1*F*E/Cm` | 16 | 분 단위 계열 | +| `60*P*f*E/Cm` | 12 | 출력(P) 기반 | +| `60*q1*f*E/Cm` | 10 | | +| `3600*q*K*f*E1/Cm1` | 4 | 인자에 번호가 붙은 변형 | +| `3600*q*K*f*E/Cms` | 4 | | +| `60*q*F*E/Cm` · `60*q*f*E1/Cm` | 각 4 | | +| `60*L*D*H*E*f/(N*Cm)` | — | 포설 계열 (길이·폭·두께) | + +⇒ **재구현은 `Q` 식을 하드코딩하면 안 된다.** 텍스트에 적힌 식을 그대로 평가하는 경로가 필요하다 — 18번 §2.1의 「좌→우 순차 평가」와 같은 요구다. + +`3600`(초→시간)과 `60`(분→시간) 두 계열이고, `Cm`(사이클 시간)의 단위가 각각 초·분이다. + +## 4. 단위 분포 — 운반 계산 인자가 드러난다 + +| 단위 | 횟수 | | 단위 | 횟수 | +|---|---:|---|---|---:| +| 분 | 216 | | `m/min` | 44 | +| 인 | 115 | | `(적재시간)` | 35 | +| `km/hr` | 85 | | `(왕복시간)` | 35 | +| `km` | 69 | | `hr` | 34 | +| `(적하시간)` | 64 | | `sec(135)` | 31 | +| `m` | 56 | | `Km` | 29 | + +⇒ **운반(덤프·도자) 계산이 `적재시간 + 왕복시간 + 적하시간`으로 사이클을 쌓는다.** `km/hr`(주행속도)·`km`(운반거리)가 함께 나오므로 `Cm = 적재 + 거리/속도 왕복 + 적하 + 대기` 꼴이다. 임도 설계에서 토공 운반이 큰 몫이라 Aislo에 직접 쓸모가 있다. + +`sec(135)`처럼 **괄호 안에 조건(선회각 등)이 붙는다** — 18번 §2.2의 `Cm = 15 sec (90°)`와 같은 표기다. + +## 5. 할증률 — 92건, 값이 다양 + +| 값 | 횟수 | | 값 | 횟수 | +|---|---:|---|---|---:| +| 2% | 33 | | 24% | 3 | +| 3% | 22 | | 8% | 3 | +| 5% | 9 | | 52% | 3 | +| 1% | 6 | | 11% | 2 | +| 9% | 6 | | 0.443% | 2 | + +⇒ **할증은 품목·작업마다 제각각**이며 일괄 적용값이 아니다. `52%`·`24%` 같은 큰 값은 잡재료·공구손료 계열로 보인다(07번 §4의 「금액 가산」). `0.443%` 같은 값은 개별 산정 결과다. + +⚠ `BDQTY`의 `X_HAL` 실값은 여전히 못 보지만, **적용된 할증률 자체는 이 텍스트에 남는다.** + +## 6. 이번 파싱이 바꾸는 것 + +| 항목 | 이전 | 지금 | +|---|---|---| +| `COSTN.SMT` | 21번에서 「평문」까지만 | ✅ **전수 파싱** — 참조 1,570·품 1,460·Q식 187 | +| 단가산출 참조 구조 | Q식 한 꼴만 봄 | ✅ **중기 참조 1,504건, 세 성분 각각** | +| `Q` 식 | 한 꼴로 알았음 | ⚠ **최소 10가지 꼴** — 하드코딩 금지 | +| 운반 사이클 | 안 봤음 | ✅ **적재+왕복+적하** 구조와 인자 | +| 할증률 | `BDQTY` 암호화로 막힘 | ◐ **적용값 92건은 읽힘** (입력 원장은 여전히 막힘) | + +## 7. 남은 것 + +1. 호표 단위로 갈라 **`D`코드 ↔ 전개 텍스트 ↔ 참조 중기 호표**를 잇기 — 지금은 요소별 집계까지만 +2. `Cm` 식 전수 수집 — 운반 사이클 공식을 꼴별로 정리 +3. ②트랙의 미해명 **10바이트 메모 인덱스** — 이것이 풀리면 `COSTN.DBF` 행과 메모를 정확히 이을 수 있음 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_expansion_parse.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_expansion_parse.py new file mode 100644 index 00000000..8279d1c0 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_expansion_parse.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +"""COSTN.SMT 전개 텍스트 전수 파싱 — 자원 참조·품·할증·중간라벨·Q식. +문법 출처: original/원가계산/STmate/SIxMemo_구조.md (2026-08-15).""" +import sys, io, re, pathlib, zipfile, collections, json +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") + +SRC = [pathlib.Path(r"C:\경영정보(주)\STmate 자료\설계자료\실습(맛보기)\COSTN.SMT")] +for p in sorted(pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서").rglob("*.STC")): + SRC.append(p) + +RE_REF = re.compile(r"&([A-Z])(\d{5})([A-Z])&") # &M00034M& 종류·번호·성분 +RE_LABEL = re.compile(r":=\s*([A-Z]\d{2})") # :=A01 +RE_QTY = re.compile(r"([\d.]+)\s*'([^']{1,8})'") # 0.31'Kg' +RE_PCT = re.compile(r"([\d.]+)\s*'%'") # 5'%' +RE_Q = re.compile(r"\bQ\s*=\s*([^=\n']{3,60})") # Q = 3600*q*K*f*E/Cm + +def body(b): + out=[] + for m in re.finditer(rb"[\x20-\x7e\xa1-\xfe]{3,}", b[0x200:]): + try: out.append(m.group().decode("cp949")) + except Exception: pass + return out + +tot=collections.Counter(); refs=collections.Counter(); comp=collections.Counter() +qforms=collections.Counter(); pcts=collections.Counter(); units=collections.Counter() +files=0; lines=0 +for s in SRC: + try: + if s.suffix.upper()==".STC": + z=zipfile.ZipFile(s) + nm=next((n for n in z.namelist() if n.upper()=="COSTN.SMT"), None) + if not nm: continue + b=z.read(nm) + else: b=s.read_bytes() + except Exception: continue + if b[8:15]!=b"SIxMemo": continue + files+=1 + for ln in body(b): + lines+=1 + for k,n,c in RE_REF.findall(ln): + refs[k]+=1; comp[c]+=1; tot["참조"]+=1 + for l in RE_LABEL.findall(ln): tot["중간라벨"]+=1 + for v,u in RE_QTY.findall(ln): + if u!="%": units[u]+=1; tot["품(수량+단위)"]+=1 + for v in RE_PCT.findall(ln): pcts[v]+=1; tot["할증%"]+=1 + for q in RE_Q.findall(ln): + qq=re.sub(r"\s+","",q) + if len(qq)>4 and any(ch in qq for ch in "*/"): qforms[qq[:44]]+=1; tot["Q식"]+=1 + +print("### COSTN.SMT 전수 파싱 — 파일 %d개, 본문 줄 %d개" % (files, lines)) +print("\n요소별 검출") +for k,v in tot.most_common(): print(" %-14s %5d" % (k,v)) +print("\n자원 참조 종류 (앞글자)") +for k,v in refs.most_common(): print(" %s %5d" % (k,v)) +print("\n가져오는 성분 (끝글자)") +for k,v in comp.most_common(): print(" %s %5d" % (k,v)) +print("\n할증률 값 분포 (상위 12)") +for k,v in pcts.most_common(12): print(" %-8s %4d회" % (k+"%", v)) +print("\n단위 분포 (상위 12)") +for k,v in units.most_common(12): print(" %-8s %4d회" % (k,v)) +print("\nQ식 꼴 (상위 10)") +for k,v in qforms.most_common(10): print(" %-46s %3d회" % (k,v)) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index 2473be42..8ca6af67 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -1,5 +1,18 @@ # STmate 분석 +> ## 🔗 STmate 지식은 **세 폴더**에 나뉘어 있음 — 갈라지지 않게 서로를 가리킴 +> +> | 트랙 | 자리 | 담당 | +> |---|---|---| +> | ① **계산 로직** | `technical_info/01_임도/05_원가정보/` | 밑수·단수처리·제비율·기계경비·노임·자재 적용. **Aislo 구현의 정본** | +> | ② **STC 포맷** | `original/원가계산/STmate/` | 컨테이너·필드사전·난독화·SIxMemo·INITIAL. import/export 명세 | +> | ③ **프로그램 분석** | `original/경쟁사 프로그램/STmate 분석/` | 실행모듈·UI 폼·계산사슬·골든셋 회귀 | +> +> ⚠ **새 STmate 작업을 시작하기 전에 세 폴더를 모두 볼 것.** 2026-09-13 에 ③이 ①②를 모르고 시작해 +> 단수처리 규칙·`INITIAL` 시트·`SMT` 문법·`BDQTY` 난독화를 다시 분석한 일이 있음 (③의 `21_정정과_트랙통합.md`). + + + 경쟁사 설계예산 프로그램 **STmate**(경영정보(주)) 를 정적으로 뜯어본 기록. 원본은 저장소 밖 `C:\경영정보(주)` — **원본은 손대지 않음**, 여기에만 정리물을 둠. 옆 폴더 `../오솔길 분석/` 과 같은 얼개. @@ -48,6 +61,7 @@ | 20 | **설정파일과 보고서 카탈로그** — 간접비 코드 사전, 서식 75종 | | 21 | **정정과 트랙 통합** — `SMT` 정정, 지식DB 세 트랙, 암호화의 성격 | | 22 | **UI 폼 분석** — 선택축 272개, 화면에 남아 있던 계산 규칙 | +| 23 | **`COSTN.SMT` 전수파싱** — 단가산출 원장, Q식 10꼴, 운반 사이클 | ## 확정된 굵직한 것 diff --git a/resources/knowledge/original/원가계산/STmate/_meta.md b/resources/knowledge/original/원가계산/STmate/_meta.md index 8eea58eb..0f59b081 100644 --- a/resources/knowledge/original/원가계산/STmate/_meta.md +++ b/resources/knowledge/original/원가계산/STmate/_meta.md @@ -6,6 +6,19 @@ status: draft 목적: STC(STmate 프로젝트 파일) import/export 구현을 위한 컨테이너·DBF 명세·검증 근거 축적 --- +> ## 🔗 STmate 지식은 **세 폴더**에 나뉘어 있음 — 갈라지지 않게 서로를 가리킴 +> +> | 트랙 | 자리 | 담당 | +> |---|---|---| +> | ① **계산 로직** | `technical_info/01_임도/05_원가정보/` | 밑수·단수처리·제비율·기계경비·노임·자재 적용. **Aislo 구현의 정본** | +> | ② **STC 포맷** | `original/원가계산/STmate/` | 컨테이너·필드사전·난독화·SIxMemo·INITIAL. import/export 명세 | +> | ③ **프로그램 분석** | `original/경쟁사 프로그램/STmate 분석/` | 실행모듈·UI 폼·계산사슬·골든셋 회귀 | +> +> ⚠ **새 STmate 작업을 시작하기 전에 세 폴더를 모두 볼 것.** 2026-09-13 에 ③이 ①②를 모르고 시작해 +> 단수처리 규칙·`INITIAL` 시트·`SMT` 문법·`BDQTY` 난독화를 다시 분석한 일이 있음 (③의 `21_정정과_트랙통합.md`). + + + > **왜 이 폴더인가**: STC는 설계자가 발주처에 제출하는 **최종 산출물**이며, Aislo도 STC **불러오기(import)·내보내기(export)가 필수 요구사항**이다(사용자 확정 2026-08-15). 따라서 STC 포맷 해석은 연구성 작업이 아니라 **납품 호환성 확보를 위한 구현 선행 명세**다. > 계산 로직(밑수·절사·채택 규칙)은 `technical_info/01_임도/05_원가정보/`가 담당하고, 이 폴더는 **포맷 구조·필드 사전·검증 근거**만 담는다. 두 트랙은 분리한다. > 실무 관측 진입점 = [original/실무문서/_STC포맷분석.md](../../실무문서/_STC포맷분석.md) (이 폴더로 명세 이관, 그 문서는 요약·링크로 유지). diff --git a/resources/knowledge/technical_info/01_임도/05_원가정보/원가계산_체계.md b/resources/knowledge/technical_info/01_임도/05_원가정보/원가계산_체계.md index 2ddc86aa..82193c90 100644 --- a/resources/knowledge/technical_info/01_임도/05_원가정보/원가계산_체계.md +++ b/resources/knowledge/technical_info/01_임도/05_원가정보/원가계산_체계.md @@ -9,6 +9,19 @@ status: draft last_updated: 2026-08-14 --- +> ## 🔗 STmate 지식은 **세 폴더**에 나뉘어 있음 — 갈라지지 않게 서로를 가리킴 +> +> | 트랙 | 자리 | 담당 | +> |---|---|---| +> | ① **계산 로직** | `technical_info/01_임도/05_원가정보/` | 밑수·단수처리·제비율·기계경비·노임·자재 적용. **Aislo 구현의 정본** | +> | ② **STC 포맷** | `original/원가계산/STmate/` | 컨테이너·필드사전·난독화·SIxMemo·INITIAL. import/export 명세 | +> | ③ **프로그램 분석** | `original/경쟁사 프로그램/STmate 분석/` | 실행모듈·UI 폼·계산사슬·골든셋 회귀 | +> +> ⚠ **새 STmate 작업을 시작하기 전에 세 폴더를 모두 볼 것.** 2026-09-13 에 ③이 ①②를 모르고 시작해 +> 단수처리 규칙·`INITIAL` 시트·`SMT` 문법·`BDQTY` 난독화를 다시 분석한 일이 있음 (③의 `21_정정과_트랙통합.md`). + + + 관련 문서: [제비율](제비율.md) · [설계·감리대가](설계·감리대가.md) · [원가_기초데이터_원천](원가_기초데이터_원천.md) · [노임단가_적용](노임단가_적용.md) · [자재단가_적용](자재단가_적용.md) · [기계경비_산정](기계경비_산정.md) · [수량산출_일반](../04_수량분석정보/수량산출_일반.md) · [품셈_적용기준](../04_수량분석정보/품셈_적용기준.md) ## 1. 공사원가 구성 트리 From 50113cb6f5c2b7313ac53e47197195453cae7888 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 14:18:37 +0900 Subject: [PATCH 19/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20=EB=AA=A8=EB=93=88=2046=EA=B0=9C=20export=20=EC=A0=84?= =?UTF-8?q?=EC=88=98=20=E2=80=94=20=EA=B3=84=EC=82=B0=20=EA=B3=B5=EC=9A=A9?= =?UTF-8?q?=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=9F=AC=EB=A6=AC=C2=B7=EB=8F=99?= =?UTF-8?q?=EA=B8=80=C2=B78=EC=B0=A8=20=ED=95=B4=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 11번은 핵심 CPM 12개만 다뤘고 32개 모듈이 손대지 않은 채였음. 플러그인 규약 - 46개 중 31개 모듈이 Calc_Kanjub 를 내보냄. 재계산 진입점이 한 곳이 아니라 모듈마다 있음. T8(UI 명령별 재계산 범위)이 어려운 까닭 DP_Common.CPM 73함수 = 계산 공용 라이브러리 - 식 평가 CALC_STR·CALC_STR_PART·CALC_STR_URC·GET_URC_TYP - 중간변수 GET_VARI_VAL·SET_VARI_VAL (:=A01 라벨) - 반올림 MROUNDUD·MROUNDUP·MTRUNC·MINT·MFRAC·GET_ROUND_CUT - 조건 IIF·IFI·IFO·CHK_TRUE_CLSTR — 식에 조건 분기가 들어감 - AMTTOHAN 금액 한글 변환 - ⇒ 식 평가기는 사칙연산+ROUND 만으로 부족. 조건 함수와 중간변수 필요 ST_P_XLS.CPM 72함수 — 엑셀이 양방향 교환 경로 - CONV_XLS_2_ST(엑셀→STmate 역등록)·XLS_2_BDREC(엑셀→BDQTY)·Prn_FMLA_INFO - 암호화된 BDQTY 를 엑셀에서 만들 수 있다는 뜻 SX32W.CPM 29함수 = Rainbow Sentinel SuperPro 동글 API - 라이선스가 소프트키가 아니라 USB 동글. 통제시험이 영구 불가인 근거 확정 ST_Jabpum: Edt_Hal_Amt / Edt_Hal_Rate — 할증이 금액·율 두 갈래 변경 차수 8차 의문 해소 - PRJLST.SMT 섹션 최대 2, DBF 접미사 1~4, 바이너리에 1~3차변경만, BOQ2* 없음. 한 파일은 4벌이 맞고 8차는 분리형 파일 선택임 문서 24 신규, export 원자료와 스크립트 2개 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 9 +- .../STmate 분석/20_분석/24_모듈구조_전수.md | 121 ++++++++++++++++++ .../STmate 분석/30_원자료/module_exports.txt | 61 +++++++++ .../40_스크립트/module_export_sweep.py | 56 ++++++++ .../40_스크립트/revision_slot_check.py | 49 +++++++ .../경쟁사 프로그램/STmate 분석/README.md | 1 + 6 files changed, 296 insertions(+), 1 deletion(-) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/24_모듈구조_전수.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/module_exports.txt create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/module_export_sweep.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/revision_slot_check.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 9a23889c..b3241e71 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -30,6 +30,7 @@ | 21 정정과 트랙 통합 | **⛔ `SMT` 판정 정정 · 지식DB 트랙 셋 통합 · `PRJLST.SMT` 설정 원장 · 암호화의 성격** | (저장소 파일) | | 22 UI 폼 분석 | **폼 233개 중 3개만 봤던 것** — 선택축 272개, `ACTTYP`·자리수 키·일괄변경 규칙 | (저장소 파일) | | 23 `COSTN.SMT` 전수파싱 | **단가산출 원장** — 참조 1,570·품 1,460·Q식 187개(10꼴)·운반 사이클 | (저장소 파일) | +| 24 모듈구조 전수 | **46개 모듈 export** — `DP_Common` 73함수, 플러그인 규약, 동글, 8차 해소 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -90,7 +91,13 @@ | `COSTN.SMT` 내용 | 「평문」까지만 | **전수 파싱** — 중기 참조 1,504건, 성분 셋을 각각 | 23번 | | `Q` 식 | 한 꼴로 알았음 | ⚠ **최소 10가지 꼴** — 하드코딩 금지 | 23번 §3 | | 운반 사이클 | 안 봤음 | **적재+왕복+적하** 구조·인자 확인 | 23번 §4 | -| 할증률 | `BDQTY` 암호화로 막힘 | ◐ **적용값 92건은 읽힘** | 23번 §5 | +| 할증률 | `BDQTY` 암호화로 막힘 | ◐ **적용값 92건은 읽힘**. 편집은 **금액·율 두 갈래** | 23번 §5, 24번 §5 | +| 모듈 분석 | 핵심 12개 | **46개 전수 export** | 24번 | +| 식 평가기 함수 | `CALC_STR` 만 | **A** — `DP_Common` 73함수. 조건 `IIF`·중간변수·`MFRAC` 포함 | 24번 §2 | +| 재계산 진입점 | 한 곳으로 봄 | ⚠ **31개 모듈이 `Calc_Kanjub` 보유** | 24번 §1 | +| 라이선스 | 「없음」 | **Rainbow Sentinel SuperPro 하드웨어 동글** | 24번 §4 | +| 엑셀 | 단방향 출력 | **양방향** — `CONV_XLS_2_ST`·`XLS_2_BDREC` | 24번 §3 | +| 변경 차수 8차 | ⚠ 미해결 | ✅ **해소** — 한 파일 4벌, 8차는 분리형 파일 선택 | 24번 §7 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/24_모듈구조_전수.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/24_모듈구조_전수.md new file mode 100644 index 00000000..b3d783bb --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/24_모듈구조_전수.md @@ -0,0 +1,121 @@ +# 모듈 구조 전수 — 46개 모듈의 export 와 플러그인 규약 + +점검일: 2026-09-13 +계기: 11번은 **핵심 CPM 12개**만 다뤘다. 나머지 **32개 모듈**이 손대지 않은 채였다. +재현 스크립트: `40_스크립트/module_export_sweep.py` + +## 1. 플러그인 규약 — `Calc_Kanjub` + +**46개 모듈 중 31개가 `Calc_Kanjub` 를 내보낸다.** 편집·인쇄·변환 무엇이든 **제비율 재계산을 스스로 부를 수 있는 공통 진입점**이다. + +```text +Calc_Kanjub 31개 모듈이 공유 +``` + +⇒ 「어느 화면에서 무엇을 고쳐도 제비율이 다시 돌 수 있다」는 뜻이다. 13번 **T8(UI 명령별 재계산 범위)**이 왜 어려운지가 여기서 보인다 — 재계산 진입점이 한 곳이 아니라 **모듈마다** 있다. + +## 2. ⭐ `DP_Common.CPM` — 계산 공용 라이브러리 73함수 + +11번 §4.1은 `CALC_STR`만 언급했다. **실제 함수 집합 전체**는 이렇다. + +### 2.1 식 평가 + +```text +CALC_STR 식 문자열 평가 +CALC_STR_PART 부분 평가 +CALC_STR_URC URC(자원참조) 포함 평가 ← &M00034M& 계열을 푸는 자리 +GET_URC_TYP 참조 종류 판정 +GET_VARI_VAL 변수 읽기 SET_VARI_VAL 변수 쓰기 ← :=A01 중간라벨 +``` + +### 2.2 반올림·수치 — 11번 §4.2의 원 함수가 전부 여기 있다 + +```text +MROUNDUD 반올림 계열 MROUNDUP 올림 MTRUNC 절사 +MINT 정수화 MFRAC 소수부 +GET_ROUND_CUT 설정에 따라 위를 고르는 디스패처 +MSTRTODBL · MSTRTOINT · ISNUM · ISINT · CH_FNTOVAL · FLOATTOSTR_ · EXTTOSTR +``` + +⇒ **`MFRAC`(소수부)가 새로 나왔다.** 18번 §2.2의 「`Q`를 소수 2자리로 먼저 확정」·17번 §2의 「성분 소계 절사」처럼 **소수부를 따로 다루는 자리**가 실제로 함수로 있다. + +### 2.3 조건·논리 + +```text +IIF IFI IFO CHK_TRUE_CLSTR COUNT_LOGICAL +``` + +⇒ 식 문자열에 **조건 분기**가 들어간다. 11번 §4.1의 「선택 토큰(`[+LAB]`·`[+ANJ_B]`)을 옵션에 따라 포함/제거」가 이 함수들로 처리된다. + +### 2.4 문자열·기타 + +`ADDBJVAL` · `ADDBSL` · `ADDSPSTR` · `CHANGE_STR` · `COPY_LEFT/RIGHT` · `LEFT_STR` · `RIGHT_STR` · `SEP_STR` · `REPLICA_STR` · `COUNT_STR` · `MPOS` · `NPOS` · `BPOS` · `DIS_FMT` · **`AMTTOHAN`**(금액 한글 변환 — 「금 일억삼천사백이십만원정」) · 파일 조작 20여 개. + +**재구현 지침** — 식 평가기는 `+ - * /` 와 `ROUND` 계열만으로 부족하다. **`IIF`·`IFI`·`IFO` 조건 함수와 `GET_VARI_VAL`/`SET_VARI_VAL` 중간변수**까지 갖춰야 한다. + +## 3. `ST_P_XLS.CPM` — XLSX 입출력 72함수 + +| 함수 | 뜻 | +|---|---| +| `MAKE_XLS` · `SHOW_XLS` · `FREE_XLS` | 엑셀 생성·표시·해제 | +| **`CONV_XLS_2_ST`** | **엑셀 → STmate 역등록** | +| **`XLS_2_BDREC`** | 엑셀 → `BDQTY` 레코드 | +| **`Prn_FMLA_INFO`** | **수식 정보 출력** — 출력 XLSX에 수식이 남는 까닭 | +| `MK_BSCBOQ_EXL` · `MK_EXL_BSCBOQ` | 기준 BOQ 양방향 | +| `Prn_*_EXL` 약 55개 | `SET_REP` 서식마다 엑셀판 | + +⇒ **엑셀이 단순 출력이 아니라 양방향 교환 경로**다. `〓 INITIAL 〓` 시트(18번 §2.3)가 재등록 메타인 까닭이 `CONV_XLS_2_ST`에 있다. + +⚠ **`XLS_2_BDREC`** — 암호화된 `BDQTY`를 **엑셀에서 만들 수 있다.** 뒤집으면 `BDQTY` 내용이 엑셀 수량산출 양식과 대응한다는 뜻이다. + +## 4. `SX32W.CPM` — 라이선스는 하드웨어 동글 + +```text +RNBOsproInitialize · RNBOsproFindFirstUnit · RNBOsproQuery · RNBOsproRead +RNBOsproGetKeyInfo · RNBOsproGetSubLicense · RNBOsproSetDeveloperCode +RNBOsproCheckTerminalService · RNBOsproSetHeartBeat · RNBOsproReleaseLicense …29개 +``` + +**Rainbow(현 Thales) Sentinel SuperPro** API다. `ST_BdSN.CPM`의 `Chk_BD_SN`·`Chk_REG_SN`(시리얼 검사)이 함께 있다. + +⇒ **라이선스가 소프트 키가 아니라 USB 동글**이다. 13번의 통제시험 T1~T11이 왜 「영구 불가」인지가 확정됐다 — 동글이 없으면 실행 자체가 안 된다. + +## 5. 그 밖에 드러난 모듈 + +| 모듈 | export | 뜻 | +|---|---:|---| +| `ST_U_Archive.CPM` | 16 | **STC 압축·해제** — `Chk_STC_Ver`(버전) · `ComP_Data` · `UnPack`/`UnPack1`/`UnPack_No` | +| `ST_P_Excav.CPM` | 15 | **굴착 전용 내역 양식** — `Prn_Nae_Ex1_*` · `Ex2_*` 계열. 도로공사 양식 | +| `ST_P_Nae.CPM` | 30 | 내역·원가 인쇄 본진 | +| `ST_P_List.CPM` | 11 | 목록표 계열 | +| **`ST_Jabpum.CPM`** | 6 | **`Edt_Hal_Amt` vs `Edt_Hal_Rate`** — 할증을 **금액과 율 두 갈래**로 편집. 07번 §4의 「수량 할증 ≠ 금액 가산」이 export 이름에 그대로 | +| `ST_U_ADL.CPM` | 6 | 온라인 갱신 — `ST_Down_File` · `ST_UP_INFO_R` · `ST_SND_Mail` | +| `ST_Com_V.CPM` | 10 | `GET_*_R` 계열 — 모듈 간 자원 조회 규약 | +| `ST_Func_C.CPM` | 7 | `SUM_TOT` · `CON_TOT` · `ZERO_TOT` · `PCN_TO_T` · `OPTIMIZ` — **계층 합산** | +| `CPMARC`/`CPMUNA` | 4+4 | ZIP 압축·해제 (Info-ZIP) | +| `STmexe.Cpm` | 2 | `Chk_Exe` · `Chk_New_Exe` — 자기 갱신 | + +## 6. 이번 점검이 바꾸는 것 + +| 항목 | 이전 | 지금 | +|---|---|---| +| 모듈 분석 범위 | 핵심 12개 | **46개 전수 export** | +| 식 평가기 함수 집합 | `CALC_STR`만 알았음 | ✅ **73함수** — 조건(`IIF`)·중간변수·`MFRAC`까지 | +| 재계산 진입점 | 한 곳으로 봄 | ⚠ **31개 모듈이 `Calc_Kanjub` 보유** — T8이 어려운 까닭 | +| 라이선스 | 「없음」까지만 | ✅ **Rainbow Sentinel SuperPro 하드웨어 동글** | +| 엑셀 | 단방향 출력으로 봄 | ✅ **양방향** — `CONV_XLS_2_ST` · `XLS_2_BDREC` | +| 할증 | 한 갈래로 봄 | ✅ **금액·율 두 갈래** (`Edt_Hal_Amt`/`Edt_Hal_Rate`) | +| 변경 차수 8차 의문 | 미해결 | ✅ **해소** — 아래 | + +## 7. 변경 차수 8차 의문 해소 + +22번 §3.3에서 「화면은 8차인데 `COSTN` 접미사는 4벌」이라 남겨 둔 것을 확인했다. + +| 근거 | 결과 | +|---|---| +| `PRJLST.SMT` 차수 섹션 | 표본 7건 모두 **최대 `[1_KANJUB]`·`[2_KANJUB]`** | +| DBF 접미사 | `PRJLST`·`BOQ11`·`COSTN` 모두 **1~4 네 벌** | +| 바이너리 문자열 | **`1차변경`~`3차변경`만** 존재. 4~8차 없음 | +| `BOQ1*` / `BOQ2*` | `BOQ1` 15개 모듈, **`BOQ2`는 0개** | + +⇒ **한 파일이 담는 것은 4벌(원설계 + 3차변경)이 맞다.** 화면의 1~8차는 **분리형으로 파일을 이어 갔을 때 그 파일들을 고르는 인쇄 선택**이다(16번 §4.6의 차수 인계). 저장 구조 의문은 없다. diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/module_exports.txt b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/module_exports.txt new file mode 100644 index 00000000..b2c8ab8b --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/module_exports.txt @@ -0,0 +1,61 @@ +### CPM/EXE export 전수 — 모듈 44개, export 408개(중복포함) + 11번이 다룬 핵심 12개 말고 **32개 모듈**이 남아 있었음 + + CPMARC.CPM 4개 GetZipDllPrivVersion, GetZipDllVersion, ZipDllExec, ___CPPdebugHook + CPMUNA.CPM 4개 GetUnzDllPrivVersion, GetUnzDllVersion, UnzDllExec, ___CPPdebugHook + DP_Common.CPM 73개 ADDBJVAL, ADDBSL, ADDSPSTR, AMTTOHAN, BPOS, CALC_STR, CALC_STR_PART, CALC_STR_URC, CHANGE_STR, C + DP_MinMsg.CPM 3개 GETNEWCODE_NAME, GETSPCHAR, MINIMSG + ST_BdSN.CPM 3개 Chk_BD_SN, Chk_BD_USE, Chk_REG_SN +✅ ST_Boq.CPM 4개 Add_From_MRG, Calc_Kanjub, Edit_Boq, Edit_Bqm + ST_Com_V.CPM 10개 GET_CAL_R, GET_COM_R, GET_IMS_R, GET_MRG_R, GET_PBL_R, GET_PRN_R, GET_SFC_R, GET_STM_R, GET_SYS_ + ST_EdSan.CPM 3개 Calc_Kanjub, Edit_EQ_SYNC, Edit_SanKun +✅ ST_EdiLWi.CPM 2개 Calc_Kanjub, Edit_iLW + ST_FindUse.CPM 3개 Calc_Kanjub, Find_BDQ, Find_BOQ + ST_Func_C.CPM 7개 CON_TOT, OPTIMIZ, PCN_TO_T, SUM_TOT, VALTOPOS, ZERO_TO, ZERO_TOT + ST_Jabpum.CPM 6개 Calc_Kanjub, Edit_Dan, Edit_Strg, Edt_Hal_Amt, Edt_Hal_Rate, View_JabPum +✅ ST_KanJub.CPM 5개 Calc_Kanjub, Edit_KanJub, Edit_KanJub_K, Edit_Kan_Rate, Prn_Kan_Rate + ST_Merge_Code.CPM 1개 Calc_Kanjub + ST_PList.CPM 3개 Calc_Kanjub, Call_MRG, Call_PLIST +✅ ST_P_Collect.CPM 5개 Calc_Kanjub, Prn_Col_Dan, Prn_Col_Dan_L, Prn_Col_X, Prn_Col_X_L +✅ ST_P_ConEst.CPM 9개 Calc_Kanjub, Prn_Jab_K, Prn_Nae_C1, Prn_Nae_C2, Prn_Nae_C3, Prn_Nae_Est, Prn_Nae_K1, Prn_Nae_K2, + ST_P_Excav.CPM 15개 Calc_Kanjub, Prn_Nae_Ex1_0, Prn_Nae_Ex1_1, Prn_Nae_Ex1_2, Prn_Nae_Ex1_C1, Prn_Nae_Ex1_C2, Prn_Na +✅ ST_P_Joong.CPM 7개 Calc_Kanjub, Prn_Joong, Prn_Joong2, Prn_Joong2_L, Prn_Joong_C, Prn_Joong_C_L, Prn_Joong_L + ST_P_List.CPM 11개 Calc_Kanjub, Prn_AList, Prn_Comp_M, Prn_Comp_M1, Prn_Comp_M1_L, Prn_Dan, Prn_Dan_L, Prn_SanMok, + ST_P_Nae.CPM 30개 Calc_Kanjub, Prn_Boq_Not, Prn_Bqm, Prn_Jab, Prn_Jab_P, Prn_Nae, Prn_NaeW, Prn_NaeW_P, Prn_Nae_B, + ST_P_San.CPM 3개 Calc_Kanjub, Prn_San_L, Prn_San_P + ST_P_XLS.CPM 72개 CONV_XLS_2_ST, Calc_Kanjub, Chk_Xls_File, FIND_PRT_INDX, FREE_XLS, MAKE_XLS, MK_BSCBOQ_EXL, MK_E + ST_P_iLWi.CPM 3개 Calc_Kanjub, Prn_iLWi, Prn_iLWi_S + ST_Prt.CPM 4개 Calc_Kanjub, GS_Prn_Rec, Prn_Prt, Rep_Print +✅ ST_SanCal.CPM 2개 Calc_Kanjub, Calq_San + ST_Sys.CPM 2개 Calc_Kanjub, Set_Sys_1 + ST_U_ADL.CPM 6개 Get_Real_Time, ST_Down_File, ST_NEW_INFO, ST_SND_Mail, ST_UP_DNINFO, ST_UP_INFO_R + ST_U_Archive.CPM 16개 Calc_Kanjub, Chk_ArcName, Chk_Data, Chk_STC_Ver, Chk_STDir, ComP_CurBOQ, ComP_Data, ComP_FOLD, C +✅ ST_U_ChgAmt.CPM 2개 CHANGE_AMT, Calc_Kanjub +✅ ST_U_ChgCode.CPM 10개 Calc_Kanjub, Chg_Code_All, Chg_Code_Plus, Chg_Code_Sel, Chk_Chg_Code_1, Chk_True_Rep_Code, Exec_ +✅ ST_U_ConBD.CPM 4개 CONBD_USD_QTY, CON_QTY, CON_QTY9, Calc_Kanjub +✅ ST_U_Convert.CPM 20개 Appn_Tag_REP, CHK_K_FLD, Calc_Kanjub, Conv_BOQ, Conv_Equip, Conv_Jodal_ST8, Conv_ST8_Jodal, Conv + ST_U_DelCode.CPM 6개 Calc_Kanjub, Chk_True_Del_1, Del_Code_A_T, Del_Code_A_X, Del_Code_Sel, Exec_Delete_Code + ST_U_DelPrj.CPM 3개 Calc_Kanjub, Delete_Prj, Merge_Prj + ST_U_Indx.CPM 2개 Calc_Kanjub, INDX_ALL + ST_U_Merge.CPM 2개 Calc_Kanjub, ST_MERGE + ST_VSetup.EXE 2개 _MainWndProc@16, _StubFileWrite@12 + STmate.Cpm 1개 Calc_Kanjub +✅ STmateQty8.CPM 4개 Calc_Kanjub, FIND_QCODE, Free_Qty, ST_QTY + STmexe.Cpm 2개 Chk_Exe, Chk_New_Exe + SX32W.CPM 29개 RNBOsproActivate, RNBOsproCheckTerminalService, RNBOsproCleanup, RNBOsproDecrement, RNBOsproEnum + UNWISE.EXE 4개 _ItemDlg@16, _MainWndProc@16, _PromptDlg@16, _SharedDlg@16 + View_Old_San.CPM 1개 Show_Old_San + +### 여러 모듈이 공유하는 export (플러그인 공통 규약) + Calc_Kanjub 31개 모듈 + ___CPPdebugHook 2개 모듈 + Prn_Boq_Not 2개 모듈 + Prn_Nae_ColL 2개 모듈 + Prn_Nae_ColM 2개 모듈 + Prn_Nae_ColX 2개 모듈 + Prn_Nae_Cont1 2개 모듈 + Prn_Nae_Cont2 2개 모듈 + _MainWndProc@16 2개 모듈 + GetZipDllPrivVersion 1개 모듈 + GetZipDllVersion 1개 모듈 + ZipDllExec 1개 모듈 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/module_export_sweep.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/module_export_sweep.py new file mode 100644 index 00000000..2ecb2190 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/module_export_sweep.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +"""CPM 46개 모듈의 export 함수 전수 — 11번은 핵심 12개만 했음.""" +import sys, io, pathlib, struct, collections, re +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +ROOT = pathlib.Path(r"C:\경영정보(주)\System") + +def exports(b): + try: + e=struct.unpack_from(" Date: Sun, 13 Sep 2026 14:21:03 +0900 Subject: [PATCH 20/20] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=ED=82=A4=20241=EC=A2=85=C2=B7=EA=B0=84?= =?UTF-8?q?=EC=A0=91=EB=B9=84=20=EC=8B=9D=2026=EA=B0=9C=20=EC=A0=84?= =?UTF-8?q?=EC=88=98=20=E2=80=94=20=EC=84=A4=EC=A0=95=20=EC=82=AC=EC=8A=AC?= =?UTF-8?q?=20=EB=8B=AB=ED=9E=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PRJLST.SMT 저장키 전수 - 241종. 접두어가 뜻을 가름 — C_(금액직접입력 62)·R_(요율 39)·I_(선택 41)· B_(켬끔 12)·D_(밑수 26)·S_(산출액 30)·ADD_(추가금액 22) - ⭐ D_ 와 S_ 가 같은 항목 이름으로 짝을 이룸. 항목마다 「어떤 밑수에 곱했고 얼마가 나왔는지」를 프로젝트에 남김. 09번의 indirect_result 계약과 맞음 - 추가금액 저장 구조 ADD_AMT_단계_행_칸 (11번이 화면 문자열로만 본 것) - 고용개선지원비가 휴업수당·장려금·사회보험·지원금 네 갈래 - 수공 밑수 배분 계수 R_R_DM·DL·L·DMDL·DML 이 rGrd_RateB 열 이름과 일치 간접비 식 템플릿 26개 전수 - 밑수별 기본 꼴 여섯 (총액·노무·재료·노무+토큰·총액-재료·세 성분 합) - ⚠ 식 안에 IF(...) 조건 분기가 있음. DP_Common 의 IIF·IFI·IFO 가 처리. 사칙연산과 ROUND 만으로는 재현 불가 - ROUNDDOWN([C_KUNBO]*[RAT_1]) — 장기요양은 건강보험료 「직접입력 금액」에 요율을 곱함. 19번의 「당초액 유지」와 이어짐 - 복합 보험식·변경설계 A/B·사급자재 /1.1 전부 포함 설정 사슬이 닫힘 — 화면 272축 → 저장키 241종 → 식 26개 → 함수 73개 → D_/S_ 재저장 → 출력. 다섯 칸이 모두 이어짐. 문서 25 신규, 키 원자료와 스크립트 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 6 + .../20_분석/25_설정키_전수와_식템플릿.md | 149 ++++++++++++++++++ .../STmate 분석/30_원자료/prjlst_smt_keys.txt | 95 +++++++++++ .../40_스크립트/settings_key_map.py | 42 +++++ .../경쟁사 프로그램/STmate 분석/README.md | 1 + 5 files changed, 293 insertions(+) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/25_설정키_전수와_식템플릿.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/prjlst_smt_keys.txt create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/settings_key_map.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index b3241e71..537aa721 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -31,6 +31,7 @@ | 22 UI 폼 분석 | **폼 233개 중 3개만 봤던 것** — 선택축 272개, `ACTTYP`·자리수 키·일괄변경 규칙 | (저장소 파일) | | 23 `COSTN.SMT` 전수파싱 | **단가산출 원장** — 참조 1,570·품 1,460·Q식 187개(10꼴)·운반 사이클 | (저장소 파일) | | 24 모듈구조 전수 | **46개 모듈 export** — `DP_Common` 73함수, 플러그인 규약, 동글, 8차 해소 | (저장소 파일) | +| 25 설정키 전수와 식템플릿 | **설정 사슬 닫기** — `PRJLST.SMT` 키 241종, 간접비 식 26개 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -98,6 +99,11 @@ | 라이선스 | 「없음」 | **Rainbow Sentinel SuperPro 하드웨어 동글** | 24번 §4 | | 엑셀 | 단방향 출력 | **양방향** — `CONV_XLS_2_ST`·`XLS_2_BDREC` | 24번 §3 | | 변경 차수 8차 | ⚠ 미해결 | ✅ **해소** — 한 파일 4벌, 8차는 분리형 파일 선택 | 24번 §7 | +| 프로젝트 저장키 | 일부만 | **241종 전수** — `C_`금액 62·`R_`요율 39·`I_`선택 41·`D_`밑수·`S_`결과 | 25번 §1 | +| 밑수 저장 | 안 남는 줄 알았음 | **`D_`(밑수)·`S_`(결과) 짝으로 저장** | 25번 §1.1 | +| 추가금액 | 화면 문자열만 | **저장 구조** `ADD_AMT_단계_행_칸` | 25번 §1.3 | +| 간접비 식 템플릿 | 일부 | **26개 전수** | 25번 §2 | +| 식에 조건 분기 | 몰랐음 | ⚠ **`IF(...)` 존재** — 평가기 필수 요건 | 25번 §2.2 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/25_설정키_전수와_식템플릿.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/25_설정키_전수와_식템플릿.md new file mode 100644 index 00000000..44bebec7 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/25_설정키_전수와_식템플릿.md @@ -0,0 +1,149 @@ +# 설정키 전수와 간접비 식 템플릿 — 설정 사슬 닫기 + +점검일: 2026-09-13 +재현 스크립트: `40_스크립트/settings_key_map.py` · 원자료 `30_원자료/prjlst_smt_keys.txt` + +## 1. `PRJLST.SMT` 저장키 **241종** + +21번 §3에서 일부만 봤던 것을 전수로 세었다. 접두어가 뜻을 가른다. + +| 접두 | 뜻 | 개수 | +|---|---|---:| +| `C_` | **금액 직접입력** | 62 | +| `R_` | **요율** | 39 | +| `I_` | **선택 인덱스** | 41 | +| `B_` | 켬/끔 | 12 | +| `D_` | **밑수** | 26 | +| `S_` | **산출액** | 30 | +| `ADD_*` | **추가금액** | 22 | +| 그 밖 | `JAB_TYPE` · `CAL_ACTL` · `VIS_TOTL` · `Y_KONGSU` | 9 | + +### 1.1 ⭐ `D_` 와 `S_` 가 짝을 이룬다 — 밑수와 결과를 함께 저장 + +```text +D_KANNO / S_KANNO 간접노무비 D_SANBO / S_SANBO 산재보험료 +D_KUNBO / S_KUNBO 건강보험료 D_YUNBO / S_YUNBO 연금보험료 +D_ANJUN / S_ANJUN 안전관리비 D_T_KITA / S_T_KITA 기타경비 +D_HWAN / S_HWAN 환경보전비 D_ILBAN / S_ILBAN 일반관리비 +D_HADOSU / S_HADOSU 하도급보증 D_EQIPSU / S_EQIPSU 건설기계보증 +D_S_SUDO / S_S_SUDO … 수공 세부경비 8종도 같은 짝 +``` + +⇒ **항목마다 「어떤 밑수에 곱했고 얼마가 나왔는지」를 프로젝트에 남긴다.** 09번 §2의 `indirect_result(base_amount, rate, raw_amount, rounded_amount)` 계약이 실제 저장 구조와 맞는다. + +`S_DAMT_L` · `S_DAMT_M` · `S_DAMT_S` · `S_KAMT_M` 은 직접비 성분 합계다. + +### 1.2 고용개선지원비가 4종으로 나뉜다 + +```text +C_EIS_HOLLAB C_EIS_HOLPAY C_EIS_INCENT C_EIS_SOCINS C_EIS_SUPPAY +R_EIS_HOLIR1 R_EIS_HOLIR2 R_EIS_INCENT R_EIS_SOCIR2 +D_EIS_* / S_EIS_* +``` + +12번 §3.2가 「일반형식에 별도 묶음이 있다」고만 적은 **고용개선지원비**가 실제로 **휴업수당·장려금·사회보험·지원금 네 갈래**다. + +### 1.3 ⭐ 추가금액 저장 구조 + +```text +ADD_CNT_1 ~ ADD_CNT_4 단계별 행 수 +ADD_NAME_2_01 · ADD_UNIT_2_01 · ADD_BIGO_2_01 이름·단위·비고 +ADD_AMT_2_01_1 ~ ADD_AMT_2_01_5 금액 (단계별 5칸) +ADD_AMT_3_01_1 ~ ADD_AMT_3_01_5 +ADD_BUGA_2_01 부가세 포함 여부 +``` + +`_2_`·`_3_` = **삽입 단계**, `_01` = 행 번호, `_1~5` = **단계별 포함 칸**. 11번 §9가 화면 문자열로 본 「단계 3~6 삽입」이 저장 구조로 확인된다. + +### 1.4 형식 전용 키 + +```text +실적형식만 I_MTYP · I_LTYP · I_MXA · I_MXK · R_R_DM · R_R_DL · R_R_L · R_R_DMDL · R_R_DML +수공형식만 C_S_* / R_S_* / D_S_* / S_S_* (수도광열·복리후생·소모품·통신·세금·폐기물·도서·지급수수료) +``` + +`R_R_DM`·`R_R_DL`·`R_R_L`·`R_R_DMDL`·`R_R_DML` — **`rGrd_RateB`의 열 이름(`재`·`직노`·`노`·`재+직노`·`재+노`) 그대로**다(02번 §RATE_B). 수공형식 밑수 배분 계수가 여기 저장된다. + +## 2. 간접비 식 템플릿 — 바이너리 전수 **26개** + +11번 §6이 일부만 보여 준 것을 모두 뽑았다. **대괄호는 런타임 치환 변수**다. + +### 2.1 밑수가 다른 기본 꼴 + +```text +ROUNDDOWN( [T_AMT] * [RAT_1] ) 총액 기반 +ROUNDDOWN( [LAMT] * [RAT_1] ) 노무 기반 +ROUNDDOWN( [M_AMT] * [RAT_1] ) 재료 기반 +ROUNDDOWN( ([L_AMT][+LAB]) * [RAT_1] ) 노무 + 선택토큰 +ROUNDDOWN( ([T_AMT]-[M_AMT]) * [RAT_1] ) 총액 − 재료 ← 이윤 +ROUNDDOWN( ([M_AMT]+[L_AMT]+[S_AMT]) * … ) 세 성분 합 +``` + +`[+LAB]`는 **옵션에 따라 켜고 끄는 항**이다 — `DP_Common`의 `CHK_TRUE_CLSTR`가 판정한다(24번 §2.3). + +### 2.2 ⭐ 조건 분기가 식 안에 있다 + +```text +IF( ([LAMT]+[M_AMT]) … ) +IF( ([L_AMT]+[M_AMT]) … ) +``` + +⇒ **식 평가기에 `IF`가 필요하다.** 24번 §2.3의 `IIF`·`IFI`·`IFO` 함수가 이것을 처리한다. 사칙연산과 `ROUND` 계열만으로는 재현이 안 된다. + +### 2.3 앞 결과를 밑수로 쓰는 꼴 + +```text +ROUNDDOWN( [C_KUNBO] * [RAT_1] ) +``` + +**건강보험료의 「직접입력 금액」(`C_KUNBO`)에 요율을 곱한다** — 노인장기요양보험료다. 16번 §3에서 `장기요양 = 건강보험료 × 12.95%`로 실증한 것의 식 원문이며, **밑수가 요율 계산 결과가 아니라 `C_` 직접입력 칸**이라는 점이 19번 §6의 「당초액 유지」와 이어진다. + +### 2.4 복합 보험식 — 세 항을 각각 절사 후 다시 절사 + +```text +ROUNDDOWN( ROUNDDOWN([LAMT]*[RAT_1]*[RAT_2]/100*1.4, 0) + + ROUNDDOWN([LAMT]*[RAT_KY]*[RAT_3]/100, 0) + + ROUNDDOWN([LAMT]*[RAT_1]*[RAT_2]/100*[RAT_4]/100, 0), 자리 ) +``` + +### 2.5 변경설계 두 꼴 + +```text +[C_AMT_B] + ROUNDDOWN( [C_AMT_B] * (([C_TAMT_C]-[C_TAMT_B])/[C_TAMT_B]) ) 방법 A +[C_AMT_B] + ROUNDDOWN( ([C_TAMT_C]-[C_TAMT_B]) * [RAT_1] ) 방법 B +``` + +### 2.6 사급자재 VAT 제외 + +```text ++ [C_SAGUP_C] / 1.1 +``` + +`cmBx_Kwan_Sa`의 `사급자재대/1.1` 선택(12번 §10.1)이 식으로 들어간다. + +## 3. 설정 사슬이 닫혔다 + +```text +화면 선택축 272개 (22번) + ↓ 고르면 +PRJLST.SMT 저장키 241종 (이 문서 §1) + ↓ C_/R_/I_/B_ 값이 +간접비 식 템플릿 26개 (§2)의 [RAT_n]·[C_*] 자리에 치환 + ↓ DP_Common 73함수로 평가 (24번 §2) + ↓ 항목마다 D_(밑수)·S_(결과) 로 되돌아 저장 +공사원가계산서 출력 (16번에서 원 단위 재현 완료) +``` + +**입력(화면) → 저장(SMT) → 식(템플릿) → 평가기(함수) → 결과(출력)** 다섯 칸이 모두 이어졌다. + +## 4. 이번 점검이 바꾸는 것 + +| 항목 | 이전 | 지금 | +|---|---|---| +| 프로젝트 저장키 | 일부만 봄 | ✅ **241종 전수**, 접두어 6갈래 | +| 밑수 저장 | 안 남는 줄 알았음 | ✅ **`D_`(밑수)·`S_`(결과) 짝으로 저장** | +| 추가금액 | 화면 문자열로만 | ✅ **저장 구조** `ADD_AMT_단계_행_칸` | +| 고용개선지원비 | 「별도 묶음」 | ✅ **4갈래** (휴업수당·장려금·사회보험·지원금) | +| 수공 밑수 배분 | `RATE_B` 표만 | ✅ **`R_R_DM`·`DL`·`L`·`DMDL`·`DML`** 저장키 | +| 간접비 식 | 일부 | ✅ **26개 전수** | +| 식에 조건 분기 | 몰랐음 | ⚠ **`IF(...)` 존재** — 평가기 필수 요건 | diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/prjlst_smt_keys.txt b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/prjlst_smt_keys.txt new file mode 100644 index 00000000..cb1e5a22 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/prjlst_smt_keys.txt @@ -0,0 +1,95 @@ +### PRJLST.SMT 저장키 241종 (접두 차수 제거) + +■ C_ 금액 직접입력 62개 + C_ANJUN C_ANJUN1_G C_ANJUN2_G C_ANJUNP C_ANJUN_B + C_ANJUN_G C_BUGA_M C_BUSAN C_BUSAN_B C_DOSEOH + C_EIS_HOLLAB C_EIS_HOLPAY C_EIS_INCENT C_EIS_SOCINS C_EIS_SUPPAY + C_EQIPSU C_EXCEPT_B C_HADOSU C_HWAN C_ILBAN + C_IYUN_M C_KANNO C_KAN_M C_KN_SA C_KOBO + C_KONGSA C_KONGSA_J C_KONGSU C_KONGSU_A C_KONGSU_MA + C_KUNBO C_KWANGUP C_KWANGUP_D C_KWANGUP_K C_NBUGAM + C_PSAMT_B C_PUMJIL_B C_PURCHAS C_SAGUP C_SANBO + C_SANGSI C_SLVBO C_S_ANJUN_B C_S_BOKRI C_S_DOSEO + C_S_JIGUP C_S_PEGI C_S_PUMJIL C_S_SEGUM C_S_SIGONG + C_S_SOMO C_S_SUDO C_S_TONGSIN C_TBUGUM C_T_ANJUN_N + C_T_JODAL C_T_KITA C_T_KOLJAE C_T_K_MAT C_T_PEGI + C_UPDNKWN C_YUNBO + +■ R_ 요율 39개 + R_ANJUN R_ANJUN1 R_ANJUN2 R_ANJUNP R_DOSEOH + R_EIS_HOLIR1 R_EIS_HOLIR2 R_EIS_INCENT R_EIS_SOCIR2 R_EQIPSU + R_HADOSU R_HWAN R_ILBAN R_IYUN R_KANNO + R_KOBO R_KONGSA R_KONGSU R_KUNBO R_R_DL + R_R_DM R_R_DMDL R_R_DML R_R_L R_SANBO + R_SLVBO R_S_BOKRI R_S_DOSEO R_S_JIGUP R_S_PEGI + R_S_SEGUM R_S_SIGONG R_S_SIGONG_1 R_S_SOMO R_S_SUDO + R_S_TONGSIN R_TBUGUM R_T_KITA R_YUNBO + +■ I_ 선택 인덱스 41개 + I_ANJUNAUTO I_ANJUN_B I_ANJUN_K I_ANJUN_TYPE I_ANPUM + I_AN_DN_TYPE I_BF_CH_BO I_BID_TYPE I_BUGA I_COST_BO + I_DOGUP I_DOG_JEOL I_EQIP I_HWAN I_ILBAN + I_IYUN I_JEOLSA I_KAN_JEOLSA I_KN_SA_TYPE I_KOBO_TYPE + I_KONG_KIKAN I_KONG_TYPE I_KOSU_TYPE I_KUNBO I_KUN_TYPE + I_KWN_COMB I_KWN_JEOLSA I_KWN_K_JEOLSA I_KWN_K_UPDN I_KWN_UPDN + I_LTYP I_MTYP I_MXA I_MXK I_NAG_RATE + I_POS_SA I_SET_BASE I_TBUGUM I_TOT_ADD I_TOT_JEOL + I_YUNBO + +■ B_ 켬/끔 12개 + B_ANJUN_B B_BUGA_UP B_BUSAN_B B_CHANGE B_EXCEPT_B + B_KONGSA B_KWANGUP_D B_KWANGUP_K B_NBUGAM B_PSAMT_B + B_PUMJIL_B B_T_JODAL + +■ Y_ 연도·기타 1개 + Y_KONGSU + +■ 기타_ 섹션·기타 86개 + ADD_AMT_2_01_1 ADD_AMT_2_01_2 ADD_AMT_2_01_3 ADD_AMT_2_01_4 ADD_AMT_2_01_5 + ADD_AMT_3_01_1 ADD_AMT_3_01_2 ADD_AMT_3_01_3 ADD_AMT_3_01_4 ADD_AMT_3_01_5 + ADD_BIGO_2_01 ADD_BIGO_3_01 ADD_BUGA_2_01 ADD_CNT_1 ADD_CNT_2 + ADD_CNT_3 ADD_CNT_4 ADD_NAME_2_01 ADD_NAME_3_01 ADD_UNIT_2_01 + ADD_UNIT_3_01 CAL_ACTL D_ANJUN D_ANJUNP D_EIS_HOLLAB + D_EIS_INCENT D_EIS_SOCINS D_EIS_SUPPAY D_EQIPSU D_HADOSU + D_HWAN D_ILBAN D_KANNO D_KOBO D_KONGSA + D_KONGSU D_KUNBO D_SANBO D_SLVBO D_S_BOKRI + D_S_DOSEO D_S_JIGUP D_S_PEGI D_S_SEGUM D_S_SIGONG + D_S_SOMO D_S_SUDO D_S_TONGSIN D_TBUGUM D_T_KITA + D_YUNBO JAB_TYPE S_ANJUN S_ANJUNP S_DAMT_L + S_DAMT_M S_DAMT_S S_EIS_HOLLAB S_EIS_INCENT S_EIS_SOCINS + S_EIS_SUPPAY S_EQIPSU S_HADOSU S_HWAN S_ILBAN + S_KAMT_M S_KANNO S_KOBO S_KONGSA S_KONGSU + S_KUNBO S_SANBO S_SLVBO S_S_BOKRI S_S_DOSEO + S_S_JIGUP S_S_PEGI S_S_SEGUM S_S_SIGONG S_S_SOMO + S_S_SUDO S_S_TONGSIN S_TBUGUM S_T_KITA S_YUNBO + VIS_TOTL + + +### 간접비 식 템플릿 — 바이너리에서 전수 + 서로 다른 템플릿 26개 (상위 30) + ROUNDDOWN( [T_AMT] * [RAT_1] 62 + ROUNDDOWN( [LAMT] * [RAT_1] 31 + ROUNDDOWN( ([L_AMT][+LAB]) * [RAT_1] 31 + [C_AMT_B]+ROUNDDOWN( [C_AMT_B] * (([C_TAMT_C]-[C_TAMT_B])/[C_TAMT_B]) 31 + (([LAMT][+LAB])- 31 + [C_AMT_B]+ROUNDDOWN( ([C_TAMT_C]-[C_TAMT_B]) * [RAT_1] 31 + ([LAMT][+LAB]) 31 + ROUNDDOWN( [C_KUNBO] * [RAT_1] 31 + ROUNDDOWN( ([LAMT][+LAB]) * [RAT_1] 31 + [LAMT][+LAB] 31 + ([LAMT]+[M_AMT] 31 + IF(([LAMT]+[M_AMT]) 31 + ([LAMT]+[M_AMT])) 31 + ([L_AMT]+[M_AMT]) 31 + IF(([L_AMT]+[M_AMT]) 31 + ([L_AMT]+[M_AMT])) 31 + ROUNDDOWN( ([T_AMT]-[M_AMT]) * [RAT_1] 31 + ROUNDDOWN( ROUNDDOWN([LAMT]*[RAT_1]*[RAT_2]/100*1.4 31 + 0) + ROUNDDOWN([LAMT]*[RAT_KY]*[RAT_3]/100 31 + 0) + ROUNDDOWN([LAMT]*[RAT_1]*[RAT_2]/100*[RAT_4]/100 31 + ROUNDDOWN( ([M_AMT]+[L_AMT]+[S_AMT] 31 + ROUNDDOWN([T_AMT] * [RAT_1] 31 + ROUNDDOWN([M_AMT] * [RAT_1] 31 + +[C_SAGUP_C]/1.1 31 + [C_SAGUP_C]/1.1 31 + ROUNDDOWN([TAMT] * [RATE] 3 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/settings_key_map.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/settings_key_map.py new file mode 100644 index 00000000..b8eb0dcb --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/settings_key_map.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +"""화면 선택축 ↔ PRJLST.SMT 저장키 대응, 그리고 간접비 식 템플릿 전수.""" +import sys, io, re, pathlib, zipfile, collections +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +PRAC = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서") +SYS = pathlib.Path(r"C:\경영정보(주)\System") + +# ── PRJLST.SMT 키 모으기 ───────────────────────── +keys=collections.Counter() +for p in sorted(PRAC.rglob("*.STC")): + try: b=zipfile.ZipFile(p).read("PRJLST.SMT") + except Exception: continue + txt=b[0x200:].decode("cp949","replace") + for k in re.findall(r"([0-9]?_?[A-Z][A-Z0-9_]{2,})=", txt): keys[re.sub(r"^\d_","",k)]+=1 +print("### PRJLST.SMT 저장키 %d종 (접두 차수 제거)" % len(keys)) +grp=collections.defaultdict(list) +for k in keys: + m=re.match(r"^([CRIBY])_(.+)$", k) + grp[m.group(1) if m else "기타"].append(k) +LBL={"C":"금액 직접입력","R":"요율","I":"선택 인덱스","B":"켬/끔","Y":"연도·기타","기타":"섹션·기타"} +for g in ("C","R","I","B","Y","기타"): + if g not in grp: continue + v=sorted(grp[g]) + print("\n■ %s_ %s %d개" % (g, LBL[g], len(v))) + for i in range(0,len(v),5): print(" " + " ".join("%-20s"%x for x in v[i:i+5])) + +# ── 간접비 식 템플릿 전수 (바이너리) ───────────── +print("\n\n### 간접비 식 템플릿 — 바이너리에서 전수") +TMPL=re.compile(rb"[A-Z_\[\]0-9+\-*/(). ]*\[[A-Z_0-9]{2,12}\][A-Z_\[\]0-9+\-*/(). ]{4,80}") +found=collections.Counter() +for p in SYS.rglob("*"): + if not p.is_file() or p.suffix.upper()!=".CPM": continue + try: b=p.read_bytes() + except Exception: continue + for m in TMPL.finditer(b): + s=m.group().decode("latin1").strip() + if s.count("[")<1 or len(s)<10: continue + if not re.search(r"[*/+]", s): continue + if re.search(r"[a-z]", s): continue + found[s]+=1 +print(" 서로 다른 템플릿 %d개 (상위 30)" % len(found)) +for s,c in found.most_common(30): print(" %-72s %2d" % (s[:72], c)) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index 612b67ff..4c1b4ab3 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -63,6 +63,7 @@ | 22 | **UI 폼 분석** — 선택축 272개, 화면에 남아 있던 계산 규칙 | | 23 | **`COSTN.SMT` 전수파싱** — 단가산출 원장, Q식 10꼴, 운반 사이클 | | 24 | **모듈구조 전수** — 46개 export, 계산 공용 라이브러리 73함수, 동글 | +| 25 | **설정키 전수와 식템플릿** — 저장키 241종, 간접비 식 26개, 설정 사슬 닫힘 | ## 확정된 굵직한 것