- 코드 등록·삭제·변경·병합·데이타병합·일괄변경·검색·동일코드·풀어넣기 끝전 등(ui_code · ui_merge · api_ui_code) - 코드 붙은 % 줄 = 같은 상위 공종 앞 말단 줄 비목 합 × 율(server pct_row_base · calc.js) · 저장 때 다시 셈(stc_save _pct_rows) — 실무 7건 저장값 그대로 - 내역 줄 단가 ≠ 단가목록이면 줄 고정 단가(fixedUnit) - 메뉴 94개 눌러 오류 0 · 시험 502 통과 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
"""STMATE 재현 앱 저장 — % 줄(조달수수료 M%·T% · 비율 줄 PR) 다시 셈.
|
|
|
|
밑수 줄 수량을 고치면 % 줄 단가 칸(밑수)과 금액(밑수 × 율 원 미만 절사)이 따라 바뀜.
|
|
손대지 않은 % 줄 재계산 = 원본 저장값(실무 STC 7건) 그대로.
|
|
"""
|
|
|
|
import sys
|
|
from decimal import ROUND_DOWN, Decimal
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
sys.path.insert(0, str(ROOT / "tools/stmate-test"))
|
|
from dbf_rw import DbfTable # noqa: E402
|
|
from stc_archive import files_of, read_entries # noqa: E402
|
|
from stc_save import SaveLog, _pct_rows # noqa: E402
|
|
|
|
DOCS = ROOT / "resources/knowledge/original/실무문서"
|
|
STCS = sorted(DOCS.rglob("*.STC"))
|
|
|
|
|
|
def _boq(p):
|
|
f = files_of(read_entries(p.read_bytes()))
|
|
return DbfTable(f["BOQ11.DBF"])
|
|
|
|
|
|
@pytest.mark.parametrize("stc", STCS, ids=[p.stem[:20] for p in STCS])
|
|
def test_pct_rows_recompute_equals_stored(stc):
|
|
bt = _boq(stc)
|
|
log = SaveLog()
|
|
_pct_rows(bt, "BOQ11.DBF", "1", log)
|
|
assert not log.items, f"{stc.stem} % 줄 재계산이 저장값과 다름 {log.items[:4]}"
|
|
|
|
|
|
def test_pct_row_follows_base_edit():
|
|
stc = next(p for p in STCS if "현동" in p.stem)
|
|
bt = _boq(stc)
|
|
i = next(k for k in range(len(bt)) if bt.get(k, "UNIT1").strip() == "M%")
|
|
j = next(k for k in range(i - 1, -1, -1) if float(bt.get(k, "M_AMT1") or 0) > 0)
|
|
base0 = Decimal(bt.get(i, "MAMT1"))
|
|
bt.set(j, "M_AMT1", Decimal(bt.get(j, "M_AMT1")) + 1000)
|
|
_pct_rows(bt, "BOQ11.DBF", "1", SaveLog())
|
|
assert Decimal(bt.get(i, "MAMT1")) == base0 + 1000
|
|
q = Decimal(bt.get(i, "QTY1"))
|
|
want = ((base0 + 1000) * q / 100).quantize(Decimal(1), rounding=ROUND_DOWN)
|
|
assert Decimal(bt.get(i, "M_AMT1")) == want
|