{
  "issueId": "4144",
  "environment": "dev",
  "source": "local checklist",
  "sourceText": "**[1] QA 요청 배경**\n\n[4144 — 커스텀 정산 일정](https://itsm.bix.bz/issues/4144)\n\n명절 등 특정 기간에 예정된 정산을 지정한 날짜로 미루는 기능입니다.\n\n**처음에는 모든 커스텀 정산 일정 정책을 OFF로 두고 기존 정산이 정상 생성되는지 확인합니다. 그다음 테넌트 정책을 ON으로 변경하고, 법인·가맹별 예외를 순서대로 확인합니다.**\n\n**[2] 테스트 대상 및 준비 자료**\n\n| 구분 | 대상 |\n|---|---|\n| 테넌트 | 빅스페이먼츠 |\n| 법인 | 김경주_법인 / BP100559 |\n| 영업점 | 김경주_영업 / BP100564 |\n| 가맹점 | 전달한 최신 가맹점 엑셀의 20개 |\n| MID | korpay-0001 ~ korpay-0020 |\n| 가맹 예외 대상 | 김경주_가맹_D+1(1일 후) / BP100611 |\n| 비교 가맹 | 김경주_가맹_P+10(10분) / BP100570 |\n| 즉시정산 가맹 | 김경주_가맹_P+1(즉시) / BP100627 |\n\n가맹 예외란 **테넌트에서는 정산을 미루지만, 선택한 가맹만 기존 정산일정대로 처리하도록 제외하는 것**입니다. 법인 예외는 해당 법인과 별도 직접 설정이 없는 하위 부서를 제외하는 것입니다.\n\n전달한 가맹점·법인·영업점·MID·영업라인 엑셀과 실제 화면을 대조해주세요. 상세 설정과 연결 관계는 QA 시작 시 확인합니다. 파일명의 `지급정지`는 자료 구분용입니다.\n\n최신 목록에 없는 `김경주_가맹_루시_단 / BP100560`, `A_주홍석_바움` 등 과거 거래는 이번 결과에 포함하지 않습니다.\n\n**[3] 공통 사용 방법**\n\n**부서 설정 관리**\n\n어드민에서 `시스템메뉴 > 부서설정 관리 > 부서설정 관리`에 접속합니다.\n\n- 커스텀 정산 일정 설정이 있으면 해당 행의 **상세**를 선택합니다.\n- 설정이 없으면 **생성**을 선택하고 설정타입 `커스텀 정산 일정`, 빅스페이먼츠 테넌트, 적용할 부서 종류와 부서명을 선택합니다.\n- 아래 날짜를 입력하고 테스트별 안내에 따라 **활성화 또는 비활성화**하여 저장합니다.\n- 기존 설정의 상세에서는 **일정 생성** 영역에 날짜를 입력합니다. 같은 기간의 일정이 이미 있으면 연필 버튼으로 수정합니다.\n\n| 항목 | 공통 입력값 |\n|---|---|\n| 변경 대상 시작시각 — 포함 | 2026-09-18 오전 00:00:00 |\n| 변경 대상 종료시각 — 미포함 | 2026-09-28 오전 00:00:00 |\n| 변경 후 정산예정시각 | 2026-09-29 오후 02:00:00 |\n\n**거래 생성**\n\nSH 파일 3개를 같은 폴더에 두고 실행합니다.\n\n```bash\nbash issue-4144-korpay-qa-run.sh\n```\n\n```text\n실행할 테스트: 1\n개발계에 실제 거래를 생성할까요?: y\n승인금액: 테스트별 지정 금액\n승인일시: now\n```\n\n- 전체 MID 20개에 각각 승인 거래가 생성됩니다.\n- SH는 RM 설정을 변경하지 않습니다. 먼저 화면에서 설정을 저장해주세요.\n- 실행 시각과 출력된 거래번호를 기록합니다. 현재 주문번호는 `QA4144-ALL_APPROVAL-`로 시작합니다.\n- 아래 예상 날짜는 **9월 18일 거래 및 전달한 부서 설정 기준**입니다. 다른 날짜에 실행하면 기존 정산예정일을 다시 확인해야 합니다.\n\n**결과 확인**\n\n1. `거래내역`에서 이번 실행 시각으로 조회합니다.\n2. 20개 MID에 각각 승인 거래가 1건씩 생성됐는지 확인합니다.\n3. `정산관리 > 정산내역`에서 날짜를 **2026-09-18 ~ 2026-12-05**로 지정합니다.\n4. 법인·영업점·가맹별로 정산일과 정산금을 확인합니다.\n\n기존 정산에 합산될 수 있으므로 **실행 전 금액과 실행 후 증가액**을 비교합니다. 이전 테스트 정산과 이번 거래를 혼동하지 않도록 거래번호를 함께 기록해주세요.\n\n**[4] 권한 및 확인 화면**\n\n- **어드민:** 아래 전체 테스트 수행\n- **테넌트 관리자:** 빅스페이먼츠 계정으로 부여된 권한 내에서 설정 조회·변경 및 결과 확인\n- 확인 화면: `부서설정 관리`, `거래내역`, `정산관리 > 정산내역`, 일정 상세의 `미지급 이동`\n\n**[5] 테스트 순서**\n\n**TC01. 전체 OFF — 기존 정산 생성 확인**\n\n1. 부서설정 관리에서 빅스페이먼츠 테넌트와 김경주_법인·김경주_영업·20개 가맹의 커스텀 정산 일정 정책을 조회합니다.\n2. 등록된 정책은 모두 **비활성화**합니다. 정책이 없는 부서는 그대로 둡니다.\n3. 다른 RM 항목이 아닌 **커스텀 정산 일정 정책**의 상태를 확인합니다.\n4. 승인금액 **12,345원**으로 전체 승인합니다.\n5. 거래내역과 정산내역을 조회합니다.\n\n확인:\n\n- 승인 거래 20건이 생성됩니다.\n- 가맹·영업·법인 정산이 각각 기존 정산주기와 방식대로 생성됩니다.\n- 커스텀 일정에 적힌 `9월 29일 14:00`으로 일괄 변경되지 않습니다.\n- 금액 누락·중복이 없는지 확인합니다.\n- 각 부서의 정산일을 이후 ON 테스트의 비교 기준으로 기록합니다.\n\n전달한 설정과 동일한 경우 대표 비교값은 다음과 같습니다.\n\n| 대상 | OFF 상태의 비교 기준 |\n|---|---|\n| D+1 가맹 | 9월 21일 16:00 |\n| P+10 가맹 | 거래 처리 후 해당 10분 정산 구간 |\n| W+7 가맹 | 9월 27일 16:00 |\n| 즉시정산 가맹 | 거래 처리 시점에 가까운 정산일 |\n| 김경주_영업 | 9월 28일 16:00 |\n| 김경주_법인 | 10월 12일 16:00 |\n\n정산 생성과 지급 결과는 별도로 기록합니다. 즉시정산에서 `법인 지갑이 존재하지 않습니다`가 발생하면 **생성 결과는 확인하되 지급 검증은 실패 또는 확인 불가**로 남깁니다.\n\n**TC02. 테넌트 ON — 전체 적용 확인**\n\n1. TC01 결과를 확인한 뒤 진행합니다.\n2. 하위 법인·영업점·가맹에 직접 등록된 **커스텀 정산 일정 정책을 삭제**하여 테넌트 설정을 상속할 수 있게 합니다. 삭제 전 설정을 기록합니다.\n3. 빅스페이먼츠 테넌트 정책에 공통 일정을 입력하고 **활성화**합니다.\n4. 승인금액 **12,346원**으로 전체 승인합니다.\n5. 정산내역을 조회합니다.\n\n확인:\n\n- TC01에서 정산일이 제한기간 안이었던 정산은 이번에 **9월 29일 14:00**으로 생성됩니다.\n- D+1·P+10·W+7·즉시정산 가맹을 대표로 비교합니다.\n- 즉시정산과 P+10도 원래 처리시각에 지급되지 않는지 확인합니다.\n- 제한기간 밖인 법인 `10월 12일 16:00`, 영업점 `9월 28일 16:00`은 기존 날짜를 유지합니다.\n- TC01에서 이미 생성된 정산은 별도 이동 작업 없이 변경되지 않습니다.\n\n**주의:** 하위 직접 OFF 설정을 남긴 채 테넌트만 ON으로 변경하면 하위가 계속 예외 처리될 수 있습니다. 이 케이스에서는 하위 직접 설정을 삭제해야 합니다.\n\n**TC03. 테넌트 ON + 법인 OFF — 법인 하위 연기 제외**\n\n1. 테넌트 정책은 ON으로 유지합니다.\n2. 김경주_법인에 커스텀 정산 일정 정책을 직접 생성합니다.\n3. 공통 일정을 입력하고 **비활성화**합니다.\n4. 영업점과 가맹에는 직접 설정이 없는지 확인합니다.\n5. 승인금액 **12,347원**으로 전체 승인합니다.\n\n확인:\n\n- D+1·P+10·W+7·즉시정산 가맹은 **TC01의 기존 정산일정**으로 생성됩니다.\n- 테넌트 ON이어도 법인 직접 OFF로 해당 하위 부서가 연기 대상에서 제외됩니다.\n- 이전에 9월 29일로 미뤄진 정산은 그대로 유지됩니다.\n\n**TC04. 법인 OFF + 특정 가맹 ON — 가맹만 다시 연기**\n\n1. 테넌트 ON, 김경주_법인 OFF를 유지합니다.\n2. `김경주_가맹_D+1(1일 후)`에 직접 정책을 생성합니다.\n3. 공통 일정을 입력하고 **활성화**합니다.\n4. 승인금액 **12,348원**으로 전체 승인합니다.\n\n| 확인 대상 | 기대 결과 |\n|---|---|\n| D+1 가맹 | 직접 ON이므로 **9월 29일 14:00** |\n| P+10 가맹 | 법인 OFF를 상속하여 기존 정산일 |\n| 즉시정산 가맹 | 법인 OFF를 상속하여 기존 즉시정산 흐름 |\n\n**TC05. 테넌트 ON + 특정 가맹 OFF — 가맹 하나만 연기 제외**\n\n1. 김경주_법인의 직접 정책을 삭제합니다.\n2. D+1 가맹의 직접 정책을 **비활성화**합니다.\n3. 테넌트는 ON, 다른 부서는 직접 설정 없는 상태로 둡니다.\n4. 승인금액 **12,349원**으로 전체 승인합니다.\n\n| 확인 대상 | 기대 결과 |\n|---|---|\n| D+1 가맹 | 직접 OFF 예외로 기존 `9월 21일 16:00` 유지 |\n| P+10 가맹 | 테넌트 ON 상속, **9월 29일 14:00** |\n| 즉시정산 가맹 | 테넌트 ON 상속, **9월 29일 14:00** |\n\n이 케이스가 **“테넌트 전체는 정산을 미루지만 특정 가맹은 사용하지 않는다”**는 요구사항입니다.\n\n**TC06. 가맹 예외 삭제 — 테넌트 일정 재상속**\n\n1. D+1 가맹에 직접 등록한 정책 자체를 삭제합니다.\n2. 테넌트 정책은 ON으로 유지합니다.\n3. 승인금액 **12,350원**으로 전체 승인합니다.\n4. D+1 가맹도 다시 **9월 29일 14:00**으로 생성되는지 확인합니다.\n\n정책을 **OFF로 저장하는 것**은 연기 제외이고, **직접 정책을 삭제하는 것**은 상위 설정 재상속입니다.\n\n**TC07. 법인·영업점 자체 정산의 ON/OFF 확인**\n\n법인과 영업점의 원래 정산일도 포함하도록 테넌트 일정을 임시 변경합니다.\n\n| 항목 | 입력값 |\n|---|---|\n| 시작 | 2026-09-18 00:00:00 |\n| 종료 | 2026-10-13 00:00:00 |\n| 대체 시각 | 2026-10-14 14:00:00 |\n\n1. 하위 직접 설정이 없는 상태에서 테넌트 정책을 ON으로 설정합니다.\n2. 승인금액 **12,351원**으로 전체 승인합니다.\n3. 김경주_법인과 김경주_영업 정산이 모두 **10월 14일 14:00**으로 생성되는지 확인합니다.\n4. 김경주_법인에 같은 일정의 직접 정책을 만들고 OFF로 설정합니다.\n5. 승인금액 **12,352원**으로 전체 승인합니다.\n6. 이번 법인 정산은 **10월 12일 16:00**, 영업점 정산은 **9월 28일 16:00**을 유지하는지 확인합니다.\n7. 법인 직접 정책을 삭제하고, 김경주_영업에만 직접 OFF 정책을 만듭니다.\n8. 승인금액 **12,353원**으로 전체 승인합니다.\n\n마지막 실행에서는:\n\n- 영업점만 기존 `9월 28일 16:00` 유지\n- 법인은 `10월 14일 14:00`\n- D+1 가맹도 `10월 14일 14:00`\n\n으로 생성되는지 확인합니다. 영업점 설정 변경이 가맹까지 예외 처리하지 않아야 합니다.\n\n**TC08. 기존 미지급 정산 이동**\n\n1. 테넌트 일정을 공통 날짜로 복원하고 ON으로 설정합니다.\n2. 하위 직접 정책을 삭제합니다.\n3. 정산내역에서 TC01에 생성된 미지급 정산 중 **9월 18일 이상 ~ 9월 28일 미만**인 대상을 기록합니다.\n4. `부서설정 관리 > 빅스페이먼츠 커스텀 정산 일정 > 상세 > 미지급 이동`을 선택합니다.\n5. 목록에서 테스트 부서와 기존 정산일·금액을 확인합니다.\n6. 대상 정산을 선택하여 이동합니다.\n7. 정산내역을 다시 조회합니다.\n\n확인:\n\n- 선택한 정산만 `9월 29일 14:00`으로 이동\n- 부서·금액·정산방식 유지\n- 지급 완료 정산은 이동되지 않음\n- 이동 작업 때문에 기존 여러 정산을 하나로 강제 합산하지 않음\n\n법인 직접 OFF 정책을 다시 등록한 후 테넌트의 미지급 이동 목록을 열어, 해당 법인과 직접 설정 없는 하위 부서가 이동 대상에서 제외되는지도 확인합니다.\n\n**TC09. 연기된 거래 취소**\n\n1. 9월 29일로 미뤄진 미지급 거래 하나를 고릅니다.\n2. 거래내역에서 원승인 MID·거래번호·승인금액을 확인합니다.\n3. SH에서 `2) 전체 취소`를 선택합니다.\n4. `y`를 입력하고 해당 MID·원승인금액·취소일시 `now`·원승인 거래번호를 입력합니다.\n5. 거래내역에서 취소 반영 여부를 확인합니다.\n6. 정산내역에서 취소금이 정상 반영되고 중복 지급할 금액이 남지 않는지 확인합니다.\n\n메뉴의 전체 취소는 **전체 20건 일괄 취소가 아니라 선택한 거래 1건의 전액 취소**입니다.\n\n**TC10. 다시 전체 OFF — 기존 흐름 복귀**\n\n1. 테넌트·법인·영업점·가맹에 등록된 커스텀 정산 일정 정책을 모두 비활성화합니다.\n2. 승인금액 **12,354원**으로 전체 승인합니다.\n3. 이번 거래의 정산이 TC01처럼 기존 정산일정으로 생성되는지 확인합니다.\n4. 이전에 이미 이동한 정산은 기존에 이동된 날짜를 유지하는지 확인합니다.\n\n**[6] 일정 화면 및 종료 시점 확인**\n\n부서설정 관리 상세에서 다음을 확인합니다.\n\n- 시작이 종료보다 늦거나 같으면 저장되지 않고 안내가 표시되는지\n- 대체 시각이 종료보다 늦지 않으면 저장되지 않는지\n- 같은 정책에서 제한기간이 겹치는 일정을 중복 등록할 수 없는지\n- 연필 버튼으로 수정하고 저장·취소할 수 있는지\n- 재조회 시 날짜가 유지되고 수정자가 Login ID로 표시되는지\n- OFF 상태에서 일정은 관리할 수 있지만 미지급 이동은 실행할 수 없는지\n\n제한 종료 후 복귀는 별도로 짧은 일정으로 확인합니다.\n\n1. 하위 직접 설정을 정리하고 테넌트 정책만 ON으로 설정합니다.\n2. 기존 테스트 일정과 겹치지 않도록 정리한 뒤, **현재 시각부터 약 10분 뒤까지**를 제한기간으로 설정합니다.\n3. 대체 시각은 제한 종료보다 충분히 뒤로 설정합니다.\n4. 제한기간 중 전체 승인하고 즉시정산 가맹이 대체 시각으로 미뤄지는지 확인합니다.\n5. 제한 종료 후, 대체 시각이 오기 전에 다시 전체 승인합니다.\n6. 이번 즉시정산은 기존 흐름으로 생성되고, 앞서 미뤄진 정산은 대체 시각에 남아 있는지 확인합니다.\n\n각 케이스 결과에는 **정책 ON/OFF 화면, 실행 시각·거래번호, 정산일·금액, 지급 결과**를 남겨주세요. 정산 생성 성공만으로 지급 완료까지 통과 처리하지 않습니다.",
  "scope": "개발계 빅스페이먼츠에서 커스텀 정산 일정 OFF/ON, 테넌트·법인·영업점·가맹점 직접 정책 상속/예외/삭제, 일정 경계·검증, 기존 미지급 이동, 승인 취소, 일반정산과 I+0 즉시정산 생성·지급 분리를 ADMIN/TA 계정 범위에서 검증",
  "checklist": [
    "전체 정책 OFF에서 최신 20개 MID 승인 후 기존 정산주기대로 생성되고 2026-09-29 14:00으로 이동하지 않는지 확인",
    "테넌트 ON에서 제한기간 안의 일반·즉시정산만 2026-09-29 14:00으로 이동하고 기간 밖 및 기존 생성 정산은 변하지 않는지 확인",
    "테넌트 ON + 법인 OFF에서 법인과 직접 설정이 없는 하위 영업점·가맹점이 예외가 되는지 확인",
    "법인 OFF + D+1 가맹점 직접 ON에서 해당 가맹점만 다시 적용되는지 확인",
    "테넌트 ON + D+1 가맹점 직접 OFF에서 해당 가맹점만 예외이고 P+10·I+0 즉시정산은 적용되는지 확인",
    "D+1 가맹점 직접 정책 삭제 후 상위 테넌트 일정을 다시 상속하는지 확인",
    "법인 정책 ON을 유지한 채 마지막 일정만 삭제하면 일정 0건으로 동작하고 상위 테넌트 일정을 재상속하지 않으며, 법인 정책 자체 삭제 후에는 재상속하는지 확인",
    "법인·영업점 직접 ON/OFF와 TENANT→CO→BO/VE 계층에서 BO와 VE가 형제로 서로 상속하지 않는 범위를 확인",
    "기존 미지급 정산 이동에서 선택한 대상만 이동하고 동일 시각에도 합산하지 않으며 settlement ID·금액·target 소속을 유지하는지 확인",
    "이동된 승인 거래 취소 후 취소 거래·취소 정산·원거래 연결·금액·예정일을 확인",
    "모든 정책을 다시 OFF로 복원한 후 최초 OFF 결과와 같은지 확인",
    "제한 시작 시각은 포함하고 제한 종료 시각은 제외하며 종료 후 I+0 즉시정산도 기존 주기로 생성되는지 확인",
    "일정 생성·수정·삭제, 기간 겹침, 시작 < 종료 <= 변경 후 정산예정시각 제약, Login ID 표시, 수정·삭제 아이콘을 확인",
    "정책 ON + 일정 0건과 정책 자체 삭제의 상속 결과를 구분해 기록",
    "I+0 즉시정산은 정산 생성과 지급 완료를 구분하고 법인 지갑 부재 메시지가 발생하면 지급 결과만 별도 문제 발견/확인 불가로 기록",
    "거래일 기준 ON/OFF에서 늦은 통보 거래의 정책 적용 기준일이 각각 거래일/통보일로 달라지는지 확인",
    "최신 20개 MID의 H/D/M/P/W/I 전체 정산주기와 주말·공휴일 이체 설정 조합을 OFF/ON 결과로 비교",
    "동일 승인 통보를 중복 전송해도 거래와 정산 대상이 중복 생성되지 않는지 확인",
    "부분취소 시 음수 거래·정산금·수수료와 원거래 연결이 보존되는지 확인",
    "동일 부서·예정시각의 합산 대상이 없을 때 생성되고 있을 때 같은 settlement ID에 정확히 합산되는지 확인",
    "미지급 이동 실행 직전 정책 상태를 재검증하고 재실행 시 0건 처리되는지 확인"
  ],
  "roles": [
    "ADMIN",
    "TA"
  ],
  "subjectAccounts": [
    { "role": "ADMIN", "label": "#4144 ADMIN", "envRole": "QA4144_ADMIN" },
    { "role": "TA", "label": "빅스페이먼츠 TA", "envRole": "QA4144_TA" }
  ],
  "routeCandidates": "../../../../qa-results/issues/4144/dev/route-candidates.json",
  "setupSteps": [
    {
      "name": "커스텀 정산 일정 정책과 일정 상태 순차 전환",
      "kind": "data-update",
      "role": "ADMIN",
      "application": "admin",
      "targetRoles": ["TA"],
      "description": "부서설정 관리에서 빅스페이먼츠 테넌트와 최신 엑셀의 법인·영업점·20개 가맹점만 대상으로 정책 OFF/ON, 직접 정책 생성·일정 삭제·정책 삭제를 시나리오 순서대로 수행한다.",
      "spec": "00-admin-custom-settlement-setup.spec.ts",
      "required": true,
      "mutation": "temporary",
      "guardEnv": "QA_ALLOW_PERMISSION_MUTATION",
      "navigation": { "name": "시스템메뉴 > 부서설정 관리 > 부서설정 관리", "path": "/admin/ta-department-setting" },
      "target": { "type": "department-policy", "role": "ADMIN", "userEnvKey": "BIX_ADMIN_DEV_QA4144_ADMIN_USERNAME", "avoidSharedPreset": false },
      "actions": [
        { "name": "초기 직접 정책과 일정 스냅샷", "intent": "state-snapshot", "label": "커스텀 정산 일정" },
        { "name": "시나리오별 활성화·비활성화·생성·삭제", "intent": "state-transition", "label": "저장" },
        { "name": "대상 role 재로그인", "intent": "reauthenticate", "label": "ADMIN → TA" }
      ],
      "restore": { "required": true, "description": "QA 종료 후 테넌트·법인·영업점·가맹점 정책을 최초 OFF 상태와 스냅샷으로 복원하고 화면 증적을 남긴다." }
    },
    {
      "name": "#4144 코페이 개발계 거래 생성·취소",
      "kind": "data-create",
      "role": "ADMIN",
      "application": "admin",
      "targetRoles": ["TA"],
      "description": "실행 전 미리보기로 개발계 API, korpay-0001~0020, 케이스별 금액을 확인한 뒤 전용 스크립트로 승인·취소를 전송한다.",
      "required": true,
      "mutation": "persistent",
      "guardEnv": "QA_ALLOW_PERMISSION_MUTATION",
      "navigation": { "name": "거래내역 / 정산관리 > 정산내역", "path": "/trade-history-v2" },
      "restore": { "required": false, "description": "생성된 QA 거래는 QA4144 주문번호로 식별하고 취소 케이스 외 임의 삭제하지 않는다." }
    }
  ],
  "pages": [
    {
      "name": "부서설정 관리",
      "application": "admin",
      "path": "/admin/ta-department-setting",
      "tenantParam": "tenantId",
      "roles": ["ADMIN", "TA"],
      "searchButtonSelector": "button:has-text('검색')",
      "recordsSelector": "body",
      "dataRequestUrlPattern": "rm/settings",
      "filters": [
        {
          "name": "부서코드",
          "selector": "xpath=//*[normalize-space()='부서코드']/following::input[1]",
          "type": "textbox",
          "value": "BP100559",
          "queryParamCandidates": ["departmentCode"]
        }
      ]
    },
    {
      "name": "거래내역",
      "application": "admin",
      "path": "/trade-history-v2",
      "tenantParam": "tenantId",
      "roles": ["ADMIN", "TA"],
      "searchButtonSelector": "button:has-text('검색')",
      "recordsSelector": "body",
      "dataRequestUrlPattern": "transactions",
      "filters": [
        {
          "name": "고유번호",
          "selector": "xpath=//*[normalize-space()='고유번호']/following::input[1]",
          "type": "textbox",
          "value": "QA4144",
          "queryParamCandidates": ["transactionInfo", "keyword", "uniqueNumber"]
        }
      ]
    },
    {
      "name": "정산관리 정산내역",
      "application": "admin",
      "path": "/settlement-history/settlement-details",
      "tenantParam": "tenantId",
      "roles": ["ADMIN", "TA"],
      "searchButtonSelector": "button:has-text('검색')",
      "recordsSelector": "body",
      "dataRequestUrlPattern": "/settlement",
      "filters": [
        {
          "name": "정산 시작일",
          "selector": "input[type='date']",
          "type": "textbox",
          "value": "2026-09-18",
          "queryParamCandidates": ["from", "startDate"]
        }
      ]
    }
  ]
}
