knowledge(경쟁사): 설정키 241종·간접비 식 26개 전수 — 설정 사슬 닫힘
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) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA
This commit is contained in:
@@ -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:\경영정보(주)`
|
||||
|
||||
@@ -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(...)` 존재** — 평가기 필수 요건 |
|
||||
@@ -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
|
||||
@@ -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))
|
||||
@@ -63,6 +63,7 @@
|
||||
| 22 | **UI 폼 분석** — 선택축 272개, 화면에 남아 있던 계산 규칙 |
|
||||
| 23 | **`COSTN.SMT` 전수파싱** — 단가산출 원장, Q식 10꼴, 운반 사이클 |
|
||||
| 24 | **모듈구조 전수** — 46개 export, 계산 공용 라이브러리 73함수, 동글 |
|
||||
| 25 | **설정키 전수와 식템플릿** — 저장키 241종, 간접비 식 26개, 설정 사슬 닫힘 |
|
||||
|
||||
## 확정된 굵직한 것
|
||||
|
||||
|
||||
Reference in New Issue
Block a user