Skip to content

프로퍼티·공간 코어 — Frontend 핸드오프

경계

Office가 계속 프로퍼티 설정과 권한 범위의 정본이다. 별도 property 선택기나 property root store를 만들지 않는다. 이번 구현은 UI를 바꾸지 않고 네 도메인이 같은 공간 UUID로 점진 수렴할 repo/composable seam만 추가한다.

구현 위치

text
src/composables/propertySpaceCoreRepo.js
src/composables/propertySpaceCore.js
src/composables/propertyUnitMaster.js
src/composables/serviceChargeUnitImportRepo.js
src/composables/serviceChargeUnitImport.js
  • propertySpaceCoreRepo: Company·Office 필터가 있는 공간·alias 조회, 수동 공간 생성, 기존 공간 alias 명시 연결, Office snapshot 재동기화 RPC adapter.
  • propertySpaceCore: alias index, legacy key 해석, UUID 참조 덧붙이기, breadcrumb 조립. Vue나 Supabase에 의존하지 않는 순수 계약이다.
  • propertyUnitMaster.propertyUnitsWithSpaceReferences: 기존 unitCode를 유지하고 propertySpaceId와 관리코드만 선택적으로 추가한다.
  • propertySpaceCoreRepo.listUnitCatalog: 상품 table을 읽지 않고 공용 active unit profile만 조회한다.
  • serviceChargeUnitImportRepo: 관리비 entitlement가 필요한 atomic catalog read/import RPC adapter다.
  • propertyUnitMaster의 Office별 reactive catalog는 서버 hydrate 후 우선 사용하고, mock·미연결 상태에서는 property_data.units[] fallback을 유지한다.

소비 규칙

js
const spaces = await repo.listSpaces({ companyId, officeId });
const index = buildPropertySpaceIndex(spaces);
const unit = withPropertySpaceReference(
  legacyUnit,
  index,
  PROPERTY_SPACE_ALIAS_NAMESPACE.SERVICE_CHARGE_UNIT_CODE,
  legacyUnit.unitCode,
);
  • 기존 unitCode, unitKey, roomId를 UUID로 즉시 치환하지 않는다.
  • alias가 없으면 propertySpaceId=null을 반환한다. 이름 비교로 임의 연결하지 않는다.
  • 목록 key와 API write는 해당 도메인이 direct-FK 단계에 도달하기 전까지 기존 키를 유지한다.
  • 새 서버 원장은 UUID와 Company·Office를 함께 보낸다. 화면에서 UUID를 노출하지 않는다.
  • 관리코드는 목록의 주 식별 정보로 쓰지 않고 상세 보조정보에만 둔다.

도메인별 다음 연결

  • 관리비: propertyUnitsWithSpaceReferences dual-read 후 부과·검침 원장 FK 추가.
  • 관리비 Wave 13: serviceChargeUnitImport가 공용 profile catalog를 hydrate하고 useAllocations·첫 부과 readiness가 catalog revision 변화를 따라간다. CSV UI는 프로퍼티 유닛 가져오기를 따른다.
  • 임대: 계약 등록 시 선택한 공간 UUID에 bindAliaslease_unit_key를 명시 연결하고 계약 원장에 UUID 저장. 현재 tenancy/lease mock끼리도 문자열 체계가 다르므로 자동 병합 금지.
  • 호스피탈리티: 룸 마스터 생성 시 guest_room/meeting_room/desk 공간과 hospitality_room_id alias 생성. 점유·하우스키핑·요금 상태는 공간 identity와 분리.
  • 시설: facility_unit_code dual-read 후 자산·작업지시가 공간 UUID를 참조. 자산 자체를 공간 row로 만들지 않는다.
  • 빌딩 시각화: 공간 계층 read adapter를 추가하되 scene 전용 상태는 별도 projection으로 유지.

owner listing, agent listing, presale 화면과 데이터는 이번 구현에 없다. 향후 listing repo가 공간 UUID를 참조하되 공간 이름·타입·계층을 복제하지 않도록 한다.

테스트

  • src/composables/__tests__/propertySpaceCore.spec.js
  • src/composables/__tests__/propertySpaceCoreRepo.spec.js
  • src/composables/__tests__/propertySpaceCoreMigration.spec.js
  • src/composables/__tests__/propertyUnitMaster.spec.js
  • src/composables/__tests__/propertyUnitCatalog.spec.js
  • src/composables/__tests__/serviceChargeUnitImport.spec.js
  • src/composables/__tests__/serviceChargeUnitCatalogMigration.spec.js
  • supabase/tests/property_space_core_smoke.sql

Wave 13 UI는 기존 프로퍼티 유닛 라우트와 SSOT 0.10 컴포넌트 어휘를 사용한다. 새 라우트·로컬 style·페이지 override는 없다.