경영 대시보드와 월별 청구 금액
제품 개발 기록 · 조직·권한 · 급여 시트 · 급여 배포 · 스케줄링
경영 지표의 조회·집계와 청구 금액 입력을 설명합니다. 화면의 금액은 교육용 예시이며 실행한 조작과 미확인 항목은 아래 영상 기록에서 구분합니다.
목적·접근·데이터 전제
경영진과 급여 조회 담당자가 조직의 청구 금액, 급여, 인센티브, 병동 인력을 읽고 월별 청구 금액을 직접 저장합니다. 관리자 기타 → 경영 대시보드, /admin/#embed/mgmt-dashboard에서 /management-dashboard/?embedded=1을 임베드합니다. 별도 앱 루트는 /management-dashboard/, 특정 월은 /management-dashboard/detail/2026-08입니다. 임베드 안의 월 경로와 바깥 관리자 해시는 서로 다른 라우트이므로 바깥 주소만 공유하면 월까지 보존된다고 단정하지 않습니다.
조회 API는 현재 조직과 payroll:read를 요구하고 청구 저장·삭제는 payroll:update를 요구합니다. 일반 화면에는 팀/본인 한정 필터가 없으며 조직 전체 집계입니다. 역할과 계정 연결은 조직·권한, 로그인은 인증을 따릅니다.
급여 값에는 PayrollRecord, 인센티브에는 취소·대체되지 않은 FixedIncentive, 병동에는 활성 병동의 배치비율 설정과 환자·간호사 프로필이 필요합니다. 청구는 RevenueEntry에 조직×년월 한 건으로 저장합니다. 심사청구 시스템 자동 연동이나 팀별 매출 입력은 없습니다.
지원 조작과 기간 범위
| ID | 조작 | 사용 위치·결과 |
|---|---|---|
| MD01 | 연간 흐름의 연도 선택·계열 표시 전환·툴팁 | 상단 연간 흐름 |
| MD02 | 기준월·비교월 선택 | 월간 비교 카드 |
| MD03 | 기준년·비교년·지표 선택 | 연간 비교 차트 |
| MD04 | 월 목록의 연도 이동 | 월별 현황과 청구 표의 연도 |
| MD05 | 월 선택·이번 달 복귀·직접 월 진입 | 월 상세 카드·팀·인센티브·병동 재조회 |
| MD06 | 팀 상세 펼침·접기·정렬 | 팀별 인건비 |
| MD07 | 인센티브 요약·오늘/어제 비교 | 월 집계와 당일 집계 |
| MD08 | 인센티브 상세 열기·정렬·페이지 | 30건씩 상세 내역 |
| MD09 | 병동 인력·배치비율 조회·정렬 | 병동별 인력 현황 |
| MD10 | 청구 금액 추가·같은 월 덮어쓰기 | + 청구 금액 추가 |
| MD11 | 상세 청구 카드 금액 수정·취소 | 월 상세의 청구금액 카드 |
| MD12 | 청구 표 인라인 수정·취소 | 년월별 연필·확인·취소 |
| MD13 | 청구 표 삭제·0원으로 입력 취소 | 해당 월 청구 값을 미지정으로 변경 |
| MD14 | 페이지 새로고침·재진입 | 서버 값 다시 조회 |
일별 급여·인센티브·병동·팀 숫자는 조회 전용입니다. 여기서 급여 확정, 인센티브 승인·지급, 병동 인원 배정, 파일 내보내기, 예산 확정, AI 예측을 실행하는 컨트롤은 없습니다. app.ts의 남은 AI 시안 데이터·연간 추이 헬퍼는 현재 뷰에 노출되는 기능과 구분합니다.
분석과 월 상세를 읽는 순서
- 관리자 메뉴로 들어와 연간 흐름의 연도와 청구 / 인건비 / 차액을 고릅니다. 계열 버튼은 각 선을 숨기거나 다시 보여 줍니다. 차트 위에 포인터를 올려 월별 값을 확인합니다. 단위는 백만원입니다.
- 청구와 급여가 모두 없으면 아직 보여드릴 흐름이 없어요와 청구 금액 입력하기를 표시합니다. 한쪽만 있으면 해당 계열과 부족 데이터 안내만 나타납니다. 값이 없는 월은 0으로 꺾지 않고 빈 점으로 처리합니다.
- 월간 비교에서 기준월, 비교월을 각각 열어 연도·월을 고릅니다. 데이터 있는 월만 선택하며 처음에는 데이터가 있는 최근 두 달로 보정합니다. 청구·인건비·차액·인원 카드가 갱신됩니다. 하단 상세의 선택 월은 이 조작으로 바뀌지 않습니다.
- 연간 비교의 기준년, 비교년과 청구 / 인건비 / 차액 중 한 지표를 선택합니다. 데이터가 있는 해가 두 개 미만이면 비교 차트 대신 안내합니다.
- YYYY년 월별 현황에서
‹ / ›로 목록 연도를 바꾸고 원하는 월을 누릅니다. 미래 월은 선택할 수 없습니다. 연도 버튼만 누르면 하단 상세는 원래 선택 월에 남고, 실제 월 클릭 때 상세가 바뀝니다. 이번 달은 목록 연도와 상세 월을 현재로 맞춥니다. - N월 상세 내역에서 청구금액, 인건비(인센티브 포함), 차액(영업손익), 인력 충원도를 읽습니다. 청구가 없으면 차액은 미지정 상태입니다. 모바일의 월 띠는 가로 스크롤하며 선택 월을 가운데로 이동시킵니다.
현재 연간 흐름의 연도 선택은 analysisYear를 바꾸어 다시 그리지만 인건비 배열 laborCostData는 별도 filterYear 조회로 채워집니다. 두 연도가 달라졌을 때 인건비 계열이 비는지 반드시 확인해야 합니다. 코드에서 확인되는 분리 상태를 “연도 선택 시 모든 데이터가 함께 갱신”이라고 문서화하지 않습니다.
금액을 해석하는 기준
| 위치 | 현재 산식·정본 | 해석 경계 |
|---|---|---|
| 연간 흐름·월간 비교·연간 비교 | 청구 − 급여 총지급액 | 인센티브 별도 가산 없음. 비교 카드는 만원 단위 반올림 |
| 월 상세 인건비 | 급여 총지급액 + 해당 월 인센티브 총액 | 같은 비용이 이미 급여에 포함됐는지는 원천 운영에서 확인 필요 |
| 월 상세 차액 | 청구 − 급여 총지급액 − 인센티브 총액 | 전체 병원 회계상 영업이익을 산출하는 기능은 아님 |
| 월 칩 차액 | 월별 급여·청구 병합값에 선택 월의 인센티브를 반영하는 헬퍼 존재 | 다른 월과 상세 값을 비교할 때 같은 산식인지 확인 |
| 일별 인건비 데이터 | 급여 행의 마지막 수정 날짜별 현재 총지급액 합 | 하루마다 총액을 보존한 과거 스냅샷/발생 원가 아님 |
급여 조회는 주석의 “과거 확정·지급만”과 달리 실제 쿼리에서 cancelled만 제외합니다. 과거 월의 초안도 포함될 수 있습니다. 팀은 직원의 현재 활성 소속 중 하나로 결정하므로 다중 소속 또는 과거 팀 변경 후 과거 월을 재조회한 결과를 결산 시점의 팀별 금액으로 보장하지 않습니다.
팀별 인건비·인센티브·병동
- 팀별 인건비까지 스크롤합니다. 팀·총지급액·공제·실지급액과 합계를 봅니다. 상세가 있는 팀 행의 펼침 아이콘 또는 전체 펼치기 / 전체 접기를 누르면 급여의 세부 수당·공제 항목을 펼치거나 접습니다. 정렬 가능한 헤더를 누르면 방향을 바꿉니다. 데이터를 수정하지 않습니다.
- 인센티브 현황에서 총 건수/금액, 대기·승인·지급완료 건수, 카테고리별 금액/비중, 일별 금액을 확인합니다. 월 집계는
year/month, 일별 흐름은workDate또는 생성일을 사용합니다.supersededAt이 있는 대체된 기록과 취소 기록은 제외됩니다. - 일일 인센티브 요약은 선택 월과 무관하게 오늘 / 어제를 조회합니다. 치료 세션과 연결된 지급액·건수 등의 지표이므로 월 전체 집계와 직접 같은 기간으로 비교하지 않습니다.
- 인센티브 상세 내역을 펼쳐 직원·팀·분류·유형·근무일·단위·금액·상태를 확인합니다. 헤더 정렬과 하단 페이지 버튼을 사용합니다. 서버 모드의 정렬은 현재 받아온 페이지 안에서만 수행되고 페이지 변경 요청에는 정렬 조건을 보내지 않습니다. 전체 월의 전역 정렬이라고 안내하지 않습니다. 데이터가 없으면 **인센티브 데이터가 없어요.**로 표시됩니다.
- 병동별 인력 현황의 기준일을 확인합니다. 현재 월은 오늘, 다른 월은 그 달 말일 환자수를 사용합니다. 환자수 기록이 없으면 병동 설정의 병상 수를 대신 사용합니다.
- 병동별 환자 수, 현재 인력, 필요(주/석/야), 피크 필요, 과부족, 배치비율을 읽습니다. 현재 인력은 해당 병동의 활성 직원 간호사 프로필 수이며 선택 날짜 실제 근무표의 근무자 수가 아닙니다. 필요 인력은
ceil(환자수 ÷ 배치비율), 피크는 세 근무 중 최댓값, 과부족은 현재 인력−피크입니다. 해당 헤더를 누르면 정렬합니다.
비율을 설정한 활성 병동만 집계합니다. 법정 간호등급 판정 전체를 구현한 것은 아니며 화면의 등급 유지/부족 표시는 이 계산의 결과입니다. 배치비율·환자수·간호사 프로필의 수정은 스케줄링에서 수행하고 재조회합니다. 급여 정정은 급여 시트, 직원 소속 변경은 조직·권한에서 수행합니다.
청구 금액 생성·수정·삭제

