SAP 수출 은행 수수료·환가료 다차원 분석 리포트 — 네고·추심 때 은행에 내는 돈을 환가료부터 하자 수수료까지 계획 대비로 읽는 수출 대금 회수 비용 분석
큐브 한 번 조회 · 드래그 앤 드롭 축 구성 · 칸에서 네고 문서 라인까지의 드릴스루 · 계획 대비 차이와 아홉 요인분해 · 행에 남는 변동 사유 · 숫자를 모델에 맡기지 않는 AI 분석 · 스스로 도는 AI 에이전트 — 소개 영상과 실제 화면 31종, 그리고 CDS 코드까지
소개 영상화면 순서대로 · 자막 포함
도입 포인트 — 이 앱을 사용해야 하는 이유
수출 대금 회수 회의의 질문은 늘 비슷합니다. 은행에 얼마를 냈나, 어느 은행 · 어느 결제 방식에서 더 나갔나, 계획보다 은행 비용이 늘었다면 환가 일수가 길어서인가 요율이 올라서인가 서류 하자 때문인가. 지금 이 답은 판매오더(VA03) · 청구(VF03) 화면과 은행 통보서, G/L 개별 항목(FBL3N), 엑셀로 흩어져 있어 매달 숫자를 모아 맞추는 데 시간이 듭니다.
이 앱은 수출 매입(네고 · 추심) 품목을 은행 비용 관점으로 한 번 읽어 큐브로 만들고, 같은 큐브에서 표 · 차트 · 요약 · 드릴스루 · 계획 대비 · 요인분해를 모두 그립니다. 축을 바꿔도 서버를 다시 부르지 않고, 칸을 누르면 그 금액을 만든 네고 문서 라인이 열려 “어느 숫자가 맞나” 하는 회의를 줄입니다. 이 글의 모든 숫자는 가상의 검증용 샘플이며 환가료율 · 수수료율 · 임계값은 가정값입니다.
핵심 포인트 일곱 가지
| 핵심 포인트 | 고객이 얻는 것 | 지금 방식이라면 |
|---|---|---|
| ① 축을 바꿔도 갈라지지 않는 큐브 | 매입월 · 거래은행 · 결제 방식 · 제품 그룹 · 고객 · 국가 등 11개 차원을 끌어다 놓아 행 3단계 · 열 2단계로 봅니다. 표 · 차트 · 요약이 한 번 읽은 같은 큐브에서 나와 합계가 어긋날 자리가 없습니다. | 은행별 · 고객별 · 결제 방식별 리포트를 따로 만들고, 합계가 다르면 리포트를 맞추는 회의를 엽니다. |
| ② 칸에서 네고 문서 라인까지 | 표의 칸을 누르면 그 금액을 만든 청구 · 네고 문서 라인이 열리고, 칸 금액과 원천 합계가 같은지 그 자리에서 보입니다. | 리포트를 닫고 VF03 · FBL3N 을 다시 열어 조건을 손으로 맞추고 건건이 합산합니다. |
| ③ 환가료가 따로 보인다 | 은행이 먼저 내준 돈에 붙는 환가료를 매입액 · 환가 일수 · 환가료율로 계산해 수수료와 갈라 보여 줍니다. 검증용 샘플에서 환가료는 10,989백만원으로 총 은행 비용의 78%입니다. | 은행 비용이 한 계정에 섞여 있어 이자 성격의 비용과 수수료를 따로 가늠하지 못합니다. |
| ④ 총차이를 아홉 요인으로 | 매입 건수 · 건당 매입액 · 환가 일수 · 환가료율 · 하자 발생 비율 · 하자 건당 수수료 · 수수료율 · 미계획 매입 · 계획 미이행으로 가르고, 합이 총차이와 같은지 매번 검산합니다. | 엑셀로 밤새 분해하고 합계가 총차이와 맞는지 다시 손으로 맞춥니다. |
| ⑤ 차이 사유가 행에 남는다 | 사유는 조회 범위와 행 경로에 묶여 저장되어 축을 바꿔도, 다시 열어도 그 행에 따라옵니다. CSV 와 AI 근거 표에도 함께 실립니다. | 같은 질문을 매달 다시 하고, 지난달 답은 메일함에서 찾습니다. |
| ⑥ 사람이 열지 않아도 도는 감시 | 감시 규칙 5개에 임계값과 받을 역할(CEO · CFO · 영업 · 자금)이 붙어 있습니다. 걸린 항목은 역할별 대기함에 올라가고 하루 한 번 제한은 서버가 판정합니다. | 은행 비용이 늘어난 날 아무도 화면을 열지 않으면 그대로 지나갑니다. |
| ⑦ 보고서와 AI 해설까지 한 화면에서 | 지금 범위의 표와 차트를 담은 PowerPoint 보고서가 브라우저에서 바로 만들어집니다. AI 는 서비스가 계산한 숫자를 읽어 설명만 하고, 넘긴 근거 표를 펼쳐 볼 수 있습니다. | 화면을 캡처하고 숫자를 옮겨 적어 보고서를 다시 만들며, AI 가 만든 숫자를 써도 되는지부터 따져야 합니다. |
사례로 보는 효과 — 계획보다 237백만원 늘어난 은행 비용의 요인
검증용 샘플에서 총 은행 비용은 계획 13,802백만원, 실적 14,040백만원으로 총차이가 +237백만원(+1.7%) 였습니다. 합계만 보면 “조금 늘었다”에서 끝납니다. 아홉 요인으로 가르자 미계획 매입(+327백만원) 이 가장 크고, 계획했지만 이행되지 않은 매입은 −83백만원으로 차이를 줄이고 있었습니다. 서로 반대로 움직이는 두 요인이 합계 안에서 상쇄되고 있었다는 뜻입니다.
이야기 요소도 심어 두었습니다. 샘플의 E은행은 7월부터 환가료율이 0.32%p 올랐고, C은행은 6월부터 서류 하자 건당 수수료가 14% 올랐습니다. 거래은행 × 월 축으로 놓으면 이 두 은행이 어느 달부터 계획에서 벌어졌는지가 표에서 바로 보이고, 요인분해에서는 각각 환가료율 요인과 하자 건당 수수료 요인이 커집니다. 서류 하자 수수료는 실적 99백만원으로 계획 57백만원의 1.7배, 전신료는 295백만원으로 계획 239백만원보다 많았습니다. 이 숫자는 원인을 확정하지 않으며, 어디를 먼저 점검할지와 어떤 사유를 남길지를 정하는 단서입니다.
행 한 줄(은행 · 결제 방식 조합)마다
총 은행 비용 T = N·a·r·d/360 + N·a·c + N·σ·f + N·k
N 매입 건수 · a 건당 매입액 · r 환가료율(연 %) · d 환가 일수 · c 수수료율 · σ 하자 발생 비율 · f 하자 건당 수수료 · k 건당 전신료. 한 요인씩 계획 값을 실적 값으로 바꾸어 가면 마지막에 실적 T 와 같아지므로 요인의 합은 총차이와 정확히 같습니다.
분해에는 조건을 걸었습니다. 요인 합계와 총차이가 1원이라도 어긋나면 화면이 오류로 표시합니다. 같은 조합이 계획과 실적 한쪽에만 있으면 억지로 나누지 않고 미계획 매입 · 계획 미이행으로 따로 세웁니다. 회의에서 “이 숫자 맞아?”라는 질문에 바로 답할 수 있다는 뜻입니다.
도입하면 달라지는 것
- 회의의 주제 — “어느 리포트 숫자가 맞나”가 아니라 “어느 은행 · 어느 결제 방식에서 계획이 벌어졌나”를 이야기합니다.
- 분석 준비 — 차이 표 · 요인분해 · 사유 · 보고서가 한 화면에서 나와 엑셀 취합과 화면 캡처가 줄어듭니다.
- 다음 달로 이어지는 기록 — 사유와 레이아웃이 남아 매달 같은 설명을 처음부터 다시 하지 않습니다.
- 놓치지 않는 점검 — 화면을 열지 않은 날에도 규칙에 걸린 항목은 받을 역할의 대기함에 올라갑니다.
이런 회사에 맞습니다
신용장 네고 · 서류인도 · 서류지급 방식을 섞어 수출 대금을 회수하고 거래은행이 여러 곳인 제조 · 유통 회사, 환가 일수와 서류 하자 때문에 은행 비용이 계획과 벌어지는 일이 잦은 자금 · 수출 담당 조직, 그리고 수출 은행 비용을 월 단위로 계획과 견주어 경영진에 설명해야 하는 경영지원 조직에 맞습니다. 거래 통화가 여러 개여도 통화별로 나누어 대사합니다.
실행 화면
사용 방법
- 조회조건 입력 — 회사코드(필수, 기본 1000)와 시작 · 종료 기간(필수, 기본 2026-01 ~ 2026-09)을 정합니다. 비교 기준은 은행 비용 계획 버전으로 고정돼 있어 바꿀 수 없습니다.
- 조회 — 조회 버튼은 조회조건 영역의 오른쪽 끝에 있고 입력칸에서 Enter 를 눌러도 됩니다. 조회는 큐브를 한 번 읽는 동작이며 이후 축을 바꿔도 다시 읽지 않습니다.
- 요약 확인 — “집계 N건 · 원천 N줄”으로 읽은 규모를 보고, 역할(CEO · CFO · 영업 책임자 · 자금 책임자)을 바꿔 앞세우는 지표를 확인합니다.
- 축과 항목 정하기 — 레이아웃 보드에서 차원 칩을 끌어 행 · 열 · 사용 안 함 칸에 놓습니다. 행은 최대 3단계, 열은 최대 2단계입니다.
- 표 읽기 — 행의 화살표로 아래 차원으로 내려가고, 기준 대비를 켜면 칸마다 계획 · 차이 · 증감률이 붙습니다.
- 필터 — 필터 버튼 줄에서 차원 값을 여러 개 고릅니다. 같은 차원 안은 or, 차원 사이는 and 입니다.
- 칸 · 행 클릭 상세 — 칸을 누르면 원천 문서 라인이 열립니다. 차이가 난 행에서는 변동 사유 버튼으로 사유를 남깁니다.
- 분석 도구 — 상단 버튼은 레이아웃 → AI 분석 → AI 에이전트 → 기간별 요약 → CSV 순서입니다. 보고서(PowerPoint)는 AI 분석 창에서 내려받습니다.
- 내보내기 — 지금 표의 행 · 열 · 항목 그대로 CSV 로 저장합니다.
- 자동 조회 — 기본 레이아웃에 자동 조회를 지정해 두면 화면을 여는 순간 조회된 채 시작합니다.
무엇으로 만들었나
화면은 OpenUI5 표준 컨트롤로 만들고, 금액과 판정은 서비스가 계산합니다. 화면은 서비스가 준 숫자를 합산하고 배치만 합니다.
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 컨트롤 | OpenUI5 표준 컨트롤 — 피벗은 TreeTable, 필터와 대화상자는 표준 컴포넌트 | SAP 표준 화면 구성 요소를 그대로 써서 사내 보안 심사에서 새로 볼 것을 줄이기 위해 |
| 피벗 · 차트 | 브라우저 안 큐브 재집계와 직접 그린 SVG 차트 | 축을 바꿀 때 서버를 다시 부르지 않고, 외부 차트 라이브러리 없이 CDN 이 막힌 환경에서도 같은 화면이 나오게 하려고 |
| 집계 · 판정 로직 | 금액 · 비율 · 요인분해는 서비스 쪽에서 계산하고 화면은 합산과 배치만 합니다 | 화면마다 계산이 달라 숫자가 갈라지는 일을 막으려고 |
| OData 서비스 구성 | OData V2 모델 하나. 읽기 전용 집합(큐브 · 계획 · 차원 · 측정값 · 드릴스루 라인 · 검산)과 쓰기 집합(변동 사유 · 레이아웃 · 감시 규칙 임계값 · 대기함 · 활동 기록), 펑션 3종(요인분해 · 해설 · 에이전트 실행) | 운영 시스템으로 옮길 때 서비스 주소만 바꾸면 되도록 화면과 데이터 공급을 분리하려고 |
| 보고서 | 브라우저에서 zip · XML 로 PowerPoint 파일을 직접 만듭니다 | 서버에 파일을 남기지 않고, 외부 라이브러리 없이 현재 범위를 바로 내려받게 하려고 |
| 테마 · 접근성 | sap_horizon 테마, 키보드로 닫히는 대화상자 | SAP 표준 화면과 같은 모양과 조작감을 유지하려고 |
| 항목 | 내용 |
|---|---|
| 솔루션 | 수출 솔루션 |
| 업무 영역 | 수출 대금 회수 — 네고 · 추심 은행 비용 |
| 관련 기준서 · 대상 영역 | 관련 기준서 없음 · 대상 영역: 수출 은행 비용 분석 |
| SAP 표준 T-code | VA03 · VF03 · VX03N · FBL5N · FBL3N |
| Namespace | zui5.expbankfee |
| 화면 성격 | 업무 분석 — 다차원 분석 리포트 |
| 데이터 연동 | OData V2 (manifest dataSources) |
| 테마 | sap_horizon |
OData 서비스 이름은 소문자 expbankfee_srv 이고 엔티티셋 15개 · 펑션 3개로 구성됩니다. 앱 본체는 manifest 에 선언한 서비스만 바라보고, 샘플 데이터는 test/ 폴더 안에만 있습니다.
처음 열었을 때 — 조회 전에도 틀이 먼저 보입니다
조회조건 · 레이아웃 보드 · 피벗 틀은 조회 전부터 보입니다. 조회 한 번으로 큐브를 읽고 나면 축을 바꿔도 서버를 다시 부르지 않습니다.

