3.8 KB · 수정 2026-06-10 01:49
목차

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 서브쿼리, 견적 보유 현장 "견적서 있음" 배지·흐리게·선택 가드.

산출물·커밋

검증(채티 독립 재확인, 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 통과.

다음

관계