수입 솔루션 · 구매 계약 이행

수입 구매 계약 물량 이행 다차원 분석 — 약정 대비 이행 금액의 차이를 다섯 요인으로 가르고 원천 라인까지 내려가는 수입 구매 점검

약정 대비 이행 금액의 차이를 다섯 요인으로 나누는 요인분해 · 피벗 축 전환 · 셀에서 원천 계약 이행 라인까지 드릴스루 · 행에 남는 변동 사유 · 숫자를 모델에 맡기지 않는 AI 분석 · 스스로 도는 AI 에이전트 — 소개 영상과 실제 화면 33종, 그리고 CDS 코드까지

소개 영상블로그 목차 순서대로 · 자막 포함

도입 포인트 — 이 앱을 사용해야 하는 이유

수입 구매 계약 이행 점검의 질문은 늘 같습니다. 이행 금액이 약정보다 얼마나 늘었나, 왜 늘었나, 누가 무엇을 확인해야 하나. 계약에는 수량 · 외화 단가 · 프리미엄·할증 · 결제 통화 · 인코텀즈가 정해져 있고, 실제 이행은 구매오더 · 선적 · 입고 · 송장을 거치며 환율이 곱해져 원화 금액이 됩니다. 한 건씩은 계약대로인 것 같아도 공급사 · 원산지 · 자재그룹이 섞이면 합계가 왜 움직였는지 설명하기 어렵습니다. 물대와 프리미엄·할증이 재고 원가로 이어지는 점은 IAS 2 재고자산(K-IFRS 제1002호), 외화 대금의 환산은 IAS 21 환율변동효과(K-IFRS 제1021호) 와 맞닿아 있지만, 이 화면은 두 기준서의 회계 처리를 판단하지 않고 숫자의 출처와 차이를 점검하는 자료만 만듭니다. 적용 범위는 회사 기준에 따라 확인이 필요합니다.

지금은 계약 조회(ME33K), 구매오더 조회(ME23N), 입고(MIGO), 자재 문서 목록(MB51), 송장(MIRO), 공급사 개별 항목(FBL1N)을 번갈아 열고 엑셀에서 계약별로 다시 맞춰 보는 방식이 많습니다. 이 앱은 그 자리에 같은 데이터를 한 번 묶은 큐브를 놓고, 축을 바꿔 가며 보고, 칸에서 원천 이행 라인까지 내려가고, 약정과의 차이를 다섯 요인으로 가르는 점검 화면을 더합니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회 · 검증 관점을 더해 확장합니다.

한 줄 요약 — 이행 금액 합계만 보여 주는 리포트는 흔합니다. 이 앱의 값은 그 다음에 있습니다: 약정과의 차이를 다섯 요인으로 가르고, 칸에서 원천 계약 이행 라인까지 내려가 확인하고, 사유를 행에 남깁니다.

핵심 포인트 여덟 가지

핵심 포인트고객이 얻는 것지금 방식이라면
① 축을 바꿔도 합계가 갈라지지 않는 피벗공급사 · 원산지 · 자재그룹 · 인코텀즈 · 결제 통화 등 11개 차원을 끌어다 놓아 행 3단계 · 열 2단계로 봅니다. 모든 축이 같은 큐브에서 나옵니다.공급사별 · 자재그룹별 엑셀 피벗을 따로 만들고, 합계가 다르면 어느 시트가 맞는지부터 따집니다.
② 칸에서 원천 이행 라인까지숫자를 누르면 그 금액을 만든 계약 품목 이행 라인이 열리고, 라인 합계가 칸 금액과 같은지 바로 보입니다.계약 · 구매오더 · 입고 · 송장 화면을 차례로 열어 계약 번호로 찾고 금액을 손으로 대조합니다.
③ 약정 대비 차이를 다섯 요인으로이행 수량 · 외화 단가 · 프리미엄·할증 · 환율 · 계약 외 이행으로 가르고, 요인 합이 총차이와 같은지 매번 검산합니다.이행 금액이 늘었다는 합계만 보고, 수량 때문인지 단가 때문인지 환율 때문인지는 사람 머릿속에서 추정합니다.
④ 계약에 없던 이행을 따로 떼어 냄계약 품목에 연결되지 않은 구매오더 라인을 '계약 외 이행' 으로 분리해 금액과 비중을 공급사별로 봅니다.약정 안의 차이와 약정 밖의 이행이 한 숫자에 섞여, 어느 쪽이 문제인지 가려내지 못합니다.
⑤ 역할마다 앞세우는 숫자CFO · 구매 · 물류 · 자금 책임자 관점으로 요약 지표와 기본 행 축이 바뀝니다. 다시 조회하지 않습니다.부서마다 자기 시트를 만들어 같은 회의에 다른 숫자를 들고 옵니다.
⑥ 변동 사유가 행에 남음주된 요인과 사유를 행에 적어 두면 축을 바꾸거나 새로 고침해도 남아, 다음 달에 처음부터 다시 설명하지 않습니다.사유가 메일 · 메신저 · 회의록에 흩어져 담당이 바뀌면 사라집니다.
⑦ 숫자를 모델에 맡기지 않는 AI 분석금액과 비율은 서비스가 큐브에서 계산하고 해설은 그 숫자를 문장으로 옮기며, 문장마다 근거 표가 붙습니다.요약 문장을 사람이 쓰면서 숫자를 옮겨 적다가 틀리고, 근거를 되짚는 데 시간이 듭니다.
⑧ 화면을 열지 않은 날에도 도는 감시규칙 여섯 개를 돌려 임계를 넘은 항목을 받을 역할의 대기함에 올립니다. 하루 한 번 제한이 서버에서 판정됩니다.누군가 보고서를 열어 봐야 이상이 보이고, 월말에야 알게 됩니다.

사례로 보는 효과 — 이행 금액 +329.43억원 증가의 이유

검증용 샘플 데이터(2026년 4월~9월, 이행 라인 3,620건 · 계약 180건) 기준으로 이행 금액은 약정 14,948.92억원에서 실적 15,278.35억원으로 +329.43억원(+2.2%) 늘었습니다. 합계 리포트는 여기까지 말해 줍니다. 이 앱은 그 다음을 답합니다 — 다섯 요인으로 가르자 이행 수량이 약정에 못 미쳐 −370.30억원이 빠졌는데도 합계가 늘어난 것은, 약정에 없던 계약 외 이행이 +522.20억원 더해졌기 때문이었습니다. 합계만 보면 “조금 늘었다” 로 끝날 일이, 요인으로 가르면 “수량은 줄었고 계약 밖 구매가 늘었다” 는 서로 다른 두 이야기로 나뉩니다.

요인증감(억원)읽는 법
이행 수량−370.30이행 수량이 약정보다 적어 이행 금액이 줄어든 몫입니다. 이행 수량은 약정의 99.7% 입니다.
외화 단가+46.29계약 외화 단가보다 높게 이행된 몫입니다. 샘플의 가정값입니다.
프리미엄·할증+10.31할증률이 약정 0.66% 에서 0.75% 로 높아진 몫입니다.
환율+120.92이행 시점 환율이 약정 시점보다 높아진 몫입니다. 환율은 샘플의 가정값입니다.
계약 외 이행+522.20계약 품목에 연결되지 않은 구매오더 라인 164건의 이행 금액 전액입니다. 이행 금액의 3.4% 입니다.
검산0다섯 요인의 합이 총차이와 같습니다(표시 단위 반올림으로 0.01억원 차이가 날 수 있고, 원 단위로는 정확히 같습니다).

요인분해는 이렇게 셉니다
약정값에서 이행값으로 가면서 한 번에 한 요인씩 실제 값으로 바꾸고, 그때마다 라인 단위 식 이행 수량 × 외화 단가 × 환율 + 외화 프리미엄·할증 × 환율 을 다시 계산합니다. 바뀐 만큼이 그 요인의 몫입니다.

모든 단계가 이어져 있으므로 다섯 몫을 더하면 총차이와 정확히 같아집니다. 그래서 잔차가 구조적으로 0 이고, 화면이 매번 “요인 합 − 총차이 = 0원” 을 적어 검산합니다. 요인을 바꾸는 순서를 달리하면 요인별 금액은 달라질 수 있으므로, 순서는 화면에 고정해 두었습니다.

요인의 크기는 샘플 데이터의 가정값에서 나온 것이며, 실제 환경의 크기를 말하는 것이 아닙니다. 중요한 것은 같은 화면에서 “어느 요인이 얼마” 가 바로 나온다는 점입니다.

도입하면 달라지는 것

  • 월 점검 준비 — 요인분해 · 사유 · 보고서가 한 화면에서 나오므로 엑셀 취합과 캡처 작업이 줄어듭니다.
  • 회의의 주제 — “어느 시트 숫자가 맞나” 가 아니라 “어느 공급사의 계약 외 구매를 어떻게 할 것인가” 를 이야기합니다.
  • 다음 달로 이어지는 기록 — 사유와 레이아웃이 남아, 매달 같은 설명을 처음부터 다시 하지 않습니다.
  • 놓치는 날이 없는 감시 — 아무도 화면을 열지 않은 날에도 규칙에 걸린 숫자는 받을 사람에게 올라갑니다.

