SAP 고객별 공헌이익 점검 — 매출은 있는데 남는 게 없는 거래를 먼저 찾는다
고객별 매출과 변동비, 배분 고정비를 단계별로 대사해 공헌이익률이 낮거나 역마진인 거래를 결산 전에 걸러 둡니다
같은 매출이라도 고객마다 남는 돈은 다릅니다. 변동매출원가와 변동판매비를 뺀 공헌이익이 충분해야 고정비를 감당하고도 영업이익이 남는데, 할인이나 물량 조건이 쌓이다 보면 매출은 잡히는데 실제로는 남는 게 거의 없거나 오히려 마이너스인 거래가 섞이기 마련입니다. 결산 시점에 전사 손익만 보면 이런 개별 거래는 묻혀서 잘 드러나지 않습니다.
수익성분석 데이터를 그대로 이어받아 고객·기간 단위로 매출 → 공헌이익(1) → 공헌이익(2) → 영업이익을 단계별로 산출하고, 공헌이익률이 임계치 미만이거나 역마진인 거래를 OpenUI5 화면으로 확장해 걸러냈습니다. 실제 구동 화면 3종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 수익성 집계 — 수익성분석(CO-PA) 세그먼트 데이터의 매출·원가 구조를 그대로 사용
- 청구 — 청구 문서(
VBRP)의 순매출 금액을 그대로 사용 - 표준 화면 — 수익성 보고서(KE30) · 명세 라인 조회(KE24) · 청구 조회(VF03)
| 항목 | 내용 |
|---|---|
| 업무 영역 | 관리회계(CO) · 수익성 분석 |
| 관련 기준서 | - |
| Namespace | zui5.custprofit |
| 셸 구조 | 조회조건 영역(우측 조회) + 대사 요약 + 고객별 공헌이익 명세, 상세 Dialog |
| 화면 수 | 조회 화면 1개 + 상세 다이얼로그 |
| SAP 표준 T-code | KE30 · KE24 · VF03 |
| 데이터 연동 방식 | OData V2 — 화면 블록마다 엔티티셋에 직접 바인딩 |
| 성격 | 조회·대사·점검형 — 가격·배분 기준 변경은 화면 밖 프로세스 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 3종 둘러보기
회계연도·기간을 넣고 조회하면 대사 요약과 고객별 공헌이익 명세가 한 화면에 뜹니다 → 공헌이익률이 낮은 고객이 위로 정렬되어 점검 필요 표시를 바로 확인합니다 → 행을 클릭하면 제품군별 상세가 열립니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회계연도와 기간(월)을 입력하고 영업조직을 선택합니다. "전체"를 선택하면 조건 없이 전체 고객을 조회합니다.
- 조회 버튼은 조회조건 입력 필드 줄의 가장 오른쪽에 있습니다. 입력 필드에서 Enter 키를 눌러도 같은 조회가 실행됩니다.
- 대사 요약에서 총매출·총공헌이익·총영업이익·대상 고객수·점검 필요 건수를 먼저 확인합니다.
- 명세 표는 공헌이익률이 낮은 순으로 기본 정렬되어 있습니다. 행을 클릭하면 제품군별 상세가 열립니다.
- CSV 다운로드로 현재 조회 결과를 내려받을 수 있습니다.
- 초기화 버튼을 누르면 기본 조회조건으로 되돌아갑니다.
임계치 밑으로 떨어진 고객을 가르는 판정 로직
공헌이익률과 공헌이익(2)의 부호를 함께 봐서 확인이 필요한 거래를 가려냅니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 공헌이익(2)가 0보다 작음(역마진) | 점검 필요 | 변동비·판매비 배분 기준과 할인·리베이트 반영 여부를 확인합니다. |
| 공헌이익률이 임계치(5.0%) 미만 | 점검 필요 | 가격 조건, 물량 할인, 변동비 배분 비율을 재검토합니다. |
| 그 외(공헌이익률 5.0% 이상이고 공헌이익(2) 0 이상) | 정상 | 별도 조치가 필요하지 않습니다. |
이 화면이 대신 정하지 않는 것
판정 결과는 확인이 필요한 거래를 알리는 표시이며, 손실 거래라고 단정하지 않습니다. 배분 고정비 기준의 타당성, 일시적 할인·리베이트 반영 여부는 회사가 판단합니다. 최종 판단은 회사와 감사인이 합니다.
매출에서 영업이익까지 5단계 산출
| 단계 | 내용 |
|---|---|
| 1단계 | 공헌이익(1)을 산출한다 — 공헌이익(1) = 매출 − 변동매출원가 |
| 2단계 | 공헌이익(2)를 산출한다 — 공헌이익(2) = 공헌이익(1) − 변동판매비 |
| 3단계 | 영업이익을 산출한다 — 영업이익 = 공헌이익(2) − 배분 고정비 |
| 4단계 | 공헌이익률을 계산한다 — 공헌이익률 = 공헌이익(2) ÷ 매출 × 100 |
| 5단계 | 대사한다 — 고객·제품군 합계 = 고객 합계, 고객 합계 = 조회 조건 전사 합계 |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 회계연도 | 필수 | 4자리 회계연도 |
| 기간(월) | 필수 | 3자리 회계기간 |
| 영업조직 | 선택 | 전체 / 본사 영업조직 / 지사 영업조직 |
결과 컬럼
| 영역 | 컬럼 · 표시 |
|---|---|
| 대사 요약 | 총매출 · 총공헌이익(2) · 총영업이익 · 대상 고객수 · 점검 필요 건수 |
| 고객별 공헌이익 명세 | 고객코드 · 고객명 · 영업조직 · 매출 · 변동매출원가 · 공헌이익(1) · 변동판매비 · 공헌이익(2) · 배분 고정비 · 영업이익 · 공헌이익률 · 점검결과 |
| 고객별 제품군 상세 | 제품군 · 매출 · 변동매출원가 · 공헌이익(1) · 공헌이익률 |
SAP 표준 기능 매핑
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 그 데이터에 고객별 공헌이익 구조 조회·점검 관점을 더해 확장합니다.
| 표준 T-code | 표준 기능 | 이 화면이 더한 것 |
|---|---|---|
KE30 | 수익성 보고서 실행 | 고객 단위 매출·원가 집계를 공헌이익 단계로 재구성합니다 |
KE24 | 수익성분석 명세 라인 조회 | 제품군별 상세 명세의 표준 조회 경로 |
VF03 | 청구 문서 조회 | 매출 원천 확인용 표준 조회 화면 |
분석 지표 정의표
| 지표 | 정의 | 대응 기능 | 원천 데이터 |
|---|---|---|---|
| 공헌이익률 | 공헌이익(2) ÷ 매출 | 고객별 명세 조회·정렬 | 수익성분석(CO-PA) 세그먼트 데이터 |
| 공헌이익 폭포(Waterfall) | 매출 → 공헌이익(1) → 공헌이익(2) → 영업이익 단계적 차감 | 결과 명세 컬럼 구성 | 수익성분석, 원가센터 배부 결과 |
참고 CDS 뷰
| 원천 테이블 | 주요 필드 | 쓰임 |
|---|---|---|
VBRK / VBRP | VBELN · FKDAT · KUNAG · NETWR | 고객별 매출 금액 |
ACDOCA | RBUKRS · GJAHR · RACCT · HSL | 변동원가·변동판매비·고정비 배분 요소 |
KNA1 | KUNNR · NAME1 | 고객명, 영업조직 배정 |
define view entity ZC_CustomerMargin
as select from I_BillingDocumentItem as bi
inner join I_Customer as cust on cust.Customer = bi.SoldToParty
{
key cust.Customer as SoldToId,
cust.CustomerName as SoldToName,
bi.SalesOrganization as SalesOrg,
sum(bi.NetAmount) as Revenue
}
group by cust.Customer, cust.CustomerName, bi.SalesOrganization
표준 CDS 뷰 이름과 필드는 시스템 릴리스에 따라 다를 수 있으므로, 도입 시 실제 시스템에서 확인해 확정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 · 구성 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 패널 · 대사 요약 패널 · 명세 표 |
| 데이터 연동 | manifest.json 에 OData V2 서비스를 상대 경로로 선언 — 화면 블록마다 엔티티셋에 직접 바인딩합니다. 전사 합계는 Function Import 로 조회합니다 |
| 조회조건 | sap.m.Input · sap.m.Select — 우측 끝에 조회·초기화 버튼, Enter 키로 즉시 재조회, sap/ui/model/Filter로 조건을 조립합니다. "전체"를 고른 조건은 필터를 만들지 않습니다 |
| 정렬 · 총건수 | sap/ui/model/Sorter로 공헌이익률 오름차순 정렬, 총건수는 모델의 inline count 기능으로 얻습니다 |
| 명세 표 | sap.ui.table.Table — 행 클릭 시 상세 다이얼로그(rowBindingContext 로 컨텍스트 전달) |
| 상세 표 | sap.m.Table — sap.m.ObjectStatus로 점검결과를 표준 ValueState 로만 표시 |
| 공통 처리 | CSV 다운로드 공통 컨트롤러(UTF-8 BOM), 전역 오류 처리기 — 메타데이터 로드 실패·요청 실패·빈 응답을 구분해 안내 |
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon, OData 서비스에 연결 |
Component.js | 화면 상태 모델 초기화, 전역 오류 처리기 연결 |
manifest.json | 앱 디스크립터 — zui5.custprofit · ko 로케일, OData 서비스와 모델 선언 |
view/Main.view.xml | 조회조건 · 대사 요약 · 명세 표 |
view/DetailDialog.fragment.xml | 제품군별 상세 다이얼로그 |
controller/Main.controller.js | 조회조건 조립 · 바인딩 · 다이얼로그 · CSV 다운로드 |
controller/BaseController.js | CSV 다운로드 공통 처리 |
model/ErrorHandler.js | 전역 오류 처리 |
model/formatter.js | 금액 · 비율 · 상태 표시 서식 |
i18n/i18n_ko.properties | ko 로케일 리소스 |
운영 데이터는 OData 서비스가 제공하며, 검증용 샘플 데이터는 화면과 완전히 분리해 별도로 둡니다. 화면과 판정 로직은 그대로 씁니다.
검증 결과
화면 구성에 쓴 검증용 샘플 데이터는 20개 고객 × 2개 기간, 총 40건의 명세를 기준으로 매출·변동비·고정비 배분이 원(KRW) 단위로 맞물리도록 구성했습니다.
| 검증 항목 | 결과 |
|---|---|
| 공헌이익(1) = 매출 − 변동매출원가 | 통과(차이 0) |
| 공헌이익(2) = 공헌이익(1) − 변동판매비 | 통과(차이 0) |
| 영업이익 = 공헌이익(2) − 배분 고정비 | 통과(차이 0) |
| 공헌이익률 = 공헌이익(2) ÷ 매출 × 100 | 통과(차이 0) |
| 제품군별 명세 합계 = 고객 합계 | 통과(차이 0) |
| 고객 합계 = 조회 조건 전사 합계 | 통과(차이 0) |
| 점검 필요 판정(저마진·역마진) 검증용 배치 | 40건 중 6건 (의도적으로 구성한 케이스) |
| 조회 조건 전달 — 필터 · 정렬 · 총건수 확인 | 확인 |
| 표시 금지 검사 — 커스텀 프로그램ID·앱 식별자·출처 표현 검출 | 0건 |
| 화면 렌더링 — 실브라우저에서 조회 → 행 클릭 상세까지 실동작 후 캡처 | 3/3 |
조회 버튼 위치 · sap_horizon 테마 · Enter 키 조회 · 서비스 미연결 시 오류 안내 | 확인 |
모든 데이터는 검증용으로 구성한 가상 데이터입니다.
자주 묻는 질문
이 화면의 판정이 곧 손실 거래를 의미하나요?
아닙니다. 공헌이익률이 임계치 미만이거나 공헌이익이 음수인 거래를 먼저 걸러 보여주는 점검 도구이며, 배분 고정비 기준이나 일시적 할인 등 다른 요인이 있을 수 있습니다. 원가 배분 기준의 타당성을 포함한 최종 판단은 회사와 감사인이 합니다.
이 화면은 어떤 기간·조직을 대상으로 하나요?
회계연도와 기간(월) 단위로 조회하며, 영업조직을 지정하거나 전체로 조회할 수 있습니다. 그 밖의 적용 범위나 산정 기준의 세부 사항은 도입 시스템에서 확인이 필요합니다.
공헌이익률 임계치는 고정된 값인가요?
화면 로직상 참고 임계치를 두고 있으며, 업종·제품 특성에 따라 회사가 별도로 정한 기준이 있다면 그 기준을 반영해 조정할 수 있습니다.
제품군별 상세는 어떻게 확인하나요?
고객별 명세에서 행을 클릭하면 해당 고객·기간의 제품군별 매출·변동원가·공헌이익 상세가 팝업으로 열립니다.