HBGA211_이수현황·이수기록
(Hereby) 총무 > 이수현황·이수기록
| 앱 | 총무 (HBGA) |
| 대상 사용자 | 조건1 [GA_ADMIN] / 조건2 [SUPER_ADMIN] |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_법정의무교육]] |
| Status | review |
| Owner | 카나 (PM) |
개요
- 교육 목록(HBGA210)에서 "이수현황" 진입 시의 인라인 서브뷰(모달 아님).
- 특정 교육의 직원별 이수기록(training_completions)을 조회한다.
- "+ 이수기록 추가" 모달로 신규 기록을 저장하고, "← 목록"으로 교육 관리 목록에 복귀한다.
- 제목은 "{교육명} - 이수현황"(예 "555555 - 이수현황"), 데이터 없으면 "데이터가 없어요.".
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 |
| 2026-07-13 | 카나 | PM | 버튼 행동 명세 보강 |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 + 확정 스타일 |
| 2026-07-21 | 카나 | PM | TC 크로스체크 확정분 반영 (🟡) |
Data I/O
Server → Client
| 변수 | 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
| $ | mandatory_trainings (name) | - | 제목 "{교육명} - 이수현황"에 name 표시 |
| $ | training_completions[] (employeeId/completedDate/expiryDate/hours/provider/certificateNumber/notes) | "데이터가 없어요." | 직원별 이수기록 목록. 목록 소스 = generalAffairs.training.completions (FK mandatoryTrainingId) (TC 확정: 05:5.3) |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 이수기록 추가 | {mandatoryTrainingId, employeeId, completedDate, expiryDate, hours, notes} (+provider/certificateNumber) | generalAffairs.training.addCompletion() (TC 확정: 05:5.3) — 이전 추정 trainingCompletion.create 는 실재하지 않음(정정). FK = mandatoryTrainingId | GA_ADMIN |
화면 플로우
이수현황 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | 교육 row "이수현황" 선택 시 인라인 서브뷰로 전환 (모달 아님) | [[HBGA210_교육 관리]] | |
| 01 | 초기 상태 | - | 백링크 + 제목 + "+ 이수기록 추가" + 직원별 이수기록 목록(또는 Empty) 노출 | ||
| 10 | 목록 복귀 | Button | • 교육 관리 목록으로 돌아가는 백링크 • 클릭 시: "← 목록" → 교육 목록 복귀 | [[HBGA210_교육 관리]] | |
| 20 | 제목 | Text | • 대상 교육명을 표기하는 헤더 "{교육명} - 이수현황" (예 "555555 - 이수현황") | mandatory_trainings.name | |
| 30 | 이수기록 추가 | Button | • 신규 이수기록을 생성하는 진입 버튼 • 클릭 시: "이수기록 추가" 모달 오픈 (필드는 하단 모달 사양표) | training_completions create · 이수기록 추가 모달 사양표 | |
| 40 | 이수기록 목록 | Table | • 직원별 이수기록을 나열하는 그리드 (training_completions[]) | training_completions | 컬럼 라이브 미확인 |
| 60 | AI — 이수증 OCR 초안 | AI/Suggest | • 이수증 이미지/PDF에서 교육기관·수료번호·이수일·이수시간을 추출해 폼을 채우는 초안 (greenfield) • 클릭 시: TBU | training_completions | TBU: ga.completionOcrDraft, 사람 저장 |
| 40-E | Empty | Text | • 이수기록 없을 때 노출 "데이터가 없어요." | 실재 empty 문구 |
이수기록 추가 모달 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | "+ 이수기록 추가" 클릭 시 모달 오픈 | 이수현황 사양표 30 | |
| 10 | 제목 | Text | • 모달 헤더 "이수기록 추가" | ||
| ㄴ11 | 직원 선택 | Dropdown/Search | • 이수 직원을 선택하는 필수 필드 "직원 선택 *" • 입력 시: 저장 활성 조건 충족 | Employee / employeeId | 필수 |
| ㄴ12 | 이수일 | DatePicker | • 이수일을 지정하는 필수 필드 "이수일 *" • 입력 시: 저장 활성 조건 충족 | completedDate | 필수 |
| ㄴ13 | 만료일 | DatePicker | • 만료일 지정 "만료일" | expiryDate | |
| ㄴ14 | 이수시간 | Input | • 이수시간 입력 "이수시간" | hours (numeric 5,1) | |
| ㄴ15 | 교육기관 | Input | • 교육기관 입력 "교육기관" | provider | |
| ㄴ16 | 수료번호 | Input | • 수료번호 입력 "수료번호" | certificateNumber | 감사 증빙 |
| ㄴ17 | 비고 | Input Box | • 비고 입력 "비고" | notes | |
| ㄴ18 | 이수증 첨부 | Upload | • 이수증 이미지/PDF를 첨부하는 업로드 • 클릭 시: TBU | 문서 저장소 | TBU: 라이브 미확인 |
| 20 | 취소 | Button | • 모달을 닫는 버튼 • 클릭 시: 모달 닫기 (변경 없음) | ||
| 30 | 저장 | Button | • 입력값으로 이수기록을 생성하는 버튼 • 클릭 시: generalAffairs.training.addCompletion({mandatoryTrainingId, employeeId, completedDate, expiryDate, hours, notes}) 실행 (필수 입력 전 disabled)- STEP1 직원·이수일 입력 전 disabled - STEP2 저장 성공 시 이수현황 갱신 | generalAffairs.training.addCompletion (FK mandatoryTrainingId) | mutation, 사람 저장 (TC 확정: 05:5.3) |
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 | 비고 |
|---|---|---|---|
조건1 [GA_ADMIN] | 교육 row "이수현황" 진입 | 이수현황 서브뷰 노출 | |
CASE01 [이수기록 있음] | 서브뷰 로드 | 직원별 이수기록 목록 노출 | |
CASE02 [이수기록 없음] | 서브뷰 로드 | "데이터가 없어요." 노출 | 실재 empty 문구 |
CASE03 [기록 추가] | "+ 이수기록 추가" → 저장 | 이수기록 생성 → 목록 갱신 | 직원·이수일 전 저장 disabled |
Open Question
- 이수기록 목록 컬럼 구성(직원/이수일/만료일/이수시간 등) 라이브 미확인 = TBU
- 이수증 첨부(업로드·저장소) 라이브 미확인 = TBU
- AI 이수증 OCR 초안(ga.completionOcrDraft) — greenfield, 진입 UI = TBU
- 대상 사용자 token 내부 key([GA_ADMIN]/[SUPER_ADMIN]) 미확정 = TBU
- tRPC procedure/권한 토큰 추정 — 사람 확정 필요 = TBU