수출 솔루션 · 수출 대금 추심·회수

수출 추심 만기·회수 점검 — 만기일을 다시 계산하고 미회수 잔액을 한 화면에서 대사하는 수출 대금 점검

추심 조건별 만기일 재계산 · 만기 구간별 미회수 잔액 · 지연 회수와 서류 인도 후 미회수 점검 · 통화별 외환차손익 · 명세와 요약 대사 — 소개 영상과 실제 화면 7종, 그리고 CDS 코드까지

소개 영상1분 50초9개 장면음성 안내·자막장면 흐름 요약

개발 배경 — 이 앱을 사용해야 하는 이유

수출 대금 담당자가 월말마다 받는 질문은 비슷합니다. 이번 달 만기인 추심 건이 몇 건인가, 만기를 넘겼는데 아직 들어오지 않은 돈은 얼마인가, 그 잔액은 외화로 얼마이고 원화로는 얼마인가. 지금은 이 답이 판매·청구 화면, 고객 계정 명세, 은행과 주고받은 추심 서류 사본, 그리고 담당자가 손으로 관리하는 엑셀에 흩어져 있습니다. 추심 조건이 인수인도(D/A)인지 지급인도(D/P)인지에 따라 만기일을 세는 기준일도 다르기 때문에, 엑셀 한 장에서 조건마다 다른 계산식을 유지하는 일이 쉽지 않습니다.

이 앱은 그 자리를 메웁니다. 추심 조건과 기한으로 만기일을 다시 계산하고, 기준일 현재 만기 전·만기 임박·경과 구간으로 나누어 회수 내역과 견줍니다. 결과는 점검 필요 건, 지연 회수 건, 서류를 넘겼는데 회수 내역이 없는 건으로 가려 보여 주고, 통화별 외화 금액과 외환차손익은 명세와 요약이 서로 맞는지 대사해 줍니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·점검 관점을 더해 확장합니다.

한 줄 요약 — 만기일은 서류에 적힌 숫자가 아니라 조건과 기한에서 다시 계산한 값으로 보고, 회수는 그 만기일과 견주어 읽습니다. 서로 다른 통화는 더하지 않고 통화마다 따로 모아, 명세와 요약이 어긋나는 곳이 없는지 화면이 매번 스스로 대사합니다.

핵심 포인트 여섯 가지

포인트얻는 것지금 방식이라면
① 조건별 만기일 재계산지급인도는 추심 의뢰일에 15일, 인수인도는 선적일 또는 인수일에 기한(30·60·90·120일)을 더해 만기일을 다시 구합니다. 같은 정책표로 모든 건을 계산하므로 담당자마다 결과가 달라지지 않습니다.건마다 서류를 열어 기준일을 찾고 손으로 더합니다.
② 만기 구간으로 보는 미회수 잔액만기까지 8일 이상 남음, 7일 이내, 경과 1~30일, 31~60일, 61~90일, 90일 초과, 그리고 보류까지 일곱 구간으로 나눕니다. 경과 구간에 점검 필요 건이 몰려 있는지 한눈에 봅니다.고객 미결 목록을 내려받아 엑셀에서 구간을 직접 나눕니다.
③ 허용 일수를 둔 판정만기를 5일 넘긴 잔액부터 점검 필요로 표시하고, 1~5일은 허용 일수 이내로 따로 둡니다. 입금 처리 시차로 생기는 잡음을 줄입니다.만기일이 하루만 지나도 연체 목록에 올라 목록이 길어집니다.
④ 서류 인도 후 미회수 점검지급인도 건 중 서류 인도일은 있는데 회수 내역이 없는 건을 따로 가려 인도 조건과 입금 여부를 확인하게 합니다.은행 통지와 장부를 사람이 대조하다 놓칩니다.
⑤ 통화별 외화·외환차손익USD·EUR·JPY·CNY 를 합산하지 않고 통화마다 추심·회수·미회수 외화와 원화 환산, 외환차손익을 보여 줍니다.원화로만 합쳐 보면 어느 통화가 남았는지 가려지지 않습니다.
⑥ 명세와 요약의 자동 대사외화 합계, 인식 원화, 외환차손익, 구간·조건·거래처·통화별 합계가 명세와 같은지 열 개 대사식으로 확인하고 결과를 대사 결과 탭에 남깁니다.요약표를 만든 사람과 검산하는 사람이 같아 오류가 남습니다.

만기일을 서류가 아니라 조건에서 다시 구해야 하는 이유

추심 건의 만기일은 서류에 한 번 적히면 끝나는 값처럼 보이지만 실제로는 조건에서 파생되는 값입니다. 지급인도 건은 서류를 은행에 넘긴 날이 기준이고, 인수인도 건은 구매자가 인수한 날 또는 선적일이 기준입니다. 인수일이 들어오지 않은 인수인도 건은 만기일을 계산할 수 없습니다. 이 앱은 그런 건을 억지로 계산하지 않고 보류로 두어 판정에서 빼며, 의도적으로 넣은 보류 건은 대사 결과 탭에서 따로 집계합니다. 숫자를 채우기 위해 날짜를 추정하지 않는다는 원칙입니다.

허용 일수도 같은 이유로 정책표에 둡니다. 샘플에서는 5일로 가정했지만 실제 값은 회사의 회수 관리 기준과 은행 영업일 관행에 따라 달라지므로, 화면은 값을 바꿔 다시 조회하는 쪽을 전제로 만들었습니다. 점검 필요는 “회수가 안 된다”는 결론이 아니라 “일정을 확인할 대상”이라는 표시입니다.

