# Instructions

- Following Playwright test failed.
- Explain why, be concise, respect Playwright best practices.
- Provide a snippet of code with the fix, if possible.

# Test info

- Name: 4046/dev/tax-vat-report.spec.ts >> [4046][dev] 과세자료·부가세 신고자료 검색·집계·엑셀 검증 / [TA] role >> 과세자료·부가세 신고자료 / 직가맹은 법인-가맹점 순서, 영업라인 미등록은 빈 상태, 여러 영업라인은 가장 먼저 등록된 영업라인으로 표시되는지 확인
- Location: src/qa/scenarios/taxVatReportConsistency.ts:103:9

# Error details

```
Error: BLOCKED: 복수 영업라인의 첫 라인 표시 및 존재하는 직가맹은 확인했습니다. 다음 월 집계 자료가 없어 해당 표시를 검증하지 못했습니다: 직가맹, 영업라인 미등록
```

# Page snapshot

```yaml
- generic [ref=e2]:
  - generic [ref=e4]:
    - button "공지 배너 닫기" [ref=e5] [cursor=pointer]
    - generic [ref=e10] [cursor=pointer]: 패치노트 링크연결테스트
  - generic [ref=e12]:
    - generic:
      - generic:
        - generic:
          - generic:
            - generic:
              - generic:
                - generic:
                  - generic:
                    - generic:
                      - generic:
                        - generic:
                          - generic:
                            - generic:
                              - generic: 매출월
                              - generic:
                                - textbox: 2026-08
                                - generic:
                                  - img
                          - generic:
                            - generic:
                              - generic: 법인 부서코드
                              - generic:
                                - textbox
                                - group:
                                  - generic: 법인 부서코드
                          - generic:
                            - generic:
                              - generic: 법인명
                              - generic:
                                - textbox:
                                  - /placeholder: 법인명 포함 검색
                                - group:
                                  - generic: 법인명
                          - generic:
                            - generic:
                              - generic: 영업점 고유코드
                              - generic:
                                - textbox
                                - group:
                                  - generic: 영업점 고유코드
                          - generic:
                            - generic:
                              - generic: 영업점명
                              - generic:
                                - textbox:
                                  - /placeholder: 영업점명 포함 검색
                                - group:
                                  - generic: 영업점명
                          - generic:
                            - generic:
                              - generic: 가맹점 고유코드
                              - generic:
                                - textbox
                                - group:
                                  - generic: 가맹점 고유코드
                          - generic:
                            - generic:
                              - generic: 사업자 구분
                              - generic:
                                - combobox
                                - textbox
                                - img
                                - group:
                                  - generic: 사업자 구분
                      - generic:
                        - generic:
                          - generic:
                            - button:
                              - generic: 초기화
                            - button:
                              - generic: 검색
                        - button:
                          - generic: 상세검색
                          - img
                    - generic:
                      - generic:
                        - generic:
                          - generic:
                            - region:
                              - generic:
                                - generic:
                                  - generic:
                                    - generic:
                                      - button:
                                        - img
                                      - text: 매출월
                                    - generic:
                                      - generic: 2026-08
                                      - button:
                                        - img
                            - button:
                              - generic: 검색필터 (1)
                              - img
                - generic:
                  - generic:
                    - generic:
                      - generic:
                        - generic:
                          - generic:
                            - generic:
                              - text: "총 매출금액 :"
                              - generic: 5,061,000 원
                        - generic:
                          - generic:
                            - generic:
                              - text: "공급가액 :"
                              - generic: 445,501 원
                        - generic:
                          - generic:
                            - generic:
                              - text: "VAT :"
                              - generic: 44,549 원
                        - generic:
                          - generic:
                            - generic:
                              - text: "수수료 합계 :"
                              - generic: 490,050 원
                    - generic:
                      - generic:
                        - generic:
                          - generic:
                            - generic:
                              - button:
                                - img
                                - generic: 테이블 프리셋 설정
                            - button [disabled]:
                              - generic:
                                - generic: 프리셋
                                - generic: "1"
                            - button:
                              - generic:
                                - generic: 프리셋
                                - generic: "2"
                            - button:
                              - generic:
                                - generic: 프리셋
                                - generic: "3"
                        - generic:
                          - generic:
                            - generic:
                              - button:
                                - generic:
                                  - generic:
                                    - img
                                  - generic: 엑셀
                                - img
                              - generic:
                                - list:
                                  - listitem: 엑셀 다운로드
                      - generic:
                        - generic:
                          - generic:
                            - grid:
                              - row:
                                - columnheader:
                                  - generic:
                                    - generic: "#"
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 법인고유코드
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 법인
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 가맹점 고유코드
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 가맹점명
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 영업라인
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 사업자 유형
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 사업자번호 / 주민등록번호
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 대표자명
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 업태
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 종목
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 이메일
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 주소
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 총 매출금액
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 수수료 공급가액
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 수수료 세액(VAT)
                                  - generic:
                                    - img
                                - columnheader:
                                  - generic:
                                    - generic: 수수료 합계
                                  - generic:
                                    - img
                              - rowgroup:
                                - row:
                                  - gridcell: "2"
                                  - gridcell: BP100006
                                  - gridcell: 박재민_법인
                                  - gridcell: BP100008
                                  - gridcell: 박재민_가맹
                                  - gridcell:
                                    - generic:
                                      - generic:
                                        - generic:
                                          - generic: BP100006
                                          - generic: 박재민_법인
                                      - generic:
                                        - generic:
                                          - generic: BP100007
                                          - generic: 박재민_영업
                                      - generic:
                                        - generic:
                                          - generic: BP100051
                                          - generic: 박재민_영업3
                                      - generic:
                                        - generic:
                                          - generic: BP100050
                                          - generic: 박재민_영업2
                                      - generic:
                                        - generic:
                                          - generic: BP100052
                                          - generic: 박재민_영업4
                                      - generic:
                                        - generic:
                                          - generic: BP100008
                                          - generic: 박재민_가맹
                                  - gridcell: 법인사업자
                                  - gridcell: 012-34-56785
                                  - gridcell: 박재민
                                  - gridcell: 피씨방
                                  - gridcell: 업태가뭐지
                                  - gridcell: "-"
                                  - gridcell: (46731) 부산 강서구 가락대로 312 부산역
                                  - gridcell: 5,061,000원
                                  - gridcell: 445,501원
                                  - gridcell: 44,549원
                                  - gridcell: 490,050원
                                - row:
                                  - gridcell: "1"
                                  - gridcell: BP100006
                                  - gridcell: 박재민_법인
                                  - gridcell: BP100060
                                  - gridcell: 박재민_가맹_한결데
                                  - gridcell:
                                    - generic:
                                      - generic:
                                        - generic:
                                          - generic: BP100006
                                          - generic: 박재민_법인
                                      - generic:
                                        - generic:
                                          - generic: BP100007
                                          - generic: 박재민_영업
                                      - generic:
                                        - generic:
                                          - generic: BP100060
                                          - generic: 박재민_가맹_한결데
                                  - gridcell: 설정 안 함
                                  - gridcell: 012-34-56785
                                  - gridcell: 박재민
                                  - gridcell: "-"
                                  - gridcell: "-"
                                  - gridcell: "-"
                                  - gridcell: "-"
                                  - gridcell: 0원
                                  - gridcell: 0원
                                  - gridcell: 0원
                                  - gridcell: 0원
                            - generic:
                              - generic: 총 2 / 2건
    - generic [ref=e14]:
      - generic [ref=e15]:
        - generic [ref=e16]:
          - link "logo 빅스페이먼츠" [ref=e18] [cursor=pointer]:
            - /url: /
            - img "logo" [ref=e19]
            - generic [ref=e20]: 빅스페이먼츠
          - button "사이드바 접기" [ref=e21] [cursor=pointer]:
            - img [ref=e24]
            - generic:
              - img "메뉴 열기"
        - generic [ref=e27]:
          - navigation "열린 페이지 탭" [ref=e28]:
            - generic [ref=e29]:
              - generic "홈" [ref=e30]:
                - generic [ref=e32] [cursor=pointer]:
                  - img [ref=e33]
                  - generic [ref=e36]: 홈
              - button "부가세 신고자료" [disabled] [ref=e38] [cursor=pointer]:
                - generic [ref=e39]:
                  - img
                  - generic [ref=e41]:
                    - generic [ref=e43]: 부가세 신고자료
                    - generic "부가세 신고자료 고정 탭" [ref=e44]:
                      - img [ref=e45]
              - button "새 탭 열기" [ref=e49] [cursor=pointer]:
                - img [ref=e50]
            - status [ref=e51]
          - generic [ref=e52]:
            - button "다운로드 이력" [ref=e53] [cursor=pointer]:
              - img [ref=e54]
            - generic [ref=e58]:
              - img [ref=e59]
              - generic [ref=e62]: 167:55:51
              - button "연장" [ref=e63] [cursor=pointer]
            - button "secret-redacted" [ref=e64] [cursor=pointer]:
              - generic [ref=e66]: secret-redacted
      - generic [ref=e67]:
        - generic [ref=e72]:
          - generic [ref=e78]:
            - button "범례 범례 설명" [ref=e79] [cursor=pointer]:
              - generic [ref=e80]:
                - generic [ref=e81]: 범례
                - generic "범례 설명" [ref=e82]:
                  - img [ref=e83]
              - img [ref=e86]
            - generic [ref=e88]:
              - generic [ref=e91]: 법인
              - generic [ref=e94]: 영업점
          - list [ref=e96]:
            - listitem [ref=e97]:
              - link "홈" [ref=e100] [cursor=pointer]:
                - /url: /?tenantId=redacted
                - generic [ref=e101]:
                  - img [ref=e103]
                  - generic [ref=e106]: 홈
            - listitem [ref=e107]:
              - generic [ref=e109]:
                - generic [ref=e110] [cursor=pointer]:
                  - generic [ref=e111]:
                    - img [ref=e113]
                    - generic [ref=e115]: 거래내역(크로스페이)
                  - button [ref=e116]
                - list:
                  - generic [ref=e118]:
                    - button "결제내역 새 탭으로 열기" [ref=e119] [cursor=pointer]:
                      - img [ref=e120]
                    - link "결제내역" [ref=e123] [cursor=pointer]:
                      - /url: /crosspay/transactions?tenantId=redacted
                  - generic [ref=e124]:
                    - button "보류내역 새 탭으로 열기" [ref=e125] [cursor=pointer]:
                      - img [ref=e126]
                    - link "보류내역" [ref=e129] [cursor=pointer]:
                      - /url: /crosspay/hold?tenantId=redacted
                  - generic [ref=e130]:
                    - button "차감내역 새 탭으로 열기" [ref=e131] [cursor=pointer]:
                      - img [ref=e132]
                    - link "차감내역" [ref=e135] [cursor=pointer]:
                      - /url: /crosspay/deduction?tenantId=redacted
                  - generic [ref=e136]:
                    - button "단말기미등록 결제내역 새 탭으로 열기" [ref=e137] [cursor=pointer]:
                      - img [ref=e138]
                    - link "단말기미등록 결제내역" [ref=e141] [cursor=pointer]:
                      - /url: /crosspay/unregistered-mid?tenantId=redacted
                  - generic [ref=e142]:
                    - button "가맹점 정산차감 내역 새 탭으로 열기" [ref=e143] [cursor=pointer]:
                      - img [ref=e144]
                    - link "가맹점 정산차감 내역" [ref=e147] [cursor=pointer]:
                      - /url: /crosspay/negative-settlement?tenantId=redacted
            - listitem [ref=e148]:
              - generic [ref=e150]:
                - generic [ref=e151] [cursor=pointer]:
                  - generic [ref=e152]:
                    - img [ref=e154]
                    - generic [ref=e156]: 거래관리
                  - button [ref=e157]
                - list [ref=e159]:
                  - generic [ref=e160]:
                    - button "거래내역 새 탭으로 열기" [ref=e161] [cursor=pointer]:
                      - img [ref=e162]
                    - link "거래내역" [ref=e165] [cursor=pointer]:
                      - /url: /trade-history-v2?tenantId=redacted
                  - generic [ref=e166]:
                    - button "상계처리내역 새 탭으로 열기" [ref=e167] [cursor=pointer]:
                      - img [ref=e168]
                    - link "상계처리내역" [ref=e171] [cursor=pointer]:
                      - /url: /offset-management?tenantId=redacted
                  - generic [ref=e172]:
                    - button "수기결제내역 새 탭으로 열기" [ref=e173] [cursor=pointer]:
                      - img [ref=e174]
                    - link "수기결제내역" [ref=e177] [cursor=pointer]:
                      - /url: /log-management/manual-log?tenantId=redacted
                  - generic [ref=e178]:
                    - button "거래로그 새 탭으로 열기" [ref=e179] [cursor=pointer]:
                      - img [ref=e180]
                    - link "거래로그" [ref=e183] [cursor=pointer]:
                      - /url: /payment-history?tenantId=redacted
                  - generic [ref=e184]:
                    - button "PG거래대사 새 탭으로 열기" [ref=e185] [cursor=pointer]:
                      - img [ref=e186]
                    - link "PG거래대사" [ref=e189] [cursor=pointer]:
                      - /url: /master-accounting/pg-reconciliation?tenantId=redacted
                  - generic [ref=e190]:
                    - button "링크발송내역 새 탭으로 열기" [ref=e191] [cursor=pointer]:
                      - img [ref=e192]
                    - link "링크발송내역" [ref=e195] [cursor=pointer]:
                      - /url: /link-payment?tenantId=redacted
                  - generic [ref=e196]:
                    - button "과세자료 새 탭으로 열기" [ref=e197] [cursor=pointer]:
                      - img [ref=e198]
                    - link "과세자료" [ref=e201] [cursor=pointer]:
                      - /url: /tax-reports/taxable-materials?tenantId=redacted
                  - generic [ref=e202]:
                    - button "부가세 신고자료 새 탭으로 열기" [ref=e203] [cursor=pointer]:
                      - img [ref=e204]
                    - generic [ref=e207]: 부가세 신고자료
            - listitem [ref=e208]:
              - generic [ref=e210]:
                - generic [ref=e211] [cursor=pointer]:
                  - generic [ref=e212]:
                    - img [ref=e214]
                    - generic [ref=e217]: 계좌관리
                  - button [ref=e218]
                - list:
                  - generic [ref=e220]:
                    - button "펌뱅킹 등록 새 탭으로 열기" [ref=e221] [cursor=pointer]:
                      - img [ref=e222]
                    - link "펌뱅킹 등록" [ref=e225] [cursor=pointer]:
                      - /url: /account/account-inquiry?tenantId=redacted
                  - generic [ref=e226]:
                    - button "운영계좌 관리 새 탭으로 열기" [ref=e227] [cursor=pointer]:
                      - img [ref=e228]
                    - link "운영계좌 관리" [ref=e231] [cursor=pointer]:
                      - /url: /master-accounting/disbursement-accounts?tenantId=redacted
                  - generic [ref=e232]:
                    - button "운영계좌 입출금 내역 새 탭으로 열기" [ref=e233] [cursor=pointer]:
                      - img [ref=e234]
                    - link "운영계좌 입출금 내역" [ref=e237] [cursor=pointer]:
                      - /url: /master-accounting/disbursement-accounts-inout-history?tenantId=redacted
                  - generic [ref=e238]:
                    - button "법인계좌관리 새 탭으로 열기" [ref=e239] [cursor=pointer]:
                      - img [ref=e240]
                    - link "법인계좌관리" [ref=e243] [cursor=pointer]:
                      - /url: /master-accounting/corporation-accounts?tenantId=redacted
                  - generic [ref=e244]:
                    - button "법인계좌 입출금 내역 새 탭으로 열기" [ref=e245] [cursor=pointer]:
                      - img [ref=e246]
                    - link "법인계좌 입출금 내역" [ref=e249] [cursor=pointer]:
                      - /url: /master-accounting/corporation-accounts-inout-history?tenantId=redacted
                  - generic [ref=e250]:
                    - button "입금확인 새 탭으로 열기" [ref=e251] [cursor=pointer]:
                      - img [ref=e252]
                    - link "입금확인" [ref=e255] [cursor=pointer]:
                      - /url: /account/deposit-confirmation?tenantId=redacted
                  - generic [ref=e256]:
                    - button "이체내역 새 탭으로 열기" [ref=e257] [cursor=pointer]:
                      - img [ref=e258]
                    - link "이체내역" [ref=e261] [cursor=pointer]:
                      - /url: /account/transfer-details?tenantId=redacted
                  - generic [ref=e262]:
                    - button "이체하기 새 탭으로 열기" [ref=e263] [cursor=pointer]:
                      - img [ref=e264]
                    - link "이체하기" [ref=e267] [cursor=pointer]:
                      - /url: /account/remittance-manage?tenantId=redacted
                  - generic [ref=e268]:
                    - button "이체하기(렌탈페이) 새 탭으로 열기" [ref=e269] [cursor=pointer]:
                      - img [ref=e270]
                    - link "이체하기(렌탈페이)" [ref=e273] [cursor=pointer]:
                      - /url: /account/remittance-manage-rentalpay?tenantId=redacted
                  - generic [ref=e274]:
                    - button "펌뱅크 잔고 알림 새 탭으로 열기" [ref=e275] [cursor=pointer]:
                      - img [ref=e276]
                    - link "펌뱅크 잔고 알림" [ref=e279] [cursor=pointer]:
                      - /url: /account/firm-bank-balance-notification?tenantId=redacted
            - listitem [ref=e280]:
              - generic [ref=e282]:
                - generic [ref=e283] [cursor=pointer]:
                  - generic [ref=e284]:
                    - img [ref=e286]
                    - generic [ref=e289]: 지갑관리
                  - button [ref=e290]
                - list:
                  - generic [ref=e292]:
                    - button "지갑관리 새 탭으로 열기" [ref=e293] [cursor=pointer]:
                      - img [ref=e294]
                    - link "지갑관리" [ref=e297] [cursor=pointer]:
                      - /url: /master-accounting/wallet-management?tenantId=redacted
                  - generic [ref=e298]:
                    - button "지갑입출금내역 새 탭으로 열기" [ref=e299] [cursor=pointer]:
                      - img [ref=e300]
                    - link "지갑입출금내역" [ref=e303] [cursor=pointer]:
                      - /url: /master-accounting/wallet-inout-history?tenantId=redacted
            - listitem [ref=e304]:
              - generic [ref=e306]:
                - generic [ref=e307] [cursor=pointer]:
                  - generic [ref=e308]:
                    - img [ref=e310]
                    - generic [ref=e313]: 정산관리
                  - button [ref=e314]
                - list:
                  - generic [ref=e316]:
                    - button "PG정산내역 새 탭으로 열기" [ref=e317] [cursor=pointer]:
                      - img [ref=e318]
                    - link "PG정산내역" [ref=e321] [cursor=pointer]:
                      - /url: /settlement-history/pg-settlement-details?tenantId=redacted
                  - generic [ref=e322]:
                    - button "정산내역 새 탭으로 열기" [ref=e323] [cursor=pointer]:
                      - img [ref=e324]
                    - link "정산내역" [ref=e327] [cursor=pointer]:
                      - /url: /settlement-history/settlement-details?tenantId=redacted
                  - generic [ref=e328]:
                    - button "통신비관리 새 탭으로 열기" [ref=e329] [cursor=pointer]:
                      - img [ref=e330]
                    - link "통신비관리" [ref=e333] [cursor=pointer]:
                      - /url: /settlement-history/communication-settlement?tenantId=redacted
                  - generic [ref=e334]:
                    - button "채권관리 새 탭으로 열기" [ref=e335] [cursor=pointer]:
                      - img [ref=e336]
                    - link "채권관리" [ref=e339] [cursor=pointer]:
                      - /url: /bond-management?tenantId=redacted
                  - generic [ref=e340]:
                    - button "수납관리 새 탭으로 열기" [ref=e341] [cursor=pointer]:
                      - img [ref=e342]
                    - link "수납관리" [ref=e345] [cursor=pointer]:
                      - /url: /master-accounting/installment-manage?tenantId=redacted
                  - generic [ref=e346]:
                    - button "지갑 입출금 내역 새 탭으로 열기" [ref=e347] [cursor=pointer]:
                      - img [ref=e348]
                    - link "지갑 입출금 내역" [ref=e351] [cursor=pointer]:
                      - /url: /wallet-history?tenantId=redacted
                  - generic [ref=e352]:
                    - button "선정산 한도 조회 새 탭으로 열기" [ref=e353] [cursor=pointer]:
                      - img [ref=e354]
                    - link "선정산 한도 조회" [ref=e357] [cursor=pointer]:
                      - /url: /tenant-early-settlement-limit-inquiry?tenantId=redacted
                  - generic [ref=e358]:
                    - button "채권관리 V2 새 탭으로 열기" [ref=e359] [cursor=pointer]:
                      - img [ref=e360]
                    - link "채권관리 V2" [ref=e363] [cursor=pointer]:
                      - /url: /bond-management-v2?tenantId=redacted
            - listitem [ref=e364]:
              - generic [ref=e366]:
                - generic [ref=e367] [cursor=pointer]:
                  - generic [ref=e368]:
                    - img [ref=e370]
                    - generic [ref=e373]: 매출집계
                  - button [ref=e374]
                - list:
                  - generic [ref=e376]:
                    - button "매출집계 새 탭으로 열기" [ref=e377] [cursor=pointer]:
                      - img [ref=e378]
                    - link "매출집계" [ref=e381] [cursor=pointer]:
                      - /url: /admin/sales-history
                  - generic [ref=e382]:
                    - button "영업점매출집계 새 탭으로 열기" [ref=e383] [cursor=pointer]:
                      - img [ref=e384]
                    - link "영업점매출집계" [ref=e387] [cursor=pointer]:
                      - /url: /branch-profit-aggregate?tenantId=redacted
            - listitem [ref=e388]:
              - generic [ref=e390]:
                - generic [ref=e391] [cursor=pointer]:
                  - generic [ref=e392]:
                    - img [ref=e394]
                    - generic [ref=e396]: 업체관리
                  - button [ref=e397]
                - list:
                  - generic [ref=e399]:
                    - generic [ref=e401] [cursor=pointer]: 총판관리
                    - list:
                      - listitem [ref=e404]:
                        - button "총판관리 새 탭으로 열기" [ref=e405] [cursor=pointer]:
                          - img [ref=e406]
                        - link "총판관리" [ref=e409] [cursor=pointer]:
                          - /url: /business/corporation?tenantId=redacted
                      - listitem [ref=e410]:
                        - button "계약관리 새 탭으로 열기" [ref=e411] [cursor=pointer]:
                          - img [ref=e412]
                        - link "계약관리" [ref=e415] [cursor=pointer]:
                          - /url: /business/pg-contract-manage?tenantId=redacted
                      - listitem [ref=e416]:
                        - button "부서별 운영상태관리 새 탭으로 열기" [ref=e417] [cursor=pointer]:
                          - img [ref=e418]
                        - link "부서별 운영상태관리" [ref=e421] [cursor=pointer]:
                          - /url: /saleline-status-control?tenantId=redacted
                  - generic [ref=e422]:
                    - generic [ref=e424] [cursor=pointer]: 영업점관리
                    - list:
                      - listitem [ref=e427]:
                        - button "영업점관리 새 탭으로 열기" [ref=e428] [cursor=pointer]:
                          - img [ref=e429]
                        - link "영업점관리" [ref=e432] [cursor=pointer]:
                          - /url: /business/branch?tenantId=redacted
                      - listitem [ref=e433]:
                        - button "영업라인조회 새 탭으로 열기" [ref=e434] [cursor=pointer]:
                          - img [ref=e435]
                        - link "영업라인조회" [ref=e438] [cursor=pointer]:
                          - /url: /business/salesline-management?tenantId=redacted
                      - listitem [ref=e439]:
                        - button "영업라인일괄적용 새 탭으로 열기" [ref=e440] [cursor=pointer]:
                          - img [ref=e441]
                        - link "영업라인일괄적용" [ref=e444] [cursor=pointer]:
                          - /url: /business/salesline-preset?tenantId=redacted
                  - generic [ref=e445]:
                    - generic [ref=e447] [cursor=pointer]: 가맹점관리
                    - list:
                      - listitem [ref=e450]:
                        - button "가맹점관리 새 탭으로 열기" [ref=e451] [cursor=pointer]:
                          - img [ref=e452]
                        - link "가맹점관리" [ref=e455] [cursor=pointer]:
                          - /url: /business/vendor-manage?tenantId=redacted
                      - listitem [ref=e456]:
                        - button "TID/MID관리 새 탭으로 열기" [ref=e457] [cursor=pointer]:
                          - img [ref=e458]
                        - link "TID/MID관리" [ref=e461] [cursor=pointer]:
                          - /url: /business/pg-mid-manage?tenantId=redacted
                  - generic [ref=e462]:
                    - generic [ref=e464] [cursor=pointer]: 사용자관리
                    - list:
                      - listitem [ref=e467]:
                        - button "사용자프리셋 새 탭으로 열기" [ref=e468] [cursor=pointer]:
                          - img [ref=e469]
                        - link "사용자프리셋" [ref=e472] [cursor=pointer]:
                          - /url: /business/member-preset?tenantId=redacted
                      - listitem [ref=e473]:
                        - button "역할별 사용가능 권한 관리 새 탭으로 열기" [ref=e474] [cursor=pointer]:
                          - img [ref=e475]
                        - link "역할별 사용가능 권한 관리" [ref=e478] [cursor=pointer]:
                          - /url: /business/permission-available?tenantId=redacted
                      - listitem [ref=e479]:
                        - button "사용자 새 탭으로 열기" [ref=e480] [cursor=pointer]:
                          - img [ref=e481]
                        - link "사용자" [ref=e484] [cursor=pointer]:
                          - /url: /business/member?tenantId=redacted
                  - generic [ref=e485]:
                    - button "사용자 보호 정책 새 탭으로 열기" [ref=e486] [cursor=pointer]:
                      - img [ref=e487]
                    - link "사용자 보호 정책" [ref=e490] [cursor=pointer]:
                      - /url: /business/user-protection?tenantId=redacted
                  - generic [ref=e491]:
                    - button "부서 설정 관리 새 탭으로 열기" [ref=e492] [cursor=pointer]:
                      - img [ref=e493]
                    - link "부서 설정 관리" [ref=e496] [cursor=pointer]:
                      - /url: /admin/ta-department-setting
            - listitem [ref=e497]:
              - generic [ref=e499]:
                - generic [ref=e500] [cursor=pointer]:
                  - generic [ref=e501]:
                    - img [ref=e503]
                    - generic [ref=e505]: 선정산
                  - button [ref=e506]
                - list:
                  - generic [ref=e508]:
                    - button "테넌트한도관리 새 탭으로 열기" [ref=e509] [cursor=pointer]:
                      - img [ref=e510]
                    - link "테넌트한도관리" [ref=e513] [cursor=pointer]:
                      - /url: /admin/tenant-early-settlement-config/limit-manage
                  - generic [ref=e514]:
                    - button "선정산 한도관리 새 탭으로 열기" [ref=e515] [cursor=pointer]:
                      - img [ref=e516]
                    - link "선정산 한도관리" [ref=e519] [cursor=pointer]:
                      - /url: /master-accounting/early-settlement-limit?tenantId=redacted
            - listitem [ref=e520]:
              - generic [ref=e522]:
                - generic [ref=e523] [cursor=pointer]:
                  - generic [ref=e524]:
                    - img [ref=e526]
                    - generic [ref=e528]: 비스킷 카드관리
                  - button [ref=e529]
                - list:
                  - generic [ref=e531]:
                    - button "카드관리 새 탭으로 열기" [ref=e532] [cursor=pointer]:
                      - img [ref=e533]
                    - link "카드관리" [ref=e536] [cursor=pointer]:
                      - /url: /admin/biscuit-card/card-manage
                  - generic [ref=e537]:
                    - button "사용내역 새 탭으로 열기" [ref=e538] [cursor=pointer]:
                      - img [ref=e539]
                    - link "사용내역" [ref=e542] [cursor=pointer]:
                      - /url: /admin/biscuit-card/usage-history
                  - generic [ref=e543]:
                    - button "연결계좌관리 새 탭으로 열기" [ref=e544] [cursor=pointer]:
                      - img [ref=e545]
                    - link "연결계좌관리" [ref=e548] [cursor=pointer]:
                      - /url: /admin/biscuit-card/linked-account-setting
                  - generic [ref=e549]:
                    - button "카드통계 새 탭으로 열기" [ref=e550] [cursor=pointer]:
                      - img [ref=e551]
                    - link "카드통계" [ref=e554] [cursor=pointer]:
                      - /url: /admin/statistics/biscuit-card-corporation
                  - generic [ref=e555]:
                    - button "비스킷카드신청관리 새 탭으로 열기" [ref=e556] [cursor=pointer]:
                      - img [ref=e557]
                    - link "비스킷카드신청관리" [ref=e560] [cursor=pointer]:
                      - /url: /admin/biscuit-card/application-manage
                  - generic [ref=e561]:
                    - button "법인별 수수료 관리 새 탭으로 열기" [ref=e562] [cursor=pointer]:
                      - img [ref=e563]
                    - link "법인별 수수료 관리" [ref=e566] [cursor=pointer]:
                      - /url: /admin/biscuit-card/corporation-commission
            - listitem [ref=e567]:
              - generic [ref=e569]:
                - generic [ref=e570] [cursor=pointer]:
                  - generic [ref=e571]:
                    - img [ref=e573]
                    - generic [ref=e575]: 고객센터
                  - button [ref=e576]
                - list:
                  - generic [ref=e578]:
                    - button "고객센터 새 탭으로 열기" [ref=e579] [cursor=pointer]:
                      - img [ref=e580]
                    - link "고객센터" [ref=e583] [cursor=pointer]:
                      - /url: /inquiry?tenantId=redacted
                  - generic [ref=e584]:
                    - button "문서보관함 새 탭으로 열기" [ref=e585] [cursor=pointer]:
                      - img [ref=e586]
                    - link "문서보관함" [ref=e589] [cursor=pointer]:
                      - /url: /document?tenantId=redacted
                  - generic [ref=e590]:
                    - button "패치노트 새 탭으로 열기" [ref=e591] [cursor=pointer]:
                      - img [ref=e592]
                    - link "패치노트" [ref=e595] [cursor=pointer]:
                      - /url: /patch-note?tenantId=redacted
            - listitem [ref=e596]:
              - generic [ref=e598]:
                - generic [ref=e599] [cursor=pointer]:
                  - generic [ref=e600]:
                    - img [ref=e602]
                    - generic [ref=e605]: 레드마인티켓
                  - button [ref=e606]
                - list:
                  - generic [ref=e608]:
                    - button "레드마인티켓 새 탭으로 열기" [ref=e609] [cursor=pointer]:
                      - img [ref=e610]
                    - link "레드마인티켓" [ref=e613] [cursor=pointer]:
                      - /url: /redmine?tenantId=redacted
            - listitem [ref=e614]:
              - generic [ref=e616]:
                - generic [ref=e617] [cursor=pointer]:
                  - generic [ref=e618]:
                    - img [ref=e620]
                    - generic [ref=e622]: 리스크 관리
                  - button [ref=e623]
                - list:
                  - generic [ref=e625]:
                    - button "블랙리스트 관리 새 탭으로 열기" [ref=e626] [cursor=pointer]:
                      - img [ref=e627]
                    - link "블랙리스트 관리" [ref=e630] [cursor=pointer]:
                      - /url: /admin/blacklist-manage
                  - generic [ref=e631]:
                    - button "차단계좌 이체시도 내역 새 탭으로 열기" [ref=e632] [cursor=pointer]:
                      - img [ref=e633]
                    - link "차단계좌 이체시도 내역" [ref=e636] [cursor=pointer]:
                      - /url: /admin/blacklist-transfer-history
                  - generic [ref=e637]:
                    - button "IP 차단관리 새 탭으로 열기" [ref=e638] [cursor=pointer]:
                      - img [ref=e639]
                    - link "IP 차단관리" [ref=e642] [cursor=pointer]:
                      - /url: /admin/ip-block-manage
                  - generic [ref=e643]:
                    - button "RM 사업자조회 새 탭으로 열기" [ref=e644] [cursor=pointer]:
                      - img [ref=e645]
                    - link "RM 사업자조회" [ref=e648] [cursor=pointer]:
                      - /url: /risk-management/rm-business?tenantId=redacted
                  - generic [ref=e649]:
                    - button "텔레그램 채팅방관리 새 탭으로 열기" [ref=e650] [cursor=pointer]:
                      - img [ref=e651]
                    - link "텔레그램 채팅방관리" [ref=e654] [cursor=pointer]:
                      - /url: /business/telegram-chat-room-manage?tenantId=redacted
                  - generic [ref=e655]:
                    - button "텔레그램 발송내역 새 탭으로 열기" [ref=e656] [cursor=pointer]:
                      - img [ref=e657]
                    - link "텔레그램 발송내역" [ref=e660] [cursor=pointer]:
                      - /url: /business/telegram-history?tenantId=redacted
                  - generic [ref=e661]:
                    - button "텔레그램 챗봇 관리 새 탭으로 열기" [ref=e662] [cursor=pointer]:
                      - img [ref=e663]
                    - link "텔레그램 챗봇 관리" [ref=e666] [cursor=pointer]:
                      - /url: /admin/telegram-chatbot-manage
                  - generic [ref=e667]:
                    - button "리스크 거래내역 새 탭으로 열기" [ref=e668] [cursor=pointer]:
                      - img [ref=e669]
                    - link "리스크 거래내역" [ref=e672] [cursor=pointer]:
                      - /url: /risk-management/risk-transaction?tenantId=redacted
        - generic [ref=e675]:
          - generic [ref=e677]:
            - generic [ref=e678]:
              - generic [ref=e679]:
                - generic [ref=e680]:
                  - generic [ref=e682]:
                    - generic: 매출월
                    - generic [ref=e683]:
                      - textbox [ref=e684] [cursor=pointer]: 2026-08
                      - img "calendar" [ref=e686] [cursor=pointer]
                  - generic [ref=e688]:
                    - generic: 법인 부서코드
                    - generic [ref=e689]:
                      - textbox "법인 부서코드" [ref=e690]
                      - group:
                        - generic: 법인 부서코드
                  - generic [ref=e692]:
                    - generic: 법인명
                    - generic [ref=e693]:
                      - textbox "법인명" [ref=e694]:
                        - /placeholder: 법인명 포함 검색
                      - group:
                        - generic: 법인명
                  - generic [ref=e696]:
                    - generic: 영업점 고유코드
                    - generic [ref=e697]:
                      - textbox "영업점 고유코드" [ref=e698]
                      - group:
                        - generic: 영업점 고유코드
                  - generic [ref=e700]:
                    - generic: 영업점명
                    - generic [ref=e701]:
                      - textbox "영업점명" [ref=e702]:
                        - /placeholder: 영업점명 포함 검색
                      - group:
                        - generic: 영업점명
                - region [ref=e705]:
                  - generic [ref=e707]:
                    - generic [ref=e709]:
                      - generic: 가맹점 고유코드
                      - generic [ref=e710]:
                        - textbox "가맹점 고유코드" [ref=e711]
                        - group:
                          - generic: 가맹점 고유코드
                    - generic [ref=e713]:
                      - generic: 가맹점명
                      - generic [ref=e714]:
                        - textbox "가맹점명" [ref=e715]:
                          - /placeholder: 가맹점명 포함 검색
                        - group:
                          - generic: 가맹점명
                    - generic [ref=e717]:
                      - generic: 사업자번호 / 주민등록번호
                      - generic [ref=e718]:
                        - textbox "사업자번호 / 주민등록번호" [ref=e719]:
                          - /placeholder: 하이픈 포함 입력 가능
                        - group:
                          - generic: 사업자번호 / 주민등록번호
                    - generic [ref=e721] [cursor=pointer]:
                      - generic: 사업자 구분
                      - generic [ref=e722]:
                        - combobox "사업자 구분" [ref=e723]
                        - textbox
                        - img
                        - group:
                          - generic: 사업자 구분
              - generic [ref=e724]:
                - generic [ref=e726]:
                  - button "초기화" [ref=e727] [cursor=pointer]:
                    - generic [ref=e728]: 초기화
                  - button "검색" [active] [ref=e729] [cursor=pointer]:
                    - generic [ref=e730]: 검색
                - button "접기" [ref=e731] [cursor=pointer]:
                  - generic [ref=e732]: 접기
                  - img [ref=e733]
            - generic [ref=e738]:
              - region [ref=e739]:
                - generic [ref=e742]:
                  - generic [ref=e743]:
                    - button [ref=e744] [cursor=pointer]:
                      - img [ref=e745]
                    - text: 매출월
                  - generic [ref=e748]:
                    - generic [ref=e749]: 2026-08
                    - button [ref=e750] [cursor=pointer]:
                      - img [ref=e751]
              - button "검색필터 (1)" [ref=e754] [cursor=pointer]:
                - generic [ref=e755]: 검색필터 (1)
                - img [ref=e756]
          - generic [ref=e759]:
            - generic [ref=e761]:
              - generic [ref=e764]:
                - text: "총 매출금액 :"
                - generic [ref=e765]: 5,061,000 원
              - generic [ref=e768]:
                - text: "공급가액 :"
                - generic [ref=e769]: 445,501 원
              - generic [ref=e772]:
                - text: "VAT :"
                - generic [ref=e773]: 44,549 원
              - generic [ref=e776]:
                - text: "수수료 합계 :"
                - generic [ref=e777]: 490,050 원
            - generic [ref=e778]:
              - generic [ref=e779]:
                - generic [ref=e781]:
                  - button "테이블 프리셋 설정" [ref=e783] [cursor=pointer]:
                    - img [ref=e784]
                    - generic [ref=e787]: 테이블 프리셋 설정
                  - button "프리셋 1" [disabled] [ref=e788]:
                    - generic [ref=e789]:
                      - generic [ref=e790]: 프리셋
                      - generic [ref=e791]: "1"
                  - button "프리셋 2" [ref=e792] [cursor=pointer]:
                    - generic [ref=e793]:
                      - generic [ref=e794]: 프리셋
                      - generic [ref=e795]: "2"
                  - button "프리셋 3" [ref=e796] [cursor=pointer]:
                    - generic [ref=e797]:
                      - generic [ref=e798]: 프리셋
                      - generic [ref=e799]: "3"
                - generic [ref=e802]:
                  - button "엑셀" [ref=e803] [cursor=pointer]:
                    - generic [ref=e804]:
                      - img [ref=e806]
                      - generic [ref=e813]: 엑셀
                    - img [ref=e814]
                  - generic:
                    - list:
                      - listitem: 엑셀 다운로드
              - generic [ref=e819]:
                - grid [ref=e820]:
                  - row "# 법인고유코드 법인 가맹점 고유코드 가맹점명 영업라인 사업자 유형 사업자번호 / 주민등록번호 대표자명 업태 종목 이메일 주소 총 매출금액 수수료 공급가액 수수료 세액(VAT) 수수료 합계" [ref=e821]:
                    - columnheader "#" [ref=e822]:
                      - generic [ref=e824]: "#"
                      - generic [ref=e825]:
                        - img
                    - columnheader "법인고유코드" [ref=e826] [cursor=pointer]:
                      - generic [ref=e828]: 법인고유코드
                      - generic [ref=e829]:
                        - img
                    - columnheader "법인" [ref=e830] [cursor=pointer]:
                      - generic [ref=e832]: 법인
                      - generic [ref=e833]:
                        - img
                    - columnheader "가맹점 고유코드" [ref=e834] [cursor=pointer]:
                      - generic [ref=e836]: 가맹점 고유코드
                      - generic [ref=e837]:
                        - img
                    - columnheader "가맹점명" [ref=e838] [cursor=pointer]:
                      - generic [ref=e840]: 가맹점명
                      - generic [ref=e841]:
                        - img
                    - columnheader "영업라인" [ref=e842] [cursor=pointer]:
                      - generic [ref=e844]: 영업라인
                      - generic [ref=e845]:
                        - img
                    - columnheader "사업자 유형" [ref=e846] [cursor=pointer]:
                      - generic [ref=e848]: 사업자 유형
                      - generic [ref=e849]:
                        - img
                    - columnheader "사업자번호 / 주민등록번호" [ref=e850] [cursor=pointer]:
                      - generic [ref=e852]: 사업자번호 / 주민등록번호
                      - generic [ref=e853]:
                        - img
                    - columnheader "대표자명" [ref=e854] [cursor=pointer]:
                      - generic [ref=e856]: 대표자명
                      - generic [ref=e857]:
                        - img
                    - columnheader "업태" [ref=e858] [cursor=pointer]:
                      - generic [ref=e860]: 업태
                      - generic [ref=e861]:
                        - img
                    - columnheader "종목" [ref=e862] [cursor=pointer]:
                      - generic [ref=e864]: 종목
                      - generic [ref=e865]:
                        - img
                    - columnheader "이메일" [ref=e866] [cursor=pointer]:
                      - generic [ref=e868]: 이메일
                      - generic [ref=e869]:
                        - img
                    - columnheader "주소" [ref=e870] [cursor=pointer]:
                      - generic [ref=e872]: 주소
                      - generic [ref=e873]:
                        - img
                    - columnheader "총 매출금액" [ref=e874] [cursor=pointer]:
                      - generic [ref=e876]: 총 매출금액
                      - generic [ref=e877]:
                        - img
                    - columnheader "수수료 공급가액" [ref=e878] [cursor=pointer]:
                      - generic [ref=e880]: 수수료 공급가액
                      - generic [ref=e881]:
                        - img
                    - columnheader "수수료 세액(VAT)" [ref=e882] [cursor=pointer]:
                      - generic [ref=e884]: 수수료 세액(VAT)
                      - generic [ref=e885]:
                        - img
                    - columnheader "수수료 합계" [ref=e886] [cursor=pointer]:
                      - generic [ref=e888]: 수수료 합계
                      - generic [ref=e889]:
                        - img
                  - rowgroup [ref=e890]:
                    - row "2 BP100006 박재민_법인 BP100008 박재민_가맹 BP100006 박재민_법인 BP100007 박재민_영업 BP100051 박재민_영업3 BP100050 박재민_영업2 BP100052 박재민_영업4 BP100008 박재민_가맹 법인사업자 012-34-56785 박재민 피씨방 업태가뭐지 - (46731) 부산 강서구 가락대로 312 부산역 5,061,000원 445,501원 44,549원 490,050원" [ref=e891] [cursor=pointer]:
                      - gridcell "2" [ref=e892]
                      - gridcell "BP100006" [ref=e893]
                      - gridcell "박재민_법인" [ref=e894]
                      - gridcell "BP100008" [ref=e895]
                      - gridcell "박재민_가맹" [ref=e896]
                      - gridcell "BP100006 박재민_법인 BP100007 박재민_영업 BP100051 박재민_영업3 BP100050 박재민_영업2 BP100052 박재민_영업4 BP100008 박재민_가맹" [ref=e897]:
                        - generic "박재민_법인,박재민_영업,박재민_영업3,박재민_영업2,박재민_영업4,박재민_가맹" [ref=e898]:
                          - generic "박재민_법인" [ref=e899]:
                            - generic [ref=e900]:
                              - generic [ref=e901]: BP100006
                              - generic [ref=e902]: 박재민_법인
                          - generic "박재민_영업" [ref=e903]:
                            - generic [ref=e904]:
                              - generic [ref=e905]: BP100007
                              - generic [ref=e906]: 박재민_영업
                          - generic "박재민_영업3" [ref=e907]:
                            - generic [ref=e908]:
                              - generic [ref=e909]: BP100051
                              - generic [ref=e910]: 박재민_영업3
                          - generic "박재민_영업2" [ref=e911]:
                            - generic [ref=e912]:
                              - generic [ref=e913]: BP100050
                              - generic [ref=e914]: 박재민_영업2
                          - generic "박재민_영업4" [ref=e915]:
                            - generic [ref=e916]:
                              - generic [ref=e917]: BP100052
                              - generic [ref=e918]: 박재민_영업4
                          - generic "박재민_가맹" [ref=e919]:
                            - generic [ref=e920]:
                              - generic [ref=e921]: BP100008
                              - generic [ref=e922]: 박재민_가맹
                      - gridcell "법인사업자" [ref=e923]
                      - gridcell "012-34-56785" [ref=e924]
                      - gridcell "박재민" [ref=e925]
                      - gridcell "피씨방" [ref=e926]
                      - gridcell "업태가뭐지" [ref=e927]
                      - gridcell "-" [ref=e928]
                      - gridcell "(46731) 부산 강서구 가락대로 312 부산역" [ref=e929]
                      - gridcell "5,061,000원" [ref=e930]
                      - gridcell "445,501원" [ref=e931]
                      - gridcell "44,549원" [ref=e932]
                      - gridcell "490,050원" [ref=e933]
                    - row "1 BP100006 박재민_법인 BP100060 박재민_가맹_한결데 BP100006 박재민_법인 BP100007 박재민_영업 BP100060 박재민_가맹_한결데 설정 안 함 012-34-56785 박재민 - - - - 0원 0원 0원 0원" [ref=e934] [cursor=pointer]:
                      - gridcell "1" [ref=e935]
                      - gridcell "BP100006" [ref=e936]
                      - gridcell "박재민_법인" [ref=e937]
                      - gridcell "BP100060" [ref=e938]
                      - gridcell "박재민_가맹_한결데" [ref=e939]
                      - gridcell "BP100006 박재민_법인 BP100007 박재민_영업 BP100060 박재민_가맹_한결데" [ref=e940]:
                        - generic "박재민_법인,박재민_영업,박재민_가맹_한결데" [ref=e941]:
                          - generic "박재민_법인" [ref=e942]:
                            - generic [ref=e943]:
                              - generic [ref=e944]: BP100006
                              - generic [ref=e945]: 박재민_법인
                          - generic "박재민_영업" [ref=e946]:
                            - generic [ref=e947]:
                              - generic [ref=e948]: BP100007
                              - generic [ref=e949]: 박재민_영업
                          - generic "박재민_가맹_한결데" [ref=e950]:
                            - generic [ref=e951]:
                              - generic [ref=e952]: BP100060
                              - generic [ref=e953]: 박재민_가맹_한결데
                      - gridcell "설정 안 함" [ref=e954]
                      - gridcell "012-34-56785" [ref=e955]
                      - gridcell "박재민" [ref=e956]
                      - gridcell "-" [ref=e957]
                      - gridcell "-" [ref=e958]
                      - gridcell "-" [ref=e959]
                      - gridcell "-" [ref=e960]
                      - gridcell "0원" [ref=e961]
                      - gridcell "0원" [ref=e962]
                      - gridcell "0원" [ref=e963]
                      - gridcell "0원" [ref=e964]
                - generic [ref=e969]: 총 2 / 2건
```

