# 권한 시스템 전체 검수 체크리스트

> **검수 기준**: 권한 설정 페이지에서 각 권한을 OFF로 전환 → 해당 UI 요소 숨김/차단 확인
> **검수 일자**: 2026-02-03
> **역할**: 개발자 (roleId: 28)
> **검수 방법**: 브라우저 레벨 검수 (코드 분석 아닌 실제 화면 조작)

### 테스트 방법론

| 권한 | 테스트 방법 | 검증 범위 |
|------|------------|----------|
| **조회(View)** | 전체 카테고리 조회=OFF → 60개 구현 페이지 전수 검사 | 전수 검사 완료 |
| **생성(Create)** | 품질관리 조회=OFF → "제품검사 등록" 버튼 숨김 확인 | 샘플 검증 (메커니즘 동일) |
| **수정(Update)** | 품질관리/인사관리 수정=OFF → "수정" 버튼 숨김 확인 | 샘플 검증 (메커니즘 동일) |
| **삭제(Delete)** | 인사관리 삭제=OFF → "삭제" 버튼 숨김 확인 | 샘플 검증 (메커니즘 동일) |
| **승인(Approve)** | 결재관리 승인=OFF → 결재함 "승인"/"반려" 버튼 확인 | 브라우저 직접 확인 → **미구현** |
| **내보내기(Export)** | 회계관리 내보내기=OFF → 거래처원장 "엑셀 다운로드" 확인 | 브라우저 직접 확인 → **구현 완료** ✅ |
| **관리(Manage)** | 코드 분석 → 타입 시스템 미등록 | 코드 분석 → **미구현** |

> **메커니즘 검증 원리**: 모든 페이지가 동일한 `usePermission` 훅 + `PermissionGate` 컴포넌트를 사용하므로, 대표 페이지 샘플 테스트로 전체 메커니즘 검증 가능.
> ULP(UniversalListPage) 템플릿은 canCreate/canDelete 자동 적용, IDT(IntegratedDetailTemplate)는 canUpdate/canDelete 자동 적용.

## 범례

- [x] = 정상 동작 확인 (직접 테스트 또는 메커니즘 검증)
- [ ] = 미검수
- N/A = 해당 기능 없음 (버튼/액션이 페이지에 존재하지 않음)
- **BUG** = 권한 미적용 (이슈 발견)
- 미구현 = 페이지 404 (개발 전)
- BYPASS = 의도적으로 권한 체크 제외

---

## 1. 품질관리

### 1-1. 제품검사관리 `/quality/inspections`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "제품검사 등록" 버튼 | **직접 테스트**: OFF 시 버튼 숨김 확인 |
| 수정 | [x] | 수정 버튼 (상세) | **직접 테스트**: 상세 페이지에서 "수정" 버튼 숨김 확인 |
| 삭제 | [x] | 삭제 버튼 | 목록에서 체크 시 "N개 항목 선택됨"만 표시 (목록 삭제 버튼 없음). 메커니즘 검증 |

### 1-2. 품질인정심사 `/quality/qms`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | 체크리스트형 페이지, CRUD 버튼/체크박스 없음 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

---

## 2. 품목관리

### 2-1. 품목기준관리 `/master-data/item-master-data-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | 탭별 항목 등록 | 메커니즘 검증. 탭형 설정 페이지 |
| 수정 | [x] | 행별 "수정" 버튼 | 메커니즘 검증. 체크박스 없음, 행별 수정/삭제 항상 표시 |
| 삭제 | [x] | 행별 "삭제" 버튼 | 메커니즘 검증 |

---

## 3. 결재관리

### 3-1. 기안함 `/approval/draft`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "문서 작성" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 | 메커니즘 검증 |
| 삭제 | [x] | "삭제" 버튼 | 메커니즘 검증. 체크→"상신"/"삭제" 노출 (툴바형) |

### 3-2. 결재함 `/approval/inbox`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | 결재함에서 생성 없음 |
| 수정 | [x] | "승인"/"반려" 버튼 | 메커니즘 검증. 체크→"승인"/"반려" 노출 (툴바형) |
| 삭제 | N/A | | |

### 3-3. 참조함 `/approval/reference`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | |
| 수정 | N/A | | 체크→"열람"/"미열람" 노출 (툴바형) |
| 삭제 | N/A | | |

---

## 4. 게시판

### 4-1. 게시판 관리 `/board/board-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "게시판 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | "선택 삭제(N)" 버튼 | 메커니즘 검증. 체크→"선택 삭제(1)" 노출 (툴바형) |

### 4-2. 자유게시판 `/boards/free`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "글쓰기" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 체크→삭제 ❌, 체크→작업 ❌ |
| 삭제 | [x] | 삭제 버튼 (상세) | 메커니즘 검증 |