사용 방법

  1. 조회조건 입력 — 회계연도(필수, 4자리 숫자)를 확인합니다. 거래처·통화·추심 조건·회수 상태·만기일 범위·판정은 선택이며 비워 두면 전체입니다.
  2. 조회 — 조회조건 줄 맨 오른쪽의 조회 버튼을 누르거나 회계연도·날짜 칸에서 Enter 를 누릅니다. 화면을 열면 한 번 자동으로 조회합니다.
  3. 요약 확인 — 추심 건수, 판정 대상, 점검 필요, 미회수 잔액, 만기 경과 잔액, 대사 차이 건수를 위쪽 숫자 카드로 봅니다.
  4. 탭 이동 — 추심 명세 → 만기 구간별 → 통화별 → 추심 조건별 → 거래처별 → 대사 결과 순서로 범위를 좁혀 갑니다.
  5. 행 클릭 — 행을 누르면 상세 창이 열려 만기일 계산에 쓴 기준일과 회수 환율, 판정 내용을 보여 줍니다. 요약 행은 해당 조건의 추심 건 목록까지 함께 보여 줍니다.
  6. 내려받기 — 오른쪽 위 CSV 내려받기로 현재 탭의 결과를 UTF-8 파일로 받습니다.

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

점검 도구에서 가장 비싼 질문은 “이 숫자 맞아?”입니다. 그래서 만드는 쪽에서 먼저 대사식을 세우고 전수로 돌렸습니다. 샘플 추심 60건 전부를 대상으로 했고, 차이는 모든 항목에서 0건입니다.

대사식검사 건수차이
추심 외화 = 회수 + 미회수 (USD)300
추심 외화 = 회수 + 미회수 (EUR)140
추심 외화 = 회수 + 미회수 (JPY)80
추심 외화 = 회수 + 미회수 (CNY)80
인식 원화 = 회수분 인식 원화 + 미회수 원화600
통화별 외환차손익 합 = 건별 합600
회수 원화 재계산600
구간별 미회수 합 = 명세 합70
구간별 건수 합 = 전체 건수70
조건별 건수 합 = 전체 건수20
거래처별 미회수 합 = 명세 합80
통화별 미회수 원화 합 = 명세 합40
통화별 외환차손익 합 = 명세 합40
만기일 재계산(정책표 대조)600
판정 규칙 재계산600

의도적 예외는 대사 차이와 분리해 두었습니다. 인수일이 없어 만기일을 계산할 수 없는 보류 3건과, 서류 인도일은 있으나 회수 내역이 없는 지급인도 2건입니다. 두 경우 모두 화면에서 점검 사례로 보이도록 일부러 넣은 건이며, 대사 결과 탭에 따로 표시됩니다.

무엇으로 만들었나

자리무엇왜 그렇게 두었나
화면 컨트롤OpenUI5 표준 컨트롤(조회조건 막대, 숫자 카드, 탭, 그리드 표, 상세 창)외부 차트·표 라이브러리 없이도 같은 화면이 나오도록 표준 컨트롤만 썼습니다.
집계·판정 로직서비스 쪽 로직 파일이 조회·단건·생성·수정·삭제·함수 호출을 처리날짜 조건을 서비스가 직접 걸러, 화면이 어떤 날짜 범위를 보내도 같은 결과를 받습니다.
OData 서비스 구성OData V2 서비스 하나에 추심 명세·구간·통화·조건·거래처·대사 여섯 묶음을 엔티티셋으로 분리화면의 블록마다 별도 결과집합을 두어 한 응답에 서로 다른 집계가 섞이지 않게 했습니다. 조회조건은 모두 표준 필터로 전달합니다.
함수만기 경과 최댓값과 회수 지연 평균을 계산하는 함수 두 개화면 요약과 같은 값을 외부 시스템도 같은 방식으로 읽을 수 있게 했습니다.
테마sap_horizonSAP 표준 화면과 같은 시각 언어를 써서 사용자가 낯설어하지 않게 했습니다.
항목내용
솔루션수출 솔루션
업무 영역영업(SD) · 수출 대금 추심·회수
관련 기준서·대상 영역- · 수출 대금 추심·회수
SAP 표준 T-codeVA03 · VF03 · FBL5N · F-28
화면 성격조회·점검
데이터 연동OData (V2)
SAP 표준 기능을 그대로 이어받은 부분 — 청구문서의 통화·환율·금액, 고객 계정의 미결과 반제 내역은 SAP 표준 데이터 구조를 그대로 읽습니다. 이 앱은 그 위에 만기일 재계산과 구간 분류, 점검 판정, 통화별 대사라는 조회 관점만 더합니다. 장부를 바꾸거나 전표를 만드는 기능은 없습니다.

실행 화면

아래 화면은 모두 검증용 샘플 데이터(가상 해외 거래처 8곳, 추심 60건, 통화 4종, 기준일 2026-09-30)로 실제 브라우저에서 띄워 찍은 것입니다. 환율과 기한은 가정값이며 실제 고시값이 아닙니다.

처음 열었을 때

처음 열었을 때 — 조회조건·요약·추심 명세
처음 열었을 때 — 조회조건·요약·추심 명세 — 회계연도 2026 으로 자동 조회한 결과입니다. 위에 숫자 카드 여섯 개, 아래에 추심 명세 표가 놓입니다.

