Q1 PFS 금액 불변(표시 플래그만). 한샘 변환 때 체크 sub 는 별도 칸/-추가 블록으로 빼지 않고 부모 본항목에 남긴다(본항목 목표 = 행총액 − Σ미체크 sub).
Q2 estimate_detail_sub 컬럼 1개 DDL(테스트 → 운영 SSM 선생성, INSTANT, 실패 시 자동 재시도 금지).
Q3 이번엔 PFS(화면·DB·API)까지 · 한샘 흡수 규칙은 rules 기록(순길이 0 부모 예외 = 강제 별도 표기+경고) · 이미 낸 한샘 견적 재발행 안 함.
Q4 sub 그리드 합계 옆 「자당포함」 칩 · 켠 줄 흐림 · 하단 요약. Q5 별도항목 자동집계 행 3상태(전부/일부/없음) 일괄(자동 상속 없음) · 사용처 상태 표시. Q6 한샘 양식에 흔적 안 남김.
코덱스 지적 반영: 구버전 JS(열린 탭)가 키 없이 저장 → 0 리셋 위험 → 서버가 「키 누락」과 「명시 '0'」 구분. sub_no 매칭 안정성 = delete-reinsert 가 저장마다 번호를 새로 매겨 불안정 → sub_no 재사용으로 해결(대안 검토: 견적 전체 사전조회 맵 — 저장 안 한 탭의 두 번째 저장에선 여전히 끊겨 기각).
결정
컬럼 = in_base_yn CHAR(1) NOT NULL DEFAULT '0'(COMMENT 퍼센트 기호 금지), 위치 = 맨 뒤(INSTANT).
저장 _save_detail_subs: 기존값 SELECT sub_no,in_base_yn … FOR UPDATE → DELETE → INSERT(같은 트랜잭션). 키 누락·null·빈값 = 같은 sub_no 기존값 유지(신규 '0'), 명시값 = '1'/'0' 정규화('1'·1·true → '1', 그 밖 '0'). 그 detail 의 기존 sub_no 면 같은 번호로 INSERT(남의 detail 번호·중복은 AUTO_INCREMENT).
조회 select_estimate_detail_sub_list·select_estimate_detail_sub_by_estimate SELECT 에 s.in_base_yn. 복사 copy_estimate_contents 는 SHOW COLUMNS 동적이라 코드 변경 없이 보존(재작성 복사 실측 확인).
화면(web-designer 처방 그대로): 칩 button.sub-in-chip[role=switch](off 회색 외곽 「자당포함」 / on #1f5f8f 채움 「✓ 자당포함」, 76px·28px·13px·600) · 머리 「자당포함」 84px(title 설명, 13px) · 범례 「자당포함=한샘 양식에서 본항목에 흡수」 · 켠 줄 tr.is-in-base td{#f3f4f6} + 입력 #5b6672(opacity·취소선 없음) · 줄 단위 갱신 · 합계 아래 .sub-inbase-sum 「자당포함 N건 · 금액원 (한샘 양식에서 본항목에 흡수)」/「자당포함 없음」.
별도항목: 자동집계 행 5번째 칸 .mat-inbase-btn[role=checkbox] aria-checked true|mixed|false · 「☑ 전부 자당포함」/「◪ 일부 (n/N)」/「☐ 자당포함」 · 일부·없음 → 전부 켜기, 전부 → 전부 끄기(키 = 업체번호 우선|품명, matKeyOf 한 곳) · 클릭·keydown 전파 차단(행 펼침과 분리) · 「N건 자당포함(해제) · 되돌리기」 토스트(8초, 스냅샷 복원) · 사용처 줄 .md-inbase 배지 · mat-row 5번째 열 60→150px · 머리 #matHeadInBase 는 자동 집계일 때만 글자 · @media print 새 요소 숨김.
저장 payload = 늘 in_base_yn: isInBase(s)?'1':'0' 명시 · 판정은 isInBase(String(v)==='1') 한 곳 · newSubItem 기본 '0' · cloneSub($.extend)로 구조복사 시 플래그 동반.
master 0bd5724b(기능) · 36cd6622(새 머리글 13px) · b1ccd932(사이트맵 menu_dump + 검사 스크립트) → deploy-live 4ddbfc6c(6파일 파일 단위 포워드 · 대상 파일 deploy-live = 작업 직전 master 동일 확인) · 운영 uwsgi 재기동 11:45:09 KST.
DDL: 테스트 11:3x KST(271행 · 금액합 163,880,450 불변 · 전부 '0') → 운영 11:43 KST 전후(1,044행 · 금액합 250,703,585 불변 · 전부 '0'), 둘 다 MySQL 8.4.8 ALGORITHM=INSTANT 성공 · SHOW CREATE 확인.
검증: 단위(가짜 DB) 16/16 · 테스트 실주소 _est_sub_inbase_check.py test49/49(칩·줄 단위 갱신·요약·3상태 일괄·되돌리기·키보드 Enter·행 펼침 분리·사용처 배지·구조복사 플래그·저장 후 DB·금액 0원 차이·sub_no 재사용·키 누락 PUT 유지·명시 0 해제·재작성 복사 보존·폰트 13px·넘침 0·인쇄 숨김·콘솔 오류 0) · 운영 읽기 전용 prod 7976/6(저장 0). 테스트 검증 견적 = #827(재작성으로 보관됨) · #828(재작성 새 차수) — 정리 안 함(테스트 DB · 삭제는 승인 사안).