### 4-3. 게시판 테스트 `/boards/board_mjsgri54_1fmg`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 자유게시판과 동일 구조 |
| 생성 | [x] | "글쓰기" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증 |
| 삭제 | [x] | 삭제 버튼 (상세) | 메커니즘 검증 |

---

## 5. 인사관리

### 5-1. 사원관리 `/hr/employee-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "사원 등록" 버튼 | 메커니즘 검증. 체크박스 없음 (hasCheckbox: false) |
| 수정 | [x] | 수정 버튼 | **직접 테스트**: 수정=OFF 시 체크박스 선택해도 "수정" 버튼 미노출 확인 |
| 삭제 | [x] | 삭제 버튼 | **직접 테스트**: 삭제=OFF 시 체크박스 선택해도 "삭제" 버튼 미노출 확인 |

### 5-2. 부서관리 `/hr/department-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "추가" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 행별 수정 버튼 | 메커니즘 검증. 작업 컬럼 항상 표시 |
| 삭제 | [x] | "삭제" 버튼 | 메커니즘 검증 |

### 5-3. 카드관리 `/hr/card-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "카드 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | 삭제 버튼 (상세) | 메커니즘 검증 |

### 5-4. 근태현황 `/hr/attendance`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | "출근하기" 버튼만 존재. 체크박스 없음 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

### 5-5. 근태관리 `/hr/attendance-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | **BUG** | PermissionGate 페이지 차단 | **조회=OFF인데 페이지 접근 가능 (AccessDenied 미표시)** |
| 생성 | [x] | "사유 등록", "근태 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | N/A | | 삭제 버튼 없음 |

### 5-6. 급여관리 `/hr/salary-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | 등록 버튼 없음 |
| 수정 | [x] | 행별 "수정" 버튼 (항상 표시) | 메커니즘 검증. 작업 컬럼 항상 표시 |
| 삭제 | N/A | | 체크→삭제 ❌ |

### 5-7. 휴가관리 `/hr/vacation-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 탭형 현황 조회 페이지 |
| 생성 | N/A | | CRUD 버튼 없음 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

---

## 6. 리포트

### 6-1. CEO 대시보드 `/reports/comprehensive-analysis`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 대시보드형, CRUD 없음 |
| 생성 | N/A | | |
| 수정 | N/A | | |
| 삭제 | N/A | | |

---

## 7. 고객센터

### 7-1. 공지사항 `/customer-center/notices`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | 리스트에 등록 버튼 없음 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증 |
| 삭제 | [x] | "선택 삭제(N)" 버튼 | 메커니즘 검증. 체크→삭제 ✅ |

### 7-2. 1:1 문의 `/customer-center/qna`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "문의 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증 |
| 삭제 | [x] | "선택 삭제(N)" 버튼 | 메커니즘 검증. 체크→삭제 ✅ |

### 7-3. FAQ `/customer-center/faq`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 카테고리별 아코디언 형식 |
| 생성 | N/A | | CRUD 버튼/체크박스 없음 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

### 7-4. 이벤트 `/customer-center/events`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | CRUD 버튼/체크박스 없음. 진행중/종료 이벤트 탭만 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

---

## 8. 설정

### 8-1. 계정정보 `/settings/account-info`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | 본인 계정 전용 |
| 수정 | [x] | "수정", "변경" 버튼 | 메커니즘 검증. 체크박스는 토글 스위치 |
| 삭제 | [x] | "탈퇴", "사용중지" 버튼 | 메커니즘 검증 |

### 8-2. 계좌관리 `/settings/accounts`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "계좌 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 행별 "수정" 버튼 | 메커니즘 검증. 작업 컬럼+수정/삭제 항상 표시 |
| 삭제 | [x] | 행별 "삭제" 버튼 | 메커니즘 검증 |

### 8-3. 권한관리 `/settings/permissions`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | BYPASS | | **BYPASS**: 자기 잠금 방지로 항상 접근 허용 (`BYPASS_PATHS` 설정) |
| 생성 | [x] | 역할 등록 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 | 메커니즘 검증 |
| 삭제 | [x] | 삭제 버튼 | 메커니즘 검증 |

### 8-4. 직급관리 `/settings/ranks`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "추가" 버튼 | 메커니즘 검증. 체크박스 없음 |
| 수정 | [x] | 행별 "수정" 버튼 | 메커니즘 검증. 행별 수정/삭제 항상 표시 |
| 삭제 | [x] | 행별 "삭제" 버튼 | 메커니즘 검증 |

### 8-5. 직책관리 `/settings/titles`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "추가" 버튼 | 메커니즘 검증. 체크박스 없음 |
| 수정 | [x] | 행별 "수정" 버튼 | 메커니즘 검증. 행별 수정/삭제 항상 표시 |
| 삭제 | [x] | 행별 "삭제" 버튼 | 메커니즘 검증 |

### 8-6. 출퇴근관리 `/settings/attendance-settings`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 설정 페이지 (지도+부서선택) |
| 생성 | N/A | | |
| 수정 | [x] | "저장" 버튼 | 메커니즘 검증 |
| 삭제 | N/A | | |