숫자 카드는 추심 60건, 판정 대상 57건, 점검 필요 14건, 미회수 잔액 8,045.4백만원, 만기 경과 잔액 2,825.9백만원, 대사 차이 0건을 보여 줍니다. 판정 대상이 57건인 것은 만기일을 계산할 수 없는 보류 3건이 빠졌기 때문입니다. 조회 버튼은 조회조건 줄 맨 오른쪽에 있습니다.

조건으로 좁히기와 구간별 보기

조건으로 좁히기 — 인수인도 · 미회수(만기 경과)
조건으로 좁히기 — 인수인도 · 미회수(만기 경과) — 추심 조건을 인수인도, 회수 상태를 미회수(만기 경과)로 고른 결과입니다.

네 건이 남고 미회수 잔액은 1,206.9백만원입니다. 숫자 카드도 같은 조건으로 다시 계산되므로 표와 카드가 어긋나지 않습니다. 만기일 시작·종료를 넣으면 만기가 몰린 달만 따로 볼 수 있고, 초기화 버튼은 조회 버튼 옆에 있습니다.

만기 구간별 — 미회수 잔액과 점검 필요 건수
만기 구간별 — 미회수 잔액과 점검 필요 건수 — 미회수 잔액을 만기까지 남은 날과 넘긴 날로 일곱 구간에 나눈 표입니다.

경과 구간에 점검 필요 건이 몰려 있는지 봅니다. 인수일이 없어 만기를 계산할 수 없는 건은 마지막 보류 구간으로 따로 모입니다. 행을 누르면 그 구간의 추심 건 목록이 상세 창에 열립니다.

거래처와 통화로 보기

거래처별 — 점검 필요 비율과 최대 만기 경과 일수
거래처별 — 점검 필요 비율과 최대 만기 경과 일수 — 거래처별로 건수, 점검 필요 비율, 최대 만기 경과 일수, 미회수 잔액을 모은 표입니다.

점검 필요 비율이 40.00% 이상인 거래처는 판정 열에 점검 필요가 표시됩니다. 회수 일정을 먼저 확인할 거래처를 고를 때 씁니다. 평균 회수 지연 일수는 회수 내역이 있는 건만으로 계산합니다.

통화별 — 외화 잔액·원화 환산·외환차손익
통화별 — 외화 잔액·원화 환산·외환차손익 — 통화마다 추심 외화, 회수 외화, 미회수 외화와 원화 환산 금액, 외환차손익을 보여 줍니다.

서로 다른 통화의 외화 금액은 더하지 않고 통화 행마다 따로 둡니다. 합계가 필요한 곳은 원화 환산 금액으로만 냅니다. 외환차손익은 회수 원화에서 회수분 인식 원화를 뺀 값이며 환율은 샘플 가정값입니다.

상세와 대사

행 클릭 — 추심 건 상세
행 클릭 — 추심 건 상세 — 명세 행을 누르면 열리는 상세 창입니다. 만기일 계산에 쓴 기준일과 회수 환율, 판정 내용이 한 번에 보입니다.

판정 문구는 “확인 필요”처럼 점검 방향만 적고 원인을 단정하지 않습니다. 같은 창에서 요약 행은 해당 조건의 추심 건 목록을 함께 보여 줍니다. 닫기 버튼 또는 배경을 눌러 닫습니다.

대사 결과 — 차이 건수와 의도적 예외
대사 결과 — 차이 건수와 의도적 예외 — 명세와 요약이 맞는지 확인하는 대사식 열 개와 의도적 예외 두 줄을 보여 줍니다.

통화별 외화, 인식 원화, 외환차손익, 구간·조건·거래처·통화별 합계가 모두 차이 0건입니다. 마지막 두 줄은 보류 3건과 서류 인도 후 미회수 2건이며, 대사 차이와 분리해 표시됩니다.

화면 뒤에서 일어나는 일

조회를 누르면 화면은 조회조건을 표준 필터 객체로 바꾸어 서비스에 보냅니다. 서비스는 추심 건마다 만기일을 정책표로 다시 계산하고, 기준일과 견주어 만기 경과 일수와 회수 지연 일수, 구간, 판정을 붙인 뒤 여섯 묶음의 결과를 각각 돌려줍니다. “전체”를 고르면 해당 조건은 필터에서 빠집니다.

판정 조건결과 상태사용자 조치
지급인도(D/P)만기일 = 추심 의뢰일 + 15일 (가정)의뢰일 자료 확인
인수인도(D/A)만기일 = 선적일 또는 인수일 + 기한 30·60·90·120일 (가정)인수일·기한 기준 확인
인수일이 없는 인수인도보류 — 만기 계산 불가, 판정 제외(의도적 예외)인수 확인 뒤 다시 점검
만기일을 5일 넘겨 잔액이 남음미회수(만기 경과) — 점검 필요회수 일정 확인 필요
부분 회수부분 회수 — 점검 필요잔액 회수 일정 확인 필요
허용 일수보다 늦게 회수 완료지연 회수 — 점검 필요지연 사유 확인 필요
지급인도 서류 인도일은 있으나 회수 없음서류 인도 후 미회수 — 점검 필요인도 조건과 입금 여부 확인 필요
만기 경과 1~5일허용 일수 이내다음 조회에서 재확인
만기까지 7일 이내만기 임박회수 예정 확인
조건별 점검 필요 비율 25.00% 이상 · 거래처별 40.00% 이상 · 통화별 점검 필요 잔액 비율 40.00% 이상요약 행 점검 필요해당 건 목록 확인

