SAP 은행 수수료 청구 점검 — 은행이 청구한 수수료를 약정표로 다시 계산해 청구서와 장부에 견주는 월마감
약정 수수료표 재계산 · 청구 과다·과소·중복 의심 가려내기 · 장부 반영 금액 대사 · 은행 청구서 총액 대사 — 소개 영상과 실제 화면 8종, 그리고 CDS 코드까지
소개 영상1분 19초9개 장면음성 안내·자막처음 연 화면 → 점검 필요 → 유형·은행 → 약정표 → 상세 → 대사 결과
개발 배경 — 이 앱을 사용해야 하는 이유
월마감 때 자금 담당이 부딪히는 질문은 늘 비슷합니다. 은행이 청구한 수수료가 약정대로 맞는가, 장부에는 청구 금액 그대로 반영됐는가, 은행이 보낸 청구서 총액과 우리 명세 합계는 같은가. 지금은 이 세 답이 은행 청구서 · 명세 화면 · 장부 라인 조회에 흩어져 있어서 한 번에 맞춰 보기 어렵고, 건당 금액이 작다 보니 “나중에 보자”고 넘어가기 쉽습니다.
이 앱은 은행이 청구한 수수료를 약정 수수료표(건당 정액 또는 금액 비례, 하한·상한)로 다시 계산하고, 그 값을 청구 금액과 장부 반영 금액에 견주어 차이를 건마다 보여 줍니다. 이어서 수수료 유형별 · 은행별로 묶어 합계가 서로 맞는지 대사합니다. 관련 기준서는 없고 대상 영역은 자금 회계(은행 수수료 청구 점검)입니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·점검 관점을 더해 확장합니다.
은행 청구서는 약정과 맞는지 검산할 겨를이 없다
수수료 청구는 건당 수백 원에서 수만 원이라 한 건씩 보면 작지만, 월 수십~수천 건이 쌓이면 합계가 커지고 약정과 어긋난 건이 섞여 들어옵니다. 이 샘플에서는 타행 이체 100건에 건당 500원 약정이면 50,000원이어야 하는데 55,000원이 청구된 건이 있습니다. 청구서만 보면 건수와 금액이 그럴듯해 보여 지나가기 쉽습니다. 이 화면은 약정표로 다시 계산한 값(재계산)을 청구 금액 옆에 두고, 차이가 허용 오차를 넘으면 청구 과다(F01)로 표시합니다.
외화 송금 수수료는 비례 요율에 하한·상한이 붙어 눈으로 맞추기 어렵다
외화 송금 수수료는 송금액에 요율을 곱하되 건당 하한과 상한으로 묶습니다. 88,000 USD 를 보낸 건은 요율로 계산하면 훨씬 큰 값이지만 약정 상한 45,000원에 걸려야 합니다. 그런데 50,000원이 청구되었다면 상한 적용이 빠진 것입니다. 이런 계산은 송금액 · 환율 · 요율 · 하한 · 상한을 모두 알아야 하므로 사람이 눈으로 맞추기 어렵고, 이 화면은 상세 창에 계산 기준을 그대로 펼쳐 보여 줍니다.
청구는 맞는데 장부 금액이 다르면 다음 달에야 드러난다
은행 청구가 약정과 맞아도 장부에는 다른 금액이 기표될 수 있습니다. 예를 들어 인터넷뱅킹 이용료 30,000원이 청구되었는데 장부 반영은 0원인 경우입니다. 이 화면은 청구 금액과 장부 반영 금액의 차이를 따로 계산해 장부 불일치(F03)로 보여 주므로, 전표 금액을 마감 전에 확인할 수 있습니다.
같은 송금이 두 번 청구돼도 명세에서는 비슷해 보인다
같은 계좌에 송금번호와 금액이 같은 청구가 이미 있으면 중복 의심(F05)으로 가립니다. 상세 창은 같은 계좌의 이번 기간 청구를 아래에 이어 보여 주어, 두 건을 나란히 놓고 은행에 확인할 수 있게 합니다. 중복인지 아닌지의 판단은 은행과 회사가 하고, 화면은 후보를 모아 줍니다.
사용 방법
- 회계연도와 기간(월)을 확인하고 필요하면 회사·은행·계좌·수수료 유형·청구일·점검 코드·점검 결과를 고릅니다. 처음 열면 2026년 09월이 채워져 자동으로 한 번 조회됩니다.
- 조회 버튼(조회조건 영역의 오른쪽 끝)을 누르거나 입력란에서 Enter 를 누릅니다.
- 위쪽 요약에서 청구 건수 · 청구 금액 합계 · 청구 과다 건수와 금액 · 장부 불일치 · 확인 필요 · 점검 필요 · 대사 차이를 먼저 봅니다.
- 청구 명세 → 유형별 점검 → 은행별 대사 → 약정 수수료표 → 대사 결과 순으로 탭을 옮겨 봅니다.
- 청구 명세의 행을 누르면 재계산 · 청구 · 장부 금액과 같은 계좌의 다른 청구가 상세 창에 열립니다.
- CSV 내려받기 로 지금 보는 탭을 파일로 받아 은행에 확인할 자료로 씁니다.
숫자를 믿을 수 있는가 — 검증 결과
수수료 점검에서 가장 비싼 질문은 “이 합계 맞아?” 입니다. 그래서 대사식을 먼저 세우고 샘플 데이터 전체에 돌렸습니다. 검증용 파일을 화면과 별개 코드로 다시 계산해 서비스 결과와 견준 값입니다.
| 대사식 | 검사 건수 | 차이 |
|---|---|---|
| 청구 수수료 = 재계산 수수료 + 청구 차이 | 32 | 0 |
| 장부 반영 수수료 = 청구 수수료 + 장부 차이 | 34 | 0 |
| 유형별 청구 합계 = 명세 청구 합계 | 2 | 0 |
| 은행별 청구 합계 = 명세 청구 합계 | 2 | 0 |
| 은행 청구서 총액 = 명세 합계 + 명세 외 항목 | 5 | 0 |
| 미화(USD) 수수료 청구 = 재계산 + 차이 | 2 | 0 |
| 유형별 건수 합계 = 명세 건수 | 2 | 0 |
| 전신료 청구 건수 = 외화 송금 건수 | 3 | 0 |
| 청구 과다 금액 = 청구 과다 건 차이 합계 | 5 | 0 |
| 합계 | 87 | 0 |
대사식 9건 · 검사 87건이 모두 차이 0 입니다. 점검 화면이 보여 주려고 일부러 넣은 예외는 대사 차이와 섞이지 않도록 따로 세었습니다.
| 의도적 점검 예외 | 건수 | 내용 |
|---|---|---|
| 청구 과다(F01) | 5 | 청구가 재계산보다 큼 · 차이 합계 33,980원 |
| 청구 과소(F02) | 2 | 청구가 재계산보다 작음 · 차이 합계 4,180원 |
| 장부 불일치(F03) | 3 | 청구는 맞지만 장부 금액이 다름 · 차이 합계 37,250원 |
| 약정 없음(F04) | 2 | 미등록 약정 또는 유효기간 밖 |
| 중복 의심(F05) | 2 | 같은 계좌의 같은 참조·금액 청구 |
| 합계 | 14 | 대사 차이로 세지 않음 |
화면 쪽은 별도로 브라우저 자동화로 확인했습니다 — 조회·초기화·Enter 조회, 날짜 조건, 탭별 건수, 행 클릭 상세, CSV 내려받기, 좁은 화면 배치와 오류 안내를 실제로 돌려 보았습니다.
무엇으로 만들었나
| 항목 | 내용 |
|---|---|
| 솔루션 | 자금 솔루션 |
| 업무 영역 | 자금 회계 (은행 수수료 청구 점검) |
| 관련 기준서·대상 영역 | - (대상 영역: 자금 회계) |
| SAP 표준 T-code | FBL3N · FEBAN · FF67 · FF_5 · FB03 |
| 화면 성격 | 조회·점검 (약정 재계산 · 청구 · 장부 · 청구서 대사) |
| 데이터 연동 | OData V2 조회 서비스 |
| 테마 | sap_horizon |
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 | SAP UI5 표준 컨트롤(조회조건 · 요약 · 탭 · 표 · 상세 창) | 외부 차트·표 라이브러리 반입 심사가 필요 없고, Horizon 테마를 그대로 따릅니다. |
| 판정·집계 로직 | 서비스 한 곳에서 재계산 · 판정 · 유형별/은행별 집계 · 대사식을 계산 | 화면과 내려받기, 대사가 같은 숫자를 쓰도록 계산을 한 곳에만 둡니다. |
| 서비스 구성 | OData V2 조회 서비스 — 청구 · 유형 · 은행 · 약정 · 대사 다섯 묶음과 집계 함수 두 개 | 화면은 모델에 바인딩하고, 조회조건은 필터로 나가 서버에서 거릅니다. 서비스 주소는 앱 설정의 상대 경로 하나로만 부릅니다. |
| 날짜 조건 | 날짜 범위 필터를 서비스 로직이 직접 해석 | 청구일 시작·종료를 비워 두거나 한쪽만 넣어도 같은 결과가 나오게 합니다. |
| 모델 구성 | 이름 없는 기본 모델 · 건수 함께 읽기 · 배치 없이 요청 | 탭마다 건수를 바로 보이고, 요청 한 건이 어떤 조건인지 추적하기 쉽습니다. |
| 오류 안내 | 메타데이터 실패 · 요청 실패 · 빈 응답을 구분해 안내 | 연결 문제와 조회 결과 없음을 사용자가 구분하도록 합니다. |
실행 화면
실제로 돌아가는 화면 8종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 보고 무엇을 누르는 자리인지를 아래에 적었습니다. 숫자는 모두 같은 샘플 자료에서 나온 것이라 화면끼리 맞춰 보셔도 됩니다.
처음 열었을 때
조회조건 · 요약 · 탭이 한 화면에 세로로 쌓입니다. 연 직후 자동으로 한 번 조회되어 빈 화면 없이 이번 달 청구가 바로 보입니다.

