수출 솔루션 · 수출 매출 인식 시점 점검

선적·매출 기간귀속 다차원 분석 리포트 — 수출 매출이 어느 달에 잡혔는지, 통제 이전 시점 기준과 얼마나 다른지 요인으로 가르는 점검 화면

선적·통제 이전·청구 전기 세 날짜를 한 큐브에 · 월별 인식액을 축 전환으로 돌려 보기 · 칸에서 청구 문서까지의 드릴스루 · 통제 이전월 기준과의 6요인분해 · 행에 남는 변동 사유 · 숫자를 모델에 맡기지 않는 AI 분석 · 스스로 도는 AI 에이전트 — 소개 영상과 실제 화면 28종, 그리고 CDS 코드까지

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

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

수출 회사의 월 마감 때 반복되는 질문이 있습니다. 이 매출은 어느 달에 잡아야 하나, 선적한 달인가 청구서를 낸 달인가, 지난달에 앞당겨 잡은 것과 이번 달로 미룬 것이 각각 얼마인가. 인코텀즈가 FOB·CIF 이면 선적 시점에, DAP·DDP 이면 도착 시점에 통제가 넘어간다고 보는 것이 보통인데, 청구 문서는 영업 사정에 따라 선적보다 먼저 나가기도 하고 한참 뒤에 나가기도 합니다. 지금은 이 답이 청구 문서 조회, 출하 문서 조회, 회계 전표 조회, 그리고 마감 때마다 만드는 엑셀에 흩어져 있습니다. 이 화면은 같은 수출 청구 데이터를 선적일·통제 이전일·청구 전기일 세 날짜와 함께 한 큐브에 모아 월별로 돌려 보고, 통제 이전 시점 기준과 어디서 얼마나 달라졌는지를 한 화면에서 답하도록 이어 붙입니다.

표준 화면(VA03 · VL03N · VF03 · FB03 · KE30)은 각자 맡은 문서를 정확히 보여 줍니다. 다만 “청구한 달 기준 인식액과 통제 이전한 달 기준 인식액이 얼마나 다르고, 그 차이가 어떤 이유로 생겼는가” 를 한 번에 가르는 자리는 표준 화면 사이에 있습니다. 이 앱은 표준 실행은 SAP 표준 T-code 에 그대로 두고, 그 사이를 조회·검증 관점으로 메웁니다. 판단은 숫자를 단정하지 않고 점검 필요 · 확인 필요로 남깁니다.

한 줄 요약 — 월별 매출 조회는 누구나 만듭니다. 이 앱의 값은 조회 다음에 있습니다: 장부 인식액과 통제 이전 시점 기준 인식액의 차이를 여섯 요인으로 가르고, 이유별 이동분을 따로 세우고, 사유를 행에 남기고, 사람이 열지 않아도 감시하며, 합이 총차이와 어긋나지 않는지 매번 검산합니다.

핵심 포인트 일곱 가지

핵심 포인트고객이 얻는 것지금 방식이라면
① 세 날짜를 한 큐브에선적일·통제 이전일·청구 전기일을 한 줄에 두고, 장부 인식월과 통제 이전월이 같은지 다른지를 줄마다 판정합니다.출하 조회와 청구 조회를 오가며 날짜를 눈으로 맞춰 봅니다.
② 축을 바꿔도 갈라지지 않는 피벗지역·국가·고객·인코텀즈·제품그룹을 끌어다 놓아 행 3단계·열 2단계로 봅니다. 모든 축이 같은 큐브에서 나와 합계가 어긋나지 않습니다.축마다 리포트를 따로 만들고, 합계가 다르면 맞추는 회의를 엽니다.
③ 칸에서 청구 문서까지 한 번에금액 칸을 누르면 그 금액을 만든 청구 문서 라인이 선적일·통제 이전일·청구 전기일과 함께 열리고, 합계가 칸 금액과 같은지 바로 보입니다.리포트를 닫고 VF03 을 열어 조건을 손으로 다시 맞춥니다.
④ 기준과의 차이를 여섯 요인으로선적 전 조기 청구·도착 조건 선인식·청구 지연·서류 통관 대기·월초 일괄 청구·환율로 가르고 합이 총차이와 같은지 검산합니다.엑셀로 분해하고, 합계가 총차이와 맞는지 다시 손으로 맞춥니다.
⑤ 앞서 잡은 것과 늦게 잡은 것을 따로 세움조기 이동분과 지연 이동분이 한 숫자에 섞이지 않도록 중립 색으로 나눠, 점검할 자리를 좁힙니다.“이번 달 매출이 늘었다” 한 줄에 앞당겨 잡은 몫이 묻힙니다.
⑥ 변동 사유가 행에 남는다사유가 조회 범위와 행 경로에 묶여 저장되어 축을 바꿔도, 다음 조회에도 그 행에 따라옵니다.같은 질문을 매번 다시 하고, 지난번 답은 메일함에서 찾습니다.
⑦ 숫자는 서비스가, 글은 AI가, 점검은 에이전트가금액과 비율은 서비스가 계산하고 해설은 그 값을 옮깁니다. 규칙에 걸린 항목은 받을 역할의 대기함에 올라가고, 보고 범위 그대로 PowerPoint 보고서도 만들어집니다.AI 가 만든 숫자를 보고에 써도 되는지부터 따져야 하고, 점검은 사람이 화면을 열어야 시작됩니다.

사례로 보는 효과 — 청구한 달과 통제가 넘어간 달이 다를 때

검증용 샘플 데이터(2026년 1월~9월 수출 청구 2,975줄, 고객 14·제품 12·국가 8·통화 4)에서 장부 인식액은 28,221백만원, 통제 이전월 기준 인식액은 28,403백만원으로 총차이는 −183백만원입니다. 합계만 보면 0.6% 차이라 넘어가기 쉽습니다. 여섯 요인으로 가르자 모양이 달라집니다.

요인금액(백만원)읽는 법
선적 전 조기 청구−28청구 전기가 선적보다 먼저 일어나 달이 달라진 몫의 차이
도착 조건 선인식−164DAP · DDP 를 선적 시점에 청구·전기한 몫의 차이 — 가장 먼저 점검할 자리
청구 지연+23통제 이전 뒤 청구가 다음 달로 넘어간 몫의 차이
서류·통관 대기−57서류·통관 확인으로 청구가 한 달 이상 늦어진 몫의 차이
월초 일괄 청구+32월말 통제 이전분을 월초에 모아 청구한 몫의 차이
환율+11인식일 환율과 통제 이전일 환율의 차이 — 시점 이동과 분리해서 읽을 값
합계−183총차이와 같음(검산 줄 오차 0원)

같은 달에 통제 이전과 인식이 함께 일어난 정시 인식률은 81.92%(기준 81.35%)이고, 월별 이동 비율은 14.2%에서 23.5% 사이를 오갑니다. 국가별로는 미국(−133)·독일(−102)·폴란드(−80)는 장부가 기준보다 적게, 베트남(+98)·중국(+47)은 많게 잡혔습니다. 월별로는 8월이 장부 2,959 대 기준 3,280(−321), 4월이 3,134 대 2,921(+213)로 가장 크게 벌어집니다. 이 화면은 원인을 단정하지 않고 선적 시점 청구를 점검해야 할 고객·국가·인코텀즈를 금액 순으로 올려 줍니다. 요인 합계가 총차이와 같은지는 매번 검산하며, 이 샘플의 대사 검사 78건은 모두 차이 0건입니다.

도입하면 달라지는 것

  • 마감 회의의 주제 — “이 달 매출이 맞나” 가 아니라 “DAP·DDP 청구 시점을 어떻게 볼 것인가” 로 옮겨 갑니다.
  • 보고 준비 — 인식액·기준·요인분해·사유·보고서가 한 화면에서 나와 엑셀 취합과 캡처가 줄어듭니다.
  • 다음 조회로 이어지는 기록 — 사유와 레이아웃이 남아 같은 설명을 다시 하지 않습니다.
  • 놓치는 날이 없는 점검 — 아무도 화면을 열지 않아도 규칙에 걸린 항목이 받을 역할의 대기함에 올라옵니다.

이런 회사에 맞습니다

외화로 수출 청구를 내고 인코텀즈가 FOB·CIF 와 DAP·DDP 로 섞여 있어 통제 이전 시점이 계약마다 다른 제조·유통 회사에 맞습니다. 월말 선적이 많거나 서류·통관 확인 때문에 청구가 늦어지는 일이 잦은 곳, 수출 국가와 통화가 여럿이라 환율 효과를 시점 이동과 따로 읽어야 하는 곳일수록 효과가 큽니다. 수출 영업, 물류, 회계(결산) 담당이 같은 숫자를 놓고 이야기해야 하는 조직, 월 마감 전에 매출 인식 시점을 점검하는 회의를 여는 조직을 염두에 두었습니다. 반대로 수출 비중이 작아 월별 이동이 눈에 띄지 않거나, 통제 이전 시점 정책이 아직 정해지지 않은 회사는 정책부터 정해야 합니다.

실행 화면

