다크모드
관리비 청구 대상 명부 (FE 메인테이너 매뉴얼)
진입과 컴포넌트
- 페이지:
/service-charge/actual - 상시 진입:
blocks/DataToolBarOrg.vue의청구 대상 설정 - 진입 경고:
components/service-charge/actual/MainOrg.vue - 편집 시트:
overlays/SheetServiceChargeSubjectRosterArt.vue - 준비조건:
useFirstChargeReadiness.js
상시 진입 버튼과 준비조건의 subject-roster step은 모두 command="show-modal"로 현재 페이지의 focused sheet를 연다. 시트는 EDS의 sheet-width-3xl, static table, field/select, sheet-footer 패턴만 사용하며 로컬 CSS나 override가 없다.
데이터 흐름
text
productRuntimeBootstrap
→ startServiceChargeSubjectRosterSync
→ get_service_charge_subject_roster RPC
→ rosterByOffice reactive Map
→ useFirstChargeReadiness + useAllocations
→ charging subject snapshot
→ invoice v3 atoms저장소
serviceChargeSubjectRosterRepo.js가 Supabase RPC와 mock을 캡슐화한다. browser command에는 company/office/revision/rows/requestKey만 보내며 actor나 권한 값을 받지 않는다. 오류는 serviceChargeSubjectRosterError에서 사용자 메시지로 정규화한다.
scope state와 sync
serviceChargeSubjectRoster.js는 Office별 {revision, entries, candidates, summary, hydrated}를 보관한다. runtime watcher는 Company/Office가 바뀌면 다시 hydrate하고 늦게 도착한 이전 Office 응답을 버린다. disposer는 watcher와 오류만 정리하며 이미 읽은 Office cache는 유지한다.
replaceRows 성공 후 반드시 같은 시작 scope를 재조회한다. revision conflict도 최신 상태를 재조회하고 기존 request key를 폐기한다.
배분 연결
useAllocations.syncOfficeDimensions는 운영 Office에서 unit catalog와 roster signature를 함께 본다.
- member:
memberManagementCode, 이름,partyId,assignmentId - contract: 서버가 생성한
contractManagementCode, member code - line: charge × unit이며 roster의 contract/member code를 참조
roster가 아직 hydrate되지 않았으면 데모 member/contract를 섞지 않고 null subject line을 유지한다. useChargingCommit은 allocation subject가 하나라도 없으면 부과확정을 명시적으로 차단한다.
편집 UX
시트 초안은 propertySpaceId → memberAssignmentId map이다. 서버 entry 또는 Office가 바뀔 때 초기화한다. 모든 unit이 선택되고 실제 변경이 있을 때만 저장 버튼이 활성화된다. 화면에는 유닛 등록코드/이름, 대상 이름, 등록번호를 노출하고 관리코드는 숨긴다.
취소·닫기는 초안을 서버 상태로 되돌린다. 성공 시 시트를 닫고 reactive roster 재조회 결과가 준비 경고와 배분 축에 즉시 반영된다.
Supabase가 없는 데모 Office에서는 useAllocations의 유닛·멤버·점유 라인을 화면용 초깃값으로 변환한다. 기획자가 같은 진입점에서 미지정 유닛 선택 → 저장 → 재진입 시 변경 없음 게이트까지 확인할 수 있으며, 운영 roster 상태에는 섞지 않는다.
테스트
| 파일 | 계약 |
|---|---|
serviceChargeSubjectRosterRepo.spec.js | exact RPC와 mock replay/revision |
serviceChargeOperationalSubjectE2e.spec.js | 운영 UUID가 allocation·charging·invoice v3로 전파 |
SubjectRosterUi.spec.js | SSOT 클래스, 상시 진입, 데모 UX, readiness/degraded 배선 |
serviceChargeSubjectRosterMigration.spec.js | 소유권·FK·RLS·grant 정적 계약 |
확장 시 임대차 composable을 import해 대상 명부를 대체하지 않는다. 임대차관리에서 후보를 제안할 수는 있지만 관리비 roster 저장과 확정 lifecycle은 계속 관리비가 소유해야 한다.