SAP 매입채무 연령분석 — 지급이 늦어진 건을 구간으로 가르기
벤더별 미결 채무를 순지급기일 대비 연체일수로 재계산해 여섯 구간으로 집계하고, 전표 차대 상세까지 내려가는 자금 지원 화면입니다.
받을 돈만 늦는 게 아닙니다. 줄 돈도 늦습니다. 다만 이쪽은 늦는 이유가 대개 우리 쪽 사정이라 성격이 다릅니다.
자금이 부족했거나, 송장 검증이 막혔거나, 승인이 안 났거나입니다. 어느 쪽이든 구간별로 얼마가 밀렸는지 알아야 자금 계획을 세울 수 있습니다. SAP 표준 미결항목 구조를 그대로 이어받아 순지급기일 기준으로 여섯 구간에 집계하도록 OpenUI5 화면으로 확장한 것이 이 앱입니다. 실제 구동 화면 3종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 미결항목 — 벤더별 채무 전표(
DocNo)와 금액을 표준 구조 그대로 - 지급조건 — 결제 일수(
PaymentTermsDays)와 텍스트로 순지급기일 산출 - 환산 — 거래통화 금액(
Amount)과 원화환산(AmountKRW), 환율(ExchRate) - 계정 — 매입채무 조정계정(
GlAccount)과 명칭 - 발주 연계 — 구매발주 참조(
PoRef)로 물류 문서와 연결
| 항목 | 내용 |
|---|---|
| 대응 T-code | FBL1N · S_ALR_87012078 |
| 업무 영역 | 재무회계(FI-AP) · 자금 · 결산 지원 |
| Namespace | zui5.apaging |
| 셸 구조 | 조회조건 영역(우측 조회·초기화) + 연령 집계, 행 선택 시 전표 차대 상세 |
| 화면 수 | 조회 화면 1개 + 전기 상세 |
| 데이터 | 미결 채무 88건 · 전기 라인 176건 |
| 성격 | 조회형(Read-Only) — 전기와 지급은 표준 트랜잭션이 담당 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 3종 둘러보기
회사코드·벤더·통화·기준일로 조회하면 구간별 채무가 집계됩니다 → 연체 구간에 몰린 벤더를 먼저 보고 → 행을 눌러 전표의 차대 상세와 발주 참조를 확인합니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회사코드와 기준일을 넣습니다. 연체일수는 이 날짜 기준으로 재계산됩니다.
- 벤더와 통화로 좁힙니다. 외화 채무는 별도로 보는 것이 자금 계획에 편합니다.
- 연령구간으로 특정 구간만 추릴 수 있습니다.
- 조회조건 입력필드에서 값을 바꾸거나 Enter 를 누르면 즉시 조회됩니다.
- 미도래 구간 금액으로 다가올 지급을, 연체 구간으로 밀린 지급을 파악합니다.
- 행을 선택하면 전표 차대 상세가 열립니다. 발주 참조로 물류 문서까지 이어집니다.
- 결과는 CSV 다운로드로 내려받습니다.
연체일수와 구간 판정
순지급기일을 기준으로 삼는 것이 핵심입니다. 송장일이 아니라 실제로 줘야 하는 날입니다.
순지급기일(DueDate) = 전기일 + 지급조건 일수(PaymentTermsDays)
연체일수(DaysOverdue) = 기준일 − 순지급기일
연체일수 ≤ 0 → 미도래
1~30 / 31~60 / 61~90 / 91~180 / 180일 초과 → 구간 분류
구간을 여섯으로 나눈 이유
채권은 회수 가능성이 관심사라 네 구간이면 충분합니다. 채무는 다릅니다. 30일 단위로 나눠야 이번 달·다음 달 지급 계획이 나오고, 180일을 넘긴 건은 거래 분쟁이나 검증 오류처럼 자금이 아닌 다른 문제일 가능성이 커 따로 봐야 합니다.
채무가 밀리는 네 가지 이유
| 이유 | 상황 | 다음 조치 |
|---|---|---|
| 자금 부족 | 지급 여력이 없음 | 자금 계획 조정 |
| 송장 검증 미완 | 수량·단가 불일치로 막힘 | 구매·검수와 대사 |
| 승인 지연 | 지급 승인이 진행 중 | 승인 절차 확인 |
| 거래 분쟁 | 금액이나 품질 이견 | 분쟁 해소 후 지급 |
180일을 넘긴 건은 대개 앞의 두 가지가 아니라 뒤의 두 가지입니다.
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
회사코드 Bukrs | 필수 | 대상 회사코드 |
기준일 KeyDate | 필수 | 연체일수 계산 기준일 |
벤더 Lifnr | 선택 | 공급업체 코드·명칭 |
통화 Currency | 선택 | 통화별 조회 |
연령구간 AgingBucket | 선택 | 미도래 / 1~30 / 31~60 / 61~90 / 91~180 / 180일 초과 |
계정 GlAccount | 선택 | 매입채무 계정 범위 |
결과 컬럼
| 컬럼 | 의미 · 표시 |
|---|---|
전표번호 DocNo | 채무 전표 |
벤더 Lifnr · LifnrName | 코드와 명칭 |
금액 Amount · 원화 AmountKRW · 환율 ExchRate | 거래통화와 원화환산 |
전기일 PostingDate | 채무 인식일 |
순지급기일 DueDate | 전기일 + 지급조건 일수 |
지급조건 PaymentTermsDays · PaymentTermsText | 결제 조건과 일수 |
연체일수 DaysOverdue | 기준일 − 순지급기일 |
연령구간 AgingBucket · AgingBucketText | 여섯 구간 분류. 상태 색 |
계정 GlAccount · GlAccountText | 매입채무 조정계정 |
발주 참조 PoRef | 구매발주 번호 |
담당 Responsible | 구매 담당자 |
SAP 표준 기능 매핑
| 표준 | 역할 | 이 화면에서의 확장 |
|---|---|---|
FBL1N | 공급업체 개별항목 조회 | 순지급기일 기준 연체일수를 재계산해 구간 집계 |
S_ALR_87012078 | Due Date Analysis | 전표 차대 상세와 발주 참조까지 한 화면에서 |
BSIK | 공급업체 미결 항목 | 분석 원천 |
BSEG · BKPF | 전표 라인과 헤더 | 차대 상세 |
LFA1 | 공급업체 마스터 | 벤더 명칭 |
EKKO | 구매발주 헤더 | 발주 참조 연결 |
도입 시 확인이 필요한 부분
순지급기일 산출이 관건입니다. 지급조건이 월말 기준인지 송장일 기준인지에 따라 같은 전표도 기일이 달라집니다. 또 현금할인 조건이 있으면 할인 기한과 순지급기일이 따로 있어, 어느 쪽을 연체 기준으로 볼지 정해야 합니다.
참고 CDS 뷰
@AbapCatalog.sqlViewName: 'ZCAPAGING'
@EndUserText.label: '매입채무 연령분석 (Z)'
define view Z_C_AP_AGING
with parameters p_keydate : dats
as select from bsik as Item
inner join lfa1 as Vendor on Item.lifnr = Vendor.lifnr
left outer join skat as AcctText on Item.hkont = AcctText.saknr
and AcctText.spras = 'K'
{
key Item.bukrs, key Item.belnr, key Item.gjahr, key Item.buzei,
Item.lifnr, Vendor.name1 as LifnrName,
Item.budat as PostingDate,
Item.zfbdt as DueDate,
Item.zterm as PaymentTerms,
Item.waers as Currency,
Item.wrbtr as Amount,
Item.dmbtr as AmountKRW,
Item.hkont as GlAccount,
AcctText.txt50 as GlAccountText,
Item.ebeln as PoRef,
dats_days_between( Item.zfbdt, :p_keydate ) as DaysOverdue,
case when dats_days_between( Item.zfbdt, :p_keydate ) <= 0 then 'NOTDUE'
when dats_days_between( Item.zfbdt, :p_keydate ) <= 30 then 'D1_30'
when dats_days_between( Item.zfbdt, :p_keydate ) <= 60 then 'D31_60'
when dats_days_between( Item.zfbdt, :p_keydate ) <= 90 then 'D61_90'
when dats_days_between( Item.zfbdt, :p_keydate ) <= 180 then 'D91_180'
else 'D180P' end as AgingBucket
}
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경 설정과 릴리즈에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 영역 · 연령 집계 테이블 |
| 조회조건 | sap.m.Select · sap.m.DatePicker · sap.m.Input — 우측 끝에 조회·초기화 |
| 이벤트 | 모든 버튼이 onPAI 단일 진입점, fcCode 로 분기 |
| 집계 테이블 | sap.m.Table — 금액 우측정렬, popin 반응형 |
| 구간 표시 | sap.m.ObjectStatus — 여섯 구간별 상태 색 |
| 상세 화면 | sap.m.Dialog — 전표 차대 라인 |
차대 상세까지 붙인 이유
채무가 밀린 이유를 찾으려면 어느 계정으로 잡혔는지 봐야 할 때가 있습니다. GR/IR 계정에 걸려 있으면 송장 검증 문제이고, 매입채무 계정이면 자금 문제입니다. 전표 라인을 같은 화면에서 펼치면 그 구분이 바로 됩니다.
파일 구성
| 경로 | 역할 |
|---|---|
manifest.json | 앱 디스크립터 — 앱 ID(zui5.apaging) · ko 로케일 |
view/Main.view.xml | 조회조건과 연령 집계 테이블 |
controller/Main.controller.js | 조회 · 연체일수 재계산 · 구간 분류 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) |
js/formatter.js | 금액 · 일자 · 구간 상태 색 포맷터 |
localdata/apaging.json | 미결 채무 88건 |
localdata/postingdata.json | 전기 라인 176건 |
검증 결과
| 검증 항목 | 결과 |
|---|---|
| 연체일수 = 기준일 − 순지급기일 (전 건 재계산) | 통과 |
| 구간 분류가 연체일수와 정합 | 통과 |
| 원화환산 = 거래통화금액 × 환율 | 통과 |
| 전표별 차변 합계 = 대변 합계 | 통과 |
| 계정·벤더 코드가 있으면 명칭도 존재 | 통과 |
| XML · JSON 전체 파싱 | 오류 0건 |
| 화면 렌더링 — 실브라우저 조회 → 상세 실동작 후 캡처 | 3/3 |
| 테마 런타임 확인 | sap_horizon |
자주 묻는 질문
왜 순지급기일을 다시 계산하나요?
전표에 들어 있는 기일이 지급조건과 어긋나는 경우가 있습니다. 전기일과 지급조건 일수로 다시 계산하면 기준이 통일돼 벤더 간 비교가 가능해집니다.
현금할인 기한과 순지급기일 중 무엇이 기준인가요?
연체 판정은 순지급기일이 기준입니다. 할인 기한은 놓쳐도 연체가 아니라 할인 상실이므로 성격이 다릅니다. 할인 실현 여부는 별도 화면에서 봅니다.
미도래 구간은 왜 보나요?
앞으로 나갈 돈이기 때문입니다. 연체만 보면 이번 달 자금 계획을 세울 수 없습니다. 미도래 금액이 다음 달 지급 예정액이 됩니다.
SAP 표준 기능과 어떻게 이어지나요?
미결 채무는 표준 전기가 만들고 FBL1N 으로 조회할 수 있습니다. 이 화면은 순지급기일 기준으로 연체일수를 다시 계산해 여섯 구간으로 집계하고, 전표 차대 상세와 발주 참조까지 같은 화면에서 잇는 확장입니다.