이런 회사에 맞습니다

해외에서 원자재 · 상품을 장기 계약으로 들여오며 구매오더로 나누어 이행하는 회사, 계약 물량 소진과 단가 · 할증 · 환율 차이를 엑셀로 맞추고 있는 구매 · 자금 · 회계 조직, 그리고 구매 · 물류 · 자금이 이행 금액을 함께 확인해야 하는 경영지원 조직에 맞습니다. 외화 결제 통화가 여러 개이고 공급사와 원산지가 여럿일수록 효과가 큽니다. 이 화면은 점검 자료이며, 이행 금액의 회계 처리와 관세 · 세무상 취급은 회사와 감사인(세무 신고는 회사와 세무 대리인 · 관세사)이 판단합니다.

실행 화면

실제로 돌아가는 화면 33종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 하는 자리이고 어떻게 읽는지를 아래에 적었습니다. 모든 캡처는 가상의 검증용 샘플 데이터로 찍었습니다.

사용 방법

  1. 조회 조건을 넣습니다. 회사코드(필수)와 시작 · 종료 기간(필수, 선적월 기준)을 고르고, 필요하면 공급사 · 자재그룹 같은 차원 값을 여러 개 골라 범위를 좁힙니다. 비워 두면 전체입니다.
  2. 조회를 누릅니다. 조회 조건 영역 오른쪽 끝의 조회 버튼을 누르거나 입력칸에서 Enter 를 누릅니다. 자동 조회는 저장한 레이아웃에서 지정한 경우에만 화면을 열 때 실행됩니다.
  3. 요약을 봅니다. 경영 요약에서 이행 금액 합계 · 계약 외 비중 · 물대 · 할증률을 약정과 함께 보고, 역할을 바꿔 앞세우는 지표를 바꿉니다.
  4. 축과 탭을 옮깁니다. 차원 칩을 끌어다 놓아 행 · 열을 짜고, 표시 항목 · 금액 단위 · 비교 기준을 바꿉니다. 결과 영역에서는 표와 막대 · 요인 워터폴을 오갑니다.
  5. 행이나 칸을 눌러 내려갑니다. 숫자 칸을 누르면 원천 이행 라인이 열리고, 차이 모드에서 행 이름을 누르면 그 범위로 요인분해가 계산되며, 사유 칸을 누르면 변동 사유를 적습니다.
  6. 내보냅니다. 결과 영역의 CSV 버튼은 피벗을, 드릴스루 창의 CSV 버튼은 읽은 원천 라인을 내려받습니다. AI 분석 창에서는 PPTX 보고서를 만듭니다.

무엇으로 만들었나

화면은 OpenUI5 표준 컨트롤과 직접 그린 SVG 차트로만 짰고, 서비스 쪽은 OData V2 규격을 따르는 서비스 한 벌입니다. 엔티티셋 16개(큐브 · 약정 · 원천 라인 · 차원 · 측정값 · 계산항목 · 요약 · 검산 · 사유 · 레이아웃 · 에이전트 · 결과 형식)와 펑션 3개(요인분해 · 해설 · 에이전트 실행)로 이루어져 있습니다. 아래는 모델 구성 수준으로 적은 구성입니다.

자리무엇왜 그렇게 두었나
화면 컨트롤OpenUI5 표준 컨트롤, 차원 칩 끌어다 놓기, SVG 차트외부 차트 라이브러리를 들이지 않아 반입 심사가 필요 없고, 차트와 표가 같은 숫자를 씁니다.
집계 · 판정 로직큐브 묶기, 계산항목 식, 차이 색 판정묶기는 브라우저가, 금액과 비율 계산 · 요인분해는 서비스가 맡아 숫자의 출처를 하나로 둡니다.
서비스OData V2 — 읽기 · 쓰기 · 계산 호출조회 조건은 필터 객체로 보내고, 사유와 레이아웃은 쓰기로 저장합니다. 운영 전환 때 서비스 주소만 바꿉니다.
화면 상태JSON 모델(축 · 표시 항목 · 역할 · 접힘)서비스 모델과 화면 상태를 나누어, 축을 바꿀 때 서버를 부르지 않습니다.
테마sap_horizonSAP 표준 화면과 같은 결의 모양을 씁니다.

SAP 표준 기능을 그대로 이어받은 부분. 구매 계약 · 구매오더 · 자재 문서 · 송장의 표준 데이터 구조를 그대로 이어받아 쓰고, 별도의 계약 체계를 새로 만들지 않습니다. 계약 체결과 입고, 송장 검증, 전표 반영은 SAP 표준 T-code 가 담당하고, 이 화면은 그 결과를 여러 축으로 조회하고 검증하는 관점을 더합니다.

항목내용
솔루션수입 솔루션
업무 영역수입 구매 계약 약정 대비 이행 분석(이행 수량 · 외화 단가 · 프리미엄·할증 · 환율 · 계약 외 이행)
관련 기준서IAS 2 재고자산(K-IFRS 제1002호) · IAS 21 환율변동효과(K-IFRS 제1021호) — 적용 범위는 회사 기준에 따라 확인 필요
SAP 표준 T-codeME33K · ME23N · MIGO · MB51 · MIRO · FBL1N
화면 성격다차원 큐브 분석 리포트(피벗 · 드릴스루 · 차이 요인분해 · AI 분석 · AI 에이전트)
데이터 연동OData V2 (조회 · 쓰기 · 펑션)
테마sap_horizon

처음 열었을 때

조회 조건부터 피벗까지가 한 화면에 세로로 쌓입니다. 머리 영역은 접을 수 있어서, 축을 짜는 동안에는 펼쳐 두고 숫자를 볼 때는 접어 표와 차트를 넓게 씁니다.

조회 전 틀
조회 전 틀 — 조회를 누르기 전에도 조회 조건과 분석 축 보드, 피벗 틀이 먼저 보입니다.

회사코드 1000, 선적월 2026.04 ~ 2026.09 가 기본값입니다. 조회 버튼은 조회 조건 영역의 오른쪽 끝에 있고, 조회 조건 입력칸에서 Enter 키를 눌러도 조회됩니다. 빈 화면을 주지 않아서 처음 여는 사람도 무엇을 고르면 무엇이 채워지는지 봅니다.

조회 직후 화면
조회 직후 화면 — 조회하면 계약 이행 큐브를 한 번 읽어 표와 차트, 경영 요약이 함께 채워집니다.

값은 백만원 단위의 이행 금액 합계이고 행은 자재그룹 › 공급사, 열은 선적월입니다. 왼쪽 막대 차트와 오른쪽 피벗이 같은 범위를 보여 줍니다. 이후 축을 바꾸는 일은 서버를 다시 부르지 않고 브라우저에서 합니다.

분석 축 보드
분석 축 보드 — 사용 가능한 차원 칩을 행 축과 열 축에 끌어다 놓습니다.

칩 오른쪽 화살표 버튼으로도 풀 → 행 → 열 순서로 옮길 수 있습니다. 행 축은 최대 3개, 열 축은 최대 2개입니다. 쓰지 않는 차원은 왼쪽 칸에 모아 둡니다.

경영 요약 — 역할마다 앞세우는 숫자가 다르다

경영 요약은 역할을 바꾸면 앞세우는 지표와 기본 행 축이 바뀝니다. 같은 큐브에서 나온 숫자이므로 역할을 바꿔도 다시 조회하지 않습니다.

경영 요약 — CFO
경영 요약 — CFO — 역할에 따라 앞세우는 지표와 기본 행 축이 바뀝니다.

CFO 는 자재그룹 기준으로 이행 금액 합계 · 계약 외 비중 · 물대 · 할증률을 약정과 함께 봅니다. 약정을 넘긴 상위와 약정에 못 미친 상위가 나란히 나옵니다. 샘플 전체의 할증률은 약정 0.66% 에 견줘 0.75% 입니다.

경영 요약 — 구매 책임자
경영 요약 — 구매 책임자 — 공급사 기준으로 계약 외 이행 비중을 먼저 봅니다.

약정에 없던 구매오더가 어느 공급사로 몰렸는지를 가려내는 관점입니다. 계약 외 이행 비중이 높은 공급사는 계약 갱신이나 발주 방식을 점검할 후보가 됩니다.

경영 요약 — 물류 책임자
경영 요약 — 물류 책임자 — 운송수단 기준으로 납기 지연 라인 비율을 먼저 봅니다.

선적 예정일보다 늦게 선적된 라인의 비율과 평균 지연 일수를 운송수단별로 비교합니다. 샘플 전체에서 지연 라인은 1,296건으로 35.8% 이고, 지연 라인의 평균 지연은 11.0일입니다.

경영 요약 — 자금 책임자
경영 요약 — 자금 책임자 — 결제 통화 기준으로 이행 금액과 환율 영향을 봅니다.

같은 이행 금액이라도 통화별로 환율 요인이 얼마나 섞였는지 확인하는 관점입니다. 환율은 샘플의 가정값입니다. 환율 요인이 큰 통화부터 결제 시점과 환 위험 관리 방식을 점검합니다.

축 전환과 범위

