회수 예측 점검 — 만기일이 아니라 거래처의 지급 습관으로 다시 구한 주차별 회수액을 장부와 견주는 자금 예측 화면
미결 매출채권 124건 · 거래처 지급행태(최근 6건 평균 지연일) · 8주 회수 예측 · 장부와 재계산의 주차 비교 · 직전 4주 예측 검증 · 대사 — 소개 영상과 실제 화면 7종, 그리고 CDS 코드까지
소개 영상1분 30초8개 장면음성 안내·자막세 질문 → 조회 결과 → 주차 상세 → 채권 명세 → 거래처 → 직전 4주 검증 → 대사
도입 포인트 — 이 앱을 사용해야 하는 이유
자금 담당자가 매주 받는 질문은 단순합니다. 다음 주에 얼마가 들어오나, 그 숫자를 얼마나 믿어도 되나. 장부의 미결 매출채권은 만기일이 정해져 있어서 만기일이 속한 주에 들어온다고 잡으면 표 하나가 금방 나옵니다. 그런데 거래처마다 실제로 돈을 보내는 날은 만기일과 다르고, 그 차이는 대체로 거래처마다 일정한 습관으로 반복됩니다. 만기일 기준 예측이 매주 같은 방향으로 빗나가는 까닭입니다.
이 앱은 같은 미결 채권을 두 번 놓습니다. 한 번은 만기일 그대로(장부), 한 번은 만기일 + 그 거래처의 최근 6건 평균 지연일(재계산)입니다. 두 결과를 8주 주차별로 나란히 보여 주고, 주차가 달라지는 채권과 근거를 회사가 먼저 확인해야 하는 채권을 골라 줍니다. 마지막으로 직전 4주에는 어느 쪽이 실제 입금에 더 가까웠는지까지 보여 줍니다. 기준일은 2026-10-09 이며, 화면의 판정은 모두 “점검 필요”·“확인 필요”로만 표시합니다. 결론이 아니라 살펴볼 대상을 고르는 기준입니다.
만기일로 잡은 회수 예측은 거래처의 습관을 모른다
미결 채권 124건의 만기일을 그대로 주차에 얹으면 첫 주에 들어올 돈이 크게 잡힙니다. 하지만 평균 지연일이 길게 쌓인 거래처의 채권은 같은 주에 들어오지 않습니다. 표준 화면에서는 거래처별 지급 이력을 따로 열어 평균을 내고, 그 평균을 만기일에 더해 주차를 다시 나누는 일을 엑셀로 합니다. 이 앱은 그 계산을 화면 안에서 같은 규칙(최근 6건, 반올림한 평균, 이력 3건 미만이면 미반영)으로 매번 똑같이 합니다. 담당자가 바뀌어도 산식이 바뀌지 않습니다.
장부 주차와 재계산 주차가 어긋난 채로 자금 계획이 간다
자금 계획은 주 단위로 잡히는데, 어느 채권이 다음 주에서 다다음 주로 밀리는지는 합계표만으로는 보이지 않습니다. 이 앱의 미결 채권 명세는 채권마다 만기일, 재계산한 예상 입금일, 장부 주차, 재계산 주차를 한 줄에 놓습니다. 주차가 달라지는 건은 “점검 필요”, 분쟁 보류·예상일 경과 이월·지급 이력 부족처럼 근거를 먼저 확인해야 하는 건은 “확인 필요”로 표시합니다. 이번 검증용 샘플 데이터에서는 124건 가운데 58건의 주차가 달라지고 50건이 확인 필요로 분류됩니다.
예측이 얼마나 빗나갔는지 돌아보지 않으면 같은 오차가 반복된다
지급행태를 반영한 예측이 더 좋은지는 주장이 아니라 지난 실적으로 확인할 일입니다. 직전 4주마다 실제 입금액과 두 예측(만기일 기준 · 지급행태 반영)의 오차율을 구해 어느 쪽이 더 가까웠는지, 얼마나 개선되었는지를 보여 줍니다. 실적 입금이 3건 미만인 주는 비교를 보류하고 “확인 필요”로 둡니다. 이번 샘플에서는 8개 회사·주차 가운데 6개에서 지급행태 반영 예측이 더 가까웠고 2개에서는 오히려 더 멀었습니다 — 이 두 개는 감추지 않고 “점검 필요”로 올립니다.
사용 방법
- 조회조건 입력 — 화면 위쪽에서 회계연도(필수 · 4자리)를 입력합니다. 회사 · 거래처 · 예상 입금일 시작/종료 · 분쟁 보류 · 점검 코드 · 점검 결과는 선택이며 비우면 걸지 않습니다.
- 조회 — 조건 영역 안의 조회 버튼을 누르거나 회계연도 칸에서 Enter 키를 누릅니다. 자동 조회는 없으므로 조건을 바꾼 뒤에는 다시 조회합니다.
- 요약 확인 — 점검한 미결 채권 건수, 주차가 바뀌는 건수·금액, 8주 밖으로 밀리는 금액, 확인 필요 건수, 직전 4주 예측 오차율 개선, 대사 차이 건수가 먼저 보입니다.
- 탭 이동 — 주차별 회수 예측 → 미결 채권 명세 → 거래처 지급행태 → 직전 4주 예측 검증 → 대사 결과 순서로 봅니다.
- 행 클릭 상세 — 주차 행을 누르면 그 주차에 입금될 것으로 재계산된 채권이, 거래처 행을 누르면 지급 이력(최근 순, 평균에 반영된 최근 6건 표시)이 열립니다.
- 내보내기 — CSV 내려받기 버튼으로 지금 보고 있는 탭의 결과를 파일로 받습니다.
숫자를 믿을 수 있는가 — 검증 결과
만드는 쪽에서 먼저 대사식을 세워 전수로 돌렸습니다. 아래 여덟 가지는 정합성 대사로 모두 차이가 0 이고, 의도적으로 넣은 점검 대상은 차이 건수에 섞지 않고 참고 대사로 따로 세웠습니다.
| 대사식 | 검사 건수 | 차이 건수 |
|---|---|---|
| 미결 채권 금액 합계 = 거래처별 미결 금액 합계 | 2 | 0 |
| 미결 채권 합계 = 주차별 재계산 회수액 합계(기간 밖 포함) | 2 | 0 |
| 미결 채권 합계 = 주차별 장부 회수액 합계(기간 밖 포함) | 2 | 0 |
| 주차 이동 금액 합계 = 0 (옮겨도 총액은 그대로) | 2 | 0 |
| 8주차 누적 재계산 = 1~8주차 재계산 합계 | 2 | 0 |
| 거래처 평균 지연일 = 최근 6건 지급 이력의 평균 | 24 | 0 |
| 예상 입금일 = 만기일 + 반영 지연일 | 124 | 0 |
| 직전 4주 실적 입금 = 지급 이력 중 직전 4주 입금 합계 | 2 | 0 |
| 합계 (정합성 대사 8종) | 160 | 0 |
참고 대사(의도적 예외)는 세 가지입니다 — 장부 주차와 재계산 주차가 다른 채권 58건, 확인 필요로 분류된 채권 50건, 지급행태 반영 오차율이 만기일 기준보다 큰 주차 2개. 이 건들은 잘못이 아니라 이 화면이 일부러 찾아내야 하는 대상이어서 대사 차이와 분리했습니다. 이 앱은 점검 도구이며 최종 판단은 회사와 감사인이 합니다.
무엇으로 만들었나
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 컨트롤 | OpenUI5 표준 컨트롤(표 · 탭 · 다이얼로그) | 외부 차트나 표 라이브러리 없이 표준 컨트롤만 써서 사내망에서도 그대로 열립니다. |
| 집계·판정 로직 | 서비스 쪽 계산(지급행태 평균, 예상 입금일, 주차 배정, 점검 코드, 직전 4주 비교) | 숫자는 화면이 아니라 서비스가 계산합니다. 같은 조건이면 언제 열어도 같은 결과가 나옵니다. |
| OData 서비스 구성 | OData V2 서비스 한 개, 엔티티셋 여섯 개와 펑션 두 개 | 탭마다 하나의 엔티티셋에 표를 바인딩하고, 조회조건은 서버 필터로 모든 탭에 같은 조건을 적용합니다. 요약의 일부 숫자는 펑션으로 받습니다. |
| 조회·쓰기 범위 | 조회 · 단건 · 생성 · 수정 · 삭제 · 펑션, 날짜 조건 직접 처리 | 날짜 필터(예상 입금일 범위)가 서비스 안에서 동작하도록 직접 처리했습니다. |
| 테마 | sap_horizon | SAP 표준 Horizon 테마를 그대로 따라 표준 Fiori 화면과 같은 느낌으로 읽힙니다. |
| 데이터 | 검증용 샘플 데이터 | 화면 동작과 대사를 확인하려고 만든 가상 거래입니다. 실제 시스템 연결 결과가 아닙니다. |
| 항목 | 내용 |
|---|---|
| 업무 영역 | 자금 예측 (매출채권 회수 예측) |
| 관련 기준서 · 대상 영역 | 대상 영역: 자금 예측 · 매출채권 회수 시점 점검 (관련 기준서 -) |
| SAP 표준 T-code | FBL5N · FD10N · FF7A · FF7B |
| Namespace | zui5.collectfcst |
| 화면 성격 | 조회·점검 화면 (최종 판단은 회사와 감사인) |
| 데이터 연동 | OData V2 · 검증용 샘플 데이터 |
| 테마 | sap_horizon |
SAP 표준 기능을 그대로 이어받은 부분
미결 항목과 청산 항목이라는 SAP 표준 데이터 구조를 그대로 이어받아 쓰고, 거래처 이름·회사 코드도 표준 마스터를 따릅니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 지급행태 관점의 조회·점검을 더해 확장합니다.
실행 화면
아래 화면은 검증용 샘플 데이터로 직접 실행해 캡처한 것입니다. 사용 순서대로 일곱 장입니다. 사진을 누르면 크게 볼 수 있습니다.
처음 열었을 때 — 조회 결과와 요약