2026년 09월이 채워진 채 한 번 자동 조회됩니다. 위쪽 요약 줄에서 점검한 청구 건수(34건), 청구 금액 합계(1,300,286원), 청구 과다 건수와 금액(5건 · 33,980원), 장부 불일치·확인 필요·점검 필요 건수, 정합성 대사 차이 건수(0건)를 먼저 읽습니다. 표의 한 줄이 은행이 청구한 수수료 한 건이며, 재계산·청구·장부 금액이 나란히 놓입니다.
점검 필요만 추려 보기, 그리고 유형·은행 단위로
건마다 보는 화면에서 약정과 다른 청구만 추린 뒤, 같은 차이가 어느 유형과 은행에서 났는지 묶어서 봅니다.

조회조건에서 점검 결과를 점검 필요로 두고 조회 버튼을 누르면 해당 청구 10건만 남습니다. 청구 과다(F01) 5건, 장부 불일치(F03) 3건, 중복 의심(F05) 2건이 여기에 모입니다. 입력란에서 Enter 를 눌러도 같은 조회가 됩니다. 초기화를 누르면 기본값으로 돌아갑니다.

유형마다 재계산 합계, 청구 합계, 둘의 차이, 장부 반영 합계가 한 줄에 놓입니다. 예를 들어 회사 1000 의 타행 이체 수수료는 재계산 145,850원에 청구 150,850원으로 5,000원 차이가 보입니다. 유형 행의 점검 코드(T00·T01·T03)는 그 안의 청구 중 가장 무거운 판정을 따릅니다.

은행마다 재계산 합계·청구 합계·명세에 없는 항목·청구서 총액이 놓입니다. 가상은행B 는 청구서 총액 105,950원이 명세 합계 101,550원보다 4,400원 크고, 이 차이는 명세에 올라오지 않은 항목입니다. 이런 은행은 확인 필요로 표시되어 은행에 항목 내역을 요청하는 출발점이 됩니다.
약정표와 한 건의 상세 — 재계산의 근거
재계산이 어떤 약정 행을 썼는지, 한 건이 어떻게 계산되었는지를 끝까지 따라가는 화면입니다.

약정 행은 건당 정액(단가)이거나 금액 비례(요율과 건당 하한·상한)입니다. 유효기간이 청구일을 덮지 못하는 약정은 확인 필요로 보입니다. 이 표의 숫자는 검증용 가정값이며, 실제 적용 때는 회사가 은행과 정한 약정으로 바꿉니다.

청구 명세에서 행을 누르면 계산 기준(건수·거래 금액·적용 약정), 재계산과 청구와 장부 금액, 차이와 허용 오차, 확인할 제안이 한 창에 나옵니다. 아래에는 같은 계좌의 다른 청구가 이어져 중복 여부를 바로 비교할 수 있습니다. 예시의 88,000 USD 송금은 비례 요율로 계산하면 상한(45,000원)에 걸려 45,000원이어야 하는데 50,000원이 청구되었습니다.
대사 결과와 좁은 화면
합계가 서로 맞는지 건수와 차이로 확인하고, 같은 화면을 좁은 폭에서도 씁니다.

