SAP 위탁판매 수익인식 점검 — IFRS 15, 거래처에 넘긴 제품이 위탁약정이면 팔린 만큼만 매출로 잡았는지 장부와 맞춰본다
판매 전 통제 유지·회수 가능·무조건적 지급의무 없음 세 지표로 출고 건을 나누고, 팔린 만큼만 매출로 잡았는지 장부·재고·원장과 맞춰 봅니다
거래처에 제품을 넘겼는데 그 거래처가 제품을 통제하지 못한다면 매출로 잡아도 될까요? IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호)은 제품을 다른 당사자에게 인도하더라도 그 당사자가 제품을 통제하지 못하는 위탁약정이면 인도 시점에 수익을 인식하지 않도록 하고, 위탁약정 여부를 보여 주는 지표로 판매 전까지 회사가 통제를 유지하는지, 회사가 제품을 회수하거나 다른 제3자에게 넘길 수 있는지, 거래처에 제품 대가를 지급할 무조건적 의무가 없는지를 듭니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다.
실무에서는 위탁약정인데 출고 시점에 전량을 매출로 잡거나, 일반 판매인데 매출을 빠뜨리거나, 지표 일부만 충족해 성격이 애매한 건이 섞이곤 합니다. 출고 건마다 세 지표를 확인해 기대 매출을 구하고 장부 매출·거래처 위탁재고·원장 매출 잔액과 견주는 과정을 OpenUI5 화면으로 확장했습니다. 실제 구동 화면 6종을 함께 공개합니다.
| 항목 | 내용 |
|---|---|
| 업무 영역 | 재무회계(FI) — 수익(판매) |
| 관련 기준서 | IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호) — 위탁약정의 수익인식 |
| Namespace | zui5.consignsale |
| 셸 구조 | 단일 페이지 + 5개 탭 |
| 화면 수 | 메인 1 · 상세 다이얼로그 1 |
| SAP 표준 T-code | VA03 · VF03 · FBL5N · FAGLL03 · MB51 · MMBE |
| 데이터 연동 방식 | OData V2 (조회조건 전부 $filter) |
| 성격 | 조회·재계산·대사·점검형 |
| 테마 | sap_horizon · 한국어 |
| 요약 | 내용 |
|---|---|
| 점검 대상 | 출고 건별 위탁약정 지표와 기대 인식 매출·장부 매출, 거래처 위탁재고 수량, 제품군별 원장 매출 잔액 |
| 핵심 산식 | 기대 인식 매출 = 위탁약정은 최종 판매 수량 × 단가, 일반 판매는 출고액 · 출고액 = 기대 인식 매출 + 매출 미인식액(+ 확인 필요 출고액) |
| 결과 표시 | 정상 / 점검 필요 / 확인 필요 |
실제 화면 6종 둘러보기






