Merge remote-tracking branch 'origin/dev' into sub_laptop_1
This commit is contained in:
@@ -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(
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user