총무 교육·정기업무·공지
제품 개발 기록 · 조직·권한 · 알림 · 메시지 · 재고
공지의 작성·게시·확인과 총무 업무의 연결을 설명합니다. 실행한 조작과 미확인 항목은 아래 영상 기록에서 구분합니다.
대상·권한·진입 경계
총무 담당자가 교육 정의와 직원 이수, 반복 점검업무와 실행 이력, 조직 공지와 확인 기록을 관리합니다. 조직 세션과 generalAffairs 리소스의 read, 생성 create, 수정·실행 갱신 update, 삭제 delete 권한을 각 API가 검사합니다. 확인 인원 표시값과 관리자 대리 확인은 generalAffairs:manage가 추가로 필요합니다. GA_ADMIN이라는 역할명만으로 모든 권한이 있다고 단정하지 않습니다.
| 화면 | 관리자 진입 | 별도 앱 경로 | 현재 공개 상태 |
|---|---|---|---|
| 공지 | 총무 → 공지, /admin/#embed/ga-notices | /general-affairs/notices?embedded=1 | 메뉴 진입 가능 |
| 교육·업무 요약 | /admin/#embed/ga-dashboard | /general-affairs/ | 관리자 메뉴 대시보드는 준비중·비활성 |
| 교육 관리 | /admin/#embed/ga-training | /general-affairs/training | 관리자 메뉴 총무는 준비중·비활성 |
| 반복 업무 | /admin/#embed/ga-tasks | /general-affairs/tasks | 관리자 메뉴 관리는 준비중·비활성 |
| 알림 설정 | 관리자 설정의 알림 영역 | /general-affairs/settings는 미등록 | 총무 설정 경로 제거 |
준비중 세 화면은 코드와 직접/임베드 라우트가 남아 있고 관리자 라우트 자체에 차단이 없습니다. 아래 교육·업무 절차는 이 구현을 설명하는 유지보수·QA 절차이며, 일반 사용자에게 공개된 메뉴라고 안내하지 않습니다. 직접 경로의 배포 접근과 권한별 렌더링은 새 실행 검증이 필요합니다. 인증 절차는 인증, 직원 선택 데이터는 인사 기록에 연결됩니다.
조작 목록
| ID | 현재 구현의 조작 | 절차 |
|---|---|---|
| GA01 | 요약 조회·카드로 관련 탭 이동 | 대시보드 |
| GA02 | 교육 이름·분류·활성 필터, 페이지 이동 | 교육 |
| GA03 / GA04 / GA05 | 교육 생성 / 수정·비활성 / 삭제 | 교육 |
| GA06 / GA07 | 교육별 이수 내역 조회 / 직원 이수 추가 | 이수 |
| GA08 | 업무 이름·분류 검색·페이지 이동 | 정기업무 |
| GA09 / GA10 / GA11 | 업무·체크리스트 생성 / 수정 / 삭제 | 정기업무 |
| GA12 / GA13 / GA14 | 실행 내역 조회 / 오늘 실행 생성 / 예정일·상태·체크·메모 수정 | 실행 |
| GA15 | 공지 검색·분류·게시 상태·페이지 이동 | 공지 |
| GA16 / GA17 / GA18 | 공지 작성 / 미게시 수정·게시 / 미게시 삭제 | 공지 |
| GA19 | 본문 보기·첨부 다운로드 | 공지 |
| GA20 | 확인 내역·팀별 필터·미확인 직원 조회 | 확인 내역 |
| GA21 / GA22 | 표시 인원 설정·해제 / 선택 직원 대리 확인 | 확인 내역 |
목록은 30건씩이며 « ‹ 페이지 › »로 이동합니다. 필터 변경은 첫 페이지로 돌아갑니다. 교육 이수 수정 API는 있으나 이수 목록에 수정·삭제 UI는 없습니다. 실행 삭제, 엑셀 출력, 자동 반복 실행 생성 설정, 공지 게시 취소·재게시·예약 게시 UI도 없습니다.
공지 작성·게시·열람
- 관리자 총무 → 공지를 엽니다. 분류(전체/교육마감/시설/안전/정책/일반), 상태(전체/미게시/게시 중/만료), 제목 / 내용 검색으로 좁힙니다. 검색은 300ms 후 조회하고 검색 입력의 지우기 버튼으로 해제합니다.
- + 공지 작성을 누릅니다. 예: 제목
9월 안전교육 안내, 내용9월 24일까지 교육을 이수해 주세요.를 입력합니다. - 아래 설정을 정하고 저장합니다. 기본은 미게시입니다. 직원에게 공개하려면 즉시 게시를 켜고 저장합니다. 기존 미게시 공지는 행 수정에서 즉시 게시를 켜 저장합니다.
publishNoticeAPI가 있어도 현재 목록에 독립 게시 버튼은 없습니다.
| 필드 | 필수·기본값·검증·영향 |
|---|---|
| 제목 / 내용 | 필수. 제목 1~200자, 내용 1자 이상. UI는 공백만 있는 입력을 저장하지 않음 |
| 카테고리 / 우선순위 | 기본 일반 / 보통. 우선순위 낮음·보통·높음·긴급 |
| 만료일시 / 무기한 | 기본 무기한 꺼짐. 그때 UI는 만료일시를 요구함. 무기한을 켜면 날짜 입력을 숨기고 null 저장. 날짜 도래 시 게시중에서 만료로 파생 표시 |
| 즉시 게시 | 기본 꺼짐. 켜면 isPublished=true와 게시 시각을 저장하고 게시 알림을 요청 |
| 게시 팀 | 선택 없음 = 전체 직원. 선택하면 해당 팀 대상. 전체 선택/해제와 개별 체크 제공. 조직 활성 팀 목록 사용 |
| 확인이 필요 없는 정보 게시글 | 기본 꺼짐(requiresAcknowledgment=true). 켜면 정보 배지·확인 불필요 표시, 미확인 집계 제외 |
| 확인 인원 표시값 | 선택. 빈 값은 실제 수, 0~100000 정수. 실제 확인 행은 별개 |
| 첨부파일 | 선택. 파일 추가 후 대기 목록에 표시하고 저장할 때 fileStorage.uploadFile(..., 'notice')로 업로드. 대기 파일·기존 첨부 제거 가능 |
- 저장 성공 시 모달을 닫고 목록을 다시 불러옵니다. 미게시는 본문 보기·수정·삭제, 게시 중/만료는 보기·확인 내역만 제공합니다. 정보 게시글은 확인 내역 대신 확인 불필요가 표시됩니다.
- 보기는 목록에 이미 포함된 본문을 읽기 전용 모달로 보여 줍니다. 이것은 직원의 확인 행을 만들지 않습니다. 첨부를 누르면 저장 경로의 다운로드 URL을 받아 파일을 엽니다. 실패하면 재시도 안내를 띄웁니다.
- 미게시 → 삭제 → 확인은
deletedAt을 기록합니다. 확인 취소는 유지합니다. 이미 게시된 공지는 만료되었어도 서버가 수정·삭제를 거절합니다. 내용 정정이 필요하면 새로운 공지를 작성하는 절차를 사용하며, 기존 게시를 취소하는 UI는 없습니다.
게시 상태는 isPublished와 만료일로 계산합니다. 만료는 확인 여부가 아니며, 무기한 공지도 모든 직원이 확인했다는 뜻이 아닙니다. 푸시는 게시 저장 이후 비동기 요청하고 실패를 로그에 남기므로 저장 성공만으로 단말 수신을 보장하지 않습니다. 알림과 메시지에서 수신 경로를 확인합니다.
확인 기록·표시 인원·대리 확인

