HBGA230_공지
(Hereby) 총무 > 공지
| 앱 | 총무 (HBGA) |
| 대상 사용자 | 조건1 [GA_ADMIN] / 조건2 [SUPER_ADMIN] |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_공지 게시]] (token TBU) |
| Status | review |
| Owner | 카나 (PM) |
개요
- 총무 공지 발행/확인 화면. 이 화면은 Admin 공지([[HBAD280_공지]])의 임베드로, 컬럼·작성 폼·확인 내역은 HBAD280과 동일하다.
- 카테고리 필터(6종) + 상태 필터(4종) + "공지 작성" 버튼(2026-08-18 정정: "+" 접두 없음) + 7컬럼 그리드로 구성.
- 게시/만료 공지는 "확인 내역"(notice_acknowledgments)으로 대상자별 확인 현황을 연다. Employee App의 "확인했어요" 읽음 처리와 cross-app 연동(검증됨).
- 게시 공지는 HBEA300_메신저를 통해 직원에게 수신된다(연계 후보).
- row action = 미게시: "수정"/"삭제", 게시 중·만료: "보기"/"확인 내역".
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 |
| 2026-07-13 | 카나 | PM | 버튼 행동 명세 보강 |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 + 확정 스타일 |
| 2026-07-21 | 카나 | PM | TC 크로스체크 확정분 반영 (🟡) |
| 2026-07-29 | 카나 | PM | 코드 변경 반영(b61038f) |
| 2026-08-18 | 카나 | 라이브 재검증 정정 | 공지 작성 버튼 라벨 = "공지 작성"("+" 접두 없음) 라이브 확인. 카테고리6·상태4·컬럼7·무기한 표기 일치 |
Data I/O
Server → Client
| 변수 | 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
| $ | general_affairs_notices[] (title/category/priority/isPublished/publishedAt/expiresAt) | empty | 7컬럼 목록 소스 |
| $ | notice_acknowledgments[] | empty | 대상자별 확인 내역. 조회 = generalAffairs.notice.getAcknowledgedEmployees(noticeId) (TC 확정: 05:5.2 / 06:6.8) |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 공지 작성 | title, content, category, priority, expiresAt, isPublished | generalAffairs.notice.create() | GA_ADMIN |
| 공지 수정 | noticeId + 폼 값 | generalAffairs.notice.update() | GA_ADMIN |
| 공지 삭제 | noticeId | generalAffairs.notice.delete() | GA_ADMIN |
| 공지 게시 | id | generalAffairs.notice.publish(id) (TC 확정: 05:5.2 / 06:6.8) | GA_ADMIN |
| 공지 확인 처리 | noticeId | generalAffairs.notice.acknowledge(noticeId) (TC 확정: 05:5.2) | 직원(self, cross-app) |
| 미읽음 수 | - | generalAffairs.notice.unreadCount() (TC 확정: 05:5.2) | 직원(self) |
| 게시 목록 | - | generalAffairs.notice.listPublished() (TC 확정: 05:5.2) | 직원/GA_ADMIN |
| 확인 내역 조회 | noticeId | generalAffairs.notice.getAcknowledgedEmployees(noticeId) (TC 확정: 05:5.2 / 06:6.8) — read-only. 이전 추정 noticeAcknowledgement.list 는 실재하지 않음(정정) | GA_ADMIN, read-only |
게시 mutation은 사람이 실행한다. procedure는 TC 크로스체크로 확정됨(추정 제거). token 내부 key 미확정 (OQ).
권한 경계 (TC 확정: 06:6.8): 일반 [EMPLOYEE]가 generalAffairs.notice.create 호출 시 throw(거부)된다. 공지 생성/수정/삭제/게시는 GA_ADMIN 전용.
외부 통합 (cross-app)
| 외부 시스템 | 데이터 | 방향 | 비고 |
|---|---|---|---|
| Employee App (HBEA300_메신저) | 게시 공지 수신 / "확인했어요" 읽음 | 양방향 | 확인 읽음 cross-app 검증됨 |
| Admin 공지 (HBAD280) | 컬럼·폼·확인 내역 정의 | 임베드 원본 | 동일 컴포넌트 |
화면 플로우
공지 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • "공지" 메뉴 클릭 시 /general-affairs/notices 진입 | HBGA100_Shell·사이드바 | |
| 01 | 초기 상태 | - | • 필터 "전체" 기준으로 7컬럼 공지 목록 노출 (census 총 8건) | general_affairs_notices | |
| 10 | 카테고리 필터 | Dropdown | • 카테고리 기준으로 목록을 거르는 필터 • 선택 시: 해당 카테고리 행만 표시 ("전체" / "교육마감" / "시설" / "안전" / "정책" / "일반") | general_affairs_notices.category | 6종 |
| 20 | 상태 필터 | Dropdown | • 게시 상태 기준으로 목록을 거르는 필터 • 선택 시: 해당 상태 행만 표시 ("전체" / "미게시" / "게시 중" / "만료") | isPublished + expiresAt 파생 | 4종 |
| 30 | 공지 작성 | Button | • 새 공지 작성 폼을 여는 버튼 (HBAD280과 동일 폼) • 클릭 시: 작성 폼 오픈 (제목*/내용*/카테고리/우선순위/만료일시*(date+time picker)/즉시 게시(기본 OFF)) - STEP1 필수값(제목/내용/만료일시) 입력 - STEP2 저장: 즉시 게시 ON이면 게시 중, OFF면 미게시로 저장 | notice create · mutation | 사람 게시 |
| ㄴ35 | 무기한 체크박스 | Checkbox | • "만료일시" 라벨 우측 "무기한" 체크박스 — 체크 시 만료일 필수(*) 해제, 만료 date/time picker 숨김, 안내문 "만료일 없이 무기한으로 게시돼요." 표시, expiresAt=null 저장(만료 없이 게시) - CASE01 [체크]: 만료일 없어도 저장 가능(제목·내용만 필수) - CASE02 [미체크]: 만료일시 필수 유지 | notice create/update · expiresAt(nullable) · noticeForm.indefinite | 신설 (코드 반영: b61038f) |
| 40 | 공지 목록 | Table | • 공지를 7컬럼으로 나열하는 그리드 ("제목 / 카테고리 / 우선순위 / 게시 / 게시일 / 만료일 / 관리") • 행 상태별 관리 액션이 41~43로 분기 • 만료일 없음(무기한) 행은 만료일 컬럼에 "무기한" 표시 | general_affairs_notices | 무기한 표시 (코드 반영: b61038f) |
| ㄴ41 | 미게시 row | ListItem | • 아직 게시되지 않은 공지 행. 예: "test / 일반 / 보통 / 미게시 / — / 2026.07.03." • "수정" 클릭 시: 공지 수정 폼(기존 값 채움) 오픈 • "삭제" 클릭 시: 컨펌 "공지를 삭제할까요?" → 실행 | notice update / delete | 관리 액션 "수정 | 삭제" |
| ㄴ42 | 게시 중 row | ListItem | • 현재 게시 중인 공지 행. 예: "전체 공지 / 일반 / 보통 / 게시 중 / 2026.06.30. / 2026.07.03." • "보기" 클릭 시: 공지 상세 보기 오픈 • "확인 내역" 클릭 시: 44 확인 내역 오픈 • 상세 보기 만료일도 만료일 없을 시 "무기한" 표시 | notice_acknowledgments | 관리 액션 "보기 | 확인 내역" · 무기한 표시 (코드 반영: b61038f) |
| ㄴ43 | 만료 row | ListItem | • 만료된 공지 행. 예: "전사 ESG를 위한 안내 사항 / 정책 / 보통 / 만료 / 2026.04.10. / 2026.04.09." • "보기" 클릭 시: 공지 상세 보기 오픈 • "확인 내역" 클릭 시: 44 확인 내역 오픈 | notice_acknowledgments | 만료일 < 게시일 validation gap |
| ㄴ44 | 확인 내역 | Button | • 대상자별 확인자/확인시각을 조회하는 뷰(generalAffairs.notice.getAcknowledgedEmployees(noticeId)). Employee App "확인했어요"(.acknowledge(noticeId)) 읽음 처리와 연동• 클릭 시: 확인 내역(대상자별 확인 현황) 오픈 (read-only) | notice_acknowledgments / HBEA300_메신저 | cross-app 확인 검증됨 (TC 확정: 05:5.2 / 06:6.8) |
| 50 | 페이지네이션 | Pagination | • 목록을 페이지 단위로 이동하는 컨트롤 ("총 8건 중 1-8건", "« ‹ 1 › »") • 클릭 시: 해당 페이지로 이동 | general_affairs_notices | |
| 60 | 공지 수신 연계 | - | • 게시 공지는 직원 메신저/공지 수신으로 전달됨 (연계 후보) | HBEA300_메신저 | 동선 TBU |
| 70 | AI — 공지 초안 작성 | AI/Suggest | • 교육마감/시설/안전/정책 공지 초안을 작성하는 보조 (greenfield, 사람 게시) • 클릭 시: TBU (라이브 표면 없음) | notice | ga.noticeDraft TBU |
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 | 비고 |
|---|---|---|---|
조건1 [GA_ADMIN] | 공지 화면 진입 | 필터 + 목록 + 작성 노출 | token 내부 key TBU |
CASE01 [미게시 삭제] | 미게시 row → 삭제 | 컨펌 "공지를 삭제할까요?" → 삭제 실행 | 컨펌 있음 |
CASE02 [공지 게시] | 작성 폼 즉시 게시 ON 저장 | isPublished=true, 게시 중 전환 | 사람 실행 |
CASE03 [확인 내역 조회] | 게시 중·만료 row → 확인 내역 | 대상자별 확인 현황 표시 (getAcknowledgedEmployees) | cross-app 검증됨 |
CASE04 [일반 직원 작성 거부] | 일반 [EMPLOYEE]가 notice.create 호출 | throw(거부) — GA_ADMIN 전용 | 권한 경계 (TC 확정: 06:6.8) |
Open Question
- 확인 내역(notice_acknowledgments) 상세 구조(확인자/확인시각/미확인자) UI = TBU
- 게시 공지 → HBEA300_메신저 수신 동선(자동 발송/구독) = TBU
- 만료일 < 게시일 validation gap 처리 방침 = TBU
- 관련 정책 [[POL_공지 게시]] 토큰명 확정 = TBU
- 대상 사용자 권한 토큰 내부 key(GA_ADMIN / SUPER_ADMIN) = TBU