HBAD262_연차 부여 기준
(Hereby) 관리자 패널 > 근태 현황 > 연차 탭 > 유형·기준 관리 모달 > 연차 부여 기준
| 메타 | 앱: 관리자 패널 (HBAD)대상 사용자: 조건1 [근태 관리] (설정 수정)프로토타입: TBU관련 정책: [[POL_연차관리]]Status: draft (모달 내부 라이브 미확인)Owner: 카나 |
개요
연차 부여 기준은 근속연수 구간별 연차 부여 일수·발생유형을 정의하는 설정으로, 원천은 leave_entitlement_rules다.근태 현황 > 연차 탭 > "연차 부여 기준" 버튼 → "유형·기준 관리" 모달의 연차 부여 기준 섹션으로 진입한다.각 규칙은 근속연수 구간에 매칭되어 [[HBAD251_연차 현황·결재]]의 "산정기준"과 부여 일수 원천이 된다. ⚠️ 연차 부여 일수·근속 구간 등 수치 규칙은 정책 [[POL_연차관리]]에 정의되며, 본 사양서는 UI 필드만 기술한다 (정의 복사 금지). 모달은 라이브 프로브 미오픈(s3-attend TAB_NOT_FOUND) → census/ERD 기반, TBU 다수. [2026-09-14 v0.7.0 leave-accrual 배치 반영] ① 산정 기준 예약제(#683): 조직 연차 산정 기준(회계년도/입사일)을 관리자가 「적용 시작일(effectiveFrom)」을 정해 예약 — 기존 하드코딩 자동전환(2027 스위치) 제거, 이력표(leave_accrual_basis_changes)가 정본이며 행 없으면 입사일 기준. 부여 기준 팝업 「적용 기준」 영역 + 설정 카드가 현재값·예약·이력을 표시하고, 「기준 변경 예약」 모달은 기본값을 현재와 반대 기준으로(회계년도면 다음 회계일) 프리필. ② 신규입사 부여 모드 3종(#686): (a)입사 연도에 바로 비례 부여 / (b)입사 첫해 월별 발생 → 다음 회계일 소급 부여 / (c)입사 첫해 월별 발생 → 만 1년 시점 남은 개월 비례 부여(신규, 금액은 소급과 동일·시점만 다름). ③ 연차 촉진 통지 서식 폴백(#681, CS-LOC-260914-0002): 통지용 Hereby Sign 서식이 없으면 [서식 추가하기]가 새 창으로 Sign 템플릿 관리 화면을 열고, 서버가 관리 URL을 null로 주면 버튼을 숨기고 안내문만 남긴다.
잔여 계산·부여 모델 (코드 반영)
- 불변 원장 전환: 연차 잔여 계산이 불변 원장(LeaveLedgerEntry, append-only) 기반으로 전환됨. 부여/사용/이월/소멸/조정이 분 단위로 적재되며, UPDATE/DELETE는 DB 트리거로 차단, 정정은 상쇄 엔트리로 처리 (코드 반영: 318f7e1).
- 부여 계산
computeEntitlement: 입사일·근속연수 기반. 매칭 규칙이 없으면 근로기준법 기본값 적용 — 1년 미만 월 1일(최대 11) / 1년 15일 / 3년+ 2년당 +1(최대 25) (코드 반영: 42e22ee). - 병원별 정책 8플래그 (leavePolicySchema, 기본 permissive) 존재 (코드 반영: 318f7e1) — 세부 플래그 목록 TBU.
- 정책 화면 재구성: 연차(휴가) 정책 화면이 그룹형 선택지로 재구성됨 (코드 반영: ba2775a) — 세부 UI TBU.
연차 정책 탭 (유형·기준 관리 모달 내 — 10/13 라이브 실측 채록)
진입: 근태 현황 > 연차 > 유형·기준 관리 모달 > 「연차 정책」 탭. 상단 안내 "병원 전체에 적용되는 연차 규칙이에요. 여기서 고른 대로 신청·승인 시 차감이 계산돼요." / "바꾼 규칙은 앞으로 승인되는 휴가부터 적용돼요. 이미 승인·사용된 휴가는 승인 당시 기준으로 계산돼 있어 소급 변경되지 않아요."
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| P10 | 사업장 규모 | Toggle | 「5인 미만 사업장」 + 도움말(켜면 공휴일 제외 등 법정 강제 항목 직접 선택). 재직 5인 이상이면 경고 "등록된 재직 직원이 N명이에요 — 5인 이상 사업장은 이 설정을 켜면 안 돼요. 공휴일에 연차를 소진시키면 근로기준법 위반(§55②)이 될 수 있어요."(10/13 실측) | leavePolicy | 10/13 실측 |
| P20 | 남은 연차보다 많이 신청하면? | Radio 3 | • (10/10 머지, #1143, MED-968) 초과 사용 처리(overuseMode) 3지선다 — 바뀐 값은 「기본값과 다름」 배지(10/13 실측 원문): - 「경고만 하고 허용」 "신청서에 「남은 연차보다 N일 많아요」 경고만 보이고 접수·승인돼요. 잔여가 마이너스가 될 수 있어요."(allow) - 「결재자가 확인한 뒤 허용」 "접수는 되지만 승인할 때 결재자에게 초과분이 보이고 「초과 승인」을 눌러야 승인돼요."(approver_confirm — 승인 시 PRECONDITION_FAILED → 공용 확인창 withOveruseConfirm, [[HBAD251_연차 현황·결재]]·[[HBTM210_연차·휴가 승인 큐]]·직원 앱 결재함 공통) - 「차단」 "남은 연차보다 많으면 접수도 승인도 막아요."(block) • 구 「잔여 초과 신청 차단」 스위치 대체 — 값 없으면 enforceBalanceLimit로 해석, 저장 시 옛 플래그 파생 유지 | resolveLeaveOveruseMode | 신설 (#1143) · 10/13 실측 |
| P30 | 연차를 며칠로 계산할까요? | Radio | 「신청 기간의 달력일 전부」(4인 이하만 선택 가능) / 「실제 근무일만」("근무 유형의 적용 요일이 아닌 날과 공휴일은 빼요. 교대(듀티) 근무자도 공휴일은 빼요.") | computeLeaveDeduction · #1196 판정 | 10/13 실측 |
| P40 | 유형별 차감·병가 경조 차감 | Radio | 「모든 유형을 하루 1일로」/「유형에 설정한 배수대로」(종일 1 · 반차 0.5 · 반반차 0.25) · 「전부 연차에서 차감」/「유형별 설정을 따름」 | leaveReasons 배수 | 10/13 실측 |
| P50 | 마이너스 잔여를 다음 발생 때 자동 상계 | Toggle | • (10/10 머지, #1143) 도움말 "지난 기간에 더 쓴 연차만큼 새 기간 연차에서 빼요(20 발생 − 5 초과 = 15). 연차 대장에 「지난 기간 초과 사용 상계」로 남고 직원에게 알려요."(10/13 실측, 기본 켬) • 동작: 6시간 주기 작업이 새 산정 기간 시작 직원의 지난 기간 마이너스를 NEGATIVE_CARRY(음수) 원장 항목으로 1회 상계(직원·기간당 유니크, 마이그레이션 1969) + 직원 알림. 잔여 공식 불변, breakdown에 「지난 기간 초과 사용 상계」 | leave_ledger_entries NEGATIVE_CARRY | 신설 (#1143) · 10/13 실측 |
| P60 | 기간 중복 신청 차단 · 준비 중 | Toggle | 「기간 중복 신청 차단」("같은 직원이 이미 신청·승인된 기간과 겹치게 신청하면 막아요.") · 「준비 중」 섹션: 「교대 근무 휴일을 듀티 기준으로」(준비 중 배지) | 10/13 실측 |
- 산정 기준 예약제 (2026-09-14 결정, #683 코드 반영): 조직의 연차 산정 기준(회계년도 / 입사일)을 관리자가 「적용 시작일(effectiveFrom)」을 정해 예약한다. 기존의 "코드가 특정 날짜(하드코딩 2027 스위치)에 자동 전환"은 제거됨. 이력표(leave_accrual_basis_changes)가 정본 — 행이 없으면 입사일 기준. 부여 기준 팝업 「적용 기준」 영역 + 설정 카드가 현재값·예약(pending)·이력을 함께 표시하고, 「기준 변경 예약」 모달은 기본값을 현재와 반대 기준으로, 회계년도면 다음 회계일로 시작일을 프리필한다. 기준 라벨 = "회계년도" / "입사일". (코드 반영: 111b27f/#683)
- 신규입사 부여 모드 3종 (#686 코드 반영): 입사 첫해 연차 부여 방식에 세 번째 모드가 추가됨 — (1) 입사 연도에 바로 비례 부여(prorate_in_hire_year) / (2) 입사 첫해 월별 발생 → 다음 회계일 소급 부여(monthly_then_retroactive) / (3) 입사 첫해 월별 발생 → 만 1년 시점 남은 개월 비례 부여(monthly_then_prorate_at_anniversary, 신규). 신규 모드는 부여 금액이 소급 모드와 같고 부여 시점만 회계일 → 입사 1년 시점으로 다르다. (코드 반영: 11c0059/#686)
- 연차 촉진 통지 서식 폴백 (#681, CS-LOC-260914-0002): 연차 촉진 통지에 쓸 Hereby Sign 서식 목록이 비어 있으면 [서식 추가하기] 버튼이 새 창으로 Sign 템플릿 관리 화면을 연다. 서버가 관리 URL을 null로 주면(미설정·내부 주소) 버튼을 숨기고 안내문만 남긴다(Sign 미연동 조직 버튼 무반응 방지, 9/3 QA). (코드 반영: ba9a2dc/#681)
문서 히스토리
- 2026-07-06 최초 작성 - 카나/콸
- 2026-07-10 라이브 기능 검토 반영 (진입 경로 확인, 모달 내부 미오픈) - 카나/콸
- 2026-07-13 버튼 행동 명세 보강 - 카나/콸
- 2026-07-21 GC700 깊이 재작성 - 카나/콸
- 2026-07-21 가독성 패스 (GUIDE §7) - 카나/PM
- 2026-07-21 셀 스타일 확정판 적용 (콸 승인) - 카나/PM
- 2026-07-23 코드 변경 반영(42e22ee·318f7e1·ba2775a) - 카나/콸
- 2026-09-14 leave-accrual 배치 반영 (v0.7.0/#683 산정기준 예약제·#686 신규입사 모드 3종·#681 촉진 서식 폴백) - 카나/콸
- 2026-10-13 (10/10 머지분, #1143 MED-968) 「연차 정책」 탭 실측 채록: 초과 사용 3지선다·자동 상계 스위치 등 — 정책 화면 섹션 신설 - 카나/PM
Data I/O
Server → Client
변수
| 메타 | $ |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 규칙 추가/수정 | yearsOfServiceMin/Max·entitledDays·accrualType·maxDays·name·description | sdk.leaveRule.upsert() (추정) | 근태 관리 |
| 삭제 | ruleId | sdk.leaveRule.delete() (추정) | 근태 관리 |
| 부여 실행 (추정) | 규칙 기반 leave_grants 생성 (batch/스케줄) | (batch) | 시스템 |
외부 통합
| 대상 | 데이터 | 방향 | 비고 |
|---|---|---|---|
| 연차현황 ([[HBAD251_연차 현황·결재]]) | 매칭 규칙 → "산정기준" 컬럼 · 부여 일수 | 소비 | leave_grants |
연차 부여 기준 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 조건1 [근태 관리 권한] 인증 후 연차 탭 "연차 부여 기준" 버튼 진입- CASE01 [미인증]: /admin/signin 리다이렉트 | 인증 세션 · RBAC | |
| 01 | 초기 상태 | - | • 모달 좌측 네비 "연차 부여 기준" 선택 상태 | 라이브 미오픈 | |
| 10 | 부여 기준 그리드 | Grid | • 근속연수 구간별 규칙을 그리드로 표시 (sortOrder 정렬) - CASE01 [규칙 0건]: Empty state (원문 TBU) | leave_entitlement_rules | census · TBU: Empty 원문 |
| ㄴ10 | + 규칙 추가 | Button | • 새 부여 규칙을 생성하는 진입 • 클릭 시: 규칙 폼(20) 열림 (근속연수 시작/끝/부여일수/발생유형/최대일수) | leave_entitlement_rules | |
| ㄴ11 | 근속연수 시작 | Number | • 구간 하한(년) 입력 — 이상 • 입력 시: NOT NULL 필수 | leave_entitlement_rules.yearsOfServiceMin (NOT NULL) | 이상 |
| ㄴ12 | 근속연수 끝 | Number | • 구간 상한(년) 입력 — 미만 • 입력 시: 빈칸 = 무제한 | leave_entitlement_rules.yearsOfServiceMax (nullable) | 미만 · 빈칸=무제한 |
| ㄴ13 | 부여일수 | Number | • 해당 구간 부여 연차 일수(일) 입력 — 수치 규칙 [[POL_연차관리]] 참조 | leave_entitlement_rules.entitledDays (numeric(4,1)) | |
| ㄴ14 | 발생유형 | Dropdown | • 발생 방식 선택 (연간 일괄 / 월별 발생 등, default annual) • 선택 시: CASE01 [월별 발생] → 최대일수(ㄴ15) 상한 적용 | leave_entitlement_rules.accrualType (accrualtype_enum) | TBU: enum 전체 값 |
| ㄴ15 | 최대일수 | Number | • 월별 발생 시 연간 최대 부여 일수 상한 입력 (nullable) • 입력 시: 값 없음 → 상한 없음 | leave_entitlement_rules.maxDays (numeric(4,1)) | 월별 발생 상한 |
| ㄴ16 | 이름 / 설명 | Input | • 규칙 이름 / 설명 입력 (선택) | leave_entitlement_rules.name / description | |
| ㄴ17 | 상태 / 관리 | Badge/Action | • 활성/비활성 배지 + 편집/삭제 액션 • 클릭 시: "편집" → 규칙 폼(20) · "삭제" → 컨펌 후 삭제 | leave_entitlement_rules.isActive | TBU: 삭제 컨펌 문구 |
| 20 | 규칙 폼 | Modal | • 부여 규칙을 생성/수정하는 폼 모달 • 클릭 시: "+ 규칙 추가"/"편집"으로 열림 - CASE01 [저장]: 규칙 생성/갱신 - CASE02 [근속연수 시작 미입력]: 저장 불가 (NOT NULL, 추정) | sdk.leaveRule.upsert() (추정) | TBU: 구간 중첩/공백 검증 UX |
부여 실적 연동
| 항목 | ERD 근거 | 비고 |
|---|---|---|
| 부여 실적 | leave_grants (periodKey·grantedDays·policy) | 규칙 → 실제 부여 레코드 |
| 불변 원장 | LeaveLedgerEntry (append-only, 분 단위, UPDATE/DELETE 트리거 차단) | 잔여 계산 원천 (코드 반영: 318f7e1) |
| 부여 계산 | computeEntitlement (입사일·근속연수, 규칙 없으면 근로기준법 기본값) | 코드 반영: 42e22ee |
| 산정기준 표시 | 매칭 규칙 → [[HBAD251_연차 현황·결재]] "산정기준" 컬럼 (라이브 값 "입사일") | 연차현황 소비 |
| 구간 매칭 | [Min(이상), Max(미만)) 반열린 구간 | Max 빈칸=무제한 |
권한 · 상태 분기 요약
| 시나리오 | 트리거 | 결과 화면 | 비고 |
|---|---|---|---|
CASE01 [조회] | 부여 기준 진입 | 규칙 그리드 | 근태 관리 |
CASE02 [규칙 추가] | "+ 규칙 추가" | 규칙 폼 → 생성 | |
CASE03 [무제한 구간] | 끝(미만) 빈칸 | 상한 없는 구간 | 반열린 구간 |
CASE04 [월별 발생] | 발생유형 = 월별 | 최대일수 상한 적용 | |
CASE05 [권한 없음] | 근태 관리 권한 미보유 | 추가/편집 비활성 (추정) | TBU |
Open Question
| 구분 | 미확인 항목 |
|---|---|
| 모달 전체 | ⚠️ 유형·기준 관리 모달 라이브 미오픈 (s3-attend TAB_NOT_FOUND) → census/ERD 기반, 실화면 대조 필요 |
| 발생유형 | leave_entitlement_rules_accrualtype_enum 전체 값 (annual 외) |
| 최대일수 | 월별 발생 시 최대일수 상한 적용 계산식 → [[POL_연차관리]] 참조 (사양서 정의 금지) |
| 부여 실행 | 부여 실행 트리거 (입사기념일 / 회계연도 batch) |
| 규칙 폼 | 구간 경계 중첩·공백 검증 UX |
| 상태·관리 | 삭제 컨펌 원문 문구 |
| Empty | 규칙 0건 시 Empty state 원문 문구 |