companies/{company_id}/membership_requests 스키마
회사(기업) 가입 신청 요청 문서.
_company_assign_request로 생성되고_company_assign_request_approval/_company_assign_request_cancel로 종결됩니다. 사용자 입장에서는users/{UID}/requests/{request_id}에 미러링되어 알림 목록에 노출됩니다.
저장 위치
request_id는 자동 생성(database.write 반환 값)이며, 사용자의 users/{UID}/requests 문서의 request_path 필드에 이 컬렉션 경로가 저장됩니다.
상태 흐름
pending → approved (승인 → members 생성 & users/{uid}/membership 생성 → FCM 알림)
pending → rejected (거절 → FCM 알림)
pending → rejected (본인 취소 → cancel)
pending: 기업 측 승인 대기approved: 승인 완료 (멤버 등록됨)rejected: 거절 또는 본인 취소
한 사용자는 여러 회사에 동시에 pending을 가질 수 없고(users/{UID}/requests에서 pending 1건 체크), 이미 다른 회사에 소속된 경우에도 차단됩니다(MEMBER_009).
문서 필드
| 필드 | 타입 | 설명 |
|---|---|---|
UID |
string | 요청자 UID |
status |
string | "pending" | "approved" | "rejected" |
created_at |
timestamp | 요청 생성 시각 |
requester_name |
string | 요청자 이름 (복호화된 평문) |
requester_phone_masked |
string | 마스킹된 전화번호 (예: "010-****-1234") |
requester_phone_enc |
string | 전화번호 AES 암호화 값 (승인 시 members 문서로 복사) |
requester_email_enc |
string | 이메일 AES 암호화 값 |
main_address |
string | 주소 (평문) |
sub_address_enc |
string | 상세주소 암호화 값 |
requester_birth |
string | 생년월일 |
requester_sex |
string | 성별 ("male" | "female") |
approved_at |
timestamp? | 처리(승인/거절/취소) 시각, 초기값 null |
approvalUID |
string? | 처리자 UID (본인 취소면 본인 UID), 초기값 null |
user_notification_id |
string | 사용자 쪽 users/{UID}/requests/{doc_id} ID (상태 동기화에 사용) |
승인 동작 (request_state=approved)
_company_assign_request_approval에서 role 파라미터를 받아 다음을 수행합니다.
companies/{cid}/members/{UID}생성 또는 재입사 업데이트 (role은manager또는admin만 허용)users/{UID}/membership/{company_id}생성 (company_id, company_name, site_id=null, site_name=null, role)- 본 문서 update:
status=approved,approved_at,approvalUID=UID users/{UID}/requests/{user_notification_id}update:status=approved- 요청자에게 FCM 알림 (
category=approved,notification_type=company_assign_approved)
재입사 케이스에서 기존 멤버가 resign=False이면 MEMBER_004 에러.
거절 / 취소 동작
- 거절(
request_state=rejected) / 본인 취소(_company_assign_request_cancel) 모두status=rejected로 기록. - 본인 취소도
approvalUID=UID(본인),approved_at=SERVER_TIMESTAMP로 기록됨. - 거절 시 FCM 알림(
category=rejected,notification_type=company_assign_rejected) 전송.
예시 문서 (approved)
{
"UID": "firebase_uid_applicant",
"status": "approved",
"created_at": "2026-04-20T09:00:00Z",
"requester_name": "홍길동",
"requester_phone_masked": "010-****-1234",
"requester_phone_enc": "encrypted_base64",
"requester_email_enc": "encrypted_base64",
"main_address": "서울특별시 강남구",
"sub_address_enc": "encrypted_base64",
"requester_birth": "1995-03-10",
"requester_sex": "male",
"approved_at": "2026-04-20T10:00:00Z",
"approvalUID": "firebase_uid_owner",
"user_notification_id": "user_request_doc_id"
}