equipment_attendance_requests 스키마 (장비 출퇴근 요청)
현장 장비의 출퇴근 승인 요청을 담는 컬렉션. 장비 운전자(=장비 문서의
UID)가 앱에서 출근/퇴근 버튼을 누르면 여기에pending문서가 생성되고, 관리자가 승인/거절하면 문서가 업데이트됩니다. 근로자용attendance_requests와 패턴은 동일하지만 장비 식별 필드가 추가됩니다.
저장 위치
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}/requests —
request_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_approval→status업데이트(approved/rejected) + check_in 승인 시equipment_attendance_logs생성_equipment_check_out_request_approval→status업데이트(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"
}