feat(WEB): 회계/HR/생산/품질 탭 복원 및 대시보드·검색 개선
- 회계 모듈 탭 UI 복원 (대손/은행거래/청구/입금/예상경비/상품권/매입/매출/세금계산서/거래처원장/거래처/출금) - HR 모듈 탭 복원 (근태/급여/휴가) - 대시보드 type2/3/4 페이지 개선 - CEO 대시보드 섹션 로딩 최적화 - 품목 마스터데이터 관리 탭 기능 강화 - 생산 작업자화면/작업지시 개선 - 품질 검사 생성/상세 화면 보완 - 건설 견적/현장관리 상세 개선 - UniversalListPage 기능 확장 - E2E 잔여 버그 핸드오프 문서 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
129
claudedocs/[REPORT-2026-02-23] E2E-remaining-bugs-handoff.md
Normal file
129
claudedocs/[REPORT-2026-02-23] E2E-remaining-bugs-handoff.md
Normal file
@@ -0,0 +1,129 @@
|
||||
# E2E 잔여 버그 전달 사항
|
||||
|
||||
**작성일**: 2026-02-23
|
||||
**근거**: `sam-hotfix/e2e/results/hotfix/HOTFIX-REPORT_dev-team_2026-02-20.md`
|
||||
|
||||
---
|
||||
|
||||
## 프론트엔드 수정 완료 (3건 + 1건)
|
||||
|
||||
| Bug ID | 내용 | 수정 상태 |
|
||||
|--------|------|:---------:|
|
||||
| BUG-SORT-001 | 컬럼 정렬 미구현 (14개 페이지) | ✅ 완료 |
|
||||
| BUG-FILTER-001 | 매출관리 필터 미동작 | ✅ 완료 |
|
||||
| BUG-REDIRECT-001 | 어음/입금 등록 후 리다이렉트 | ✅ 완료 |
|
||||
| BUG-BATCH-DELETE-001 (입금) | 삭제 후 빈 페이지 표시 | ✅ 완료 (UniversalListPage 공통 수정) |
|
||||
|
||||
---
|
||||
|
||||
## QA팀 확인 요청 (1건)
|
||||
|
||||
### BUG-BATCH-DELETE-001 (어음관리) — E2E 테스트 패턴 불일치
|
||||
|
||||
**현상**: `batch-create-acc-bills` 시나리오에서 VERIFY 단계 FAIL (기대 3건, 실제 0건)
|
||||
|
||||
**원인 분석**:
|
||||
- E2E 테스트가 `E2E_TEST_어음_{timestamp}` 패턴으로 데이터를 검색
|
||||
- 그러나 실제 어음번호는 프론트엔드에서 `E2E_TEST_EB` 접두사로 생성됨
|
||||
- **백엔드 API 확인 결과**: `BillService.php:106`에서 `bill_number`를 프론트가 보낸 그대로 저장 (변환 없음)
|
||||
- `StoreBillRequest.php` 검증: `nullable|string|max:50` — 접두사 제한 없음
|
||||
|
||||
**결론**: API는 정상. **E2E 테스트 스크립트의 검색 패턴(`E2E_TEST_어음_`)이 실제 생성 데이터 패턴(`E2E_TEST_EB`)과 불일치**
|
||||
|
||||
**요청 사항**:
|
||||
- E2E 테스트의 어음번호 검색 패턴을 실제 프론트엔드가 생성하는 패턴에 맞게 수정
|
||||
- 또는 프론트엔드 어음 등록 폼에서 E2E 테스트 시 사용하는 어음번호 필드값 확인
|
||||
|
||||
---
|
||||
|
||||
## 백엔드팀 수정 요청 (1건)
|
||||
|
||||
### BUG-PERF-001 — 품목관리 API 성능 문제 (10초+ 지연)
|
||||
|
||||
**현상**: 생산관리 > 품목관리 (`/api/v1/items`) 테이블 로드 10초 타임아웃
|
||||
|
||||
**원인 분석** (sam-api 코드 확인):
|
||||
|
||||
#### 병목 1: `getItemsWithInspectionTemplate()` — 전체 테이블 스캔 (5-8초)
|
||||
|
||||
**파일**: `app/Services/ItemService.php` (lines 1024-1060)
|
||||
|
||||
```php
|
||||
$templates = \DB::table('document_templates')
|
||||
->where('tenant_id', $tenantId)
|
||||
->where('is_active', true)
|
||||
->whereNotNull('linked_item_ids')
|
||||
->where(function ($q) use ($categoryCode, $categoryName) {
|
||||
$q->where('category', $categoryCode)
|
||||
->orWhere('category', $categoryName)
|
||||
->orWhere('category', 'LIKE', "%{$categoryName}%");
|
||||
})
|
||||
->get(['linked_item_ids']); // ← limit 없이 전체 로드
|
||||
```
|
||||
|
||||
- `linked_item_ids`는 JSON 컬럼 → 인덱스 불가
|
||||
- 페이지에 20개만 표시하는데 **모든 document_templates 로드** 후 PHP에서 수동 매칭
|
||||
- 템플릿 수가 많을수록 지연 증가
|
||||
|
||||
#### 병목 2: N+1 쿼리 (2-3초)
|
||||
|
||||
**파일**: `app/Services/ItemService.php` (lines 376-390)
|
||||
|
||||
```php
|
||||
->with(['category:id,name', 'details', 'files']);
|
||||
```
|
||||
|
||||
- `details` (hasOne): 아이템당 1쿼리 → 20개 = 20쿼리
|
||||
- `files` (hasMany + document_type 필터): 아이템당 1쿼리 → 20개 = 20쿼리
|
||||
- 합계: ~40개 추가 쿼리
|
||||
|
||||
#### 병목 3: 누락 인덱스
|
||||
|
||||
- `files` 테이블: `document_id` + `document_type` 복합 인덱스 없음
|
||||
- `document_templates` 테이블: `linked_item_ids` JSON 인덱스 없음
|
||||
|
||||
**예상 총 지연**: ~9-11초 (E2E 10초 타임아웃과 일치)
|
||||
|
||||
**수정 제안**:
|
||||
1. `getItemsWithInspectionTemplate()`에서 필요한 `item_id` 목록만 IN 조건으로 조회하도록 변경
|
||||
2. `files`, `item_details` 테이블에 적절한 인덱스 추가
|
||||
3. Eager loading 최적화 (`with` 절에 필요한 컬럼만 select)
|
||||
|
||||
---
|
||||
|
||||
## 백엔드팀 참고 — 신규 리그레션 2건 (API 서버 상태)
|
||||
|
||||
리그레션 리포트(`REGRESSION-REPORT_dev-team_2026-02-20.md`)에서 발견된 신규 이슈.
|
||||
**3차 테스트에서 PASS → 4차(Pull 후) FAIL로 전환된 건**으로, 서버 상태 확인 필요.
|
||||
|
||||
### BUG-REGRESSION-001: 입금관리 CRUD 실패 (API 500 에러)
|
||||
|
||||
- **시나리오**: `create-delete-acc-deposit`
|
||||
- **증상**: 다수 API 500 에러 (Welfare, Calendar, TodayIssue API)
|
||||
- **API 평균 응답**: 3,574ms (통상 84ms의 42배)
|
||||
- **테이블**: 0건 로드 (데이터 로드 실패)
|
||||
|
||||
### BUG-REGRESSION-002: 자유게시판 CRUD 실패 (API 극심한 지연)
|
||||
|
||||
- **시나리오**: `create-delete-board`
|
||||
- **증상**: vendorId 옵션 로드 실패, 테이블 로드 5초 타임아웃
|
||||
- **API 평균 응답**: 7,752ms (통상 84ms의 92배)
|
||||
- **에러**: `Failed to load options for vendorId: TypeError: Failed to fetch`
|
||||
|
||||
**공통 추정 원인**: Pull 이후 API 서버 불안정 (500 에러, fetch 실패 다수)
|
||||
|
||||
---
|
||||
|
||||
## 재검증 명령
|
||||
|
||||
```bash
|
||||
# 전체 재검증
|
||||
node C:/Users/codeb/sam/e2e/runner/run-all.js
|
||||
|
||||
# 버그별 개별 검증
|
||||
node C:/Users/codeb/sam/e2e/runner/run-all.js --filter pagination-sort # BUG-SORT-001 ← 프론트 수정 완료
|
||||
node C:/Users/codeb/sam/e2e/runner/run-all.js --filter search-filter # BUG-FILTER-001 ← 프론트 수정 완료
|
||||
node C:/Users/codeb/sam/e2e/runner/run-all.js --filter reload-persist # BUG-REDIRECT-001 ← 프론트 수정 완료
|
||||
node C:/Users/codeb/sam/e2e/runner/run-all.js --filter batch-create # BUG-BATCH-DELETE-001 ← 프론트 일부 수정 + QA 테스트 패턴 확인
|
||||
node C:/Users/codeb/sam/e2e/runner/run-all.js --filter workflow # BUG-PERF-001 ← 백엔드 수정 필요
|
||||
```
|
||||
@@ -245,6 +245,41 @@ const today = new Date().toISOString().split('T')[0];
|
||||
|
||||
**현재 상태**: `src/` 내 `toISOString().split` 사용 0건 (date.ts 내 구현부 제외)
|
||||
|
||||
### 달력/스케줄 공통 리소스 — 작업 전 필수 확인 (2026-02-23)
|
||||
|
||||
달력·일정·날짜 관련 작업 시 아래 공통 리소스를 **반드시 확인**하고 사용할 것.
|
||||
|
||||
**날짜 유틸리티** (`src/lib/utils/date.ts`):
|
||||
| 함수 | 용도 |
|
||||
|------|------|
|
||||
| `getLocalDateString(date)` | Date → `'YYYY-MM-DD'` (KST 안전) |
|
||||
| `getTodayString()` | 오늘 날짜 문자열 |
|
||||
| `formatDate(dateStr)` | 표시용 날짜 포맷 (null → `'-'`) |
|
||||
| `formatDateForInput(dateStr)` | input용 `YYYY-MM-DD` 변환 |
|
||||
| `formatDateRange(start, end)` | `'시작 ~ 종료'` 포맷 |
|
||||
| `getDateAfterDays(n)` | N일 후 날짜 |
|
||||
|
||||
**달력 일정 스토어** (`src/stores/useCalendarScheduleStore.ts`):
|
||||
- 달력관리(CalendarManagement)에서 등록한 공휴일/세무일정/회사일정을 프로젝트 전체에 공유
|
||||
- `fetchSchedules(year)` — 연도별 캐시 조회 (API 호출)
|
||||
- `setSchedulesForYear(year, data)` — 이미 가져온 데이터 직접 설정
|
||||
- `invalidateYear(year)` — 캐시 무효화 (등록/수정/삭제 후)
|
||||
- **현재 상태**: 백엔드 API 미구현 → 호출부 주석 처리 (TODO 검색)
|
||||
|
||||
**달력 이벤트 유틸** (`src/constants/calendarEvents.ts`):
|
||||
- `isHoliday(date)`, `isTaxDeadline(date)`, `getHolidayName(date)` 등
|
||||
- 스토어 우선 → 하드코딩 폴백(2026년) 패턴
|
||||
- 새 연도 폴백 데이터 필요 시 이 파일에 `HOLIDAYS_YYYY`, `TAX_DEADLINES_YYYY` 추가
|
||||
|
||||
**ScheduleCalendar 공통 컴포넌트** (`src/components/common/ScheduleCalendar/`):
|
||||
- `hideNavigation` prop으로 헤더 ◀ ▶ 숨김 가능 (연간 달력 등 상위 네비게이션 사용 시)
|
||||
- `availableViews={[]}` 으로 뷰 전환 버튼 숨김
|
||||
|
||||
**규칙**:
|
||||
- `Date → string` 변환 시 `getLocalDateString()` 필수 (`toISOString().split('T')[0]` 금지)
|
||||
- 공휴일/세무일 판별 시 `calendarEvents.ts` 유틸 함수 사용
|
||||
- 달력 데이터 공유 시 zustand 스토어 경유 (컴포넌트 간 직접 전달 금지)
|
||||
|
||||
### `useDateRange` 훅 — 날짜 필터 보일러플레이트 제거 (2026-02-19)
|
||||
|
||||
**현황**: 20+ 리스트 페이지에서 `useState('2025-01-01')` / `useState('2025-12-31')` 하드코딩
|
||||
|
||||
Reference in New Issue
Block a user