차원은 열 개가 넘고, 각 차원은 값을 여러 개 골라 범위를 좁힐 수 있습니다. 어떻게 쌓고 좁혀도 합계가 갈라지지 않는 것이 이 절의 기준입니다.

축 끌어 놓기
축 끌어 놓기 — 칩을 끌어다 놓으면 서버를 다시 부르지 않고 브라우저에서 바로 다시 묶습니다.

행 축에 인코텀즈를 더하자 자재그룹 › 인코텀즈 › 공급사 순서의 3단 트리가 만들어졌습니다. 축을 바꾼 뒤에도 총합은 같습니다. 되돌리고 싶으면 기본 축 버튼으로 처음 배치로 돌아옵니다.

열 축 두 개
열 축 두 개 — 열 축에 두 차원을 놓으면 조합 머리글이 만들어집니다.

선적월과 운송수단을 열에 놓은 모양입니다. 열 조합이 상한(36개)을 넘으면 표를 그리지 않고 안내 문구를 먼저 보여 줍니다. 열 조합이 많아질 때는 아래 '한계' 화면처럼 먼저 알려 줍니다.

조회 조건 접기
조회 조건 접기 — 조회 조건과 분석 축을 접어 결과 영역을 넓게 씁니다.

접힘 상태는 레이아웃에 함께 저장됩니다. 접힌 줄에는 지금 어떤 범위를 보고 있는지가 남아 있어, 범위를 잊은 채 숫자를 읽는 일을 막습니다.

차원 값 다중 선택 — 창
차원 값 다중 선택 — 창 — 차원마다 값을 여러 개 골라 범위를 좁히는 창입니다.

같은 차원 안에서는 or, 차원 사이에서는 and 로 거릅니다. 비워 두면 전체입니다. 선택 창에는 값마다 이행 라인 수가 함께 보입니다.

차원 값 다중 선택 — 선택 후
차원 값 다중 선택 — 선택 후 — 자재그룹 철강 코일 · 비철금속, 운송수단 해상 컨테이너를 골랐습니다.

선택한 개수는 조회 조건 줄의 '차원 값' 버튼에 표시됩니다. 고른 값은 다시 열어 바꾸거나 모두 비울 수 있습니다.

범위를 좁힌 결과
범위를 좁힌 결과 — 선택한 자재그룹과 운송수단만 남은 피벗입니다.

큐브를 다시 읽지 않고 브라우저에서 거릅니다. 합계는 3,258.3억원으로 줄었습니다. 범위를 좁힌 상태에서 요인분해를 보면 그 범위의 차이만 가릅니다.

칸에서 원천 이행 라인까지

집계 화면에서 가장 많이 나오는 말은 이 숫자의 근거가 무엇이냐는 것입니다. 숫자 칸을 누르면 그 칸을 이룬 계약 품목 이행 라인이 열립니다.

드릴스루 — 라인 목록과 대사
드릴스루 — 라인 목록과 대사 — 숫자 칸을 누르면 그 칸을 이룬 계약 이행 라인(계약 품목 단위)이 열립니다.

창 위에서 칸의 값과 읽은 라인의 합이 같은지 판정합니다. 차원 조건은 $filter 로 서버에 보내고 읽는 단위는 $top 으로 정합니다. CSV 로 내려받을 수 있습니다. 라인마다 계약 번호 · 품목 · 선적일 · 수량 · 외화 단가 · 환율 · 이행 금액이 한 줄로 보입니다.

월별 요약과 검산
월별 요약과 검산 — 큐브 합계와 원천 라인 합계를 측정값별로 대조하고 선적월별 요약을 함께 보여 줍니다.

차이 열이 모두 0 입니다. 월별 요약에서는 라인 · 계약 · 물대 · 이행 금액 · 약정 금액 · 지연 라인을 한눈에 봅니다. 대사 결과는 검증용 샘플에서 모두 같았습니다.

계산항목 — 차원으로는 나오지 않는 행

계약 외 이행 비중이나 납기 지연 라인 비율은 합산으로는 안 나옵니다. 칸마다 분자와 분모를 각각 합산한 뒤 나누어야 하기 때문입니다.

계산항목 — 계약 외 이행 비중
계산항목 — 계약 외 이행 비중 — 계약 외 이행 금액을 이행 금액 합계로 나눈 비율 항목을 같은 표에서 봅니다.

분자와 분모를 칸마다 합산한 뒤 나눕니다. 행을 합쳐도 비율이 맞습니다. 합계 행에서도 맞는 비율이 나옵니다.

계산항목 — 납기 지연 라인 비율
계산항목 — 납기 지연 라인 비율 — 지연 라인 수를 전체 라인 수로 나눈 비율 항목입니다.

측정값 토큰 식으로 정의되어 서비스에서 내려옵니다. 지연 라인의 평균 지연 일수도 같은 방식의 계산항목으로 볼 수 있습니다.

약정 대비 차이 — 같은 표가 구매 점검 자료가 된다

비교 기준을 약정으로 바꾸면 같은 표가 차이 리포트가 됩니다. 칸마다 약정 · 이행 · 차이 · 차이율이 붙고, 차이를 다섯 요인으로 가른 뒤 사유를 행에 남깁니다.

차이 모드
차이 모드 — 칸마다 약정 · 이행 · 차이 · 차이율을 보이고 금액과 비율이 둘 다 임계를 넘으면 색을 칠합니다.

붉은색은 약정을 넘겨 이행한 쪽, 초록색은 약정에 못 미친 쪽입니다. 금액 임계와 비율 임계는 샘플의 가정값(2천만원 · 3퍼센트)이며 회사 기준에 맞게 바꿉니다. 칸 하나하나가 약정 대비 어디서 벌어졌는지 눈으로 먼저 찾는 용도입니다.

요인 워터폴
요인 워터폴 — 약정 이행 금액에서 이행 실적까지를 다섯 요인으로 나눈 폭포 차트입니다.

검산 줄이 '요인 합 − 총차이 = 0원' 으로 표시됩니다. 요인은 이행 수량 · 외화 단가 · 프리미엄·할증 · 환율 · 계약 외 이행입니다. 샘플 전체는 이행 수량 −370.30, 외화 단가 +46.29, 프리미엄·할증 +10.31, 환율 +120.92, 계약 외 이행 +522.20(억원)입니다.

행 단위 요인분해
행 단위 요인분해 — 행 이름을 누르면 그 범위의 요인분해가 새로 계산됩니다.

에너지 원료를 눌렀더니 이행 수량 요인이 크게 줄어든 모양이 나왔습니다. 범위가 바뀌어도 검산 줄은 0 입니다. 다른 행을 누르면 그 범위로 다시 계산되어, 같은 차트로 공급사 · 자재그룹마다 원인을 비교합니다.

변동 사유 입력
변동 사유 입력 — 행 끝의 '사유 쓰기' 를 눌러 주된 요인과 변동 사유를 적습니다.

원인 요인과 차이 금액, 차이율이 함께 저장됩니다. 사유는 점검 메모이며 단정하는 문장이 아닙니다. 입력한 사유는 서비스의 쓰기로 저장됩니다.

사유 표시
사유 표시 — 사유가 있는 행은 표시가 바뀌고 새로 고침해도 유지됩니다.

서비스의 쓰기 기능으로 저장하며, 검증용 샘플에서는 브라우저에 보관됩니다. 담당이 바뀌어도 사유가 행에 남아 있습니다.

AI 분석과 보고서

표 위 AI 분석은 지금 보고 있는 범위를 읽어 줍니다. 금액과 비율은 서비스가 큐브에서 계산해 근거로 넘기고, 해설은 그 숫자를 문장으로 옮길 뿐입니다.

AI 분석 — 요약
AI 분석 — 요약 — 현재 범위를 규칙 기반으로 요약하고 점검할 대상을 짚습니다.

금액은 서비스가 계산한 값만 쓰고, 원인은 '확인 필요' 로 적습니다. 외부 AI 서비스는 연결 설정이 켜진 경우에만 쓰입니다. 역할을 바꾸면 그 역할 관점으로 점검 대상을 다시 짚습니다.

AI 분석 — 근거 표
AI 분석 — 근거 표 — 해설 문장마다 근거 표가 따라옵니다.

축 · 값 · 라인 수 · 약정 · 실적 · 차이 · 주된 요인을 표로 보여 주고, 보고용 슬라이드 파일(PPTX)로 내려받을 수 있습니다. 근거 표의 숫자는 화면의 표와 같은 큐브에서 나옵니다.

AI 에이전트

화면을 열어야만 점검되는 구조는 놓치는 날이 생깁니다. 에이전트는 감시 규칙을 돌려 걸린 항목을 받을 역할의 대기함에 올립니다.

감시 규칙
감시 규칙 — 규칙마다 지표 · 임계 · 받을 역할 · 주기를 정합니다.

여섯 규칙(계약 외 이행 비중 · 납기 지연 · 할증률 · 수량 · 환율 · 단가)의 임계는 모두 샘플의 가정값입니다. 규칙의 임계와 주기는 화면에서 바꿀 수 있습니다.

대기함
대기함 — 실행하면 기준을 넘은 항목이 받을 역할의 대기함에 올라옵니다.

