SAP 계약변경 회계처리 점검 — IFRS 15, 바뀐 계약을 따로 볼지 합쳐 볼지부터 가른다
납품 도중 물량이나 범위가 바뀐 계약을 별도 계약·전진 적용·누적효과 일괄조정 중 어디로 처리했는지, 남은 수익 배분과 조정이 맞는지 계약·청구·원장 데이터로 먼저 확인해 둡니다
납품 도중 고객이 물량을 늘리거나 공사 범위를 바꾸는 일은 흔합니다. IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호)은 계약변경을 세 갈래로 처리합니다. 추가 재화가 구별되고 대가가 개별 판매가격을 반영하면 별도 계약, 구별되지만 가격이 다르면 기존 계약을 끝내고 새 계약을 맺은 것으로 보아 남은 대가를 앞으로 다시 배분하고, 구별되지 않으면 기존 계약의 일부로 보아 변경일에 누적효과를 한 번에 반영합니다.
세 유형 모두 총 거래가격은 같지만 수익이 잡히는 시점이 달라집니다. 표준 계약·청구·원장 구조를 그대로 이어받아 변경마다 기준 유형과 배분을 계산해 장부와 나란히 놓고, 유형 오판정과 누적효과 누락을 가려내는 과정을 OpenUI5 화면으로 확장했습니다. 실제 구동 화면 6종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 계약 — 판매 계약(
VBAK/VBAP)과 변경 이력(CDHDR/CDPOS)을 그대로 사용 - 청구 — 청구 문서(
VBRK/VBRP)의 인도·청구 수량으로 변경 전 인식 수익을 계산 - 표준 화면 — 계약 변경(VA42) · 계약 조회(VA43) · 청구 조회(VF03) · 수익성 보고서(KE30)
| 항목 | 내용 |
|---|---|
| 업무 영역 | 재무회계(FI) · 수익 인식 |
| 관련 기준서 | IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호) — 계약변경: 별도 계약으로 회계처리하는 요건, 기존 계약 종료·새 계약 체결로 보는 전진 처리, 기존 계약의 일부로 보는 누적효과 일괄조정 |
| Namespace | zui5.ctrmod |
| 셸 구조 | 조회조건 영역(우측 조회) + 계약변경 대사 요약 + 계약변경 명세·변경 유형별·계약 범주별·변경월별·점검 예외 5개 탭, 상세 Dialog |
| 화면 수 | 조회 화면 1개 + 상세 다이얼로그 |
| SAP 표준 T-code | VA42 · VA43 · VF03 · KE30 · FAGLL03(§7 참고) |
| 데이터 연동 방식 | OData V2 — 화면 블록마다 엔티티셋에 직접 바인딩 |
| 성격 | 조회·대사·점검형 — 배분 재계산·누적효과 전표 기표는 화면 밖 프로세스 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 6종 둘러보기
회사코드·회계연도를 넣고 조회하면 계약변경 대사 요약과 명세가 한 화면에 뜹니다 → 탭을 옮겨 변경 유형별·계약 범주별·변경월별 집계를 보고 → 점검 예외에서 확인이 필요한 건만 추려 봅니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회사코드와 회계연도를 넣습니다. 변경 유형·계약번호·판정 상태는 비워 두면 전체가 조회됩니다.
- 조회 버튼은 조회조건 입력 필드 줄의 가장 오른쪽에 있습니다. 입력 필드에서 Enter 키를 눌러도 같은 조회가 실행됩니다.
- 계약변경 대사 요약에서 변경 후 거래가격 합계와 기준·장부 누적효과, 배분·조정 차이를 먼저 확인합니다.
- 탭을 옮겨 가며 계약변경 명세 → 변경 유형별 → 계약 범주별 → 변경월별 → 점검 예외 순으로 좁혀 봅니다.
- 행을 누르면 원계약·추가분 조건과 가격 차이율, 기준·장부 배분이 상세 다이얼로그로 열립니다.
- 계약변경 명세와 점검 예외 탭에서는 CSV 내려받기(UTF-8 BOM)로 결과를 저장할 수 있습니다.
따로인가, 합칠 것인가 — 계약변경 유형 규칙
두 가지를 봅니다. 추가 재화가 기존 것과 구별되는지, 추가 대가가 그 개별 판매가격을 반영하는지입니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 구별됨 + 개별 판매가격 반영 | 별도 계약 | 기존 계약은 그대로, 추가분은 추가 대가로 따로 인식합니다. |
| 구별됨 + 개별 판매가격과 다름 | 전진 적용 | 남은 대가 + 추가 대가를 남은 재화 전체에 다시 배분합니다. |
| 구별되지 않음 | 누적효과 일괄조정 | 새 거래가격 × 새 진행률 − 인식 누적을 변경일에 반영합니다. |
| 별도 계약인데 기존 계약과 합쳐 배분 | 점검 필요 | 유형 판정을 확인합니다. |
| 전진 적용 대상인데 별도 계약으로 처리 | 점검 필요 | 유형 판정을 확인합니다. |
| 누적효과 일괄조정 누락 | 점검 필요 | 변경일 조정 전표를 확인합니다. |
| 가격 차이가 1% 초과 3% 이내 | 확인 필요 | 개별 판매가격 근거와 할인 사유를 확인합니다. |
이 화면이 대신 정하지 않는 것
판정 결과는 확인 대상을 알리는 표시이며, 기준서 충족 여부를 단정하지 않습니다. 추가 재화가 구별되는지, 대가가 개별 판매가격을 반영하는지는 계약 상황에 맞춘 조정까지 고려해 회사가 판단합니다. 화면의 1%·3% 기준은 판단을 돕는 참고값이며 기준서가 정한 수치가 아닙니다. 최종 판단은 기준서 원문에 따라 회사와 감사인이 합니다.
유형 판정에서 배분 대사까지 5단계 산출
| 단계 | 내용 |
|---|---|
| 1단계 | 변경 전 인식 수익을 확인한다 — 인식 누적 = 원계약가 × 인도수량 ÷ 원수량 |
| 2단계 | 변경 유형을 판정한다 — 구별 여부 · 가격 차이율 = (추가 대가 − 개별 판매가격) ÷ 개별 판매가격 |
| 3단계 | 유형별로 남은 수익을 배분한다 — 별도 = 원 단가 유지 / 전진 = (남은 대가 + 추가 대가) ÷ 남은 수량 |
| 4단계 | 누적효과를 계산한다 — 누적효과 = 새 거래가격 × 새 진행률 − 인식 누적 |
| 5단계 | 총 거래가격 보존과 장부를 대사한다 — 인식분 + 누적효과 + 잔여분 + 추가분 = 원계약가 + 추가 대가 |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 회사코드 | 필수 | 대사 요약 단건 조회의 키로도 씁니다. |
| 회계연도 | 필수 | 대사 요약 단건 조회의 키로도 씁니다. |
| 변경 유형 | 선택 | 전체 / 별도 계약 / 전진 적용 / 누적효과 일괄조정 |
| 계약번호 | 선택 | 한 계약만 좁혀 볼 때 씁니다. |
| 판정 상태 | 선택 | 전체 / 정상 / 점검 필요 / 확인 필요 |
결과 컬럼
| 영역 | 컬럼 · 표시 |
|---|---|
| 계약변경 대사 요약 | 변경 건수 · 누적효과 대상 · 변경 후 거래가격 합계 · 변경 전 인식 수익 · 기준/장부 누적효과 · 배분·조정 차이 · 예외 건수 |
| 계약변경 명세 | 계약번호 · 고객 · 변경일 · 원계약가 · 인식 누적 수익 · 추가 대가 · 가격 차이율 · 구별 여부 · 변경 유형 · 기준/장부 잔여분 수익 · 기준/장부 누적효과 · 판정 |
| 변경 유형별 · 계약 범주별 · 변경월별 집계 | 구분 · 건수 · 추가 대가 · 기준 잔여분·추가분 수익 · 기준/장부 누적효과 |
| 점검 예외 | 예외번호 · 계약번호 · 예외 유형 · 내용 · 차이 · 중요도 |
SAP 표준 기능 매핑
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 그 데이터에 계약변경 처리 관점의 조회·검증을 더해 확장합니다.
| 표준 T-code | 표준 기능 | 이 화면이 더한 것 |
|---|---|---|
VA42 | 계약 변경 | 변경일과 추가 수량·대가를 가져옵니다 |
VA43 | 계약 조회 | 원계약 조건과 인도 진척을 확인합니다 |
VF03 | 청구 문서 조회 | 변경 전후 청구 금액을 대사합니다 |
KE30 | 수익성 보고서 | 계약 범주별 수익을 집계합니다 |
FAGLL03 | G/L 개별항목 조회 | 누적효과 조정 전표를 건별로 확인합니다 |
IFRS 요구사항 매핑표
| 기준서 | 요구사항 | 이 화면의 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| IFRS 15 (K-IFRS 제1115호) | 구별되는 재화 추가 + 개별 판매가격 반영 → 별도 계약 | 유형 판정과 별도 계약 배분 산출 | VBAK · VBAP | 개별 판매가격 조정은 사용자 몫입니다. |
| IFRS 15 (K-IFRS 제1115호) | 남은 재화가 구별되면 기존 계약 종료·새 계약으로 전진 처리 | 남은 대가 + 추가 대가 재배분 산출 | VBAP · VBRP | 배분은 수량 비례를 참고 가정으로 씁니다. |
| IFRS 15 (K-IFRS 제1115호) | 남은 재화가 구별되지 않으면 기존 계약의 일부로 누적효과 일괄조정 | 새 진행률 기준 누적효과 산출과 누락 검출 | VBAP · ACDOCA | 진행률 측정 방법은 회사가 정합니다. |
| IFRS 15 (K-IFRS 제1115호) | 계약변경은 당사자가 승인한 범위·가격 변경 | 변경일 기준 집계 | VBAK | 미승인 변경은 화면 대상이 아닙니다. |
참고 CDS 뷰
| 원천 테이블 | 주요 필드 | 쓰임 |
|---|---|---|
VBAK / VBAP | VBELN · POSNR · NETWR · KWMENG · AEDAT | 계약과 변경 내역 |
VBRK / VBRP | VBELN · FKDAT · NETWR · FKIMG | 청구 금액과 인도 수량 |
CDHDR / CDPOS | OBJECTID · UDATE · FNAME | 계약 변경 이력 |
ACDOCA | RBUKRS · GJAHR · RACCT · HSL | 수익·누적효과 조정 전표 |
KNA1 | KUNNR · NAME1 | 고객 표기 |
define view entity ZC_ContractModItem
as select from ZI_ContractModification as cm
inner join I_SalesContract as sc on sc.SalesContract = cm.ContractNo
{
key cm.ModificationId as ModId,
cm.ContractNo as ContractNo,
sc.SoldToParty as Customer,
cm.ModificationDate as ModDate,
cm.OriginalAmount as OrigPrice,
cm.AddedAmount as AddPrice,
cm.AddedStandalonePrice as AddSsp,
cm.DistinctFlag as Distinct,
cm.Currency as Waers
}
표준 CDS 뷰 이름과 필드는 시스템 릴리스에 따라 다를 수 있으므로, 도입 시 실제 시스템에서 확인해 확정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 · 구성 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 패널 · 대사 요약 패널 · sap.m.IconTabBar 5개 탭 |
| 데이터 연동 | manifest.json dataSources.mainService(OData V2, 상대 경로) — 화면 블록마다 엔티티셋에 직접 바인딩합니다. 모델 설정은 useBatch:false · defaultBindingMode:"OneWay" · defaultCountMode:"Inline" |
| 조회조건 | sap.m.Input · sap.m.ComboBox — 우측 끝에 조회·초기화 버튼, Enter 키로 즉시 재조회, sap/ui/model/Filter로 조회조건을 조립합니다. "전체"를 고른 조건은 필터를 만들지 않습니다 |
| 정렬 · 페이징 | sap/ui/model/Sorter와 모델의 페이징 기능으로 처리 — 전체를 받아 화면에서 걸러내지 않습니다 |
| 명세·예외 표 | sap.ui.table.Table — 행 클릭 시 상세 다이얼로그 |
| 집계 표 | sap.m.Table — sap.m.ObjectStatus로 판정 상태를 표준 ValueState 로만 표시 |
| 공통 처리 | CSV 다운로드 공통 컨트롤러(UTF-8 BOM), 전역 오류 처리기 — 메타데이터 로드 실패·요청 실패·빈 응답을 구분해 안내 |
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon · lodash · moment, OData 서비스에 연결 |
Component.js | 화면 상태·조회조건 모델 초기화, 전역 오류 처리기 연결 |
manifest.json | 앱 디스크립터 — zui5.ctrmod · ko 로케일, OData 서비스와 모델 선언 |
view/Main.view.xml | 조회조건 · 대사 요약 · 5개 탭 |
view/DetailDialog.fragment.xml | 상세 내역 다이얼로그 |
controller/Main.controller.js | 조회조건 조립 · 바인딩 · 다이얼로그 · CSV 다운로드 |
controller/BaseController.js | CSV 다운로드 공통 처리 |
model/ErrorHandler.js | 전역 오류 처리 |
model/formatter.js | 금액 · 비율 · 상태 표시 서식 |
i18n/i18n_ko.properties | ko 로케일 리소스 |
운영 데이터는 OData 서비스가 제공하며, 검증용 샘플 데이터는 화면과 완전히 분리해 별도로 둡니다. 화면과 판정 로직은 그대로 씁니다.
검증 결과
화면 구성에 쓴 검증용 샘플 데이터는 12건의 계약변경을 기준으로 인식분·누적효과·잔여분·추가분이 원(KRW) 단위로 총 거래가격과 맞물리도록 구성했습니다.
| 검증 항목 | 결과 |
|---|---|
| 인식 누적 수익 = 원계약가 × 인도수량 ÷ 원수량 | 통과(차이 0) |
| 가격 차이율 = (추가 대가 − 개별 판매가격) ÷ 개별 판매가격 | 통과(차이 0) |
| 변경 유형 = 구별 여부 · 가격 차이 1% 이내로 판정 | 통과(차이 0) |
| 총 거래가격 보존 — 인식분 + 누적효과 + 잔여분 + 추가분 = 원계약가 + 추가 대가 | 통과(차이 0) |
| 별도 계약: 추가분 수익 = 추가 대가 · 누적효과 0 | 통과(차이 0) |
| 누적효과: 조정액 = 새 거래가격 × 새 진행률 − 인식 누적 | 통과(차이 0) |
| 장부 잔여분 수익 = 기준 | 통과(의도적 예외 제외 차이 0) |
| 장부 추가분 수익 = 기준 | 통과(의도적 예외 제외 차이 0) |
| 장부 누적효과 조정 = 기준 | 통과(의도적 예외 제외 차이 0) |
| 변경 유형별 집계 = 명세 집계 | 통과(차이 0) |
| 계약 범주별 집계 = 명세 집계 | 통과(차이 0) |
| 변경월별 집계 = 명세 집계 | 통과(차이 0) |
| 대사 요약행 = 실제 집계 결과 | 통과(차이 0) |
| 금액 차이 건 = 예외 등록 건 | 통과(의도적 예외 제외 차이 0) |
| 확인 대상 건 안내 | 별도 계약 합산 배분 1건 · 전진 적용 대상 별도 처리 1건 · 누적효과 누락 1건 · 경계 구간 1건(의도적으로 구성한 케이스) |
| 조회 조건 전달 — 12건 → 3건 필터 · top 3 · 내림차순 정렬 · __count 12 확인 | 확인 |
| 표시 금지 검사 — 커스텀 프로그램ID·앱 식별자·출처 표현 검출 | 0건 |
| 화면 렌더링 — 실브라우저에서 조회 → 탭 이동 → 행 클릭 상세까지 실동작 후 캡처 | 6/6 |
조회 버튼 위치 · sap_horizon 테마 · Enter 키 조회 · 서비스 미연결 시 오류 안내 | 확인 |
모든 데이터는 검증용으로 구성한 가상 데이터입니다.
자주 묻는 질문
이 화면의 판정이 곧 기준서 충족 여부인가요?
아닙니다. 이 화면은 계약변경 회계처리 결과를 집계·대사해 확인이 필요한 건을 가려내는 점검 도구입니다. 최종 판단은 기준서 원문에 따라 회사와 감사인이 합니다.
적용 시기와 범위는 어떻게 되나요?
IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호)은 이미 시행 중인 기준서입니다. 이 화면은 당사자가 승인한 계약 범위·가격 변경을 다룹니다. 변경이 생길 때마다 처리 유형이 달라지므로 결산마다 점검할 대상입니다.
유형이 달라도 총 수익은 같지 않나요?
계약 전체에서 인식할 총 수익은 같습니다. 화면도 인식분 + 누적효과 + 잔여분 + 추가분이 원계약가 + 추가 대가와 같은지 대사합니다. 다만 어느 기간에 얼마가 잡히는지가 달라집니다. 누적효과 유형은 변경일에 한 번에 조정되고, 전진 적용은 남은 기간에 나뉘어 반영됩니다.
개별 판매가격과 조금만 달라도 별도 계약이 아닌가요?
기준서는 개별 판매가격을 계약 상황에 맞게 적절히 조정한 금액을 반영하는지 보도록 합니다. 예를 들어 기존 고객이라 판매 비용이 들지 않아 깎아 준 금액은 조정으로 볼 수 있습니다. 화면의 1% 기준은 참고값이며, 경계에 있는 건은 할인 사유를 확인하도록 알려 줍니다.