SAP 청구후 보류판매 수익인식 점검 — IFRS 15, 청구했다고 다 판 것은 아니다
보낼 준비가 끝났다고 다가 아닙니다. 네 가지 요건을 다 채워야 청구 시점에 수익이 됩니다
영업이 큰 건을 계약하고, 고객이 보관 공간이 없거나 생산 일정을 맞추려고 "만들어는 두되 나중에 가져가겠다"고 하면 회사는 먼저 청구서를 끊고 싶어집니다. 하지만 IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호)에서 수익은 통제가 고객에게 넘어가는 시점에 인식하는 것이 원칙이고, 물리적 인도 없이 청구만 먼저 한 청구후 보류판매(Bill-and-hold) 거래는 네 가지 요건을 모두 충족해야만 그 청구 시점에 수익으로 인정됩니다.
실무에서는 "청구서를 보냈으니 매출로 잡자"는 판단이 먼저 나오고, 보관 사유가 실질적인지·그 제품이 정말 그 고객 몫으로 따로 빼놓았는지는 나중에 감사 때 다시 확인하는 경우가 많습니다. 수주·청구 데이터를 그대로 이어받아 주문 항목별로 네 요건을 표시하고 인식·이연 여부를 가르는 과정을 OpenUI5 화면으로 확장했습니다. 실제 구동 화면 3종을 함께 공개합니다.
| 업무 영역 | 관련 기준서 | Namespace | 셸 구조 | 화면 수 | SAP 표준 T-code | 데이터 연동 방식 | 성격 | 테마 |
|---|---|---|---|---|---|---|---|---|
| 재무회계(FI) | IFRS 15(K-IFRS 제1115호) | zui5.billhold | 단일 페이지 + 탭 2종 + 상세 다이얼로그 | 2 (주문 명세 · 고객별 집계) | VA03 · VF03 · VL03N · FBL5N | OData V2, 조회조건은 전부 $filter | 조회·점검형 | sap_horizon |
실제 화면 3종 둘러보기