산출·대사식은 순서대로 이렇습니다. 만기일 = 기준일(의뢰일·선적일·인수일) + 기한, 미회수 외화 = 추심 외화 − 회수 외화, 인식 원화 = 추심 외화 × 가정 환율 = 회수분 인식 원화 + 미회수 원화, 외환차손익 = 회수 원화 − 회수분 인식 원화, 만기 경과(일) = 기준일 − 만기일, 회수 지연(일) = 최종 회수일 − 만기일입니다.

조회조건

조건필수기본값서비스로 가는 필터
회계연도필수2026Gjahr eq '2026'
거래처선택전체CustId eq 'C401'
통화선택전체Curr eq 'USD'
추심 조건선택전체Cond eq 'DA'
회수 상태선택전체CollStatus eq 'OVER'
만기일 시작·종료선택비움DueDate ge datetime'…' and DueDate le datetime'…'
판정선택전체CheckStatus eq 'CHECK'

결과 컬럼 — 추심 명세

컬럼의미산출식
추심 건번호 · 거래처 · 국가추심 한 건과 그 거래처원천 값 그대로
추심 조건 · 기한(일) · 기한 기준인수인도·지급인도, 만기까지 일수와 어느 날부터 세는지정책표
추심 외화 금액 · 가정 환율 · 인식 원화통화별 외화, 환율, 원화 인식액외화 × 환율, 건별 원 단위 반올림
선적일 · 추심 의뢰일 · 인수일 · 서류 인도일만기일 계산과 서류 인도 점검의 기준 날짜원천 값 그대로
만기일조건과 기한에서 다시 구한 날기준일 + 기한
최종 회수일 · 회수 외화 · 회수 환율 · 회수 원화마지막 회수와 그 금액원천 값 그대로
미회수 외화 · 미회수 원화남은 잔액추심 − 회수
외환차손익회수 시점 환율과 인식 환율의 차이가 만든 원화 손익회수 원화 − 회수분 인식 원화
만기 경과(일) · 회수 지연(일)기준일 또는 회수일이 만기일을 넘긴 일수날짜 차이
만기 구간 · 회수 상태 · 판정 · 판정 내용구간과 상태, 점검 필요 여부와 문구판정 규칙표

파일 구성

index.html · Component.js · manifest.json
controller/  view/  model/  css/  i18n/
odata/ (서비스 정의 · 서비스 로직 · 결과집합 데이터)
media/ (소개 영상 · 첫 화면 이미지)

SAP 표준 기능 확장 포인트

표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·점검 관점을 더해 확장합니다. 아래는 표준 화면으로 충분한 일과 이 앱이 더하는 관점을 나란히 둔 것입니다.

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

하고 싶은 일SAP 표준표준에서 걸리는 자리이 앱이 더하는 관점
청구문서의 금액·통화·환율 확인VF03건 단위로 열어야 해서 전체를 모아 보기 어렵습니다추심 건 전체를 한 표에서 보고 통화별로 모읍니다
고객 미결·반제 내역FBL5N미결 항목은 보이지만 추심 조건별 만기일은 따로 계산해야 합니다조건과 기한으로 만기일을 다시 구해 구간으로 나눕니다
수금 전기F-28전기 화면이라 점검·집계에는 맞지 않습니다전기된 회수를 읽어 회수 지연과 외환차손익을 보여 줍니다
판매오더 조건 확인VA03오더 단위 조회입니다오더의 통화·금액 기준을 추심 건과 맞춰 봅니다
서류 인도 후 회수 점검없음표준 목록 한 개로 가려내기 어렵습니다서류 인도일은 있는데 회수가 없는 건을 가려 냅니다
명세와 요약 대사없음요약 화면과 명세 화면을 사람이 비교합니다열 개 대사식으로 매 조회마다 확인합니다

T-code 별 연계 지점

T-code이름연계
VA03판매오더 조회오더의 통화와 금액을 이 앱의 추심 외화 금액과 맞춰 봅니다. 두 값이 다르면 이 앱의 상세 창에서 환율을 먼저 확인합니다.
VF03청구문서 조회청구일, 통화, 환율, 금액을 읽는 원천입니다. 이 앱의 추심 외화 금액과 가정 환율이 여기서 옵니다. 이 앱 결과에서 의심스러운 건은 VF03 으로 원천을 확인하고, VF03 에서 찾은 청구번호는 이 앱의 명세에서 다시 찾습니다.
FBL5N고객 계정 명세매출채권 미결과 반제 내역의 원천입니다. 미회수 외화와 회수일은 여기 값과 같아야 하며, 두 화면 숫자를 맞춰 보는 대사 지점입니다.
F-28수금 전기회수가 전기되는 거래입니다. 회수일, 회수 외화, 회수 환율은 이 거래로 생긴 전표에서 읽습니다. 입금이 전기되지 않은 건은 이 앱에서 미회수로 보입니다.

표준에 남겨 둘 일도 분명합니다. 회계 전표의 전기와 취소, 채권 반제, 법정·감사·세무 신고 대응은 모두 표준 거래에서 합니다. 이 앱은 조회와 점검만 하므로 기존 리포트를 없앨 필요가 없고, 오히려 기존 리포트와 숫자를 맞춰 보는 용도로 함께 두는 것이 안전합니다.

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

