2026-10-14 세션 — 견적 v2 「저장된 추가금액 연동」 버튼(저장된 sub 마진 → 추가금액 마진 공통칸 일괄 연동) · 운영배포
기록: [코디] (총괄 배정 작업자 · worker). 운영 PFS 데이터 쓰기 0 · DDL 0 · 서버 코드 변경 0(JS·CSS·템플릿 3파일).
논의·대안
- [페페] 원문(총괄 전달): 「소요한남2차 추가금액 마진 공통 적용 항목에 연동되게 해줘. 자동,수동 조작해서 금액대 조정해볼거야. 운영배포」 — 대상 운영 견적 #803(한샘 소요 한남 2차 · sub 85줄 · 마진 전부 35). 기능은 범용.
- 현황: 26.10.7 「추가금액 마진」 전역칸(전체마진 아래 2번째 줄 · 배지 연동/수동)은 화면에서 새로 추가한 sub(_smAuto=true)만 따랐다. 저장돼 있던 sub 는 고정으로 열려(값 불변 원칙) 공통칸을 바꿔도 안 움직였다 → #803 처럼 스크립트로 넣은 85줄은 금액대 조정 수단이 없었다.
- web-designer 처방(총괄 상담 완료) 그대로: 체크박스 아닌 버튼 · 3번째 줄 우측 · 13px·28px · 상태 3단(0/N 회색 · 일부 파랑 「연동 L/N · 전부 연동」 · 전부 비활성 「연동 N/N」) · 옆 13px 「고정으로」 · 확인은 인라인 줄(브라우저 confirm/alert 금지) · 섞인 값 = 최빈값 초기값 + 변동액 · NULL 마진 sub 건너뜀 · 선택 #qmDelta.
- 작은 판단 2개(처방 취지 유지):
- 확인 줄은 마진 칸 grid 밖(타입 줄 아래 전체폭·우측 상자) — grid 안에 두면 긴 문장이 grid 폭을 늘려 위 입력칸이 움직인다. 버튼 줄은 grid 안 3번째 줄이되
width:0; min-width:100%로 grid 폭 계산에서 빼 버튼 글자(0/85 → 85/85)가 바뀌어도 입력칸 위치 0px 흔들림(실측). - 적용 값이 지금 공통값과 같으면 공통칸 모드(연동/수동)를 그대로 둔다(처방 「수동으로」는 값이 다를 때만) — 금액 불변 목적은 같고, 연동 모드였다면 그대로 전체마진을 따라간다.
결정
- 로직(
web/static/js/estimate_regist_v2.js):subLinkStats(total·linked·todo=고정+마진값 있음·nulls) →updateLinkAllBtn(renderDetailTable·recalcDetailRow·paintSubMarginCell 마다) ·openLinkAllConfirm(시작 값 = 대상+연동 sub 마진 최빈값modalMargin) ·previewSubLink(v, todo)(행 사본에recalcDetailRowSilent→ 추가금액 합계·견적 총액 변동, 천원 올림·몸통/도어 비율 반영) ·applyLinkAll(todo 전부_smAuto=true→ 값 ≠ 공통값이면 공통칸 수동·그 값 →applySubMarginToAutoSubs→renderDetailTable→recalcTotal→ 자재 →markDirty, 기존 공통칸 핸들러와 같은 순서) ·unlinkAllSubs(전부 고정, 값 유지) ·#qmDelta(불러온/저장한 값 대비 추가금액 합계 변동 · 기준 = afterLoad·저장 성공 때markSubSumBase). - 영속 = 26.10.7 연동 표식(
ui_column_settingpage_keyest_sublink:<no>·_mode+d<항목순>s<sub순>) 그대로 — 저장하면 다시 열어도 연동 유지. DB·API 변경 0. - 키보드: 확인 칸 Enter = 적용 · Esc = 취소(IME 조합 중 무시).
산출물·커밋
- master 4e5224cb(4파일:
web/static/js/estimate_regist_v2.js·web/static/css/estimate_regist_v2.css·web/templates/finance/estimate/estimate_regist_v2.html·scripts/_est_submargin_check.py) — 별도 worktreeC:\dev\pfs_wt_submargin(branch submargin-1014, origin/master 기준)에서 작업 →git push origin HEAD:master. 이유 = 메인C:\dev\pfs로컬 master 에 다른 세션의 미push 커밋 b7767098(patch63 SQL) + 7 behind → 섞지 않으려고. - deploy-live e2621c5f = 위 3 웹 파일만 선별 포워드(
C:\dev\pfs_deploy_wt· blob 해시 = master 동일 · 자체검사 스크립트는 운영 불필요라 제외). 배포 런 38552571149 success 10:54:26Z = 19:54 KST. 테스트 런 38552110970 success. - 자체검사
scripts/_est_submargin_check.py에 F 24항목 + 옵션--only-f·--local(push 전 사전검사: 서버 화면에 작업 트리 JS·CSS·템플릿 조각을 Playwright 로 가로채 끼움). - push 전
test --local전체(A~E 기존 + F) ALL PASS · push 후 서버 코드test --only-fALL PASS. - F 요지: 표식 없이 저장된 sub 4줄(마진 35) → 버튼 「저장된 추가금액 연동 (0/4)」 → 확인 줄 「금액 변동 없음」 → [적용] 「연동 4/4」 비활성 · 금액·총액 불변 → 버튼만 누르고 저장 = DB sub 마진·금액·항목 합계·견적 총액 그대로 → 공통칸 35→40 = 수량×단가×1.40 · #qmDelta 「추가금액 합계 +5,350원」 → 저장·재오픈 연동 유지(수동 40) → 「고정으로」 → 공통칸 45 바꿔도 불변 → 섞인 값(40×3·30×1) = 최빈 40 + 「+1,000원」 · 30 입력 「-9,700원」 · [취소] 변화 0 → 40 적용 → 배지 「연동」 = 전체마진 따라감 · JS 오류 0.
- 테스트 서버에 남은 자체검사 견적 = #829 · #830 · #831(E) · #832 · #833 — 이름 「자체검사 … (삭제 가능)」(임시견적).
- 운영 확인(읽기 전용) =
C:\dev\_work\est-submargin-linkall-1014\prod_803_check.py· https://pfs.poin.co.kr/estimate/modify-v2/803: 버튼 「저장된 추가금액 연동 (0/85)」 → 확인 줄 「85줄을 추가금액 마진 [35]%로 연동합니다. 금액 변동 없음…」 → [적용] 「연동 85/85」 비활성 · 누르기 직전 총액 52,380,700 = 적용 후 52,380,700 · 저장 시도 0(GET·search 외 /api 요청 가로챔 0건) · 콘솔 오류 0 · 저장 안 하고 닫음. 스크린샷 =C:\dev\_work\est-submargin-linkall-1014\prod_803_1_before.png·prod_803_2_confirm.png·prod_803_3_after.png·prod_803_4_page.png. - 사이트맵
C:\dev\devplan\pfs-sitemap.html배포 전 미반영 3 → 배포 후 1(남은 1 = /field/worklog 기존분 · 견적 v2 페이지 걷힘). - devplan:
C:\dev\devplan\hannam2-nesting.html맨 위 1줄 ·C:\dev\devplan\pfs.htmlDONE BW ·projects.jsonhannam2 카드 desc ·build_hub.py.
다음
- ⏳[페페] #803 에서 버튼 → [적용] → 공통칸(수동) 값·배지(연동 = 전체마진)로 금액대 조정 → 저장. 다른 작업자가 #803 sub 단가를 PUT 으로 바꾸는 중(총괄 알림) — 버튼 기능과 충돌 없음(연동 여부는 표식, 단가는 sub 값).
- 테스트 견적 #829~#833 정리 여부(삭제 = 승인 필요 · 지금은 둠).
- worktree
C:\dev\pfs_wt_submargin(branch submargin-1014) 정리 승인 대기. - 🔑 운영 읽기 전용 Playwright 가드: 견적 v2 화면은 init 에서
POST /api/common/code/search·company/member/search로 코드를 읽는다 → POST 전부 abort 하면 화면이 안 뜬다(wait_for_function 타임아웃). 가드 = GET +/searchPOST 만 통과, 나머지 abort(rules 🆕).
관계
- 주제 그룹: pfs 견적 v2 마진
- 관련 문서: pfs-session-2026-10-14-sohan2-hansem-803 (같은 #803)