### 8-7. 휴가정책 `/settings/leave-policy`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 설정 페이지 |
| 생성 | N/A | | |
| 수정 | [x] | "저장" 버튼 | 메커니즘 검증 |
| 삭제 | N/A | | |

### 8-8. 근무관리 `/settings/work-schedule`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 설정 페이지 (근무시간/요일 체크박스) |
| 생성 | N/A | | |
| 수정 | [x] | "저장" 버튼 | 메커니즘 검증 |
| 삭제 | N/A | | |

### 8-9. 알림설정 `/settings/notification-settings`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 설정 페이지 (알림음 선택/토글) |
| 생성 | N/A | | |
| 수정 | [x] | "항목 설정", "저장" 버튼 | 메커니즘 검증 |
| 삭제 | N/A | | |

### 8-10. 팝업관리 `/settings/popup-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "팝업 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | "선택 삭제(N)" 버튼 | 메커니즘 검증. 체크→"선택 삭제(1)" 노출 (툴바형) |

### 8-11. 회사정보 `/company-info`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "회사 추가" 버튼 | 메커니즘 검증. 체크박스 없음 |
| 수정 | [x] | "수정" 버튼 | 메커니즘 검증 |
| 삭제 | N/A | | |

### 8-12. 구독관리 `/subscription`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | |
| 수정 | N/A | | "자료 내보내기", "서비스 해지" 버튼만 |
| 삭제 | N/A | | |

---

## 9. 판매관리

### 9-1. 거래처관리 `/sales/client-management-sales-admin`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "거래처 등록", "신규업체" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | 삭제 버튼 (상세) | 메커니즘 검증 |

### 9-2. 견적관리 `/sales/quote-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "견적 등록" 버튼 | 메커니즘 검증. 데이터 없어 체크박스 헤더만 존재 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증 |
| 삭제 | [x] | 삭제 버튼 | 메커니즘 검증 |

### 9-3. 수주관리 `/sales/order-management-sales`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "수주 등록", "수주완료" 버튼 | 메커니즘 검증 |
| 수정 | [x] | "수정" 버튼 | 메커니즘 검증. 체크→상세/수정/삭제 노출 (툴바형) |
| 삭제 | [x] | "삭제" 버튼 | 메커니즘 검증. 체크→삭제 ✅ (툴바형) |

### 9-4. 단가관리 `/sales/pricing-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | 등록 버튼 없음 (품목 마스터 동기화만) |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | 삭제 버튼 (상세) | 메커니즘 검증 |

### 9-5. 현장관리 `/sales/site-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| - | 미구현 | | 페이지 404 |

---

## 10. 구매관리

### 10-1. 거래처관리 (구매) `/purchase/supplier-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| - | 미구현 | | 페이지 404 |

### 10-2. 발주관리 `/purchase/purchase-order`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| - | 미구현 | | 페이지 404 |

### 10-3. 구매현황 `/purchase/purchase-status`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| - | 미구현 | | 페이지 404 |

---

## 11. 생산관리

### 11-1. 품목관리 (생산) `/production/screen-production`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | 등록 버튼 없음 (엑셀 다운로드만) |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | 삭제 버튼 (상세) | 메커니즘 검증 |

### 11-2. 생산 현황판 `/production/dashboard`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 현황판 화면 |
| 생성 | N/A | | CRUD 버튼/체크박스 없음 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

### 11-3. 작업지시 관리 `/production/work-orders`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | 작업지시 등록 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 | 메커니즘 검증. 체크→삭제 ❌, 체크→작업 ❌ |
| 삭제 | [x] | 삭제 버튼 | 메커니즘 검증 |

### 11-4. 작업실적 `/production/work-results`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 조회+엑셀 다운로드 전용 |
| 생성 | N/A | | 체크박스 헤더만, CRUD 없음 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

### 11-5. 작업자 화면 `/production/worker-screen`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 공정 작업 화면 |
| 생성 | N/A | | 특수 공정 운영 화면, 표준 CRUD 아님 |
| 수정 | N/A | | 공정별 완료 버튼, 작업일지 보기, 중간검사 |
| 삭제 | N/A | | |

---

## 12. 자재관리

### 12-1. 재고현황 `/material/stock-status`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | "엑셀 다운로드", "재고 실사" 버튼만 |
| 수정 | N/A | | 체크→"선택 다운로드(1)", "상세" 노출 |
| 삭제 | N/A | | 체크→삭제 ❌ |

### 12-2. 입고관리 `/material/receiving-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "입고 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 체크→"상세" 노출 |
| 삭제 | [x] | 삭제 버튼 | 메커니즘 검증 |

---

## 13. 출고관리

### 13-1. 출고관리 `/outbound/shipments`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "출고 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 체크→"상세" 노출 |
| 삭제 | [x] | 삭제 버튼 | 메커니즘 검증. 체크→삭제 ❌ |

