companies/{company_id}/attendance_requests 스키마
회사 출퇴근 요청 문서. admin/manager가 출근 또는 퇴근을 요청하면 생성되고, 승인 시
attendance_logs로 반영됩니다. 사용자 쪽에는users/{UID}/requests/{request_id}에 미러링됩니다.
저장 위치
상태 흐름
pending → approved (check_in 승인 → attendance_logs 생성)
pending → approved (check_out 승인 → 기존 attendance_logs 업데이트, link=True)
pending → rejected (거절 또는 본인 취소)
pending: 승인 대기approved: 승인 완료rejected: 거절/취소
같은 회사에 대해 users/{UID}/requests 내 pending이 1건이라도 있으면 추가 요청 불가 (ATTENDANCE_001, ATTENDANCE_010).
문서 필드
| 필드 | 타입 | 설명 |
|---|---|---|
UID |
string | 요청자 UID |
name |
string | 요청자 이름 |
type |
string | "check_in" | "check_out" |
member_type |
string? | "company" (check_in 요청에만 기록) |
company_id |
string | 회사 ID |
site_id |
string? | 현장 ID (check_in 시 선택, check_out은 원본 check_in의 site_id 복사) |
created_at |
timestamp | 요청 생성 시각 |
check_at |
timestamp | 체크(출근/퇴근) 시각 (생성 시점의 SERVER_TIMESTAMP) |
position |
string? | 요청 시점의 직급 (check_in에만) |
field |
string? | 요청 시점의 직종 (check_in에만) |
labor_supplier |
string? | 요청 시점의 인력 공급처 (check_in에만) |
memo |
string | 메모 (기본 "") |
status |
string | "pending" | "approved" | "rejected" |
approvalUID |
string? | 처리자 UID (초기 null) |
approval_at |
timestamp? | 처리 시각 (초기 null) |
check_in_id |
string? | (check_out 요청에만) 매칭되는 출근 로그 ID |
check_in 요청 필드 예시
{
"UID": "...",
"name": "...",
"type": "check_in",
"member_type": "company",
"company_id": "company_1",
"site_id": "site_1",
"created_at": "SERVER_TIMESTAMP",
"check_at": "SERVER_TIMESTAMP",
"position": "과장",
"field": "안전관리자",
"labor_supplier": "직영",
"memo": "",
"status": "pending",
"approvalUID": null,
"approval_at": null
}
check_out 요청 필드 예시
{
"UID": "...",
"name": "...",
"type": "check_out",
"company_id": "company_1",
"created_at": "SERVER_TIMESTAMP",
"check_at": "SERVER_TIMESTAMP",
"memo": "",
"status": "pending",
"approvalUID": null,
"approval_at": null,
"check_in_id": "matching_log_id",
"site_id": "site_1"
}
승인/거절 동작
check_in 승인 (_company_check_in_request_approval, request_state=approved)
attendance_logs신규 생성 (본 요청의 데이터 복사,link=False)- 본 문서:
status=approved,approval_at=SERVER_TIMESTAMP,approvalUID users/{UID}/requests매칭 pending 건도status=approved- FCM (
notification_type=company_check_in_approved)
check_out 승인 (_company_check_out_request_approval, request_state=approved)
- 기존
attendance_logs(link=False) 업데이트:check_out_at=check_at,link=True,check_out_approval_* - 본 문서:
status=approved등 동일 - FCM (
notification_type=company_check_out_approved)
거절 (request_state=rejected)
- 본 문서 및
users/{UID}/requests모두status=rejected - FCM (
notification_type=company_check_in_rejected/company_check_out_rejected)
본인 취소 (_company_attendance_request_cancel)
- 양쪽 모두
status=rejected,approvalUID=UID(본인),approved_at=SERVER_TIMESTAMP
검증 규칙
check_in요청: 오늘(UTC 00:00~23:59) 승인된check_in로그가 3건 이상이면ATTENDANCE_009check_out요청: 활성link=False출근 로그가 정확히 1건이어야 함 (ATTENDANCE_004,ATTENDANCE_011)- 이미 "check_in" 상태에서
check_in요청 시ATTENDANCE_002 - 이미 "check_out" 상태에서
check_out요청 시ATTENDANCE_003