From 4367eb916471048c182fc7e1207c7f24b38b2ac2 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 12:15:02 +0900 Subject: [PATCH] =?UTF-8?q?knowledge(B08B09):=20=EC=98=AE=EA=B8=B0?= =?UTF-8?q?=EA=B8=B0=20=EC=A0=84=20=EC=A4=80=EB=B9=84=20=EB=B6=84=EC=84=9D?= =?UTF-8?q?=20=E2=80=94=20=EB=B6=80=EB=A5=B4=EB=8A=94=20=EB=AA=A8=EB=93=A0?= =?UTF-8?q?=20=EC=9E=90=EB=A6=AC=C2=B7B07=20=EC=9D=B4=EC=8B=9D=20=EB=82=9C?= =?UTF-8?q?=EC=9D=B4=EB=8F=84=C2=B7=ED=8C=8C=EC=9D=BC=ED=91=9C=C2=B7?= =?UTF-8?q?=EC=B0=A8=EB=A1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit B08_*·B09_* 를 부르는 밖의 자리를 모두 훑음(파이썬 2·main.py 13·화면 라우트 5· common_util 문자열 3·시험 25). B07 이 부르는 SlopeLength·SlopeArea·StructureFigure 의 이식 난이도를 가름 (앞 둘 쉬움 · StructureFigure 는 Pipe·StructureSheet·UnitQuantity 가 딸려 어려움). B08·B09 파일·줄 수 표 · 옮긴 뒤 빈 화면에 남길 최소한 · 옮기는 차례를 PLAN 7-3 확정 차례(먼저 옮기고 깨지는 대로 봄)에 맞춰 정리. 코드는 하나도 안 고침. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ --- .../master_data/ref/_분석_B08B09_옮기기.md | 236 ++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 resources/master_data/ref/_분석_B08B09_옮기기.md diff --git a/resources/master_data/ref/_분석_B08B09_옮기기.md b/resources/master_data/ref/_분석_B08B09_옮기기.md new file mode 100644 index 00000000..d3f1f970 --- /dev/null +++ b/resources/master_data/ref/_분석_B08B09_옮기기.md @@ -0,0 +1,236 @@ +# 분석 — B08·B09 를 `old_code/` 로 옮기기 전 준비 (PLAN 7-3 앞 절반 · 일감) + +읽기만 함 · 코드 하나도 안 고침. `_분석_B08B09_초기화.md`(일감 36) 뒤를 이음 — 그 문서는 「무엇을 마스터로 갈아끼울 수 있나」, 이 문서는 「어디부터 끊기고 어떤 차례로 옮기나」. + +## 0. 자리(옮길 곳) + +sub3 의 7-1 이 아직 `old_code/` 를 안 씀(확인: `old_code/` 안에 `Z01_MasterData/` 하나뿐). sub4 의 7-2 가 이미 `old_code/` 를 만들어 씀 — **같은 자리**. 옮기면 `old_code/B08_Quantity/` · `old_code/B09_Estimation/` 가 됨. + +## 1. `B08_*` · `B09_*` 를 부르는 모든 자리 + +B08·B09 **안**에서 서로 부르는 자리(내부 계산)는 뺌 — 지시대로 **밖**에서 부르는 자리만. + +### 1-1. 파이썬 — 화면·엔진 쪽 (2 자리) + +| 파일 | 줄 | 부르는 것 | 부르는 쪽 | +|---|---|---|---| +| `B06_Section/B06_Section_Server_Calc_Prebuild.py:79` | `from B08_Quantity.B08_Quantity_Router_Material import project_haul_inputs` | 운반조건 미리 채우기 | B06 | +| `B07_DesignDetail/B07_DesignDetail_Engine_Cad_StandardSheet.py:36,39,40` | `B08_Quantity_Engine_StructureFigure` 의 `build_figure`(as `figure_shapes`) · `figure_reason` | 표준도 상단 그림 · 그림 없는 사유 | B07 | +| `B07_DesignDetail/B07_DesignDetail_Engine_Cross_Quantity.py:37,38` | `B08_Quantity_Engine_SlopeArea` 의 `PROTECTION_SOURCE`·`_key`·`_length_of` · `B08_Quantity_Engine_SlopeLength` 의 `station_slope` | 횡단 수량(비탈 면적·길이) | B07 | + +### 1-2. `main.py` — 라우터 등록 (13 개) + +`main.py:63~76` import 8 줄 + `main.py:647~659` `include_router` 13 개(B08 5: `b08_quantity_router`·`b08_earthwork_router`·`b08_material_router`·`b08_structure_sheet_router`·`b08_stmate_library_router` · B09 8: `b09_estimation_router`·`b09_cost_sheet_router`·`b09_contract_router`·`b09_execution_router`·`b09_progress_router`·`b09_edits_router`·`b09_factors_router`·`b09_material_prices_router`). + +### 1-3. 화면(TS) — 라우트 등록 (Z01 때와 같은 자리 다섯) + +| 파일 | 줄 | 무엇 | +|---|---|---| +| `A00_Common/router.ts:52~55` | 라우트 핸들러(동적 import) | +| `A00_Common/router.ts:117~118` | `workflowRoutes`(로그인·회사 확인 뒤 렌더하는 목록) | +| `A00_Common/main.ts:25~26` | `FOOTERLESS_ROUTES`(푸터 안 보임) | +| `A00_Common/b_workflow_nav.ts:29~30` | 워크플로 진행 막대(단계 아이콘·이름) | +| `config/config_frontend.ts:113~114,138~139` | `ROUTES` 키 · `PROTECTED_ROUTES` | + +※ Z01 은 **끊었지만** B08·B09 는 **남겨야 함** — 7-3 의 끝 모습이 「메뉴와 주소는 남고 빈 화면」이라 이 다섯 자리는 손대지 않음(라우트 핸들러 안쪽 import 대상 파일만 새 얇은 파일로 바뀜). + +### 1-4. `common_util` — 폴더 이름 문자열 (실제 import 아님, 3 자리) + +| 파일 | 줄 | 무엇 | 옮기면 깨지나 | +|---|---|---|---| +| `common_util/common_util_node_bundle.py:23` | `SOURCE_DIRS`에 `"B08_Quantity"` | 서버 Node 번들(구조물도 식 풀이)이 낡았는지 재는 감시 대상 폴더 | **깨짐 아님·엷어짐** — `B08_Quantity_Formula.ts`·`_Formula_Node.ts`(식 풀이 껍데기)가 딴 자리로 안 가면 감시가 헛돎 | +| `common_util/common_util_project_reset.py:28~29` | `OUTPUT_STAGE_DIRS`에 `"B08_Quantity"`·`"B09_Estimation"` | 프로젝트 초기화 때 지우는 **프로젝트 저장소** 단계 폴더 이름(소스 폴더 아님) | 안 깨짐 — 프로젝트별 storage 이름표라 소스 이동과 무관 | +| `common_util/common_util_storage.py:20~21` | `PROJECT_STORAGE_LAYOUT_V2`에 `("B08_Quantity","quantities")`·`("B09_Estimation","v1")` | 위와 같음(저장 경로 이름표) | 안 깨짐 | + +`common_util/common_util_work_item_key.py` 머리글은 `B08_Quantity_Engine_Handoff.build_handoff`·`B09_Estimation_BillOfQuantities_Input.parse_handoff` 이름을 **글로만** 적음(import 아님) — 옮기면 이 두 함수가 어디로 갔는지만 다시 적으면 됨. + +`common_util/common_util_masonry_slope.ts` 머리글은 「파이썬과 짝」이라며 `B08_Quantity_Engine_UnitQuantity_StoneSpec.face_slope_ratio` 를 가리킴(CLAUDE.md 5장 ① 파이썬·TS 짝 규칙) — **StoneSpec 을 옮기면 이 TS 파일과의 짝이 깨짐**, B06 쪽에서 같이 손볼 자리. + +### 1-5. 시험 — 두 갈래 + +- `test_b08_*.py` 91개 · `test_b09_*.py` 69개는 **이미 `resources/tester/conftest.py` 의 `collect_ignore_glob`에 있어 안 모여짐** — 옮겨도 안 깨짐(그대로 둠, PLAN 7-3 이 이미 확정). +- **그 밖에 B08·B09 를 부르는 시험 24개**는 이름이 `test_b08_`·`test_b09_` 가 아니라서 **지금 모여지고 있음** — 옮기면 이 시험들이 깨짐: + + `test_b05_empty_means_select.py` · `test_b05_not_in_table_marks.py` · `test_b05_registry_fill_a2_a3.py` · `test_b05_retaining_wall_height_default.py` · `test_b05_revetment_sabang_basis.py` · `test_b06_b08_wall_thickness_match.py` · `test_b06_wall_lean_table.py` · `test_b07_sheet_key_place.py` · `test_b07_standard_figure_reason.py` · `test_b07_standard_sheet_rows.py` · `test_b07_standard_spec_blinding_weep.py` · `test_b10a_rules_visible_b05_b09.py` · `test_common_aliases.py` · `test_double_count_boundaries.py` · `test_form_const.py` · `test_haul_limit_setting.py` · `test_haul_state_natural.py` · `test_pum_edition.py` · `test_revetment_stone_fields.py` · `test_work_item_key_gate.py` · `test_work_item_key_registry.py` · `test_work_item_link_choice.py` · `test_work_item_master_const.py` · `test_work_item_master_toc.py` · `test_work_item_master_variants.py`(25개 — 일감 지시의 「시험」 칸에 해당). + + 이 가운데 `test_b07_*` 넷(`sheet_key_place`·`standard_figure_reason`·`standard_sheet_rows`·`standard_spec_blinding_weep`)은 **1-1 의 B07 이식과 같은 함수를 씀** — B07 로 함수를 옮겨 적을 때 이 시험도 같이 옮기면 판정값이 그대로 살아남음. 나머지 21개는 B08·B09 안의 계산(`build_table`·`build_handoff`·`build_bill`·공종 마스터 열쇠 따위)을 직접 시험하는 것이라 **7-3 이 「계산 로직은 안 살림」으로 확정한 자리와 겹침** — 살릴 계산이 없으면 이 시험도 `old_code/resources/tester/` 로 같이 옮기는 쪽이 맞음(개별 재검토는 옮기는 걸음에서). + +## 2. B07 이 부르는 것 — 옮겨 적기 난이도 + +7-0 확정대로 **B07 → B08 → B09** 가 옳은 흐름이라, 지금 B07 이 B08 함수를 빌려 쓰는 아래 자리들을 B07 의 새 파일로 옮겨 적어야 함. + +| 함수 | 줄(자기 몸통) | 무엇을 읽나 | 딸린 것(같이 옮겨야 함) | 이식 난이도 | +|---|---|---|---|---| +| `SlopeLength.station_slope` | 245~278(34줄) | `design`(횡단 설계 dict) · `chainage_m` — **순수 함수**(DB·마스터 안 읽음) | `SlopeSegment`·`StationSlope`(dataclass) · 내부 헬퍼 6개(`_ratios`·`_match`·`_outward`·`_side_segments`·`_material`·`_roadbed_width`) — 파일째 287줄 다 딸림. **B08 안의 다른 모듈을 하나도 안 부름**(`import` 가 `math`·`dataclasses`·`typing` 뿐) | **쉬움** — 파일째 그대로 옮겨도 됨 | +| `SlopeArea.PROTECTION_SOURCE`·`_key`·`_length_of` | 각각 1·4·14줄 | `StationSlope`(위 파일의 결과) | `SlopeArea.py` 191줄 전체가 `SlopeLength` 만 부름(다른 B08 모듈 없음) — `build_rows`·`totals`·`build_table` 도 같이 옮기면 사면 면적·집계까지 한 번에 이식됨 | **쉬움** — `SlopeLength` 와 한 벌로 옮기면 끝 | +| `StructureFigure.build_figure` | 178~302(그림 유형별 `_masonry_figure`·`_wall_figure` 포함 시 178~451, 274줄) | `sheet`(표준도 장 dict) | **B08 안의 다른 모듈 셋을 부름** — `B08_Quantity_Engine_Pipe.NOTE_DEFAULT_WALL` · `B08_Quantity_Engine_StructureSheet.sheet_is_wet`·`slope_of` · `B08_Quantity_Engine_UnitQuantity`(여러 개) · `common_util_excavation` | **어려움** — 그림 함수 하나만 뽑아도 StructureSheet·UnitQuantity·Pipe 의 일부가 줄줄이 딸려 옴. 옮기려면 이 세 모듈에서 필요한 조각만 먼저 추려야 함(통째 이식 금지 원칙과 부딪힘 — **먼저 사용자와 범위를 다시 정할 자리**) | +| `StructureFigure.figure_reason` | 107~127(21줄) | `sheet` | 위와 같은 파일 안이라 import 는 같이 옴 — 함수 자체는 얕음(그림 없는 사유 문구만 만듦) | **중간** — `build_figure` 를 옮길 때만 딸려 옴 | + +결론 — `SlopeLength`·`SlopeArea` 둘은 **파일째 그대로** B07 의 새 파일(가칭 `B07_DesignDetail_Engine_SlopeGeometry.py`)로 옮겨 적으면 하루 안에 끝남. `StructureFigure` 는 Pipe·StructureSheet·UnitQuantity 와 얽혀 있어 **가장 나중에**, 필요하면 범위를 좁혀(그림 유형 셋 가운데 실제 쓰는 것만) 다시 짜는 쪽이 나을 수 있음 — 뒤 걸음에서 실제로 부딪혀 보고 정함. + +## 3. B08 · B09 폴더 — 파일과 줄 수 + +내부 계산이라 옮겨 적지 않지만(7-3 확정), 옮기는 순서를 잡으려면 무엇이 있는지부터 알아야 함. 줄 수가 작은 것부터. + +### 3-1. B08_Quantity (파이썬 61 · 화면 24 · 합 26,451줄) + +| 줄 | 파일 | 무엇 | +|---|---|---| +| 25 | `B08_Quantity_Formula_Node.ts` | 구조물도 식 풀이를 서버가 돌리는 진입점(저장·확정 때 정본으로 다시 풂) | +| 26 | `B08_Quantity_Engine_Preparation_Status.py` | 준비공 줄의 상태 낱말 | +| 28 | `B08_Quantity_Engine_Formula.py` | 구조물도 식 풀이 — 서버가 부르는 껍데기(계산은 없음) | +| 40 | `B08_Quantity_Router_Earthwork_HaulPlan.py` | 산출 조건 저장 뒤 운반계획 다시 세우기 | +| 40 | `B08_Quantity_UI_Side_SeedSpray.ts` | 산출 조건 「초류종자살포 비탈면 토질」 칸 | +| 56 | `B08_Quantity_Router.py` | B08 라우터 셸(확정 버튼만) | +| 56 | `B08_Quantity_UI_Side_BenchCut.ts` | 산출 조건 「층따기 길이」 칸 | +| 59 | `B08_Quantity_UI_Side_RootRemoval.ts` | 산출 조건 「제근 굴착기 크기」 칸 | +| 64 | `B08_Quantity_UI_SidePanel_Sections.ts` | 산출조건 패널 공통 상자 | +| 72 | `B08_Quantity_Build_WorkItemMaster_Parents.py` | 공종 마스터 — 부모 공종 모양 | +| 80 | `B08_Quantity_UI_StructureFigure.ts` | 구조물도 상단 그림 SVG | +| 81 | `B08_Quantity_Engine_Preparation_FrameMaterial.py` | 준비공 — 규준틀 재료 줄 | +| 85 | `B08_Quantity_Build_WorkItemMaster_Variants.py` | 공종 마스터 — 갈래 키 | +| 90 | `B08_Quantity_Wording.py` | 화면 문구(키 이름 안 보임) | +| 110 | `B08_Quantity_Engine_RockSplit.py` | 암 운반량 구성비 가르기 | +| 124 | `B08_Quantity_UI_Side_FaceDressing.ts` | 산출 조건 「면고르기」 구획 | +| 131 | `B08_Quantity_UI_Side_TreeWaste.ts` | 산출 조건 「임목폐기물」 구획 | +| 132 | `B08_Quantity_Engine_Formwork.py` | 거푸집 사용횟수 | +| 135 | `B08_Quantity_Engine_BasisUnit.py` | 품셈 밑수 단위 대조 | +| 138 | `B08_Quantity_Engine_Preparation_Ancillary.py` | 준비공 — 부대시설·가설공사 | +| 144 | `B08_Quantity_UI_StructureSheet_Stmate.ts` | 라이브러리 「STmate 엑셀에서 뽑기」 칸 | +| 148 | `B08_Quantity_Engine_HaulInputs.py` | 유토곡선 구조물 몫(채집석·잔토) | +| 159 | `B08_Quantity_UI_Side_Gravel.ts` | 산출 조건 「혼합석 부설」 구획 | +| 162 | `B08_Quantity_Engine_Handoff_Boundaries.py` | B08→B09 인계 이중계상 경계 판정 | +| 165 | `B08_Quantity_Engine_GravelSurfacing.py` | 혼합석(쇄석) 부설 | +| 171 | `B08_Quantity_Engine_UnitQuantity_Pavement.py` | 콘크리트 포장 전개식 | +| 175 | `B08_Quantity_Engine_StructurePriceLink.py` | 구조물도 일위대가 → B09 내역 받는 문 | +| 181 | `B08_Quantity_Engine_Preparation_TreeWaste.py` | 준비공 — 임목폐기물 처리 | +| 182 | `B08_Quantity_Engine_UnitQuantity_Base.py` | 구조물 원단위 — 성분 계약·갈 곳 | +| 184 | `B08_Quantity_Engine_UnitQuantity_Box.py` | BOX암거 전개식 | +| 185 | `B08_Quantity_Router_Earthwork_Settings.py` | 산출 조건 저장 라우터 | +| 190 | `B08_Quantity_UI_StructureSheet_UnitPrice.ts` | 구조물도 하단 일위대가 미리보기 | +| 191 | `B08_Quantity_Engine_SlopeArea.py` | 사면 4계열 면적(§2 B07 이식 대상) | +| 203 | `B08_Quantity_UI_ConversionFactors.ts` | 「토량환산계수」 칸 | +| 214 | `B08_Quantity_Engine_Handoff_Spoil.py` | 사토 — 실어 내는 줄 | +| 219 | `B08_Quantity_Router_StmateLibrary.py` | STmate 엑셀 고정형 항목 뽑기 라우터 | +| 222 | `B08_Quantity_Engine_StmateRecipe.py` | STmate 「일위대가표」 읽개 | +| 227 | `B08_Quantity_Engine_UnitQuantity_Revegetation.py` | 비탈면 녹화 전개식 | +| 230 | `B08_Quantity_UI_EarthworkGrid_Style.ts` | 토적표 그리드 스타일 | +| 239 | `B08_Quantity_Engine_StructureSheet_Edit.py` | 표준도 제원 입력 | +| 249 | `B08_Quantity_Engine_StructureLibrary.py` | 구조물도 양식 라이브러리(3단) | +| 255 | `B08_Quantity_Build_WorkItemMaster_FormsConst.py` | 공종 마스터 — 건설 품셈 표 모양 판정 | +| 270 | `B08_Quantity_UI_StructureSheet_Spec.ts` | 표준도 제원 입력 칸 | +| 271 | `B08_Quantity_Engine_EarthworkTable.py` | 토적표(평균단면적법) | +| 275 | `B08_Quantity_Engine_StructureSheet.py` | 표준도 하단표 장 나눔·조판 | +| 276 | `B08_Quantity_Engine_Handoff_Rows_Prep.py` | 인계 줄 — 준비공·배수관·연장·자재 | +| 287 | `B08_Quantity_Engine_SlopeLength.py` | 사면길이 유도(§2 B07 이식 대상) | +| 300 | `B08_Quantity_UI_StructureSheet_Formula.ts` | 표준도 식·반올림 칸 표 | +| 312 | `B08_Quantity_Build_WorkItemMaster_Const.py` | 건설품셈 2,192표 → 건설 공종 축 | +| 313 | `B08_Quantity_Engine_HaulSummary.py` | 운반 가중평균 4줄 | +| 319 | `B08_Quantity_UI_SummaryGrid.ts` | 토공집계표·운반거리 그리드 | +| 320 | `B08_Quantity_Engine_Handoff.py` | B08→B09 인계(계약 머리글 40줄 — §5 보존 대상) | +| 321 | `B08_Quantity_Engine_StructureFigure_Small.py` | 구조물도 상단 그림(골막이·떼흙막이·바닥막이) | +| 325 | `B08_Quantity_Engine_ObservedUnit.py` | 콘크리트 구조물 관측 원단위표 | +| 345 | `B08_Quantity_Build_WorkItemMaster_Keys.py` | 공종 마스터 불변 열쇠 발급 | +| 350 | `B08_Quantity_UI_StructureSheet_Library.ts` | 구조물도 양식 가져오기 칸 | +| 356 | `B08_Quantity_Engine_Handoff_Trench.py` | 구조물 터파기·되메우기·잔토 인계 줄 | +| 357 | `B08_Quantity_UI_StructureSheet_UnitPriceEdit.ts` | 구조물도 일위대가 줄 고치기 | +| 358 | `B08_Quantity_Build_WorkItemMaster_Forms.py` | 공종 마스터 — 사람이 가른 표 형태 | +| 358 | `B08_Quantity_Engine_StructureSummary.py` | 구조물 집계표(측점별·종류별) | +| 398 | `B08_Quantity_UI_StructureSummary.ts` | 구조물 집계표 탭 | +| 426 | `B08_Quantity_Engine_StructureUnitPrice.py` | 구조물도 하단 일위대가 표(B09 PriceBook·Rounding 부름 — §1-1 역방향) | +| 456 | `B08_Quantity_Engine_StructureFigure.py` | 구조물도 상단 그림(돌쌓기 단면 — §2 B07 이식 대상) | +| 467 | `B08_Quantity_Engine_MaterialSummary.py` | 자재 총괄표(할증 붙는 유일한 자리) | +| 473 | `B08_Quantity_Provenance.py` | B08 근거 사전 | +| 495 | `B08_Quantity_Engine_StructureTemplate.py` | 구조물도 양식형 항목 읽기 | +| 498 | `B08_Quantity_UI_StructureSheet.ts` | 구조물도 탭(장마다 하위 탭) | +| 502 | `B08_Quantity_Engine_EarthworkSummary.py` | 토공집계표 | +| 512 | `B08_Quantity_Build_WorkItemMaster.py` | 산림품셈 476표 → 공종 마스터 | +| 532 | `B08_Quantity_Engine_UnitQuantity_Masonry.py` | 돌쌓기·큰돌쌓기 전개식 | +| 548 | `B08_Quantity_UI_EarthworkGrid.ts` | 토적표 그리드(실무 3단 머리글) | +| 557 | `B08_Quantity_Engine_Handoff_Mapping.py` | 공종 매핑·갈래표 | +| 574 | `B08_Quantity_Engine_Pipe.py` | 배수관 물량(정본 셋 잇기 — §2 StructureFigure 딸림) | +| 585 | `B08_Quantity_UI_MaterialGrid.ts` | 자재총괄표·구조물 원단위 그리드 | +| 588 | `B08_Quantity_Formula.ts` | 구조물도 식 칸 풀이기 | +| 598 | `B08_Quantity_Router_Earthwork.py` | 토적표 조회 라우터 | +| 611 | `B08_Quantity_Engine_UnitQuantity_StoneSpec.py` | 돌쌓기 제원·계수표(§1-4 TS 짝 대상) | +| 636 | `B08_Quantity_Engine_UnitQuantity_Revetment.py` | 기슭막이 전개(돌쌓기 식 재사용) | +| 651 | `B08_Quantity_Engine_Preparation.py` | 준비공·사방공 | +| 670 | `B08_Quantity_Router_Material.py` | 구조물 원단위·자재총괄 조회 라우터 | +| 699 | `B08_Quantity_Router_StructureSheet.py` | 구조물도 라우터(장 목록·제원 입력) | +| 700 | `B08_Quantity_Engine_Handoff_Rows.py` | 인계 줄 만들기(토공·운반·구조물 등) | +| 700 | `B08_Quantity_Engine_UnitQuantity.py` | 구조물 원단위 전개식(치수→물량 — §2 StructureFigure 딸림) | +| 879 | `B08_Quantity_Build_WorkItemMaster_Table.py` | 공종 마스터 — 표 한 장 읽기 | +| 1,116 | `B08_Quantity_UI_Page.ts` | B08 화면 한 장(탭·확정 버튼) | +| + | `0_old_260726_codex.zip`(71KB) | 옛 B08 구현 백업 — **압축 이관의 앞선 전례**(§5) | + +### 3-2. B09_Estimation (파이썬 83 · 화면 28 · 합 28,507줄) + +줄 수가 큰 것 위주로 추림(전체 111개는 개발용 tsv `tmp/desc_b09_all.tsv`에 있었음 — 파일 자체는 재현 가능하므로 문서엔 안 실음). 주요 20개: + +| 줄 | 파일 | 무엇 | +|---|---|---| +| 1,436 | `B09_Estimation_UnitPrice.py` | ③ 단가산출·일위대가 조립(B08 StructureUnitPrice 가 부름) | +| 671 | `B09_Estimation_BillOfQuantities_Rows.py` | ④ 예산내역서 줄 만들기 | +| 664 | `B09_Estimation_ResourceAxis.py` | 자원 축 매칭 | +| 652 | `B09_Estimation_ResourceAxis_Transposed.py` | 열이 자원인 표 읽기 | +| 614 | `B09_Estimation_BillOfQuantities.py` | ④ 예산내역서 조판 | +| 611 | `B09_Estimation_Engine_Cost.py` | ⑤ 공사원가계산서 엔진 | +| 567 | `B09_Estimation_Router.py` | ⑤ 공사원가계산서 라우터 | +| 566 | `B09_Estimation_MachineOperating.py` | 운전경비(품셈 8-4) | +| 546 | `B09_Estimation_Statutory.py` | 법정경비 묶음 | +| 509 | `B09_Estimation_ResourceAxis_JudgedTable.py` | 사람이 모양을 읽어 둔 표 | +| 463 | `B09_Estimation_Progress.py` | 기성 단계 | +| 457 | `B09_Estimation_Provenance.py` | B09 근거 사전 | +| 425 | `B09_Estimation_CostSheet.py` | 원가계산서 일반형식 서식 차례 | +| 415 | `B09_Estimation_MachineProductivity.py` | 기계 시공능력 `Q` | +| 395 | `B09_Estimation_MachineProductivity_Dozer.py` | 불도저 시공능력 | +| 391 | `B09_Estimation_MachineProductivity_Reference.py` | 「다른 절과 동일」 참조 잇기 | +| 377 | `B09_Estimation_Router_Factors.py` | 산출 조건 라우터 | +| 373 | `B09_Estimation_PriceBook.py` | 단가 계층(B08 StructureUnitPrice 가 부름) | +| 367 | `B09_Estimation_Guards.py` | 이중계상 감시(거울 시험 4종) | +| 361 | `B09_Estimation_ResourceAxis_ChooseOne.py` | 「둘 중 하나」 장비 블록 읽기 | + +나머지 91개(33~350줄)는 자원 축 보조·공종별 특수 규칙(유로폼·치즐·화약·표토·파쇄·풀베기·종자·수송·철근)·서식 19탭·목록표 7종 등 — `_분석_B08B09_초기화.md` §1 표의 묶음 분류와 같음. + +## 4. 옮긴 뒤 빈 화면으로 두려면 남길 최소한 + +7-3 의 끝 모습 = 「메뉴와 주소는 남고, 들어가면 제목만 있고 표·계산은 없음」. 남길 것 — + +1. **라우터 등록 다섯 자리**(§1-3) — 그대로 둠. `router.ts` 의 동적 import 대상만 새 얇은 파일로 바꿈. +2. **`main.py` 의 라우터 하나**(현재 13개 대신) — 빈 화면도 서버가 404 안 내려면 최소 라우터 하나는 살아 있어야 함(예: `GET /{project_id}/quantity`·`/estimation` 이 빈 틀 응답). +3. **새 얇은 화면 파일 둘** — `B08_Quantity/B08_Quantity_UI_Page.ts`(1,116줄) 자리에 제목만 있는 새 파일, `B09_Estimation/B09_Estimation_UI_Shell.ts`(106줄) 자리에 같은 것. 워크플로 진행 막대(`b_workflow_nav.ts`)가 이 라우트를 그대로 가리키므로 파일이 아예 없으면 안 됨. +4. **문구** — `B08_Quantity_Wording.py`·B09 쪽 문구는 화면이 빈 틀이라도 제목·안내 한 줄은 필요 — 최소만 남기고 나머지는 `old_code`로. +5. **인계 계약 머리글**(`Engine_Handoff.py` 40줄) — 다시 짤 때 그대로 쓸 값어치(§5 재확인) — 코드는 옮기되 계약 설명은 `ref/`에 뽑아 둠(`_분석_B08B09_초기화.md` §5-1 이 이미 할 일로 적어 둠). +6. **시험** — `test_b08_*`·`test_b09_*` 160개는 그대로 둠(collect_ignore). §1-5 의 25개는 걸음마다 판단(B07 이식분은 같이 옮김 · 계산 시험은 `old_code`로). + +## 5. 옮기는 차례 제안 + +**PLAN 7-3 이 이미 차례를 확정해 둠**(287·294줄) — 「먼저 B08·B09 를 통째로 `old/`로 옮기고, 오류가 나는 자리를 하나씩 보면서 그 자리에 필요한 함수만 B07(등)의 새 파일로 옮겨 적음」. 이 분석도 그 차례를 따름 — 아래는 그 큰 차례를 걸음으로 푼 것(순서를 바꾸자는 제안이 아님). + +``` +0. 사전 — typecheck·시험 기준선 한 번 찍어 둠(지금 통과 수 기록) + +1. B08 · B09 폴더째 old_code 로 먼저 옮김(Z01 때와 같은 방식 · git mv) + ① B08_Quantity/ · B09_Estimation/ → old_code/ 밑으로 + ② §1-3 다섯 자리(router.ts·main.ts·b_workflow_nav.ts·config_frontend.ts)는 그대로 둠 + — import 대상만 §4-3 의 새 얇은 파일로 바꿔 「빈 화면」이 뜨게 함 + ③ main.py 라우터 13개를 최소 1~2개(빈 응답)로 + +2. typecheck·시험을 돌려 **깨지는 자리를 하나씩** 봄 — §1 표가 그 자리 목록(미리 다 앎) + ① B07 자리(§1-1·§2) — SlopeLength·SlopeArea 는 파일째 그대로 옮겨 적으면 됨(쉬움) + · StructureFigure(build_figure·figure_reason)는 Pipe·StructureSheet·UnitQuantity 가 + 딸려 범위가 커짐 — 여기서 막히면 그림 유형(돌쌓기·골막이·떼흙막이·바닥막이) 넷 가운데 + 실제 쓰는 것만 옮기고 나머지는 함께 `old_code`로 보내는 것을 임의로 제안(확정은 그 걸음에서) + ② B06 자리(§1-1) — `project_haul_inputs` 만 옮겨 적음(작음) + ③ common_util 셋(§1-4) — 문자열이라 안 깨지지만 `node_bundle` 의 감시 대상은 + 식 풀이 파일이 실제로 간 자리로 맞춤 + ④ §1-5 의 시험 25개 — B07 이식과 같이 가는 넷은 그대로 통과 확인 · + 나머지 21개(계산 시험)는 살릴 계산이 없으므로 `old_code/resources/tester/` 로 같이 옮김 + +3. 걸음마다 확인 — typecheck → 그 걸음이 건드린 시험만 pytest → 서버 뜸(dev_up.py) → ORCA 로 + `#/b08-quantity`·`#/b09-estimation` 진입(빈 화면 확인) → 커밋 + +4. 마지막 — old_code 를 읽는 자리가 없어질 때까지 §1 표와 대조하며 되풀이 +``` + +- §1 표를 먼저 뽑아 둔 까닭 — PLAN 차례(먼저 옮기고 깨지는 대로 봄)를 따르더라도 **어디가 깨질지 미리 알아야** 오류 하나하나를 헤매지 않고 §1 표를 체크리스트 삼아 훑을 수 있음. 이 분석의 값어치는 차례를 바꾸는 데 있지 않고, 「깨질 자리 목록을 옮기기 전에 미리 다 세는 것」에 있음.