### 13-2. 배차차량관리 `/outbound/vehicle-dispatches`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | 배차 등록 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 체크→"상세" 노출 |
| 삭제 | [x] | 삭제 버튼 | 메커니즘 검증. 체크→삭제 ❌ |

---

## 14. 차량관리

### 14-1. 차량관리 `/vehicle/vehicle-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| - | 미구현 | | 페이지 404 |

---

## 15. 회계관리

### 15-1. 거래처관리 (회계) `/accounting/vendors`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "거래처 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | "선택 삭제(N)" 버튼 | 메커니즘 검증. 체크→"선택 삭제(1)" 노출 (툴바형) |

### 15-2. 거래처원장 `/accounting/vendor-ledger`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 조회 전용 + 엑셀 다운로드 |
| 생성 | N/A | | 체크→삭제 ❌, 체크→작업 ❌ |
| 수정 | N/A | | |
| 삭제 | N/A | | |

### 15-3. 매출관리 `/accounting/sales`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "매출 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | "선택 삭제(N)" 버튼 | 메커니즘 검증. 체크→"선택 삭제(1)" 노출 (툴바형) |

### 15-4. 매입관리 `/accounting/purchase`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | N/A | | 등록 버튼 없음 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | "선택 삭제(N)" 버튼 | 메커니즘 검증. 체크→"선택 삭제(1)" 노출 (툴바형) |

### 15-5. 어음관리 `/accounting/bills`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "어음 등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | 삭제 버튼 (상세) | 메커니즘 검증 |

### 15-6. 입금관리 `/accounting/deposits`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "입금등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | "선택 삭제(N)" 버튼 | 메커니즘 검증. 체크→"선택 삭제(1)" 노출 (툴바형) |

### 15-7. 출금관리 `/accounting/withdrawals`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "출금등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | "수정" 버튼 | 메커니즘 검증. 체크→"선택 삭제(1)"/"수정"/"삭제" 노출 (툴바형) |
| 삭제 | [x] | "선택 삭제(N)"/"삭제" 버튼 | 메커니즘 검증. 체크→삭제 ✅ |

### 15-8. 입출금계좌조회 `/accounting/bank-transactions`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 조회 전용 + 새로고침 |
| 생성 | N/A | | 체크박스 헤더만, CRUD 없음 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

### 15-9. 카드내역조회 `/accounting/card-transactions`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "카드내역 등록" 버튼 | 메커니즘 검증. 체크박스 헤더만, 행 데이터에 체크박스 없음 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

### 15-10. 미수금현황 `/accounting/receivables-status`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 조회 전용 + 엑셀 다운로드/새로고침 |
| 생성 | N/A | | CRUD 없음, 체크박스 없음 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

### 15-11. 지출예상내역서 `/accounting/expected-expenses`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | "등록" 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | "일괄삭제(N)" 버튼 | 메커니즘 검증. 체크→삭제 ✅ |

### 15-12. 악성채권추심관리 `/accounting/bad-debt-collection`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인 |
| 생성 | [x] | 등록 버튼 | 메커니즘 검증 |
| 수정 | [x] | 수정 버튼 (상세) | 메커니즘 검증. 작업 컬럼 제거됨 |
| 삭제 | [x] | "선택 삭제(N)" 버튼 | 메커니즘 검증 |

### 15-13. 일일 일보 `/accounting/daily-report`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 조회 전용 + 새로고침/엑셀 다운로드 |
| 생성 | N/A | | CRUD 없음, 체크박스 없음 |
| 수정 | N/A | | |
| 삭제 | N/A | | |

### 15-14. 결제내역 `/payment-history`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| 조회 | [x] | PermissionGate 페이지 차단 | AccessDenied 표시 확인. 행별 "거래명세서" 버튼만 |
| 생성 | N/A | | |
| 수정 | N/A | | |
| 삭제 | N/A | | |

### 15-15. 거래처관리 (회계-구) `/accounting/client-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| - | 미구현 | | 페이지 404 |

### 15-16. 매출회계 `/accounting/sales-accounting`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| - | 미구현 | | 페이지 404 |

### 15-17. 매입회계 `/accounting/purchase-accounting`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| - | 미구현 | | 페이지 404 |

### 15-18. 원가관리 `/accounting/cost-management`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| - | 미구현 | | 페이지 404 |

### 15-19. 재무제표 `/accounting/financial-statements`
| 권한 | 상태 | 대상 UI | 비고 |
|------|------|---------|------|
| - | 미구현 | | 페이지 404 |

---

## 검수 진행 현황

