콘텐츠로 이동

equipment_change_requests 스키마 (장비 현장 변경 요청)

이미 특정 현장(from_site_id)에 배정된 장비(equipments/{equipment_id})를 같은 회사 내 다른 현장(to_site_id)으로 이동 요청하는 문서. 승인되면 출발 현장 장비는 resign=True(reason="site_change")가 되고 도착 현장에 장비 문서가 새로 생성됩니다.

저장 위치

companies/{company_id}/sites/{to_site_id}/equipment_change_requests/{request_id}

주의: 변경 요청 문서는 도착 현장(to_site_id) 하위에 저장됩니다.

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

상태 흐름

pending ──(관리자 승인)──► approved   → from 장비 resign + to 장비 생성 + membership 문서 ID 교체
   ├──(관리자 거절)──────► rejected
   └──(요청자 취소)──────► rejected   (approvalUID = 요청자 본인)
상태 설명 영향
pending 요청 등록 직후 같은 사용자의 equipment_site_change pending 요청은 1개만 허용
approved 관리자 승인 출발 장비 resign=True, 도착 장비 생성/복구, membership 문서 ID 재구성 ({cid}_{from_site_id}_{equipment_id}{cid}_{to_site_id}_{equipment_id}), FCM 승인 알림
rejected 관리자 거절 또는 요청자 취소 장비/membership 변경 없음. 거절 시 FCM 거절 알림

문서 필드

필드 타입 설명
UID string 요청자 (장비 소유자) UID
status string pending | approved | rejected
company_id string 회사 ID
from_site_id string 출발 현장 ID (장비가 현재 배정된 곳)
to_site_id string 도착 현장 ID (이동 희망) — 요청 문서가 저장되는 사이트
equipment_id string 이동 대상 장비 ID
equipment_type string 장비 구분 (스냅샷, users/{uid}/equipments에서 복사)
equipment_name string 장비 모델명 (스냅샷)
equipment_number string 차량 등록번호 (스냅샷)
requester_name string 요청자 이름 (스냅샷, 출발 현장 equipments 문서의 name 복사)
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 요청 생성 시각
approved_at timestamp | null 처리 시각
approvalUID string | null 처리자 UID (요청자 취소 시 요청자 본인)

요청 생성 시 선검사

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

  • 출발 현장 장비(companies/{cid}/sites/{from_site_id}/equipments/{equipment_id}) 존재 확인 (EQUIPMENT_004)
  • 요청자가 해당 장비 소유자(UID 일치)여야 함 (PERMISSION_006)
  • 출발 현장 장비가 resign=True면 거부 (EQUIPMENT_003)
  • 도착 현장이 존재하고 status="activate" 이어야 함 (SITE_001/SITE_003)
  • 동일 사용자의 equipment_site_change pending 요청이 이미 있으면 거부 (REQUEST_003)
  • 출발 현장에서 해당 장비의 미완결 출퇴근 로그(equipment_attendance_logs with link=False)가 있으면 거부 (SITE_006)
  • 해당 장비의 출석 요청(equipment_attendance) pending이 있으면 거부 (SITE_007)
  • 개인 장비 마스터(users/{UID}/equipments/{equipment_id})가 존재해야 함 (EQUIPMENT_004)

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

  1. 출발 현장 equipments/{equipment_id} 업데이트
  2. resign: True, resign_at, resign_UID=관리자UID, resign_reason="site_change"
  3. 도착 현장 equipments/{equipment_id} 생성 또는 복구
  4. 경로: companies/{cid}/sites/{to_site_id}/equipments/{equipment_id}
  5. 기존 문서가 있으면 업데이트, 없으면 신규 생성
  6. 출발 현장 장비의 연락처/주소 스냅샷 + 개인 장비 마스터의 equipment_* 필드 + resign=False, assigned_by=관리자UID, assigned_at
  7. 사용자 멤버십 문서 ID 재구성common/_schema/membership.md
  8. 기존 문서 users/{uid}/membership/{cid}_{from_site_id}_{equipment_id} 삭제
  9. 새 문서 users/{uid}/membership/{cid}_{to_site_id}_{equipment_id} 생성
  10. 문서 ID가 바뀌는 이유는 membership_id 규칙이 {cid}_{sid}_{eid} 이기 때문 (근로자 현장 변경과 달리 업데이트가 아닌 삭제+재생성)
  11. users/{uid}/requests/{notification_id} 갱신
  12. status: "approved"common/_schema/requests.md
  13. FCM 알림 전송
  14. 제목: [현장변경] 장비 현장 변경 승인
  15. notification_type: "equipment_site_change_approved"

거절/취소 시 동작

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

관리자 강제 변경 (요청 없이 이동)

관리자용 _equipment_site_change는 이 컬렉션에 문서를 만들지 않고 즉시 장비/membership을 업데이트합니다 (승인 단계 스킵).

근로자 change_requests와의 차이점

항목 근로자 change_requests 장비 equipment_change_requests
membership 문서 ID 규칙 {cid}_{sid} (site_id만) {cid}_{sid}_{eid} (equipment_id 포함)
승인 시 membership 처리 업데이트 (site_id/site_name만 갱신) 삭제 + 재생성 (문서 ID가 바뀌므로)
스냅샷 필드 requester_wage_rate 포함 equipment_type/equipment_name/equipment_number 포함
출근 중 체크 get_site_attendance_state() == "check_in" equipment_attendance_logslink=False 존재 여부

예시 문서 (pending)

{
  "UID": "uid_owner",
  "status": "pending",
  "company_id": "company_abc",
  "from_site_id": "site_old",
  "to_site_id": "site_new",
  "equipment_id": "equipment_123",
  "equipment_type": "덤프트럭",
  "equipment_name": "현대 25톤 덤프",
  "equipment_number": "12가 3456",
  "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
}

관련 엔드포인트

  • _equipment_site_change_request (con24/site/HR/equipment_site_change.py) — 요청 생성
  • _equipment_site_change_request_cancel — 요청자 취소
  • _equipment_site_change_request_approval — 관리자 승인/거절 (모든 사이트 순회하며 request_id 검색)
  • _equipment_site_change — 관리자 강제 변경 (요청 없이 즉시 처리)

관련 스키마