정합성 대사식 9건의 좌변·우변·검사 건수·차이 건수가 나옵니다. 아래쪽에 점검 화면이 보여 주려고 넣은 예외(청구 과다·과소·장부 불일치·약정 없음·중복 의심)가 따로 놓여 대사 차이와 섞이지 않습니다. 이 탭의 결과는 CSV 로 내려받아 은행에 확인할 자료로 쓸 수 있습니다.

화면 폭이 줄면 조회조건과 요약 지표가 여러 줄로 나뉘어 쌓이고, 표는 열을 숨기지 않고 가로로 밀어 보게 합니다. 탭과 조회 버튼의 위치는 그대로라 넓은 화면에서 익힌 순서로 쓸 수 있습니다. 열이 많은 청구 명세는 가로 공간이 넓은 화면에서 읽는 편이 편합니다.
화면 뒤에서 일어나는 일
서비스는 청구 한 줄마다 아래 순서로 판정합니다. 한 건에 여러 조건이 겹쳐도 점검 코드는 가장 앞선 하나만 붙습니다(우선순위 F04 > F05 > F01·F02 > F03).
| 순서 | 처리 단계 | 설명 |
|---|---|---|
| 1 | 약정 찾기 | 회사 · 은행 · 수수료 유형이 같고 청구일이 유효기간 안에 있는 약정 행을 찾습니다. 없으면 약정 없음(F04) |
| 2 | 재계산 | 건당 정액 = 단가 × 건수. 금액 비례 = clamp(거래 금액(원화) × 요율, 하한, 상한) × 건수 |
| 3 | 청구와 견주기 | 청구 − 재계산 차이가 허용 오차(원화 1원 · 미화 0.01달러)를 넘으면 청구 과다(F01) 또는 과소(F02) |
| 4 | 장부와 견주기 | 청구가 맞는데 장부 반영 금액이 다르면 장부 불일치(F03) |
| 5 | 중복 가리기 | 같은 계좌에 참조 · 금액이 같은 청구가 있으면 중복 의심(F05) |
| 6 | 집계와 대사 | 유형별 · 은행별로 묶고, 은행 청구서 총액과 명세 합계를 대사식으로 맞춥니다 |
| 코드 | 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|---|
| F00 | 청구가 재계산과 같고 장부도 같다 | 정상 | 다음 마감에서 같은 기준으로 확인 |
| F01 | 청구가 재계산보다 허용 오차를 넘어 크다 | 점검 필요 | 청구 단가 · 상하한 적용 확인, 정정 요청 검토 |
| F02 | 청구가 재계산보다 허용 오차를 넘어 작다 | 확인 필요 | 약정 단가 · 하한 적용 여부 확인 |
| F03 | 청구는 맞지만 장부 반영 금액이 다르다 | 점검 필요 | 전표 금액 확인 |
| F04 | 적용할 약정이 없다(미등록 또는 유효기간 밖) | 확인 필요 | 약정 등록과 유효기간 확인 |
| F05 | 같은 계좌에 같은 참조 · 금액 청구가 이미 있다 | 점검 필요 | 중복 청구인지 은행에 확인 |
| T00 · T01 · T03 | 유형 행 기준 — 모두 정상 · 점검 필요 포함 · 확인 필요 포함 | 정상 · 점검 필요 · 확인 필요 | 유형별로 해당 청구를 연다 |
| B00 · B01 · B02 | 은행 행 기준 — 모두 정상 · 확인 필요 포함 · 점검 필요 포함 | 정상 · 확인 필요 · 점검 필요 | 청구서에만 있는 항목과 차이를 확인 |
조회조건
| 조회조건 | 필수 | 기본값 | 필터 처리 |
|---|---|---|---|
| 회계연도 | 필수 | 2026 | Gjahr eq → $filter |
| 기간(월) | 필수 | 09 | Monat eq → $filter |
| 회사 | 선택 | 전체 | 전체이면 필터를 만들지 않음 |
| 은행 | 선택 | 전체 | BankCode eq |
| 계좌 | 선택 | 전체 | AcctNo eq (청구 명세 탭) |
| 수수료 유형 | 선택 | 전체 | FeeType eq |
| 청구일 시작·종료 | 선택 | 전체 | ChgDate ge / le / bt (청구 명세 탭) |
| 점검 코드 | 선택 | 전체 | F · T · B 첫 글자에 따라 해당 탭에만 적용 |
| 점검 결과 | 선택 | 전체 | CheckStatus eq |
결과 컬럼
| 컬럼 | 의미 | 산출식 |
|---|---|---|
| 재계산 | 약정표로 다시 구한 수수료 | 건당 정액: 단가 × 건수 / 비례: clamp(거래 금액 × 요율, 하한, 상한) × 건수 |
| 청구 | 은행이 청구한 수수료 | 은행 명세·청구서 금액 |
| 청구 − 재계산 | 약정과의 차이 | 청구 − 재계산 (원화 환산 합계는 환산 금액으로만) |
| 장부 반영 | 장부에 기표된 수수료 | 수수료 계정 라인 금액 |
| 장부 − 청구 | 장부와 청구의 차이 | 장부 반영 − 청구 |
| 점검 결과 · 코드 | 정상 · 확인 필요 · 점검 필요와 F·T·B 코드 | 위 판정 규칙, 우선순위 F04 > F05 > F01·F02 > F03 |
| 허용 오차 | 같은 금액으로 볼 범위 | 원화 1원 · 미화 0.01달러 (샘플 가정값) |
좁은 화면에서 달라지는 것
폭이 줄면 조회조건과 요약 지표가 여러 줄로 나뉘어 쌓이고, 표는 열을 숨기지 않고 가로로 밀어 봅니다. 탭 순서와 조회 버튼의 자리는 그대로여서 같은 순서로 쓸 수 있습니다.
파일 구성
index.html · Component.js · manifest.json
controller/ (BaseController · Main.controller) view/ (Main.view · DetailDialog.fragment)
model/ (formatter · ErrorHandler) css/ i18n/
odata/ (서비스 정의 · 서비스 로직 · 샘플 데이터)
media/ (소개 영상 · 첫 장면)
SAP 표준 기능 확장 포인트 — 표준 T-code 와 어떻게 연계되는지
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·점검 관점을 더해 확장합니다. 은행 명세를 올리고 후처리하고 장부 라인을 확인하는 일은 모두 표준에 두고, 그 결과를 약정과 견주는 자리만 이어 붙였습니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | 표준으로 되는 부분 | 이 화면이 더하는 관점 |
|---|---|---|
| 은행 명세 올리기와 후처리 | FF67 · FF_5 · FEBAN | 명세에 올라온 수수료 항목을 약정과 견주어 후보로 보여 줍니다 |
| 수수료 계정 라인 확인 | FBL3N · FB03 | 청구 금액과 장부 반영 금액의 차이를 건마다 보여 줍니다 |
| 약정 수수료표로 재계산 | 표준에는 약정표 재계산 기능이 없어 보통 엑셀로 합니다 | 건당 정액 · 비례(하한·상한)로 재계산하고 허용 오차로 판정합니다 |
| 중복 청구 후보 | 건별 조회로 눈으로 비교 | 같은 계좌 · 참조 · 금액 청구를 후보로 모읍니다 |
| 은행 청구서 총액 대사 | 은행 문서와 명세를 직접 맞춤 | 청구서 총액과 명세 합계를 대사식으로 맞추고 명세 외 항목을 보입니다 |
T-code 별 연계 지점
| T-code | 이름 | 연계 |
|---|---|---|
| FF67 | 수작업 은행 명세 | 명세 한 줄을 만드는 입력 화면. 이 화면은 그 결과 중 수수료 항목의 일자 · 금액 · 참조를 읽습니다. 수작업으로 올린 항목도 같은 방식으로 점검됩니다. |
| FF_5 | 전자 은행 명세 가져오기 | 은행 파일로 명세를 올리는 표준 거래. 올라온 명세의 수수료 항목이 이 화면의 청구 한 줄이 됩니다. 두 화면의 항목 수를 맞춰 보는 것이 첫 대사 지점입니다. |
| FEBAN | 은행 명세 후처리 | 자동 처리되지 않은 항목의 후처리. 이 화면 결과에서 약정과 다른 청구를 찾으면 후처리 단계에서 정정 여부를 판단합니다. |
| FBL3N | G/L 계정 라인 아이템 | 장부 반영 수수료의 원천. 이 화면의 장부 금액이 의심스러우면 FBL3N 으로 계정 라인을 확인합니다. 반대로 FBL3N 에서 본 금액은 이 화면의 청구 명세에서 같은 청구 번호로 다시 볼 수 있습니다. |
| FB03 | 전표 조회 | 장부 불일치(F03) 건의 전표를 열어 금액과 적요를 확인합니다. 정정 전표는 표준 거래에서 만듭니다. |
법정 · 감사 · 세무 신고에 쓰는 보고서와 정정 전표는 표준에 그대로 둡니다. 따라서 운영 전환 때 기존 리포트를 없애지 않고, 한두 달 두 화면의 합계를 맞춰 본 뒤 쓰임새를 나눕니다.
S/4HANA 분석 스택과의 자리
S/4HANA 에서는 CDS 뷰 위에 분석 쿼리를 두고 Fiori 분석 앱이나 Analysis for Office 로 읽는 구성이 흔합니다. 이 화면의 서비스도 같은 CDS 뷰 위에 놓이는 것을 전제로 하며, 약정 재계산과 점검 판정을 뷰에서 계산해 다른 도구에서도 같은 숫자를 읽을 수 있게 합니다. 구체적인 표준 분석 앱 이름은 고객 환경에서 확인한 뒤에 연결합니다.
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 무엇을 손대나 | 비고 |
|---|---|---|
| 약정 수수료표 | 은행 · 유형별 단가 · 요율 · 하한 · 상한 · 유효기간 행 추가 | 약정 변경은 새 행 추가와 이전 행 종료로 관리 |
| 수수료 유형 ↔ 계정 매핑 | 수수료 유형과 G/L 계정의 대응 | 회계팀이 직접 한 행씩 관리 |
| 허용 오차 | 통화별 같은 금액으로 볼 범위 | 은행 반올림 방식에 맞춰 조정 |
| 환율 유형 · 환산 시점 | 외화 수수료의 원화 환산 기준 | 회사 정책으로 정함 (샘플은 가정값) |
| 권한 | 회사코드 단위 조회 권한 | 집계 단계에 걸어 합계로도 새지 않게 |
| 확장 필드 | 은행별 청구서 번호 등 고객 필드 | BAdI 나 확장 필드로 명세에 추가 |
분석 지표 정의표
| 지표 | 산식·판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 재계산 수수료 | 정액: 단가 × 건수 / 비례: clamp(거래 금액 × 요율, 하한, 상한) × 건수 | 청구 명세 · F01 · F02 | 약정표 · 거래 금액 | 약정은 회사와 은행의 합의 (확인 필요) |
| 청구 차이 | 청구 − 재계산 | F01 · F02 | 은행 청구서 | 허용 오차 이내는 정상 |
| 장부 차이 | 장부 반영 − 청구 | F03 | FBL3N 계정 라인 | 전표 금액 확인 |
| 청구 과다 금액 | 청구 과다 건의 청구 차이 원화 합계 | 집계 함수 | — | 외화는 환산액만 합산 |
| 중복 의심 | 같은 계좌 · 참조 · 금액 청구 2건 이상 | F05 | 은행 명세 | 판단은 회사와 은행 |
| 청구서 총액 차이 | 청구서 총액 − 명세 합계 | B01 · B02 | 은행 청구서 · 명세 | 명세 외 항목이 차이를 만듦 |
관련 기준서는 없으며 대상 영역은 자금 회계입니다. 이 화면은 점검 도구이며 최종 판단은 회사와 감사인이 합니다.
CDS 구성 — 약정 재계산에서 서비스까지
샘플 화면은 서비스 로직이 계산하지만, 운영에서는 같은 계산을 CDS 뷰에 둡니다. 아래는 그 구성의 스케치입니다. 표준 CDS 뷰 이름은 확인된 것만 쓰고, 명세·장부 원천은 테이블 기준으로 적었으며 원천 필드는 도입 때 “확인 필요”입니다.
뷰 레이어 구성
| 레이어 | 뷰 · 테이블 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 | 약정표 · 유형-계정 매핑 | 재계산의 기준 행과 계정 대응 | 약정과 매핑이 바뀌어도 코드를 고치지 않으려고 |
| 차원 | 약정 행 뷰 | 약정표에 통화 의미를 붙여 노출 | 큐브가 저장 구조에 묶이지 않도록 |
| 원천 | 청구 한 줄 뷰 | 명세 항목과 장부 반영 금액을 한 행에 | 청구와 장부 원천을 한곳에서 합치려고 |
| 큐브 | 재계산·판정 뷰 | 약정을 붙여 재계산 · 차이 · 점검 코드 계산 | 판정을 한 곳에서만 계산하려고 |
| 쿼리 | 청구 조회 쿼리 · 은행별 대사 뷰 | 화면 컬럼 · 필터 규칙 · 청구서 총액 대사 | 화면과 서비스가 같은 정의를 쓰려고 |
| 권한 | 접근 제어(DCL) | 회사코드 권한을 집계까지 상속 | 합계로 새지 않게 |
| 서비스 | 서비스 정의 · 바인딩 | 노출 목록과 OData V2 게시 | 계약을 한 파일에 모으려고 |
① 약정 수수료표 — 재계산의 유일한 기준
약정이 어디에 저장되는지가 곧 재계산의 신뢰도입니다. 은행 · 수수료 유형 · 유효 시작일을 키로 두어 약정이 바뀌어도 과거 청구를 그때의 약정으로 다시 계산할 수 있게 했습니다. 건당 정액과 금액 비례(요율 · 하한 · 상한)를 한 표에 담습니다.
// ─────────────────────────────────────────────────────────────
// ZBFEE_TARIFF — 은행 수수료 약정표 (고객 테이블)
// 역할 : 재계산의 유일한 기준. 은행·수수료 유형·유효기간마다 한 행.
// 이렇게 나눈 이유 : 약정이 바뀌면 코드가 아니라 이 표의 행만 바꾸게 하려는 것.
// 유효 종료일을 닫고 새 행을 여는 방식이라 과거 청구도 그때의 약정으로 다시 계산된다.
// ─────────────────────────────────────────────────────────────
@EndUserText.label : '은행 수수료 약정표'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zbfee_tariff {
key client : abap.clnt not null;
key bukrs : bukrs not null;
key bank_code : abap.char(4) not null;
key fee_type : abap.char(2) not null;
key valid_from : abap.dats not null;
valid_to : abap.dats;
fee_mode : abap.char(1); // F 건당 정액 · P 금액 비례
fee_waers : waers;
@Semantics.amount.currencyCode : 'zbfee_tariff.fee_waers'
unit_fee : abap.curr(15,2);
rate_pct : abap.dec(9,4); // 0.1000 = 0.10 %
@Semantics.amount.currencyCode : 'zbfee_tariff.fee_waers'
min_fee : abap.curr(15,2);
@Semantics.amount.currencyCode : 'zbfee_tariff.fee_waers'
max_fee : abap.curr(15,2);
}
② 수수료 유형과 계정 매핑 — 회계팀이 관리하는 표
장부 라인에서 어떤 계정이 어떤 수수료 유형인지를 정하는 표입니다. 허용 오차도 여기에 두어 은행의 반올림 방식에 따라 유형마다 조정할 수 있습니다. 정하지 않으면 장부 금액을 청구와 연결하지 못합니다.
// ─────────────────────────────────────────────────────────────
// ZBFEE_TYPEMAP — 수수료 유형 ↔ 수수료 계정(G/L) 매핑 (고객 테이블)
// 역할 : 장부 라인에서 어떤 계정이 어떤 수수료 유형인지 한 곳에서 정한다.
// 이렇게 나눈 이유 : 계정이 새로 생겨도 한 행만 추가하면 되고, 뷰는 고치지 않는다.
// ─────────────────────────────────────────────────────────────
@EndUserText.label : '수수료 유형-계정 매핑'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zbfee_typemap {
key client : abap.clnt not null;
key bukrs : bukrs not null;
key fee_type : abap.char(2) not null;
type_name : abap.char(40);
glaccount : abap.char(10); // 수수료 비용 계정
tol_krw : abap.dec(9,2); // 허용 오차 (원화)
tol_fx : abap.dec(9,2); // 허용 오차 (외화 단위)
}
③ 약정 행 뷰 — 통화 의미를 붙여 노출
큐브가 테이블을 직접 읽지 않고 이 뷰만 보게 합니다. 금액 필드에 통화 의미를 붙여 두면 이후 원화 환산이나 합산에서 통화가 다른 금액이 섞이는 일을 막을 수 있습니다.
// ─────────────────────────────────────────────────────────────
// ZI_BankFeeTariff — 약정 행 (기준 뷰)
// 역할 : 약정표를 표준 통화 의미(@Semantics)를 붙여 노출한다.
// 이렇게 나눈 이유 : 큐브가 약정표 테이블을 직접 읽지 않고 이 뷰만 보게 해서
// 약정표의 저장 구조가 바뀌어도 위쪽 뷰는 그대로 둔다.
// ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '약정 수수료표'
define view entity ZI_BankFeeTariff
as select from zbfee_tariff
{
key bukrs as CompanyCode,
key bank_code as BankCode,
key fee_type as FeeType,
key valid_from as ValidFrom,
valid_to as ValidTo,
fee_mode as FeeMode,
fee_waers as FeeCurrency,
@Semantics.amount.currencyCode : 'FeeCurrency'
unit_fee as UnitFee,
rate_pct as RatePct,
@Semantics.amount.currencyCode : 'FeeCurrency'
min_fee as MinFee,
@Semantics.amount.currencyCode : 'FeeCurrency'
max_fee as MaxFee
}
④ 청구 한 줄 뷰 — 명세와 장부를 한 행에
청구 금액의 원천(은행 명세)과 장부 반영 금액의 원천(수수료 계정 라인)을 한 행에 모읍니다. 필드 이름은 고객의 명세 형식에 따라 달라지므로 도입 때 정하는 항목입니다.
// ─────────────────────────────────────────────────────────────
// ZI_BankFeeLine — 은행 청구 한 줄 (명세 + 장부 반영 금액)
// 역할 : 은행 명세의 수수료 항목 한 줄과 그 줄에 대응하는 장부 라인 금액을 한 행에 둔다.
// 이렇게 나눈 이유 : 청구 금액과 장부 금액의 원천이 달라 한 곳에서 합쳐야
// "청구는 맞는데 장부가 다르다"를 뷰에서 계산할 수 있다.
// 원천 필드 : 명세 형식에 따라 달라지므로 도입 때 확인 필요 (스케치)
// ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '은행 수수료 청구 한 줄'
define view entity ZI_BankFeeLine
as select from febep as s
inner join febko as k on k.kukey = s.kukey
left outer join zbfee_typemap as m
on m.bukrs = k.bukrs and m.fee_type = s.zz_fee_type // 확장 필드(확인 필요)
{
key k.bukrs as CompanyCode,
key s.kukey as StatementKey,
key s.esnum as StatementItem,
k.hbkid as HouseBank,
k.hktid as AccountId,
s.zz_fee_type as FeeType,
s.vb1ok as StatementDate, // 명세 일자(확인 필요)
s.kwaers as FeeCurrency,
@Semantics.amount.currencyCode : 'FeeCurrency'
s.kwbtr as BilledFee,
s.zz_qty as Quantity, // 건수(확인 필요)
s.zz_txn_amt as TxnAmount, // 거래 금액(확인 필요)
@Semantics.amount.currencyCode : 'FeeCurrency'
s.zz_book_fee as BookedFee // 장부 반영(장부 라인에서 채움)
}
⑤ 재계산·판정 큐브 — 숫자가 만들어지는 유일한 자리
정액과 비례의 계산, 하한·상한 적용, 약정 없음 판정이 여기서 결정됩니다. 화면 · 내려받기 · 대사가 모두 이 뷰의 값을 읽으므로 운영에서 가장 먼저 검증해야 하는 뷰입니다.
// ─────────────────────────────────────────────────────────────
// ZI_BankFeeRecalc — 재계산·판정 (큐브)
// 역할 : 청구 한 줄에 약정을 붙여 재계산 금액을 구하고, 청구·장부와의 차이와
// 점검 코드(F00~F04)를 계산한다. 같은 계좌 중복(F05)은 위 쿼리에서 윈도로 잡는다.
// 이렇게 나눈 이유 : 판정을 뷰 한 곳에서만 계산해 화면·CSV·대사가 같은 숫자를 쓰게 한다.
// 금액 비례는 clamp(거래 금액 × 요율, 하한, 상한), 정액은 단가 × 건수.
// ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@Analytics.dataCategory : #CUBE
@EndUserText.label : '수수료 재계산·판정'
define view entity ZI_BankFeeRecalc
as select from ZI_BankFeeLine as l
left outer join ZI_BankFeeTariff as t
on t.CompanyCode = l.CompanyCode
and t.BankCode = l.HouseBank
and t.FeeType = l.FeeType
and t.ValidFrom <= l.StatementDate
and ( t.ValidTo >= l.StatementDate or t.ValidTo = '00000000' )
{
key l.CompanyCode, key l.StatementKey, key l.StatementItem,
l.FeeType, l.FeeCurrency, l.StatementDate,
@Semantics.amount.currencyCode : 'FeeCurrency'
l.BilledFee,
@Semantics.amount.currencyCode : 'FeeCurrency'
l.BookedFee,
@Semantics.amount.currencyCode : 'FeeCurrency'
case t.FeeMode
when 'F' then cast( t.UnitFee * l.Quantity as abap.curr(15,2) )
when 'P' then cast(
case when l.TxnAmount * t.RatePct / 100 < t.MinFee then t.MinFee
when l.TxnAmount * t.RatePct / 100 > t.MaxFee then t.MaxFee
else l.TxnAmount * t.RatePct / 100 end * l.Quantity
as abap.curr(15,2) )
else cast( 0 as abap.curr(15,2) ) end as ExpectedFee,
case when t.FeeMode is null then 'F04' // 약정 없음(미등록·유효기간 밖)
else 'CALC' end as PreCode
}
⑥ 청구 조회 쿼리 — 화면 컬럼과 필터 규칙
회사코드는 필수 단일 선택, 청구일은 범위로 거는 식의 조회 규칙을 한 곳에 둡니다. 차이와 점검 코드를 여기서 계산해 화면이 별도 계산을 하지 않게 합니다.
// ─────────────────────────────────────────────────────────────
// ZC_BankFeeCharge — 화면용 조회 쿼리 (Consumption)
// 역할 : 청구 명세 탭이 읽는 한 줄. 차이·판정을 계산해 화면 컬럼으로 노출한다.
// 이렇게 나눈 이유 : 화면 컬럼·필터·정렬 규칙(@UI·@Consumption)을 한 곳에 모아
// 서비스와 화면이 같은 정의를 쓰게 한다. 원화 환산은 청구일 환율로 한다.
// ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '수수료 청구 점검'
@Metadata.allowExtensions : true
define view entity ZC_BankFeeCharge
as select from ZI_BankFeeRecalc
{
@Consumption.filter : { selectionType : #SINGLE, mandatory : true }
key CompanyCode,
key StatementKey,
key StatementItem,
@Consumption.filter.selectionType : #RANGE
StatementDate,
@UI.lineItem : [{ position : 10 }]
FeeType,
@UI.lineItem : [{ position : 20 }]
FeeCurrency,
@UI.lineItem : [{ position : 30 }]
ExpectedFee,
@UI.lineItem : [{ position : 40 }]
BilledFee,
@UI.lineItem : [{ position : 50 }]
BilledFee - ExpectedFee as FeeDiff,
@UI.lineItem : [{ position : 60 }]
BookedFee - BilledFee as BookDiff,
@UI.lineItem : [{ position : 70, criticality : 'Criticality' }]
case when ExpectedFee = 0 and PreCode = 'F04' then 'F04'
when BilledFee - ExpectedFee > 1 then 'F01'
when BilledFee - ExpectedFee < -1 then 'F02'
when BookedFee <> BilledFee then 'F03'
else 'F00' end as CheckCode
}
⑦ 은행별 대사 — 청구서 총액과 명세 합계
은행이 보낸 청구서 총액은 명세와 다른 원천이라 별도 뷰로 비교합니다. 차이는 명세에 올라오지 않은 항목이며, 확인 필요로 올려 은행에 항목 내역을 요청하는 출발점이 됩니다.
// ─────────────────────────────────────────────────────────────
// ZI_BankFeeBankRecon — 은행별 청구서 총액 대사
// 역할 : 은행 청구서 총액(은행 문서)과 명세 합계를 비교해 명세 외 항목을 드러낸다.
// 이렇게 나눈 이유 : 청구서 총액은 명세와 다른 원천이라 별도 뷰로 두고,
// 차이가 있으면 B01(확인 필요)·B02(점검 필요)로 올린다.
// ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '은행별 청구서 대사'
define view entity ZI_BankFeeBankRecon
as select from ZI_BankFeeRecalc as r
left outer join zbfee_stmt_total as s // 은행 청구서 총액(고객 테이블)
on s.bukrs = r.CompanyCode and s.bank_code = r.StatementKey
{
key r.CompanyCode,
key s.bank_code as BankCode,
sum( r.BilledFee ) as StatementSum,
max( s.stmt_total ) as InvoiceTotal,
max( s.stmt_total ) - sum( r.BilledFee ) as OutsideStatement
}
group by r.CompanyCode, s.bank_code
⑧ 접근 제어 — 회사코드 권한
집계 뷰까지 같은 권한을 상속해야 합계로 다른 회사의 금액이 드러나지 않습니다. 드릴다운에만 권한을 걸면 뺄셈으로 새어 나갈 수 있어 집계 단계에 겁니다.
// ─────────────────────────────────────────────────────────────
// ZC_BankFeeCharge — 접근 제어 (DCL)
// 역할 : 회사코드 권한이 없는 회사의 청구는 합계로도 보이지 않게 한다.
// 이렇게 나눈 이유 : 집계 뷰까지 같은 규칙을 상속해야 합계로 새는 일이 없다.
// ─────────────────────────────────────────────────────────────
@EndUserText.label : '수수료 청구 점검 권한'
@MappingRole : true
define role ZC_BankFeeCharge {
grant select on ZC_BankFeeCharge
where ( CompanyCode ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}
⑨ 서비스 정의와 바인딩 — 화면이 읽는 계약
노출 목록이 곧 화면과의 계약입니다. 바인딩을 게시한 뒤 서비스를 활성화하고, 앱 설정의 서비스 주소만 운영 주소로 바꿉니다.
// ─────────────────────────────────────────────────────────────
// ZUI_BankFeeCheck — 서비스 정의와 바인딩 (OData V2)
// 역할 : 화면이 읽는 뷰를 서비스로 노출한다.
// 이렇게 나눈 이유 : 노출 목록이 곧 계약이므로 한 파일에 모아 두고,
// 바인딩을 게시한 뒤 앱 설정의 서비스 주소만 바꿔 운영에 연결한다.
// ─────────────────────────────────────────────────────────────
@EndUserText.label : '수수료 청구 점검 서비스'
define service ZUI_BankFeeCheck {
expose ZC_BankFeeCharge as ChargeSet;
expose ZI_BankFeeBankRecon as BankSet;
expose ZI_BankFeeTariff as TariffSet;
}
// Service Binding : 유형 OData V2 - UI, 게시 후 서비스 활성화
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다. 아래 여덟 가지는 코딩이 아니라 합의이며, 합의가 끝나면 기술 작업은 뷰를 만들고 서비스를 게시하는 일로 줄어듭니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 약정표 정리 | 은행 · 유형별 단가 · 요율 · 하한 · 상한 · 유효기간 | 재계산이 약정 없음(F04)으로 쏠려 점검이 의미를 잃습니다 | 자금팀 · 은행 담당 |
| 수수료 유형과 계정 매핑 | 유형 ↔ G/L 계정 대응과 새 계정 추가 절차 | 장부 금액을 청구와 연결하지 못합니다 | 회계팀 |
| 명세 원천 필드 확정 | 수수료 항목의 일자 · 금액 · 건수 · 거래 금액 필드 | 청구 한 줄이 비어 재계산이 안 됩니다 | 자금팀 · IT |
| 환율 유형 · 환산 시점 | 외화 수수료의 원화 환산 기준 | 합계가 회계 환산과 어긋납니다 | 회계팀 |
| 허용 오차 기준 | 통화별 같은 금액으로 볼 범위 | 반올림 차이가 청구 과다로 잡힙니다 | 자금팀 |
| 권한 설계 | 회사코드 · 계정 권한 범위 | 다른 회사의 합계가 보일 수 있습니다 | 보안 · 권한 |
| 대사 체계 | 표준 T-code 와 맞출 항목과 주기 | 두 화면 숫자를 누가 맞추는지 불분명해집니다 | 회계팀 |
| 전송 · 서비스 활성화 | 전송 순서, 서비스 활성화(/IWFND/MAINT_SERVICE) 또는 바인딩 게시, 앱 설정의 서비스 주소 교체 | 화면이 샘플 데이터로 남습니다 | IT · Basis |
운영 데이터로 갈 때
월 청구 건수가 수만 건을 넘으면 조회조건(회사 · 기간)을 필수로 두고 청구 명세를 페이지 단위로 읽는 것이 기본입니다. 유형별 · 은행별 집계는 뷰에서 미리 묶어 응답 시간을 일정하게 유지하고, 약정 조인은 약정 행이 적으므로 인덱스 없이도 부담이 작습니다. 응답 시간 기준은 고객 환경에서 정한 뒤 시험으로 확인합니다.
자주 묻는 질문
숫자와 산식 · 화면과 조작 · 데이터와 표준 연계 · 도입과 운영 네 묶음으로 정리했습니다.
숫자와 산식
재계산은 어떤 식으로 합니까?
약정 수수료표에서 회사·은행·수수료 유형이 같고 청구일이 유효기간 안에 있는 행을 찾습니다. 건당 정액이면 단가 × 건수, 금액 비례이면 거래 금액(원화)에 요율을 곱한 값을 건당 하한·상한으로 묶은 뒤 건수를 곱합니다. 외화 수수료는 청구 통화 그대로 계산하고 합계를 낼 때만 가정 환율로 원화 환산합니다. 계산은 서비스가 한 곳에서 하므로 화면과 CSV 의 숫자가 같습니다.
허용 오차는 얼마입니까?
샘플은 원화 1원, 미화 0.01 달러 단위로 둔 가정값입니다. 청구와 재계산의 차이가 이 값 이하이면 같은 금액으로 봅니다. 실제 적용 때는 은행의 반올림 방식과 회사의 정책에 맞춰 바꿉니다. 오차 기준은 상세 창에 청구마다 함께 표시됩니다.
한 청구에 점검 코드가 하나만 붙는 이유는 무엇입니까?
한 건이 여러 조건에 걸릴 수 있어도 사용자가 가장 먼저 해야 할 일은 하나이기 때문입니다. 우선순위는 약정 없음(F04), 중복 의심(F05), 청구 과다·과소(F01·F02), 장부 불일치(F03) 순입니다. 약정이 없으면 재계산 자체가 안 되므로 가장 앞에 둡니다.
외화 수수료는 어떻게 합산합니까?
통화가 다른 금액은 그대로 더하지 않고 원화 환산 금액으로만 합산합니다. 샘플의 환율은 청구일 기준 가정값이며, 실제 환경에서는 회사의 환율 유형과 환산 시점을 정해 연결합니다. 미화 수수료만 따로 맞춰 보는 대사식도 한 건 있습니다.
대사 차이가 0인데 점검 필요가 10건인 것은 모순이 아닙니까?
모순이 아닙니다. 대사식은 같은 데이터를 다른 길로 더해 합계가 일치하는지 보는 정합성 검사이고, 점검 필요는 약정과 다르게 청구된 건을 가려내는 업무 판정입니다. 점검 화면이 보여 주려고 일부러 넣은 예외 14건은 대사 차이로 세지 않도록 따로 표시합니다.
화면과 조작
조회 조건은 무엇을 고를 수 있습니까?
회계연도와 기간(월)은 필수이고, 회사·은행·계좌·수수료 유형·청구일 범위·점검 코드·점검 결과는 선택입니다. 전체를 고르면 그 조건은 조회에 넣지 않습니다. 점검 코드는 첫 글자(F·T·B)에 따라 해당 탭에만 적용됩니다.
상세 창에서는 무엇을 볼 수 있습니까?
계산 기준(건수·거래 금액·적용 약정), 재계산·청구·장부 금액과 차이, 허용 오차, 점검 내용과 확인할 제안이 나옵니다. 아래에는 같은 계좌의 다른 청구가 있어 중복 청구인지 바로 비교할 수 있습니다.
내려받기는 무엇이 담깁니까?
지금 보고 있는 탭의 조회 결과가 UTF-8 CSV 로 내려옵니다. 한글이 깨지지 않도록 처음에 BOM 을 붙여 엑셀에서 바로 열립니다. 은행에 정정을 요청할 때 첨부 자료로 쓰는 용도입니다.
휴대폰에서도 쓸 수 있습니까?
쓸 수 있습니다. 좁은 화면에서는 조회조건과 요약이 세로로 쌓이고 표는 가로로 스크롤됩니다. 다만 열이 많은 청구 명세는 가로 공간이 넓은 화면에서 읽는 편이 편합니다.
데이터와 표준 연계
SAP 표준 T-code 와는 어떤 관계입니까?
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·점검 관점을 더해 확장합니다. 은행 명세는 FF67 · FF_5 로 올리고, 후처리는 FEBAN, 장부 라인 확인은 FBL3N · FB03 에서 합니다. 이 화면은 그 결과를 읽어 약정과 견주는 자리입니다.
기존 리포트를 없애야 합니까?
없애지 않습니다. 법정·감사·세무 신고에 쓰는 보고서는 표준 거래에 그대로 두고, 이 화면은 월마감 전에 은행 수수료만 따로 점검하는 용도로 함께 둡니다. 운영 전환 후 두 화면의 합계를 한두 달 맞춰 본 뒤 쓰임새를 정하는 순서를 권합니다.
약정 수수료표는 어디서 옵니까?
샘플은 가상 은행·가정 요율입니다. 실제 적용 때는 회사가 은행과 정한 약정을 고객 테이블로 두고 유효기간까지 관리합니다. 약정이 바뀌면 새 행을 유효 시작일과 함께 추가하고 이전 행은 유효 종료일을 닫아 두는 방식을 권합니다.
데이터 원천은 무엇입니까?
은행 청구 한 줄은 은행 명세(FEBKO·FEBEP 계열)에서, 장부 반영 금액은 수수료 계정 라인(BKPF·BSEG·ACDOCA)에서 읽는 구성을 전제로 합니다. 원천 필드의 정확한 대응은 고객 환경의 명세 형식에 따라 달라지므로 도입 때 확인합니다. 화면 데이터는 모두 검증용 샘플입니다.
계정 체계나 매핑이 바뀌면 어떻게 됩니까?
수수료 유형과 수수료 계정(G/L)의 대응은 한 장의 매핑표에만 둡니다. 계정이 새로 생기면 어느 유형인지 한 행만 적어 주면 되고 화면 코드는 고치지 않습니다. 매핑 책임은 회계팀에 두는 것이 안전합니다.
도입과 운영
도입하면 어떤 효과가 있습니까?
월마감 때 은행 청구서와 장부를 사람이 눈으로 맞추던 일이 줄고, 약정과 다르게 청구된 건을 근거와 함께 은행에 문의할 수 있습니다. 같은 송금이 두 번 청구된 경우도 같은 계좌의 다른 청구와 나란히 보여 줍니다. 효과의 크기는 월 청구 건수와 약정 구조에 따라 다르므로 샘플의 숫자를 그대로 일반화하지는 않습니다.
누가 쓰는 화면입니까?
자금 담당과 회계 담당이 월마감 전에 쓰고, 경영지원 쪽에서는 요약과 대사 결과 탭을 봅니다. 조회·점검만 하므로 전표를 만들거나 바꾸는 권한은 필요하지 않습니다.
권한과 보안은 어떻게 설계합니까?
회사코드 권한을 집계 단계에 걸어 남의 회사 청구가 합계로도 드러나지 않게 합니다. 계좌번호는 앞뒤 일부만 보이는 마스킹 형식으로 내려 보냅니다. 이 화면은 읽기 전용이며 외부로 데이터를 보내지 않습니다.
청구 건수가 매우 많아지면 어떻게 합니까?
수수료 명세는 월 단위로 보통 수천~수만 건 수준이라 조회 기간과 회사를 좁혀 받는 것이 기본입니다. 집계(유형·은행·대사)는 CDS 뷰에서 미리 묶어 두고, 청구 명세는 페이지 단위로 읽습니다. 건수가 더 커지면 약정 조인을 서비스 쪽에서 미리 계산해 두는 방법을 씁니다.
운영 시스템에 붙이는 데 얼마나 걸립니까?
기술 작업보다 합의가 앞섭니다. 약정표 정리, 수수료 유형과 계정의 매핑, 환율 유형, 허용 오차 기준을 먼저 정하면 CDS 뷰와 서비스 게시는 비교적 짧게 끝납니다. 기간은 고객 환경의 명세 형식과 권한 설계에 따라 달라지므로 확정된 숫자로는 말씀드리지 않습니다.
점검 결과를 그대로 은행에 정정 요청해도 됩니까?
점검 결과는 확인을 돕는 참고 자료입니다. 약정 해석이 다르거나 부가 수수료가 별도로 있을 수 있으므로 은행에 문의하는 근거로 쓰고, 최종 판단은 회사와 은행이 합니다. 감사나 세무 신고가 걸린 항목은 회사와 감사인 또는 세무 대리인이 확인합니다.
샘플과 실제 데이터의 차이는 무엇입니까?
샘플은 가상 은행 4곳, 가상 계좌, 가정 요율과 가정 환율로 만든 검증용 데이터입니다. 의도적 예외 14건을 섞어 점검 화면이 무엇을 보여 주는지 확인하도록 했습니다. 실제 도입에서는 이 자리에 회사의 명세와 약정이 들어옵니다.