# Test source

```ts
  803 |       vatAmount: ["VAT", "수수료세액(VAT)", "수수료VAT"], totalCommissionAmount: ["수수료합계"]
  804 |     };
  805 |     for (const expected of data.items) {
  806 |       const row = rows.find((item) => item[codeIndex] === expected.departmentCode)!;
  807 |       const cell = (aliases: string[]) => {
  808 |         const index = headers.findIndex((header) => aliases.includes(header));
  809 |         expect(index, `엑셀 헤더 ${aliases.join(" / ")}`).toBeGreaterThan(-1);
  810 |         return row[index];
  811 |       };
  812 |       expect(row[nameIndex]).toBe(expected.vendorName);
  813 |       expect(compact(cell(["영업라인"])) ).toBe(compact(expected.salesLineName));
  814 |       expect(cell(["사업자유형"])).toBe(expected.businessRegistrationType.label);
  815 |       const registration = expected.businessRegistrationType.label === "비사업자" ? expected.residentRegistrationNumber : expected.businessRegistrationNumber;
  816 |       expect(cell(["사업자번호/주민등록번호"]) || "-").toBe(registration || "-");
  817 |       for (const key of NUMBERS[data.kind]) expect(amount(cell(numbers[key]))).toBeCloseTo(requiredNumber(expected[key]), 5);
  818 |     }
  819 |     this.log(`${LABELS[data.kind]}: 문서보관함에서 생성 문서 ID를 직접 찾아 다운로드 완료. Excel ${rows.length}행의 코드/명칭/영업라인/유형/등록번호/거래·수수료 금액 일치. 헤더: ${headers.join(" | ")}`);
  820 |   }
  821 |
  822 |   private async shot(label: string): Promise<void> {
  823 |     if (this.page.isClosed() || this.page.url() === "about:blank") return;
  824 |     const capture = async (name: string) => {
  825 |       await this.info.attach(`${String(++this.imageIndex).padStart(2, "0")}-${name}.png`, {
  826 |         body: await this.page.screenshot({ fullPage: false, animations: "disabled", mask: [
  827 |           this.page.getByRole("grid").last().locator('[data-field="contact"]:visible, [data-field="registrationNumber"]:visible'),
  828 |           this.page.locator('input[type="password"]:visible'),
  829 |           ...(this.runtime.username ? [this.page.getByText(this.runtime.username, { exact: true }).last()] : [])
  830 |         ] }), contentType: "image/png"
  831 |       });
  832 |     };
  833 |     await capture(label);
  834 |     if (await this.page.getByRole("dialog").count()) return;
  835 |     const scroller = this.page.getByRole("grid").last().locator(".MuiDataGrid-virtualScroller");
  836 |     if (!(await scroller.count())) return;
  837 |     const dimensions = await scroller.evaluate((element) => ({ left: element.scrollLeft, width: element.clientWidth, total: element.scrollWidth }));
  838 |     if (dimensions.total <= dimensions.width) return;
  839 |     try {
  840 |       await scroller.evaluate((element) => { element.scrollLeft = element.scrollWidth; });
  841 |       await this.page.waitForTimeout(100);
  842 |       await capture(`${label}-amount-columns`);
  843 |     } finally {
  844 |       await scroller.evaluate((element, left) => { element.scrollLeft = left; }, dimensions.left);
  845 |     }
  846 |   }
  847 |
  848 |   async finish(): Promise<void> {
  849 |     await this.shot("final-screen").catch(() => undefined);
  850 |     await this.info.attach("tax-vat-evidence.md", {
  851 |       body: this.notes.join("\n\n"), contentType: "text/markdown"
  852 |     });
  853 |   }
  854 | }
  855 |
  856 | async function payload<T>(response: Response | APIResponse): Promise<T> {
  857 |   expect(response.ok(), `조회 HTTP ${response.status()} ${new URL(response.url()).pathname}`).toBe(true);
  858 |   const body = await response.json() as { result?: { code: number; message: string }; payload?: T };
  859 |   expect(body.result?.code, `API 결과 ${body.result?.message ?? ""}`).toBe(200);
  860 |   expect(body.payload, "조회 payload").not.toBeNull();
  861 |   expect(body.payload, "조회 payload").not.toBeUndefined();
  862 |   return body.payload!;
  863 | }
  864 |
  865 | function amount(value: string): number {
  866 |   const result = Number(value?.replace(/[^\d.\-]/g, ""));
  867 |   expect(value, "금액/건수 표시 값").toBeTruthy();
  868 |   expect(Number.isFinite(result)).toBe(true);
  869 |   return result;
  870 | }
  871 |
  872 | function requiredNumber(value: number | undefined): number {
  873 |   expect(typeof value, "숫자 필드가 누락되면 안 됩니다.").toBe("number");
  874 |   expect(Number.isFinite(value)).toBe(true);
  875 |   return value!;
  876 | }
  877 |
  878 | function requireRow(data: Snapshot, code: string): ReportRow {
  879 |   const row = data.items.find((item) => item.departmentCode === code);
  880 |   if (!row) blocked(`${data.month} ${LABELS[data.kind]}에서 비교 대상 ${code}를 조회하지 못했습니다.`);
  881 |   return row;
  882 | }
  883 |
  884 | function matches(row: ReportRow, filters: Filters): boolean {
  885 |   return Object.entries(filters).every(([key, value]) => {
  886 |     if (key === "branchOfficeCode") return row.salesLineDepartments.some((d) => d.departmentType === "BO" && d.departmentCode.includes(value));
  887 |     if (key === "branchOfficeName") return row.salesLineDepartments.some((d) => d.departmentType === "BO" && d.departmentName.includes(value));
  888 |     if (key === "registrationNumber") return `${row.businessRegistrationNumber ?? ""}${row.residentRegistrationNumber ?? ""}`.replace(/-/g, "").includes(value.replace(/-/g, ""));
  889 |     if (key === "businessRegistrationType") return row.businessRegistrationType.value === value;
  890 |     if (key === "isReported") return String(row.isReported) === value;
  891 |     return String(row[key as keyof ReportRow] ?? "").includes(value);
  892 |   });
  893 | }
  894 |
  895 | function comparable(data: Snapshot): unknown {
  896 |   return { items: data.items, totalCount: data.totalCount, summary: data.summary };
  897 | }
  898 |
  899 | function compact(value: string): string { return value.replace(/\s/g, ""); }
  900 | function safeFilters(filters: Filters): string {
  901 |   return JSON.stringify({ ...filters, ...(filters.registrationNumber ? { registrationNumber: "[masked]" } : {}) });
  902 | }
> 903 | function blocked(message: string): never { throw new Error(`BLOCKED: ${message}`); }
      |                                                  ^ Error: BLOCKED: 복수 영업라인의 첫 라인 표시 및 존재하는 직가맹은 확인했습니다. 다음 월 집계 자료가 없어 해당 표시를 검증하지 못했습니다: 직가맹, 영업라인 미등록
  904 |
```