HBNS202_확인 (확정·게시)
(Hereby) 팀 관리(team-manager) > 간호 스케줄러 > 근무표 그리드 > 확인 (확정·게시)
| 앱 | 간호 스케줄러 (team-manager 내장 탭, 포트 4004) |
| 대상 사용자 | 조건1 [간호 관리자] · 조건2 [수간호사] (확정·게시는 항상 사람) |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_AI안전경계]] · [[POL_간호스케줄 Lifecycle]] · [[POL_결재워크플로우]] |
| Status | draft |
| Owner | 카나 |
개요
- 확인(확정·게시) 은 "확인"(초록) 버튼으로 근무표를 정본으로 전이시키는 destructive 액션이다. 수정 중·AI 생성 working 상태를 확정/게시로 넘기는 정본 경계이며, 확정·게시는 항상 사람이 실행한다(자동 publish 절대 금지 — [[POL_AI안전경계]]).
- "확인" 클릭 시 컨펌 다이얼로그가 뜬다 — 제목 "근무표 확정", 본문 "이 근무표를 확정하시겠습니까? 확정 후에는 수정이 제한됩니다." + [취소]/[확인]. [확인] 시 확정이 실행되어 배지가
CASE04 [확정]으로 전이하고 셀 편집이 잠긴다(잠긴 셀에 키 입력 시 무시됨, 검증됨). - 확정은 2단계 워크플로다. 확정 실행 후 액션 버튼이 "확인" → "제출" 로 전환된다. "제출" 실행 시 배지가
CASE05 [공유됨]으로 전이하고, 확인·제출 버튼이 소멸한다(AI 자동생성 버튼만 잔존). 상태 전이 최종: 초안 → AI 생성 → 수정 중 → 확정 → 공유됨. - ERD상 확정 원천은
nurse_schedules.confirmedBy/confirmedAt/publishedAt/confirmedByEmployeeId다. - 확정 시 연차가 자동생성된다. 생성 기준은 확정 시점의 근무표 내 연차 셀 이며(연차 셀 수 = 생성 건수, 역방향 생성), 생성된 연차는 HBTM 팀결재(TM 결재함/연차 큐)로 전달된다 — 사유 문구 "근무표 확정 자동 생성", 상태 승인. 근무표에 연차 셀이 없으면 생성 0건이다(2026-08 근무표는 연차 셀 0 → 생성 0건, 기존 2026-04 확정분의 TM 연차 큐 항목들로 메커니즘 확인).
- 확정 직전 QA(complianceGapAlert: 연속야간 위험자·저배치일·교육 단독·연차충돌·준수율 미달)는 greenfield(신규 설계 후보)로, 정본 게시 전 사람 게이트를 보강하는 Donue 차별화 표면이다.
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 |
| 2026-07-12 | 카나 | PM | 실행 검증 반영 (콸 승인) |
| 2026-07-13 | 카나 | PM | 버튼 행동 명세 보강 |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 |
| 2026-07-21 | 카나 | PM | 셀 스타일 확정판 적용 (콸 승인) |
| 2026-07-21 | 카나 | PM | TC 크로스체크 확정분 반영 (🟡 — nurseScheduler.schedule.confirm/publish 2단계 확정, 엔트리 검증 흐름 신규 추가 등) |
Data I/O
Server → Client
| 변수 | DB 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
${schedule} | nurse_schedules (status + 상태 배지) | working 상태(초안/AI 생성/수정 중) | 초안/AI 생성/수정 중/확정/공유됨 |
${confirm_meta} | nurse_schedules.confirmedBy / confirmedAt / publishedAt / confirmedByEmployeeId | 미확정 시 null | 확정 시 기록 |
${qa_report} | 확정 직전 QA 체크리스트 (greenfield) | 미구현 → 없음 | 연속야간·저배치·교육 단독·연차충돌·준수율 미달 |
${leave_cells} | nurse_schedule_entries[] 중 assignmentType=연차 | 연차 셀 0건 | 연차 자동생성 기준(셀 수 = 건수) |
Client → Server
| 액션 | 전달 값 | tRPC/SDK | 권한 토큰 |
|---|---|---|---|
| 엔트리 검증 (확정 전) | scheduleId | nurseScheduler.entry.validate({scheduleId}) (TC 확정: 04:4.3) — 생성 후·확정 전 엔트리 검증 | schedule:write (추정) |
| 확인(확정) | scheduleId | nurseScheduler.schedule.confirm({scheduleId}) (TC 확정: 04:4.4) — destructive, 배지 "확정" 전이 + 셀 편집 잠금, confirmedBy·confirmedAt 기록 | schedule:confirm (추정) |
| 제출(공유) | scheduleId | nurseScheduler.schedule.publish({scheduleId}) (TC 확정: 04:4.4) — 배지 "공유됨" 전이, publishedAt 기록. 확정 후 "확인"→"제출" 2단계 | schedule:publish (추정) |
외부 통합 (cross-app)
| 외부 시스템 | 데이터 | 동기/비동기 | 비고 |
|---|---|---|---|
| HBTM 팀결재 (TM 결재함/연차 큐) | 확정 시점 연차 셀 기준 연차 자동생성(역방향) | 비동기 (확정 부작용) | 사유 "근무표 확정 자동 생성", 상태 승인 |
화면 플로우 (상태 머신 필수)
확정·제출(공유)은 정본 경계 — destructive. QA는 확정 직전까지만, 제출(공유)은 항상 사람(자동 publish 금지). 확정 → 제출 2단계.
확인 (확정·게시) 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 확인 버튼 | Button | • working(초안/AI 생성/수정 중) 근무표를 정본으로 전이시키는 destructive 액션 • 클릭 → "근무표 확정" 컨펌 다이얼로그 노출(05) → [확인] 시 확정 실행 - CASE01 [AI 생성/수정 중]: 버튼 활성 - CASE02 [확정 이후]: 버튼이 "제출"로 전환 | [[HBNS200]] 액션 바 | 사람 실행 필수 · TBU: 간호사 권한 |
| 04 | 엔트리 검증 (확정 전) | - | • 생성 후·확정 전 근무표 엔트리를 검증하는 라이브 단계(nurseScheduler.entry.validate({scheduleId}))• 확정 컨펌(05) 진입 전 엔트리 무결성 검증에 사용 (TC 확정: 04:4.3) - greenfield QA(30, complianceGapAlert)와 별개 — 이쪽은 라이브 procedure | [[HBNS200]] ㄴ41b | 신규 흐름 (TC 확정) · UI 노출 위치·검증 규칙 상세 TBU |
| 05 | 확정 컨펌 다이얼로그 | Modal | • "확인" 클릭 시 뜨는 확정 확인 다이얼로그. 제목 "근무표 확정", 본문 "이 근무표를 확정하시겠습니까? 확정 후에는 수정이 제한됩니다." + [취소]/[확인] • 클릭 시: - CASE01 [취소]: working 상태 유지, 전이 없음 - CASE02 [확인]: 확정 실행 | [[POL_간호스케줄 Lifecycle]] | TBU: 확정 API 실패 처리 |
| 10 | 확정 전이 | - | • [확인] 시 배지 "확정" 전이 + 셀 편집 잠금 + confirmedBy/confirmedAt/confirmedByEmployeeId 기록 - STEP1 CASE02 [AI 생성]/CASE03 [수정 중] → CASE04 [확정]- STEP2 셀 편집 잠금(잠긴 셀 키 입력 무시, 검증됨) | [[POL_간호스케줄 Lifecycle]] | 배지 "확정" |
| ㄴ11 | 제출 (공유) | Button | • 확정된 근무표를 공유 상태로 게시하는 2단계 액션. 확정 후 액션 버튼이 "확인"→"제출" 전환 • 클릭 → 즉시 실행(컨펌 없음) → 배지 CASE05 [공유됨] 전이, publishedAt 기록, 확인·제출 버튼 소멸(AI 자동생성만 잔존) | [[POL_AI안전경계]] | 배지 "공유됨" · 항상 사람 실행 |
| ㄴ12 | lock 수준 | - | • 확정 시 근무표 셀이 편집 잠금됨 — 잠긴 셀 키 입력 시 무시(편집 불가, 검증됨) - CASE01 [잠금 상태 편집 시도]: 무반응(피드백 없음) | [[HBNS200]] 배정 셀 | 셀 편집 잠금 검증 |
| 20 | 연차 자동생성 | - | • 확정 시점의 근무표 내 연차 셀 기준으로 연차를 자동생성해 HBTM 팀결재(TM 결재함/연차 큐)로 전달하는 확정 부작용(비동기) | HBTM 팀결재 (연계) | 확정 부작용 |
| ㄴ20a | 생성 규칙 (역방향) | - | • 역방향 생성 — 연차 셀 수 = 생성 건수 | nurse_schedule_entries (assignmentType=연차) | 셀 수 = 건수 |
| ㄴ20b | 결재 항목 메타 | - | • 사유 문구 "근무표 확정 자동 생성", 상태 승인 | HBTM 팀결재 | UI 원문 |
| ㄴ20-E | 연차 셀 0건 | -E | • 연차 셀 0건이면 생성 0건 (2026-08 근무표: 연차 셀 0 → 0건) | Empty 케이스 | |
| ㄴ20c | 메커니즘 검증 | - | • 2026-04 확정분의 TM 연차 큐 항목들로 메커니즘 확인 | HBTM 팀결재 | 검증 사실 |
| 30 | 확정 직전 QA | AI/Read | • 확정 직전 체크리스트: 연속야간 위험자 / 저배치일 / 교육 단독 / 연차충돌 / 준수율 미달구간. greenfield — 미구현 | [[POL_AI안전경계]] / [[POL_간호인력·준수율]] | complianceGapAlert — 미구현, RFP 결정타 |
| 40 | 정본 경계 | - | • 생성·설명·제안·QA까지 AI, 확정·게시(publish)는 항상 사람. 자동 publish 절대 금지(전 역할 공통) | [[POL_AI안전경계]] / [[POL_결재워크플로우]] | 환자안전 직결 |
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 | 비고 |
|---|---|---|---|
CASE04 [확정] | "확인"(초록) → 컨펌 → 확인 | 확정, 배지 "확정" + 셀 편집 잠금(키 입력 무시), confirmedBy·confirmedAt 기록, 버튼 "확인"→"제출" | destructive, 검증됨 |
CASE05 [공유됨] | 확정 후 "제출"(사람) | 공유됨, 배지 "공유됨", publishedAt 기록, 확인/제출 버튼 소멸(AI 자동생성만 잔존) | 자동 publish 금지, 2단계 |
| 연차 자동생성 | 확정 | 연차 셀 기준 역방향 자동생성 → HBTM 팀결재 인박스(사유 "근무표 확정 자동 생성", 상태 승인) | 연차 셀 0이면 0건 · 2026-04로 확인 |
| 컨펌 취소 | "확인" → 컨펌 → 취소 | working 상태 유지, 전이 없음 |
Open Question
- 확정/공유 상태 배지에 대응하는 status enum 정확한 값(confirmed/published 매핑) = TBU
- 확정 직전 QA(complianceGapAlert) 구현 여부 = TBU (greenfield)
- 연차 자동생성 → HBTM 팀결재 결재 워크플로우 상세(반려·수정 시 근무표 반영) = TBU
- 확정 API 실패 시 처리·롤백 = TBU
조건3 [간호사]확정·제출 실행 권한 = TBU