Skip to content

HBAD210_팀 관리

(Hereby) 관리자 패널 > 인사 관리 > 팀 관리

메타앱: 관리자 패널 (포트 4001)대상 사용자: 조건1 [최고 관리자] / 조건2 [인사 관리자] (권한 "팀 관리" / "팀 조회")프로토타입: TBU관련 정책: [[POL_권한(RBAC)]] · [[POL_테넌트·조직]] · [[POL_팀 관리]]Status: reviewOwner: 카나

개요

팀 관리는 조직 팀 계층 트리(teams + parentTeamId)와 전체 구성원(team_members)을 관리한다. 좌측 팀 트리(조직 루트 노드 + 팀 계층, 각 노드 인원수) + 우측 구성원·팀 상세로 구성된다. 팀은 상위 팀·팀장(leader)·설명·상태(활성/비활성)를 가지며, 직원은 멀티 소속으로 여러 팀에 배정될 수 있다 (n:m). 좌측 트리 루트는 조직 루트 노드(조직명 + 전체 인원)이며, 그 아래에 팀 계층이 인원수와 함께 표시된다. 루트 선택 시 우측은 "전체 구성원", 팀 선택 시 해당 팀 상세를 표시한다.

문서 히스토리

  • 2026-07-06 최초 작성 - 카나/콸
  • 2026-07-10 라이브 기능 검토 반영 (7/10 diff) - 카나/콸
  • 2026-07-13 버튼 행동 명세 보강 - 카나/콸
  • 2026-07-21 GC700 깊이 재작성 - 카나/콸
  • 2026-07-21 가독성 패스 (GUIDE §7) - 카나/PM
  • 2026-07-21 셀 스타일 확정판 적용 (콸 승인) - 카나/PM
  • 2026-07-22 코드 변경 반영(d522367·e0caa04) - 카나/콸

Data I/O

Server → Client

변수

메타${team_tree}
메타${members}
메타${team_detail}

Client → Server

액션전달 값tRPC procedure권한 토큰
팀 추가/수정상위 팀 / 팀명 / 설명 / 상태 / 팀장sdk.team.upsert() (추정)team:write (라벨 "팀 관리", 토큰 추정)
팀 삭제teamIdsdk.team.delete() (추정)team:write (추정)
멤버 배정employeeId · teamId · roleIdteam_members 생성 (추정)team:write (추정)
명단 다운로드필터 조건export (추정)team:read (추정)

외부 통합

외부 시스템데이터방향비고
전 앱 (HR·직원 앱·스케줄러)teams / team_members 소속 소비Admin(원천) → 소비팀은 조직 SoT

메인 화면 사양표 (팀 관리)

번호항목/기능명타입사양 및 기능 설명연관/영향 범위비고
00노출 조건-조건1 [팀 관리/조회 권한] 보유 시 사이드바 인사 관리 > "팀 관리" 노출. 권한 없으면 사이드바 항목 hide[[HBAD100_App Shell·사이드바]]권한 미보유 시 진입 불가
01초기 상태Output• 좌측 팀 트리(조직 루트 선택 상태) + 우측 "전체 구성원" 표시
10팀 트리Tree• 조직 루트 노드 + 그 아래 팀 계층·각 노드 인원수를 표시하는 좌측 네비
• 클릭 시: 노드 선택으로 우측 패널 전환
 - CASE01 [루트 선택]: 우측 "전체 구성원"
 - CASE02 [팀 선택]: 우측 팀 상세
teams (parentTeamId)
ㄴ11조직 루트 노드Node• 트리 최상단 조직명 + 전체 인원 (라이브 예: "분당베스트병원 update 295")
• 클릭 시: 우측 "전체 구성원" 표시
teams 루트7/10 확인
ㄴ12팀 노드Node• 팀명 + 인원수 표시 노드
• 클릭 시: 우측 팀 상세 전환. 값 없음: 하위 팀 0건이면 루트만 표시
teams
10-E트리 EmptyState• 하위 팀 0건 시 루트 노드만 노출 (하위 목록 없음)TBU: 트리 Empty 문구
20팀 추가 (트리 버튼)Button• 트리 상단에서 새 팀을 생성하는 진입 버튼. 원문 "팀 추가"
• 클릭 시: "팀 추가" 모달 노출 (선택 노드가 상위 팀 default)
 - CASE01 [루트 선택 중]: 최상위 하위 팀 추가
 - CASE02 [팀 선택 중]: 해당 팀 하위 추가
