Files
Aislo/resources/tester/test_744_1_sk_detail_undo.py
T
eomsangdonandClaude Opus 5.5 f4be6782a5 feat(751-3): M01 · M02 셈 끝수 = 품셈 1-2-2 버림 — 줄 0.1 원 · 비목 소계 1 원 · 계 = 셋 합 · B09 와 같은 값
- 끝수 한 곳 `master_cut.py`(B09 `rounddown` 재사용) — 엔진 답에 입힘: 줄 비목마다 0.1 원 버림 · 하위 로직 줄 = 하위 끝수 계 × 수량 · 덧줄 = 버린 줄 합으로 다시 셈 · 비목 합 1 원 버림 · 중간 칸도 버린 값
- 쓰는 곳: M01 시험 계산(`check_master.calc`) · 읽는 식(`master_text.lines`) · 옛 조합 미리보기(`master_combo`) · M02 `run_line`(단가산출 · 일위대가 · 펼침) · 별도계상 뺀 기준 · 켜쌓기율 곱 뒤 · 일위대가 반영 · 반영합 · 비율 줄 · 사전조합 안 줄
- 일위대가 반영 TS 짝(`Labor_Calc.ts`) 같은 끝수 · 거울 헬퍼가 상대 경로 .ts 가져옴
- B09 = `run_line(raw=True)` 엔진 날 값(제 단가로 다시 버림 · % 덧줄 율 비 그대로) — 검증_sub3 B09 247 칸 전후 같음
- `master_text` 꼴 셋 = `common_util_money` 로 갈음(줄 금액 `fmt_line_money` · 식 안 금액 = 버린 0.1 원)
- 화면: 상세 줄 금액 · 시험 계산 줄 · 중간 돈 = `formatLineMoney` · 일위대가 반영 칸 0.1 원 · 상세 바닥 · 박스 · 인력재료경비 비목 소계 = 줄 합 1 원 버림
- 테스트1 네 보기 · 서고 목록 = 124,419(옛 124,420 / 124,419.85) · 재료 줄 11,694.6 + 23,425.6 + 1,404.8 = 소계 36,525
- 새 지킴 시험 test_751_3_money_cut
- 옛 날 금액(끝수 없음)을 대조하던 시험 24 파일 고침 — 까닭 = 금액 규칙이 줄 0.1 원 · 소계 1 원 버림으로 바뀜(고정 값 → 새 값 · 줄 합 = 계 → 줄 합 아래 비목마다 1 원 안 · 곱 비 = 끝수 폭 안) · 실무 xlsx 영월 엑셀 같음 22 → 23 · 이어 붙이는 TS 시험(704_3 · 717_2b)에 `rounddown` 같은 식

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 06:16:01 +09:00

94 lines
4.5 KiB
Python

