diff --git a/accounting-cost.json b/accounting-cost.json index dcc8e89..d73ae93 100644 --- a/accounting-cost.json +++ b/accounting-cost.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "회계관리 > 원가관리 메뉴의 원가 관리 기능 테스트", + "description": "회계관리 > 원가관리 메뉴의 원가 분석/조회/필터/다운로드 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "회계관리", "level2": "원가관리", - "expectedUrl": "/accounting/cost-management" + "expectedUrl": "/accounting/cost-management", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,26 +35,178 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "원가 데이터 표시" + "원가 데이터 표시 또는 조회 폼", + "기간 선택 가능", + "품목/제품 선택 가능" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "원가 기능 확인", + "name": "원가관리 페이지 구조 확인", "action": "verify_elements", "checks": [ + "품목/제품 선택", + "기간 선택 (시작일/종료일)", + "조회 버튼", "원가 테이블 또는 차트" ], - "expected": "원가 기능 표시" + "expected": "원가관리 페이지 정상 표시" + }, + { + "id": 4, + "phase": "FILTER", + "name": "[FILTER] 품목/제품 선택", + "action": "click", + "target": "select[name*='item'], select[name*='product'], button:has-text('품목'), input[placeholder*='품목']", + "expected": "품목 선택 옵션 표시" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 기간 - 시작일", + "action": "fill", + "target": "input[type='date']:first-of-type, input[name*='start']", + "value": "2025-01-01", + "expected": "시작일 입력" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 기간 - 종료일", + "action": "fill", + "target": "input[type='date']:last-of-type, input[name*='end']", + "value": "2025-12-31", + "expected": "종료일 입력" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 조회 버튼 클릭", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색')", + "expected": { + "data_loaded": true, + "api_call": "GET /api/v1/accounting/cost" + } + }, + { + "id": 8, + "phase": "READ", + "name": "[READ] 원가 테이블 구조 확인", + "action": "verify_table", + "checks": [ + "품목명 컬럼", + "재료비 컬럼", + "노무비 컬럼", + "경비 컬럼", + "합계 컬럼" + ], + "expected": "원가 테이블 정상 표시" + }, + { + "id": 9, + "name": "원가 데이터 확인", + "action": "verify_detail", + "checks": [ + "데이터 행 존재 또는 '데이터 없음' 메시지", + "금액 포맷 정상" + ], + "expected": "원가 데이터 표시" + }, + { + "id": 10, + "name": "원가 구성 비율 확인", + "action": "verify_elements", + "checks": [ + "재료비 비율", + "노무비 비율", + "경비 비율" + ], + "expected": "원가 구성 비율 표시" + }, + { + "id": 11, + "name": "원가 차트 확인", + "action": "verify_elements", + "checks": [ + "원가 추이 차트 또는 구성 차트" + ], + "expected": "차트 시각화 표시" + }, + { + "id": 12, + "name": "필수 검증 #1: 엑셀 다운로드", + "action": "click", + "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", + "critical": true, + "verify": { + "api_call": "GET /api/v1/accounting/cost/export", + "file_download": true + }, + "expected": "엑셀 파일 다운로드" + }, + { + "id": 13, + "name": "인쇄 기능 확인", + "action": "verify_elements", + "checks": [ + "인쇄 버튼 존재" + ], + "expected": "인쇄 기능 표시" + }, + { + "id": 14, + "name": "원가율 표시 확인", + "action": "verify_detail", + "checks": [ + "매출원가율 표시", + "목표 원가율 대비 현황" + ], + "expected": "원가율 분석 표시" + }, + { + "id": 15, + "name": "기간별 비교 기능", + "action": "verify_elements", + "checks": [ + "전월/전년 대비 비교 기능" + ], + "expected": "비교 분석 기능 확인" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/accounting/cost", + "description": "원가 데이터 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/cost/export", + "description": "원가 데이터 엑셀 다운로드" + }, + { + "method": "GET", + "endpoint": "/api/v1/products", + "description": "품목 목록 조회" } ], "requiredVerifications": [ + { + "id": 1, + "name": "엑셀 다운로드", + "steps": [12], + "criteria": "API 호출 + 파일 다운로드" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "원가 관리 기능 확인" + "criteria": "원가 데이터/조회 폼, 기간 선택, 품목 선택 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/accounting-daily-report.json b/accounting-daily-report.json index 743ee17..57a51db 100644 --- a/accounting-daily-report.json +++ b/accounting-daily-report.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "회계관리 > 일일 일보 메뉴의 일일 리포트 기능 테스트", + "description": "회계관리 > 일일 일보 메뉴의 일일 리포트 조회/날짜선택/인쇄/다운로드 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "회계관리", "level2": "일일 일보", - "expectedUrl": "/accounting/daily-report" + "expectedUrl": "/accounting/daily-report", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,27 +35,167 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "일일 일보 데이터 표시" + "일일 일보 리포트 영역 표시", + "날짜 선택 가능", + "조회 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "일일 일보 확인", + "name": "일일 일보 페이지 구조 확인", "action": "verify_elements", "checks": [ - "날짜 선택", - "일보 내용" + "날짜 선택 (DatePicker)", + "조회 버튼", + "리포트 표시 영역" ], - "expected": "일일 일보 기능 표시" + "expected": "일일 일보 페이지 정상 표시" + }, + { + "id": 4, + "phase": "READ", + "name": "[READ] 오늘 날짜 일보 확인", + "action": "verify_detail", + "checks": [ + "현재 날짜 기준 일보 표시", + "리포트 데이터 또는 '데이터 없음' 메시지" + ], + "expected": "오늘 일보 조회" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 날짜 선택", + "action": "click", + "target": "input[type='date'], [class*='datepicker'], button:has-text('날짜')", + "expected": "날짜 선택기 열림" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 특정 날짜 선택", + "action": "fill", + "target": "input[type='date'], input[name*='date']", + "value": "2025-01-15", + "expected": "날짜 입력" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 조회 버튼 클릭", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색'), button[type='submit']", + "expected": { + "data_loaded": true, + "api_call": "GET /api/v1/accounting/daily-report" + } + }, + { + "id": 8, + "phase": "READ", + "name": "[READ] 일보 리포트 내용 확인", + "action": "verify_elements", + "checks": [ + "입금 내역 영역", + "출금 내역 영역", + "잔액 현황" + ], + "expected": "일보 리포트 상세 표시" + }, + { + "id": 9, + "name": "입금 합계 확인", + "action": "verify_detail", + "checks": [ + "입금 합계 금액 표시" + ], + "expected": "입금 합계 표시" + }, + { + "id": 10, + "name": "출금 합계 확인", + "action": "verify_detail", + "checks": [ + "출금 합계 금액 표시" + ], + "expected": "출금 합계 표시" + }, + { + "id": 11, + "name": "잔액 계산 확인", + "action": "verify_detail", + "checks": [ + "전일 잔액", + "금일 입금", + "금일 출금", + "금일 잔액" + ], + "expected": "잔액 계산 정상" + }, + { + "id": 12, + "name": "필수 검증 #1: 인쇄 기능", + "action": "click", + "target": "button:has-text('인쇄'), button:has-text('Print'), button[class*='print']", + "critical": true, + "expected": "인쇄 다이얼로그 표시" + }, + { + "id": 13, + "name": "인쇄 창 닫기", + "action": "close_modal_if_open", + "expected": "인쇄 창 닫힘" + }, + { + "id": 14, + "name": "엑셀 다운로드", + "action": "click", + "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", + "verify": { + "api_call": "GET /api/v1/accounting/daily-report/export", + "file_download": true + }, + "expected": "엑셀 파일 다운로드" + }, + { + "id": 15, + "name": "이전/다음 날짜 이동", + "action": "verify_elements", + "checks": [ + "이전 날짜 버튼 또는 화살표", + "다음 날짜 버튼 또는 화살표" + ], + "expected": "날짜 이동 버튼 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/accounting/daily-report", + "description": "일일 일보 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/daily-report/export", + "description": "일일 일보 엑셀 다운로드" } ], "requiredVerifications": [ + { + "id": 1, + "name": "인쇄 기능", + "steps": [12], + "criteria": "인쇄 다이얼로그 표시" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "일일 일보 기능 확인" + "criteria": "일보 리포트 영역, 날짜 선택, 조회 기능 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/accounting-financial.json b/accounting-financial.json index d801fe7..e0efac7 100644 --- a/accounting-financial.json +++ b/accounting-financial.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "회계관리 > 재무제표 메뉴의 재무제표 조회 기능 테스트", + "description": "회계관리 > 재무제표 메뉴의 재무상태표/손익계산서 조회/기간선택/다운로드 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "회계관리", "level2": "재무제표", - "expectedUrl": "/accounting/financial-statements" + "expectedUrl": "/accounting/financial-statements", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,26 +35,178 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "재무제표 데이터 표시" + "재무제표 영역 표시", + "기간 선택 가능", + "재무상태표 또는 손익계산서 탭" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "재무제표 기능 확인", + "name": "재무제표 페이지 구조 확인", "action": "verify_elements", "checks": [ - "손익계산서 또는 재무상태표" + "재무상태표 탭/버튼", + "손익계산서 탭/버튼", + "기간 선택 (연도/분기)", + "조회 버튼" ], - "expected": "재무제표 기능 표시" + "expected": "재무제표 페이지 정상 표시" + }, + { + "id": 4, + "phase": "READ", + "name": "[READ] 재무상태표 조회", + "action": "click", + "target": "button:has-text('재무상태표'), [class*='tab']:has-text('재무상태표'), a:has-text('재무상태표')", + "expected": { + "api_call": "GET /api/v1/accounting/financial/balance-sheet" + } + }, + { + "id": 5, + "name": "재무상태표 구조 확인", + "action": "verify_elements", + "checks": [ + "자산 항목 표시", + "부채 항목 표시", + "자본 항목 표시", + "자산총계 = 부채총계 + 자본총계" + ], + "expected": "재무상태표 정상 표시" + }, + { + "id": 6, + "phase": "READ", + "name": "[READ] 손익계산서 조회", + "action": "click", + "target": "button:has-text('손익계산서'), [class*='tab']:has-text('손익계산서'), a:has-text('손익계산서')", + "expected": { + "api_call": "GET /api/v1/accounting/financial/income-statement" + } + }, + { + "id": 7, + "name": "손익계산서 구조 확인", + "action": "verify_elements", + "checks": [ + "매출액 표시", + "매출원가 표시", + "영업이익 표시", + "당기순이익 표시" + ], + "expected": "손익계산서 정상 표시" + }, + { + "id": 8, + "phase": "FILTER", + "name": "[FILTER] 연도 선택", + "action": "click", + "target": "select[name*='year'], [class*='year'], button:has-text('연도')", + "expected": "연도 선택 옵션 표시" + }, + { + "id": 9, + "phase": "FILTER", + "name": "[FILTER] 분기 선택", + "action": "verify_elements", + "checks": [ + "1분기/2분기/3분기/4분기 선택 가능" + ], + "expected": "분기 선택 가능" + }, + { + "id": 10, + "phase": "FILTER", + "name": "[FILTER] 조회 실행", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색')", + "expected": { + "data_loaded": true + } + }, + { + "id": 11, + "name": "전년 동기 대비 확인", + "action": "verify_elements", + "checks": [ + "전년 동기 대비 증감 표시 여부" + ], + "expected": "비교 분석 기능 확인" + }, + { + "id": 12, + "name": "필수 검증 #1: 엑셀 다운로드", + "action": "click", + "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", + "critical": true, + "verify": { + "api_call": "GET /api/v1/accounting/financial/export", + "file_download": true + }, + "expected": "엑셀 파일 다운로드" + }, + { + "id": 13, + "name": "인쇄 기능 확인", + "action": "verify_elements", + "checks": [ + "인쇄 버튼 존재" + ], + "expected": "인쇄 기능 표시" + }, + { + "id": 14, + "name": "PDF 다운로드 확인", + "action": "verify_elements", + "checks": [ + "PDF 다운로드 버튼 존재 여부" + ], + "expected": "PDF 다운로드 기능 확인" + }, + { + "id": 15, + "name": "금액 포맷 확인", + "action": "verify_detail", + "checks": [ + "원화 포맷 정상 (천원 또는 원 단위)", + "음수 표시 (괄호 또는 마이너스)" + ], + "expected": "금액 표시 정상" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/accounting/financial/balance-sheet", + "description": "재무상태표 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/financial/income-statement", + "description": "손익계산서 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/financial/export", + "description": "재무제표 엑셀 다운로드" } ], "requiredVerifications": [ + { + "id": 1, + "name": "엑셀 다운로드", + "steps": [12], + "criteria": "API 호출 + 파일 다운로드" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "재무제표 기능 확인" + "criteria": "재무제표 영역, 기간 선택, 탭 전환 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/accounting-ledger.json b/accounting-ledger.json index 3ad3dbf..f0218c2 100644 --- a/accounting-ledger.json +++ b/accounting-ledger.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "회계관리 > 거래처원장 메뉴의 거래처별 원장 조회 기능 테스트", + "description": "회계관리 > 거래처원장 메뉴의 거래처별 원장 조회/필터/검색/다운로드 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "회계관리", "level2": "거래처원장", - "expectedUrl": "/accounting/vendor-ledger" + "expectedUrl": "/accounting/vendor-ledger", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -25,7 +27,7 @@ "level2": "거래처원장", "expected": { "url_contains": "/accounting/vendor-ledger", - "visible": ["거래처원장"] + "visible": ["거래처원장", "원장"] } }, { @@ -33,41 +35,180 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "원장 목록 표시", - "거래처 선택 가능" + "원장 목록 또는 조회 영역 표시", + "거래처 선택 가능", + "기간 필터 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "원장 테이블 확인", - "action": "verify_table", + "name": "거래처원장 페이지 구조 확인", + "action": "verify_elements", "checks": [ - "날짜 컬럼", - "거래내역 컬럼", - "차변 컬럼", - "대변 컬럼", - "잔액 컬럼" + "거래처 선택 셀렉트박스 또는 검색창", + "시작일 날짜 선택", + "종료일 날짜 선택", + "조회 버튼" ], - "expected": "원장 테이블 표시" + "expected": "거래처원장 조회 폼 정상 표시" }, { "id": 4, - "name": "기간 필터 확인", + "phase": "READ", + "name": "[READ] 거래처 선택 기능 확인", + "action": "click", + "target": "select[name*='vendor'], input[placeholder*='거래처'], button:has-text('거래처 선택')", + "expected": { + "selectable": true, + "options_visible": true + } + }, + { + "id": 5, + "phase": "READ", + "name": "[READ] 거래처 목록에서 선택", + "action": "select_or_click", + "target": "거래처 목록 첫 번째 항목", + "expected": "거래처 선택 완료" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 시작일 설정", + "action": "fill", + "target": "input[type='date']:first-of-type, input[name*='start'], input[placeholder*='시작']", + "value": "2025-01-01", + "expected": "시작일 입력" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 종료일 설정", + "action": "fill", + "target": "input[type='date']:last-of-type, input[name*='end'], input[placeholder*='종료']", + "value": "2025-12-31", + "expected": "종료일 입력" + }, + { + "id": 8, + "phase": "FILTER", + "name": "[FILTER] 조회 버튼 클릭", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색'), button[type='submit']", + "expected": { + "data_loaded": true, + "api_call": "GET /api/v1/accounting/vendor-ledger" + } + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 원장 테이블 구조 확인", + "action": "verify_table", + "checks": [ + "날짜 컬럼 표시", + "거래내역/적요 컬럼 표시", + "차변 컬럼 표시", + "대변 컬럼 표시", + "잔액 컬럼 표시" + ], + "expected": "원장 테이블 정상 표시" + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 원장 데이터 표시 확인", + "action": "verify_detail", + "checks": [ + "테이블에 데이터 행 존재 또는 '데이터 없음' 메시지", + "금액 포맷 정상 (원화 표시)" + ], + "expected": "원장 데이터 정상 표시" + }, + { + "id": 11, + "name": "잔액 합계 표시 확인", "action": "verify_elements", "checks": [ - "시작일 선택", - "종료일 선택" + "차변 합계 표시", + "대변 합계 표시", + "잔액 합계 표시" ], - "expected": "기간 필터 표시" + "expected": "합계 영역 표시" + }, + { + "id": 12, + "name": "필수 검증 #1: 엑셀 다운로드", + "action": "click", + "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드'), button:has-text('내보내기')", + "critical": true, + "verify": { + "api_call": "GET /api/v1/accounting/vendor-ledger/export", + "file_download": true + }, + "expected": "엑셀 파일 다운로드" + }, + { + "id": 13, + "name": "인쇄 버튼 확인", + "action": "verify_elements", + "checks": [ + "인쇄 버튼 존재" + ], + "expected": "인쇄 기능 표시" + }, + { + "id": 14, + "name": "기간별 원장 조회 테스트", + "action": "verify_elements", + "checks": [ + "월별/분기별 조회 가능 여부" + ], + "expected": "기간별 조회 기능 확인" + }, + { + "id": 15, + "name": "거래처 변경 후 재조회", + "action": "verify_detail", + "checks": [ + "다른 거래처 선택 시 데이터 변경" + ], + "expected": "거래처별 원장 조회 정상" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/vendors", + "description": "거래처 목록 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/vendor-ledger", + "description": "거래처원장 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/accounting/vendor-ledger/export", + "description": "거래처원장 엑셀 다운로드" } ], "requiredVerifications": [ + { + "id": 1, + "name": "엑셀 다운로드", + "steps": [12], + "criteria": "API 호출 + 파일 다운로드" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "원장 목록 확인" + "criteria": "원장 조회 영역, 거래처 선택, 기간 필터 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/accounting-payment.json b/accounting-payment.json index 2ab1ac5..c3c07ce 100644 --- a/accounting-payment.json +++ b/accounting-payment.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "회계관리 > 결제내역 메뉴의 결제 내역 조회 기능 테스트", + "description": "회계관리 > 결제내역 메뉴의 결제 내역 조회/필터/검색/다운로드 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "회계관리", "level2": "결제내역", - "expectedUrl": "/payment-history" + "expectedUrl": "/payment-history", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,29 +35,178 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "결제 내역 목록 표시" + "결제 내역 목록 표시", + "기간 필터 존재", + "검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "결제 테이블 확인", + "name": "결제내역 페이지 구조 확인", + "action": "verify_elements", + "checks": [ + "시작일 선택", + "종료일 선택", + "결제방법 필터", + "조회 버튼" + ], + "expected": "결제내역 조회 폼 정상 표시" + }, + { + "id": 4, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 시작일", + "action": "fill", + "target": "input[type='date']:first-of-type, input[name*='start']", + "value": "2025-01-01", + "expected": "시작일 입력" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 종료일", + "action": "fill", + "target": "input[type='date']:last-of-type, input[name*='end']", + "value": "2025-12-31", + "expected": "종료일 입력" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 조회 버튼 클릭", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색')", + "expected": { + "data_loaded": true, + "api_call": "GET /api/v1/payments" + } + }, + { + "id": 7, + "phase": "READ", + "name": "[READ] 결제 테이블 구조 확인", "action": "verify_table", "checks": [ - "결제일 컬럼", - "결제금액 컬럼", - "결제방법 컬럼", - "상태 컬럼" + "결제일 컬럼 표시", + "결제금액 컬럼 표시", + "결제방법 컬럼 표시", + "상태 컬럼 표시" ], - "expected": "결제 테이블 표시" + "expected": "결제 테이블 정상 표시" + }, + { + "id": 8, + "phase": "READ", + "name": "[READ] 결제 데이터 표시 확인", + "action": "verify_detail", + "checks": [ + "테이블에 데이터 행 존재 또는 '데이터 없음' 메시지", + "금액 포맷 정상" + ], + "expected": "결제 데이터 정상 표시" + }, + { + "id": 9, + "phase": "FILTER", + "name": "[FILTER] 결제방법 필터 테스트", + "action": "click", + "target": "select[name*='method'], button:has-text('결제방법'), [class*='filter']:has-text('방법')", + "expected": "결제방법 필터 옵션 표시" + }, + { + "id": 10, + "phase": "FILTER", + "name": "[FILTER] 상태 필터 테스트", + "action": "verify_elements", + "checks": [ + "완료/취소/대기 등 상태 필터 가능" + ], + "expected": "상태 필터 기능 확인" + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 결제 상세 조회", + "action": "click", + "target": "table tbody tr:first-child, [class*='list'] [class*='item']:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 12, + "name": "결제 상세 정보 확인", + "action": "verify_detail", + "checks": [ + "결제일시 상세", + "결제금액 상세", + "결제방법 상세", + "거래번호/승인번호" + ], + "expected": "결제 상세 정보 표시" + }, + { + "id": 13, + "name": "목록으로 돌아가기", + "action": "click_if_exists", + "target": "button:has-text('목록'), button:has-text('뒤로'), [class*='back']", + "expected": "목록 페이지로 복귀" + }, + { + "id": 14, + "name": "필수 검증 #1: 엑셀 다운로드", + "action": "click", + "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", + "critical": true, + "verify": { + "api_call": "GET /api/v1/payments/export", + "file_download": true + }, + "expected": "엑셀 파일 다운로드" + }, + { + "id": 15, + "name": "합계 금액 표시 확인", + "action": "verify_elements", + "checks": [ + "총 결제금액 합계 표시" + ], + "expected": "합계 영역 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/payments", + "description": "결제내역 목록 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/payments/:id", + "description": "결제 상세 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/payments/export", + "description": "결제내역 엑셀 다운로드" } ], "requiredVerifications": [ + { + "id": 1, + "name": "엑셀 다운로드", + "steps": [14], + "criteria": "API 호출 + 파일 다운로드" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "결제 내역 확인" + "criteria": "결제 내역 목록, 기간 필터, 검색 기능 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/material-stock.json b/material-stock.json index e9f7d2f..7d7107d 100644 --- a/material-stock.json +++ b/material-stock.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "자재관리 > 재고현황 메뉴의 재고 현황 조회 기능 테스트", + "description": "자재관리 > 재고현황 메뉴의 재고 현황 조회/검색/필터/다운로드 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "자재관리", "level2": "재고현황", - "expectedUrl": "/material/stock-status" + "expectedUrl": "/material/stock-status", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -34,49 +36,178 @@ "action": "verify_not_mockup", "checks": [ "재고 목록 표시", - "검색 기능 존재" + "검색 기능 존재", + "필터 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "재고 테이블 확인", + "name": "재고현황 테이블 구조 확인", "action": "verify_table", "checks": [ - "품목 컬럼", + "품목코드 컬럼", + "품목명 컬럼", "현재고 컬럼", - "안전재고 컬럼" + "안전재고 컬럼", + "위치/창고 컬럼" ], "expected": "재고 테이블 표시" }, { "id": 4, - "name": "검색 기능 테스트", - "action": "fill", - "target": "input[placeholder*='검색']", - "value": "테스트", - "expected": "검색어 입력됨" + "phase": "READ", + "name": "[READ] 재고 데이터 확인", + "action": "verify_detail", + "checks": [ + "재고 데이터 행 존재 또는 '데이터 없음' 메시지" + ], + "expected": "재고 데이터 표시" }, { "id": 5, - "name": "검색 초기화", - "action": "clear", - "target": "input[placeholder*='검색']", - "expected": "검색어 삭제" + "phase": "SEARCH", + "name": "[SEARCH] 품목 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "테스트", + "submit": true + }, + { + "id": 6, + "phase": "SEARCH", + "name": "[SEARCH] 검색 결과 확인", + "action": "verify_detail", + "checks": [ + "검색 결과 표시 또는 결과 없음 메시지" + ], + "expected": "검색 기능 동작" + }, + { + "id": 7, + "phase": "SEARCH", + "name": "[SEARCH] 검색 초기화", + "action": "click", + "target": "button:has-text('초기화'), button:has-text('리셋'), button[class*='clear']", + "expected": "검색 초기화" + }, + { + "id": 8, + "phase": "FILTER", + "name": "[FILTER] 창고/위치 필터", + "action": "click", + "target": "select[name*='warehouse'], select[name*='location'], button:has-text('창고')", + "expected": "창고 필터 옵션 표시" + }, + { + "id": 9, + "phase": "FILTER", + "name": "[FILTER] 재고 상태 필터", + "action": "verify_elements", + "checks": [ + "재고 부족/적정/과다 필터 가능" + ], + "expected": "재고 상태 필터 표시" + }, + { + "id": 10, + "name": "안전재고 이하 품목 확인", + "action": "verify_elements", + "checks": [ + "안전재고 이하 품목 강조 표시", + "부족 재고 경고 표시" + ], + "expected": "안전재고 알림 표시" + }, + { + "id": 11, + "name": "재고 이동 이력 링크", + "action": "verify_elements", + "checks": [ + "재고 이동 이력 조회 버튼 또는 링크" + ], + "expected": "이력 조회 기능 표시" + }, + { + "id": 12, + "name": "재고 현황 요약", + "action": "verify_elements", + "checks": [ + "총 품목 수", + "재고 금액 합계", + "부족 품목 수" + ], + "expected": "요약 정보 표시" + }, + { + "id": 13, + "name": "필수 검증 #1: 엑셀 다운로드", + "action": "click", + "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", + "critical": true, + "verify": { + "api_call": "GET /api/v1/material/stock/export", + "file_download": true + }, + "expected": "엑셀 파일 다운로드" + }, + { + "id": 14, + "name": "인쇄 기능 확인", + "action": "verify_elements", + "checks": [ + "인쇄 버튼 존재" + ], + "expected": "인쇄 기능 표시" + }, + { + "id": 15, + "name": "재고 조정 버튼 확인", + "action": "verify_elements", + "checks": [ + "재고 조정 버튼 존재 여부" + ], + "expected": "재고 조정 기능 확인" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/material/stock", + "description": "재고현황 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/material/stock/export", + "description": "재고현황 엑셀 다운로드" + }, + { + "method": "GET", + "endpoint": "/api/v1/material/warehouses", + "description": "창고 목록 조회" } ], "requiredVerifications": [ + { + "id": 1, + "name": "엑셀 다운로드", + "steps": [13], + "criteria": "API 호출 + 파일 다운로드" + }, { "id": 3, "name": "검색/필터", - "steps": [4, 5], - "criteria": "검색 기능 확인" + "steps": [5, 6, 7], + "criteria": "검색 + 필터 기능 동작" }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "재고 목록 확인" + "criteria": "재고 목록, 검색 기능, 필터 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/production-dashboard.json b/production-dashboard.json index d325613..99cacf2 100644 --- a/production-dashboard.json +++ b/production-dashboard.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "생산관리 > 생산 현황판 메뉴의 생산 현황 모니터링 기능 테스트", + "description": "생산관리 > 생산 현황판 메뉴의 생산 현황 모니터링/필터/차트 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "생산관리", "level2": "생산 현황판", - "expectedUrl": "/production/dashboard" + "expectedUrl": "/production/dashboard", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,19 +35,126 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "생산 현황 데이터 표시" + "생산 현황 데이터 표시", + "통계 카드 또는 차트 존재", + "기간 필터 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "현황판 기능 확인", + "name": "현황판 구조 확인", "action": "verify_elements", "checks": [ - "생산 통계", - "현황 차트 또는 테이블" + "생산 통계 카드", + "현황 차트", + "기간 선택 필터", + "라인/공정별 필터" ], - "expected": "현황판 기능 표시" + "expected": "현황판 구조 정상 표시" + }, + { + "id": 4, + "phase": "READ", + "name": "[READ] 생산 통계 카드 확인", + "action": "verify_detail", + "checks": [ + "오늘 생산량", + "목표 대비 달성률", + "불량률" + ], + "expected": "생산 통계 표시" + }, + { + "id": 5, + "phase": "READ", + "name": "[READ] 생산 추이 차트 확인", + "action": "verify_elements", + "checks": [ + "일별/주별/월별 생산 추이 차트", + "차트 데이터 표시" + ], + "expected": "생산 추이 차트 표시" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 테스트", + "action": "click", + "target": "select[name*='period'], button:has-text('기간'), [class*='filter']", + "expected": "기간 필터 옵션 표시" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 라인/공정별 필터", + "action": "verify_elements", + "checks": [ + "생산라인 선택 가능", + "공정별 필터 가능" + ], + "expected": "라인/공정 필터 표시" + }, + { + "id": 8, + "name": "실시간 현황 표시", + "action": "verify_elements", + "checks": [ + "현재 가동 라인", + "실시간 생산량 또는 마지막 갱신 시간" + ], + "expected": "실시간 현황 표시" + }, + { + "id": 9, + "name": "불량률 현황 확인", + "action": "verify_detail", + "checks": [ + "불량률 표시", + "불량 유형별 통계" + ], + "expected": "불량률 현황 표시" + }, + { + "id": 10, + "name": "생산 목표 대비 현황", + "action": "verify_elements", + "checks": [ + "목표 생산량", + "실제 생산량", + "달성률" + ], + "expected": "목표 대비 현황 표시" + }, + { + "id": 11, + "name": "자동 새로고침 확인", + "action": "verify_elements", + "checks": [ + "자동 새로고침 설정 또는 수동 새로고침 버튼" + ], + "expected": "새로고침 기능 존재" + }, + { + "id": 12, + "name": "전체화면 모드 확인", + "action": "verify_elements", + "checks": [ + "전체화면 버튼 존재 여부" + ], + "expected": "전체화면 기능 확인" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/production/dashboard", + "description": "생산 현황판 데이터 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/production/statistics", + "description": "생산 통계 조회" } ], "requiredVerifications": [ @@ -53,7 +162,10 @@ "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "생산 현황 기능 확인" + "criteria": "생산 현황 데이터, 통계 카드/차트, 기간 필터 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/production-item.json b/production-item.json index 1494f3f..c5fa73e 100644 --- a/production-item.json +++ b/production-item.json @@ -5,7 +5,7 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "품목관리 > 품목기준관리 메뉴의 품목 조회/관리 기능 테스트", + "description": "품목관리 > 품목기준관리 메뉴의 품목 CRUD 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "품목관리", @@ -18,6 +18,14 @@ "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "itemCode": "E2E_TEST_ITEM_{timestamp}", + "itemName": "E2E_TEST_품목_{timestamp}", + "spec": "테스트 규격", + "unit": "EA" + } + }, "steps": [ { "id": 1, @@ -26,7 +34,7 @@ "level1": "품목관리", "level2": "품목기준관리", "expected": { - "url_contains": "/production", + "url_contains": "/master-data", "visible": ["품목기준관리", "품목"] } }, @@ -36,28 +44,217 @@ "action": "verify_not_mockup", "checks": [ "품목 목록 표시", - "품목 등록 버튼 존재" + "품목 등록 버튼 존재", + "검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "품목 테이블 확인", + "name": "품목 테이블 구조 확인", "action": "verify_table", "checks": [ "품목코드 컬럼", "품목명 컬럼", - "규격 컬럼" + "규격 컬럼", + "단위 컬럼" ], "expected": "품목 테이블 표시" + }, + { + "id": 4, + "phase": "CREATE", + "name": "[CREATE] 품목 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 품목코드 입력", + "action": "fill", + "target": "input[name*='code'], input[placeholder*='코드']", + "value": "E2E_TEST_ITEM_{timestamp}", + "clear": true + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 품목명 입력", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='품목명']", + "value": "E2E_TEST_품목_{timestamp}", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 규격 입력", + "action": "fill", + "target": "input[name*='spec'], input[placeholder*='규격']", + "value": "테스트 규격", + "clear": true + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 품목 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "critical": true, + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/items", + "toast": "등록|저장|완료|성공" + }, + "expected": "품목 등록 완료" + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 등록된 품목 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_TEST_품목", + "submit": true + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 등록된 품목 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_품목 목록에 표시" + ], + "expected": "등록된 품목 확인" + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 품목 상세 조회", + "action": "click", + "target": "table tbody tr:has-text('E2E_TEST')", + "expected": { + "detail_view": true + } + }, + { + "id": 12, + "phase": "UPDATE", + "name": "[UPDATE] 품목 수정 모드 진입", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 13, + "phase": "UPDATE", + "name": "[UPDATE] 규격 수정", + "action": "fill", + "target": "input[name*='spec'], input[placeholder*='규격']", + "value": "수정된 규격", + "clear": true + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 품목 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/items", + "toast": "수정|저장|완료|성공" + }, + "expected": "품목 수정 완료" + }, + { + "id": 15, + "phase": "DELETE", + "name": "[DELETE] 품목 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 16, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/items", + "toast": "삭제|제거|완료|성공" + }, + "expected": "품목 삭제 완료" + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_품목 목록에서 제거" + ], + "expected": "품목 삭제 반영" + }, + { + "id": 18, + "name": "엑셀 다운로드 확인", + "action": "verify_elements", + "checks": [ + "엑셀 다운로드 버튼 존재" + ], + "expected": "엑셀 다운로드 기능 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/items", + "description": "품목 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/items", + "description": "품목 등록" + }, + { + "method": "PUT", + "endpoint": "/api/v1/items/:id", + "description": "품목 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/items/:id", + "description": "품목 삭제" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [8, 14], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "품목 목록 확인" + "criteria": "품목 목록, 등록 버튼, 검색 기능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_ITEM_* 패턴 데이터 삭제" + } } diff --git a/production-work-result.json b/production-work-result.json index c16e32b..73b6b9d 100644 --- a/production-work-result.json +++ b/production-work-result.json @@ -5,17 +5,26 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "생산관리 > 작업실적 메뉴의 작업 실적 조회/등록 기능 테스트", + "description": "생산관리 > 작업실적 메뉴의 작업 실적 CRUD 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "생산관리", "level2": "작업실적", - "expectedUrl": "/production/work-results" + "expectedUrl": "/production/work-results", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "description": "E2E_TEST_실적_{timestamp}", + "quantity": "100", + "defectQty": "5" + } + }, "steps": [ { "id": 1, @@ -34,29 +43,215 @@ "action": "verify_not_mockup", "checks": [ "작업실적 목록 표시", - "실적 등록 버튼 존재" + "실적 등록 버튼 존재", + "기간 필터 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "작업실적 테이블 확인", + "name": "작업실적 테이블 구조 확인", "action": "verify_table", "checks": [ "작업일 컬럼", "품목 컬럼", - "수량 컬럼", + "지시 수량 컬럼", + "실적 수량 컬럼", "작업자 컬럼" ], "expected": "작업실적 테이블 표시" + }, + { + "id": 4, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 시작일", + "action": "fill", + "target": "input[type='date']:first-of-type, input[name*='start']", + "value": "2025-01-01" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 종료일", + "action": "fill", + "target": "input[type='date']:last-of-type, input[name*='end']", + "value": "2025-12-31" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 조회 실행", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색')", + "expected": { + "api_call": "GET /api/v1/production/work-results" + } + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 실적 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 작업 지시 선택", + "action": "click", + "target": "select[name*='order'], button:has-text('작업지시'), input[placeholder*='작업지시']", + "expected": "작업 지시 선택 가능" + }, + { + "id": 9, + "phase": "CREATE", + "name": "[CREATE] 생산 수량 입력", + "action": "fill", + "target": "input[name*='quantity'], input[name*='qty'], input[placeholder*='수량']", + "value": "100", + "clear": true + }, + { + "id": 10, + "phase": "CREATE", + "name": "[CREATE] 불량 수량 입력", + "action": "fill", + "target": "input[name*='defect'], input[placeholder*='불량']", + "value": "5", + "clear": true + }, + { + "id": 11, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 실적 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "critical": true, + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/production/work-results", + "toast": "등록|저장|완료|성공" + }, + "expected": "실적 등록 완료" + }, + { + "id": 12, + "phase": "READ", + "name": "[READ] 등록된 실적 확인", + "action": "verify_detail", + "checks": [ + "등록한 실적 목록에 표시" + ], + "expected": "등록된 실적 확인" + }, + { + "id": 13, + "phase": "READ", + "name": "[READ] 실적 상세 조회", + "action": "click", + "target": "table tbody tr:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 14, + "name": "실적 상세 정보 확인", + "action": "verify_detail", + "checks": [ + "작업일시", + "품목 정보", + "생산 수량", + "불량 수량", + "작업자 정보" + ], + "expected": "실적 상세 정보 표시" + }, + { + "id": 15, + "phase": "UPDATE", + "name": "[UPDATE] 실적 수정", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 16, + "phase": "UPDATE", + "name": "[UPDATE] 수량 수정", + "action": "fill", + "target": "input[name*='quantity'], input[name*='qty']", + "value": "95", + "clear": true + }, + { + "id": 17, + "phase": "UPDATE", + "name": "[UPDATE] 수정 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/production/work-results", + "toast": "수정|저장|완료|성공" + }, + "expected": "실적 수정 완료" + }, + { + "id": 18, + "name": "엑셀 다운로드 확인", + "action": "click", + "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", + "verify": { + "file_download": true + }, + "expected": "엑셀 파일 다운로드" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/production/work-results", + "description": "작업실적 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/production/work-results", + "description": "작업실적 등록" + }, + { + "method": "PUT", + "endpoint": "/api/v1/production/work-results/:id", + "description": "작업실적 수정" + }, + { + "method": "GET", + "endpoint": "/api/v1/production/work-results/export", + "description": "작업실적 엑셀 다운로드" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [11, 17], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "작업실적 목록 확인" + "criteria": "작업실적 목록, 등록 버튼, 기간 필터 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "note": "작업실적은 작업지시와 연관되어 있어 주의 필요" + } } diff --git a/production-worker.json b/production-worker.json index 96e1ef1..2d7aa5c 100644 --- a/production-worker.json +++ b/production-worker.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "생산관리 > 작업자 화면 메뉴의 작업자용 화면 기능 테스트", + "description": "생산관리 > 작업자 화면 메뉴의 작업 조회/실적 입력 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "생산관리", "level2": "작업자 화면", - "expectedUrl": "/production/worker-screen" + "expectedUrl": "/production/worker-screen", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -33,18 +35,134 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "작업자 화면 표시" + "작업자 화면 표시", + "작업 목록 또는 작업 선택", + "실적 입력 가능" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "작업자 화면 기능 확인", + "name": "작업자 화면 구조 확인", "action": "verify_elements", "checks": [ - "작업 목록 또는 작업 입력" + "오늘 작업 목록", + "작업 지시 정보", + "실적 입력 영역", + "완료 버튼" ], - "expected": "작업자 화면 기능 표시" + "expected": "작업자 화면 구조 정상 표시" + }, + { + "id": 4, + "phase": "READ", + "name": "[READ] 오늘 작업 목록 확인", + "action": "verify_detail", + "checks": [ + "할당된 작업 표시", + "작업 지시 번호", + "품목 정보" + ], + "expected": "오늘 작업 목록 표시" + }, + { + "id": 5, + "phase": "READ", + "name": "[READ] 작업 지시 상세 확인", + "action": "click", + "target": "table tbody tr:first-child, [class*='list'] [class*='item']:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 6, + "name": "작업 지시 상세 정보", + "action": "verify_detail", + "checks": [ + "작업 지시 번호", + "품목명/규격", + "지시 수량", + "시작/종료 예정 시간" + ], + "expected": "작업 지시 상세 표시" + }, + { + "id": 7, + "name": "실적 입력 영역 확인", + "action": "verify_elements", + "checks": [ + "생산 수량 입력", + "불량 수량 입력", + "작업 시간 입력" + ], + "expected": "실적 입력 필드 표시" + }, + { + "id": 8, + "name": "작업 상태 변경 버튼", + "action": "verify_elements", + "checks": [ + "작업 시작 버튼", + "작업 완료 버튼", + "일시정지 버튼" + ], + "expected": "상태 변경 버튼 표시" + }, + { + "id": 9, + "name": "실시간 생산량 표시", + "action": "verify_detail", + "checks": [ + "현재까지 생산량", + "목표 대비 진행률" + ], + "expected": "실시간 생산량 표시" + }, + { + "id": 10, + "name": "불량 등록 기능", + "action": "verify_elements", + "checks": [ + "불량 유형 선택", + "불량 수량 입력" + ], + "expected": "불량 등록 기능 표시" + }, + { + "id": 11, + "name": "작업 메모/비고 입력", + "action": "verify_elements", + "checks": [ + "메모 또는 비고 입력 영역" + ], + "expected": "메모 입력 가능" + }, + { + "id": 12, + "name": "이전 작업 실적 확인", + "action": "verify_elements", + "checks": [ + "이전 작업 실적 조회 가능" + ], + "expected": "이력 조회 기능 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/production/worker/tasks", + "description": "작업자 할당 작업 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/production/work-results", + "description": "작업 실적 등록" + }, + { + "method": "PUT", + "endpoint": "/api/v1/production/tasks/:id/status", + "description": "작업 상태 변경" } ], "requiredVerifications": [ @@ -52,7 +170,10 @@ "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "작업자 화면 기능 확인" + "criteria": "작업자 화면, 작업 목록, 실적 입력 기능 존재" } - ] + ], + "rollbackPlan": { + "note": "실적 입력 테스트는 실제 데이터에 영향을 줄 수 있으므로 주의" + } } diff --git a/purchase-client.json b/purchase-client.json index 4954e2a..c5f873f 100644 --- a/purchase-client.json +++ b/purchase-client.json @@ -5,7 +5,7 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "구매관리 > 거래처관리 메뉴의 구매 거래처 조회/관리 기능 테스트", + "description": "구매관리 > 거래처관리 메뉴의 구매 거래처 CRUD 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "구매관리", @@ -18,6 +18,13 @@ "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "supplierName": "E2E_TEST_구매처_{timestamp}", + "businessNumber": "123-45-67890", + "representative": "테스트 대표" + } + }, "steps": [ { "id": 1, @@ -36,27 +43,217 @@ "action": "verify_not_mockup", "checks": [ "거래처 목록 표시", - "거래처 등록 버튼 존재" + "거래처 등록 버튼 존재", + "검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "거래처 테이블 확인", + "name": "거래처 테이블 구조 확인", "action": "verify_table", "checks": [ "거래처명 컬럼", - "사업자번호 컬럼" + "사업자번호 컬럼", + "대표자 컬럼", + "연락처 컬럼" ], "expected": "거래처 테이블 표시" + }, + { + "id": 4, + "phase": "CREATE", + "name": "[CREATE] 거래처 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 거래처명 입력", + "action": "fill", + "target": "input[name*='name'], input[placeholder*='거래처명']", + "value": "E2E_TEST_구매처_{timestamp}", + "clear": true + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 사업자번호 입력", + "action": "fill", + "target": "input[name*='business'], input[placeholder*='사업자']", + "value": "123-45-67890", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 대표자명 입력", + "action": "fill", + "target": "input[name*='representative'], input[placeholder*='대표']", + "value": "테스트 대표", + "clear": true + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 거래처 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "critical": true, + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/purchase/suppliers", + "toast": "등록|저장|완료|성공" + }, + "expected": "거래처 등록 완료" + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 등록된 거래처 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_TEST_구매처", + "submit": true + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 등록된 거래처 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_구매처 목록에 표시" + ], + "expected": "등록된 거래처 확인" + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 거래처 상세 조회", + "action": "click", + "target": "table tbody tr:has-text('E2E_TEST')", + "expected": { + "detail_view": true + } + }, + { + "id": 12, + "phase": "UPDATE", + "name": "[UPDATE] 거래처 수정 모드 진입", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 13, + "phase": "UPDATE", + "name": "[UPDATE] 대표자명 수정", + "action": "fill", + "target": "input[name*='representative'], input[placeholder*='대표']", + "value": "수정된 대표", + "clear": true + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 거래처 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/purchase/suppliers", + "toast": "수정|저장|완료|성공" + }, + "expected": "거래처 수정 완료" + }, + { + "id": 15, + "phase": "DELETE", + "name": "[DELETE] 거래처 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 16, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/purchase/suppliers", + "toast": "삭제|제거|완료|성공" + }, + "expected": "거래처 삭제 완료" + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_구매처 목록에서 제거" + ], + "expected": "거래처 삭제 반영" + }, + { + "id": 18, + "name": "엑셀 다운로드 확인", + "action": "verify_elements", + "checks": [ + "엑셀 다운로드 버튼 존재" + ], + "expected": "엑셀 다운로드 기능 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/purchase/suppliers", + "description": "거래처 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/purchase/suppliers", + "description": "거래처 등록" + }, + { + "method": "PUT", + "endpoint": "/api/v1/purchase/suppliers/:id", + "description": "거래처 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/purchase/suppliers/:id", + "description": "거래처 삭제" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [8, 14], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "거래처 목록 확인" + "criteria": "거래처 목록, 등록 버튼, 검색 기능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_구매처_* 패턴 데이터 삭제" + } } diff --git a/purchase-pricing.json b/purchase-pricing.json index 7349630..a4272b8 100644 --- a/purchase-pricing.json +++ b/purchase-pricing.json @@ -5,12 +5,12 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "구매관리 > 단가관리 메뉴의 구매 단가 관리 기능 테스트", + "description": "구매관리 > 단가관리 메뉴의 구매 단가 CRUD 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "구매관리", "level2": "단가관리", - "expectedUrl": "/sales/pricing-management", + "expectedUrl": "/purchase/pricing-management", "searchWithinParent": true, "closeOtherMenus": true }, @@ -18,6 +18,13 @@ "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "itemName": "E2E_TEST_품목_{timestamp}", + "price": "10000", + "unit": "EA" + } + }, "steps": [ { "id": 1, @@ -26,7 +33,7 @@ "level1": "구매관리", "level2": "단가관리", "expected": { - "url_contains": "/sales", + "url_contains": "/purchase", "visible": ["단가관리", "단가"] } }, @@ -35,27 +42,214 @@ "name": "필수 검증 #5: 목업 페이지 감지", "action": "verify_not_mockup", "checks": [ - "단가 목록 표시" + "단가 목록 표시", + "단가 등록 버튼 존재", + "검색 기능 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "단가 목록 확인", + "name": "단가 테이블 구조 확인", "action": "verify_table", "checks": [ "품목 컬럼", - "단가 컬럼" + "거래처 컬럼", + "단가 컬럼", + "적용기간 컬럼" ], - "expected": "단가 목록 표시" + "expected": "단가 테이블 표시" + }, + { + "id": 4, + "phase": "CREATE", + "name": "[CREATE] 단가 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 품목 선택", + "action": "click", + "target": "select[name*='item'], button:has-text('품목'), input[placeholder*='품목']", + "expected": "품목 선택 가능" + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 거래처 선택", + "action": "click", + "target": "select[name*='supplier'], button:has-text('거래처'), input[placeholder*='거래처']", + "expected": "거래처 선택 가능" + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 단가 입력", + "action": "fill", + "target": "input[name*='price'], input[placeholder*='단가']", + "value": "10000", + "clear": true + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 단가 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "critical": true, + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/purchase/pricing", + "toast": "등록|저장|완료|성공" + }, + "expected": "단가 등록 완료" + }, + { + "id": 9, + "phase": "READ", + "name": "[READ] 등록된 단가 확인", + "action": "verify_detail", + "checks": [ + "등록한 단가 목록에 표시" + ], + "expected": "등록된 단가 확인" + }, + { + "id": 10, + "phase": "READ", + "name": "[READ] 단가 상세 조회", + "action": "click", + "target": "table tbody tr:first-child", + "expected": { + "detail_view": true + } + }, + { + "id": 11, + "name": "단가 상세 정보 확인", + "action": "verify_detail", + "checks": [ + "품목 정보", + "거래처 정보", + "단가", + "적용기간" + ], + "expected": "단가 상세 정보 표시" + }, + { + "id": 12, + "phase": "UPDATE", + "name": "[UPDATE] 단가 수정 모드 진입", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 13, + "phase": "UPDATE", + "name": "[UPDATE] 단가 수정", + "action": "fill", + "target": "input[name*='price'], input[placeholder*='단가']", + "value": "12000", + "clear": true + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 단가 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/purchase/pricing", + "toast": "수정|저장|완료|성공" + }, + "expected": "단가 수정 완료" + }, + { + "id": 15, + "name": "단가 이력 조회", + "action": "verify_elements", + "checks": [ + "단가 변동 이력 조회 가능" + ], + "expected": "단가 이력 기능 확인" + }, + { + "id": 16, + "name": "엑셀 다운로드", + "action": "click", + "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", + "verify": { + "file_download": true + }, + "expected": "엑셀 파일 다운로드" + }, + { + "id": 17, + "name": "단가 비교 기능", + "action": "verify_elements", + "checks": [ + "거래처별 단가 비교 기능" + ], + "expected": "단가 비교 기능 확인" + }, + { + "id": 18, + "name": "일괄 등록 기능", + "action": "verify_elements", + "checks": [ + "엑셀 일괄 등록 버튼 존재 여부" + ], + "expected": "일괄 등록 기능 확인" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/purchase/pricing", + "description": "단가 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/purchase/pricing", + "description": "단가 등록" + }, + { + "method": "PUT", + "endpoint": "/api/v1/purchase/pricing/:id", + "description": "단가 수정" + }, + { + "method": "GET", + "endpoint": "/api/v1/purchase/pricing/history", + "description": "단가 이력 조회" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [8, 14], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "단가 관리 기능 확인" + "criteria": "단가 목록, 등록 버튼, 검색 기능 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "note": "단가 삭제는 일반적으로 비활성화 처리" + } } diff --git a/purchase-status.json b/purchase-status.json index 8dd2881..e4245e1 100644 --- a/purchase-status.json +++ b/purchase-status.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "구매관리 > 구매현황 메뉴의 구매 현황 조회 기능 테스트", + "description": "구매관리 > 구매현황 메뉴의 구매 현황 조회/필터/통계 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "구매관리", "level2": "구매현황", - "expectedUrl": "/purchase/status" + "expectedUrl": "/purchase/status", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -34,27 +36,173 @@ "action": "verify_not_mockup", "checks": [ "구매 현황 표시", - "필터 존재" + "기간 필터 존재", + "통계 또는 차트 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "구매 현황 확인", + "name": "구매현황 페이지 구조 확인", "action": "verify_elements", "checks": [ "구매 통계 카드", - "구매 목록 테이블" + "기간 선택 필터", + "구매 목록 테이블 또는 차트" ], - "expected": "구매 현황 표시" + "expected": "구매현황 페이지 정상 표시" + }, + { + "id": 4, + "phase": "READ", + "name": "[READ] 구매 통계 확인", + "action": "verify_detail", + "checks": [ + "총 구매금액", + "구매 건수", + "평균 구매금액" + ], + "expected": "구매 통계 표시" + }, + { + "id": 5, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 시작일", + "action": "fill", + "target": "input[type='date']:first-of-type, input[name*='start']", + "value": "2025-01-01" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 종료일", + "action": "fill", + "target": "input[type='date']:last-of-type, input[name*='end']", + "value": "2025-12-31" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 조회 실행", + "action": "click", + "target": "button:has-text('조회'), button:has-text('검색')", + "expected": { + "data_loaded": true, + "api_call": "GET /api/v1/purchase/status" + } + }, + { + "id": 8, + "name": "구매 현황 테이블 확인", + "action": "verify_table", + "checks": [ + "발주일 컬럼", + "거래처 컬럼", + "품목 컬럼", + "금액 컬럼", + "상태 컬럼" + ], + "expected": "구매 현황 테이블 표시" + }, + { + "id": 9, + "name": "상태별 필터 확인", + "action": "verify_elements", + "checks": [ + "진행중/완료/취소 상태 필터" + ], + "expected": "상태 필터 표시" + }, + { + "id": 10, + "name": "거래처별 통계 확인", + "action": "verify_elements", + "checks": [ + "거래처별 구매금액 표시" + ], + "expected": "거래처별 통계 표시" + }, + { + "id": 11, + "name": "품목별 통계 확인", + "action": "verify_elements", + "checks": [ + "품목별 구매금액 표시" + ], + "expected": "품목별 통계 표시" + }, + { + "id": 12, + "name": "월별 추이 차트 확인", + "action": "verify_elements", + "checks": [ + "월별 구매 추이 차트" + ], + "expected": "추이 차트 표시" + }, + { + "id": 13, + "name": "필수 검증 #1: 엑셀 다운로드", + "action": "click", + "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", + "critical": true, + "verify": { + "api_call": "GET /api/v1/purchase/status/export", + "file_download": true + }, + "expected": "엑셀 파일 다운로드" + }, + { + "id": 14, + "name": "인쇄 기능 확인", + "action": "verify_elements", + "checks": [ + "인쇄 버튼 존재" + ], + "expected": "인쇄 기능 표시" + }, + { + "id": 15, + "name": "전년 대비 비교 확인", + "action": "verify_elements", + "checks": [ + "전년 동기 대비 증감 표시" + ], + "expected": "비교 분석 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/purchase/status", + "description": "구매현황 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/purchase/statistics", + "description": "구매 통계 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/purchase/status/export", + "description": "구매현황 엑셀 다운로드" } ], "requiredVerifications": [ + { + "id": 1, + "name": "엑셀 다운로드", + "steps": [13], + "criteria": "API 호출 + 파일 다운로드" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "구매 현황 확인" + "criteria": "구매 현황, 기간 필터, 통계/차트 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } }