SAP 구매송장 지급차단 해제 현황 — 왜 이 송장은 아직 안 풀렸을까
가격이 틀렸는지, 수량이 안 맞는지, 날짜가 지났는지. 차단된 송장을 사유별로 모아 경과일수까지 한눈에 보여주는 화면입니다.
구매송장이 지급되지 않고 멈춰 있으면, 담당자는 "왜 안 나갔지"부터 확인해야 합니다. 이유는 대개 셋 중 하나입니다. 발주보다 비싸게 청구됐거나, 들어온 것보다 많이 청구됐거나, 발주 유효기간이 지난 뒤 뒤늦게 들어왔거나. 여기에 내부통제용 임의검사 대상까지 섞이면 차단된 송장 목록을 사유별로 나눠 보지 않고서는 무엇부터 처리해야 할지 가늠하기 어렵습니다.
SAP 표준 송장검증(MIRO)과 지급차단 해제(MRBR) 데이터 구조를 그대로 이어받아, 차단된 송장을 회사코드·구매조직·구매처·차단사유·경과일수로 조회하고 발주·입고 대비 산출근거까지 드릴다운하도록 OpenUI5 화면으로 확장한 것이 이번 화면입니다. 실제 구동 화면 4종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 송장 원천 — 헤더(
RBKP)와 항목(RSEG) 구조를 그대로 사용 - 차단 판정 기준 — 가격·수량·일자차이 3자 대사(발주
EKPO· 입고EKBE) - 대상 T-code — 지급차단 해제(
MRBR), 송장 표시(MIR4/MIR6) - 텍스트 — 구매조직(
T024E) · 회사코드(T001) · 거래처(LFA1)
| 항목 | 내용 |
|---|---|
| 업무 영역 | 구매관리(MM) · 송장검증 · 지급차단 해제 |
| Namespace | zui5.invblock |
| 셸 구조 | 조회조건 영역(우측 조회) + 차단 송장 그리드(sap.ui.table.Table), 상세 Dialog |
| 화면 수 | 조회 화면 1개 + 상세보기 다이얼로그 |
| 대응 T-code | MRBR(지급차단 송장 해제) · MIR4/MIR6(송장 표시) 참고 |
| 성격 | 조회·검토형 — 차단 해제 실행은 표준 트랜잭션이 담당 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 4종 둘러보기
회사코드·구매처·차단사유 조건을 넣고 조회하면 차단 송장이 목록으로 뜹니다 → 구매처로 좁혀 재조회하고 → 행을 열어 발주·입고 대비 산출근거를 확인합니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회사코드·구매조직·구매처·차단사유·전기일(~까지)·경과일수 조건을 필요한 만큼 선택합니다. 기본값은 조건 미지정 + 현재 차단중인 송장만입니다.
- 조회조건 영역 오른쪽의 조회 버튼을 누르거나, 입력 필드에서 Enter 를 눌러도 즉시 재조회됩니다. Select·DatePicker는 값이 바뀌는 즉시 재조회됩니다.
- "해제된 송장도 포함" 체크박스를 켜면 이미 해제된 송장도 함께 조회해 차단 이력을 비교할 수 있습니다.
- 결과 그리드 행 오른쪽 화살표를 누르면 금액·차단사유·항목별 발주/입고 대비·산출근거를 담은 상세 다이얼로그가 열립니다.
- 목록은 CSV 다운로드로 내려받습니다. UTF-8 BOM 이 붙어 엑셀에서 한글이 깨지지 않습니다.
차단사유 자동판정 로직
SAP 표준 송장검증(MIRO)은 발주(EKPO)·입고(EKBE) 데이터와 송장을 자동 대사하고, 허용오차를 벗어나면 지급을 차단합니다. 이 화면은 그 4가지 표준 차단사유를 판정식으로 재현했습니다.
| 사유 | 판정식 | 의미 |
|---|---|---|
| P 가격차이 | (송장단가 − 발주단가) × 송장수량 > 0 | 발주보다 비싸게 청구된 경우 |
| Q 수량차이 | 송장수량 − 입고수량 > 0 | 실제 입고보다 많은 수량이 청구된 경우 |
| D 일자차이 | 발주 유효기간 경과일수 > 0 | 발주 근거 유효기간이 지난 뒤 접수된 송장 |
| R 수동차단 | 금액·수량과 무관, 임의 추출 | 내부통제 목적의 표본 검토(Stochastic Block) 대상 |
경과일수를 함께 보여주는 이유
차단사유만 알아서는 무엇부터 처리할지 정하기 어렵습니다. 같은 가격차이라도 어제 걸린 것과 40일째 묶여 있는 것은 우선순위가 다릅니다. 그래서 경과일수(오늘−전기일) 30일 이상은 위험, 14~29일은 경고로 구분해 장기 미해제 건을 먼저 식별하도록 했습니다.
송장검증 → 차단 → 해제 처리 4단계
| 단계 | 내용 |
|---|---|
| 1. 송장 등록 | MIRO로 송장을 입력하면 발주(EKPO)·입고(EKBE) 데이터와 자동 대사됩니다. |
| 2. 차단 판정 | 가격·수량·일자 허용오차를 벗어나거나 임의검사 대상이면 차단 플래그와 사유가 기록됩니다. |
| 3. 조회·검토 | 이 화면(MRBR 대응)에서 차단 목록을 사유·경과일수·구매처별로 검토합니다. |
| 4. 해제·지급 | 담당자가 근거를 확인한 뒤 MRBR에서 해제하면 지급 프로세스가 재개됩니다. |
조회조건
| 필드 | 설명 |
|---|---|
| 회사코드 / 구매조직 | Select, 전체 선택 가능 |
| 구매처(코드/명) | 부분일치 검색 |
| 차단사유 | 가격/수량/일자/수동, 전체 |
| 전기일(~까지) | 지정일 이전 전기 건만 |
| 경과일수 | 7/14/30일 이상 필터 |
| 해제된 송장도 포함 | 기본 미체크 = 차단중만 조회 |
결과 컬럼
| 컬럼 | 의미 · 표시 |
|---|---|
| 송장번호 · 구매처 | 코드/명 함께 표시 |
| 구매조직 · 발주번호 | |
| 전기일 · 송장총액 | 우측정렬, 천단위 콤마 + 통화 |
| 상태 | 차단중/해제됨 아이콘 |
| 차단사유 · 차이내역 | 사유별 색상 구분 + 차이금액/수량/경과일 텍스트 |
| 경과일수 | 30일↑ 위험, 14~29일 경고 강조 |
SAP 표준 기능 매핑
표준 실행은 MRBR(지급차단 송장 해제)이 담당하며, 이 화면은 그 조회·검토 관점을 웹 UI로 확장한 것입니다. 표준 3자 대사 로직과 차단사유 체계를 그대로 이어받아, 구매처·경과일수 기준의 우선순위 조회와 산출근거 드릴다운을 더했습니다.
| 표준 T-code / 테이블 | 역할 |
|---|---|
MRBR | 지급차단 송장 해제 워크리스트 — 본 화면의 직접 대응 기능 |
MIR4 / MIR6 | 송장 문서 표시 / 개요 — 상세 다이얼로그 항목 정보 원천 |
ME23N | 구매발주 표시 — 발주단가·수량 참조 |
RBKP / RSEG | 송장 헤더 / 항목 |
참고 CDS 뷰
@AbapCatalog.sqlViewName: 'ZLMMBLKINV'
define view ZL_MM_BLOCKED_INVOICE
as select from rbkp
association [0..1] to rseg as _Item on _Item.belnr = rbkp.belnr and _Item.gjahr = rbkp.gjahr
{
key rbkp.belnr as InvoiceNo,
key rbkp.gjahr as FiscalYear,
rbkp.bukrs as CompanyCode,
rbkp.ekorg as PurchOrg,
rbkp.lifnr as Vendor,
rbkp.ebeln as PurchaseOrder,
rbkp.budat as PostingDate,
rbkp.rmwwr as GrossAmount,
rbkp.waers as Currency,
_Item
}
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 차단사유 코드 체계와 임의검사 추출 기준을 운영 설정값에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.f.DynamicPage + 조회조건 헤더 + 결과 그리드 |
| 조회조건 | sap.m.Select · Input · DatePicker · CheckBox — change/submit 시 즉시 재조회 |
| 결과 그리드 | sap.ui.table.Table — RowAction 으로 상세보기 진입 |
| 상세보기 | sap.m.Dialog + 금액/차단상세/항목/산출근거 4개 테이블 |
| 포맷 | 금액 · 일자 · 경과일수 · 차단상태 · 차이내역 포맷터 |
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon · lodash · moment |
manifest.json | 앱 디스크립터 — 앱 ID(zui5.invblock) · ko 로케일 |
view/Main.view.xml + fragments | 조회조건 · 결과 그리드 · 상세 Dialog |
controller/Main.controller.js | 조회 · Enter키 재조회 · 상세 산출 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) |
js/formatter.js | 금액 · 일자 · 경과일수 · 차단상태 포맷 |
localdata/rbkp.json · rseg.json | 송장 헤더 96건 · 항목 176건 검증용 데이터 |
검증 결과
화면 구성에 쓴 데이터는 송장 96건 · 항목 176건이며, 이 중 차단중 59건(가격 17 · 수량 8 · 일자 23 · 수동 11)입니다.
| 검증 항목 | 결과 |
|---|---|
| 항목별 순액 합계 = 헤더 순액, 순액+부가세(10%) = 송장총액 | 통과 |
| 차단여부와 차단사유 정합(차단=X면 사유 존재, 해제면 사유 없음) | 통과 |
| 가격차이(P) 건은 양(+)의 차이금액 보유, 수량차이(Q) 건은 양(+)의 초과수량 보유 | 통과 |
| XML/JSON 전체 파싱 · 로컬 서버 전 리소스 200 · i18n 키/핸들러/포맷터 누락 0건 | 통과 |
| 조회 버튼 위치 — 조회조건 영역 오른쪽 끝(하단 Bar 미사용) | 통과 |
| Enter 키 조회 — 구매처 입력 후 Enter 로 59건→7건 재필터 확인 | 통과 |
| 적용 테마 sap_horizon 확인 | 통과 |
| 화면 렌더링 — 실브라우저에서 조회 → 필터 → 상세보기 실동작 후 캡처 | 4/4 |
구매처·금액·경과일수는 모두 검증용 데이터입니다.
자주 묻는 질문
차단사유는 어떻게 자동으로 판정되나요?
라인별로 발주단가·발주수량과 대사합니다. 송장단가가 발주단가보다 높으면 가격차이(P), 송장수량이 입고수량을 넘으면 수량차이(Q), 발주 유효기간이 지난 뒤 들어온 송장이면 일자차이(D)로 판정합니다. 여기에 해당하지 않아도 내부통제 목적의 임의검사(R) 대상으로 뽑히는 건이 따로 있습니다.
이 화면에서 차단을 직접 해제할 수 있나요?
아니요. 조회와 근거 확인이 목적인 화면입니다. 실제 차단 해제는 표준 트랜잭션 MRBR에서 담당자가 근거를 검토한 뒤 수행합니다. 이 화면은 그 검토를 준비하는 단계를 앞당겨 줍니다.
경과일수는 왜 중요한가요?
차단된 채로 오래 방치된 송장일수록 구매처와의 관계, 조기지급 할인 같은 조건을 놓치게 됩니다. 30일 이상 차단된 건은 화면에서 위험으로 강조해 우선 검토 대상을 바로 알 수 있게 했습니다.
SAP 표준 기능과 어떻게 이어지나요?
송장검증(MIRO)과 지급차단 해제(MRBR)는 모두 표준 트랜잭션이 담당합니다. 이 화면은 그 결과 데이터를 구매처·차단사유·경과일수 관점으로 모아 조회하고, 발주·입고 대비 산출근거를 드릴다운으로 보여주는 조회 전용 확장입니다.