teams.parentTeamId
30전체 구성원 (루트 선택)Grid• 루트 선택 시 우측에 조직 전체 구성원을 보여주는 그리드. 헤더 "전체 구성원" + "직원 추가" / "명단 다운로드" / "팀 추가". 컬럼: 사번 / 이름 / 이메일 / 팀 · 역할 / 상태 / 관리
• "명단 다운로드" 클릭 시: 즉시 실행(컨펌 없음), 성공: 파일 다운로드(화면 무변화)
team_members6컬럼 · 직원 추가 버튼 추가(코드 반영: d522367·e0caa04)
ㄴ30-1직원 추가 (조직 레벨)Button• 조직(팀) 탭에서 직원을 신규 등록하는 진입 버튼 (기존엔 직원 관리 메뉴에서만 가능)
• 클릭 시: 직원 등록 위저드(HBAD201) 오픈
[[HBAD201_직원 추가·수정 모달]]신설 · 7/21 베스트 실무진 요구("팀 관리 안에서 직원 추가") 당일 반영 (코드 반영: d522367·e0caa04)
ㄴ30-2직원 수정 (조직 레벨)Button• 조직 탭 구성원 행에서 직원 정보를 수정하는 기능 (기존엔 직원 관리에서만)
• 클릭 시: 직원 수정 모달(HBAD201) 오픈
[[HBAD201_직원 추가·수정 모달]]신설 (코드 반영: d522367·e0caa04)
ㄴ31팀 · 역할 셀Cell• 멤버의 소속 팀·역할을 계층 chip으로 표기. 멀티 소속 시 다중 chipteam_members n:m
ㄴ32상태 셀Badge• 멤버 재직 상태 배지: CASE01 [재직] / CASE02 [비활성] / CASE03 [휴직] / CASE04 [퇴직]employees.statusTBU: 상태 값 목록
30-E전체 구성원 EmptyState• 구성원 0건 시 Empty 표기TBU: Empty 원문 문구
40팀 상세 (팀 선택)Detail• 팀 노드 선택 시 우측에 표시되는 팀 상세. 헤더 "총 n명 • 팀장 {이름}" + "직원 추가" / "멤버 명단 다운로드" / "팀 멤버 추가" + 멤버 테이블(동일 6컬럼) + 팀 편집 / 팀 삭제 아이콘
• "멤버 명단 다운로드" 클릭 시: 즉시 실행, 성공: 파일 다운로드(화면 무변화)
• "팀 멤버 추가" 클릭 시: 멤버 배정(team_members 생성)
teams · team_members직원 추가 버튼 추가(코드 반영: d522367·e0caa04)
ㄴ40-1직원 추가 (팀 레벨)Button• 팀 상세(팀 레벨 컨텍스트)에서 직원을 신규 등록하는 진입 버튼. "팀 멤버 추가"(기존 소속 배정)와 별개로 신규 직원 등록
• 클릭 시: 직원 등록 위저드(HBAD201) 오픈
[[HBAD201_직원 추가·수정 모달]]신설 · 조직/팀 양쪽 컨텍스트 노출 (코드 반영: d522367·e0caa04)
ㄴ41멤버 Empty stateState• 멤버 0건 시 원문 "멤버가 없어요. + 팀 멤버 추가 로 시작해요."team_members 부재7/10 확인
ㄴ42팀 편집 아이콘Button• 팀 상세 헤더의 title 아이콘
• 클릭 시: 팀 편집 폼 노출(상위 팀/팀명/설명/상태/팀장, 기존값 프리필)
teams
ㄴ43팀 삭제 아이콘Button• 팀 상세 헤더의 title 아이콘
• 클릭 시: 컨펌 "팀을 삭제하시겠어요?"
 - CASE01 [하위/멤버 없음]: 삭제 실행
 - CASE02 [하위 팀·멤버 존재]: 정책상 삭제 불가([[POL_팀 관리]]) — 라이브 실차단 문구 프로브 미확인
