{ "id": "daily-report", "name": "일일리포트 테스트", "screenshotPolicy": { "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, "description": "회계관리 > 일일리포트 메뉴의 날짜 선택, 테이블 데이터 표시, 새로고침, 엑셀 다운로드 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "url": "/ko/accounting/daily-report", "navigation": { "targetUrl": "/accounting/daily-report", "urlPattern": "/accounting/daily-report|/ko/accounting/daily-report", "menuHints": ["일일 일보", "일일리포트", "일일보고", "회계관리"] }, "menuNavigation": { "level1": "회계관리", "level2": "일일 일보", "expectedUrl": "/ko/accounting/daily-report" }, "menuNavigationEnhanced": { "strategy": "scroll-and-search", "description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지", "level1": "회계관리", "level2": "일일 일보", "alternativeLevel1Names": ["회계관리", "회계 관리", "Accounting"], "alternativeLevel2Names": ["일일 일보", "일일리포트", "일일 리포트", "Daily Report"], "scrollConfig": { "sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar", "menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']", "scrollStep": 200, "maxScrollAttempts": 10, "scrollDelay": 300 } }, "testFocus": { "primary": "날짜별 데이터 조회 및 테이블 표시 검증", "description": "날짜 선택, 어음 및 외상매출채권 테이블, 일자별 상세 테이블(KRW/USD 분리), 매칭 상태, 합계 검증" }, "prerequisites": { "authentication": true, "testData": { "testDate": "2026-01-10", "todayDate": "2026-01-15" } }, "expectedAPIs": [ { "method": "GET", "endpoint": "/api/v1/daily-report/note-receivables", "params": "date=YYYY-MM-DD", "description": "어음 및 외상매출채권 데이터 조회" }, { "method": "GET", "endpoint": "/api/v1/daily-report/daily-accounts", "params": "date=YYYY-MM-DD", "description": "일자별 계좌 상세 데이터 조회" }, { "method": "GET", "endpoint": "/api/v1/daily-report/summary", "params": "date=YYYY-MM-DD", "description": "일일리포트 요약 데이터 조회" }, { "method": "GET", "endpoint": "/api/v1/daily-report/export", "params": "date=YYYY-MM-DD", "description": "엑셀 다운로드" } ], "steps": [ { "id": "step-0", "name": "사이드바 메뉴 전체 펼치기", "description": "모두 펼치기 버튼을 클릭하여 전체 메뉴를 펼친 후 메뉴 탐색 준비", "actions": [ { "type": "scroll", "target": "sidebar", "direction": "top", "description": "사이드바 최상단으로 스크롤" }, { "type": "wait", "duration": 300 }, { "type": "evaluate", "script": "Array.from(document.querySelectorAll('button')).find(b => b.innerText?.includes('모두 펼치기'))?.click()" }, { "type": "wait", "duration": 2000 } ] }, { "id": "step-1", "name": "2단계 메뉴 진입: 회계관리 > 일일리포트", "description": "사이드바를 스크롤하며 회계관리 > 일일리포트 메뉴를 찾아 클릭", "actions": [ { "type": "scrollAndFind", "target": "회계관리", "alternativeTexts": ["회계관리", "회계 관리", "Accounting"], "scrollContainer": "sidebar", "maxAttempts": 10, "description": "스크롤하며 회계관리 메뉴 찾기" }, { "type": "click", "target": "회계관리", "description": "회계관리 메뉴 클릭" }, { "type": "wait", "duration": 500, "description": "서브메뉴 펼쳐지기 대기" }, { "type": "scrollAndFind", "target": "일일리포트", "alternativeTexts": ["일일리포트", "일일 리포트", "Daily Report"], "scrollContainer": "submenu", "maxAttempts": 5, "description": "서브메뉴에서 일일리포트 찾기" }, { "type": "click", "target": "일일리포트", "description": "일일리포트 메뉴 클릭" }, { "type": "wait", "target": "페이지 로드 완료", "timeout": 10000 } ], "expected": { "url": "/ko/accounting/daily-report", "pageTitle": "일일리포트", "elements": ["페이지 타이틀", "날짜 선택", "테이블"], "authenticated": true }, "verification": [ "회계관리 메뉴가 펼쳐졌는지 확인", "일일리포트 서브메뉴 클릭 성공", "404 에러 없이 페이지 로드 완료" ] }, { "id": "step-2", "name": "페이지 구조 확인", "description": "날짜 선택, 버튼, 테이블 구조 확인", "actions": [ { "type": "verify", "target": "페이지 구조" } ], "expected": { "datePicker": "조회 일자 입력 필드", "buttons": ["새로고침", "엑셀 다운로드"], "tables": ["어음 및 외상매출채권현황", "일자별 상세"] } }, { "id": "step-3", "name": "날짜 선택 필드 기본값 확인", "description": "날짜 입력 필드의 기본값이 오늘 날짜인지 확인", "actions": [ { "type": "verify", "target": "date input value" } ], "expected": { "dateValue": "2026-01-15", "dateFormat": "YYYY-MM-DD" } }, { "id": "step-4", "name": "페이지 타이틀 날짜 표시 확인", "description": "페이지 타이틀에 선택된 날짜와 요일이 표시되는지 확인", "actions": [ { "type": "verify", "target": "title date format" } ], "expected": { "titleFormat": "2026년 1월 15일 수요일", "includesDayOfWeek": true } }, { "id": "step-5", "name": "어음 및 외상매출채권현황 테이블 구조 확인", "description": "첫 번째 테이블의 컬럼 헤더 확인", "actions": [ { "type": "verify", "target": "note receivables table columns" } ], "expected": { "tableTitle": "어음 및 외상매출채권현황", "columns": ["내용", "현재 잔액", "발행일", "만기일"] } }, { "id": "step-6", "name": "어음 및 외상매출채권 데이터 로드 확인", "description": "테이블에 데이터가 표시되는지 확인 (또는 '데이터가 없습니다' 메시지)", "actions": [ { "type": "verify", "target": "table data or empty message" } ], "expected": { "dataExists": "데이터 행 존재 또는 '데이터가 없습니다' 메시지", "apiCalled": "GET /api/v1/daily-report/note-receivables" } }, { "id": "step-7", "name": "어음 및 외상매출채권 합계 확인", "description": "테이블 하단의 합계 행이 표시되는지 확인", "actions": [ { "type": "verify", "target": "table footer total" } ], "expected": { "footerExists": true, "footerLabel": "합계", "totalCalculation": "현재 잔액 합계 표시" } }, { "id": "step-8", "name": "일자별 상세 테이블 구조 확인", "description": "두 번째 테이블의 컬럼 헤더 확인", "actions": [ { "type": "verify", "target": "daily accounts table columns" } ], "expected": { "tableTitle": "일자별 상세", "columns": ["구분", "상태", "전월 이월", "수입", "지출", "잔액"] } }, { "id": "step-9", "name": "일자별 상세 데이터 로드 확인", "description": "테이블에 데이터가 표시되는지 확인", "actions": [ { "type": "verify", "target": "daily accounts data" } ], "expected": { "dataExists": "데이터 행 존재 또는 '데이터가 없습니다' 메시지", "apiCalled": "GET /api/v1/daily-report/daily-accounts" } }, { "id": "step-10", "name": "KRW 계좌 데이터 확인", "description": "원화(KRW) 계좌 데이터가 표시되는지 확인", "actions": [ { "type": "verify", "target": "KRW accounts" } ], "expected": { "krwAccountsExist": true, "currencyType": "KRW" } }, { "id": "step-11", "name": "USD 계좌 데이터 확인", "description": "외화(USD) 계좌 데이터가 별도로 표시되는지 확인", "actions": [ { "type": "verify", "target": "USD accounts" } ], "expected": { "usdAccountsExist": "USD 계좌 존재 또는 없음", "currencyType": "USD" } }, { "id": "step-12", "name": "매칭 상태 Badge 확인", "description": "상태 컬럼의 매칭/비매칭 Badge가 표시되는지 확인", "actions": [ { "type": "verify", "target": "match status badges" } ], "expected": { "badgeTypes": ["매칭", "비매칭"], "matchedStyle": "green background", "unmatchedStyle": "orange background" } }, { "id": "step-13", "name": "외화원(USD) 합계 행 확인", "description": "일자별 상세 테이블의 첫 번째 합계 행 확인", "actions": [ { "type": "verify", "target": "USD total row" } ], "expected": { "footerLabel": "외화원 (USD) 합계", "totalCalculation": "USD 계좌 합계 표시" } }, { "id": "step-14", "name": "현금성 자산 합계 행 확인", "description": "일자별 상세 테이블의 두 번째 합계 행 확인", "actions": [ { "type": "verify", "target": "cash asset total row" } ], "expected": { "footerLabel": "현금성 자산 합계", "totalCalculation": "전체 현금성 자산 합계 표시" } }, { "id": "step-15", "name": "로딩 상태 확인 - 어음 테이블", "description": "데이터 로딩 중 어음 테이블에 로딩 스피너가 표시되는지 확인", "actions": [ { "type": "verify", "target": "note receivables loading state" } ], "expected": { "loadingSpinner": "Loader2 spinner", "loadingMessage": "데이터를 불러오는 중..." } }, { "id": "step-16", "name": "로딩 상태 확인 - 일자별 상세 테이블", "description": "데이터 로딩 중 일자별 상세 테이블에 로딩 스피너가 표시되는지 확인", "actions": [ { "type": "verify", "target": "daily accounts loading state" } ], "expected": { "loadingSpinner": "Loader2 spinner", "loadingMessage": "데이터를 불러오는 중..." } }, { "id": "step-17", "name": "날짜 변경 - 과거 날짜 선택", "description": "날짜 선택 필드에서 과거 날짜(2026-01-10)로 변경", "actions": [ { "type": "clear", "target": "date input" }, { "type": "type", "target": "date input", "value": "2026-01-10" }, { "type": "wait", "target": "데이터 로드" } ], "expected": { "dateChanged": "2026-01-10", "dataReloaded": true } }, { "id": "step-18", "name": "날짜 변경 후 페이지 타이틀 확인", "description": "변경된 날짜가 페이지 타이틀에 반영되는지 확인", "actions": [ { "type": "verify", "target": "title date update" } ], "expected": { "titleFormat": "2026년 1월 10일 금요일", "dateMatches": "2026-01-10" } }, { "id": "step-19", "name": "날짜 변경 후 데이터 리로드 확인", "description": "새로운 날짜에 대한 데이터가 로드되는지 확인", "actions": [ { "type": "verify", "target": "data reload for new date" } ], "expected": { "apiCalledWithDate": "2026-01-10", "dataUpdated": true } }, { "id": "step-20", "name": "날짜 변경 후 어음 테이블 데이터 확인", "description": "변경된 날짜의 어음 데이터가 표시되는지 확인", "actions": [ { "type": "verify", "target": "note receivables data for 2026-01-10" } ], "expected": { "dataForDate": "2026-01-10", "tableUpdated": true } }, { "id": "step-21", "name": "날짜 변경 후 일자별 상세 테이블 데이터 확인", "description": "변경된 날짜의 계좌 상세 데이터가 표시되는지 확인", "actions": [ { "type": "verify", "target": "daily accounts data for 2026-01-10" } ], "expected": { "dataForDate": "2026-01-10", "tableUpdated": true } }, { "id": "step-22", "name": "날짜를 오늘로 되돌리기", "description": "날짜 선택 필드를 다시 오늘 날짜(2026-01-15)로 변경", "actions": [ { "type": "clear", "target": "date input" }, { "type": "type", "target": "date input", "value": "2026-01-15" }, { "type": "wait", "target": "데이터 로드" } ], "expected": { "dateChanged": "2026-01-15", "dataReloaded": true } }, { "id": "step-23", "name": "새로고침 버튼 존재 확인", "description": "새로고침 버튼이 표시되는지 확인", "actions": [ { "type": "verify", "target": "refresh button" } ], "expected": { "buttonExists": true, "buttonText": "새로고침", "icon": "RefreshCw" } }, { "id": "step-24", "name": "새로고침 버튼 클릭", "description": "새로고침 버튼 클릭하여 데이터 리로드 확인", "actions": [ { "type": "click", "target": "새로고침 버튼" }, { "type": "wait", "target": "데이터 리로드" } ], "expected": { "buttonClicked": true, "loadingStateShown": true, "dataReloaded": true } }, { "id": "step-25", "name": "새로고침 버튼 로딩 상태 확인", "description": "새로고침 버튼 클릭 시 버튼이 비활성화되고 로딩 스피너가 표시되는지 확인", "actions": [ { "type": "verify", "target": "refresh button loading state" } ], "expected": { "buttonDisabled": true, "loadingSpinner": "Loader2 spinner", "iconChanged": "RefreshCw → Loader2" } }, { "id": "step-26", "name": "새로고침 후 API 호출 확인", "description": "새로고침 버튼 클릭 후 모든 API가 다시 호출되는지 확인", "actions": [ { "type": "verify", "target": "API calls after refresh" } ], "expected": { "apiCalls": [ "GET /api/v1/daily-report/note-receivables", "GET /api/v1/daily-report/daily-accounts", "GET /api/v1/daily-report/summary" ] } }, { "id": "step-27", "name": "새로고침 후 데이터 표시 확인", "description": "새로고침 후 두 테이블 모두 데이터가 정상적으로 표시되는지 확인", "actions": [ { "type": "verify", "target": "both tables data after refresh" } ], "expected": { "noteReceivablesTableUpdated": true, "dailyAccountsTableUpdated": true, "noError": "에러 없이 정상 동작" } }, { "id": "step-28", "name": "엑셀 다운로드 버튼 존재 확인", "description": "엑셀 다운로드 버튼이 표시되는지 확인", "actions": [ { "type": "verify", "target": "excel download button" } ], "expected": { "buttonExists": true, "buttonText": "엑셀 다운로드", "icon": "Download" } }, { "id": "step-29", "name": "엑셀 다운로드 버튼 클릭 전 Network 상태 확인", "description": "다운로드 전 Network Request 기록", "actions": [ { "type": "verify", "target": "network state before download" } ], "expected": { "networkRecorded": true } }, { "id": "step-30", "name": "엑셀 다운로드 버튼 클릭", "description": "엑셀 다운로드 버튼 클릭 후 다운로드 처리 확인", "actions": [ { "type": "click", "target": "엑셀 다운로드 버튼" }, { "type": "wait", "target": "다운로드 처리" } ], "expected": { "buttonClicked": true, "downloadInitiated": true } }, { "id": "step-31", "name": "엑셀 다운로드 API 호출 확인", "description": "다운로드 버튼 클릭 후 Export API가 호출되는지 확인", "actions": [ { "type": "verify", "target": "export API call" } ], "expected": { "apiCall": "GET /api/v1/daily-report/export?date=2026-01-15", "apiResponse": "200 OK", "contentType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" } }, { "id": "step-32", "name": "엑셀 다운로드 이벤트 확인", "description": "실제 파일 다운로드 이벤트가 발생하는지 확인", "actions": [ { "type": "verify", "target": "download event" } ], "expected": { "downloadEvent": "발생", "fileFormat": "xlsx 또는 xls", "filenamePattern": "daily_report_*.xlsx" } }, { "id": "step-33", "name": "엑셀 다운로드 성공 토스트 확인", "description": "다운로드 성공 시 토스트 메시지가 표시되는지 확인", "actions": [ { "type": "verify", "target": "success toast message" } ], "expected": { "toastMessage": "엑셀 다운로드가 완료되었습니다.", "toastType": "success" } }, { "id": "step-34", "name": "어음 데이터 내용 형식 확인", "description": "어음 테이블의 '내용' 컬럼 형식이 올바른지 확인", "actions": [ { "type": "verify", "target": "note receivable content format" } ], "expected": { "contentFormat": "(수취어음) 거래처명 - 어음번호", "exampleFormat": "(수취어음) ABC상사 - N2026-001" } }, { "id": "step-35", "name": "어음 현재 잔액 표시 확인", "description": "어음 테이블의 현재 잔액이 올바른 형식으로 표시되는지 확인", "actions": [ { "type": "verify", "target": "current balance format" } ], "expected": { "formatType": "통화 형식 (₩1,000,000)", "alignment": "right-aligned" } }, { "id": "step-36", "name": "어음 발행일/만기일 형식 확인", "description": "날짜 형식이 올바르게 표시되는지 확인", "actions": [ { "type": "verify", "target": "date format in note table" } ], "expected": { "dateFormat": "YYYY-MM-DD 또는 YYYY.MM.DD", "exampleFormat": "2026-01-15 또는 2026.01.15" } }, { "id": "step-37", "name": "일자별 상세 구분 컬럼 형식 확인", "description": "계좌 '구분' 컬럼이 올바른 형식으로 표시되는지 확인", "actions": [ { "type": "verify", "target": "account category format" } ], "expected": { "categoryFormat": "은행명 계좌번호 축약", "exampleFormat": "국민은행 ***1234" } }, { "id": "step-38", "name": "일자별 상세 금액 컬럼 정렬 확인", "description": "전월 이월, 수입, 지출, 잔액 컬럼이 우측 정렬되는지 확인", "actions": [ { "type": "verify", "target": "amount columns alignment" } ], "expected": { "alignment": "right-aligned", "columns": ["전월 이월", "수입", "지출", "잔액"] } }, { "id": "step-39", "name": "일자별 상세 금액 형식 확인", "description": "금액이 통화 형식으로 표시되는지 확인", "actions": [ { "type": "verify", "target": "amount format" } ], "expected": { "formatType": "통화 형식 (₩1,000,000 또는 $1,000.00)", "thousandsSeparator": "쉼표(,) 사용" } }, { "id": "step-40", "name": "어음 테이블 빈 데이터 처리 확인", "description": "어음 데이터가 없을 때 적절한 메시지가 표시되는지 확인", "actions": [ { "type": "verify", "target": "empty state message for note table" } ], "expected": { "emptyMessage": "데이터가 없습니다.", "messagePosition": "table center" } }, { "id": "step-41", "name": "일자별 상세 테이블 빈 데이터 처리 확인", "description": "계좌 데이터가 없을 때 적절한 메시지가 표시되는지 확인", "actions": [ { "type": "verify", "target": "empty state message for daily accounts table" } ], "expected": { "emptyMessage": "데이터가 없습니다.", "messagePosition": "table center" } }, { "id": "step-42", "name": "매칭 상태 필터링 확인", "description": "매칭/비매칭 상태에 따라 데이터가 올바르게 분류되는지 확인", "actions": [ { "type": "verify", "target": "match status filtering" } ], "expected": { "matchedItems": "매칭 Badge 표시", "unmatchedItems": "비매칭 Badge 표시", "correctColors": "매칭=green, 비매칭=orange" } }, { "id": "step-43", "name": "KRW/USD 계좌 분리 확인", "description": "원화와 외화 계좌가 올바르게 분리되어 표시되는지 확인", "actions": [ { "type": "verify", "target": "currency separation" } ], "expected": { "krwAccountsFirst": "KRW 계좌 먼저 표시", "usdAccountsAfter": "USD 계좌 나중에 표시", "separateGroups": "통화별 그룹화" } }, { "id": "step-44", "name": "외화원(USD) 합계 계산 확인", "description": "외화원 합계가 USD 계좌만 합산하는지 확인", "actions": [ { "type": "verify", "target": "USD total calculation" } ], "expected": { "includesOnlyUSD": "USD 계좌만 합산", "excludesKRW": "KRW 계좌 제외", "correctTotal": "USD 계좌 잔액 합계" } }, { "id": "step-45", "name": "현금성 자산 합계 계산 확인", "description": "현금성 자산 합계가 전체 계좌를 합산하는지 확인", "actions": [ { "type": "verify", "target": "cash asset total calculation" } ], "expected": { "includesAllAccounts": "KRW + USD 계좌 전체 합산", "correctTotal": "전체 계좌 잔액 합계" } }, { "id": "step-46", "name": "어음 합계 계산 정확성 확인", "description": "어음 테이블 합계가 현재 잔액의 정확한 합계인지 확인", "actions": [ { "type": "verify", "target": "note receivables total accuracy" } ], "expected": { "correctCalculation": "모든 어음 현재 잔액의 합계", "matchesData": "개별 행 합계와 일치" } }, { "id": "step-47", "name": "페이지 반응형 동작 확인", "description": "브라우저 크기 조절 시 테이블이 올바르게 표시되는지 확인", "actions": [ { "type": "verify", "target": "responsive behavior" } ], "expected": { "tableScrollable": "테이블 스크롤 가능", "layoutPreserved": "레이아웃 유지" } }, { "id": "step-48", "name": "날짜 선택 필드 제약 확인", "description": "날짜 입력 필드에 유효하지 않은 날짜를 입력할 수 없는지 확인", "actions": [ { "type": "verify", "target": "date input validation" } ], "expected": { "inputType": "date", "validationExists": "브라우저 기본 날짜 검증" } }, { "id": "step-49", "name": "콘솔 에러 확인", "description": "페이지 동작 중 콘솔에 에러가 발생하지 않는지 확인", "actions": [ { "type": "verify", "target": "console errors" } ], "expected": { "noErrors": "콘솔 에러 없음", "warningsAcceptable": "경고는 허용" } }, { "id": "step-50", "name": "전체 페이지 기능 통합 테스트", "description": "날짜 변경, 새로고침, 다운로드를 순차적으로 실행하여 모든 기능이 정상 동작하는지 확인", "actions": [ { "type": "type", "target": "date input", "value": "2026-01-12" }, { "type": "wait", "target": "데이터 로드" }, { "type": "click", "target": "새로고침 버튼" }, { "type": "wait", "target": "데이터 리로드" }, { "type": "click", "target": "엑셀 다운로드 버튼" }, { "type": "wait", "target": "다운로드 완료" } ], "expected": { "allFunctionsWork": "모든 기능 정상 동작", "dataConsistency": "데이터 일관성 유지", "noErrors": "에러 없이 완료" } } ], "cleanup": { "description": "테스트 후 날짜를 오늘로 복원 (필요시)", "actions": [] }, "notes": [ "날짜 선택에 따른 데이터 필터링 정상 동작 확인", "두 개의 테이블(어음, 일자별 상세) 모두 데이터 표시 확인", "KRW/USD 계좌 분리 및 합계 계산 정확성 확인", "매칭/비매칭 상태 Badge 표시 확인", "새로고침 버튼 동작 및 로딩 상태 확인", "엑셀 다운로드는 Network Request 및 실제 다운로드 이벤트 확인 필수", "모든 금액 표시 형식 및 정렬 확인", "빈 데이터 처리 및 로딩 상태 표시 확인" ] }