이번 샘플에서는 여섯 규칙 중 다섯 규칙이 걸렸고 역할별 점검 필요 목록이 만들어졌습니다. 항목을 열면 받을 역할 관점의 제목과 근거가 보입니다.

활동 기록
활동 기록 — 실행할 때마다 시각과 호출 주체, 판정이 기록됩니다.

두 번째 실행은 하루 한 번 제한으로 LIMITED 판정이 기록되고 새 보고는 올라가지 않습니다. 배치 잡이 같은 호출을 주기적으로 실행하는 구성도 가능합니다.

레이아웃 저장과 복원

축을 짜 두고 다음에 또 쓰려면 저장해 두어야 합니다. 축 · 조회 조건 · 표시 항목 · 접힘 상태를 이름 붙여 저장하고 기본과 자동 조회를 지정합니다.

레이아웃 저장 창
레이아웃 저장 창 — 축 · 조회 조건 · 표시 항목 · 표시 행 수 · 접힘 상태를 이름 붙여 저장합니다.

저장한 목록에서 적용 · 기본 지정 · 자동 조회 지정 · 삭제를 할 수 있습니다. 레이아웃은 사용자별로 여러 개 둘 수 있습니다.

기본 · 자동 조회로 저장
기본 · 자동 조회로 저장 — 기본과 자동 조회를 켜고 저장한 모양입니다.

기본 표시가 붙은 항목이 새로 열 때 쓰입니다. 자동 조회를 켜면 화면을 열자마자 저장한 범위로 조회됩니다.

복원
복원 — 기본과 자동 조회로 저장한 레이아웃은 새로 열 때 조회된 채 시작합니다.

저장한 행 축(공급사)과 열 축(자재그룹)이 그대로 복원됩니다. 월 점검 때 같은 배치를 처음부터 다시 짜지 않아도 됩니다.

좁은 화면과 열 조합이 많은 구성

휴대폰 폭에서도 같은 리포트를 보고, 읽을 수 없는 표는 처음부터 그리지 않습니다.

390px 폭 — 위쪽
390px 폭 — 위쪽 — 좁은 화면에서는 영역이 세로로 쌓입니다.

버튼 이름은 줄고 경영 요약 지표는 두 줄로 겹쳐 보입니다. 조회 조건 입력과 조회 버튼은 같은 순서로 쓰입니다.

390px 폭 — 결과
390px 폭 — 결과 — 차트가 표 아래로 내려가고 표는 가로로 스크롤됩니다.

열이 많은 표도 잘리지 않고 옆으로 밀어 볼 수 있습니다. 축을 짜는 일은 넓은 화면이 편하고, 숫자를 확인하는 용도로는 좁은 화면으로도 충분합니다.

열 조합이 많은 구성
열 조합이 많은 구성 — 조합이 상한을 넘으면 표를 반쯤 그리는 대신 범위를 좁히라는 안내를 보여 줍니다.

선적월 6개와 공급사 12개를 열에 놓으면 72 조합이 되어 상한 36개를 넘습니다. 열 축을 줄이거나 차원 값을 골라 범위를 좁힙니다. 읽을 수 없는 표를 그리지 않는 것이 이 안내의 목적입니다.

화면 뒤에서 일어나는 일

조회를 누르면 서비스에서 큐브와 약정 값을 한 번 읽어 와 브라우저가 들고 있고, 축을 바꾸는 모든 조작은 그 위에서 일어납니다. 칸을 눌러 원천 라인으로 내려갈 때와 요인분해 · 해설 · 에이전트를 부를 때만 서비스를 다시 부릅니다. 읽는 일과 쓰는 일이 나뉘어 있어 사유와 레이아웃만 저장 대상입니다.

이행 금액 산출과 점검 규칙

계약 품목에 걸린 구매오더 이행 라인 단위로 물대와 프리미엄·할증을 원화로 계산하고 그 합을 큐브에 묶습니다. 아래 판정은 모두 “점검 필요” 수준의 안내이며, 취득원가 산입과 환율 효과의 회계 처리는 회사와 감사인이 판단합니다.

판정 조건결과 상태사용자 조치
이행 라인이 계약 품목에 연결됨약정 수량 · 단가 · 할증 · 환율과 견주어 네 요인으로 분해요인별 금액이 약정과 맞는지 원천 라인에서 확인
이행 라인이 계약 품목에 연결되지 않음요인 “계약 외 이행” 으로 분리(이행 금액 전액)라인 단위 드릴스루로 구매오더 사유 확인
금액 차이와 비율 차이가 둘 다 임계 초과(기본 2천만원 · 3퍼센트, 가정값)칸을 붉은색(약정 초과) 또는 초록색(약정 미달)으로 표시변동 사유 입력 또는 요인분해로 원인 확인
실제 선적일이 선적 예정일보다 늦음납기 지연 라인으로 집계(지연 일수 별도)운송수단 · 공급사별 지연 확인
감시 규칙 임계 초과대기함에 받을 역할 관점의 보고 등록역할별 점검 후 사유 기록
하루에 두 번째 에이전트 실행제한됨(LIMITED)으로 기록다음 날 다시 실행

산출 순서

  1. 물대(원화) = 이행 수량 × 외화 단가 × 환율
  2. 프리미엄·할증(원화) = 외화 프리미엄·할증 × 환율
  3. 이행 금액 합계 = 물대 + 프리미엄·할증
  4. 계약 외 이행 비중 = 계약 외 이행 금액 ÷ 이행 금액 합계 × 100, 납기 지연 라인 비율 = 지연 라인 ÷ 전체 라인 × 100

요인분해 처리 단계와 대사식

약정값에서 이행값으로 한 번에 한 요인씩 바꿔 같은 식을 다시 계산합니다. 요인은 이행 수량 → 외화 단가 → 프리미엄·할증 → 환율 순서로 바꾸고, 계약에 연결되지 않은 라인은 “계약 외 이행” 으로 따로 둡니다. 요인 합은 총차이와 정확히 같고, 순서를 바꾸면 요인별 금액은 달라질 수 있습니다. 대사식은 네 가지입니다.

  1. 큐브 합계 = 원천 라인 합계 (선적월 × 측정값)
  2. 약정 큐브 합계 = 원천 라인 약정 열 합계
  3. 라인 이행 금액 재계산 = 저장된 금액
  4. 요인 합 − 총차이 = 0

조회조건

필드필수기본값OData 조건
회사코드필수1000Bukrs eq '1000'
시작 기간(선적월)필수2026.04Period ge '202604'
종료 기간(선적월)필수2026.09Period le '202609'
차원 값(다중 선택)선택전체큐브에서 읽은 뒤 브라우저에서 거름(차원 안 or · 차원 간 and). 드릴스루는 차원 조건을 $filter 로 보냄
표시 항목 · 금액 단위 · 비교 · 단계 보기선택이행 금액 합계 · 백만원 · 실적만 · 끔화면 표시 설정(서버 호출 없음)
금액 임계 · 비율 임계선택20,000,000원 · 3퍼센트화면 표시 설정(가정값 — 회사 기준에 맞게 조정)
표시 행 수 · 원천 라인 읽는 단위선택14 · 500$top 으로 전달(드릴스루)

결과 컬럼

컬럼의미산출식
행 트리선택한 행 축 순서대로 내려가는 계층-
열 머리글열 축 값(선적월 등) 조합-
값선택한 표시 항목의 합큐브 합 또는 계산항목 식
약정 · 이행 · 차이 · 차이율약정 대비 모드에서 칸마다 표시차이 = 이행 − 약정, 차이율 = 차이 ÷ 약정
사유변동 사유 입력 상태사유 있음 / 사유 쓰기

좁은 화면에서 달라지는 것

이 화면은 표와 차트를 한 줄에 나란히 두고 씁니다. 창이 좁아지면 차트를 감추지 않고 표 아래로 내려, 휴대폰에서도 같은 리포트를 봅니다. 표는 가로로 스크롤됩니다. 열 조합이 상한(36개)을 넘으면 표를 반쯤 그리는 대신 범위를 좁히라는 안내를 먼저 보여 줍니다.

파일 구성

(앱 폴더)
├─ index.html · Component.js · manifest.json · readme.html
├─ view/ · controller/ · model/ (cube · chart · layout · pptx · formatter · ErrorHandler)
├─ i18n/ · css/ · media/ (소개 영상 · 포스터 · 챕터)
└─ odata/ 서비스 선언(metadata) · 서비스 로직 · 엔티티셋별 데이터

SAP 표준 기능 확장 포인트

이 앱은 표준을 대체하지 않고 표준이 비어 있는 자리를 채웁니다. 어디까지가 표준이고 어디부터가 이 앱인지를 표로 적었습니다.

표준으로 되는 것과 안 되는 것

계약 체결 · 변경, 구매오더 발행, 입고 처리, 송장 검증과 대금 정산은 표준 화면으로 충분합니다. 표준 화면으로 어려운 것은 같은 계약 이행을 공급사 · 원산지 · 자재그룹 · 인코텀즈 · 결제 통화로 돌려 보면서 약정과의 차이를 요인으로 가르고, 숫자 한 칸에서 원천 라인까지 내려가는 일입니다. 표준에 남겨 둘 일과 이 앱이 더하는 관점을 나란히 놓았습니다.