# ruff: noqa: F811 — 임시 층 fixture(world)를 test_m02_labor_ref 에서 받아 씀
"""744-1 서버 — 둘째 기초 세부 품 원문 · 되돌리기 기억(임시 storage · M01 읽기만).
- 둘째 기초 `펼침` 줄 `원문` = 그 기초 1 기준단위 몫(GF000316 품 그대로) · 줄 수량 · 금액 = 머리
수량 곱한 몫(상자 합) 그대로 · 머리 수량 = 더한줄 수량
- 더한줄 `처음수량` = 넣을 때 수량(없으면 저장 때 지금 수량) · 셈 · 지문 안 듦
- `뺀더한줄 [{차례, 줄}]` = [기초 빼기] · 더한 항목 빼기 기억 · 셈 · 지문 안 듦 · 못 읽는 줄 버림 ·
일위대가 줄 패치도 같음
"""
import pytest
from M01_MasterData import M01_MasterData_Store as m01
from M02_MasterTemplete import M02_Labor_Doc as labor
from M02_MasterTemplete import M02_Labor_Ref as refs
from M02_MasterTemplete import M02_Library_Same as same
from M02_MasterTemplete import M02_MasterTemplete_Store as store
from M02_MasterTemplete import M02_Sangeun_Calc as calc
from resources.tester.test_m02_labor_ref import world # noqa: F401
GF = "GF000099" # 원/㎥
BIG = "GF000316" # 기준단위 100㎥ — ㎥ 바탕에서 처음 수량 0.01
PCT = "GC001109"
MAN = {"종류": "인력", "요소": "LB000002", "수량": 1}
def _sk(folder, **doc):
with store.at(folder):
made = refs.create("sangeun", {"이름": "744", "단위": "㎥", "더한줄": [], **doc})
return store.read("sangeun", made["이름"])["문서"]
def _calc(folder, doc):
with store.at(folder):
return calc.calc_doc(doc)
def test_둘째_기초_세부_원문_품_머리_수량(world):
doc = _sk(
world["personal"], 바탕={"로직": GF}, 더한줄=[{"종류": "로직", "로직": BIG, "수량": 0.01}]
)
got = _calc(world["personal"], doc)
head = next(x for x in got["줄"] if x["cid"] == "add:#0")
m01_lines = labor.run_line(m01.loaded()[1], BIG, {})["줄"]
assert head["수량"] == pytest.approx(0.01)
for row, line in zip(head["펼침"], m01_lines):
assert row["원문"]["수량"] == pytest.approx(float(line["수량"]), rel=1e-9) # 원문 그대로
assert row["수량"] == pytest.approx(float(line["수량"]) * 0.01, rel=1e-9) # 상자 몫
# 머리 = 수량 × 기초 끝수 계(751-3 · 비목 1 원 · 줄 0.1 원 버림) — 펼침 합과 0.3 + 수량 × 3 원 안
near = 0.3 + 3 * 0.01
assert sum(x["금액"] for x in head["펼침"]) == pytest.approx(head["금액"], abs=near)
assert sum(x["원문"]["금액"] for x in head["펼침"]) * 0.01 == pytest.approx(
head["금액"], abs=near
)
def test_처음수량_넣을때_값_셈_지문_안_듦(world):
me = world["personal"]
plain = _sk(me, 바탕={"로직": PCT}, 단위="㎡", 더한줄=[{**MAN, "수량": 3}])
assert plain["더한줄"][0]["처음수량"] == 3 # 없으면 저장 때 지금 수량
kept = _sk(me, 바탕={"로직": PCT}, 단위="㎡", 더한줄=[{**MAN, "수량": 3, "처음수량": 1}])
assert kept["더한줄"][0]["처음수량"] == 1
assert _calc(me, kept)["기준"]["계"] == _calc(me, plain)["기준"]["계"]
assert same.finger("sangeun", kept) == same.finger("sangeun", plain)
def test_뺀더한줄_기억_셈_지문_안_듦_못읽는_줄_버림(world):
me = world["personal"]
gone = [
{"차례": 0, "줄": {"종류": "로직", "로직": BIG, "수량": 0.01, "덮개": {}}},
{"차례": 1, "줄": MAN},
{"차례": -1, "줄": MAN}, # 차례 틀림
{"차례": 2, "줄": {"종류": "로직", "로직": "GX999999", "수량": 1}}, # 없는 기초
{"차례": 3}, # 줄 없음
]
doc = _sk(me, 바탕={"로직": GF}, 뺀더한줄=gone)
assert [x["차례"] for x in doc["뺀더한줄"]] == [0, 1]
assert doc["뺀더한줄"][1]["줄"]["요소"] == "LB000002"
bare = _sk(me, 바탕={"로직": GF})
assert _calc(me, doc)["기준"]["계"] == _calc(me, bare)["기준"]["계"]
assert same.finger("sangeun", doc) == same.finger("sangeun", bare)
def test_일위대가_줄_패치_기억_처음수량(world):
me = world["personal"]
patch = {"더한줄": [{**MAN, "수량": 2}], "뺀더한줄": [{"차례": 0, "줄": MAN}]}
with store.at(me):
sc = refs.create(
"precombo", {"이름": "744", "단위": "㎡", "담은로직": [{"로직": PCT, "패치": patch}]}
)
line = store.read("precombo", sc["이름"])["문서"]["담은로직"][0]
assert line["패치"]["더한줄"][0]["처음수량"] == 2
assert line["패치"]["뺀더한줄"][0]["줄"]["요소"] == "LB000002"