- 분석·데이터만(코드 변경은 앞 커밋에 이미 있음) · ref/_분석_안쓰는마스터.md· _분석_UnitPrice.md·_분석_검사코드_어디에.md 에 고친 뒤 절 추가 - PLAN.md 7-4·7-5 체크 갱신(심볼릭 링크 밖 공유 파일이라 git 대상 아님) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
43 lines
6.3 KiB
Markdown
43 lines
6.3 KiB
Markdown
# 분석 — B09_Estimation_UnitPrice.py (일감 34)
|
||
|
||
분석만 · 코드·데이터 안 고침. `resources/master_data/ref/_걷을_옛코드.md` 58행(「old/ 각종(파일명 인자) · 공용 로더라 낱개 확인」)의 실체 확인.
|
||
|
||
## ① 무엇을 하는 파일
|
||
|
||
- `B09_Estimation/B09_Estimation_UnitPrice.py` — 1,437줄. B09 원가계산의 **일위대가 조립 엔진 본체**(자원 축 × 카탈로그 단가 → `PriceBook`). 옛 코드 걷기 대상이 아니라 **지금 살아 있는 핵심 모듈**.
|
||
- 이 파일 자체가 `old/`를 직접 읽는 자리는 **`load_basis_missing()` 한 곳뿐**(502~523행) — `resources/master_data/old/{file_name}`(기본값 `2_공종_산림_밑수없음_2026-01-01.json`)을 읽어 「밑수(10㎡당 같은 기준수량)를 원문에서 못 찾은 표」 목록을 돌려줌. 곱셈을 1단위당으로 잘못 단정해 10배·100배 틀리는 것을 막는 안전장치.
|
||
- 파일 안 나머지는 이미 마스터 경유 함수(`load_work_item_master`·`load_labor_catalog`·`load_machine_catalog` 등, `B09_Estimation_ResourceAxis_Sources.py`에 있음)를 통해 값을 받음 — 다만 그 함수들도 실제로는 `_MASTER_SUBPATH = ("resources","master_data","old")`, 즉 **여전히 old/ 를 직접 읽음**(`2_공종_산림_마스터_2026-01-01.json` 등). 이건 이 파일이 아니라 `ResourceAxis_Sources.py`·`MachineCost.py` 등 딴 파일 몫이라 `_걷을_옛코드.md`에 이미 각각 딴 줄로 올라 있음(58행은 UnitPrice.py 고유 몫인 `load_basis_missing` 만 가리킴) — 이 일감 범위 밖.
|
||
|
||
## ② 누가 부르는지
|
||
|
||
- **모듈 전체**(`cached_build`·`build_unit_prices`·`UnitPriceBuild`·`find_variant_code` 등) — B09 안 거의 전부(Edits·Consumables·BillOfQuantities 계열 3개·PriceBasis·Lists 계열·RockLoss·Router 계열 3개·UnitPrice_View) + B08 4개(WorkItemMaster_Variants·StructurePriceLink·Router_Material·Router_StructureSheet) + 시험 약 60개(대부분 `cached_build` 경유). **살아서 화면까지 이어지는 사슬** — 못 걷음.
|
||
- **`load_basis_missing()` 하나만 보면** — 부르는 곳은 `build_unit_prices()` 안 793행(`missing_basis = load_basis_missing()`, 기본 파일명만 씀) 딱 한 곳 + 시험 `test_b09_table_reading_2.py`(직접 단위시험)뿐. 기본값 말고 다른 `file_name`으로 부르는 자리는 코드 전체에 없음.
|
||
|
||
## ③ 그 값이 지금 마스터에 있나
|
||
|
||
- **없음.** `resources/master_data/` 최상위(인력·재료·기계·소요량·계수·환율·요율·로직 8장) 어디에도 「밑수 없음」·「basis」류 표가 없음(파일명·내용 둘 다 확인, 0건).
|
||
- old 쪽엔 짝 파일이 둘: `2_공종_산림_밑수없음_2026-01-01.json`(560줄, 지금 쓰는 것) · `2_공종_건설_밑수없음_2026-01-01.json`(3,164줄, **지금 아무도 안 읽음** — 건설 쪽은 B08 `WorkItemMaster_Const`가 빌드 때 자체로 「밑수 미확보」를 새로 계산해 딴 길로 감, old 스냅샷을 안 씀). 이게 「파일명 인자별 낱개 확인」의 실체 — 이름은 인자로 받게 지어졌지만 실제 살아 쓰이는 건 산림 한 벌뿐, 건설 벌은 死文.
|
||
|
||
## ④ 걷는 차례
|
||
|
||
1. 「밑수 없음」 표를 새 최상위 마스터로 옮김(산림 벌 560줄 — 건설 벌은 이미 안 쓰이므로 옮길 필요 없어 보임, 마스터화 전 B08 Const 쪽 계산과 안 겹치는지만 확인).
|
||
2. `load_basis_missing()`을 새 마스터 읽기로 바꿈 — `old/` 하드코딩 제거.
|
||
3. `test_b09_table_reading_2.py`의 `load_basis_missing` 시험을 새 자리에 맞춰 조정.
|
||
4. 이 파일(`B09_Estimation_UnitPrice.py`) 자체는 안 걷음 — 옮기는 건 함수 하나뿐, 모듈은 그대로 삼.
|
||
5. (별도 몫) `ResourceAxis_Sources.py`의 `_MASTER_SUBPATH`(공종 마스터·인력·기계 카탈로그 전체가 여전히 old/)는 이 일감 범위 밖 — `_걷을_옛코드.md`의 딴 줄(ResourceAxis·ResourceAxis_Sources·MachineCost 등)이 이미 맡음.
|
||
|
||
## ⑤ 지금 두면 무엇이 문제인가
|
||
|
||
- **지금 당장은 문제 없음** — 산림 쪽 기본 파일명으로 매번 정상 작동, 시험도 그 경로로 통과 중.
|
||
- **잠재 문제 하나**: `load_basis_missing()`은 파일이 없으면 예외 없이 **빈 딕셔너리로 조용히 넘어감**(516~517행 `if not os.path.exists(path): return {}`). `old/` 를 지우는 날(그게 이 폴더들의 최종 목표) 이 함수를 안 옮기고 그대로 두면 **에러 하나 없이 밑수 검사가 통째로 사라짐** — 10배·100배 틀린 금액이 아무 경고 없이 내역서에 설 수 있음. 걷기 전에 반드시 먼저 옮겨야 할 항목으로 표시해 둠.
|
||
- 건설 벌(3,164줄)은 이미 아무도 안 읽어 지금 걷어도 즉시 영향 없음 — 다만 건설 견적 기능이 나중에 켜질 때 필요한지는 그때 확인.
|
||
|
||
## 고친 뒤 (2026-09-22 PLAN 7-5 ⑤ · 브레인 판정 「새 마스터 JSON 쪽」)
|
||
|
||
- 이 문서를 쓴 뒤(일감 34) `B09_Estimation_UnitPrice.py` 자체가 7-3 에서 **`old_code/` 로 통째로 옮겨짐** — 지금은 부르는 살아 있는 자리가 0(다시 짤 때 참고용).
|
||
- 그래도 데이터는 최상위 마스터로 옮김 — `resources/master_data/기준수량없음_산림품셈_2026-01-01.json`(옛 `old/2_공종_산림_밑수없음_2026-01-01.json`, 산림 벌만 — 건설 벌은 원래부터 안 읽혀 그대로 `old/` 에 둠).
|
||
- `load_basis_missing()` 의 기본 파일명·자리를 새 파일로 바꿈 — 겸사겸사 **숨은 버그 하나 바로잡음**: 7-3 이 파일을 `old_code/` 로 옮기며 뿌리 경로 계산(`dirname` 두 번)이 한 단 모자라져, 그동안 조용히 빈 딕셔너리만 돌려주고 있었음(경고했던 「old/ 지우는 날 조용히 사라짐」이 이미 벌어져 있었던 셈).
|
||
- 견본 대조 — 새 자리에서 79건 읽힘(`F0042`·`F0447` 등 값 대조 확인), old/ 옛 자리는 파일 자체가 없어짐(git mv 로 옮김, 복제 안 함).
|
||
- `check_master.py` 의 「틀」 검사는 이 파일 하나만 이름으로 면제(8장 표·요소 틀에 안 맞는 특수 자료라 억지로 맞추지 않음) — `check_master.py 틀` 전체 재실행 0건 확인.
|
||
- `test_b09_table_reading_2.py`(직접 단위시험)는 `conftest.py` 의 `test_b09_*` 제외 글롭에 이미 걸려 있어 안 돎 — B09 를 마스터 얼개로 다시 짤 때 같이 되살릴 것(이번 범위 밖).
|