회계연도와 회사를 고르고 조회하면 요약 숫자가 먼저 보입니다. 기준일 2026-10-09 이후 8주와 기간 밖(00) 행이 한 표에 있고, 장부 회수액(만기일 기준)과 재계산 회수액(지급행태 반영)의 차이가 주차마다 붙습니다. 처음 열면 회계연도 2026, 회사 전체로 조회됩니다.
주차 행을 눌러 그 주에 들어올 채권 보기

장부와 재계산의 금액 차이, 누적, 주차 이동 건수, 확인 필요 비중과 점검 내용이 위에 놓이고 아래에 채권 목록이 이어집니다. 확인 필요 비중이 30퍼센트 이상이면 그 주의 예측은 근거를 먼저 확인하라는 신호입니다.
채권마다 장부와 재계산을 비교한다

예상 입금일(재계산)은 만기일에 반영 지연일을 더한 값입니다. 장부 주차와 재계산 주차가 다르면 점검 필요, 분쟁 보류나 이월 건은 확인 필요로 표시됩니다. 표 머리를 눌러 정렬하고, 조건을 좁혀 거래처 하나만 볼 수도 있습니다.
거래처의 지급 습관을 직접 확인한다

평균 지연일이 길고 편차가 큰 거래처가 위쪽 후보입니다. 지급 이력이 3건 미만인 거래처는 반영 지연일이 0 이고 확인 필요로 표시됩니다. 행을 누르면 그 거래처의 지급 이력이 열립니다.