표준 CDS 분석 쿼리나 Fiori 분석 앱으로 미결 채권의 연령 분석을 이미 쓰고 있다면, 이 앱은 그것과 경쟁하지 않고 추심 조건이라는 한 가지 관점을 더합니다. 연령 분석은 청구일이나 전기일을 기준으로 구간을 나누는 경우가 많은데, 추심 건은 조건에 따라 기준일이 달라지기 때문입니다. 어떤 표준 앱이 같은 기능을 제공하는지는 고객사 릴리스에 따라 다르므로, 이 글에서는 앱 이름을 단정하지 않고 확인 필요로 둡니다.

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

자리무엇을 바꾸나어디서
만기일 정책표조건별 기한(30·60·90·120일), 지급인도 대기일(15일), 기준일 선택(선적일 또는 인수일)정책 매핑 테이블
허용 일수·임박 기준5일, 7일 같은 판정 기준쿼리 파라미터 또는 정책표
비율 기준조건 25%, 거래처 40%, 통화 40%분석 쿼리의 계산 항목
환율 유형인식 환율과 회수 환율에 어느 환율 유형을 쓸지CDS 큐브의 환산 정의
추심 건 식별청구문서와 추심 건을 어떻게 연결할지(확인 필요)기준 뷰의 조인 조건
권한회사코드·영업조직·거래처 단위 조회 권한DCL 접근 제어

분석 지표 정의표

지표산식·판정 기준대응 기능원천 데이터비고
만기일지급인도: 의뢰일 + 15일 / 인수인도: 기준일 + 기한추심 명세 만기일 열청구일 · 추심 건 필드(확인 필요)기한은 샘플 가정
만기 경과(일)기준일 − 만기일만기 구간별 탭파생허용 일수 5일
미회수 잔액추심 외화 − 회수 외화요약 카드 · 구간별 · 통화별고객 미결·반제(확인 필요)통화별 대사
회수 지연(일)최종 회수일 − 만기일조건별 · 거래처별수금 전표 전기일허용 일수 5일
외환차손익회수 원화 − 회수분 인식 원화통화별 탭청구·수금 전표 금액(확인 필요)환율은 샘플 가정
점검 필요 비율점검 필요 건수 ÷ 판정 건수조건별 · 거래처별파생기준 25%·40%

CDS 구성

화면이 읽는 여섯 묶음의 결과는 운영 환경에서 CDS 뷰 계층으로 만듭니다. 아래 코드는 이 화면의 구조를 설명하기 위해 새로 스케치한 것이며, 청구·전표·고객 마스터의 표준 테이블 필드를 기준으로 합니다. 추심 건번호·인수일·서류 인도일처럼 표준 필드를 확인하지 못한 값은 확인 필요로 주석에 남겼습니다.

뷰 레이어 구성

레이어뷰하는 일왜 나누나
기준정책 매핑 테이블 · 청구·수금 기준 뷰조건별 기한 정책과 추심 건의 청구·회수 원천정책이 바뀌어도 뷰를 고치지 않고 테이블 값만 바꾸기 위해
가공만기일 재계산 뷰조건과 기한에서 만기일, 경과·지연 일수, 구간, 판정 코드를 만듭니다판정 규칙을 한 곳에만 두어 모든 집계가 같은 규칙을 쓰게 하려고
큐브구간·통화 집계 큐브구간별·통화별 잔액과 외환차손익을 집계합니다통화를 섞지 않는 집계를 한 곳에서 책임지게 하려고
쿼리점검 쿼리화면의 조회조건과 같은 파라미터·필터를 받습니다화면과 외부 소비자가 같은 입력 규격을 쓰게 하려고
권한접근 제어(DCL)회사코드·영업조직 권한을 집계 단계에 겁니다상세 조회에만 걸면 합계로 새어 나가기 때문
서비스서비스 정의와 바인딩여섯 묶음을 OData V2 엔티티셋으로 게시합니다묶음마다 별도 결과집합을 두어 응답이 섞이지 않게 하려고

① 정책 매핑 테이블 — 조건별 기한

만기일 계산의 모든 입력은 이 테이블에서 옵니다. 추심 조건 코드마다 기준일 종류와 기한, 지급인도 대기일을 한 행에 둡니다. 운영에서는 이 테이블 값이 곧 회사의 만기 정책이므로, 정책 변경 이력을 남기려면 유효 시작일 키를 추가합니다.

@EndUserText.label : '추심 조건별 만기 정책'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
define table zcoll_policy {
  key client    : abap.clnt not null;
  key cond      : abap.char(2) not null;   " DA 인수인도 / DP 지급인도
  key tenor_key : abap.char(3) not null;   " 기한 구분
  tenor_days    : abap.int4;               " 30 · 60 · 90 · 120
  base_kind     : abap.char(5);            " BL 선적일 / ACC 인수일 / SUB 의뢰일
  wait_days     : abap.int4;               " 지급인도 대기일 (샘플 15)
  grace_days    : abap.int4;               " 허용 일수 (샘플 5)
  soon_days     : abap.int4;               " 만기 임박 기준 (샘플 7)
}

② 청구·수금 기준 뷰

청구문서에서 통화·환율·금액을 읽고, 고객 계정의 미결·반제 항목에서 회수일과 회수 금액을 읽습니다. 추심 건번호와 인수일, 서류 인도일은 표준 필드를 확인하지 못해 자리만 표시했습니다.

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '추심 건 기준 — 청구'
define view entity ZI_CollectionBase
  as select from vbrk as bh
    inner join   vbrp as bp on bp.vbeln = bh.vbeln
    left outer join kna1 as kn on kn.kunnr = bh.kunag
{
  key bh.vbeln             as CollId,
      bh.kunag             as CustId,
      kn.name1             as CustName,
      kn.land1             as Country,
      bh.fkdat             as BillDate,        -- 청구일
      bh.waerk             as Curr,
      bh.kurrf             as Rate,
      @Semantics.amount.currencyCode: 'Curr'
      bp.netwr             as FcAmt
      -- 추심 의뢰일·인수일·서류 인도일: 표준 필드 확인 필요
}

