companies/{company_id}/sites/{site_id}/supervisor 스키마
현장 감독자 문서. 회사 멤버(
companies/{cid}/members)가 특정 현장에 접근 권한을 가질 때 해당 현장의supervisor서브컬렉션에 스냅샷이 복사됩니다. 이 컬렉션은companies/{cid}/members문서의 복사본 + 할당 메타로 구성되며, 현장 단위에서 감독자 목록을 빠르게 조회하기 위한 용도입니다.
저장 위치
문서 ID는 감독자의 UID와 동일합니다.
생성/삭제 흐름
_set_site_rules (여러 현장의 allowed_sites를 한번에 변경)
├── added_sites: 각 현장 supervisor에 문서 write
└── removed_sites: 해당 현장 supervisor의 UID 문서 delete
_add_site_supervisor (단일 현장에 추가)
├── members.{UID}.allowed_sites에 site_id ArrayUnion
└── supervisor/{UID} write (멤버 정보 전체 복사 + 할당 메타)
_delete_site_supervisor (단일 현장에서 제거)
├── members.{UID}.allowed_sites에서 site_id 제거
└── supervisor에서 UID 문서 delete
_company_resign (멤버 탈퇴)
└── 모든 현장 supervisor에서 해당 UID 문서 일괄 delete
site/registration.py (현장 생성)
├── 요청자(UID) supervisor에 추가
└── 감독자(supervisor_UID) supervisor에 추가 (요청자와 다를 때)
문서 필드
companies/{cid}/members/{UID} 문서의 필드를 통째로 복사하고 할당 메타 2개를 추가합니다. 주요 필드는 다음과 같습니다.
| 필드 | 타입 | 설명 |
|---|---|---|
UID |
string | 감독자 UID (문서 ID와 동일) |
name |
string | 이름 |
phone_enc |
string | 전화번호 암호화 |
email_enc |
string | 이메일 암호화 |
phone_masked |
string | 마스킹 전화번호 |
main_address |
string | 주소 |
sub_address_enc |
string | 상세주소 암호화 |
birth |
string | 생년월일 |
sex |
string | 성별 |
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 |
boolean | 퇴사 여부 (할당 시점은 항상 false) |
fcm_token |
string? | FCM 토큰 |
assigned_by_UID |
string | (추가) 현장 감독으로 할당한 사람의 UID |
assigned_at |
timestamp | (추가) 감독 할당 시각 |
데이터 동기화 주의사항
- 이 문서는 할당 시점의 스냅샷입니다.
members문서가 업데이트되어도 자동으로 동기화되지 않습니다 (현재 코드 경로상 트리거 확인 안 됨). - 권한 체크는
check_company_permission에서members.allowed_sites를 기준으로 합니다.supervisor컬렉션은 "현장 단위에서 누가 감독인지 빠르게 조회"할 때 사용됩니다. - 퇴사 시
_company_resign이 전 현장을 순회하며 supervisor 문서를 삭제합니다.
예시 문서
{
"UID": "firebase_uid_manager",
"name": "박매니저",
"phone_enc": "encrypted_base64",
"email_enc": "encrypted_base64",
"phone_masked": "010-****-9876",
"main_address": "서울특별시 서초구",
"sub_address_enc": "encrypted_base64",
"birth": "1988-07-20",
"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"
}