공지 확인 내역 화면입니다. 사번·직원·팀·확인 시각 표를 보여 주며 아래 1~3번의 진입·기록 열 설명에 대응합니다. 확인 인원 요약·표시값 입력·대리 확인 컨트롤은 이 이미지에 포함되지 않습니다.
- 총무 → 공지 → 게시 중 또는 만료 행 → 확인 내역을 누릅니다. 읽기 권한으로 확인자, 확인 시각, 현재 활성 소속 팀, 관리자 처리 여부, 미확인 대상과 요약을 조회합니다.
- 게시 시 지정한 팀이 있으면 팀 필터에서 확인/미확인 목록을 좁힙니다. 전사 공지는 특정 게시 팀 옵션이 없습니다. 확인 내역을 닫고 다시 열면 최신 데이터를 조회합니다.
- 확인 인원은 지정한 표시값 우선, 실제는 확인 행 수, 대상은 현재 대상 직원 집합입니다. 단순 열람 수와 다릅니다. 직원이 메신저의 확인했어요를 눌러야 본인 확인으로 남습니다.
- 관리 권한으로 **확인 인원 표시값 (선택)**에
12를 입력하고 해당 저장을 누릅니다. 빈칸 저장은 수동값을 해제합니다. 음수·소수는 오류이며 100000 초과는 서버가 거절합니다. 표시값을 바꾸어도 실제 직원의 확인 상태는 바뀌지 않습니다. - 미확인 직원에서 대상자를 체크하고 **선택 직원 확인 처리 (N)**를 누릅니다. 확인 대화상자에서 실행하면 같은 조직의 활성 직원 중 아직 확인하지 않은 직원에 한해 확인 행을 추가하며
processedById를 남깁니다. 기존 본인 확인 시각을 덮어쓰지 않습니다. 최대 500명을 받습니다. 취소는 변경하지 않습니다. - 처리 후 선택을 비우고 확인 내역과 공지 목록을 다시 조회합니다. 실패는 안내되고 입력/선택을 확인해 재시도할 수 있습니다. 정보 게시글은 두 변경 API 모두 거절합니다.
조회 실패는 이 모달에서 별도 오류 상태로 구분됩니다. 나머지 공지 목록의 빈 상태는 검색 결과 없음/공지 내역 없음으로 나뉘지만 조회 실패도 빈 배열로 처리되므로 장애와 실제 0건을 혼동하지 않아야 합니다. 팀 대상은 게시 당시 명단 스냅샷이 아니라 현재 소속을 조회하므로 팀 이동 후 대상 수가 달라질 수 있습니다.
준비중 구현: 대시보드
- QA용 직접 경로를 연 후 대시보드에서 교육 만료·지연 업무·대기 업무·게시 공지 네 카드를 확인합니다.
- 교육 만료 카드는 앞으로 30일 안에 만료될 직원별 이수 기록 수입니다. 교육 과정 수가 아닙니다. 지연·대기는 실행 기록의 저장된
overdue/pending상태 수입니다. - 각 카드는 교육/업무/공지 탭으로 이동합니다. 클릭 시 해당 위험 필터를 자동 선택하는 동작은 없습니다.
- 최근 공지는 게시일 내림차순 5건입니다. 게시중 카드와 달리 최근 목록 쿼리에는 만료 제외 조건이 없어 만료 공지가 포함될 수 있습니다. 조회 실패 시 네 수치는 0으로 초기화됩니다.
준비중 구현: 교육과 이수
- 총무(
/training)에서 카테고리, 활성/비활성/전체, 이름 검색을 사용합니다. + 교육 추가를 누릅니다. - 교육명을 1~200자로 입력합니다. 분류는 법정의무교육(기본)·인증필수교육·전문교육·기타, 주기는 매월·분기·반기·연간(기본)·2년·3년입니다. 필수시간·과태료(원)는 기본 0, 0 이상입니다. 교육대상·법적근거·과태료 설명·설명은 선택 텍스트이며 활성은 기본 켜짐입니다. 예:
개인정보 보호 교육, 연간, 1시간. - 저장하면
MandatoryTraining을 생성합니다. 수정은 같은 입력을 갱신하고, 삭제 → 확인은 교육을 논리 삭제합니다. 교육을 삭제해도 별도 이수 행을 한꺼번에 지우는 코드가 없습니다. - 행 이수현황을 누르면 해당 교육 ID로 필터된 이수 기록과 페이지를 엽니다. 목록으로 상세를 닫습니다.
- + 이수기록 추가에서 직원 선택 검색 결과를 실제 선택하고 이수일, 만료일을 입력합니다. 이름/사번 검색은 최소 1자, 최대 20명 결과입니다. 이수시간(기본 0, 0 이상), 교육기관, 수료번호, 비고는 선택입니다. 예: 이수일
2026-09-10, 만료일2027-09-09, 1시간. - 저장하면
TrainingCompletion에 직원·교육·날짜를 저장하고 선택 교육의 이수를 다시 조회합니다. 기본 상태는completed입니다. 교육의 주기를 고르는 것만으로 직원 이수/만료일을 자동 생성하지 않습니다.
만료일은 화면에 필수 별표가 없고 저장 버튼은 직원·이수일만 검사하지만 프런트가 new Date(expiryDate)를 보내며 서버는 유효 날짜를 필수로 받습니다. 빈 만료일 저장은 실패할 수 있으므로 현재 절차에서는 날짜를 넣습니다. 이수일보다 늦은 만료일 검증이나 중복 이수 방지 규칙은 이 스키마에 없습니다. 이수의 수정·삭제 버튼은 제공하지 않습니다.
준비중 구현: 반복 업무 정의와 실행
- 관리(
/tasks)에서 업무명 검색과 분류 필터를 사용하고 + 업무 추가를 누릅니다. - 업무명 1~200자, 분류(시설관리 기본/안전점검/소방/위생/장비/문서/규정준수/기타), 실행주기(매일/매주/매월 기본/분기/반기/연간), 실행일 기본 1, 담당자·설명, 활성 여부를 입력합니다. 담당자는 자유 텍스트이며 직원 계정 선택이 아닙니다. 실행일은 서버 0~31 정수, 폼은 1~31입니다.
- 체크리스트 → 추가로
비상구 적재물 확인같은 항목을 넣고 필요 시 필수를 켭니다. 새 항목의 UI 기본은 선택사항이며 제목은 1자 이상입니다. 행 제거는 폼에서 제외하고 저장할 때 반영합니다. - 저장은
RecurringTask와TaskChecklistItem을 생성합니다. 반복 주기만 설정해도 매일/매월 실행이 자동 생성되는 UI 흐름은 없습니다. - 기존 업무 수정은 상세 API에서 체크리스트를 다시 가져옵니다. 값을 바꾸고 저장하면 실행 목록 상태·완료일·체크리스트·메모 초기화 확인을 먼저 요구합니다. 확인 시 모든 기존 실행을 대기로 바꾸고 완료자·완료일·메모를 비우며 현재 체크리스트로 미완료 행을 다시 만듭니다. 예정일은 유지됩니다. 취소하면 편집 상태에 남습니다. 변경이 없으면 저장하지 않습니다.
- 업무 삭제 → 확인은 업무만 논리 삭제합니다. 실행내역에서 기존 실행을 보고 + 실행 생성을 누르면 현재 날짜를 예정일로 한 대기 실행과 미완료 체크 항목을 생성합니다.
- 실행 행 수정에서 예정일, 상태(대기/진행중/완료/지연/건너뜀), 체크 항목과 항목별 메모, 전체 비고를 바꾼 뒤 저장합니다.
- 서버는 체크리스트를 저장한 뒤 모든 필수 항목이 완료이고 항목이 하나 이상이면 실행 상태를 자동 완료로 덮어쓰고 완료 시각·완료자를 기록합니다. 필수 항목이 0개여도 선택 항목이 존재하면 이 조건이 성립합니다. 선택한 상태 그대로 남는다고 보장하지 않습니다. 체크 없이 상태만 완료로 바꾸는 경우에는 완료 시각 자동 기록 경로가 다릅니다.
동일 업무의 실행 생성을 반복하면 추가 실행을 만들 수 있으며 중복 예정일 방지 조건이 없습니다. 실패 후에는 실행 목록에서 생성 여부를 먼저 확인합니다. 정의 수정은 여러 이력을 한 트랜잭션으로 초기화하지만 일반 폼 저장 전체에 재전송 중복 방지가 있는 것은 아닙니다.
취소·오류·데이터 연결
교육·이수·업무·실행·공지 폼은 최초 값과 비교하는 닫기 보호를 공유합니다. 수정하지 않은 폼은 바로 닫히고 수정한 폼의 취소/X/Esc는 닫기 / 계속편집 확인을 엽니다. 닫기는 저장하지 않으며 재진입 때 초기값을 다시 채웁니다. 생성·수정 오류는 오류 대화상자로 표시합니다. 공지는 업로드 중 저장을 비활성화하지만 다른 폼 모두에 같은 중복 저장 가드가 있는 것은 아닙니다. 첨부 업로드 후 공지 저장 실패 시 업로드 파일 정리·재사용까지 성공했다고 볼 수 없습니다.
앱 조작, 뷰, GeneralAffairsService, API, 스키마가 연결 근거입니다. 이수·실행 이력은 총무 자체 모델이며 급여에 자동 금액을 생성하는 연결은 이 흐름에 없습니다. 재고도 독립 기능입니다.
기존 기록과 검증 경계
HBGA000~240, HBAD280, 앱 소개와 가이드 원본을 대조했습니다. 문서 정리에서는 소개의 별도 설정 메뉴를 제거하고 공개 메뉴를 공지 중심으로 바로잡았습니다. 교육/업무 구현은 지우지 않고 준비중 직접 경로로 기록했습니다. 기존 가이드의 “열람”은 실제로 확인 행이며 보기만 한 상태와 구분하도록 고쳤습니다. 동기화 명세와 생성 Markdown은 직접 수정하지 않았습니다.
실행한 조작은 아래 영상 기록에서 확인할 수 있습니다. 남은 검증은 게시 팀 0/1/복수의 직원 수신, 미게시 저장 후 재열기·게시, 만료/무기한, 첨부 다운로드 실패, 정보 게시의 미확인 제외, 확인 표시값 0/빈칸/상한, 대리 확인 1~500명·중복, 필수 체크 완료 전후, 업무 수정 후 모든 실행 초기화, 이수 만료일 공란 오류입니다. 특히 현행 확인 인원 요약·팀 필터·대리 확인은 참고 이미지에 없으므로 번호를 붙인 입력 전/처리 후 화면을 새로 확보해야 합니다.
총무 관리 사용 영상
처음에는 재생 버튼을, 다시 볼 때는 아래 동작 번호를 누르세요.
- 공지 작성 열기
총무 관리의 「공지」에서 「공지 작성」을 누릅니다. 공지 생성 권한이 필요합니다. 자세히 따라 하기
- 제목·내용 입력
필수 제목과 내용을 입력합니다. 영상은 ‘신규 직원 온보딩 가이드’를 예제로 작성합니다. 자세히 따라 하기
- 게시 조건 확인
카테고리·우선순위와 게시 대상을 확인합니다. 예제는 「무기한」을 선택하고 「즉시 게시」를 해제합니다. 게시 팀을 선택하지 않으면 게시 시 전체 직원을 대상으로 합니다. 자세히 따라 하기
- 미게시 저장
「저장」을 누른 뒤 목록에서 제목과 「미게시」 상태를 확인합니다. 영상은 초안 저장까지이며 실제 게시·직원 확인 처리는 상세 사용법에서 이어집니다. 자세히 따라 하기
교육용 예제 조직에서 촬영했어요. 이름·금액·날짜는 교육용 예시이며, 사용 중인 조직의 자료를 확인하세요.
총무 관리 소개와 사용자 교육에서 실제 누르는 위치와 결과를 따라갈 수 있도록 번호 자막·강조 표시를 붙여 촬영했습니다. 별도 DB의 로컬 예제 조직·관리자 테스트 계정을 사용했습니다. 화면 크기는 1440×900입니다. 미게시 공지 작성·무기한 선택·목록 결과를 확인했습니다. 실제 게시와 직원 수신·확인·대리 확인은 실행하지 않았습니다.
앱 소개 · 영상 목록과 교육 범위 · 촬영·검증 기록
직원의 공지 확인 영상과 제한
직원 메신저 가이드에 메신저 → 대화의 공지 목록 → 공지 상세 → 본문 끝까지 스크롤 → 확인했어요 → 확인 완료 영상을 추가했습니다. 뒤로 이동한 뒤 연락처에서 김인사를 검색하는 경로도 포함합니다. 현재 앱은 대화·연락처 두 탭과 별도 그룹 대화 버튼 구조이므로 기존 가이드의 세 탭 설명을 정정했습니다. 실제 동료 메시지 발송이나 그룹 생성은 이 영상에서 수행하지 않았습니다.
짧은 예제 공지를 처음 열 때 noticeScroller의 clientHeight·scrollHeight가 모두 577px인데도 확인 버튼이 비활성으로 남는 상황을 재현했습니다. 공유 messenger-content.html의 $nextTick 측정과 Messenger.ts의 0 높이 제외 조건 사이의 초기 표시 시점은 추가 조사가 필요합니다. 원인을 확정하거나 제품 코드를 수정한 것은 아닙니다. 긴 공지를 끝까지 스크롤할 때는 확인 버튼이 활성화되고 서버 확인 기록 후 확인 완료가 표시됐습니다. 촬영용 공지 한 건의 본문에 예제 교육 안내를 추가했으며 운영 공지는 수정하지 않았습니다.
공지 게시와 확인 내역 영상
공지 작성·게시에는 기존 초안 작성 영상에 이어 게시 전환 영상을 추가했습니다. 예제 관리자 계정으로 제목 검색 → 미게시 공지의 수정 → 내용·게시 대상·무기한 확인 → 즉시 게시 체크 → 저장 → 게시 중 표시·본문 재열람을 실행했습니다. 대상은 별도 촬영 DB의 「신규 직원 온보딩 가이드」이며 실제 고객 공지는 변경하지 않았습니다.
확인 기록 조회는 「9월 정기 안전교육 이수 안내」를 검색해 확인 내역을 열고 확인 인원·사번·이름·팀·확인 시각 및 미확인 직원을 구분하는 영상입니다. 직원 앱에서 직접 확인한 EMP001 김관리 기록을 관리자 화면에서 대조했습니다. 관리자 대리 확인과 표시값 수정은 이 영상에서 실행하지 않았습니다.
공지 저장은 noticeForm.isPublished와 게시 조건을 공지 API로 보내며 general_affairs_notices의 게시 상태에 연결됩니다. 확인 내역은 직원 앱의 확인 동작과 이어집니다. 촬영 조직의 활성 기기 토큰은 0개임을 확인했으며 실제 휴대폰 푸시 수신·외부 발송 검증은 아닙니다. 1440×900 로컬 화면이며 게시 후 수정/삭제 대신 보기·확인 내역을 사용하는 현재 목록 동작을 기록했습니다.
관리자 메뉴에서 공지 관리로 이동하는 영상
관리자 공지 가이드에 관리자 사이드바의 「공지」 진입, 안전교육 공지 검색·본문 조회, 직원 확인 내역 조회를 3단계로 촬영했습니다. 관리자 embed:ga-notices가 여는 총무 공지 화면은 총무 앱과 같은 데이터·조회 동작을 사용합니다. Codex가 예제 EMP001의 확인 기록을 대조했습니다. 공지 작성·게시·확인 목록 상세 조작은 총무 가이드의 별도 기능 영상과 연결합니다.
개인·팀 범위와 만료일
개인 자료는 본인 또는 담당 팀의 허용 범위에 따라 조회합니다. 담당자가 전체 조직 자료를 볼 수 있다고 가정하지 말고 역할과 대상 팀을 확인하세요. 만료일이 선택 항목인 입력에서는 비워 저장할 수 있으며, 다시 열어 날짜 없는 상태가 유지되는지 확인합니다. PR #921의 범위 처리와 빈 날짜 저장을 대조했으며 역할별 전체 화면 실행은 후속 확인 대상으로 남깁니다.