HBAD200_직원 관리
(Hereby) 관리자 패널 > App Shell > 인사 관리 > 직원 관리
| 메타 | 앱: 관리자 패널 (App Shell)대상 사용자: 조건1 [직원 조회/관리 권한 보유 역할]프로토타입: TBU관련 정책: [[POL_권한(RBAC)]]Status: reviewOwner: 카나 |
개요
직원 관리는 관리자 패널의 기본 랜딩 화면이자 직원 마스터(employees)의 SoT 목록이다. KPI 통계 바 + 필터/검색 + 직원 목록 그리드로 구성된다. 한 직원은 **멀티 소속·역할(n:m)**을 가진다. 소속은 team_members 계층 chip으로 표기된다 (예: "간호부 > 병동1"). "직원 추가"는 단일 모달로 Employee + 소속 + 계약 + 자격증 요건을 1회 생성한다 (HBAD201). (10/21 변경, #1257 dc27a43 — 10/22 실측) 목록 행 클릭으로 「직원 정보 수정」 모달(HBAD201)에 바로 진입한다 — 종전 "행 클릭 무반응 · 관리 컬럼으로만 진입"(7/20 실측)은 폐지. "관리" 컬럼 버튼(근태 관리/권한 미리보기/팀 이동/인사발령 품의/삭제)은 병행 유지. 휴직·퇴직은 별도 처리 모달(HBAD202)로 진행된다.
문서 히스토리
- 2026-07-06 최초 작성 - 카나/콸
- 2026-07-10 라이브 기능 검토 반영 - 카나/콸
- 2026-07-13 버튼 행동 명세 보강 - 카나/콸
- 2026-07-17 코드 변경 반영(de57b65·0125f00) - 카나/콸
- 2026-07-21 GC700 깊이 재작성 (라이브 재검증 7/20 — KPI/검색/empty/행클릭) - 카나/콸
- 2026-07-21 셀 스타일 확정판 적용 (콸 승인) - 카나/PM
- 2026-07-22 코드 변경 반영(c648ec1·4f063fa) - 카나/콸
- 2026-07-23 코드 변경 반영(98a90dd·d0610db) - 카나/콸
- 2026-09-01 팀 선택 트리 접기 동작 수정 반영(#598, 라이브 실증) - 카나/PM
- 2026-09-10 목록 페이지 크기 선택기 반영(#636, 3c17afc, CS-LOC-260909-0010, 라이브 실사) - 카나/PM
- 2026-09-14 팀 관리 병동 정보 개선 반영 - Claude/dev
- 2026-09-16 급여 제외 플래그(비급여 계정 대장 제외) 반영(#722, b8a8c77) - 카나/콸
- 2026-09-16 관리자 근태 관리 모달 「전체 근무기록」 탭 추가 반영(#729, ddaf967) - 카나/콸
- 2026-09-17 직원 등록 결과 화면 병동 자동배정 힌트(9630721)·대량 추가 템플릿 팀·직무 필수+근무 그룹/유형 열(332b2df)·팀 수정 권한 가드+소속 저장 실패 통지(ad0f799) 반영 — 커밋 근거, 라이브 실사 이월(TBU) - 카나/PM
- 2026-09-18 대량 추가 직무 마스터 연동(미등록 직무 = 행 오류) + 자동 근무 채움 순서 「직무 기본 근무 → 팀 대표 근무」 확장 반영(7f63a4b, #791) — 커밋 근거, 라이브 실사 이월(TBU) - 카나/PM
- 2026-09-21 소속 피커 활성 전용화+검색 줄(비활성 팀/역할 숨김, 현재 배정 값은 유지, 팀 검색 시 평면 표시 — 65daef2, #809)·필터 줄 「근무 설정」 진입 버튼(07effb5, #806)·근무 배정 출처 셀(shiftAssignedVia, c4eb0f9, #804)·조직별 「역할」 낱말 치환(47b53a9, #807) 반영 — 커밋 근거, 라이브 실사 이월(TBU) - 카나/PM
- 2026-09-23 긴 근무형태 이름 말줄임 + 툴팁 첫 줄 전체 이름(b545090, #852, CS-OKBEST-260922-0003/0004)·직무 기본 근무와의 차이 표시 「≠ 직무 기본」·「기본」(33948ca, #851, MED-693)·대량 업로드 「근로형태」 열(workPatternName)(73c0cb4, #823) 반영 — 커밋 근거, 라이브 실사 이월(TBU) - 카나/PM
- 2026-09-23 직원 관리 필터·정렬 상태 기억(조직·사용자별 localStorage, loadEmployees 저장 · init 복원, 새로고침 후 유지 — 6457e48, #867, CS-OKBEST-260923-0001) 반영 — 커밋 근거, 라이브 실사 이월(TBU) - 카나/PM
- 2026-09-25 낮 스윕 라이브 실사 — 필터·정렬 기억 실증(저장 키
admin:employeeList:{조직}:{사용자}실측, 새로고침 유지 확인, ㄴ20-P TBU 해소)·근무형태 말줄임 배지+툴팁 첫 줄 전체 이름·툴팁 「배정 출처: 이전 데이터」 실측(ㄴ46-1·46-2 해소)·「기본」/「≠ 직무 기본」 배지 DOM 구조 확인(ㄴ46-3, 실배지 케이스 미관찰)·「근무 설정」 진입 버튼 실측(ㄴ24) - 카나/PM - 2026-09-29 #833/#912(v0.14.0) 관련 반영 — 수간호사(책임자) 표기 통일(ㄴ48, 라벨 원문 재실사 TBU). #833은 공통 「직원 카드」(병동 배정 줄·스케줄러 보기·직원 정보 수정)를 5곳에 도입 — 팀 관리·병동 관리는 실측 확인, 직원 관리 목록 적용 여부 = TBU(기존 7/20 실측 "행 본문 클릭 무반응"과의 정합 재실사 필요) - 카나/PM
- 2026-09-30 관리 메뉴 「인사발령 품의」 + 인사발령 품의 모달(ㄴ43-1) 신설 반영 — 전보·겸직 추가·소속 종료·역할 변경, 시행일 반영, 승인 = employee:manage·시스템 관리자만(647e1eca #900, MED-779) — 커밋 근거, 모달 원문 라이브 실사 이월(TBU) - 카나/PM
- 2026-10-01 인사발령 품의 모달 라이브 원문 실측(ㄴ43-1 → 하위 ㄴㄴ43-1-1~6 분리: 발령 종류 4종·종류별 필드·안내문·버튼 비활성 초기값) + 관리 버튼 묶음 실측 순서·퇴직 직원 비활성 툴팁, 퇴직 취소는 HBAD201 경로(#959, MED-834) 교차 참조 — okbest.dev 조회·모달만(제출 0건) - 카나/PM
- 2026-10-07 PR #1058(d6ad6c01·6fc17452, MED-912) 반영: 행 「팀 이동」 아이콘·선택 툴바 「팀 이동」 → 팀 이동 모달(ㄴ43-2 신설, 자동 승인 인사발령 문서) · PR #1059(3e90dfbd, MED-925·924·923) 반영: 근무 그룹 필터 2종(ㄴ25)·「부 그룹 제거」 툴바(ㄴ26) · PR #1051(14e617ba, MED-913) 반영: 권한 미리보기 bfcache 가드(ㄴ43-3) — 커밋 근거, 라이브 실사 이월(TBU) - 카나/PM
- 2026-10-09 (10/8 머지분) PR #1122 반영: 이름 셀 공용 직원 카드(ㄴ40-2 신설) — 라이브 실사 10/9 카드 구성(이름·상태·사번·직무·소속 팀·병동 배정·「직원 정보 수정」) 실측 - 카나/PM
- 2026-10-22 (10/21 머지분, PR #1257 dc27a43) 행 클릭 레코드 열람 전환 — 행 본문 클릭 → 「직원 정보 수정」 모달 직행(종전 무반응 폐지), 10/22 라이브 실측(행 cursor:pointer·모달 앵커 내비 기본정보/인사정보/자격증·면허/근로계약/고정 수당/계정·보안 확인 후 ESC 종료). 40·ㄴ43·권한/상태 CASE02 갱신. 9/29 TBU(직원 카드 vs 행 클릭 정합)도 본 변경으로 해소 - 카나/PM
Data I/O
Server → Client
변수
| 메타 | $ |
| 메타 | $ |
| 메타 | $ |
| 메타 | $ |
| 메타 | $ |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 직원명부 다운로드 | 현재 필터(상태/팀/역할/검색어/입사일/직무/병동) + 선택 출력 컬럼 + 팀별/전체 범위 | export (코드 반영: 98a90dd) | 직원 조회 (추정) |
| 직원 추가 | - | HBAD201 모달 오픈 | 직원 관리 (추정) |
| 필터/검색 | 상태/팀/역할/직무/병동/입사일/검색어 | 목록 재조회 | 직원 조회 (추정) |
| 대량 추가/수정 업로드 | 템플릿 행(… 팀 · 역할 · 직무) | 대량 업로드 (추정) | 직원 관리 (추정) |
| 소속 chip × / 역할 변경 | team_member row | sdk.teamMember.* (추정) | 직원 관리 (추정) |
직원 관리 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 관리자 패널 진입 시 기본 랜딩 ("직원 관리"). 조건1 [직원 조회 권한] | 인증 세션 | |
| 01 | 초기 상태 | - | • "직원 목록" 표시, 필터 미적용 전체 목록, "총 295건 중 1-30건". 기본 정렬 = 입사일 기준(조직 탭 포함). 기본 페이지 크기 = 30(ㄴ45에서 변경 가능) • 탭 상태 기억: 탭(직원/조직 등) 선택 상태를 localStorage에 저장 — 새로고침 시 마지막 탭 복원, URL 해시 = 현재 탭 (코드 반영: d0610db) • 필터·정렬 상태 기억: 직전에 걸어 둔 필터·정렬을 복원한 뒤 첫 조회를 실행 — 상세는 ㄴ20-P | 기본 정렬 입사일(코드 반영: c648ec1·4f063fa) · 탭 상태 복원(d0610db) · 페이지 크기 기본 30(#636) · 필터·정렬 복원(6457e48) | |
| 10 | KPI 통계 바 | Output | • 조직 인원·조직 카운트 요약 표시 "전체 295 / 재직 271 / 비활성 9 / 휴직 3 / 퇴직 12 / 팀 33 / 역할 4" (7/20 재검증). 값 없음: 0 - CASE01 [상태 enum]: 재직/비활성/휴직/퇴직 4종 • "전체 직원" = 재직 + 휴직 (팀 관리·병동 현황과 같은 기준). 비활성·퇴직은 전체에 넣지 않고 옆 칸에 따로 표시 | $ | 7/10 대비 팀 64→33, 비활성 7→9, 전체 293→295 · 전체 기준 변경(9/14) — 위 7/20 예시 수치는 변경 전(전 상태 합) 기준 |
| 15 | 툴바 구성 | Layout | • 두 줄 구성 - 1줄: "직원 목록" 제목 + 검색 · "업로드" · "직원명부 다운로드" · "신규 직원 추가" - 2줄: 필터 상태 · 팀 · 역할 · 직무 · 병동 | 입사일 · 초기화 • 직원을 체크박스로 선택하면: 2줄에 필터 대신 일괄 변경 도구 표시 | 2줄 재배치(9/14) | |
| 20 | 필터 | Dropdown | • 상태/팀/역할/직무/병동/입사일로 목록을 거르는 필터: "상태 선택" / "팀 선택" / "역할 선택" / "직무 선택" / "병동 선택" / "입사일" / "선택 초기화" • 선택 시: 목록 재조회 + 카운트 갱신 - "팀 선택" = 계층 트리(체크박스 + 팀별 "접기" 토글). CASE01 [접기]: 해당 팀의 하위 팀이 목록에서 숨김 (라이브 실증 9/1: 병동1 접기 → 팀1 숨김. 구버전은 접어도 하위가 계속 보이던 버그 — #598 수정) | 목록 재조회 · 팀 피커 공용 컴포넌트 | 접기 동작(#598) 라이브 실증 · 직무/병동 추가(9/14) |
| ㄴ20-T | 「역할」 낱말 조직 용어 치환 | Label | • 조직 설정 settings.terminology.role 값으로 화면의 「역할」 낱말만 바뀜(예: 「직책」)- 적용 위치: LNB · 직원 표 머리글 · 필터 라벨 · 역할 탭 · 대량 업로드 안내/템플릿 머리글 - 대량 업로드 파서는 치환 낱말·「역할」 둘 다 허용 - 역할 데이터·권한 코드는 불변. LNB 메뉴 라벨은 새로고침 후 반영(스냅샷) - 값 없음: 기본 낱말 「역할」 | Organization.settings.terminology.role · [[HBAD270_설정 (조직 설정·내 정보)]] | 신설 (코드 반영: 47b53a9, #807) · TBU: 라이브 실사 이월 |
| ㄴ22 | 직무 필터 | Dropdown | • 직원 직무(jobDuty)로 거르는 다중 선택 필터. 기본 "직무 선택"• 옵션에 "미입력"(직무가 비어 있는 직원) 포함 — 팀 관리 명단의 직무 필터와 같은 기준 | employees.jobDuty | 신규(9/14) |
| ㄴ23 | 병동 필터 | Dropdown | • 병동 배정(스케줄러 간호 프로필)으로 거르는 다중 선택 필터. 기본 "병동 선택" • 옵션에 "미배정"(어느 병동에도 배정되지 않은 직원) 포함 • 병동 목록은 드롭다운을 처음 열 때 불러옴 — 스케줄러 권한이 없으면 "미배정"만 | 간호 프로필 · wards | 신규(9/14) |
| ㄴ21 | 검색 | Search | • 이름/사번/이메일로 직원을 찾는 검색창 (placeholder "직원 검색 (이름 / 사번 / 이메일)...", 7/20 재검증) • 입력 시: 일치 목록 재조회 - CASE01 [결과 있음]: 필터 목록 표시 - CASE02 [결과 없음]: Empty | ${affiliations} 부재 | 문구 순서 변경(이름/사번/이메일) · TBU: 목록 0건 empty 표기 |
| ㄴ24 | 근무 설정 (진입 버튼) | Button | • 필터 줄 오른쪽에서 「근무 설정」(유형·기준 관리) 팝업을 바로 여는 진입 버튼 • 클릭 시: 근무 그룹·직무·연장근무·외근·연차·공휴일 탭을 가진 근태 설정 팝업 오픈(근태 현황과 같은 팝업) • 목적: 직원 등록·수정이 쓰는 근무 그룹·직무 마스터를 직원 관리에서 이탈 없이 편집 | [[HBAD260_근무 설정 (근무 그룹·유형)]] | 신설 (코드 반영: 07effb5, #806) · 라이브 실사 확인(2026-09-25 — 필터 줄 우측 「근무 설정」 버튼 실측, 클릭 시 유형·기준 관리 팝업 오픈) |
| ㄴ25 | 근무 그룹 필터 2종 | Dropdown | • (신설 10/7, #1059, MED-925·924·923) 직원 목록 필터에 「근무 그룹 2개 이상」·「기본값 ≠ 직무 기본」 추가 — 복수 근무 그룹·직무 기본과 다른 근무를 가진 직원을 걸러냄. 배지·필터가 같은 판정(shiftDiffersFromDefault)을 씀 | employees 근무 그룹 · ㄴ46-3 | 신설 (3e90dfbd, #1059) · 필터 라벨 원문 TBU(실사 대기) |
| ㄴ26 | 부 그룹 제거 (툴바) | Button | • (신설 10/7, #1059) 선택 툴바 「부 그룹 제거」 — 선택 직원들의 부 근무 그룹을 일괄 제거(employee.clearSecondaryShiftGroups). 일괄 지정은 주 소속 줄의 근무를 교체한다고 명시 • 수정 화면에서는 부 그룹 줄에 ×(주 소속은 안내로 거절) — [[HBAD201_직원 추가·수정 모달]] | employee.clearSecondaryShiftGroups | 신설 (3e90dfbd, #1059) · 버튼 위치·안내 원문 TBU(실사 대기) |
| ㄴ20-P | 필터·정렬 상태 기억 (새로고침 유지) | State | • 목록에 걸어 둔 필터·정렬을 브라우저(localStorage)에 기억해 새로고침·다른 탭에서 돌아와도 그대로 유지 - STEP1 [저장]: 목록 조회(loadEmployees)마다 현재 필터·정렬을 저장 — 드롭다운·검색·「선택 초기화」·근무 설정에서 넘어오기 등 필터를 바꾸는 모든 경로가 여기로 모임 - STEP2 [복원]: 화면 초기화(init) 시 첫 조회 전에 복원해 첫 목록부터 그 필터로 조회 • 유지 범위 = 검색어 · 상태 · 팀 · 역할 · 근무 그룹 · 근무 유형 · 입사일(시작/종료) · 직무 · 병동 + 정렬(기준·오름/내림) - CASE01 [페이지 번호]: 저장하지 않음(필터가 바뀌면 1페이지로 돌아가므로) - CASE02 [저장값 모양 불일치]: 예전 버전·수동 변경 값은 해당 항목만 기본값으로 두고 나머지는 복원 - CASE03 [사생활 모드·용량 초과]: 기억만 포기하고 목록은 정상 동작 | employee-filter-persist.ts(저장 키 = 조직 id + 사용자 id별) · ㄴ20 필터 · ㄴ21 검색 · ㄴ40-1 컬럼 정렬 · ㄴ45 페이지 크기 선택기(별도 키) | 신설 (코드 반영: 6457e48, #867, CS-OKBEST-260923-0001) · 조직·계정 전환 시 서로 섞이지 않음 · 탭(LNB) 이동은 원래부터 유지 · 라이브 실사 확인(2026-09-25): 저장 키 실측 admin:employeeList:{조직id}:{사용자id}(값 = filter{search·statuses·teamIds·roleIds·shiftGroupIds·shiftIds·hireDateFrom/To·jobDuties·wardIds}+sort{by·order}), 상태 필터 적용 → 새로고침 후 필터 유지 실증 |
| 30 | 직원 액션 | Button | • 툴바 1줄 액션 버튼 묶음: "업로드" / "직원명부 다운로드" / "신규 직원 추가" | "업로드" 포함(9/14 재정리) | |
| ㄴ31 | 직원명부 다운로드 | Button | • 현재 목록 필터(상태 · 팀 · 역할 · 검색어 · 입사일 · 직무 · 병동) 조건의 직원 목록을 파일로 내보내는 버튼 • 클릭 시: 출력 컬럼 선택 모달(ㄴ31-M) 오픈 → 컬럼 선택 후 내보내기 실행, 성공: 파일 다운로드 | 권한 "직원 조회" · 코드 반영: 98a90dd · 직무/병동 필터 반영(9/14) | |
| ㄴ31-M | 출력 컬럼 선택 모달 | Modal | • 명부 출력 시 포함할 컬럼을 고르는 체크박스 모달 (신설) • 컬럼 체크박스(순서): 사번 / 성명 / 팀 / 직무 / 병동 / 상태 / 입사일 / 이메일 / 전화번호 / 근무형태 — 기본 전체 선택 • 팀별/전체 내보내기 지원 • 모달 재오픈 시: 선택 상태 리셋 • 클릭 시: 내보내기 실행 → 선택 컬럼만 포함한 파일 다운로드 | export | 신설 (코드 반영: 98a90dd) · 배경: 7/21 베스트 요구 반영 · 팀/직무/병동 항목 추가(9/14) |
| ㄴ32 | 신규 직원 추가 | Button | • Employee+소속+계약+자격증요건을 1회 생성하는 단일 모달 진입 버튼. 원문 "신규 직원 추가" • 클릭 시: "직원 추가" 모달 오픈 (HBAD201) | [[HBAD201_직원 추가·수정 모달]] | |
| ㄴ32-1 | 등록 권한 가드 | Guard | • 팀 수정 권한이 없는 역할이 직원 등록을 시도하면 직원 생성 전에 차단하고 안내(danger notice) - CASE01 [팀 수정 권한 없음]: 등록 전 차단 "소속을 저장하려면 팀 수정 권한이 필요해요. 권한이 있는 관리자에게 요청해 주세요." | [[HBAD201_직원 추가·수정 모달]] · RBAC | 신설 (코드 반영: ad0f799) · employee.team_permission_required · TBU: 라이브 실사 이월 |
| ㄴ32-2 | 등록 결과 안내 | Output | • 직원 등록 완료(결과) 화면의 안내 블록 - CASE01 [병동 자동배정]: 스케줄러 2개+ 병동에 자동 배정 시 info 안내 "「{병동명} · {스케줄러명}」 스케줄러에 배정했어요. 다른 스케줄러로 옮기려면 스케줄러 › 간호사에서 바꿔 주세요."(스케줄러 1개 병동은 안내 없음). admin 경로는 동일 문구 info 토스트(6초) - CASE02 [소속 저장 실패]: 직원은 생성되되 실패 팀을 danger 알림으로 표시 "소속을 저장하지 못했어요: {teams}. 직원 목록의 수정에서 소속과 근무를 다시 지정해 주세요." | 간호 스케줄러(병동 배정) · team_members | 신설 (코드 반영: 9630721 병동 힌트 · ad0f799 실패 통지) · employee.membership_save_failed · TBU: 라이브 실사 이월 |
| ㄴ33 | 업로드 (대량 추가/수정) | Button | • 템플릿으로 여러 직원을 한 번에 등록(대량 추가, 최대 500명)하거나 선택한 직원 정보를 갱신(대량 수정)하는 진입 버튼 • 템플릿 컬럼은 … 팀 * · 역할 · 직무 * · 근무 그룹 · 근무 유형 순으로 끝남. 팀·직무는 필수(*), 근무 두 열·역할은 선택 (9/17: 팀·직무 필수화 + 근무 그룹/유형 열 신설, 332b2df) - CASE01 [대량 추가]: 팀·직무 빈 칸 = 행 오류. 직무는 직무 마스터에 등록된 이름 그대로 입력(미등록 직무 = 행 오류, 9/18). 근무 그룹·근무 유형 둘 다 비면 직무의 기본 근무 → 팀의 대표 근무 순서로 등록(9/18 — 구버전은 팀 대표만), 둘 다 없으면 근무 그룹 필수 — 행 오류 원문 "근무 그룹을 입력해 주세요. 직무 「{직무}」에 기본 근무가 없고 「{팀}」 팀에는 대표 근무가 없어요." 비활성 그룹·유형 = 행 오류. 뒤쪽 열 없는 예전 템플릿도 업로드 가능(빠진 값은 행 오류 안내) - CASE02 [대량 수정]: 직무 빈 칸 = 등록된 직무 삭제. 직무 열이 없는 예전 템플릿은 직무 유지 • 템플릿에 「근로형태」 열(workPatternName) 추가 — 설정 › 「근로형태」 탭(근로형태 마스터)에 등록된 이름을 입력([[HBAD260_근무 설정 (근무 그룹·유형)]] 탭 목록 ㄴ02-1, 전용 사양서 미작성). 필수 여부·검증 문구 = 갱신 대기 (9/22: 73c0cb4, #823) • 대량 수정에서 직무·근로형태만 바꾼 직원은 「기본 근무 재적용」 규칙에 따라 근무가 직무 기본 근무로 맞춰짐 — 비었음·그룹만·비활성·기본에서 온 값만 맞추고 직접 고른 값은 유지([[HBAD260_근무 설정 (근무 그룹·유형)]] 40-5) • 병동이 연결된 팀으로 배정되는 행: 그 병동의 병동 배정이 없으면 자동 생성(3교대, 수간호사 아님) • 팝업 안내 원문(추가) "직무는 설정 › 근무 설정 › 직무에 등록된 이름 그대로 꼭 입력해요(등록되지 않은 직무는 오류)." · "근무 그룹·근무 유형은 근무 설정에 등록된 이름 그대로 입력해요. 둘 다 비우면 직무의 기본 근무 → 팀의 대표 근무 순서로 등록되고, 둘 다 없으면 근무 그룹을 꼭 입력해요. 근무 유형은 비워도 돼요." / (수정) "직무 칸을 비우면 등록된 직무가 삭제돼요(직무 열이 없는 예전 템플릿은 그대로 유지)." | employees.jobDutyId (FK job_duties) · team_members · employee-bulk.schema · [[HBAD260_근무 설정 (근무 그룹·유형)]] 직무 사양표 | 직무 열 추가(9/14) · 팀·직무 필수 + 근무 그룹/유형 열(코드 반영: 332b2df) · 직무 마스터 연동 + 자동 근무 순서 직무 기본→팀 대표(코드 반영: 7f63a4b, #791) · 근로형태 열(73c0cb4, #823) · 대량 수정 기본 근무 재적용(33948ca, #851) · TBU: 라이브 실사 이월 |
| 40 | 직원 목록 | Grid | • 직원 마스터 목록 그리드. 컬럼: ☑ / 사번 / 이름 / 이메일 / 팀 · 역할 / 직무 / 병동 / 입사일 / 근무형태 / 상태 / 관리 (7/20 헤더 재확인 + 9/14 직무·병동 추가) • 클릭 시: (10/21 변경, #1257 — 10/22 실측) 행 본문 클릭 → 「직원 정보 수정」 모달(HBAD201) 진입(행 전체 cursor:pointer). 종전 무반응(7/20)은 폐지 | employees | 10+체크박스 · 행 클릭 진입(#1257, 10/22 실측) |
| ㄴ40-2 | 이름 셀 — 공용 직원 카드 | Cell | • (10/8, #1122, 8cf8e93b) 목록 표의 직원 이름이 클릭 가능(.ds-name-trigger) — 클릭 → 공용 직원 카드 팝오버: 이름 · 상태(재직 등) · "{사번} · {직무}" · 소속 팀(계층) · 병동 배정(없으면 "배정된 병동이 없어요.") + 앱별 등록 버튼(admin: 「직원 정보 수정」) • @hereby/components 공용 부품(employee-card) — admin 외 팀장·HR·총무·경영 대시보드·드라이브 목록 표에도 동일 적용(앱이 registerEmployeeCardActions로 등록한 버튼만 노출). 서버 employee.card 조회는 직원 조회 범위 안에서만. 팝업 안의 표는 제외 | employee.card · @hereby/components | 신설 (#1122) · 라이브 실사 2026-10-09(카드 구성 실측) |
| ㄴ46 | 직무 셀 | Cell | • 직원의 현재 직무(jobDuty) 표시. 헤더 클릭으로 정렬 가능 | employees.jobDuty | 신규(9/14) |
| ㄴ46-1 | 근무 배정 출처 | Cell | • 직원의 근무형태가 어디서 정해졌는지를 목록에 표시(shiftAssignedVia)- 값: 직접 선택 / 직무 기본 / 팀 대표 / 일괄 배정 / 엑셀 / 시트 / 직원 앱 자기 선택 - 값 없음: 출처 미기록(마이그레이션 이전 데이터) 표기 = TBU • 같은 출처가 직원 정보 수정·관리자 근태 현황·직원 앱 근태 홈에도 표시 | employees.shiftAssignedVia · team_members.shiftAssignedVia (마이그레이션 1917) | 신설 (코드 반영: c4eb0f9, #804) · 라이브 실사 확인(2026-09-25): 근무형태 셀 툴팁 둘째 줄 "배정 출처: 이전 데이터" 실측 — 마이그레이션 이전 데이터 표기 = 「이전 데이터」(값 없음 TBU 해소) |
| ㄴ46-2 | 근무형태 셀 (긴 이름 처리) | Cell | • 근무형태 배지의 긴 이름은 칸 안에서 말줄임(…) 으로 표시하고, 툴팁 첫 줄에 전체 이름을 둔다 - CASE01 [이름이 칸보다 김]: 말줄임 표시 + 툴팁 첫 줄 전체 이름 (CS-OKBEST-260922-0004) • (성능) 근무형태 배지에 마우스를 올린 채 스크롤하면 버벅이던 문제 해소 — 내부 구현 변경이라 화면 표기 자체는 동일 (CS-OKBEST-260922-0003) | 디자인시스템 .ds-label--trunc · 40 직원 목록 근무형태 컬럼 | 신설 (코드 반영: b545090, #852) · 라이브 실사 확인(2026-09-25): 배지 .ds-label--trunc + 셀 래퍼 툴팁 첫 줄 = 전체 이름(둘째 줄 배정 출처) 실측 |
| ㄴ46-3 | 직무 기본 근무와의 차이 표시 | Label | • 직원의 근무형태가 그 직원 직무의 기본 근무와 같은지를 목록에서 알려 준다 - CASE01 [기본과 다름]: 「≠ 직무 기본」 표시 - CASE02 [기본에서 온 값]: 「기본」 표시 • 같은 표시가 직원 수정 패널에도 나온다 | job_duties.defaultShiftId · ㄴ46-1 근무 배정 출처 · [[HBAD201_직원 추가·수정 모달]] · [[HBAD260_근무 설정 (근무 그룹·유형)]] 직무 사양표 | 신설 (코드 반영: 33948ca, #851, MED-693) · 라이브 실사(2026-09-25): 셀 DOM에 회색 「기본」·노란 「≠ 직무 기본」 배지 구조 실측(조건부 렌더 — 직무 미배정 조직 데이터라 실배지 노출 케이스는 미관찰) |
| ㄴ47 | 병동 셀 | Cell | • 병동 배정(스케줄러 간호 프로필)의 병동 표시 - "겸임" 라벨: 두 병동 이상 배정 - "불일치" 라벨: 소속 팀에 연결된 병동과 배정된 병동이 다름 (title "소속 팀에 연결된 병동과 배정된 병동이 달라요") | 간호 프로필 · teams.wardId | 신규(9/14) |
| ㄴ48 | 수간호사(책임자) 라벨 | Label | • 병동 배정에서 수간호사인 직원은 사번 옆에 라벨 표시 (팀 관리 명단과 같은 라벨) • #833에서 수간호사(책임자) 표기 통일 — 통일 후 라벨 원문 = TBU(재실사) | 간호 프로필 | 신규(9/14) · 표기 통일(#833) |
| ㄴ45 | 페이지 크기 선택기 | Dropdown | • 페이지네이션 요약("총 N건 중 1-30건") 옆에서 페이지당 표시 인원을 고르는 선택기: 30 / 50 / 100 / 전체(최대 1,000) (신설) • 선택 시: 목록 재조회 + 1페이지로 리셋 - "전체" = 서버 paginationSchema limit 상한(1,000)과 동일 값. CASE01 [총 건수 > 1,000]: 요약에 title 툴팁으로 잘림 안내 • 목록별 localStorage 기억 — 새로고침 후에도 선택 유지 | employees · paginationSchema(limit ≤ 1,000) | 신설 (코드 반영: 3c17afc, #636, CS-LOC-260909-0010) · 구버전 "30 고정" → "기본 30·선택 가능" · e2e testid employee-page-size |
| ㄴ40-1 | 컬럼 정렬 | Sort | • 사번 / 이름 / 이메일 / 직무 / 입사일 / 상태 컬럼 헤더 클릭으로 목록 정렬(9/14 코드 기준 — 직무 추가). 기본 정렬 = 입사일 기준 • 클릭 시: 토글 3단 순환 — CASE01 [1클릭] 오름차순 → CASE02 [2클릭] 내림차순 → CASE03 [3클릭] 정렬 해제 • UI 시각 인디케이터로 현재 정렬 컬럼·방향 표시 • 직원 추가 모달 오픈 시: 정렬 상태 리셋 | employees | 신설 · 4개 컬럼(사번/성명/팀명/입사일) (코드 반영: c648ec1·4f063fa) |
| ㄴ41 | 팀 · 역할 셀 | Cell | • 멀티 소속 chip 셀: "간호부 > 병동1"(계층 표기) + 역할 chip + 소속 추가 아이콘. 값 없음: "역할 없음" • 소속 chip "×" 클릭 시: 컨펌 "이 멤버를 팀에서 제거하시겠습니까?" → 실행 • 역할 chip 클릭 시: 컨펌 ""{이름}"의 역할을 "{역할}"(으)로 변경하시겠습니까?" → 실행 • 소속 추가 클릭 시: 소속(팀·역할) 배정 인라인 추가 | team_members n:m | 계층 chip · 테이블 내 버튼은 아이콘 전용 "+", 라벨 "소속 추가"는 빈 테이블 상태에서만 노출(7/16 변경, 동작 불변) |
| ㄴ41-1 | 소속 피커 (팀·역할) | Picker | • 소속 chip의 팀·역할 세그먼트와 「소속 추가」 메뉴가 쓰는 공용 선택기 - 팀 트리 피커: 비활성 팀을 하위까지 숨김 / 역할 피커: 비활성 역할 제외 - 예외: 지금 그 소속에 배정된 값은 비활성이어도 남겨 선택 표시를 유지(keepTeamId) • 관리자 직원 관리와 공용 직원 수정 패널이 같은 규칙 사용 | teams.isActive · roles.isActive · [[HBAD201_직원 추가·수정 모달]] | 신설 (코드 반영: 65daef2, #809) · TBU: 라이브 실사 이월 |
| ㄴ41-2 | 소속 피커 검색 줄 | Search | • 메뉴 맨 위 고정 검색 줄(디자인시스템 신규 .ds-menu__search)에서 이름으로 목록을 거름- CASE01 [팀 검색 중]: 접기·계층을 무시하고 일치하는 팀을 평평한 목록으로 표시 - CASE02 [검색어 없음]: 기존 트리(계층·접기) 표시 - Empty(-E): 일치 항목 없을 때 문구 = TBU | 디자인시스템 .ds-menu__search | 신설 (코드 반영: 65daef2, #809) · TBU: 라이브 실사 이월 |
| ㄴ42 | 상태 | Badge | • 재직 상태 배지: CASE01 [재직] / CASE02 [비활성] / CASE03 [휴직] / CASE04 [퇴직] | employees.status | |
| ㄴ43 | 관리 | Button | • 직원 행 관리 아이콘 버튼 묶음 — (10/21부터 유일 경로 아님: 행 클릭=편집 진입, #1257). 10/1 실측 순서: "근태 관리" / "편집" / "권한 미리보기" / "인사발령 품의" / ("계정 초대" — 조건부) / "삭제" • 「팀 이동」 아이콘 추가(10/7, #1058, MED-912) — 선택 툴바의 「팀 이동」 버튼과 같은 모달(ㄴ43-2)을 엶. 버튼 위치·순서 TBU(실사 대기) • "편집" 클릭 시: "직원 정보 수정" 모달 (HBAD201) — 퇴직 취소(#959)는 이 모달 안에서 처리 • "인사발령 품의" 클릭 시: 인사발령 품의 모달 (ㄴ43-1) - CASE01 [퇴직 직원]: 버튼 비활성, 툴팁 "퇴직한 직원에게는 발령을 올릴 수 없어요" • "삭제" 클릭 시: 컨펌 후 삭제 (파괴적 — 기존 기록) | HBAD201 / HBAD202 | 인사발령 품의 추가(#900) · 10/1 실측: 행 메뉴에 "휴직·퇴직" 버튼 없음 → OQ |
| ㄴ43-1 | 인사발령 품의 모달 | Modal | • 관리자가 대상 직원 명의의 인사발령품의서를 문서 결재에 올리는 모달(직원 본인 제출 아님 — MED-779 1차). 헤더: "인사발령 품의" + 직원명 · 사번 · 현재 소속(없으면 "소속 없음") • 제출 → document.createHrAction → 문서 결재에 「인사처리」 배지로 등재. 승인은 시스템 관리자 또는 employee:manage 보유자만 → 시행일에 소속·역할 반영, 병동·근무 배정 연동• 발령 이력 원장은 없음 — 문서 metadata(hrAction)에만 기록 | document.createHrAction · hr-action-processing.service · [[HBAD240_문서 결재]] · [[HBAD202_휴직·퇴직 처리 모달]] | 신설(647e1eca #900) · 10/1 라이브 원문 실측(live-1001-hbad200-appointment.png, 제출 0건) |
| ㄴㄴ43-1-1 | 발령 종류 | Select | • 선택지: "전보(팀 이동)"(기본) / "겸직 추가" / "소속 종료" / "역할 변경" • 선택 시: 아래 입력 필드 구성이 종류별로 바뀜 (ㄴㄴ43-1-3) | ||
| ㄴㄴ43-1-2 | 시행일 | Date | • 발령이 적용될 날짜. 승인 후 이 날짜에 소속·역할이 바뀜 | ||
| ㄴㄴ43-1-3 | 종류별 필드 | Select | • CASE01 [전보(팀 이동)]: "현재 팀"(선택) · "새 팀"(팀 트리 선택) · "역할"(기본 "유지 / 없음") • CASE02 [겸직 추가]: "추가할 팀" · "역할"(기본 "유지 / 없음") • CASE03 [소속 종료]: "대상 소속" • CASE04 [역할 변경]: "대상 소속" · "역할 *"(필수) | teams · roles | |
| ㄴㄴ43-1-4 | 발령 사유 (선택) | Input | • 자유 입력, placeholder "예: 병동 인력 조정" | ||
| ㄴㄴ43-1-5 | 안내문 | Text | • "품의를 올리면 문서 결재 대기 건이 생겨요. 직원 관리 권한이 있는 관리자가 승인하면 시행일에 소속·역할이 바뀌고, 병동 배정·근무 배정도 새 소속을 따라가요. 여러 변경은 품의를 나눠 올려 주세요." | ||
| ㄴㄴ43-1-6 | 취소 / 품의 올리기 | Button | • "취소" 클릭 시: 모달 닫힘(저장 없음) • "품의 올리기" 클릭 시: 품의 제출 → 문서 결재 대기 건 생성 - CASE01 [필수값 미입력]: 버튼 비활성 (초기 상태 비활성 실측) | document.createHrAction | TBU: 제출 성공 토스트 원문(발송 금지로 미실측) |
| ㄴ43-2 | 팀 이동 모달 | Modal | • (신설 10/7, #1058, MED-912) 직원 행 「팀 이동」 아이콘·선택 툴바 「팀 이동」 버튼이 같은 모달을 엶. 입력 = 대상 팀 → 이동/추가 소속 → 역할(기존 유지·없음·지정) → 발령일 → 사유를 한 번에 확인 • 확인 → team.moveMembers가 직원마다 자동 승인된 인사발령 문서를 만들어 발령일이 오늘(이전)이면 바로, 미래면 그날 반영(hr-action-due 잡) — 문서가 전보 이력이 됨 • 서버는 services/team-move.service 한 곳(옛 소속 종료 + 새 소속 합류 + 역할 keep/set/none + 주 소속 승계 + 병동 프로필 이동·정리 + 옛 팀 단톡방 나가기) — 인사발령품의서 승인의 전보·겸직 추가도 같은 함수 • 결과: 적용·예약·건너뜀·실패 건수로 알리고 직원 목록·팀 명단·트리 재조회 | team.moveMembers · team-move.service · ㄴ43-1 인사발령 품의 · [[HBAD210_팀 관리]] | 신설 (d6ad6c01·6fc17452, #1058) · 모달 원문·필드 라벨 TBU(실사 대기) · employee.statusHistory에 appointments(전보 이력) 추가 |
| ㄴ43-3 | 권한 미리보기 bfcache 가드 | Rule | • (10/7, #1051, MED-913) 미리보기 [시작] 직후 브라우저 뒤로가기를 눌러도 관리자 화면이 「시작 중…」 모달이 열린 옛 메모리 상태로 되살아나지 않음 — ①SDK pageshow(persisted)에서 메모리 토큰 ≠ 저장 토큰이면 문서 재로드(installImpersonationHistoryGuard, [종료] 뒤 미리보기 앱으로 뒤로가기도 동일) ②미리보기 시작 이동은 location.replace(토큰 바꾼 관리자 화면을 히스토리에 안 남김) | 권한 미리보기(ㄴ43) · SDK | 신설 (14e617ba, #1051) |
| ㄴ44 | 근태 관리 | Button | • 직원별 근태를 조회·관리하는 "근태 관리" 버튼 • 클릭 시: "근태 관리" 모달 오픈 | attendances (추정) |
소속 chip 계층 표기
| 표기 | 의미 | 근거 |
|---|---|---|
| "간호부 > 병동1" | 상위 팀 > 하위 팀 계층 경로 | teams.parentTeamId |
| "역할 없음" | 소속·역할 미배정 (값 없음 처리) | team_members 부재 (7/20 원문) |
| chip × (제거) | 해당 소속 해제. 클릭 → 컨펌 "이 멤버를 팀에서 제거하시겠습니까?" | team_members row |
| 역할 chip (변경) | 역할 변경. 클릭 → 컨펌 ""{이름}"의 역할을 "{역할}"(으)로 변경하시겠습니까?" | team_members.roleId |
| + (소속 추가) | 추가 팀·역할 배정 (n:m). 테이블 내 버튼은 아이콘 전용 "+", 라벨은 빈 테이블 상태에서만 노출 (7/16 변경) | team_members.roleId |
권한 / 상태 요약
| 시나리오 | 트리거 | 결과 | 비고 |
|---|---|---|---|
| CASE01 [목록 조회] | 화면 진입 | 직원 목록 그리드 + KPI 바 표시 | 권한 "직원 조회" |
| CASE02 [행 본문 클릭] | 목록 행 클릭 | 「직원 정보 수정」 모달 진입 (#1257) | 10/22 실측 — 종전 무반응(7/20) 폐지 |
| CASE03 [명부 다운로드] | "직원명부 다운로드" | 필터 조건 export | |
| CASE04 [직원 추가] | "직원 추가" | HBAD201 모달 오픈 | 권한 "직원 관리" |
Open Question
| # | 질문 | 근거 | 상태 |
|---|---|---|---|
| OQ1 | 행 관리 버튼 묶음에 "휴직·퇴직" 버튼이 보이지 않음(10/1 실측: 근태 관리/편집/권한 미리보기/인사발령 품의/삭제). 휴직·퇴직 처리 모달(HBAD202) 진입 경로가 편집 모달 내부로 옮겨졌는지 확인 필요 | live-1001-hbad200-appointment.png | 열림 |