③ 만기일 재계산 뷰 — 판정 규칙을 한 곳에

이 뷰가 이 앱의 핵심입니다. 정책 테이블을 조인해 만기일을 구하고, 기준일과 견주어 경과·지연 일수, 구간, 판정 코드를 만듭니다. 인수일이 없는 인수인도 건은 만기일을 null 로 두어 보류로 분류합니다. 날짜를 추정해 채우지 않습니다.

@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '추심 만기일 재계산'
define view entity ZI_CollectionDue
  with parameters p_asof : abap.dats
  as select from ZI_CollectionBase as c
    inner join   zcoll_policy      as p on p.cond = c.Cond
{
  key c.CollId,
      c.CustId, c.Curr, c.FcAmt, c.Rate,
      case p.base_kind
        when 'SUB' then dats_add_days( c.SubmitDate, p.wait_days, 'NULL' )
        when 'ACC' then dats_add_days( c.AccDate,    p.tenor_days, 'NULL' )
        else            dats_add_days( c.BlDate,     p.tenor_days, 'NULL' )
      end                                              as DueDate,
      dats_days_between( dueDate, $parameters.p_asof ) as OverDays,
      case
        when dueDate is null                          then 'HLD'
        when c.OpenFc > 0 and OverDays > p.grace_days then 'OVD'
        when c.OpenFc > 0 and OverDays > 0            then 'GRC'
        else 'OK'
      end                                              as CheckCode
}

④ 구간·통화 집계 큐브 — 통화를 섞지 않는다

큐브는 통화를 그룹 키에 넣어 외화를 더하지 않습니다. 원화 합계가 필요한 자리는 건별 원 단위 반올림 값을 더해 명세 합계와 같아지게 합니다. 구간 코드는 만기 경과 일수에서 정합니다.

@Analytics.dataCategory: #CUBE
@EndUserText.label: '추심 구간·통화 집계'
define view entity ZI_CollectionAgingCube
  with parameters p_asof : abap.dats
  as select from ZI_CollectionDue( p_asof: $parameters.p_asof )
{
  key Curr,
  key case
        when DueDate is null   then 'H'
        when OverDays <= -8    then 'B1'
        when OverDays <=  0    then 'B2'
        when OverDays <= 30    then 'B3'
        when OverDays <= 60    then 'B4'
        when OverDays <= 90    then 'B5'
        else 'B6'
      end                       as Bucket,
      @Aggregation.default: #SUM
      OpenFc                    as OpenFc,
      @Aggregation.default: #SUM
      cast( round( OpenFc * Rate, 0 ) as abap.dec(17,0) ) as OpenKrw,
      @Aggregation.default: #SUM
      case when CheckCode = 'OVD' then 1 else 0 end       as NeedCnt
}

⑤ 점검 쿼리 — 화면과 같은 입력

쿼리는 조회조건과 같은 이름의 파라미터와 필터를 받습니다. 화면의 조회조건이 그대로 이 쿼리의 입력이 되므로, 외부 소비자가 같은 쿼리를 불러도 화면과 같은 숫자를 받습니다.

@Analytics.query: true
@EndUserText.label: '추심 점검 쿼리'
define view entity ZC_CollectionCheckQuery
  with parameters
    @Consumption.defaultValue: '20260930'
    p_asof : abap.dats
  as select from ZI_CollectionAgingCube( p_asof: $parameters.p_asof )
{
  @AnalyticsDetails.query.axis: #ROWS
  Bucket,
  @AnalyticsDetails.query.axis: #COLUMNS
  Curr,
  OpenFc,
  OpenKrw,
  NeedCnt
}

⑥ 접근 제어 — 집계 단계에 건다

권한은 상세 행에만 걸면 합계로 새어 나갑니다. 큐브 단계의 회사코드와 영업조직에 걸어 합계도 조회 권한 범위 안에서만 계산되게 합니다.