회사코드와 시작·종료 기간만 정하면 되고, 기본값은 회사코드 1000 · 2026-01 ~ 2026-09 입니다. 쓰지 않는 차원 9개가 왼쪽 칸에, 행 축에는 제품 그룹 › 거래은행이 올라 있습니다. 아직 조회 전이라 표는 비어 있고 안내 문구만 보입니다. 조회 버튼은 조회조건 영역의 오른쪽 끝에 있고 Enter 로도 조회됩니다.

집계 1,237건(원천 7,734줄)을 한 번 읽어 표 · 오른쪽 차트 · 상단 지표 4개를 그립니다. 총 은행 비용은 14,040백만원, 은행 비용률은 청구액 대비 0.72%, 네고·추심 수수료는 2,656백만원입니다. 각 숫자 아래 작은 글씨는 계획 값과 대비입니다.

거래은행을 열 축으로 옮긴 모습입니다. 총합은 그대로이고 열 머리글만 은행별로 바뀝니다. 이 동작은 네트워크 요청이 0건이며 브라우저에 올라온 큐브를 다시 묶는 것입니다.

표와 차트에 더 많은 공간을 주고 싶을 때 머리 영역을 접습니다. 접힌 줄에는 회사코드 · 기간 · 행 · 열 · 항목 수가 남아 지금 보고 있는 범위를 잊지 않게 합니다.
경영 요약 — 역할이 바뀌면 보는 숫자가 바뀝니다
역할은 CEO · CFO · 영업 책임자 · 자금 책임자 네 가지이고, 앞세우는 지표와 기본으로 쪼개 보는 차원이 달라집니다. 역할을 바꿔도 다시 조회하지 않습니다.

CFO 는 월별로 은행 비용이 어떻게 흘렀는지를 봅니다. 표는 매입월 단위로 풀리고, 지표는 총 은행 비용 · 환가료 · 네고·추심 수수료 · 서류 하자 수수료입니다.

영업 책임자는 은행 비용이 어느 고객 · 국가에서 크게 나가는지를 봅니다. 매입 1건당 은행 비용과 서류 하자 발생 비율이 지표입니다.