사용 방법

  1. 조회조건 입력 — 필수는 회사코드와 시작·종료 기간입니다(기본값 1000, 2026-01 ~ 2026-09). 비교 기준은 통제 이전월 기준으로 고정이고, 저장된 레이아웃 선택은 선택 사항입니다.
  2. 조회 — 조회 단추는 조회조건 영역 오른쪽 끝에 있고, 회사코드 칸에서 Enter 키를 눌러도 같은 조회가 됩니다. 조회 전에도 레이아웃 보드와 피벗 틀이 먼저 보입니다. 기본 레이아웃에 자동 조회를 지정하면 화면을 열 때 조회된 채로 시작합니다.
  3. 요약 확인 — 표 위의 역할별 요약에서 경영자 · 재무 책임자 · 영업 책임자 · 물류 책임자를 바꾸면 앞세우는 지표 네 개와 쪼개 보는 차원이 함께 바뀝니다. 다시 조회하지 않습니다.
  4. 축 바꾸기 — 레이아웃 보드의 차원 단추를 쓰지 않는 차원 · 행 · 열 칸으로 끌어다 놓습니다. 행은 3단계, 열은 2단계까지이며, 서버를 다시 부르지 않고 브라우저가 가진 큐브를 바로 다시 묶습니다. 차원 필터 단추에서는 값을 여러 개 고릅니다.
  5. 행·셀 클릭 상세 — 행의 화살표로 하위 차원까지 내려가고, 금액 칸을 누르면 그 금액을 만든 청구 문서 라인이 열립니다. 위쪽 기간별 요약 단추는 월별 요약을 보여 줍니다.
  6. 계산항목과 기준 대비 — 조기 이동분 · 지연 이동분 · 이동 비율 같은 계산항목을 고르고 보기 방식을 단계 보기로 바꾸면 인식 단계가 행으로 펼쳐집니다. 기준 대비 스위치를 켜면 칸마다 장부 · 기준 · 차이 · 증감률이 붙고, 차이가 난 행에서 사유를 남기며, 차트의 차이 분해 탭에서 워터폴과 검산 줄을 봅니다.
  7. AI 분석·에이전트 — 위쪽 AI 분석에서 현재 범위의 해설과 근거 표를 읽고, AI 에이전트에서 감시 규칙 · 받은 보고 · 실행 기록 탭을 오가며 실행합니다.
  8. 내보내기·저장 — AI 분석 창의 보고서 단추로 PowerPoint 보고서를, 위쪽 CSV 단추로 현재 표(사유 포함)를 내려받습니다. 레이아웃 메뉴에서는 현재 배치를 이름 붙여 저장합니다.

무엇으로 만들었나

화면은 OpenUI5 표준 컨트롤과 직접 그린 SVG 차트로 짰고, 데이터는 OData V2 서비스 하나에서 읽습니다. 서비스 쪽에서 판정하는 일과 브라우저가 맡는 일을 아래처럼 나눴습니다.

자리무엇왜 그렇게 두었나
화면 컨트롤트리 테이블 피벗 · 레이아웃 보드(끌어다 놓기) · 역할 요약 · SVG 차트 · 대화상자 묶음외부 차트 라이브러리 없이 표준 컨트롤만 쓰면 사내망에서 반입 심사가 필요 없고, 차트가 표와 같은 값을 그립니다.
집계 로직읽어 온 큐브를 브라우저가 행·열 조합으로 다시 묶는 피벗 모듈큐브 자체가 엔티티셋이라 축을 바꿔도 서비스를 다시 부르지 않고, 어느 배치에서도 총합이 같습니다.
판정·분해 로직서비스가 계산하는 6요인분해 · 규칙 기반 해설 · 감시 규칙 실행금액과 비율은 서비스 한 곳에서만 계산해, 화면·AI 해설·보고서가 같은 숫자를 씁니다.
OData 서비스 구성기본 모델 하나(OData V2, 단방향 바인딩, 조회 건수는 응답에 포함) · 엔티티셋 15개(읽기 전용과 쓰기 가능) · 계산 펑션 3개조회조건은 모두 필터 객체로 서비스에 넘기고, 사유·레이아웃·감시 규칙은 생성·수정·삭제로 저장합니다. 운영에서는 데이터 원천만 바꾸고 계약은 그대로 둡니다.
테마sap_horizon표준 Fiori 화면과 같은 색과 글꼴이라 사용자가 위화감 없이 오갑니다.

앱 정보

항목내용
솔루션 · 업무 영역수출 솔루션 · 수출 매출 기간귀속 점검 / 통제 이전 시점 기준과의 차이 분석
대상 영역IFRS 15(K-IFRS 제1115호) 고객과의 계약에서 생기는 수익의 통제 이전 시점 인식과 관련된 점검 영역입니다. 특정 기준서의 요구사항을 직접 구현하는 화면은 아닙니다.
연계하는 SAP 표준 T-codeVA03 · VL03N · VF03 · FB03 · KE30
화면 성격다차원 분석 리포트 — 피벗 · 드릴스루 · 기준 대비 차이 · 요인분해 · AI 분석 · AI 에이전트
데이터OData V2 — 검증용 샘플 데이터로 동작을 확인했습니다(샘플 청구 3,043줄 가운데 조회 기간 장부 인식분 2,975줄 → 장부 큐브 1,033건, 기준 큐브 1,026건)
SAP 표준 기능을 그대로 이어받은 부분 — 청구 문서 번호·품목, 인코텀즈, 환율, 출하일 같은 필드는 표준 문서의 필드를 그대로 가져와 쓰고, 칸에서 연 문서 라인의 번호로 표준 청구 문서 조회 화면에서 실제 문서를 찾을 수 있습니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다.

실제 브라우저에서 검증용 샘플 데이터로 찍은 화면 28종을 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 하는 자리인지 아래에 적었습니다. 숫자는 모두 같은 자료에서 나온 것이라 화면끼리 맞춰 보셔도 됩니다.

처음 열었을 때 — 조회 전에도 틀이 먼저 보입니다

처음 열었을 때에는 아직 서비스를 부르지 않은 상태에서도 화면의 뼈대가 보입니다. 조회 직후 한 화면에 표 · 차트 · 요약이 함께 뜹니다.

조회 전 화면
조회 전 화면 — 조회조건 · 레이아웃 보드 · 피벗 틀이 먼저 보입니다

회사코드 · 시작·종료 기간 · 비교 기준 · 저장된 레이아웃과 그 아래 레이아웃 보드가 조회 전에도 먼저 뜹니다. 조회 단추는 조회조건 영역 오른쪽 끝에 있고, 회사코드 칸에서 Enter 키를 눌러도 같은 조회가 됩니다. 기본 배치는 행 지역 › 국가이며 열은 비어 있습니다.

조회 직후 — 피벗과 차트
조회 직후 — 피벗과 차트 — 한 번 읽은 큐브로 표와 차트와 요약이 함께 그려집니다

조회 한 번으로 장부 큐브 1,033건(원천 청구 2,975줄)을 읽어 표 · 차트 · 역할 요약을 그립니다. 경영자 요약은 장부 인식액 28,221백만원과 정시 인식률 81.92%를 앞세우고 각 값 아래에 기준과 대비를 붙입니다. 표 왼쪽 화살표로 지역 아래 국가를 펼치면 차트도 함께 바뀝니다.

머리 영역 접기
머리 영역 접기 — 조건은 한 줄 요약으로 남습니다

조회 조건 영역을 접으면 회사 · 기간 · 행·열 구성 · 항목 · 기준 대비 여부 · 필터 수가 한 줄에 남고 표와 차트가 화면을 더 씁니다. 다시 펼치면 조건이 그대로 있습니다.

경영 요약 — 역할 네 개

같은 큐브를 역할마다 다른 눈으로 읽습니다. 역할을 바꿔도 다시 조회하지 않고 앞세우는 지표와 쪼개 보는 차원만 바뀝니다.

경영자
경영자 — 정시 인식률과 기간 이동 규모를 앞세웁니다

경영자 역할은 장부 인식액 · 기준 인식액 · 정시 인식률 · 이동 비율을 앞세우고 국가별로 쪼갭니다. 값마다 기준과의 대비가 붙어 “어디서 달라졌나” 를 첫 화면에서 읽습니다.

재무 책임자
재무 책임자 — 마감 관점의 이동분과 환율 효과

재무 책임자 역할은 마감에 직접 영향을 주는 이동분과 환율 효과를 앞세우고 고객별로 쪼갭니다. 기준과의 차이가 큰 고객이 먼저 보입니다.

영업 책임자
영업 책임자 — 국가별 지연 이동분

영업 책임자 역할은 청구가 늦어진 몫(지연 이동분)을 국가별로 보여 줍니다. 늦게 잡힌 이유가 청구 지연인지 서류·통관 대기인지는 이동 사유 계산항목으로 이어서 봅니다.

물류 책임자
물류 책임자 — 인코텀즈별 조기 이동분

물류 책임자 역할은 선적 전에 앞서 잡힌 몫(조기 이동분)을 인코텀즈별로 보여 줍니다. DAP · DDP 처럼 도착 시점에 통제가 넘어가는 조건에서 선적 시점 청구가 몰려 있는지 확인하는 자리입니다.

축 바꾸기 — 서버를 다시 부르지 않고 돌려 봅니다

차원 단추를 끌어다 놓기만 하면 브라우저가 가진 큐브를 바로 다시 묶습니다. 어떤 배치에서도 총합은 같아야 하고, 이 값이 갈라지는지를 배치 6가지로 시험했습니다.

열에 인식월을 올린 피벗
열에 인식월을 올린 피벗 — 월별 인식액을 한 장에서 봅니다

