Skip to content

HBEA200_근무 탭 (홈) ​

(Hereby) 직원 앱 > 근무 탭 (홈)

앱직원 앱 Hereby Works (포트 4002)
대상 사용자조건1 [EMPLOYEE] (직원 인증 후 전원)
프로토타입TBU
관련 정책[[POL_근태원천]]
Statusreview
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카나PMGC700 깊이 재작성
2026-07-21카나PM셀 스타일 확정판 적용 (콸 승인)
2026-07-21카나PMTC 크로스체크 확정분 반영 (🟡) — SECOM 파이프라인
2026-09-21카나PM「오늘 근무」·연장근무 휴일 판정을 판정 서비스(shift-resolution.service) 단일 경로로 통합, 근태 홈에 근무 배정 출처(shiftAssignedVia) 표시 반영(c4eb0f9, #804) — 커밋 근거, 라이브 실사 이월(TBU)
2026-10-01카나PM「이번 주 근태」 카드(월~일 7행 표·주 이동·주 합계) 신설, 출퇴근 직후 즉시 갱신(6e0584c5, #949) — 커밋 근거, 라이브 실사 이월(TBU)
2026-10-07카나PMPR #1035 반영: 「지금 할 일」 반려 보기 → 신청 상세 직행·「이어서 작성」(25 신설) · 「오늘의 축하」 상세 + 축하 메시지 초안(26 신설) · 근무 기록 일별 「출퇴근 정정 요청」·「기록 추가 요청」(27 신설). ⚠️ #1049(이번 주 근태 카드 기본 꺼짐)는 close·미머지 — 반영하지 않음. 커밋 근거, 라이브 실사 이월(TBU)
2026-10-08카나PM10/7 머지분 반영 — 0f568bac(PR #1083 포함): 출퇴근 카드 「판정 순서」 줄을 출근하기 버튼 아래로·13px(ㄴ12-2 신설) · 배정 근무 없이 조직 기준 시각만 쓴 경우 「조직 기본 기준시간」 출처 줄 숨김(ㄴ12-1 보강) · 근무 홈 스크롤 시 헤더 유리(접힘 없음, [[HBEA110]] ㄴ14). 커밋 근거, 라이브 실사 이월(TBU)
2026-10-10카나PM(10/9 머지분) PR #1125(MED-975) 반영: 공지(새로운 소식) 카드 노출 규칙 재정 — 안 본 글은 늘, 본 글은 병원 설정 일수(noticeKeepDays) 동안, 정보 게시글도 노출 대상 포함(16 신설) — 커밋 근거, 직원 앱 카드 실사 TBU(이 계정 미노출)·관리자 설정 실증 완료
2026-10-13카나PM(10/10~12 머지분) 근무 기록 일별 「이 날 시간외 근무 신청」(28, #1141 — 10/13 실증) · 출퇴근 기록 출처 표시(29, #1145 — 기록 0건이라 실사 TBU) · 소식 전체 페이지 뒤로가기·정보 게시글 읽음 규칙 수정(16 비고 보강, #1183)

Data I/O ​

Server → Client ​

변수엔티티.컬럼값 없을 때비고
$Attendance.status"미출근" 표기당일 근태 상태. 당일 레코드 미존재 시 미출근
$Attendance.actualCheckInhide (당일 미출근 시 미표기)당일 출근 시각 (정책: 당일 출퇴근 시간만 노출)
$Attendance.actualCheckOuthide (미퇴근 시 미표기)당일 퇴근 시각
$Organization.attendanceSource (secom | app)기본값 = secom 가정 (TBU)config-gated punch 노출 결정
$WorkScheduleType (본인 근무시간 설정 연동)hide (근무유형 미설정 시 미표기)오늘 근무 유형. "3교대 주간 07:00 - 15:00" 형식. 원천 = 더보기 > 내 정보의 근무시간 선택
$attendance.workLog({from,to}).days[] (shift.name · leave.name · segments · hours.total) + totals.total기록 없는 날도 빈 행으로 채움(7행 고정), 시각·근무 "-"이번 주 근태 카드 (#949). 기록 있는 날만 응답 → 클라이언트가 월~일 채움
$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 참조)——
주간 근태 조회 (카드 로드·주 이동){ from, to } (월~일)sdk.attendance.workLog()attendance:read (미보유 시 카드 숨김)
홈 새로고침 / 당일 상태 조회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 조회 후 카드 렌더AttendanceTBU: 당일 레코드 없음/status 부재 시 "미출근" 폴백 표기
10현재 상태 카드Card당일 출퇴근 상태 + 오늘 근무 유형 표시 상단 카드Attendance.status정책: 당일 출퇴근 시간만
ㄴ11ㄴ 상태 라벨Text"현재 상태" + 상태값 표기Attendance.status
ㄴ11-1ㄴ 상태 분기TextCASE01 [미출근] "미출근" / CASE02 [출근] 출근시각 / CASE03 [퇴근] 퇴근시각 (당일만)Attendance.actualCheckIn/Out
ㄴ12ㄴ 오늘 근무 유형Text"3교대 주간 07:00 - 15:00" 형식 표기. 본인 근무시간 설정 연동[[HBEA510_내 정보·근무 설정]]원천 = 더보기 > 내 정보의 근무시간 선택
ㄴ12-1ㄴ 근무형태 판정 출처Text• 「오늘 근무」가 판정 서비스 한 곳(shift-resolution.service)을 거치도록 변경 — 기존에는 employee.shift만 읽었음
 - 판정 순서: 근무표 → 직원 배정 → 그룹 → 조직 기본 근무형태 → 조직 기본 기준시간
 - 앱 출근·일괄 입력·오늘 근무·연장근무 휴일 판정이 같은 순서 사용
• 근태 홈에 배정 출처(shiftAssignedVia) 표시. 직원 앱에서 본인이 고른 경우 출처 = 「직원 앱 자기 선택」
 - 값 없음: 출처 미기록 데이터 표기 = TBU
• 규칙 문서: docs/ko/features/shift-resolution.md
employees.shiftAssignedVia · attendances.metadata.shiftSource · [[HBAD250_근태 현황 (근무)]]신설 (코드 반영: c4eb0f9, #804) · TBU: 라이브 실사 이월
ㄴ12-2ㄴ 판정 순서 줄 · 출처 줄Text• (10/8, #1083, 0f568bac) 출퇴근 카드의 "판정 순서: " + 단계 이름(" → " 구분, 오늘 쓰인 단계는 진하게 — 예: 「스케줄 배정 → 직원 근무 → 근로형태/직무 기본값」) 줄을 「출근하기」 버튼 아래로 옮김(종전: 상태 · 버튼 사이)
• 글자 = 직원 앱 최소 13px(b5, 종전 11px), 단계 이름은 중간에서 줄바꿈 안 됨
• 배정 출처 줄(근무표 배정 · 직원 근무 배정 등)은 그대로
 - CASE01 [배정된 근무 없음 = 조직 기준 시각만 사용(org_default_time)]: 「조직 기본 기준시간」 출처 줄 숨김 — 판정 순서 줄이 「근로형태/직무 기본값」 단계를 진하게 해 같은 사실을 보여 줌
• 노출: 출처 라벨(shiftSourceLabel)이 있을 때만
shifts.html shift-judgment-order · shift-source · [[HBEA110_Shell·탭바·알림]]위치 · 크기 변경 (0f568bac, #1083 · MED-923 #1059 후속) · TBU: 단계 이름 원문 전수(실사 대기)
ㄴ12-Eㄴ 근무 유형 없음Text근무유형 미설정 시 해당 라인 hideWorkScheduleType
ㄴ13ㄴ 출퇴근 안내 (secom)InfoCASE01 [secom 모드]에서만 "지문 단말기로 출퇴근이 기록돼요." 노출. app 모드 시 미노출Secom 지문기config-gated
ㄴ14ㄴ 출근/퇴근 punch (app)Button• 모바일에서 현재시각을 서버 스탬프해 출퇴근을 기록하는 기능. CASE02 [app 모드]에서만 노출, secom 모드면 완전 미노출
• 클릭 → 현재시각 서버 스탬프, 성공: 출근/퇴근 상태 전이
Attendance.actualCheckIn/OutTBU: 실 UI(레이블·전이·위치)·에러 토스트
ㄴ14-Eㄴ 미출근 시Button당일 레코드 없으면 출근 버튼 활성Attendance
15이번 주 근태 카드Card• 「현재 상태」 카드 아래에서 월~일 본인 근태를 하루 한 줄 표로 보여주는 카드. 제목 "이번 주 근태"(지난 주 조회 시 "주간 근태")
• 노출: 병원 설정 「직원 앱 첫화면」 showWeeklyAttendance(기본 켬) + attendance:read 보유 시. 기본 순서 = 이번 주 근태 → 오늘의 축하 → 공지
sdk.attendance.workLog() · 관리자 병원 설정 「직원 앱 첫화면」신설(6e0584c5, #949) · TBU: 라이브 실사
16공지 카드 (새로운 소식) — 노출 규칙Rule• (10/9 머지, #1125, MED-975) 홈 「새로운 소식」(공지) 카드의 글 노출 규칙 재정:
 - CASE01 [안 본 글]: 게시 중이면 늘 보임 — 확인 필요 공지는 「확인 했어요」 전, 정보 게시글(requiresAcknowledgment=false)은 열어 보기 전. 종전엔 정보 게시글이 홈에 한 번도 안 떴고(전부 정보 게시글이면 카드 자체가 사라짐), 확인한 공지는 즉시 빠졌음
 - CASE02 [본 글]: 게시 후 병원 설정 일수(noticeKeepDays, 0~30 — [[HBAD270_설정 (조직 설정·내 정보)]] 45) 동안 유지 후 제외. 0일이면 확인 즉시 제외
 - 정보 게시글의 「본」 판정: 서버 읽음 기록이 없어 기기(local) 열람 기록 기준
• 표시 건수는 기존 noticeLimit(최대 N건) 유지
home-feed · settings.employeeHome.noticeKeepDays · [[HBGA230_공지]]신설 (#1125) · 커밋 근거 — 홈 카드 자체는 이 계정 조건(게시 팀·확인 상태)으로 미노출, 실사 TBU. 관리자 설정 쪽은 10/10 실증 · (10/12 머지, #1183) 「소식」 전체 페이지: 공지 상세에서 뒤로 가면 홈 1depth가 아니라 소식 목록으로 복귀(homeReturn에 homePage 전달) + 정보 게시글은 열어 보면 「확인 전」·주황 점 제거(isEmployeeHomeNoticeSeen 공용 규칙·NOTICE_READ_EVENT 실시간 반영, 종전엔 isAcknowledged만 봐서 영구 「확인 전」)
ㄴ15-1ㄴ 주 이동Button• 「<」("이전 주") · 「>」("다음 주") 버튼과 가운데 주 범위 라벨("9.28 ~ 10.4" 형식)
• 클릭 → 해당 주 재조회, 로딩 중 표 위 흰 딤 + 스피너
 - CASE01 [이번 주]: 「>」 비활성(오늘이 속한 주 이후로 이동 불가)
attendance.workLog
ㄴ15-2ㄴ 일별 행List• 월~일 7행 고정(기록 없는 날도 행 유지). 열 = 요일 · 근무/휴가/외근 · "출근" · "퇴근" · "근무"
• 요일 + 일자: 오늘 = 주황 요일 칩, 주말·공휴일 = 빨간 요일
375px 5열
ㄴ15-3ㄴ 근무/휴가/외근 라벨Label• 근무형태명(회색) · 휴가명(초록) · "외근"(파랑) · "연장"(회색, 승인·합산된 연장근무만) 라벨
 - CASE01 [공휴일 + 근무·휴가 없음]: "공휴일"(빨강) 표기
shift.name · leave.name · segments.kind
ㄴ15-4ㄴ 출근·퇴근·근무Text• 출근 = 그날 가장 이른 출근, 퇴근 = 가장 늦은 퇴근("HH:MM"), 근무 = 그날 합계("8:30" 형식)
 - CASE01 [익일 퇴근]: 퇴근 시각 위에 "익일" 표기
• 값 없음: "-"
segments(clock) · hours.total
ㄴ15-5ㄴ 주 합계Text• "주 합계" + 서버 합계("40:00" 형식)
• 하단 안내 "급여·근로시간 마감과 같은 기준으로 합산해요. 자세한 내역은 「전체 근무기록」에서 봐요."
totals.total · 급여·근로시간 마감승인 대기 연장근무는 합계 미포함(가이드 원문)
ㄴ15-6ㄴ 즉시 갱신-앱 출근/퇴근 확정 직후 표 자동 재조회(당겨서 새로고침과 같은 갱신)ㄴ14 출근/퇴근 punch
ㄴ15-Eㄴ 빈 주·조회 실패Text• 기록 없는 주도 카드 유지(7행 모두 "-")
• 조회 실패: "주 합계" 자리에 "근태를 불러오지 못했어요." 표기, 표 틀 유지
• attendance:read 미보유: 카드 미노출
TBU: 빈 주 합계 표기
20외근 등록 진입Link• 외근 등록 동선으로 진입하는 링크(배치 위치 근무홈 vs 결재 탭 미확정, OQ 참조)
• 클릭 → TBU
[[HBEA400]] 결재 탭 (추정)TBU: 범위 경계 OQ
25지금 할 일List• (10/7, #1035) 홈(근무 탭)의 할 일 목록 — 반려 알림·이어서 작성 등
• 반려 「보기」 → 신청 상세(a65248b9): 반려 알림의 "보기"를 누르면 결재 목록 대신 **그 반려된 신청의 상세 화면(2depth)**이 바로 열리고, 「<」·기기 뒤로 가기는 들어오기 전 화면(홈 첫 화면 ↔ 「지금 할 일」 전체 화면)으로 복귀(router.markHomeReturn — 공지 상세와 같은 계약). 결재 목록 미로드면 먼저 읽고 열고, 그 신청이 없어졌으면 내 신청·결재 현황에 남음
• 「이어서 작성」(bf34a923): 저장한 신청서 초안이 홈 「지금 할 일」에 "이어서 작성"으로 표시([[HBEA410_휴가신청]] 초안 저장)
[[HBEA400_결재 허브]] · router.markHomeReturn신설 (#1035) · 목록 구성·원문 TBU(실사 대기)
26오늘의 축하List• (10/7, #1035, 89d8b531) 축하 줄(생일·입사 N주년)을 누르면 **그 사람 상세(2depth)**가 열리고, "축하 메시지 보내기"가 메신저 1:1을 열어 기본 문구(생일 · 입사 N주년)를 입력칸에 채움 — 자동 전송하지 않음. 방은 서버 conversation.create가 찾아 주므로 동명이인도 맞는 방, 손대지 않고 나가면 채운 문구는 지움[[HBEA300_메신저]] · conversation.create신설 (#1035) · 원문 TBU(실사 대기)
27근무 기록 (일별) — 정정 요청 진입Button• (10/7, #1035, afd9bb68) 근무 기록 「일별」에 「출퇴근 정정 요청」·「기록 추가 요청」(잠긴 날·검토 중은 안내) — 지난 출퇴근 기록 시각 수정 또는 빠진 날 기록 추가를 요청. 요청 폼 + 보낸 뒤 화면, 결재 「내 신청·결재 현황」 근무 묶음에 「정정」 카드·상세·요청 취소([[HBEA400_결재 허브]])
• 급여 확정·지급 기간·근로시간 마감된 날은 요청 불가. 알림: 요청 → 근태 승인 권한자, 결과 → 요청자
attendanceCorrection 라우터(request·mine·cancel·dayStatus) · [[HBAD250_근태 현황 (근무)]] 정정 요청 탭신설 (#1035) · 10/13 실사: 과거 빈 날에 「기록 추가 요청」 + "휴가였다면 정정이 아니라 휴가 신청을 해 주세요." 안내 실측
28근무 기록 (일별) — 이 날 시간외 근무 신청Button• (10/10 머지, #1141, MED-965) 근무 기록 일별 화면에 「이 날 시간외 근무 신청」 버튼(10/13 실측 — 과거일에 노출, 오늘(미래 포함)은 미노출) — 결재 탭으로 이동해 그 날짜가 채워진 연장 신청서를 엶(app-open-request overtime-new). 결재 메뉴를 찾지 않아도 되는 진입점[[HBEA420_근무 신청 (연장·휴일/외근)]]신설 (#1141) · 라이브 실증 2026-10-13
29출퇴근 기록 출처 표시Label• (10/10 머지, #1145, MED-970) 근무 기록 일별 출퇴근 줄에 기록 출처 병기 — "09:00~18:00 · 지문"처럼 지문(secom) / 앱(app) / 관리자 입력(manual). 출처는 기록 생성 주체가 metadata(checkInSource·checkOutSource)에 남김, 배포 이후 새 기록부터(옛 기록은 관리자 입력만 추정·나머지 빈 값)
• 세콤 「버튼 태그만 반영」 설정은 [[HBAD270_설정 (조직 설정·내 정보)]] 참조
work-log · secom-processor신설 (#1145) · 실사 계정 기록 0건 — 라벨 실측 TBU
30하단 탭바Tab• 근무/메신저/결재/더보기 4탭 + "메신저 0" 배지를 전환하는 하단 네비게이션
• 클릭 → 해당 탭 전환
[[HBEA110_Shell·탭바·알림]]Shell 공통
-E당일 데이터 EmptyText당일 Attendance 전무 시 카드는 "미출근" 상태로 렌더 (전용 Empty 문구 없음)Attendance별도 Empty 카피 미관찰

근태원천 분기 보조표 ​

모드punch UI안내 문구원천비고
CASE01 [secom] (지문기)punch 버튼 없음"지문 단말기로 출퇴근이 기록돼요."secom_events → Attendanceokbest 테넌트 현재 모드
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만 분기)역할 세분 미관찰
조건2 [attendance:read 미보유]근무 탭 진입이번 주 근태 카드 미노출#949

Open Question ​

  • app 모드 punch 버튼 실 UI (레이블·상태 전이·버튼 위치·에러 토스트) = TBU (app 모드 테넌트 데모 필요)
  • 근태원천 config 토글 키·enum 정확명 (secom / app 가정) 및 Organization 컬럼명 = TBU
  • 현재 상태 카드 상세 필드 중 출근시각·근무시간 요약의 정확한 표기 포맷 = TBU (오늘 근무 유형 표시 자체는 확인됨)
  • [범위 경계] 정책 home.md의 "외근 등록 / 외근 등록 리스트 추가"가 근무홈(HBEA200) 범위인지 결재 탭([[HBEA400]]) 범위인지 미확정 — 현행 라이브에서 외근 신청 폼은 결재 탭 관측(ea-diff B7). 근무홈 진입 링크 여부 검증 필요 = TBU/OQ
  • 정책상 삭제 대상("주간 근무시간 / 이번주 근무 스케줄 삭제")의 현행 라이브 잔존 여부 = TBU (본 캡처에는 두 항목 미관찰, 삭제 반영으로 추정). 단 #949로 「이번 주 근태」 표가 신설됨 — 정책 home.md 삭제 항목과의 정합성 확인 필요 = OQ
  • 지문 단말기 → 서버 동기화 주기(실시간 push vs 배치) = TBU. 단 처리 파이프라인 procedure(secomEvent.ingestEvents/listEvents/processPending)·status(pending/error)·eventType(check_in/check_out)은 확정 (TC: 01:1.9). 이벤트 처리 UI 화면은 사양서 부재(누락)