다크모드
프로퍼티 실제 점유기간 프론트엔드 유지보수
구성
text
propertyOccupancyPeriodRepo.js
├─ lease_contracts / hospitality_stays 조회
└─ 점유 lifecycle + 임대 v2 금액/원장 RPC + 오류 번역
usePropertyOccupancyPeriods.js
├─ captured Company·Office·scope sequence / stale result·error·loading discard
├─ leaseContracts / hospitalityStays
├─ command signature별 request key를 성공 전까지 보존
└─ load + 점유/임대 금액 명령 + revision conflict reload
useLeaseContracts.js ── 공유 Company/Office watcher가 서버 leaseContracts를 1회 load
useStays.js ── 서버 설정 시 실제 hospitalityStays, 아니면 기존 mockresolvePropertyOccupancyPeriodRepo()는 테스트 또는 Supabase 미설정 환경에서 mock repo를 선택한다. 기존 데모 데이터는 삭제하지 않았으며 서버 설정 환경에서만 실제 원장 목록으로 교체된다.
연결 화면
- 호스피탈리티 스테이 목록: Office 변경 시 실제 스테이 조회
- 체크인 다이얼로그: RPC 성공 뒤에만 로컬 예약 상태와 룸 점유 표시 변경
- 체크아웃 다이얼로그: RPC 성공 뒤에만 룸을 공실·청소 필요로 변경
- 임대 차임·보증금·퇴거정산:
useLeaseContracts공유 loader로 모든 consumer가 같은 Office 계약을 소비 - 퇴거정산 시트: 잠정 서버 저장 → 실제 공과금 게이트 → 서버 final(보증금 공제+임대 종료) 순서
서버 응답은 기존 화면 계약으로 normalize한다. v2 terms와 보증금 entry가 있으면 실제 월 차임·약정·수취·반환·공제·잔액을 제공한다. 금액이 없는 legacy 계약은 null + financialTermsPersisted:false로 나타내고 미연동 게이트를 유지한다.
scope 변경 watcher는 flush: 'sync'로 sequence를 증가시키고 목록·오류·loading·보존 중 request key를 즉시 초기화한다. 모든 command는 캡처한 company/office/key/sequence가 현재 scope와 같을 때만 응답을 upsert한다. 실패한 명령의 request key는 같은 command signature 재시도에 재사용하고, 서버 성공 후에만 폐기한다. revision conflict는 captured scope가 유지된 경우에만 해당 lease/stay 목록을 재조회해 재확인을 요구한다.
확장 규칙
임대 v2 생성 UI는 active tenant office_party_assignments.id와 active unit property_spaces.id를 직접 전달한다. legacy alias 연결은 필요 없다. 생성 뒤 activate를 별도 명령으로 호출한다. 호스피탈리티 예약 저장소를 추가하더라도 체크인은 예약을 복사하는 것이 아니라 실제 스테이 명령을 호출해야 한다.
룸 보드의 현재 점유는 장기적으로 hospitalityStays의 checked_out_at == null을 기준으로 파생한다. 현재 useRooms의 운영 상태는 하우스키핑·턴다운 mock과 함께 있어 체크인/체크아웃 성공 뒤 로컬 상태를 동기화한다.
테스트
propertyOccupancyPeriodRepo.spec.js: normalize, RPC 입력, revision/요청 키usePropertyOccupancyPeriods.spec.js: stale scope discard, command signature request key, revision reloaduseLeaseContractsLoader.spec.js: 공유 loader와 Company/Office scope watchpropertyOccupancyPeriodMigration.spec.js: SQL 구조·보안·겹침 계약useMoveOutSettlement.spec.js: 기존 정산 산식과 동기 API 회귀property_occupancy_periods_smoke.sql: 실제 PostgreSQL lifecycle
페이지 변경 시 사용자·BE·FE 3종 문서를 같은 작업에서 갱신한다. 이번 작업은 요청 범위에 따라 docs 별도 레포 미러를 수행하지 않았다.