- 내역서 note 가 이어 붙이는 조각 20개를 임자 열(규격·수량·단가·금액·줄전체)로 가름 - 덮어쓰는 자리가 더 많아 사유 둘이 겹치면 하나가 사라지는 것을 드러냄 - 화면 비고 칸은 그대로 두고 조각 배열은 호버 카드용으로 따로 실을 것 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GrXDD23Dvt2sR7q3X6oekp
26 KiB
B09 원가계산 화면 — 데이터 원천 조사표
날짜 2026-09-12 · 창 데스크탑 보조(sub_desktop_1) · 근거 PLAN.md 8-36 ⑥ 앞작업
(데스크탑 메인 창 요청, 병렬 조사)
무엇을 적었나 — B09 화면에 실제로 뜨는 열마다 넷을 적음.
① 열 이름(화면에 보이는 그대로) ② 원천(파일:줄) ③ 식(사람이 읽는 한 줄) ④ 등급 후보.
등급 여섯 — 입력(사용자가 넣음) · 측량(앞 단계가 낳음) · 기준(법·품셈·단가판, 고정) ·
계산(중간값) · 최종(내역서·원가로 나가는 값) · 막힘(근거가 없어 못 세움).
⚠ 여섯에 안 맞는 열은 억지로 끼우지 않고 그대로 적었음. 6장에 모아 둠 — 이 조사의 값어치는 거기에 있음.
0. 탭 구성 — 열 개 중 아홉이 살아 있음
B09_Estimation_UI_Page.ts:610 TAB_KEYS · 이름은 ui_template/ui_template_locale_b2.ts:776
| 탭 키 | 화면 이름 | 그리는 자리 | 살아 있나 |
|---|---|---|---|
cost_sheet |
공사원가계산서 | B09_Estimation_UI_Page.ts:250 |
○ |
boq |
설계내역서 | B09_Estimation_UI_Page.ts:911 |
○ |
unit_price |
일위대가 | B09_Estimation_UI_Page.ts:307·366 |
○ |
price_basis |
단가산출근거 | B09_Estimation_UI_Page.ts:1053 |
○ |
machine |
중기 | B09_Estimation_UI_BaseData.ts:156·292 |
○ |
duration |
공사기간 | — | ✕ 막힘(버튼이 눌리지 않음) |
supply |
관급·사급 | B09_Estimation_UI_Page.ts:1113 |
○ |
base_data |
기초자료 | B09_Estimation_UI_BaseData.ts:132·712·945 |
○ |
design_doc |
설계서 구성 | B09_Estimation_UI_BaseData.ts:222 |
○ |
basis_sheet |
산출기초 | B09_Estimation_UI_BaseData.ts:389 |
○ |
1. 공사원가계산서 (cost_sheet)
표 뼈대 B09_Estimation_UI_Page.ts:250 · 열 정의 :257 · 줄을 낳는 곳
B09_Estimation_Engine_Cost.py:252 calculate_cost
1-1. 열 다섯
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 비목 | B09_Estimation_Engine_Cost.py:115 CostLine.name · 법정경비 이름은 B09_Estimation_Statutory.py:58 STATUTORY_ITEMS |
비목 이름표(고정) | 기준 |
| 금액 | B09_Estimation_Engine_Cost.py:124 CostLine.amount_krw (:175 _emitter 가 채움) |
밑수 × 요율% + 정액 을 원 단위 버림(:44 floor_won) |
계산 / 마지막 줄은 최종 |
| 요율 | B09_Estimation_Engine_Cost.py:122 rate_percent ← B09_Estimation_Rates.py:92 load_rate_dataset 의 rates_2026.json |
금액·공사기간 구간으로 고름(B09_Estimation_Rates.py:180 select_bracket) |
기준 |
| 산출근거 | B09_Estimation_Engine_Cost.py:128 formula_text |
"{밑수:,} × {요율}%" (+ 정액이 있으면 + 정액) |
계산 — 이미 있는 것 |
| 비고 | B09_Estimation_Engine_Cost.py:125 note |
채택·미채택 표시 등 자유문 | 여섯 밖 → 6장 ㉮ |
1-2. 줄(비목)마다의 밑수·등급
emit(key=...) 순서대로. 밑수 이름은 B09_Estimation_Statutory.py:52 base_label 이 들고 있음.
| 화면 줄 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 재료비 | Engine_Cost.py:314 |
직접재료비(사용자 입력) | 입력 |
| 간접노무비 | Engine_Cost.py:332 |
직접노무비 × rate_indirect% |
계산 |
| 노무비 | Engine_Cost.py:340 |
직접노무비 + 간접노무비 | 계산 |
| 산재보험료 | Statutory.py:60 |
노무비(직접+간접) × rate_sanjae% |
계산 |
| 고용보험료 | Statutory.py:63 |
노무비(직접+간접) × rate_goyong% |
계산 |
| 국민건강보험료 | Statutory.py:64 |
직접노무비 × rate_health% |
계산 |
| 노인장기요양보험료 | Statutory.py:65 |
국민건강보험료 × rate_care% (앞 줄이 밑수) |
계산 |
| 국민연금보험료 | Statutory.py:66 |
직접노무비 × rate_pension% |
계산 |
| 산업안전보건관리비 | Statutory.py:67 · 셈은 Statutory.py:154 safety_management_cost |
A·B 중 작은 값 (A=요율식, B=대상액×1.2, Statutory.py:42 _SAFETY_B_MULTIPLIER) |
계산 — 식이 「×%」가 아님, 6장 ㉯ |
| 기타경비 | Statutory.py:71 |
(재료비+노무비) × rate_other_expense% |
계산 |
| 환경보전비 | Statutory.py:72 |
직접공사비 × rate_environment% |
계산 |
| 퇴직공제부금비 | Statutory.py:73 |
직접노무비 × rate_retirement_mutual_aid% |
계산 |
| 임금채권보장기금 부담금 | Statutory.py:76 |
노무비(직접+간접) × 율 | 계산 |
| 석면피해구제 분담금 | Statutory.py:82 |
노무비(직접+간접) × 율 | 계산 |
| 건설기계대여대금 지급보증수수료 | Statutory.py:88 |
직접공사비 × 율 | 계산 |
| 하도급대금 지급보증수수료 | Statutory.py:94 |
직접공사비 × 율 | 계산 |
| 공사이행보증수수료 | Statutory.py:100 |
직접공사비 × 공사기간(년) × 율 — 기간이 식에 듦 | 계산 (기간은 입력) |
| 경비 | Engine_Cost.py:358 |
직접경비 + 법정경비 합 | 계산 |
| 순공사원가 | Engine_Cost.py:367 |
재료비+노무비+경비 | 계산 |
| 일반관리비 | Engine_Cost.py:381 |
순공사원가 × rate_overhead% |
계산 |
| 이윤(조정 전) | Engine_Cost.py:462 |
(노무비+경비+일반관리비) × rate_profit% |
계산 |
| 이윤 조정 | Engine_Cost.py:470 |
사용자가 넣은 조정액 | 입력 |
| 이윤 | Engine_Cost.py:479 |
조정 전 + 조정액 | 계산 |
| 총원가 | Engine_Cost.py:392 |
순공사원가 + 일반관리비 + 이윤 | 최종 |
| 부가가치세 | Engine_Cost.py:399 |
총원가 × 10% (Statutory.py:41 _VAT_DIVISOR 와 짝) |
계산 |
| 도급금액 | Engine_Cost.py:407 |
총원가 + 부가세, 천원 단위 올림(Engine_Cost.py:49 ceil_thousand) |
최종 |
| 관급자재 대금 | Engine_Cost.py:496 _owner_supplied_line |
사용자 입력(총원가 밖) | 입력 |
| 폐기물 처리비 | Engine_Cost.py:514 _waste_line |
사용자 입력 | 입력 |
| 총계 | Engine_Cost.py:419 |
도급금액 + 관급 + 폐기물 | 최종 |
1-3. 요율 판 (좌측 패널 「요율 판」 상자)
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 적용일 | B09_Estimation_UI_Page.ts:592 ← rate_version.effective_date |
rates_2026.json 의 기준일 |
기준 |
| 지문 | 같은 자리 rate_version.sha256 앞 8자 |
파일 해시 | 여섯 밖 → 6장 ㉰ |
2. 설계내역서 (boq)
표 뼈대 B09_Estimation_UI_Page.ts:944 (머리글이 innerHTML 문자열로 박혀 있음) ·
줄을 낳는 곳 B09_Estimation_BillOfQuantities_Rows.py
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| No. | BillOfQuantities_Rows.py:139 item_no |
마스터 목차 번호 | 기준 |
| 공종 | :148 name ← B08 HandoffWorkItem.name (없으면 마스터 이름) |
그대로 | 기준 |
| 규격 | :149 spec (갈래가 붙으면 :211 에서 spec + variant_value) |
그대로 / 갈래 이어붙임 | 기준 |
| 단위 | :150 unit |
그대로 | 기준 |
| 수량 | :151 quantity ← B08 이 넘긴 값 · 표시는 UI_Page.ts:793 formatQuantity |
그대로(반영률은 B08 이 이미 곱함, :157 주석) |
측량 |
| 단가 | :290~ unit_price_krw ← unit_prices.book 의 일위대가 합계 |
일위대가 본표 합계 | 계산 |
| 금액 | 같은 곳 amount_krw |
수량 × 단가 | 최종 |
| 비고 | :155·:172·:180·:236·:245·:267 등 여러 자리에서 이어 붙임 |
반영률·갈래 근거·막힘 사유를 / 로 이음 |
여섯 밖 → 6장 ㉮ |
표 밖에 붙는 줄들 (모두 UI_Page.ts:974~1050)
| 화면에 뜨는 것 | 원천 | 등급 후보 |
|---|---|---|
| 내역서 합계 | bill.summary.body_total_krw |
최종 |
| 「금액을 못 세운 줄」 세 갈래 | BillOfQuantities_Rows.py:190·:241·:259·:280 의 result.missing |
막힘 |
| ├ 사용자가 넣으면 풀림 | blocked_kind == "input_missing" |
막힘(원인 입력) |
| ├ 우리가 만들어야 함 | blocked_kind 그 밖 |
막힘 |
| └ 여기서 안 세는 줄 | blocked_kind == "not_our_row" |
여섯 밖 → 6장 ㉱ |
| 검산용 줄(제외) | :110 _excluded_row — 수량만 보이고 단가를 안 붙임 |
여섯 밖 → 6장 ㉱ |
| 자재 줄 | :385 _material_row |
측량 |
3. 일위대가 (unit_price)
3-1. 목록표 — UI_Page.ts:307 · 열 정의 :321
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 명칭 | B09_Estimation_UnitPrice_View.py:149 list_unit_prices |
단가판 제목 | 기준 |
| 단위 | 같은 곳 | 단가판 단위 | 기준 |
| 재료비·노무비·경비 | 같은 곳 ← PriceBook.resolve |
성분별 합 | 계산 |
| 합계 | 같은 곳 | 재료비+노무비+경비 | 계산 |
3-2. 본표 — UI_Page.ts:366 · 열 정의 :412 · 서버 UnitPrice_View.py:171 detail_of
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 명칭 | UnitPrice_View.py:171~ (제잡비는 :196, 공구손료는 :236) |
성분 이름 | 기준 |
| 규격 | 같은 곳 | 성분 규격 / "노무비의 N%" 꼴 |
기준 |
| 원천 | UnitPrice_View.py:257 source_label ← B09_Estimation_UnitPrice.py:1026 SOURCE_LABEL |
자재·노임·기계경비·일위대가·단가산출·일식견적 중 하나 + 순번 | 기준 — 이미 있는 것 |
| 단위 | UnitPrice_View.py:259 부근 |
그대로 | 기준 |
| 수량 | :259 quantity |
품셈 소요량 | 기준 |
| 재료비·노무비·경비 | :264~266 |
단위값 × 수량, 성분별로 자름 | 계산 |
| 합계 | :267 주석 |
자른 성분 셋의 합 (전정밀 합과 끝자리가 다름 — 정상) | 계산 |
표 밖에 붙는 줄 — 「일부만 선 단가」 알림(UI_Page.ts:387 unattached_note)은 막힘,
「반올림 차」(UI_Page.ts:398 precise_total)는 여섯 밖 → 6장 ㉲.
4. 단가산출근거 (price_basis)
목록 UI_Page.ts:1069 · 본문 UI_Page.ts:1097 · 서버 B09_Estimation_PriceBasis.py:74 build_price_basis
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 번호 | PriceBasis.py:31 PriceBasisEntry.number |
차례 매김 | 기준 |
| 공종 | 같은 곳 name+spec |
이어 붙임 | 기준 |
| 단위 | 같은 곳 unit |
그대로 | 기준 |
| 단가 | 같은 곳 unit_price_krw |
한 층 아래 일위대가의 합계 | 계산 |
| (본문) 참조 | UI_Page.ts:1105 ref_code |
한 층 아래 코드를 가리킴 | 여섯 밖 → 6장 ㉳ |
⚠ 이 탭은 내역서(bill)를 먼저 불러야 뜸 (UI_Page.ts:1054). 안 불러오면 안내문만 뜸.
5. 나머지 여섯 탭
5-1. 중기 (machine)
중기목록표 B09_Estimation_UI_BaseData.ts:164 · 서버 B09_Estimation_Lists.py:105 machine_list
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 코드번호·명칭·규격·단위 | Lists.py:105 ← 기계 카탈로그 |
그대로 | 기준 |
| 합계 | Lists.py:105 total_krw |
노무비+재료비+경비 | 계산 |
| 노무비 | 같은 곳 | 조종원 노임 ÷ 8 × 16/12 × 25/20 (B09_Estimation_MachineCost.py:74 OPERATOR_ALLOWANCE_FACTOR) |
계산 |
| 재료비 | 같은 곳 | 주연료 + 잡재료(주연료의 %) | 계산 |
| 경비 | 같은 곳 | 시간당 손료 | 계산 |
| 비고 | 같은 곳 | 자유문 | 여섯 밖 → 6장 ㉮ |
각종 중기경비계산서 UI_BaseData.ts:292 machineExpenseSheet · 서버
B09_Estimation_MachineExpenseSheet.py:81 machine_expense_sheets
| 줄 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| ① 취득가격(천원) | MachineExpenseSheet.py:81~ |
카탈로그 값 | 기준 |
| ① 내용시간 / 연간표준가동시간 | 같은 곳 | 품셈 값 | 기준 |
| ① 상각비·정비비·관리비 계수(10⁻⁷) | 같은 곳 | 셋을 더해 손료계수 | 기준 |
| ① 시간당 손료 | 같은 곳 | 취득가격 × 손료계수 | 계산 |
| ② 주연료 × 유가 | 같은 곳 · 유가는 B09_Estimation_Lists_Sources.py:137 base_reference_data |
주연료(L/hr) × 경유 단가 | 계산(유가는 기준, 지역 선택은 입력) |
| ② 잡재료(주연료의 %) | 같은 곳 | 주연료비 × % | 계산 |
| ② 조종원 일당 → 시간당 | MachineCost.py:49·:74 |
일당 ÷ 8 × 1.667 | 계산 |
| ③ 재료비/노무비/경비·합계 | 같은 곳 | ①+② 를 성분으로 가름 | 계산 |
⚠ 못 채운 자리(gaps) |
MachineExpenseSheet.py:81~ |
— | 막힘 |
5-2. 관급·사급 (supply)
UI_Page.ts:1146 · 서버 B09_Estimation_MaterialSheet.py:117 build_material_sheet
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 자재·규격·단위 | MaterialSheet.py:47 MaterialSheetRow |
그대로 | 기준 |
| 수량 | 같은 곳 total_amount |
B08 수량 × 할증 | 측량 |
| 단가 | 같은 곳 unit_price_krw |
단가판 값 | 기준 |
| 금액 | 같은 곳 amount_krw |
수량 × 단가 | 최종 |
| 비고 | 같은 곳 note |
자유문 | 여섯 밖 → 6장 ㉮ |
세 무리(사급 / 관급 / 안 갈린 것)는 UI_Page.ts:1136 에서 가름. 관급은 총원가 밖,
안 갈린 것은 어느 합계에도 안 듦 → 여섯 밖 → 6장 ㉱.
5-3. 기초자료 (base_data)
목록표 셋 UI_BaseData.ts:132 · 열 :111 catalogTable · 서버 B09_Estimation_Lists.py:50 catalog_list
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 코드번호·명칭·규격·단위 | Lists.py:50 |
단가판 그대로 | 기준 |
| 단가 | 같은 곳 | 단가판 그대로 | 기준 |
| 비고 | 같은 곳 | 자유문 | 여섯 밖 → 6장 ㉮ |
⚠ 재료비목록표가 거의 비어 있음 (UI_BaseData.ts:143 경고문) — 사급 자재 카탈로그가 안 섬 → 막힘.
자재단가대비표 UI_BaseData.ts:533 comparisonTable · 서버
B09_Estimation_Lists_Sources.py:79 material_price_comparison
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 코드번호·명칭·규격·단위 | Lists_Sources.py:79 |
그대로 | 기준 |
| (원천마다) 단가 | 같은 곳 slots[].price_krw |
물가지·견적 등 원천별 값 | 기준 |
| (원천마다) 페이지 | 같은 곳 slots[].source_note |
쪽수·출처 문구 | 기준 — 이미 있는 것 |
| 적용 | 같은 곳 adopted_price_krw·adopted_slot |
다섯 중 채택한 하나 | 계산 |
| 비고 | 같은 곳 note |
자유문 | 여섯 밖 → 6장 ㉮ |
환율및기초자료 UI_BaseData.ts:607 baseReferenceSections · 서버 Lists_Sources.py:137
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| ① 환율 | Lists_Sources.py:137 |
안내문뿐(값 없음) | 막힘 |
| ② 코드번호·직종 | 같은 곳 | 노임판 그대로 | 기준 |
| ② 일당 | 같은 곳 day_wage_krw |
공표 노임 | 기준 |
| ② 시간당 | 같은 곳 hourly_krw |
일당 ÷ 8 (자르지 않고 소수 그대로, UI_BaseData.ts:634 주석) |
계산 |
| ② 산식 | 같은 곳 formula |
사람이 읽는 한 줄 | 계산 — 이미 있는 것 |
| ③ 경유 단가·적용 범위·기준일·자료 | 같은 곳 fuel |
공시가(전국 또는 시도) | 기준(범위 선택은 입력) |
산출 조건 UI_BaseData.ts:945 drawFactorChoices · 서버 B09_Estimation_FactorChoices.py:111 scan_range_factors
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 계수 이름·품셈 범위 | FactorChoices.py:62 RangeFactor |
품셈이 준 범위 | 기준 |
| 고른 값(상·중·하) | FactorChoices.py:57 CHOICE_KEYS·:58 DEFAULT_CHOICE |
사용자 선택(기본 mid) |
입력 |
| 근거 문구 | FactorChoices.py:162 BASIS_NOTES |
고정 문구 | 기준 |
5-4. 설계서 구성 (design_doc)
UI_BaseData.ts:222 · 서버 B09_Estimation_DesignDocIndex.py:164 design_doc_index
| 열 이름 | 원천 | 식 | 등급 후보 |
|---|---|---|---|
| 차례·이름 | DesignDocIndex.py:38 DESIGN_DOC_ITEMS |
법이 정한 목차 | 기준 |
| 상태 | DesignDocIndex.py:25~27 (있음/반쪽/없음) |
우리가 내는 것과 맞대 봄 | 여섯 밖 → 6장 ㉴ |
| 누가 만드나 | DesignDocIndex.py:29~30 |
프로그램 / 설계자·발주청 | 여섯 밖 → 6장 ㉴ |
| 어디서 나오나 | 같은 곳 where |
화면·파일 이름 | 여섯 밖 → 6장 ㉴ |
| 비고 | 같은 곳 note |
자유문 | 여섯 밖 → 6장 ㉮ |
⚠ 이 표는 프로젝트 값이 아님 — 「우리가 무엇을 내는가」의 표(UI_Page.ts:1219 주석).
5-5. 산출기초 (basis_sheet)
UI_BaseData.ts:389 · 서버 B09_Estimation_BasisSheet.py:148 basis_sheet
| 절 | 열 이름 | 원천 | 등급 후보 |
|---|---|---|---|
| ① 어느 판으로 계산했나 | 자료·파일·기준일·지문 | BasisSheet.py:44 dataset_versions |
기준 (지문은 6장 ㉰) |
| ② 무엇을 골랐나 | 항목·고른 값 | BasisSheet.py:77 chosen_conditions |
입력 |
| ③ 공종마다 무엇을 근거로 | 코드·공종·단위·근거 | BasisSheet.py:106 work_item_basis |
기준 — 이미 있는 것 |
| ④ 못 채운 자리 | 갈래·코드·사유 | BasisSheet.py:134 open_gaps |
막힘 |
⚠ 여기서 값을 다시 계산하지 않음 — 모으기만 함 (UI_BaseData.ts:359 주석). 즉 ③ 이 이미
사전의 절반임.
5-6. 공사기간 (duration) — 통째로 막힘
TAB_KEYS 에서 enabled=false (UI_Page.ts:616). 버튼이 눌리지 않고 「준비 중」만 뜸.
그런데 공사이행보증수수료 식에 공사기간(년)이 이미 들어감(Statutory.py:100) —
값은 좌측 패널 「공사 조건 · 공사기간」 입력칸에서 옴. → 막힘 이되 원인은 입력.
6. 여섯에 안 맞는 것 — 이 조사의 알맹이
억지로 안 끼우고 그대로 적음. ㉮~㉴ 일곱 갈래.
㉮ 「비고」 — 등급을 못 붙이는 열 (거의 모든 표에 있음)
내역서·중기·자재대·기초자료·설계서 구성이 모두 「비고」를 가짐. 안에 들어 있는 것이 섞여 있음 —
갈래 판정 근거(BillOfQuantities_Rows.py:155), 반영률 안내(:157·:165),
주의 문구(:180 ⓘ), 막힘 사유(:186). 같은 칸에 원천이 다른 글이 들어감.
→ 제안 — 비고는 등급을 붙일 열이 아니라 다른 열의 근거를 담는 그릇임. 등급 여섯에 넣지 말고
호버 카드의 「곁말」 자리로 빼는 것이 맞아 보임. 지금처럼 / 로 이어 붙이면 호버에서 갈라 보일
수 없음 — 서버가 조각 배열로 보내야 함.
㉯ 「A·B 중 작은 값」 — 계산 이 못 담는 식
산업안전보건관리비(Statutory.py:154)는 두 길로 셈해 작은 쪽을 씀. formula_text 도 이 줄만
× % 꼴을 안 씀(Engine_Cost.py:133 이 이 키를 따로 뺌).
→ 제안 — 계산 안에 「고름」 성격이 숨어 있음. 이런 줄은 호버에 두 후보값과 왜 그것을
골랐나를 함께 보여야 함. 등급을 늘릴 것인지, 계산 의 하위 성질로 둘 것인지 결정 필요.
같은 성격이 하나 더 있음 — 자재단가대비표의 「적용」(원천 다섯 중 하나 채택, Lists_Sources.py:79).
㉰ 「지문(sha256)」 — 값이 아니라 재현성 표식
요율 판 지문(UI_Page.ts:594)과 산출기초 ①(BasisSheet.py:44)에 나옴. 사용자가 넣은 것도,
계산한 것도, 법이 정한 것도 아님.
→ 제안 — 등급을 붙이지 말고 모든 칸의 호버 카드에 공통으로 따라붙는 꼬리표로 두는 편이 나아 보임(「이 값은 어느 판·어느 지문으로 섰나」).
㉱ 「여기서 안 세는 줄」 — 막힘 과 뜻이 정반대
셋이 같은 성격임 — 내역서의 not_our_row(UI_Page.ts:1015), 검산용 제외 줄
(BillOfQuantities_Rows.py:110), 자재대의 「안 갈린 것」(UI_Page.ts:1139).
못 세운 것이 아니라 세면 안 되는 것임. 막힘 에 넣으면 사용자가 채우려 들고 그것이 곧
이중계상임(화면 주석이 이미 그렇게 경고함, UI_Page.ts:1010).
→ 제안 — 일곱째 등급 「제외」가 필요해 보임. 아니면 막힘 을 「못 세움 / 안 셈」 둘로 가름.
⚠ 이것이 이번 조사에서 가장 확실한 어긋남임 — B08 토적표에도 같은 성격의 줄이 있을 것임.
㉲ 「반올림 차」 — 값이 아니라 표시의 성질
일위대가 본표의 precise_total ≠ total(UI_Page.ts:398), 내역서의 자릿수 안내
(UI_Page.ts:981), 노임 시간당을 안 자르는 규칙(UI_BaseData.ts:634).
→ 제안 — 등급이 아니라 칸마다의 「자른 자리」 표기로 다루는 것이 맞아 보임 (호버에 「표시 N자리 · 계산 전정밀」).
㉳ 「참조(ref_code)」 — 값이 아니라 한 층 아래로 가는 길
단가산출근거의 참조(UI_Page.ts:1105), 일위대가 본표의 파고들기(UnitPrice.py:1037 DRILLABLE_KINDS).
→ 제안 — 이것이 PLAN 8-36 ⑤ 의 「원천은 글로만 적음」과 같은 자리임. B09 안에서는 이미 눌러서 내려갈 수 있음 — 화면 밖(B05·B06)으로 나갈 때만 글로만 적으면 됨.
㉴ 설계서 구성표 — 프로젝트 값이 아닌 표
「상태 / 누가 만드나 / 어디서 나오나」 세 열은 프로젝트 숫자가 아니라 우리 개발 상태임.
→ 제안 — 이 탭은 사전·호버 대상에서 아예 빼는 것이 맞아 보임. 등급을 억지로 붙이면 사전이 「프로그램 진척표」까지 떠안게 됨.
7. 있는 것 / 없는 것
이미 있어 그대로 쓸 것 (넷)
| 무엇 | 어디 | 덮는 범위 |
|---|---|---|
formula_text |
Engine_Cost.py:128 |
원가계산서 줄 전부 — 식 |
source_label·source_index |
UnitPrice_View.py:256 ← UnitPrice.py:1026 |
일위대가 본표 줄 — 원천 |
base_label |
Statutory.py:52 |
법정경비 14 줄 — 밑수 이름 |
산출기초 ③ work_item_basis |
BasisSheet.py:106 |
공종마다의 근거 문구 |
(덤) 자재단가대비표 source_note |
Lists_Sources.py:79 |
자재 단가의 쪽수·출처 |
없어서 새로 만들어야 할 것
| 무엇 | 어느 표가 비었나 |
|---|---|
| 식 | 내역서(수량·단가·금액) · 중기목록표 · 자재대 · 기초자료 목록표 셋 |
원천(파일:줄) |
전부 없음 — 지금은 어느 표도 「어느 코드가 이 값을 냈나」를 안 들고 있음 |
| 등급 | 전부 없음 |
| 밑수 이름 | 법정경비 밖 — 일반관리비·이윤·부가세는 formula_text 안에 숫자로만 들어감 |
| 칸 단위 곁말 | 비고를 / 로 이어 붙이는 자리 전부(㉮) — 조각 배열로 바꿔야 함 |
8. 다음에 할 것
- ㉱(제외 등급)를 먼저 결정 — 등급 여섯의 밑동이 바뀌는 자리라 나머지보다 앞섬. B08 토적표 쪽에도 같은 성격 줄이 있는지 맞대 볼 것.
- ㉮(비고 그릇)는 서버가 조각 배열로 보내도록 바꾸는 일이 딸림 — 사전 뼈대와 같이 설계할 것.
- ㉴(설계서 구성표)는 사전 대상에서 빼는 것으로 정리하면 표 하나가 통째로 줄어듦.
- 사전 파일은
B09_*700줄 넘은 파일들에 넣지 말고 새 파일로 뺄 것 (PLAN.md 8-36 끝 ⚠ 그대로).
9. 줄 사유 → 닿는 열 지도 (㉮ 배선용, 2026-09-12 추가)
데스크탑 메인 창 당부 ② — 줄 사유는 그 사유가 닿는 열에만 붙일 것(B08 에서 「절토 보정량」
카드에 「측구 가름값이…」 가 떠서 읽는 사람을 속인 사고). resolveExtra 에서 열 키로 거르려면
어느 조각이 어느 열 것인지를 먼저 못 박아야 함. 내역서 note 가 지금 / 로 이어 붙이는
조각 전부를 그 임자 열에 갈라 놓음.
| 조각 | 만드는 자리 | 닿는 열 | 지금 꼴 |
|---|---|---|---|
갈래 판정 근거(spec_class_basis) |
BillOfQuantities_Rows.py:154 |
규격 | / 로 이음 |
주의 문구 ⓘ(막힘 아님 — 기본값으로 섰다는 알림) |
:180 |
규격 | / 로 이음 |
관경이 표 밖(pipe_diameter_note) |
:228 |
규격 | / 로 이음 |
| 반영률 적용 후 수량(단일 율) | :157 |
수량 | 덮어씀 |
| 반영률이 갈래마다 다름 | :165 |
수량 | 덮어씀 |
| 묶음 조각이 덜 참 · 묶음 N조각 합계 | :86·:106 |
수량 | 덮어씀 |
수량이 미확정 산식 위에 섬(pending_formula_note) |
:335 |
수량 | / 로 이음 |
막힘 사유(blocked_kind 있음) |
:186 |
단가 | 덮어씀 |
| 일위대가가 한 층 아래에 있음(후보 N건) | :224 |
단가 | 덮어씀 |
| 성분이 빠져 못 세움 | :236 |
단가 | 덮어씀 |
| 일위대가가 아직 없음 | :239 |
단가 | 덮어씀 |
| 밑수(기준 수량) 못 찾음 — 곱하지 않음 | :257 |
단가 | 덮어씀 |
| 단가가 일부만 섬(붙은 몫 N%) | :278 |
단가 | 덮어씀 |
| 기준 단위가 표에 없음 — 같다고 보고 곱함 | :297 |
단가 | / 로 이음 |
원문엔 있는데 단가에 못 실린 몫(known_gap_note) |
:341 |
단가 | / 로 이음 |
단산 참조번호(entry.label, 「단산 46」) |
BillOfQuantities.py:517 |
단가 | / 로 앞에 붙임 |
| 단위 불일치 — 곱하면 틀리므로 비워 둠 | :314 |
금액 | 덮어씀 |
| 검산용 줄 — 금액을 안 매김 | :170 |
줄 전체(excluded) |
덮어씀 |
| 관급·사급이 안 갈림 | :398 |
줄 전체(excluded) |
덮어씀 |
| 관급/사급 자재 단가 미확보 | :411·:418 |
단가 | 덮어씀 |
⚠ 덮어쓰는 자리가 더 많음 — 지금은 앞 조각을 지우고 새로 적는 곳이 대부분이라, 한 줄에
사유가 둘이면 하나가 조용히 사라짐. 조각 배열로 바꿀 때 이 자리들도 함께 append 로
고쳐야 함(단순히 / 를 배열로 바꾸는 것만으로는 안 됨).
⚠ 화면 비고 칸은 그대로 둘 것 — 조각 배열은 호버 카드용으로 따로 실음. 지금 비고를
없애면 토글을 끈 사용자가 사유를 못 봄.