equipment_change_requests 스키마 (장비 현장 변경 요청)
이미 특정 현장(
from_site_id)에 배정된 장비(equipments/{equipment_id})를 같은 회사 내 다른 현장(to_site_id)으로 이동 요청하는 문서. 승인되면 출발 현장 장비는resign=True(reason="site_change")가 되고 도착 현장에 장비 문서가 새로 생성됩니다.
저장 위치
주의: 변경 요청 문서는 도착 현장(
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_changepending 요청이 이미 있으면 거부 (REQUEST_003) - 출발 현장에서 해당 장비의 미완결 출퇴근 로그(
equipment_attendance_logswithlink=False)가 있으면 거부 (SITE_006) - 해당 장비의 출석 요청(
equipment_attendance) pending이 있으면 거부 (SITE_007) - 개인 장비 마스터(
users/{UID}/equipments/{equipment_id})가 존재해야 함 (EQUIPMENT_004)
승인 시 생성/갱신되는 문서
- 출발 현장
equipments/{equipment_id}업데이트 resign: True,resign_at,resign_UID=관리자UID,resign_reason="site_change"- 도착 현장
equipments/{equipment_id}생성 또는 복구 - 경로:
companies/{cid}/sites/{to_site_id}/equipments/{equipment_id} - 기존 문서가 있으면 업데이트, 없으면 신규 생성
- 출발 현장 장비의 연락처/주소 스냅샷 + 개인 장비 마스터의
equipment_*필드 +resign=False,assigned_by=관리자UID,assigned_at - 사용자 멤버십 문서 ID 재구성 — common/_schema/membership.md
- 기존 문서
users/{uid}/membership/{cid}_{from_site_id}_{equipment_id}삭제 - 새 문서
users/{uid}/membership/{cid}_{to_site_id}_{equipment_id}생성 - 문서 ID가 바뀌는 이유는 membership_id 규칙이
{cid}_{sid}_{eid}이기 때문 (근로자 현장 변경과 달리 업데이트가 아닌 삭제+재생성) users/{uid}/requests/{notification_id}갱신status: "approved"— common/_schema/requests.md- FCM 알림 전송
- 제목:
[현장변경] 장비 현장 변경 승인 notification_type: "equipment_site_change_approved"
거절/취소 시 동작
| 경우 | 처리 |
|---|---|
| 관리자 거절 | status="rejected" + approvalUID=관리자UID. 사용자 쪽 requests도 rejected. FCM 거절 알림 (notification_type: "equipment_site_change_rejected") |
| 요청자 취소 | status="rejected" + approvalUID=요청자UID. 사용자 쪽 requests도 rejected. 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_logs에 link=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— 관리자 강제 변경 (요청 없이 즉시 처리)
관련 스키마
companies/{cid}/sites/{sid}/equipments/{eid}— 출발 현장은 resign, 도착 현장은 신규 생성 (개별 스키마 문서 미작성)- common/_schema/requests.md — 사용자 쪽 요청 미러 (
request_type: "equipment_site_change") - common/_schema/membership.md — 문서 ID 재구성 대상 (
role: "equipment") - common/_schema/equipments.md — 개인 장비 마스터
- equipment_assign_requests.md — 최초 배정 요청 (현장 변경이 아닌 신규 배정)