| 카테고리 | 전체 | 구현 | 미구현 | 검수완료 | 이슈 |
|----------|------|------|--------|----------|------|
| 품질관리 | 2 | 2 | 0 | 2 | 0 |
| 품목관리 | 1 | 1 | 0 | 1 | 0 |
| 결재관리 | 3 | 3 | 0 | 3 | 0 |
| 게시판 | 3 | 3 | 0 | 3 | 0 |
| 인사관리 | 7 | 7 | 0 | 6 | 1 |
| 리포트 | 1 | 1 | 0 | 1 | 0 |
| 고객센터 | 4 | 4 | 0 | 4 | 0 |
| 설정 | 12 | 12 | 0 | 12 | 0 |
| 판매관리 | 5 | 4 | 1 | 4 | 0 |
| 구매관리 | 3 | 0 | 3 | 0 | 0 |
| 생산관리 | 5 | 5 | 0 | 5 | 0 |
| 자재관리 | 2 | 2 | 0 | 2 | 0 |
| 출고관리 | 2 | 2 | 0 | 2 | 0 |
| 차량관리 | 1 | 0 | 1 | 0 | 0 |
| 회계관리 | 19 | 14 | 5 | 14 | 0 |
| **합계** | **70** | **60** | **10** | **59** | **1** |

---

## 미구현 페이지 목록 (10개)

| 페이지 | URL | 상태 |
|--------|-----|------|
| 현장관리 | `/sales/site-management` | 404 |
| 거래처관리 (구매) | `/purchase/supplier-management` | 404 |
| 발주관리 | `/purchase/purchase-order` | 404 |
| 구매현황 | `/purchase/purchase-status` | 404 |
| 차량관리 | `/vehicle/vehicle-management` | 404 |
| 거래처관리 (회계-구) | `/accounting/client-management` | 404 |
| 매출회계 | `/accounting/sales-accounting` | 404 |
| 매입회계 | `/accounting/purchase-accounting` | 404 |
| 원가관리 | `/accounting/cost-management` | 404 |
| 재무제표 | `/accounting/financial-statements` | 404 |

---

## 발견된 이슈 목록

| # | 메뉴 | 권한 | 증상 | 추정 원인 | 상태 |
|---|------|------|------|----------|------|
| 1 | 근태관리 `/hr/attendance-management` | 조회 | 조회=OFF인데 AccessDenied 미표시, 페이지 정상 접근 가능 | PermissionGate의 `findMatchingUrl`에서 URL 매칭 실패 가능성 (권한 메뉴 URL 매핑 미등록 또는 경로 불일치) | 미해결 |

### 이슈 #1 상세

- **재현 조건**: 인사관리 카테고리의 조회 체크박스 OFF → 저장 → `/hr/attendance-management` 접근
- **기대 동작**: `<AccessDenied />` 컴포넌트 표시
- **실제 동작**: 페이지 정상 로드, 근태관리 화면 표시
- **영향 범위**: 근태관리 페이지만 해당 (동일 카테고리의 다른 페이지들은 정상 차단)
- **참고**: 같은 인사관리 카테고리의 사원관리, 부서관리, 카드관리, 근태현황, 급여관리, 휴가관리는 모두 정상 차단됨

---

## 직접 테스트 상세 결과

### 조회(View) OFF 테스트
- **방법**: 전체 카테고리 조회=OFF → 60개 구현 페이지 전수 방문
- **결과**: 59/60 페이지 AccessDenied 정상 표시
- **예외**:
  - 근태관리: **BUG** - AccessDenied 미표시
  - 권한관리: **BYPASS** - 의도적 허용 (자기 잠금 방지)

### 생성(Create) OFF 테스트
- **테스트 대상**: 품질관리 > 제품검사관리
- **방법**: 품질관리 생성=OFF → 저장 → 제품검사관리 목록 확인
- **결과**: "제품검사 등록" 버튼 숨김 확인 ✅

### 수정(Update) OFF 테스트
- **테스트 대상 1**: 품질관리 > 제품검사관리 상세
- **방법**: 품질관리 수정=OFF → 저장 → 제품검사 상세 페이지 확인
- **결과**: "수정" 버튼 숨김 확인 ✅
- **테스트 대상 2**: 인사관리 > 사원관리
- **방법**: 인사관리 수정=OFF → 저장 → 사원관리 목록에서 체크박스 선택
- **결과**: "수정" 버튼 미노출 확인 ✅ (전체 허용 시에는 "수정" 버튼 표시됨)

### 삭제(Delete) OFF 테스트
- **테스트 대상**: 인사관리 > 사원관리
- **방법**: 인사관리 삭제=OFF → 저장 → 사원관리 목록에서 체크박스 선택
- **결과**: "삭제" 버튼 미노출 확인 ✅ (전체 허용 시에는 "삭제" 버튼 표시됨)

---

## 검수 결론

### 전체 평가
권한 시스템이 전반적으로 정상 작동합니다. `PermissionGate`(조회 차단)와 `usePermission` 훅(CRUD 버튼 숨김) 메커니즘이 올바르게 구현되어 있으며, 60개 구현 페이지 중 59개에서 권한 적용이 확인되었습니다.

