Merge remote-tracking branch 'origin/dev' into sub_laptop_1

This commit is contained in:
2026-09-14 06:55:25 +09:00
4 changed files with 386 additions and 56 deletions
+56
View File
@@ -145,6 +145,62 @@ def test_계약_수량_넘으면_알림과_분리발주_아니면_폐기물도_
assert "waste_disposal" in items
def _items(sheet: dict) -> dict:
return {item["key"]: item for item in sheet["items"]}
def _summary(sheet: dict) -> dict:
return {s["key"]: s for s in sheet["summary"]}
def test_계약잡비율_직접입력이_이기고_사유가_없으면_거른다() -> None:
settings = {
**SETTINGS,
"rate_overrides": {"indirect_labor_cost": {"rate_pct": "10", "reason": "계약서 제잡비율"}},
}
labor = _items(_sheet(settings))["indirect_labor_cost"]
assert (labor["contract_ratio_pct"], labor["default_ratio_pct"]) == ("10.000", "5.000")
assert labor["current_krw"] == "10500" and labor["override"]["reason"] == "계약서 제잡비율"
_, errors = clean_settings({"rate_overrides": {"profit": {"rate_pct": "7", "reason": " "}}})
assert len(errors) == 1
def test_단일율_곱과_벌어진_차이를_알린다() -> None:
# 1.2 × 0.1998 = 999원 → 줄별 49 + 17 + 59 + 74 = 199 · 단일율 20.25% 곱 202 → 3원
sheet = _sheet({"rounds": [{"quantities": {"1.2": "0.1998"}}]})
assert sheet["single_rate_gap_krw"]["current"] == "3"
assert any("단일율 곱과 금회 3원" in note for note in sheet["notes"])
def test_공급가액_절사와_총공사비_절사는_이윤에서() -> None:
first = {"quantities": {"1.1": "40", "1.2": "2"}, "vat_mode": "supply"}
cut = _sheet({"rounds": [{**first, "supply_cut_krw": "100"}]})
# 공급가액 180,375 → 180,300 · 이윤 11,250 − 75 · 부가세 18,030
assert _items(cut)["profit"]["current_krw"] == "11175"
assert (_summary(cut)["supply"]["current_krw"], _summary(cut)["vat"]["current_krw"]) == (
"180300",
"18030",
)
total = _sheet({"rounds": [{**first, "total_cut_krw": "1000"}]})
# 총공사비 198,412 → 412 ÷ 1.1 = 375 을 이윤에서 → 공급가액 180,000 · 부가세 18,000
assert _summary(total)["total"]["current_krw"] == "198000"
assert _items(total)["profit"]["current_krw"] == "10875"
def test_이윤금액_직접입력과_사정_칸() -> None:
entry = {
"quantities": {"1.1": "40", "1.2": "2"},
"profit_manual_krw": "10000",
"assessed": {"1.1": "130000"},
}
sheet = _sheet({"rounds": [entry]})
assert _items(sheet)["profit"]["current_krw"] == "10000"
assert _summary(sheet)["supply"]["current_krw"] == "179125"
row = {r["item_no"]: r for r in sheet["rows"]}["1.1"]
assert row["progress_assessed_krw"] == "130000" # 칸만 — 금액에 안 섞임
assert row["progress_current_amount_krw"] == "140000"
def test_틀린_칸은_거른다() -> None:
_, errors = clean_settings(
{