@EndUserText.label: '추심 점검 접근 제어'
@MappingRole: true
define role ZI_CollectionAgingCube {
  grant select on ZI_CollectionAgingCube
    where ( Bukrs ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}

⑦ 서비스 정의 — 결과집합을 묶음별로

여섯 묶음은 각자 엔티티셋으로 노출합니다. 소계처럼 성격이 다른 행이 한 응답에 섞이지 않게, 묶음마다 별도 결과집합과 키를 둡니다.

@EndUserText.label: '추심 점검 서비스'
define service ZUI_CollectionCheck {
  expose ZC_CollectionCheckQuery as CollSet;
  expose ZC_CollectionCheckQuery as AgingSet;
  expose ZC_CollectionCheckQuery as CurrSet;
  expose ZC_CollectionCheckQuery as CondSet;
  expose ZC_CollectionCheckQuery as CustSet;
  expose ZC_CollectionCheckQuery as ReconSet;
}

운영 시점에 해야 할 일

개발보다 정하는 일이 많습니다. 아래 여섯 가지는 코딩이 아니라 합의이고, 합의가 끝나면 기술 작업은 위 뷰를 만들고 화면을 올리는 일입니다.

해야 할 일무엇을 정하나정하지 않으면누가
추심 조건 정책조건별 기한과 기준일(선적일·인수일·의뢰일), 지급인도 대기일건마다 만기일이 달라져 구간 숫자가 기존 보고서와 어긋납니다수출 영업관리 · 자금팀
허용 일수·임박 기준점검 필요로 표시할 시점입금 처리 시차 때문에 점검 필요가 지나치게 늘어납니다자금팀
추심 건 식별청구문서와 추심 서류를 어떻게 연결할지추심 건 단위 집계가 어긋납니다수출 영업관리 · 현업 IT
환율 유형·환산 시점인식 환율과 회수 환율의 유형외환차손익이 회계팀 계산과 달라집니다회계팀
부호 규칙외환차손익의 이익·손실 표시 방향합계를 읽는 사람마다 방향을 달리 이해합니다회계팀
대사 체계고객 계정 명세와 맞출 항목과 주기이 앱이 맞는지 판단할 기준이 없습니다회계팀 · 감사 대응
권한 설계회사코드·영업조직·거래처 범위합계로 다른 조직의 숫자가 드러납니다보안 · 권한
전송 순서와 서비스 활성화테이블 → 뷰 → 쿼리 → 접근 제어 → 서비스 순서, 화면의 서비스 주소 교체활성화 순서가 어긋나 서비스 게시가 실패합니다Basis · 개발

운영 데이터로 갈 때

추심 건이 수만 건이 되어도 집계는 큐브 단계에서 하므로 화면이 받는 행 수는 구간·통화·거래처 수준으로 작게 유지됩니다. 명세 탭만 건수가 커지므로 기준일과 만기일 범위를 필수에 가깝게 쓰고, 한 번에 가져오는 행 수에 상한을 두는 것을 권합니다. 청구와 미결 항목이 수천만 건인 환경이라면 기준 뷰의 조인 키와 인덱스를 먼저 점검하고, 응답 시간 기준은 도입 전에 합의해 두는 편이 안전합니다. 구체적인 수치는 고객사 환경에서 측정해야 하므로 이 글에서는 확인 필요로 둡니다.

자주 묻는 질문

도입 전에 가장 많이 확인하는 질문을 숫자와 산식, 화면과 조작, 도입과 운영 세 묶음으로 정리했습니다.

숫자와 산식

만기일은 어떻게 계산합니까?

샘플에서는 지급인도(D/P)를 추심 의뢰일에 15일을 더한 날로, 인수인도(D/A)를 선적일 또는 인수일에 기한(30·60·90·120일)을 더한 날로 가정합니다. 모든 건에 같은 정책표를 적용하므로 담당자마다 결과가 달라지지 않습니다. 실제 만기일은 계약과 추심 서류의 조건에 따라 회사가 정해야 하며, 화면의 값은 점검용 재계산입니다.

인수일이 없는 건은 왜 판정에서 빠집니까?

인수인도 건은 구매자가 서류를 인수한 날을 기준으로 만기를 세기 때문에 인수일이 없으면 만기일을 계산할 수 없습니다. 이 앱은 날짜를 추정해 채우지 않고 보류로 두며 판정 대상 건수에서 뺍니다. 샘플에는 이런 건이 3건 있고 대사 결과 탭에 의도적 예외로 따로 표시됩니다. 인수 확인이 끝난 뒤 다시 조회하면 정상 판정으로 들어갑니다.

허용 일수는 무엇이고 왜 5일입니까?

입금은 은행 영업일과 처리 시차 때문에 만기일 당일에 장부에 반영되지 않는 경우가 많습니다. 만기를 하루 넘겼다고 곧바로 점검 필요로 올리면 목록이 길어져 정작 볼 건이 묻히기 때문에, 일정 일수 안은 허용 일수 이내로 따로 둡니다. 5일은 샘플 가정값이며 회사의 회수 관리 기준에 맞춰 바꾸는 것을 전제로 만들었습니다.

점검 필요는 회수가 안 된다는 뜻입니까?

아닙니다. 만기일과 회수 내역이 어긋나 일정을 확인할 대상이라는 표시일 뿐이며 원인을 단정하지 않습니다. 화면의 판정 문구도 “확인 필요”처럼 점검 방향만 적습니다. 회수 가능성에 대한 판단은 회사가 합니다.

서로 다른 통화는 어떻게 합산합니까?

외화 금액은 더하지 않고 통화마다 따로 모읍니다. 합계가 필요한 곳은 원화 환산 금액으로만 내며, 환산 대사는 통화별로 따로 합니다. 환율은 샘플 가정값이라 실제 고시값과 다릅니다.

외환차손익은 어떻게 구합니까?

회수 원화에서 회수분 인식 원화를 뺀 값입니다. 인식 원화는 추심 외화에 인식 시점의 가정 환율을 곱해 원 단위로 반올림한 값이고, 회수 원화는 회수 외화에 회수 시점 환율을 곱한 값입니다. 통화별 합계는 건별 합계와 같아야 하며 대사 결과 탭에서 확인합니다.

화면과 조작

조회 버튼은 어디에 있습니까?

조회조건 줄 맨 오른쪽에 있고, 초기화 버튼이 바로 옆에 있습니다. 회계연도나 날짜 입력 칸에서 Enter 를 눌러도 조회됩니다. 화면을 처음 열면 한 번 자동으로 조회합니다.

회계연도만 필수인 이유는 무엇입니까?

추심 건은 연도 단위로 묶어 관리하는 경우가 많고, 연도 없이 전체를 읽으면 응답이 불필요하게 커지기 때문입니다. 나머지 조건은 모두 선택이며 비우면 전체입니다. 연도 칸이 4자리 숫자가 아니면 안내 문구가 뜹니다.

만기일 범위를 넣으면 무엇이 달라집니까?

추심 명세 표만 그 범위로 좁혀지고, 숫자 카드도 같은 조건으로 다시 계산됩니다. 만기가 몰린 달을 따로 볼 때 씁니다. 시작이 종료보다 늦으면 안내 문구가 뜹니다.

행을 누르면 무엇이 열립니까?

건별 상세 창이 열려 만기일 계산에 쓴 기준일과 회수 환율, 판정 내용을 보여 줍니다. 구간·통화·조건·거래처 같은 요약 행을 누르면 해당 조건의 추심 건 목록이 함께 열립니다. 닫기 버튼이나 창 밖 배경을 눌러 닫습니다.

CSV 는 어떤 범위를 내려받습니까?

현재 보고 있는 탭의 조회 결과 전체를 받습니다. 인코딩은 UTF-8 이고 첫머리에 표식이 있어 엑셀에서 바로 한글이 깨지지 않고 열립니다. 다른 탭의 결과가 필요하면 탭을 옮겨 다시 내려받습니다.

도입과 운영

누가 쓰면 효과가 큽니까?

수출 대금 회수를 관리하는 영업관리·자금 담당자와, 월말에 외화 채권을 점검하는 회계 담당자입니다. 같은 화면에서 만기일 재계산과 구간 분류, 통화별 대사까지 이어지므로 담당자 사이의 자료 전달이 줄어듭니다. 점검 결과를 근거로 한 최종 판단은 회사와 감사인의 몫입니다.

언제부터 적용되고 어떤 범위입니까?

특정 시행일이 있는 제도에 묶인 화면이 아니며, 적용 시기와 범위는 확인된 사실이 없어 확인 필요로 둡니다. 샘플 기준일은 2026-09-30 이고 데이터는 모두 검증용 샘플입니다. 운영에서는 고객사의 추심 조건과 기준일 정책을 먼저 정한 뒤 적용 범위를 정합니다.

표준 T-code 와는 어떤 관계입니까?

표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·점검 관점을 더해 확장합니다. 청구문서(VF03), 고객 계정 명세(FBL5N), 수금 전기(F-28), 판매오더(VA03)가 원천을 확인하는 표준 화면입니다. 이 앱은 장부를 바꾸지 않으므로 기존 리포트를 없앨 필요가 없습니다.

데이터 원천과 정합성은 어떻게 확인합니까?

청구문서의 통화·환율·금액과 고객 계정의 미결·반제 내역이 원천이며, 이 앱의 미회수 외화와 회수일은 FBL5N 값과 맞춰 봅니다. 화면 안에서는 열 개 대사식이 명세와 요약의 일치를 매번 확인하고, 샘플에서는 전 항목 차이가 0건입니다. 추심 건번호와 인수일의 표준 필드는 확인 필요입니다.

운영 환경에 연결하는 절차와 시간은 어느 정도입니까?

CDS 뷰를 만들고 서비스를 게시한 뒤 화면의 서비스 주소만 바꾸는 순서입니다. 기술 작업 자체보다 추심 조건 정책과 환율 유형, 권한 범위를 정하는 합의에 시간이 더 듭니다. 구체적인 소요는 고객사 환경에 따라 달라 이 글에서 수치로 단정하지 않습니다.

권한과 보안은 어떻게 다룹니까?

집계 단계인 큐브에 회사코드와 영업조직 권한을 겁니다. 상세 행에만 걸면 합계로 다른 조직의 숫자가 드러나기 때문입니다. 화면은 조회 전용이며 서비스에 쓰기 요청을 보내는 기능을 화면에 두지 않았습니다.

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

집계는 큐브에서 하므로 요약 탭이 받는 행 수는 작게 유지됩니다. 추심 명세 탭만 건수에 비례하므로 만기일 범위를 함께 쓰고 한 번에 가져오는 행 수에 상한을 두는 것을 권합니다. 대용량에서의 응답 시간은 고객사 환경에서 측정해야 하며 이 글의 수치는 샘플 기준입니다.

추심 조건이 늘거나 기한이 바뀌면 어떻게 합니까?

정책 매핑 테이블에 행을 더하거나 값을 바꾸면 됩니다. 만기일 재계산 뷰는 테이블을 조인하므로 뷰를 다시 고치지 않아도 되고, 정책 변경 이력이 필요하면 유효 시작일 키를 추가합니다. 변경 뒤에는 대사 결과 탭으로 명세와 요약이 여전히 맞는지 확인합니다.

이 화면의 결과를 결산이나 세무 신고에 그대로 써도 됩니까?

이 화면은 분류·집계·대사를 돕는 점검 도구이며 최종 판단은 회사와 감사인이 합니다. 세무 신고는 회사와 세무 대리인·관세사가 판단합니다. 외환차손익도 샘플 가정 환율로 계산한 점검용 값이므로, 회계 처리는 표준 거래의 전표를 기준으로 합니다.

샘플 데이터는 실제 거래입니까?

아닙니다. 가상 해외 거래처 8곳과 추심 60건으로 만든 검증용 샘플이며, 환율과 기한도 가정값입니다. 점검 사례를 보여 주려고 보류 3건과 서류 인도 후 미회수 2건을 의도적으로 넣었습니다. 실제 고객사 이름이나 거래는 사용하지 않았습니다.