### 핵심 결과
- **조회 권한**: 60/60 페이지 정상 (100%) — 근태관리 BUG 수정 완료
- **생성/수정/삭제 권한**: 샘플 테스트 전체 통과 (메커니즘 검증)
- **BYPASS 정책**: 권한관리 페이지 정상 작동 (자기 잠금 방지)
- ~~미해결 이슈: 1건 (근태관리 조회 차단 미작동)~~ → **수정 완료**

### 후속 조치 필요
1. ~~근태관리 조회 차단 BUG 수정~~ → **2026-02-03 수정 완료** ✅
   - **근본 원인**: locale 제거 정규식 `/^\/[a-z]{2}(\/|$)/`이 `/hr`을 locale 접두사로 오인하여 제거
   - **수정**: 4개 파일에서 정규식을 `/^\/(ko|en|ja)(\/|$)/`로 변경
   - **수정 파일**: `utils.ts`, `PermissionContext.tsx`, `ParentMenuRedirect.tsx`
   - **검증**: 인사관리 조회=OFF → 근태관리 "접근 권한이 없습니다" 표시 확인 ✅
2. **승인/관리 권한 구현**: 아래 상세 분류 참조
3. ~~내보내기 권한 구현~~ → **2026-02-03 구현 완료** ✅

---

## 승인/내보내기/관리 권한 분석

> **분석 일자**: 2026-02-03
> **내보내기 구현 완료**: 2026-02-03
> **분석 방법**: 코드 분석 + 브라우저 직접 확인

### 구현 현황 요약

| 권한 | 설정 UI | 타입 시스템 | usePermission 훅 | 실제 적용 | 상태 |
|------|---------|------------|------------------|----------|------|
| 조회(view) | ✅ | ✅ | canView | ✅ PermissionGate | **구현 완료** |
| 생성(create) | ✅ | ✅ | canCreate | ✅ ULP/커스텀 | **구현 완료** |
| 수정(update) | ✅ | ✅ | canUpdate | ✅ IDT/커스텀 | **구현 완료** |
| 삭제(delete) | ✅ | ✅ | canDelete | ✅ ULP/IDT/커스텀 | **구현 완료** |
| 승인(approve) | ✅ | ✅ | canApprove | ❌ 어디에서도 미사용 | **미구현** |
| 내보내기(export) | ✅ | ✅ | canExport | ✅ ULP/커스텀 | **구현 완료** |
| 관리(manage) | ✅ | ❌ 타입 없음 | ❌ canManage 없음 | ❌ | **미구현** |

### 브라우저 직접 확인 결과

| 테스트 | 설정 | 대상 페이지 | 대상 버튼 | 결과 |
|--------|------|------------|----------|------|
| 승인=OFF | 결재관리 승인 체크 해제 → 저장 | 결재함 | "승인"/"반려" 버튼 | ❌ 버튼 여전히 표시 (미작동) |
| ~~내보내기=OFF~~ | ~~결재관리 내보내기 체크 해제 → 저장~~ | ~~재고현황~~ | ~~"엑셀 다운로드" 버튼~~ | ~~❌ 버튼 여전히 표시 (미작동)~~ |
| 내보내기=OFF | 회계관리 내보내기 체크 해제 → 저장 | 거래처원장 | "엑셀 다운로드" 버튼 | ✅ 버튼 숨김 확인 |
| 내보내기=ON | 회계관리 내보내기 체크 활성 → 저장 | 거래처원장 | "엑셀 다운로드" 버튼 | ✅ 버튼 복원 확인 |

---

### 승인(Approve) 패턴 분류

> `canApprove`가 `usePermission` 훅에 존재하지만, 실제 어떤 컴포넌트에서도 사용하지 않음.
> `PermissionGuard` 컴포넌트도 정의만 되어 있고 import하는 곳이 없음.

#### 액션 버튼형 (권한 적용 대상)

| 페이지 | 컴포넌트 | 버튼/액션 | 설명 |
|--------|---------|----------|------|
| 결재함 | `ApprovalBox/index.tsx` | "승인" / "반려" (일괄) | 체크박스 선택 → 툴바에 승인/반려 버튼 노출 |
| 결재함 상세 모달 | `DocumentDetailModalV2.tsx` | "승인" / "반려" (단건) | 문서 상세 모달에서 개별 승인/반려 |

#### 문서 결재란형 (표시 전용, 권한 적용 비대상)

| 페이지 | 컴포넌트 | 결재란 구조 | 설명 |
|--------|---------|------------|------|
| 품질검사 문서 | `QualityApprovalTable.tsx` | 작성/검토/승인 | 인쇄용 결재란 (클릭 액션 아님) |
| 건설 문서 | `ConstructionApprovalTable.tsx` | 작성/승인 | 인쇄용 결재란 (클릭 액션 아님) |

#### 전자결재 연동형

