SAP 운임 반영 수익성 점검 — 매출총이익은 남는데 운임을 반영하면 적자가 되는 오더를 찾는 월마감 점검
운임 반영 공헌이익 · 적자 전환 · 운임률 초과 · 청구 누락 점검 · 노선과 월 집계 · 숫자를 스스로 검산하는 대사 — 소개 영상과 실제 화면 8종, 그리고 CDS 코드까지
소개 영상1분 26초8개 장면음성 안내·자막문제 제기 → 점검 판정 → 노선 · 월 → 운임 구성 → 대사 검증
도입 포인트 — 이 앱을 사용해야 하는 이유
월마감 회의에서 영업과 물류가 같은 질문으로 부딪칩니다. 매출총이익은 남는데 왜 공헌이익은 줄었나, 운임은 누가 부담했나, 청구는 제대로 했나. 지금 이 세 답은 판매 오더 · 청구 문서 · 운송 비용 문서에 흩어져 있고, 한 오더의 운임이 이익을 얼마나 깎았는지는 엑셀에서 세 화면을 붙여야 나옵니다.
이 앱은 오더 한 건의 순매출, 표준 매출원가, 운임 비용, 고객에게 청구한 운임을 한 줄에 놓고 운임 반영 공헌이익을 다시 계산합니다. 그리고 적자로 돌아선 오더, 운임률이 높은 오더, 받아야 할 운임을 받지 못한 오더를 골라 노선과 월 단위로 다시 묶어 보여 줍니다. 관련 기준서는 없는 내부 관리 목적의 점검 화면이며, 대상 영역은 수익성 분석입니다.
매출총이익만 보면 운임이 이익을 깎는 자리가 가려진다
표준 수익성 리포트는 매출과 원가의 차이를 잘 보여 주지만, 운임은 운송 비용 문서와 청구 문서에 따로 있어 오더 단위로 만나는 자리가 없습니다. 이 샘플의 전체 숫자가 그 예입니다. 매출총이익률은 23.87% 인데 운임 비용 3,060만 원 가운데 고객에게 청구된 것은 1,384만 원(회수율 45.2%)뿐이어서, 운임을 반영한 공헌이익률은 21.75% 로 내려옵니다. 평균으로는 2.1%p 지만 오더 단위로 내려가면 매출총이익이 흑자인데 운임 반영 후 적자가 되는 오더가 7건 나옵니다.
점검은 건 하나가 아니라 노선과 월로 묶어야 의미가 있다
소량 긴급 발송 한 건의 운임률이 높은 것은 사정이지만, 같은 노선이 달마다 기준을 넘으면 계약이나 운송방식의 문제입니다. 그래서 같은 점검을 오더 · 노선 · 월 세 수준에서 하고, 세 수준의 합이 같은지를 대사식으로 검사합니다. 이 샘플에서는 노선 60행 중 23행, 월 9행 중 5행이 기준을 넘도록 구성해 두었습니다.
점검 도구는 판단을 대신하지 않는다
점검 필요는 기준을 넘었으니 근거를 확인하라는 표시이지 잘못이라는 판정이 아닙니다. 그래서 원인을 단정하는 문구를 쓰지 않고, 걸린 기준과 눌러서 내려갈 수 있는 근거(운임 구성 줄 · 표준 거래 문서)를 함께 줍니다. 최종 판단은 회사가 합니다.
사용 방법
- 조회조건을 채웁니다. 회계연도는 필수이고, 전기 월 범위 · 지역 · 운송방식 · 고객 · 점검 결과는 선택입니다. 비워 두면 전체입니다.
- 조건 줄 오른쪽 끝의 조회 버튼을 누르거나 입력칸에서 Enter 를 누릅니다. 처음 열면 자동으로 한 번 조회됩니다.
- 조건 아래 요약 아홉 개를 확인합니다. 점검 필요 오더 · 노선 · 적자 전환 오더가 먼저 눈에 들어옵니다.
- 탭을 오더 명세 → 노선 → 월별 추이 → 운임 구성 → 대사 결과 순서로 옮겨 가며 범위를 좁힙니다.
- 오더 · 노선 · 월 행을 누르면 상세가 열립니다. 오더는 운임 구성 줄을, 노선과 월은 그 범위의 오더 명세를 보여 줍니다.
- CSV 내려받기 로 지금 보는 탭의 조회 결과를 내려받습니다(UTF-8, 엑셀에서 바로 열림).
숫자를 믿을 수 있는가 — 검증 결과
점검 화면에서 가장 비싼 질문은 “이 숫자 맞아?” 입니다. 만드는 쪽에서 먼저 대사식을 세우고 전수로 돌린 결과입니다.
| 대사식 | 검사 건수 | 차이 |
|---|---|---|
| 매출총이익 = 순매출 − 표준 매출원가 | 216 | 0 |
| 운임 비용 = 운임 구성 비용 줄 합계 | 216 | 0 |
| 청구 운임 = 운임 구성 청구 줄 합계 | 216 | 0 |
| 운임 반영 공헌이익 = 매출총이익 − (운임 비용 − 청구 운임) | 216 | 0 |
| 청구 차이 = 청구 운임 − 약정 청구 운임 | 216 | 0 |
| 노선 합계 = 월 합계 = 전사 합계 | 18 | 0 |
| 운임률 = 운임 비용 ÷ 순매출 × 100 (반올림 오차 0.0050 허용 안) | 216 | 0 |
일곱 가지 대사식이 모두 차이 0 입니다. 운임률 대사의 최대 차이 0.0050 은 반올림 오차로 허용 오차 안입니다. 점검 필요 45건(적자 전환 7 · 운임률 초과 23 · 청구 누락 15)은 의도적 예외로 넣은 것이며 대사 차이와 별개입니다. 화면 쪽은 브라우저 자동화로 조건 조합별 건수와 상세 합계가 눌렀던 행과 같은지를 따로 확인했습니다.
무엇으로 만들었나
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 | OpenUI5 표준 컨트롤(조회조건 · 요약 · 탭 · 표 · 상세 창) | 사내망 보안 심사에서 외부 차트 라이브러리를 들이지 않아도 되도록 표준 컨트롤만 썼습니다. |
| 집계 · 판정 | 서비스 쪽 로직 파일 한 개 | 점검 판정과 노선 · 월 집계를 화면이 아니라 서비스가 맡아야 다른 화면 · 배치 · 보고서가 같은 판정을 씁니다. |
| 데이터 연결 | OData V2 서비스 하나, 오더 · 운임 구성 · 노선 · 월 · 대사 다섯 묶음 | 탭마다 해당 묶음에 바로 연결되고, 조건은 필터로, 정렬 · 페이징은 서비스 질의로 보냅니다. 운영에서는 서비스 주소만 바꿉니다. |
| 오류 처리 | 연결 실패 · 요청 실패 · 빈 응답을 구분해 안내 | 서비스가 없을 때와 조건에 맞는 데이터가 없을 때를 같은 빈 화면으로 보이지 않게 하기 위해서입니다. |
| 테마 | SAP Horizon | Fiori 와 같은 모양이라 현업이 따로 배울 것이 없습니다. |
| 항목 | 내용 |
|---|---|
| 업무 영역 | 관리회계(CO) — 수익성 분석 |
| 관련 기준서 · 대상 영역 | - (대상 영역: 수익성 분석 · 운임 반영 공헌이익) |
| SAP 표준 T-code | VA03 · VF03 · VI03 · KE24 · KE30 (원천 확인 연계) |
| 화면 성격 | 조회 · 점검 화면 — 판단은 회사 |
VA03 · VF03 · VI03)에서 다시 확인할 수 있습니다.실행 화면
실제로 돌아가는 화면 8종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 하는 자리이고 왜 그렇게 두었는지를 아래에 적었습니다.
처음 열었을 때
조회조건 한 줄과 요약 아홉 개, 그 아래 다섯 탭이 한 화면에 놓입니다. 화면을 열면 자동으로 한 번 조회하므로 빈 화면에서 시작하지 않습니다. 숫자는 모두 같은 자료에서 나온 것이라 화면끼리 맞춰 보셔도 됩니다.