열에 인식월을 올리자 월별 인식액이 나란히 서고 오른쪽 끝에 합계가 붙습니다. 이 동작이 서비스 호출 0건이라는 것, 그리고 합계가 28,220,585,809원으로 배치와 관계없이 같다는 것을 시험으로 확인했습니다.

차원 값 다중 선택
차원 값 다중 선택 — 값마다 이름 · 코드 · 라인 수가 보입니다

차원 필터 단추에서 값을 여러 개 고릅니다. 같은 차원 안은 또는, 다른 차원끼리는 그리고로 묶이고, 큐브에 있는 값만 목록에 올라옵니다.

필터를 건 결과
필터를 건 결과 — 선택 값 합계 = 큐브 합계

일본과 미국을 고른 결과 합계는 9,459,910,287원으로, 큐브에서 두 국가 값을 직접 합한 값과 같았습니다. 필터는 서버를 다시 부르지 않고 브라우저에서 걸립니다.

칸에서 청구 문서까지 — 세 날짜를 함께 봅니다

이 화면의 핵심 질문은 “이 금액이 어느 문서의 어느 날짜에서 나왔나” 입니다. 금액 칸을 누르면 바로 문서 라인이 열립니다.

칸을 눌러 연 드릴스루
칸을 눌러 연 드릴스루 — 칸 금액 = 문서 라인 합계

금액 칸을 누르면 그 금액을 만든 청구 문서 라인이 열리고 칸 금액과 문서 라인 합계가 같은지 머리에 표시됩니다. 줄마다 선적일 · 통제 이전일 · 청구 전기일 · 이동 사유가 보이며 기본 500행씩 페이지로 넘깁니다. 칸 10개를 시험해 모두 일치했습니다.

기간별 요약
기간별 요약 — 월별 인식액과 이동분

위쪽 기간별 요약 단추는 월별 인식액과 이동분을 한 장으로 보여 줍니다. 월마다 정시 인식분과 이동분의 비중이 어떻게 달라지는지 훑는 용도입니다.

계산항목 단계 보기
계산항목 단계 보기 — 정시 · 조기 · 지연 이동분이 행으로 펼쳐집니다

조기 이동분 · 지연 이동분 · 이동 비율 같은 계산항목을 고르고 보기 방식을 단계 보기로 바꾸면 인식 단계가 행으로 펼쳐집니다. 각 단계의 금액이 어떤 이동 사유에서 왔는지 한 표에서 읽습니다.

기준 대비 차이 — 어디가 얼마나 다른가

기준 대비 스위치를 켜면 칸마다 장부 · 기준 · 차이 · 증감률이 붙습니다. 인식 시점은 빠르다고 좋고 늦다고 나쁜 값이 아니라서 초록 · 빨강을 쓰지 않고 주황 한 색으로 점검할 칸만 표시합니다.

기준 대비 차이 모드
기준 대비 차이 모드 — 금액과 비율을 모두 넘는 칸만 색이 칠해집니다

차이 금액이 1천만원 이상이고 증감률이 5% 이상인 칸만 주황으로 칠해집니다(이동 비율 같은 비율 항목은 0.5퍼센트포인트 이상). 샘플에서 색이 칠해진 칸 21개는 임계를 넘는 칸 21개와 일치했습니다.

변동 사유 입력
변동 사유 입력 — 차이가 난 행에서 사유를 적습니다

차이가 난 행의 사유 단추로 사유를 적습니다. 사유는 조회 범위와 행 경로에 묶여 저장되며, 원인을 단정하는 문구 대신 담당자가 원천 문서로 확인한 내용을 남기도록 했습니다.

사유를 저장한 행
사유를 저장한 행 — 저장한 행에 표시가 붙습니다

사유를 저장한 행에는 표시가 붙고, 축을 바꾸거나 다시 조회해도 그 행에 따라옵니다. AI 분석이 같은 행을 다시 짚을 때는 이미 기록된 행으로 건너뜁니다.

차이 워터폴
차이 워터폴 — 기준에서 장부까지 요인별 막대

기준 인식액 28,403에서 장부 인식액 28,221까지 요인별 막대로 이어 보여 줍니다. 앞서 인식한 막대와 늦게 인식한 막대는 서로 다른 중립 색이고 빨강과 초록은 쓰지 않습니다.

요인 합계 검산 줄
요인 합계 검산 줄 — 요인 합계 = 총차이

요인 여섯 개의 합이 총차이 −183백만원(−182,900,056원)과 같은지 화면이 매번 검산 줄로 보여 줍니다. 합이 맞지 않는 것 자체가 오류 신호라서 말없이 넘어가지 않습니다.

AI 분석과 AI 에이전트 — 숫자는 서비스가, 글은 AI가

AI 분석은 서비스가 계산한 값을 문장으로 옮기는 규칙 기반 해설이고, 모델 연결은 설정 한 곳에서 켜는 선택 사항입니다(기본 꺼짐). 에이전트는 같은 계산 결과를 규칙에 대 보고 대기함에 올립니다.

AI 분석
AI 분석 — 규칙 기반 해설과 핵심 발견

현재 범위의 요약과 핵심 발견을 보여 줍니다. 총차이 −183백만원 가운데 도착 조건 선인식(−164)의 영향이 가장 크다고 읽되 원인은 단정하지 않고 점검 필요 항목만 제시합니다. 근거 표를 펼치면 같은 숫자를 확인할 수 있습니다.

AI 에이전트 — 감시 규칙
AI 에이전트 — 감시 규칙 — 지표 · 범위 · 임계값 · 받을 역할

규칙 다섯 개가 기본으로 들어 있고, 임계값과 받을 역할은 화면에서 바꿔 저장합니다. 임계는 숫자로 드러나 있어 왜 이 항목이 올라왔는지 설명할 수 있습니다.

AI 에이전트 — 받은 보고
AI 에이전트 — 받은 보고 — 규칙에 걸린 항목이 역할별로 쌓입니다

규칙에 걸린 항목이 받을 역할별로 대기함에 쌓입니다. 보고에는 걸린 이유와 금액, 다음에 볼 화면이 적혀 있습니다.

AI 에이전트 — 실행 기록
AI 에이전트 — 실행 기록 — 시각 · 호출 주체 · 결과, 하루 한 번 제한

실행은 하루 한 번만 허용되고(서비스가 판정) 걸린 항목이 없어도 활동 기록이 남습니다. 두 번째 실행은 하루 한 번 제한으로 건너뛰었다고 기록됩니다.

레이아웃 — 자주 쓰는 배치를 이름 붙여 저장합니다

행·열·필터·항목 구성은 이름을 붙여 서버에 저장하고, 기본 레이아웃과 자동 조회를 지정하면 다음 번에는 열자마자 같은 모양으로 시작합니다.

레이아웃 메뉴
레이아웃 메뉴 — 저장 · 불러오기 · 관리

레이아웃 메뉴에서 현재 배치를 저장하거나 저장한 배치를 불러오고, 관리 창에서 이름 바꾸기 · 삭제 · 기본 지정을 합니다.

레이아웃 저장
레이아웃 저장 — 기본 레이아웃과 자동 조회 지정

저장 창에서 이름을 적고 기본 레이아웃과 자동 조회를 지정합니다. 자동 조회는 화면을 열 때 곧바로 조회까지 실행하는 선택입니다.

새로 고침 뒤 자동 조회
새로 고침 뒤 자동 조회 — 기본 레이아웃으로 조회된 채 시작합니다

화면을 새로 고쳤더니 기본 레이아웃으로 조회까지 끝낸 상태로 시작했습니다. 축 구성, 필터, 항목이 저장한 그대로 복원되는 것을 확인했습니다.

한계 — 일부러 둔 상한과 좁은 화면

큐브를 브라우저가 들고 있는 방식이라 상한을 일부러 두었습니다. 상한에 닿았을 때 말없이 잘라 내지 않고 안내를 띄웁니다.

행 조합 상한 초과 안내
행 조합 상한 초과 안내 — 행 조합이 500개를 넘으면 범위를 좁히라는 안내가 나옵니다

행에 기간 · 고객 · 제품을 쌓자 행 조합이 514개가 되어 500개 상한을 넘었고, 표 대신 범위를 좁히라는 안내가 나옵니다. 열 조합은 36개를 넘으면 추가 자체를 막습니다.

좁은 화면(390px)
좁은 화면(390px) — 휴대폰 폭에서도 조회조건과 표가 읽힙니다

폭 390px 에서 조회조건이 세로로 쌓이고 표는 가로로 밀어 볼 수 있습니다. 모든 화면 요소가 한 열에 놓입니다.

좁은 화면 — 차트가 표 아래로
좁은 화면 — 차트가 표 아래로 — 표와 차트의 자리가 바뀝니다

좁은 화면에서는 오른쪽에 있던 차트가 표 아래로 내려옵니다. 넓은 화면에서 표와 차트 사이 손잡이로 조절한 너비는 브라우저가 기억합니다.

인식 시점 판정과 차이 요인 규칙

화면이 장부 인식월과 통제 이전월을 어떻게 정하는지, 그 둘이 다를 때 어떤 이름을 붙이는지입니다. 아래 구분은 날짜 관계로 나눈 분류이며 원인을 단정하지 않습니다.

