콘텐츠로 이동

companies/{company_id}/members 스키마

회사 멤버 문서. 회사에 소속된 관리 직원(owner/admin/manager)의 정보를 저장합니다. 현장 근로자(worker)와 장비(equipment)는 companies/{cid}/sites/{sid}/membersequipments에 따로 저장됩니다.

저장 위치

companies/{company_id}/members/{UID}

문서 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.pycheck_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..."
}

예시 문서 (퇴사)

{
  "UID": "firebase_uid_manager",
  "name": "박매니저",
  "role": "manager",
  "allowed_sites": [],
  "resign": true,
  "resign_at": "2026-04-22T18:00:00Z",
  "resign_UID": "firebase_uid_owner",
  "resign_reason": "manual_resign"
}