지역별 수익성 점검 — 수익성 분석, 총매출에서 공헌이익과 지역이익까지 지역·월별로 따라가며 한도를 벗어난 지역을 찾는 월마감 화면
총매출에서 지역이익까지 · 한도에 견준 점검 필요 · 운임 0원 명세 대조 · 행 상세 · 아홉 가지 대사 — 소개 영상과 실제 화면 7종, 그리고 CDS 코드까지
소개 영상1분 17초8개 장면음성 안내·자막처음 화면 → 지역 판정 → 손익 구성 → 출고 명세 → 상세 → 대사
개발 배경 — 이 앱을 사용해야 하는 이유
월마감이 끝나면 영업과 경영지원이 가장 먼저 묻는 것은 “어느 지역이 돈을 남겼고, 어느 지역이 남기지 못했나” 입니다. 총매출은 잘 나왔는데 지역이익이 적자인 지역이 있고, 공헌이익은 충분한데 고정비를 얹으면 얇아지는 지역이 있습니다. 표준 화면은 수익성 분석 결과와 청구·비용 문서를 각각 잘 보여 주지만, 지역·월 단위로 한도에 견주어 “지금 확인해야 할 곳”만 가려 주지는 않습니다.
그래서 현업은 보고서를 지역·제품군마다 여러 번 돌려 엑셀에 붙이고, 할인이 얼마나 나갔는지, 운임이 빠진 건은 없는지를 눈으로 훑으며 월마감을 보냅니다. 이 앱은 그 훑는 일을 출고 명세 한 건 단위에서 해 두고, 지역·월·요인 순으로 합쳐 올려 한 화면에 놓습니다. 총매출에서 할인·리베이트, 변동매출원가, 변동운임·수수료를 차례로 빼 공헌이익을 만들고, 지역 고정비를 한 번 더 빼 지역이익을 만듭니다.
이 화면이 다루는 수익성 분석은 회계기준이 정한 항목이 아니라 관리회계 관점의 분석입니다. 그래서 관련 기준서는 없음(-)으로 적고, 대상 영역을 수익성 분석으로 표기합니다. 점검 필요는 확인할 대상을 가리는 표시이며 최종 판단은 회사가 합니다.
축이 고정된 보고서는 두 번째 질문에서 멈춘다
첫 질문은 “이번 달 수도권 수익성은?” 이지만 두 번째 질문은 곧바로 “제품군별로는?”, “할인이 얼마나 나갔나?”로 이어집니다. 지역과 제품군을 고정해 만든 보고서는 이 두 번째 질문에서 다시 조건을 넣고 다시 돌려야 합니다. 이 앱은 지역·제품군·출고일·점검 결과를 한 줄 조건으로 모아 두고, 같은 조건이 지역 판정·손익 구성·출고 명세·월별 추이·대사 결과 다섯 탭에 함께 걸리게 했습니다.
공헌이익만 보면 적자 지역이 가려진다
호남권 4월은 순매출 338.1백만원에 공헌이익이 132.2백만원이고 공헌이익률은 39.10%로 하한 30.00%를 넘습니다. 그런데 지역 고정비가 149.0백만원이라 지역이익은 −16.8백만원입니다. 공헌이익률만 보는 보고서는 이 달을 정상으로 넘깁니다. 이 앱은 공헌이익과 지역이익을 한 줄에 놓고, 지역이익이 0보다 작으면 점검 필요로 표시합니다. 같은 달 할인율도 11.31%로 한도 8.00%를 넘었다는 점까지 점검 내용에 함께 적힙니다.
운임이 빠지면 이익이 좋아 보인다
운임 정산이 늦으면 변동운임·수수료가 0원인 출고 명세가 생기고, 그 명세의 공헌이익은 실제보다 좋아 보입니다. 아시아 2월에는 이런 명세가 3건 있습니다. 한도만 보는 점검은 운임이 아예 없는 건을 놓치기 쉬워서, 화면은 운임 0원 명세를 따로 세어 지역·월 행에 운임 확인 필요로 올립니다. 공헌이익이 음수인 명세 2건도 의도적 예외로 따로 집계해 정합성 대사와 섞이지 않게 했습니다.
합계가 맞는지 묻는 일이 줄어든다
지역별 표와 월별 표, 요인별 표를 따로 만들면 합계가 서로 달라 “어느 숫자가 맞나” 하는 회의가 열립니다. 이 앱은 명세 한 건에서 계산한 값을 지역·월로, 다시 월과 요인으로 올리고 아홉 가지 대사식으로 매번 검산합니다. 차이 건수가 요약 카드에 늘 함께 보이므로, 숫자를 믿어도 되는지를 열어 보기 전에 알 수 있습니다.
사용 방법
- 조회조건 입력 — 회계연도(필수, 4자리)를 확인하고, 필요하면 매출 월 시작·종료, 지역, 제품군, 요인, 출고일 시작·종료, 점검 결과를 고릅니다. 고르지 않은 조건은 걸리지 않습니다.
- 조회 버튼 또는 Enter — 조건 입력칸의 가장 오른쪽 조회 버튼을 누르거나 입력칸에서 Enter 키를 누릅니다. 화면을 열면 기본 조건으로 한 번 자동 조회됩니다.
- 요약 확인 — 순매출, 공헌이익, 공헌이익률, 지역이익, 점검 필요 지역, 확인 필요 명세, 대사 차이 건수를 위쪽 숫자로 봅니다.
- 탭 이동 — 지역 판정 → 손익 구성 → 출고 명세 → 월별 추이 → 대사 결과 순서로 넘어가며, 탭 이름 위 숫자는 조건에 맞는 건수입니다.
- 행 클릭 상세 — 표의 행을 누르면 상세 창이 열려 지표 전체와 같은 지역·월의 출고 명세를 보여 줍니다.
- CSV 내려받기 — 현재 탭의 조회 결과를 UTF-8 CSV 로 내려받습니다.
숫자를 믿을 수 있는가 — 검증 결과
먼저 대사식을 세우고, 검증용 샘플 데이터 전체에 대해 돌린 결과입니다. 아래 일곱 가지가 정합성 대사이고, 의도적 예외 두 가지는 따로 셉니다.
| 대사식 | 검사 건수 | 차이 건수 | 최대 차이 |
|---|---|---|---|
| 총매출 − 할인·리베이트 = 순매출 (명세) | 288 | 0 | 0 |
| 순매출 − 변동매출원가 − 운임 = 공헌이익 (명세) | 288 | 0 | 0 |
| 명세 합계 = 지역·월 집계 (순매출 · 공헌이익) | 36 | 0 | 0 |
| 공헌이익 − 지역 고정비 = 지역이익 (지역·월) | 36 | 0 | 0 |
| 지역 합계 = 전사 합계 (월별 순매출 · 지역이익) | 6 | 0 | 0 |
| 총매출 − 요인 합계 = 지역이익 (월별 요인 구성) | 6 | 0 | 0 |
| 공헌이익 ÷ 순매출 × 100 = 공헌이익률, 소수 둘째 자리 반올림 | 330 | 0 | 0 |
의도적 예외 — 운임이 0원인 명세 3건(아시아 2월)과 공헌이익이 음수인 명세 2건(수도권 3월 · 충청권 5월)은 확인 필요 예시로 넣었으며 대사 차이 건수와 분리해 셉니다. 판정은 36개 지역·월 중 점검 필요 7건이며 별도 스크립트 재계산과 모두 일치했습니다. 화면의 요약 숫자(순매출 14,846.9백만원, 공헌이익 6,184.3백만원, 공헌이익률 41.65%, 지역이익 2,464.1백만원)도 스크립트 결과와 같았습니다.
무엇으로 만들었나
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 컨트롤 | OpenUI5 표준 컨트롤(필터 입력, 탭, 표, 상세 창) | 외부 라이브러리 반입 심사 없이 사내망에서 그대로 열리도록 했습니다. |
| 집계·판정 로직 | 서비스 쪽 계산 파일 — 지역·월 집계, 한도 판정, 대사, 공헌이익률 함수 2종 | 화면은 서비스가 돌려준 값을 그대로 보여 주고, 판정 기준이 화면 코드에 흩어지지 않게 했습니다. |
| OData 구성 | OData V2 서비스 하나. 화면은 매니페스트에 선언한 서비스 주소의 기본 모델로 읽고, 탭마다 해당 엔티티셋에 바인딩합니다. | 조건은 필터 객체로 만들어 조건절로 보내고 정렬·페이징은 모델에 맡겨, 운영 서비스로 바꿔도 화면 코드가 그대로입니다. |
| 오류 처리 | 메타데이터 실패·요청 실패·빈 응답을 구분해 안내하는 오류 처리기 | 서비스가 끊겨도 화면이 빈 채로 멈춘 것처럼 보이지 않게 했습니다. |
| 테마 | sap_horizon | 표준 Fiori 화면과 같은 모양으로 열립니다. |
| 항목 | 내용 |
|---|---|
| 업무 영역 | 관리회계 — 수익성 분석 |
| 관련 기준서·대상 영역 | - (대상 영역: 수익성 분석 — 지역별 공헌이익·지역이익 점검) |
| SAP 표준 T-code | KE30 · KE24 · VA03 · VF03 · KSB1 · FAGLL03 |
| 화면 성격 | 조회·점검 (지역·월 판정, 행 클릭 상세, CSV 내려받기) |
| 데이터 연동 | OData V2 |
SAP 표준 기능을 그대로 이어받은 부분
수익성 분석의 공헌이익 개념, 청구 문서의 금액과 할인 조건, 비용 항목의 구분을 표준 그대로 이어받습니다. 이 화면은 표준 화면의 숫자를 바꾸지 않고, 지역·월 단위로 한도에 견주어 점검하는 관점을 더해 확장합니다.
실행 화면
실제로 돌아가는 화면 7종을 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 하는 자리인지를 아래에 적었습니다. 숫자는 모두 같은 검증용 샘플 데이터에서 나온 것이라 화면끼리 맞춰 보셔도 됩니다.
처음 열었을 때
처음 화면은 조건, 요약, 판정표 세 단으로 되어 있습니다. 조건을 넣기 전에도 기본 조건으로 한 번 조회되어 빈 화면을 보는 일이 없습니다.