구분정하는 기준비고
장부 인식일청구 문서의 전기일장부 인식월 = 전기일이 속한 달
통제 이전일 — FOB · FCA · CIF · CPT선적일(출하 문서의 실제 출고일)선적과 동시에 통제가 넘어간다고 보는 기준(가정)
통제 이전일 — DAP · DDP선적일 + 도착 운송일수운송일수는 샘플의 가정값이며, 운영에서는 인코텀즈·계약 조건별 기준을 회사가 정해야 합니다(확인 필요)
정시 인식분장부 인식월 = 통제 이전월정시 인식률의 분자
이동분장부 인식월 ≠ 통제 이전월이동 사유별로 다섯 갈래에 담김
이동 사유판정 조건방향사용자 조치
선적 전 조기 청구청구 전기일이 선적일보다 앞서 월이 달라짐기준보다 앞서 인식점검 필요 — 청구 시점 조건과 선적 일정 확인
도착 조건 선인식DAP · DDP 인데 선적 시점에 청구·전기하여 통제 이전월보다 앞섬기준보다 앞서 인식점검 필요 — 통제 이전 시점 기준 확인
청구 지연통제 이전 후 청구가 다음 달로 넘어감기준보다 늦게 인식확인 필요 — 지연 사유(담당 부서) 확인
서류·통관 대기서류 · 통관 확인이 길어져 청구가 한 달 이상 늦음기준보다 늦게 인식확인 필요 — 대기 문서 확인
월초 일괄 청구월말 통제 이전분이 월초에 모아 청구됨기준보다 늦게 인식확인 필요 — 청구 주기 점검

차이 모드의 색 판정과 6요인 산식

판정 조건결과 상태사용자 조치
차이 금액 ≥ 1천만원 이고 증감률 ≥ 5% (비율 항목은 0.5퍼센트포인트 이상)주황(점검 필요 — 방향은 판단하지 않음)차이 분해 탭에서 큰 요인을 보고 드릴스루로 문서 라인 확인
금액과 비율 중 하나만 넘음색 없음필요하면 값만 참고
기준이 없는 칸(장부만 있음)금액 임계만 적용기간 경계에서 한쪽에만 걸린 조합일 수 있어 확인 필요

장부 인식액과 기준 인식액은 같은 조합(회사 · 고객 · 제품 · 인코텀즈)마다 한 행씩 비교합니다. 총차이(장부 − 기준)는 아래 다섯 이동 사유의 차이와 환율 요인으로 나뉘고, 합이 총차이와 같도록 식을 닫아 두었습니다.

요인산식읽는 법
선적 전 조기 청구장부 ShPre − 기준 ShPre청구가 선적보다 먼저 일어난 몫의 차이
도착 조건 선인식장부 ShTerm − 기준 ShTermDAP · DDP 를 선적 시점에 잡은 몫의 차이
청구 지연장부 ShBill − 기준 ShBill통제 이전 뒤 청구가 늦어진 몫의 차이
서류·통관 대기장부 ShDoc − 기준 ShDoc서류 · 통관 대기로 늦어진 몫의 차이
월초 일괄 청구장부 ShBatch − 기준 ShBatch월말분을 월초에 모아 청구한 몫의 차이
환율장부 정시 인식분 − 기준 정시 인식분같은 달에 인식된 건에서 인식일과 통제 이전일 환율이 달라 생기는 차이

AI 에이전트 감시 규칙

규칙판정 조건 (기본 임계)받을 역할사용자 조치
인식액 차이 금액 초과고객별 장부와 기준의 인식액 차이가 6천만원 이상재무 책임자점검 필요 — 해당 고객의 요인분해와 문서 라인 확인
조기 이동 순증 금액 초과인코텀즈별 조기 이동분이 5억원 이상물류 책임자확인 필요 — 인코텀즈별 통제 이전 기준 점검
미인식 지연분 금액 초과국가별 지연 이동분이 2천만원 이상영업 책임자확인 필요 — 지연 청구 사유 확인
환율 영향 임계통화별 환율 효과가 1천만원 이상경영자확인 필요 — 환율 적용 기준 확인
이동 비율 상한 초과제품그룹 이동 비율이 19퍼센트 이상재무 책임자점검 필요 — 해당 그룹의 청구 시점 확인

조회조건과 결과 구성

구분항목필수동작
조회조건회사코드필수장부 큐브와 기준 큐브에 회사코드 필터
조회조건시작·종료 기간필수인식월 범위 필터(예: 2026-01 ~ 2026-09)
조회조건비교 기준고정통제 이전월 기준(버전 CTRL26)
조회조건저장된 레이아웃선택축 · 조건 · 측정값을 복원
차원 필터지역 · 국가 · 고객 · 인코텀즈 · 제품그룹 · 제품 · 통화 · 사업부선택값 다중 선택(차원 안 또는 · 차원 간 그리고), 브라우저에서 걸러 서버를 다시 부르지 않음
표시분석 항목 · 보기 방식 · 기준 대비 · 표시 행 수선택측정값 · 계산항목 선택, 차원 보기 / 단계 보기, 차이 모드, 한 번에 보이는 행 수

데이터 구성과 파일 구성

구분규모비고
원천 청구 라인3,043줄고객 14 · 제품 12 · 국가 8 · 통화 4(USD · EUR · JPY · CNY), 선적 2025-12 ~ 2026-10
장부 큐브1,033건장부 인식월 · 고객 · 제품 · 인코텀즈 조합별 집계
기준 큐브1,026건통제 이전월 기준 같은 조합. 1,006건이 장부와 같은 조합이고 장부만 있는 27건 · 기준만 있는 20건은 월 경계에서 한쪽에만 걸린 조합
차원 값 · 측정값 · 계산항목66 · 9 · 6차원은 10종
감시 규칙5개역할은 경영자 · 재무 · 영업 · 물류

앱은 화면(view · controller) · 모델(피벗 · SVG 차트 · 보고서 · 레이아웃) · OData 서비스(엔진 · 서비스 · 메타데이터 · 샘플 데이터) · 소개 영상 · 설명서로 나뉘고, 검증 전용 자료는 별도 폴더에 두어 앱 본체가 참조하지 않습니다. 고객 · 제품 · 문서 번호 · 환율은 모두 가상 또는 가정값입니다.

SAP 표준 기능 확장 포인트

이 화면은 표준 T-code 를 대체하지 않습니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 같은 수출 청구 데이터를 조회·검증 관점으로 묶어 확장합니다.

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

하고 싶은 일표준 화면으로이 앱이 더하는 관점
청구 문서 한 건의 내용과 흐름VF03 에서 문서·품목·가격 조건을 확인청구 문서 라인을 칸 단위로 모아 금액이 칸 금액과 같은지 대사하고 전기일을 선적일과 나란히 놓음
출하·선적 일정VL03N 에서 출하 문서와 실제 출고일을 확인선적일에서 통제 이전일을 계산해 장부 인식월과 비교
수주 조건 · 인코텀즈 확인VA03 에서 오더의 인도 조건 확인인코텀즈별로 통제 이전 시점 규칙을 적용(계약별 예외는 확인 필요)
매출 전표 확인FB03 에서 회계 전표 확인청구 문서에서 만들어진 매출 전표의 인식 금액과 이어 점검
수익성 합계 대조KE30 에서 수익성 분석 보고서 실행기간별 인식액 합계를 나란히 놓고 대사
청구월과 통제 이전월 차이의 원인표준 화면만으로는 요인 분해까지 이어지지 않음6요인분해 · 변동 사유 기록 · 감시 규칙

T-code 별 연계 지점

T-code이름연계
VA03판매오더 조회이어받는 데이터 오더 번호(SoNo)와 인코텀즈. 대사 지점 인코텀즈별 통제 이전일 계산 기준. 오가는 방법 칸의 문서 라인에서 오더 번호 확인 → VA03 에서 인도 조건 확인. 표준에 남길 일 오더 변경·승인. 계약별 통제 이전 조건은 확인 필요.
VL03N출하 문서 조회이어받는 데이터 선적일(ShipDate). 대사 지점 통제 이전일 계산의 출발점이 되는 실제 출고일. 오가는 방법 문서 라인의 선적일 → VL03N 에서 출하 문서 확인. 표준에 남길 일 출하 처리·선적 증빙. 실제 출고일 필드는 확인 필요.
VF03청구 문서 조회이어받는 데이터 청구 번호(BillDoc) · 품목(Item) · 청구 전기일(PostDate) · 환율. 대사 지점 칸 금액 = 문서 라인 합계. 오가는 방법 이 앱 결과 → 청구 번호 → VF03. 표준에 남길 일 청구 문서 생성·취소.
FB03회계 전표 조회이어받는 데이터 청구에서 만들어진 매출 전표의 인식 금액. 대사 지점 청구 전기일 기준 인식액과 전표 금액. 오가는 방법 청구 번호에서 전표 번호로 이동. 전표 연결 방식은 확인 필요.
KE30수익성 분석 보고서 실행이어받는 데이터 기간별 인식액 합계 대조. 대사 지점 같은 기간·같은 범위의 수익성 보고서 합계와 이 화면의 장부 인식액 합계. 오가는 방법 두 화면 합계를 나란히 놓고 차이가 있으면 수익성 분석 구성(값 필드·기간 기준)부터 확인 필요.

