knowledge(요구): 요구서 572 · 분석 — M02 단가산출 · 일위대가 중복 확인(PLAN 733)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-02 13:29:33 +09:00
co-authored by Claude Opus 5.5
parent 3449a434da
commit 8c5ef34365
2 changed files with 216 additions and 0 deletions
+179
View File
@@ -0,0 +1,179 @@
# 요구 571 · 572 — 실무문서 복사 · 생성 중복 거름 (조사 · 읽기만)
조사 = 코드 따라감 + 실제 storage 읽기(`scan_real.py`) + 실물 엑셀을 임시 층에 불러 셈(`test_dup_572.py` · 시험 틀 `test_m02_hopyo_excel.client` 본뜸 · 임시 storage `tmp/brain_572/pt/`). 코드 · 공유 storage · DB · git 안 고침. 지문 정규화 = `tmp/brain_572/fp572.py` · 원자료 `out/dup572.json` · `out/analyse572.json` · `out_real.json`.
## 0. 요약
1. 새 문서가 생기는 길 20 곳 — **내용 겹침 검사 0 곳** · 이름 검사 = B09 [내 자료집에 저장](409 물음) · 구조물 조합 같은 폴더(409 · 「(1)」)뿐 · 본뜬 검사 = 불러오기 같은 HP 안 · 같은 엑셀 바이트 · 공유 「요청 중」뿐(A 절).
2. 서고 새 키는 모두 `refs.create` 한 곳으로 모임 — 그러나 거기에 검사를 넣으면 [복사](일부러 같은 내용) · 빈 새 문서(모두 같음) · 직접 부르는 시험 30 여 곳이 걸림 → **길마다 입구에서 검사**.
3. 실측(여덟 파일 한 층): SK 117 중 내용 같은 사본 **35(30 % · 22 묶음 · 기초 32 · 파일 넘어 33)** · 이름까지 같은 것은 3 뿐 → **이름 검사로는 못 잡음 · 내용 지문이 필요** — 예 = 유로폼(보통) 일곱 파일 · 일곱 이름 · 한 내용. 기초 80 개 = 서로 다른 내용 49.
4. SC 245 중 같은 내용 59 — **모두 같은 파일 안** · 723-1 수량 걷음 때문에 규격만 다른 호표(수로BOX 여섯 크기 등)가 같아진 것(실무수량까지 같은 것 4) · 파일 넘어 0(엑셀 단가가 다름) → SC 는 자동 합치지 않음 · 목록에만.
5. 같은 엑셀 같은 바이트 = 막힘(작업 중 이어서 · 끝낸 뒤 409) · **바이트만 다른 사본 = SK 10 · SC 14 모두 다시 생김** · 개인에서 끝낸 파일을 회사 층에서 다시 = 막지 않음(층마다 기록 · 코드).
6. 지금 공유 storage = 시험 자료 수준(SK 2 · SC 14 · 구조물 조합 21) · 내용 겹침 = 구조물 조합 세 묶음뿐 → 쌓인 정리보다 **앞으로 막기가 먼저**.
7. 권함 = 내용 지문 한 벌(SK · SC · 서버 단독 · 새 파일) → ① 불러오기 SK = 같은 층 같은 내용이면 자동 기존 것 · 위 층 같은 것 알림 ② 사람 길 = 409 물음 「같은 것 있음 — 그것을 씀 / 그래도 새로」 ③ [중복 찾기] · 합치기(관리자 · 되돌림 폴더) — 일감 셋 · 정할 갈래 넷(D-5).
---
## A. 문서가 새로 생기는 길 — 지금 겹침 검사
표기 — 이름 = 같은 이름 막음 · 물음 / 내용 = 같은 내용 찾기 / 본뜬 = 같은 출처면 새로 안 만듦. ✕ = 없음.
### A-1. 서고 문서(일위대가 SC · 단가산출 SK) — 새 키는 모두 `refs.create`(`M02_Labor_Ref.py:292-301` · 그 층 다음 번호) 한 곳으로 모임
| # | 길 | 서버 | 화면 | 이름 | 내용 | 본뜬 |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | 새로 만들기(나무 [여기에 새 …] · 목록 [새로]) | `M02_Labor_Router.py:113-131` → `refs.create` | `UI_Side_Library.ts:202-212` · `Library_List.ts:228-237` | ✕ | ✕(빈 문서 · 뜻 없음) | — |
| 2 | 같은 층 복사(목록 [복사] → 이름 「(2)」 고침) | `M02_Labor_Router.py:123-131` · `_copy :109-110` | `Library_List.ts:239-261` | ✕ | ✕(일부러 같은 내용) | 남김만(`origin_mark :378-383`) |
| 3 | 나무 복사 → 붙여넣기(같은 층 · 다른 층 · 「〇〇로 복사…」) | `M02_Labor_Router.py:164-175` → `M02_Precombo_Folders.py:222-266` | `UI_Side_Library.ts:273-285` · `TreePanel_CopyTo.ts` | 폴더만 「(1)」 · 문서 ✕ | ✕ | 남김만 — 같은 문서를 두 번 붙이면 사본 둘 · 회사 → 개인(읽을 수 있는 위 층)도 막지 않음(원칙 = 연결) |
| 4 | 복사 때 딸린 참조 사본(`carry`) | `M02_Labor_Ref.py:386-406` | — | ✕ | ✕ | `done` = 한 번 부름 안에서만 → 같은 원본을 다시 복사하면 딸린 문서도 또 생김 |
| 5 | 공유 요청 승인(개인 → 회사) | `M02_Share_Request.py:175-205` → `refs.create(carry(…))` | `ShareRequest.ts:173` | ✕ | ✕ | 「요청 중」 같은 것만 409(`:134-137`) · 승인 뒤 다시 요청 = 회사에 또 사본 |
| 6 | 불러오기 [단가산출 만들기] | `M02_Hopyo_Sangeun.py:199-244` · `Maker.write :190-196` | `Hopyo_WizardSk.ts` | ✕ | ✕ | `made() :44-58` = 본뜬 키 「HP-###### 단산N」 + 원본 층 — **같은 HP 안에서만** 그대로 |
| 7 | 불러오기 일위대가(호표 만들기 · [모두 고정으로 들여오기]) | `M02_Hopyo_Build.py:100-127 _save` · `build_all :564-` | `Hopyo_Sheet.ts` | ✕ | ✕ | 본뜬 「HP-###### 제N호표」 + 원본 → 같은 HP 안에서만 덮음 · 그대로 |
| 8 | 일위대가 만들기 중 SK 이음(없으면 그 블록 SK 만듦) | `M02_Hopyo_SkLink.py:44 · 61-` → `sangeun.made` · `Maker` | — | ✕ | ✕ | 6 과 같음 |
| 9 | 엑셀 올림 자체 | `M02_Labor_Router.py:226-245 _upload` · `M02_Hopyo_Store.py:66 fingerprint`(바이트 sha256) · `:81 done` | `Hopyo_Wizard.ts` | — | — | 같은 **바이트** = 작업 중 이어서 · 끝낸 뒤 409 · **층마다**(`store.root()`) → 개인에서 끝낸 파일을 회사 층에서 또 = 막지 않음 · 다시 저장한 엑셀(바이트 다름) = 막지 않음 |
| 10 | 엑셀 붙여넣기(705-2) | `M02_Hopyo_Paste.py:295-313` → HP 새 키(「붙여넣기 MM-DD HH:MM」) + `build_all` | `Labor_Paste.ts` | ✕ | ✕ | 붙일 때마다 새 HP → 같은 글 두 번 = SC 두 벌 · 지문 없음 |
| 11 | [단가산출로(도) 저장] from-line | `M02_Sangeun_Router.py:47` → `M02_Sangeun_Calc.py:484-499` | `Labor_RowSk.ts:8 · 50` · `Labor_SangeunModal.ts:9` · `Sangeun_Cover.ts:45` | ✕ | ✕ | — |
| 12 | 일위대가 줄 고침 lineDoc | 화면 메모리 문서(`Labor_RowSk.ts:45-50`) → 줄 `패치` 로만 남음 | — | 새 문서 아님 — 대상 밖 | | |
| 13 | B09 [내 자료집에 저장] | `B09_Estimation_Daega_Personal.py:287-306 write` | `B09_Estimation_UI_Tabs_Bill_Fold_Menu.ts:91-130` | **같은 이름 409 `{같은이름, 이름}` → 덮어쓰기 · 새 이름** | ✕ | 하위 호표 `_carry :261-284` = `복사원본` 으로 다시 씀 — 단 찾는 목록이 `hopyo_build._origins`(본뜬.층 = 실무자료만) → 실무자료 아닌 하위는 저장마다 새로(빈틈) |
| 14 | 프로젝트 굳힘(참조사본 `frozen`) | `M02_Labor_Ref.py:452-468` | — | 원칙상 프로젝트 = 복사 → 대상 밖 | | |
### A-2. 구조물 조합(구조물집계표 열 · `labor/` 일위대가 SU)
| # | 길 | 서버 | 이름 | 내용 | 본뜬 |
| --- | --- | --- | --- | --- | --- |
| 15 | 나무 [항목 더하기] | `M02_MasterTemplete_Router_Items.py:250-260` → `M02_MasterTemplete_Tree.py:172-174 · 251` | 같은 폴더 같은 이름 409 | ✕ | — |
| 16 | 층 넘김 붙여넣기 · 복사 · 공유 승인(항목) | `M02_Item_Paste.py:44-106` → `M02_MasterTemplete_Items.py:140-190` · `Router_Items.py:192` | 「이름(1)」 · 복사이름 「… 복사」 | ✕ | 열 `본뜬` 남김만 |
| 17 | 실무 호표 [구조물 조합으로] | `M02_Hopyo_Item.py:89-145` → `M02_Item_Personal.py:44-` | 「이름(1)」 | ✕ | ✕ — 누를 때마다 새 항목 |
| 18 | 프로젝트 [새 항목] · [개인에 저장] | `M02_Item_Copy.py:298-330` → `create_item` | 「이름(1)」(`_free_path`) | ✕ | `원본` 남김만 |
| 19 | 열 내용 가져오기(`copy_from` · `copy_pair`) | `M02_MasterTemplete_Store.py:442-490` | 새 문서 아님(받는 열 덮음) → 같은 내용 열 둘이 남음 | | |
| 20 | 프로젝트 양식 [내 양식으로 저장](도면 · 표) | `Router_Layers.py:513-541` → `M02_Template_Layers.py:328-370` | 같은 이름 파일 **말없이 덮음** · 서고 종류 아님 | | |
| — | 옛 실무문서 조합(UA · `Combo_Store`) | 732 가 걷는 중 | 대상 밖 | | |
- 정리: **이름 검사 = B09 내 자료집(409 물음) · 구조물 조합 같은 폴더(409 · 「(1)」)뿐 · 내용 검사 = 0 곳 · 본뜬 검사 = 불러오기 같은 HP 안 · 엑셀 같은 바이트 · 공유 「요청 중」뿐.**
## B. 지금 있는 지문 · 같음 판정 재료
| 재료 | 자리 | 무엇 | 내용 지문에 |
| --- | --- | --- | --- |
| `fingerprint(row)` | `M02_Sangeun_Calc.py:96-98` | sorted JSON sha256 앞 16 | 함수 그대로 씀 · 지금 쓰임 `바탕판` = **M01 로직 줄 판 표지**(개정 감지) — 문서 내용 지문 아님 → 지문에서 뺌 |
| `derived_key(*parts)` | `common_util/common_util_derived_store.py:21-24` | sorted JSON sha1 | 공용 해시 — 이것을 씀(새 해시 함수 안 만듦) |
| `sangeun_key(code, 입력값, 율, 고름)` | `B09_Estimation/B09_Estimation_Sangeun.py:79-88` | 로직 + 입력값 정리(`_clean_given`) + 율 + 고름 → 「SG:키:해시」 | 「기초 SK」(바탕 로직 · 덮개 없음) 지문과 같은 꼴 · 입력값 정리 재사용 후보 |
| B09 블록 id `DG:` | `B09_Estimation_Labor_Source.py:74-76 · 91-` | kind · origin · lines 해시 = 같은 블록 하나 | 같은 발상(프로젝트 안) |
| `no_qty` · `is_rate` | `M02_Labor_Ref.py:176-185` | SC 줄 · 자재 수량 걷음 · 비율 줄 율만 | SC 지문 수량 규칙 그대로 |
| `line_ids` · cid | `M02_Sangeun_Doc.py:94-104` | 덮개 · 뺀줄 열쇠 = 줄 정체 | 이미 차례 무관 열쇠 → 지문에 그대로 |
| `refs_in` · `ref_id` · `users` · `refuse_used` | `M02_Labor_Ref.py:56-69 · 350-375` | 참조 자리 · 모든 층 쓰는 곳 훑기 | 깊은 지문(참조 → 가리킨 문서 지문) · 합치기 때 쓰는 곳 찾기 |
| `_move_doc` · `_moved` · `_spec_moved` | `M02_Labor_Ref.py:409-437` | 문서 안 참조를 바꿔 끼움(규격 열 열쇠까지) | 합치기 때 참조 옮김 그대로 |
| `origin_mark` · `본뜬` · `복사원본` | `M02_Labor_Ref.py:378-383` | 어디서 왔나 | 복사 · carry 재사용 열쇠(같은 원본 사본이 이미 있나) |
| 엑셀 바이트 지문 · 불러옴 기록 | `M02_Hopyo_Store.py:66 · 81` | 파일 sha256 · 층마다 | 파일 단위만 — 문서 겹침 못 잡음 |
| 엑셀 블록 지문 · 우리 로직 지문 · 판정 | `M02_Hopyo_Finger.py` · `M02_Hopyo_Ours.py:297` · `M02_Hopyo_Verdict.py` | 엑셀 → M01 로직 맞춤(직종 품 · 장비 · 자재 · 금액 뺌) | 문서끼리 같음엔 직접 안 씀(맞춤이 같으면 SK 내용도 같음 → SK 지문으로 충분) |
| `same_item` | `M02_Item_Snapshot.py:88-93` | 프로젝트 사본 = 층 · 주인 · 키 · 규격 | 출처 기준 같음 |
| `unique_path` | `M02_MasterTemplete_Tree.py:177-183` | 이름 뒤 「(1)」 | 구조물 조합 이름 구분 그대로 |
## C. 실측
### C-0. 내용 같음 정규화 규칙(측정에 쓴 것 · `fp572.py`)
- 뺌: 키 · 이름 · 구분 · 상세구분 · 본뜬(실무수량 포함) · 메모 · 별칭 · 바탕판 · 덮개 원값 · 계산값 · 열 · 일위대가번 · 종류 · 고정 줄 `출처`(파일 · 호표 · 줄).
- 수 = Decimal 정규화(0.20 = 0.2 = 「0.2」) · 글 = 겹 빈칸 정리 · 빈 값 칸 뺌 · 단위 = 소문자 + m3 → ㎥ · m2 → ㎡.
- SC 줄 · 자재 수량 = null(723-1 `no_qty` 그대로 · 비율 줄 율만) · 구조물 조합(labor)은 수량 넣음.
- 차례 무시 — 더한줄 · 담은로직 · 자재 · 뺀줄 · 열린입력 정렬 · 더한줄 요소 줄은 이름 뺌(요소 키가 정체).
- 참조 = 가리킨 문서의 지문으로 바꿈(깊은 지문 · 깊이 8) — 층 넘어 사본도 같다고 봄.
### C-1. 공유 storage 실측(읽기만 · `scan_real.py` · `out_real.json`)
| 층 | SK | SC | 구조물 조합(빈 문서 뺌) | 같은 층 이름 겹침 | 같은 층 내용 겹침 |
| --- | --- | --- | --- | --- | --- |
| 시스템 | 0 | 1 | 6 | 0 | 구조물 조합 1 묶음(item1 = item1_2 = item3_3 · 담은로직 14 줄 같음) |
| 회사 1 · 3 | 0 | 0 | 0 | 0 | 0 |
| 개인 1/10 | 0 | 8 | 10 | 0 | 구조물 조합 1 묶음(item1_2 = item6_2) |
| 개인 1/3 | 2 | 4 | 4 | 0 | 0 |
| 개인 1/9 · 3/15 · 1/1 · 3/14 | 0 | 0 · 1 · 0 · 0 | 1 · 0 · 0 · 0 | 0 | 0 |
- 층 넘어: 이름 = SC 「배수관날개벽(유입구) D=1,000mm,일반형」 1/10 ↔ 1/3(서로 다른 파일 · 내용 다름) · 내용 = 구조물 조합 1/10 item3_3 = 1/3 item3_3_2(1/10 것을 본뜸).
- 지금 쌓인 SK · SC 내용 겹침 = 0 — 불러온 것이 적어서. 겹침은 앞으로 불러오기에서 생김(C-3).
### C-2. 한 파일(거창 xlsx · 임시 개인 층 · `out/dup572.json` S1)
| 단계 | 올림 | 새 SK | 새 SC | 비고 |
| --- | --- | --- | --- | --- |
| 처음 | 200 | 10(기초 6 · SK 4 · 고름 대기 3) | 14(모두 고정 · 막지 않는 길) | 막는 길(729-2 strict) = 14 호표 모두 실패 · SC 0 |
| 같은 바이트 다시(작업 중) | 200 이어서 | 0 | 0 | 그대로 10 · 14 |
| [끝내기] 뒤 같은 바이트 | **409** | — | — | 「이미 불러온 엑셀 … 다시 만들지 않음」 |
| 내용 같고 바이트 다른 사본(zip 다시 묶음 · 이름 「사본_…」) | 200 새 HP | **10** | **14** | 모두 앞 것과 내용 같음(SK 10/10 · SC 14/14) |
| 그 사본 다시(작업 중) | 200 이어서 | 0 | 0 | |
### C-3. 여덟 파일을 한 층에 차례로(임시 개인 층 · S2)
| 차례 · 파일 | 블록 | 새 SK(기초 · SK · 고름 대기) | 그 가운데 앞 파일과 내용 같음 | 새 SC | 앞 파일과 같음 |
| --- | --- | --- | --- | --- | --- |
| 1 북부청임도 | 49 | 37(24 · 13 · 12) | 0 | 68 | 0 |
| 2 북부청사방 | 45 | 27(19 · 8 · 18) | **16** | 27 | 0 |
| 3 거창 | 13 | 10(6 · 4 · 3) | 4 | 14 | 0 |
| 4 봉화 | 31 | 13(9 · 4 · 18) | 2 | 45 | 0 |
| 5 동부청영월 | 35 | 18(13 · 5 · 17) | 5 | 23 | 0 |
| 6 울진대흥 | 14 | 6(4 · 2 · 8) | 3 | 34 | 0 |
| 7 영덕계류 | 2 | 0(0 · 0 · 2) | 0 | 9 | 0 |
| 8 울진소광 | 17 | 6(5 · 1 · 11) | 3 | 25 | 0 |
| **합** | 206 | **117** | **33**(+ 같은 파일 안 2 = 남는 사본 35) | **245** | 0(같은 파일 안 59) |
- SK: 서로 다른 내용 82 · 묶음 22 · 남는 사본 35(기초 32 · SK 3) · **이름까지 같은 묶음 2(남는 3)** · 이름 같고 내용 다름 7 묶음(예 「유로폼 설치 및 해체」 여섯 = 간단 · 보통 두 내용 · 「합판거푸집(4회)」 넷 = 셋 같음 + 하나 다름).
- 보기 — 유로폼(보통) 7 사본: 「유로폼(보통,0~7m)」 · 「유로폼(Euro Form)(6회, 보통)」 · 「유로폼 설치 및 해체」 · 「유로폼 설치,해체(보통)」 … / 레미콘타설(장비 · 철근) 3 사본: 「레미콘타설(장비사용) (철근구조물)」 · 「…(철근구조물)」 · 「철근콘크리트타설」.
- SC: 서로 다른 내용 186 · 묶음 32 · 남는 59 — 모두 같은 파일 안 · 이름까지 같은 묶음 1 · 실무수량까지 같은 묶음 4 → 나머지는 규격만 다른 호표(「수로BOX 구체 4.0×2.0 · 4.0×1.5 · 2.5×2.5 …」 여섯 · 「배수관날개벽 D=800 · 1,000 · 1,200 · 1,500」 다섯 · 「L형측구옹벽 H 0.6 · 0.9 · 1.2 · 1.5」 넷). 이름 같고 내용 다름 7 묶음 = 파일 넘어 같은 품명 · 다른 엑셀 단가(「돌수로(넓은호형) B=2.3 …」 · 「임도차단기 H=1.2m, B=5.6m」).
- 고름 대기 89 블록은 아직 SK 안 만듦 — 사용자가 기초를 고르면 같은 겹침이 더 생김.
- 층 넘어(개인 → 회사 같은 파일) = 엑셀 지문 기록이 층마다라 통째 다시 생김(`M02_Labor_Router.py:226-235` · 측정 틀의 권한이 회사 쓰기를 못 해 코드로만 확인).
## D. 권함
### D-1. 내용 지문 정의(서버 단독 · 새 파일 `M02_MasterTemplete/M02_Library_Same.py`)
- 해시 = `common_util_derived_store.derived_key`(새 해시 안 만듦) · 저장 칸 안 만듦(그때그때 셈 — 참조 문서가 바뀌면 저장 지문이 낡음) · 층 훑기 = (파일, 판) 메모.
- **SK** 넣음 = 단위 · 바탕(로직 키 | 참조 → 가리킨 문서 지문) · 입력값(빈 값 뺌 · 수 정규화) · 환산 · 켜쌓기율 · 열린입력 · 고름 · 자재표시 · 덮개(원값 뺌) · 더한줄(바탕판 · 원값 · 고정 출처 뺌 · 요소 줄 이름 뺌 · 참조 → 지문) · 뺀줄.
- **SC** 넣음 = 단위 · 담은로직(로직 · 입력값 · 고름 · 자재표시 · 켜쌓기율 · 패치 · 고정 {이름 · 규격 · 단위 · 단가 · 이음 · 비율} · 참조 → 지문) · 자재(코드 + 세 칸) · 규격.
- 둘 다 뺌 = 키 · 이름 · 구분 · 상세구분 · 본뜬 · 메모 · 별칭 · 날짜 · 고정 줄 출처.
- 차례 = 정렬(셈과 무관 · 화면 차례만 다름) · 수량 = SC 는 null(723-1 · 비율 줄 율만) — 규격만 다른 호표는 같은 지문 → **자동으로 합치지 않음 · 목록에 「수량만 다름」(본뜬.실무수량 견줌)으로만**.
- 빈 문서(SK 바탕 없음 + 줄 0 · SC 줄 0 + 자재 0) = 지문 없음(검사 안 함 — [새로] 빈 문서끼리 다 같음).
- 바탕판(M01 판 표지)은 뺌 — 같은 바탕을 다른 M01 판에서 저장해도 같은 것.
### D-2. 만들 때 검사
| 길 | 같은 층 같은 내용 | 위 층(회사 · 마스터) 같은 내용 | 이름 같고 내용 다름 |
| --- | --- | --- | --- |
| 불러오기 [단가산출 만들기] · 이음 중 SK(A 6 · 8) | **자동 기존 것**(새로 안 만듦 · 응답 `같은것씀 [{번, 키}]`) — 이름이 달라도(실측 35 중 이름 같음 3) | 응답 `위층같음 [{번, 참조}]` → 결과 화면 「위 층에 같은 것 — 연결 권함」 · 자동 연결 안 함 | 막지 않음 · 결과에 수만 |
| 불러오기 일위대가 · 붙여넣기(A 7 · 10) | 지금 그대로(본뜬) — SC 파일 넘어 같음 0 · 같은 파일 안 59 는 규격 차이 → 자동 안 함 | 알림만 | 알림만 |
| 엑셀 올림(A 9) | 그대로(바이트) | 위 층에 같은 바이트 기록 있으면 「회사 층에서 이미 불러옴」 알림(막지 않음) | — |
| 새로 만들기(내용 있을 때) · from-line · B09 내 자료집 · 공유 승인 · 구조물 조합으로(A 1 · 11 · 13 · 5 · 17) | **409 `{같은내용: [{층, 주인, 키, 이름}]}` → 물음 「같은 것 있음 — 그것을 씀 / 그래도 새로」** · 그래도 새로 = 몸 `새로: true` · 그것을 씀 = 그 키를 엶 · from-line 은 그 SK 참조 줄을 줄에 넣음 | 같은 물음 · 「그것을 씀」 = 위 층 참조(복사 안 함) | 막지 않음 · 저장 뒤 알림 「같은 이름 N — 내용 다름」 |
| 층 넘김 붙여넣기 · 복사 carry(A 3 · 4) | 대상 층에 본뜬 = 같은 원본 + 같은 지문 사본이 있으면 그 키 씀(딸린 문서 다시 안 만듦) | 위 층 문서를 아래 층에 붙임 = 물음 「위 층 문서는 연결로 씀 — 그래도 복사」 | 막지 않음 |
| 같은 층 [복사] · 같은 층 붙여넣기(A 2 · 3) | 묻지 않음(복사가 뜻) — 갈래 D-5 ① | — | — |
- B09 내 자료집은 지금 `같은이름` 409 꼴(`B09_Estimation_Daega_Personal.py:292-300`) 그대로 두고 `같은내용` 칸만 더함 · 하위 호표 `_carry` 찾는 목록을 실무자료 한정(`hopyo_build._origins`)에서 모든 SC 본뜬 · 복사원본으로 넓힘(빈틈 메움).
- 이름 구분 — SK · SC 이름에 「(2)」 자동으로 안 붙임(키가 정체 · 실무 이름 지킴) · 대신 목록 · 고르기 창 이름 뒤에 상세구분(파일) · 바탕 로직 회색 글 · 구조물 조합 「(1)」은 그대로.
- 지문 같은 SK 를 자동 기존 것으로 쓸 때 뒤 파일 이름은 그 SK `본뜬.또 [{키, 파일, 이름}]` 에 남김(출처 여럿 · `made()` · `confirmed()` 가 읽어 「그대로」 판정 · HP 지울 때 영향 없음).
### D-3. 이미 쌓인 중복 — [중복 찾기] · 합치기
- 자리 = M02 왼쪽 서고 나무(일위대가 · 단가산출) 메뉴 [중복 찾기] → 창: 묶음마다 문서(층 · 키 · 이름 · 구분 · 상세구분 · 쓰는 곳 수) · 이 층 + 위 층 같은 것 · 꼬리표 「내용 같음」 · 「수량만 다름」(SC).
- 서버 = 새 파일 `M02_Library_Same_Router.py` — `GET /layers/{layer}/{kind}-same`(읽기) · `POST …/{kind}-same/merge {남김, 지움[], 판}`(`M02_Labor_Router.py` 642 줄 → 700 줄 넘지 않게 따로).
- 합치기 = ① 서버가 남김 · 지움 지문을 다시 셈(같지 않으면 409) ② 쓰는 곳(`refs.users` 훑기 · 이 층 + 아래 층) 가운데 **쓰기 권한 닿는 곳만** 참조를 남김으로 바꿈(`_move_doc` · `_spec_moved` 그대로 · 판 검사) ③ 권한 밖(남의 개인 층) 쓰는 곳이 남은 문서는 안 지우고 「남김 — 쓰는 곳 N」 ④ 지운 문서 = `{층}/_합친것/<키>.json` 으로 옮김(되돌릴 길 · `Item_Copy` 의 `_지난/` 꼴) ⑤ 나무 자리 정리(`M02_Precombo_Folders`).
- 위 층과 같은 아래 층 문서 = 같은 길 · 남김 = 위 층 키(「위 층으로 연결」).
- 권한 = 그 층 쓰기(개인 = 본인 · 회사 = 회사 관리자 · 마스터 = 시스템 관리자) · 프로젝트 사본 = 굳힌 값이라 영향 없음.
- 구조물 조합(A-2) 중복 찾기 = 뒤로(실측 세 묶음 · 732 가 같은 파일 만짐).
### D-4. 일감(파일 경계)
| 일감 | 대상 파일 | 시험 · 확인 | 다른 창과 |
| --- | --- | --- | --- |
| 1 서버 지문 · 불러오기 SK 자동 기존 것 | 새 `M02_Library_Same.py` · `M02_Hopyo_Sangeun.py`(Maker.write · build · made) · `M02_Hopyo_SkLink.py` · `M02_Hopyo_Build.py`(confirmed · `본뜬.또` 읽기만) | 새 `resources/tester/test_572_library_same.py`(지문 규칙 · 같은 층 자동 · 위 층 알림) · 이 조사 `test_dup_572.py` 다시 → SK 남는 사본 35 → 0 · S1 사본 10 → 0 | 겹침 없음(730-2 = `Hopyo.css` 화면만) |
| 2 서버 만들 때 물음 · 복사 재사용 | `M02_Labor_Router.py`(new_library · 몸 `새로`) · `M02_Precombo_Folders.py` · `M02_Labor_Ref.py`(carry) · `M02_Sangeun_Calc.py` · `M02_Sangeun_Router.py` · `M02_Share_Request.py` · `M02_Hopyo_Item.py` · `B09_Estimation_Daega_Personal.py` | 고친 대상 시험 + 새 시험 · 일감 1 뒤(지문 모듈) | 겹침 없음 |
| 3 화면 물음 · [중복 찾기] · 합치기 | `Library_List.ts` · `UI_Side_Library.ts` · `Sangeun_Cover.ts` · `Labor_SangeunModal.ts` · `Labor_RowSk.ts` · `Hopyo_WizardSk.ts`(같은것씀 · 위층같음) · `B09_Estimation_UI_Tabs_Bill_Fold_Menu.ts` · 새 `M02_MasterTemplete_Library_Same.ts` · 새 `M02_Library_Same_Router.py` · 세 갈래 물음이 필요하면 `ui_template_modal.ts`(지금 `askConfirm` 두 단추뿐) | ORCA 검증 · typecheck | **731 뒤**(Labor 모달 · 표 이웃) · **730-2 뒤**(Hopyo 화면) |
- 낡을 시험(고치거나 까닭 적음):
- 일감 1 — `test_718_1_hopyo_import.py:71-96`(`len(docs) == len(만듦)` · 북부청임도 = 같은 파일 안 같은 내용 SK 1 쌍) · `test_729_hopyo_sk_link.py:56-`(기초 + SK + 고름 대기 = 블록 · 키 번호).
- 일감 2 — `test_m02_labor_ref.py:317-392`(복사 · carry 키 번호) · `test_716_4_library_folders.py:93-112`(같은 층 붙여넣기 — 묻지 않기로 하면 그대로) · `test_703_b09_daega_copy.py:165-205`(같은이름 409 꼴 — 같은이름을 먼저 두면 그대로) · `test_706_1_share_request.py:55-113` · `test_715_3_labor_patch.py:102-114`(from-line) · `test_705_2_hopyo_paste.py:318-360`(구조물 조합으로).
- `refs.create` 는 안 고침 → 그것을 바로 부르는 시험 30 여 곳 그대로.
### D-5. 정할 갈래(사용자)
1. 같은 층 [복사] · 같은 층 붙여넣기에도 물을지 — 권함 = 묻지 않음(복사가 뜻 · 지금 꼴 그대로).
2. 불러오기 SK 자동 기존 것 — 이름이 다를 때 이름 = 먼저 만든 것 그대로 + 뒤 이름은 `본뜬.또` · 권함 = 그렇게(실측 35 중 32 가 이름 다름).
3. 위 층에 같은 것 — 자동 연결 vs 알림 · 권함 = 알림(판단은 설계자 몫).
4. 합치기 때 권한 밖(남의 개인 층) 쓰는 곳 — 권함 = 그 문서는 남김 · 회사 관리자에게 「쓰는 곳 N」 만 보임.
@@ -0,0 +1,37 @@
# 요구서 — 요구 571 · 572 · M02 단가산출 · 일위대가 중복 확인
원문 = `사용자요구_1102.md` 요구 571 · 572 · 근거 = 같은 폴더 `_분석_572_중복.md`.
## 1. 지금
- 문서가 새로 생기는 길 20 곳 · 내용 검사 0 곳 · 이름 검사 = B09 내 자료집 · 구조물 조합 같은 폴더뿐 · 본뜬 검사 = 불러오기 같은 HP 안 · 엑셀 같은 바이트 · 공유 「요청 중」뿐.
- 실무 파일 여덟 개를 한 층에 불러오면 SK 117 중 35(30 %)가 내용 사본 · 그중 32 는 이름이 다름(예 유로폼(보통) = 일곱 파일 · 일곱 이름 · 같은 내용) → 이름 검사로는 못 거름 · 내용 지문이 필요.
- SC 245 중 59 = 같은 파일 안 내용 사본(723-1 로 수량을 안 들여 크기만 다른 호표가 같아짐 · 예 수로BOX 여섯 크기).
- 지금 공유 storage = 시험 규모(SK 2 · SC 14 · 구조물 조합 21) → 새 사본 막음이 정리보다 급함.
## 2. 사용자 확정
- 중복 확인 기능 조사 진행 후 수정 진행(요구 572).
## 3. 정함(브레인) — 사용자가 바꿀 수 있음
1. 내용 지문 한 벌(SK · SC · 서버 단독 · 새 파일) — 이름 · 메모 · 본뜬 · 날짜 · 고정 줄 출처 뺌 · 줄 차례 정렬 · SC 수량 null 그대로 · 빈 문서는 지문 없음 · 해시 = `common_util_derived_store.derived_key`(새 해시 함수 안 만듦).
2. 불러오기 = 같은 층에 같은 내용 SK 가 있으면 자동으로 그것을 씀 · 이름 = 먼저 만든 것 그대로 · 뒤 이름은 `본뜬.또` 에 남김 · 위 층(회사 · 마스터)에 같은 것 = 알림만(「위 층에 같은 것 — 연결 권함」 · 판단은 설계자).
3. 사람 길(새로 만들기 · 단가산출로도 저장 · B09 내 자료집 · 공유 승인 · 구조물 조합으로 등) = 같은 층 같은 내용이면 409 → 「같은 것 있음 — 그것을 씀 / 그래도 새로」 · 같은 층 [복사] · 같은 층 붙여넣기는 묻지 않음(복사가 뜻).
4. [중복 찾기] 목록 + 합치기(관리자 · 그 층 쓰기 권한) — 쓰는 곳 참조를 남김으로 옮김(권한 닿는 곳만) · 권한 밖 쓰는 곳이 남은 문서는 안 지우고 「남김 — 쓰는 곳 N」 · 지운 문서는 `_합친것/` 으로 옮겨 되돌릴 수 있게.
5. 구조물 조합 중복 찾기 = 뒤로(실측 세 묶음).
## 4. 단계 · 창 (PLAN 733)
| 걸음 | 무엇 | 창 |
| --- | --- | --- |
| 733-1 | 서버 내용 지문(새 `M02_Library_Same.py`) + 불러오기 SK 자동 기존 것 · 위 층 알림 | sub1 · Opus |
| 733-2 | 서버 만들 때 물음(409 꼴) · 복사 딸림 재사용 | sub3 · Opus(733-1 지문 push 뒤) |
| 733-3 | [중복 찾기] · 합치기(새 서버 길 · 새 화면) + 화면 물음 붙임 | sub5 · Opus(733-1 지문 push 뒤 · 물음 화면은 733-2 뒤) |
## 5. 검증 기준
- 실무 파일 여덟 개 한 층 다시 불러오기 → SK 내용 사본 35 → 0 · 같은 파일 다른 바이트 다시 → 새 SK 0 · 위 층 같은 것 알림.
- 사람 길 409 → 「그것을 씀」 = 새 문서 0 · 「그래도 새로」 = 새 문서.
- 중복 찾기 → 합치기 → 쓰는 곳 참조 옮겨짐 · 금액 전후 같음 · `_합친것/` 되돌림.
- 고친 대상 시험 · typecheck 0 · ORCA(자기 포트 · 자기 개인 층 · 끝나면 지움).