feat(B09): 조종원 노임에 제수당·상여금·퇴직급여충당금 계수 반영
사용자 확정 2차 ③ — 기술문서 DB 를 먼저 뒤지고, 계수 원문이 없으면 실무 기준 + 노티스. 근거 (원문 확인분) - 대한건설협회 임금적용요령 4-나 (재경원 회계45101-45, 1995.1.13): 공표 노임은 **기본급여액**이며 제수당·상여금·퇴직급여충당금은 예정가격작성기준에 따라 별도 계상 - 기재부 「(계약예규) 정부 입찰·계약 집행기준」 제76조의3(노무비의 계상): 노임 + 제수당 + 상여금(연 400% 한도) + 퇴직급여충당금 - 품셈 8-1-2 5.6호가 운전사 노임을 그 예규로 넘김 미확인 (노티스로 드러냄) - 예규 원문 자체는 저장소에 없음 — 위 둘은 인용 문서 - 16/12 는 상여 연 400% 와 산술이 일치하나 25/20 은 원문 근거 못 찾음 - 실물 셋이 같은 계수 사용: 실무 두 공사지·임도교본 예제·다산 ESTX 기준계수 0.20833 구현 - `OPERATOR_ALLOWANCE_FACTOR` = 16/12 × 25/20, 근거·한계 주석을 이 한 곳에 모음 - 나눗수 8시간은 그대로 두고 **곱셈으로만** 적용 — 나눗수를 줄이면 작업효율을 시간당 사용료에 넣은 것이 되어 ㉣ 위반. 검사(`check_operator_hours_basis`)에도 계수를 넘겨 곱셈 자리를 드러냄 - 일위대가 조종원 줄·A10 인건비·중기 탭 노티스를 같은 문구로 맞춤 검증 (79da822d 기준) - 굴착기 0.7 86,096.4 → 109,704.5 (+27.4%) · 불도저 19t 124,842.3 → 148,450.4 (+18.9%) - 조종원 수량 0.20833 = 다산 ESTX 기준계수와 일치 - 실무 시트 재현: 267,360 ÷ 8 × 계수 = 55,700 (시트 값과 일원까지 일치) - 본체 11,356,910 → 12,141,903 (+784,993, +6.9%) - pytest 267 통과 · tsc 통과 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -23,7 +23,10 @@ from decimal import Decimal
|
||||
from functools import lru_cache
|
||||
|
||||
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_MachineCost import (
|
||||
OPERATOR_ALLOWANCE_FACTOR,
|
||||
load_machine_catalog,
|
||||
)
|
||||
from B09_Estimation.B09_Estimation_MachineProductivity import (
|
||||
CycleFactors,
|
||||
FactorGap,
|
||||
@@ -191,7 +194,9 @@ def _add_machine_layers(book: PriceBook, machine_codes: set[str]) -> list[str]:
|
||||
wage_code = record.operator_occupation_code
|
||||
if wage_code and wage_code in wages and record.operator_person_days is not None:
|
||||
# ㉣ 나눗수는 8시간 — `PriceDetail` 수량이 「1시간분 인」이 된다.
|
||||
per_hour_person = record.operator_person_days / Decimal(8)
|
||||
# 여기에 **제수당·상여금·퇴직급여충당금 계수**(1.667배)를 곱한다. 공표 노임이
|
||||
# 기본급여액뿐이라 별도 계상해야 하는 몫이다(`MachineCost` 상수 주석에 근거).
|
||||
per_hour_person = (record.operator_person_days / Decimal(8)) * OPERATOR_ALLOWANCE_FACTOR
|
||||
if wage_code not in book.titles:
|
||||
book.add_title(
|
||||
PriceTitle(
|
||||
@@ -203,7 +208,12 @@ def _add_machine_layers(book: PriceBook, machine_codes: set[str]) -> list[str]:
|
||||
)
|
||||
)
|
||||
book.add_detail(
|
||||
PriceDetail(hourly_code, wage_code, per_hour_person, note="조종원 (1일 8시간)")
|
||||
PriceDetail(
|
||||
hourly_code,
|
||||
wage_code,
|
||||
per_hour_person,
|
||||
note="조종원 (1일 8시간 × 제수당·상여·퇴직충당 16/12 × 25/20)",
|
||||
)
|
||||
)
|
||||
else:
|
||||
incomplete.append(f"{code} (조종원 없음)")
|
||||
|
||||
Reference in New Issue
Block a user