기존 리포트를 없애야 하나요? 없애지 않습니다. 법정·감사·세무 신고 대응은 표준 화면과 표준 리포트에 그대로 남기고, 이 화면은 월 마감 전에 매출 인식 시점을 점검하는 용도로 나란히 씁니다. 두 화면의 합계가 어긋나면 어느 쪽이 틀렸다고 단정하지 말고 위 대사 지점부터 확인 필요로 놓고 맞춰 갑니다.

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

S/4HANA 는 CDS 뷰 위에 분석 쿼리를 올려 Fiori 분석 앱과 Analysis for Office 로 읽는 구조를 갖고 있습니다. 이 앱의 CDS 구성(아래 CDS 구성 절)은 같은 분석 쿼리 층에 올라가는 것이라, 운영에서는 같은 큐브와 쿼리를 표준 분석 도구가 읽고 이 화면이 끌어다 놓기·드릴스루·요인분해·AI 분석을 더하는 식으로 나란히 쓸 수 있습니다. 매출 인식 영역의 표준 분석 앱 이름과 제공 여부는 릴리스마다 달라 이 글에서는 이름을 적지 않으며, 도입 시 확인 필요 항목입니다.

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

자리무엇을 손대나어디서
국가·지역·제품그룹 매핑국가 → 지역, 제품 → 제품그룹 묶음. 새 국가나 제품이 생기면 어느 묶음인지만 적습니다매핑 테이블(현업이 직접)
인코텀즈별 통제 이전 규칙어떤 인코텀즈를 선적 시점으로, 어떤 인코텀즈를 도착 시점으로 볼지와 운송일수통제 이전 기준 테이블과 정책 문서
이동 사유 판정 일수월초 일괄 청구, 서류·통관 대기를 가르는 날짜 기준판정 뷰의 조건(확인 필요)
청구 문서 범위취소 문서 제외, 수출 청구 유형 한정기준 뷰의 조건
환율 유형인식일 환율과 통제 이전일 환율의 유형과 환산 시점큐브 뷰의 통화 환산
확장 필드청구 문서에 회사별 확장 필드가 있으면 차원으로 추가커스텀 필드 · BAdI · 기준 뷰
권한회사코드 · 영업조직 단위 접근 제어권한 객체와 접근 제어 정의

분석 지표 정의

지표산식·판정 기준대응 기능원천 데이터비고
인식액(원화)Σ 청구 품목의 인식일 환율 환산 금액피벗 · 역할 요약청구 품목 순액 × 청구 환율환산 방식 확인 필요
정시 인식분장부 인식월과 통제 이전월이 같은 품목의 인식액정시 인식률 · 단계 보기선적일 · 인코텀즈 · 청구 전기일
이동분 5종장부 인식월과 통제 이전월이 다른 인식액을 사유별로 나눈 값계산항목 · 요인분해위 날짜 3종사유 분류는 날짜 관계 기준
조기 이동분선적 전 조기 청구 + 도착 조건 선인식계산항목 · 감시 규칙이동분
지연 이동분청구 지연 + 서류·통관 대기 + 월초 일괄 청구계산항목 · 감시 규칙이동분
이동 비율(%)이동분 합계 ÷ 인식액 × 100계산항목 · 감시 규칙위 값차이는 퍼센트포인트
정시 인식률(%)정시 인식분 ÷ 인식액 × 100경영자 요약위 값
평균 인식 단가(원/EA)인식액 ÷ 수량계산항목청구 수량

CDS 구성

이 샘플의 화면은 청구 2,975줄(조회 기간분)을 큐브 1,033건으로 묶어 브라우저가 들고 있습니다. 데모라서 되는 일이고, 운영 데이터에서는 그렇게 하지 않습니다. 운영으로 올릴 때 가장 먼저 하는 일은 집계를 CDS 로 내리는 것입니다. 아래는 그때 만드는 뷰의 층 구성과 코드입니다.

코드는 스케치입니다. 필드 이름과 표준 뷰 이름은 릴리스·환경에 따라 다르므로 그대로 붙여 넣기 전에 실제 이름을 확인해야 합니다. 확인이 필요한 자리는 주석에 적어 두었습니다. 표준 CDS 뷰는 이름을 단정하지 않고 원천 테이블 기준으로 적었습니다.

뷰 레이어 구성

레이어뷰하는 일왜 나누나
기준(매핑)ZCUTF_MAP · ZCUTF_CTRL국가→지역, 자재→제품그룹 묶음과 인코텀즈별 통제 이전 기준묶음과 정책은 늘 바뀝니다. 코드에 박으면 바뀔 때마다 개발자를 부르게 됩니다.
기준(청구)ZI_CutofBillItem청구 품목 한 줄에 선적일과 인코텀즈문서 구조를 아는 뷰를 하나로 모읍니다.
판정ZI_CutofItemCtrl통제 이전일 · 통제 이전월 · 이동 사유장부 큐브와 기준 큐브가 같은 판정을 쓰게 합니다.
큐브(장부)ZI_CutofCube장부 인식월 기준 합산 + 원화 환산화면이 하던 집계를 DB 로 내리고 환산 규칙을 한 곳에 둡니다.
큐브(기준)ZI_CutofPlan통제 이전월 기준을 같은 키 모양으로키가 어긋나면 한쪽에만 걸린 조합으로 따로 뜹니다.
쿼리ZC_CutofQuery묶음 차원 · 계산항목표준 분석 도구가 그대로 띄웁니다.
권한ZC_CUTOFQUERY (DCL)회사코드 접근 제어집계를 읽는 자리에 걸어야 합계에서 빼는 방식으로 새지 않습니다.
서비스ZUI_CutofSrv쿼리·기준 큐브를 OData V2 로 노출화면은 서비스 계약만 알고 뷰 이름은 모릅니다.

① 매핑 테이블 — 현업이 늘리는 묶음

분석용 묶음(국가→지역, 자재→제품그룹)은 마스터에 없습니다. 이 테이블 한 장이 그 묶음을 맡고, 정하지 않으면 그룹 합계가 기존 보고서와 맞지 않습니다. 매핑이 없는 값은 아래 뷰에서 UNMAPPED 로 남겨 합계에서 사라지지 않게 합니다.

// ─────────────────────────────────────────────────────────────
// ZCUTF_MAP : 국가→지역, 자재→제품그룹 매핑 (기준)
// 하는 일 : 마스터에 없는 "분석용 묶음"을 현업이 직접 관리하는 테이블
// 이렇게 나눈 이유 : 새 국가·제품이 생길 때마다 뷰를 고치면 전송이 필요하다.
//   테이블이면 현업이 행만 추가한다. (국가·자재 마스터 필드는 확인 필요)
// ─────────────────────────────────────────────────────────────
@EndUserText.label : '매출 기간귀속 분석 매핑'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zcutf_map {
  key client   : abap.clnt not null;
  key map_type : abap.char(1) not null;     // C=국가→지역, M=자재→제품그룹
  key map_key  : abap.char(18) not null;    // 국가코드 또는 자재번호
  map_value    : abap.char(10);             // 지역 또는 제품그룹 코드
  map_text     : abap.char(40);
}

② 통제 이전 기준 테이블 — 인코텀즈별 시점과 운송일수

어떤 인코텀즈를 선적 시점에, 어떤 인코텀즈를 도착 시점에 통제가 넘어가는 것으로 볼지는 회사와 계약이 정합니다. 샘플은 FOB · FCA · CIF · CPT 를 선적 시점, DAP · DDP 를 선적일 + 운송일수로 가정했습니다. 이 가정을 코드에 박지 않고 테이블로 빼 두면 정책이 바뀌어도 뷰를 고치지 않습니다.

// ─────────────────────────────────────────────────────────────
// ZCUTF_CTRL : 인코텀즈별 통제 이전 기준 (기준)
// 하는 일 : 인코텀즈마다 통제 이전일을 어떻게 계산할지 정한다
// 이렇게 나눈 이유 : 통제 이전 시점은 회계 정책이라 개발자가 정할 일이 아니다.
// 확인 필요 : 계약별 예외를 어떻게 담을지(수주 단위 예외 테이블 등)
// ─────────────────────────────────────────────────────────────
@EndUserText.label : '통제 이전 기준'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zcutf_ctrl {
  key client    : abap.clnt not null;
  key incoterms : abap.char(3) not null;    // FOB · FCA · CIF · CPT · DAP · DDP ...
  basis         : abap.char(1);             // S=선적일 기준, A=선적일 + 운송일수
  transit_days  : abap.int2;                // basis = A 일 때만 사용 (샘플은 가정값)
  valid_from    : abap.dats;
}

③ 기준 뷰 — 청구 품목 한 줄에 선적일과 인코텀즈

여기서 결정되는 것은 “어떤 청구를 수출 실적으로 볼 것인가” 입니다. 취소 문서 제외와 수출 청구 유형 한정 조건이 이 뷰의 where 에 들어가고, 이 조건이 달라지면 이후 모든 숫자가 달라지므로 운영에서 가장 먼저 합의합니다.

