From 9abd6a453de04fa8e8cd54648a2e82766b704a2f Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 13:53:47 +0900 Subject: [PATCH 1/7] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):=20S?= =?UTF-8?q?tart8x.Ini=C2=B7SET=5FREP=20=EC=A0=90=EA=B2=80=20=E2=80=94=20?= =?UTF-8?q?=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 2/7] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):=20S?= =?UTF-8?q?MT=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 3/7] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):=202?= =?UTF-8?q?0=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 4/7] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):=20U?= =?UTF-8?q?I=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 5/7] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):=20?= =?UTF-8?q?=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 6/7] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=2046=EA=B0=9C=20export=20=EC=A0=84=EC=88=98?= =?UTF-8?q?=20=E2=80=94=20=EA=B3=84=EC=82=B0=20=EA=B3=B5=EC=9A=A9=20?= =?UTF-8?q?=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 7/7] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):=20?= =?UTF-8?q?=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개, 설정 사슬 닫힘 | ## 확정된 굵직한 것