SAP 재고자산 Aging — 오래된 재고는 제값을 못 받는다
자재와 배치 단위로 재고 보유 기간을 재고, 장기재고 평가손실을 산출해 저장하는 화면입니다.
창고에 오래 있는 재고는 장부 금액만큼의 가치가 없습니다. 유행이 지났거나 품질이 떨어졌거나 아예 못 쓰게 됐을 수 있습니다.
회계는 이를 반영해 평가손실을 잡도록 요구합니다. 문제는 어느 재고가 얼마나 오래됐는지 배치 단위로 따져야 한다는 점입니다. 최종입고일 기준으로 재고일을 계산해 OpenUI5 화면으로 확장한 것이 이 앱입니다. 실제 구동 화면 3종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 자재 — 자재코드와 내역 · 배치 번호
- 플랜트 — 재고 보관 거점
- 배치 정보 — 최종입고일(Batch Last G/R Date)
- 재고 — 자가재고(배치재고)와 고객특별재고
- 평가 — 기말단가와 평가율
| 항목 | 내용 |
|---|---|
| 업무 영역 | 재무회계(FI) · 결산 · 재고 평가 |
| Namespace | zui5.invaging |
| 셸 구조 | 조회조건 영역(우측 조회) + Aging 테이블 + 소계·총계 |
| 화면 수 | 조회·저장 화면 1개 + 상세 |
| 데이터 | 자재·배치별 재고와 평가 이력 |
| 성격 | 산출·저장형 — Create 모드에서 재계산, 저장 후 조회 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 3종 둘러보기
회사코드·연도·월로 기준일을 정하고 재계산하면 배치별 재고일이 나옵니다 → 장기재고와 평가손실을 산출하고 → 결과를 저장해 이력으로 남깁니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회사코드·회계연도·월을 넣습니다. 해당 월 말일이 평가 기준일입니다.
- 자재나 플랜트로 범위를 좁힐 수 있습니다.
- 처리구분을 고릅니다. Create 는 재계산, Edit·Display 는 저장분 조회입니다.
- 조회 버튼은 조회조건 영역 오른쪽 끝에 있고, 입력필드에서 Enter 로도 조회됩니다.
- 재고일을 확인합니다. 최종입고일부터 기준일까지의 일수입니다.
- 평가율이 적용된 구간인지 봅니다. 180/365/730일 기준입니다.
- 플랜트 소계와 총계로 전체 규모를 확인합니다.
- 결과를 저장하면 평가 이력으로 남습니다.
평가 규칙
보유 기간이 길수록 높은 평가율이 적용됩니다.
재고일 = 기준일 − 배치 최종입고일 (0 미만이면 0)
총재고 = 자가재고(배치재고) + 고객특별재고
장기재고 = 평가율이 적용되는 구간이면 총재고 전량, 아니면 0
평가금액 = 장기재고 수량 × 기말단가
평가손실 = 평가금액 × 평가율
평가율 구간 180일 / 365일 / 730일 기준
총 평가손실 = 당기 평가손실 + 누적 평가손실
배치 단위로 보는 이유
같은 자재라도 배치마다 입고 시점이 다릅니다. 자재 단위로 평균을 내면 오래된 배치가 최근 입고분에 묻혀 장기재고로 잡히지 않습니다. 배치마다 최종입고일을 따져야 실제로 오래된 물량이 걸러집니다.
재고일 구간과 평가
| 재고일 | 상태 | 적용 |
|---|---|---|
| 180일 미만 | 정상 회전 범위 | 평가 대상 아님 |
| 180~365일 | 회전 지연 | 낮은 평가율 |
| 365~730일 | 장기 보유 | 높은 평가율 |
| 730일 초과 | 사실상 불용 | 최고 평가율 |
구간과 평가율은 평가율 테이블에서 관리합니다.
조회조건
| 항목 | 필수 | 설명 |
|---|---|---|
| 회사코드 / 회계연도 / 월 | 필수 | 대상 기간. 해당 월 말일이 평가 기준일 |
| 자재 | 선택 | 자재 범위 |
| 플랜트 | 선택 | 플랜트 범위 (화면 확장) |
| 처리구분 | 필수 | Create(재계산) / Edit · Display(저장분 조회) |
| 소계·총계 표시 | 선택 | SUBTOTAL / TOTAL 라인 (화면 확장) |
결과 컬럼
| 컬럼 | 의미 · 표시 |
|---|---|
| Material · Description | 자재코드와 내역 |
| Batch No. | 배치 번호 |
| Plant | 보관 거점 |
| Batch Last G/R Date | 배치 최종입고일 |
| Storage Period | 재고일 |
| 평가율 · 기말단가 | 손실 계산 기준 (화면 확장) |
| Total Stock | 총재고 = 자가 + 고객특별 |
| Long-term Stocks | 장기재고 수량 |
| Long-term stocks value | 평가금액 |
| Loss from val. | 당기 평가손실 |
| Accumulated loss from val. | 누적 평가손실 |
| Total loss from val. | 총 평가손실 |
| 소계 · 총계 | 플랜트 소계와 전체 총계 |
SAP 표준 기능 매핑
| 표준 | 역할 | 이 화면에서의 확장 |
|---|---|---|
MB52 | 자재 재고 조회 | Aging 기준으로 재구성 |
MB5B | 기간별 재고 | 입고 이력 |
MCHB · MCHBH | 배치 재고와 이력 | 조회 원천 |
MSKU · MSKA | 고객특별재고 · 판매오더재고 | 총재고 구성 |
MBEW · MBEWH | 자재 평가 | 기말단가 |
ZTFIF1000 · ZTFIF1200 | Aging 이력 · 평가율 | 저장과 기준 |
도입 시 확인이 필요한 부분
배치 관리를 쓰지 않는 자재는 최종입고일을 알 수 없습니다. 이 경우 자재 전체를 하나로 보거나 다른 기준을 써야 하는데, 정확도가 크게 떨어집니다. 평가 대상 자재가 배치 관리 대상인지 먼저 확인해야 합니다.
참고 CDS 뷰
@AbapCatalog.sqlViewName: 'ZCINVAGING'
@EndUserText.label: '재고자산 Aging (Z)'
define view Z_C_INVENTORY_AGING
with parameters p_keydate : dats
as select from mchb as BatchStock
left outer join mch1 as Batch on BatchStock.matnr = Batch.matnr
and BatchStock.charg = Batch.charg
left outer join makt as MatText on BatchStock.matnr = MatText.matnr
and MatText.spras = 'K'
left outer join mbew as Value on BatchStock.matnr = Value.matnr
and BatchStock.werks = Value.bwkey
{
key BatchStock.matnr as Material,
key BatchStock.werks as Plant,
key BatchStock.charg as Batch,
MatText.maktx as Description,
Batch.hsdat as LastGrDate,
BatchStock.clabs as UnrestrictedStock,
Value.verpr as UnitPrice
// 재고일 = 기준일 − 최종입고일 (0 미만이면 0)
// 평가율은 구간별 평가율 테이블에서 조회
// 평가손실 = 장기재고 × 기말단가 × 평가율
}
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경 설정과 릴리즈에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 영역 · Aging 테이블 |
| 조회조건 | sap.m.Select · sap.m.Input — 우측 끝에 조회 |
| Aging 테이블 | sap.ui.table.Table — 플랜트 그룹, 소계·총계 |
| 평가율 표시 | 구간별 적용 비율을 함께 표시 |
| 상세 | 배치 선택 시 재고 구성과 손실 계산 과정 펼침 |
| 이벤트 | onPAI 단일 진입점, fcCode 로 분기 |
평가율과 기말단가를 화면에 둔 이유
평가손실 금액만 나오면 그 숫자가 어떻게 나왔는지 알 수 없습니다. 검증하려면 수량과 단가와 비율을 각각 확인해야 합니다. 계산에 쓰인 값을 모두 보여 주면 화면에서 바로 검산이 되고, 감사 대응 자료로도 그대로 쓰입니다.
파일 구성
| 경로 | 역할 |
|---|---|
manifest.json | 앱 디스크립터 — 앱 ID(zui5.invaging) · ko 로케일 |
view/Main.view.xml | 조회조건과 Aging 테이블 |
controller/Main.controller.js | 재계산 · 평가손실 산출 · 저장 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) |
js/formatter.js | 수량 · 금액 · 일수 포맷터 |
localdata/invaging.json | 자재·배치별 재고 |
localdata/valrate.json | 평가율 기준 |
검증 결과
| 검증 항목 | 결과 |
|---|---|
| 재고일 = 기준일 − 최종입고일 · 음수 없음 | 통과 |
| 총재고 = 자가재고 + 고객특별재고 | 통과 |
| 평가금액 = 장기재고 × 기말단가 | 통과 |
| 평가손실 = 평가금액 × 평가율 | 통과 |
| 플랜트 소계 합 = 총계 | 통과 |
| XML · JSON 전체 파싱 | 오류 0건 |
| 화면 렌더링 — 실브라우저 재계산·저장 실동작 후 캡처 | 3/3 |
| 테마 런타임 확인 | sap_horizon |
자주 묻는 질문
왜 분기마다 하나요?
재고 평가는 결산 목적이라 분기 결산 주기에 맞춥니다. 매월 하면 부담이 크고 연 1회는 변동을 놓칩니다.
평가손실을 잡으면 되돌릴 수 있나요?
재고를 실제로 팔면 손실이 실현되고, 가치가 회복되면 환입할 수 있습니다. 다만 환입은 이전에 잡은 손실 범위 안에서만 가능합니다.
고객특별재고도 포함하나요?
포함합니다. 소유권이 우리에게 있으면 평가 대상입니다. 총재고에 자가재고와 함께 합산합니다.
SAP 표준 기능과 어떻게 이어지나요?
재고 수량과 단가는 표준 MM 이 관리합니다. 이 화면은 배치별 재고일을 계산해 평가손실을 산출하고 결과를 이력으로 저장하는 확장입니다.