HBEA400_결재 허브
(Hereby) 직원 앱 > 결재 허브
| 앱 | 직원 앱 (Hereby Works, 포트 4002) |
| 대상 사용자 | 조건3 [EMPLOYEE] (self scope 인증 세션) |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_결재워크플로우]] · mobile/approval |
| Status | review |
| Owner | 카나 |
개요
결재 허브는 직원 앱 하단 탭바 "결재" 탭의 진입 화면으로, 직원 셀프서비스 신청을 4개 서브탭("휴가신청" / "근무" / "인센티브" / "서류관리")으로 통합한 신청 허브다. 4개 서브탭은 공통 골격(상단 서브탭 스위처 + 상태 필터 칩 + 신청 내역 리스트 + 우하단 FAB(+))을 공유하며, 세부 화면 사양은 각 하위 문서를 참조한다(중복 정의 금지). 모든 신청은 self scope 토큰으로 대기중 상태 생성되고, 승인/반려/취소는 팀장 결재([[HBTM01_TeamManager_팀결재워크스페이스]]) 큐가 처리한다. 4서브탭은 HBTM 승인 큐와 1:1 대응한다.
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 |
| 2026-07-13 | 카나 | PM | 버튼 행동 명세 보강 |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 |
| 2026-07-21 | 카나 | PM | 셀 스타일 확정판 적용 (콸 승인) |
| 2026-08-06 | 카나 | PM | 휴가 신청 항목 단일화 반영(59e955d) |
| 2026-08-11 | 카나 | PM | 인센티브 자가 등록·주말 당직 세션 요청 반영(PR #533) |
| 2026-10-07 | 카나 | PM | PR #1035 반영: 결재 허브 「신청·결재」/「내 신청·결재 현황」 2탭 재편(05 신설) + 근무 묶음 「정정」 카드·상세·취소. 구 4서브탭 행은 존치(재편 실사 대기) — 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-10-08 | 카나 | PM | 낮 스윕 라이브 실사(웹 /employee-app) — 2탭 라벨·「신청·결재」 탭 구성(연차현황 카드 + 결재 신청 6항목 원문)·「내 신청·결재 현황」 상태 칩 4종("검토 중/예정/반려/전체")·묶음 섹션 패턴 실측(05 TBU 해소, 20 칩 구성 교체 기록). 「정정」 카드는 정정 요청 데이터 없어 미노출 — TBU 유지 |
| 2026-10-09 | 카나 | PM | PR #1122(결재선, MED-900) 반영 + 라이브 실사(웹): 「신청·결재」 탭 재배치 — 주말 당직 치료 세션이 「결재 신청」 묶음 마지막 줄로 통합·「결재선」 묶음 신설(06, 나의 결재선 진입, ba8bff72). 결재함·알림 딥링크가 결재선 종류(치료 세션·출퇴근 정정) 인지(8e27fa13·1dcffae9) |
| 2026-10-10 | 카나 | PM | (10/9 머지분) PR #1127(MED-959) 반영: 승인 휴가 「취소 신청 중」 배지·「결재할 문서」 내 「휴가 취소 신청 {n}건」 별도 섹션·승인/거절 처리(07 신설) · PR #1130(MED-964) 반영: 결재선 단계 결재자 확인 여부 「알림 보냄 · 아직 확인 전」·미확인 재알림(08 신설) — 커밋 근거, 직원 앱 실사 TBU(승인 휴가·결재 단계 데이터 없음) |
| 2026-10-14 | 카나 | PM | (10/13 머지분, #1215 — 프로덕션 배포) 결재함 행 승인/반려·목록형 재편·승인 확인창 결정 힌트(09 신설, 22a9454·a04636b) · 결재한 문서 기간 필터·헤더 정리(09-1 신설, 6f8d869) — 10/14 라이브 실사: 「휴가 취소 신청 1건」 그룹(제목+주황 건수)+목록형 행+[거절]·[취소 승인] 행 버튼, 기간 필터 줄(1주일 기본/이번 달/지정 기간)+빈 문구 「이 기간에 결재한 문서가 없어요.」 실측. 일반 결재 [반려]·[승인] 행 버튼은 대기 문서 0건 TBU - 카나/PM |
Data I/O
Server → Client
| 변수 | DB 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
| $ | 직원 인증 세션 (self scope) | /employee-app/signin 리다이렉트 | 미인증 진입 차단 |
| $ | 클라이언트 상태 (tabKey) | 기본값 "휴가신청" | 4서브탭 스위처 |
| $ | 서브탭별 *Request[] (self) | 각 서브탭 Empty 문구 | 서브탭 문서 참조 |
| $ | status enum ↔ *Request.status 집계 | 카운트 0은 라벨만 (숫자 미표기) | census 예 "전체 3 / 대기중 2 / 취소 1" |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 서브탭 전환 | tabKey | 클라이언트 상태 (재조회) | self |
| 상태 필터 | statusKey | 리스트 필터 (전체/대기중/승인/반려/취소) | self |
| 신청 작성 (FAB) | 서브탭별 폼 오픈 | 각 화면 procedure (sdk.leave / overtime / fieldwork.request(), 추정) | self |
외부 통합 (cross-app)
| 외부 시스템 | 데이터 | 동기/비동기 | 비고 |
|---|---|---|---|
| 팀결재 [[HBTM01_TeamManager_팀결재워크스페이스]] | 신청(대기중) → 승인/반려/취소 상태 write-back | 비동기 | 4서브탭 = HBTM 승인 큐 1:1 |
| Admin 유형/근태 [[HBAD261_유형 설정 (연장근무·외근·휴가)]] | 연장/외근/휴가 유형 taxonomy source | 동기 | select 옵션 원천 |
화면 플로우 (Mermaid 의무)
결재 허브 공통 구조 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 화면 진입 조건 | - | 조건1 [직원 인증] 세션 시 노출. CASE01 [미인증] → /employee-app/signin 리다이렉트 | 인증 세션 (self scope) | |
| 01 | 초기 상태 | Output | 하단 탭바 "결재" 진입 시 기본 서브탭 CASE01 [휴가신청] 활성. 근무·인센티브·서류 서브탭은 클릭 시 로드 | $ | |
| 05 | 결재 탭 2분할 (10/7 개편) | Tab | • (10/7, #1035) 결재 허브 상단이 두 탭으로 재편: 「신청·결재」 / 「내 신청·결재 현황」 — 구 하위 탭 4종(휴가·근무·인센티브·서류) 체계를 대체(직원 앱 AI 안내문도 이 두 탭 기준으로 경로 갱신, 49fd31c7 employee-app-v3) • 「내 신청·결재 현황」 근무 묶음에 「정정」 카드(출퇴근 정정·기록 추가 요청) · 상세 · 요청 취소(afd9bb68, [[HBEA200_근무 탭 (홈)]] 27) • 신청서 공통: 칸 아래 오류·도움·초안(d01193ac 요약 — 상세 [[HBEA410_휴가신청]]), 반려 상세 직행은 홈 「지금 할 일」에서(a65248b9) • 아래 10~ 행(4서브탭 체계)은 구 구조 기준 — 새 2탭 배치 실사 후 재편 예정 | 전 서브탭 문서 | 신설 (#1035) · 라이브 실사 확인(2026-10-08 낮, 웹): 탭 원문 "신청·결재" / "내 신청·결재 현황" 일치 · 「신청·결재」 탭 = 연차현황 카드("{n}일 남음 (올해 {m}일 중 {k}일 사용)") + 「결재 신청」 목록 "휴가 — 연차·병가·경조 등 휴가 신청" · "연장·휴일 근무 — 평일 연장, 야간, 토요일·공휴일 근무" · "외근 — 거래처 방문, 관공서 업무 등 사외 근무" · "인센티브 등록 — 오늘 실적을 항목·건수로 등록" · "서류 제출·요청 — 증명서 요청, 제출 서류 업로드" + "주말 당직 치료 세션 신청 — 당일 항목별 건수와 당직 인원을 적어 상신해요" · 「내 신청·결재 현황」 탭 = 상태 칩 4종 "검토 중/예정/반려/전체"(+건수) + 묶음 섹션 "검토 중인 휴가 {n}건" 카드 목록(항목·날짜·상태 배지) · 「정정」 카드는 해당 데이터 없어 미노출(TBU 유지) · (10/8, #1122) 「신청·결재」 탭 재배치 라이브 재실사(10/9): 「결재 신청」 묶음 6줄 — "휴가 — 연차·병가·경조 등 휴가 신청" / "연장·휴일 근무" / "외근" / "인센티브 등록" / "서류 제출·요청" / "주말 당직 치료 세션 — 당직 날 치료 항목별 건수 · 인원 신청"(묶음 마지막 줄로 통합, 부제 교체, ba8bff72) + 그 아래 「결재선」 묶음(06) |
| 06 | 결재선 묶음 (나의 결재선 진입) | Section | • (10/8, #1122) 「신청·결재」 탭에서 결재 신청 묶음 아래 회색 띠로 구분한 별도 묶음 「결재선」 — 줄 1개 "나의 결재선 — 자주 쓰는 결재자 순서를 저장하고 기본으로 두기"(라이브 원문, 10/9 실사) • 클릭 → 「나의 결재선」 2depth 페이지(공통 헤더): 상단 고정 「새 결재선」 버튼 + 저장된 결재선 목록. Empty "저장한 결재선이 없어요 / 자주 쓰는 결재자 순서를 이름 붙여 두면 신청서에 바로 들어가요."(원문) • 「새 결재선 / 결재선 수정」은 다른 신청서와 같은 풀레이어 팝업(2f3f6019): 이름 · 종류 드롭다운(결재선 사용이 켜진 종류만 — 라이브: 휴가/연장근무/외근/인센티브/치료 세션, 꺼진 출퇴근 정정 제외 실증) · "결재자 지정 · 고른 순서대로 차례로 확인해요(1~5명)" · 「기본으로 쓰기」("{종류} 신청서에 이 결재선이 자동으로 들어가요.") · 취소/저장 • CASE01 [병원 공통 설정 「직원이 결재자를 직접 고를 수 있어요」 OFF]: 서버가 나의 결재선 저장 거절, 묶음 숨김(8e27fa13) | ApprovalLine(개인) · [[HBAD245]](채번 제안: admin 결재선 설정) | 신설 (#1122, ba8bff72·cf5521c5·2f3f6019) · 라이브 실사 2026-10-09. 상세 화면은 HBEA450 채번 제안(신규 작성 대기) |
| 07 | 휴가 취소 신청 표시·결재 (MED-959) | Feature | • (10/9 머지, #1127) 「내 신청·결재 현황」 휴가 카드: 승인된 휴가에 취소 신청이 걸려 있으면 상태 라벨 아래 노란 배지 「취소 신청 중」(approval-leave-cancel-requested) • 「결재할 문서」 탭: 결재선 단계 목록과 별도 섹션 「휴가 취소 신청 {n}건」 — 취소 신청은 결재선(MED-900) 밖이라 휴가 승인 권한이 있는 결재자 누구나 처리. 건별 카드에서 취소 범위·사유 확인 후 승인/거절 - 승인 시: 휴가 취소(시작 전 전체 / 시작 후 오늘부터 남은 날만 — 종료일 전날로 단축), 차감 연차 복원, 근무표 원복, 신청자 알림 - 거절 시: 휴가는 승인 상태 유지, 거절 사유가 신청자 상세에 표시 • 신청·철회 UI는 [[HBEA410_휴가신청]] 취소 신청 행 참조 | leave_requests.cancelRequestedAt · 마이그레이션 1966 · [[HBTM210_연차·휴가 승인 큐]] · [[HBAD251_연차 현황·결재]] | 신설 (#1127) · 커밋+가이드 fragment 근거 — 이 계정에 승인된 휴가 없어 실사 TBU |
| 08 | 결재자 확인 여부 표시 (MED-964) | Rule | • (10/9 머지, #1130) 결재선 단계 공용 패널(ApprovalSteps)에 결재자가 문서를 열었는지 표시 — 신청자 화면에는 재알림 발송 뒤 **「알림 보냄 · 아직 확인 전」**이 보임(admin 결재선 설정 「확인 안 된 결재 다시 알림」 {n}시간, 0=안 보냄 — 10/10 admin 쪽 라이브 실증, [[HBAD245]] 채번 제안 영역) • 차례가 된 결재자가 설정 시간 안에 문서를 열지 않으면 한 번 더 알림 | ApprovalSteps(공용) · approvalPolicy.reminderHours · 마이그레이션 1967 | 신설 (#1130) · 직원 앱 쪽 표시는 커밋 근거 TBU(기존 신청에 결재 단계 없음) |
| 09 | 결재할 문서 — 행 승인/반려·목록형 (10/13) | Feature | • (10/13 머지, #1215 22a9454 — 프로덕션 배포) 「결재할 문서」 서브탭의 휴가 취소 신청·결재할 문서를 카드 대신 줄 묶음으로 재편 — 그룹 제목 b3 + 주황 건수 · 묶음 사이 회색 띠 · 줄 사이에만 구분선 (10/14 실측: 「휴가 취소 신청 1건」 + 행 「휴가 취소 — {이름} ({사번}) / {유형} · {날짜} · 전체 취소 / 사유: {사유}」) • 문서 줄 아래 행 버튼 노출 — 일반 결재 = [반려] · [승인](반려 왼쪽·승인 오른쪽 끝), 휴가 취소 신청 = [거절] · [취소 승인](10/14 실측). 줄 클릭 = 상세 진입(버튼은 @click.stop), 상세에 「>」 표시 추가 - 승인 버튼: 확인창 「{이름} 님의 휴가를 승인할까요?」(조사 core josa) 1회 — 상세를 보지 않고 누르는 자리 보호. (a04636b) 확인창에 결정 힌트 1줄(approvalDecisionHint): 「승인하면 {다음 결재자} 님에게 넘어가요」 / 「최종 승인돼요」 / 대신 처리면 「{이름} 님 대신 처리돼요 · …」 - 반려 버튼: 사유 입력이 확인 역할 • 처리 규칙은 decideInboxItem 단일(상세의 decideInbox도 같은 함수) | decideInboxItem · 07 | 신설 (#1215) · 10/14 행 버튼·목록형 실측([거절]·[취소 승인]), 일반 결재 [반려]·[승인]은 대기 문서 0건 TBU |
| 09-1 | 결재한 문서 — 기간 필터 (10/13) | Filter | • (10/13 머지, 6f8d869) 「결재한 문서」 서브탭 목록 위 기간 줄: 1주일(기본) · 이번 달 · 지정 기간(날짜 범위 입력, 10/14 실측 「2026.10.07 ~ 2026.10.14」) — 결재한 날(조직 시간대) 기준 서버 필터(approvalFlow.decided from/to, 끝 날짜 포함 — 화면만 거르면 최근 100건 밖 기간이 조용히 빠지는 문제 방지) • 기간을 빠르게 바꿔도 늦게 온 앞선 응답이 새 목록을 덮지 않음(요청 번호 가드) • Empty: 「이 기간에 결재한 문서가 없어요.」(10/14 실측) | approvalFlow.decided(from/to) | 신설 (6f8d869) · 10/14 라이브 실측 |
| 10 | 서브탭 스위처 | Tab | • 상단 4서브탭 "휴가신청" / "근무" / "인센티브" / "서류관리" 간 전환 기능 • 클릭 → 해당 서브탭 전환(내역·필터 재로드) | HBEA410 / HBEA420 / HBEA430 / HBEA440 | 4서브탭 = HBTM 승인 큐 1:1 |
| ㄴ11 | 휴가신청 탭 | Tab | • 연차현황 카드 + 휴가 신청 내역 서브탭 • 클릭 → [[HBEA410_휴가신청]] | LeaveRequest | |
| ㄴ12 | 근무 탭 | Tab | • 연장·휴일/외근 신청 + 보고서 요약 서브탭. 내역 필터 칩 4종 • 클릭 → [[HBEA420_근무 신청 (연장·휴일/외근)]] | OvertimeRequest / FieldWorkRequest | [[HBEA421_보고서 제출]] 연계 |
| ㄴ13 | 인센티브 탭 | Tab | • 월별 인센티브 조회 서브탭(당월 "2026년 7월 합계 0건") • 상단에 "주말 당직 치료 세션 신청" 진입 버튼(안내 "당일 항목별 건수와 당직 인원을 적어 상신해요") — 세션 신청 모달로 이동 • 클릭 → [[HBEA430_인센티브]] | IncentiveRecord · TreatmentSessionRequest | 주말 당직 세션 신청 진입점(77da351) |
| ㄴ15 | 주말 당직 치료 세션 요청 | Button | • 주말 당직 근무의 치료 세션을 항목별 건수·당직 인원으로 상신하는 신청 유형(전자결재, 인센티브 탭 상단) - 모달 제목 "주말 당직 세션 신청" · 입력: "근무일" / "치료 항목별 건수"(항목·단가·건수 행) / "당직 인원"(본인 포함, 선택 순서대로 잔여 원이 배분돼요) / "메모"(선택) - 안내 "병원분·인당 분배 금액은 승인 시 자동 계산돼요. 승인 전에는 정산에 반영되지 않아요." • 상신 시: 대기중 세션 요청 생성 → 팀장 승인/반려([[HBTM01_TeamManager_팀결재워크스페이스]]) · 승인 시 세션 생성·정산 반영 | TreatmentSessionRequest · [[HBEA430_인센티브]] | 신설 (코드 반영: 77da351) · 신청→승인 플로우(자동 판별 아님) |
| ㄴ14 | 서류관리 탭 | Tab | • 증명서 제출/요청 목록 서브탭 • 클릭 → [[HBEA440_서류관리]] | DocumentRequest | |
| 20 | 상태 필터 칩 | Filter | • 신청 내역을 상태로 거르는 가로 칩 5종+카운트 "전체 3" / "대기중 2" / "승인" / "반려" / "취소 1". 카운트 0은 라벨만(숫자 미표기) • 클릭 → 목록 필터 적용, 선택 칩 강조 | status enum ↔ *Request.status | 휴가신청 탭 census 예시 — ⚠ 2탭 재편(05) 후 라이브(10/8 낮)는 칩 4종 "검토 중/예정/반려/전체"로 교체 확인(구 "전체/대기중/승인/반려/취소" 5종 아님). TBU: 상태 enum 원문 값 매핑 |
| ㄴ22 | 근무 탭 내역 필터 칩 | Filter | • 근무 탭 전용 신청 종류 필터 "전체 / 연장·휴일 / 외근 / 보고서". 인센티브 탭은 상태 칩 "전체 / 대기중 / 승인 / 반려 / 취소" 사용 • 클릭 → 신청 종류 필터 | [[HBEA420_근무 신청 (연장·휴일/외근)]] | 근무·인센티브 탭 칩 상이 |
| 30 | 신청 내역 리스트 | List | 서브탭별 신청 행. 필터 칩 결과에 종속. 행 구조·인터랙션은 각 서브탭 문서 참조 | 각 화면 HBEA410-440 | TBU: ${requests} 부재 → 리스트 비우고 Empty / ${status_counts} 부재 → 칩 라벨만(카운트 hide) / 로드 실패 UI 미확인(무반응이면 버그 후보) |
| ㄴ30-E | Empty | Text | 휴가신청 "휴가 신청 내역이 없어요" / 근무 "근무 신청 내역이 없습니다" / 인센티브 "인센티브 내역이 없어요." (원문 카피) | 각 서브탭 | 문구 서브탭별 상이 |
| 40 | 신청 작성 FAB | Button (+) | • 결재 화면에서 등록 가능한 항목을 한 곳에 모은 신규 등록 바텀시트를 여는 우하단 플로팅 "+"(접근성 이름 "새 신청", 안내 "결재로 등록할 수 있는 항목이에요."). 조건3 [EMPLOYEE] self scope 신청만(승인 mutation 없음). 서브탭과 무관하게 동일 시트 • 클릭 → 등록 항목 분기 - 휴가: 단일 "휴가" 신청 폼 모달 → [[HBEA410_휴가신청]] - 근무: "연장·휴일 근무 신청" / "외근 신청" → [[HBEA420_근무 신청 (연장·휴일/외근)]] - 인센티브: "인센티브 등록"(안내 "오늘 실적을 항목·건수로 등록") → CASE01 [설정 토글 ON]: 노출 · CASE02 [OFF]: 미노출 - 서류: "서류 제출·요청" → [[HBEA440_서류관리]] | 각 화면 신청 폼 · organization_parameters(incentive.self_registration) | 인센티브 자기 등록 진입점은 조직 설정 토글 ON일 때만 노출(db3e9b3·3374b53, incentiveSelfRegEnabled 게이트) [[HBAD270_설정 (조직 설정·내 정보)]]. 휴가 진입은 단일 "휴가" 버튼으로 통합(59e955d), 휴가 유형 선택은 HBEA410 모달 내 select로 이동 |
| 50 | 신청 → 결재 → 보고 흐름 | - | STEP1 [신청] → STEP2 [결재] → STEP3 [보고] 3단계. 서사는 화면 플로우 mermaid 참조. 직원앱은 self scope 신청·조회만 | [[HBTM01_TeamManager_팀결재워크스페이스]] | [[POL_결재워크플로우]] |
상태 / 권한 요약
| 시나리오 | 트리거 | 결과 화면 | 비고 |
|---|---|---|---|
| CASE01 [미인증 진입] | 결재 탭 직접 진입 | /employee-app/signin 리다이렉트 | 조건1 인증 필요 |
| CASE02 [직원 진입] | 인증 세션 | 기본 서브탭 "휴가신청" 표시 | |
| CASE03 [서브탭 전환] | 서브탭 스위처 클릭 | 해당 서브탭 내역·필터 재로드 | |
| CASE04 [신청 작성] | FAB(+) → 폼/액션시트 제출 | 신청 record 대기중 생성, HBTM 결재 큐 인입 | self scope 토큰 |
| 조건3 [EMPLOYEE] | 전 서브탭 | 조회·신청만, 승인/지급 mutation 불가 | HBTM 소관 |
Open Question
- 상태 필터 칩 카운트 산정 범위(전체 기간 vs 조회 월) 및 "전체" 정의(취소 포함 여부). TBU.
- 상태 enum 원문 값(대기중=pending 등 매핑) 및 취소 트리거(직원 self-cancel vs 팀장 취소 — 휴가는 관리자 결재, 외근은 직원 즉시 취소로 상이). TBU.
- 서브탭별 배지/알림 미읽음 카운트 노출 여부. TBU.
- 리스트 로드 실패 시 에러 UI(재시도/토스트). 라이브 미검증. TBU.