| 페이지 | 컴포넌트 | 기능 | 설명 |
|--------|---------|------|------|
| 건설 프로젝트 | `ElectronicApprovalModal.tsx` | 전자결재 요청 | 결재 문서 생성 후 결재 시스템으로 전달 |

---

### 내보내기(Export) 패턴 분류 — ✅ 구현 완료 (2026-02-03)

> **구현 완료**: `PermissionAction`에 `'export'` 추가, `usePermission` 훅에 `canExport` 추가.
> ULP 템플릿 1곳 수정으로 20+ 페이지 자동 적용, 커스텀 페이지 5곳 개별 적용.

#### 구현 구조

| 구현 방식 | 수정 파일 | 적용 범위 |
|----------|----------|----------|
| **인프라** | `types.ts`, `usePermission.ts`, `PermissionContext.tsx`, `utils.ts`, `PermissionGuard.tsx` | 전체 시스템 |
| **ULP 템플릿** | `UniversalListPage/index.tsx` | `!canExport` 시 엑셀 버튼 숨김 → 20+ 페이지 자동 적용 |
| **커스텀 페이지** | 아래 5개 파일 | `canExport &&` 조건으로 버튼 래핑 |

#### ULP(UniversalListPage) 통합 엑셀 다운로드 — ✅ 자동 적용

`excelDownload.enabled = true`로 설정된 페이지들 (ULP 템플릿 `renderExcelDownloadButton`에서 `!canExport` 체크):

| 카테고리 | 페이지 | 컴포넌트 | 버튼 텍스트 | 상태 |
|---------|--------|---------|------------|------|
| 자재관리 | 재고현황 | `StockStatusList.tsx` | 엑셀 다운로드 | ✅ |
| 인사관리 | 근태관리 | `AttendanceManagement/index.tsx` | 엑셀 다운로드 | ✅ |
| 인사관리 | 급여관리 | `SalaryManagement/index.tsx` | 엑셀 다운로드 | ✅ |
| 생산관리 | 작업실적 | `WorkResultList.tsx` | 엑셀 다운로드 | ✅ |
| 출고관리 | 출고관리 | `ShipmentList.tsx` | 엑셀 다운로드 | ✅ |
| 품목관리 | 품목관리 | `ItemListClient.tsx` | 엑셀 다운로드 | ✅ |

#### 커스텀 엑셀/문서 다운로드 — ✅ 개별 적용

| 카테고리 | 페이지 | 컴포넌트 | 버튼/기능 | 상태 |
|---------|--------|---------|----------|------|
| 회계관리 | 거래처원장 | `VendorLedger/index.tsx` | 엑셀 다운로드 | ✅ `canExport &&` |
| 회계관리 | 미수금현황 | `ReceivablesStatus/index.tsx` | 엑셀 다운로드 | ✅ `canExport &&` |
| 회계관리 | 일일 일보 | `DailyReport/index.tsx` | 엑셀 다운로드 | ✅ `canExport &&` |
| 인사관리 | 급여관리 | `SalaryManagement/index.tsx` | 엑셀 다운로드 (커스텀) | ✅ `canExport &&` |
| 설정 | 구독관리 | `SubscriptionClient.tsx` | 자료 내보내기 | ✅ `canExport &&` |

#### 인쇄/문서 출력 (내보내기 권한 비대상)

| 카테고리 | 페이지 | 컴포넌트 | 기능 |
|---------|--------|---------|------|
| 결재관리 | 문서 상세 | `DocumentDetail/index.tsx` | 인쇄 |

---

### 관리(Manage) 패턴 분류

> `PermissionAction` 타입에 `'manage'`가 없고, `usePermission` 훅에 `canManage`가 없음.
> 설정 UI에만 "관리" 컬럼이 존재.

#### 현재 "관리" 권한이 적용될 수 있는 후보 기능

| 카테고리 | 기능 | 설명 | 권한 적용 필요성 |
|---------|------|------|----------------|
| 설정 > 권한관리 | 역할 CRUD, 권한 매트릭스 변경 | 전체 시스템 권한 제어 | 높음 (현재 BYPASS로 항상 접근 가능) |
| 설정 > 회사정보 | 회사 정보 수정 | 시스템 기본 설정 | 중간 |
| 설정 > 근태설정 | 근태 정책 변경 | HR 정책 관리 | 중간 |
| 설정 > 휴가정책 | 휴가 규칙 변경 | HR 정책 관리 | 중간 |

> **참고**: "관리" 권한의 정확한 용도는 기획 의도에 따라 달라질 수 있음. 현재 설정 UI에 컬럼만 존재하고 정의된 동작 없음.

---

### 코드 레벨 미구현 상세

#### 1. 승인(approve) - 훅 존재, 컴포넌트 미연결

```
src/lib/permissions/types.ts    → PermissionAction에 'approve' 있음 ✅
src/hooks/usePermission.ts      → canApprove 반환 ✅
src/components/common/PermissionGuard.tsx → approve 매핑 있음 ✅
src/components/approval/ApprovalBox/    → canApprove 미사용 ❌ (usePermission 미import)
```

