HBAD220_역할 관리·권한 트리
(Hereby) 관리자 패널 > 인사 관리 > 역할 관리
| 메타 | 앱: 관리자 패널 (포트 4001)대상 사용자: 조건1 [최고 관리자] / 조건2 [인사 관리자] (권한 "역할 관리")프로토타입: TBU관련 정책: [[POL_권한(RBAC)]] · [[POL_역할 관리]] · [[POL_급여정본경계]]Status: reviewOwner: 카나 |
개요
역할 관리는 테넌트 커스텀 역할(roles)과 세분화 권한 트리(permissions — 리소스 × 액션 × scope)를 관리한다. 역할 카드 목록 + 역할 추가/수정 모달(권한 선택 트리)로 구성된다. 권한은 리소스(약 33종) × 액션(관리/조회/수정/승인/계산) × scope(본인/팀/전체) 조합의 PermissionToken이다 (예: 급여담당 매니저 = 53개 권한 선택됨). 권한 라벨 ↔ 급여 시트(HBHR) 매핑: 전체확정 → "급여 승인", 컬럼 계산 → "급여 계산", 시트 편집 → "급여 관리", 조회 → "급여 조회" ([[POL_급여정본경계]]). 내부 토큰 key(payroll:*)는 추정.
문서 히스토리
- 2026-07-06 최초 작성 - 카나/콸
- 2026-07-13 버튼 행동 명세 보강 - 카나/콸
- 2026-07-21 GC700 깊이 재작성 (권한 트리 n/m 카운터 프로브 반영) - 카나/콸
- 2026-07-21 셀 스타일 확정판 적용 (콸 승인) - 카나/PM
Data I/O
Server → Client
변수
| 메타 | ${roles} |
| 메타 | ${permission_tree} |
| 메타 | ${role_permissions} |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 역할 생성/수정 | 역할명 · 설명 · 상태 · 권한[] | sdk.role.upsert() (추정) | role:write (라벨 "역할 관리", 추정) |
| 역할 삭제 | roleId | sdk.role.delete() (추정) | role:write (추정) |
| 전체 선택/해제 | permission[] 토글 | (클라 트리 조작) |
메인 화면 사양표 (역할 관리)
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 조건1 [역할 관리 권한] 보유 시 사이드바 인사 관리 > "역할 관리" 노출. 미보유 시 hide | [[HBAD100_App Shell·사이드바]] | |
| 01 | 초기 상태 | Output | • 역할 카드 목록 표시 (필터 "전체") | ||
| 10 | 역할 카드 목록 | List | • 테넌트 커스텀 역할을 카드로 나열: 역할명 / 설명 / 활성 배지 / 편집 / 삭제 / 펼침. 라이브 카드: 사용자 / 급여담당 매니저 / test / test - CASE01 [활성]: 정상 표기 - CASE02 [비활성]: 카드 회색 처리 | roles | 테넌트 커스텀 |
| 10-E | 목록 Empty | State | • 검색 결과 0건 시 "검색 결과가 없어요" (정책 문구). 라이브 원문 프로브 미확인 | TBU (라이브 확인 필요) | |
| ㄴ11 | 목록 컨트롤 | Button | • 목록 상단 컨트롤: "+ 역할 추가" / 상태 필터(전체/활성/비활성) / 역할 검색(placeholder "역할") / 페이지네이션 "총 4건 중 1-4건" • "+ 역할 추가" 클릭 시: "역할 추가" 모달(신규) 노출 | 페이지네이션 | |
| ㄴ12 | 편집 | Button | • 카드의 역할 수정 진입 버튼. 원문 "편집" • 클릭 시: "역할 수정" 모달 노출 (기존값 프리필) | roles / role_permissions | |
| ㄴ13 | 삭제 | Button | • 카드의 역할 삭제 버튼(파괴적—기존 기록). 원문 "삭제" • 클릭 시: 컨펌 후 삭제 - CASE01 [일반 역할]: 삭제 가능 - CASE02 [최고 관리자(admin) 역할]: 삭제 버튼 비활성 + 툴팁(정책 "최고 관리자는 삭제할 수 없어요.") - CASE03 [해당 역할 보유 직원 존재]: 정책상 삭제 불가 — 라이브 실차단 문구 프로브 미확인 | roles | admin 차단은 정책·툴팁 TBU |
| ㄴ14 | 펼치기 | Toggle | • 카드 권한 요약을 인라인으로 여닫는 토글, 기본 닫힘. 원문 "펼치기" • 클릭 시: 카드 권한 요약 섹션 펼침(인라인) | role_permissions |
역할 추가·수정 모달 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • "+ 역할 추가"(신규) 또는 카드 "편집"(수정) 클릭 시 노출. 모달 제목: 신규 "역할 추가" / 편집 "역할 수정" | 추가/편집 공용 | |
| 10 | 역할명 * | Input | • 역할 이름을 지정하는 필수 항목. 원문 "역할명 *", placeholder "역할" • 입력 시: 값 없음이면 저장 버튼 비활성 | roles.name | 필수 |
| 20 | 설명 | Input | • 역할 설명을 기록하는 선택 항목. 원문 "설명", placeholder "설명" • 입력 시: 설명 기록 | roles.description (추정) | |
| 30 | 상태 | Dropdown | • 역할 활성/비활성 상태를 지정, 기본 "활성". 원문 "활성" / "비활성" • 선택 시: 상태 확정. 값 없음: 기본 활성 | roles.isActive | 값 없음: 기본 활성 |
| 40 | 권한 선택 트리 | Checkbox Tree | • 리소스 그룹 → 액션 체크박스로 권한을 선택하는 트리. 원문 "권한 선택". 그룹별 선택 카운터 "{선택}/{전체}" (예 "수당 0/2", "근태 0/7", "직원 0/6", "문서 0/5", "부서 0/3", "연차/휴가 0/4") • 선택 시: 해당 권한 토큰 체크. 상단 "전체 선택" 토글 — CASE01 [해제 상태]: 전체 선택 / CASE02 [선택 상태]: 전체 해제 | permissions · role_permissions | 약 33 리소스 |
| ㄴ41 | 선택 카운트 | Text | • 저장 시 "{n}개 권한 선택됨" (급여담당 매니저 = 53개). 그룹별 "{n}/{m}" 실시간 갱신 | role_permissions | |
| 50 | admin 역할 편집 제약 | - | • CASE01 [최고 관리자(admin) 역할 수정 모달]: 상태·권한 선택 수정 불가(정책). 역할명·설명은 공통 | roles | 정책 근거, 라이브 프로브 미확인 |
| 60 | 저장 | Button | • 선택 권한으로 역할을 확정하는 버튼. 원문 "저장" • 클릭 시: role_permissions 갱신- CASE01 [성공]: 저장 후 모달 닫힘 - CASE02 [역할명 미입력]: 버튼 비활성 - CASE03 [수정 없음]: 버튼 비활성(편집) | role_permissions | 실패 TBU |
| 70 | 취소 | Button | • 변경 없이 모달을 닫는 버튼. 원문 "취소" • 클릭 시: 모달 닫힘 | ||
| 80 | 이탈 가드 | Dialog | • dirty 상태 이탈 시 노출되는 확정 게이트. 원문 "변경된 내용을 저장하지 않고 나가시겠어요?" (계속 편집 / 나가기) | 7/10 확인 (확정 게이트) |
권한 카탈로그 (리소스 × 액션 × scope) — 라이브 확인
| 리소스 | 액션(scope) | 그룹 카운트 |
|---|---|---|
| 수당 | 관리 / 조회 | 0/2 |
| 공제 | 관리 / 조회 | 0/2 |
| 급여 | 승인 / 계산 / 관리 / 조회 / 조회(본인) | (프로브 하단 미노출) |
| 호봉 | 관리 / 조회 | |
| 고정 인센티브 | 관리 / 조회 | 0/2 |
| 인센티브 | 승인(팀) / 조회 / 조회(본인) / 조회(팀) / 수정 / 수정(본인) | |
| 연말정산 | 관리 / 조회 | |
| 근태 | 승인 / 관리 / 조회 / 조회(본인) / 조회(팀) / 수정 / 수정(본인) | 0/7 |
| 초과근무 | 승인(팀) / 관리 / 조회 / 조회(본인) / 조회(팀) / 수정 / 수정(본인) | |
| 외근 | 승인(팀) / 관리 / 조회 / 조회(본인) / 조회(팀) / 수정 / 수정(본인) | |
| 연차/휴가 | 승인(팀) / 조회(본인) / 조회(팀) / 수정(본인) | 0/4 |
| 휴가 신청 | 승인 / 관리 / 조회 / 수정 | |
| 간호 스케줄 | 관리 / 조회 | |
| 스케줄 | 조회(전체/본인/팀) / 수정(전체/본인/팀) | |
| 직원 | 관리 / 조회 / 조회(본인) / 조회(팀) / 수정 / 수정(본인) | 0/6 |
| 부서 | 관리 / 조회 / 수정 | 0/3 |
| 팀 | 관리 / 조회 | |
| 역할 | 관리 / 조회 | |
| 자격증 | 조회(본인) / 수정(본인) | 0/2 |
| 교육 | 조회(본인) / 수정(본인) | 0/2 |
| 교육비 지원 | 관리 / 조회 | 0/2 |
| 문서 | 관리 / 조회 / 조회(본인) / 수정 / 수정(본인) | 0/5 |
| 대화 | 조회 / 수정 | 0/2 |
| 메시지 | 조회 / 수정 | |
| 알림 | 조회 / 조회(본인) / 수정 / 수정(본인) | |
| 총무 | 관리 / 조회 / 수정 | |
| 재고 | 관리 / 조회 | |
| 퇴직 | 관리 / 조회 | |
| 기관 | 조회 / 수정 | |
| 파일 | 조회 / 수정 | |
| 설정 | 수정 | |
| 시스템 | 시스템 관리자 |
scope 체계
| scope | 범위 | 비고 |
|---|---|---|
| 본인 | 자기 데이터만 | 최하위 |
| 팀 | 소속 팀 범위 | 중간 |
| 전체 | 테넌트 전체 | 최상위 |
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 화면 | 비고 |
|---|---|---|---|
CASE01 [역할 추가] | "+ 역할 추가" | 역할 추가 모달 (신규) | 권한 "역할 관리" |
CASE02 [권한 저장] | 권한 트리 선택 → 저장 | role_permissions 갱신, "{n}개 권한 선택됨" | |
CASE03 [미저장 이탈] | dirty 후 닫기 | 가드 "변경된 내용을 저장하지 않고 나가시겠어요?" (계속 편집 / 나가기) | 7/10 확인 |
CASE04 [admin 역할] | 삭제/수정 시도 | 삭제 버튼 비활성(툴팁) · 상태/권한 수정 불가 | 정책 근거, 라이브 TBU |
Open Question
- 권한 토큰 내부 key 실제 값 (급여:승인 등 라벨만 확인) = TBU
- 액션 라벨(관리/조회/수정/승인/계산) 최종 상하관계·포함 규칙 = TBU (콸도 미확정)
- 리소스 총 개수 확정 (약 33 중 census 32건 인용) = TBU
- 팀 권한(team_permissions) ↔ 역할 권한 병합 우선순위 = TBU
- 역할 저장 실패·역할명 중복 에러 동작 (라이브 프로브 없음) = TBU
- 목록 Empty("검색 결과가 없어요") 라이브 원문 = TBU
- admin 역할 삭제 툴팁·수정 제약 라이브 확인 = TBU