feat(810-2): 원파일 구조 줄 → 수식 문서 변환 · 원파일 우선 올림 · 전수 대조
- 새 M02_Doc_NativeEst(EST 산근 블록 → 가져온 로직 · 단가 \x03 · 변수 \x11 · 줄참조 \x0c 표지로 정함 · 변수 이름 그대로 · 분수 그림 공식 = 위아래 줄 칸 · 기계 · 산근 · 견적 세 줄 = 로직 값묶음 한 줄 · 소계 61 = 합 밖 · 율 58 · 62 = 덧줄 · 못 읽은 줄 = 보인 값 얼림 + 참고 표지 · 품셈 조건 글 = 추정 표지) - 새 M02_Doc_FromNative(원파일 읽기 · 둘 꼴 · 블록 번 = 엑셀 길과 같음 · STmate = 원문 그대로 M02_San_Emit.stmate · 같은 공사 판정 · EST 일위대가 → 실무자료 호표 꼴) - M02_Sangeun_FromHopyo — 산근 자리 칸 원파일 · 원파일 우선 emit · 안쪽 산근 원파일 코드로 · upload_native(같은 공사 엑셀 HP 에 붙음 · 없으면 새 HP) - M02_Hopyo_Router 올림 — .estx · .stc 이면 upload_native(한 덩이) - M02_Doc_Import — 원파일 문서 소계 덧줄 비목 칸 비움 · 수 하나 변수 출처 원파일 · 머리 원파일 - 수식 문서 셈 짝(master_doc · master_doc_calc ↔ common_util_formula_doc · _calc) — 합밖 + 비목 비움 = 금액만(소계 보임) · 그 밖 그대로 - M02_San_Estx 구조 줄 색인(Index) 칸 · 어디서 왔나 카드 「EST · 원파일」 - 전수 대조 — EST 산근 1,849 · STC 371 블록 수식 문서 셈 = 원파일 저장값(STC 계약단가 82 = 낙찰률 버림 뒤) · 표지 없는 틀린 줄 0 · 목록 docs/raw/요구_1104/_목록_810-2_원파일변환.xlsx - 시험 test_810_2_native_doc(전수 · 꼴 · 문서 셈 거울 · 올림 분기) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -76,7 +76,7 @@
|
||||
- 금액 줄 = `이름` · `규격?` · `단위` · `비목`(노무비 · 재료비 · 경비 · 묶음) · `수량?`(식 · 없으면 1) · `단가`(식) · `묶음?`(묶음 이름) · `기호?`(뒤 금액 줄이 부름) · `자리?` · `번지?` · `합밖?` · `출처?`.
|
||||
- 줄 금액 = 수량 × 단가 → 비목마다 끝수(`자리` › 문서 `끝수.줄`) → 합. 비목 「묶음」 = 단가가 단가산출 묶음 → 노 · 재 · 경 각각 수량 ×.
|
||||
- 수량 0 = 금액 0(단가가 비어도). 값 없음(빈 입력 · 표 줄 없음 · 요소 값 없음) = 그 줄만 비움 · 까닭 · 합에서 뺌.
|
||||
- `합밖: true` = 번지엔 쌓되 비목 합 · 단계에서 뺌. `번지` = 금액번지 이름(그 줄 비목 금액이 쌓임).
|
||||
- `합밖: true` = 번지엔 쌓되 비목 합 · 단계에서 뺌. `합밖: true` + 비목 비움 = 금액만(수량 × 단가 · 끝수 · 기호) · 비목 칸 없음(소계 보임 · 원파일 810-2). `번지` = 금액번지 이름(그 줄 비목 금액이 쌓임).
|
||||
- `단계`(문서 칸) = `[{이름, 단, 줄 [금액 줄 이름], 제외}]` — 단 1 = 제 줄 · 단 k = 제 줄 + 아직 안 담긴 아래 단 단계 · `제외` = 찍되 위 단계 · 비목 합에서 뺌.
|
||||
- 묶음 = 금액 줄 `묶음` 이름이 같은 것끼리 — 묶음 하나 = 「계」 · 둘 이상 = 묶음마다 「소계」(줄 금액 합) + 「합계」. 묶음 소계는 보이기만 — 합계 = 아래 끝수 규칙.
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
| 품명 · 규격 · 단위 | `\x0e` · `\x13` · `\x15` 첫 조각 | Name · Size · Unite | 비움 |
|
||||
| 수량 | — | GN | — |
|
||||
| 단 | Level | — | 계 단 1~5 |
|
||||
| 색인 | Index(-20 = 소계 구간 첫 줄 · -1 = 소계에서 뺌) | — | — |
|
||||
| 연결 · 연결뜻 | LinkIndex · `LINK` 뜻 | 같음 | 줄 종류(빈 · 글 · 계 · 대입 · 참조 · 율) |
|
||||
| 비목 | SCheck 음수 -1 L · -2 M · -3 S · -4 R · -5 T / 율 · 소계 양수 1 M · 2 L · 3 S · 4 R | 율 줄 SCheck | 참조 · 율 꼬리 L · M · S |
|
||||
| 자원 | {코드 · 종류 · 표 · 이름 · 규격 · 단위 · 저장} | 같음 | {코드 · 종류 · 비목 · 옮김 · 이름 · 규격 · 단위 · 저장} |
|
||||
@@ -77,3 +78,11 @@
|
||||
- EST — 옵션 파일(datestoption.opt) · 원가 서식(wongadat) · 기계 구성(MachMainDat) 은 구조 줄로 안 옮김.
|
||||
- STmate — BDQTY.DBF(일위대가 구성) · SYSINFO.DBF 난독화 · 차수 2~4 금액 칸 안 옮김 · 코드 머리 W 뜻 모름.
|
||||
- 원파일 없는 것(북부청 2 · 2016 사방 · 수목) = 엑셀 길.
|
||||
|
||||
## 6. 수식 문서로(810-2)
|
||||
|
||||
- 길 = 원파일 → 둘 꼴(`M02_Doc_FromNative.pack` · 실무자료 산근 자리 칸 `원파일`) → 블록 하나 `{로직, 원본}`(EST `M02_Doc_NativeEst` · STmate `M02_San_Emit.stmate`) → 가져온 식 SK → `M02_Doc_Import.derive` 수식 문서.
|
||||
- 원파일 우선 — 같은 공사(엑셀 산근 블록 계 = 원파일 같은 번 블록 계) 엑셀 HP 에 붙음 · 그 블록은 원파일로 · 원파일 없는 블록 · 엑셀만 = 엑셀 길.
|
||||
- EST 줄 — 자원 줄 = 호표(단가 `` · 수량 식 · 변수 이름) · 세 줄(101 · 104 · 105 같은 코드 노 · 재 · 경 · 같은 수량 식) = 로직 값묶음 한 줄 · 소계 61 = 합 밖 덧줄(출처 `원파일 소계` · 문서 비목 칸 비움) + 아래 줄이 소계 비목으로 합에 듦(-20 · 머리 줄까지) · 율 58 · 62 = 덧줄(줄참조 · 구간 합) · 합계 = 글 · 변수 줄 = 중간(분수 그림 = 위아래 줄 칸 · 결과와 맞을 때만 식).
|
||||
- 표지 — 못 읽은 줄 = 보인 값 얼림 + 「참고 · …」 · 품셈 조건 글(값 없음) = 「참고 · 추정 — …」 · 문서 수 하나 변수 출처 = 「원파일」.
|
||||
- 일위대가 — EST HeadMainDat = 실무자료 호표 꼴(`hopyo`) · STmate = 호표 없음(산근만).
|
||||
|
||||
@@ -478,7 +478,9 @@ def check(doc: dict) -> list[dict]:
|
||||
uses[head] = uses.get(head, []) + need(line.get("식"), head, False, head)
|
||||
for at, line in enumerate(doc.get("금액") or []):
|
||||
where = f"금액 {line.get('이름') or at + 1}"
|
||||
if line.get("비목") not in (*COSTS, "묶음"):
|
||||
if line.get("비목") not in (*COSTS, "묶음") and not (
|
||||
line.get("합밖") and not line.get("비목")
|
||||
):
|
||||
out.append(_mark("금액 줄", f"{where} 비목 「{line.get('비목')}」"))
|
||||
for k in ("수량", "단가"):
|
||||
if k == "단가" or line.get(k) not in (None, ""):
|
||||
|
||||
@@ -404,13 +404,15 @@ def _money(run: _Run, doc: dict, rules: dict):
|
||||
)
|
||||
price = run.expr(line.get("단가"), where, scope)
|
||||
kind = line.get("비목")
|
||||
parts, why = {}, None
|
||||
parts, why, bare = {}, None, None
|
||||
if isinstance(qty, Stop) or isinstance(price, Stop):
|
||||
stopped, why = True, (qty if isinstance(qty, Stop) else price).why
|
||||
elif isinstance(qty, Blank):
|
||||
why = qty.why
|
||||
elif not isinstance(qty, Decimal):
|
||||
stopped, why = True, run.mark(Stop(f"{where} 수량이 수 아님", "셈 틀림", where)).why
|
||||
elif qty == 0 and not kind and line.get("합밖"):
|
||||
bare = Decimal(0)
|
||||
elif qty == 0:
|
||||
parts = {k: Decimal(0) for k in (COSTS if kind == "묶음" else (kind,))}
|
||||
elif isinstance(price, Blank):
|
||||
@@ -427,6 +429,8 @@ def _money(run: _Run, doc: dict, rules: dict):
|
||||
)
|
||||
elif kind in COSTS and isinstance(price, Decimal):
|
||||
parts = {kind: qty * price}
|
||||
elif not kind and line.get("합밖") and isinstance(price, Decimal):
|
||||
bare = qty * price # 비목 없는 합 밖 줄(소계 보임 · 810-2) — 금액만 · 비목 칸 비움
|
||||
else:
|
||||
what = (
|
||||
"묶음 값 — 칸(.계 · .노무비 …) 필요"
|
||||
@@ -437,6 +441,8 @@ def _money(run: _Run, doc: dict, rules: dict):
|
||||
rule = line.get("자리") or rules["줄"]
|
||||
parts = {k: cut(v, rule) for k, v in parts.items()}
|
||||
amount = sum(parts.values(), Decimal(0)) if parts else None
|
||||
if bare is not None:
|
||||
amount = cut(bare, rule)
|
||||
if i not in skip:
|
||||
_add(running, parts)
|
||||
if line.get("기호"):
|
||||
|
||||
Reference in New Issue
Block a user