HBEA200_근무 탭 (홈)
(Hereby) 직원 앱 > 근무 탭 (홈)
| 앱 | 직원 앱 Hereby Works (포트 4002) |
| 대상 사용자 | 조건1 [EMPLOYEE] (직원 인증 후 전원) |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_근태원천]] |
| Status | review |
| Owner | 카나 |
개요
직원 앱 진입 후 최초 랜딩하는 근무 탭(홈). 당일 출퇴근 현황을 "현재 상태" 카드로 조회하고, 오늘 배정된 근무 유형("3교대 주간 07:00 - 15:00")을 표시한다. 출퇴근 punch UI는 config-gated — 테넌트 근태원천 config가 secom(지문기)이면 모바일 punch 버튼 미노출("지문 단말기로 출퇴근이 기록돼요." 안내만), app 모드면 check-in/out 버튼 노출. 기능 부재가 아니라 설정 분기다.
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 (오늘 근무 유형 표시 신규) |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 |
| 2026-07-21 | 카나 | PM | 셀 스타일 확정판 적용 (콸 승인) |
| 2026-07-21 | 카나 | PM | TC 크로스체크 확정분 반영 (🟡) — SECOM 파이프라인 |
Data I/O
Server → Client
| 변수 | 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
| $ | Attendance.status | "미출근" 표기 | 당일 근태 상태. 당일 레코드 미존재 시 미출근 |
| $ | Attendance.actualCheckIn | hide (당일 미출근 시 미표기) | 당일 출근 시각 (정책: 당일 출퇴근 시간만 노출) |
| $ | Attendance.actualCheckOut | hide (미퇴근 시 미표기) | 당일 퇴근 시각 |
| $ | Organization.attendanceSource (secom | app) | 기본값 = secom 가정 (TBU) | config-gated punch 노출 결정 |
| $ | WorkScheduleType (본인 근무시간 설정 연동) | hide (근무유형 미설정 시 미표기) | 오늘 근무 유형. "3교대 주간 07:00 - 15:00" 형식. 원천 = 더보기 > 내 정보의 근무시간 선택 |
| $ | conversation_members.unreadCount 합 | "0" | 하단 탭바 "메신저 0" 배지 (Shell 공통, [[HBEA110]]) |
Client → Server
| 액션 | 전달값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 출근 punch (app 모드) | { } (현재시각 서버 스탬프) | sdk.attendance.checkIn() (추정) | attendance:write.self (추정) |
| 퇴근 punch (app 모드) | sdk.attendance.checkOut() (추정) | attendance:write.self (추정) | |
| 외근 등록 진입 | — (결재 탭 이동, 경계 OQ 참조) | — | — |
| 홈 새로고침 / 당일 상태 조회 | sdk.attendance.getToday() (추정) | attendance:read.self (추정) |
외부 통합
| 외부 시스템 | 데이터 | 동기/비동기 | polling 주기 |
|---|---|---|---|
| Secom 지문 단말기 | 지문 punch 이벤트 → secomEvent.ingestEvents → secom_events → processPending → Attendance (attendanceId 매핑) | 비동기 (단말기 → 서버 push/배치) | TBU · SECOM 파이프라인 표 참조 |
화면 플로우
출퇴근 원천은 Admin config에 종속 — Secom(지문기) 테넌트는 모바일 punch 미노출, app 모드 테넌트는 punch 버튼 노출 ([[POL_근태원천]]). okbest 테넌트는 현재 secom 모드.
근무 탭 (홈) 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 화면 진입 조건 | - | 조건1 [EMPLOYEE] 인증 완료 시 노출. 앱 진입 후 기본 랜딩 탭 | [[HBEA100]] 로그인 | |
| 01 | 초기 상태 | Output | 진입 시 당일 Attendance 조회 후 카드 렌더 | Attendance | TBU: 당일 레코드 없음/status 부재 시 "미출근" 폴백 표기 |
| 10 | 현재 상태 카드 | Card | 당일 출퇴근 상태 + 오늘 근무 유형 표시 상단 카드 | Attendance.status | 정책: 당일 출퇴근 시간만 |
| ㄴ11 | ㄴ 상태 라벨 | Text | "현재 상태" + 상태값 표기 | Attendance.status | |
| ㄴ11-1 | ㄴ 상태 분기 | Text | CASE01 [미출근] "미출근" / CASE02 [출근] 출근시각 / CASE03 [퇴근] 퇴근시각 (당일만) | Attendance.actualCheckIn/Out | |
| ㄴ12 | ㄴ 오늘 근무 유형 | Text | "3교대 주간 07:00 - 15:00" 형식 표기. 본인 근무시간 설정 연동 | [[HBEA510_내 정보·근무 설정]] | 원천 = 더보기 > 내 정보의 근무시간 선택 |
| ㄴ12-E | ㄴ 근무 유형 없음 | Text | 근무유형 미설정 시 해당 라인 hide | WorkScheduleType | |
| ㄴ13 | ㄴ 출퇴근 안내 (secom) | Info | CASE01 [secom 모드]에서만 "지문 단말기로 출퇴근이 기록돼요." 노출. app 모드 시 미노출 | Secom 지문기 | config-gated |
| ㄴ14 | ㄴ 출근/퇴근 punch (app) | Button | • 모바일에서 현재시각을 서버 스탬프해 출퇴근을 기록하는 기능. CASE02 [app 모드]에서만 노출, secom 모드면 완전 미노출• 클릭 → 현재시각 서버 스탬프, 성공: 출근/퇴근 상태 전이 | Attendance.actualCheckIn/Out | TBU: 실 UI(레이블·전이·위치)·에러 토스트 |
| ㄴ14-E | ㄴ 미출근 시 | Button | 당일 레코드 없으면 출근 버튼 활성 | Attendance | |
| 20 | 외근 등록 진입 | Link | • 외근 등록 동선으로 진입하는 링크(배치 위치 근무홈 vs 결재 탭 미확정, OQ 참조) • 클릭 → TBU | [[HBEA400]] 결재 탭 (추정) | TBU: 범위 경계 OQ |
| 30 | 하단 탭바 | Tab | • 근무/메신저/결재/더보기 4탭 + "메신저 0" 배지를 전환하는 하단 네비게이션 • 클릭 → 해당 탭 전환 | [[HBEA110_Shell·탭바·알림]] | Shell 공통 |
| -E | 당일 데이터 Empty | Text | 당일 Attendance 전무 시 카드는 "미출근" 상태로 렌더 (전용 Empty 문구 없음) | Attendance | 별도 Empty 카피 미관찰 |
근태원천 분기 보조표
| 모드 | punch UI | 안내 문구 | 원천 | 비고 |
|---|---|---|---|---|
CASE01 [secom] (지문기) | punch 버튼 없음 | "지문 단말기로 출퇴근이 기록돼요." | secom_events → Attendance | okbest 테넌트 현재 모드 |
CASE02 [app] (모바일 punch) | 출근/퇴근 버튼 노출 (실 UI TBU) | 안내 문구 미노출 (추정) | Attendance.actualCheckIn/Out | 데모는 app 모드 테넌트 필요 |
SECOM 이벤트 파이프라인 (secom 모드 원천 처리)
secom 모드 테넌트는 지문 단말기 이벤트를 3단계 파이프라인으로 근태 정본에 반영한다. 이벤트 처리 화면 자체는 라이브 사양서 부재(누락). procedure·enum은 TC 라이브 확정. (TC 확정: 01:1.9 SECOM)
| 단계 | procedure | 입력/출력 | 비고 |
|---|---|---|---|
| 수집 | secomEvent.ingestEvents([{ eventDatetime, terminalId, employeeNumber, rawEventType, authType }]) | 단말기 raw 이벤트 배치 삽입 | rawEventType "1"=출근 / "2"=퇴근 |
| 조회 | secomEvent.listEvents({ status }) | status별 이벤트 목록 | status = pending / error |
| 처리 | secomEvent.processPending() | pending 이벤트 → Attendance 반영 | 매핑 실패 시 error |
enum·매핑 확정:
- status:
pending(미처리) /error(매핑 실패) - eventType:
check_in/check_out(rawEventType"1"/"2"매핑 결과) - 미지 사번(employeeNumber 미매칭): status=
error, 사유 "not found"
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 화면 | 비고 |
|---|---|---|---|
CASE01 [Secom 모드 진입] | 근무 탭 진입 (config=secom) | "미출근" 카드 + 안내문, punch 버튼 없음 | config-gated |
CASE02 [app 모드 진입] | 근무 탭 진입 (config=app) | "미출근" 카드 + 출근/퇴근 punch 버튼 | [[POL_근태원천]] |
CASE03 [출근 후] | (app) 출근 punch / (secom) 지문 인식 | 카드에 당일 출근시각 표기 | 당일만 |
CASE04 [퇴근 후] | (app) 퇴근 punch / (secom) 지문 인식 | 카드에 당일 퇴근시각 표기 | 당일만 |
조건1 [EMPLOYEE] | 전 직원 인증 | 근무홈 전체 노출 (원천 모드에 따라 punch만 분기) | 역할 세분 미관찰 |
Open Question
- app 모드 punch 버튼 실 UI (레이블·상태 전이·버튼 위치·에러 토스트) = TBU (app 모드 테넌트 데모 필요)
- 근태원천 config 토글 키·enum 정확명 (
secom/app가정) 및 Organization 컬럼명 = TBU - 현재 상태 카드 상세 필드 중 출근시각·근무시간 요약의 정확한 표기 포맷 = TBU (오늘 근무 유형 표시 자체는 확인됨)
- [범위 경계] 정책 home.md의 "외근 등록 / 외근 등록 리스트 추가"가 근무홈(HBEA200) 범위인지 결재 탭([[HBEA400]]) 범위인지 미확정 — 현행 라이브에서 외근 신청 폼은 결재 탭 관측(ea-diff B7). 근무홈 진입 링크 여부 검증 필요 = TBU/OQ
- 정책상 삭제 대상("주간 근무시간 / 이번주 근무 스케줄 삭제")의 현행 라이브 잔존 여부 = TBU (본 캡처에는 두 항목 미관찰, 삭제 반영으로 추정)
- 지문 단말기 → 서버 동기화 주기(실시간 push vs 배치) = TBU. 단 처리 파이프라인 procedure(
secomEvent.ingestEvents/listEvents/processPending)·status(pending/error)·eventType(check_in/check_out)은 확정 (TC: 01:1.9). 이벤트 처리 UI 화면은 사양서 부재(누락)