하고 싶은 일SAP 표준표준에서 걸리는 자리이 앱이 하는 일
계약 한 건의 약정 확인계약 조회(ME33K)계약을 한 건씩 열어 봄약정 열을 같은 차원으로 묶어 이행과 나란히 보여 줍니다
구매오더 단위 이행 확인구매오더 조회(ME23N)오더 하나씩, 계약과의 연결은 눈으로계약에 연결되지 않은 오더를 '계약 외 이행' 으로 분리합니다
입고 시점 · 수량 확인입고(MIGO) · 자재 문서 목록(MB51)문서 목록을 엑셀로 옮겨 합산선적 예정일 대비 지연과 이행 수량을 같은 표에서 봅니다
송장 금액 확인송장 입력(MIRO)송장별로 열어 대조이행 금액과 송장 금액 대조를 위한 원천 라인을 열어 줍니다
대금 개별 항목 대조공급사 개별 항목(FBL1N)공급사를 하나씩 조회공급사 축에서 이행 금액을 보고 표준 화면으로 되돌아갑니다
약정 대비 차이의 원인 분해없음합계 차이만 보이고 원인은 사람이 추정다섯 요인으로 가르고 검산합니다

T-code 별 연계 지점

T-code이름연계
ME33K구매 계약 조회이 앱의 약정 열이 쓰는 수량 · 외화 단가 · 조건의 원천입니다. 약정이 달라 보이면 이 화면에서 계약 조건을 먼저 확인합니다. 법정 · 감사 대응은 표준 화면에 남깁니다.
ME23N구매오더 조회이행 라인의 수량 · 단가 · 통화와 계약 참조가 같은 테이블에서 옵니다. 드릴스루에서 구매오더 번호를 확인해 이 화면으로 넘어가고, 거꾸로 표준 화면의 값은 이 앱에서 공급사 · 자재 축으로 다시 봅니다.
MIGO자재 문서 처리(입고)입고 일자와 수량이 이행 라인의 선적 · 입고 시점과 맞는지 점검합니다. 입고 처리 자체는 표준에서만 합니다.
MB51자재 문서 목록입고 라인 합계와 이 앱의 이행 수량 합계를 같은 기간으로 대조하는 지점입니다.
MIRO송장 입력송장 금액과 이행 금액의 차이를 확인하는 지점입니다. 송장 검증과 전표 반영은 표준에서 합니다.
FBL1N공급사 개별 항목 조회대금 전표와 이행 금액을 공급사 단위로 대조합니다. 지급 · 정산은 표준에서 합니다.

운영으로 옮길 때 “기존 리포트를 없애야 하나” 라는 질문이 나옵니다. 없애지 않습니다. 기존 표준 리포트는 법정 · 감사 · 세무 신고 대응으로 그대로 두고, 이 앱은 월 점검과 원인 분석 자리를 맡습니다. 두 화면의 합계를 맞추는 일을 운영 대사 항목으로 정해 두면 병행 기간 동안 신뢰가 쌓입니다.

분석 지표 정의표

지표산식 · 판정 기준대응 기능원천 데이터비고
이행 금액 합계물대 + 프리미엄·할증 (원화)피벗 · 경영 요약이행 라인환율은 샘플의 가정값
약정 대비 차이이행 금액 − 약정 금액차이 모드 · 요인 워터폴이행 라인 · 약정 열차이 원인은 점검 필요
계약 외 이행 비중계약 외 이행 금액 ÷ 이행 금액 합계계산항목 · 감시 규칙이행 라인임계는 가정값
납기 지연 라인 비율지연 라인 ÷ 전체 라인계산항목 · 감시 규칙선적 예정일 · 실제 선적일선적일 필드는 확인 필요
환율 요인외화 항목에 이행 환율과 약정 환율의 차를 대입한 변화요인분해환율IAS 21 환율변동효과(K-IFRS 제1021호)의 회계 처리와는 별개 — 확인 필요
취득원가 관련 점검물대 · 프리미엄·할증의 구성측정값 · 드릴스루이행 라인 · 송장IAS 2 재고자산(K-IFRS 제1002호) 원가 산입 여부는 회사와 감사인이 판단 — 확인 필요

S/4HANA 분석 스택과의 자리

S/4HANA 에는 표준 CDS 분석 쿼리와 Fiori 분석 앱, Analysis for Office 같은 분석 도구가 있습니다. 이 앱은 그것들과 경쟁하는 자리가 아니라, 구매 계약 이행 한 주제에 대해 약정 대비 요인분해와 원천 라인 드릴스루, 변동 사유, 감시 규칙을 한 화면에 묶은 점검용 화면입니다. 표준으로 제공되는 구체적인 앱 이름과 범위는 고객사 릴리스에서 확인이 필요합니다.

자리역할
SAP 표준 화면계약 · 구매오더 · 입고 · 송장 · 전표 반영 같은 실행과 원장
CDS 큐브 · 분석 쿼리차원 × 측정값 집계, 약정과 이행의 같은 모양 비교
이 앱축 전환 · 드릴스루 · 요인분해 · 변동 사유 · AI 분석 · 에이전트를 한 화면에 묶은 점검 화면
Analysis for Office · 표준 분석 앱표준 쿼리를 엑셀 또는 표준 분석 화면에서 다루는 자리 — 같은 쿼리를 함께 쓸 수 있습니다

확장 포인트 — 운영에서 실제로 손대는 자리

자리정할 것
프리미엄·할증 조건구매 계약의 어떤 조건 유형을 프리미엄 · 할증으로 읽을지, 그 금액을 물대와 어떻게 나눌지
약정 스냅숏약정을 계약 체결 시점 값으로 고정할지, 변경 이력을 어디까지 반영할지
계약 연결 기준구매오더 라인이 계약 품목에 연결되었다고 보는 기준(계약 번호 · 품목 참조)과 예외
환율 원천약정 환율과 이행 환율을 어느 환율 유형 · 어느 일자 기준으로 읽을지
선적 예정일 · 실제 선적일어느 필드를 쓰는지(확장 필드 또는 선적 관련 문서), 지연 판정 기준
권한회사코드 · 플랜트 권한을 표준 권한 객체로 어떻게 이어받을지

CDS 구성

운영 연결에서는 샘플의 서비스 대신 CDS 뷰가 같은 모양의 OData 서비스를 냅니다. 아래 코드는 구조를 보여 주는 스케치이며, 테이블 · 필드 이름은 고객사 환경에서 확인하고 고쳐 씁니다. 객체 이름은 기능을 뜻하는 영문으로 지었습니다.

뷰 레이어 구성

레이어뷰하는 일왜 나누나
기준ZIMP_CTMAP · ZIMP_CTPLAN분류 매핑과 약정 스냅숏 테이블분류와 약정을 코드 밖에 두어 바뀌어도 뷰를 다시 만들지 않습니다
차원ZI_ImpContractSupplier · ZI_ImpContractMaterial공급사 · 자재 이름과 분류마스터 이름이 바뀌어도 큐브가 흔들리지 않습니다
기초ZI_ImpContractFulfilLine계약 품목 이행 라인 한 줄수량 · 단가 · 환율 · 금액 파생을 한 곳에서 합니다
큐브ZI_ImpContractFulfilCube · ZI_ImpContractPlanCube이행 · 약정 집계같은 차원 · 같은 측정값 이름이어야 나란히 비교됩니다
쿼리ZC_ImpContractFulfilQuery행 · 열 기본 배치와 계산 측정값비율은 분자와 분모를 각각 더한 뒤 나눕니다
권한ZI_IMPCONTRACTFULFILCUBE (DCL)회사코드 · 플랜트 권한큐브를 읽는 자리에 걸어야 빼기로 알아내는 길이 막힙니다
서비스ZUI_ImpContractAnalysis쿼리를 OData 로 게시화면은 서비스 주소만 바꾸면 됩니다

① 분류 매핑 테이블과 약정 스냅숏 테이블

인코텀즈 묶음과 계약 규모 구간 같은 분류는 코드가 아니라 테이블 행으로 둡니다. 약정은 기간 시작 때 스냅숏으로 고정해야 차이 비교가 흔들리지 않습니다. 테이블 이름과 필드는 스케치이며 고객사 환경에서 정합니다.

" ───────────────────────────────────────────────────────────
" ZIMP_CTMAP  : 분류 매핑 (인코텀즈 묶음 · 계약 규모 구간 · 자재 분류)
" 역할        : 리포트 분류를 코드에서 떼어 행으로 관리
" 나눈 이유   : 분류가 바뀔 때 뷰를 고치지 않고 행만 바꾸기 위해
" ───────────────────────────────────────────────────────────
@EndUserText.label : '수입 계약 이행 분류 매핑'
define table zimp_ctmap {
  key client     : abap.clnt not null;
  key map_type   : abap.char(8) not null;   " INCOTERM / BAND / MATGRP
  key code       : abap.char(10) not null;
  valid_from     : abap.dats;
  valid_to       : abap.dats;
  group_text     : abap.char(40);
}

