HBAD261_유형 설정 (연장근무·외근·휴가)
(Hereby) 관리자 패널 > 근태 현황 > 유형·기준 관리 모달 > 유형 설정 (연장근무·외근·휴가)
| 메타 | 앱: 관리자 패널 (HBAD)대상 사용자: 조건1 [근태 관리] (설정 수정)프로토타입: TBU관련 정책: [[POL_연장근무]] · [[POL_외근]] · [[POL_휴가유형]]Status: draft (모달 내부 라이브 미확인)Owner: 카나 |
개요
유형 설정은 근태 유형 마스터로, 연장근무 유형 / 외근 유형 / 휴가 유형 3개 섹션을 관리한다.각 섹션은 근태 현황 해당 탭의 버튼(연장근무 탭 "연장 근무 유형" / 외근 탭 "외근 유형" / 연차 탭 "휴가 유형") → "유형·기준 관리" 모달의 해당 섹션으로 진입한다.연장근무 유형은 지급 배율(overtime_types.multiplier), 외근 유형은 이름·활성(offsite_work_types), 휴가 유형은 차감 일수/시간을 정의한다. ⚠️ 모달이 라이브 프로브에서 미오픈(s3-attend TAB_NOT_FOUND) → 내부 census/ERD 기반, TBU 다수.
문서 히스토리
- 2026-07-06 최초 작성 - 카나/콸
- 2026-07-10 라이브 기능 검토 반영 (진입 버튼 3종 확인, 모달 내부 미오픈) - 카나/콸
- 2026-07-13 버튼 행동 명세 보강 - 카나/콸
- 2026-07-21 GC700 깊이 재작성 - 카나/콸
- 2026-07-21 TC 크로스체크 확정분 반영 (🟡 — 휴가 유형 원천 leaveReasons·legacy enum 거부 규칙) - 카나/콸
- 2026-07-21 가독성 패스 (GUIDE §7) - 카나/PM
- 2026-07-21 셀 스타일 확정판 적용 (콸 승인) - 카나/PM
- 2026-07-23 코드 변경 반영(318f7e1·3e64304) - 카나/콸
- 2026-07-24 코드 변경 반영(04b1b82·7e16a37) - 카나/콸
- 2026-07-25 코드 변경 반영(e3bf22d) — 휴가 유형 코드 3글자 상한(초과 시 문구 안내·저장 차단)·폼 스케줄러 설정 재그룹 - 카나/콸
- 2026-07-30 코드 변경 반영(0c2f4fe) - 카나/PM
Data I/O
Server → Client
변수
| 메타 | $ |
| 메타 | $ |
| 메타 | $ |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 연장근무 유형 추가/수정 | name·description·multiplier(필수)·isActive | sdk.overtimeType.upsert() (추정) | 근태 관리 |
| 외근 유형 추가/수정 | name·description·isActive | sdk.offsiteType.upsert() (추정) | 근태 관리 |
| 휴가 유형 추가/수정 | leaveReasons[] (leaveReasonSchema) = 이름·설명·연차 차감(annualDeduction)·시간 설정(usageMinutes)·스케줄러 연동(코드·색상)·연차 산정일수 포함·유급인정 시간(paidHours)·휴게시간(breakHours)·개인 정보(privacy·maskedName)·증명 자료(evidence)·특별 휴가(specialLeave)·활성 (0c2f4fe 개편, 구 유급무급·근무유형제한·적용 팀 제거) | organization.updateSettings({leaveReasons}) — org 설정 key-value로 저장, 직원 앱 picker는 auth.getCurrentUser().leaveReasons로 소비 (코드 반영: 0c2f4fe) | 근태 관리 |
| 삭제 | id | sdk.*.delete() (추정 — 휴가 유형은 leaveReasons 배열 갱신으로 처리 추정) | 근태 관리 |
연장근무 유형 섹션 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 조건1 [근태 관리 권한] 인증 후 연장근무 탭 "연장 근무 유형" 버튼 진입- CASE01 [미인증]: /admin/signin 리다이렉트 | 인증 세션 · RBAC | |
| 01 | 초기 상태 | - | • 모달 좌측 네비 "연장근무 유형" 선택 상태 | 라이브 미오픈 | |
| 10 | 연장근무 유형 그리드 | Grid | • 연장근무 유형을 그리드로 표시 — 컬럼(census): 이름 / 설명 / 배율 * / 상태 / 관리 - CASE01 [유형 0건]: Empty state (원문 TBU) | overtime_types · [[HBAD252_연장근무 현황·결재]] | census · TBU: Empty 원문 |
| ㄴ11 | + 유형 추가 | Button | • 새 연장근무 유형을 생성하는 진입 • 클릭 시: 연장근무 유형 폼(이름/설명/배율*) 열림 → 저장 시 생성 | overtime_types | |
| ㄴ12 | 이름 / 설명 | Input | • 연장근무 유형명 / 설명 입력 | overtime_types.name / description | |
| ㄴ13 | 배율 | Number | • 지급 배율 입력 (×1.5 등, default 1.5) — 급여 반영 • 입력 시: "배율 *" 필수, 미입력 시 저장 불가(추정) | overtime_types.multiplier (numeric(5,2)) | 필수 · 급여 반영 · [[POL_연장근무]] |
| ㄴ14 | 상태 / 관리 | Badge/Action | • 활성/비활성 배지 + 편집/삭제 액션 • 클릭 시: "편집" → 유형 폼 · "삭제" → 컨펌 후 삭제 | overtime_types.isActive | TBU: 삭제 컨펌 문구 |
외근 유형 섹션 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 20 | 외근 유형 그리드 | Grid | • 외근 유형을 그리드로 표시 — 컬럼(census): 이름 / 설명 / 상태 / 관리 - CASE01 [유형 0건]: Empty state (원문 TBU) | offsite_work_types · [[HBAD253_외근 현황]] | census · TBU: Empty 원문 |
| ㄴ21 | + 유형 추가 | Button | • 새 외근 유형을 생성하는 진입 • 클릭 시: 외근 유형 폼(이름/설명) 열림 → 저장 시 생성 | offsite_work_types | |
| ㄴ22 | 이름 / 설명 | Input | • 외근 유형명 / 설명 입력 | offsite_work_types.name / description | |
| ㄴ23 | 상태 / 관리 | Badge/Action | • 활성/비활성 배지 + 편집/삭제 액션 • 클릭 시: "편집" → 유형 폼 · "삭제" → 컨펌 후 삭제 | offsite_work_types.isActive / sortOrder | TBU: 삭제 컨펌 문구 |
휴가 유형 섹션 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 30 | 휴가 유형 그리드 | Grid | • 휴가 유형을 그리드로 표시. 원천 = org 설정 leaveReasons[] (leaveReasonSchema, 코드 반영: 318f7e1). 컬럼(원문, 0c2f4fe 개편): 이름 / 설명 / 코드 / 연차 차감 / 스케줄러 연동 / 상태 / 연차 산정일수 포함 / 유급인정 시간 / 관리- "연차 차감" 컬럼은 구 "차감 방식" 컬럼을 대체 — Y/N 표기(leaveReasonDeductsAnnual) - 모델 정정: 구 서술( {hours, deductionDays} 절대 시간)은 대체됨 — 신모델 = 유형에 차감 배수만 보유(종일 1 / 반차 0.5 / 반반차 0.25 / 차감 없음 0, 상한 1). 절대 시간 없음 → 8h 상근 vs 12h 교대에서 반차가 4h/6h로 파생. 시간 단위(hourly) 유형은 신청 시 입력 시간이 차감량- CASE01 [유형 0건]: Empty state "등록된 휴가 유형이 없어요. 휴가 유형을 추가해 주세요." - CASE02 [커스텀 사유 설정됨]: 직원 앱 휴가신청([[HBEA410_휴가·오프 신청]])은 커스텀 사유 id만 수용 — legacy LeaveType enum(ANNUAL 등) 전달 시 "Invalid leave type" 거부 | organization settings.leaveReasons · [[HBAD251_연차 현황·결재]] | 컬럼 개편·Empty 원문 (코드 반영: 0c2f4fe) |
| ㄴ31 | + 유형 추가 | Button | • 새 휴가 유형을 생성하는 진입 • 클릭 시: "휴가/연차 유형" 폼 모달 열림 → 저장 시 생성. 폼 구성(원문, 0c2f4fe 개편): 이름* / 설명 / 연차 차감*("연차 잔여에서 차감해요" 체크 + "시간 설정" 셀렉트, 안내 "8시간은 1일로 계산해요.") / 스케줄러 연동(Y일 때만 코드*·라벨 색상 노출, "오프(비번)일에도 신청 허용") / "연차 산정일수에 포함" / "유급인정 시간" / 휴게시간 설정 / 추가 설정 아코디언 / 상태 • 상단 안내(원문): "여기서 바꾼 차감 설정은 앞으로 승인되는 휴가부터 적용돼요. 이미 승인·사용된 휴가는 승인 당시 기준으로 계산돼 있어 소급 변경되지 않아요." | leaveReasonSchema (코드 반영: 0c2f4fe) | 폼 개편 (코드 반영: 0c2f4fe) |
| ㄴ32 | 연차 차감 · 시간 설정 | Input | • 연차 차감 필수 — 체크박스 "연차 잔여에서 차감해요"(annualDeduction) + "시간 설정" 셀렉트(usageMinutes, 안내 "8시간은 1일로 계산해요.") • 저장 매핑: 연차 차감+시간 설정 → deductionRate 파생 (app.ts _commitLeaveReason). 배수 개념(종일 1 / 반차 0.5 / 반반차 0.25 / 차감 없음 0, 상한 1)은 유지되며 시간 설정으로 파생• 제거: 구 폼의 "유급 여부"(유급/무급 구분)·"사용 가능 근무 유형"·"적용 팀" 필드 제거 (0c2f4fe) | leaveReasonSchema.annualDeduction / usageMinutes (코드 반영: 0c2f4fe) | 모델 개편 — 시간 설정 신규·구필드 제거 (0c2f4fe) |
| ㄴ38 | 휴게시간 설정 | Input | • "휴게시간 설정" — 체크박스 "근로자 휴게 시간 선택 허용"(breakChoiceAllowed) + "휴게 시간" 시간(0~8)·분(0~59) 입력(breakHoursPart / breakMinutesPart) • 안내(원문): "근로기준법 제54조에 따라 4시간 근로 시 30분 이상의 휴게시간 부여가 필수예요. 단 근로자의 명시적 요청 시 휴게시간 없이 4시간 근무 후 즉시 퇴근이 가능해요." | leaveReasonSchema(breakHours) · [[HBEA410_휴가·오프 신청]] | 신규 (코드 반영: 0c2f4fe) |
| ㄴ39 | 개인 정보 설정 (privacy) | Toggle | • 추가 설정 아코디언 내 "개인 정보 설정"(privacyMasked) — 켜면 당사자·결재자 외에는 "대체 표시명"(maskedName, 필수)으로 노출 • 안내(툴팁 원문): "당사자와 결재자 외에는 대체명으로 노출되는 기능이에요." | leaveReasonSchema(privacy·maskedName) | 신규 (코드 반영: 0c2f4fe) |
| ㄴ40 | 증명 자료 제출 | Toggle | • 추가 설정 아코디언 내 "증명 자료 제출"(evidenceRequired) — 특정 유형에 증빙 제출 지정 • 안내(원문): "이 휴가를 신청할 때 증명 자료를 제출할 수 있어요. 파일은 최대 10개까지 등록할 수 있어요." | leaveReasonSchema(evidence) · [[HBEA410_휴가·오프 신청]] | 신규 (코드 반영: 0c2f4fe) |
| ㄴ41 | 특별 휴가 설정 | Toggle | • 추가 설정 아코디언 내 "특별 휴가 설정"(specialLeave) — 특정 직원/팀에게만 할당하는 유형 • 안내(원문): "켜면 Works > 결재 > 휴가 신청의 휴가 유형 목록에 보이지 않아요. 특정 직원/팀에게 부여한 경우에만 그 대상에게 보여요." | leaveReasonSchema(specialLeave) | 신규 (코드 반영: 0c2f4fe) |
| ㄴ42 | 유급인정 시간 | Toggle | • "유급인정 시간"(paidHours) 체크 — 급여 지급 기준 시간에 실근무+유급휴가 시간 합산 • 안내(툴팁 원문): "급여 지급의 기준이 되는 시간으로, 실제 근무시간과 유급휴가 시간이 합산돼요." | leaveReasonSchema(paidHours) · 급여 산정(HBHR) | 신규 (코드 반영: 0c2f4fe) |
| ㄴ35 | 기본 시간 (defaultMinutes) | Number | • 시간 단위(hourly) 유형에 기본 사용 시간을 설정하는 속성 (30분 단위 조정). 직원 신청 폼([[HBEA410_휴가·오프 신청]])에서 유형 선택 시 사용 시간에 프리필 • 입력 시: 30분 단위 기본 사용 시간 설정 | leaveReasonSchema.defaultMinutes · [[HBEA410_휴가·오프 신청]] | 신규 (코드 반영: 04b1b82) · 기획 "유형 선택 시 설정 시간 기본 표시" 구현 |
| ㄴ36 | 신청 가능 팀 제한 | Select | • 유형별 적용 팀을 선택해 신청 가능 범위를 제한하는 속성. 활성 팀 멤버십 기준으로 검증, 미허용 팀 소속 직원의 신청 차단(백엔드 검증) • 선택 시: 유형에 허용 팀 지정 - CASE01 [미허용 팀 신청]: 서버에서 신청 차단 | leaveReasonSchema (허용 팀) · [[HBEA410_휴가·오프 신청]] | 신규 (코드 반영: 7e16a37) · 활성 팀 멤버십 검증 |
| ㄴ37 | 유형 코드 (3글자 상한) | Input | • 휴가 유형 코드 = 근무표 셀·배지에 들어가는 짧은 식별자. 입력·목록·셀 상한을 3글자로 통일 • 입력 시: 3글자 초과분을 maxlength로 조용히 자르지 않고 문구로 알리고 저장 차단 - CASE01 [초과 입력]: 안내 문구 노출 + 저장 차단 - CASE02 [상한 도입 전 저장된 긴 코드 편집]: 같은 문구로 안내(막다른 길 방지) | leaveReasonSchema (코드) · 근무표 셀·배지 | 신규 (코드 반영: e3bf22d) · maxlength 자름 아님·저장 차단 |
| ㄴ33 | 상태 / 관리 | Badge/Action | • 활성/비활성 배지 + 편집/삭제 액션 • 클릭 시: "편집" → 유형 폼 · "삭제" → 컨펌 후 삭제 | leaveReasonSchema.active | TBU: 삭제 컨펌 문구 |
| ㄴ34 | 휴일 준수 표시 | Output | • 휴가 설정 패널에 휴일 준수(holiday compliance) 표시 노출 (코드 반영: 3e64304) | 법정유급휴일 정책 | 세부 UI TBU |
유형별 원천 매핑
| 섹션 | ERD 원천 | 소비 화면 |
|---|---|---|
| 연장근무 유형 | overtime_types (multiplier) | [[HBAD252_연장근무 현황·결재]] |
| 외근 유형 | offsite_work_types | [[HBAD253_외근 현황]] |
| 휴가 유형 | organization settings leaveReasons[] (leaveReasonSchema: 이름·차감 배수·유급무급·잔여차감·근무유형제한·활성, 구 {hours, deductionDays} 대체) — organization.updateSettings로 저장, auth.getCurrentUser().leaveReasons로 소비 (코드 반영: 318f7e1 / TC 확정: leave-request-custom-reason.test.ts) | [[HBAD251_연차 현황·결재]] · [[HBEA410_휴가·오프 신청]] |
권한 · 상태 분기 요약
| 시나리오 | 트리거 | 결과 화면 | 비고 |
|---|---|---|---|
CASE01 [조회] | 유형 섹션 진입 | 유형 그리드 | 근태 관리 |
CASE02 [추가] | "+ 유형 추가" | 유형 폼 → 생성 | |
CASE03 [유형 없음] | 유형 0건 | Empty state (문구 TBU) | |
CASE04 [권한 없음] | 근태 관리 권한 미보유 | 추가/편집 비활성 (추정) | TBU |
Open Question
| 구분 | 미확인 항목 |
|---|---|
| 모달 전체 | ⚠️ 유형·기준 관리 모달 라이브 미오픈 (s3-attend TAB_NOT_FOUND) → census/ERD 기반, 실화면 대조 필요 |
| 휴가 유형 | leaveReasons[] 배열 (TC 확정: leave-request-custom-reason.test.ts). 잔여: 본 모달 UI가 이 배열을 편집하는지 실화면 대조 |
| 휴가 유형 | 차감 일수/시간 산정 규칙 (반차 0.5일, 시간휴가 환산) → [[POL_휴가유형]] 참조 (사양서 정의 금지) |
| 연장근무 유형 | 배율 ↔ overtime_records.category 매핑 → [[POL_연장근무]] 참조 |
| 3개 섹션 공통 | 각 섹션 Empty state 원문 문구 |
| 3개 섹션 공통 | 삭제 컨펌 원문 문구 |