diff --git a/resources/master_data/ref/_분석_B08B09_초기화.md b/resources/master_data/ref/_분석_B08B09_초기화.md new file mode 100644 index 00000000..426a5cea --- /dev/null +++ b/resources/master_data/ref/_분석_B08B09_초기화.md @@ -0,0 +1,135 @@ +# 분석 — B08(수량)·B09(견적)을 초기화할 수 있나 (일감 36) + +읽기만 함 · 코드·데이터 하나도 안 고침. 센 자리 = 이 창(sub_laptop_1 · dev 8dfd7105). + +한 줄 답 — **B09 는 절반 넘게 마스터로 갈아끼울 수 있음(품셈·단가 11,872줄) · B08 은 거의 못 갈아끼움(수량 산출 규칙 7,805줄 + 구조물도 2,643줄은 마스터에 자리 자체가 없음)**. 그래서 「둘 다 갈아엎기」 보다 **B09 의 단가 길만 마스터로 옮기고 · B08 은 수량 규칙을 남긴 채 겉(인계·단가 붙이기)만 다시 짜는 것**이 손해가 적음. + +## 1. 크기 — 파일과 줄 + +| 방 | 파이썬 | 화면(ts) | 합 | 파일 수 | +|---|---|---|---|---| +| B08_Quantity | 19,617 | 6,834 | **26,451** | 85(py 61 · ts 24) + 옛 구현 zip 1 | +| B09_Estimation | 22,615 | 5,892 | **28,507** | 111(py 83 · ts 28) | +| 합 | 42,232 | 12,726 | **54,958** | 196 | + +딸린 것 — 서버 길 B08 25 · B09 31(`main.py:647~659` 에 라우터 13 등록) · 시험 191 파일 26,943줄(`test_b08_*` 91/14,752 · `test_b09_*` 69/7,740 · 그 밖 31). + +### B08 을 하는 일로 가른 것 + +| 묶음 | 줄 | 무엇 | +|---|---|---| +| 수량 산출 규칙 | 7,805 | 토적표·사면 면적/길이·구조물 원단위 전개(돌쌓기·기슭막이·BOX·포장·녹화)·배수관·준비공·운반 가중평균·자재총괄 할증·암 가르기·거푸집 횟수 | +| 화면 | 6,834 | 수량 페이지 한 장 + 토적표·자재·집계 그리드 · 구조물도 탭 · 산출조건 패널 | +| 공종 마스터 만들기 | 2,818 | 산림 476표·건설 2,192표를 공종 축(`FW-`·`CW-`)으로 정규화하는 **한 번 돌리는 스크립트** | +| 구조물도(표준도) | 2,643 | 양식 읽기·상단 그림·장 조판·제원 입력·라이브러리(개인/회사/프로그램) | +| B09 인계 | 2,585 | 수량 줄 → 내역 줄로 넘기는 계약(두 벌: 작업공종·자재) | +| 라우터 | 2,467 | 조회 15 · 저장 10 | +| 단가 붙이기 | 736 | 구조물도 하단 일위대가 미리보기 · 밑수 단위 대조 | +| 그 밖 | 563 | 근거 사전·화면 문구 | + +### B09 를 하는 일로 가른 것 + +| 묶음 | 줄 | 무엇 | +|---|---|---| +| 품셈 읽기·단가 산출 | **11,872** | 자원 축(표 모양 11 갈래 읽개 3,550) · 단가산출/일위대가 조립 1,767 · 기계경비·운전경비·시공능력 2,288 · 품 할증·소모재료·작업조 · 공종별 특수 규칙 10(유로폼·치즐·화약·암손료·표토·파쇄·풀베기·종자·수송·철근) | +| 서식·단계 | 8,929 | 예산내역서 조판 1,677 · 원가계산서 4형식 1,442 · 법정경비 546 · 목록표 16종 564 · 자재대·중기경비계산서·산출기초·설계서 구성표 · 계약/실행/기성 1,078 · 사용자 고친 값 338 · 저장 스냅샷 231 · 근거 사전 778 · 끝수 216 | +| 라우터 | 1,814 | 조회 21 · 저장 10 | +| 화면 | 5,892 | 탭 19 + 공용 표·틀 | + +## 2. 어떻게 얽혀 있나 + +``` +B05(노선·구조물 정본) B06(횡단 설계) + structures.json · pipe_points.json 설계선·벽·관 + │ │ + └──────────────┬───────────────┘ + ▼ + B08 수량 산출 + (토적·사면·구조물 원단위·배수관·준비공·운반·자재총괄) + │ GET /quantity/handoff ← 두 벌 + │ ① work_items(공종 축 · 내역 줄이 됨) + │ ② materials(자재 축 · 공종코드 안 붙임 · 할증 전/후 둘 다) + ▼ + B09 원가계산 + (자원 축 → 단가산출 → 일위대가 → 내역서 → 원가계산서 → 단계 넷) +``` + +- **B08 → B09** = 인계 한 길. 계약이 문서로 박혀 있음(`B08_Quantity_Engine_Handoff.py` 머리 40줄) — 두 벌로 냄 · 반영률은 B08 에서만 곱하고 `quantity`·`quantity_gross`·`application_ratio_pct` 셋을 함께 실음 · 내역에 안 서는 줄은 빼지 않고 `in_bill=false` 로 실음 · 못 이은 줄은 `unmatched_work_items` 로 실음 · 갈래 세트(`ground_class_set`)를 실어 인계본만으로 내역이 서게 함. **다시 짜도 이 계약은 그대로 쓸 값어치가 있음.** +- **B09 → B08(거꾸로)** 도 있음 — 구조물도 하단 일위대가 미리보기가 B09 의 `PriceBook`·`UnitPrice`·`ResourceAxis`·`Rounding`·`Router._build_for` 를 부름(5 자리). 즉 **둘이 서로 부르는 고리**라 한쪽만 들어내면 다른 쪽이 멈춤. +- **B08 ← B05·B06** — 횡단 설계(`get_cross_section_designs`) · 노선 문맥 · 구조물 정본 읽기/쓰기 · 관 벽 최소높이 · 지반 경사. B06 화면(`B06_Section_Structure_Layouts.ts`)과 `common_util_masonry_slope.ts` 는 **B08 파이썬과 짝**(한쪽만 고치면 횡단도와 수량이 갈림). +- **저장되는 것** — B09 는 프로젝트 폴더 `<프로젝트>/B09_Estimation/v1/price_book.json`(+`_manifest.json`)에 **그때 쓴 단가를 사본으로** 박음(3년 뒤에도 같은 금액). B08 은 구조물도 양식·제원을 프로젝트 폴더에, 산출 조건은 DB 에, 확정은 워크플로 stage 5(B08)·6(B09) 로. 기준자료는 `resources/master_data/old/`(37 파일 20MB) · `resources/master_data/ref/` 데이터 7 개 · `data_aliases` · `data_masonry`. + +## 3. 마스터로 대신할 수 있는 것 · 없는 것 + +지금 마스터(`resources/master_data/*.json`) — 로직 1,354(건설 1,103 · 산림 251) · 소요량 2,535 · 계수 498 · 인력 378 · 기계 654 · 재료 31,011 · 요율 19 · 환율 5 · 일위대가 조합 1. + +### 대신할 수 있음 + +| 지금 코드 | 줄 | 마스터에서 | +|---|---|---| +| B09 자원 축 읽개 11 개 | 3,550 | 로직의 호표 줄이 이미 자원(인력·재료·기계)을 가리킴 — 표 모양을 읽을 까닭이 없어짐 | +| B09 단가산출·일위대가 조립 | 1,767 | 로직 계산(`master_formula.run`)과 일위대가 조합(UA) | +| B09 기계경비·운전경비·시공능력 | 2,638 | 계수·로직 건설품셈 08장 계열(후보 있음 · 시공능력 밑값은 확인 필요) | +| B09 품 할증·소모재료·작업조·특수 공종 10 | 약 1,900 | 계수·소요량·로직 각 장 | +| B09 요율 읽기 | 271 | `요율_조달청제비율.json` — **값뿐 아니라 처리규칙(끝수·안전관리비 A/B·관급 천원올림·이윤 밑수·규모 구간)까지 데이터에 있음** | +| B09 자재 카탈로그·수동 단가 | 391 | `재료_자재품목`·`재료_품셈재료` | +| B08 공종 마스터 만들기 | 2,818 | 원문 표는 이미 마스터가 정규화해 갖고 있음 — 다시 만들 까닭 없음 | +| B08 단가 붙이기 | 736 | 로직·조합 계산 길 | + +합쳐 **대략 15,400줄**(B09 11,900 · B08 3,550)이 「마스터를 부르는 얇은 층」으로 줄어들 자리 — 전체 54,958줄의 28 %. + +### 대신할 수 없음 — **이 쪽이 중요** + +1. **수량 산출 규칙 7,805줄** — 토적표·사면·구조물 전개·배수관·준비공·운반·자재총괄 할증. 마스터는 **단가 쪽**만 담고 있어 「치수 → 물량」 규칙을 둘 자리가 아예 없음. 남기든 다시 짜든 **이 지식은 코드나 새 「수량 로직」 그룹으로 반드시 살려야 함**. +2. **구조물도(표준도) 2,643줄** — 양식·상단 그림·장 조판·라이브러리. B07 도면이 이것을 부름. +3. **공종 축이 없음** — 지금 코드는 공종코드(`FW-`·`CW-`·`FP-`)로 잇고, 수량 줄 ↔ 공종 다리는 `ref/공종_수량연결_실무_*.json` 에 데이터로 있음. 마스터에는 **로직 키(GC/GF)와 조합 키(UA)만** 있고 「공종 = 어느 로직」 대응표가 없음. **갈아끼우기의 첫 막힘돌.** +4. **원가계산서 서식 4형식 · 예산내역서 조판 · 목록표 16종 · 설계서 구성표** — 차례가 전부 코드 안에 있음(데이터 아님). +5. **끝수·소수자리** — 줄 금액 원 단위 버림 · 관급자재대만 천원 올림 · 종목별 수량 소수자리(품셈 1-2-2). 요율 파일의 처리규칙에 일부만 있음. +6. **제비율 적용 절차** — 요율 값은 마스터에 있으나, 대상액 규모 구간 판정 · 안전관리비 A/B 뒤집힘 · 관급 부가세 제수 같은 **적용 순서**는 코드(법정경비 546 · 원가 엔진 841). +7. **단계 넷(계약·실행·기성·준공) · 사용자 고친 값 · 단가 사본 저장** 1,650줄 — 마스터와 무관. +8. **근거 사전 1,251줄**(B08 473 · B09 778) — 「이 숫자가 어디서 왔나」. 마스터는 출처를 줄에 달지만 화면 설명 글은 따로. + +## 4. 지우면 같이 깨지는 곳 + +- `main.py:63~76 · 647~659` — 라우터 13 개 등록(B08 5 · B09 8). +- 화면 — `A00_Common/router.ts` 의 두 쪽(`B08_QUANTITY`·`B09_ESTIMATION`) · 워크플로 단계 막대 · B09 탭 19. +- **B07 도면 3 자리** — 표준도 도면이 `B08_Quantity_Engine_StructureFigure`·`_StructureSheet` 를 부르고, 횡단 수량이 `Engine_SlopeArea`·`_SlopeLength` 를 부름. +- **B06·B05 화면 3 자리** — 구조물 배치 ts 가 B08 셈법을 전제로 씀 · `common_util_masonry_slope.ts` 는 B08 파이썬과 짝 · B05 배수시설 칸이 `ref/수량_사방기슭막이치수` 를 바로 읽음. +- `common_util` 3 개 — 노드 묶음(`old/` 통째를 씀) · 공종 열쇠 · 공종 연결. +- `Z01_MasterData` 3 개 2,082줄 — 옛 마스터 화면이 `old/` 이름표·공종 마스터·기계를 읽음. +- 시험 191 파일 26,943줄(그 가운데 31 개는 B05·B06·B07·Z01 이름으로 되어 있어 눈에 안 띔). +- 이미 조사된 표가 있음 — `ref/_걷을_옛코드.md`(어느 파일이 `old/`·`ref/` 의 무엇을 읽고 누가 부르는지 · 새 마스터 후보가 있는지 · 걷는 순서 5 단계). **이번 분석과 어긋나는 데 없음 · 그 표를 그대로 씀.** + +## 5. 압축해 `old` 로 옮길 때 남길 것 + +코드보다 **글과 데이터**가 값어치 있음. 지우면 다시 못 만드는 것 차례로 — + +1. **인계 계약** — `Engine_Handoff.py` 머리 40줄(두 벌 · 반영률 한 곳 곱하기 · `in_bill` · 갈래 세트 · 못 이은 줄). 규칙 글로 뽑아 `ref/` 에. +2. **서식 차례** — 원가계산서 4형식 · 예산내역서 줄 차례 · 목록표 16종 · 설계서 구성표(별표2 (5)(가)) · 중기경비계산서 · 산출기초. 지금은 코드 안 배열이라 **JSON 서식표로 뽑아 두면 그대로 다시 씀**. +3. **끝수·소수자리 표**(줄 버림 · 관급 천원 올림 · 종목별 자리). +4. **제비율 처리규칙** — 이미 `요율_조달청제비율.json` 에 있고 거울 시험(`test_b09_rate_rules_mirror.py`)이 지킴. **그 시험은 살려 둘 것.** +5. **판정 까닭이 적힌 머리글** — B08·B09 파일 머리에 「왜 이렇게 정했나 · 브레인 판정 날짜」가 촘촘함(이중계상 경계 · 무대 · 암 구성비 · 임목폐기물 따위). 코드를 압축하면 **이 글이 같이 사라짐** — 공종별 규칙 글로 걷어 `ref/` 에 남길 것. +6. **시험은 지우지 않음** — `test_b08_*` 91 개는 수량 규칙의 판정값 창고라 다시 짜도 그대로 맞대 볼 수 있음. +7. **실무 산출물은 이미 있음** — `resources/knowledge/original/실무문서/` 의 내역+수량 xlsx 여섯 현장(울진·거창·장수·진안·봉화·영월). 다시 짤 때 **금액 맞대기 기준**. +8. 데이터(`old/` 37 · `ref/` 7)는 코드와 따로 — 코드만 압축하고, 데이터는 `_걷을_옛코드.md` 의 이관 표를 따름. +9. 앞선 전례 — `B08_Quantity/0_old_260726_codex.zip`(71KB)처럼 **폴더 안에 zip 하나로 두는 방식**이 이미 쓰인 적 있음. + +## 6. 다시 짜는 큰 차례 (제안) + +``` +① 공종 축부터 로직 키·조합 키를 「공종」으로 삼고, + B08 수량 줄 → 로직/조합 키 연결표를 마스터 ref 에 데이터로 + (지금 공종_수량연결_실무 가 하던 구실 · 코드 아님) +② 단가 길을 갈아끼움 B09 품셈·단가 11,872줄 → 마스터 호출 얇은 층으로 + (자원 축 읽개·기계경비·특수 공종이 통째로 없어짐) + 판정 = 실무 xlsx 여섯 현장과 금액 맞대기 +③ 수량은 남김 B08 Engine_* 7,805줄은 그대로 두고 겉(인계·단가 붙이기)만 새로 + 나중에 「수량 로직」 그룹을 마스터에 둘지 따로 정함 +④ 서식을 데이터로 원가계산서 4형식·목록표 16종·내역서 차례를 JSON 서식표로 +⑤ 단계·저장은 얇게 계약·실행·기성·준공 · 사용자 고친 값 · 단가 사본 +⑥ 걷기는 마지막 _걷을_옛코드.md 의 5 단계 차례대로 · old/·ref/ 삭제는 맨 끝 +``` + +- ②를 먼저 끝내야 「마스터가 실무 금액을 낼 수 있나」가 증명됨 — 증명 전에 코드를 지우면 되돌릴 자리가 없음. +- ①의 연결표가 없으면 ②가 못 섬(로직을 어느 내역 줄에 붙일지 모름). **가장 먼저 사용자와 정할 것 = 공종 이름을 로직 키로 부를지, 조합 키로 부를지.** +- B08·B09 가 **서로 부르는 고리**라, 손대는 차례는 「B09 단가 → B08 단가 붙이기 → B08 인계」로 한 방향씩 끊는 것이 안전함. diff --git a/resources/master_data/ref/_분석_로직컨테이너_통합.md b/resources/master_data/ref/_분석_로직컨테이너_통합.md new file mode 100644 index 00000000..fde95588 --- /dev/null +++ b/resources/master_data/ref/_분석_로직컨테이너_통합.md @@ -0,0 +1,94 @@ +# 로직 컨테이너 통합 분석 — 옛 「단가산출 로직」 삭제 · 「로직 개선 시험」 → 「단가산출 로직」 + +분석만 — 코드·데이터 안 고침. 기준 = sub_laptop_3 · dev 8dfd7105. + +## 한눈에 + +- 옛 컨테이너 전용 파일 = **`UI_Logic_Page.ts` 하나**(430줄). 나머지 `UI_Logic_*` 는 새 컨테이너도 씀. +- 새 컨테이너(`UI_LogicLab.ts`)는 옛 파일 `Logic_Api` · `Logic_Calc` · `Logic_List` · `Logic_Text` · `Logic_Edit` · `Logic_Pick` · `Logic_Note` · `Logic_Style.css` 를 그대로 가져다 씀 → 이 파일들은 **지우지 않음**. +- 서버 길 · 시험 · 다른 화면(B08·B09 등) 걸림 **없음**. +- 지우면 잃는 기능 **둘**(아래 ④) — 사용자 확인 필요. + +## ① 파일 가르기 + +| 구분 | 파일 | +|---|---| +| 옛 전용 | `UI_Logic_Page.ts` | +| 새 전용 | `UI_LogicLab.ts` · `_Copy` · `_Detail` · `_Formula(.ts/.css)` · `_Modal` · `_New(.ts/.css)` · `_New_Find` · `_New_Text` · `_New_Var` · `_Pill(.ts/.css)` · `_Text` · `_Style.css` | +| 둘 다 씀 | `Logic_Api` · `Logic_Calc` · `Logic_List` · `Logic_Text` · `Logic_Edit`(새 쪽 자체 로직 편집기 · 숫자 서식) · `Logic_Pick`(요소 찾기 창) · `Logic_Note`(표 읽기 · 풀이 — 모달이 씀) · `Logic_Style.css`(둘 다 import) · `UI_Cells`(`Logic_List` 경유) | +| 화면 뼈대 | `UI_Page.ts`(옛·새 둘 다 엶) · `UI_Side.ts`(패널에 옛·새 두 절) | + +서버 길(`/api/m01/…`) + +- 옛 컨테이너가 쓰는 길 = `/logics` · `/subs?group=로직` · `/logic` · `/groups/로직/files` · `/calc` · `/text` · `/save` · `/elements` · `/pick` · `/materials`. +- 새 컨테이너 = 위에서 `/groups/로직/files` 만 빼고 전부 + `/logic/copy` · `/logic/formula` · `/logic/formula/save` · `/logic/formula/preview` · `/logic/draft`. +- 옛 전용 길 = `/groups/로직/files`(옛 [새로 만들기]에서 「파일 고르기」용) 하나 — 이 길은 그룹 공용이라 시험(`test_m01_api.py` 154줄)도 씀 → **서버는 안 지움**. +- 어느 화면도 안 부르는 서버 길(`/logic/new` · `/logic/edit` · `/logic/delete`)은 이번 삭제와 무관(이미 그랬음). + +## ② 지워도 되는 것 + +옛 컨테이너만 쓰는 것 + +- `UI_Logic_Page.ts` 통째. +- `UI_Logic_Api.ts` `fetchLogicFiles`(`Logic_Page` 만 부름) · 타입 `LogicFile`(같은 곳 · 다른 곳 쓰임 없으면 함께). +- `UI_Logic_Text.ts` `Bar_New`(`Logic_Page` 만 씀). +- `UI_Logic_Edit.ts` 의 `isNew` · `files` · `onFile`(옛 새 로직 「파일 고르기」 — 새 쪽은 `isNew:false · files:[] · onFile:()=>undefined` 를 넘김). 지우면 `head()` 의 `choice(...)` 가지도 같이 지워짐. +- `UI_Logic_Style.css` 의 옛 옆칸 규칙 — `.m01-logic:has(> .m01-logic__calc:not([hidden]))`(19–21 · 26–29) · `.m01-logic__calc` 묶음(32 · 38 · 46–50 · 136–140). 새 컨테이너의 시험 계산은 상세 안 `m01lab__calc` 라 옆칸 `