HBNS000_간호 스케줄러 (앱 개요)
(Hereby) 팀 관리(team-manager) > 간호 스케줄러 > 앱 개요
| 앱 | 간호 스케줄러 (team-manager 내장, 포트 TBU) |
| 대상 사용자 | 조건1 [간호 관리자] · 조건2 [수간호사] |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_간호스케줄 Lifecycle]] · [[POL_AI안전경계]] |
| Status | draft |
| Owner | 카나 |
개요
- 간호 스케줄러는 월 단위 간호사 × 일자 그리드에 3교대(D/E/N)를 배정하는 근무표 워크스페이스다.
- Hereby ERP에서 AI 자동생성이 제품 코어로 이미 동작하는 유일 앱이며,
isAiGeneratedenum의 네이티브 본거지다. - AI 자동생성이 핵심 — 버튼 1회로 전체 간호사 근무표를 3교대 규칙에 맞춰 자동 편성하고 준수율(인력 비율 충족도)을 최적화한다(라이브 실측 25%에서 100%). 연차·교육 등 기존 배정은 보존된다.
- 핵심 경계(라벨 기준): 초안 → AI 생성 중 → AI 생성 → 수정 중 → 확정 → 공유됨. AI는 생성·제안·설명·검증까지만 관여하고, 확정·공유(publish)는 항상 사람이 실행한다(환자안전 직결, 자동 publish 금지 — [[POL_AI안전경계]]).
- 라이브 상태 라벨(초안/AI 생성 중/AI 생성/수정 중/확정/공유됨)과 내부 enum(draft→generating→ai_generated→editing→confirmed→published, 6단계)은 분리 표기한다.
generating단계는 SDKgenerationStatus폴링이 근거다 (TC 확정: 04:4.3). - 근무표 편집은 셀 클릭 선택 후 키보드 단축 입력(d/e/n 등)으로 즉시 배정하는 방식이며, 별도 팝업이 없다. 확정 시 셀 편집이 잠긴다.
- 로그인은 타 앱과 통일된 비밀번호/휴대폰 인증 2탭 구조다.
- 병동 관리 및 설정(⚙ 모달)은 5탭(병동 관리·인력 설정·교대 매핑·교육 정책·주기 설정)으로 구성되며, 인력 설정이 간호등급·준수율 계산의 원천, 교대 매핑이 NS→HR 급여 연동 고리다.
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 |
| 2026-07-21 | 카나 | PM | 셀 스타일 확정판 적용 (콸 승인) |
| 2026-07-21 | 카나 | PM | TC 크로스체크 확정분 반영 (🟡 — nurseScheduler.* 네임스페이스, status 6단계 generating 추가, 근무형태 변경 백로그 Open Question) |
Data I/O
Server → Client
| 변수 | DB 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
${jwt_session} | 인증 세션 (조건1 [간호 관리자] / 조건2 [수간호사]) | /nurse-scheduler/signin 리다이렉트 | |
${period} | 년(2024-2028) / 월(1-12) | 기본 당월 | |
${ward} | wards[] — "간호부 (IMPORT-간호부-...)" / "1 (WARD_...)" | 기본 병동(최근/첫 병동) TBU | 표시 라벨 원문 |
${schedule} | nurse_schedules + 상태 배지 | 초안 없음 시 빈 그리드 TBU | |
${roster} | nurse_schedule_entries[] — 셀별 D/E/N/OFF/연차/교육 | 미배정 셀 빈칸 | |
${compliance} | 준수율 (비율 충족도 계산) | 미산정 시 TBU | 실측 "25%에서 100%" |
Client → Server
| 액션 | 전달 값 | tRPC/SDK | 권한 토큰 |
|---|---|---|---|
| AI 자동생성 | scheduleId | nurseScheduler.schedule.generate({scheduleId}), 진행상태 폴링 .generationStatus(scheduleId) (TC 확정: 04:4.3) | TBU |
| 엔트리 검증 | scheduleId | nurseScheduler.entry.validate({scheduleId}) (생성 후·확정 전) (TC 확정: 04:4.3) | TBU |
| 셀 배정 편집 | entryId, assignmentType, shiftId | nurseScheduler.entry.update() (TC 확정: 04:4.6) | TBU |
| 확정 | scheduleId | nurseScheduler.schedule.confirm({scheduleId}) (TC 확정: 04:4.4), destructive | TBU |
| 공유(제출) | scheduleId | nurseScheduler.schedule.publish({scheduleId}) (TC 확정: 04:4.4), destructive | TBU |
외부 통합 (cross-app)
| 외부 시스템 | 데이터 | 동기/비동기 | 비고 |
|---|---|---|---|
| Admin 병동 관리 (HBAD230) | Ward 마스터 원천 — 병동 탭 "1 (WARD_...)" 반영 | 동기 | |
| Admin 근무 설정 (HBAD260) | 근무 그룹·유형(shifts/shift_groups) 원천 | 동기 | |
| Time Management (HBTM) | 확정 시 연차 자동생성 → 팀결재 인박스 / 스케줄러 embed | 비동기 | 연차 큐 연동 확인 |
| HR (HBHR240 병동 환자수 · HBHR230 출퇴근) | 환자수·근태 원천 연계 | 동기 | |
| Medical (HBMD) | 병동별 인력 현황 ("스케줄러와 병동 관리로 계산") | 동기 |
화면 플로우 (상태 머신 필수)
확정·공유는 정본 경계 — destructive. AI/검증은 확정 모달 직전까지만, publish는 항상 사람. AI 자동생성 실패 시 제약 솔버 폴백(constraint-fallback)으로 편성한다(코드 확인 사실).
앱 개요 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 화면 진입 조건 | - | • 앱 진입 시 간호 관리자 인증을 요구하는 게이트 • 진입 시: 조건1 [간호 관리자]/조건2 [수간호사] 인증이면 노출- CASE01 [미인증]: /nurse-scheduler/signin 리다이렉트 (세션 만료 시 재인증, 인증 실패 시 로그인 화면 유지) | 인증 세션 | TBU: 간호사(조건3) 접근 범위 |
| 01 | 초기 상태 | - | • 진입 직후 로드되는 근무표 • 진입 시: 최근 근무표(당월·최근 병동)로 로드, CASE01 [초안] 배지 표시- CASE01 [근무표 미생성 월]: 빈 그리드 - CASE02 [병동 미선택]: 기본 병동 로드 | TBU: 초안 없을 때 배지 표시 · 기본 병동 로직·로드 실패 처리 | |
| 10 | 정체성 | - | • 월 단위 간호사×일자 3교대 근무표 + AI 자동생성 — Hereby에서 AI가 제품 코어로 도는 유일 영역 | [[HBNS201]] | isAiGenerated 본거지 |
| 20 | Lifecycle | - | • 초안 → AI 생성 중 → AI 생성 → 수정 중 → 확정 → 공유됨 (라벨 vs 내부 enum draft→generating→ai_generated→editing→confirmed→published 6단계 분리) | [[POL_간호스케줄 Lifecycle]] | 전이 검증됨(exec-diff) · generating 추가 (TC 확정: 04:4.3) |
| 30 | 뷰 탭 | - | • "📋 근무표" / "👩⚕️ 간호사" / "📝 내 희망 일정" 3뷰 • 클릭 → [[HBNS200]] / [[HBNS210]] / [[HBNS220]] 각 전환 | [[HBNS200]] / [[HBNS210]] / [[HBNS220]] | |
| 40 | 화면 목록 (I.A.) | - | • HBNS100 Shell / HBNS200 그리드 / HBNS201 AI 생성 / HBNS202 확정 / HBNS203 유틸 / HBNS210 프로필 / HBNS220 희망 일정 / HBNS230 환자수 / HBNS240 병동 설정 / HBNS250 다중 병동 | 앱 하위 화면 | |
| 50 | cross-app 연결 | - | • HBAD230(병동 원천) · HBAD260(근무 유형) · HBTM(연차 자동생성) · HBHR240(환자수) · HBHR230(출퇴근) · HBMD(인력 현황) | Data I/O cross-app 참조 | |
| 60 | AI 안전 경계 | - | • AI는 생성/제안/설명/검증까지만 — 확정·공유는 항상 사람, 자동 publish 절대 금지 | [[POL_AI안전경계]] | 환자안전 직결 |
| 70 | AI 자동생성 폴백 | - | • AI 자동생성 실패 시 제약 솔버 폴백(constraint-fallback)으로 편성 | [[HBNS201]] | 코드 확인 사실 |
AI 접점 요약
간호 스케줄러의 AI 진입 표면은 "AI 자동생성" 버튼 = 근무표 편성 엔진이며, 이것만 라이브 구현 완료 상태다. 그 위 설명층/편집 코파일럿/확정 QA/자연어 질의/부분 재생성 6종은 전부 신규 설계 후보(greenfield) = Donue 차별화 표면이다. 핵심 룰: AI는 생성·설명·제안·QA까지, publish는 사람 확정.
| AI Skill | 트리거 위치 | 동작 | 구현 | 우선도 |
|---|---|---|---|---|
| schedule.generate | "AI 자동생성" ([[HBNS201]]) | 전체 근무표 3교대 자동 편성, 준수율 최적화 (nurseScheduler.schedule.generate, TC 확정: 04:4.3) | 라이브 구현 | ★★★★★ |
| scheduleExplain | 생성 결과 셀/행 (greenfield) | "왜 이 배정? 어떤 제약 만족? 대안이 왜 막힘" 설명 카드 | greenfield (RFP 결정타) | ★★★★★ |
| swapSuggest | 셀 수정 (editing, greenfield) | 영향범위·위반규칙·대체추천 + 교대교환 제안 | greenfield | ★★★★☆ |
| complianceGapAlert | 확정 직전 ([[HBNS202]], greenfield) | 연속야간 위험자/저배치일/교육 단독/연차충돌/준수율 미달 체크리스트 | greenfield | ★★★★★ |
| naturalQuery | 전체 스케줄 (greenfield) | "이번달 가장 위험한 날?" "희망반영률 80%↓만" | greenfield | ★★★★☆ |
| constraintFromNL | 부분 재생성 (greenfield) | "야간 편중만 완화해서 다시" "김간호사 주말 빼줘" → 제약 반영 재편성 | greenfield | ★★★★☆ |
연차 자동생성 (확정 연동)
| 항목 | 사양 |
|---|---|
| 트리거 | 확정 시점(확인→컨펌→확정 완료) |
| 생성 기준 | 근무표 내 연차 셀 기준 역방향 생성 — 연차 셀 수 = 생성 건수 |
| 사유 텍스트 | "근무표 확정 자동 생성" (원문 카피) |
| 상태 | 승인 |
| 연동처 | HBTM 팀결재(TM 결재함 / 연차 큐) |
| 검증 | 2026-08 확정분: 연차 셀 0 → 생성 0건. 2026-04 확정분: 큐 유입으로 메커니즘 확인 |
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 | 비고 |
|---|---|---|---|
CASE01 [미인증 진입] | /nurse-scheduler 직접 | /nurse-scheduler/signin 리다이렉트 | |
CASE02 [AI 생성] | AI 자동생성 | 생성 중(취소 노출) → AI 생성 상태(준수율↑) | 취소는 abort 완료 전 미적용 |
CASE03 [수정 중] | 셀 클릭 + d/e/n 입력 | 즉시 배정, 배지 "수정 중" | 팝업 없음 |
CASE04 [확정] | 확인(초록) → 컨펌 확인 | 확정, 배지 "확정" + 셀 편집 잠금, 연차 자동생성 → HBTM | destructive |
CASE05 [공유됨] | "제출" 클릭 | 공유됨, 확인/제출 버튼 소멸(AI 자동생성만 잔존) | destructive |
Open Question
- 비율 규칙(1:5/1:7/1:10) 설정 화면 위치 = TBU
- 확정/공유 상태 전이의 정확한 내부 enum 매핑 = TBU
- 초안 ↔ AI 생성 배지 표시 조건(수정 후 라벨 유지 여부) = TBU
- AI 자동생성 undo/rollback 여부(취소 완료 전 미적용은 확인) = TBU
- 내 희망 일정 ↔ AI 제약 반영 흐름 = TBU
- team-manager 포트/프로토타입 = TBU
- AI 자동생성 권한 토큰 정확 명세 = TBU (SDK 메서드는
nurseScheduler.schedule.generate/.generationStatus로 확정, TC 04:4.3) - 근무형태 변경 요청·승인 화면 사양서 부재 = 신규 화면 백로그: 라이브에
nurseScheduler.workTypeChange.request({requestedWorkType, reason, effectiveDate})→.approve({id})흐름이 실재하나(TC 확정: 04:4.5) 대응 화면 사양서가 없다.NurseWorkTypeenum = three_shift / night_dedicated / day_dedicated (two_shift 없음, TC 확정: 04:4.5).