만기일, 실제 입금일, 지연일, 금액이 최근 순으로 나옵니다. 평균에 쓰인 최근 6건에 표시가 붙어 있어 “이 평균은 어디서 나왔나” 하는 질문에 그 자리에서 답합니다.
지난 4주에 어느 예측이 더 맞았나, 그리고 대사

오차율이 낮은 쪽이 더 가까운 예측입니다. 개선 열이 양수면 지급행태 반영 쪽이 더 가까웠다는 뜻이고 음수면 오히려 멀었다는 뜻입니다. 실적 입금이 3건 미만인 주는 비교를 보류하고 확인 필요로 둡니다.

정합성 대사 8종은 차이 건수가 모두 0 이어야 합니다. 아래 참고 대사 세 줄은 일부러 찾아내야 하는 대상(주차 이동 · 확인 필요 · 예측이 더 멀었던 주)의 건수이며 차이로 세지 않습니다.
화면 뒤에서 일어나는 일
조회 버튼을 누르면 조회조건이 서버 필터 한 벌로 묶여 다섯 개 탭의 표에 같은 조건으로 적용됩니다. 서비스는 다음 순서로 계산합니다.
- 지급행태 — 거래처별로 이미 입금된 건의 지연일(실제 입금일 − 만기일) 가운데 최근 6건의 평균을 구하고 반올림해 “반영 지연일”로 씁니다. 이력이 3건 미만이면 지연을 반영하지 않습니다.
- 예상 입금일 — 만기일 + 반영 지연일. 이 날짜가 기준일(2026-10-09) 이전인데 아직 입금되지 않았으면 1주차로 이월합니다.
- 주차 배정 — 기준일부터 7일씩 8개 주차에 장부(만기일 기준)와 재계산(예상 입금일 기준)을 각각 나누어 담고, 8주 밖은 “00” 으로 모읍니다.
- 점검 코드 — 아래 표의 규칙으로 채권 · 주차 · 거래처 · 직전 4주마다 코드를 붙입니다.
- 대사 — 합계가 서로 맞는지 여덟 가지 대사식으로 검산합니다. 주차를 옮겨도 총액은 그대로여야 합니다.
점검 규칙 — 조건에서 결과, 사용자 조치까지
| 코드 | 이름 | 조건 | 결과 | 사용자 조치 |
|---|---|---|---|---|
A01 | 주차 이동 | 장부 주차 ≠ 재계산 주차 (둘 다 8주 안) | 점검 필요 | 주차를 옮겨 잡을 항목인지 점검 |
A02 | 분쟁 보류 포함 | 분쟁 보류 표시가 있는 채권 | 확인 필요 | 회수 시점 근거를 회사가 먼저 확인 |
A03 | 지급 이력 부족 | 거래처 지급 이력 3건 미만(지연 미반영) | 확인 필요 | 만기일 기준으로 둔 판단을 확인 |
A04 | 기간 밖으로 밀림 | 장부는 8주 안, 재계산은 8주 밖 | 점검 필요 | 기간 밖 합계로 따로 확인 |
A05 | 예상일 경과 이월 | 재계산 예상 입금일이 기준일(2026-10-09) 이전인데 미입금 | 확인 필요 | 1주차 이월의 근거 확인 |
A06 | 장부·재계산 모두 기간 밖 | 두 주차가 모두 00(기간 밖) | 정상 | 기간 밖 합계로 확인 |
A00 | 점검 사항 없음 | 위에 해당하지 않음 | 정상 | - |
W01 | 장부와 25퍼센트 이상 차이 | |재계산 − 장부| ≥ 장부 × 25퍼센트 (장부 0이고 재계산 있음 포함) | 점검 필요 | 장부 예측을 지급행태에 맞게 고칠지 점검 |
W03 | 확인 필요 비중 높음 | 재계산 회수액 중 A02·A03·A05 금액 비중 ≥ 30퍼센트 | 확인 필요 | 근거를 회사가 먼저 확인 |
W04 | 기간 밖 금액 | 기간 밖(00) 행의 재계산 금액이 장부보다 큼 | 점검 필요 | 합계에서 빠지므로 따로 확인 |
K01 | 지급 이력 부족 | 지급 이력 3건 미만 | 확인 필요 | 만기일 기준을 쓴 근거 확인 |
K02 | 평균 지연 30일 이상 | 최근 6건 평균 지연일 ≥ 30 | 점검 필요 | 거래처별 회수 계획 점검 |
K03 | 지연일 편차 큼 | 지연일 표준편차 ≥ 10 | 점검 필요 | 주차 예측이 흔들릴 수 있음 |
B01 | 행태 반영 오차가 더 큼 | 행태 반영 예측 오차율 > 만기일 기준 오차율 (실적 3건 이상) | 점검 필요 | 지급행태 적용 기준 점검 |
B02 | 실적 표본 부족 | 그 주 실적 입금 3건 미만 | 확인 필요 | 비교 보류, 회사가 판단 |
조회조건
| 조건 | 필수 | 기본값 | 동작 |
|---|---|---|---|
| 회계연도 | 필수 | 2026 | 4자리 숫자. 아니면 안내 메시지를 보이고 조회하지 않습니다. |
| 회사 | 선택 | 전체 | 전체 · 1000 · 2000. 전체는 조건을 걸지 않는 것입니다. |
| 거래처 | 선택 | 비어 있음 | 거래처 이름의 일부를 입력하면 포함 검색합니다. |
| 예상 입금일 시작 · 종료 | 선택 | 비어 있음 | 재계산 예상 입금일 범위. 시작이 종료보다 늦으면 안내 메시지를 보입니다. |
| 분쟁 보류 | 선택 | 전체 | 분쟁 보류 표시가 있는 채권만 / 없는 채권만. |
| 점검 코드 | 선택 | 전체 | 위 점검 규칙표의 코드로 좁힙니다. |
| 점검 결과 | 선택 | 전체 | 정상 / 점검 필요 / 확인 필요. |
결과 컬럼
| 탭 | 주요 컬럼 | 의미 · 산출식 |
|---|---|---|
| 주차별 회수 예측 | 장부 회수액 · 재계산 회수액 · 차이 · 누적 · 주차 이동 건수 · 확인 필요 비중 | 장부 = 만기일이 속한 주차의 미결 금액 합. 재계산 = 예상 입금일이 속한 주차의 미결 금액 합. 차이 = 재계산 − 장부. |
| 미결 채권 명세 | 만기일 · 예상 입금일(재계산) · 반영 지연일 · 만기 경과일 · 장부 주차 · 재계산 주차 · 분쟁 보류 | 예상 입금일 = 만기일 + 반영 지연일. 주차는 기준일에서 7일 단위. |
| 거래처 지급행태 | 평균 지연일 · 지연일 편차 · 반영 지연일 · 미결 금액 · 주차 이동 금액 · 분쟁 보류 금액 | 평균 = 최근 6건 지연일의 평균, 편차 = 표준편차. 이력 3건 미만이면 반영 지연일 0. |
| 직전 4주 예측 검증 | 실적 입금 · 만기일 기준 예측 · 지급행태 반영 예측 · 오차율 · 개선(퍼센트포인트) | 오차율 = |실적 − 예측| ÷ 실적. 개선 = 만기일 기준 오차율 − 지급행태 반영 오차율. |
| 대사 결과 | 대사식 · 검사 건수 · 차이 건수 · 최대 차이 | 정합성 대사와 참고 대사(의도적 예외)를 구분해 보여 줍니다. |
좁은 화면에서 달라지는 것
이번에 확인한 화면 폭은 데스크톱(1600 × 1000)입니다. 표는 고정 열 구성이라 좁은 화면에서는 가로로 밀어 보게 되며, 휴대폰 전용 배치는 이번 범위에 넣지 않았습니다. 확인하지 않은 부분이므로 운영 화면에 쓰기 전에 사용할 기기에서 한 번 열어 보시길 권합니다.
파일 구성
index.html · Component.js · manifest.json
controller/ 화면 로직 (공통 · 메인)
view/ 메인 화면 · 주차 상세 · 거래처 상세
model/ 포맷터 · 오류 안내
css/ · i18n/ 스타일 · 문구
odata/ 서비스 정의 · 서비스 로직 · 검증용 샘플 데이터
media/ 소개 영상 · 첫 장면 이미지
readme.html 앱 설명서
SAP 표준 기능 확장 포인트 — 표준 T-code 와 어떻게 연계되는지
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다. 표준 화면으로 충분한 일은 표준에 그대로 두고, 표준 화면 여러 개를 오가며 엑셀로 하던 지급행태 계산과 주차 비교만 한 화면에 모았습니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | 표준 화면 | 표준에서 걸리는 자리 | 이 앱이 더하는 관점 |
|---|---|---|---|
| 거래처별 미결 항목 조회 | FBL5N | 항목 단위 조회라 거래처의 입금 습관(평균 지연)은 직접 계산해야 합니다 | 청산 항목에서 최근 6건 평균 지연일을 거래처마다 계산해 함께 보여 줍니다 |
| 거래처 잔액 확인 | FD10N | 잔액과 기간별 합계는 되지만 주차별 회수 시점은 만기일 기준입니다 | 예상 입금일 기준으로 다시 나눈 주차와 장부 주차를 나란히 봅니다 |
| 현금 포지션 | FF7A | 입금 항목이 만기일·계획일 기준으로 들어갑니다 | 재계산 회수액을 자금 포지션의 입금 항목과 비교할 근거로 둡니다 |
| 유동성 예측 | FF7B | 예측 정확도를 돌아보는 화면은 따로 없습니다 | 직전 4주 실적으로 두 예측의 오차율을 견줍니다 |
| 예측이 달라지는 채권 찾기 | 표준에 없음 | 두 기준의 주차를 채권 단위로 비교하는 화면이 없어 보통 엑셀로 합니다 | 장부 주차 ≠ 재계산 주차인 채권을 점검 필요로 모읍니다 |
T-code 별 연계 지점
| T-code | 이름 | 연계 |
|---|---|---|
| FBL5N | 고객 개별 항목 | 이 앱의 미결 채권 명세와 거래처 지급 이력은 고객의 미결 항목과 청산 항목을 원천으로 합니다. 같은 거래처를 FBL5N 에서 열어 미결 합계와 청산일을 이 앱의 거래처 상세와 맞춰 볼 수 있습니다. 이 앱 결과 → FBL5N: 거래처 상세의 지급 이력 건에서 원천 항목 확인. 표준 → 이 앱: FBL5N 에서 본 청산일이 이 앱의 지급 이력에 같은 지연일로 나타나는지 확인. |
| FD10N | 고객 잔액 조회 | 이 앱의 거래처별 미결 금액 합계(대사 R01)는 고객 잔액의 미결 부분과 맞아야 합니다. 맞지 않으면 원천 선택 조건(회사 코드·특수 총계정 처리 여부)을 먼저 확인합니다. |
| FF7A | 현금 포지션 | 주차별 재계산 회수액을 자금 포지션의 입금 라인과 비교합니다. 이 앱은 예측을 대체하지 않고 입금 시점 가정을 점검합니다. |
| FF7B | 유동성 예측 | 유동성 예측에 들어가는 매출채권 입금 가정(만기일 기준)과 이 앱의 재계산 주차를 비교해 보정이 필요한 거래처를 찾습니다. |
두 가지 질문이 자주 나옵니다. 첫째, 기존 표준 리포트를 없애야 하나 — 아닙니다. 법정·감사 대응과 원장 기준의 숫자는 표준 화면에 그대로 둡니다. 이 앱은 입금 시점 가정을 점검하는 보조 화면입니다. 둘째, 표준에 남겨 둘 일은 청산 전표 처리, 입금 확인, 대손 판단입니다. 이 앱은 조회 전용이며 어떤 전표도 만들지 않습니다.
S/4HANA 분석 스택과의 자리
S/4HANA 의 분석 쿼리와 Fiori 분석 앱은 정해진 지표를 안정적으로 보여 주는 데 강합니다. 이 앱은 그 옆에서 “거래처의 습관으로 다시 계산한 값”이라는 점검용 관점을 더하는 위치입니다. 표준 CDS 분석 뷰나 Analysis for Office 로 같은 원천을 이미 보고 있다면, 이 앱의 CDS 구성(아래)을 그 옆에 같은 방식으로 얹을 수 있습니다. 어떤 표준 분석 뷰를 재사용할 수 있는지는 시스템 버전마다 달라 확인 필요이며, 이 글은 원천 테이블 기준으로 설명합니다.
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 손대는 내용 | 비고 |
|---|---|---|
| 지급 이력 범위 | 최근 6건 · 최소 3건 규칙을 거래처 유형별로 달리 둘지 | 업종·고객군별로 다를 수 있어 파라미터로 분리하는 편이 안전합니다. |
| 분쟁 보류 표시 | 어느 필드를 분쟁 표시로 쓸지(지급 보류·참조 키·사용자 정의 필드) | 회사마다 다르므로 확인 필요. |
| 기간 기준일 | 2026-10-09 고정 대신 조회일 또는 마감일로 | 운영에서는 파라미터로 받습니다. |
| 주차 정의 | 월요일 시작 · 7일 단위 | 회사 달력을 쓰면 주차 경계가 달라집니다. |
| 점검 임계값 | 25퍼센트 · 30퍼센트 · 30일 · 표준편차 10 | 업종 특성에 맞게 회사가 정합니다. |
| 권한 | 회사 코드별 조회 권한 | DCL 로 회사 코드 단위 권한을 겁니다. |
분석 지표 정의표
| 지표 | 산식 · 판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 장부 회수액 | 미결 채권을 만기일이 속한 주차에 합산 | 주차별 회수 예측 | 고객 미결 항목 금액 · 만기 기준일 | 만기 기준일 필드명 확인 필요 |
| 재계산 회수액 | 미결 채권을 (만기일 + 반영 지연일)이 속한 주차에 합산 | 주차별 회수 예측 | 미결 항목 + 청산 항목 | 지연일 = 청산일 − 만기일 |
| 평균 지연일 · 편차 | 최근 6건 지연일의 평균 · 표준편차 | 거래처 지급행태 | 고객 청산 항목 | 3건 미만이면 미반영 |
| 주차 이동 금액 | 장부 주차 ≠ 재계산 주차인 채권 금액 합계 | 요약 · 펑션 두 개 | 명세 계산값 | - |
| 확인 필요 비중 | 재계산 회수액 중 확인 필요 코드 금액 ÷ 재계산 회수액 | 주차 상세 | 명세 계산값 | 30퍼센트 이상이면 점검 |
| 예측 오차율 개선 | 만기일 기준 오차율 − 지급행태 반영 오차율(퍼센트포인트) | 직전 4주 예측 검증 | 실적 입금 + 두 예측 | 실적 3건 미만이면 비교 보류 |
CDS 구성 — 최대한 자세히
화면이 쓰는 서비스의 원천을 S/4HANA 에서 어떻게 구성하는지 스케치입니다. 원천은 고객 미결 항목(BSID)과 고객 청산 항목(BSAD)이며, 두 테이블의 정확한 필드명과 S/4HANA 에서의 제공 방식(호환 뷰 여부)은 시스템 버전마다 달라 확인 필요로 두고 코드에 주석으로 표시했습니다. 객체 이름은 기능을 뜻하는 영문으로 새로 지었습니다.
뷰 레이어 구성
| 레이어 | 뷰 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준(매핑) | ZCollDelayRule | 지급 이력 범위(최근 N건)·최소 건수·점검 임계값을 보관 | 임계값을 코드에서 빼내 회사가 직접 정하게 합니다 |
| 차원 | ZI_CollectCustomer | 거래처 마스터(코드·이름) | 이름 조회를 한 곳에 둡니다 |
| 기본 뷰 1 | ZI_CollectOpenItem | 미결 항목에서 만기일·금액·분쟁 표시를 뽑습니다 | 장부 주차의 기준이 되는 값입니다 |
| 기본 뷰 2 | ZI_CollectPaidItem | 청산 항목에서 지연일을 계산합니다 | 지급행태의 원천입니다 |
| 큐브(집계) | ZI_CollectDelayStat | 거래처별 최근 6건 평균·편차·건수 | 채권 건수보다 훨씬 적은 거래처 단위로 줄여 조인 비용을 낮춥니다 |
| 쿼리(소비) | ZC_CollectWeekQuery | 주차별 장부·재계산 회수액을 내보냅니다 | 화면의 주차 탭이 읽는 뷰입니다 |
| 권한 | ZC_CollectWeekQuery 의 DCL | 회사 코드 단위 접근 제어 | 남의 회사 숫자가 보이지 않게 합니다 |
| 서비스 | ZUI_CollectFcst | 쿼리를 OData V2 서비스로 노출 | 화면이 부르는 서비스의 끝점입니다 |
① 규칙 테이블 — 임계값을 코드 밖으로
최근 몇 건을 쓸지, 최소 몇 건이 있어야 지연을 반영할지, 점검 임계값을 얼마로 둘지는 회사가 정할 일입니다. 코드에 박아 두면 값을 바꿀 때마다 이송이 필요하므로 작은 규칙 테이블에 둡니다. 이 앱의 샘플은 6건 · 3건 · 25퍼센트 · 30퍼센트 · 30일 · 표준편차 10 으로 시작합니다.
@EndUserText.label : '회수 예측 규칙'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
define table zcolldelayrule {
key client : abap.clnt not null;
key bukrs : bukrs not null; " 회사 코드
hist_max : abap.int1; " 지급 이력에 쓸 최근 건수 (샘플 6)
hist_min : abap.int1; " 지연 반영에 필요한 최소 건수 (샘플 3)
week_diff : abap.dec(5,2); " 장부와 재계산 차이 임계 비율 (샘플 0.25)
conf_ratio : abap.dec(5,2); " 확인 필요 비중 임계 (샘플 0.30)
delay_long : abap.int2; " 평균 지연 임계 일수 (샘플 30)
}
② 차원 — 거래처
거래처 코드와 이름만 읽는 가장 단순한 뷰입니다. 단순해도 따로 두는 까닭은, 이름 표기를 바꿀 일이 생겼을 때 한 곳만 고치면 되기 때문입니다.
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '거래처 (차원)'
@Analytics.dataCategory: #DIMENSION
define view entity ZI_CollectCustomer
as select from kna1
{
key kunnr as CustNo,
name1 as CustName
}
③ 미결 항목 기본 뷰 — 장부 주차의 근거
미결 항목에서 금액·만기일·분쟁 표시를 뽑습니다. 만기일은 기준일과 지급 조건 일수를 더해 구하는데, 어느 필드를 쓰는지(기준일·지급 조건 일수)는 시스템 설정마다 달라 확인 필요입니다. 분쟁 표시도 마찬가지입니다.
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '미결 매출채권 기본 뷰'
define view entity ZI_CollectOpenItem
as select from bsid
association [0..1] to ZI_CollectCustomer as _Cust on _Cust.CustNo = bsid.kunnr
{
key bsid.bukrs as CompanyCode,
key bsid.belnr as DocNo,
key bsid.gjahr as FiscalYear,
key bsid.buzei as ItemNo,
bsid.kunnr as CustNo,
@Semantics.amount.currencyCode: 'Currency'
case bsid.shkzg when 'H' then -bsid.dmbtr
else bsid.dmbtr end as Amount, -- 차대 구분 처리: 확인 필요
bsid.hwaer as Currency,
-- 만기일 = 기준일 + 지급 조건 일수 (필드명 확인 필요)
dats_add_days(bsid.zfbdt,
cast(bsid.zbd1t as abap.int4), 'NULL') as DueDate,
bsid.zlspr as PayBlock, -- 분쟁 표시로 쓸지는 회사별 확인 필요
_Cust
}
④ 청산 항목 기본 뷰 — 지연일의 원천
이미 입금된 항목에서 지연일(청산일 − 만기일)을 계산합니다. 이 뷰가 지급행태의 유일한 원천입니다. 청산일 필드를 입금 확인일로 볼지 청산 전표 전기일로 볼지는 회사 정책에 따라 다르므로 확인 필요입니다.
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '청산 항목 기본 뷰 (지급 이력)'
define view entity ZI_CollectPaidItem
as select from bsad
{
key bsad.bukrs as CompanyCode,
key bsad.belnr as DocNo,
key bsad.gjahr as FiscalYear,
key bsad.buzei as ItemNo,
bsad.kunnr as CustNo,
bsad.augdt as PaidDate, -- 청산일: 확인 필요
dats_add_days(bsad.zfbdt, cast(bsad.zbd1t as abap.int4), 'NULL') as DueDate,
dats_days_between(
dats_add_days(bsad.zfbdt, cast(bsad.zbd1t as abap.int4), 'NULL'),
bsad.augdt) as DelayDays
}
⑤ 지급행태 집계 뷰 — 거래처별 최근 6건
이 앱에서 가장 중요한 뷰입니다. 거래처마다 최근 6건을 골라 평균과 표준편차, 건수를 구합니다. 최근 N건 선택은 윈도 함수가 아니라 행 번호로 처리하는 방식이 이식성이 높습니다. 아래는 개념을 보이는 스케치이며, 실제로는 행 번호용 보조 뷰가 한 단계 더 필요합니다.
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '거래처 지급행태 (최근 6건)'
@Analytics.dataCategory: #CUBE
define view entity ZI_CollectDelayStat
as select from ZI_CollectPaidRanked as r -- 거래처별 청산일 내림차순 행 번호 부여 뷰
{
key r.CompanyCode,
key r.CustNo,
count(*) as HistCnt,
avg(r.DelayDays as abap.dec(9,1)) as AvgDelay,
-- 표준편차는 시스템 버전에 따라 제공 방식이 달라 확인 필요
case when count(*) >= 3
then cast(round(avg(r.DelayDays as abap.dec(9,1)), 0) as abap.int4)
else 0 end as ApplyDelay
}
where r.RowNo <= 6
group by r.CompanyCode, r.CustNo
⑥ 주차 쿼리 — 장부와 재계산을 한 행에
미결 항목과 지급행태 집계를 거래처로 붙여 장부 주차와 재계산 주차를 각각 구하고, 주차별로 합산합니다. 주차 경계는 기준일에서 7일 단위이고 8주 밖은 “00” 입니다. 기준일은 파라미터로 받습니다.
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '주차별 회수 예측 쿼리'
@Metadata.allowExtensions: true
define view entity ZC_CollectWeekQuery
with parameters p_baseDate : abap.dats
as select from ZI_CollectOpenItem as o
left outer join ZI_CollectDelayStat as s
on s.CompanyCode = o.CompanyCode
and s.CustNo = o.CustNo
{
key o.CompanyCode,
key cast(
case when dats_days_between($parameters.p_baseDate, o.DueDate) < 0 then '01'
when dats_days_between($parameters.p_baseDate, o.DueDate) >= 56 then '00'
else lpad(cast(div(dats_days_between($parameters.p_baseDate, o.DueDate), 7) + 1 as abap.char(2)), 2, '0')
end as abap.char(2)) as WeekBook,
sum(o.Amount) as BookAmt
-- 재계산 주차(만기일 + s.ApplyDelay)도 같은 방식으로 한 열 더 만들어 합산합니다
}
group by o.CompanyCode
⑦ 권한(DCL)과 서비스
회사 코드 단위로 접근을 제어합니다. 집계 쿼리에서는 권한을 집계 전에 거는 것이 중요합니다. 집계 뒤에 걸면 합계에서 뺄셈으로 다른 회사의 숫자가 드러납니다.
@MappingRole: true
define role ZC_CollectWeekQuery {
grant select on ZC_CollectWeekQuery
where CompanyCode = aspect pfcg_auth(F_BKPF_BUK, BUKRS, ACTVT = '03');
}
define service ZUI_CollectFcst {
expose ZC_CollectWeekQuery as WeekSet;
expose ZI_CollectDelayStat as CustSet;
}
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다. 아래는 도입할 때 합의가 필요한 항목입니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 원천 필드 확정 | 만기일 기준(기준일 · 지급 조건 일수), 청산일 의미, 차대 구분 처리 | 장부 주차가 표준 화면 숫자와 어긋나 첫 대사에서 막힙니다 | 회계팀 · 자금팀 |
| 분쟁 보류 표시 | 어느 필드를 분쟁으로 볼지 | 확인 필요 건이 실제와 달라집니다 | 채권관리팀 |
| 지급 이력 규칙 | 최근 건수 · 최소 건수 · 특수 거래처 제외 | 이력이 적은 거래처가 예측을 흔듭니다 | 자금팀 |
| 점검 임계값 | 25퍼센트 · 30퍼센트 · 30일 · 표준편차 10 | 점검 필요가 너무 많거나 적어집니다 | 자금팀 |
| 기준일 | 조회일 · 마감일 · 지정일 | 주차 경계가 사람마다 달라집니다 | 자금팀 |
| 권한 설계 | 회사 코드 단위 조회 권한 | 다른 회사의 채권이 보입니다 | 보안 · 권한 |
| 대사 체계 | 고객 잔액 · 현금 포지션과 맞출 항목 | 숫자를 서로 믿지 못합니다 | 회계팀 |
| 전송(TR) 순서 | 규칙 테이블 → 기본 뷰 → 집계 뷰 → 쿼리 → DCL → 서비스 | 활성화에 실패해 서비스가 열리지 않습니다 | 개발 · Basis |
| 서비스 활성화 | 서비스 게시 · 화면 설정의 서비스 주소 교체 | 화면이 샘플 데이터를 계속 읽습니다 | Basis · 개발 |
운영 데이터로 갈 때
미결 채권은 수만 건, 청산 항목은 수백만 건이 될 수 있습니다. 가장 먼저 느려지는 곳은 청산 항목에서 거래처별 최근 6건을 고르는 자리입니다. 거래처 단위로 줄인 집계 뷰를 미리 구체화하거나 야간 배치로 갱신하고, 쿼리에는 기준일과 회사 코드를 필수 파라미터로 둡니다. 청산일 필드에 인덱스가 있는지 확인하고, 응답 시간 기준은 도입 전에 정해 두는 편이 안전합니다. 정확한 수치는 운영 환경 측정 후에 정할 일이라 이 글은 수치를 약속하지 않습니다.
자주 묻는 질문
도입 상담과 검증에서 나올 만한 질문을 네 묶음으로 정리했습니다.
숫자와 산식
예상 입금일은 어떻게 구합니까?
만기일에 그 거래처의 반영 지연일을 더합니다. 반영 지연일은 거래처의 최근 6건 지급 이력에서 지연일(실제 입금일 − 만기일)을 평균 낸 뒤 반올림한 값입니다. 지급 이력이 3건 미만이면 지연을 반영하지 않고 만기일을 그대로 씁니다.
예상 입금일이 기준일(2026-10-09)보다 앞서 있는데 아직 입금되지 않았다면 1주차로 이월해 둡니다. 이미 지났는데도 안 들어온 돈을 더 먼 주에 두는 것은 근거가 없기 때문이며, 이 건은 “확인 필요”로 표시합니다.
장부 회수액과 재계산 회수액은 무엇이 다릅니까?
장부는 만기일이 속한 주차에 미결 금액을 모은 값이고, 재계산은 예상 입금일이 속한 주차에 모은 값입니다. 같은 124건의 같은 금액을 어느 주에 놓느냐만 다르므로 총액은 같고 주차별 배분만 달라집니다. 화면이 대사식으로 이 사실(주차 이동 금액 합계 0)을 매번 검산합니다.
기간 밖(00) 금액은 왜 따로 둡니까?
기준일부터 8주 안에 들어오지 않는 채권은 주차 표에 담을 수 없습니다. 이 금액을 버리면 합계가 맞지 않으므로 “00” 행으로 모아 합계에 포함시키되 8주 누적에서는 뺍니다. 재계산 결과 기간 밖으로 밀리는 채권은 점검 필요로 올려 따로 확인하게 합니다.
평균 지연일이 같은데 점검 결과가 다른 거래처가 있습니다.
평균 지연일 하나로 판정하지 않기 때문입니다. 평균이 30일 이상이면 점검 필요, 편차(표준편차)가 10 이상이어도 점검 필요, 이력이 3건 미만이면 확인 필요입니다. 평균이 같아도 편차가 크면 주차 예측이 흔들릴 수 있어 따로 봅니다.
금액 단위는 무엇입니까?
화면과 서비스 모두 원 단위로 계산하고 요약 숫자만 백만 원 단위로 줄여 보여 줍니다. 대사식은 원 단위 합계로 검산합니다.
화면과 조작
조회는 어떻게 합니까?
회계연도(필수)를 입력하고 조회 버튼을 누르거나 회계연도 칸에서 Enter 키를 누릅니다. 거래처 칸에 이름 일부를 넣고 Enter 를 눌러도 같은 조건으로 조회됩니다. 자동 조회는 없습니다.
회사를 비워 두면 무엇이 조회됩니까?
회사 선택에서 “전체”를 두면 회사 조건을 걸지 않아 모든 회사를 보여 줍니다. 서비스에 전체를 뜻하는 코드값을 보내는 것이 아니라 조건 자체를 빼는 방식입니다.
주차 행을 누르면 무엇이 열립니까?
그 주차에 입금될 것으로 재계산된 미결 채권 목록이 열립니다. 장부와 재계산 금액의 차이, 확인 필요 비중, 주차 이동 건수, 점검 내용을 함께 보여 줍니다.
CSV 는 어느 탭의 결과입니까?
지금 보고 있는 탭의 조회 결과입니다. 조건을 바꾸지 않고 탭을 옮겨 CSV 를 받으면 각 탭의 내용이 따로 내려옵니다.
서비스에 연결하지 못하면 어떻게 됩니까?
화면 위에 “서비스 연결 안내” 메시지가 한 번 뜨고, 표는 비어 있습니다. 서비스 정의를 불러오지 못한 경우와 요청이 실패한 경우를 구분해 알려 줍니다.
분석과 점검
직전 4주 예측 검증은 무엇을 보는 것입니까?
직전 4주마다 실제로 입금된 금액과, 그 시점에 만기일 기준으로 잡았을 예측, 지급행태를 반영해 잡았을 예측을 비교합니다. 오차율은 |실적 − 예측| ÷ 실적이고, 개선은 두 오차율의 차이(퍼센트포인트)입니다. 이번 샘플에서는 8개 가운데 6개에서 지급행태를 반영한 쪽이 더 가까웠습니다.
지급행태 반영이 더 나쁜 주차는 어떻게 읽습니까?
샘플에서는 2개 주차가 그렇습니다. 이 화면은 이를 감추지 않고 “점검 필요”로 올립니다. 그 주의 입금 건수가 적었는지, 한두 건의 큰 금액이 흔들었는지를 확인하는 출발점이며, 지급행태 반영 방식이 틀렸다는 결론은 아닙니다.
실적 입금이 3건 미만인 주는 왜 비교하지 않습니까?
표본이 너무 적으면 오차율이 우연에 크게 좌우되기 때문입니다. 이 경우 비교를 보류하고 “확인 필요”로 둡니다.
분쟁 보류 채권은 어떻게 다룹니까?
분쟁 보류 표시가 있는 채권은 회수 시점의 근거를 회사가 먼저 확인해야 하므로 “확인 필요”로 표시합니다. 금액은 계산에 포함하되 확인 필요 비중과 거래처의 분쟁 보류 금액에 따로 집계합니다.
이 화면의 판정을 그대로 믿어도 됩니까?
이 화면은 점검 도구이며 최종 판단은 회사와 감사인이 합니다. “점검 필요”는 살펴볼 대상, “확인 필요”는 근거를 먼저 확인할 대상이라는 뜻일 뿐 어느 쪽도 결론이 아닙니다. 회수 가능성이나 대손 판단은 이 화면의 범위가 아닙니다.
도입과 운영
어떤 사용자에게 도움이 됩니까?
매주 자금 계획을 세우는 자금 담당자와, 채권 회수 현황을 점검하는 채권관리·회계 담당자입니다. 엑셀로 거래처별 평균 지연을 계산하던 시간을 줄이고, 주차가 달라지는 채권을 바로 찾는 데 쓰입니다.
언제부터 어느 범위에 적용할 수 있습니까?
확인된 사실은 검증용 샘플 데이터에서 화면과 서비스, 대사가 동작한다는 것입니다. 실제 시스템에 연결한 결과는 아직 없으며, 원천 필드 확인과 대사를 거친 뒤에 적용 범위를 정해야 합니다.
표준 T-code 와는 어떤 관계입니까?
표준 실행은 SAP 표준 T-code 가 담당합니다. 미결·청산 원천은 FBL5N 과 FD10N 으로 대조하고, 주차별 회수액은 FF7A·FF7B 의 입금 가정과 비교합니다. 이 화면은 입금 시점 가정을 점검하는 확장 화면입니다.
운영 시스템과 연결하는 데 무엇이 필요합니까?
원천 필드(만기일 기준, 청산일, 분쟁 표시) 확정, 기본 뷰·집계 뷰·쿼리·권한·서비스의 활성화, 화면 설정의 서비스 주소 교체입니다. 규모와 시스템 상태에 따라 기간이 달라 이 글은 일정을 약속하지 않습니다.
권한과 보안은 어떻게 합니까?
회사 코드 단위 조회 권한을 집계 단계에서 거는 것이 원칙입니다. 이 화면은 조회 전용이라 전표를 만들거나 바꾸지 않습니다. 외부 라이브러리나 외부 전송이 없어 사내망에서도 열립니다.
데이터가 많아지면 느려지지 않습니까?
청산 항목에서 거래처별 최근 6건을 고르는 단계가 먼저 무거워집니다. 거래처 단위 집계를 미리 만들어 두고 기준일·회사 코드를 필수 조건으로 두는 방식을 권합니다. 실제 응답 시간은 운영 환경에서 측정해야 합니다.
거래처가 늘거나 계정 체계가 바뀌면 어떻게 합니까?
거래처는 원천에서 자동으로 따라오므로 별도 작업이 없습니다. 지급 이력 규칙이나 임계값을 바꾸고 싶다면 규칙 테이블의 값만 고치면 됩니다.
현금 포지션 예측을 대체합니까?
아닙니다. 예측 자체는 표준 화면이 담당하고, 이 화면은 그 예측에 들어가는 매출채권 입금 시점 가정이 지난 실적에 비추어 합리적인지 점검합니다.