사용 방법
- 조회조건 입력 — 회계연도는 필수이고(기본 2026), 회사코드는 목록에서 고릅니다(기본 1000). 점검 결과와 출고 번호는 선택입니다. 출고 번호는 대소문자를 가리지 않고 입력합니다.
- 조회 — 조회 버튼은 조회조건 영역의 입력 칸들 오른쪽 끝에 있고 초기화 버튼이 그 옆에 있습니다. 입력 칸에서 Enter 키를 눌러도 조회됩니다. 화면이 열릴 때는 기본 조건으로 한 번 자동 조회합니다.
- 요약 KPI 확인 — 판정 출고 건수, 점검 필요·확인 필요 건수, 매출 미인식액 합계, 확인 필요 출고액 합계, 장부·기대 매출 차이 절대값 합계를 봅니다.
- 탭 이동 순서 — 출고 건별 약정 판정 → 거래처별 위탁재고 수량 → 제품군별 매출 증감표 → 판정 구분별 요약 → 대사 결과 순으로 봅니다.
- 행 클릭 상세 — 출고 건별 탭의 행을 누르면 지표·금액 요약과 해당 거래처의 위탁재고 수량이 상세 창에 나타납니다. 닫기 버튼으로 닫습니다.
- CSV 내려받기 — 현재 탭과 같은 조건의 자료를 UTF-8 BOM CSV 로 내려받습니다. 파일 이름은 한글 기능명입니다.
위탁약정을 가르는 세 지표와 판정 규칙
출고 건마다 세 지표(판매 전까지 회사 통제 · 회수·타처 이전 가능 · 거래처의 무조건적 지급의무 없음)의 충족 수를 세어 약정 판정을 정하고, 장부 매출을 기대 인식 매출과 비교합니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 지표 3개 충족 → 위탁약정, 장부 매출 = 최종 판매 수량 × 단가 | 정상 | 조치 없음 |
| 지표 3개 충족 → 위탁약정, 장부 매출 ≠ 기대 매출 | 점검 필요 | 미판매분이 매출로 잡혔는지, 판매 보고가 반영됐는지 확인 |
| 지표 0개 충족 → 일반 판매, 장부 매출 = 출고액 | 정상 | 조치 없음 |
| 지표 0개 충족 → 일반 판매, 장부 매출 ≠ 출고액 | 점검 필요 | 출고 시점 매출 인식 여부와 차이 사유 확인 |
| 지표 1~2개 충족 | 확인 필요 | 약정서·인도 조건으로 통제 이전 여부를 확인(기대 매출은 산정하지 않음) |
| 거래처 보고 수량 ≠ 계산 기말 수량 | 점검 필요 | 거래처 재고 보고·실사 자료 확인 |
| 제품군의 매출 차이 합계 ≠ 0 또는 원장 차이 ≠ 0 | 점검 필요 | 해당 제품군의 출고 건 확인 |
| 제품군에 확인 필요 출고액만 있음 | 확인 필요 | 약정 성격 확인 후 재조회 |
판정 결과는 확인 대상을 알리는 표시이며, 최종 판단은 회사와 감사인이 합니다.
출고 판정에서 재고·원장 대사까지의 순서
- 출고액 = 출고 수량 × 단가
- 충족 지표 수 = Y 개수 → 3 이면 위탁약정, 0 이면 일반 판매, 그 밖에는 확인 필요 (대사식 R2)
- 기대 인식 매출 = 위탁약정은 최종 판매 수량 × 단가, 일반 판매는 출고액, 확인 필요는 산정하지 않음
- 매출 미인식액 = 위탁약정의 (출고 수량 − 최종 판매 수량) × 단가 → 출고액 = 기대 인식 매출 + 매출 미인식액 (R1)
- 매출 차이 = 장부 매출 − 기대 인식 매출 (판정 완료 건)
- 거래처 기말 수량 = 기초 + 출고 − 최종 판매 − 회수 (R3), 거래처 출고 수량 = Σ 출고 건 수량(위탁약정·확인 필요) (R4)
- 제품군 장부 매출 = Σ 출고 건 장부 매출 = 원장 매출 잔액, 제품군 출고액 = 기대 + 미인식 + 확인 필요 출고액 (R5)
- 요약 합계 = Σ 구분별 행, 구분별 출고액 = 기대 + 미인식 + 확인 필요 (R6)
금액은 원 단위이며, 거래처·제품·금액은 모두 가상 설정값입니다.
조회조건
| 조회조건 | 입력 방식 | 필수 여부 | 전달 방식 |
|---|---|---|---|
| 회사코드 | 목록(1000 · 2000) | 선택(기본 1000) | CompanyCode eq |
| 회계연도 | 직접 입력 | 필수(기본 2026) | FiscalYear eq |
| 점검 결과 | 목록(전체 · 정상 · 점검 필요 · 확인 필요) | 선택 | ResultText eq — '전체'이면 조건을 만들지 않음 (출고 건별 탭) |
| 출고 번호 | 직접 입력 | 선택 | ShipId eq (출고 건별 탭) |
결과 컬럼
| 탭 | 주요 컬럼 |
|---|---|
| 출고 건별 약정 판정 | 출고 번호 · 점검 결과 · 거래처 · 제품군 · 출고일 · 출고/판매 수량 · 단가 · 출고액 · 지표 3종 충족 여부 · 충족 지표 · 약정 판정 · 기대 인식 매출 · 매출 미인식액 · 장부 매출 · 매출 차이 · 비고 |
| 거래처별 위탁재고 수량 | 거래처 · 점검 결과 · 기초·출고·최종 판매·회수·기말(계산) 수량 · 거래처 보고 수량 · 수량 차이 · 비고 |
| 제품군별 매출 증감표 | 제품군 · 점검 결과 · 출고액 · 기대 인식 매출 · 매출 미인식액 · 확인 필요 출고액 · 장부 매출 · 매출 차이 합계 · 원장 매출 잔액 · 원장 차이 |
| 판정 구분별 요약 | 판정 구분(위탁약정 · 일반 판매 · 약정 성격 확인 필요 · 합계) · 건수(정상/점검 필요/확인 필요) · 출고액·기대 매출·미인식액·확인 필요 출고액·장부 매출 합계 · 매출 차이 절대값 합계 |
| 대사 결과 | 대사식 · 대사 항목 · 산식 · 검사 건수 · 차이 건수 · 최대 차이 금액 |
SAP 표준 기능 매핑
SAP 표준 T-code 매핑
| 표준 T-code | 표준 기능 | 이 화면과의 관계 |
|---|---|---|
| VA03 | 판매오더 조회 | 출고 건의 계약 조건(인도·회수 조건)을 확인할 때 이어서 사용 |
| VF03 | 청구문서 조회 | 장부 매출로 잡힌 청구 건을 확인할 때 사용 |
| FBL5N | 고객 개별 항목 조회 | 거래처별 매출채권 인식 내역 확인 |
| FAGLL03 | G/L 계정 개별 항목 조회 | 매출 계정의 장부 매출과 이 화면의 집계를 대조 |
| MB51 | 자재문서 목록 | 출고·회수 자재문서 수량 확인 |
| MMBE | 재고 개요 | 재고 수량 확인. 위탁 주문유형·특수재고 코드는 확인 필요 |
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다.
IFRS 요구사항 매핑
| 기준서 | 요구사항 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호) | 제품을 다른 당사자에게 인도하는 위탁약정인지 평가 — 판매 전 통제 유지, 회수·타처 이전 가능, 무조건적 지급의무 없음 지표 | 출고 건별 약정 판정 탭의 지표 3종과 충족 수 | 납품·판매오더 계약 조건 | 지정 기간 경과 조건은 미반영(확인 필요) |
| IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호) | 위탁약정이면 거래처가 제품을 최종 판매하는 시점에 수익 인식 | 기대 인식 매출 = 최종 판매 수량 × 단가 | 거래처 판매 보고, 청구·매출 원장 | 최종 판단은 회사와 감사인 |
| IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호) | 통제가 이전되지 않은 제품은 수익 없이 재고로 관리 | 매출 미인식액, 거래처별 위탁재고 수량 | 고객 위탁재고, 자재문서 | 거래처 보고 수량과 대사 |
참고 CDS 뷰
원천테이블
| 원천테이블 | 설명 | 사용 필드 |
|---|---|---|
| LIKP · LIPS | 납품 헤더·품목 | 납품번호, 수취 거래처, 실제 출고일, 납품 수량 |
| VBRK · VBRP | 청구 헤더·품목 | 청구 수량, 청구 금액(단가 산출) |
| ACDOCA | 유니버설 저널 항목 | 매출 계정 금액(장부 매출) |
| MSKU | 고객 특수재고 | 거래처 보유 위탁재고 수량 |
| KNA1 | 고객 마스터 | 거래처 코드·이름 |
필드 매핑
| OData 엔티티.프로퍼티 | 원천테이블.필드 / 산식 |
|---|---|
| ShipSet.ShipId · ConsigneeCode · ShipDate | LIKP-VBELN · LIKP-KUNNR · LIKP-WADAT_IST |
| ShipSet.ShipQty · UnitPrice · ShipAmt | LIPS-LFIMG · VBRP-NETWR ÷ VBRP-FKIMG · ShipQty × UnitPrice (파생) |
| ShipSet.SoldQty | 거래처 판매 보고 수량(가상 수집 항목, 확인 필요) |
| ShipSet.CtrlHold · RecallRight · NoUncondPay | 계약 조건 점검표 값(가상 설정값, 확인 필요) |
| ShipSet.IndCount · ArrangeText | 지표 Y 개수 · 3→위탁약정 / 0→일반 판매 / 그 외→확인 필요 (파생) |
| ShipSet.ExpectRev · UnrecogAmt | 위탁약정: SoldQty × UnitPrice · (ShipQty − SoldQty) × UnitPrice / 일반 판매: ShipAmt · 0 (파생) |
| ShipSet.BookRev · RevDiff | ACDOCA 매출 계정 금액 합 · BookRev − ExpectRev (파생) |
| ConsSet.BeginQty · EndQty · ReportQty | MSKU 기초·기말 수량 · 계산 기말 수량 · 거래처 재고 보고(가상 수집 항목) |
| ConsSet.EndQty · QtyDiff | BeginQty + ShipQty − SoldQty − RecallQty · EndQty − ReportQty (파생) |
| RollSet.* · SumSet.* | ShipSet 을 제품군·판정 구분으로 집계한 값, 원장 매출 잔액은 ACDOCA 집계 |
CDS 뷰 스케치
define view entity ConsignShipCheck
as select from likp as h
inner join lips as i on i.vbeln = h.vbeln
left outer join vbrp as b on b.vgbel = i.vbeln and b.vgpos = i.posnr
{
key h.vbeln as ShipId,
h.kunnr as ConsigneeCode,
h.wadat_ist as ShipDate,
i.lfimg as ShipQty,
div( b.netwr, b.fkimg ) as UnitPrice,
i.lfimg * div( b.netwr, b.fkimg ) as ShipAmt,
case when CtrlHold = 'Y' and RecallRight = 'Y' and NoUncondPay = 'Y' then '위탁약정'
when CtrlHold = 'N' and RecallRight = 'N' and NoUncondPay = 'N' then '일반 판매'
else '확인 필요' end as ArrangeText
}스케치이며 계약 조건 지표(CtrlHold 등)와 거래처 판매 보고 수량은 별도 점검표에서 받는 값으로 가정합니다(확인 필요).
OpenUI5 구성
| 구성 | 내용 |
|---|---|
| 업무 영역 | 재무회계(FI) · 수익(판매) |
| 화면 구성 | 조회조건 영역(우측 조회) + 요약 줄 + 출고 건별 판정·거래처별 위탁재고·제품군별 증감표·구분별 요약·대사 5개 탭, 상세 Dialog |
| 데이터 모델 | OData V2 모델을 앱 설정(manifest)에서 선언하고, 표마다 해당 엔티티셋에 직접 바인딩 |
| 조회조건 처리 | 필터 객체로 만들어 서버 조회 조건($filter)으로 전달하며 "전체"는 조건을 만들지 않음 |
| 정렬·페이징 | 정렬 객체로 서버 정렬($orderby), 목록 범위 읽기로 페이징($top·$skip), 총건수는 인라인 건수 |
| 집계 | 요약 값은 서비스 집계 엔티티셋에서 읽고, 금액 문자열은 숫자로 변환해 표시·비교 |
| 표 구성 | 건수가 많고 컬럼이 많은 출고 건별 탭은 sap.ui.table.Table, 나머지 탭과 상세 창은 sap.m.Table |
| 실패 안내 | 서비스 연결 실패와 요청 실패, 빈 응답을 구분해 사용자 메시지로 안내 |
| 테마 | sap_horizon · 한국어 |
파일 구성
| 구분 | 내용 |
|---|---|
| 앱 본체 | index.html · manifest.json · Component.js · controller · view · model · i18n · css |
| 데이터 서비스 | OData 서비스 정의와 엔티티셋별 데이터 |
| 검증 전용 | 앱 본체와 분리된 검증용 샘플 데이터 구성 |
| 설명서 | readme.html (13개 절) |
검증 결과
화면 구성에 쓴 검증용 샘플 데이터는 가상 출고 46건(회사 1000 36건 · 회사 2000 10건)과 거래처 9곳을 기준으로 원 단위·수량 단위로 맞물리도록 구성했습니다.
| 대사식 | 검사 | 결과 | 차이 건수 |
|---|---|---|---|
| 출고액 = 기대 인식 매출 + 매출 미인식액 (판정 완료 건) | 38 | 일치 | 0 |
| 충족 지표 수 = Y 개수, 3→위탁약정 / 0→일반 판매 / 그 외→확인 필요 | 46 | 일치 | 0 |
| 기초 + 출고 − 판매 − 회수 = 기말 수량 | 9 | 일치 | 0 |
| 거래처 출고 수량 = Σ 출고 건 수량 | 9 | 일치 | 0 |
| 제품군 장부 매출 = Σ 출고 건 장부 매출 = 원장 매출 잔액 | 7 | 일치 | 0 |
| 요약 합계 = Σ 구분별 행, 구분별 출고액 = 기대 + 미인식 + 확인 필요 | 18 | 일치 | 0 |
회사 1000 은 “점검 필요” 출고 8건(위탁약정 5건: 출고 시 전량 매출 인식 4건·판매분 매출 누락 1건, 일반 판매 3건: 출고분 매출 없음 2건·장부 매출 부족 1건), “확인 필요” 출고 6건(지표 일부 충족), 거래처 수량 “점검 필요” 2곳이 예외이고, 회사 2000 에도 같은 유형의 예외를 소수 넣었습니다. 이는 점검 화면의 동작을 보이기 위해 의도적으로 구성한 케이스이며 대사 차이와 분리해 기록했습니다. 기대값은 별도 스크립트로 다시 계산해 전수 비교했고 대사 차이는 0건이었으며, 화면의 요약 지표(회사 1000: 출고 36건 · 점검 필요 8 · 확인 필요 6 · 매출 미인식액 233,982,000원)도 스크립트 결과와 일치했습니다.
자주 묻는 질문
이 화면의 “점검 필요”는 회계처리가 틀렸다는 뜻인가요?
아닙니다. 이 화면은 위탁약정 여부에서 기대되는 매출을 장부 매출과 맞춰 차이가 나는 건을 가려내는 점검 도구입니다. 차이의 원인과 최종 회계 판단은 기준서 원문과 회사의 회계정책에 따라 회사와 감사인이 합니다.
적용 시기와 범위는 어떻게 되나요?
이 화면은 IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호) 중 제품을 거래처에 인도하되 통제가 이전되지 않을 수 있는 위탁약정의 수익인식만 다룹니다. 회사별 적용 시점과 경과규정, 문단번호는 원문으로 확인하지 못해 확인 필요로 두었고, 다른 수익 논점은 범위에 넣지 않았습니다.
세 지표를 일부만 충족하면 어떻게 보이나요?
위탁약정인지 일반 판매인지 이 화면이 판정하지 않고 “확인 필요”로 표시합니다. 약정서와 인도 조건으로 통제가 이전됐는지 확인해 지표를 보완하고 다시 조회하면 판정됩니다.
지정 기간이 지나면 수익을 인식하는 조건도 반영되나요?
반영하지 않았습니다. 이 화면은 지표 3종과 거래처의 최종 판매 수량만 쓰는 가상 설정이며, 기간 경과 조건과 보증금 등 실제 약정 조건의 반영 방식은 확인 필요입니다.
결산 직전, 위탁 출고분의 매출 인식을 건별로 미리 맞춰 두세요
거래처 재고에 제품이 남아 있는 회사는 감사 시기에 위탁 출고분의 매출 인식 근거와 재고 수량을 엑셀로 다시 정리하게 됩니다. 화면에서 지표 충족 여부와 장부 매출이 다른 건을 미리 가려 두면 결산과 감사 대응이 한결 가벼워집니다. 현재 SAP 환경 기준으로 어떻게 적용되는지 함께 확인해 드립니다.