companies/{company_id}/attendance_logs 스키마
회사 출퇴근 로그. admin/manager(회사 멤버)의 실제 출근/퇴근 기록이 저장됩니다. 현장 근로자의 출퇴근은
companies/{cid}/sites/{sid}/attendance_logs로 별도 저장됩니다. 출근 승인 시점에attendance_requests에서 내용을 복사하여 생성됩니다.
저장 위치
상태 흐름 (link 필드 기반)
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=0check_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_012task_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
}