" ZIMP_CTPLAN : 약정 스냅숏 (계약 품목 단위, 기간 시작 때 고정)
@EndUserText.label : '수입 계약 약정 스냅숏'
define table zimp_ctplan {
  key client     : abap.clnt not null;
  key plan_ver   : abap.char(5) not null;
  key ct_no      : abap.char(10) not null;  " 계약 번호(EKKO-EBELN)
  key ct_item    : abap.numc(5) not null;   " 계약 품목(EKPO-EBELP)
  plan_qty       : abap.quan(13,3);         " 약정 수량 (목표 수량, 확인 필요)
  plan_unit_fc   : abap.curr(15,4);         " 약정 외화 단가
  plan_surch_fc  : abap.curr(15,4);         " 약정 프리미엄·할증(외화)
  plan_fx        : abap.dec(15,5);          " 약정 환율
  plan_ccy       : abap.cuky;
}

② 공급사 · 자재 차원 뷰

공급사와 자재 이름은 마스터에서 읽어 큐브와 분리합니다. 차원 뷰를 따로 두면 이름이 바뀌어도 큐브를 다시 만들 필요가 없습니다.

@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '공급사 차원'
define view entity ZI_ImpContractSupplier
  as select from lfa1
{
  key lifnr as Supplier,
      name1 as SupplierName,
      land1 as Origin
}

@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '자재 차원'
define view entity ZI_ImpContractMaterial
  as select from mara as m
    left outer join t023t as g on g.matkl = m.matkl and g.spras = $session.system_language
{
  key m.matnr as Material,
      m.matkl as MaterialGroup,
      g.wgbez as MaterialGroupName
}

③ 계약 품목 이행 라인 기초 뷰

구매오더 라인과 계약 품목, 약정 스냅숏을 이행 라인 한 줄로 모으는 기초 뷰입니다. 물대 · 프리미엄·할증 · 이행 금액은 여기서 파생합니다. 계약 참조 필드와 선적일 필드는 환경마다 다르므로 확인이 필요합니다.

" ───────────────────────────────────────────────────────────
" ZI_ImpContractFulfilLine : 구매오더 라인 단위 이행 + 약정 열
" 계약 연결 기준 : EKPO 의 계약 참조(KONNR / KTPNR, 확인 필요)
" 계약에 연결되지 않은 라인은 OffContract = 'X' 로 표시
" ───────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '수입 계약 이행 라인'
define view entity ZI_ImpContractFulfilLine
  as select from ekko as h
    inner join   ekpo as i on i.ebeln = h.ebeln
    left outer join zimp_ctplan as p
         on  p.ct_no   = i.konnr
         and p.ct_item = i.ktpnr
{
  key h.ebeln                                   as PurchaseOrder,
  key i.ebelp                                   as PurchaseOrderItem,
      h.bukrs                                   as CompanyCode,
      h.lifnr                                   as Supplier,
      i.matnr                                   as Material,
      i.matkl                                   as MaterialGroup,
      i.werks                                   as Plant,
      h.inco1                                   as Incoterms,
      h.waers                                   as Currency,
      i.konnr                                   as Contract,
      i.ktpnr                                   as ContractItem,
      case when p.ct_no is null then 'X' else '' end as OffContract,
      i.aedat                                   as ShipDate,        " 실제 선적일 필드는 환경마다 다름 — 확인 필요
      i.meins                                   as Unit,
      i.menge                                   as FulfilQty,
      i.netpr                                   as UnitPriceFc,
      p.plan_qty                                as PlanQty,
      p.plan_unit_fc                            as PlanUnitFc,
      p.plan_fx                                 as PlanFx,
      cast( 'KRW' as abap.cuky )                as LocalCurrency,
      " 물대(원화) = 이행 수량 × 외화 단가 → 이행 시점 환율로 환산
      currency_conversion( amount => i.menge * i.netpr, source_currency => h.waers,
                           target_currency => cast( 'KRW' as abap.cuky ),
                           exchange_rate_date => i.aedat, exchange_rate_type => 'M' ) as GoodsLc,
      " 프리미엄·할증(원화) — 구매오더 조건에서 읽을 조건 유형은 회사 기준으로 정함(확인 필요)
      " 아래 두 줄은 자리 표시이며, 조건 값을 읽는 뷰를 붙여 SurchargeLc 를 채우고 합을 FulfilAmountLc 로 둠
      cast( 0 as abap.curr(23,2) )               as SurchargeLc,
      cast( 0 as abap.curr(23,2) )               as FulfilAmountLc
}

④ 이행 큐브

기초 뷰를 차원 조합으로 더한 큐브입니다. 측정값마다 합계 집계 방식을 선언하고 통화 필드를 붙입니다. 환율을 곱한 원화 금액은 환산 시점을 정한 뒤 이 자리에서 한 번만 계산합니다.

@AccessControl.authorizationCheck : #CHECK
@Analytics.dataCategory : #CUBE
@EndUserText.label : '수입 계약 이행 큐브'
define view entity ZI_ImpContractFulfilCube
  as select from ZI_ImpContractFulfilLine
{
  key CompanyCode,
  key substring( ShipDate, 1, 6 ) as ShipPeriod,
  key Supplier,
  key MaterialGroup,
  key Incoterms,
  key Plant,
  key Currency,
  key Unit,
  key LocalCurrency,
      @Aggregation.default : #SUM
      @Semantics.quantity.unitOfMeasure : 'Unit'
      FulfilQty,
      @Aggregation.default : #SUM
      @Semantics.amount.currencyCode : 'LocalCurrency'
      GoodsLc,
      @Aggregation.default : #SUM
      @Semantics.amount.currencyCode : 'LocalCurrency'
      SurchargeLc,
      @Aggregation.default : #SUM
      @Semantics.amount.currencyCode : 'LocalCurrency'
      FulfilAmountLc,
      @Aggregation.default : #SUM
      @Semantics.amount.currencyCode : 'LocalCurrency'
      case when OffContract = 'X' then FulfilAmountLc else 0 end as OffContractAmountLc,
      @Aggregation.default : #SUM
      1 as LineCount
}

⑤ 약정 큐브

이행 큐브와 같은 차원 · 같은 측정값 이름으로 약정 스냅숏을 묶습니다. 이름과 차원이 같아야 두 큐브를 나란히 놓고 차이를 낼 수 있습니다.

@AccessControl.authorizationCheck : #CHECK
@Analytics.dataCategory : #CUBE
@EndUserText.label : '수입 계약 약정 큐브'
define view entity ZI_ImpContractPlanCube
  as select from zimp_ctplan as p
    inner join   ekko as h on h.ebeln = p.ct_no
{
  key p.plan_ver                                      as PlanVersion,
  key h.bukrs                                         as CompanyCode,
  key h.lifnr                                         as Supplier,
      @Aggregation.default : #SUM
      p.plan_qty                                      as PlanQty,
      @Aggregation.default : #SUM
      cast( p.plan_qty * p.plan_unit_fc * p.plan_fx as abap.curr(23,2) )  as PlanGoodsLc,
      @Aggregation.default : #SUM
      cast( p.plan_qty * p.plan_surch_fc * p.plan_fx as abap.curr(23,2) ) as PlanSurchargeLc
}

⑥ 분석 쿼리

행 · 열 기본 배치와 계산 측정값을 선언합니다. 계약 외 이행 비중은 합산이 아니라 분자와 분모를 각각 더한 뒤 나누는 식으로 둡니다.

@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '수입 계약 이행 분석'
@Analytics.query : true
define view entity ZC_ImpContractFulfilQuery
  as select from ZI_ImpContractFulfilCube
{
      @AnalyticsDetails.query.axis : #ROWS
  key MaterialGroup,
      @AnalyticsDetails.query.axis : #ROWS
  key Supplier,
      @AnalyticsDetails.query.axis : #COLUMNS
  key ShipPeriod,
      @EndUserText.label : '이행 금액 합계'
      FulfilAmountLc,
      @EndUserText.label : '계약 외 이행 금액'
      OffContractAmountLc,
      @EndUserText.label : '계약 외 이행 비중(%)'
      @AnalyticsDetails.query.formula : 'OffContractAmountLc / FulfilAmountLc * 100'
      @AnalyticsDetails.query.decimals : 2
      cast( 0 as abap.dec(9,2) ) as OffContractShare
}

⑦ 권한 (DCL)

집계 화면에서 권한을 드릴스루에만 걸면, 권한 없는 사람이 전체 합계에서 자기 몫을 빼 다른 범위의 숫자를 알아냅니다. 그래서 큐브를 읽는 자리에 겁니다. 권한 객체 이름은 환경에 맞게 확인합니다.

@EndUserText.label : '수입 계약 이행 큐브 권한'
@MappingRole : true
define role ZI_IMPCONTRACTFULFILCUBE {
  grant select on ZI_ImpContractFulfilCube
    where ( CompanyCode ) = aspect pfcg_auth ( F_BKPF_BUK, BUKRS, ACTVT = '03' )
      and ( Plant )       = aspect pfcg_auth ( M_BEST_WRK, WERKS, ACTVT = '03' );
}

⑧ 서비스 정의