teams삭제 컨펌 7/10 확인
50병동 관계-• 팀 ↔ 병동(wards) 관계(간호부 하위 병동) 연결 여부[[HBAD230_병동 관리]]TBU

팀 추가·편집 모달 사양표

번호항목/기능명타입사양 및 기능 설명연관/영향 범위비고
00노출 조건-• "팀 추가"(트리/그리드) 또는 팀 편집 아이콘 클릭 시 노출추가/편집 공용
10상위 팀Dropdown• 팀 계층 부모를 지정하는 항목. 원문 "상위 팀"
• 선택 시: 부모 팀 확정. CASE01 [트리에서 팀 선택 중]: 해당 팀 default
teams.parentTeamId
20팀명 *Input• 팀 이름을 지정하는 필수 항목. 원문 "팀명 *"
• 입력 시: 값 없음이면 저장 불가. 중복 시 처리(정책상 안내 문구)는 프로브 미확인
teams.name필수 · 에러 TBU
30설명Input• 팀 설명을 기록하는 선택 항목. 원문 "설명"
• 입력 시: 설명 기록
teams.description (추정)
40상태Dropdown• 팀 활성/비활성 상태를 지정하는 항목, 기본 "활성"
• 선택 시: 상태 확정. 값 없음: 기본 활성
teams.isActive (추정)값 없음: 기본 활성
50팀장Picker• 팀 리더를 지정하는 항목(이름/사번 검색). 원문 "팀장"
• 선택 시: 리더 확정. 미지정 허용 여부 = TBU
teams.leaderId
60멤버 추가 안내Guide• 원문 "팀에 직원을 추가하려면 생성된 팀 페이지의 팀 멤버 추가 버튼을 이용하거나, 직원 관리 메뉴에서 추가하세요."team_members7/10 확인
70저장Button• 입력값으로 팀을 생성/수정하는 확정 버튼
• 클릭 시: 즉시 실행
 - CASE01 [성공]: 토스트 "팀을 추가했습니다" + 모달 닫힘 + 트리 갱신
 - CASE02 [실패]: 실패 처리(토스트/무반응) 프로브 미확인
teams성공 토스트 7/10 확인 · 실패 TBU
80취소Button• 변경 없이 모달을 닫는 버튼. 원문 "취소"
• 클릭 시: 모달 닫힘(미저장). 미저장 이탈 가드 유무 프로브 미확인
TBU

팀 계층 · 소속 관계

엔티티역할관계
teams팀 마스터 (팀명/상위 팀/설명/상태/팀장)self-ref (parentTeamId), leader → employees
team_members직원-팀 소속 (역할 포함)n:m (employeeId × teamId × roleId)

권한·상태 분기 요약

시나리오트리거결과 화면비고
CASE01 [팀 트리 조회]화면 진입조직 루트 노드 + 계층·인원수 트리권한 "팀 조회"
CASE02 [전체 구성원]루트 노드 선택우측 전체 구성원 Grid
CASE03 [팀 상세]팀 노드 선택우측 팀 상세 (멤버 테이블)
CASE04 [팀 추가]상위 팀·팀명*·팀장 입력 → 저장teams 생성, 토스트 "팀을 추가했습니다"권한 "팀 관리"
CASE05 [팀 삭제]팀 삭제 아이콘컨펌 "팀을 삭제하시겠어요?" → 삭제하위/멤버 존재 시 차단(정책)
CASE06 [멤버 추가]"팀 멤버 추가"team_members 생성 (n:m)

Open Question

  • 팀 ↔ 병동(wards) 관계 (간호부 하위 병동) = TBU
  • 팀 삭제 시 하위 팀·소속 구성원 실차단 UI/문구 (정책은 삭제 불가 규정) = TBU
  • 팀 추가 저장 실패·팀명 중복 에러 동작 (라이브 프로브 없음) = TBU
  • 트리 Empty·전체 구성원 Empty 원문 문구 = TBU
  • 멤버 명단·전체 명단 다운로드 포맷(엑셀/CSV)·컬럼 셋 = TBU
  • 내부 권한 토큰 실제 key (라벨 "팀 관리"/"팀 조회"만 확인) = TBU