SAP 송장검증 현황 조회 — 지급이 막힌 이유를 문서마다 밝히기
구매 송장의 수량 차이와 가격 차이를 계산해 지급차단 사유를 가려내고, 문서별 예상 회계처리까지 확인하는 화면입니다.
송장이 막히면 지급이 멈추고, 지급이 멈추면 벤더에서 전화가 옵니다. 그런데 왜 막혔는지는 문서를 하나씩 열어 봐야 알 수 있습니다.
막히는 이유는 대개 둘입니다. 수량이 안 맞거나 단가가 안 맞거나. 표준 송장검증 구조를 그대로 이어받아 두 차이를 계산해 차단 사유와 함께 보여 주고, 예상 회계처리까지 미리 확인하도록 OpenUI5 화면으로 확장한 것이 이 앱입니다. 실제 구동 화면 3종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 송장 문서 — 송장번호(
InvoiceDocNo) · 회계연도 · 전기일 · 증빙일 - 구매오더 연계 — 발주번호(
PoNumber)로 입고 실적과 대조 - 차단 정보 — 차단 사유(
BlockReason)와 지급차단 표시(PaymentBlock) - 수량 · 금액 — 입고수량(
GrQty) · 송장수량(InvoiceQty) · 송장금액(InvoiceAmount) - 공급업체 — 벤더 코드와 명칭
| 항목 | 내용 |
|---|---|
| 대응 T-code | MIR6 (송장 개요) · MIR5 |
| 업무 영역 | 재무회계(FI-AP) · 구매(MM) 연계 · 결산 |
| Namespace | zui5.invverif |
| 셸 구조 | 조회조건 영역(우측 조회·초기화) + 송장 목록, 행 선택 시 품목과 예상 회계처리 |
| 화면 수 | 조회 화면 1개 + 문서 상세 |
| 데이터 | 송장 헤더 24건 · 품목 29건 · 전기 라인 53건 |
| 성격 | 조회형(Read-Only) — 송장 등록과 차단 해제는 표준이 담당 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 3종 둘러보기
회사코드·기간·공급업체·상태로 조회하면 송장이 차단 사유와 함께 나옵니다 → 수량 차이와 가격 차이를 나눠 보고 → 행을 눌러 품목 내역과 예상 회계처리를 확인합니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회사코드와 기간을 넣습니다. 월 단위로 보는 것이 일반적입니다.
- 공급업체와 상태로 좁힙니다. 차단 문서만 보려면 상태를 차단으로 고릅니다.
- 조회조건 입력필드에서 값을 바꾸거나 Enter 를 누르면 즉시 조회됩니다.
- 수량차이가 있는 건과 가격차이만 있는 건을 나눠 봅니다.
- 차단사유로 어떤 검증에 걸렸는지 확인합니다.
- 행을 선택하면 품목 내역과 예상 회계처리가 열립니다.
- 결과는 CSV 다운로드로 내려받습니다.
차단 판정 규칙
검증은 두 가지 허용 범위를 넘었는지 보는 일입니다.
수량 차이 = 송장 수량(InvoiceQty) − 입고 수량(GrQty)
가격 차이 = 송장 단가 − 발주 단가 → 금액으로 환산
허용 범위 안 → 차단 없음, 지급 가능
수량 차이 초과 → 수량 차단 — 입고 확인 필요
가격 차이 초과 → 가격 차단 — 구매 조건 확인 필요
지급차단 표시 있음 → 수동 차단 — 사유 확인 후 해제
예상 회계처리를 함께 보는 이유
차단을 풀지 말지 판단하려면 풀었을 때 어떤 분개가 생기는지 알아야 합니다. 가격 차이가 구매가격차이 계정으로 갈지 재고로 갈지에 따라 손익 영향이 달라지기 때문입니다. 분개를 미리 보여 주면 차단 해제 결정이 근거를 갖습니다.
송장이 차단되는 네 가지 이유
| 이유 | 상황 | 다음 조치 |
|---|---|---|
| 수량 초과 청구 | 입고보다 많은 수량을 청구 | 입고 누락인지 과다 청구인지 확인 |
| 단가 불일치 | 발주 단가와 다른 단가로 청구 | 계약·가격 조건 확인 |
| 입고 미완 | 입고 전에 송장이 먼저 도착 | 입고 등록 후 자동 해제 |
| 수동 차단 | 담당자가 직접 차단 설정 | 사유 확인 후 해제 |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
회사코드 Bukrs | 필수 | 대상 회사코드 |
기간 PostingDate | 필수 | 전기일 From~To 또는 회계월 |
공급업체 Lifnr | 선택 | 벤더 코드·명칭 |
| 상태 | 선택 | 전체 / 차단만 / 정상만 |
발주번호 PoNumber | 선택 | 특정 발주 건 |
결과 컬럼
| 컬럼 | 의미 · 표시 |
|---|---|
송장번호 InvoiceDocNo · 회계연도 | 송장 문서 키 |
공급업체 Lifnr · LifnrName | 벤더 코드와 명칭 |
전기일 PostingDate · 증빙일 DocDate | 날짜 정보 |
발주번호 PoNumber | 연계 구매오더 |
송장금액 InvoiceAmount · 통화 Currency | 청구 금액 |
입고수량 GrQty · 송장수량 InvoiceQty · 단위 Unit | 수량 대조 |
수량차이 QtyVariance | 송장 − 입고 |
가격차이 PriceVarianceAmount | 단가 차이의 금액 환산 |
차단사유 BlockReason · BlockReasonText | 검증 차단 사유 |
지급차단 PaymentBlock | 지급 차단 표시. 상태 색 |
SAP 표준 기능 매핑
| 표준 | 역할 | 이 화면에서의 확장 |
|---|---|---|
MIR6 | 송장 개요 | 차이와 차단 사유를 계산해 열로 추가 |
MIRO | 송장 등록 | 등록 결과를 검증 관점으로 재구성 |
RBKP · RSEG | 송장 헤더 · 품목 | 조회 원천 |
EKKO · EKPO | 구매오더 헤더 · 품목 | 발주 단가·수량 비교 기준 |
EKBE | 구매오더 이력 | 입고 실적 |
LFA1 | 공급업체 마스터 | 벤더 명칭 |
도입 시 확인이 필요한 부분
허용 오차(Tolerance) 설정이 회사마다 다릅니다. 수량 1% 이내는 통과, 금액 1만원 이내는 통과처럼 한도가 정의돼 있어, 화면의 차이 표시와 실제 차단 판정이 어긋나지 않으려면 그 설정을 읽어야 합니다.
참고 CDS 뷰
@AbapCatalog.sqlViewName: 'ZCINVVERIF'
@EndUserText.label: '송장검증 현황 (Z)'
define view Z_C_INVOICE_VERIFICATION
as select from rbkp as Header
inner join rseg as Item on Header.belnr = Item.belnr
and Header.gjahr = Item.gjahr
left outer join lfa1 as Vendor on Header.lifnr = Vendor.lifnr
left outer join ekpo as PoItem on Item.ebeln = PoItem.ebeln
and Item.ebelp = PoItem.ebelp
{
key Header.belnr as InvoiceDocNo,
key Header.gjahr as FiscalYear,
Header.bukrs, Header.lifnr, Vendor.name1 as LifnrName,
Header.budat as PostingDate,
Header.bldat as DocDate,
Header.rmwwr as InvoiceAmount,
Header.waers as Currency,
Item.ebeln as PoNumber,
Item.menge as InvoiceQty,
PoItem.menge as PoQty,
Header.zlspr as PaymentBlock
// 수량차이·가격차이와 차단 사유는 입고 이력(EKBE)·허용오차 설정과
// 대조하는 소비 뷰에서 계산
}
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경 설정과 릴리즈에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 영역 · 송장 테이블 |
| 조회조건 | sap.m.Select · sap.m.DatePicker · sap.m.Input — 우측 끝에 조회·초기화 |
| 이벤트 | 모든 버튼이 onPAI 단일 진입점, fcCode 로 분기 |
| 송장 테이블 | sap.m.Table — 수량·금액 열 인접 배치 |
| 차단 표시 | sap.m.ObjectStatus — 차단 사유별 상태 색 |
| 상세 화면 | sap.m.Dialog — 품목과 예상 회계처리 |
차대일치를 상세에 넣은 이유
예상 회계처리를 보여 주면서 차대가 맞는지 확인하지 않으면, 화면에서 본 분개와 실제 전기가 달라질 수 있습니다. 상세 화면에서 차변 합계와 대변 합계를 함께 표시하면 그 자리에서 검증이 끝납니다.
파일 구성
| 경로 | 역할 |
|---|---|
manifest.json | 앱 디스크립터 — 앱 ID(zui5.invverif) · ko 로케일 |
view/Main.view.xml | 조회조건과 송장 테이블 |
controller/Main.controller.js | 조회 · 차이 계산 · 분개 구성 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) |
js/formatter.js | 금액 · 수량 · 차단 상태 포맷터 |
localdata/invheader.json | 송장 헤더 24건 |
localdata/invitems.json | 송장 품목 29건 |
localdata/postingdata.json | 전기 라인 53건 |
검증 결과
| 검증 항목 | 결과 |
|---|---|
| 수량차이 = 송장수량 − 입고수량 (전 건) | 통과 |
| 차단 건은 차단 사유 텍스트 존재 | 통과 |
| 예상 회계처리 차변 합계 = 대변 합계 | 통과 |
| 송장 헤더 금액 = 품목 금액 합계 | 통과 |
| 벤더 코드가 있으면 명칭도 존재 | 통과 |
| XML · JSON 전체 파싱 | 오류 0건 |
| 화면 렌더링 — 실브라우저 조회 → 상세 실동작 후 캡처 | 3/3 |
| 테마 런타임 확인 | sap_horizon |
자주 묻는 질문
허용 오차는 어디서 정하나요?
구매 설정의 허용 오차 키에 수량·금액·비율 한도가 정의돼 있습니다. 회사와 자재 유형에 따라 다르므로 화면의 차이 표시가 실제 차단 판정과 같으려면 그 설정을 참조해야 합니다.
입고 전에 송장이 먼저 오면 어떻게 되나요?
수량 차이로 차단됩니다. 입고가 등록되면 차이가 해소돼 자동으로 풀리는 것이 보통이므로, 이런 건은 입고 예정일을 확인하고 기다리면 됩니다.
가격 차이는 어디로 가나요?
설정에 따라 구매가격차이 계정으로 가거나 재고 가액에 반영됩니다. 표준원가를 쓰는지 이동평균을 쓰는지에 따라 갈리며, 예상 회계처리에서 그 결과를 미리 확인할 수 있습니다.
SAP 표준 기능과 어떻게 이어지나요?
송장 등록과 차단은 MIRO·MIR6 가 담당하고 데이터는 표준 송장 구조에 남습니다. 이 화면은 그 문서에 입고 실적과 발주 조건을 대조해 차이를 계산하고, 차단 사유와 예상 분개를 함께 보여 주는 확장입니다.