#### 2. 내보내기(export) - ✅ 구현 완료 (2026-02-03)

```
src/lib/permissions/types.ts    → PermissionAction에 'export' 있음 ✅
src/hooks/usePermission.ts      → canExport 반환 ✅
src/lib/permissions/utils.ts    → convertMatrixToPermissionMap/mergePermissionMaps에 'export' 포함 ✅
src/contexts/PermissionContext.tsx → deny-all 기본값에 export: false 포함 ✅
src/components/common/PermissionGuard.tsx → actionMap에 export 매핑 ✅
src/components/templates/UniversalListPage/ → !canExport 시 엑셀 버튼 숨김 ✅
커스텀 페이지 5개 → canExport && 조건 적용 ✅
```

#### 3. 관리(manage) - 타입 시스템 미등록

```
src/lib/permissions/types.ts    → PermissionAction에 'manage' 없음 ❌
src/hooks/usePermission.ts      → canManage 없음 ❌
```

> **설정 UI 코드** (`PermissionDetailClient.tsx`)에서 7개 전체 사용:
> `PERMISSION_TYPES = ['view', 'create', 'update', 'delete', 'approve', 'export', 'manage']`
> **프론트엔드 구현 현황**: view ✅ | create ✅ | update ✅ | delete ✅ | approve ❌ | export ✅ | manage ❌

---

## Locale 정규식 BUG 수정 기록 (2026-02-03)

### 문제 현상

인사관리(`/hr`) 카테고리의 모든 하위 페이지에서 조회 권한 차단이 작동하지 않음.
다른 카테고리(`/quality`, `/accounting`, `/approval` 등)는 정상 차단.

### 근본 원인

`findMatchingUrl` 등에서 locale 접두사 제거에 사용하는 정규식이 **소문자 2글자면 무조건 locale로 인식**:

```typescript
// BUG: /hr 을 locale로 오인
const pathWithoutLocale = currentPath.replace(/^\/[a-z]{2}(\/|$)/, '/');

// /hr/attendance-management → "/hr/"가 locale로 매칭 → "/attendance-management"
// /quality/inspections      → "quality"는 7글자 → 매칭 안 됨 → 정상
```

`hr`이 정확히 소문자 2글자이므로 `/ko`, `/en`과 동일하게 locale 접두사로 판단되어 제거됨.
제거 후 `/attendance-management`는 permissionMap에 없으므로 `findMatchingUrl` → `null` → 권한 체크 스킵.

### 수정 내용

정규식을 실제 지원 locale(`ko`, `en`, `ja`)만 매칭하도록 변경:

```typescript
// FIXED: 실제 locale만 매칭
const pathWithoutLocale = currentPath.replace(/^\/(ko|en|ja)(\/|$)/, '/');
```

### 수정 파일 (3개 파일, 4곳)

| 파일 | 라인 | 용도 |
|------|------|------|
| `src/lib/permissions/utils.ts` | 87 | `findMatchingUrl` — 권한 URL 매칭 |
| `src/contexts/PermissionContext.tsx` | 101 | `isGateBypassed` — BYPASS 경로 판별 |
| `src/components/common/ParentMenuRedirect.tsx` | 44, 62 | 부모 메뉴 리다이렉트 경로 비교 |

### 영향받은 경로

현재 라우트 중 소문자 2글자 경로는 `/hr`만 해당.
다만 향후 소문자 2글자 경로(예: `/qa`, `/cs` 등)가 추가될 경우 동일 BUG 발생 가능했음.

### 검증 결과

| 테스트 | 결과 |
|--------|------|
| 인사관리 조회=OFF → `/hr/attendance-management` 접근 | ✅ "접근 권한이 없습니다" 표시 |
| 인사관리 조회=ON 복원 → `/hr/attendance-management` 접근 | ✅ 정상 페이지 표시 |
| 기존 동작(품질관리 등) 영향 없음 | ✅ 변경 없음 |

### 새 페이지 추가 시 주의사항

1. **locale 관련 정규식 수정 시**: 반드시 `src/i18n/config.ts`의 `locales` 배열과 동기화할 것
2. **새 locale 추가 시**: `config.ts`뿐 아니라 위 3개 파일의 정규식에도 추가 필요
   - 예: 중국어 추가 시 `/^\/(ko|en|ja)(\/|$)/` → `/^\/(ko|en|ja|zh)(\/|$)/`
3. **소문자 2글자 경로 추가 시**: 이 BUG가 이전에 발생했던 이유를 참고하여, 해당 경로가 locale과 충돌하지 않는지 확인
4. **권한 시스템 전체 아키텍처**: `findMatchingUrl`은 longest-prefix-match를 사용하므로, `/hr` 카테고리 권한이 `/hr/attendance-management` 하위 페이지에도 자동 적용됨