// ─────────────────────────────────────────────────────────────
// ZI_CutofBillItem : 청구 품목 한 줄 + 선적일 + 인코텀즈 (기준 뷰)
// 하는 일 : VBRK/VBRP 를 품목 단위로 평평하게 만들고 출하 문서의 실제 출고일을 붙인다
// 이렇게 나눈 이유 : 이 뷰 하나만 문서 구조를 알게 하고 위의 뷰는 평평한 줄만 본다.
// 확인 필요 : 취소 문서 제외(FKSTO), 수출 청구 유형, 출하 문서 연결 방식, 인코텀즈 필드
// ─────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '수출 청구 품목(선적일 포함)'
define view entity ZI_CutofBillItem
  as select from vbrp
    inner join   vbrk on vbrk.vbeln = vbrp.vbeln
    left outer join likp on likp.vbeln = vbrp.vgbel      // 출하 문서 (연결 방식 확인 필요)
    left outer join vbkd on vbkd.vbeln = vbrp.aubel and vbkd.posnr = '000000'
{
  key vbrk.gjahr                         as FiscalYear,
  key vbrp.vbeln                         as BillDoc,
  key vbrp.posnr                         as Item,
      vbrk.bukrs                         as CompanyCode,
      vbrk.kunrg                         as Customer,
      vbrk.fkdat                         as BillDate,        // 청구 전기일 = 장부 인식일
      likp.wadat_ist                     as ShipDate,        // 실제 출고일
      vbkd.inco1                         as Incoterms,       // 인코텀즈 (필드 확인 필요)
      vbrk.waerk                         as DocCurrency,
      vbrk.kurrf                         as ExchRate,
      vbrp.matnr                         as Material,
      vbrp.aubel                         as SalesOrder,
      vbrp.fkimg                         as Qty,
      vbrp.netwr                         as NetAmountFc
}
where vbrk.fksto = ''                    // 취소 문서 제외 (확인 필요)

④ 판정 뷰 — 통제 이전일과 이동 사유

화면이 가장 많이 신경 쓰는 뷰입니다. 통제 이전일을 정하고, 장부 인식월과 통제 이전월이 같은지 다른지, 다르면 어떤 이름을 붙일지를 날짜 관계로 판정합니다. 이름은 원인이 아니라 날짜 관계의 분류입니다.

// ─────────────────────────────────────────────────────────────
// ZI_CutofItemCtrl : 품목별 통제 이전일 · 통제 이전월 · 이동 사유 판정
// 하는 일 : 인코텀즈 기준 테이블로 통제 이전일을 계산하고 날짜 관계로 사유를 붙인다
// 이렇게 나눈 이유 : 사유 판정을 한 뷰에 모아 장부 큐브와 기준 큐브가 같은 판정을 쓰게 한다.
// 확인 필요 : 서류·통관 대기(2개월 이상)와 월초 일괄 청구(말일 전후)의 일수 기준
// ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '품목별 통제 이전 판정'
define view entity ZI_CutofItemCtrl
  as select from ZI_CutofBillItem as b
    left outer join zcutf_ctrl     as c on c.incoterms = b.Incoterms
{
  key b.FiscalYear, key b.BillDoc, key b.Item,
      b.CompanyCode, b.Customer, b.Material, b.Incoterms,
      b.BillDate, b.ShipDate,
      case c.basis
        when 'A' then dats_add_days( b.ShipDate, cast( c.transit_days as abap.int4 ), 'NULL' )
        else b.ShipDate
      end                                              as CtrlDate,
      substring( b.BillDate, 1, 6 )                    as PostPeriod,
      substring( case c.basis when 'A'
                   then dats_add_days( b.ShipDate, cast( c.transit_days as abap.int4 ), 'NULL' )
                   else b.ShipDate end, 1, 6 )         as CtrlPeriod,
      case
        when substring( b.BillDate, 1, 6 ) = substring( b.ShipDate, 1, 6 ) then 'ON'
        when b.BillDate <  b.ShipDate and c.basis = 'A'                    then 'TERM'   // 도착 조건 선인식
        when b.BillDate <  b.ShipDate                                      then 'PRE'    // 선적 전 조기 청구
        when substring( b.BillDate, 1, 6 ) - substring( b.ShipDate, 1, 6 ) >= 2 then 'DOC'  // 서류·통관 대기
        when substring( b.BillDate, 7, 2 ) <= '03'                         then 'BATCH'  // 월초 일괄 청구
        else 'BILL'                                                                      // 청구 지연
      end                                              as ShiftReason,
      b.ExchRate, b.Qty, b.NetAmountFc, b.DocCurrency
}

⑤ 장부 큐브 — 장부 인식월 기준 합산과 원화 환산

화면이 브라우저에서 하던 집계를 DB 로 내리는 뷰입니다. 사유별 이동분을 열로 나눠 담아 항등식(인식액 = 정시 인식분 + 이동분 5종)이 어떤 묶음에서도 성립하게 합니다.

// ─────────────────────────────────────────────────────────────
// ZI_CutofCube : 장부 큐브 (장부 인식월 · 고객 · 제품 · 인코텀즈)
// 하는 일 : 장부 인식월 기준으로 합산하고 정시/이동 사유별 열로 나눠 담는다
// 이렇게 나눈 이유 : 환산 규칙을 한 곳에 두고, 항등식을 뷰 정의에서 보장한다.
// 확인 필요 : 원화 환산 방식(문서 환율을 곱할지, 환산 함수를 쓸지)
// ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '매출 기간귀속 장부 큐브'
define view entity ZI_CutofCube
  as select from ZI_CutofItemCtrl
{
  key CompanyCode, key PostPeriod as Period, key Customer, key Material, key Incoterms,
      @Semantics.amount.currencyCode: 'LocalCurrency'
      sum( NetAmountFc * ExchRate )                                                   as Sales,
      sum( case ShiftReason when 'ON'    then NetAmountFc * ExchRate else 0 end )     as OnSales,
      sum( case ShiftReason when 'PRE'   then NetAmountFc * ExchRate else 0 end )     as ShPre,
      sum( case ShiftReason when 'TERM'  then NetAmountFc * ExchRate else 0 end )     as ShTerm,
      sum( case ShiftReason when 'BILL'  then NetAmountFc * ExchRate else 0 end )     as ShBill,
      sum( case ShiftReason when 'DOC'   then NetAmountFc * ExchRate else 0 end )     as ShDoc,
      sum( case ShiftReason when 'BATCH' then NetAmountFc * ExchRate else 0 end )     as ShBatch,
      sum( Qty )                                                                      as Qty,
      count(*)                                                                        as Lines,
      cast( 'KRW' as abap.cuky )                                                      as LocalCurrency
}
group by CompanyCode, PostPeriod, Customer, Material, Incoterms

⑥ 기준 큐브 — 통제 이전월로 다시 묶은 같은 키

같은 품목을 통제 이전월로 묶습니다. 키 모양을 장부 큐브와 똑같이 맞춰야 화면이 같은 칸끼리 비교합니다. 키가 어긋난 칸은 한쪽에만 걸린 조합으로 따로 보입니다.

// ─────────────────────────────────────────────────────────────
// ZI_CutofPlan : 기준 큐브 (통제 이전월 · 고객 · 제품 · 인코텀즈)
// 하는 일 : 장부 큐브와 같은 키 모양으로 통제 이전월 기준 인식액을 합산한다
// 이렇게 나눈 이유 : 키가 같아야 화면이 칸마다 장부 · 기준 · 차이를 붙일 수 있다.
// 확인 필요 : 통제 이전일의 환율(샘플은 가정값)
// ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '매출 기간귀속 기준 큐브'
define view entity ZI_CutofPlan
  as select from ZI_CutofItemCtrl
{
  key CompanyCode, key CtrlPeriod as Period, key Customer, key Material, key Incoterms,
      sum( NetAmountFc * ExchRate )                                                   as Sales,
      sum( case ShiftReason when 'ON'    then NetAmountFc * ExchRate else 0 end )     as OnSales,
      sum( case ShiftReason when 'PRE'   then NetAmountFc * ExchRate else 0 end )     as ShPre,
      sum( case ShiftReason when 'TERM'  then NetAmountFc * ExchRate else 0 end )     as ShTerm,
      sum( case ShiftReason when 'BILL'  then NetAmountFc * ExchRate else 0 end )     as ShBill,
      sum( case ShiftReason when 'DOC'   then NetAmountFc * ExchRate else 0 end )     as ShDoc,
      sum( case ShiftReason when 'BATCH' then NetAmountFc * ExchRate else 0 end )     as ShBatch
}
group by CompanyCode, CtrlPeriod, Customer, Material, Incoterms

⑦ 분석 쿼리 — 서비스가 노출하는 모양

화면과 표준 분석 도구가 읽는 층입니다. 차원과 측정값을 주석으로 구분하고, 지역 · 국가 · 제품그룹 같은 묶음 차원은 매핑 테이블에서 가져옵니다.

// ─────────────────────────────────────────────────────────────
// ZC_CutofQuery : 분석 쿼리 (차원 · 측정값 · 계산항목)
// 하는 일 : 큐브에 묶음 차원을 붙이고 정시 인식률 · 이동 비율을 계산항목으로 노출한다
// 이렇게 나눈 이유 : 화면은 이 모양만 알고 아래 뷰의 구조는 모른다.
// ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '매출 기간귀속 분석 쿼리'
@Analytics.query: true
define view entity ZC_CutofQuery
  as select from ZI_CutofCube as a
    left outer join zcutf_map   as m on m.map_type = 'M' and m.map_key = a.Material
{
  @AnalyticsDetails.query.axis: #ROWS
  key a.CompanyCode, key a.Period, key a.Customer, key a.Incoterms,
      coalesce( m.map_value, 'UNMAPPED' )                    as ProdGroup,
  @AnalyticsDetails.query.axis: #COLUMNS
      a.Sales, a.OnSales, a.ShPre, a.ShTerm, a.ShBill, a.ShDoc, a.ShBatch, a.Qty,
      // 계산항목 : 정시 인식률(%) · 이동 비율(%)
      division( a.OnSales * 100, a.Sales, 2 )                                          as OnRate,
      division( ( a.ShPre + a.ShTerm + a.ShBill + a.ShDoc + a.ShBatch ) * 100, a.Sales, 2 ) as ShiftRate
}

