콘텐츠로 이동

companies/{company_id}/attendance_requests 스키마

회사 출퇴근 요청 문서. admin/manager가 출근 또는 퇴근을 요청하면 생성되고, 승인 시 attendance_logs로 반영됩니다. 사용자 쪽에는 users/{UID}/requests/{request_id}에 미러링됩니다.

저장 위치

companies/{company_id}/attendance_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)

  1. attendance_logs 신규 생성 (본 요청의 데이터 복사, link=False)
  2. 본 문서: status=approved, approval_at=SERVER_TIMESTAMP, approvalUID
  3. users/{UID}/requests 매칭 pending 건도 status=approved
  4. FCM (notification_type=company_check_in_approved)

check_out 승인 (_company_check_out_request_approval, request_state=approved)

  1. 기존 attendance_logs (link=False) 업데이트: check_out_at=check_at, link=True, check_out_approval_*
  2. 본 문서: status=approved 등 동일
  3. 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_009
  • check_out 요청: 활성 link=False 출근 로그가 정확히 1건이어야 함 (ATTENDANCE_004, ATTENDANCE_011)
  • 이미 "check_in" 상태에서 check_in 요청 시 ATTENDANCE_002
  • 이미 "check_out" 상태에서 check_out 요청 시 ATTENDANCE_003