Skip to content

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, approvedAtsdk.leaveRequest.approve() (추정)휴가 신청 승인 / 연차/휴가 승인 (팀)
반려leaveRequestId, rejectionReason (필수)sdk.leaveRequest.reject() (추정)휴가 신청 승인
승인 취소leaveRequestIdsdk.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.statusTBU: 상태 필터 실 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 + halfDayPeriodleave_requests.leaveType / isHalfDay
ㄴ62적용 기간Cell• startDate ~ endDateleave_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.service2026-09-03 QA(미연동 조직 무반응) 후속
10타이틀Output• 진입 맥락별 타이틀(원문): 다시 발송 시 "연차 사용촉진 다시 발송" / 개별 시 "연차 사용촉진 개별 통지" / 일괄 시 "연차 사용촉진 일괄 통지"
11안내문Output• ds-notice info: "메신저에 설정된 발신자 이름·이메일로 안내하고, 직원별 Sign 요청을 생성해요." (원문)[[HBAD270_설정 (조직 설정·내 정보)]] 메시지 발신
20Sign 서식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 entity2026-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). 클릭 시 cancelAnnualLeavePromotionBatchannual-leave-promotion.router
51실패 건 재시도Button• 조건부 노출 — batch 상태가 completed_with_issues/failed 일 때. "실패 건 재시도" (원문, ds-btn--solid primary). 클릭 시 retryAnnualLeavePromotionBatchannual-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

구분미확인 항목
enumleave_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)