맨 위는 조회조건 한 줄이고, 조회 버튼은 그 줄의 오른쪽 끝에 있습니다. 입력칸에서 Enter 를 눌러도 같은 조회가 돕니다. 그 아래 요약 아홉 개(순매출 · 운임 비용 · 청구 운임 · 운임률 · 운임 반영 공헌이익 · 점검 필요 오더 · 점검 필요 노선 · 적자 전환 오더 · 정합성 대사 차이)가 이번 조회 범위의 숫자입니다. 화면을 처음 열면 자동으로 한 번 조회하므로 빈 화면에서 시작하지 않습니다.

점검 결과 조건은 서비스에 $filter 로 전달되어 서버가 걸러 주므로, 화면이 전체를 받아 숨기는 방식이 아닙니다. 남은 45건은 첫 번째로 걸린 기준 코드와 점검 내용이 함께 보이고, 운임 반영 공헌이익이 낮은 순으로 정렬해 두면 손실이 큰 오더부터 읽습니다. 걸린 기준이 여럿이면 코드는 하나만 보여 주고 점검 내용에 모두 적습니다.
노선과 월로 묶어 보기
오더 한 건씩 볼 때는 보이지 않던 편차가 묶으면 드러납니다. 노선은 지역과 운송방식의 조합, 월은 전기 월 단위입니다.

오더 한 건씩 보면 보이지 않던 편차가 노선으로 묶으면 드러납니다. 같은 지역이라도 육상과 항공의 운임률이 크게 다르고, 운임률 5.5% 초과 또는 반영 공헌이익률 15% 미만인 노선에는 점검 필요가 붙습니다. 행을 누르면 그 월 · 그 노선에 속한 오더 명세가 열립니다.

월마감 회의에서 가장 먼저 열리는 탭입니다. 운임률이 4% 를 넘거나 점검 필요 오더가 6건 이상인 달에 점검 필요가 붙습니다. 9개월 가운데 5개월이 기준을 넘도록 샘플을 구성해 두어 점검 표시가 실제로 어떻게 보이는지 확인할 수 있습니다.

노선 숫자가 이상할 때 "어느 오더 때문인가" 를 묻는 자리입니다. 명세의 합계는 노선 행의 숫자와 같아야 하고, 이 합계 일치는 대사식(노선 합계 = 월 합계 = 전사 합계)으로 검사합니다.
한 오더의 운임 구성까지 내려가기
숫자를 의심할 때 같은 화면 안에서 줄 단위로 내려갑니다. 비용 줄과 청구 줄이 어디서 나왔는지, 걸린 기준이 무엇인지를 한 번에 봅니다.

운임 비용과 청구 운임이 어느 줄에서 나왔는지를 보는 자리입니다. 비용 줄 합계가 오더의 운임 비용과, 청구 줄 합계가 청구 운임과 같아야 하며 이 두 등식은 대사식으로 전수 검사합니다. 운송사 이름도 줄에 붙어 있어 어느 운송사의 비용이 큰지 바로 보입니다.

위쪽에는 순매출에서 운임 반영 공헌이익까지 내려오는 계산이, 아래쪽에는 운임 구성 줄이 있습니다. 점검 내용 칸에는 이 오더가 걸린 기준이 모두 적혀 있어서, 표준 거래(VA03 · VF03 · VI03)에서 어느 값을 대조해야 하는지가 바로 정해집니다.
숫자를 믿어도 되는가
이 화면은 점검 도구라 자기 숫자를 먼저 의심합니다. 대사 결과 탭이 그 답입니다.

