Skip to content

호스피탈리티 룸 운영 프론트엔드 유지보수

구성

text
hospitalityRoomOperationsRepo.js
  ├─ list_hospitality_room_operations_v1
  ├─ transition_hospitality_room_operation_v1
  └─ DB payload → room board view model normalize

useRooms.js
  ├─ Office scope별 server 목록
  ├─ command request key 재사용과 revision 전달
  ├─ dirty/clean 하우스키핑 worklist
  └─ 결과 row upsert

room/MainOrg.vue
  └─ 서버 룸 상태 보드 + 룸 상세 sheet

housekeeping/MainOrg.vue
  ├─ 서버 worklist + 담당자 일괄 배정
  └─ DialogHousekeepingArt: 청소 완료·검수·비고

16개 룸을 보유하던 useRooms singleton mock은 제거했다. Supabase가 설정되지 않은 개발·테스트 환경은 빈 목록을 반환하며, 실제 룸 데이터는 Hospitality room master와 operational RPC만 사용한다.

데이터 흐름

룸 보드와 하우스키핑 화면은 mount 시 loadRooms()를 호출한다. normalized row의 occupancy, activeStayId, dueOut은 서버가 active stay에서 계산한 projection이다. UI에서 점유를 직접 mutate하지 않는다.

담당 배정은 assign, 청소 완료는 mark_clean, 검수는 inspect command로 보낸다. 각 요청은 현재 row revision을 함께 보내고 성공 응답으로 singleton row를 교체한다. 열린 다이얼로그 저장 중에는 중복 제출을 막고 서버 오류를 표시한다.

체크아웃 성공 뒤에는 룸 목록을 다시 불러온다. dirty 전환 자체는 브라우저가 만드는 것이 아니라 checkout transaction의 DB trigger가 만든다. 체크인 다이얼로그는 서버 룸 projection에서 active + vacant + inspected만 후보로 보여주며, DB readiness gate가 최종 권위다.

디자인·경계

기존 MDS 0.10 card, badge, alert, dialog, table 패턴만 사용한다. 로컬 CSS나 provider 명칭을 추가하지 않는다. 전자결재·시설·회계 composable을 import하지 않는다.

턴다운 호환 API는 기존 화면의 build를 깨지 않기 위한 빈 seam으로 남아 있으며 이 slice는 해당 상태를 저장하지 않는다. 턴다운 제품화 시 별도 원장과 화면 계약으로 교체해야 한다.

테스트

  • hospitalityRoomOperationsRepo.spec.js: normalize, list/transition RPC payload, request key
  • hospitalityRoomOperationsMigration.spec.js: 소유권, checkout dirty, check-in readiness, RLS, append-only
  • hospitalityRoomOperationsUi.spec.js: 서버 load, 배정·청소·검수, check-in/out refresh seam
  • hospitality_room_operations_smoke.sql: 실제 상태 전이, 멱등, projection, direct-write 차단

남은 위험

실시간 구독은 아직 없다. 다른 사용자의 변경은 다음 load 또는 revision 충돌 뒤 다시 불러올 때 반영된다. 룸 마스터의 프로퍼티 공간명·등록코드는 서버 projection으로 표시하며 상세 계약은 hospitality-room-master.md를 따른다.