2026-06-10 세션 — 견적 타입 SSOT 페이즈 A (A/B/C/D)
논의·대안
견적(estimate) 화면의 "타입"이 두 곳에서 단절돼 있었다. field type list 페이지는 field_type 테이블에 INSERT하고, 견적서 화면(estimate_regist_v2.js)은 estimate_detail.type_name 자유문자열만 쓰며 후보는 전체 distinct(type-suggest, 현장 무관)에서 로드했다. 같은 현장 타입을 양쪽에서 중복 입력하고, 타입 표시순서를 담을 곳도 없었다.
페페 결정: field_type 테이블을 타입 단일 출처(SSOT)로 삼는다. 공유 범위 = 현장(field_no)별, upsert 시점 = 저장 시(saveEstimate). 더해 현장 선택 시 그 현장 field_type을 견적서에 자동 표시(역방향)하고, 한 현장에 견적서 1개만(1:1) 만들도록 막는다. 타입 식별은 여전히 estimate_detail.type_name 문자열 유지(FK 강제 전환은 범위 밖). 타입 rename·순서 드래그 등 UI 편집은 페이즈 B로 분리.
대안 검토: estimate_detail에 FK를 거는 방식은 데이터 정합 미보장으로 제외. div(K/F) 표현이 혼재(10/20/30 코드 + K/F 글자 + 빈값)해 정규화 규칙(K→10·F→20·30→30·빈→10)을 둠.
결정
4묶음으로 확정, 테스트(8001/master/pfs-test) 한정·운영 제외.
- (A) 스키마+시드: field_type.display_order INT NULL 신설 + 견적 사용 타입 시드((field_no, type_name, 정규화div) 조합당 1행, display_order는 현장별 1..N). 테스트 RDS 직접 적용(코드 아님).
- (B) 정방향 upsert: insert/update_estimate commit 직전 _upsert_field_types_from_details 호출(같은 트랜잭션·멱등·field_no=0/None skip).
- (C) 역방향 자동로드: GET estimate/field-types?field_no=N(display_order순) + State.fieldTypes·loadFieldTypesForSite·빈타입 탭 표시, 자동완성 현장 한정(type-suggest 폴백 존치).
- (D) 1:1 차단: select_site_search에 estimate_count 서브쿼리, 견적 보유 현장 "견적서 있음" 배지·흐리게·선택 가드.
산출물·커밋
- 코드 커밋
03b9583(master): 4파일 — estimate_dao.py(+55, 헬퍼+호출 2곳+site-search 카운트), estimate_controller.py(+26, field-types API), estimate_regist_v2.js(+82), estimate_regist_v2.css(+3). GitHub Actions 테스트 배포 success(run 27220897590). - (A) 스키마/시드는 테스트 RDS 직접 적용(코드 외). 시드 전 MAX(type_no)=1501, 시드+upsert 후 max 3376. 롤백 기준 =
DELETE FROM field_type WHERE type_no>1501. - 멀티에이전트 리뷰(16건 중 확정 2건): loadFieldTypesForSite 자동선택이 F타입일 때 K/F pill 하이라이트가 클릭 핸들러에서만 갱신돼 어긋나던 버그 → renderDetailTable에 pill 동기화 단일 지점 추가로 수정.
- DB 검증 스크립트(scripts/codi_phaseA_*.py)는 롤백·재검증용으로 워킹트리만, 커밋 미포함.
검증(채티 독립 재확인, SSM 읽기 전용): display_order 컬럼 존재, still_missing=0(정합 완료), 표본 현장 display_order 1..N 연속·중복 0, 1066/1337 estimate_count=2, 라이브 field-types?field_no=428 → 200·display_order순(1~4) 반환, type-suggest 폴백 200, py_compile/node --check 통과.
다음
- 페페 화면 수동 확인(인증 세션 필요): 현장 선택 시 빈 타입 탭 자동표시 / 1:1 차단(테스트 1066·1337) / 신규 type_name 저장 → 그 현장 field_type 신규 1행(정방향 E2E).
- 이상 없으면 운영(deploy-live + 운영 DB 동일 A 시드) 별도 승인 후 진행. 현재 운영 일절 미반영.
- 이후 페이즈 B: 타입 rename/순서 드래그 UI 편집 + 7번 마감재 숨김 등 보완 10건.
관계
- 주제: domain:estimate · svc:pfs-estimate
- 관련 문서: pfs-schema-estimate, session-2026-06-10-type-order-fieldtype-link, session-2026-06-10-one-to-one-fieldtype-autoload