콘텐츠로 이동

equipment_assign_requests 스키마 (장비 배정 요청)

사용자가 보유한 개인 장비(users/{uid}/equipments/{equipment_id})를 특정 현장에 배정해달라고 요청하는 문서. 승인 시 현장 equipments/{equipment_id} 문서가 생성되고 사용자 쪽 membership이 생성됩니다 (role="equipment").

저장 위치

companies/{company_id}/sites/{site_id}/equipment_assign_requests/{request_id}
  • request_id: Firestore 자동 생성 ID
  • 요청자 UID의 users/{uid}/requests 문서와 1:1 쌍 (user_notification_id)

상태 흐름

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

문서 필드

필드 타입 설명
UID string 요청자 (장비 소유자) UID
status string pending | approved | rejected
equipment_id string 배정하려는 개인 장비 문서 ID (users/{uid}/equipments/{equipment_id})
requester_name string 요청자 이름 (평문 스냅샷)
requester_phone_masked string 마스킹된 전화번호
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 처리 시각
approvalUID string | null 처리자 UID (요청자 취소 시 요청자 본인)

장비 상세(equipment_type/equipment_name/equipment_number)는 이 요청 문서에는 저장되지 않습니다. 승인 시점에 users/{uid}/equipments/{equipment_id}에서 직접 조회하여 현장 equipments 문서에 스냅샷 저장합니다.

요청 생성 시 선검사

_equipment_assign_request는 다음을 검사 후 실패 시 거부합니다:

  • 요청자의 개인 장비(users/{UID}/equipments/{equipment_id})가 존재해야 함 (EQUIPMENT_001)
  • 동일 사용자의 equipment_membership pending 요청이 이미 있으면 거부 (EQUIPMENT_008)
  • 다른 회사 소속 membership이 있으면 거부 (MEMBER_009). 같은 회사 내 복수 역할은 허용.
  • 현장이 존재하고 status="activate" 이어야 함 (SITE_001/SITE_003)
  • 이미 동일 현장에 equipments/{equipment_id} 문서가 있으면 거부 (EQUIPMENT_002)

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

  1. equipments/{equipment_id} 생성 또는 복구
  2. 경로: companies/{company_id}/sites/{site_id}/equipments/{equipment_id}
  3. doc_id = equipment_id (개인 장비 ID와 동일)
  4. 기존 문서가 있으면 resign=False로 업데이트(복구), 없으면 신규 생성
  5. 저장 필드(주요): UID, name, phone_enc, phone_masked, email_enc, main_address, sub_address_enc, birth, sex, equipment_type, equipment_name, equipment_number, resign=False, assigned_by, assigned_at
  6. users/{uid}/membership/{cid}_{sid}_{equipment_id} 생성 또는 업데이트common/_schema/membership.md
  7. doc_id = {company_id}_{site_id}_{equipment_id} 형식
  8. role: "equipment", site_name, equipment_name/equipment_type/equipment_number 스냅샷 포함
  9. users/{uid}/requests/{notification_id} 갱신
  10. status: "approved"common/_schema/requests.md
  11. FCM 알림 전송
  12. 제목: [배정] 장비 배정 승인
  13. notification_type: "equipment_assign_approved"

거절/취소 시 동작

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

예시 문서 (pending)

{
  "UID": "uid_owner",
  "status": "pending",
  "equipment_id": "equipment_123",
  "requester_name": "홍길동",
  "requester_phone_masked": "010-****-1234",
  "requester_phone_enc": "base64...",
  "requester_email_enc": "base64...",
  "main_address": "서울시 강남구",
  "sub_address_enc": "base64...",
  "requester_birth": "1975-03-20T00:00:00Z",
  "requester_sex": "male",
  "user_notification_id": "notif_xyz",
  "created_at": "2026-04-20T09:00:00Z",
  "approved_at": null,
  "approvalUID": null
}

예시 문서 (approved)

{
  "UID": "uid_owner",
  "status": "approved",
  "equipment_id": "equipment_123",
  "requester_name": "홍길동",
  "requester_phone_masked": "010-****-1234",
  "requester_phone_enc": "base64...",
  "requester_email_enc": "base64...",
  "main_address": "서울시 강남구",
  "sub_address_enc": "base64...",
  "requester_birth": "1975-03-20T00:00:00Z",
  "requester_sex": "male",
  "user_notification_id": "notif_xyz",
  "created_at": "2026-04-20T09:00:00Z",
  "approved_at": "2026-04-20T11:00:00Z",
  "approvalUID": "uid_admin"
}

관련 엔드포인트

  • _equipment_assign_request (con24/site/HR/equipment_assign.py) — 요청 생성
  • _equipment_assign_request_cancel — 요청자 취소
  • _equipment_assign_request_approval — 관리자 승인/거절 (배열 처리 지원)
  • _equipment_resign — 장비 해제 (승인 후 해제할 때. 이 문서가 아닌 equipments/{equipment_id} 자체를 resign=True로 전환)

관련 스키마