From e7c090d3fdf0d4697b3bed59b128d6c6263b2ee4 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 14:21:03 +0900 Subject: [PATCH] =?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개, 설정 사슬 닫힘 | ## 확정된 굵직한 것