companies/{company_id}/members 스키마
회사 멤버 문서. 회사에 소속된 관리 직원(owner/admin/manager)의 정보를 저장합니다. 현장 근로자(worker)와 장비(equipment)는
companies/{cid}/sites/{sid}/members및equipments에 따로 저장됩니다.
저장 위치
문서 ID는 사용자의 UID와 동일합니다 (database.write(..., doc_id=UID, ...)).
생성/변경 흐름
owner 가입 (_company_registration) → role=owner로 생성
│
└── admin/manager 가입 요청 (_company_assign_request)
└── membership_requests/{request_id} 생성 (status=pending)
│
├── 승인 (_company_assign_request_approval, request_state=approved)
│ └── members/{UID} 생성 또는 기존 문서 업데이트 (role=admin|manager, resign=False)
│
└── 거절 → members/{UID} 미생성
퇴사 (_company_resign)
└── members/{UID}는 삭제하지 않고 resign=True로 업데이트
├── allowed_sites=[]로 초기화
└── 연결된 모든 sites/{sid}/supervisor/{UID} 문서 삭제
재입사
└── 기존 resign=True 문서 재승인 시 update로 전환 (resign=False)
문서 필드
| 필드 | 타입 | 설명 |
|---|---|---|
UID |
string | 사용자 UID (문서 ID와 동일) |
name |
string | 사용자 이름 (평문) |
phone_enc |
string | 전화번호 AES 암호화 값 |
email_enc |
string | 이메일 AES 암호화 값 |
phone_masked |
string | 마스킹된 전화번호 (예: "010-****-1234") |
main_address |
string | 주소 (평문) |
sub_address_enc |
string | 상세주소 AES 암호화 값 |
birth |
string | 생년월일 (YYYY-MM-DD) |
sex |
string | 성별 ("male" | "female") |
role |
string | "owner" | "admin" | "manager" |
position |
string | 직급 (settings/tags.positions 중 하나, 기본 "없음") |
field |
string | 직종/분야 (settings/tags.fields 중 하나, 기본 "없음") |
wage_rate |
number | 일당 (settings/tags.wage_rate에서 field 인덱스로 자동 계산, 기본 0) |
labor_supplier |
string | 인력 공급처 (settings/tags.labor_suppliers 중 하나, 기본 "없음") |
allowed_sites |
string[] | 접근 가능한 site_id 배열 (owner는 빈 배열이어도 모든 현장 접근 가능) |
allowed_pages |
string[] | 접근 가능한 페이지 이름 배열 (owner는 _get_pages_list() 전체) |
approved_UID |
string | 가입 승인자 UID (owner의 경우 본인 UID) |
created_at |
timestamp | 가입 승인 시각 |
resign |
boolean | 퇴사 여부 (기본 false) |
resign_at |
timestamp? | 퇴사 시각 (resign=true일 때) |
resign_UID |
string? | 퇴사 처리자 UID (본인 탈퇴면 본인 UID) |
resign_reason |
string? | 퇴사 사유 (현재는 "manual_resign"만 사용) |
fcm_token |
string? | 푸시 알림용 FCM 토큰 (users 문서에서 복사) |
역할(role) 값
| 값 | 설명 |
|---|---|
owner |
회사 소유자 (생성 시 1명). 탈퇴 불가, 모든 권한 보유 |
admin |
관리자. 일반적으로 모든 기능 접근 가능 |
manager |
매니저. allowed_sites / allowed_pages로 권한 제한 |
권한 체크는 con24/utils/membership.py의 check_company_permission에서 수행됩니다. 기본 허용 role은 ["owner", "admin", "manager"].
allowed_sites / allowed_pages 규칙
allowed_sites:set_site_rules/add_site_supervisor/delete_site_supervisor로 관리. 변경 시 해당 site의supervisor컬렉션에 복사본 생성/삭제됨.allowed_pages:set_page_rules로 관리. 페이지명 배열(예: "홈", "즐겨찾기", "회사 설정" 등)- owner는 가입 시
_get_pages_list()가 반환한 전체 페이지 목록이 자동 할당됨.
퇴사 규칙
role="owner"는 탈퇴 불가 (회사 삭제 또는 소유권 위임이 필요)- 퇴사 시 문서를 삭제하지 않고
resign=True플래그와 메타데이터만 업데이트 - 모든 현장의
supervisor컬렉션에서 해당 UID 문서가 제거됨 users/{UID}/membership/{company_id}문서도 함께 삭제됨
예시 문서 (admin)
{
"UID": "firebase_uid_admin",
"name": "김관리자",
"phone_enc": "encrypted_base64",
"email_enc": "encrypted_base64",
"phone_masked": "010-****-5678",
"main_address": "서울특별시 강남구",
"sub_address_enc": "encrypted_base64",
"birth": "1990-05-15",
"sex": "male",
"role": "admin",
"position": "과장",
"field": "안전관리자",
"wage_rate": 120000,
"labor_supplier": "직영",
"allowed_sites": ["site_id_1", "site_id_2"],
"allowed_pages": ["홈", "즐겨찾기", "노임대장", "위험성 평가"],
"approved_UID": "firebase_uid_owner",
"created_at": "2026-04-15T09:30:00Z",
"resign": false,
"fcm_token": "dX..."
}