Merge remote-tracking branch 'origin/sub_desktop_1' into main_desktop_1
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
| 24 모듈구조 전수 | **46개 모듈 export** — `DP_Common` 73함수, 플러그인 규약, 동글, 8차 해소 | (저장소 파일) |
|
||||
| 25 설정키 전수와 식템플릿 | **설정 사슬 닫기** — `PRJLST.SMT` 키 241종, 간접비 식 26개 | (저장소 파일) |
|
||||
| 26 편집기와 사이클식 | **`Cm` 54꼴·품셈 인자·식 편집기·낙찰율** — 계약/실행/기성 단계 발견 | (저장소 파일) |
|
||||
| 27 계약·실행·기성 단계 | **설계 뒤 네 단계** — 낙찰율 3갈래, 기성은 계약제잡비율, 실행 차액보정 | (저장소 파일) |
|
||||
|
||||
> **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`.
|
||||
> 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다.
|
||||
@@ -111,6 +112,11 @@
|
||||
| **낙찰율 `NAGCD`** | **몰랐음** | ⚠ **단가 그리드에 낙찰율 열.** 계약·실행·기성 단계 미분석 | 26번 §4·§8 |
|
||||
| 계층 표기 | `T*`/`E*` | **`+=` ~ `+=====` 가 레벨** | 26번 §5 |
|
||||
| `PM_*` ↔ `SET_REP` | 없음 | **64/74 대응** | 26번 §6 |
|
||||
| 분석 범위 | 설계 단계만 | **계약·실행·기성·준공 네 단계 구조 확보** | 27번 |
|
||||
| 낙찰율 적용 | 열만 확인 | **노·재·경 세 갈래 + 적용제외 공정 선택** | 27번 §2 |
|
||||
| 기성 간접비 | 몰랐음 | **금회직접공사비 × 계약제잡비율** — 설계와 다름 | 27번 §3.1 |
|
||||
| 부가세 축 | 단계 무관 | ⚠ **단계마다 선택지가 다름** | 27번 §3.3 |
|
||||
| 실행예산 | 서식명만 | **중기 실행단가 + 차액 보정 순서** | 27번 §4 |
|
||||
|
||||
분석일: 2026-09-13
|
||||
대상: `C:\경영정보(주)`
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
# 계약·실행예산·기성·준공 — 설계 뒤의 네 단계
|
||||
|
||||
점검일: 2026-09-13
|
||||
계기: 26번 §8에서 **「우리가 판 8단계는 설계까지」**임이 드러났다. 그 뒤를 판다.
|
||||
재현 스크립트: `40_스크립트/stage_form_parse.py`
|
||||
|
||||
## 1. 프로그램은 설계에서 끝나지 않는다
|
||||
|
||||
```text
|
||||
설계 ──▶ 계약 ──▶ 실행예산 ──▶ 기성(여러 회) ──▶ 준공
|
||||
```
|
||||
|
||||
19번 §4의 계산 사슬 8단계는 **첫 칸(설계)**만 덮는다. 나머지 넷은 **밑수도 요율도 다르다.**
|
||||
|
||||
## 2. 계약 — `wM_Mk_Cont` (당초설계 → 계약내역 변환등록)
|
||||
|
||||
### 2.1 낙찰율을 **비목마다 따로** 먹인다
|
||||
|
||||
```text
|
||||
단가 적용율 【 노 】 ___ % 【 재 】 ___ % 【 경 】 ___ %
|
||||
```
|
||||
|
||||
⇒ **하나의 낙찰율이 아니라 노무·재료·경비 세 갈래**다. 26번 §4의 `NAGCD`(낙찰율 열)가 이것을 담는다.
|
||||
|
||||
### 2.2 적용 옵션
|
||||
|
||||
| 옵션 | 뜻 |
|
||||
|---|---|
|
||||
| `기초단가(재,노,경,일식)에 단가적용율 적용하기` | 기초단가까지 내려가 적용 |
|
||||
| `적용율 적용된 일위대가/산출근거 생성하기` | 호표도 새로 만듦 |
|
||||
| `계약내역내 동일코드의 계약단가 개별생성` | 같은 코드라도 계약본은 따로 |
|
||||
| `노무비율 적용` | 노무비 비율 별도 |
|
||||
| `비과세자재대(원가계산)에 단가적용율 적용하기` | 비과세 자재도 대상 |
|
||||
| **`단가적용율이 0% 이면 계약단가(W코드)를 "0"化 (공내역 생성)`** | **0% → 공내역** |
|
||||
|
||||
### 2.3 ⭐ 적용 제외 공정을 고른다
|
||||
|
||||
```text
|
||||
그리드 rGrd_Boq : 공종번호 | 명칭 | 규격 | 금액 | 레벨 | **적용제외** | RecNo
|
||||
레벨필터 : 소계 이상 … 광역대계 이상 (9단계)
|
||||
```
|
||||
|
||||
화면 안내가 **「적용율을 제외할(ex 관급자재대..) 공정을 선택」**이라 적는다.
|
||||
|
||||
⇒ **관급자재대처럼 낙찰율을 먹이면 안 되는 공정을 행 단위로 제외**한다. 16번 §4.2의 `C*` 제외금액 구역과 **다른 개념**이다 — 그쪽은 직접비 합산 제외, 이쪽은 낙찰율 적용 제외다.
|
||||
|
||||
보조 기능으로 `예상적용율 찾기`·`적용금액 미리계산`이 있다 — **목표 계약금액을 넣으면 역산해 적용율을 찾아 준다.**
|
||||
|
||||
## 3. 기성 — `wM_KanJub_K` (기성 제잡비 계산서)
|
||||
|
||||
### 3.1 ⭐ 간접비가 **단일 계약제잡비율**로 바뀐다
|
||||
|
||||
```text
|
||||
[ 금 회 간 접 비 적 용 ] 금회직접공사비 × 계약제잡비율
|
||||
```
|
||||
|
||||
설계 단계는 항목마다 고유 밑수에 고유 요율을 곱했다(06번 §3). **기성은 그렇지 않다.**
|
||||
|
||||
⇒ 11번 §10이 「계약 제잡비율 적용 시 간접노무비부터 부가세 직전까지를 `직접비 변경분 × 계약 제잡비율`로 조정」이라 한 것이 **기성 단계의 기본 방식**이다.
|
||||
|
||||
### 3.2 4단 누적 구조
|
||||
|
||||
```text
|
||||
rGrd_Jab : 공종 | 명칭 | 규격 | 도급액 | 전회금액 | 전율 | 금회금액 | 금율
|
||||
| 누계금액 | 누율 | 구분 | 종류 | **계약잡비율** | D_Typ
|
||||
```
|
||||
|
||||
`전회 → 금회 → 누계`와 **각각의 비율(전율·금율·누율)**을 함께 들고 간다. 보고서 서식도 같다.
|
||||
|
||||
| 서식 | 열 |
|
||||
|---|---|
|
||||
| `기성내역서`(0633) | 계약 \| 전회 \| 금회 \| 누계 |
|
||||
| `기성내역서(사정)`(0634) | + **사정** |
|
||||
| `기성내역서(기성율)`(0635) | + 비율 |
|
||||
| `기성부분총괄내역서`(0632) | + 금액 \| 비율 |
|
||||
| `기성검사조서(을/병)`(0636·0637) | 계약금액 \| **기성고(%)** \| 전회 \| 금회 \| 누계 \| 기성금액 |
|
||||
| `기성부분수량조서`(0638) | 기성수량 \| 전회누계 \| 금회 \| 누계 \| **기성(%)** \| **잔량** |
|
||||
|
||||
### 3.3 부가세 선택지가 설계와 다르다
|
||||
|
||||
```text
|
||||
기성 : (0) 직접입력 · (1) 공급가액의 10% · (2) 재료비의 10% · (3) **재료비+산출경비의 10%**
|
||||
설계 : 공급가액의 10% · 재료비의 10% · 없음 · 산림조합 형식 · 산림조합-면세품
|
||||
```
|
||||
|
||||
⇒ **같은 이름의 축이라도 단계마다 선택지가 다르다.** 재구현은 단계를 축의 일부로 삼아야 한다.
|
||||
|
||||
절사 축은 같다 — `공급가액 절사`·`총공사비 절사` 각각 9택, `이윤금액 직접입력`까지.
|
||||
|
||||
### 3.4 저장 자리
|
||||
|
||||
`BOQ11`에 **`QTY1_B` · `QTY1_N` · `QTY1_O` · `QTY1_H`** 네 칸이 있다(02번). 설계 단계 표본에서는 **전부 0**이다.
|
||||
|
||||
⇒ **기성 수량 칸**으로 보인다(전회/금회/기타). 기성 STC 표본이 없어 각 글자의 뜻은 **B등급**이다.
|
||||
|
||||
## 4. 실행예산 — `wM_Boq_ExecX` (중기 실행단가)
|
||||
|
||||
```text
|
||||
시간/단위당 중기실행단가 계산 및 입력
|
||||
1단위당 중기사용료 : ____ 원/단위 1단위 = ____ 시간
|
||||
최초단가 노무비 / 재료비 / 경비 → 실행단가
|
||||
절사 기준 : 1원 · 10원 · 100원 · 1,000원 · 10,000원 · 100,000원 미만절사
|
||||
차액 보정 순서 : 기본보정 / 노무비 / 재료비 / 경비
|
||||
최초수량 → 실행수량
|
||||
```
|
||||
|
||||
⇒ **실행예산은 설계단가를 그대로 쓰지 않고 「실행단가」를 따로 만든다.**
|
||||
|
||||
⭐ **`차액 보정 순서`** — 성분별로 절사하면 합계와 어긋나는데, **그 차액을 어느 비목에 몰아줄지 고른다.** 16번 §4.4의 끝전조정과 같은 성격이되 **단가 수준**에서 일어난다.
|
||||
|
||||
보고서는 `실행예산서Ⅰ/Ⅱ`(0673·0674)이고 열은 `공종 | 설계(계획) | 실행예산 | 작업명 | 구분`이다.
|
||||
|
||||
## 5. 준공
|
||||
|
||||
`준공조서(을/병)`(0646·0647), 열은 **`계약금액 | 준공금액`** 둘뿐이다. 별도 계산 없이 최종 누계를 옮기는 것으로 보인다.
|
||||
|
||||
## 6. 보조 — `wM_GetAMT` (잡비 금액 불러오기)
|
||||
|
||||
```text
|
||||
RDbGrid_Prj : 공사번호 | 공사명 | 직접공사비 | 총공사비 | 공사종류 | PCODE
|
||||
RDbGrid_Boq : 공종 | 명칭 | 규격 | 수량 | 단위 | 계금액 | 비고
|
||||
관/사급내역 보기 · 관련항목 보기 · 공종 추려보기
|
||||
```
|
||||
|
||||
⇒ **다른 프로젝트의 금액을 밑수로 끌어온다.** 11번 §12의 「사용자는 다른 내역 금액을 더블클릭으로 밑수에 불러올 수 있다」가 이 화면이다.
|
||||
|
||||
## 7. 단계별 모듈 분포
|
||||
|
||||
| 문자열 | 가진 모듈 |
|
||||
|---|---:|
|
||||
| `누계` | 16 |
|
||||
| `금회` | 15 |
|
||||
| `전회` | 14 |
|
||||
| `기성` | 12 |
|
||||
| `낙찰` | 4 (`ST_EdSan`·`ST_PList`·`ST_Prt`·`ST_Sys`) |
|
||||
| `실행예산` | 4 (`STmate`·`ST_Boq`·`ST_Prt`·`ST_U_Convert`) |
|
||||
| **`계약제잡비`** | **1 (`ST_KanJub`)** |
|
||||
|
||||
⇒ 기성 표기는 널리 퍼져 있지만 **계약제잡비율 계산은 `ST_KanJub` 한 곳**이다.
|
||||
|
||||
## 8. 이번 점검이 바꾸는 것
|
||||
|
||||
| 항목 | 이전 | 지금 |
|
||||
|---|---|---|
|
||||
| 분석 범위 | 설계 단계만 | ✅ **계약·실행·기성·준공 네 단계 구조** |
|
||||
| 낙찰율 | 열이 있다는 것만 | ✅ **노·재·경 세 갈래 + 적용제외 공정 선택** |
|
||||
| 기성 간접비 | 몰랐음 | ✅ **금회직접공사비 × 계약제잡비율** (설계와 다름) |
|
||||
| 기성 누적 | 몰랐음 | ✅ **전회·금회·누계 + 각 비율**, 사정·잔량 |
|
||||
| 부가세 축 | 단계 무관으로 봄 | ⚠ **단계마다 선택지가 다름** |
|
||||
| 실행예산 | 서식 이름만 | ✅ **중기 실행단가 + 차액 보정 순서** |
|
||||
| `QTY1_B/N/O/H` | 「특수 수량」 | ◐ **기성 수량 칸으로 추정** (B등급, 표본 없음) |
|
||||
|
||||
## 9. 남은 것
|
||||
|
||||
| 무엇 | 왜 막혔나 |
|
||||
|---|---|
|
||||
| 기성 회차별 실제 값 | **기성 STC·XLSX 표본 0건.** 한 건만 있으면 §3 전체가 실증됨 |
|
||||
| 계약내역 표본 | 같음 — 낙찰율 적용 결과를 원 단위로 못 맞춰 봄 |
|
||||
| `QTY1_B/N/O/H` 글자 뜻 | 기성 표본 필요 |
|
||||
| 실행예산 표본 | 같음 |
|
||||
|
||||
⇒ **설계 단계는 원 단위까지 재현했지만(16번), 뒤 네 단계는 「구조는 알고 값은 못 맞춤」 상태다.** 표본이 생기면 같은 골든셋 방법으로 바로 검증할 수 있다.
|
||||
@@ -0,0 +1,43 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""큰 편집 폼 깊이 파싱 + PM_* 인쇄폼 ↔ SET_REP 서식 대응."""
|
||||
import sys, io, re, pathlib, struct, 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)
|
||||
F=pathlib.Path(r"C:\Users\umsan\AppData\Local\Temp\claude\D--aislo-wt-sub\df75230a-b05b-4088-ad34-bb0c9da0a312\scratchpad\forms")
|
||||
|
||||
def walk(n, out, d=0):
|
||||
if isinstance(n,dict):
|
||||
pr=n.get("properties") or {}
|
||||
out.append((d, n.get("class",""), n.get("name",""), pr))
|
||||
for c in n.get("children",[]) or []: walk(c,out,d+1)
|
||||
return out
|
||||
|
||||
for f in ("wBoq","wM_Edit_San"):
|
||||
p=F/(f+".dfm")
|
||||
if not p.exists(): print("없음 %s"%f); continue
|
||||
try:
|
||||
r=pd.Reader(p.read_bytes()); r.take(4); root=r.component(root=True)
|
||||
except Exception as e: print("%s 파싱 실패 %s"%(f,e)); continue
|
||||
ns=walk(root,[])
|
||||
print("\n" + "="*96)
|
||||
print("### %s 컴포넌트 %d개" % (f, len(ns)))
|
||||
# 그리드 열 제목
|
||||
for d,cls,nm,pr in ns:
|
||||
cols=pr.get("Columns")
|
||||
if isinstance(cols,list) and cols:
|
||||
tt=[ (c.get("Title.Caption") or "").replace("\r"," / ").strip() for c in cols ]
|
||||
fl=[ (c.get("FieldName") or "") for c in cols ]
|
||||
print("\n ▣ 그리드 %s 열 %d개" % (nm, len(cols)))
|
||||
for t,fn in zip(tt,fl):
|
||||
if t or fn: print(" %-26s ← %s" % (t[:26], fn))
|
||||
# 액션·버튼 캡션
|
||||
caps=[str(pr.get("Caption")) for d,cls,nm,pr in ns
|
||||
if isinstance(pr.get("Caption"),str) and any(ord(c)>127 for c in pr["Caption"])]
|
||||
uniq=[]
|
||||
for c in caps:
|
||||
c=c.strip()
|
||||
if c and c not in uniq: uniq.append(c)
|
||||
print("\n 기능 캡션 %d개" % len(uniq))
|
||||
for i in range(0,min(len(uniq),60),3):
|
||||
print(" " + " ".join("%-28s"%x[:28] for x in uniq[i:i+3]))
|
||||
@@ -65,6 +65,7 @@
|
||||
| 24 | **모듈구조 전수** — 46개 export, 계산 공용 라이브러리 73함수, 동글 |
|
||||
| 25 | **설정키 전수와 식템플릿** — 저장키 241종, 간접비 식 26개, 설정 사슬 닫힘 |
|
||||
| 26 | **편집기와 사이클식** — `Cm` 54꼴, 품셈 인자, 식 편집기, 낙찰율 |
|
||||
| 27 | **계약·실행·기성 단계** — 설계 뒤 네 단계의 계산 구조 |
|
||||
|
||||
## 확정된 굵직한 것
|
||||
|
||||
|
||||
Reference in New Issue
Block a user