HBNS200_근무표 그리드
(Hereby) 팀 관리(team-manager) > 간호 스케줄러 > 근무표 그리드
| 앱 | 간호 스케줄러 (team-manager 내장 탭, 포트 4004) |
| 대상 사용자 | 조건1 [간호 관리자] · 조건2 [수간호사] |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_간호스케줄 Lifecycle]] · [[POL_AI안전경계]] · [[POL_간호인력·준수율]] |
| Status | draft |
| Owner | 카나 |
개요
- "📋 근무표" 뷰의 메인 근무표 그리드. 행=간호사(성명+사번)·근무형태, 열=일자(요일) 의 월 단위 매트릭스에 3교대 셀 코드(D/E/N/OFF/연차/교육)를 배정한다.
- 상단 지표 바(간호등급/준수율/간호사 수/환자 수)와 하단 일별 합계 행(D/E/N 카운트)이 그리드를 감싼다. 준수율은 라이브 실측 25%(빨강)에서 100% 범위로 표시된다.
- 셀 편집은 키보드 단축 입력 방식이다 — 셀 클릭 시 파란 선택 테두리가 노출되고, d/e/n 등 키 입력으로 즉시 배정이 바뀐다(별도 팝업·드롭다운 없음, 검증 완료). 편집 시 상태 배지가
CASE03 [수정 중]으로 전이한다. - 배정은
nurse_schedule_entries(assignmentType/shiftId/isAiGenerated/isManualOverride)에 기록된다. - 그리드 상단 액션바의 AI 자동생성([[HBNS201]]) 이 전체 셀을 편성하고, 확인([[HBNS202]]) 이 확정으로 전이한다. 업로드·인쇄·출근현황 3유틸은 [[HBNS203]].
- 셀 색 코딩: D 노랑 / E 초록 / N 보라 / OFF 회색. 요일 색은 토 파랑 / 일 빨강으로 정합화한다.
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 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.* 네임스페이스, 엔트리 검증 흐름 신규 추가 등) |
| 2026-07-24 | 카나 | PM | 코드 변경 반영(71f134e) |
Data I/O
Server → Client
| 변수 | DB 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
${grade} | 간호등급 (간호관리료 등급 추정) | "-" 표시 (실측) | 원천 산식 TBU |
${compliance} | 준수율 (인력 비율 충족도 계산) | 빈 근무표 시 "25%"(빨강) | 25%에서 100% 범위, 25% 빨강 |
${nurse_count} | nurse_profiles count | 0명 | "간호사 143명" |
${patient_count} | 월별 환자수 (HBNS230 원천) | 0명 | "환자 60명" |
${roster} | nurse_schedule_entries[] (assignmentType/shiftId/isAiGenerated/isManualOverride) | 빈 그리드(전 셀 미배정) | 셀별 D/E/N/OFF/연차/교육 |
${nurses} | nurse_profiles (성명·사번·workType) | Empty 행(-E) | 데이전담/3교대 근무형태 |
${shift_totals} | 일별 집계 (D/E/N 카운트) | "D:0 E:0 N:0" | 하단 합계 행 |
${status_badge} | nurse_schedules.status | 신규 근무표 CASE01 [초안] | 초안/AI 생성/수정 중/확정/공유됨 |
Client → Server
| 액션 | 전달 값 | tRPC/SDK | 권한 토큰 |
|---|---|---|---|
| 셀 배정 편집 | entryId, assignmentType, shiftId | nurseScheduler.entry.update() (TC 확정: 04:4.6) | schedule:write (추정) |
| 간호사 추가 | 간호사 열 "+" → 프로필 등록 동선 | HBNS210 (nurseScheduler.profile.create, TC 확정: 04:4.1) | nurse:write (추정) |
| AI 자동생성 | scheduleId | nurseScheduler.schedule.generate({scheduleId}) (TC 확정: 04:4.3, [[HBNS201]]) | schedule:write (추정) |
| 엔트리 검증 | scheduleId | nurseScheduler.entry.validate({scheduleId}) — 생성 후·확정 전 엔트리 검증 (TC 확정: 04:4.3) | schedule:write (추정) |
| 확인(확정) | scheduleId | nurseScheduler.schedule.confirm({scheduleId}) (TC 확정: 04:4.4, [[HBNS202]]) — destructive | schedule:confirm (추정) |
외부 통합 (cross-app)
| 외부 시스템 | 데이터 | 동기/비동기 | 비고 |
|---|---|---|---|
| HBNS230 월별 환자수 관리 | ${patient_count} 원천 | 동기 (지표 바 반영) | 병동·월별 환자수 |
| HBTM 팀결재 | 확정 시 연차 자동생성 → 팀결재 인박스 | 비동기 (확정 부작용) | [[HBNS202]] 참조 |
화면 플로우 (상태 머신 필수)
그리드는 근무표의 정본 편집면. 셀은 draft 편집이며, 확정·게시([[HBNS202]])는 항상 사람이 실행 — destructive. 상태 전이 최종: 초안 → AI 생성 → 수정 중 → 확정 → 공유됨.
근무표 그리드 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 화면 진입 조건 | - | 조건1 [간호 관리자] · 조건2 [수간호사] 인증 시 "📋 근무표" 뷰로 노출. 진입 시 로드된 근무표 상태 배지(CASE01 [초안]~CASE05 [공유됨]) 표시 | 인증 세션 | 조건3 [간호사] 접근·편집 권한 TBU (뷰 전용 추정) |
| 01 | 초기 상태 | - | 당월·최근 병동 근무표 로드 | nurse_schedules | TBU: 로드 실패 처리 |
| ㄴ01-E | 근무표 미생성 월 | - | 빈 그리드 로드, 배지 CASE01 [초안] | nurse_schedules | AI 자동생성 대기 |
| 10 | 지표 바 | Output | "간호등급 -" / "준수율" / "간호사 143명" / "환자 60명" 4지표. 준수율 색 분기: 낮음 빨강 → 충족 초록 (25%에서 100%) | 준수율 = 비율 충족도 · HBNS230 | 25% 빨강 · TBU: 지표 계산 실패 표시 |
| ㄴ10-E | 환자수 미입력 월 | Output | "환자 0명" 표시 (HBNS230 원천 부재) | HBNS230 | |
| 20 | 근무표 그리드 | Grid | 행=간호사, 열=일자(요일 표시, 토 파랑/일 빨강)의 월 매트릭스 | nurse_schedule_entries | |
| ㄴ20-E | 간호사 0명 | Grid | 빈 그리드(행 없음) → HBNS210 등록 유도 | HBNS210 | TBU: 유도 표기 |
| ㄴ20a | 미배정 셀 | Grid | 공란/OFF 표시 | TBU: 기본값(공란/OFF) | |
| ㄴ21 | 간호사 열 | Cell | • 행별 간호사 성명 + 사번을 표시하고, "+"로 프로필 등록 동선을 여는 열 • "+" 클릭 → 간호사 프로필 등록 동선 (HBNS210) | HBNS210 | nurse_profiles · TBU: 등록 권한 역할별 차이 |
| ㄴ22 | 근무형태 열 | Cell | "데이전담" / "3교대" 표시. 근무형태별 AI 편성 패턴 분기([[HBNS201]]) | nurse_profiles.workType | 패턴 분기 |
| ㄴ23 | 일자 열 | Cell | 일자(요일) 헤더. 토 파랑 / 일 빨강 색상 구분 | ||
| ㄴ24 | 배정 셀 | Cell | 셀 코드 6종: "D"(주간 07-15, 노랑) / "E"(저녁 15-23, 초록) / "N"(야간 23-07, 보라) / "OFF"(회색) / "연차" / "교육" | assignmentType / shiftId | D/E/N 시간 추정 · TBU: 연차/교육 색 |
| ㄴ24-E | 미배정 셀 | Cell | 공란 표시 | TBU: 기본값 | |
| ㄴ24a | 매핑 밖 키 입력 | Cell | 매핑 밖 키 무시(추정) | ||
| ㄴ25 | 셀 편집 (키보드 단축 입력) | Keyboard | • 배정 셀을 키보드 단축 입력으로 즉시 편집하는 기능(별도 팝업 없음, 검증됨) • 셀 클릭 → 파란 선택 테두리 노출 - 키 입력(d/e/n 등) → 즉시 코드 변경, 배지 CASE03 [수정 중] 전이 + 하단 합계 재계산 | nurseScheduler.entry.update() (TC 확정: 04:4.6) | isManualOverride 기록 추정 |
| ㄴ25a | 확정·공유 상태 잠금 | Keyboard | CASE04 [확정]·CASE05 [공유됨] 상태 = 키 입력 무시(셀 편집 잠금, 검증됨) | [[HBNS202]] | TBU: 저장 실패 피드백 |
| 30 | 일별 합계 행 | Output | 그리드 하단 일자별 "D:0 E:0 N:0" 카운트(교대 분포). 셀 편집·AI 생성 시 재계산 | 배정 0 = "D:0 E:0 N:0" | |
| ㄴ30a | 월 간호사:환자 비율 | Output | • 합계행에 이번 달(주기) 간호사:환자 월 집계 비율을 추가 표기 (monthlyNursePatient()) — 환자수 입력된 날 합산 기준, "간호사 {n} : 환자 {n}"- CASE01 [환자수 입력일 0]: 미표기(days > 0일 때만 노출) | HBNS230 월별 환자수 · nurse_profiles | 신규 (코드 반영: 71f134e) · 배경: 7/21 베스트 요구(간호인력 비율 노출) 일부 반영 |
| 40 | 액션 바 | Button | "AI 자동생성"(보라) / "확인"(초록) / 클립보드 / "인쇄" / "?"(disabled) 노출. 하위 41~45 참조 | [[HBNS201]] / [[HBNS202]] / [[HBNS203]] | |
| ㄴ41 | AI 자동생성 | Button | • 전체 근무표를 3교대로 자동 편성하는 기능. 준수율 최적화, 연차·교육 보존 • 클릭 → 즉시 실행(설정 모달·컨펌 없음) - STEP1 실행 중 배지 CASE02 [AI 생성]("AI 생성 중") + "취소" 노출- STEP2 완료 시 배지 "AI 생성" · 준수율 갱신 | [[HBNS201]] | isAiGenerated |
| ㄴ41a | 취소·폴백 | Button | 취소는 abort 완료 전 미적용(P1 안전갭). AI 실패 시 제약 솔버 폴백(constraint-fallback) | [[HBNS201]] | 상세 [[HBNS201]] |
| ㄴ41b | 엔트리 검증 | - | • 생성 후·확정 전 근무표 엔트리를 검증하는 단계(nurseScheduler.entry.validate({scheduleId}))• AI 생성/수정 결과를 확인(확정) 전 무결성 검증에 사용 (TC 확정: 04:4.3) | [[HBNS202]] 확정 직전 QA | 신규 흐름 (TC 확정) · UI 노출 위치 TBU |
| ㄴ42 | 확인 | Button | • 근무표를 확정 상태로 넘기는 기능 — destructive • 클릭 → 컨펌 "근무표 확정 — 이 근무표를 확정하시겠습니까? 확정 후에는 수정이 제한됩니다." → 확정(배지 "확정" + 셀 편집 잠금) - STEP1 확정 후 버튼 "확인"→"제출" 2단계 전환 | [[HBNS202]] | 검증됨 · CASE04 [확정] 전이 |
| ㄴ43 | 클립보드 | Button | • 근무표를 복사하는 유틸(추정) • 클릭 → 근무표 복사(추정) | [[HBNS203]] | TBU: 동작 상세 |
| ㄴ44 | 인쇄 | Button | • 근무표를 출력하는 유틸(추정) • 클릭 → 근무표 출력(추정) | [[HBNS203]] | TBU: 출력 포맷 |
| ㄴ45 | "?" 도움말 | Button | • 도움말 유틸(비활성 disabled, 미구현, 검증됨) • 클릭 → 무반응·무피드백 | [[HBNS203]] | disabled |
| 50 | 병동 관리 탭(좌측) | Tab | • 좌측 "병동 관리"(비활성·흐림) 탭. 병동 관리 기능은 ⚙ "병동 관리 및 설정" 모달로 통합된 것으로 관찰 • 클릭 → 무반응(비활성) | ⚙ 모달(HBNS240) | 비활성 |
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 | 비고 |
|---|---|---|---|
CASE01 [초안] | 근무표 미생성 월 로드 | 빈 그리드, 배지 "초안" | AI 자동생성 대기 |
CASE02 [AI 생성] | "AI 자동생성"(보라) 즉시 실행 | 전체 셀 3교대 편성, 준수율 25%→100%, 배지 "AI 생성" | [[HBNS201]] |
CASE03 [수정 중] | 배정 셀 클릭 → d/e/n 키 입력 | 파란 테두리 → 즉시 변경(팝업 없음), 배지 "수정 중", 하단 합계 재계산 | isManualOverride 기록 추정 |
CASE04 [확정] | "확인"(초록) → 컨펌 → 확인 | 배지 "확정" + 셀 편집 잠금(키 입력 무시), 버튼 "확인"→"제출" | destructive, [[HBNS202]] |
CASE05 [공유됨] | 확정 후 "제출"(사람) | 배지 "공유됨", 확인/제출 버튼 소멸(AI 자동생성만 잔존) | 2단계 워크플로 |
| 간호사 추가 | 간호사 열 "+" | 간호사 프로필 등록 동선 (HBNS210) |
Open Question
- 연차·교육 셀 색상 팔레트 = TBU (D 노랑/E 초록/N 보라/OFF 회색은 확정)
- isManualOverride vs isAiGenerated 셀 표시 구분 여부 = TBU
- 준수율 25%에서 100% 계산식(비율 규칙 원천) = TBU
- 간호사 열 "+" → HBNS210 등록 상세 동선 = TBU
조건3 [간호사]그리드 접근 시 편집 권한 범위 = TBU- 셀 저장 실패·로드 실패 에러 피드백 = TBU
- 7/21 베스트 요구(간호인력 비율 노출) 중 환자수 팝업 경고는 별도 잔여 = TBU (합계행 월 비율 ㄴ30a는 71f134e로 반영)