다크모드
프로퍼티 설정 페이지 프론트엔드 메인테이너
라우트와 진입
- 라우트:
/administration/organization/workspace/property - 유닛 목록:
/administration/organization/workspace/property/console/unit - 진입: 본사 콘솔
/headquarters/console/office/general의 현장 마스터 - 전제:
useAccountContext().activeOffice가 상단에서 선택한 Office를 가리킨다.
컴포넌트 트리
text
views/.../property/IndexView.vue
├─ HeaderOrg.vue 현재 Office 이름·코드·주소·호실 수·공공데이터 연결 상태
└─ MainOrg.vue
├─ 프로퍼티 기본정보 카드 (read ↔ inline edit)
├─ 공공데이터 연결 카드 (health → search → area preview → connect)
└─ 다음: 부과항목 설정초기 시안의 가짜 계정 usercode123, 라이선스 999, 샘플 현장, 목록 CRUD 오버레이는 제거했다. 이 화면은 목록이 아닌 현재 Office의 단일 정보 페이지다.
데이터 흐름
- 로그인 후
loadCurrentCompanyAccount()가 Office와property_*컬럼을 읽는다. useAccountContext()가 현재 Office를 제공한다.resolvePropertyMasterRepo()가 Supabase 또는 테스트 mock 구현을 고른다.- 기본정보 저장과 공공데이터 후보 연결은
update_company_office_propertyRPC를 호출한다. - 공공데이터 조회는 인증된
property-public-dataEdge Function에{ mode: 'search', name, address }를 보낸다. - 성공 응답은
account.updateOfficeRecord()로 로컬 Office에 병합한다. 기존 상품 권한 배열은 보존한다. propertyUnitMaster가propertyData.units[]를 동·호 기준 부과 유닛으로 정규화하며 부과항목 배분값과 첫 부과 준비 게이트가 함께 소비한다.- 유닛 목록의 헤더와 표도 같은
useAccountContext().activeOffice와usePropertyUnitMaster()를 소비한다. 별도 데모 행·999 카운트·현장명 접두어를 두지 않는다.
편집 패턴
단일 정보 페이지 규칙에 따라 다른 시트로 이동하지 않고 카드가 제자리 필드폼으로 전환된다.
- read:
table-static - edit:
field + input input-bordered - footer:
편집 ↔ 취소/저장 - 저장 게이트:
valid && dirty && !saving - 긴 설명:
InfoHint
데스크톱과 모바일은 같은 1열 카드 흐름이다. 기본정보의 두 짧은 입력만 sm:grid-cols-2이고, 공공데이터 후보의 합계는 grid-cols-2 sm:grid-cols-3으로 전환한다. 면적 유형 표는 좁은 화면에서 overflow-auto로 가로 스크롤한다.
공공데이터 상태와 면적 UI
| 상태 | UI |
|---|---|
| health 확인 중 | 상태 문구, 조회 버튼 비활성 |
| Secret 미설정 | 키 설정 필요 문구, 조회 버튼 비활성 |
| 조회 가능·미연결 | 공공데이터에서 찾기 |
| 후보 있음 | 건물명·주소·호실 수·A~E 합계와 연결 + 접힌 호실 목록 disclosure |
| 호실 수 불일치 | 등록 수와 대장 수 경고, 연결 비활성 |
| 연결됨 | 출처·확인시각·A~E 합계·용도별 면적 유형 표와 다시 확인·호실 목록 보기 |
후보의 호실 목록은 candidate.snapshot.units[](동·층·호·용도·A 전용·E 계약)를 기본 접힘 disclosure(disclosure disclosure-sm) 안에 max-h-64 overflow-y-auto + sticky-thead 표로 보여준다 — 연결 전에 개별 호가 실제로 존재하는지 검증하는 용도다. 연결 후에는 카드에 표를 중복하지 않고 card-footer의 호실 목록 보기 버튼으로 정본 유닛 콘솔(…/property/console/unit)로 이동한다(대장 연결 linked일 때만 — MANUAL 직접 입력은 개별 호 데이터가 없다).
화면은 A 전용, B 주거공용, C 기타공용, D 공급(A+B), E 계약(A+B+C)을 모두 표시한다. 관리비 부과 기준은 A 또는 E만 사용하며 분양면적 파생값은 UI와 데이터 모델에 두지 않는다. 공용면적 용도가 명확하지 않은 호실 수는 경고 alert로 노출한다. 후보의 areaSummary는 비교용이고, 연결 후 정본은 activeOffice.propertyData.areaSummary, areaTypes, units다.
운영 UUID Office에서는 건축물대장 units[]가 없거나 그 수가 unitCount와 다르면 면적 유형 합계가 있어도 첫 부과 준비로 보지 않는다. 후보 단계에서도 candidateUnitCountMatches()가 등록 호실 수와 대장 호실 수를 비교해 불일치 연결을 막는다. 직접 입력 areaTypes[]를 임의의 1호…N호로 확장하지 않는다.
건축물대장 PK는 내부 연결 식별자이므로 후보와 연결 결과 UI에 표시하지 않는다. 긴 숫자의 문자열 보존은 Edge Function 정규화 테스트가 담당한다.
비밀키나 원문 오류는 UI에 노출하지 않는다. 법정동 누락과 코드 검색 실패는 사용자가 고칠 수 있는 문장으로 변환한다.
도움말과 테스트
- 도움말 topic:
property-setting./administration범용 계정·보안 topic보다 먼저 매칭한다. - 단위 테스트:
src/composables/__tests__/propertyMasterRepo.spec.jssrc/composables/__tests__/propertyUnitMaster.spec.jssrc/composables/__tests__/propertyPublicDataNormalization.spec.jssrc/components/administration/organization/workspace/property/propertyMaster.spec.jssrc/components/administration/organization/workspace/property/console/unit/UnitPage.spec.jssrc/composables/__tests__/useAccountContext.spec.js
- 다음 단계 라우트:
/service-charge/setting/item/general