콘텐츠로 이동

membership_requests 스키마 (현장 입사 요청)

근로자(worker)가 특정 현장에 입사(배정)를 요청하는 문서. 회사/현장 관리자가 승인하면 members 문서가 생성되고 사용자 쪽 membership이 함께 갱신됩니다.

저장 위치

companies/{company_id}/sites/{site_id}/membership_requests/{request_id}
  • request_id: Firestore 자동 생성 ID
  • 요청은 사용자 users/{uid}/requests 문서와 1:1 쌍으로 관리됩니다 (user_notification_id로 연결).

상태 흐름

pending ──(관리자 승인)──► approved    → members 생성 + membership 생성
   ├──(관리자 거절)──────► rejected
   └──(요청자 취소)──────► rejected    (approvalUID = 요청자 본인)
상태 설명 영향
pending 요청 등록 직후 기본 상태 같은 사용자의 site_membership pending 요청은 1개만 허용
approved 관리자 승인 완료 members/{uid} 생성/복구, users/{uid}/membership/{cid}_{sid} 생성, FCM 승인 알림
rejected 관리자 거절 또는 요청자 취소 어떤 문서도 만들지 않음. 거절 시 FCM 거절 알림

이 문서는 삭제되지 않고 status 필드로만 상태 전환됩니다.

문서 필드

필드 타입 설명
UID string 요청한 사용자 UID
status string pending | approved | rejected
type string 요청 유형. 현재 값은 "new" (최초 입사)
field string 희망 직종 (요청자가 입력)
labor_supplier string | null 희망 소속 업체 (선택)
requester_name string 요청 시점 요청자 이름 (평문 스냅샷)
requester_phone_masked string 마스킹된 전화번호 (010-****-1234)
requester_phone_enc string 암호화된 전화번호
requester_email_enc string 암호화된 이메일
main_address string 주소 (도로명/지번)
sub_address_enc string 암호화된 상세 주소
requester_birth timestamp 생년월일
requester_sex string "male" | "female"
user_notification_id string 사용자 쪽 users/{uid}/requests/{id} 문서 ID (쌍으로 갱신)
created_at timestamp 요청 생성 시각 (SERVER_TIMESTAMP)
approved_at timestamp | null 승인/거절/취소 시각 (pending이면 null)
approvalUID string | null 승인/거절/취소 처리자 UID (pending이면 null, 요청자 취소 시 요청자 본인)

승인 시 관리자 입력값

승인 엔드포인트(_site_assign_request_approval)는 승인 시점에 아래 값을 다시 받아 members 생성에 반영합니다 (요청 시 저장된 field/labor_supplier와 다를 수 있음).

필드 설명
field 확정된 직종 (빈 문자열이면 "없음"). companies/{cid}/settings/tags.fields에 있어야 함
labor_supplier 확정된 업체. companies/{cid}/settings/tags.labor_suppliers에 있어야 함
wage_rate field에 매핑된 단가 (settings/tags.wage_rate[field_index])를 자동 계산

승인 시 생성/갱신되는 문서

  1. members/{uid} 생성 또는 복구members.md 참조
  2. 신규면 database.write(doc_id=UID)로 생성
  3. 기존 문서(resign=True 상태)가 있으면 resign=False로 복구 업데이트 (재입사)
  4. 현재 활동 중(resign=False)인 기존 문서가 있으면 MEMBER_004 에러
  5. users/{uid}/membership/{cid}_{sid} 생성common/_schema/membership.md
  6. role="worker", company_name, site_name 스냅샷 포함
  7. users/{uid}/requests/{notification_id} 갱신
  8. status: "approved"로 업데이트 — common/_schema/requests.md
  9. FCM 알림 전송
  10. 제목: [입사] 현장 입사 승인
  11. notification_type: "site_assign_approved"

거절/취소 시 동작

경우 처리
관리자 거절 status="rejected" + approvalUID=관리자UID. 사용자 쪽 requestsrejected로 갱신. FCM 거절 알림 전송 (notification_type: "site_assign_rejected")
요청자 취소 status="rejected" + approvalUID=요청자UID. 사용자 쪽 requestsrejected로 갱신. FCM 알림 없음

요청 생성 시 선검사 (REQUEST_003 등)

_site_assign_request 호출 시 아래를 검사하여 거부합니다:

  • 현장(sites/{sid})이 존재해야 함 (SITE_001)
  • 동일 사용자의 site_membership pending 요청이 이미 있으면 중복 거부 (REQUEST_003)
  • 다른 회사에 소속된 membership이 있으면 거부 (MEMBER_009). 같은 회사 내 복수 역할은 허용.

예시 문서 (pending)

{
  "UID": "uid_worker",
  "status": "pending",
  "type": "new",
  "field": "철근공",
  "labor_supplier": "동양노무",
  "requester_name": "홍길동",
  "requester_phone_masked": "010-****-1234",
  "requester_phone_enc": "base64...",
  "requester_email_enc": "base64...",
  "main_address": "서울시 강남구",
  "sub_address_enc": "base64...",
  "requester_birth": "1990-01-15T00:00:00Z",
  "requester_sex": "male",
  "user_notification_id": "notif_abc123",
  "created_at": "2026-04-20T09:00:00Z",
  "approved_at": null,
  "approvalUID": null
}

예시 문서 (approved)

{
  "UID": "uid_worker",
  "status": "approved",
  "type": "new",
  "field": "철근공",
  "labor_supplier": "동양노무",
  "requester_name": "홍길동",
  "requester_phone_masked": "010-****-1234",
  "requester_phone_enc": "base64...",
  "requester_email_enc": "base64...",
  "main_address": "서울시 강남구",
  "sub_address_enc": "base64...",
  "requester_birth": "1990-01-15T00:00:00Z",
  "requester_sex": "male",
  "user_notification_id": "notif_abc123",
  "created_at": "2026-04-20T09:00:00Z",
  "approved_at": "2026-04-20T10:30:00Z",
  "approvalUID": "uid_admin"
}

관련 엔드포인트

  • _site_assign_request (con24/site/HR/worker_assign.py) — 요청 생성
  • _site_assign_request_cancel — 요청자 취소 (status → rejected)
  • _site_assign_request_approval — 관리자 승인/거절 (배열 처리 지원)

관련 스키마