쿼리를 OData 서비스로 게시하는 자리입니다. 서비스 바인딩에서 OData V2 를 선택해 게시하고, 활성화 후 화면 쪽 manifest 의 서비스 주소를 바꿉니다.

@EndUserText.label : '수입 계약 이행 분석 서비스'
define service ZUI_ImpContractAnalysis {
  expose ZC_ImpContractFulfilQuery as ContractFulfilQuery;
  expose ZI_ImpContractPlanCube    as ContractPlanCube;
}

운영 시점에 해야 할 일

개발보다 정하는 일이 많습니다. 아래 표의 왼쪽은 대부분 코딩이 아니라 합의입니다.

해야 할 일무엇을 정하나정하지 않으면누가
분류 매핑인코텀즈 묶음 · 계약 규모 구간 · 자재 분류리포트 분류가 기존 보고서와 어긋나 첫 회의에서 막힙니다구매 · 회계팀
프리미엄·할증 조건어느 조건 유형을 프리미엄 · 할증으로 읽을지, 물대와의 구분물대와 할증이 섞여 원가 점검이 안 됩니다구매 · 회계팀
약정 스냅숏약정을 체결 시점으로 고정할지, 변경을 반영할지계약이 바뀔 때마다 지난달 차이가 달라집니다구매 책임자
계약 연결 기준구매오더 라인이 계약 품목에 연결되었다고 보는 기준계약 외 이행이 과대 · 과소로 잡힙니다구매팀 · IT
환율 유형 · 환산 시점약정 환율과 이행 환율을 어느 유형 · 일자로 읽을지환율 요인이 회계 환산과 어긋납니다자금 · 회계팀
원천 확정선적 예정일 · 실제 선적일 필드, 약정 수량 필드납기 지연과 수량 요인이 비어 나옵니다IT · 물류팀
차원 범위공급사 · 원산지 등 차원 중 화면에 올릴 것조합이 폭증하거나 필요한 축이 빠집니다구매 · 경영지원
권한 설계회사코드 · 플랜트 권한과 역할누구나 합계를 보거나 반대로 아무도 못 봅니다IT · 보안
성능 기준큐브 행 수 · 응답 시간 · 파라미터 필수화대용량에서 화면이 멈춥니다IT
대사 체계표준 T-code 와 맞출 항목과 주기기존 보고서와 다를 때 확인 순서가 없습니다회계팀 · IT
전송(TR) 순서테이블 → 차원 → 큐브 → 쿼리 → DCL → 서비스활성화 오류로 전송이 되돌아옵니다IT
서비스 활성화서비스 게시와 manifest 서비스 주소 교체화면이 샘플 서비스를 계속 읽습니다IT
배치 등록에이전트 실행 호출을 주기적으로 부르는 잡화면을 열어야만 감시가 돕니다IT · 구매팀

위 항목이 끝나면 기술 작업은 CDS 뷰를 만들고 서비스를 게시한 뒤 화면의 서비스 주소를 바꾸는 일로 줄어듭니다.

숫자를 믿을 수 있는가 — 검증 결과

리포트에서 가장 비싼 질문은 “이 숫자 맞아?” 입니다. 그래서 만드는 쪽에서 먼저 대사식을 세워 두고 전수로 돌렸습니다. 아래는 이 사례(가상 샘플 데이터) 기준 결과입니다.

대사식검사 건수차이
큐브 합계 = 원천 라인 합계(선적월 × 측정값)480
약정 큐브 합계 = 원천 라인 약정 열 합계(선적월 × 측정값 5종)300
라인 이행 금액 재계산 = 저장 금액(물대 · 할증 · 합계)3,6200
라인 약정 금액 재계산 = 저장 약정 금액(계약 연결 라인)3,4560
피벗 총합 = 원천 총합(축 배치 6종 × 측정값 3종)180
피벗 칸 = 드릴스루 라인 합계(칸 13개)130
요인 합 − 총차이(전체 · 선적월 · 자재그룹 · 공급사 · 원산지 · 통화 · 운송수단 · 인코텀즈 범위)440
검산 결과 대조(측정값 8종)80

모든 대사식이 차이 0 입니다. 의도적으로 섞어 둔 예외는 “계약 외 이행” 라인 164건이며, 오류가 아니라 요인으로 분리해 합계에 포함했습니다. 화면 쪽은 이와 별도로 브라우저 자동화로 기능 15종을 돌려, 축을 바꿔도 합계가 변하지 않는지와 칸 금액이 드릴스루 라인 합계와 같은지를 확인했습니다.

운영 데이터로 갈 때 — 이행 라인이 수백만 건이면

이 사례는 이행 라인 3,620건이 큐브 6,525행이 됩니다. 라인이 늘어도 큐브 행 수는 라인 건수가 아니라 차원 조합 수를 따라갑니다. 문제는 조합이 많을 때입니다.

구간어떻게 되나무엇을 손보나
큐브 수천 행지금 방식 그대로 — 브라우저가 들고 묶어도 걸리지 않습니다손볼 것 없음
큐브 수만 ~ 수십만 행한 번에 읽는 양이 커집니다조회 조건을 필수로 두고, 기간과 회사코드로 범위를 먼저 좁힙니다
큐브 수십만 행 이상브라우저에서 묶기가 느려집니다묶기를 서비스 쪽(분석 쿼리)으로 옮기고 화면은 결과만 받습니다
이행 라인 수천만 건드릴스루가 전체를 읽으면 안 됩니다차원 조건을 서비스에 보내고 읽는 단위를 제한하며, 큐브는 야간에 미리 집계합니다

자주 묻는 질문

도입 상담과 데모에서 자주 나오는 질문들입니다. 네 묶음으로 나눠 적었습니다.

숫자와 산식

이행 금액 합계는 어떻게 계산합니까?

구매오더 이행 라인 한 줄마다 이행 수량 × 외화 단가 × 환율 로 물대를, 외화 프리미엄·할증 × 환율 로 프리미엄·할증을 원화로 구하고 둘을 더합니다. 큐브는 이 줄들을 차원 조합으로 더한 것이라 어느 축으로 묶어도 합계가 같습니다. 단가 · 할증 · 환율은 샘플의 가정값이며, 운영에서는 계약 조건과 회사 기준으로 정합니다.

칸 금액과 원천 라인 합계가 정말 같습니까?

같습니다. 큐브가 원천 이행 라인을 더해 만든 값이기 때문입니다. 샘플 검증에서 칸 13개를 골라 드릴스루 라인 합계와 대조했고 모두 차이가 0이었습니다. 화면도 드릴스루 창 위에서 칸 값과 라인 합계가 같은지 매번 판정해 보여 줍니다.

요인분해의 합이 정말 총차이와 같습니까?

같습니다. 약정값에서 이행값으로 한 번에 한 요인씩 실제 값으로 바꾸며 같은 식을 다시 계산하므로, 단계별 변화를 모두 더하면 총변화가 됩니다. 샘플에서는 전체 · 선적월 · 자재그룹 · 공급사 · 원산지 · 통화 · 운송수단 · 인코텀즈 범위 44곳을 검사했고 차이가 모두 0이었습니다. 화면에도 “요인 합 − 총차이 = 0원” 줄이 매번 표시됩니다.

요인의 순서를 바꾸면 요인별 금액이 달라지지 않습니까?

달라질 수 있습니다. 순차 대입은 어떤 순서로 바꾸느냐에 따라 요인 사이의 교차 효과가 어느 쪽에 얹히는지가 달라지기 때문입니다. 그래서 순서를 이행 수량 → 외화 단가 → 프리미엄·할증 → 환율로 고정해 두었고, 합계가 총차이와 같다는 성질은 어떤 순서에서도 유지됩니다. 순서를 다르게 정하고 싶다면 회사 기준으로 정한 뒤 서비스 쪽 계산 순서를 바꾸면 됩니다.

계약 외 이행은 무엇입니까?

계약 품목에 연결되지 않은 구매오더 라인입니다. 약정이 없으므로 이행 금액 전액을 별도 요인으로 분리하고, 약정 안의 수량 · 단가 · 할증 · 환율 요인과 섞지 않습니다. 샘플에는 164건이 의도적으로 섞여 있고 금액은 522.20억원으로 이행 금액의 3.4% 입니다. 계약 연결 기준은 회사마다 다르므로 운영에서 정해야 합니다.

납기 지연 라인은 어떻게 셉니까?

실제 선적일이 선적 예정일보다 늦은 라인을 지연으로 보고, 지연 일수는 따로 합산합니다. 샘플에서는 지연 라인이 1,296건(35.8%)이고 지연 라인의 평균 지연은 11.0일입니다. 선적일 필드는 환경마다 달라 운영에서 원천 필드를 확정해야 합니다.

임계값은 어떻게 정해집니까?

샘플의 임계(금액 2천만원 · 비율 3퍼센트, 감시 규칙의 비중 · 비율 상한)는 모두 가정값이며, 어떤 기준이 있는 값이 아닙니다. 회사의 허용 편차와 중요성 기준으로 정해 화면 설정과 규칙에서 바꿉니다. 임계를 넘었다는 표시는 점검이 필요하다는 안내이지 잘못이라는 판정이 아닙니다.

화면과 조작