사용 방법
- 회사코드·회계연도·기간을 넣습니다. 기간을 "전체"로 두면 KPI 카드는 참고용으로 비워집니다.
- 조회 버튼은 조회조건 입력 필드 줄의 가장 오른쪽에 있습니다. 회계연도·고객명 입력 필드에서 Enter 키를 눌러도 같은 조회가 실행됩니다.
- 화면 진입 시 기본 조건으로 최초 1회 자동 조회됩니다.
- 조회 건수·조회 금액 합계·이연 건수·이연 비율 4개 KPI 카드로 전체 현황을 먼저 확인합니다.
- "주문 명세" 탭에서 개별 주문의 4요건 아이콘을 보고, "고객별 집계" 탭에서 고객 단위 이연 규모를 봅니다. 집계 탭에서 고객 행을 누르면 명세 탭이 그 고객으로 필터링됩니다.
- 명세 테이블의 행을 클릭하면 4요건 개별 충족 여부와 판정결과가 담긴 상세 다이얼로그가 열립니다.
- 각 탭 우측 상단의 CSV 내려받기(UTF-8 BOM)로 현재 조회 결과를 저장할 수 있습니다.
청구시점에 넘기지 말아야 할 네 가지 조건
넷 중 하나라도 비면 수익은 아직 넘어간 게 아닙니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 사유의 실체성 · 개별 식별 · 인도 준비 완료 · 처분·전용 제한 — 4요건 모두 충족 | 인식 | 청구 시점에 수익으로 인식합니다. |
| 4요건 중 하나 이상 미충족 | 이연 | 실제 인도(또는 요건 충족) 시점까지 수익을 이연합니다. |
| 사유의 실체성 미충족(단순 보관 편의 등) | 점검 필요 | 보류 사유의 실질을 다시 확인합니다. |
| 개별 식별 미충족(재고와 미구분) | 점검 필요 | 고객 몫으로 별도 식별·구분되어 있는지 확인합니다. |
판정 결과는 확인이 필요한 건을 알리는 표시이며, 기준서 충족 여부를 단정하지 않습니다. 계약의 구체적 사실관계에 따른 최종 판단은 회사와 감사인이 합니다.
인식과 이연을 가르는 4단계 판정
- 대상을 모은다 —
회사·연도·기간의 청구후 보류판매 주문 항목 - 4요건을 확인한다 —
사유의 실체성 · 개별 식별 · 인도 준비 완료 · 처분·전용 제한 - 판정한다 —
4요건 모두 Y = 인식(전액) · 하나라도 N = 이연(전액) - 집계·대사한다 —
인식 금액 + 이연 금액 = 청구 금액, 고객·기간 단위로 집계
조회조건
| 조회조건 | 필수 | OData 프로퍼티 | 설명 |
|---|---|---|---|
| 회사코드 | 필수 | CompanyCode | 가상 회사 목록에서 선택 |
| 회계연도 | 필수 | FiscalYear | 4자리 연도. Enter 키로 즉시 조회 |
| 기간 | 필수(전체 선택 가능) | Period | "전체" 선택 시 조건에서 제외 |
| 고객명 | 선택 | CustomerName | 부분 일치(포함) 검색 |
| 판정결과 | 선택 | RecognizedResult | 전체 / 인식 / 이연 |
결과 컬럼
| 영역 | 내용 |
|---|---|
| 주문 명세 | 주문번호/항목 · 청구일자 · 고객 · 자재 · 금액 · 4요건 아이콘 4종 · 판정결과 · 비고 |
| 고객별 집계 | 고객 · 총 건수 · 이연 건수 · 이연 금액 |
SAP 표준 기능 매핑
| T-code | 이름 | 쓰임 |
|---|---|---|
VA03 | 수주 조회 | 보류 대상 주문 항목을 확인합니다 |
VF03 | 청구(빌링) 문서 조회 | 청구일자·청구금액을 확인합니다 |
VL03N | 배송 문서 조회 | 실제 인도 여부·인도 준비 상태를 확인합니다 |
FBL5N | 고객(매출채권) 원장 조회 | 고객별 청구·수금 현황을 대사합니다 |
| 기준서 | 요구사항 | 화면 반영 |
|---|---|---|
| IFRS 15(K-IFRS 제1115호) | 청구후 보류판매 수행의무 이행시점 판단(4요건) | 4요건 아이콘 표시 · 판정결과 산출 |
| IFRS 15(K-IFRS 제1115호) | 거래가격을 수행의무 이행시점에 수익으로 인식 | 인식/이연 금액 분리 집계, 청구금액과 대사 |
참고 CDS 뷰
define view entity ZC_BillHoldCheck
as select from vbrp as billing_item
left outer join vbrk as _header on _header.vbeln = billing_item.vbeln
{
key billing_item.vbeln as OrderNo,
key billing_item.posnr as OrderItem,
_header.fkdat as BillDate,
billing_item.netwr as Amount,
billing_item.kunag as CustomerCode
// 4요건 플래그·판정결과는 점검 로직 계층에서 파생
}
OpenUI5 구성
| 구성 | 내용 |
|---|---|
| 업무 영역 | 재무회계(FI) · 수익인식 |
| 화면 구성 | 조회조건 영역(우측 조회) + KPI 4종 + 주문 명세 · 고객별 집계 2개 탭, 상세 Dialog |
| 성격 | 조회·점검형 — 실제 수익 인식 전표 기표는 화면 밖 프로세스 |
| 데이터 | OData V2 — 조회조건은 전부 $filter |
| 테마 | sap_horizon · 한국어 |
회사코드·회계연도·기간을 넣고 조회하면 주문 명세와 KPI 가 한 화면에 뜹니다 → 고객별 집계 탭에서 이연이 몰린 고객을 찾고 → 행을 클릭해 상세에서 4요건을 하나씩 확인합니다.
파일 구성
| 구분 | 내용 |
|---|---|
| 앱 본체 | index.html · manifest.json · Component.js · controller · view · model · i18n · css |
| OData 서비스 | odata/billhold_srv/ (metadata.xml · json) |
| 검증 전용 | test/ (mockserver.js · mockdata) |
| 설명서 | readme.html (13개 절) |
검증 결과
화면 구성에 쓴 검증용 샘플 데이터는 청구후 보류판매 주문 99건을 기준으로 인식·이연 금액이 청구 금액과 원(KRW) 단위로 맞물리도록 구성했습니다.
| 대사식 | 검사 건수 | 결과 | 의도적 예외 |
|---|---|---|---|
| 청구 금액 = 인식 금액 + 이연 금액 | 99 | 일치(차이 0) | 0 |
| 4요건 모두 충족 ↔ 판정결과 = 인식 | 99 | 일치 | 0 |
| 고객별 집계 = 명세 집계 | 44 | 일치 | 0 |
| KPI(조회 건수·금액·이연 건수·이연 비율) = 집계값 | 6 | 일치 | 0 |
인식 53건 · 이연 46건, 대사 차이 0건입니다. OData 서비스 계약(엔티티 키·EDM 타입·$filter·$orderby·$top 동작)과 목업 파일 분리도 함께 확인했습니다.
자주 묻는 질문
청구서를 먼저 보내면 수익을 먼저 인식할 수 있나요?
아닙니다. IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호)에서는 청구서 발행 자체가 수행의무 이행을 뜻하지 않습니다. 제품을 아직 인도하지 않았다면 사유의 실체성, 개별 식별, 인도 준비 완료, 처분·전용 제한 네 요건을 모두 충족해야 청구 시점에 수익을 인식할 수 있습니다.
네 요건 중 세 개만 충족하면 일부 금액이라도 인식할 수 있나요?
이 화면은 네 요건이 모두 충족된 경우에만 전액을 인식 대상으로 분류하고, 하나라도 미충족이면 전액을 이연 대상으로 분류합니다. 부분 인식이 가능한지는 계약의 구체적 사실관계에 따라 달라질 수 있어 이 화면만으로 단정하지 않습니다.
적용 시기와 범위는 어떻게 되나요?
청구후 보류판매 요건은 IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호)에 규정되어 있으며, IFRS 15는 2018년 1월 1일 이후 개시하는 회계연도부터 이미 시행 중인 기준서입니다. 이 화면은 신규 시행이 아니라 기존에 적용 중인 요건을 결산마다 상시 점검하는 조회 도구입니다.
화면의 판정결과를 그대로 회계처리에 반영해도 되나요?
이 화면은 네 요건 충족 여부를 확인해 인식·이연 후보를 가려내는 조회·점검 도구입니다. 개별 계약의 사실관계 판단과 수익인식 시점에 대한 최종 판단은 회사와 감사인이 합니다.
청구했다고 다 넘어간 건 아닙니다 — 결산 전에 네 요건부터 맞춰보세요
청구후 보류판매 건을 계약서와 배송 기록을 일일이 다시 뒤지는 대신, 화면에서 4요건 충족 여부를 먼저 걸러 두면 결산과 감사 대응이 한결 가벼워집니다. 현재 SAP 환경 기준으로 어떻게 적용되는지 함께 확인해 드립니다.