숫자를 믿어도 되는지를 화면이 스스로 보여 주는 탭입니다. 차이 건수가 0 이 아니면 요약의 대사 차이 칸이 바뀌어 처음 화면에서도 알 수 있습니다. 운임률 대사의 최대 차이 0.0050 은 소수 둘째 자리 반올림 오차입니다.
화면 뒤에서 일어나는 일
조회를 누르면 조회조건이 필터로 바뀌어 서비스로 갑니다. 서비스가 조건에 맞는 오더를 골라 점검 판정과 노선 · 월 집계를 돌려주고, 화면은 받은 그대로 보여 줄 뿐 판정을 다시 하지 않습니다. 같은 판정을 다른 화면이나 배치가 쓸 수 있게 하려는 구조입니다.
점검 판정 규칙
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 매출총이익은 0 보다 큰데 운임 반영 공헌이익이 0 보다 작음 (코드 F01) | 점검 필요 | 운임 구성 줄을 열어 어느 항목이 이익을 넘었는지, 청구 조건이 맞는지 확인 |
| 운임률(운임 비용 ÷ 순매출)이 8% 초과 (코드 F02) | 점검 필요 | 소량 · 원거리 · 긴급 할증 여부와 운송방식 선택 근거 확인 |
| 청구 운임이 청구 조건에 따른 약정 청구 운임보다 적음 (코드 F03) | 점검 필요 | 고객 청구 누락 여부와 청구 문서(VF03) 확인 |
| 노선 운임률 5.5% 초과 (F11) 또는 반영 공헌이익률 15% 미만 (F12) | 점검 필요(노선) | 노선 안의 오더 명세를 열어 편차 큰 건 확인 |
| 월 운임률 4% 초과 또는 점검 필요 오더 6건 이상 | 점검 필요(월) | 해당 월 오더 명세 확인 |
| 위에 해당하지 않음 | 정상 | - |
한 건이 여러 기준에 걸리면 F01 → F02 → F03 순서로 코드를 하나 보여 주고, 점검 내용에는 걸린 기준을 모두 적습니다. 원인은 단정하지 않고 “점검 필요” 로 표시합니다.
산출 순서
- 매출총이익 = 순매출 − 표준 매출원가
- 순 운임 부담 = 운임 비용 − 청구 운임, 운임 반영 공헌이익 = 매출총이익 − 순 운임 부담
- 운임 비용 = 운임 구성의 비용 줄 합계, 청구 운임 = 운임 구성의 청구 줄 합계
- 청구 차이 = 청구 운임 − 약정 청구 운임 (0 보다 작으면 미청구)
- 운임률 = 운임 비용 ÷ 순매출 × 100, 운임 회수율 = 청구 운임 ÷ 운임 비용 × 100, 반영 공헌이익률 = 운임 반영 공헌이익 ÷ 순매출 × 100
- 노선 · 월 합계 = 오더 합계, 노선 합계 = 월 합계 = 전사 합계
조회조건
| 조건 | 필수 | 기본값 | 서비스로 보내는 방식 |
|---|---|---|---|
| 회계연도 | 필수 | 2026 | 필터 하나(연도 일치) |
| 전기 월 시작 · 종료 | 선택 | 전체 | 둘 다 있으면 범위 하나로 묶어 보냄 |
| 지역 · 운송방식 · 고객 | 선택 | 전체 | 값을 고르면 각각 일치 조건으로 보냄 |
| 점검 결과 | 선택 | 전체 | 점검 필요를 고르면 일치 조건으로 보냄 |
“전체” 는 코드값으로 보내지 않고 해당 조건을 빼는 방식입니다. 그래서 새 운송방식이 생겨도 전체 조회가 깨지지 않습니다.
결과 컬럼
| 컬럼 | 의미 | 산출 |
|---|---|---|
| 순매출 | 운임 청구분을 뺀 오더 매출 | 판매 오더 품목 순금액의 오더별 합 |
| 표준 매출원가 | 품목 표준원가 × 수량 | 품목 평가 데이터의 표준원가 기준(확인 필요) |
| 운임 비용 | 운송 비용 문서의 비용 줄 합 | 운임 구성의 비용 줄 합계 |
| 청구 운임 | 고객에게 청구한 운임 | 운임 구성의 청구 줄 합계 |
| 청구 차이 | 받았어야 하는 운임과의 차이 | 청구 운임 − 약정 청구 운임 |
| 운임 반영 공헌이익 | 운임까지 반영한 이익 | 매출총이익 − (운임 비용 − 청구 운임) |
| 운임률 · 회수율 · 반영 공헌이익률 | 비율 지표 | 위 산출식 참조 |
| 점검 결과 · 코드 · 내용 | 걸린 기준과 사용자 조치 단서 | 판정 규칙표 |
좁은 화면에서 달라지는 것
폭이 줄면 조회조건이 여러 줄로 접히고 요약이 두 열로 쌓이며, 표는 가로로 넘겨 봅니다. 상세 창은 화면 폭에 맞춰 전체 폭으로 열립니다. 기능은 줄어들지 않고 배치만 달라집니다.
파일 구성
화면 진입(index) · 설명서 · 앱 구성(Component · manifest)
controller/ 화면 흐름 (기본 컨트롤러 + 메인)
view/ 메인 화면 + 상세 창
model/ 숫자 표시 규칙 · 오류 안내
odata/ 서비스 정의(메타데이터) + 서비스 로직 + 샘플 자료
media/ 소개 영상
SAP 표준 기능 확장 포인트
이 앱은 SAP 표준을 대체하지 않습니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회 · 검증 관점을 더해 확장합니다. 어디까지가 표준이고 어디서부터 이 앱인지를 먼저 적습니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | SAP 표준 | 표준에서 걸리는 자리 | 이 앱이 하는 일 |
|---|---|---|---|
| 판매 오더의 금액과 수량 확인 | VA03 · VA05 | 오더 한 건씩 열어야 하고 운임은 다른 문서에 있습니다 | 오더 216건을 한 표에 놓고 운임까지 같은 줄에서 봅니다 |
| 고객 청구 운임 확인 | VF03 · VF04 | 청구 문서 단위라 오더의 운임 비용과 나란히 놓이지 않습니다 | 청구 운임을 오더 줄에 붙여 비용과 바로 비교합니다 |
| 운송 비용 확인 | VI03 | 운송 비용 문서 단위라 오더 매출과 만나지 않습니다 | 비용 줄을 오더 줄로 모아 운임률을 계산합니다 |
| 수익성 분석 라인 조회 | KE24 · KE5Z | 운임이 어느 가치 필드로 흘렀는지는 보여 주지만 오더별 청구 누락은 판정하지 않습니다 | 청구 누락 · 운임률 초과 · 적자 전환을 기준으로 골라냅니다 |
| 수익성 리포트 | KE30 | 특성별 합계는 있지만 운임 구성 줄 단위의 근거로 내려가지 못합니다 | 노선 · 월 합계를 같은 기준으로 만들고 줄까지 내려갑니다 |
| 받았어야 할 운임 판정 | 없음 | 표준에 없습니다. 고객별 청구 조건은 영업 담당자의 기억이나 엑셀에 있습니다 | 청구 조건 매핑을 두고 약정 청구 운임과 비교해 청구 차이를 냅니다 |
T-code 별 연계 지점
이 앱이 표준 거래의 어느 자리를 이어받는지를 적었습니다. 운영에 올릴 때 “기존 리포트를 없애야 하나” 는 질문이 꼭 나오는데, 대부분은 없애지 않고 둡니다. 대사와 감사 대응은 표준 거래가 맡는 편이 안전합니다.
| T-code | 이름 | 연계 |
|---|---|---|
VA03 / VA05 | 판매 오더 조회 · 오더 목록 | 순매출과 품목 수량의 원천입니다. 이 앱의 오더 순매출은 같은 판매 오더 품목의 순금액을 오더별로 모은 값이어야 하며, 운영 검수의 첫 번째 대사로 두 숫자를 맞춰 봅니다. |
VF03 / VF04 | 청구 문서 조회 · 청구 대상 목록 | 고객에게 청구한 운임이 청구 문서에 실제로 들어갔는지 대조합니다. 청구 누락으로 걸린 오더는 여기서 청구 문서 유무를 확인합니다. |
VI03 / VT03N | 운송 비용 조회 · 운송 조회 | 운임 비용 줄의 원천 금액입니다. 오더 상세의 비용 줄을 이 화면의 항목과 줄 단위로 맞춥니다. |
KE24 / KE5Z | 수익성 분석 개별 항목 | 운임 반영 공헌이익이 수익성 라인에 어떻게 반영됐는지 대조합니다. 반영 방식이 다르면 두 숫자는 일부러 다를 수 있습니다. |
KE30 | 수익성 분석 리포트 실행 | 노선 · 월 합계를 수익성 리포트와 맞춰 봅니다. 공식 숫자와 감사 대응은 이쪽에 둡니다. |
S/4HANA 분석 스택과의 자리
S/4HANA 에는 CDS 분석 쿼리와 Fiori 분석 앱, Analysis for Office 같은 표준 분석 도구가 있습니다. 이 앱의 집계와 판정을 CDS 로 내리면(CDS 구성 절) 같은 뷰를 표준 도구가 그대로 읽을 수 있습니다. 즉 이 화면은 표준 분석 스택과 경쟁하는 것이 아니라, 점검 판정과 청구 조건 매핑이라는 표준에 없는 부분을 같은 스택 위에 얹은 것입니다.
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 손대는 일 | 누가 |
|---|---|---|
| 고객별 청구 조건 매핑 | 고객 · 판매 조직별 전액 / 일부 / 무료와 약정 비율 (유지보수 뷰로 현업이 직접) | 영업 관리 · 회계 |
| 운송 비용 원천 | 운송 비용 문서의 비용 유형 중 운임 · 유류할증 · 취급 비용에 해당하는 유형 선택 | 물류 · 회계 |
| 점검 기준 값 | 오더 · 노선 · 월 운임률 한도, 공헌이익률 하한 | 관리회계 |
| 표준원가 기준 | 표준원가 버전과 평가 영역 | 원가 회계 |
| 권한 | 판매 조직 · 플랜트 · 고객 단위 접근 제한 | 보안 · 권한 |
| 고객 확장 필드 | 운송사 · 긴급 여부 같은 구분을 오더에 붙이고 싶을 때 확장 필드와 뷰 확장 | IT |
요구사항 매핑 — 분석 지표 정의
관련 기준서가 없는 내부 관리 지표이므로 기준서 요구사항 대신 지표 정의표로 적습니다.
| 지표 | 산식 | 판정 기준 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 운임 반영 공헌이익 | 매출총이익 − (운임 비용 − 청구 운임) | 매출총이익 흑자인데 0 미만이면 점검 필요 | 판매 오더 · 청구 · 운송 비용 | 표준 매출원가 기준 |
| 운임률 | 운임 비용 ÷ 순매출 × 100 | 오더 8% · 노선 5.5% · 월 4% 초과 | 운송 비용 · 판매 오더 | 운임 청구분은 순매출에 넣지 않음 |
| 청구 차이 | 청구 운임 − 약정 청구 운임 | 0 미만이면 점검 필요 | 청구 문서 · 고객 청구 조건 | 약정은 전액 · 일부 · 무료 |
| 운임 회수율 | 청구 운임 ÷ 운임 비용 × 100 | 참고 지표(판정 없음) | 운송 비용 · 청구 문서 | - |
| 반영 공헌이익률 | 운임 반영 공헌이익 ÷ 순매출 × 100 | 노선 15% 미만 점검 필요 | 위 지표에서 산출 | - |
CDS 구성
이 사례의 화면은 샘플 자료 몇백 건을 서비스 로직이 직접 묶습니다. 데모라서 되는 일이고, 운영 데이터에서는 그렇게 하지 않습니다. 운영으로 올릴 때 가장 먼저 하는 일이 집계와 판정을 CDS 로 내리는 것입니다. 아래는 그때 만드는 객체를 레이어 순서대로 적은 것입니다.
코드는 스케치입니다. 필드 이름과 표준 뷰 이름은 릴리스 · 환경에 따라 다르므로 그대로 붙여 넣기 전에 View Browser(F2170) 로 실제 이름을 확인해야 합니다. 확인이 필요한 자리는 주석에 적어 두었습니다.
뷰 레이어 구성
| 레이어 | 객체 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 | ZFRT_BILLTERM | 고객별 운임 청구 조건(전액 · 일부 · 무료) 매핑 | 청구 조건은 고객이 늘 때마다 바뀝니다. 코드에 박으면 개발자를 불러야 합니다. |
| 기본 | ZI_FrtOrderBase | 오더 한 건의 순매출 · 수량 · 표준 매출원가 | 운임 청구분을 순매출에서 빼는 전제를 한 곳에서만 정의합니다. |
| 기본 | ZI_FrtLine | 운임 구성 줄 — 운송 비용 문서의 비용 줄과 청구 줄 | 두 원천을 같은 열 구성으로 맞춰 오더 상세의 근거가 됩니다. |
| 큐브 | ZI_FrtOrderProfit | 매출총이익 · 약정 청구 운임 · 청구 차이 · 운임 반영 공헌이익 | 화면이 하던 산식을 DB 로 내리고 한 번만 정의합니다. |
| 소비 | ZC_FrtProfitQuery | 조회조건 · 점검 코드 | 표준 Fiori 와 분석 도구가 그대로 띄웁니다. |
| 권한 | ZI_FRTORDERPROFIT (DCL) | 판매 조직 단위 접근 제어 | 집계를 읽는 자리에 걸어야 뺄셈으로 새지 않습니다. |
| 서비스 | ZUI_FrtProfit | OData V2 로 게시 | 화면은 서비스 주소만 바꿔 연결합니다. |
① 청구 조건 매핑 테이블
리포트의 청구 누락 점검이 이 표에서 갈립니다. 어떤 고객에게 운임을 얼마나 청구하기로 했는지를 정하는 자리라 운영 전환에서 가장 먼저 합의해야 하는 항목입니다. 유효기간을 둔 이유는 조건이 바뀌어도 과거 점검 결과가 흔들리지 않게 하기 위해서입니다.
" ────────────────────────────────────────────────────────────────
" ZFRT_BILLTERM — 고객별 운임 청구 조건 매핑 (투명 테이블)
" 표준에는 "이 고객에게 운임을 얼마나 청구하기로 했는가" 를 모아 둔
" 자리가 없다. 계약서 · 영업 담당자의 기억 · 엑셀에 흩어져 있던 것을
" 이 표 한 곳으로 옮긴다. 청구 누락 점검(F03)은 이 표가 있어야 돈다.
" 코드에 박지 않는 이유 : 청구 조건은 고객이 늘 때마다 바뀌고,
" 바뀔 때마다 개발자를 부르게 하면 점검이 금방 낡는다.
" ────────────────────────────────────────────────────────────────
@EndUserText.label : '고객별 운임 청구 조건'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C " 고객 유지 — 전송(TR)으로 옮긴다
@AbapCatalog.dataMaintenance : #ALLOWED " SM30 뷰를 함께 만들어 현업이 직접 넣는다
define table zfrt_billterm {
key mandt : mandt not null;
key vkorg : vkorg not null; " 판매 조직
key kunnr : kunnr not null; " 고객
key valid_from : abap.dats not null; " 조건이 바뀌어도 과거 점검이 흔들리지 않게
valid_to : abap.dats;
bill_term : abap.char(4); " FULL 전액 · PART 일부 · FREE 무료
bill_rate : abap.dec(5,2); " 일부 청구일 때 비운임 대비 청구 비율(%)
note : abap.char(60); " 계약 근거 메모
}
② 오더 기준 뷰
순매출에서 운임 청구분을 제외한다는 전제가 여기서 결정됩니다. 운임 청구 품목을 순매출에 섞으면 운임률 분모가 흔들리므로 품목 범주로 걸러 냅니다.
" ────────────────────────────────────────────────────────────────
" ZI_FrtOrderBase — 오더 기준 뷰 : 오더 한 건의 매출과 표준원가
" 이 뷰가 정하는 것 : 순매출에서 운임 청구분을 제외한다는 전제.
" 운임을 순매출에 섞으면 운임을 많이 청구한 오더의 이익률이
" 부풀어 보이고 운임률의 분모도 흔들린다.
" 확인 필요 : 필드 이름은 릴리스에 따라 다르므로 View Browser(F2170)로
" I_SalesDocumentItem 의 실제 필드를 확인한다.
" ────────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory : [#NONE]
@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '운임 점검 — 오더 기준'
@VDM.viewType : #BASIC
define view entity ZI_FrtOrderBase
as select from I_SalesDocumentItem as Itm
association [1..1] to I_SalesDocument as _Doc
on _Doc.SalesDocument = $projection.SalesOrder
{
key Itm.SalesDocument as SalesOrder,
_Doc.SoldToParty as Customer,
_Doc.SalesOrganization as SalesOrg,
_Doc.SalesDocumentDate as OrderDate,
Itm.TransactionCurrency as Currency,
@Semantics.amount.currencyCode : 'Currency'
sum( case when Itm.SalesDocumentItemCategory <> 'TAD' " 운임 청구 품목 제외
then Itm.NetAmount else 0 end ) as NetSales,
@Semantics.quantity.unitOfMeasure : 'Unit'
sum( Itm.OrderQuantity ) as Qty,
Itm.OrderQuantityUnit as Unit,
_Doc
}
group by Itm.SalesDocument, _Doc.SoldToParty, _Doc.SalesOrganization,
_Doc.SalesDocumentDate, Itm.TransactionCurrency, Itm.OrderQuantityUnit
" 표준 매출원가(품목 표준원가 × 수량)는 품목 평가 뷰와 join 해 이 뷰에 더한다.
" 표준원가 필드와 평가 영역은 확인 필요 — 원가 회계와 먼저 합의한다.
③ 운임 구성 줄 뷰
운송 비용 문서의 비용 줄과 고객 청구 줄을 한 모양으로 맞춥니다. 운송 비용 문서와 오더를 잇는 키가 환경마다 달라서, 이 뷰가 가장 많이 손보는 자리입니다.
" ────────────────────────────────────────────────────────────────
" ZI_FrtLine — 운임 구성 줄 : 비용 줄(운송 비용 문서)과 청구 줄을 한 모양으로
" 오더 한 건의 운임이 어느 줄에서 나왔는지를 보이는 자리다.
" 두 원천을 union all 로 같은 열 구성에 맞춰 LineKind 로 구분한다.
" 확인 필요 : 운송 비용 문서의 오더 연결 방식(참조 문서)과 비용 유형은
" 환경마다 다르다. 표준 뷰 이름을 확인하지 못해 테이블 기준으로 적었다.
" ────────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory : [#NONE]
@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '운임 점검 — 운임 구성 줄'
define view entity ZI_FrtLine
as select from vfkp as Hd " 운송 비용 문서 헤더
inner join vfkn as It " 운송 비용 문서 품목
on It.fknum = Hd.fknum
{
key Hd.fknum as CostDoc,
key It.fkpos as CostItem,
It.knumv as PricingDoc, " 확인 필요 : 오더 연결 키
cast( 'COST' as abap.char(4) ) as LineKind,
Hd.netwr as Amount,
Hd.waers as Currency
}
union all
select from I_BillingDocumentItem as Bil
{
key Bil.BillingDocument as CostDoc,
key Bil.BillingDocumentItem as CostItem,
Bil.SalesDocument as PricingDoc,
cast( 'BILL' as abap.char(4) ) as LineKind,
Bil.NetAmount as Amount,
Bil.TransactionCurrency as Currency
}
where Bil.SalesDocumentItemCategory = 'TAD' " 운임 청구 품목만
④ 큐브 — 오더 단위 운임 반영 공헌이익
화면이 서비스에서 받던 산식을 DB 로 내리는 자리입니다. 약정 청구 운임은 매핑이 없으면 전액으로 봅니다. 이 기본값은 정책 결정이므로 회계와 합의해야 합니다. 코드의 ZI_FrtLineSum 은 ③의 운임 구성 줄을 오더별로 비용 합계와 청구 합계로 묶는 보조 뷰이며(줄 종류로 나눠 더하는 단순 집계라 지면을 아껴 싣지 않았습니다), 큐브가 줄이 아닌 오더 한 건에 한 행만 갖도록 합니다.
" ────────────────────────────────────────────────────────────────
" ZI_FrtOrderProfit — 큐브 : 오더 단위 운임 반영 공헌이익
" 화면이 서비스에서 받던 판정을 DB 로 내리는 자리다.
" 차이를 화면이 아니라 여기서 한 번만 정의하는 이유 : 다른 화면 ·
" 배치 · 보고서가 같은 산식을 쓰게 하려는 것이다.
" ────────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory : [#NONE]
@AccessControl.authorizationCheck : #CHECK " DCL 로 권한 확인
@EndUserText.label : '운임 반영 공헌이익 (오더)'
@Analytics.dataCategory : #CUBE
define view entity ZI_FrtOrderProfit
as select from ZI_FrtOrderBase as Ord
left outer join ZI_FrtLineSum as Lin on Lin.SalesOrder = Ord.SalesOrder
left outer join zfrt_billterm as Trm
on Trm.vkorg = Ord.SalesOrg and Trm.kunnr = Ord.Customer
and Trm.valid_from <= Ord.OrderDate and Trm.valid_to >= Ord.OrderDate
{
key Ord.SalesOrder,
Ord.Customer,
Ord.SalesOrg,
Ord.OrderDate,
Ord.NetSales,
Ord.StdCogs,
Ord.NetSales - Ord.StdCogs as GrossProfit,
Lin.FreightCost,
Lin.FreightBilled,
" 약정 청구 운임 : 전액 / 일부 / 무료 (매핑이 없으면 전액으로 본다)
case Trm.bill_term
when 'FREE' then cast( 0 as abap.curr(15,2) )
when 'PART' then Lin.FreightCost * Trm.bill_rate / 100
else Lin.FreightCost end as ExpectBill,
Lin.FreightBilled - ( case Trm.bill_term
when 'FREE' then 0
when 'PART' then Lin.FreightCost * Trm.bill_rate / 100
else Lin.FreightCost end ) as BillGap,
( Ord.NetSales - Ord.StdCogs )
- ( Lin.FreightCost - Lin.FreightBilled ) as ContribAfter,
case when Ord.NetSales = 0 then 0
else Lin.FreightCost * 100 / Ord.NetSales end as FreightRate
}
⑤ 소비 뷰 — 조회조건과 점검 코드
조회조건과 기본 정렬을 정하고 점검 판정을 코드로만 만듭니다. 문구는 화면 번역에서 붙이므로 언어를 더해도 이 뷰는 바뀌지 않습니다.
" ────────────────────────────────────────────────────────────────
" ZC_FrtProfitQuery — 소비 뷰 : 화면 · Fiori · 분석 도구가 읽는 자리
" 조회조건(@Consumption.filter)과 기본 정렬을 여기서 정한다.
" 점검 판정(F01~F03)은 CASE 로 코드만 만들고 문구는 화면 번역에서 붙인다.
" ────────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '운임 반영 수익성 점검'
@Metadata.allowExtensions : true
define view entity ZC_FrtProfitQuery
as projection on ZI_FrtOrderProfit
{
@UI.lineItem : [{ position: 10 }]
key SalesOrder,
@Consumption.filter : { selectionType: #SINGLE, mandatory: true }
@UI.selectionField : [{ position: 10 }]
OrderDate,
@Consumption.filter.selectionType : #RANGE
@UI.selectionField : [{ position: 20 }]
SalesOrg,
@UI.selectionField : [{ position: 30 }]
Customer,
@UI.lineItem : [{ position: 20 }] NetSales,
@UI.lineItem : [{ position: 30 }] FreightCost,
@UI.lineItem : [{ position: 40 }] FreightBilled,
@UI.lineItem : [{ position: 50 }] ContribAfter,
@UI.lineItem : [{ position: 60 }] FreightRate,
" 점검 코드 : 적자 전환 → 운임률 초과 → 청구 누락 순서로 하나만
case when GrossProfit > 0 and ContribAfter < 0 then 'F01'
when FreightRate > 8 then 'F02'
when BillGap < 0 then 'F03'
else '' end as CheckCode
}
⑥ 접근 제어 (DCL)
집계를 읽는 자리에 권한을 겁니다. 판매 조직 단위 제한이 기본이고, 플랜트 · 고객 단위는 회사 권한 설계에 따릅니다.
" ────────────────────────────────────────────────────────────────
" ZI_FRTORDERPROFIT — 접근 제어 (DCL)
" 집계를 읽는 자리에 걸어야 한다. 상세에만 걸면 전사 합계와
" 자기 몫의 차이로 남의 숫자를 알아낼 수 있다.
" 확인 필요 : 권한 오브젝트와 필드는 회사 권한 설계에 따라 달라진다.
" ────────────────────────────────────────────────────────────────
@EndUserText.label : '운임 점검 — 판매 조직 권한'
@MappingRole : true
define role ZI_FRTORDERPROFIT {
grant select on ZI_FrtOrderProfit
where ( SalesOrg ) = aspect pfcg_auth( V_VBAK_VKO, VKORG, ACTVT = '03' );
}
⑦ 서비스 정의와 바인딩
화면이 부르는 문을 만듭니다. 읽기 전용이라 생성 · 수정 · 삭제 동작은 노출하지 않습니다.
" ────────────────────────────────────────────────────────────────
" 서비스 정의와 바인딩 — 화면이 부르는 문
" OData V2 로 게시하면 화면의 서비스 주소만 바꿔 운영에 연결된다.
" 활성화 : 서비스 바인딩(ADT)에서 게시한 뒤 /IWFND/MAINT_SERVICE 에서
" 서비스를 등록한다. 화면 쪽은 manifest 의 서비스 주소 하나만 교체한다.
" ────────────────────────────────────────────────────────────────
@EndUserText.label : '운임 반영 수익성 점검 서비스'
define service ZUI_FrtProfit {
expose ZC_FrtProfitQuery as OrderSet;
expose ZI_FrtLine as LineSet;
}
" 서비스 바인딩 : 이름 ZUI_FRTPROFIT_O2 · 바인딩 유형 OData V2 - UI
" 읽기 전용이므로 생성 · 수정 · 삭제 동작을 노출하지 않는다.
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다. 아래 여섯 가지는 코딩이 아니라 합의이고, 합의가 끝나면 기술 작업은 위 객체를 만들고 서비스를 게시하는 일로 줄어듭니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 청구 조건 매핑 | 고객별 전액 / 일부 / 무료와 약정 비율, 유효기간 | 청구 누락 점검이 돌지 않거나 모두 전액으로 판정되어 첫 회의에서 막힙니다 | 영업 관리 · 회계 |
| 운송 비용 원천 | 운송 비용 문서의 어떤 비용 유형이 운임 · 유류할증 · 취급 비용인지, 오더와 어떻게 잇는지 | 운임 비용이 비거나 두 번 세어집니다 | 물류 · 회계 |
| 운임 청구분 처리 | 청구 운임을 순매출에서 제외할지(이 화면의 전제) 매출로 볼지 | 기존 보고서와 이익률이 어긋나 “어느 숫자가 맞나” 회의가 됩니다 | 관리회계 |
| 표준원가 기준 | 표준원가 버전과 평가 영역 | 매출원가가 달라져 적자 전환 판정이 바뀝니다 | 원가 회계 |
| 점검 기준 값 | 오더 · 노선 · 월 운임률 한도, 공헌이익률 하한 | 샘플 값이 그대로 운영되어 점검이 너무 많거나 너무 적게 걸립니다 | 관리회계 |
| 권한 설계 | 판매 조직 · 플랜트 · 고객 단위 접근 | 전사 합계와 자기 몫의 차이로 남의 숫자가 드러납니다 | 보안 · 권한 |
| 대사 체계 | VA03 · VF03 · VI03 · KE30 와 맞출 항목과 주기 | 숫자가 틀렸을 때 어디부터 볼지 정해져 있지 않습니다 | 회계 · IT |
| 전송과 서비스 활성화 | TR 순서(테이블 → 뷰 → DCL → 서비스), 서비스 게시와 등록, 화면의 서비스 주소 교체 | 개발 시스템에서만 도는 상태로 남습니다 | IT · Basis |
운영 데이터로 갈 때
샘플은 오더 216건이라 서비스가 전부 읽어 묶지만, 오더가 수천만 건이면 다음 순서로 바꿉니다. 첫째, 집계는 CDS 에서 하고 화면은 결과만 받습니다. 둘째, 전기일 범위와 판매 조직을 필수 조건으로 받아 범위를 좁힙니다. 셋째, 오더 명세는 한 번에 전부 읽지 않고 서비스 질의의 건수 제한과 건너뛰기로 나눠 읽습니다. 넷째, 운임 구성 줄은 오더 상세를 열 때만 읽습니다. 응답 시간 기준(예: 조회 3초 이내)을 먼저 정하고, 넘는 조회는 범위를 좁히라는 안내를 띄우는 편이 낫습니다.
자주 묻는 질문
도입 상담과 데모에서 실제로 받은 질문들을 네 묶음으로 나눠 적었습니다.
숫자와 산식
운임 반영 공헌이익은 어떻게 계산합니까?
순매출에서 표준 매출원가를 뺀 매출총이익을 먼저 구하고, 거기서 순 운임 부담을 뺍니다. 순 운임 부담은 운임 비용에서 고객에게 청구한 운임을 뺀 값입니다. 청구한 운임이 비용을 다 덮으면 매출총이익이 그대로 남고, 청구를 못 했으면 그만큼 이익이 줄어듭니다.
이 샘플에서는 매출총이익 189,320,999원에서 순 운임 부담 16,763,700원을 빼 운임 반영 공헌이익 172,557,299원이 됩니다. 순매출 대비로는 23.87% 이던 매출총이익률이 21.75% 로 내려옵니다.
운임 청구분은 순매출에 들어가지 않습니까?
들어가지 않습니다. 고객에게 청구한 운임은 순매출이 아니라 운임 비용을 덜어 주는 쪽으로 셉니다. 순매출에 섞으면 운임을 많이 청구한 오더의 매출총이익률이 부풀어 보이고, 운임률 계산의 분모도 흔들립니다.
회사 방침이 다르면(운임 청구분을 매출로 인식하는 경우) 산식의 이 자리 하나만 바꾸면 되고, 다른 산식은 그대로입니다. 어느 쪽이든 먼저 정해 두어야 숫자가 기존 보고서와 맞습니다.
약정 청구 운임은 무엇이고 어디서 옵니까?
고객과 합의한 청구 조건에 따라 받았어야 하는 운임입니다. 전액 청구 · 일부 청구 · 무료의 세 가지로 나누고, 고객마다 조건이 다릅니다. 실제 청구 운임이 약정보다 적으면 그 차이가 청구 차이이고, 0 보다 작으면 청구 누락 후보로 봅니다.
표준에는 이 조건을 한 곳에 모아 둔 자리가 없어서 운영에서는 매핑 테이블을 새로 정의합니다. 이 테이블이 비면 청구 누락 점검이 돌지 않으므로 도입에서 가장 먼저 합의할 항목입니다.
점검 기준 값(8% · 5.5% · 4%)은 어떻게 정했습니까?
샘플 데이터에서 점검 표시가 실제로 보이도록 정한 예시 값이며, 어느 회사에도 맞는 기준이라는 뜻이 아닙니다. 오더 운임률 8%, 노선 5.5%, 월 4% 는 서로 다른 집계 수준에서 같은 비율을 쓰면 안 되기 때문에 단계별로 달리 둔 것입니다.
운영에서는 운송방식과 상품 특성에 따라 기준이 달라지므로 회사가 정합니다. 화면은 그 기준을 넘었는지만 알려 주고, 넘었다고 잘못이라고 단정하지 않습니다.
같은 오더가 여러 기준에 걸리면 어떻게 보입니까?
코드는 적자 전환 → 운임률 초과 → 청구 누락 순서로 하나만 보여 줍니다. 합산하면 건수가 겹쳐 세어지기 때문입니다. 대신 점검 내용 칸에는 걸린 기준을 모두 적어, 하나만 고쳐도 되는지 여러 개를 봐야 하는지 알 수 있습니다.
샘플의 점검 필요 오더 45건은 이 순서로 적자 전환 7건 · 운임률 초과 23건 · 청구 누락 15건으로 나뉘며, 합이 45건과 정확히 같습니다.
대사식이 전부 0 인데 왜 운임률에는 0.0050 이 나옵니까?
운임률은 소수 둘째 자리까지 반올림해 저장하기 때문에 다시 계산한 값과 최대 0.005 까지 어긋날 수 있습니다. 이것은 오류가 아니라 표시 정밀도의 한계이고, 허용 오차(0.005) 안이라 차이 건수에는 넣지 않았습니다.
숨기지 않고 최대 차이 칸에 그대로 적는 이유는, 허용 오차 안에서 어긋난 것과 정확히 같은 것을 구분해 보여 주기 위해서입니다.
화면과 사용
처음 열면 무엇이 보입니까?
회계연도만 채워진 상태로 열리고 자동으로 한 번 조회합니다. 위에는 조회조건, 그 아래에 요약 아홉 개, 그 아래에 오더 명세 · 노선 · 월별 추이 · 운임 구성 · 대사 결과 다섯 탭이 있습니다.
조회 버튼은 조건 줄의 오른쪽 끝에 있고 Enter 로도 조회됩니다. 조건을 비우면 해당 조건이 빠질 뿐 코드로 "전체" 를 보내지 않습니다.
점검 필요 오더만 모아 보려면?
점검 결과 조건을 점검 필요로 두고 조회합니다. 서버가 그 조건으로 걸러 주므로 건수가 많아도 화면이 느려지지 않습니다. 결과는 운임 반영 공헌이익이 낮은 순으로 정렬해 두면 손실이 큰 오더부터 읽을 수 있습니다.
월 범위, 지역, 운송방식, 고객을 함께 걸면 "7월 수도권 항공 점검 필요" 같은 조합도 한 번에 나옵니다.
노선과 월은 왜 따로 봅니까?
오더 한 건으로는 보이지 않는 패턴이 묶으면 드러나기 때문입니다. 한 오더가 운임률 9% 인 것은 소량 발송 탓일 수 있지만, 한 노선이 달마다 5.5% 를 넘으면 운송사 계약이나 운송방식 선택의 문제입니다. 월 단위는 마감 회의에서 "이번 달은 어땠나" 를 답하는 자리입니다.
세 집계 수준의 합은 서로 같아야 하며, 이 일치를 대사식으로 검사합니다.
행을 누르면 무엇이 열립니까?
오더 행은 그 오더의 운임 구성 줄(비용 줄과 청구 줄)과 점검 내용을, 노선 행과 월 행은 그 범위에 속한 오더 명세를 엽니다. 상세 안의 합계는 눌렀던 행의 숫자와 같아야 합니다.
어느 숫자가 의심스러우면 상세에서 줄 단위로 내려가고, 거기서도 이상하면 표준 거래(VI03 · VF03)에서 원천을 대조합니다.
내려받기는 무엇을 담습니까?
지금 보고 있는 탭의 조회 결과를 CSV 로 내려받습니다. UTF-8 에 BOM 을 붙여 엑셀에서 바로 열립니다. 조회조건에 걸린 결과만 담기므로 점검 필요 오더만 걸고 내려받으면 그 목록이 됩니다.
서버에 파일이 남지 않고 브라우저에서 만들어집니다.
휴대폰이나 좁은 화면에서도 됩니까?
표준 컨트롤의 반응형 규칙을 따르므로 폭이 줄면 조회조건이 여러 줄로 접히고 표는 가로로 넘겨 봅니다. 현장에서 숫자를 확인하는 정도는 되지만, 오더 수백 건을 훑는 일은 큰 화면이 낫습니다.
표준과의 관계
SAP 표준 화면으로는 왜 부족합니까?
표준이 부족하다기보다 보는 단위가 다릅니다. 판매 오더는 VA03 · VA05, 청구는 VF03, 운송 비용은 VI03, 수익성은 KE24 · KE30 에 따로 있습니다. 한 오더의 매출총이익, 운임 비용, 청구 운임을 한 줄에 놓고 비교하려면 이 화면들을 오가며 손으로 맞추게 됩니다.
이 화면은 표준이 가진 같은 원천을 한 줄에 모아 놓고 기준을 넘은 오더를 골라 줄 뿐, 표준 거래를 대신하지 않습니다.
기존 수익성 리포트(KE30)를 없애야 합니까?
없애지 않습니다. 수익성 분석의 공식 숫자와 감사 대응은 표준에 두는 편이 안전합니다. 이 화면은 운임이 공헌이익을 얼마나 깎는지를 오더 · 노선 · 월로 점검하는 보조 도구이고, 두 숫자는 노선과 월 합계를 KE30 과 맞춰 보는 방식으로 대조합니다.
운임 비용의 원천은 무엇입니까?
운송 비용 문서(VI03 으로 조회)의 품목 금액입니다. 테이블로는 운송 비용 헤더와 품목에 해당하며, 정확한 필드와 표준 뷰 이름은 릴리스마다 달라 View Browser 로 확인해야 합니다. 이 글의 코드에서도 확인이 필요한 자리는 주석에 적어 두었습니다.
운송을 외주 정산 시스템으로 처리하는 회사라면 원천이 달라지므로, 도입 첫 주에 원천을 확정하는 일이 가장 중요합니다.
이 화면의 결과가 수익성 분석(CO-PA)에 반영됩니까?
반영하지 않습니다. 읽기 전용 점검 화면이라 전기나 수정을 하지 않습니다. 운임이 CO-PA 에 어떻게 흘러가는지는 회사의 가치 필드 설정에 달려 있고, 이 화면은 그 결과가 오더 수준에서 맞는지 거꾸로 확인하는 데 씁니다.
도입과 운영
도입에 걸리는 기간은 어느 정도입니까?
개발보다 합의가 오래 걸립니다. 원천 확정과 청구 조건 매핑이 끝나면 CDS 뷰 몇 개와 서비스 게시, 화면 주소 교체가 남습니다. 합의가 준비된 회사라면 몇 주 단위로 보지만, 청구 조건이 영업 담당자 머릿속에만 있는 회사는 그 정리가 일정을 정합니다.
권한은 어떻게 걸어야 합니까?
판매 조직 · 플랜트 · 고객 단위의 표준 권한을 집계를 읽는 자리에 걸어야 합니다. 상세에만 걸면 전사 합계와 자기 몫의 차이로 남의 숫자를 알아낼 수 있습니다. 이 글의 CDS 구성에 권한 정의 예시를 실었습니다.
오더가 수천만 건이면 어떻게 합니까?
샘플은 216건이라 화면이 전부 읽어 오지만 운영에서는 그렇게 하지 않습니다. 오더 · 노선 · 월 집계를 CDS 에서 하고, 조회조건(기간 · 판매 조직)을 필수로 받아 범위를 좁히며, 명세는 $top · $skip 으로 나눠 읽습니다. 상세한 기준은 CDS 구성 절의 "운영 데이터로 갈 때" 에 적었습니다.
청구 조건이나 점검 기준이 바뀌면 개발이 필요합니까?
청구 조건은 매핑 테이블 한 곳을 고치고(SM30 으로 현업이 직접), 점검 기준 값은 설정으로 둡니다. 새로운 점검 규칙(예: 긴급 할증 비율)을 더하는 일은 판정 로직에 규칙 하나를 추가하는 작업입니다.
이 화면이 오류를 확정해 줍니까?
아닙니다. 점검 필요는 기준을 넘었으니 근거를 확인하라는 표시이지 잘못이라는 판정이 아닙니다. 소량 긴급 발송이라 운임률이 높을 수도 있고, 고객과 협의한 예외일 수도 있습니다. 최종 판단은 회사가 하며, 감사인이 요구하는 근거는 표준 거래의 문서에서 확인합니다.
다국어와 다통화는 됩니까?
화면 글자는 번역 파일로 분리되어 있어 언어를 더하는 일은 파일 하나를 더하는 일입니다. 통화는 오더 통화 하나를 전제로 하며, 통화가 섞이면 환산 기준(전기일 환율 또는 월말 환율)을 먼저 정해야 합니다. 통화가 다른 오더의 합을 단순히 더하면 안 됩니다.
유지보수는 무엇을 하게 됩니까?
정기적으로 손이 가는 곳은 고객별 청구 조건 매핑과 점검 기준 값입니다. 신규 고객이 생기면 청구 조건을 적어 주고, 운송사 요율이 바뀌면 기준 값을 조정합니다. 그 밖에는 운송 비용 원천 구조가 바뀔 때 해당 뷰를 고치는 정도입니다.
숫자가 기존 보고서와 다르면 어떻게 확인합니까?
순서가 있습니다.
① 조회 범위가 같은지 봅니다 — 회계연도, 월 범위, 판매 조직. 가장 흔한 원인입니다.
② 청구 조건 매핑을 봅니다. 고객 조건이 다르게 들어가면 청구 차이가 어긋납니다.
③ 오더 상세의 운임 구성 줄을 VI03 · VF03 과 줄 단위로 맞춥니다.
④ 그래도 다르면 운임 청구분을 순매출에서 제외했는지(이 화면의 전제)부터 확인합니다.