축을 바꿀 때마다 서버를 다시 부릅니까?

아닙니다. 조회를 누르면 큐브와 약정 값을 한 번 읽어 오고, 이후 행 · 열을 바꾸는 조작은 브라우저가 들고 있는 데이터 위에서 일어납니다. 서버를 다시 부르는 것은 조회 조건을 바꿔 조회할 때, 칸에서 원천 라인으로 내려갈 때, 요인분해 · 해설 · 에이전트를 부를 때뿐입니다.

행 · 열을 몇 단계까지 쌓을 수 있습니까?

행 축은 3단계, 열 축은 2단계입니다. 열 조합이 상한(36개)을 넘으면 더 추가할 수 없고, 이미 넘은 경우에는 표를 반쯤 그리지 않고 범위를 좁히라는 안내를 먼저 보여 줍니다. 샘플에서 선적월 6개와 공급사 12개를 열에 놓으면 72 조합이 되어 안내가 나옵니다.

차이 색이 음수인데 초록으로 보이기도 합니다. 맞습니까?

맞습니다. 색은 부호가 아니라 약정에 대한 방향으로 칠합니다. 약정을 넘겨 이행한 쪽은 붉은색, 약정에 못 미친 쪽은 초록색이며, 금액 차이와 비율 차이가 둘 다 임계를 넘을 때만 칠합니다. 작은 금액의 큰 비율이나 큰 금액의 작은 비율로 화면이 알록달록해지는 것을 막기 위한 이중 임계입니다.

변동 사유는 어디에 저장됩니까? 축을 바꾸면 사라집니까?

서비스에 저장되고 키는 조회 범위와 행 경로입니다. 그래서 축 배치를 바꾸거나 트리를 다시 펼쳐도, 새로 고침해도 남습니다. 사유에는 주된 요인과 차이 금액 · 차이율이 함께 기록되며, 사유는 점검 메모이지 원인을 단정하는 문장이 아닙니다.

휴대폰에서도 쓸 수 있습니까?

390px 폭에서 영역이 세로로 쌓이고 차트가 표 아래로 내려가는 것을 확인했습니다. 표는 가로로 스크롤됩니다. 축을 짜는 일은 넓은 화면이 편하고, 숫자를 확인하는 용도로는 좁은 화면으로도 충분합니다.

CSV 는 어떤 것을 내려받습니까?

결과 영역의 CSV 는 지금 보이는 피벗을, 드릴스루 창의 CSV 는 읽은 원천 라인을 내려받습니다. 금액은 화면 단위가 아니라 원 단위 원값으로 담깁니다.

AI 분석과 에이전트

AI 가 숫자를 만들어 냅니까?

아닙니다. 금액과 비율은 서비스가 큐브에서 계산하고, 해설은 그 숫자를 읽어 문장으로 옮길 뿐입니다. 해설에 쓴 숫자마다 근거 표(축 · 값 · 라인 수 · 약정 · 실적 · 차이 · 주된 요인)가 붙고, 원인은 단정하지 않고 “확인 필요” 로 적습니다. 외부 AI 서비스는 연결 설정이 켜진 경우에만 쓰입니다.

AI 에이전트는 무엇을 합니까?

감시 규칙 여섯 개(공급사 계약 외 이행 비중 · 운송수단 납기 지연 · 자재그룹 할증률 · 이행 수량 요인 · 환율 요인 · 단가 요인)를 돌려, 임계값을 넘은 항목을 받을 역할(CFO · 구매 · 물류 · 자금) 관점의 보고로 대기함에 올립니다. 이번 샘플에서는 여섯 규칙 중 다섯 규칙이 걸렸습니다. 실행할 때마다 시각과 호출 주체, 판정이 활동 기록에 남습니다.

에이전트를 사람이 누르지 않아도 돌릴 수 있습니까?

서비스의 에이전트 실행 호출이 화면의 버튼과 같은 일을 하므로, 배치 잡이 그 호출을 주기적으로 두드리면 됩니다. 하루에 한 번만 실제로 돌도록 서버가 판정해서, 두 번째 호출은 제한됨(LIMITED)으로 기록되고 새 보고는 올라가지 않습니다.

PowerPoint 보고서는 어디서 만들어집니까?

브라우저 안에서 만들어집니다. 외부 라이브러리 없이 압축과 XML 을 직접 짓기 때문에 서버에 파일을 올리지 않고, 해설과 근거 표를 장으로 옮겨 담습니다. 만든 파일은 표준 슬라이드 파일로 열립니다.

도입과 운영

이 화면이 표준 화면을 대체합니까?

대체하지 않습니다. 계약 체결, 입고, 송장 검증, 전표 반영은 SAP 표준 T-code 가 담당하고, 이 화면은 그 결과를 여러 축으로 조회하고 검증하는 관점을 더해 확장합니다. 기존 표준 리포트도 법정 · 감사 · 세무 신고 대응용으로 그대로 둡니다.

이행 금액의 회계 처리는 누가 판단합니까?

이 화면은 분류 · 집계 · 대사를 돕는 점검 도구이며, 물대와 프리미엄·할증의 재고 원가 산입 여부(IAS 2 재고자산, K-IFRS 제1002호)와 외화 대금의 환산(IAS 21 환율변동효과, K-IFRS 제1021호), 관세와 세무 신고는 판단하지 않습니다. 최종 판단은 회사와 감사인이, 세무 신고는 회사와 세무 대리인 · 관세사가 합니다.

샘플의 값은 실제 값입니까?

아닙니다. 공급사 · 계약 번호 · 구매오더 번호 · 금액은 모두 가상이고, 단가 · 할증 · 환율 · 임계값은 가정값입니다. 사례의 요인별 금액도 샘플의 결과이며 실제 환경의 크기를 말하는 것이 아닙니다.

적용 시기와 범위는 어떻게 됩니까?

회사의 계약 관리 기준과 SAP 시스템 구성에 따라 달라집니다. 이 글은 확인된 사실만 적었고, 샘플 기간은 2026년 4월부터 9월입니다. 어느 계약 유형과 자재까지 올릴지는 도입 협의에서 정합니다.

외화와 환율은 어떻게 처리합니까?

외화 단가와 외화 프리미엄·할증을 외화로 들고 있다가 환율을 곱해 원화 금액을 만듭니다. 환율은 요인분해의 독립 요인이라 환율이 이행 금액에 얼마나 영향을 줬는지가 따로 나옵니다. 환율 유형과 환산 시점은 운영에서 정하며, 회계 환산과 같은지는 확인이 필요합니다.

운영 시스템에 연결하는 절차는 어떻게 됩니까?

순서가 있습니다. 먼저 분류 매핑과 프리미엄·할증 조건, 약정 스냅숏, 환율 원천에 대한 합의를 하고, CDS 객체를 만들어 서비스로 게시한 뒤, 화면의 서비스 주소를 바꾸고 표준 T-code 와 대사합니다. 소요는 합의 범위에 가장 크게 좌우되며 기술 작업은 상대적으로 작습니다.

권한은 어떻게 걸립니까?

CDS 에 DCL 을 붙여 회사코드와 플랜트 권한을 표준 권한 객체로 따릅니다. 별도의 권한 체계를 만들지 않습니다. 권한을 드릴스루에만 걸면 전체 합계와 자기 몫의 차이로 다른 범위를 알아낼 수 있으므로 큐브를 읽는 자리에 겁니다.

데이터가 아주 많으면 느려지지 않습니까?

데모는 서비스가 라인을 들고 브라우저가 큐브를 묶는 구조라 운영 규모에서는 그대로 쓰지 않습니다. 큐브 행 수는 라인 수가 아니라 차원 조합 수를 따르므로 먼저 범위를 좁히고, 규모가 커지면 묶기를 분석 쿼리로 옮기고 큐브를 미리 집계합니다. 드릴스루는 차원 조건을 서비스에 보내고 읽는 단위를 제한합니다.

분류 체계나 매핑이 바뀌면 어떻게 됩니까?

인코텀즈 묶음과 계약 규모 구간 같은 분류는 매핑 테이블에서 읽으므로 코드를 고치지 않고 행만 바꿉니다. 유효기간을 두어 과거 기간의 숫자가 흔들리지 않게 하고, 바꾼 뒤에는 대사식을 다시 돌려 차이가 0인지 확인합니다.

숫자가 기존 보고서와 다르면 어떻게 확인합니까?

순서가 있습니다. 먼저 조회 범위(회사코드 · 기간)가 같은지, 다음으로 계약 연결 기준과 프리미엄·할증 포함 범위가 같은지, 그다음 환율 기준이 같은지를 봅니다. 그래도 다르면 드릴스루로 칸을 이룬 라인을 열어 구매오더 번호로 표준 T-code 에서 원천을 확인합니다.

누가 쓰는 화면입니까?

구매 · 물류 · 자금 · 회계 담당과 책임자가 같은 큐브를 서로 다른 역할 관점으로 봅니다. CFO 는 자재그룹 단위 이행 금액과 약정 편차를, 구매 책임자는 공급사별 계약 외 이행을, 물류 책임자는 운송수단별 납기 지연을, 자금 책임자는 통화별 환율 영향을 앞세워 봅니다.