콘텐츠로 이동

companies/{company_id}/attendance_logs 스키마

회사 출퇴근 로그. admin/manager(회사 멤버)의 실제 출근/퇴근 기록이 저장됩니다. 현장 근로자의 출퇴근은 companies/{cid}/sites/{sid}/attendance_logs로 별도 저장됩니다. 출근 승인 시점에 attendance_requests에서 내용을 복사하여 생성됩니다.

저장 위치

companies/{company_id}/attendance_logs/{log_id}
link=False (출근만 완료, 퇴근 대기)
  ├── 정상 퇴근 승인 (_company_check_out_request_approval)
  │    → link=True, check_out_at / check_out_approval_* 설정
  └── 관리자 강제 퇴근 (_company_admin_check_out)
       → link=True, check_out_at / check_out_approval_* 설정
  • link=False: 출근만 된 상태(매칭되지 않은 출근 로그). 현재 사용자의 "check_in" 상태로 판정됨.
  • link=True: 출근/퇴근 모두 처리된 완결 로그.

출근 로그는 하루 최대 3개(ATTENDANCE_009), 그리고 활성 link=False 로그는 1개만 허용됩니다(ATTENDANCE_011).

문서 필드

필드 타입 설명
UID string 멤버 UID
name string 멤버 이름
company_id string 회사 ID
site_id string? 출근한 현장 ID (선택 — 회사 출근은 현장 지정 없을 수 있음)
task_id string? 연결된 작업 ID (나중에 _edit_company_attendance_task로 설정)
position string 당시 직급 (members에서 복사)
field string 당시 직종 (members에서 복사)
labor_supplier string 당시 인력 공급처
check_in_at timestamp 출근 요청 시각(요청자가 보낸 시각, attendance_requests.check_at 복사)
check_out_at timestamp? 퇴근 시각 (link=False일 때 null)
link boolean 출근-퇴근 연결 완료 여부
check_in_approval_UID string 출근 승인자 UID
check_in_approval_at timestamp 출근 승인 시각
check_out_approval_UID string? 퇴근 승인자 UID (link=False일 때 null)
check_out_approval_at timestamp? 퇴근 승인 시각
man_days number 공수 (기본 0, _company_update_man_days 또는 task 연결 시 갱신)
memo string? 메모 (_add_company_attendance_log 또는 _company_update_man_days에서 설정)
created_at timestamp? 수기 추가(_add_company_attendance_log) 시에만 기록
created_by string? 수기 추가자 UID

생성 경로별 차이

1. 정상 출근 승인으로 생성 (_company_check_in_request_approval)

  • attendance_requests의 check_at, UID, name, position, field, labor_supplier, site_id, task_id 복사
  • link=False, check_out_at=null, check_out_approval_*=null, man_days=0
  • check_in_approval_UID/at은 승인자 정보

2. 관리자 수기 추가 (_add_company_attendance_log)

  • 이미 check_in/check_out 모두 지정된 상태로 1건 생성
  • link=True, created_at / created_by=UID 포함
  • check_in_approval_* / check_out_approval_*은 요청 바디 값(선택) 그대로 기록
  • 이미 link=False 상태(출근 중)인 경우 추가 불가 (ATTENDANCE_013)

3. 삭제 (_delete_company_attendance_log)

  • 문서 실제 삭제 + delete_logs/{new_id}type="company_attendance_log", target_id=log_id 기록
  • 진행 중인 출퇴근 요청(pending)이 있으면 삭제 불가 (ATTENDANCE_014)

연관 규칙

  • check_out_at <= check_in_at이면 ATTENDANCE_007 에러
  • _company_admin_check_out은 같은 UID의 check_out 타입 pending 요청이 있으면 ATTENDANCE_012
  • task_id가 설정된 경우 해당 태스크의 man_days가 자동 복사됨 (트리거로 동기화)

예시 문서 (link=False, 출근만)

{
  "UID": "firebase_uid_admin",
  "name": "김관리자",
  "company_id": "company_1",
  "site_id": "site_1",
  "task_id": null,
  "position": "과장",
  "field": "안전관리자",
  "labor_supplier": "직영",
  "check_in_at": "2026-04-23T00:00:00Z",
  "check_out_at": null,
  "link": false,
  "check_in_approval_UID": "firebase_uid_owner",
  "check_in_approval_at": "2026-04-23T00:05:00Z",
  "check_out_approval_UID": null,
  "check_out_approval_at": null,
  "man_days": 0
}

예시 문서 (link=True, 완결)

{
  "UID": "firebase_uid_admin",
  "name": "김관리자",
  "company_id": "company_1",
  "site_id": "site_1",
  "task_id": "task_xyz",
  "position": "과장",
  "field": "안전관리자",
  "labor_supplier": "직영",
  "check_in_at": "2026-04-23T00:00:00Z",
  "check_out_at": "2026-04-23T09:00:00Z",
  "link": true,
  "check_in_approval_UID": "firebase_uid_owner",
  "check_in_approval_at": "2026-04-23T00:05:00Z",
  "check_out_approval_UID": "firebase_uid_owner",
  "check_out_approval_at": "2026-04-23T09:05:00Z",
  "man_days": 1.0
}