HBAD251_연차 현황·결재
(Hereby) 관리자 패널 > 근태 관리 > 근태 현황 > 연차 탭
| 메타 | 앱: 관리자 패널 (HBAD)대상 사용자: 조건1 [연차/휴가 조회 (팀)] / 조건2 [휴가 신청 승인] / 조건3 [연차/휴가 승인 (팀)]프로토타입: TBU관련 정책: [[POL_연차관리]] · [[POL_휴가유형]]Status: reviewOwner: 카나 |
개요
연차 현황·결재는 근태 현황([[HBAD250_근태 현황 (근무)]])의 연차 탭으로, 직원별 연차 부여/사용/잔여 조회와 연차·휴가 결재를 처리한다.서브 버튼 "연차현황"(부여·사용·잔여 그리드)과 "연차/휴가 결재"(신청 승인/반려 인박스), "출근율"(전년도 출근율 서브뷰)로 분기한다.출근율 서브뷰는 전년도 출근율(소정근로일수 대비 출근 인정 일수)을 산출하며 연차 부여 요건 판정과 연관된다.연차현황 그리드 각 행의 "관리" 열에서 "상세"(연차 잔여 상세 팝업)와 "조정"(수동 연차 조정), 연차 사용촉진(개별/일괄 통지)으로 진입한다.부여 원천은 [HBAD262_연차 부여 기준], 부여 실적은 leave_grants, 사용 신청은 leave_requests다. 연차 수치 규칙(부여일수 등)은 정책 문서 [[POL_연차관리]] 참조. 연차 사용촉진은 근로기준법 §61(연차 유급휴가의 사용 촉진)의 서면 촉구 절차를 hereby Sign 전자서명 요청으로 대체해, 미사용 연차 소멸 전 사용자에게 사용 시기 지정을 촉구하고 기한 초과 시 회사가 2차로 사용시기를 지정하도록 지원한다. 백엔드는 annual-leave-promotion.router·서비스, Sign 계약 웹훅(hereby-contract-webhook.routes), 배치 3종(발송 annual-leave-promotion-batch.job / 만료 자동취소 annual-leave-promotion-expiry.job / 정합 annual-leave-promotion-reconcile.job)으로 처리한다 (코드 반영: 36989ac).
문서 히스토리
- 2026-07-06 최초 작성 - 카나/콸
- 2026-07-10 라이브 기능 검토 반영 (컬럼·통계·연도 확인) - 카나/콸
- 2026-07-13 버튼 행동 명세 보강 - 카나/콸
- 2026-07-21 GC700 깊이 재작성 - 카나/콸
- 2026-07-21 셀 스타일 확정판 적용 (콸 승인) - 카나/PM
- 2026-07-24 코드 변경 반영(17f0436·c1b2158) - 카나/콸
- 2026-07-28 코드 변경 반영(8299588) - 카나/PM
- 2026-08-04 연차 잔여 상세 팝업·수동 조정 기능 반영(cef1b35) - 카나/PM
- 2026-08-05 출근율 서브뷰·소정근로일수 설정 모달 반영(a33fa70) - 카나/PM
- 2026-08-14 연차촉진 워크플로우 반영(36989ac) - 카나/PM
- 2026-08-17 라이브 실사 검증 반영(dev v0.1.0+, 유형·기준 모달 최초 실증) - 카나/PM
- 2026-08-19 촉진 전용 권한 annualLeavePromotion:execute 분리 반영(b99d1f8) - 카나/PM
Data I/O
Server → Client
변수
| 메타 | $ |
| 메타 | $ |
| 메타 | $ |
| 메타 | $ |
| 메타 | $ |
| 메타 | $ |
| 메타 | $ |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 연도/소속/검색 필터 | year, teamId, keyword | (재조회) | 연차/휴가 조회 (팀) |
| 승인 | leaveRequestId, approvedBy, approvedAt | sdk.leaveRequest.approve() (추정) | 휴가 신청 승인 / 연차/휴가 승인 (팀) |
| 반려 | leaveRequestId, rejectionReason (필수) | sdk.leaveRequest.reject() (추정) | 휴가 신청 승인 |
| 승인 취소 | leaveRequestId | sdk.leaveRequest.cancel() (추정) — 제약: 기간 미경과 건만 허용. 취소 시 차감을 원장 상쇄(offset) 엔트리로 복구(조직 타임존 기준) (코드 반영: c1b2158) | 연차/휴가 수정 (본인) |
연차현황 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 조건1 [연차/휴가 조회 권한] 인증 시 노출- CASE01 [미인증]: /admin/signin 리다이렉트 | 인증 세션 · RBAC | |
| 01 | 초기 상태 | - | • 근태 현황 진입 후 "연차" 탭 클릭 시 "연차현황" 서브뷰 기본 | ||
| 10 | 서브 전환 | Button | • "연차현황" / "출근율" / "연차/휴가 결재" 서브뷰 전환 (원문, 라이브 순서). 라벨 "연차/휴가 결재" • 클릭 시: 서브뷰 전환 - CASE01 [연차현황]: 부여·사용·잔여 그리드 - CASE02 [출근율]: 전년도 출근율 서브뷰(하단 별도 표) - CASE03 [결재]: 결재 인박스(하단 별도 표) | 결재·출근율 = 하단 표 | s3 btn 확인 · 라이브 탭 순서 정정(연차현황/출근율/연차·휴가 결재, 2026-08-17 실사) · 출근율 서브뷰(코드 반영: a33fa70) |
| 11 | 유형·기준 진입 | Button | • 탭 우상단 "연차 부여 기준" / "휴가 유형" (원문) • 클릭 시: "유형·기준 관리" 모달 해당 섹션 - CASE01 [부여 기준]: 부여 기준 섹션 - CASE02 [휴가 유형]: 휴가 유형 섹션 | [[HBAD262_연차 부여 기준]] · [[HBAD261_유형 설정 (연장근무·외근·휴가)]] | |
| 12 | 상단 통계 | Stat | • "대상 인원 {n}명 / 평균 사용 {n}일 / 평균 잔여 {n}일" (원문). 라이브(2026-08-17): "대상 인원 271명 / 평균 사용 0일 / 평균 잔여 -1.3일" - CASE01 [값 없음]: "0명 / 0일 / 0일" - 평균 잔여 음수 노출: 라이브에서 "평균 잔여 -1.3일" 관찰 — 0 하한 클램프 없이 음수 그대로 표기됨 | leave_summary 집계 | 라이브 원문 · 평균 잔여 음수(-1.3일) 노출, 클램프 미적용(2026-08-17 실사) |
| 13 | 연도 선택 | Dropdown | • "2026년 / 2025년 / 2024년 / 2023년 / 2022년" 5개년 (s3 btn 원문). 기본값: 현재 연도(2026년) • 선택 시: 선택 연도 말일 기준 재산정 | 목록 재조회 | [[POL_연차관리]] |
| 14 | 소속 선택 | Dropdown | • "소속 선택" (원문) 팀 멀티셀렉트 • 선택 시: teamId 기준 재조회 - CASE01 [값 없음]: 전체 | 목록 재조회 | |
| 15 | 검색 | Search | • placeholder "사번 / 이름 / 이메일" (원문). 규약: 176×32px, 0.3초 debounce, 필터 줄 오른쪽 끝 고정. 서버 페이지네이션 목록이라 attendance.list에 search 파라미터로 재조회 • 입력 시: 해당 직원 필터 - CASE01 [결과 없음]: Empty | 목록 재조회 (search 파라미터) | s3 원문 · 검색 규약 통일 (코드 반영: 8299588) · TBU: 검색 결과 없음 문구 |
| 16 | 일괄 통지 | Button | • 필터 줄 오른쪽 "일괄 통지" (원문, ds-btn--solid primary sm, data-testid=annual-leave-promotion-batch) • 클릭 시: "연차 사용촉진 일괄 통지" 모달 오픈(하단 "연차 사용촉진 통지 모달" 표) - CASE01 [대상 미선택]: 라이브 모달 대상 안내 = "선택한 직원 0명" (원문) explicit 표기 - CASE02 [행 선택 있음]: 선택 직원 대상(selectionMode=explicit) | annual-leave-promotion.router | 신규(코드 반영: 36989ac) · 라이브 정정: 미선택 시 all_eligible_in_scope 재계산 안내가 아니라 "선택한 직원 0명" explicit 포맷(2026-08-17 실사) |
| 17 | 발송 내역 | Button | • 필터 줄 오른쪽 "발송 내역" (원문, ds-btn--line normal sm, data-testid=annual-leave-promotion-history) • 클릭 시: "연차 사용촉진 발송 내역" 패널 오픈(하단 "발송 내역 패널" 표) | annual-leave-promotion.router | 신규(코드 반영: 36989ac) |
| 18 | 대상 선택 바 | Output | • 행 체크 시 그리드 상단 선택 상태 바 노출(att-leave-selection-status, role=status) - CASE01 [페이지 선택]: "현재 페이지 {n}명을 선택했어요." (원문) + 필터 활성 시 "검색 결과 {n}명 모두 선택"·비활성 시 "전체 {n}명 모두 선택"(att-leave-select-all-matching) (원문) - CASE02 [전체 선택됨]: "현재 조건에 맞는 {n}명을 모두 선택했어요." (원문) + "선택 해제"(att-leave-clear-selection) (원문) | 그리드 체크박스 상태 | 신규 · 전체 선택(코드 반영: 36989ac) |
| 20 | 연차 현황 그리드 | Grid | • 직원별 부여/사용/잔여 그리드. 컬럼(s3 원문): 선택 / 사번 / 이름 / 소속 / 입사일 / 총 부여 / 사용 / 잔여 / 사용률 / 산정기준 / 촉진 상태 / 관리 (12컬럼) - 헤더 좌측 선택 열: 현재 페이지 전체 선택 체크박스(att-leave-check-all, aria-label "현재 페이지 전체 선택" / 해제 시 "현재 페이지 전체 선택 해제", 원문). 행 체크박스 data-testid=att-leave-row-check - CASE01 [대상 0 또는 검색 0건]: Empty state | leave_grants · leave_requests · annual-leave-promotion.router | 선택·촉진 상태 열 추가 12컬럼(코드 반영: 36989ac) · TBU: Empty 원문 |
| ㄴ21 | 사번 | Cell | • 직원 사번. 예: "bestrhpt179" | employees.employeeNumber | |
| ㄴ22 | 이름 | Cell | • 직원 성명. 예: "가태영" | employees.name | |
| ㄴ23 | 소속 | Cell | • 소속 팀. 미배정 시 "-" (라이브 관찰) | team_members / teams | 미배정 "-" |
| ㄴ24 | 입사일 | Cell | • 입사일 (YYYY.MM.DD.). 근속연수 산정 기준. 예: "2025.08.25." | employees.hireDate (추정) | |
| ㄴ25 | 총 부여 | Output | • 기간 내 총 부여 일수 (일). 라이브 "15일"/"18일" | leave_grants.grantedDays 합 | |
| ㄴ26 | 사용 | Output | • 승인된 연차/휴가 사용 일수 (일). 라이브 "0일" | leave_requests(승인) 집계 | |
| ㄴ27 | 잔여 | Output | • 잔여 = 총 부여 − 사용 (일). 라이브 "15일" | 계산 컬럼 | |
| ㄴ28 | 사용률 | Output | • 사용 ÷ 총 부여 (%). 라이브 "0%". 부여 0 시 "0%" (0 나눗셈 처리 TBU) | 계산 컬럼 | |
| ㄴ29 | 산정기준 | Output | • 적용된 부여 기준 라벨. 라이브 값 "입사일" | [[HBAD262_연차 부여 기준]] · leave_entitlement_rules | 라이브 원문 |
| ㄴ29a | 촉진 상태 | Badge | • 직원별 연차 사용촉진 진행 상태 라벨(width 120px, ds-label sm square primary) - 상태값(원문): "안내 전" / "1차 안내됨 · 서명 대기" / "제도 적용(1차 완료)" / "요청 취소(기한 초과)" / "2차 지정 완료" | annual-leave-promotion.router · annual-leave-promotion.enum | 신규(코드 반영: 36989ac) · 라이브: 발송 이력 0이라 전 직원 "안내 전"만 실물 관찰, 나머지 4종은 발송 데이터 필요(2026-08-17 실사) |
| ㄴ30 | 관리 | Cell | • 그리드 행별 관리 열(width 120px, 헤더 라벨 i18n common.manage). "상세" / "조정" + 촉진 액션 버튼 배치 | leave-request.router · annual-leave-promotion.router | 관리 열 확장(코드 반영: cef1b35·36989ac) |
| ㄴ31 | 상세 | Button | • "상세" 버튼(ds-btn--line normal sm, data-testid=att-leave-balance-view) • 클릭 시: 상세 팝업(leave-balance-detail 모달) 오픈 — 모달 타이틀 "상세" (원문) + 직원명(사번) - CASE01 [열림]: 탭 3종 "적용된 규칙" / "사용 내역" / "조정 내역" (원문) | 하단 "연차 잔여 상세 팝업" 모달 표 · leave-request.router | 신규(코드 반영: cef1b35) · 라이브 실증: 모달 제목 "상세", 탭 라벨 정정(2026-08-17 실사) |
| ㄴ32 | 조정 | Button | • "조정" 버튼(ds-btn--line primary sm, data-testid=att-leave-balance-adjust) • 클릭 시: "연차 조정" 모달 오픈(하단 "연차 조정 모달" 표) - CASE01 [조정 입력]: "조정 연차 *"(일 + 시간, 증감 방식) + "조정 사유 *" 입력 - CASE02 [적용]: 조정 실행, 잔여 재산정 | leave-request.router (조정 API) | 신규(코드 반영: cef1b35) · 라이브 실증: 목표 잔여 아닌 증감(조정)·시간 단위(2026-08-17 실사) · 조정 기록은 [[HBAD262_연차 부여 기준]]의 불변 원장(LeaveLedgerEntry) 상쇄 엔트리로 연결 |
| ㄴ33 | 촉진 액션 | Button | • 촉진 진행 액션 버튼(ds-btn--line normal sm, data-testid=annual-leave-promotion-row). 라벨·활성 여부는 상태에 따라 동적(annualLeavePromotionAction) • 클릭 시: 상태별 액션 실행(handleAnnualLeavePromotionAction) — 개별 통지 모달 오픈 또는 다시 발송 등 - CASE01 [비활성]: annualLeavePromotionAction.disabled 시 클릭 불가 • 권한: annualLeavePromotion:execute — 촉진 실행 전용 권한(개별/배치 발송·재발급·리마인더·2차 지정 공통). 2026-08-18 leave:update에서 분리, scope 없는 조직 전체 권한, HR_ADMIN 기본 부여. 목록 조회는 leave:read 유지. 역할 팝업 라벨 "연차 촉진 실행", 권한 없음 안내 "연차 촉진 실행 권한이 없습니다" | annual-leave-promotion.router · default-permissions seed | 신규(코드 반영: 36989ac) · 권한 분리(b99d1f8) — 문구는 코드 확정값(권한 보유 계정이라 라이브 관찰 불가) |
| ㄴ34 | 사용시기 지정 | Button | • "사용시기 지정" 버튼(ds-btn--line primary sm, data-testid=annual-leave-promotion-second-designation). 조건부 노출 — businessStatus="expired_cancelled" 이고 canSecondDesignate=true 일 때만 • 클릭 시: "연차 사용시기 지정" 2차 지정 모달 오픈 - 비활성 툴팁(원문): 권한 없음 "사용시기를 지정할 권한이 없어요." / 대상 아님 "지정할 수 있는 직원이 아니에요." / 잔여 0 "잔여 연차가 없어 사용시기를 지정할 수 없어요." / 1차 안내 없음 "1차 안내를 보낸 뒤에 사용시기를 지정할 수 있어요." / 이미 제도 적용 "이미 촉진 서명이 완료되어 사용시기를 지정할 수 없어요." / 아직 기한 전 "안내 발송 후 제출 기한이 지난 뒤에 사용시기를 지정할 수 있어요." / 이미 2차 지정 "이미 사용시기를 지정했어요." | 하단 "연차 사용시기 지정(2차) 모달" 표 · annual-leave-promotion.router | 신규 · 활성 조건 요구사항 §7.4(코드 반영: 36989ac) |
연차/휴가 결재 인박스 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 50 | 신청 목록 | Grid | • 연차/휴가 신청 인박스 그리드. 컬럼(원문): 신청일(createdAt) / 사번 / 이름 / 유형 / 적용 기간 / 차감 / 사유 / 상태 / 관리("보기") (9컬럼). 헤더 라벨 "차감"(축약, 사양 이전 표기 "차감 일수"). "신청일" 컬럼은 사번 좌측(최좌측) 정렬 컬럼으로 추가, 기본 내림차순 (코드 반영: c1b2158) - CASE01 [신청 0건]: Empty state | leave_requests (status default pending, createdAt) | 신청일 정렬 컬럼 신규(c1b2158) · 라이브 차감 라벨 "차감" 확정(2026-08-17 실사) · TBU: Empty 원문 |
| ㄴ50a | 신청일 | Cell | • 신청 생성 시각(createdAt) 정렬 컬럼 (사번 좌측, 기본 내림차순) • 클릭 시: 신청일 기준 정렬 토글 | leave_requests.createdAt | 신규 (코드 반영: c1b2158) |
| 51 | 상태 필터 | Dropdown | • "전체 / 대기 / 승인 / 반려 / 취소" (추정, 라이브 미프로브) • 선택 시: status 기준 재조회 | leave_requests.status | TBU: 상태 필터 실 UI |
| 52 | 기간 필터 | Segmented | • 기간 6종 (근태 현황 공통). 날 유틸 칩을 공용 SubTab(sm·line·radius 4)으로 통일 — 보조 필터 위계로 정리 • 선택 시: 기간 기준 재조회 | 재조회 | 프리셋 SubTab 통일 (코드 반영: 8299588) |
| 53 | 검색 | Search | • 연차/휴가 결재 인박스 검색. placeholder "사번 / 이름 / 이메일" (원문). 규약: 176×32px, 0.3초 debounce, 필터 줄 오른쪽 끝 고정. 서버 페이지네이션 목록이라 leaveRequest.list에 search 파라미터로 재조회(leaveApprovalGoPage(1)) • 입력 시: 해당 신청 필터 - CASE01 [결과 없음]: Empty | 목록 재조회 (search 파라미터) | 신규 (코드 반영: 8299588) · TBU: 검색 결과 없음 문구 |
| 60 | 보기 | Button | • 신청 행 상세를 여는 버튼 • 클릭 시: "휴가 상세 — 휴가 신청서" 모달 오픈 | 하단 모달 표 | |
| ㄴ61 | 유형 | Cell | • leaveType (문자열). 반차 = isHalfDay + halfDayPeriod | leave_requests.leaveType / isHalfDay | |
| ㄴ62 | 적용 기간 | Cell | • startDate ~ endDate | leave_requests.startDate / endDate | |
| ㄴ63 | 차감 표시 | Output | • 휴가 차감량 표시. 일수 카운트에서 leaveDeductionLabel(분 기반 포맷)으로 교체 — 시간 단위 신청의 차감량이 명확히 표시됨 (반차 0.5 환산 규칙 [[POL_연차관리]] 참조) | leave_requests · leaveDeductionLabel | 분 기반 포맷 교체 (코드 반영: 17f0436) |
| ㄴ64 | 상태 | Badge | • 대기/승인/반려/취소 (default pending) | leave_requests.status (status_enum) | 값 TBU |
출근율 서브뷰 사양표
전년도 출근율(소정근로일수 대비 출근 인정 일수)을 산출하며 연차 부여 요건 판정과 연관된다.
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 70 | 연도 선택 | Dropdown | • 연도 선택 필터. 옵션 라벨 "{y}년" (원문). 기본값 전년도 "2025년", 6개년(2025~2020) • 선택 시: 선택 연도 기준 재조회 | attendance-rate.router | 신규(코드 반영: a33fa70) · 라이브 기본 전년도(2025년)(2026-08-17 실사) |
| 71 | 소속 선택 | Dropdown | • 소속 다중 선택 드롭다운. placeholder "소속 선택" (원문) - CASE01 [복수 선택]: "+N" 배지 표시 - CASE02 [해제]: X 로 개별 해제 - CASE03 [값 없음]: "조직 없음" (원문) 빈 상태 | attendance-rate.router | 신규(코드 반영: a33fa70) |
| 72 | 결과 필터 | Segmented | • 결과 필터 세그먼트 "전체 / 충족 / 미충족" (원문) - CASE01 [선택]: 선택 세그먼트 orange 강조("전체" 기본) | 목록 재조회 | 신규(코드 반영: a33fa70) · 라이브 세그먼트 3종 확정(2026-08-17 실사) |
| 73 | 검색 | Search | • 검색 인풋. 0.3초(300ms) debounce • 입력 시: 해당 직원 필터 | 목록 재조회 | 신규(코드 반영: a33fa70) |
| 74 | 소정근로일수 설정 | Button | • "소정근로일수 설정" (원문) 버튼(ds-btn--line normal md) • 클릭 시: "소정근로일수 설정" 모달 오픈 | 하단 "소정근로일수 설정 모달" 표 · attendance-rate-setting entity | 신규(코드 반영: a33fa70) |
| 80 | 출근율 테이블 | Grid | • 전년도 출근율 테이블. 컬럼(원문): 사번 / 이름 / 소속 / 입사일 / 산정 기간 / 소정근로일수 / 출근 인정 일수 / 출근율 / 충족 여부 / 관리(행별 "수정") (10컬럼) | attendance-rate.router · attendance-rate.service | 신규(코드 반영: a33fa70) · 라이브 정정: 8→10컬럼(충족 여부·관리 추가)(2026-08-17 실사) |
| ㄴ81 | 사번 | Cell | • "사번" (원문, w120) | employees.employeeNumber | |
| ㄴ82 | 이름 | Cell | • 이름 (i18n common.name, w88) | employees.name | |
| ㄴ83 | 소속 | Cell | • "소속" (원문, w110) | team_members / teams | |
| ㄴ84 | 입사일 | Cell | • 입사일 (i18n employee.hire_date, w100) | employees.hireDate (추정) | |
| ㄴ85 | 산정 기간 | Cell | • "산정 기간" (원문, w170). 출근율 산정 대상 기간 | attendance-rate.service | |
| ㄴ86 | 소정근로일수 | Output | • "소정근로일수" (원문, w120) | attendance-rate-setting entity | |
| ㄴ87 | 출근 인정 일수 | Output | • "출근 인정 일수" (원문, w150) | attendance-rate.service | |
| ㄴ88 | 출근율 | Output | • "출근율" (원문, w100). 출근 인정 일수 ÷ 소정근로일수 | attendance-rate.service | |
| ㄴ89 | 충족 여부 | Output | • "충족 여부" (원문). 출근율 요건 충족/미충족 표시 — 결과 필터(72) "충족/미충족" 세그먼트와 연동 | attendance-rate.service | 라이브 신규 컬럼(2026-08-17 실사) |
| ㄴ90 | 관리 | Cell | • 행별 관리 열. 행별 "수정" (원문) 버튼 • 클릭 시: "소정근로일수 설정" 모달 개별 수정 진입(추정) | attendance-rate-setting entity | 라이브 신규 컬럼(2026-08-17 실사) |
휴가 상세 — 휴가 신청서 모달 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 결재 인박스 행 "보기" 클릭 시 노출 | ||
| 10 | 신청 정보 | Output | • 직원 / 유형 / 적용 기간 / 차감 일수 / 사유 표시 | leave_requests 상세 | |
| 11 | 첨부 | Output | • 신청 첨부파일 (진단서 등). 값 없으면 첨부 영역 hide (추정) | leave_requests.attachments (jsonb) | |
| 20 | 닫기 | Button | • 모달을 닫는 버튼 • 클릭 시: 모달 닫힘 (상태 불변) | ||
| 30 | 반려 | Button | • 신청을 반려하는 버튼 • 클릭 시: "휴가 반려" 다이얼로그 오픈 (사유* 필수, placeholder "반려사유를 입력해 주세요." 원문) - CASE01 [사유 미입력]: "확인" disabled - CASE02 [사유 입력 후 확인]: 반려(rejectionReason) 실행 | leave_requests.rejectionReason | 휴가 신청 승인 |
| 40 | 승인 | Button | • 신청을 승인하는 버튼 • 클릭 시: 승인 실행 (approvedBy·approvedAt) - CASE01 [성공]: 상태 "승인" 전환, 목록 갱신 | leave_requests.approvedBy/At | 연차/휴가 승인 (팀) · TBU: 승인 실패 처리 |
연차 잔여 상세 팝업 (leave-balance-detail 모달) 사양표
모달 타이틀 "상세" (원문) + 직원명(사번). 탭 3종 "적용된 규칙" / "사용 내역" / "조정 내역" (원문)으로 분기한다. (2026-08-17 라이브 최초 실증)
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 연차현황 그리드 행 "상세"(data-testid=att-leave-balance-view) 클릭 시 노출. 모달 타이틀 "상세" (원문) + 직원명(사번) | 신규 모달(코드 반영: cef1b35) | 라이브 제목 "상세"(2026-08-17 실사) |
| 05 | 탭 전환 | Button | • 탭 3종 "적용된 규칙" / "사용 내역" / "조정 내역" (원문) 전환 | 라이브 탭 라벨(2026-08-17 실사) | |
| 10 | 적용된 규칙 | Output | • (적용된 규칙 탭) 해당 직원에 적용된 부여 규칙 표. 컬럼(원문): 부여 기준 / 입사일 / 근속 연수 / 총부여 / 연차 시작일 / 연차 종료일 / 산정 기준. 예: "법정 기준 (근로기준법) · 2025.08.25. · 0년 · 12일 · 2025.08.25. · 2026.08.24. · 입사일" | leave_entitlement_rules · [[HBAD262_연차 부여 기준]] | 라이브 원문: 규칙 라벨 "법정 기준 (근로기준법)" / 산정 배지 "입사일"(2026-08-17 실사) |
| 11 | 사용 내역 | Output | • (사용 내역 탭) 승인된 연차/휴가 사용 내역 표. 컬럼(원문): 신청일 / 유형 / 적용기간 / 차감 / 사유 / 상태 - CASE01 [내역 없음]: Empty "사용 내역이 없어요." (원문) | leave_requests · leave-request.router(잔여 상세 조회 API) | 라이브 원문: Empty "사용 내역이 없어요."(2026-08-17 실사) |
| 12 | 조정 내역 | Output | • (조정 내역 탭) 수동 연차 조정 이력 표. 컬럼(원문): 변경일 / 변경자 / 조정 일수 / 사유. 예: "2026.08.05. · 안세희 · 11일→12일 · 2026.08.05. 테스트" | leave-request.router(조정 목록 API) | 라이브 컬럼 4종(2026-08-17 실사) · 조정 기록은 [[HBAD262_연차 부여 기준]]의 불변 원장(LeaveLedgerEntry) 상쇄 엔트리 모델과 연결 |
| ㄴ13 | 조정 추가 | Button | • (조정 내역 탭 내부) "조정 추가" 버튼 (원문) • 클릭 시: "연차 조정" 모달 오픈(관리 열 "조정"과 동일 동선) | leave-request.router (조정 API) | 라이브 실증: 상세 모달 조정 내역 탭 내부에 "조정 추가" 버튼 존재(2026-08-17 실사, 사양 미기재분 반영) |
| 20 | 닫기 | Button | • 모달을 닫는 버튼 • 클릭 시: 모달 닫힘 (상태 불변) |
연차 조정 모달 사양표
관리 열 "조정"(§32) 또는 상세 팝업 조정 내역 탭 "조정 추가"(상세 §ㄴ13)로 진입하는 수동 조정 모달. 목표 잔여 설정이 아니라 증감(조정) 방식이며 시간 단위 부여를 지원한다. (2026-08-17 라이브 최초 실증)
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 관리 열 "조정"(att-leave-balance-adjust) 또는 상세 팝업 조정 내역 탭 "조정 추가" 클릭 시 노출. 타이틀 "연차 조정" (원문) | leave-request.router (조정 API) | 라이브 타이틀 "연차 조정"(2026-08-17 실사) |
| 10 | 조정 연차 | Input | • "조정 연차 *" (원문) 필수 입력 — 일 + 시간 단위 증감(조정). 안내 "8시간은 1일로 계산해요. 1시간 단위로 부여할 수 있어요." (원문) | leave-request.router | 라이브 실증: 증감 방식·시간 단위(8h=1일)(2026-08-17 실사) |
| 20 | 조정 사유 | Input | • "조정 사유 *" (원문) 필수 입력. placeholder "조정 사유를 입력해 주세요." (원문) | leave-request.router | 라이브 원문(2026-08-17 실사) |
| 30 | 취소 | Button | • "취소" (원문). 클릭 시 모달 닫힘(상태 불변) | ||
| 40 | 저장 | Button | • "저장" (원문). 클릭 시 조정 실행, 잔여 재산정 - CASE01 [사유 미입력]: "저장" disabled | leave-request.router (조정 API) | 라이브: 사유 전 disabled(2026-08-17 실사) · 조정 기록은 [[HBAD262_연차 부여 기준]] 불변 원장 상쇄 엔트리로 연결 |
소정근로일수 설정 모달 (attendance-rate-setting.html) 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 출근율 서브뷰 "소정근로일수 설정" 버튼 클릭 시 노출 | 신규 모달(코드 반영: a33fa70) | |
| 10 | 모드 전환 | Button | • 모드 2종 전환 - CASE01 [일괄(bulk)]: 적용 대상 검색 후 공통 소정근로일수 일괄 적용 - CASE02 [개별]: 개별 적용 | 신규(코드 반영: a33fa70) | |
| 20 | 적용 대상 검색 | Search | • (일괄 모드) "적용 대상 검색" 섹션. placeholder "이름 / 사번" (원문) • 안내: "적용 가능한 총 {n}명의 직원" (원문, 라이브 271명) • "모두 해제" (원문) 버튼 — 대상 선택 시에만 노출(라이브 미선택 상태에서 미노출 확인) - CASE01 [로딩]: "직원 목록을 불러오는 중이에요." (원문) - CASE02 [검색 결과 없음]: "검색 결과가 없어요." (원문) - CASE03 [대상 없음]: "적용할 수 있는 직원이 없어요." (원문) | attendance-rate.router | 일괄 모드 전용 · 라이브: 안내문·선택 테이블·[취소][확인] 원문 일치, "모두 해제"는 선택 시 노출 추정(2026-08-17 실사) |
| ㄴ21 | 선택 테이블 | Grid | • (일괄 모드) 선택 대상 테이블. 컬럼(원문): 사번 / 이름 / 팀 / 입사일 | employees · team_members | |
| ㄴ22 | 안내문 | Output | • "선택한 직원에게 같은 소정근로일수가 적용돼요." (원문) | ||
| 30 | 소정근로일수 입력 | Input | • "소정근로일수" 입력 섹션 | attendance-rate-setting entity | |
| 31 | 계산 설정 | - | • 계산 설정 섹션 | attendance-rate.service | |
| 32 | 수정 사유 | Input | • 수정 사유 입력 섹션 | attendance-rate-setting entity | |
| 40 | 확정 | Button | • 설정 확정 버튼 - CASE01 [bulk·선택 있음]: "{n}명 적용" (원문) - CASE02 [그 외]: 공통 확인 라벨 | attendance-rate.router | 신규(코드 반영: a33fa70) |
연차 사용촉진 통지 모달 사양표
1차 안내(개별/일괄/다시 발송)를 발송해 hereby Sign 촉진 서명 요청을 생성하는 모달. 표시 발신자는 [[HBAD270_설정 (조직 설정·내 정보)]]의 "메시지 발신" 설정을 사용하며 발송 화면에 발신자 피커는 없다.
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 필터 줄 "일괄 통지" 또는 행 촉진 액션(개별 통지/다시 발송) 클릭 시 노출 - CASE01 [Sign 미연동 조직]: 모달 대신 오류 다이얼로그 "전자서명(hereby Sign) 연동이 설정되지 않은 조직이에요. 연동 설정 후 이용할 수 있어요." (원문, 서버 PRECONDITION_FAILED 메시지 그대로 노출) — 무반응 금지 | annual-leave-promotion.router · integration-credential.service | 2026-09-03 QA(미연동 조직 무반응) 후속 |
| 10 | 타이틀 | Output | • 진입 맥락별 타이틀(원문): 다시 발송 시 "연차 사용촉진 다시 발송" / 개별 시 "연차 사용촉진 개별 통지" / 일괄 시 "연차 사용촉진 일괄 통지" | ||
| 11 | 안내문 | Output | • ds-notice info: "메신저에 설정된 발신자 이름·이메일로 안내하고, 직원별 Sign 요청을 생성해요." (원문) | [[HBAD270_설정 (조직 설정·내 정보)]] 메시지 발신 | |
| 20 | Sign 서식 | Dropdown | • 라벨 "Sign 서식" (원문). data-testid=annual-leave-promotion-template. 옵션 0=값 "서식을 선택해 주세요" (원문) + 서식 목록(herebyTemplateId) | annual-leave-promotion.router · Sign 템플릿 | |
| 30 | 응답 기한 | Input(number) | • 라벨 "응답 기한" (원문). data-testid=annual-leave-promotion-duration. type=number min 1 max 365, 우측 안내 "일 (기본 10일)" (원문) | 자동취소 기한 판정(annual-leave-promotion-expiry.job) | 기본 10일 |
| 40 | 대상 안내 | Output | • CASE01 [일괄·미선택]: "선택한 직원 0명" (원문) explicit 포맷 표기 (라이브 정정 — all_eligible_in_scope 재계산 안내문 미노출) • CASE02 [selectionMode=explicit·일괄]: "선택한 직원 {n}명" (원문) | 대상 선택 바(18) | 라이브 정정: 미선택 시 "선택한 직원 0명" explicit 표기(2026-08-17 실사) |
| 50 | 취소 | Button | • "취소" (원문). 클릭 시 모달 닫힘(상태 불변) | ||
| 60 | 통지 시작 | Button | • "통지 시작" (원문, data-testid=annual-leave-promotion-submit). 클릭 시 발송 실행(submitAnnualLeavePromotion) — 내부 메시지 제도 안내 + Sign 요청 생성 + 기본 SMS로 Sign URL 전달, 상태 "1차 안내됨 · 서명 대기" 전환 - CASE01 [발송 중]: 라벨 "발송 중…" (원문), disabled | annual-leave-promotion.router · Sign 계약 생성 · SMS | 안내만으로 제도 적용 안 함(요구사항 §5.2) |
발송 내역 패널 사양표
일괄 발송 작업의 진행·결과를 조회하고 중지/재시도하는 패널. 실제 발송·집계는 배치(annual-leave-promotion-batch.job)와 Sign 계약 웹훅(hereby-contract-webhook.routes)이 처리한다.
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 필터 줄 "발송 내역" 클릭 시 노출. 타이틀 "연차 사용촉진 발송 내역" (원문) | annual-leave-promotion.router | |
| 01 | 범위 안내 | Output | • 상단 안내 notice(ds-notice--info): "일괄 통지 작업의 진행·결과를 보여드려요. 개별 통지 결과는 연차현황의 촉진 상태와 촉진 액션에서 확인할 수 있어요." (원문) • 이 패널은 일괄(batch) 발송 작업 전용 — 개별 통지(firstNotice)는 batch 를 만들지 않으므로 목록에 나타나지 않는 것이 정상이며, 개별 진행 상태는 연차현황 그리드의 "촉진 상태" 열·촉진 액션이 정본이다 | annual-leave-promotion-batch entity | 2026-09-03 QA(개별 통지 건 미표시 혼동) 후속 — 안내 추가 |
| 10 | 작업 선택 | Dropdown | • 발송 작업(batch) 선택. 옵션 없음 시 "발송 작업을 선택해 주세요" (원문). 옵션 라벨 = 상태 + · + 생성시각 | annual-leave-promotion-batch entity | |
| 11 | 새로고침 | Button | • "새로고침" (원문). 클릭 시 선택 batch 재조회(refreshAnnualLeavePromotionBatch) | annual-leave-promotion.router | |
| 20 | 집계 요약 | Output | • 상태 배지 + 카운트 5종(원문): "전체" / "성공" / "실패" / "중지" / "제외" | annual-leave-promotion-batch(totalCount/succeeded/failed/cancelled/skipped) | |
| 30 | 대상 목록 | Grid | • 직원명 + 항목 상태 배지 + 오류 메시지 - CASE01 [항목 없음]: "대상 생성 중이에요." (원문) | annual-leave-promotion-batch-item entity | |
| 40 | 닫기 | Button | • "닫기" (원문). 클릭 시 패널 닫힘 | ||
| 50 | 남은 발송 중지 | Button | • 조건부 노출 — batch 상태가 materializing/queued/running 일 때. "남은 발송 중지" (원문, ds-btn--line red). 클릭 시 cancelAnnualLeavePromotionBatch | annual-leave-promotion.router | |
| 51 | 실패 건 재시도 | Button | • 조건부 노출 — batch 상태가 completed_with_issues/failed 일 때. "실패 건 재시도" (원문, ds-btn--solid primary). 클릭 시 retryAnnualLeavePromotionBatch | annual-leave-promotion.router · 배치 재발송 |
연차 사용시기 지정(2차) 모달 사양표
1차 제출 기한 초과·자동취소된 직원에게 회사가 연차 사용시기를 지정하는 2차 지정 모달. 지정 후 내부 메시지로 사유·일정을 안내하며, 지정만으로 연차 신청·잔여 차감은 하지 않는다(요구사항 §7.3).
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 행 "사용시기 지정"(annual-leave-promotion-second-designation) 클릭 시 노출. 타이틀 "연차 사용시기 지정" (원문) | annual-leave-promotion.router | |
| 10 | 경고 안내 | Output | • ds-notice warning: "1차 안내의 제출 기한이 지나 계획서를 제출하지 않은 직원에게 회사가 사용시기를 지정해요. 지정 후에는 변경 이력을 남겨요." (원문) | annual-leave-promotion-event entity | |
| 20 | 사용일 항목 | Input | • 반복 입력 행(planItems). 각 행: "사용일"(type=date) / "시간(분)"(type=number min 1 max 1440 step 30) / "반일" 체크박스 (모두 원문) | annual-leave-promotion-plan-item entity | |
| ㄴ21 | 사용일 삭제 | Button | • "삭제" (원문). 행 1개 이하면 disabled | - | |
| 30 | 사용일 추가 | Button | • "사용일 추가" (원문). 클릭 시 planItems 행 추가(addAnnualLeavePromotionPlanItem) | - | |
| 40 | 취소 | Button | • "취소" (원문). 클릭 시 모달 닫힘(상태 불변) | ||
| 50 | 사용시기 지정 | Button | • "사용시기 지정" (원문, data-testid=annual-leave-promotion-second-submit). 클릭 시 계획 저장 + 내부 메시지(지정 사유·일정) 발송, 성공 시 상태 "2차 지정 완료" 전환·지정 필요 목록 제외 - CASE01 [지정 중]: 라벨 "지정 중…" (원문), disabled | annual-leave-promotion.router · 내부 메시지 | 메시지 발송까지 성공해야 완료 처리(요구사항 §7.3) |
권한 · 상태 분기 요약
| 시나리오 | 트리거 | 결과 화면 | 비고 |
|---|---|---|---|
CASE01 [현황 조회] | 연차 탭 진입 | 부여/사용/잔여 그리드 | 연차/휴가 조회 (팀) |
CASE02 [결재 대기] | "연차/휴가 결재" | pending 신청 인박스 | |
CASE03 [승인] | "승인" 클릭 | approvedBy/At 기록, 상태 "승인" | 연차/휴가 승인 (팀) |
CASE04 [반려] | "반려" → 사유 입력 | rejectionReason 기록, 상태 "반려" | 사유 필수 |
CASE05 [권한 없음] | 조회 권한만 보유 | 결재 버튼 비활성 (추정) | TBU |
CASE06 [승인 취소] | 승인 건 취소 | 기간 미경과 건만 허용, 취소 시 차감을 원장 상쇄 엔트리로 복구(조직 타임존 기준) | 코드 반영: c1b2158 |
CASE07 [1차 촉진 통지] | "일괄 통지"/개별 촉진 액션 → "통지 시작" | Sign 촉진 서명 요청 생성 + 내부 메시지·SMS URL 발송, 상태 "1차 안내됨 · 서명 대기" | 코드 반영: 36989ac · 근로기준법 §61 |
CASE08 [제도 적용] | 직원이 Sign 서명·계획서 완료(웹훅 수신) | 상태 "제도 적용(1차 완료)", 잔여 미차감 | hereby-contract-webhook.routes |
CASE09 [기한 초과 자동취소] | 응답 기한(기본 10일) 초과·미완료 | Sign 요청 자동 취소, 상태 "요청 취소(기한 초과)" | annual-leave-promotion-expiry.job |
CASE10 [2차 지정] | "사용시기 지정" → 계획 저장·메시지 발송 성공 | 상태 "2차 지정 완료", 지정 필요 목록 제외, 잔여 미차감 | 활성 조건 요구사항 §7.4 |
Open Question
| 구분 | 미확인 항목 |
|---|---|
| enum | leave_requests_status_enum / halfdayperiod_enum 전체 값 |
| 결재 인박스 | 상태·기간 필터 실 UI (라이브 미프로브) |
| 연차 현황 | 검색 결과 없음(Empty) 문구 원문 (20-E · 15 Empty) |
| 결재 인박스 | 신청 0건 Empty 문구 원문 (50-E) |
| 연차 현황 | 사용률 0 나눗셈(부여 0) 표기 처리 |
| 연차 현황 | 상단 통계 "평균 잔여" 음수 노출(라이브 -1.3일, 0 하한 클램프 없음) — 의도 여부·클램프 적용 여부 (2026-08-17 실사) |
| 결재 워크플로우 | 팀→관리자 다단계 여부 |
| 승인 | 승인 실패 에러 처리 |
| 유형 연결 | 휴가 유형(leaveType) 마스터 ↔ [[HBAD261_유형 설정 (연장근무·외근·휴가)]] 연결 |
| 정책 참조 | 반차(0.5일) 환산 규칙 → [[POL_연차관리]] 참조 (사양서 정의 금지) |
| 연차 촉진 | 촉진 상태 enum(annual-leave-promotion.enum)·batch/item 상태값 전체 카탈로그 |
| 연차 촉진 | 응답 기한 요청별 수정 가능 여부·재발송 시 기존 기한 유지 여부(요구사항 OQ-3·OQ-5) |
| 연차 촉진 | SMS 발송 실패 시 내부 메시지 자동 대체 여부(요구사항 OQ-13) |