diff --git a/M02_MasterTemplete/M02_Doc_Import.py b/M02_MasterTemplete/M02_Doc_Import.py index d6c8c96de..455275b2f 100644 --- a/M02_MasterTemplete/M02_Doc_Import.py +++ b/M02_MasterTemplete/M02_Doc_Import.py @@ -293,10 +293,25 @@ def derive(sk: dict, ctx: tuple | None = None, whole: Any = None) -> dict: _numbers(doc, keep) head = {k: (meta.get("원본") or {}).get(k) for k in HEAD if (meta.get("원본") or {}).get(k)} marks = list((meta.get("원본") or {}).get("표지") or []) + if not (doc.get("금액") or doc.get("결과") or row["호표"] or row.get("덧줄")): + _empty(doc) # 빈 산근 = 엑셀 0 원(줄 없음 합) — 「—」 아님 + marks.append(EMPTY) doc["가져온"] = head | {"표지": marks} | ({"알림": notes} if notes else {}) return {**doc, "키": str(sk.get("키") or key), "이름": str(sk.get("이름") or doc.get("이름"))} +EMPTY = "참고 · 빈 산근 — 엑셀 줄 없음 · 금액 0 그대로" + + +def _empty(doc: dict) -> None: + """줄 없는 엑셀 산근 — 0 묶음 줄 하나(엑셀 금액 0 = 줄 없는 합 · 지은 값 아님).""" + doc["변수"].append( + {"열쇠": "P_빈", "기호": "P", "아래": "빈", "위": "", "이름": "빈 산근", "단위": "", + "연결": {"갈래": "숫자", "값": dict.fromkeys(imp.COSTS, Decimal(0))}} + ) # fmt: skip + doc["금액"] = [{"이름": "빈 산근", "단위": "식", "비목": "묶음", "단가": "P_빈"}] + + class _Row: """변환 색인 — 이 SK 줄만 고친 줄(소요량 중간 더함)로 · 그 밖 그대로.""" diff --git a/resources/tester/test_802_4b1_import_doc.py b/resources/tester/test_802_4b1_import_doc.py index a54dfcc8b..e1c141ff8 100644 --- a/resources/tester/test_802_4b1_import_doc.py +++ b/resources/tester/test_802_4b1_import_doc.py @@ -296,3 +296,12 @@ def test_ts_view_mirror() -> None: assert ts_ == py assert _var(ts_[0], "보통인부")["연결"] == {"갈래": "숫자", "값": 100000.0} assert ts_[0]["변수"][-1]["연결"]["갈래"] == "단가산출" # 형제 SK = 늘 연결 + + +def test_empty_block_is_excel_zero_not_dash() -> None: + """줄 없는 엑셀 산근 = 0 원(옛 엔진 · 엑셀과 같음) · 표지 · 우리 단가로도 0.""" + doc = _doc([]) + root = dim.derive(doc) + assert dim.EMPTY in root["가져온"]["표지"] + assert dim.run(root, doc)["계"] == 0 == dim.run(root, _ours(doc))["계"] + assert imp.check(doc)["셈"]["계"] == 0