HBNS240_병동 관리·설정
(Hereby) 팀 관리(team-manager) > 간호 스케줄러 > 병동 관리·설정
| 앱 | 간호 스케줄러 (team-manager 내장, 포트 4004) |
| 대상 사용자 | 조건1 [간호 관리자] · 조건2 [수간호사] |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_간호스케줄 Lifecycle]] · [[POL_간호인력·준수율]] |
| Status | draft |
| Owner | 카나 |
개요
- 헤더 ⚙ = "병동 관리 및 설정" 모달 진입 화면을 정의한다.
- 모달은 5탭 구성 — ①병동 관리 ②인력 설정 ③교대 매핑 ④교육 정책 ⑤주기 설정.
- 좌측 "병동 관리" 탭은 비활성(흐림) 표시 — 병동 관리 기능은 이 ⚙ 모달로 통합되었다.
- ①병동 관리: NS 자체 병동 CRUD. Admin 병동([[HBAD230]] IMPORT)과 별개 개념(물리적 입원 단위). 병동 종류(일반/재활병동, [[POL_간호인력·준수율]] 배치 기준 키) 지정 포함.
- ②인력 설정: 병원 전체 정책. 간호사/조무사/간병인 비율 + 배치 기준 3필드(간호조무사·병동지원인력·재활지원인력, 1인당 환자 수) — 간호등급·준수율 계산의 원천.
- ③교대 매핑: 배정(D/E/N) → 실제 근무시간(Shift) 대응. [[HBAD260]] 근무 유형을 소비하고 HBHR 급여와 연동하는 고리.
- ④교육 정책: "교육 근무 인정 (work_counted)" vs "교육 휴무 (off)" 2모드.
- ⑤주기 설정: 근무표 주기 "매월 1일 ~ 말일 (월력 기준)", 병원 전체 정책.
- ERD:
wards(code / name / schedulingConfig jsonb / displayOrder)가 병동 마스터. Admin [[HBAD230]] 병동은 IMPORT로 반영되고 NS 자체 병동은 이 모달에서 CRUD한다. 근무 그룹·유형(shifts/shift_groups)은 [[HBAD260]] 근무 설정이 원천이다.
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 |
| 2026-07-13 | 카나 | PM | 버튼 행동 명세 보강 |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 |
| 2026-07-21 | 카나 | PM | 셀 스타일 확정판 적용 (콸 승인) |
| 2026-07-21 | 카나 | PM | TC 크로스체크 확정분 반영 (🟡 — nurseScheduler.ward.create·wardSettings.update 확정 등) |
| 2026-07-30 | Claude | dev | 병동 종류(배치 기준 키) 컬럼·선택 추가, ②인력 설정에 배치 기준 3필드 추가 — [[POL_간호인력·준수율]] 반영 |
| 2026-08-18 | 카나 | 라이브 재검증 정정 | okbest dev 라이브 실측: ①병동 테이블에 "종류" 컬럼 미노출(라이브 6컬럼 = 코드/병동명/병상수/순서/상태/작업), 병동 종류 선택 UI 부재. ②인력 설정에 "배치 기준 (1인당 환자 수)" 3필드 미노출(라이브는 간호사비율 D/E/N + 조무사(간호사대비) + 간병인(환자대비)만). 2026-07-30 추가분이 이 dev 환경에 미배포 상태 — 스펙은 의도 유지하되 라이브 미반영 명시 |
Data I/O
Server → Client
| 변수 | DB 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
${jwt_session} | (인증 세션 — 간호 관리자/수간호사) | /nurse-scheduler/signin 리다이렉트 | 미인증 시 모달 진입 불가 |
${wards} | wards[] (code / name / displayOrder) | 빈 테이블(-E) | "1 (WARD_...)" / "간호부 (IMPORT-간호부-...)" |
${scheduling_config} | wards.schedulingConfig (jsonb) | 기본값 적용 (구조 TBU) | 비율 규칙·교대 매핑·교육·주기 저장 구조 = TBU |
${shift_groups} | shift_groups / shifts | 빈 select 옵션 | [[HBAD260]] 원천 |
${staffing_ratio} | wards.schedulingConfig 내 비율 (D/E/N·조무사·간병인) — 추정 | 미설정 시 준수율 계산 불가 (TBU) | 간호등급·준수율 원천 |
Client → Server
| 액션 | 전달 값 | tRPC/SDK | 권한 토큰 |
|---|---|---|---|
| 병동 추가 | { name, code, schedulingConfig:{ bedCount, staffingRatios } } | nurseScheduler.ward.create() (TC 확정: 04:4.1) | ward:write.org (TBU) |
| 병동 수정 | { code, name, bedCount, displayOrder, status } | nurseScheduler.ward.create() upsert (수정 procedure TBU) | ward:write.org (TBU) |
| 병동 삭제 | wardId | nurseScheduler.ward.delete() (soft delete deletedAt, 추정 — TC 미검증) | ward:delete.org (TBU) |
| 인력 설정 저장 | { wardId, settings:{ bedCount, staffingRatios:{ day, evening, night } } } | nurseScheduler.wardSettings.update() (TC 확정: 04:4.2/4.6) | ward:write.org (TBU) |
| 교대 매핑 저장 | { slotType → shiftId }[] | (procedure TBU) | (TBU) |
| 교육 정책 저장 | { mode: work_counted | off } | (procedure TBU) | (TBU) |
| 주기 설정 저장 | { cycleType: monthly } | (procedure TBU) | (TBU) |
외부 통합 (cross-app)
| 외부 시스템 | 데이터 | 동기/비동기 | 비고 |
|---|---|---|---|
| Admin 병동 관리 [[HBAD230]] | Ward 마스터 (IMPORT- 접두) | 동기 IMPORT | 병동 생성 → 병동 탭·①병동 관리 목록 반영 |
| Admin 근무 설정 [[HBAD260]] | 근무 그룹·유형 (shifts / shift_groups) | 동기 | ③교대 매핑 select 옵션 원천 |
| HBHR 급여 | 교대 매핑(Shift) + 교육 정책(work_counted) | 비동기 | 급여·출퇴근 시간 산정 소비처 |
화면 플로우 (상태 머신)
⚙ = "병동 관리 및 설정" 5탭 모달. NS 자체 병동은 이 모달에서 CRUD(Admin 병동과 별개), 인력 설정이 준수율 원천, 교대 매핑이 [[HBAD260]]→HBHR 급여 고리다.
병동 관리 및 설정 모달 (진입)
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 화면 진입 조건 | - | • 조건1 [간호 관리자] · 조건2 [수간호사] 인증 시 헤더 ⚙ 노출- CASE01 [ ${jwt_session} 없음]: /nurse-scheduler/signin 리다이렉트 | 인증 세션 | TBU: 조건3 [간호사] 진입 여부 |
| 10 | ⚙ 병동 관리 및 설정 | Button (Icon) | • 클릭 → "병동 관리 및 설정" 5탭 모달 오픈 | [[HBNS100]] 헤더 | 좌측 "병동 관리" 탭은 비활성(⚙로 통합)·TBU: 기본 활성 탭(추정 ①)·로드 실패 동작 |
| ㄴ11 | 5탭 헤더 | Tab | • ①병동 관리 ②인력 설정 ③교대 매핑 ④교육 정책 ⑤주기 설정 5탭 헤더 • 탭 전환 → 해당 탭 표시, 활성 탭 강조 | TBU: 탭 전환 시 미저장 편집 유지 여부 | |
| 20 | 모달 닫기 | Button | • 클릭 → 모달 종료, 그리드 복귀 | TBU: 미저장 변경 존재 시 경고 여부 |
① 병동 관리 탭
안내: "병동은 부서와 별개의 개념입니다. 물리적 입원 단위로 관리하세요."
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 10 | 안내 문구 | Text | "병동은 부서와 별개의 개념입니다. 물리적 입원 단위로 관리하세요." 고정 표시 | 원문 카피 | |
| 20 | + 병동 추가 | Button | • NS 자체 병동을 신규 생성하는 버튼 (조건1 [간호 관리자] 실행)• 클릭 → 신규 행 추가(코드/병동명/종류/병상수/순서/상태 입력) - 종류: 미지정(기본)/일반병동/재활병동 — 미지정 = 배치 기준 미적용([[POL_간호인력·준수율]]) | wards | Admin 병동(IMPORT)과 별개·TBU: 필수값 미입력 처리·수간호사 권한 |
| 30 | 병동 테이블 | Table | • NS 자체 병동 목록. ⚠ 2026-08-18 라이브 = 6컬럼: 코드 / 병동명 / 병상수 / 순서 / 상태 / 작업 ("종류" 컬럼 미노출) - CASE01 [활성]/CASE02 [비활성]: 상태 컬럼 표기 - (스펙 의도: 종류 = 일반병동/재활병동/ -(미지정) — 라이브 미반영) | wards(code/name/displayOrder/schedulingConfig.wardCareType) | 병상수 = 미입력일 채우기 원천([[HBNS230]])·2026-08-18: 종류 컬럼 라이브 부재 |
| ㄴ30-E | 병동 없음 (Empty) | - | • NS 자체 병동 0건 → 테이블 빈 행 | Empty·TBU: 표시 문구 | |
| ㄴ31 | 수정 | Button | • 클릭 → 해당 병동 행 편집 모드 | wards | TBU: 저장 실패 동작·IMPORT 병동 편집 가능 여부 |
| ㄴ32 | 삭제 | Button | • 클릭 → 병동 행 제거(destructive) | wards nurse_schedules | TBU: 컨펌 유무·참조 무결성(연결 스케줄)·삭제 실패·soft delete(deletedAt) |
② 인력 설정 탭
안내: "병원 전체 정책 — 모든 병동에 동일하게 적용됩니다." (간호등급·준수율 계산 원천)
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 10 | 안내 문구 | Text | "병원 전체 정책 — 모든 병동에 동일하게 적용됩니다." 고정 표시 | 원문 카피 | |
| 20 | 간호사 1인당 환자 비율 | Input | • 주간 D / 저녁 E / 야간 N 3개 값을 입력하는 비율 필드 (간호등급·준수율 계산 원천). 안내 "예: 주간 5 = 환자 5명당 간호사 1명 필요" • 입력 → 준수율 계산 기준값 반영 | 준수율 계산 기준값 | 원문 카피·TBU: 미설정 시 산출 불가 처리·0/음수/비숫자 검증 |
| 30 | 조무사 비율 | Input | • 간호사 대비 비율을 입력하는 필드. 안내 "예: 0.5" • 입력 → 비율 반영 | 원문 카피·TBU: 미설정 처리 | |
| 40 | 간병인 비율 | Input | • 환자 대비 비율을 입력하는 필드. 안내 "예: 0.3" • 입력 → 비율 반영 | 원문 카피·TBU: 미설정 처리 | |
| 45 | 배치 기준 (1인당 환자 수) | Input | ⚠ 2026-08-18 라이브 미노출 — 이 dev 환경 ②인력 설정에는 간호사비율(D/E/N)·조무사(간호사대비)·간병인(환자대비)만 존재. (스펙 의도: 간호조무사/병동지원인력/재활지원인력 3필드 — 라이브 미반영) • 0/빈 값 = 미설정(null-unset). 50 「인력 설정 저장」에 포함 저장 | [[POL_간호인력·준수율]] | 2026-07-30 추가분이 라이브 미배포 |
| 50 | 인력 설정 저장 | Button | • 간호사/조무사/간병인 비율을 저장하는 버튼 (조건1 [간호 관리자] 실행)• 클릭 → 비율 저장(즉시 실행), 성공 시 준수율·간호등급 재계산 반영([[HBNS100]] 지표 바) | [[POL_간호인력·준수율]] · [[HBNS100]] | 병원 전체 정책·TBU: 저장 실패(토스트/롤백)·수간호사 권한 |
③ 교대 매핑 탭
안내: "각 근무형태의 배정(D/E/N)에 대응하는 실제 근무시간(Shift)을 설정합니다. 급여 계산 및 출퇴근 시간 산정에 사용됩니다."
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 10 | 안내 문구 | Text | "각 근무형태의 배정(D/E/N)에 대응하는 실제 근무시간(Shift)을 설정합니다. 급여 계산 및 출퇴근 시간 산정에 사용됩니다." 고정 표시 | HBHR 급여 | 원문 카피 |
| 20 | 근무형태별 슬롯 매핑 | Select | • 슬롯(주간 / 주말 주간 / 초번(E) 등)에 Admin 근무 유형으로 실제 Shift를 대응시키는 매핑 • select → 슬롯별 Shift 대응 지정 - CASE01 [ ${shift_groups} 비어있음]: 옵션 없음 → [[HBAD260]] 선등록 필요 (아래 20-E) | [[HBAD260]] / HBHR 급여 | Admin 근무 유형 소비(일반근무/3교대 D·E·N/스포츠/스케줄 등)·TBU: 미매핑 슬롯 처리·저장 실패 |
| ㄴ20-E | 근무 유형 없음 (Empty) | - | • [[HBAD260]] 근무 유형 미등록 → select 옵션 0건 | [[HBAD260]] | Empty·TBU: 안내 문구 |
| 30 | 교대 매핑 저장 | Button | • 슬롯→Shift 매핑을 저장하는 버튼 (조건1 [간호 관리자] 실행)• 클릭 → 매핑 저장 | HBHR 급여 | NS→HR 급여 연동 고리·TBU: 즉시 실행 여부·저장 실패·수간호사 권한 |
④ 교육 정책 탭
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 10 | 교육 근무 인정 (work_counted) | Radio/Toggle | • 교육 근무를 급여에 포함하는 모드 선택 • 선택 → 급여 포함(예: 주간 교육 → D교육 → 주간 정규 Shift 급여 산정) | HBHR 급여 | 원문 카피 "교육 근무 인정 (work_counted)" |
| 20 | 교육 휴무 (off) | Radio/Toggle | • 교육 근무시간을 0 처리하는 모드 선택 • 선택 → 근무시간 0, 교육수당 별도 | HBHR 급여 | 원문 카피 "교육 휴무 (off)" |
| 30 | 교육 정책 저장 | Button | • 선택 모드(work_counted/off)를 저장하는 버튼 (조건1 [간호 관리자] 실행)• 클릭 → 정책 저장(즉시 실행) | HBHR 급여 | 2모드 택1·TBU: 모드 미선택 저장·저장 실패·수간호사 권한 |
⑤ 주기 설정 탭
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 10 | 근무표 주기 | Select/Text | • 근무표 주기를 고르는 컨트롤 "매월 1일 ~ 말일 (월력 기준)" • select → 주기 선택 | [[POL_간호스케줄 Lifecycle]] | 병원 전체 정책·원문 카피·TBU: 다른 주기 옵션 존재 여부 |
| 20 | 적용 안내 | Text | "변경 시 새로 생성되는 근무표에만 적용되며, 기존 근무표는 영향받지 않습니다." 고정 표시 | 원문 카피 | |
| 30 | 주기 설정 저장 | Button | • 근무표 주기를 저장하는 버튼 (조건1 [간호 관리자] 실행)• 클릭 → 주기 저장. 변경 시 신규 생성 근무표에만 적용, 기존 근무표 불변 | [[POL_간호스케줄 Lifecycle]] | TBU: 즉시 실행 여부·저장 실패·수간호사 권한 |
원천 참조
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 10 | 병동 마스터 원천 | - | Admin [[HBAD230]] 병동은 IMPORT로 반영, NS 자체 병동은 ①병동 관리 탭에서 CRUD | [[HBAD230]] | IMPORT- vs WARD_ 접두 |
| 20 | 근무 유형 원천 | - | 근무 그룹·유형(shifts / shift_groups)은 Admin 근무 설정이 원천 — ③교대 매핑에서 소비 | [[HBAD260]] |
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 | 권한 | 비고 |
|---|---|---|---|---|
CASE01 [설정 진입] | 헤더 ⚙ | "병동 관리 및 설정" 5탭 모달 진입 | 조건1 [간호 관리자] / 조건2 [수간호사] | 좌측 병동 관리 탭은 비활성 |
CASE02 [NS 자체 병동 생성] | ① "+ 병동 추가" | NS 자체 병동 생성 (코드/병동명/병상수/순서/상태) | 조건1 [간호 관리자] | Admin 병동과 별개 |
CASE03 [인력 설정 저장] | ② "인력 설정 저장" | 간호사/조무사/간병인 비율 저장 → 준수율·간호등급 계산 기준값 | 조건1 [간호 관리자] | 병원 전체 정책 |
CASE04 [교대 매핑] | ③ 근무형태 슬롯 select | 배정 D/E/N → 실제 Shift 대응 저장 | 조건1 [간호 관리자] | [[HBAD260]] 소비 / HBHR 급여 |
CASE05 [교육 정책] | ④ "교육 정책 저장" | work_counted / off 2모드 저장 | 조건1 [간호 관리자] | HBHR 급여 |
CASE06 [주기 설정] | ⑤ "주기 설정 저장" | 매월 1일~말일 주기 저장(신규 근무표부터 적용) | 조건1 [간호 관리자] | 기존 근무표 불변 |
Open Question
- 인력 설정 비율(간호사 D/E/N · 조무사 · 간병인)의 준수율·간호등급 산출식 = TBU
wards.schedulingConfigjsonb 스키마 상세(교대 매핑·교육 정책·주기 저장 구조) = TBU- NS 자체 병동(⚙ 모달 CRUD)과 Admin IMPORT 병동의 병합·중복 규칙 = TBU
- 스케줄러 설정과 Admin([[HBAD230]]/[[HBAD260]]) 설정 간 편집 권한 경계 = TBU
- 저장 procedure: 병동 생성
nurseScheduler.ward.create·인력 설정nurseScheduler.wardSettings.update확정 (TC 04:4.1/4.2/4.6); 교대 매핑·교육·주기 저장 procedure 및 각 즉시 실행 여부·에러 처리(토스트/롤백) = TBU - 병동 삭제 시 참조 무결성(연결된 스케줄) 처리 및 soft delete 여부 = TBU
- 모달 활성 기본 탭·탭 전환 시 미저장 편집 유지·경고 여부 = TBU
조건2 [수간호사]의 설정 저장 권한 범위 = TBU