현재 사용법 (2026-09-10,
6fbaee7f): 불편·기능 신고·첨부·답변 확인 · 기능 마스터. 아래는 작성 당시의 변경 설명이며 현재 전체 동작·재측정 결과를 뜻하지 않습니다.
CS 리포트 답변 열람 + 회신 알림 라우팅
PR:
fix(cs-report): let reporters read operator replies + route the reply notificationQA: 불편 오류신고에 대한 답변 받아도 확인 불가 (Hereby med QA, 2026-09-08)
불편·오류 신고에 운영자가 답변을 등록하면 「신고에 답변이 등록됐어요」 알림이 오는데, 지금까지는 눌러도 "내부 결재에서 확인해 주세요"라는 안내만 뜨고 답변을 볼 화면이 없었습니다. 이 변경으로 알림을 누르면 신고 상세가 열리고 답변 본문이 보입니다. 신고 위젯 안에서 내 신고 내역 전체도 볼 수 있습니다.
두 증상의 근본 원인은 같습니다: 답변을 보여 주는 화면이 프런트에 존재하지 않았다는 것입니다. 백엔드에는 신고자 본인 조회 프로시저(csReport.listMine/getMine — 회신 포함)가 이미 있었지만 어떤 앱도 그것을 부르지 않았고, 화면이 없으니 알림 목적지 표에도 등록할 곳이 없어 폴백 안내("{홈 앱}에서 확인해 주세요")를 탔습니다.
배경 — 지금 동작
CS 리포트는 사용자가 화면 스크린샷·로그를 자동 첨부해 불편·오류를 접수하는 기능입니다. 접수 폼은 공용 위젯(packages/components 의 CsReport + cs-report.html)으로, 모든 앱(직원 앱 포함 9곳)의 index.html 에 마운트되어 있고 hereby:cs-report-open 커스텀 이벤트로 열립니다. 운영자가 system-admin 콘솔에서 신고에 회신(visibility: reporter 코멘트)을 달면 API 가 신고자에게 알림을 만드는데, 이 알림은 type=SYSTEM, referenceType=csReport 로 저장됩니다.
알림을 눌렀을 때 어느 화면을 열지는 core 의 목적지 표(notification-navigation.ts 의 resolveNotificationTarget) 하나가 정합니다 — 직원 앱 알림 목록·공용 알림 벨(NotificationBell)·서버 푸시 payload 셋이 같은 표를 씁니다. SYSTEM 은 "직원 앱에 대응 화면이 없는 타입"이라 표에 없고, 표에 없는 타입은 홈 앱 라벨 표(APP_LABEL_BY_TYPE)가 대신 받아 "{앱이름}에서 확인해 주세요"를 띄웁니다. SYSTEM 의 홈 앱이 "내부 결재"여서 QA 가 본 문구가 그것입니다.
변경 전
변경 후
위젯에 「내 신고 내역」·「신고 상세」 뷰를 추가합니다
CsReport 위젯에 view 상태(compose·history·detail)를 추가합니다. history 는 listMine 으로 내 신고 목록(상태 뱃지·접수번호·제목·일시)을, detail 은 getMine 으로 신고 본문과 운영자 답변 타임라인(회신 본문·시각, 처리 결과 메모 포함)을 보여 줍니다. 답변이 아직 없으면 "답변이 등록되면 알림으로 알려드려요"를 표시합니다. 작성 폼·접수 완료 화면의 푸터에 「내 신고 내역」 버튼을, 내역·상세 푸터에 「새 신고 작성」·「목록으로」를 두어 상호 전환합니다.
열기 이벤트를 확장합니다: hereby:cs-report-open 의 detail.view === "history" 면 내역으로 열고, detail.reportId 가 있으면 그 신고의 상세까지 바로 엽니다. 기존 호출(더보기 버튼·오류 다이얼로그·단축키 — detail 없음)은 종전대로 작성 폼을 엽니다.
회신 알림에 목적지를 부여합니다
resolveNotificationTarget 에 referenceType === "csReport" 분기를 추가합니다 — 타입 표 조회보다 먼저 보고 { section: "csReport", csReportId } 를 돌려줍니다. NotificationTargetSection 에 csReport 값을 추가하되, 이 목적지는 탭 전환이 아니라 위젯 열기라는 점을 타입 주석에 명시했습니다.
소비자 두 곳을 연결합니다. 공용 알림 벨(NotificationBell.openNotification)과 직원 앱의 navigateToTarget 이 csReport 섹션을 만나면 섹션 전환(navigate-section) 대신 hereby:cs-report-open 이벤트를 쏩니다. 위젯이 모든 앱에 마운트되어 있으므로 어느 앱에서 알림을 누르든 이동이 성사됩니다. 푸시 payload 는 같은 표의 target 을 실어 나르고 직원 앱 푸시 수신도 navigateToTarget 을 재사용하므로 별도 처리가 필요 없습니다.
회귀 가드로 navigation 테스트에 csReport 케이스 2건을 추가했습니다 (SYSTEM+csReport → 위젯, referenceId 없으면 목록만).
검증
직원 앱 라이브로 전체 사슬을 확인했습니다: 신고 생성 → 운영자 회신(csReport.admin.comment) → 알림 「신고에 답변이 등록됐어요」 클릭 → 신고 상세 모달이 열리고 답변 본문·시각이 표시 → 「목록으로」 → 내역 목록 정상. 데스크톱 벨은 동일 이벤트 경로이며 코어 라우팅은 유닛 테스트(50건 통과)로 커버합니다. pnpm lint:check + 전체 pnpm build 그린, DS 게이트(icons·modals·dialogs·spinners) 통과.