견적 구조 복사 설계 (확정·목업 v6, 2026-06-09)
design.md §H에서 분리. 진행 중 작업(handoff "진행 중" 참조). 페이즈 시드 =
sub/estimate-copy-future.md.
실제 구조: K/F는 별도컬럼 아니라 estimate_detail.field_type('K'주방/'F'가구), 타입=type_name 묶음, 항목=estimate_detail 행(detail_no), SUB=estimate_detail_sub(detail_no FK), 별도항목=estimate_extra_cost(estimate 단위·detail_no FK 없음 → 항목 복사 동반 대상 아님). sub 저장은 메인 트랜잭션 _save_detail_subs가 신규 detail_no 즉석매핑(estimate_dao.py).
- 복사 단위 5단계: 타입 ▸ K/F ▸ 위치(항목) ▸ SUB. 타입·K/F=다중선택 없음, 항목·sub=다중선택 가능.
- 확정 결정: (a) 상위 복사 시 하위 전체 항상 동반(토글 없음) (b) 붙여넣기=말미 추가만 (c) 항목 다중=행 체크박스, sub 다중=방식B(펼친 항목 아래 미니패널 체크박스·같은 항목 내 제한) (d) 바로복사(⎘)=모달 없이 같은 계층 즉시 / 위치(⧉)=다른 위치 모달 (e) 개별마진 동반, 공통마진·surcharge_rate 비복제 (f) 별도항목=항목 복사 시 동반 가정 철회(estimate 단위라서) (g) K/F 제약: 한 타입 안에 K/F 각 1개씩만, 다른 타입에서 복사 시 기존 K/F에 병합(항목 말미 추가). 미결 0.
- 구조 처방: 복사 행 detail_no=null(신규)로 메인 저장 트랜잭션에 태움(sub 유실버그 회피), detail↔sub 부모자식은 클라 임시키(tempId() estimate_regist_v2.js:89·data-temp-id·data-parent-temp-id 이미 존재)로 묶어 서버 저장 시 일괄 재매핑·저장응답으로 임시키→실detail_no 회신, 부모 INSERT 실패 시 자식 롤백(원자성).
- 위치 모달: 기본=가계도 가로형 1종+미리보기 통합(SUB 위치복사 시 가로형에 항목 컬럼 4단째 필수). 목업 v6 = outputs estimate_copy_mockup_v6.html.
- 코디 지시문(전달 대기) = C:\dev\pfs\CODI_estimate_structure_copy.md(4계층 복사 사양·위치모달·K/F 병합·구조처방·테스트 배포까지·deploy-live 금지).
- 별도 페이즈 시드 = projects/pfs/sub/estimate-copy-future.md(복사 직후 미리보기+실행취소 / 다중 타입 일괄 / cross-estimate).