⑧ 접근 제어 — 집계에 거는 권한

권한은 집계를 읽는 자리에 걸어야 합계에서 빼는 방식으로 새지 않습니다. 회사코드 단위가 기본이고, 영업조직 단위가 필요하면 조건을 추가합니다.

// ─────────────────────────────────────────────────────────────
// ZC_CutofQuery 접근 제어 (DCL)
// 하는 일 : 회사코드 권한이 있는 사용자만 해당 회사의 행을 읽게 한다
// 확인 필요 : 영업조직 · 판매그룹 단위가 필요한지, 권한 객체 이름
// ─────────────────────────────────────────────────────────────
@EndUserText.label: '매출 기간귀속 접근 제어'
@MappingRole: true
define role ZC_CUTOFQUERY {
  grant select on ZC_CutofQuery
    where ( CompanyCode ) = aspect pfcg_auth( F_VBRK_BUK, BUKRS, ACTVT = '03' );
}

⑨ 서비스 정의 — 화면이 부르는 계약

화면은 서비스 계약만 알고 뷰 이름은 모릅니다. 장부 큐브와 기준 큐브를 엔티티셋으로 노출하고, 요인분해 · 해설 · 에이전트 실행은 펑션으로 둡니다. 운영에서는 이 서비스 주소만 화면에서 바꿉니다.

// ─────────────────────────────────────────────────────────────
// ZUI_CutofSrv : 서비스 정의 (OData V2 로 게시)
// 하는 일 : 쿼리 · 기준 큐브 · 원천 라인을 엔티티셋으로 노출한다
// 확인 필요 : 서비스 바인딩 유형, 쓰기 가능 집합(사유 · 레이아웃 · 감시 규칙)의 저장 위치
// ─────────────────────────────────────────────────────────────
@EndUserText.label: '매출 기간귀속 서비스'
define service ZUI_CutofSrv {
  expose ZC_CutofQuery  as CubeSet;
  expose ZI_CutofPlan   as PlanSet;
  expose ZI_CutofItemCtrl as ItemSet;
  // 요인분해 · 해설 · 에이전트 실행은 펑션(unmanaged 구현)으로 추가 : 확인 필요
}

운영 시점에 해야 할 일

개발보다 정하는 일이 많습니다. 아래를 정하지 않고 뷰부터 만들면 첫 대사 회의에서 막힙니다.

해야 할 일무엇을 정하나정하지 않으면누가
매출 인식 정책인코텀즈별로 통제가 넘어가는 시점(선적 / 도착)과 계약별 예외청구 기준과 통제 이전 기준 숫자가 어긋남회계 · 영업
운송일수 기준도착 시점 인코텀즈의 운송일수를 국가·운송 수단별로 어떻게 둘지도착 조건 선인식 요인의 크기가 의미를 잃음물류 · 회계
이동 사유 판정 일수서류·통관 대기와 월초 일괄 청구를 가르는 날짜 기준사유 이름이 현업 감각과 맞지 않음회계 · 물류
매핑 확정국가→지역, 자재→제품그룹 묶음그룹 합계가 기존 보고서와 다름관리회계
청구 문서 범위취소 문서 제외, 수출 청구 유형 한정이후 모든 숫자가 달라짐회계 · SD
환율 유형과 환산 시점인식일 환율과 통제 이전일 환율의 유형환율 요인의 의미가 흔들림자금 · 회계
차원 범위쓸 차원 10종 안팎나중에 늘리려면 뷰를 고쳐 다시 이송현업 · 관리회계
권한 설계회사코드, 영업조직 단위 접근 범위남의 숫자가 보임보안 · 권한
성능 기준응답 시간 목표와 필수 파라미터전 기간 조회로 응답이 늘어남IT
대사 체계표준 T-code 와 맞출 항목과 주기숫자가 틀렸는지 판단할 기준이 없음관리회계 · IT
전송(TR) 순서테이블 → 기준 → 판정 → 큐브 → 쿼리 → 권한 → 서비스활성화 오류IT
서비스 활성화서비스 바인딩 게시 또는 게이트웨이 활성화, 화면의 서비스 주소 교체화면이 샘플 서비스를 계속 부름IT
배치 등록감시 규칙 실행을 하루 한 번 부르는 배치 작업사람이 화면을 열 때만 점검이 돎IT

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

사례에서 본 숫자(기준 28,403 → 장부 28,221, 총차이 −183)는 아래 대사식 전수 검사를 통과한 값입니다.

대사식검사 건수차이 건수
큐브 합계 = 원천 라인 합계(인식액 · 정시분 · 이동분 5종 · 수량 · 라인 수 · 항등식 · 통제 이전 기준 인식액 · 통화별 외화 4종)150
요인 합계 = 총차이(전체 1 · 국가 8 · 고객 14 · 인코텀즈 6 · 통화 4 · 제품그룹 4 · 기간 9 구간)460
피벗 총합 = 큐브 총합(축 배치 6가지)60
칸 금액 = 드릴스루 합계(칸 10개)100
필터 선택 합계 = 큐브 선택 값 합(일본 · 미국)10
합계780

검사 78건 모두 차이 0건. 기준에 없는 장부 조합 27건과 장부에 없는 기준 조합 20건은 조회 범위 앞뒤 경계에서 장부 인식월과 통제 이전월이 달라 한쪽에만 걸리는 조합이라 일부러 대사 차이와 분리해 두었고, 요인 합계에는 포함되어 합이 맞습니다. 화면 쪽은 실제 브라우저에서 기능 15개 점검을 따로 돌려 모두 통과했습니다.

운영 데이터로 갈 때

수출 청구가 연 수십만 줄, 문서 흐름까지 수천만 건이 되면 지금의 “큐브 전체를 읽어 브라우저에서 묶는” 방식은 막힙니다. 먼저 집계 위치를 DB(큐브 뷰)로 내리고, 기간과 회사코드를 필수 파라미터로 둬 전 기간 조회를 막습니다. 드릴스루는 칸의 차원 값과 기간을 모두 조건으로 걸어 문서 라인을 쪽 단위로 읽고(기본 500행), 청구일과 고객 기준 인덱스 또는 사전 집계 테이블을 둡니다. 응답 시간 기준(예: 조회 몇 초 이내)은 도입 전에 정하고, 화면의 행 500개·열 36개 상한은 운영에서도 그대로 둡니다.

자주 묻는 질문

도입 상담과 데모에서 나올 만한 질문을 네 묶음으로 나눠 적었습니다.

숫자와 산식

이 화면은 언제부터, 어디까지 적용되나요?

이 글의 동작과 수치는 검증용 샘플 데이터로 확인한 결과입니다. 실제 운영 데이터 연결 시점과 대상 범위(사업장 · 기간 · 인코텀즈 정책)는 회사별로 확인 필요 항목입니다.

도입 순서는 보통 매출 인식 정책과 매핑을 확정하고, 뷰를 만들어 서비스를 게시한 뒤 화면의 서비스 주소만 바꾸는 순입니다.

통제 이전일은 어떻게 정하나요?

FOB · FCA · CIF · CPT 는 출하 문서의 실제 출고일(선적일)로, DAP · DDP 는 선적일 + 도착 운송일수로 정합니다. 통제 이전월은 그 날짜가 속한 달입니다.

샘플의 운송일수는 가정값이고, 계약별 통제 이전 조건은 회사 정책이므로 운영에서는 기준 테이블로 정해야 하는 확인 필요 항목입니다.

정시 인식분과 이동분은 무엇이 다른가요?

장부 인식월(청구 전기일이 속한 달)과 통제 이전월이 같으면 정시 인식분, 다르면 이동분입니다. 이동분은 사유별로 선적 전 조기 청구 · 도착 조건 선인식 · 청구 지연 · 서류·통관 대기 · 월초 일괄 청구 다섯 갈래에 담기고, 정시 인식분과 합치면 항상 인식액과 같습니다.

이 항등식은 서비스의 대사 검사가 매번 확인합니다.

요인 합계가 총차이와 다르게 보이면 어떻게 하나요?

화면의 검산 줄에 두 값의 차이가 표시됩니다. 샘플에서는 전체 · 국가 · 고객 · 인코텀즈 · 통화 · 제품그룹 · 기간 구간 46곳에서 차이가 0원이었습니다. 차이가 생기면 조회 범위와 비교 기준을 먼저 확인 필요합니다.

합이 맞지 않는 것 자체가 오류 신호라서, 화면이 말없이 넘어가지 않고 검산 줄로 먼저 알려 줍니다.

환율 요인은 무엇을 뜻하나요?

같은 달에 인식된 건에서 인식일 환율과 통제 이전일 환율이 달라 생기는 차이입니다. 샘플에서는 +11백만원으로 총차이 −183에 비해 작습니다.