위쪽 일곱 숫자가 순매출 14,846.9백만원, 공헌이익 6,184.3백만원(공헌이익률 41.65%), 지역이익 2,464.1백만원을 먼저 말합니다. 그 옆에서 점검 필요 지역 7건, 확인 필요 명세 5건, 대사 차이 0건이 함께 읽힙니다. 아래 36행 표는 지역·월 한 줄이 하나의 판정 단위이고, 조회 버튼은 조건 입력칸 오른쪽 끝에 있습니다.

점검 결과만 걸어도 7건이 남고, 지역·월 어디서 한도를 넘었는지가 점검 내용에 문장으로 적혀 있습니다. 요약과 표가 같은 조건에서 나오므로 어느 쪽을 봐도 숫자가 갈라지지 않습니다.
이익이 어디서 깎이는가 — 손익 구성과 출고 명세
공헌이익률이 낮다는 사실 다음에 오는 질문은 어느 칸이 이익을 깎았느냐입니다. 월별 손익 구성에서 비중을 비교하고, 출고 명세로 내려가 건별 금액을 확인합니다.

총매출에서 네 항목을 차례로 빼면 지역이익이 남습니다. 4월은 할인·리베이트 5.46%, 변동매출원가 51.67%, 변동운임·수수료 2.70%, 지역 고정비 25.14%여서, 어느 칸이 이익을 깎았는지 비중으로 곧바로 비교됩니다.

288건의 출고 명세가 열립니다. 운임이 0원이거나 공헌이익이 음수인 명세는 점검 결과에 표시되고, 출고일 시작·종료를 넣으면 그 기간의 명세만 남습니다. 확인 필요 명세 5건은 일부러 넣어 둔 예시입니다.
흐름과 상세 — 월별 추이와 행 상세
월별 흐름에서 수익성이 얇아진 시점을 찾고, 지역·월 한 행을 눌러 그 달의 구성을 확인합니다.

공헌이익률은 1월 42.68%에서 6월 39.01%로 내려오고, 점검 필요 지역은 1월 0곳에서 5·6월 2곳으로 늘어납니다. 어느 달부터 수익성이 얇아졌는지가 6개월 흐름으로 읽힙니다.

4월 호남권은 순매출 338.1백만원에 공헌이익 132.2백만원이지만 지역 고정비 149.0백만원이 더 커서 지역이익이 −16.8백만원입니다. 할인율 11.31%도 한도 8.00%를 넘어 두 조건이 함께 걸렸다는 것이 점검 내용에 적힙니다.
숫자를 믿어도 되는가 — 대사 결과
마지막 탭은 화면이 스스로 하는 검산입니다. 합계가 맞는지와 의도적 예외를 구분해 보여 줍니다.

