main_laptop_1 -> main byeonghap (4 hwangyeong 585 commits) #12
@@ -153,3 +153,29 @@ def check_operator_hours_basis(
|
||||
f"{daily_wage:,.0f} × {person_days} ÷ {hours_per_day}h = {expected:,.2f} 와 다릅니다 — "
|
||||
"나눗수를 줄이면 작업효율을 사용료에 넣은 것이 됩니다 (PLAN 9-6 ㉣)."
|
||||
)
|
||||
|
||||
|
||||
def check_column_sums(
|
||||
*,
|
||||
rows: list[dict],
|
||||
totals: dict[str, Decimal],
|
||||
columns: tuple[str, ...] = ("material", "labor", "expense", "total"),
|
||||
label: str = "본표",
|
||||
) -> None:
|
||||
"""㉤ **열 방향** 검사 — 표시된 합계가 상세 줄의 열별 합과 같은가.
|
||||
|
||||
`TC = NC + GC + JC` 는 **행 방향** 검사라 「같은 성분을 두 층에서 세는」 어긋남을
|
||||
못 잡는다(행마다는 다 맞는데 열 합만 갈리는 모양). 그래서 방향을 하나 더 둔다.
|
||||
|
||||
예 — 기계 줄 안에 든 조종원 노무가 별도 노무 줄로도 서면 노무 열만 부풀고
|
||||
행 검사는 전부 통과한다.
|
||||
"""
|
||||
for column in columns:
|
||||
column_sum = sum((Decimal(str(row[column])) for row in rows), Decimal(0))
|
||||
shown = Decimal(str(totals[column]))
|
||||
if abs(column_sum - shown) > _TOLERANCE:
|
||||
raise DoubleCountError(
|
||||
f"{label}: `{column}` 열 합계가 어긋납니다 — 줄 합 {column_sum:,.2f} vs "
|
||||
f"표시 {shown:,.2f}. 같은 성분을 두 층에서 셌을 수 있습니다 "
|
||||
"(행 방향 `TC=NC+GC+JC` 검사로는 안 잡힘)."
|
||||
)
|
||||
|
||||
@@ -21,7 +21,7 @@ from dataclasses import dataclass, field
|
||||
from decimal import Decimal
|
||||
from functools import lru_cache
|
||||
|
||||
from B09_Estimation.B09_Estimation_Guards import check_surcharge_once
|
||||
from B09_Estimation.B09_Estimation_Guards import check_column_sums, check_surcharge_once
|
||||
from B09_Estimation.B09_Estimation_MachineCost import load_machine_catalog
|
||||
from B09_Estimation.B09_Estimation_MachineOperating import (
|
||||
load_fuel_price,
|
||||
@@ -367,6 +367,9 @@ def detail_of(build: UnitPriceBuild, code: str) -> dict:
|
||||
key: sum((Decimal(r[key]) for r in rows), Decimal(0))
|
||||
for key in ("material", "labor", "expense", "total")
|
||||
}
|
||||
# ㉤ 열 방향 검사 — 같은 성분을 두 층에서 세면 여기서 멈춘다.
|
||||
# 행 방향(`TC=NC+GC+JC`)만으로는 안 잡히는 어긋남이다.
|
||||
check_column_sums(rows=rows, totals=summed, label=f"{title.name} 본표")
|
||||
return {
|
||||
"code": code,
|
||||
"name": title.name,
|
||||
|
||||
Reference in New Issue
Block a user