equipment_attendance_logs 스키마 (장비 출퇴근 로그)
현장 장비(equipment)의 출퇴근 기록. 근로자
attendance_logs와 동일한 페어링 구조 (한 문서에 check_in + check_out을 묶어 저장) 를 사용하되, 장비 식별 정보(equipment_id,equipment_number,equipment_name등)가 추가됩니다.
저장 위치
log_id: Firestore 자동 생성 ID- 체크인 시점에 문서가 생성되고, 체크아웃 승인 시 같은 문서가 업데이트됩니다 (새 문서를 만들지 않음).
- 장비 자체의 식별자는
equipment_id, 장비를 운전/사용하는 사용자는UID입니다.
상태 흐름
[승인된 check_in] link=False, check_out_at=null ← 출근만 기록됨
↓ check_out 승인
[페어 완성] link=True, check_out_at=<시각> ← 출·퇴근 한 쌍 완성
↓ 관리자가 직접 수정/추가 가능 (_equipment_admin_check_out, _add_equipment_attendance_log)
link=False: 아직 퇴근 처리가 안 된 로그 (미완결)link=True: 출·퇴근 모두 처리된 완결 로그
문서 필드
공통 필드
| 필드 | 타입 | 설명 |
|---|---|---|
UID |
string | 장비 운전자/소유자 UID (장비 문서의 UID 필드 복사) |
name |
string | 장비 표시명 (당시 스냅샷, equipment_data["name"]) |
company_id |
string | 회사 ID |
site_id |
string | 현장 ID |
equipment_id |
string | 장비 문서 ID (sites/{sid}/equipments/{eid}) |
check_in_at |
timestamp | 출근 시각 (요청의 check_at 또는 created_at이 복사됨) |
check_out_at |
timestamp | null | 퇴근 시각 (미완결이면 null) |
link |
bool | 출·퇴근 페어 완성 여부 |
check_in_approval_UID |
string | null | 출근 승인자 UID |
check_in_approval_at |
timestamp | null | 출근 승인 시각 |
check_out_approval_UID |
string | null | 퇴근 승인자 UID |
check_out_approval_at |
timestamp | null | 퇴근 승인 시각 |
man_days |
float | 공수 (기본 0) |
요청 승인 경로(_equipment_check_in_request_approval)에서만 저장되는 필드
출근 요청에서 스냅샷된 장비 정보가 함께 보존됩니다.
| 필드 | 타입 | 설명 |
|---|---|---|
equipment_type |
string | 장비 종류 (예: "굴착기", "덤프트럭") |
equipment_number |
string | 장비 번호(차량번호/관리번호) |
equipment_name |
string | 장비 세부명 |
관리자 직접 추가 경로(_add_equipment_attendance_log)에서 추가로 저장되는 필드
| 필드 | 타입 | 설명 |
|---|---|---|
created_at |
timestamp | 로그 생성 시각 (서버 타임스탬프) |
created_by |
string | 로그를 추가한 관리자 UID |
memo |
string | 메모 |
이 경로에서는
equipment_type/equipment_number/equipment_name이 저장되지 않습니다 (코드 상 스냅샷 안 함). 화면에 표시할 때는equipments/{eid}원본을 함께 조회해야 합니다.
관련 컬렉션
- 승인 전 요청: equipment_attendance_requests.md (
status=pending) - 장비 마스터:
companies/{cid}/sites/{sid}/equipments/{eid}—UID,equipment_type,equipment_number,equipment_name원본 보관 - 근로자 출퇴근: attendance_logs.md — 동일 패턴의 근로자 버전
- 삭제 로그:
companies/{cid}/delete_logs— 로그 삭제 시type="equipment_attendance_log"로 기록
생성/수정 경로
_equipment_check_in_request_approval→ 새 문서 생성 (link=False)_equipment_check_out_request_approval→ 기존 link=False 문서 업데이트 (link=True)_equipment_admin_check_out→ 관리자가 퇴근만 강제 처리 (request 단계 스킵)_add_equipment_attendance_log→ 관리자가 직접 로그 추가 (출/퇴근 동시 입력, link=True 고정)_delete_equipment_attendance_log→ 문서 삭제 +delete_logs에 감사 이력 기록
예시 문서
미완결 (출근만, 요청 승인 경로)
{
"UID": "uid_driver",
"name": "이기사",
"company_id": "company_abc",
"site_id": "site_001",
"equipment_id": "eq_001",
"equipment_type": "굴착기",
"equipment_number": "경기99가1234",
"equipment_name": "22톤 굴착기",
"check_in_at": "2026-04-23T08:00:00Z",
"check_out_at": null,
"link": false,
"check_in_approval_UID": "uid_admin",
"check_in_approval_at": "2026-04-23T08:05:00Z",
"check_out_approval_UID": null,
"check_out_approval_at": null,
"man_days": 0
}
페어 완결 (출/퇴근 모두, 요청 승인 경로)
{
"UID": "uid_driver",
"name": "이기사",
"company_id": "company_abc",
"site_id": "site_001",
"equipment_id": "eq_001",
"equipment_type": "굴착기",
"equipment_number": "경기99가1234",
"equipment_name": "22톤 굴착기",
"check_in_at": "2026-04-23T08:00:00Z",
"check_out_at": "2026-04-23T17:30:00Z",
"link": true,
"check_in_approval_UID": "uid_admin",
"check_in_approval_at": "2026-04-23T08:05:00Z",
"check_out_approval_UID": "uid_admin",
"check_out_approval_at": "2026-04-23T17:35:00Z",
"man_days": 1.0
}
관리자 직접 추가 (출/퇴근 동시 입력)
{
"UID": "uid_driver",
"name": "이기사",
"company_id": "company_abc",
"site_id": "site_001",
"equipment_id": "eq_001",
"check_in_at": "2026-04-22T08:00:00Z",
"check_out_at": "2026-04-22T17:30:00Z",
"link": true,
"check_in_approval_UID": "uid_admin",
"check_in_approval_at": "2026-04-22T08:05:00Z",
"check_out_approval_UID": "uid_admin",
"check_out_approval_at": "2026-04-22T17:35:00Z",
"created_at": "2026-04-23T09:00:00Z",
"created_by": "uid_admin",
"memo": "요청 누락분 보완 등록",
"man_days": 0
}