총매출 − 할인·리베이트 = 순매출, 명세 합계 = 지역·월 집계, 지역 합계 = 월 합계 같은 식을 화면이 매번 다시 계산해 차이 0을 보입니다. 의도적 예외 두 가지는 오류와 섞이지 않게 따로 세웁니다.
화면 뒤에서 일어나는 일
조회 버튼을 누르면 화면은 조건을 필터 객체로 만들어 탭마다 해당 엔티티셋에 요청하고, 서비스는 명세에서 지역·월로 합친 값을 돌려줍니다. 한도 판정과 대사도 서비스 쪽 계산 결과이며, 화면은 그 값을 그대로 보여 줍니다.
판정 규칙 — 한도에 견주어 점검 필요를 가린다
지역·월 한 행마다 아래 조건을 차례로 확인하고, 하나라도 걸리면 점검 필요로 표시합니다. 걸린 조건은 점검 내용에 모두 적힙니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 공헌이익률 = 공헌이익 ÷ 순매출 × 100 이 지역별 하한(24.00~30.00%)에 못 미침 | 점검 필요 | 할인·원가·운임 중 어느 항목이 컸는지 손익 구성 탭과 출고 명세로 확인합니다. |
| 할인율 = 할인·리베이트 ÷ 총매출 × 100 이 지역별 한도(6.00~8.00%)를 넘음 | 점검 필요 | 할인·리베이트가 정책보다 커졌는지 해당 월 명세를 열어 봅니다. |
| 운임률 = 변동운임·수수료 ÷ 순매출 × 100 이 지역별 한도(3.00~8.00%)를 넘음 | 점검 필요 | 운임 단가나 출고 구성이 바뀌었는지 확인합니다. |
| 지역이익 = 공헌이익 − 지역 고정비 가 0보다 작음 | 점검 필요(적자) | 고정비 배부와 공헌이익 감소 요인을 함께 확인합니다. |
| 운임이 0원인 명세가 하나 이상 있음 | 점검 필요(운임 확인) | 운임 정산이 빠졌는지 해당 명세를 열어 확인합니다. |
| 공헌이익이 음수인 명세(명세 행에 표시) | 점검 필요(명세 확인) | 출고 명세 탭에서 해당 명세의 할인과 원가를 확인합니다. |
| 위 조건에 모두 해당 없음 | 정상 | 한도 안입니다. |
한도는 이 화면의 가상 기준값이며 실제 회사의 기준으로 바꿔 쓰면 됩니다. 점검 필요는 원인을 단정하는 표시가 아니라 확인 대상을 가리는 표시이고, 최종 판단은 회사가 합니다.
산출·대사 순서
- 총매출 − 할인·리베이트 = 순매출, 순매출 − 변동매출원가 − 변동운임·수수료 = 공헌이익 (명세)
- 명세 합계 = 지역·월 집계 (순매출 · 공헌이익)
- 공헌이익 − 지역 고정비 = 지역이익 (지역·월)
- 공헌이익 ÷ 순매출 × 100 = 공헌이익률 (소수 둘째 자리 반올림), 할인·리베이트 ÷ 총매출 × 100 = 할인율, 운임 ÷ 순매출 × 100 = 운임률
- 지역 합계 = 월 합계, 총매출 − 손익 구성 항목 합계 = 지역이익 (전사)
조회조건
| 조건 | 필수 | 기본값 | $filter 로 가는 방식 |
|---|---|---|---|
| 회계연도 | 필수 | 2026 | Gjahr eq |
| 매출 월 시작 · 종료 | 선택 | 전체 | Period ge · le (둘 다 있으면 BT) |
| 지역 | 선택 | 전체 | RegCode eq (전체면 조건 없음) |
| 제품군 | 선택 | 전체 | ProdCode eq (출고 명세) |
| 요인 | 선택 | 전체 | LeakCode eq (손익 구성) |
| 출고일 시작 · 종료 | 선택 | 비어 있음 | PostDate ge · le (출고 명세) |
| 점검 결과 | 선택 | 전체 | CheckStatus eq |
결과 컬럼
| 컬럼 | 의미 | 산출식 |
|---|---|---|
| 순매출 | 총매출에서 할인·리베이트를 뺀 값 | GrossAmt − DiscAmt |
| 공헌이익 | 순매출에서 변동매출원가와 변동운임·수수료를 뺀 값 | NetAmt − CostAmt − FrtAmt |
| 공헌이익률 | 순매출 대비 공헌이익 | CmAmt ÷ NetAmt × 100 |
| 지역 고정비 | 지역에 배부한 고정비 | FixAmt |
| 지역이익 | 공헌이익에서 지역 고정비를 뺀 값 | CmAmt − FixAmt |
| 할인율 · 운임률 | 총매출 대비 할인, 순매출 대비 운임 | DiscAmt ÷ GrossAmt × 100 · FrtAmt ÷ NetAmt × 100 |
| 점검 결과 · 내용 | 한도에 견준 판정과 걸린 조건 | 판정 규칙 표 |
좁은 화면에서 달라지는 것
조회조건은 줄을 바꿔 쌓이고 요약 숫자는 두 칸씩 접힙니다. 표는 화면 안에서 좌우로 넘겨 봅니다. 폭 390px 에서 페이지 전체가 가로로 밀리지 않는 것을 확인했습니다. 열이 많은 표라 현장에서는 데스크톱 화면이 더 읽기 편합니다.
파일 구성
index.html · readme.html · Component.js · manifest.json controller/ BaseController.js · Main.controller.js view/ Main.view.xml · DetailDialog.fragment.xml model/ formatter.js · ErrorHandler.js css/ · i18n/ odata/ metadata.xml · service.js · json/ (엔티티셋별 데이터) media/ intro.mp4 · intro_poster.jpg
SAP 표준 기능 확장 포인트
이 앱은 SAP 표준을 대체하지 않습니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·점검 관점을 더해 확장합니다. 표준이 이미 잘하는 일은 표준에 맡기고, 표준이 끊기는 자리만 이어 붙입니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | 표준으로 충분한 것 | 이 앱이 더하는 관점 |
|---|---|---|
| 지역·제품군별 수익성 보고 | KE30 수익성 분석 보고서 | 지역·월을 한도에 견주어 확인할 곳만 먼저 보여 줍니다. |
| 개별 항목 확인 | KE24 개별 항목 표시 | 한도를 넘은 지역·월에서 바로 해당 명세로 내려갑니다. |
| 오더 · 청구 문서 확인 | VA03 판매 오더 · VF03 청구 문서 | 출고 명세를 지역·월로 합친 합계와 맞춰 봅니다. |
| 비용 항목 확인 | KSB1 원가 요소별 개별 항목 · FAGLL03 G/L 개별 항목 | 운임과 고정비를 지역이익 계산에 연결합니다. |
| 지역별 한도 판정 | 표준에는 없습니다 | 공헌이익률 하한·할인율·운임률 한도를 지역마다 다르게 두고 판정합니다. |
| 합계 대사 | 사람이 표준 결과와 직접 맞춥니다 | 아홉 가지 대사식을 화면이 매번 계산합니다. |
T-code 별 연계 지점
| T-code | 이름 | 연계 지점 |
|---|---|---|
| KE30 | 수익성 분석 보고서 실행 | 이 앱이 이어받는 것은 공헌이익과 손익 구성의 개념입니다. 같은 기간·같은 지역의 순매출과 공헌이익을 KE30 결과와 맞춰 보는 것이 월마감 대사 지점입니다. 이 앱에서 지역 판정 행을 확인한 뒤 KE30 으로 넘어가 원천 구성을 보고, 표준 화면의 값이 의심스러우면 이 앱의 지역·월 행에서 다시 봅니다. 법정·감사 대응은 표준에 남겨 둡니다. |
| KE24 | 수익성 분석 개별 항목 표시 | 출고 명세 탭의 건수와 금액을 개별 항목 단위로 대조합니다. 건수가 다르면 취소 청구나 기간 경계를 먼저 확인합니다. |
| VA03 | 판매 오더 표시 | 오더 단가와 할인 조건을 확인합니다. 할인율이 한도를 넘은 지역·월의 명세에서 오더로 넘어가 조건을 봅니다. |
| VF03 | 청구 문서 표시 | 총매출과 할인·리베이트의 원천 청구 문서입니다. 출고 명세의 총매출과 청구 금액을 맞춥니다. |
| KSB1 | 원가 요소별 개별 항목 | 운임 비용과 고정비 항목을 확인합니다. 운임이 0원으로 표시된 명세의 정산 여부를 여기서 봅니다. |
| FAGLL03 | G/L 계정 개별 항목 표시 | 변동매출원가와 고정비 계정 금액이 지역 집계의 합계와 같은지 대조합니다. |
운영 전환 때 “기존 리포트를 없애야 하나” 하는 질문이 따라옵니다. 답은 없애지 않는다입니다. 표준 리포트는 법정·감사 대응과 원천 확인에 그대로 쓰고, 이 화면은 월마감 전에 점검 대상을 가리는 데 씁니다. 두 결과가 같은 기간에서 같은지 맞춰 보는 것이 전환의 첫 단계입니다.
S/4HANA 분석 스택과의 자리
표준 CDS 분석 쿼리나 Fiori 분석 앱, Analysis for Office 는 임의의 축으로 파고드는 탐색에 강합니다. 이 앱은 그 자리를 대신하지 않고, 월마감에서 매번 같은 한도와 같은 대사식으로 확인할 곳을 가려 주는 점검 화면의 자리에 둡니다. 같은 CDS 뷰를 분석 스택과 공유하면 두 화면의 숫자가 갈라지지 않습니다.
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 무엇을 손대나 | 어떻게 |
|---|---|---|
| 지역 매핑 | 판매처가 어느 지역에 속하는지 | 매핑 테이블에 판매처·지역·유효 기간을 둡니다. |
| 한도 | 지역별 공헌이익률 하한, 할인율·운임률 한도 | 한도 테이블 한 곳에서 지역마다 값을 정합니다. |
| 고정비 배부 | 지역에 고정비를 나누는 기준 | 배부 결과를 지역·월 금액으로 받습니다. |
| 운임 원천 | 운임 비용을 출고 명세에 붙이는 방법 | 운임 문서 금액을 청구 항목에 배부합니다. 정산 지연 건은 확인 필요로 둡니다. |
| 확장 필드 | 제품군이나 고객군 같은 추가 축 | CDS 뷰에 필드를 더하고 서비스 엔티티에 노출합니다. |
| 권한 | 지역 단위 조회 범위 | 권한 객체의 지역 값으로 집계 단계에서 제한합니다. |
분석 지표 정의표
| 지표 | 산식·판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 공헌이익률 | 공헌이익 ÷ 순매출 × 100, 지역별 하한 미달 시 점검 필요 | 지역 판정 · 월별 추이 | 청구 금액, 변동원가 | 하한은 가상 기준값 |
| 할인율 | 할인·리베이트 ÷ 총매출 × 100, 한도 초과 시 점검 필요 | 지역 판정 | 청구 조건 금액 | 리베이트 포함 |
| 운임률 | 변동운임·수수료 ÷ 순매출 × 100, 한도 초과 시 점검 필요 | 지역 판정 · 출고 명세 | 운임 비용 | 운임 0원 명세는 별도 집계 |
| 지역이익 | 공헌이익 − 지역 고정비, 0 미만이면 점검 필요 | 지역 판정 · 월별 추이 | 고정비 배부 금액 | 적자 지역·월 표시 |
| 총매출 대비 비중 | 요인 금액 ÷ 총매출 × 100 | 손익 구성 | 요인 금액 | 차감 · 원가 · 고정비 구분 |
CDS 구성
화면이 읽는 데이터는 결국 CDS 뷰에서 나옵니다. 아래는 이 화면의 서비스를 S/4HANA 위에서 구성할 때의 뼈대입니다. 코드는 구조를 보이는 스케치이며, 원천 필드와 계정 범위는 회사 설정에 맞춰 확인이 필요한 곳을 주석에 적었습니다.
뷰 레이어 구성
| 레이어 | 뷰·객체 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준(매핑) | ZREGP_REGMAP · ZREGP_LIMIT | 판매처→지역 매핑과 지역별 한도를 둔다 | 지역 구분과 한도는 정책이라 코드 밖에서 고쳐야 한다 |
| 기본 | ZI_RegProfitLine · ZI_RegProfitCost | 청구 항목을 출고 명세로 읽고 원가·운임을 붙인다 | 금액 정의를 한 번만 정해 모든 집계의 바닥으로 쓴다 |
| 큐브 | ZI_RegProfitCube | 공헌이익을 계산하고 지역·월·제품군으로 집계 가능하게 한다 | 합산 가능한 금액과 비율을 구분한다 |
| 소비(쿼리) | ZC_RegProfitQuery | 지역·월로 묶고 한도에 견줘 판정 코드를 만든다 | 화면 코드에 판정 기준이 흩어지지 않게 한다 |
| 권한 | ZC_RegProfitQuery(DCL) | 지역 단위 조회 범위를 제한한다 | 집계 단계에서 걸어야 새 나가지 않는다 |
| 서비스 | ZUI_RegProfit | 쿼리를 OData V2 로 노출한다 | 주소 한 줄로 개발·운영 전환 |
① 지역 매핑 테이블 — 지역 구분은 코드가 아니라 데이터로
지역 구분이 가장 먼저 흔들립니다. 영업 조직이 개편되면 판매처의 소속 지역이 바뀌는데, 그 구분을 뷰의 case 문에 박아 두면 개편 때마다 이송이 필요합니다. 유효 기간을 둔 매핑표로 빼 두면 과거 월은 옛 구분으로, 새 월은 새 구분으로 읽혀 지난 달 숫자가 흔들리지 않습니다.
" ─────────────────────────────────────────────────────────────
" 객체 : ZREGP_REGMAP (지역 매핑 테이블 — 판매처 → 지역)
" 역할 : 판매처가 어느 지역에 속하는지를 한 곳에서 정한다.
" 이유 : 지역 구분을 CDS 안에 case 문으로 박아 두면 구분이 바뀔 때마다
" 뷰를 고쳐 이송해야 한다. 표로 빼 두면 현업이 행만 고치면 된다.
" ─────────────────────────────────────────────────────────────
@EndUserText.label : '지역 매핑'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zregp_regmap {
key client : abap.clnt not null;
key kunag : kunag not null;
key valid_from : abap.dats not null;
valid_to : abap.dats;
regcode : abap.char(3);
regname : abap.char(12);
}
② 지역별 한도 테이블 — 한도는 정책이다
공헌이익률 하한과 할인율·운임률 한도는 지역마다 다르고 해마다 바뀝니다. 한도를 표로 두면 화면 코드를 고치지 않고 값만 바꿔 점검 기준을 조정할 수 있고, 화면은 이 값을 한도 칸으로 받아 그대로 보여 줍니다.
" ─────────────────────────────────────────────────────────────
" 객체 : ZREGP_LIMIT (지역별 한도 테이블)
" 역할 : 공헌이익률 하한 · 할인율 한도 · 운임률 한도를 지역마다 둔다.
" 이유 : 한도는 정책이라 자주 바뀐다. 화면에는 이 값이 한도 칸으로 내려온다.
" ─────────────────────────────────────────────────────────────
@EndUserText.label : '지역별 한도'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zregp_limit {
key client : abap.clnt not null;
key regcode : abap.char(3) not null;
cm_limit : abap.dec(7,2);
frt_limit : abap.dec(7,2);
disc_limit : abap.dec(7,2);
}
③ 기본 뷰 — 출고 명세
청구 항목 한 줄이 출고 명세 한 건입니다. 총매출과 순매출의 정의, 취소 청구의 제외, 지역 매핑 결합이 모두 여기서 결정되므로 운영에서 가장 먼저 검증해야 하는 뷰입니다.
" ─────────────────────────────────────────────────────────────
" 객체 : ZI_RegProfitLine (기본 뷰 — 출고 명세)
" 역할 : 청구 문서 항목 한 줄을 출고 명세 한 건으로 읽는다.
" 이유 : 이후 모든 집계의 바닥이므로 금액·수량 정의를 여기서 한 번만 정한다.
" 총매출 · 할인 · 순매출의 부호와 통화를 여기서 확정한다.
" ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '지역별 수익성 — 출고 명세'
define view entity ZI_RegProfitLine
as select from vbrk
inner join vbrp on vbrp.vbeln = vbrk.vbeln
left outer join zregp_regmap as rmap
on rmap.kunag = vbrk.kunag
and rmap.valid_from <= vbrk.fkdat
and ( rmap.valid_to >= vbrk.fkdat or rmap.valid_to = '00000000' )
{
key vbrk.vbeln as BillNo,
key vbrp.posnr as BillItem,
vbrk.gjahr as Gjahr,
cast( substring( vbrk.fkdat, 5, 2 ) as abap.numc( 3 ) ) as Period,
vbrk.fkdat as PostDate,
rmap.regcode as RegCode,
vbrp.matkl as ProdGroup,
vbrk.waerk as Currency,
@Semantics.quantity.unitOfMeasure: 'SalesUnit'
vbrp.fkimg as Qty,
vbrp.vrkme as SalesUnit,
/* 총매출 = 청구 정가 금액 — 세금·통화 처리는 회사 설정에 맞춰 확인 필요 */
@Semantics.amount.currencyCode: 'Currency'
vbrp.kzwi1 as GrossAmt,
/* 순매출 = 청구 순가치 */
@Semantics.amount.currencyCode: 'Currency'
vbrp.netwr as NetAmt
}
where vbrk.fksto = '' /* 취소 청구 제외 */
④ 기본 뷰 — 변동원가와 운임
원가와 운임은 원천이 달라 정산 시점이 어긋납니다. 운임이 아직 정산되지 않으면 0원으로 남는데, 이 사실을 지우지 않고 보존해야 뒤에서 “운임 0원 명세”를 점검 대상으로 가려낼 수 있습니다.
" ─────────────────────────────────────────────────────────────
" 객체 : ZI_RegProfitCost (기본 뷰 — 변동원가 · 운임)
" 역할 : 출고 명세에 변동매출원가와 변동운임·수수료를 붙인다.
" 이유 : 원가는 저널 항목, 운임은 운임 문서에서 온다. 두 원천이 달라
" 정산이 늦은 운임은 0원으로 남는다 — 이 뷰에서 그 사실을 보존한다.
" 확인 필요 : 원가 계정 범위와 운임 배부 키는 회사 설정에 따라 달라진다.
" ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '지역별 수익성 — 변동원가·운임'
define view entity ZI_RegProfitCost
as select from ZI_RegProfitLine as l
left outer join vfkp as f
on f.rebel = l.BillNo
{
key l.BillNo,
key l.BillItem,
/* 변동매출원가 = 출고 시 전기된 원가 — 저널 항목에서 청구 항목 단위로 배부 */
@Semantics.amount.currencyCode: 'Currency'
cast( 0 as abap.curr( 15, 2 ) ) as CostAmt,
/* 변동운임·수수료 = 운임 문서 금액 배부분. 정산 전이면 0 */
@Semantics.amount.currencyCode: 'Currency'
coalesce( f.netwr, cast( 0 as abap.curr( 15, 2 ) ) ) as FrtAmt,
l.Currency
}
⑤ 큐브 — 공헌이익과 집계
금액만 합산 가능하게 두고 비율은 소비 쪽에서 합계끼리 나눕니다. 행마다 계산한 공헌이익률을 평균하면 지역 값이 틀어지므로, 큐브에는 비율을 두지 않는 것이 원칙입니다. 운임 0원 건수와 음수 공헌이익 건수도 합산 가능한 값으로 둡니다.
" ─────────────────────────────────────────────────────────────
" 객체 : ZI_RegProfitCube (큐브 — 지역·월·제품군 수익성)
" 역할 : 명세에서 공헌이익을 계산하고 지역·월·제품군으로 집계 가능하게 한다.
" 이유 : 공헌이익률 같은 비율은 합산하면 안 되므로 금액만 합산하고
" 비율은 소비 쪽 쿼리에서 합계끼리 나눈다.
" ─────────────────────────────────────────────────────────────
@Analytics.dataCategory: #CUBE
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '지역별 수익성 — 큐브'
define view entity ZI_RegProfitCube
as select from ZI_RegProfitLine as l
inner join ZI_RegProfitCost as c
on c.BillNo = l.BillNo and c.BillItem = l.BillItem
{
key l.BillNo,
key l.BillItem,
l.Gjahr,
l.Period,
l.RegCode,
l.ProdGroup,
l.Currency,
@Aggregation.default: #SUM
@Semantics.amount.currencyCode: 'Currency'
l.GrossAmt,
@Aggregation.default: #SUM
@Semantics.amount.currencyCode: 'Currency'
l.GrossAmt - l.NetAmt as DiscAmt,
@Aggregation.default: #SUM
@Semantics.amount.currencyCode: 'Currency'
l.NetAmt,
@Aggregation.default: #SUM
@Semantics.amount.currencyCode: 'Currency'
c.CostAmt,
@Aggregation.default: #SUM
@Semantics.amount.currencyCode: 'Currency'
c.FrtAmt,
/* 공헌이익 = 순매출 − 변동매출원가 − 변동운임·수수료 */
@Aggregation.default: #SUM
@Semantics.amount.currencyCode: 'Currency'
l.NetAmt - c.CostAmt - c.FrtAmt as CmAmt,
/* 운임 0원 명세 수 — 정산 누락 의심 */
@Aggregation.default: #SUM
case when c.FrtAmt = 0 then 1 else 0 end as NoFrtCnt,
@Aggregation.default: #SUM
case when l.NetAmt - c.CostAmt - c.FrtAmt < 0 then 1 else 0 end as NegCmCnt
}
⑥ 분석 쿼리 — 지역·월 판정
화면이 읽는 엔티티가 이 쿼리입니다. 한도에 견준 판정 코드를 여기서 만들면 서버 계산과 화면 표시가 같은 기준을 쓰게 되어, 화면과 표준 결과를 맞출 때 판정 때문에 어긋나는 일이 없습니다.
" ─────────────────────────────────────────────────────────────
" 객체 : ZC_RegProfitQuery (분석 쿼리 — 지역·월 판정)
" 역할 : 큐브를 지역·월로 묶고 한도에 견줘 판정 코드를 만든다.
" 이유 : 화면이 읽는 엔티티는 이 쿼리 하나다. 판정 기준을 여기 두면
" 화면 코드에 한도가 흩어지지 않는다.
" ─────────────────────────────────────────────────────────────
@Analytics.query: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '지역별 수익성 — 지역·월 판정'
define view entity ZC_RegProfitQuery
as select from ZI_RegProfitCube as c
inner join zregp_limit as lim on lim.regcode = c.RegCode
{
@Consumption.filter: { selectionType: #SINGLE, mandatory: true }
key c.Gjahr,
@Consumption.filter.selectionType: #INTERVAL
key c.Period,
@UI.selectionField: [{ position: 10 }]
key c.RegCode,
sum( c.GrossAmt ) as GrossAmt,
sum( c.DiscAmt ) as DiscAmt,
sum( c.NetAmt ) as NetAmt,
sum( c.CmAmt ) as CmAmt,
/* 공헌이익률은 합계끼리 나눈다 — 행 비율을 평균하지 않는다 */
division( sum( c.CmAmt ) * 100, sum( c.NetAmt ), 2 ) as CmRate,
max( lim.cm_limit ) as CmLimit,
max( lim.disc_limit ) as DiscLimit,
sum( c.NoFrtCnt ) as MisCnt,
case
when division( sum( c.CmAmt ) * 100, sum( c.NetAmt ), 2 ) < max( lim.cm_limit )
then 'LOWCM'
when division( sum( c.DiscAmt ) * 100, sum( c.GrossAmt ), 2 ) > max( lim.disc_limit )
then 'DISC'
when sum( c.NoFrtCnt ) > 0 then 'NOFRT'
else ''
end as CheckCode
}
group by c.Gjahr, c.Period, c.RegCode
⑦ 접근 제어 — 지역 단위 권한
권한은 집계 단계에서 겁니다. 드릴 단계에서만 걸면 전사 합계에서 내 지역 합계를 빼는 식으로 남의 숫자를 추정할 수 있습니다.
" ─────────────────────────────────────────────────────────────
" 객체 : ZC_RegProfitQuery (접근 제어 — DCL)
" 역할 : 지역 단위 권한이 있는 사용자만 해당 지역을 본다.
" 이유 : 화면에서만 숨기면 서비스를 직접 부를 때 새 나간다.
" 집계 단계에서 걸어야 전사 합계와 자기 몫의 차이로 남의 숫자가
" 드러나지 않는다.
" ─────────────────────────────────────────────────────────────
@EndUserText.label: '지역별 수익성 — 지역 권한'
@MappingRole: true
define role ZC_RegProfitQuery {
grant select on ZC_RegProfitQuery
where ( RegCode ) = aspect pfcg_auth( ZREGPROF, ZREGCODE, ACTVT = '03' );
}
⑧ 서비스 정의와 바인딩
쿼리를 OData V2 서비스로 노출합니다. 서비스 활성화와 바인딩 게시 뒤에는 화면의 서비스 주소 한 줄만 바꾸면 운영 서비스로 전환됩니다.
" ─────────────────────────────────────────────────────────────
" 객체 : ZUI_RegProfit (서비스 정의 · 바인딩)
" 역할 : 쿼리를 OData V2 서비스로 노출한다.
" 이유 : 화면은 서비스 주소만 알면 되므로, 개발 서비스에서 운영 서비스로
" 옮길 때 매니페스트의 주소 한 줄만 바꾼다.
" ─────────────────────────────────────────────────────────────
@EndUserText.label: '지역별 수익성 점검 서비스'
define service ZUI_RegProfit {
expose ZC_RegProfitQuery as RegProfit;
}
" 서비스 바인딩 : 유형 OData V2 - UI, 이름 ZUI_REGPROFIT_O2
" 활성화 후 서비스 주소를 화면 매니페스트의 서비스 선언에 넣는다.
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 지역 매핑 | 판매처가 어느 지역에 속하는지, 개편 이력을 어떻게 둘지 | 숫자가 표준 결과와 어긋나 첫 회의에서 막힌다 | 영업기획 · 회계팀 |
| 한도 설정 | 지역별 공헌이익률 하한과 할인율·운임률 한도 | 점검 필요가 너무 많거나 너무 적어 의미를 잃는다 | 영업기획 · 관리회계 |
| 부호 규칙 | 매출·원가·할인의 부호와 통화 처리 | 합계가 맞는데 부호가 뒤집힌 숫자가 나온다 | 회계팀 |
| 원천 확정 | 총매출·할인·원가·운임이 어느 문서·계정에서 오는지 | 같은 지역을 두 원천으로 읽어 숫자가 갈라진다 | 관리회계 · 물류 |
| 고정비 배부 | 지역에 고정비를 나누는 기준과 시점 | 지역이익이 해마다 달라져 비교가 안 된다 | 관리회계 |
| 권한 설계 | 지역 단위 권한 객체와 역할 배정 | 전사 합계와 자기 몫의 차이로 남의 숫자가 드러난다 | 보안 · 권한 |
| 대사 체계 | 표준 T-code 와 맞출 항목과 허용 차이 | 표준 결과와 같은지 확인할 근거가 없다 | 관리회계 |
| 전송 순서 | 테이블 → 기본 뷰 → 큐브 → 쿼리 → 권한 → 서비스 | 활성화 오류와 권한 누락이 운영에서 터진다 | 개발 · Basis |
| 서비스 활성화 | 서비스 바인딩 게시, 화면 매니페스트의 서비스 주소 교체 | 화면이 개발 서비스를 계속 읽는다 | 개발 · Basis |
운영 데이터로 갈 때
청구 항목이 수천만 건이 되면 집계 위치가 성능을 가릅니다. 명세 단위로 화면에 올리지 않고 지역·월 집계를 서버에서 먼저 만들고, 출고 명세 탭은 기간이나 지역을 사실상 필수로 받아 건수를 제한합니다. 회계연도와 기간은 쿼리의 필수 파라미터로 두고, 큐브의 기준 열에는 인덱스나 집계 캐시를 검토합니다. 응답 시간 기준은 도입 때 함께 정하며, 대용량에서는 월 마감 시점 집계를 미리 만들어 두는 방식이 안전합니다.
자주 묻는 질문
숫자와 산식, 화면과 조작, 데이터와 표준 연계, 도입과 운영 네 묶음으로 정리했습니다.
숫자와 산식
공헌이익과 지역이익은 어떻게 다릅니까?
공헌이익은 순매출에서 변동매출원가와 변동운임·수수료를 뺀 값이고, 지역이익은 거기서 지역 고정비를 한 번 더 뺀 값입니다. 공헌이익은 한 건을 더 팔 때 남는 몫을 보여 주고, 지역이익은 그 지역이 고정비까지 감당하는지를 보여 줍니다. 화면은 두 값을 한 줄에 함께 놓아 공헌이익은 남는데 지역이익이 적자인 지역을 바로 가려냅니다.
순매출은 어떻게 계산합니까?
총매출에서 할인·리베이트를 뺀 값입니다. 화면의 요약 카드와 표, 대사 결과 모두 같은 식을 쓰며, 명세 한 건마다 총매출 − 할인·리베이트 = 순매출이 맞는지 288건 전수로 대사합니다. 차이가 한 건이라도 있으면 대사 결과 탭과 요약의 대사 차이 건수에 바로 드러납니다.
한도 값은 어디서 오며 바꿀 수 있습니까?
지금 화면의 한도(공헌이익률 하한 24.00~30.00%, 할인율 6.00~8.00%, 운임률 3.00~8.00%)는 이 화면의 가상 기준값입니다. 실제 적용 때는 회사의 가격 정책과 지역 특성에 맞춰 정하며, 한도는 서비스 데이터의 칸으로 내려오므로 화면 코드를 고치지 않고 값만 바꾸면 됩니다. 지역마다 다르게 둘 수 있어 해외 지역은 운임 한도를 더 넓게 잡는 식으로 운영합니다.
점검 필요가 나오면 문제가 있다는 뜻입니까?
아닙니다. 한도를 벗어났으니 확인해 보라는 표시일 뿐 원인이나 책임을 단정하지 않습니다. 할인이 의도된 프로모션일 수도, 운임이 일시적인 물류 사정일 수도 있습니다. 이 화면은 점검 도구이며 최종 판단은 회사와 담당 부서, 필요하면 감사인이 합니다.
운임이 0원인 명세는 왜 따로 가려냅니까?
운임이 0원이면 공헌이익이 실제보다 좋아 보이기 때문입니다. 샘플 데이터의 아시아 2월에는 운임이 빠진 명세 3건이 있고, 그 달 아시아의 공헌이익률은 43.72%로 높게 나옵니다. 운임 정산이 끝난 뒤 다시 계산하면 달라질 수 있으니 확인 필요로 표시해 정산 담당에게 넘기도록 했습니다.
공헌이익이 음수인 명세는 오류입니까?
반드시 오류는 아닙니다. 판촉이나 재고 정리처럼 의도적으로 원가 아래에서 판 건일 수 있습니다. 화면은 음수 명세를 의도적 예외로 따로 세어 정합성 대사의 차이와 섞이지 않게 하고, 수도권 3월과 충청권 5월 두 건을 예시로 보여 줍니다.
화면과 조작
조회조건은 어떻게 걸립니까?
회계연도만 필수이고 나머지는 고르지 않으면 걸리지 않습니다. 매출 월 시작·종료, 지역, 제품군, 요인, 출고일 시작·종료, 점검 결과를 조합할 수 있고, 조건은 화면에서 필터 객체로 만들어 서비스 요청의 조건절로 전달됩니다. 전체를 고르면 그 조건 자체를 보내지 않으므로 코드값 전체를 나열하지 않습니다.
행을 누르면 무엇이 열립니까?
지역·월 한 행을 누르면 상세 창이 열려 지표 전체와 같은 지역·월의 출고 명세를 보여 줍니다. 출고 명세 행을 누르면 그 명세의 금액 구성과 점검 사유가 열립니다. 닫기 버튼으로 돌아오면 조회조건과 탭은 그대로 남아 있어 다음 행을 바로 확인할 수 있습니다.
결과를 엑셀에서 쓸 수 있습니까?
현재 탭의 조회 결과를 UTF-8 CSV 로 내려받을 수 있습니다. 화면의 컬럼 순서와 이름을 따릅니다. 조건을 좁힌 상태에서 내려받으면 그 범위만 담깁니다.
탭 이름 위의 숫자는 무엇입니까?
현재 조회조건에 맞는 건수입니다. 지역 판정 36, 손익 구성 24, 출고 명세 288, 월별 추이 6, 대사 결과 9가 기본 조건의 값이고, 조건을 좁히면 같이 줄어듭니다. 어느 탭에 볼 것이 남았는지 열어 보기 전에 알 수 있습니다.
좁은 화면에서도 쓸 수 있습니까?
조회조건이 줄을 바꿔 쌓이고 요약 숫자는 두 칸씩 접히며, 표는 화면 안에서 좌우로 넘겨 봅니다. 폭 390px 에서 페이지 전체가 가로로 밀리지 않는 것을 확인했습니다. 다만 열이 많은 표라 현장에서는 데스크톱 화면이 더 읽기 편합니다.
오류가 나면 어떻게 보입니까?
서비스에 연결하지 못하거나 요청이 실패하면 오류 안내 창이 한국어 문구로 뜹니다. 메타데이터 실패, 요청 실패, 빈 응답을 구분해 안내하므로 화면이 빈 채로 멈춘 것처럼 보이지 않습니다.
데이터와 표준 연계
이 화면의 숫자는 어디서 옵니까?
지금은 가상 지역·가상 제품군으로 만든 검증용 샘플 데이터입니다. 운영에서는 청구 문서의 금액과 할인 조건, 운임 문서, 원가·고정비 계정 금액을 원천으로 하고, 지역 구분은 판매처 마스터와 매핑표로 정합니다. 어느 원천을 어떻게 읽을지는 CDS 구성 절에 코드와 함께 적었습니다.
표준 T-code 의 결과와 어떻게 맞춰 봅니까?
공헌이익과 손익 구성은 KE30 의 수익성 분석 결과와, 출고 명세는 KE24 의 개별 항목과, 총매출과 할인은 VA03·VF03 의 문서와, 고정비와 운임 비용은 KSB1·FAGLL03 과 맞춰 봅니다. 표준 화면의 숫자는 그대로 두고, 이 화면의 합계가 같은 기간·같은 지역에서 표준 결과와 같은지를 월마감 대사 항목으로 둡니다.
표준 리포트를 없애도 됩니까?
없애지 않는 것을 권합니다. 법정·감사 대응에 쓰는 숫자는 표준 화면이 담당하고, 이 화면은 월마감 전에 한도를 벗어난 지역을 가려내는 조회·점검 관점을 더합니다. 두 결과가 같은지 맞춰 보는 것이 운영 전환의 첫 단계입니다.
적용 시기나 의무 범위가 정해져 있습니까?
없습니다. 지역별 수익성 분석은 회계기준이 정한 항목이 아니라 관리회계 관점의 분석입니다. 그래서 관련 기준서는 없음(-)으로 표기하며, 지역 구분과 고정비 배부 방식은 회사가 정한 체계를 따릅니다.
지역 구분이 바뀌면 어떻게 합니까?
지역 매핑표에서 판매처가 어느 지역에 속하는지를 고치면 됩니다. 매핑 기간을 함께 두어 과거 월은 옛 구분으로, 새 월은 새 구분으로 읽게 하면 지난 달 숫자가 흔들리지 않습니다. 지역 이름과 코드가 바뀌어도 화면 코드는 건드리지 않습니다.
고정비는 어떻게 지역에 나눕니까?
화면은 지역별 고정비 금액을 입력으로 받습니다. 어떤 기준(인원, 면적, 매출 비중 등)으로 나눌지는 회사가 정하는 일이며, 기준이 바뀌면 지역이익이 달라지므로 도입 때 가장 먼저 합의해야 하는 항목으로 둡니다. 배부 결과는 지역 고정비 칸으로 내려옵니다.
도입과 운영
누가 쓰는 화면입니까?
월마감에서 지역별 수익성을 확인하는 관리회계 담당자와, 한도를 벗어난 지역의 사유를 되묻는 영업·물류 관리자가 주 사용자입니다. 경영지원 쪽에서는 지역이익이 적자인 지역과 월별 흐름을 한눈에 보는 용도로 씁니다.
도입하면 무엇이 달라집니까?
표준 보고서를 지역·제품군별로 여러 번 돌려 엑셀에서 합치던 일이 한 화면의 조회로 줄어듭니다. 한도를 넘은 지역이 먼저 보이므로 훑어보는 시간이 줄고, 대사 결과가 화면에 함께 있어 숫자를 믿어도 되는지 따로 묻는 일이 줄어듭니다.
권한과 보안은 어떻게 둡니까?
남의 지역 숫자가 보이지 않도록 지역 단위 권한을 집계 단계에서 겁니다. CDS 구성 절의 접근 제어 예시처럼 권한 객체의 지역 값으로 조회 범위를 제한하며, 화면 쪽에서만 숨기지 않는 것이 핵심입니다. 화면은 OpenUI5 표준 컨트롤만 쓰고 외부로 데이터를 보내지 않습니다.
운영 서버에 연결하는 절차와 기간은 어떻게 됩니까?
CDS 뷰를 만들어 서비스를 활성화하고, 화면의 서비스 주소를 운영 서비스로 바꾸면 됩니다. 이 앞에 지역 매핑, 한도, 고정비 배부 기준을 정하는 합의가 있으며, 실제로 일정을 좌우하는 것은 코딩보다 이 합의입니다. 기간은 회사의 이송 절차와 데이터 정비 수준에 따라 달라 일률로 말하기 어렵습니다.
전표가 수천만 건이면 느려지지 않습니까?
출고 명세를 화면에 그대로 올리지 않고 지역·월 집계를 서버에서 먼저 하도록 구성합니다. 명세 탭은 조회조건(기간·지역)을 필수에 가깝게 두고, 건수는 인라인 건수와 페이징으로 나눠 읽습니다. 운영 규모에서는 집계 뷰를 미리 만들어 두는 방식을 쓰고, 응답 시간 기준은 도입 때 함께 정합니다.
샘플 데이터와 실제 데이터의 형식 차이는 없습니까?
화면은 서비스가 돌려주는 엔티티 형식에만 의존하므로 같은 형식이면 샘플이든 운영이든 똑같이 동작합니다. 날짜는 서비스 표준 날짜 형식으로, 금액과 비율은 십진수 문자열로 주고받습니다. 운영 연결 뒤에는 대사 결과 탭이 표준 화면과의 차이를 가장 먼저 알려 줍니다.
유지보수는 어디에 손이 갑니까?
매달 손이 가는 곳은 한도 값과 지역 매핑 두 곳입니다. 새 지역이나 새 판매처가 생기면 매핑표에 한 줄을 더하는 것으로 끝나고, 한도는 정책이 바뀔 때 값만 고치면 됩니다. 화면 로직은 서비스 데이터를 그대로 보여 주므로 평소에는 손댈 일이 거의 없습니다.
이 화면이 최종 판단을 대신합니까?
아닙니다. 한도에 견주어 확인 대상을 가려 줄 뿐 지역별 가격 정책이나 물류 계약을 평가하지 않습니다. 점검 필요로 표시된 건의 사유를 확인하고 조치를 정하는 것은 회사와 담당자, 필요하면 감사인의 몫입니다.