환율 요인을 따로 세운 것은 시점 이동 효과와 환율 효과를 섞지 않기 위해서이며, 환율 정책이나 헤지 판단은 이 화면이 하지 않습니다. 통제 이전일의 환율은 샘플에서 가정값입니다.

기준에 없는 장부 조합은 어떻게 처리하나요?

조회 범위의 앞뒤 경계에서 장부 인식월과 통제 이전월이 달라 한쪽에만 걸리는 조합이 생깁니다. 샘플에서는 장부에만 있는 조합이 27건, 기준에만 있는 조합이 20건입니다.

이 조합들은 대사 차이와 섞이지 않게 분리해 두었고, 요인 합계에는 포함되어 합이 맞습니다. 기준이 없는 칸은 금액 임계만 적용해 색을 칠하며, 경계 조합일 수 있어 확인 필요로 읽습니다.

화면과 사용

조회 전에도 화면이 보이나요?

네. 조회조건 · 레이아웃 보드 · 피벗 틀이 조회 전에도 먼저 보입니다. 조회 단추는 조회조건 영역 오른쪽 끝에 있고, 회사코드 칸에서 Enter 키를 눌러도 같은 조회가 됩니다.

기본 레이아웃에 자동 조회를 지정하면 화면을 열 때 조회된 채로 시작합니다.

축을 바꿀 때마다 서버를 다시 부르나요?

아닙니다. 큐브를 한 번 읽어 오면 축을 끌어다 놓는 동안 서비스 호출은 0건이고, 브라우저가 가진 큐브를 다시 묶습니다. 배치 6가지로 시험했을 때 피벗 총합은 28,220,585,809원으로 모두 같았습니다.

대신 상한이 있습니다. 행은 3단계, 열은 2단계까지이고, 열 조합이 36개를 넘으면 추가를 막고, 행 조합이 500개를 넘으면 범위를 좁히라는 안내가 나옵니다.

칸 금액과 문서 라인이 같은지 어떻게 아나요?

금액 칸을 누르면 그 금액을 만든 청구 문서 라인이 열리고, 칸 금액과 문서 라인 합계가 같은지 머리에 표시됩니다. 샘플에서 칸 10개를 시험해 모두 일치했습니다.

줄마다 선적일 · 통제 이전일 · 청구 전기일 · 이동 사유가 보여, 어느 날짜 관계 때문에 그 달에 잡혔는지 바로 읽습니다. 번호로 VF03 에서 실제 문서를 찾을 수 있습니다.

색은 어떤 기준으로 칠해지나요?

차이 금액이 1천만원 이상이고 증감률이 5% 이상일 때만 주황으로 칠해집니다(비율 항목은 0.5퍼센트포인트 이상). 하나만 넘으면 색을 칠하지 않습니다.

인식 시점은 빠르다고 좋고 늦다고 나쁜 값이 아니라서 초록 · 빨강을 쓰지 않고 점검할 칸만 한 색으로 표시합니다. 샘플에서 색이 칠해진 칸 21개는 임계를 넘는 칸 21개와 일치했습니다.

변동 사유는 어디에 저장되나요?

사유는 조회 범위와 행 경로를 열쇠로 서비스에 저장됩니다. 축을 바꾸거나 다시 조회해도 같은 행에 따라오고, AI 분석은 이미 기록된 행을 다시 짚지 않고 건너뜁니다.

사유는 원인을 단정하는 문구가 아니라 담당자가 원천 문서로 확인한 내용을 남기는 자리입니다. 운영에서는 저장 위치와 보관 기간을 정하는 것이 확인 필요 항목입니다.

휴대폰에서도 쓸 수 있나요?

좁은 화면에서는 조회조건이 세로로 쌓이고 차트가 표 아래로 내려옵니다. 폭 390px 에서 가로로 넘치지 않는 것을 확인했습니다. 다만 끌어다 놓기와 큰 피벗은 넓은 화면이 편해서, 휴대폰은 요약과 대기함 확인용으로 보시길 권합니다.

분석 기능

AI 분석은 숫자를 직접 만드나요?

아닙니다. 금액과 비율은 서비스가 계산하고, 해설은 그 값을 문장으로 옮길 뿐입니다. 기본은 규칙 기반 해설이고 모델 연결은 설정 한 곳에서 켜는 선택 사항(기본 꺼짐)입니다.

해설은 원인을 단정하지 않고 점검 필요 · 확인 필요 항목만 제시하며, 근거 표를 펼치면 같은 숫자를 직접 확인할 수 있습니다.

AI 에이전트는 무엇을 하나요?

감시 규칙 다섯 개를 서비스가 계산한 결과에 대 보고, 걸린 항목을 받을 역할의 대기함에 올립니다. 규칙은 인식액 차이 금액 · 조기 이동 순증 · 미인식 지연분 · 환율 영향 · 이동 비율 상한이며 임계값은 화면에서 바꿉니다.

실행은 하루 한 번만 허용되고, 걸린 항목이 없어도 활동 기록이 남습니다.

에이전트가 사람이 열지 않아도 도나요?

화면에서 실행 단추를 누르는 것 외에, 같은 실행 펑션을 배치 작업이 부르도록 연결하면 사람이 화면을 열지 않아도 점검이 돕니다. 이 글에서는 구성만 설명하며 운영 배치 등록은 IT 가 할 일입니다.

하루 한 번 제한은 서비스가 판정하므로 배치와 사람이 겹쳐 눌러도 중복 보고가 쌓이지 않습니다.

PowerPoint 보고서는 어떻게 만들어지나요?

AI 분석 창의 보고서 단추를 누르면 브라우저가 현재 조회 범위의 숫자로 6장짜리 .pptx 를 직접 만들어 내려받습니다. 외부 라이브러리나 서버 전송이 없고, 내려받은 파일을 열어 구조가 올바른지 확인했습니다.

레이아웃에는 무엇이 저장되나요?

행 · 열 · 차원 필터 · 분석 항목 · 보기 방식 · 기준 대비 여부가 저장됩니다. 기본 레이아웃과 자동 조회를 지정할 수 있고, 새로 고침 뒤 자동 조회로 같은 모양이 복원되는 것을 확인했습니다.

이름 바꾸기와 삭제는 관리 창에서 합니다.

CSV 로 내려받으면 무엇이 들어 있나요?

현재 표의 행과 열 그대로, 기준 대비 모드에서는 기준과 차이까지, 그리고 남겨 둔 변동 사유가 함께 들어갑니다. 상한을 넘어 표 대신 안내가 나온 상태에서는 내려받을 표가 없으므로 범위를 좁힌 뒤 받습니다.

도입과 운영

표준 T-code 를 대체하나요?

아닙니다. 표준 실행은 VA03 · VL03N · VF03 · FB03 · KE30 같은 표준 T-code 가 담당하고, 이 화면은 같은 수출 청구 데이터를 조회·검증 관점으로 묶어 확장합니다.

두 화면의 합계가 어긋나면 어느 쪽이 틀렸다고 단정하지 말고 대사 지점부터 확인 필요로 놓고 맞춥니다.

운영 데이터로 옮길 때 무엇이 바뀌나요?

화면과 서비스 계약은 그대로 두고 데이터 원천만 CDS 뷰로 바꿉니다. 집계를 DB 로 내리고, 기간과 회사코드를 필수 조건으로 두며, 드릴스루는 쪽 단위로 읽습니다.

정해야 할 일은 개발보다 많습니다. 통제 이전 정책 · 운송일수 · 이동 사유 판정 일수 · 매핑 · 환율 유형 · 권한이 대표적이며, 위 CDS 구성 절에 표로 정리했습니다.

권한은 어떻게 거나요?

집계를 읽는 쿼리에 접근 제어를 겁니다. 기본은 회사코드 단위이고 영업조직이나 판매그룹 단위가 필요하면 조건을 추가합니다. 집계 앞에서 걸어야 합계에서 빼는 방식으로 남의 숫자가 새지 않습니다.

회계·세무 판단의 근거로 써도 되나요?

이 화면은 집계 · 비교 · 점검을 돕는 도구이며, 최종 판단은 회사와 감사인이 하고 세무 신고는 회사와 세무 대리인 · 관세사가 판단합니다. 화면의 “점검 필요” · “확인 필요” 표시는 원인을 단정하지 않습니다.

IFRS 15(K-IFRS 제1115호)의 통제 이전 요구사항을 직접 구현하는 화면이 아니며, 법정 · 감사 · 세무 신고 대응은 표준 화면과 표준 리포트에 남겨 두는 것을 전제로 설계했습니다.

외부 라이브러리나 외부 전송이 있나요?

화면은 OpenUI5 표준 컨트롤과 직접 그린 SVG 차트만 씁니다. 모델을 연결하지 않으면 데이터가 서비스 밖으로 나가지 않습니다. 보고서도 브라우저 안에서 만들어집니다.

샘플 데이터는 어디까지 믿어도 되나요?

고객 · 제품 · 문서 번호 · 환율은 모두 가상 또는 가정값입니다. 이 글의 수치는 화면의 동작과 대사식이 성립하는지를 확인하려고 만든 샘플의 결과이지 실제 회사의 실적이 아닙니다.

샘플 기간 안에서 기준에 없는 장부 조합 27건과 장부에 없는 기준 조합 20건처럼 경계 효과도 일부러 담았습니다.