콘텐츠로 이동

equipment_attendance_requests 스키마 (장비 출퇴근 요청)

현장 장비의 출퇴근 승인 요청을 담는 컬렉션. 장비 운전자(=장비 문서의 UID)가 앱에서 출근/퇴근 버튼을 누르면 여기에 pending 문서가 생성되고, 관리자가 승인/거절하면 문서가 업데이트됩니다. 근로자용 attendance_requests와 패턴은 동일하지만 장비 식별 필드가 추가됩니다.

저장 위치

companies/{company_id}/sites/{site_id}/equipment_attendance_requests/{request_id}
  • request_id: Firestore 자동 생성 ID
  • 하나의 장비 운전자는 같은 현장에서 동시에 하나의 pending 장비 출퇴근 요청만 가질 수 있습니다 (코드에서 선검사).

상태 흐름

[장비 운전자 요청]   status=pending
      ↓ (관리자 승인)               ↓ (관리자 거절)           ↓ (운전자 취소)
 status=approved                status=rejected          status=rejected
 + equipment_attendance_logs 문서 생성/페어링
  • pending: 장비 운전자가 출/퇴근 요청한 상태 (승인 대기 중)
  • approved: 관리자가 승인한 상태. 출근이면 equipment_attendance_logs에 새 문서 생성, 퇴근이면 기존 link=False인 로그가 페어링(link=True)됨
  • rejected: 관리자가 거절했거나 요청자(운전자)가 취소한 상태

승인/거절/취소 후에도 문서 자체는 보존됩니다 (감사 이력). 승인된 check_in 요청의 실제 출근 기록은 equipment_attendance_logs 문서에 저장됩니다.

문서 필드

공통 필드

필드 타입 설명
UID string 요청자(장비 운전자/소유자) UID. 장비 문서의 UID와 일치해야 함
name string 장비 표시명 (당시 스냅샷, equipment_data["name"])
type string "check_in" | "check_out"
company_id string 회사 ID
site_id string 현장 ID
equipment_id string 장비 문서 ID (sites/{sid}/equipments/{eid})
equipment_type string 장비 종류 (당시 스냅샷, 기본 "")
equipment_number string 장비 번호(차량번호/관리번호, 당시 스냅샷, 기본 "")
equipment_name string 장비 세부명 (당시 스냅샷, 기본 "")
status string "pending" | "approved" | "rejected"
created_at timestamp 요청 생성 시각 (= 버튼 누른 시각)
approvalUID string | null 승인/거절 처리자 UID (pending 상태에서는 null)
approval_at timestamp | null 승인/거절 시각 (pending 상태에서는 null)

check_out 타입에서만 저장되는 필드

필드 타입 설명
created_by string 요청을 생성한 사용자 UID (퇴근 요청에서만 기록)

현재 코드상 check_at(실제 체크 시각) 필드는 저장되지 않습니다. 승인 시 equipment_attendance_logs에는 check_at or created_at을 사용하므로 실질적으로 created_at 시각이 출/퇴근 시각으로 사용됩니다.

관련 컬렉션

  • 승인 시 생성/업데이트되는 로그: equipment_attendance_logs.md
  • 사용자 쪽 요청 미러: users/{uid}/requestsrequest_type="equipment_attendance", equipment_id 필드 추가, request_path에 본 컬렉션 경로 저장
  • 장비 마스터: companies/{cid}/sites/{sid}/equipments/{eid} — 요청 시점에 소유자/장비 정보 스냅샷 원본
  • 근로자 출퇴근 요청: attendance_requests.md

생성/수정 경로

  • _equipment_check_in_request → 새 pending 문서 생성 (type=check_in)
  • _equipment_check_out_request → 새 pending 문서 생성 (type=check_out, created_by 포함)
  • _equipment_check_in_request_approvalstatus 업데이트(approved/rejected) + check_in 승인 시 equipment_attendance_logs 생성
  • _equipment_check_out_request_approvalstatus 업데이트(approved/rejected) + check_out 승인 시 기존 equipment_attendance_logs 페어링
  • _equipment_attendance_request_cancel → 운전자가 자체 취소 (status=rejected)

예시 문서

출근 요청 (pending)

{
  "UID": "uid_driver",
  "name": "이기사",
  "type": "check_in",
  "company_id": "company_abc",
  "site_id": "site_001",
  "equipment_id": "eq_001",
  "equipment_type": "굴착기",
  "equipment_number": "경기99가1234",
  "equipment_name": "22톤 굴착기",
  "status": "pending",
  "created_at": "2026-04-23T08:00:00Z",
  "approvalUID": null,
  "approval_at": null
}

퇴근 요청 (approved)

{
  "UID": "uid_driver",
  "name": "이기사",
  "type": "check_out",
  "company_id": "company_abc",
  "site_id": "site_001",
  "equipment_id": "eq_001",
  "equipment_type": "굴착기",
  "equipment_number": "경기99가1234",
  "equipment_name": "22톤 굴착기",
  "status": "approved",
  "created_at": "2026-04-23T17:30:00Z",
  "created_by": "uid_driver",
  "approvalUID": "uid_admin",
  "approval_at": "2026-04-23T17:35:00Z"
}

거절된 요청

{
  "UID": "uid_driver",
  "name": "이기사",
  "type": "check_in",
  "company_id": "company_abc",
  "site_id": "site_001",
  "equipment_id": "eq_001",
  "equipment_type": "굴착기",
  "equipment_number": "경기99가1234",
  "equipment_name": "22톤 굴착기",
  "status": "rejected",
  "created_at": "2026-04-23T08:00:00Z",
  "approvalUID": "uid_admin",
  "approval_at": "2026-04-23T08:10:00Z"
}