관리자에 열린 청구 금액 표입니다. 아래 1번은 하단 청구 표, 2번은 표 오른쪽 위 추가 버튼, 4번은 월 행의 연필 버튼입니다. 병동·금액은 예시이며 다른 기기의 저장 결과는 이 이미지에 포함되지 않습니다.
- 화면 아래 청구 금액 내역 · YYYY년을 찾고 년월을 확인합니다. 미입력은 미지정입니다. 미래 월 금액은 로더가 현재 월 이하만 남기므로 사용자 화면에서 관리하지 않습니다.
- + 청구 금액 추가를 누릅니다. 년월을 선택하고 **청구 금액 (원)**에 예를 들어
468700000을 입력합니다. 폼 기본 금액은 0, 기본 년월은 열어 준 위치에서 정한 값입니다. 대상 월을 반드시 확인합니다. - 저장은
revenueUpsert를 호출합니다. 같은 조직·같은 월 값이 있으면 추가 합산하지 않고 대체합니다. 입력 검증은YYYY-MM의 유효 월과 0~1조 원이며 서버 스키마에 정수 제한은 없습니다. 일반 UI는 숫자 입력·포맷을 사용합니다. 성공 뒤 서버 목록을 재조회해 실제 ID와 값으로 맞춥니다. - 등록된 월 행 연필을 누르면 현재 금액을 채우고 선택합니다. 값을 바꾸고 확인 또는
Enter로 저장합니다. 취소 또는Esc는 입력을 버립니다. 이 인라인 경로는 숫자 외 문자를 제거하고 정수로 변환합니다. 미지정 월은 추가 버튼을 사용합니다. - 월 상세의 청구금액 카드에서도 편집 버튼을 눌러 값을 수정하고 확인/Enter로 저장할 수 있습니다. 취소/Esc는 서버를 바꾸지 않습니다.
- 청구 표의 편집 상태에서 삭제 아이콘을 누르거나 금액 0으로 저장하면 해당 월을 논리 삭제하고 미지정으로 되돌립니다. 0원 청구와 미입력을 구별하는 UI는 없습니다. 별도 삭제 확인 대화상자는 없습니다.
- 추가 모달의 취소/X/Esc는 입력을 바꿨으면 닫기 / 계속편집 확인을 거칩니다. 닫기는 저장하지 않고 기본값으로 초기화합니다. 성공 후 새로고침하고 같은 월을 다시 확인합니다.
서버는 updatedById와 수정 시각, 삭제자는 deletedBy를 보존합니다. 숫자 저장은 먼저 화면에 반영하고 실패하면 이전 배열로 되돌리며 **YYYY-MM 청구 금액을 저장하지 못했어요. 다시 시도해 주세요.**를 표시합니다. 추가 모달은 실패해도 호출 후 닫히므로 다시 열어 입력해야 합니다. 삭제 경로는 먼저 화면에서 제거하고 서버 실패를 별도 처리/복구하지 않습니다. 삭제 실패가 의심되면 재접속 후 값을 확인해야 합니다. 같은 월의 동시 편집 병합/충돌 UI는 없습니다.
원천·예외·재진입
앱 상태·계산과 실제 뷰, ManagementDashboardService, 조회·저장 API, 청구 검증 스키마가 근거입니다.
인증 완료 뒤 최초 데이터를 로드합니다. 개별 조회 함수들은 실패 시 배열·값을 비우는 경로가 있어 빈 데이터 안내가 실제 0건인지 API 실패인지 화면만으로 판별되지 않을 수 있습니다. 일부 데이터 묶음은 Promise.all 실패 시 함께 초기화됩니다. 오늘/어제와 팀 상세는 별도로 실패를 처리합니다. 새로고침/월 재선택으로 다시 조회하며, 오류 상태를 숨기기 위한 테스트 금액 자동 주입은 일반 모드에서 없습니다.
?demo=1은 디자인 검토용 강제 더미 모드입니다. 일반 모드는 빈 실데이터를 가짜 값으로 채우지 않습니다. 다만 더미 모드에서도 사용자가 청구 저장 컨트롤을 누르면 같은 저장 메서드를 호출하므로 읽기 전용 샌드박스라고 간주하면 안 됩니다. 화면의 예시 숫자와 현재 운영 금액을 섞어 검증하지 않습니다.
기존 기록과 남은 검증
HBMD000~260, 앱 소개, HTML 가이드를 대조했습니다. 명세의 localStorage.hereby_revenue_entries, 정적 월간 비교, 자동 더미 주입 설명은 과거 구현입니다. 현재는 조직별 서버 청구와 실제 급여 조회를 사용합니다. 소개의 팀별 매출 입력·일별 비용 추적 표현을 수정하고, 가이드의 메뉴·확정급여 한정·전체 기간 동시 변경 설명을 바로잡습니다. 동기화 명세와 생성 Markdown은 직접 수정하지 않습니다.
실행/미디어 미검증은 정확히 다음 범위입니다: 읽기 전용 권한 저장 거절, 청구 생성→다른 기기 같은 조직 조회→수정→0/삭제, 실패 시 롤백 및 삭제 재진입, 임베드 월 선택 후 새로고침/뒤로가기, 연간 흐름의 별도 연도 선택, 두 해 비교, 인센티브 페이지간 정렬, 병동 환자수 누락의 병상수 대체, 과거 월의 현재 팀/간호사 프로필 집계입니다. 청구 표는 읽기 위치만 설명하므로 추가 모달·저장 후 값·오류 복구·모바일 월 띠를 번호 표시한 새 캡처가 필요합니다.
경영 대시보드 사용 영상
처음에는 재생 버튼을, 다시 볼 때는 아래 동작 번호를 누르세요.
- 월 선택
「월별 현황」에서 작업할 월을 선택합니다. 영상은 2026년 9월 예제 자료입니다. 자세히 따라 하기
- 청구 금액 수정
해당 월 상세의 청구금액 카드에서 연필 모양 「청구금액 수정」을 누릅니다. 청구 수정 권한이 필요합니다. 자세히 따라 하기
- 금액 입력·저장
청구 금액을 원 단위로 입력하고 체크 모양 「저장」을 누릅니다. 영상의 예제 입력은 81,000,000원입니다. 자세히 따라 하기
- 월 상세 결과 확인
청구 금액과 차액이 갱신된 결과를 확인합니다. 입력한 금액은 저장되며 같은 조직의 담당자도 확인할 수 있습니다. 차액은 화면에 표시된 인건비 기준이며 병원 전체 회계 이익과는 구분합니다. 자세히 따라 하기
교육용 예제 조직에서 촬영했어요. 이름·금액·날짜는 교육용 예시이며, 사용 중인 조직의 자료를 확인하세요.
경영 대시보드 소개와 사용자 교육에서 실제 누르는 위치와 결과를 따라갈 수 있도록 번호 자막·강조 표시를 붙여 촬영했습니다. 별도 DB의 로컬 예제 조직·관리자 테스트 계정을 사용했습니다. 화면 크기는 1440×900입니다. 9월 청구 금액을 81,000,000원으로 수정하고 표시 결과를 확인했습니다. 다른 계정·기기의 동시 조회, 실패 시 롤백, 삭제와 재진입은 별도 검증 대상입니다.
앱 소개 · 영상 목록과 교육 범위 · 촬영·검증 기록
위젯별 기능 영상
기존 청구금액 수정 영상에 더해 병동 인력, 팀별 인건비, 월별 현황·상세, 월 인센티브, 오늘·어제 인센티브를 각각 촬영했습니다. 9월 선택, 팀 행의 펼치기·전체 접기, 8월로 변경한 상세 제목, 날짜·상태별 수치 읽기를 확인했습니다.
예제 A병동은 환자 35명·인력 12명·피크 필요 5명·과부족 +7명이며 간호 기준·병동 원천과 연결됩니다. 9월 인센티브는 2건·56만원, 영상의 오늘·어제 카드에는 발생 내역이 없습니다. 월 합계와 당일 집계가 다른 기준이라는 점을 자막과 글에 명시했습니다. 실제 데이터가 없는 카드를 숫자가 있는 것처럼 꾸미지 않았습니다. 캡처한 예제 자료의 화면 결과이며 운영 데이터의 정합성이나 모든 권한 조합의 검증은 아닙니다.