콘텐츠로 이동

sites/{site_id}/supervisor 스키마 (현장 감독자)

현장에 배정된 감독자(owner / admin / manager) 문서. 회사 레벨 companies/{cid}/members에서 특정 현장에 allowed_sites로 접근 권한을 부여받은 시점에 해당 현장의 supervisor 서브컬렉션에 스냅샷이 복사됩니다.

회사 레벨 풀(companies/{cid}/members)과의 차이, 그리고 비슷한 스키마 문서인 company/_schema/supervisor.md의 차이점은 아래 차이 비교를 참고하세요.

저장 위치

companies/{company_id}/sites/{site_id}/supervisor/{UID}
  • 문서 ID는 감독자의 UID와 동일합니다.
  • 회사 레벨 감독자 풀은 companies/{company_id}/members이고, 현장 단위로 빠르게 조회하기 위한 복사본이 이 컬렉션입니다.

생성/삭제 흐름

site/registration.py (현장 생성 시)
  ├── 요청자(UID) supervisor에 추가
  ├── 감독자(supervisor_UID) supervisor에 추가 (요청자와 다를 때)
  └── 소유자(owner) supervisor에 추가 (요청자/감독자와 다를 때)

site/site_state.py (_change_site_info)
  └── supervisor_UID 변경 시 새 supervisor를 supervisor 컬렉션에 추가

company/rules.py
  ├── _set_site_rules (여러 현장 allowed_sites 일괄 변경)
  │   ├── added_sites: 각 현장 supervisor에 문서 write
  │   └── removed_sites: 해당 현장 supervisor의 모든 문서 delete
  ├── _add_site_supervisor (단일 현장에 추가)
  │   ├── members.allowed_sites에 site_id ArrayUnion
  │   └── supervisor/{UID} write (멤버 정보 전체 복사 + 할당 메타)
  └── _delete_site_supervisor (단일 현장에서 제거)
      ├── members.allowed_sites에서 site_id 제거
      └── supervisor에서 UID 일치 문서 delete

company/assign.py (_company_resign, 멤버 탈퇴)
  └── 모든 현장 supervisor 서브컬렉션에서 해당 UID 문서 일괄 delete

문서 필드

companies/{cid}/members/{UID} 문서 전체를 통째로 복사(dict(member))한 뒤 할당 메타 2개 필드를 추가합니다. 주요 필드는 다음과 같습니다.

필드 타입 설명
UID string 감독자 UID (문서 ID와 동일)
name string 이름 (멤버 스냅샷)
phone_enc string 전화번호 AES 암호화
phone_masked string "010-****-XXXX" 마스킹
email_enc string 이메일 AES 암호화
main_address string 주소 (평문)
sub_address_enc string 상세주소 AES 암호화
birth timestamp 생년월일
sex string "male" | "female"
role string "owner" | "admin" | "manager"
position string 직급
field string 직종
labor_supplier string 인력 공급처
wage_rate number 일당
allowed_sites string[] 할당 시점의 members.allowed_sites 스냅샷 (참고용, 최신 권한 소스는 members)
allowed_pages string[] 할당 시점의 members.allowed_pages 스냅샷
approved_UID string 회사 가입 승인자 UID
created_at timestamp 회사 가입 시각
resign bool 퇴사 여부 (할당 시점은 false)
fcm_token string? 있을 경우 복사됨
doc_id string (복사 시 딕셔너리에 포함될 수 있음)
assigned_by_UID string (추가) 이 현장에 감독으로 할당한 사람의 UID
assigned_at timestamp (추가) 이 현장에 할당된 시각

차이 비교

항목 companies/{cid}/members/{UID} companies/{cid}/sites/{sid}/supervisor/{UID}
범위 회사 전체 감독자 풀 특정 현장에 배정된 감독자만
문서 ID 멤버 UID 멤버 UID (동일)
권한 소스 원본 (allowed_sites가 권한 소스) 복사본 스냅샷 (권한 참조용 X)
업데이트 경로 member 관련 엔드포인트 회사 권한 변경/현장 생성 시점에만 write
삭제 시점 resign=true 플래그만 변경 (삭제 X) allowed_sites 제거 / 현장 퇴출 시 문서 delete

비슷한 파일 company/_schema/supervisor.md같은 컬렉션을 "회사 관리 > 감독자 풀" 관점에서 설명한 문서입니다. 본 문서(site)는 "현장 단위에서 감독자 리스트를 빠르게 조회"하는 용도에 초점을 둡니다. 두 문서 모두 저장 위치와 필드는 동일합니다.

데이터 동기화 주의사항

  • 이 문서는 할당 시점의 스냅샷입니다. members 문서가 이후에 업데이트되어도 supervisor 문서는 자동 동기화되지 않습니다 (트리거 없음).
  • 권한 체크(check_company_permission)는 members.allowed_sites를 기준으로 합니다. supervisor 컬렉션은 조회 편의성을 위한 복사본입니다.
  • 회사 탈퇴 시(_company_resign) 전 현장을 순회하며 supervisor 문서를 일괄 삭제합니다. 단, members 문서는 resign=true 플래그만 변경되고 삭제되지 않습니다.

예시 문서

{
  "UID": "firebase_uid_manager",
  "name": "박매니저",
  "phone_enc": "AES(...)",
  "phone_masked": "010-****-9876",
  "email_enc": "AES(...)",
  "main_address": "서울특별시 서초구",
  "sub_address_enc": "AES(...)",
  "birth": "1988-07-20T00:00:00Z",
  "sex": "female",
  "role": "manager",
  "position": "대리",
  "field": "안전관리자",
  "labor_supplier": "직영",
  "wage_rate": 120000,
  "allowed_sites": ["site_1", "site_2"],
  "allowed_pages": ["홈", "즐겨찾기", "노임대장"],
  "approved_UID": "firebase_uid_owner",
  "created_at": "2026-04-15T09:30:00Z",
  "resign": false,
  "assigned_by_UID": "firebase_uid_owner",
  "assigned_at": "2026-04-18T14:00:00Z"
}