From a66d2c2161847b3b39a82da1827cb0875910ff07 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 1 Nov 2026 17:46:43 +0900 Subject: [PATCH] =?UTF-8?q?knowledge(=EA=B3=84=ED=9A=8D):=20PLAN=20709~719?= =?UTF-8?q?=20=EC=9D=B4=EA=B4=80=20=E2=80=94=20=EB=82=B4=EC=97=AD=2012~15?= =?UTF-8?q?=20=EB=81=9D(M01=20=EB=8B=A8=EA=B0=80=EC=82=B0=EC=B6=9C=20?= =?UTF-8?q?=EB=B3=B4=EA=B8=B0=20=C2=B7=20=EC=97=94=EC=A7=84=20=EB=B0=94?= =?UTF-8?q?=EB=8B=A5=20=C2=B7=20=EC=9B=90=EB=AC=B8=20=EB=8C=80=EC=A1=B0=20?= =?UTF-8?q?=C2=B7=20M02=20=EB=8B=A8=EA=B0=80=EC=82=B0=EC=B6=9C=20=C2=B7=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20=C2=B7=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=20=C2=B7=20=EB=B3=84=EC=B9=AD=20=C2=B7=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=EB=B3=B5=EC=82=AC)=20=C2=B7=20?= =?UTF-8?q?=EB=84=93=EC=9D=80=20=EC=8B=9C=ED=97=98=20276=20=ED=86=B5?= =?UTF-8?q?=EA=B3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/raw/plans/2026-11-01_plan_709-719.md | 146 ++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 docs/raw/plans/2026-11-01_plan_709-719.md diff --git a/docs/raw/plans/2026-11-01_plan_709-719.md b/docs/raw/plans/2026-11-01_plan_709-719.md new file mode 100644 index 000000000..53e0a13b0 --- /dev/null +++ b/docs/raw/plans/2026-11-01_plan_709-719.md @@ -0,0 +1,146 @@ +# 완료 계획 709~719 — 내역 12 · 13 · 14 · 15 (M01 단가산출 로직 보기 · 엔진 바닥 · 원문 대조 · M02 단가산출 · 메뉴 · 불러오기 · 별칭 · 프로젝트 복사) + +요구서 = `docs/raw/요구_내역서/요구서_내역12_단가산출로직_M02단가산출.md` · 원문 = `docs/raw/요구_내역서/사용자요구_내역서.md` 내역 12~15 · 이관 2026-11-01 · 마지막 넓은 시험 40 파일 276 통과 · typecheck 0. + +## 709 M01 · M02 표 세로 맞춤 · 쪽 단추 (내역 12 M01-1 · 요구서_내역12 · sub1) + +- 정함(브레인): 요구서 4장 2 · 화면 높이로 줄 수 · 표 안 스크롤 없음 · 쪽 단추 표 아래 · 짧으면 딸려 올라감 +- 이음(sub1): 709-1 부품 = `ui_template/ui_template_pager.ts` · `ui_template_divider.ts`(createDivider) — sub2 711-1 · sub6 716-1 이 씀 · 709-2 = `UI_Logic_List.ts` 쪽 크기 변수 · watchFit — sub4 713-3 이 뒤에 만짐 +- [x] 709-1 부품 둘 — 수평 구분선(`ui_template_overlay.css` · 왼쪽 판 · 패널 안 같이 씀) · 쪽 단추 `ui/ui_template_pager.ts`(M01 `buildPager` 옮김 · 옛 이름 얇게 남김) · 부품 모음 견본 — 확인 = 견본 사진 · 밝음 · 어두움 · PickTable 쪽 단추 그대로 + - 검증완료 — 부품 모음 견본 밝음 · 어두움 사진 둘 · 부품 폴더 = `ui_template/`(ui/ 아님) · `ui_template_pager.ts`(createPager · fitRows · watchFit · watchHeight) · `ui_template_divider.ts`(createDivider · `.ui-divider` · overlay.css) · 옛 `buildPager` = 얇은 껍데기 · 시험 test_709_pager_fit 5 통과 · typecheck 0 · 커밋 2e4301106 +- [x] 709-2 M01 표 전부 + M02 목록 둘(`UI_Cells` · `UI_Rows` · `UI_Tables` · `UI_Logic_List` · `UI_Logic_PickTable` · `UI_Style.css:88-91` · M02 `ItemList` · `Library_List`) — 확인 = 1080 · 768 높이 줄 수 · 짧은 표 아래 붙음 · 쪽 넘김 + - 검증완료 — 높이 1080 · 768 × 밝음 · 어두움: 인력 요소 표 21 · 13 줄(어두움 20 · 13) · 소요량 표 목록 20 · 12 줄 · 단가산출 로직 목록 21 · 13 줄 · 재료 고르기 모달 15 · 9 줄 · 표 안 스크롤 0 · 쪽 단추 표 바로 아래(끝 쪽 1 줄이면 표와 함께 위로 붙음) · 한 장 표 화면 안 스크롤(768 · 12 줄 · 표 아래 주 높이 뺌) · 문서 넘침 0 · 시험 48 통과(고친 대상) · typecheck 0 · 커밋 1a931e2ea · 시험 계산 쪽 단추는 모달에서 표 아래로 옮김 + +## 710 M01 단가산출 상세 — 열 · 단가 1 행 · 보기 고르기 (내역 12 M01-2 · sub2) + +- 정함(브레인): 요구서 4장 3 · 4 · 열 = 이름 · 수량 · 단위 · 로직 · 단가 · 금액 · 보기 넷 · 기본정보 맨 위 접힘 · 상세 머리에 「지금 입력」 한 줄(읽기만) +- [x] 710-1 단가 1 행(`Logic_Style.css:207-212`) · 열 바꿈 · 수량 = `CalcLine.수량`(계산 전 「—」) · 새 로직 열(`LogicLab_Detail.ts` lineRow · groupTable · `LogicLab_Style.css:44-63`) — 확인 = 표본 로직 셋 수량 = 시험 계산 값 · 사진 + - 검증완료 — GF000221 · GF000176 · GF000099 수량 = 시험 계산 값(0.12 · 0.0313 · 0.023 …) · 단가 · 금액 한 줄(줄 높이 28) · typecheck 0 +- [x] 710-2 보기 고르기 — [신규 로직] 왼쪽 세로 나눔선 + 분할 고르기(새 `M01_MasterData_UI_LogicLab_View.ts` · `LogicLab.ts:580-591` · `Detail.ts:476-496` · `FlowView.ts` · `LogicLab_Flow.ts:194-196`) · 고른 덩이만 · 시험 계산은 숨겨도 돎 — 확인 = 보기마다 한 덩이 · 로직 바꿔도 보기 유지 · 임시 흐름 로직 하나로 흐름 쪽 + - 검증완료 — 보기 넷 각 한 덩이 · 로직 바꿔도 보기 유지 · 숨은 시험 계산 자동 셈 · 저장 안 한 새 흐름 로직도 한 덩이(서버 쓰기 0) · ORCA 5177 + +## 711 M01 시험 계산 · 재료 모달 하나 (내역 12 M01-2 · sub2 · 710 · 709-1 뒤) + +- 정함(브레인): 요구서 4장 11 · 모달 기준 = 상세 쪽 `openMaterialModal` · 후보 `/materials` · 기계 고르기 PickTable 그대로 +- [x] 711-1 시험 계산 옵션 · 자재 사이 수평 구분선(709-1 부품) · 기본 4 열 · [품목 고르기] 걷고 자재 항목 누르면 모달(`Logic_Calc.ts` · `CalcPick.ts` · `Logic_Style.css:78-81`) — 확인 = 사진 · 고른 자재로 다시 셈 + - 검증완료 — 격자 4 열 둘 + 구분선 1 · [품목 고르기] 0 · 자재 이름 누름 → 고름 → 다시 셈(파형강관 86,400 → 22,100) +- [x] 711-2 재료 모달 하나 — 찾기 · 고르기 얹음 · 위 물가자료 · 유통물가 · 물가정보 · 거래가격 가로 넷(빈 칸 「-」 · 쓴 값 굵게) · 아래 값 열 뺌(`LogicLab_Modal.ts`) — 확인 = 시험 계산 · 상세 두 곳 같은 모달 · M02 [바꾸기] 그대로 + - 검증완료 — 상세 · 시험 계산 같은 모달 · 물가 넷 가로(쓴 값 굵게) · 목록 값 열 없음 · 고름 → 다시 셈 · 1080 · 768 · 밝음 · 어두움 · 일반 · 회사 관리자 403 · PickTable 그대로 + +## 712 단가산출 엔진 바닥 — 인재경 파생 · 단위 · 기준배 (내역 12 M01-2 · 3 · sub3 · sub4) + +- 정함(브레인): 요구서 4장 6 · 8 · 9 · 정본에 칸 안 더함 · 셈 · 읽을 때 파생 · M01 셈 서버 단독 · 덧칸 `묶음` = 인재경 꼬리표(출력)만 +- [x] 712-1 (sub3) `묶음` 파생 함수 한 벌(인력 · 재료 · 경비(장비) · 하위) · 기계경비 판별 세 자리 → 하나 · `run` 줄 덧칸 — 확인 = 5,911 줄 미분류 ≤ 31 · M01 셈 값 전후 같음(표본) · 엑셀 맞춤 골든 시험 · B09 산근 시험 + - 이음(sub3): 엔진 `run` 줄 덧칸 `묶음`(인력 · 재료 · 경비 · 하위) + 기계경비 줄 `장비` true · 노 · 재 · 경 몫 = 그 줄 `비목` 세 칸 · 판별 `master_bundle.is_machine(row)`(결과단위 원/시간) · 줄 하나 `bundle(master, item)` → (묶음, 장비) · 712-2 단위 = `resources/master_data/scripts/master_unit.py`(plain · shown · per · same_kind · convert · factor · note · unit_weight) + - 검증완료 — 5,911 줄 하위 31 · 기계경비 줄 1,044 · 1,469 로직 셈 · 텍스트 전후 같음(덧칸만) · 엑셀 맞춤 골든 · 맞춤 26 · B09 산근 · 텍스트 시험 통과 · 작업량 27 로직 「시간당」 오판 사라짐(지문 대상 밖이라 맞춤 값 같음) +- [x] 712-2 (sub3) 단위 모듈 한 벌(별칭 · 개수 묶음 · 배 읽기 · 같은 성격 · 근거 글) → 다섯 자리 갈아 끼움 · 부피 ↔ 무게 = 단위중량 표 CC000337 고르기(기본 줄 = 사용자 답) — 확인 = 셈 값 · 알약 키(「이름|단위」) · 배 전수 전후 같음 · M02 Labor_Calc 짝 거울 시험 + - 검증완료 — 1,469 로직 알약 키 · 배 · 결과단위 배(맞춤 · B09 산근) 전수 같음 · 셈 값 같음 · 단위경고 20 → 16(본 ↔ 개 · 매 ↔ 개 개수 묶음) · M02 Labor_Calc 거울 · 712-3 기준배 시험 통과 · B08 손 식 = 엑셀 G열 그대로(값 대조만) +- [x] 712-3 (sub4) 표 `기준` → `기준배` · `기준단위` 읽을 때 파생(원문 머리 정규식 · 정본 표 안 씀) · 로직 파일 머리 판 꼴 통일 · 배 어긋남 목록(6 건 → 시스템 관리자) — 확인 = 파생 칸 채움 비율 · `check_master` 배 대조 · 구조물 사본 「원본 바뀜」 0 + - 검증완료 — 시험 5 · 로직이 부르는 표 2,023 중 기준 단위 파생 1,601(79 %) · 빈 기준 579 중 원문 머리로 285 · 비단위 128 · 모름 294 · 정본 파일 쓰기 0(구조물 사본 「원본 바뀜」 0) · 판 = 읽을 때 파생(`판정규`) + - 이음(712-3) — `resources/master_data/scripts/master_basis.py` `basis(표) → {기준배, 기준단위, 기준근거, 갈래(단위·비단위·모름)}` · `result_per(결과단위) → [(배, 단위)]` · `edition(판)` · API `/api/m01/tables` 줄마다 · `/table` 에 `기준파생`(표 밖 칸) · `/groups/{g}/files` `판정규` + - 배 어긋남(시스템 관리자 원문 확인 · `check_master.py 배` 7 건) — GC000482~485 원/노선 ↔ 10km · GF000081 원/ha ↔ 160ha · GC000522 원/작업 ↔ 0.25㎢ · GC000524 원/작업 ↔ 50점 · GF000319 = 표 「100본/ha당」 → 1 ha 로 읽혀 자동 대조 안 걸림(원문 대조만) + +## 713 정본 개정 확인 · 로직 목록 묶음 (내역 12 M01-3 · sub4 · sub2) + +- 정함(브레인): 요구서 4장 7 · 10 · 정본 = 로직 정본 파일만(요소는 밖) · 확인 창 + 바탕 줄 지문 · 목록에서만 묶음 +- [x] 713-1 (sub4 서버) `/save` · 흐름 저장 · 지우기 = 로직 정본 줄이면 「원문 개정 반영」 확인 값 없이는 막음 · 줄 바탕 지문(정함 17 배지용) — 새 파일(`M01/Store.py` 695) — 확인 = 시험(임시 사본) · 확인 없이 정본 저장 · 지우기 0 + - 검증완료 — 새 시험 5(확인 없이 정본 고침 · 지움 · 더함 409 · 파일 바이트 그대로 · 같은 줄 다시 보냄 200 · 요소 파일 200 · 지문 = 계산 칸만) · 낡은 시험 6 파일 확인 값 실음 통과(api 26 · cache 12 · flow_save 9 · alias 10 · flow_project 1 · df_router 14) · 막는 자리 = `Store_Flow.save`(`/save` 한 길 · `Store.py` 안 늘림) · 713-2 전까지 화면 정본 저장은 409(「다른 곳에서 바뀜」 토스트로 보임) + - 이음(713-1) — `/api/m01/save` 몸에 `개정확인: bool`(기본 false) · 로직 정본 파일(`로직_*.json` · `로직_자체.json` 뺌) 줄을 실제로 바꾸는 edit · add · delete 가 있고 false 면 409 `{"개정": [{file, key, op, 이름}], "까닭": "…"}`(옛 409 `stale` 과 열쇠로 가름) · 줄 바탕 지문 = `M01_MasterData_Store_Revise.row_print(줄)` = 계산 칸(결과단위 · 입력 · 중간 · 호표 · 덧줄 · 결과 · 끝수 · 흐름) 정렬 JSON(Decimal 정규) sha256 앞 16 자 · `GET /logic` 에 `지문` +- [x] 713-2 (sub2 · 713-1 뒤) 확인 창 화면(새 파일 · `LogicLab.ts` 안 늘림) — 확인 = 정본 로직 저장 때 창 · 취소면 파일 지문 그대로 + - 검증완료 — 새 `M01_MasterData_UI_LogicLab_Revise.ts`(saveRevised) · 5177 시스템 관리자 GF000221 비고 고친 캐시 [저장] → 창(GF000221 돌쌓기 찰쌓기(인력) · 로직_산림품셈_13장_구조물.json · 고침) · 취소 = 캐시 1 그대로 · 지문 cd4e09f4bcc1dea2 · 판 1ca3bf0006220cce 전후 같음 · 확인 = 다시 보낸 몸 개정확인 true(가로채 씀 0) · 1080 밝음 · 768 어두움 · 일반 · 회사 관리자 /save 403 · 시험 8 통과 · typecheck 0 · 커밋 3d4bcaea5 +- [x] 713-4 (sub4 · 713-1 뒤 · 사용자 확정 내역 15 · 예외: M01 로직 정본 고침 허락) 원문 대조 정리 — 조종원 시간 환산(질의회신 2001 · GC000267~271 · 275 · 276 · GF000145) 빼고 품셈 본문대로 · 임의 쪼갬 12 원문 한 표로 합침 · 방제 8-3 빠진 로직 4 채움 · 구조물터파기 18 한 꼴 + 관부설 가산 비고(근거 `docs/raw/요구_내역서/_분석_내역14-5_로직_원문대조.md`) — 확인 = 바뀐 로직 · 부르는 로직 471 금액 전후 표(PLAN 아래 한 줄 + tmp 표) · 터파기 금액 전후 같음 · 합친 로직 값 = 원문 표 · M02 · 프로젝트 사본 영향 수 + - 검증완료 — 로직 1,469 → 1,461(지움 12 · 새로 방제 4 GF000331~334) · 금액 같음 998 · 바뀜 459 = 기계경비 8(×0.63~0.69) + 부르는 로직 447 + 간접 4(×0.63~0.9996 · 표 `tmp/m7134_diff.md`) · 터파기 18 고르기 972 조합 = 조종원만 바꾼 사본과 같음 · 플랜트 45,960 조합 = 옛 값(다름 1,200 = 옛 쪽 표가 경계 줄을 못 찾아 0 이던 칸 → 원문 값) · 기초다짐 = 옛 셋 값 · 검사 오류 31 → 31 · 일괄 셈 멈춤 0 · 시험 29 파일 통과(낡은 기대값 고침 masterdata_check 4 · 713-3 수) · 영향 = M02 층 문서 172(연결 → 다음 셈에 따라감) · 마스터 템플릿 7 · 프로젝트 구조물 사본 5(「원본 바뀜」 뜸) · 지운 키 쓰는 곳 0(파생 저장본만 · 다시 셈) + - 정함(sub4) — 조종원 = 하루 노임 × 1/8(건설품셈 공통 1-1-3 2 「1일 8시간」) · 16/12 · 25/20 뺌 · 터파기 1~6 = 7~18 꼴(작업량 식 품음 · 작업량 로직 6 지움 · 관부설 30 % 비고 18 모두) · 플랜트 = 표도 한 표(QC001608 · 브레인 허락) + 입력 구분 · 두께(0 = 하나뿐) · 기초다짐 = GF000215 하나(종별 넷 · 범위 품 입력) · 중복 비율 표 CF000127 · 128 은 그대로(금액 같음) +- [x] 713-3 (sub4 · 709-2 · 712-1 뒤) 목록 API 칸(같은 절 묶음 · 작업량 짝 · 부르는/불리는 수 · 인재경 줄 수 · 새 파일) + M01 목록 묶음 접기 · 작업량 숨김 · 「별도」 관련 로직 링크(`UI_Logic_List.ts`) — 확인 = 목록 줄 수 전후 · 접힘 사진 + - 검증완료 — 시험 4(덧칸 · 묶음 307 · 작업량 21 · 부르는 로직 506 · 인재경 하위 31 · 접기 node 거울) · typecheck 0 · ORCA 8006/5179 시스템 관리자 = 목록 줄 1,461 → 접힘 1,263(펼침 하나 1,264 · 작업량 GF000003 이 GF000004 밑) · 찾기 「구조물터파기」 18 줄 펼친 꼴 · 관련 링크 GF000290 → GF000293 상세 열림 · 사진 `tmp/m7133_folded_open.png` · 이음 = `/logics` 줄 덧칸 `묶음 · 묶음수 · 작업량 · 부모 · 부르는수 · 불리는수 · 관련 · 인재경{인력·재료·경비·하위}`(`M01_MasterData_Store_List`) · ListItem 새 칸은 선택 칸(LogicLab 이 만드는 초안 줄 그대로) + +## 714 인력·재료·경비 보기 = 공용 단가산출 계산서 · 텍스트 수식 고침 (내역 12 M01-2 · sub3 → sub2) + +- 정함(브레인): 요구서 4장 4 · 5 · 704-2 계산서 보기를 공용 부품으로 올림(새로 두 벌 안 만듦) · 서버 셈 · 최신 응답만 · 장비 줄 = 경비(장비) 묶음 한 줄 + 노 · 재 · 경 칸 · 펼침 넉 줄(요구서 4장 6) +- 사용자 확정(내역 14): 텍스트 수식 「변경」 = 시험 계산 값만 · B09 단가산출근거도 같은 보기 +- [x] 714-1 (sub3 · 712-2 · 712-3 뒤) 계산서 줄마다 「쓰는 입력」 · 묶음 · 기준단위 · 환산 근거 · `/text` 와 `/logic-lib/sheet` 같은 꼴(새 파일 · `master_text.py` 695) — 확인 = 시험 · 표본 셋 두 길 같은 값 + - 이음(sub3): 계산서 줄 덧칸 `쓰는입력`[입력 이름] · `묶음` · `장비` · `기준단위`(「10㎡」 · 없으면 null) · `환산근거`(글 · 없으면 「」) · 장비 줄 `펼침`{키, 이름, 단위, 입력, 줄[비목 · 이름 · 글 · 금액], 소계, 계} + 답 머리 `기준단위` — `master_sheet_line.annotate(files, key, given, answer)` · `KEYS` · M01 `/text` · M02 `/logic-lib/sheet` 같은 덧칸 + - 검증완료 — 표본 셋 두 길(M01 /text · M02 /logic-lib/sheet) 덧칸 같음 · 장비 펼침(GF000103 → GC000267 넉 줄) · 표 10㎡당 → 원/㎡ 「÷10」 · 받은 뒤 시험 17 · 8005 API(일반 · 회사 관리자 m01 403 · 계산서 200 덧칸) · ORCA M01 상세 · 텍스트 계 = 시험 계산 계 7,219 · /text +0.3~0.45 s +- [x] 714-2 (sub2 · 710-2 · 714-1 뒤) 공용 「단가산출 계산서」 부품 — 704-2(`M02_MasterTemplete_Labor_Sheet.ts`) 올림 + 그룹 머리 변수 칸(`ui_template_calc_row` 값 줄) · 노재경 칸 · M01 보기 · 기준 목록 미리 보기 같이 씀 — 확인 = 변수 바꿈 → 금액 = 시험 계산 값 · 704-2 화면 전후 같음 + - 검증완료 — 공용 계산서 `A00_Common/calc_sheet.ts`(calcSheetRows · bundle 꼴 = 인력 · 재료 · 경비(장비) · 하위 · 장비 한 줄 노 · 재 · 경 칸 · 펼침 = 시간당 넉 줄(714-1b) + 몫 식 석 줄 · 묶음 머리 기준 · 환산 근거 · 쓰는 입력 칸) · M01 「인력·재료·경비」 계 = /text: 돌쌓기 GF000221 54,387(돌 → 깬돌 1,470) · 굴착기 GC000278 21,659(두께 → 25 19,938 · 지역 → 서울 21,688) · 터파기 GF000101 5,842(지역 → 서울 5,852 · 보정작업 → 전석섞인토사 5,874) · ORCA 5177 GC000278 21,659 → 두께 30 18,791 = /text · 704-2 M02 계산서 보기 DOM 전후 같음(표본 셋) · 정본 지문 그대로 · 1080 밝음 · 768 어두움 · 시험 27 통과 · typecheck 0 · 커밋 cddb28b63 · 702ab1daa · dcf476d50 +- [x] 714-3 (sub2) 텍스트 수식 값 · 변수 누르면 그 시험 입력 고침(정본 안 바뀜 · `Formula.ts` · `Logic_Api.ts` TextPiece) — 확인 = 누름 → 고침 → 다시 셈 · 정본 파일 지문 그대로 + - 검증완료 — 값 식 아래 입력 단추(표 찾기 행 열쇠 · 이름 조각) · 5177 시스템 관리자 GF000221 「뒷길이 25」 → 30 고름 → 다시 셈 화면 계 80,845.56 = /text 같은 입력 · 시험 계산 칸 30 · 흐름도 예시값 30 · GC000278 「두께 20」 글 칸 25 Enter → 19,938.13 = /text · 정본 지문 그대로(cd4e09f4bcc1dea2 · e65034db9bda19f4) · 1080 밝음 · 768 어두움 · 빈 값 = 그대로 · 시험 3 통과 · typecheck 0 · 커밋 915feb436 · 조건(만약) 안 입력 · 재료 검색 입력은 714-1 「쓰는 입력」 뒤 714-2 에서 + +## 715 M02 단가산출 서버 — SK 꼴 · 셈 · 참조 · 일위대가 쪽 (내역 12 M02 · sub5) + +- 정함(브레인): 요구서 4장 12 · 13 · 14 · 16 · 17 · 19 · 종류 `sangeun` · 키 `SK-` · 사전조합(SC) 길 그대로 +- 사용자 확정(내역 14): 고침 범위 = 숫자 · 줄 더하기/빼기(식 안 받음) · 일위대가 안에서 고친 값 = 그 일위대가에만 + [단가산출로 저장] +- 이음(715 · sub5): SK 문서 `{종류:"단가산출", 키:SK-######, 이름, 단위(필수), 구분, 상세구분, 본뜬, 바탕:{로직:GF…}|{참조:{층,주인,키:SK-…}}|null, 입력값, 열린입력[이름], 켜쌓기율?, 자재표시{cid}, 고름{cid:MT}, 덮개{cid:{qty|배율, labor, material, expense, 원값(서버)}}, 더한줄[{종류:인력|재료|기계, 요소, 이름, 단위, 수량, 비목?}|{종류:로직, 로직, 입력값, 수량}|{참조|고정, 수량}], 뺀줄[cid], 바탕판(서버)}` · cid = `kind:키#n`(kind = labor · material · machine · logic · pct · 키 = 요소 키 · 로직 줄 = 부르는 GC 키 · 조건 재료 = 이름 · 덧줄 = 이름 · 바탕 줄 차례로 셈) · 옵션 열어 둔 SK = 덮개 `배율` 만 · 엔진 입력 덧칸 = 호표 줄 `단가`(수) · 로직 줄 `값묶음{노무비, 재료비, 경비}`(712-1 출력 `묶음` 과 다름) · 함수 = `M02_Sangeun_Doc.clean(doc)` · `patched(바탕 줄, doc) → {줄, 고름{차례:MT}, 짝잃음[{cid, 까닭}]}` · `M02_Sangeun_Calc.calc(ref|doc, 입력값) → M01 calc 꼴 + 짝잃음` +- [x] 715-1a SK 문서 꼴 · 검사 · 줄 정체(`kind:키#n`) · 덮개 · 더한줄 · 뺀줄 · 고름 열쇠도 줄 정체 → 고친 줄 순수 함수(새 `M02_Sangeun_Doc.py` · 엔진 안 만짐 · 바로) — 확인 = 시험 · 뺀줄 뒤 고름 제자리 + - 검증완료 — test_715_sangeun_doc 9 통과(꼴 400 열하나 · 열린입력 = 배율만 · 덮개 qty · 배율 · 단가 · 값묶음 · 덧줄 율 다시 씀 · 뺀줄 뒤 고름 제자리 · 짝잃음 넷 남김 · 사슬 고름 옮김 · 바탕 없음) +- [x] 715-1b (712-1 · 712-2 뒤) 엔진 입력 덧칸 `단가` · `값묶음`(노 · 재 · 경 셋 · `master_pick.py`) · 고친 줄 셈(M01 `_swap`) · M02 SK 셈 길(로그인 · 저장 안 함 · 새 `M02_Sangeun_Calc.py`) — 확인 = 고친 줄 값 = 손셈 · 덧줄 % 다시 셈 · 짝 잃음 · 순환 422 + - 검증완료 — test_715_sangeun_engine 4 · store 7 · doc 9 · 715-3 6 통과(손 단가 = 손셈 · 3 % 덧줄 다시 셈 · 값묶음 일부 = 엔진 값 위 · 참조 · 고정 더한줄 = 1 단위 × 수량 · 짝잃음 · 순환 422) · M01 호표 덧칸 0 · 1,469 로직 값 전후 같음 · 8007 셈 길 손 단가 0.018 × 200,000 + 2,064.8 = 5,664.8 · 경비 5,000 + 169.9 +- [x] 715-2 서고 종류 · 서고 새로 길 · 뼈대 검사 · 참조(SK ← M01 · SK · M01 요소 · 일위대가) · 순환 막음 · 지우기 막음(`users()` 가 SK 도 훑음) · 층 복사(`M02_Labor_Ref.py` Expand 떼어 둠 · `Template_Layers.py` · `Store.py`) — 확인 = 시험(임시 storage) · 층 복사 왕복 + - 검증완료 — test_715_sangeun_store 7 통과(품 덮개 손셈 · 덧줄 3 % 다시 셈 · 뺀줄 뒤 고름 제자리 · 짝잃음 남김 · 사슬 순환 422 · 쓰는 곳 409 · 사전조합이 SK 담음 = 1 단위 × 2 · 개인 → 회사 → 개인 복사 같은 값) · 관련 시험 233 통과 · M01 1,469 · 층 사전조합 11 · 일위대가 24 값 전후 같음 · 8007 셈 길 일반 · 회사 관리자 200 · 남의 개인 층 400 +- [x] 715-3 일위대가 줄 SK 참조 · 그 일위대가 줄 덮개 · [단가산출로 저장] · 일위대가 단위 빈칸 막기 · 「1 단위 당」 머리(`M02_Labor_Doc.py` → 새 `M02_Labor_Patch.py` · `Labor_Calc.ts` 짝) — 확인 = 거울 시험 · 기존 사전조합 값 전후 같음 + - 검증완료 — test_715_3_labor_patch 6 통과(줄 덮개 = 손셈 · 3 % 다시 셈 · 줄 고름 차례 뺀줄 뒤 제자리 · SK 참조 줄 덮개 = 그 줄만 · SK 판 그대로 · [단가산출로 저장] 같은 값 · 줄 있는 일위대가 단위 빈칸 400) · 거울 시험 · 관련 시험 290 통과 · 층 사전조합 12 · 일위대가 24 · M01 1,469 값 전후 같음 · 8007 from-line 일반 개인 200(만든 SK 지움) · 마스터 403(일반 · 회사 관리자) · 단위 빈칸 400 + - 이음(715-3): 줄 칸 `패치 {덮개, 뺀줄, 더한줄}`(로직 줄 · SK 참조 줄 · 더한줄 참조 400 · 줄 고름 = 바탕 차례) · `POST /api/m02/layers/{층}/sangeun/from-line {줄, 이름, 단위}` → `{이름: SK 키, 줄: 참조 줄}`(문서는 화면 [저장]) · 셈 답 `머리` 「1 ㎡ 당」 · 빈 새 일위대가(줄 없음)는 단위 null 받음 + +## 716 M02 칸 차례 · 이름 · 옵션 정의 입구 · 메뉴 · 폴더 (내역 12 M02 · sub6) + +- 정함(브레인): 요구서 4장 1 · 18 · 20 · 21 · 차례 = 단가산출 › 일위대가 › 구조물 조합 ─ 일위대가 불러오기 › 도면 양식 › 실무문서 +- 사용자 확정(내역 14): 사전조합 새 이름 = 「일위대가」 +- [x] 716-1 (709-1 뒤) 구조물 옵션 정의 입구 → M01 단가산출 로직 아래 구분선(`M01_MasterData_UI_Side.ts` · `M01_MasterData_UI_Page.ts` · M02 `Layer.ts` open 돌려보냄 · 서버 길 그대로) — 확인 = M01 에서 열림 · M02 구조물 조합 옵션 읽기 그대로 + - 검증완료 — 시험 21 통과(settings_cards · 197_1 · 309_2) · typecheck 0 · ORCA 시스템 관리자: M01 `?open=옵션` 정의 화면 열림 · 옛 M02 `open=옵션` 주소 → M01 돌려보냄 · 저장 안 한 고침 칸 바꿀 때 · ☰ 떠날 때 물음(취소 = 머묾 · 확인 = 이동) · 밝음 · 어두움 구분선 보임 · M02 구조물 조합 옵션 읽기 코드 안 건드림 +- [x] 716-2 (716-1 뒤) 메뉴 — `settingLinks` 둘로(☰ = M01 · M02 · 대시보드 설계 기본값 = 칸별 줄 `?open=` · 지금 있는 칸만 · 단가산출 · 별칭 장부 줄은 717-2a · 718-3 이 더함) · M01 `open` 인자(`m_settings_nav.ts` · B01 SysDefaults · CompanyDefaults · Me) — 확인 = 역할 셋 ☰ 항목 · 대시보드 줄마다 그 칸 열림 + - 검증완료 — ☰ 시스템 관리자 = 마스터 데이터 · 마스터 템플릿 둘 / 회사 관리자 · 일반 = 마스터 템플릿 하나 · 대시보드 줄 일곱(마스터 요소 · 단가산출 로직 · 구조물 옵션 정의 · 일위대가 · 구조물 조합 · 도면 양식 · 계산 자리) 눌러 그 칸 열림(M01 open=로직 · 옵션 · M02 open=일위대가조합 · 구조물조합 · 도면) · 회사 설계 기본값 · 내 정보 줄 그대로 · M01 직접 주소 = 일반 · 회사 관리자는 대시보드로 + - 이음(716-2) — 줄 더하는 자리 = `m_settings_nav.ts` `settingLinks` 시스템 관리자 갈래 표 한 줄(`m01(열쇠, 이름, 설명, open)` · `m02(…)`) · 묶음은 줄의 `group` · M01 칸 고름 = `Side.reveal("로직" | "옵션")` 에 한 갈래 + Page `want` 줄 · 717-2a 단가산출 줄(m02) · 718-3 별칭 장부 줄(m01 · open=별칭)이 이 꼴로 더함 · M02 Side 의 옵션 줄(읽기)은 716-3 에서 뺌 +- [x] 716-3 (718-1 뒤) M02 왼쪽 차례 · 이름 · 구분선(`UI_Side.ts` · `UI_Page.ts` · `locale_m2.ts` · `PRECOMBO_TITLE` 키로 · 이름 따라가는 글 `Labor_Text.ts` · `Hopyo_Check.ts` · `Hopyo_Side` 제목은 718-1 몫) — 확인 = 사진 · 층 셋 + - 검증완료 — 시스템 관리자 왼쪽 칸 = 일위대가 › 구조물 조합 › 구분선(hr 1) › 일위대가 실무자료 › 도면 양식 › 실무문서 · 회사 관리자 · 일반 = 넷(도면 · 실무문서 없음) · 옛 옵션 줄 없음 · open=옵션 → M01 · open=일위대가조합 펼침 · 밝음 · 어두움 사진 · 시험 19 통과 · typecheck 0 + - Hopyo 쪽 남은 이름 글 = 718-1 뒤(`Hopyo_*` 안 「사전조합」 글 · 「일위대가 실무자료」 제목 · sub7 몫) +- [x] 716-4 (718-1 · 715-2 뒤) 폴더 — 사전조합 · 단가산출 폴더 길 종류 인자 · 안에 든 것째 지우기 + 확인 · 쓰는 곳 있으면 409 · 여럿 고름 · 복사 붙여넣기(구조물 조합 나무 꼴)(`M02_Precombo_Folders.py` · `M02_Labor_Router.py` 폴더 길 · `UI_Side_Precombo.ts` → 새 `UI_Side_Library.ts`) — 확인 = 시험(임시 storage) · 쓰는 문서 든 폴더 막힘 + - 검증완료 — 시험 49 통과(새 716-4 지킴 7) · typecheck 0 · ORCA 5181 일반 계정 개인 층: 폴더 만들기 · 이름 · 여기에 새 일위대가 · Ctrl 고름 복사 → 붙여넣기 「(1)」「(2)」 · 마스터 → 개인 복사(본뜬 = 마스터 SC) · 쓰는 문서 든 폴더 지우기 409 「검증716 쓰는 문서 ← SC-000002」 · 고른 5개 지우기 확인 창 → 문서 0 · 마스터 읽기 = 지우기 흐림 · 밝음 · 어두움 · 만든 것 모두 지움 + 715-3 이음 시험 고침 + - 이음(716-4) — 서고 칸 = `UI_Side_Library.ts` `buildLibrarySection({ kind, scope, bar, list, blank, text, … })` · 나무 길 `/layers/{층}/{precombo|sangeun}-tree`(+ `/paste`) · Api `fetchPrecomboTree(…, kind)` · `editPrecomboTree(…, kind)` · `pasteLibraryTree` · `newLibrary` 종류 sangeun — 717-2a 단가산출 칸이 kind "sangeun" 으로 부름 + +## 717 M02 단가산출 화면 · 고르기 · 일위대가 모달 (내역 12 M02 · 2 물결 · sub2 · 710 · 711 · 715-2 · 716-4 뒤) + +- 정함(브레인): 요구서 4장 4 · 12 · 15 · 16 · 상세 부품 = M01 폴더에 둔 채 API 길 주입 · M02 = 단가산출 상세 표 품 · 단가 칸 고침(고친 칸 색 + M01 값 곁 + 「어디서 고침」 꼬리표) · 서버 셈 · 최신 응답만 · 덮개 원값 = 저장 때 서버 +- [x] 717-1 상세 부품 공용 — `/m01` 길 주입(`Logic_Api.ts` · `Api_Fetch.ts` · `Logic_Note.ts`) · M02 `logic-lib` 읽기 넓힘 · 로그인 `/calc` 저장 안 한 줄 받기 — 확인 = M01 화면 전후 같음 · 일반 계정 읽기 + - 검증완료 — 시험 4(길 주입 없으면 /m01 · 넘기면 넘긴 길 · 저장 · 관리자 길 /m01 · 일반 읽기 · 요소 · 표 밖 파일 403 · 저장 안 한 줄 셈 · 정본 지문 같음) + 옛 시험 41 · typecheck 0 · 8001 일반 · 회사 관리자 = /m01/calc 403 · logic-lib auto · rows · calc · text 200 · GF000001 계 34,413.6 · 품 ×2 줄 68,827.2 · ORCA 5174 M01 GF000001 상세 계 34,414 · 부른 길 /m01(logic · calc · text · 표 모달 elements · table) — 전후 같음 + - 이음(717-1) — `setLogicApiPaths({ read, calc })`(`M01_MasterData_UI_Logic_Api.ts` · 안 넘기면 `/m01`) · 지금 길 = `logicApiPaths()` · M02 = 상세 그리기 전 `setLogicApiPaths({ read: "/m02/logic-lib", calc: "/m02/logic-lib" })` · 길 타는 함수 = fetchLogics · fetchLogicSubs · fetchLogic · fetchAuto · searchElements · searchPrice · fetchMaterials(read) · runCalc · runText(calc) · `Api_Fetch` fetchRows · fetchPick · `Logic_Note` loadTable(read) · 저장 · 만들기 · 관리자 길은 늘 `/m01` · 서버 `/api/m02/logic-lib/` 로그인 = logic/auto · logic/flow(GET) · elements · pick · materials · rows(인력 · 재료 · 기계 파일만) · table(소요량 · 계수만) · calc · text(`row` = 저장 안 한 줄 · 셈만 · 쓰기 없음) — 몸 · 답 = M01 같음(`M02_Logic_Lib_Read.py`) · 남은 `/m01` 박힘 = `LogicLab_Flow.ts`(→ `logicApiPaths().read`) · `LogicLab_Source` = `path` 넘김 · 로직 열기 = `setLogicOpener`(Modal) · 마스터 이동 = `setMasterJump`(UI_Side) — M02 는 등록 안 함 · 마스터 이동 단추 등록 없으면 숨김 = `UI_Side.ts` `hasMasterJump()` 한 줄 + `LogicLab_Modal.ts` `goButton` 3 줄 · 717-2b 몫 +- [x] 717-2a 단가산출 칸 껍데기 — 목록 · 폴더 나무 · 층 단추(기본 개인) · 대시보드 줄(새 파일 · UI_Main 밖 · 점검_구현 12 번 대상) — 확인 = 층 셋 · 폴더 · 사진 + - 검증완료 — 시험 59 통과(새 717-2a 지킴 2 · 낡은 글 대조 넷 고침) · typecheck 0 · ORCA 5181 일반: 왼쪽 맨 위 「단가산출」(열림) · 층 셋 기본 개인 · 마스터 = 「단가산출 없음」 · 서버 길로 SK-000002 만듦 → 상세 자리(이름 · 단위 · 바탕 GC001109 · 덮개 1) · 목록표 열(바탕 「GC001109 금속기와 해체」 · 고친 줄 1 · 쓰는 곳 0) · 폴더 추가 → 「여기에 새 단가산출」 SK-000003(단위 식 · 바탕 없음) 폴더 안 · 밝음 · 어두움 · 시스템 관리자 대시보드 「단가산출」 → `?open=단가산출` 칸 열림 · 만든 폴더 · SK 둘 지움(SK-000001 은 다른 창 것 · 그대로) + 낡은 시험 339 고침 + - 이음(717-2a) — 칸 = `UI_Side_Sangeun.ts` `buildSangeunSection` · 목록표 고름 `sangeunList(scope)` · 새 문서 몸 `Library_List.ts` `sangeunBlank`(단위 「식」 · 바탕 없음 · 더한줄 []) · 목록 줄 덧칸 `바탕`(「로직키 이름」 | 참조 SK 키 | null) · `고친줄수` · `쓰는곳수`(`M02_Labor_Ref.summary`) · 상세 자리 = `Sangeun_View.ts` `mountSangeunView(host, doc, { layer, owner, name, readOnly, onChanged })` → `{ getDoc, destroy }`(UI_Main 종류 sangeun 갈래) · 717-2b = 그 파일 자리표(`[data-sangeun-detail]` 안 createEmpty)를 `mountSangeunDetail(slot, doc, opt)`(새 `M02_MasterTemplete_Sangeun_Detail.ts`)로 갈음 · getDoc 을 그 손잡이 것으로 · 층 = 페이지 `sk`(주소에 안 실음) · 주소 `?open=단가산출` +- [x] 717-2b 단가산출 상세 · 고침 = 덮개 · 새로 = M01 로직 고름(새 `M02_MasterTemplete_Sangeun_Detail.ts`) — 확인 = SK 하나 만들고 품 고침 → 값 · 개인 층 · 저장 뒤 서버 값 같음 + - 검증완료 — 시험 test_717_2b 3 통과(고침 꼴 node · 화면 문서 꼴 서버 저장 왕복 임시 storage) + 관련 60 · typecheck 0 · 5177 일반 개인 층: 새 SK → [M01 로직 고름] GC000278(단위 ㎥ 자동) 계 12,273.43 = M01 같은 로직 계 → 포설공 품 0.02 · 보통인부 단가 180,000 · 0 줄 뺌 · 재료 MT000285 더함(별도계상 · 계 밖) · 굴착기 단가 90,000(노 · 재 · 경 몫 비) → 화면 계 14,110.91 = 저장 뒤 서버 셈 14,110.91 · 다시 열어도 고친 칸 2 · 뺀 줄 1 · 저장 안 하고 옮김 = 물음(취소 · 폐기 · 저장) · 폐기 뒤 서버 그대로 · 보기 넷 · 밝음 · 어두움 · 1080 · 768 · M01 GC000278 계 · 이동 단추 그대로 · 만든 SK 지움 + - [x] 717-2b 이어 — 메인 합치기(Sangeun_Cover 같은 이름 새 파일 두 표 한 파일 · calcSangeun 한 벌) · SK 더한 재료 줄 = 기본 계 안 · 줄 「별도계상」 칩만 계 밖(서버 Sangeun_Doc 정본) · 낡은 시험 test_m02_structure_panel 하나 + - 검증완료 — 시험 test_717_2b · 717_3 · 715 · 719 45 통과 · structure_panel 18 · typecheck 0 · 서버 셈 GC001109 + 재료 3×1,200: 재료비 0→3,600 · 계 6,451.22→10,051.22 · 별도계상 = 6,451.22 · 5177 일반 개인 층 새 SK + 합판 더함 → 재료 소계 · 계 11,354 → 별도계상 켬 = 소계 · 계 0 · 금액 (11,354) → 끔 = 11,354 · 켜고 [저장] → 문서 별도계상 true · 서버 계 0 · 일위대가 모달 [단가산출 보기] 두 보기 셈 그대로 · 만든 SK 지움 · 커밋 04f348948 · a1342124c + - 이음(717-2b) — 상세 = `Sangeun_Detail.ts` `mountSangeunDetail(host, doc, {layer, owner, readOnly, onChanged})` → `{getDoc, destroy}`(View 가 부름) · 고침 표 = `Sangeun_Cover.ts` `skCoverTable(rows, {edit, opened, tag, total, removed, onQty, onPrice, onDrop, onRestore, onApart})`(717-3 모달 표 `coverTable` 과 한 파일) · `calcSangeun(scope, 문서, 입력값)` · 순수 = `logic/M02_Sangeun_Cover_Model.ts`(`rowsOf(답, 바탕답, 문서)` · `setQty` · `setPrice` · `dropLine` · `restoreLine` · `setApart` · `sheetGroups`) — 717-3 모달이 tag 만 바꿔 씀 · M01 `buildLabDetail` 덧칸 `cover{ho, est}` · 마스터 이동 = `M01_MasterData_UI_Side.ts` `hasMasterJump()` +- [x] 717-3 (715-3 뒤) 일위대가 상세 → 단가산출 모달(공용 계산서 · 고침 = 그 일위대가에만 + [단가산출로 저장]) · `Labor_Detail.ts` · `Labor_Rows.ts` 손대기 전 나눔 — 확인 = 모달 고침 → 일위대가 금액 + - 검증완료 — 나눔(Labor_Rows 671→566 · Detail 700→650 · 시험 158 같음) · test_717_3 5 · 고친 대상 166 통과(test_175 B09 _PER 1 실패 = 전부터) · typecheck 0 · 5174 일반 개인 층: 일위대가 줄 [단가산출 보기] → 1 ㎡ 당 6,451 · 지붕잇기공 품 0.018→0.03 → 고친 줄 색 · 원래 0.018 · 꼬리표 · 1 ㎡ 당 9,334 → [적용] 그 줄 6,451→9,334 · 합계 36,409→39,292 · [저장] 서버 39,292.40 · 다른 일위대가 6,451.22 · SK-000001 6,451.22 그대로 · SK 참조 줄 품 0.012→0.02 → [단가산출로 저장] SK-000002(7,869.06) 목록에 · 줄이 SK-000002 참조로 · 덮개 풂 = 원래 값 · 닫기 · Esc · 떠남 물음 · 다시 읽어도 덮개 그대로 · 밝음 · 어두움(높이 768) · 만든 일위대가 둘 · SK 둘 지움 · ⚠ 단가 덮개는 값에 안 닿음(서버 엔진 덧칸 715-1b 전) · 커밋 f8338194c · c818dcae5 + - 이음(717-3) — 줄 단추 = `Labor_Rows` `RowHandlers.sangeun(i)`(로직 줄 · SK 참조 줄) · 모달 = 새 `M02_MasterTemplete_Labor_SangeunModal.ts` `openRowSangeun` · 고침 표 · 셈 길 부름 = 새 `M02_MasterTemplete_Sangeun_Cover.ts` `coverTable(calc, 원래, 패치, {edit, onCover, tag})` · `calcSangeun(scope, 문서)` · `sangeunFromLine` · 순수 = 새 `M02_Sangeun_Cover_Model.ts`(`lineDoc` = 줄 → 이름 없는 SK 문서 · 서버 `as_doc` 꼴 · `setCover` · `cleanPatch` · `sheetGroups`) — 717-2b 상세도 같은 표 · 셈 길을 씀 · 줄 칸 `패치` 는 `normalizeLabor` 가 지킴 +- [x] 717-4 (718-1 뒤) 단가산출 고르기 — 일위대가 [로직 추가] SK 탭(`Labor_Pick.ts`) · SK 더한줄 고르기 · 기준 목록(704-1) · B09 창고(703-1) SK 출처 — 확인 = 일위대가에 SK 넣고 금액 + - 검증완료 — 시험 test_717_4 2 · 고친 대상 33 통과 · typecheck 0 · 5182 일반 개인 층: [로직 추가] 탭 [기준 목록 | 단가산출 1] · SK 줄 「검증717 단가산출 · ㎡ · 6,451 · 단가산출 · 개인」 · 찾기 없는 낱말 0 줄 · 고름 → 일위대가 금액 6,451.2 = SK 1 단위 · B09 창고 「단가산출」 탭 SK 1 줄(6,451원) · 밝음 · 어두움 · 높이 1080 · 768 · 만든 SK · 일위대가 · 빈 폴더 지움 · 9d72d80b5 + 715-3 이음 시험 고침 + - 이음(717-4 · sub7): 새 `M02_MasterTemplete_Sangeun_Pick.ts` — `listSangeun(scopes)` = 위 층 SK 목록(마스터 › 회사 › 개인 차례 · 금액 = 층 목록 `기준금액`) · `openSangeunLinePicker({layer, owner}, done)` = 단가산출 더한줄 고르기(같은 [로직 추가] 창 · done 줄 = `{종류:로직, 로직, 입력값:{}, 수량:1}` | `{참조:{층,주인,키:SK·SC}, 수량:1}` | `{종류:재료, 요소, 이름, 단위, 수량:1}`) · 717-2b 화면이 부름 · 일위대가 줄 = 옛 참조 줄 꼴 `{참조:{층,주인,키:SK-…}, 수량:{손:1}}`(715-2 서버가 펼침) + +## 718 일위대가 불러오기 한시 · 별칭 장부 시스템 (내역 12 M02 · sub7 · sub8) + +- 정함(브레인): 요구서 4장 22 · 23 · 707-7 꼴 일회성 · 일위대가 줄 = 고정 줄 · 산근 블록 = 바탕 없는 단가산출 +- 사용자 확정(내역 14): 별칭 = 시스템 관리자가 승인한 것만 모두에게 +- [x] 718-1 (sub7) 불러오기 마법사(새 파일) — 올림 → 보기 · 확인 → 만들기 → [끝내기] 때 이번 올린 파일 지움(옛 HP 는 안 지우고 목록만 숨김) · 같은 엑셀 다시 올림 = 지문으로 겹침 막음 · 결과 층 고름 · 결과 체크 = 일위대가 · 단가산출(715-2 뒤 켬) · `Hopyo_Side` 제목 줄 함께(`Hopyo_Pick` · `Labor_Pick.ts:41` · `Labor_Router` hopyo 길 · `Hopyo_Store` · `Hopyo_Sheet` · `Hopyo_Check`) — 확인 = 실무 엑셀 하나 끝까지 · 끝낸 뒤 이번 HP 0 · 맞춤 장부 남음 · [구조물 조합으로] 누름 5 · 빠짐 0 그대로 + - 검증완료 — 시험 4 + 고친 대상 105 · 19 통과 · typecheck 0 · ORCA 5182 일반 개인 층 북부청 xls 68 호표: 모두 고정 빠짐 0 · 합계 68/68 · [구조물 조합으로] 4 누름(엑셀 보기 → 수정 → 구조물 조합으로 → 만들기) · 단가산출 49(산근 블록 49) · 끝낸 뒤 이번 HP 0 · 장부 남음 · 다시 올림 409 · 회사 관리자 = 개인 · 회사만 · 만든 것 되돌림(바뀐 파일 0) · 밝음 · 어두움 사진 + - 이음(sub7): 칸 제목 = locale `M02_HopyoImport` · 마법사 `M02_MasterTemplete_Hopyo_Wizard.ts`(단가산출 결과 = `SANGEUN_READY` · 715-2 push 뒤 켬) · [끝내기] = `DELETE /layers/{층}/hopyo/{키}` → `{지움, 만든}` · 올림 지문 = 끝낸 같은 엑셀 409 · 작업 중 같은 엑셀 `이어서` · HP 목록 = 지문 있는 것만 +- [x] 718-2 (sub8) 별칭 모으기 서버 — 층 `맞춤.json` + B09 내역 맞춤 기억 모음(회사 수 · 사람 수 · 익명) · 승인한 것만 · 마스터 장부(`/layers/system/hopyo-ledger`) — 확인 = 임시 storage 시험 · 처음 보는 파일 매칭률 전후 + - 검증완료 — 새 `M01_MasterData_Alias`(/api/m01/alias-ledger · 시스템 관리자만) · 시험 test_718_2 3 · test_m02_hopyo_ledger 5 · test_707_4 14 통과(임시 storage — 후보 4 · 회사 2 · 사람 5 · 익명(이름 · 파일 이름 0) · 충돌 = 같은 열쇠 다른 짝 · 승인 → 마스터 줄 → 다른 회사 새 사용자 recall · 반려 기억 · 일반 · 회사 관리자 403) · 공유 storage 읽기만 = 후보 19(회사 1 · 사람 3 · 충돌 2) · 처음 보는 파일 매칭률(골든 · 다른 파일 장부 모아 충돌 없는 것 승인) 새 파일 50 줄 86.0 → 86.0 % · 전부 177 줄 91.5 → 91.0 %(해 1 줄 — 다른 발주처 짝 · 승인은 사람 몫 그대로) · B09 잇기 기억에 마스터 층(브레인 허락) · 28e9a2a66 +- [x] 718-3 (sub8 · 716-1 뒤) M01 별칭 장부 화면(새 파일 · `M01_MasterData_UI_Side.ts` 칸 · 대시보드 줄) — 확인 = 후보 표 · 승인 → 마스터 장부 줄 + - 검증완료 — 새 `M01_MasterData_UI_Alias` · M01 왼쪽 「별칭 장부」 칸(옵션 정의 아래) · `?open=별칭` · 대시보드 설계 기본값 줄 · 시험 test_b01_settings_cards · test_197_1 · test_309_2 · test_718_2 · test_m02_hopyo_ledger 29 통과 · typecheck 0 · 화면(8010 · 시스템 관리자 · headless + ORCA 탭) 후보 19 줄(회사 1 · 사람 3 · 충돌 「다른 짝 있음」 2) · [승인] · [반려] 확인 창 → 취소 = 줄 19 그대로 · 마스터 층 파일 지문 전후 같음(실제 승인 쓰기는 임시 storage 시험) · 마스터 장부 탭(빈 장부 · 마스터 공사 내역 맞춤 없음) · 대시보드 「별칭 장부」 [열기] → 그 칸 열림 · 일반 · 회사 관리자 API 403 · 페이지 대시보드로 돌려보냄 · 밝음 1080 · 어두움 768 · c6df18398 + +## 719 프로젝트로 복사 · 업데이트 · 공사 안 산근 고치기 (내역 12 M02 · 2 물결 · sub8(719-1 · 719-2) · sub5(719-3 · 719-4) · 715 뒤) + +- 정함(브레인): 요구서 4장 14 · 15 · 원칙 3 · 굳힌 키 = SK 키에서 정해지는 값 · 덮개 지킴 · [단가산출 값으로] 단추(곁 글 품셈 값) +- 이음(719-1 · sub8): 굳힌 키 = SK 참조 이름표(층 · 주인 · 키) 해시 → `GX9#####`(겹치면 이름표 차례로 다음 번호 · 같은 SK = 같은 키 · 판 바뀌어도 그대로) · 사본 `단가.json` 안 파일 `로직_단가산출.json` · 사본 참조사본 SK = `{바탕{로직: 굳힌 키}, 입력값(사슬 합), 고름 · 자재표시(굳힌 줄 cid), 덮개{}, 더한줄[], 뺀줄[], 굳힌줄, 원본(원래 SK), 바탕판, 짝잃음}` · 함수 `M02_Item_Sangeun.freeze(참조사본)` · B09 서고 manifest `원본판` = 일위대가.json 지문(`Bill_Library.source_version`) +- [x] 719-1 SK 풀어 굳힘 → 사본 `단가.json` 로직 줄(굳힌 키 규칙) · 단가산출 속 일위대가 줄 = 일위대가 블록 펼침 · 서고 원본판(`M02_Item_Copy.py` · `M02_Item_Source.py` · `M02_Item_Prices.py` · `B09_Estimation_Bill_Library.py`) — 확인 = 구조물 사본 · B09 서고 금액 = M02 값 · 원본 층 그대로 · 145_2 거울 시험 + - 검증완료 — test_719_1_sk_freeze 4 통과(임시 storage — SK(품 덮개 0.5 · 인력 더한줄) 담은 일위대가 → 구조물 사본 셈 노 · 재 · 경 · 계 = M02 층 셈 · 원본 SK 지워도 같음 · B09 서고 사본(SC ← SK) 계 = M02 값 · 같은 SK 다시 복사 · SK 고친 뒤 = 같은 굳힌 키 · 다른 층 같은 번호 = 다른 키 · 원본 층 지문 전후 같음 · 원본판 다시 모아 같음 · SK 고침 → 다름) · 기존 시험 229 통과(145_2 거울 · 204_2 · 263_2 · m02_labor_ref · 715 · item_copy 등) · SK 없는 사본 = 묶음 그대로(M01 호표 5,266 줄 요소 꼴 전부 글 · 묶음 → 단가 묶음 같음) · b54950d28 + - 남음 — 715-1b 뒤: 단가 덮개 · 값묶음 · 참조 · 고정 더한줄 굳힌 셈 확인(굳힘은 고친 줄 그대로라 엔진 덧칸 붙으면 따라감) · B09 대가 블록 SK 꼴(`Labor_Source` 가 SK 를 사전조합으로 읽음 · 단가산출 속 일위대가 줄 블록 펼침) = 719-2 +- [x] 719-2 M01 직접 읽는 넷 자리 · [업데이트] · 내 자료집 SK(`B09_Estimation_Refresh.py` · `Daega_Personal.py` · `Sangeun.py` · `Labor_Source.py`) — 확인 = 업데이트 전후 덮개 · 입력값 · 고른자재 짝 같음 + - 검증완료 — test_719_2_sk_project 5 통과 · 1 건너뜀(715-1b 엔진 단가 · 값묶음 뒤 자동 실행 — SK 단가 덮개 · 속 일위대가 금액) · 굳힌 SK = 품셈 꼴 대가 블록 금액 = M02 SK 셈(비목마다 내림 차만) · [업데이트] 뒤 굳힌 키 · cover · cid · 입력값 · 고른자재 · B09 덮개 그대로(덮개 밑 = 새 단가산출 값) · 내 자료집 SK 왕복 같은 금액 · 관련 시험 218 통과(145_2 거울 · 155_5 · 703 · 719_1 등) · SK 없는 공사 금액 전후 같음(검증_랩탑메인 18 블록 13,662,560원 · 검증_sub5 14 블록 10,149,562원 · 읽기만) · typecheck 0 · ORCA 8010/5183 검증_sub8 — 내 것 「단가산출」 연결 제근 단가 143,292원(M02 143,293.07) · 펼침 곁 글 「단가산출 고침 — 품셈 품 0.018」 · SK 품 0.5→0.7 뒤 [업데이트] 미리 보기 「M02 단가산출 바뀜 1」 · 적용 뒤 덮개 0.9 그대로 · 밑 값 0.7 · 만든 SK · B09 v1 · 캐시 지움 · ccabbad6f · 6126f5ee2 · 328cb46d9 +- [x] 719-3 공사 안 단가산출(산근) 고치기 — B09 산근 시트 덮개(702 꼴 · 파이썬 · TS 짝) — 확인 = 거울 시험 · 산근 고침 → 대가 · 원가계산서 금액 + - 검증완료 — test_719_3 8 통과(거울 파이썬 = TS · 품 1.15→1.5 줄 금액 · 총계 · 하위 산근 → 부르는 블록 · 인건비 % 덧줄 비례 · 빈 단가 덮개로 채움 · 짝 잃음 · 두 번 덮어도 같음 · 덮개 지우면 처음 값 · 손 줄 → 원가계산서 직접재료비 · 새 단가 판 뒤 덮개 지킴) · 관련 B09 시험 110 통과 · typecheck 0 · 5183/8010 검증_sub8(시험 줄 넷 · 캐시) 낙석방지망 철망 품 1.15 → 1.5 = 계 9,066 → 10,466 · 손 줄 104,660 · 직접재료비 58,760 → 72,760(서버 /calc 같은 덮개 = 72,760) · 우클릭 [단가산출 값으로] 9,066 · 저장 안 하고 [<] = 「저장 안 한 고침이 있음」 · [저장] 뒤 GET 10,466 · 원래 품 1.15 · 밝음 1080 · 어두움 768 · 만든 저장본 지움(v1 빈 폴더) · 51f07499f +- [x] 719-4 (714-2 뒤) B09 단가산출근거 탭 = 공용 단가산출 계산서 부품(인력 · 재료 · 경비 보기 · 지금 표 · 박스 보기 갈음) — 확인 = 공사 금액 전후 같음 · M02 에서 본 꼴과 같음 · 사진 + - 검증완료 — test_719_4 2 통과(서버 줄 덧칸 · 묶음 옮김 금액 그대로 · 장비 한 줄 + 펼침 넉 줄 · 하위 산근 n호표) · 덧칸 뺀 옛 풀이와 13 블록 같음 · 일위대가 합 검증_랩탑메인 13,662,560 · 검증_sub5 10,149,562 그대로(읽기만) · ORCA 5183 근거 탭 카드 8 · 인력 · 재료 · 경비(장비) · 하위 로직 묶음 머리 기준단위 · 계 9,066 · 7,216 · 935,139 = 서버 · 옛 표 · 박스 보기 = 곁 창에만 남김 · 51f07499f + - 이음(719-3 · 719-4 · sub8): 산근 덮개 = 사용자 값 `sg_cover` {산근 키: {「줄차례:이름」: {qty?, labor?, material?, expense?}}} · 셈 짝 = `B09_Estimation_Sangeun_Cover.py` `cover_sangeun(sg, cover)` ↔ `.ts` `coverSangeun`(서버 풀이 뒤 덧씌움 · 고친 줄 base · covered · 짝 잃음 `sg_orphans` · 고침 없으면 그대로) · 서버 줄 덧칸 `sheet`{쓰는입력 · 기준단위 · 환산근거} · 블록 `기준단위` · 탭 그림 = 새 `B09_Estimation_UI_Tabs_Sangeun_Sheet.ts`(공용 calc_sheet 묶음 꼴)