자금 책임자는 돈을 앞당겨 받는 비용을 봅니다. 평균 환가 일수와 환가료 연 환산율이 지표이고, 표는 거래은행 › 결제 방식입니다.
축 전환과 범위 — 은행 · 결제 방식 · 고객을 끌어다 놓습니다
차원 칩을 끌어 행 · 열 · 사용 안 함 칸에 놓습니다. 행은 최대 3단계, 열은 최대 2단계이며 열 조합이 36개를 넘으면 안내하고 막습니다.

제품 그룹 아래로 거래은행이 펼쳐진 표입니다. 집계 행의 값은 아래 행의 합과 같고, 소계가 어긋나지 않는지는 검증 단계에서 차원별 43건을 따로 대사했습니다.

열에 두 차원을 쌓은 모습입니다. 열 조합 수는 36개를 넘을 수 없고, 열 축에 차원이 있으면 분석 항목은 첫 항목만 펼쳐 보입니다.

필터 버튼 줄에서 차원을 누르면 값 목록이 열립니다. 이름과 코드, 원천 라인 수가 함께 보여 어느 값이 큰지 알고 고를 수 있습니다.

같은 차원 안에서는 or, 차원 사이에서는 and 로 걸립니다. 필터가 걸린 표와 차트와 요약이 같은 범위로 줄어듭니다.

표와 차트 사이 손잡이를 끌어 너비를 바꿉니다. 바꾼 너비는 브라우저가 기억합니다.
칸에서 원천 문서까지 — 숫자의 출처를 바로 봅니다
칸을 누르면 그 금액을 만든 원천 네고 문서 라인이 열리고, 위쪽 줄이 칸 금액과 원천 합계가 같은지 알려 줍니다.

칸의 행 경로와 열 조합이 그대로 질의 조건이 되어 청구 문서 · 품목 단위 라인이 열립니다. 위쪽에 칸 금액과 원천 합계가 일치한다는 줄이 뜨고, 라인에는 매입액 · 환가 일수 · 환가료율 · 환가료 · 수수료가 보입니다.

기간별 요약 대화상자는 월별 건수와 총 은행 비용의 실적 · 계획을 한 표로 보여 줍니다.
계산항목 — 전기되지 않는 비율과 단가를 행으로
비율과 단가는 전표에 없으므로 계산항목으로 만들어 행에 올립니다. 분자와 분모를 먼저 합산한 뒤 나눠 소계에서도 맞습니다.

계산항목을 열로 놓은 표입니다. 평균 환가 일수는 매입액 가중 평균이고, 환가료 연 환산율은 환가료를 매입액 × 일수로 나눠 연 기준으로 바꾼 값입니다.

단계 보기는 총 은행 비용을 구성 항목으로 풀어 한 열에 세로로 보여 줍니다. 어느 구성이 합계를 키웠는지 한눈에 봅니다.
계획 대비 차이 — 같은 표가 은행 비용 회의 자료가 됩니다
기준 대비 스위치를 켜면 칸마다 실적 · 계획 · 차이 · 증감률이 붙습니다. 금액 임계와 증감률 임계를 둘 다 넘을 때만 색을 칠합니다.

칸 안에 기준 값과 차이, 증감률이 작은 글씨로 붙습니다. 비용이 늘어난 칸은 빨강, 줄어든 칸은 초록입니다.

차이가 난 행의 사유 버튼을 누르면 사유 구분과 내용을 적는 창이 열립니다. 사유는 조회 범위와 행 경로를 키로 저장됩니다.

저장한 행에는 표시가 붙고, 축을 바꾸거나 다시 열어도 같은 행에 따라옵니다. CSV 와 AI 근거 표에도 함께 실립니다.

선택한 행의 계획에서 실적까지를 아홉 요인으로 이은 워터폴입니다. 요인 합계와 총차이를 대조한 검산 줄이 함께 보이며, 어긋나면 오류로 표시합니다.
AI 분석과 보고서 — 같은 숫자를 읽고 설명합니다
AI 는 서비스가 계산한 숫자를 읽어 설명만 합니다. 기본은 규칙 기반 해설이며 외부 모델 연결은 꺼진 채 시작합니다.

현재 범위의 요약과 핵심 발견을 쓰고, 해설이 읽은 근거 표를 펼쳐 볼 수 있습니다. 숫자를 새로 만들지 않고 서비스가 준 값만 인용합니다.

보고서 버튼을 누르면 브라우저가 현재 범위의 표와 차트를 담은 .pptx 파일을 직접 만들어 내려받습니다. 서버에 파일을 남기지 않습니다.
AI 에이전트 — 감시 규칙과 대기함
사람이 화면을 열지 않아도 규칙에 걸린 항목을 받을 역할의 대기함에 올립니다.

규칙은 5개입니다: 총 은행 비용 계획 차이 금액, 은행 비용률 상한, 평균 환가 일수 상한, 환가료 연 환산율 상한, 서류 하자 수수료 금액. 임계값과 사용 여부는 바꿀 수 있습니다.

대기함의 보고는 받을 역할 · 규칙 · 대상 행 경로 · 금액을 담습니다. 행 경로로 이동해 해당 칸을 바로 점검합니다.

같은 날 두 번째 실행 요청은 서버가 건너뜀으로 판정하고, 사유와 첫 실행 번호를 기록합니다. 화면은 이를 안내 토스트로 보여 줍니다.
레이아웃 저장과 복원
축 · 조회조건 · 항목 · 접힘 상태를 이름 붙여 저장하고 기본 레이아웃과 자동 조회를 지정합니다.

이름을 붙여 저장하고, 기본으로 쓸지와 열 때 자동 조회할지를 고릅니다.

저장한 레이아웃 목록에서 기본 지정을 바꾸거나 삭제합니다.

자동 조회를 지정해 두면 화면을 여는 순간 저장한 축으로 조회된 채 시작합니다.
좁은 화면과 한계 — 표를 반쯤 그리지 않습니다
좁은 화면에서는 차트가 표 아래로 내려가고, 열 조합이 한도를 넘으면 안내하고 막습니다.

폭 390px 에서는 조회조건과 레이아웃 보드가 세로로 쌓입니다.

차트가 표 오른쪽에서 아래로 내려오고 표는 가로로 스크롤됩니다.

