attendance_logs 스키마 (근로자 출퇴근 로그)
현장 근로자(worker)의 출퇴근 기록. 한 문서에 check_in + check_out을 묶어 저장하는 페어링 구조입니다.
저장 위치
log_id: Firestore 자동 생성 ID- 체크인 시점에 문서가 생성되고, 체크아웃 승인 시 같은 문서가 업데이트됩니다 (새 문서를 만들지 않음).
상태 흐름
[승인된 check_in] link=False, check_out_at=null ← 출근만 기록됨
↓ check_out 승인
[페어 완성] link=True, check_out_at=<시각> ← 출퇴근 한 쌍 완성
↓ 관리자가 직접 수정/추가 가능 (admin_check_out, add_site_attendance_log)
link=False: 아직 퇴근 처리가 안 된 로그 (미완결)link=True: 출·퇴근 모두 처리된 완결 로그
현장 상태가 complete가 되면 link=False인 로그는 자동 정리됩니다.
문서 필드
| 필드 | 타입 | 설명 |
|---|---|---|
UID |
string | 근로자 UID |
name |
string | 근로자 이름 (당시 스냅샷) |
company_id |
string | 회사 ID |
site_id |
string | 현장 ID |
task_id |
string? | 배정된 작업 ID (없을 수 있음) |
position |
string | 직급 (당시 스냅샷) |
field |
string | 공종 (당시 스냅샷) |
labor_supplier |
string | 인력 공급처 (당시 스냅샷) |
check_in_at |
timestamp | 출근 시각 |
check_out_at |
timestamp | null | 퇴근 시각 (미완결이면 null) |
link |
bool | 출·퇴근 페어 완성 여부 |
check_in_approval_UID |
string | 출근 승인자 UID |
check_in_approval_at |
timestamp | 출근 승인 시각 |
check_out_approval_UID |
string | null | 퇴근 승인자 UID |
check_out_approval_at |
timestamp | null | 퇴근 승인 시각 |
man_days |
float | 공수 (기본 0, 관리자 수정 가능 — update_man_days) |
관련 컬렉션
- 요청 중인 출/퇴근: attendance_requests.md (
status=pending) - 사용자 쪽 요청 미러:
users/{uid}/requests(common/_schema/requests.md) - 장비 출퇴근: equipment_attendance_logs.md — 아직 미작성
생성/수정 경로
site_check_in_request_approval→ 새 문서 생성 (link=False)site_check_out_request_approval→ 기존 link=False 문서 업데이트 (link=True)site_admin_check_out→ 관리자가 퇴근만 강제 처리 (request 단계 스킵)add_site_attendance_log→ 관리자가 직접 로그 추가 (출/퇴근 동시 입력 가능)edit_site_attendance_task→task_id재배정site_update_man_days→man_days수정delete_site_attendance_log→ 문서 삭제
예시 문서
미완결 (출근만)
{
"UID": "uid_worker",
"name": "홍길동",
"company_id": "company_abc",
"site_id": "site_001",
"task_id": "task_20260420",
"position": "작업반장",
"field": "철근",
"labor_supplier": "대한인력",
"check_in_at": "2026-04-20T08:00:00Z",
"check_out_at": null,
"link": false,
"check_in_approval_UID": "uid_admin",
"check_in_approval_at": "2026-04-20T08:05:00Z",
"check_out_approval_UID": null,
"check_out_approval_at": null,
"man_days": 0
}
페어 완결 (출/퇴근 모두)
{
"UID": "uid_worker",
"name": "홍길동",
"company_id": "company_abc",
"site_id": "site_001",
"task_id": "task_20260420",
"position": "작업반장",
"field": "철근",
"labor_supplier": "대한인력",
"check_in_at": "2026-04-20T08:00:00Z",
"check_out_at": "2026-04-20T17:30:00Z",
"link": true,
"check_in_approval_UID": "uid_admin",
"check_in_approval_at": "2026-04-20T08:05:00Z",
"check_out_approval_UID": "uid_admin",
"check_out_approval_at": "2026-04-20T17:35:00Z",
"man_days": 1.0
}