This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
# 통합관리 피드백 반영 작업 목록
|
||||
|
||||
- 정리일: 2026-09-08
|
||||
- 대상: 통합관리 페이지(피드백/이슈), 피드백 상세 페이지
|
||||
- 상태 표기: `[ ]` 미착수, `[?]` 정책 또는 화면 기준 확인 필요
|
||||
|
||||
## 1. 통합관리 페이지
|
||||
|
||||
### 1.1 상단 구조 및 대시보드
|
||||
|
||||
- [x] `피드백 처리` / `이슈 처리` 탭과 일자 선택 영역을 페이지 최상단으로 유지한다.
|
||||
- [x] 상단 대시보드 데이터 박스의 크기를 축소한다.
|
||||
- [x] 대시보드에서 `담당자 미지정`, `피드백 상태 처리 필요` 카드를 제외한다.
|
||||
- [x] 필터 영역의 `필터` 텍스트 라벨을 제거한다.
|
||||
- [x] 검색창을 우측 정렬하고, 크기·강조 스타일을 조정해 주요 조작 요소로 보이게 한다.
|
||||
- [x] `업데이트일 기준` 드롭다운과 별도 일자 선택 UI를 제거한다.
|
||||
|
||||
### 1.2 피드백 목록·필터·열
|
||||
|
||||
- [x] 피드백 상태를 `전체` 기본값을 포함한 다중 선택 필터로 제공한다.
|
||||
- [x] 목록의 `처리항목` 열을 제거한다.
|
||||
- [x] 목록에 `중요도` 열을 추가한다.
|
||||
- [x] 목록 우측의 건수 표시를 제거한다.
|
||||
|
||||
## 2. 피드백 상세 페이지
|
||||
|
||||
### 2.1 상단 정보와 레이아웃
|
||||
|
||||
- [x] 작성자 정보를 상세 상단으로 이동한다.
|
||||
- [x] `Feedback 상세` 제목 옆에 작성자 정보를 한 줄로 배치한다.
|
||||
- [x] 피드백 제목과 내용을 시각적으로 더 강조한다.
|
||||
- [?] 작성자 정보에 UUID, 소속, 직책을 표시한다.
|
||||
- [x] `내부 메모`를 좌측으로 이동해 첨부파일 아래에 배치한다.
|
||||
- [x] 이슈 상태, 피드백 상태, 담당자 영역을 한 줄로 배치한다.
|
||||
- [x] 중요도를 상세 화면에 표시한다.
|
||||
|
||||
### 2.2 상태·첨부파일 표시
|
||||
|
||||
- [x] 피드백 상태 값에 상태별 색상을 적용한다.
|
||||
- [x] 이슈 상태의 `연결된 이슈 없음` 텍스트를 제거한다.
|
||||
- [x] 첨부파일이 이미지이면 썸네일 미리보기를 표시한다.
|
||||
- [?] “피드백 내부 상태”의 상태값·전환 규칙·화면 노출 범위는 후속 정책으로 정한다.
|
||||
|
||||
## 3. 삭제 권한 및 이력 보존
|
||||
|
||||
### 3.1 피드백 전체 삭제
|
||||
|
||||
- [x] 피드백 전체 삭제 권한을 시스템 관리자에게만 부여한다.
|
||||
- [x] 물리 삭제 대신 삭제 상태를 기록한다.
|
||||
- [x] 삭제자 식별자와 삭제 시각을 DB 이력에 저장한다. 삭제 사유는 입력 정책 확정 후 추가한다.
|
||||
- [x] 일반 목록·상세에서는 삭제된 피드백을 기본적으로 제외한다.
|
||||
|
||||
### 3.2 내부 메모·댓글 삭제
|
||||
|
||||
- [x] 내부 메모 삭제 시 물리 삭제 대신 삭제 상태를 기록한다.
|
||||
- [x] 관리자 댓글 삭제 시 물리 삭제 대신 삭제 상태를 기록한다.
|
||||
- [x] 사용자 댓글 삭제 시 물리 삭제 대신 삭제 상태를 기록한다.
|
||||
- [x] 각 삭제 기록에 삭제자 식별자와 삭제 시각을 저장한다.
|
||||
- [?] 삭제된 메모·댓글을 관리자에게 표시할지, 완전히 숨길지와 복구 기능 제공 여부를 정한다.
|
||||
|
||||
### 3.3 이슈 상세·삭제 정책
|
||||
|
||||
- [x] 이슈 상태를 별도 편집 모드 없이 상세 화면에서 직접 변경한다.
|
||||
- [x] 이슈 내부 메모를 작성자·작성일별 목록, 개별 수정·삭제 방식으로 전환한다.
|
||||
- [x] 기존 단일 이슈 내부 메모 값은 신규 이력 테이블로 이전한다.
|
||||
- [x] 이슈 내부 메모 삭제 시 소프트 삭제, 삭제자·삭제 시각 기록을 적용한다.
|
||||
- [x] 이슈 전체 삭제를 시스템 관리자 전용 소프트 삭제로 전환한다.
|
||||
|
||||
## 4. 데이터·API 점검 항목
|
||||
|
||||
- [?] UUID·소속·직책이 현재 SSO/ABC 사용자 원본에서 제공되는지 확인한다.
|
||||
- [x] 중요도의 저장 위치와 기존 피드백 데이터의 기본값을 확인한다.
|
||||
- [x] 상태 다중 선택을 통합관리 화면의 로컬 목록 필터에 반영한다.
|
||||
- [x] 소프트 삭제 필드와 이력 조회 권한을 API·DB migration에 반영한다.
|
||||
- [ ] 외부 작성페이지 및 통합관리의 API 연동이 삭제 상태와 상세 표시 변경 후에도 동일하게 동작하는지 검증한다.
|
||||
|
||||
## 확인이 필요한 사항
|
||||
|
||||
1. 상단 대시보드에서 실제로 제거할 카드가 무엇인지 확정이 필요하다.
|
||||
2. 작성자 `UUID`는 SSO의 `sub`(SSO subject)를 표시하면 되는지, 아니면 ABC `users.id`를 뜻하는지 확인이 필요하다.
|
||||
3. 작성자 `직책` 데이터의 원본 필드·API 제공 여부를 확인해야 한다. 현재 확인된 SSO profile에는 이름·이메일·전화번호·소속 등이 있었지만 직책은 별도 항목일 수 있다.
|
||||
4. 삭제된 내부 메모/댓글을 시스템 관리자에게라도 이력으로 보여줄지, DB에만 남기고 UI에서는 숨길지 결정이 필요하다.
|
||||
|
||||
## 이번 반영의 저장 방식
|
||||
|
||||
- 피드백은 ABC `feedbacks.deleted_at`의 TypeORM soft delete를 사용한다. 삭제 이벤트는 `histories`에 `SoftDelete` 액션, 삭제 시각, 요청 사용자 ID를 남긴다.
|
||||
- 내부 메모와 관리자/사용자 댓글은 `ticket_comments.deleted_at`을 유지하고, 신규 migration `0019_comment_deletion_audit`에서 `deleted_by_id`, `deleted_by_tenant_id`를 추가한다.
|
||||
- 삭제된 메모·댓글을 화면에 보여줄지 여부는 보류되어 있으므로 기존처럼 일반 조회에서는 제외한다.
|
||||
- 이슈 내부 메모는 `issue_internal_memos`에 별도 이력으로 저장하며, `deleted_at`, `deleted_by_user_id`, `deleted_by_name`을 유지한다. 이슈 자체도 피드백과 동일하게 시스템 관리자만 소프트 삭제할 수 있다.
|
||||
|
||||
## SSO 작성자 정보 전달 계약
|
||||
|
||||
작성 페이지는 SSO ID 토큰을 그대로 전송하지 않는다. 다만 8864의 실제 로그인 세션은 버전에 따라 ID 토큰을 `sessionStorage` 또는 `jwt` 쿠키에 보관하므로, 두 위치에서 토큰을 읽어 작성자 표시용 claims만 평탄화해 전송한다.
|
||||
|
||||
로그인 API도 같은 최소 조직 정보를 자체 서명 access token에 넣고, Secretary가 티켓 생성 시 이를 `extra_fields`와 ABC 메타데이터에 평탄화해 저장한다. 이 서버 경로는 브라우저 정보가 누락된 세션의 보완 수단이다. 원문 토큰·세션 digest·토큰 만료값은 어느 요청이나 피드백 데이터에 저장하지 않는다.
|
||||
|
||||
| 저장 필드 | SSO ID 토큰 기준 값 |
|
||||
| ------------------------ | ------------------------------------------- |
|
||||
| `requester_id` | `sub` (SSO UUID) |
|
||||
| `requester_uuid` | `sub` (호환용 중복 보관) |
|
||||
| `requester_tenant_id` | `tenant_id` |
|
||||
| `requester_name` | `profile.name` 또는 `name` |
|
||||
| `requester_email` | `profile.email` 또는 `email` |
|
||||
| `requester_phone_number` | `profile.phones[0]` |
|
||||
| `requester_department` | 기본 테넌트(`tenants[tenant_id]`)의 `name` |
|
||||
| `requester_affiliation` | 상위 `COMPANY` 테넌트의 `name` |
|
||||
| `requester_position` | 기본 테넌트의 `position` 또는 `grade` |
|
||||
| `requester_grade` | 기본 테넌트의 `grade` |
|
||||
Reference in New Issue
Block a user