열 조합이 36개를 넘으면 안내 문구를 띄우고 표를 반쯤 그리지 않습니다. 행 노드 500개 초과도 같습니다.
화면 뒤에서 일어나는 일
금액과 비율은 모두 서비스가 계산합니다. 아래는 화면이 색을 칠하고 검산하고 감시하는 규칙입니다. 임계값은 검증용 샘플에서 정한 가정값입니다.
칸 색칠 · 검산 · 감시 판정 로직
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 비용 항목에서 계획 대비 증가가 2,000만원 이상이고 증감률도 3% 이상(비율 항목은 0.05%p 이상) | 빨강 — 점검 필요 | 행의 변동 사유 버튼으로 사유를 남기거나 요인분해에서 원인 요인을 확인 |
| 같은 조건에서 비용이 감소 | 초록 — 유리한 차이 | 계획 미이행 · 건수 감소 여부를 확인 |
| 금액과 비율 중 하나만 임계를 넘음 | 색 없음 | 숫자만 확인 |
| 요인 합계와 총차이가 1원 이상 다름 | 검산 줄 오류 표시 — 확인 필요 | 범위 · 필터를 확인하고 서비스 담당자에게 문의 |
| 칸 금액과 드릴스루 합계가 다름 | 경고 줄 — 확인 필요 | 조회 범위와 질의 조건 확인 |
| 열 조합 36개 초과 또는 행 노드 500개 초과 | 안내 문구 · 표 생략 | 열 · 행 차원을 줄이거나 필터로 범위를 좁힘 |
| 감시 규칙 R1 ~ R5 임계 도달 | 대기함에 보고 등록(받을 역할별) | 대기함 보고의 행 경로로 이동해 점검 |
| 같은 날 두 번째 에이전트 실행 | 하루 한 번 제한으로 건너뜀 | 활동 기록의 첫 실행 번호 확인 |
산출식과 대사식
| 순서 | 식 | 설명 |
|---|---|---|
| ① | 환가료 = 매입액 × 환가료율(연 %) × 환가 일수 ÷ 360 | 원천 라인(청구 품목)마다 계산 |
| ② | 네고 · 추심 수수료 = 매입액 × 수수료율(최저 금액 적용) | 수수료율 · 최저 금액은 가정값 |
| ③ | 서류 하자 수수료 = 하자 건수 × 건당 수수료 | 하자가 난 매입 건에만 부과 |
| ④ | 전신료 · 우편료 = 건당 고정액 | 가정값 |
| ⑤ | 총 은행 비용 = 환가료 + 수수료 + 하자 수수료 + 전신료 | 대사식 — 원천 라인 7,734줄 전수 |
| ⑥ | 은행 비용률 = 총 은행 비용 ÷ 청구액(원화) × 100 | 계산항목 |
| ⑦ | 평균 환가 일수 = Σ(매입액 × 일수) ÷ Σ 매입액 | 분자 · 분모를 먼저 합산 |
| ⑧ | 환가료 연 환산율 = 환가료 × 360 ÷ Σ(매입액 × 일수) × 100 | 계산항목 |
조회조건
| 조건 | 필수 | 기본값 | $filter 로 변환 |
|---|---|---|---|
| 회사코드 | 필수 | 1000 | Bukrs eq '1000' |
| 시작 기간 | 필수 | 2026-01 | Period ge '2026-01' |
| 종료 기간 | 필수 | 2026-09 | Period le '2026-09' |
| 비교 기준(계획 버전) | 고정 | BNK26 | Version eq 'BNK26' (PlanSet) |
| 드릴스루 질의 | 자동 | 칸의 행 경로 + 열 조합 | ItemSet?$filter=... · $top=500 · $skip |
결과 컬럼
| 항목 | 의미 | 단위 |
|---|---|---|
| 총 은행 비용 | 환가료 · 네고·추심 수수료 · 서류 하자 수수료 · 전신료의 합 | 원(표는 백만원) |
| 환가료 · 네고·추심 수수료 | 은행이 먼저 내준 돈에 붙는 이자와 취급 수수료 | 원 |
| 서류 하자 수수료 · 전신료 | 하자 건수와 건당 고정 비용 | 원 |
| 청구액(원화) | 수출 청구 금액의 원화 환산 | 원 |
| 계산항목 6종 | 은행 비용률 · 매입 1건당 은행 비용 · 평균 환가 일수 · 환가료 연 환산율 · 수수료 비중 · 하자 발생 비율 | % · 원 · 일 |
| 요인 9종 | 매입 건수 · 건당 매입액 · 환가 일수 · 환가료율 · 하자 발생 비율 · 하자 건당 수수료 · 수수료율 · 미계획 매입 · 계획 미이행 | 원 |
좁은 화면에서 달라지는 것
폭이 좁아지면 조회조건과 레이아웃 보드가 세로로 쌓이고 차트는 표 아래로 내려갑니다. 표는 가로로 스크롤되며, 열 조합이 한도를 넘으면 표를 반쯤 그리지 않고 안내합니다.
파일 구성
(앱 폴더)
├─ index.html · Component.js · manifest.json
├─ controller/ BaseController.js · Main.controller.js
├─ view/ Main.view.xml · fragments/ (조회 · 사유 · AI · 에이전트 · 레이아웃 · 필터 대화상자)
├─ model/ cube.js(피벗) · chart.js(SVG 차트) · pptx.js(보고서) · layout.js · formatter.js · ErrorHandler.js
├─ css/ · i18n/
├─ odata/expbankfee_srv/ metadata.xml · service.js · engine.js · json/
├─ media/ intro.mp4 · intro_poster.jpg · intro_chapters.vtt
├─ test/ 검증 전용 — 샘플 데이터로 화면을 띄우는 진입점
└─ readme.html
SAP 표준 기능 확장 포인트 — 표준 T-code 와 어떻게 연계되는지
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회 · 검증 관점을 더해 확장합니다. 그래서 운영으로 옮긴 뒤에도 기존 표준 리포트를 없앨 필요가 없고, 법정 · 감사 · 신고 대응에 쓰던 화면은 그대로 둔 채 이 앱을 분석과 월간 회의용으로 병행합니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | SAP 표준 | 이 앱이 더하는 관점 |
|---|---|---|
| 판매오더 · 청구 문서의 조회 · 변경 | VA03 · VF03 으로 충분합니다. 문서 하나를 열어 조건 · 수량 · 금액을 봅니다. | 문서 수천 건을 거래은행 · 결제 방식으로 묶어 계획과 견주는 일은 문서 화면 하나로는 끊깁니다. |
| 신용장 · 서류 관련 금융 문서 | VX03N 으로 금융 문서를 조회합니다(구성에 따라 확인 필요). | 이 앱은 금융 문서 자체를 바꾸지 않고, 은행 비용을 집계해 보여 주기만 합니다. |
| 고객 미수 · 수금 | FBL5N 이 담당합니다. | 이 앱은 은행에서 대금을 받은 이후 단계를 읽지 않습니다. |
| 은행 수수료 · 이자 비용 전표 | FBL3N 으로 G/L 계정 개별 항목을 봅니다. | 이 앱의 합계와 전표 합계를 계정 단위로 맞춰 보는 대사 지점이 됩니다. |
| 계획 대비 은행 비용의 요인 분해 | 표준 화면에는 같은 방식의 요인분해가 정의돼 있지 않아 보통 엑셀로 만듭니다(확인 필요). | 아홉 요인으로 가르고 합이 총차이와 같은지 검산합니다. |
| 차이 사유와 감시 | 표준 문서의 적요 · 배치 잡으로 일부 가능합니다. | 집계 행에 사유를 남기고, 규칙에 걸린 항목을 받을 역할의 대기함에 올립니다. |
T-code 별 연계 지점
| T-code | 이름 | 연계 — 같은 데이터 · 대사 지점 · 오가는 방법 · 표준에 남길 일 |
|---|---|---|
| VA03 | 판매오더 조회 | 드릴스루 라인의 판매오더 번호 · 인코텀즈 · 결제 조건이 판매오더 헤더 · 품목(VBAK · VBAP)과 같은 필드에서 옵니다. 이 앱 라인 → VA03 에서 오더 조건을 확인하고, 오더 조건이 바뀌면 이 앱에서 다시 조회합니다. 어떤 결제 조건이 어떤 결제 방식(네고 · 추심)에 해당하는지는 회사의 기준을 따르며 이 앱은 단정하지 않습니다. |
| VF03 | 청구 문서 조회 | 청구 금액 · 통화 · 청구일은 VBRK · VBRP 와 같은 필드입니다. 이 앱 칸의 청구액과 VF03 청구 문서의 금액을 문서 단위로 맞춰 보는 것이 가장 기본적인 대사입니다. 법정 청구 처리는 VF03 · 표준 청구 프로세스에 그대로 둡니다. |
| VX03N | 금융 문서 조회 | 신용장 · 서류 상태가 필요할 때 이 앱의 결제 방식 · 매입일과 같은 문서를 열어 상태를 확인합니다. 금융 문서의 구성은 회사마다 달라 어느 필드가 거래은행 · 매입일인지는 도입 때 확인해야 합니다(확인 필요). |
| FBL5N | 고객 개별 항목 | 이 앱은 대금 입금 이후 상태를 읽지 않습니다. 고객별 미수 · 수금 현황은 FBL5N 에서 확인하고, 이 앱의 고객 차원 값과 같은 고객 코드로 이어서 봅니다. |
| FBL3N | G/L 계정 개별 항목 | 은행 수수료 · 이자 비용 계정의 전표를 기간 · 은행별로 합산해 이 앱의 환가료 + 수수료 합계와 견줍니다. 차이가 나면 계정 매핑 또는 전기 시점 차이를 먼저 의심합니다. 어느 계정에 전기하는지는 회사의 계정 설계를 따릅니다(확인 필요). |
정리하면 이 앱 결과의 숫자가 의심스러울 때는 칸 → 원천 라인 → 문서 번호 → 해당 표준 T-code 순서로 내려가고, 표준 화면의 값을 이 앱에서 다시 보려면 같은 문서의 청구일 · 고객 · 거래은행으로 조회 범위를 좁힙니다.
S/4HANA 분석 스택과의 자리
| 대상 | 관계 |
|---|---|
| 표준 CDS 분석 쿼리 · Fiori 분석 앱 | 청구 문서나 G/L 전표를 집계하는 표준 분석 앱이 있다면 같은 문서를 다른 방식으로 봅니다. 구체적인 앱 이름은 확인하지 못해 싣지 않았습니다(확인 필요). |
| Analysis for Office | 표준 분석 쿼리를 엑셀로 가져와 쓰는 방식입니다. 이 앱의 CDS 쿼리를 같은 방식으로 노출할 수도 있습니다. |
| 이 앱이 서는 자리 | 큐브 하나를 브라우저에서 다시 묶는 방식이라, 분석 앱이 정한 축 밖에서 “은행 · 결제 방식 · 고객”을 자유롭게 바꾸고 계획 대비 차이를 사유와 함께 남기는 쪽을 맡습니다. |
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 무엇을 바꾸나 | 바꿔도 그대로인 것 |
|---|---|---|
| 은행 약정 기준 테이블 | 은행 · 결제 방식별 환가료율 · 수수료율 · 최저 수수료 · 전신료 · 하자 수수료 | 화면 코드 · 큐브 구조 |
| 매입 품목 뷰의 매핑 | 거래은행 · 결제 방식 · 매입일 · 만기까지 일수를 어느 필드에서 가져올지 | 차원 이름 · 요인 산식 |
| 계획 뷰 | 계획 값의 원천과 버전 | 실적 큐브 |
| 감시 규칙 임계값 | 규칙 5개의 임계값 · 받을 역할 · 사용 여부(서비스 데이터로 변경) | 규칙 판정 로직 |
| AI 모델 연결 | 서비스 설정으로만 켭니다(기본 꺼짐) | 숫자는 항상 서비스가 계산 |
분석 지표 정의
| 지표 | 정의 | 쓰는 곳 | 비고 |
|---|---|---|---|
| 총 은행 비용 | 환가료 + 수수료 + 하자 수수료 + 전신료 | 피벗 · 차트 · 드릴스루 | 요율은 가정값 |
| 은행 비용률 | 총 은행 비용 ÷ 청구액(원화) × 100 | 계산항목 · 감시 규칙 R2 | 분자 · 분모를 먼저 합산 |
| 평균 환가 일수 | Σ(매입액 × 일수) ÷ Σ 매입액 | 계산항목 · 감시 규칙 R3 | 일수 기준은 확인 필요 |
| 환가료 연 환산율 | 환가료 × 360 ÷ Σ(매입액 × 일수) × 100 | 계산항목 · 감시 규칙 R4 | 360일 기준은 가정값 |
| 서류 하자 수수료 | 하자 건수 × 건당 수수료 | 피벗 · 감시 규칙 R5 | 하자 사유는 단정하지 않음 |
| 총차이 요인 | 순차 대체 9요인, 합 = 총차이 | 워터폴 · 요인분해 펑션 | 원인을 단정하지 않음 |
CDS 구성 — 뷰 · 코드 · 운영 작업까지
아래 코드는 운영 시스템에 옮길 때의 출발점으로 쓰는 스케치입니다. 표준 데이터 구조(청구 · 판매오더 문서)를 그대로 읽고, 회사마다 달라지는 지점은 “확인 필요”로 표시했습니다.
뷰 레이어 구성
| 레이어 | 뷰 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 | 은행 약정 기준 테이블 | 환가료율 · 수수료율 · 전신료 같은 기준값을 코드가 아니라 데이터로 둡니다 | 은행 약정이 바뀔 때 뷰를 고치지 않으려고 |
| 기본 | 네고 품목 뷰 | 청구 · 오더를 한 줄로 합쳐 라인마다 환가료 · 수수료를 파생합니다 | 모든 집계가 같은 라인에서 출발하게 하려고 |
| 차원 | 거래은행 · 결제 방식 등 차원 뷰 | 텍스트 · 값 도움말을 제공합니다 | 필터와 레이아웃 보드의 값 목록을 같은 곳에서 읽으려고 |
| 큐브 | 실적 큐브 | 차원 조합별로 합계를 만듭니다(통화 환산 포함) | 화면이 한 번에 읽는 단위를 작게 하려고 |
| 계획 | 계획 뷰 | 같은 차원 조합으로 계획 값을 맞춥니다 | 실적과 계획을 같은 축에서 견주려고 |
| 쿼리 | 분석 쿼리 | UI 주석 · 필터 · 분석 세부 설정 | 분석 도구가 읽는 입구를 하나로 하려고 |
| 권한 | 접근 제어(DCL) | 판매 조직 표준 권한을 집계에 겁니다 | 전사 합계로 남의 숫자가 새는 일을 막으려고 |
| 서비스 | 서비스 정의 · 바인딩 | OData V2 로 게시합니다 | 화면이 부르는 주소를 한 곳에서 관리하려고 |
① 은행 약정 기준 테이블 — 환가료율과 수수료율을 정하는 곳
은행 비용은 약정이 정합니다. 환가료율 · 수수료율 · 최저 수수료 · 전신료를 뷰 안에 숫자로 박아 두면 약정이 바뀔 때마다 뷰를 고쳐 이송해야 하므로 테이블로 뺍니다. 샘플은 가정값이며, 운영에서는 은행과 맺은 약정을 넣습니다.
@EndUserText.label : '수출 은행 약정 기준'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zebf_bankterm {
" ─────────────────────────────────────────────────────────────
" ZEBF_BANKTERM — 거래은행 · 결제 방식별 약정 요율
" 이렇게 나눈 이유: 요율은 은행과 회사가 정하는 값이라 코드가 아니라 데이터로 둔다.
" ─────────────────────────────────────────────────────────────
key client : abap.clnt not null;
key bank : abap.char(10) not null; " 거래은행 코드
key instr : abap.char(3) not null; " LCN 신용장 네고 · DAB 서류인도 · DPB 서류지급
key valid_from: abap.dats not null;
disc_rate : abap.dec(7,4); " 환가료율(연 %)
comm_rate : abap.dec(7,4); " 네고 · 추심 수수료율(%)
min_comm : abap.dec(13,2); " 최저 수수료
cable_fee : abap.dec(13,2); " 전신 · 우편료(건당)
dscr_fee : abap.dec(13,2); " 서류 하자 수수료(건당)
waers : abap.cuky;
}
② 네고 품목 뷰 — 라인마다 환가료와 수수료를 파생하는 기본 뷰
모든 집계는 이 뷰의 한 줄(청구 품목)에서 출발합니다. 청구 헤더 · 품목과 판매오더를 연결하고 약정 기준표를 붙여 라인마다 환가료 · 수수료 · 하자 수수료 · 전신료를 만듭니다. 거래은행 · 결제 방식 · 매입일 · 만기까지 일수를 어느 필드에서 가져올지는 회사 구성에 따르므로 주석에 확인 필요로 남겼습니다.
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '수출 네고 품목(은행 비용 관점)'
@ObjectModel.usageType: { serviceQuality: #X, sizeCategory: #XXL, dataClass: #TRANSACTIONAL }
define view entity ZI_ExportBankFeeItem
as select from vbrp
inner join vbrk on vbrk.vbeln = vbrp.vbeln
left outer join zebf_bankterm as _t
on _t.bank = vbrp.zz_bank " 확인 필요 — 거래은행 필드
and _t.instr = vbrp.zz_instr " 확인 필요 — 결제 방식 필드
{
" ─────────────────────────────────────────────────────────────
" ZI_ExportBankFeeItem — 청구 품목 한 줄 = 매입(네고 · 추심) 한 줄
" 이렇게 나눈 이유: 큐브 · 계획 · 쿼리가 모두 같은 라인에서 출발해야 합계가 갈라지지 않는다.
" ─────────────────────────────────────────────────────────────
key vbrp.vbeln as BillDoc,
key vbrp.posnr as Item,
vbrk.fkdat as BillDate,
vbrp.zz_negdate as NegDate, " 매입일 — 확인 필요
vbrk.kunag as Customer,
vbrk.inco1 as Incoterms,
vbrp.matkl as ProdGroup,
vbrp.aubel as SoDoc,
vbrk.waerk as Currency,
vbrp.zz_bank as Bank,
vbrp.zz_instr as Instr,
vbrp.zz_days as Days, " 매입일부터 회수 예정일까지 일수
@Semantics.amount.currencyCode: 'Currency'
vbrp.netwr as FcValue,
vbrp.zz_negamt_krw as NegAmt, " 매입액(원화)
_t.disc_rate as DiscRt,
cast( vbrp.zz_negamt_krw * _t.disc_rate / 100 * vbrp.zz_days / 360
as abap.dec(15,0) ) as Disc, " 환가료
cast( greatest( vbrp.zz_negamt_krw * _t.comm_rate / 100, _t.min_comm )
as abap.dec(15,0) ) as Comm, " 네고 · 추심 수수료
cast( case when vbrp.zz_dscr_flag = 'X' then _t.dscr_fee else 0 end
as abap.dec(15,0) ) as Dscr, " 서류 하자 수수료
cast( _t.cable_fee as abap.dec(15,0) ) as Cable " 전신료
}
where vbrk.fkart = 'F2' " 청구 유형 — 수출 청구 유형은 회사 정함, 확인 필요
③ 차원 뷰 — 거래은행 · 결제 방식의 값과 텍스트
레이아웃 보드와 필터가 보여 주는 값 목록은 차원 뷰가 줍니다. 값과 텍스트를 한 곳에서 내려 주면 화면의 값 도움말, 큐브의 그룹 기준, 쿼리의 필터가 같은 목록을 바라봅니다.
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '수출 은행 비용 차원 — 거래은행'
@Search.searchable: true
define view entity ZI_ExportBankFeeBankDim
as select distinct from ZI_ExportBankFeeItem
{
@ObjectModel.text.element: ['BankName']
key Bank as Bank,
@Search.defaultSearchElement: true
@Semantics.text: true
cast( Bank as abap.char(40) ) as BankName " 은행 이름은 은행 마스터에서 — 확인 필요
}
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '수출 은행 비용 차원 — 결제 방식'
define view entity ZI_ExportBankFeeInstrDim
as select distinct from ZI_ExportBankFeeItem
{
key Instr as Instr,
case Instr when 'LCN' then '신용장 네고'
when 'DAB' then '서류인도(D/A)'
when 'DPB' then '서류지급(D/P)' end as InstrName
}
④ 큐브 — 차원 조합별 합계와 통화 환산
큐브는 라인을 차원 조합으로 묶어 합계를 만듭니다. 화면은 이 결과를 한 번 읽어 브라우저에서 다시 묶으므로, 읽는 단위가 문서 수가 아니라 조합 수에 비례합니다.
@Analytics.dataCategory: #CUBE
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '수출 은행 비용 큐브(실적)'
define view entity ZI_ExportBankFeeCube
as select from ZI_ExportBankFeeItem
{
" ─────────────────────────────────────────────────────────────
" ZI_ExportBankFeeCube — 매입월 × 은행 × 결제 방식 × 제품 × 고객 × 인코텀즈
" 이렇게 나눈 이유: 합계는 여기서 한 번만 만든다. 화면 · 쿼리 · 보고서가 같은 값을 읽는다.
" ─────────────────────────────────────────────────────────────
key substring( NegDate, 1, 6 ) as Period,
key Bank, key Instr, key ProdGroup, key Customer, key Incoterms,
@DefaultAggregation: #SUM sum( Disc ) as Disc,
@DefaultAggregation: #SUM sum( Comm ) as Comm,
@DefaultAggregation: #SUM sum( Dscr ) as Dscr,
@DefaultAggregation: #SUM sum( Cable ) as Cable,
@DefaultAggregation: #SUM sum( Disc + Comm + Dscr + Cable ) as Total,
@DefaultAggregation: #SUM sum( NegAmt ) as NegAmt,
@DefaultAggregation: #SUM sum( NegAmt * Days ) as DayAmt, " 평균 환가 일수의 분자
@DefaultAggregation: #SUM count( * ) as Lines
}
group by substring( NegDate, 1, 6 ), Bank, Instr, ProdGroup, Customer, Incoterms
⑤ 계획 뷰 — 실적과 같은 차원 조합으로 맞춘 비교 기준
계획은 실적과 같은 차원 조합으로 맞춰야 칸마다 차이가 나옵니다. 어느 한쪽에만 있는 조합은 억지로 나누지 않고 미계획 매입 · 계획 미이행 요인으로 따로 세웁니다.
@Analytics.dataCategory: #CUBE
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '수출 은행 비용 계획'
define view entity ZI_ExportBankFeePlan
as select from zebf_plan " 계획 원천은 회사 정함 — 확인 필요
{
key version as Version, " 예: BNK26
key period as Period,
key bank as Bank, key instr as Instr,
key prodgrp as ProdGroup, key customer as Customer, key inco1 as Incoterms,
@DefaultAggregation: #SUM sum( plan_total ) as Total,
@DefaultAggregation: #SUM sum( plan_negamt ) as NegAmt,
@DefaultAggregation: #SUM sum( plan_lines ) as Lines
}
group by version, period, bank, instr, prodgrp, customer, inco1
⑥ 분석 쿼리 — 화면이 읽는 하나의 입구
화면과 분석 도구가 읽는 입구를 쿼리 하나로 모읍니다. 회사코드와 기간은 필수 변수로 두어 전체를 읽지 않게 합니다.
@Analytics.query: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '수출 은행 비용 분석'
define view entity ZC_ExportBankFeeQuery
as select from ZI_ExportBankFeeCube
{
@AnalyticsDetails.query.axis: #ROWS @AnalyticsDetails.query.display: #KEY_TEXT Bank,
@AnalyticsDetails.query.axis: #ROWS Instr,
@AnalyticsDetails.query.axis: #COLUMNS Total,
@AnalyticsDetails.query.axis: #COLUMNS Disc,
@AnalyticsDetails.query.axis: #COLUMNS Comm,
@Consumption.filter: { selectionType: #INTERVAL, mandatory: true } Period,
Customer, ProdGroup, Incoterms
}
⑦ 접근 제어(DCL) — 합계로 남의 숫자가 새지 않게
권한은 큐브 이전 단계인 기본 뷰에 겁니다. 드릴스루 라인에만 걸면 전사 합계에서 자기 몫을 빼는 방식으로 남의 숫자가 드러날 수 있기 때문입니다.
@EndUserText.label: '수출 은행 비용 — 판매 조직 권한'
@MappingRole: true
define role ZI_ExportBankFeeItem {
grant select on ZI_ExportBankFeeItem
where ( VKORG ) = aspect pfcg_auth( V_VBRK_VKO, VKORG, ACTVT = '03' );
" 판매 조직 표준 권한 오브젝트 — 회사 권한 설계에 따라 확인 필요
}
⑧ 서비스 정의와 바인딩 — 화면이 부르는 주소
쿼리와 차원 뷰를 서비스로 노출하고 OData V2 로 바인딩합니다. 화면은 manifest 의 서비스 주소만 알면 되므로, 운영으로 옮길 때 이 주소만 바꿉니다.
@EndUserText.label: '수출 은행 비용 분석 서비스'
define service ZUI_ExportBankFee {
expose ZC_ExportBankFeeQuery as CubeSet;
expose ZI_ExportBankFeePlan as PlanSet;
expose ZI_ExportBankFeeBankDim as BankDim;
expose ZI_ExportBankFeeInstrDim as InstrDim;
expose ZI_ExportBankFeeItem as ItemSet;
}
" 서비스 바인딩: OData V2 - UI, 이름 expbankfee_srv (소문자) — 활성화 후 manifest 주소 교체
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다. 아래는 정하지 않으면 막히는 순서대로 적었습니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 은행 약정 요율 | 은행 · 결제 방식별 환가료율 · 수수료율 · 최저 수수료 · 전신료 · 하자 수수료 | 은행 비용 합계가 은행 통보서 · 전표와 어긋납니다 | 자금 · 수출 |
| 거래은행 · 결제 방식 판정 필드 | 어느 필드가 거래은행 · 결제 방식(네고 · 서류인도 · 서류지급)인가 | 은행별 집계가 은행 자료와 맞지 않습니다 | 자금 · 수출 |
| 환가 일수 기준 | 매입일부터 무엇까지를 일수로 세는가, 연 환산 일수(360 · 365) | 환가료와 평균 환가 일수가 은행 계산과 달라집니다 | 자금 · 재무 |
| 하자 판정 | 어느 시점의 은행 통보를 하자로 보고 어느 필드에 남기나 | 하자 발생 비율과 하자 수수료 요인이 흔들립니다 | 수출 · 영업관리 |
| 비용 계정 매핑 | 환가료 · 수수료가 전기되는 계정과 전기 시점 | FBL3N 전표 합계와 맞출 수 없습니다 | 재무 · 회계 |
| 환율 유형 · 환산 시점 | 청구 통화를 원화로 바꾸는 환율과 시점 | 매입액 환산이 회계 전표와 어긋납니다 | 재무 |
| 계획 원천 확정 | 계획 값이 어디서 오고 버전은 무엇인가 | “계획이 왜 이 숫자냐”가 반복됩니다 | 기획 |
| 차원 범위 | 11개 차원 중 운영에서 쓸 것 | 나중에 늘리려면 뷰를 고쳐 다시 이송해야 합니다 | 현업 · IT |
| 권한 설계 | 판매 조직 · 회사코드 단위 권한 범위 | 전사 합계와 자기 몫의 차이로 남의 숫자가 드러납니다 | 보안 · 권한 |
| 성능 기준 | 조회 응답 시간과 최대 기간 | 대용량에서 화면이 기다림만 남깁니다 | IT |
| 대사 체계 | 표준 T-code 와 맞출 항목 · 주기 | 숫자가 맞는지 아무도 확인하지 않습니다 | 경영지원 · 회계 |
| 전송(TR) 순서 · 서비스 활성화 | 기준 테이블 → 뷰 → 쿼리 → 권한 → 서비스 순서, 서비스 게시와 manifest 서비스 주소 교체 | 서비스가 켜져도 권한 없이 열리거나 화면이 옛 주소를 봅니다 | Basis · IT |
| 배치 등록 | 에이전트 실행 주기(SM36 배치 등) | 사람이 화면을 열 때만 점검이 돕니다 | Basis · 자금 |
숫자를 믿을 수 있는가 — 검증 결과
검증용 샘플 전수에 대해 대사식을 돌렸고 차이는 모두 0건이며 의도적 예외는 없습니다. 도입 포인트의 사례와 같은 숫자입니다.
| 대사식 | 검사 건수 | 차이 건수 |
|---|---|---|
| 큐브 합계 = 원천 라인 합계 (총 은행 비용 · 청구액 · 환가료 · 수수료 · 하자 수수료 · 전신료 · 건수 · 매입액 등 12항목) | 12 | 0 |
| 환가료 + 수수료 + 하자 수수료 + 전신료 = 총 은행 비용 (실적 · 계획 · 원천 라인 합) | 3 | 0 |
| 요인 9종의 합 = 총차이 (실적 − 계획) | 1 | 0 |
| 외화 청구액 통화별 대사 (USD · EUR · JPY · CNY) | 4 | 0 |
| 원천 라인 항등식 (환가료 + 수수료 + 하자 + 전신료 = 총 은행 비용) | 7,734 | 0 |
큐브 대사식 20종은 모두 차이 0이고, 원천 라인 7,734줄의 항등식도 차이 0입니다. 화면 쪽은 축을 바꿔도 합계가 변하지 않는지, 칸 금액과 원천 합계가 같은지를 실제 브라우저로 따로 확인했습니다.
운영 데이터로 갈 때
청구 문서가 수천만 건이 되면 집계 위치가 가장 먼저 중요해집니다. 큐브는 데이터베이스에서 집계하고 화면은 집계 결과만 읽습니다. 회사코드와 기간은 필수 조건으로 두어 전체를 읽지 않게 하고, 필요하면 월 단위 사전 집계 뷰를 둡니다. 인덱스는 청구일 · 판매 조직 · 고객 중심으로 점검하고, 드릴스루는 500줄씩 이어 읽습니다. 응답 시간 기준과 최대 조회 기간은 도입 시 함께 정합니다.
자주 묻는 질문
도입을 검토하시는 분들이 가장 자주 물으시는 질문을 숫자와 산식 · 화면과 사용 · 분석 기능 · 도입과 운영 순으로 모았습니다.
숫자와 산식
이 화면은 어느 시점 · 어느 범위의 데이터로 동작하나요?
공개한 화면은 검증용 샘플 데이터(2026-01 ~ 2026-09, 회사코드 1000)로 동작합니다. 샘플은 가상이며 원천 라인 7,734줄을 차원 조합 1,237행의 큐브로 묶고, 계획 1,237행을 맞춰 두었습니다.
운영 시스템에 연결할 때는 화면의 서비스 주소만 바꾸고, 서비스가 같은 형식으로 청구 · 은행 약정 · 네고 데이터를 내려 주면 됩니다. 환가료율 · 수수료율 · 임계값은 모두 가정값입니다.
총 은행 비용은 무엇을 더한 값인가요?
환가료 + 네고·추심 수수료 + 서류 하자 수수료 + 전신료입니다. 환가료는 매입액 × 환가료율(연 %) × 환가 일수 ÷ 360 으로 라인마다 계산합니다.
이 항등식은 원천 라인 7,734줄 모두에서 1원 이내로 맞는지 전수로 검사했고 차이가 0건입니다.
환가료와 환가료 연 환산율은 어떻게 다른가요?
환가료는 실제로 낸 금액이고, 연 환산율은 그 금액을 ‘매입액 × 일수’로 나눠 연 기준으로 바꾼 값입니다. 같은 금액이라도 오래 앞당겨 받으면 연 환산율은 낮아집니다.
그래서 은행 비교는 금액이 아니라 연 환산율과 평균 환가 일수를 함께 봅니다. 360일 기준은 가정값이며 은행 약정에 따라 다를 수 있습니다.
평균 환가 일수는 단순 평균인가요?
아닙니다. Σ(매입액 × 일수) ÷ Σ 매입액 으로 매입액 가중 평균입니다. 분자와 분모를 먼저 합산한 뒤 나누기 때문에 어느 소계에서도 맞고, 건수가 적은 큰 금액이 평균을 정확히 끌어올립니다.
총차이를 아홉 요인으로 가르는 방식은 무엇인가요?
순차 대체입니다. 계획의 건수를 실적 값으로 바꾸고, 다음에 건당 매입액, 환가 일수, 환가료율, 하자 발생 비율, 하자 건당 수수료, 수수료율 · 전신료 순서로 한 요인씩 실적 값으로 바꿔 가며 총 은행 비용의 변화를 나눕니다. 마지막 단계에서 실적 합계와 같아지므로 요인의 합은 총차이와 같습니다.
원 단위 반올림 차이는 수수료 요인에 모읍니다. 순서가 바뀌면 요인별 값이 달라질 수 있어 순서를 고정해 두었습니다.
“미계획 매입”과 “계획 미이행”은 무엇인가요?
같은 차원 조합이 실적에만 있으면 미계획 매입, 계획에만 있으면 계획 미이행입니다. 억지로 나누지 않고 전체를 한 요인으로 세웁니다. 샘플에서는 미계획 매입이 +327백만원, 계획 미이행이 −83백만원이어서 합계 +237백만원 안에서 서로 상쇄되고 있었습니다.
계산이 맞는지 어떻게 아나요?
큐브 합계와 원천 라인 합계를 12개 항목으로, 환가료 + 수수료 + 하자 + 전신료 = 총 은행 비용을 실적 · 계획 · 원천에서, 요인 합 = 총차이, 통화별 외화 청구액을 매번 대사합니다. 모두 차이 0입니다. 화면에서도 칸 금액과 드릴스루 합계, 요인 합계와 총차이를 줄로 보여 줍니다.
화면과 사용
축을 바꾸면 서버를 다시 부르나요?
부르지 않습니다. 조회 한 번으로 큐브를 읽고, 이후 행 · 열 · 필터 변경은 브라우저에서 다시 묶습니다. 헤드리스 브라우저로 확인했을 때 축 이동에서 네트워크 요청이 0건이었습니다.
열 조합에 한도가 있는 이유는 무엇인가요?
열 조합이 많아지면 표가 읽을 수 없게 되고 브라우저가 느려집니다. 열 조합 36개와 행 노드 500개를 넘으면 표를 반쯤 그리지 않고 안내하며 막습니다. 필터로 범위를 좁히거나 차원을 줄이면 됩니다.
칸을 눌렀을 때 열리는 문서 라인은 어떻게 정해지나요?
칸의 행 경로와 열 조합이 그대로 질의 조건이 됩니다. 칸이 정한 차원 값을 모두 조건으로 걸어 원천 네고 문서 라인을 500줄씩 읽고, 위쪽 줄에서 칸 금액과 원천 합계가 같은지 알려 줍니다.
역할(CEO · CFO · 영업 · 자금)을 바꾸면 무엇이 달라지나요?
앞세우는 지표와 기본으로 쪼개 보는 차원이 달라집니다. CEO 는 제품 그룹 › 거래은행, CFO 는 매입월, 영업 책임자는 국가 · 고객, 자금 책임자는 거래은행 › 결제 방식입니다. 역할을 바꿔도 다시 조회하지 않으며, 레이아웃 보드에서 직접 바꾼 축은 그대로 둡니다.
변동 사유는 어디에 저장되고 어떻게 따라오나요?
사유는 조회 범위와 행 경로를 키로 저장됩니다. 그래서 축을 바꾸거나 화면을 다시 열어도 같은 행에 따라오고, CSV 와 AI 근거 표에도 함께 실립니다. 규칙이나 기준이 바뀐 기간에는 해당 범위의 사유를 다시 검토하는 것이 좋습니다.
좁은 화면이나 모바일에서도 쓸 수 있나요?
폭 390px 에서 조회 영역이 세로로 쌓이고 차트가 표 아래로 내려가는 것을 확인했습니다. 표는 가로로 스크롤됩니다. 다만 열 조합이 많은 분석은 넓은 화면이 편합니다.
분석 기능
AI 분석은 숫자를 직접 만드나요?
만들지 않습니다. 서비스가 계산한 숫자를 읽어 요약과 핵심 발견을 쓰고, 읽은 근거 표를 펼쳐 볼 수 있게 합니다. 기본은 규칙 기반 해설이며 외부 모델 연결은 서비스 설정으로만 켜고 기본은 꺼져 있습니다.
AI 에이전트는 무엇을 감시하나요?
규칙 5개입니다. 총 은행 비용의 계획 차이 금액(거래은행별), 은행 비용률 상한(고객별), 평균 환가 일수 상한(거래은행별), 환가료 연 환산율 상한(수출 국가별), 서류 하자 수수료 금액(고객별)입니다. 걸린 항목은 받을 역할의 대기함에 올라갑니다. 임계값은 샘플 분포에서 정한 가정값입니다.
에이전트를 하루에 한 번만 실행하는 이유는 무엇인가요?
같은 보고가 하루에 여러 번 쌓이지 않게 하려는 것입니다. 두 번째 요청은 서버가 건너뜀으로 판정하고 사유와 첫 실행 번호를 기록합니다. 판정을 화면이 아니라 서버가 하므로 어느 화면에서 눌러도 같습니다.
PowerPoint 보고서는 어떻게 만들어지나요?
AI 분석 창의 보고서 버튼을 누르면 브라우저가 현재 범위의 표와 차트를 담은 .pptx 파일을 직접 만들어 내려받습니다. 서버에 파일을 남기지 않고 외부 라이브러리도 쓰지 않습니다. 샘플로 만든 파일을 슬라이드 6장 구성으로 열어 확인했습니다.
레이아웃 저장에는 무엇이 들어가나요?
축 · 조회조건 · 분석 항목 · 접힘 상태 · 표시 행 수가 들어갑니다. 기본 레이아웃으로 지정하고 자동 조회를 켜면 화면을 여는 순간 저장한 축으로 조회된 채 시작합니다.
도입과 운영
표준 T-code 와는 어떤 관계인가요? 기존 리포트를 없애야 하나요?
없애실 필요가 없습니다. 표준 실행은 SAP 표준 T-code(VA03 · VF03 · VX03N · FBL5N · FBL3N)가 담당하고, 이 화면은 조회 · 검증 관점을 더해 확장합니다. 법정 · 감사 · 신고 대응에 쓰던 화면은 그대로 두고, 이 앱은 월간 은행 비용 분석과 회의용으로 병행하는 것이 안전합니다.
운영 시스템에 연결하는 데 무엇이 필요하고 얼마나 걸리나요?
필요한 것은 기준값 정하기(은행 약정 요율 · 거래은행 · 결제 방식 필드 · 환가 일수 기준 · 하자 판정), CDS 뷰 8벌 만들기, 서비스 게시, 화면의 서비스 주소 교체입니다. 소요 기간은 회사의 데이터 구성과 합의 속도에 달려 있어 일반 수치를 드릴 수 없습니다.
개발보다 정하는 일이 많으며, 정해야 할 항목은 CDS 구성 절의 표에 정리했습니다.
권한과 보안은 어떻게 처리하나요?
권한은 큐브 이전 단계인 기본 뷰에 겁니다. 드릴스루 라인에만 걸면 전사 합계에서 자기 몫을 빼는 방식으로 남의 숫자가 드러날 수 있기 때문입니다. 판매 조직 단위의 표준 권한을 기본으로 설계합니다.
화면은 외부 차트 라이브러리와 외부 전송 없이 동작하며, AI 모델 연결은 꺼진 채 시작합니다.
청구 문서가 수천만 건이면 어떻게 되나요?
큐브 읽기 단위가 차원 조합이라 문서 수가 아니라 조합 수에 비례합니다. 그래도 운영 규모에서는 기간을 필수 조건으로 두고, 집계는 데이터베이스에서 하며, 필요하면 월 단위로 미리 집계하는 뷰를 둡니다. 드릴스루는 500줄씩 이어 읽습니다.
응답 시간 기준과 최대 조회 기간은 도입 시 함께 정합니다.
은행 약정이 바뀌면 어떻게 하나요?
환가료율 · 수수료율 같은 요율은 기준 테이블 값을, 거래은행 · 결제 방식 판정은 기본 뷰의 매핑을 고치면 됩니다. 값이 바뀌어도 화면 코드는 바뀌지 않습니다. 이미 남겨 둔 변동 사유는 조회 범위와 행 경로에 묶여 있어 약정이 바뀐 기간에는 해당 범위의 사유를 다시 검토하는 것이 좋습니다.
거래은행 · 결제 방식 · 환가 일수는 SAP 의 어디에서 가져오나요?
신용장이나 서류 관련 금융 문서, 또는 고객사 확장 필드에서 가져오는 구성이 일반적이지만 회사마다 다릅니다. 이 글의 매핑은 샘플 기준이며, 운영에서는 어느 필드를 쓸지 먼저 확인해야 합니다(확인 필요).
이 화면의 결과로 회계 · 세무 처리를 확정할 수 있나요?
확정할 수 없습니다. 이 화면은 조회 · 점검 도구이며, 최종 판단은 회사와 감사인이 하고 세무 신고는 회사와 세무 대리인이 합니다. 은행 비용의 계정 분류나 전기 시점 같은 기준도 회사의 정책과 전문가 판단에 따라 정합니다. 화면은 원인을 단정하지 않고 점검 필요 항목으로만 표시합니다.