수출 추심 만기·회수 점검 — 만기일을 다시 계산하고 미회수 잔액을 한 화면에서 대사하는 수출 대금 점검
추심 조건별 만기일 재계산 · 만기 구간별 미회수 잔액 · 지연 회수와 서류 인도 후 미회수 점검 · 통화별 외환차손익 · 명세와 요약 대사 — 소개 영상과 실제 화면 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일로 가정했지만 실제 값은 회사의 회수 관리 기준과 은행 영업일 관행에 따라 달라지므로, 화면은 값을 바꿔 다시 조회하는 쪽을 전제로 만들었습니다. 점검 필요는 “회수가 안 된다”는 결론이 아니라 “일정을 확인할 대상”이라는 표시입니다.
사용 방법
- 조회조건 입력 — 회계연도(필수, 4자리 숫자)를 확인합니다. 거래처·통화·추심 조건·회수 상태·만기일 범위·판정은 선택이며 비워 두면 전체입니다.
- 조회 — 조회조건 줄 맨 오른쪽의 조회 버튼을 누르거나 회계연도·날짜 칸에서 Enter 를 누릅니다. 화면을 열면 한 번 자동으로 조회합니다.
- 요약 확인 — 추심 건수, 판정 대상, 점검 필요, 미회수 잔액, 만기 경과 잔액, 대사 차이 건수를 위쪽 숫자 카드로 봅니다.
- 탭 이동 — 추심 명세 → 만기 구간별 → 통화별 → 추심 조건별 → 거래처별 → 대사 결과 순서로 범위를 좁혀 갑니다.
- 행 클릭 — 행을 누르면 상세 창이 열려 만기일 계산에 쓴 기준일과 회수 환율, 판정 내용을 보여 줍니다. 요약 행은 해당 조건의 추심 건 목록까지 함께 보여 줍니다.
- 내려받기 — 오른쪽 위 CSV 내려받기로 현재 탭의 결과를 UTF-8 파일로 받습니다.
숫자를 믿을 수 있는가 — 검증 결과
점검 도구에서 가장 비싼 질문은 “이 숫자 맞아?”입니다. 그래서 만드는 쪽에서 먼저 대사식을 세우고 전수로 돌렸습니다. 샘플 추심 60건 전부를 대상으로 했고, 차이는 모든 항목에서 0건입니다.
| 대사식 | 검사 건수 | 차이 |
|---|---|---|
| 추심 외화 = 회수 + 미회수 (USD) | 30 | 0 |
| 추심 외화 = 회수 + 미회수 (EUR) | 14 | 0 |
| 추심 외화 = 회수 + 미회수 (JPY) | 8 | 0 |
| 추심 외화 = 회수 + 미회수 (CNY) | 8 | 0 |
| 인식 원화 = 회수분 인식 원화 + 미회수 원화 | 60 | 0 |
| 통화별 외환차손익 합 = 건별 합 | 60 | 0 |
| 회수 원화 재계산 | 60 | 0 |
| 구간별 미회수 합 = 명세 합 | 7 | 0 |
| 구간별 건수 합 = 전체 건수 | 7 | 0 |
| 조건별 건수 합 = 전체 건수 | 2 | 0 |
| 거래처별 미회수 합 = 명세 합 | 8 | 0 |
| 통화별 미회수 원화 합 = 명세 합 | 4 | 0 |
| 통화별 외환차손익 합 = 명세 합 | 4 | 0 |
| 만기일 재계산(정책표 대조) | 60 | 0 |
| 판정 규칙 재계산 | 60 | 0 |
의도적 예외는 대사 차이와 분리해 두었습니다. 인수일이 없어 만기일을 계산할 수 없는 보류 3건과, 서류 인도일은 있으나 회수 내역이 없는 지급인도 2건입니다. 두 경우 모두 화면에서 점검 사례로 보이도록 일부러 넣은 건이며, 대사 결과 탭에 따로 표시됩니다.
무엇으로 만들었나
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 컨트롤 | OpenUI5 표준 컨트롤(조회조건 막대, 숫자 카드, 탭, 그리드 표, 상세 창) | 외부 차트·표 라이브러리 없이도 같은 화면이 나오도록 표준 컨트롤만 썼습니다. |
| 집계·판정 로직 | 서비스 쪽 로직 파일이 조회·단건·생성·수정·삭제·함수 호출을 처리 | 날짜 조건을 서비스가 직접 걸러, 화면이 어떤 날짜 범위를 보내도 같은 결과를 받습니다. |
| OData 서비스 구성 | OData V2 서비스 하나에 추심 명세·구간·통화·조건·거래처·대사 여섯 묶음을 엔티티셋으로 분리 | 화면의 블록마다 별도 결과집합을 두어 한 응답에 서로 다른 집계가 섞이지 않게 했습니다. 조회조건은 모두 표준 필터로 전달합니다. |
| 함수 | 만기 경과 최댓값과 회수 지연 평균을 계산하는 함수 두 개 | 화면 요약과 같은 값을 외부 시스템도 같은 방식으로 읽을 수 있게 했습니다. |
| 테마 | sap_horizon | SAP 표준 화면과 같은 시각 언어를 써서 사용자가 낯설어하지 않게 했습니다. |
| 항목 | 내용 |
|---|---|
| 솔루션 | 수출 솔루션 |
| 업무 영역 | 영업(SD) · 수출 대금 추심·회수 |
| 관련 기준서·대상 영역 | - · 수출 대금 추심·회수 |
| SAP 표준 T-code | VA03 · VF03 · FBL5N · F-28 |
| 화면 성격 | 조회·점검 |
| 데이터 연동 | OData (V2) |
실행 화면
아래 화면은 모두 검증용 샘플 데이터(가상 해외 거래처 8곳, 추심 60건, 통화 4종, 기준일 2026-09-30)로 실제 브라우저에서 띄워 찍은 것입니다. 환율과 기한은 가정값이며 실제 고시값이 아닙니다.
처음 열었을 때

숫자 카드는 추심 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% 이상 | 요약 행 점검 필요 | 해당 건 목록 확인 |
산출·대사식은 순서대로 이렇습니다. 만기일 = 기준일(의뢰일·선적일·인수일) + 기한, 미회수 외화 = 추심 외화 − 회수 외화, 인식 원화 = 추심 외화 × 가정 환율 = 회수분 인식 원화 + 미회수 원화, 외환차손익 = 회수 원화 − 회수분 인식 원화, 만기 경과(일) = 기준일 − 만기일, 회수 지연(일) = 최종 회수일 − 만기일입니다.
조회조건
| 조건 | 필수 | 기본값 | 서비스로 가는 필터 |
|---|---|---|---|
| 회계연도 | 필수 | 2026 | Gjahr 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건을 의도적으로 넣었습니다. 실제 고객사 이름이나 거래는 사용하지 않았습니다.