SAP

TECO만 걸고 안심하기 그만 — 재공품 그대로 남는다 #shorts #SAP #SAP

📖 개요 — 이 글에서 얻어갈 것

생산오더를 TECO(기술적 완료) 처리했는데 월말 결산에서 재공품(WIP)이 그대로 남아 있는 경험, 한 번쯤 있을 것입니다. 반대로 CLSD(종결) 처리를 하려다 "잔액이 남아 있다"는 오류에 막히기도 합니다. 이 글은 오더 상태가 재공품 계산과 원가 정산에 미치는 영향을 원리부터 실전 점검까지 단계별로 다룹니다.

  • TECO와 CLSD가 시스템 내부에서 각각 무엇을 잠그고 무엇을 허용하는지 구분할 수 있다
  • 오더 상태별 WIP 계산 로직(생성 vs 해소)을 설명할 수 있다
  • TECO 상태인데 재공품이 남는 대표 시나리오의 원인을 추적할 수 있다
  • 정산 실행 전 상태 체크리스트를 실무에 적용할 수 있다

📚 먼저 알고 있으면 좋은 것

생산오더(PP 오더)의 기본 생애주기(CRTD → REL → DLV → TECO → CLSD)와 관리회계(CO)의 실제원가 개념을 알고 있다면 충분합니다. 오더별 제품원가(Product Cost by Order) 시나리오를 기준으로 설명하며, 결과분석 키(RA Key)와 정산 프로파일이라는 용어를 처음 들어도 본문에서 맥락과 함께 풀어갑니다.

🔧 환경 / 버전 / 준비물

이 글의 예제는 SAP S/4HANA 2023 (On-Premise) 기준이며, 상태 관리와 WIP 계산의 핵심 로직은 ECC 6.0에서도 일반적으로 동일하게 동작합니다. 사용하는 주요 트랜잭션은 다음과 같습니다.

  • CO02 / CO03 — 생산오더 변경/조회, 상태 확인
  • KKAX / KKAO — WIP 계산 (개별 / 집합)
  • KKS2 / KKS1 — 차이 계산 (개별 / 집합)
  • KO88 / CO88 — 정산 (개별 / 플랜트 단위)

예제 데이터는 모두 가상입니다: 플랜트 2100, 생산오더 60012345, 완제품 자재 PMP-CASING-EX2(펌프 케이싱), 결과분석 키 FERT-A, 정산 프로파일 PP01. CO 기간 잠금(OKP1) 권한과 WIP 계정 결정 설정(결과분석 버전)이 준비된 시스템을 가정합니다.

💡 핵심 개념 — TECO는 "작업 종료 선언", CLSD는 "회계 봉인"

두 상태를 이사(移徙)에 비유하면 이해가 빠릅니다. TECO는 "짐을 다 쌌다"는 선언입니다. 더 이상 새 짐(구매요청, 예약)은 만들지 않지만, 빠뜨린 물건을 상자에 넣는 것(사후 원가 전기)은 아직 가능합니다. CLSD는 "상자를 테이프로 봉인"하는 것입니다. 이후에는 어떤 원가도 오더에 들어올 수 없습니다.

내부적으로 상태는 상태 객체(OBJNR = OR + 오더번호)에 시스템 상태 코드로 저장됩니다. TECO는 I0045, CLSD는 I0046입니다. 각 상태가 잠그는 범위를 비교하면 다음과 같습니다.

동작TECO 이후CLSD 이후
미결 구매요청/예약삭제 플래그 처리이미 처리됨
작업 확인(Confirmation)가능 (사후 확인 허용)불가
자재 이동/송장 원가 전기가능불가
WIP 계산 시 처리WIP 해소 + 차이 계산 대상대상 아님 (이미 정리 완료 전제)
상태 되돌리기취소 가능취소 시 TECO로 복귀

WIP 계산 로직은 오더 상태를 분기 조건으로 사용합니다. 오더별 제품원가에서 WIP는 실제원가 기준으로 계산되며, 규칙은 단순합니다.

상태가 REL(출고 승인)이면 → 오더 잔액(차변 실제원가 − 대변 입고액)을 WIP로 생성
상태가 DLV(납품 완료) 또는 TECO이면 → 기존 WIP를 해소(취소)하고 잔액을 생산 차이로 전환

즉 TECO는 시스템에게 "이 오더의 잔액은 더 이상 미완성 재고가 아니라 차이(Variance)다"라고 알려주는 신호입니다. 다만 여기서 결정적인 함정이 있습니다. WIP 계산과 정산은 자동으로 따라오지 않습니다. TECO를 걸어도 KKAO와 CO88을 해당 기간에 다시 실행하지 않으면, 재무제표의 재공품 계정에는 이전 기간에 대변/차변 전기된 WIP가 그대로 남습니다. "TECO를 했는데 재공품이 안 풀린다"의 대부분은 상태 문제가 아니라 상태 변경 이후 결산 체인(간접비 → WIP → 차이 → 정산)을 재실행하지 않은 문제입니다.

💻 실전 예제 3단계

1단계 — 기본: 상태와 잔액을 직접 읽어보기

오더 60012345가 어떤 상태인지, 잔액이 얼마인지부터 확인합니다. CO03 헤더 화면의 상태 표시줄로도 보이지만, 대량 점검을 위해 상태 테이블을 직접 읽는 간단한 ABAP 예제를 만들어 봅니다.

REPORT zpp_order_status_check.

PARAMETERS: p_aufnr TYPE aufnr DEFAULT '000060012345'.

DATA(lv_objnr) = CONV j_objnr( |OR{ p_aufnr }| ).

" 활성 시스템 상태 조회 (JEST: INACT = 공백이 활성 상태)
SELECT j~stat, t~txt04, t~txt30
  FROM jest AS j
  INNER JOIN tj02t AS t
    ON  t~istat = j~stat
    AND t~spras = @sy-langu
  WHERE j~objnr = @lv_objnr
    AND j~inact = @abap_false
  INTO TABLE @DATA(lt_status).

LOOP AT lt_status INTO DATA(ls_status).
  WRITE: / ls_status-txt04, ls_status-txt30.
ENDLOOP.

" TECO(I0045) 여부 판정
IF line_exists( lt_status[ stat = 'I0045' ] ).
  WRITE: / '→ 기술적 완료 상태: WIP 해소 대상입니다.'.
ELSEIF line_exists( lt_status[ stat = 'I0046' ] ).
  WRITE: / '→ 종결 상태: 추가 원가 전기가 차단되어 있습니다.'.
ENDIF.

여기서 핵심은 INACT 필터입니다. TECO를 걸었다 취소하면 I0045 레코드가 비활성으로 남아 있으므로, 활성 상태만 걸러야 현재 상태를 정확히 판정할 수 있습니다.

2단계 — 실무 시나리오: "TECO인데 WIP가 남은 오더" 탐지와 로깅

월말 결산 전에 위험 오더를 미리 찾아내는 점검 프로그램입니다. 시나리오: 2100 플랜트에서 8월 15일에 60012345를 TECO 처리했지만, 7월 결산 때 계상된 WIP 42,800,000원이 아직 해소되지 않은 상황을 가정합니다. 예외 처리와 애플리케이션 로그를 함께 넣습니다.

" TECO 상태 + WIP 잔존 오더 탐지 (핵심 로직 발췌)
LOOP AT lt_teco_orders INTO DATA(ls_ord).
  TRY.
      " 결과분석 데이터에서 미해소 WIP 누계 확인
      SELECT SUM( wkgbtr )
        FROM cosb                     " 총계 레코드: 결과분석/WIP 값
        WHERE objnr  = @ls_ord-objnr
          AND wrttp  = '32'           " 값 유형: 결과분석 결과
          AND gjahr <= @p_gjahr
        INTO @DATA(lv_wip_amount).

      IF lv_wip_amount IS NOT INITIAL.
        " 위험 오더 → 로그 기록 후 결산 담당자 리포트에 적재
        ls_log-msgty = 'W'.
        ls_log-text  = |오더 { ls_ord-aufnr }: TECO 상태이나 | &&
                       |WIP { lv_wip_amount } 미해소. | &&
                       |KKAX/KO88 재실행 필요|.
        APPEND ls_log TO lt_logs.
      ENDIF.

    CATCH cx_sy_open_sql_db INTO DATA(lx_db).
      ls_log-msgty = 'E'.
      ls_log-text  = |오더 { ls_ord-aufnr } 조회 실패: { lx_db->get_text( ) }|.
      APPEND ls_log TO lt_logs.
  ENDTRY.
ENDLOOP.

" BAL_LOG 계열 API로 애플리케이션 로그 저장 → SLG1에서 추적

이 리포트에 걸린 오더는 처리 순서가 중요합니다. ① 해당 기간 간접비 계산 → ② KKAX(WIP 계산: TECO 상태이므로 WIP 해소분 산출) → ③ KKS2(차이 계산) → ④ KO88(정산: WIP 취소분이 FI로 전기). 이 체인 중 하나라도 건너뛰면 재공품 계정과 CO 데이터가 어긋납니다.

3단계 — 프로덕션: 결산 배치 설계와 CLSD 게이트

운영 환경에서는 개별 실행 대신 플랜트 단위 배치로 묶습니다. 성능·보안 관점의 권장 구성은 다음과 같습니다.

  • 실행 순서 고정: 배치 잡 체인을 간접비(CO43) → WIP(KKAO) → 차이(KKS1) → 정산(CO88) 순으로 선행 잡 성공 시에만 후속 실행되도록 구성
  • 성능: KKAO/CO88은 병렬 처리 서버 그룹을 지정하고, 처리 대상을 상태 선택 프로파일로 좁혀 전체 오더 스캔을 피함
  • 보안: 정산 실행 권한과 CLSD 처리 권한을 분리(직무 분리), 기간 잠금(OKP1)으로 결산 완료 기간의 재전기를 차단
  • 테스트: CO88을 먼저 테스트 실행 모드로 돌려 오류 오더 목록을 확보한 뒤 실전기

CLSD는 "정리 완료 게이트"로 사용합니다. 잔액이 0이 아닌 오더는 종결 시 오류가 발생하므로, 정산까지 끝난 오더만 월 1회 일괄 CLSD 처리하는 잡을 두면, 다음 결산부터 처리 대상 자체가 줄어 결산 시간이 단축됩니다.

-- 결산 후 CLSD 후보 검증 쿼리 (개념 예시: 잔액 0 + TECO 활성)
SELECT h.order_no, h.plant
  FROM zv_prodorder_bal AS h
 WHERE h.plant   = '2100'
   AND h.balance = 0
   AND h.status_teco = 'X'
   AND h.status_clsd = ' ';

⚠️ 흔한 실수와 트러블슈팅 FAQ

Q1. TECO를 걸었는데 왜 재공품이 그대로인가요?
가장 흔한 원인은 TECO 이후 해당 기간에 WIP 계산과 정산을 재실행하지 않은 것입니다. WIP 해소는 상태 변경 시점이 아니라 KKAX/KKAO 실행 시점에 계산되고, KO88/CO88 실행 시점에 FI로 전기됩니다. TECO 날짜와 결산 기간이 어긋난 경우(예: 9월 초에 8월 소급 TECO)도 확인하세요.

Q2. CLSD 처리 시 "잔액이 남아 있다"는 오류가 납니다.
정산이 끝나지 않았거나, 정산 후 사후 원가(송장 차이, 확인 취소)가 들어온 경우입니다. 해당 기간으로 KO88을 한 번 더 실행해 잔액을 0으로 만든 뒤 종결하세요. TECO 상태에서는 원가 전기가 여전히 가능하다는 점이 이 문제의 근본 원인입니다.

Q3. TECO를 취소하면 이미 해소된 WIP는 어떻게 되나요?
TECO 취소로 상태가 REL 기준으로 되돌아가면, 다음 WIP 계산에서 잔액이 다시 WIP로 생성됩니다. 즉 취소 후에도 반드시 WIP 계산과 정산을 재실행해 FI를 일치시켜야 합니다. 취소만 하고 결산 체인을 돌리지 않으면 차이로 전기됐던 금액이 어긋난 채 남습니다.

Q4. DLV와 TECO 중 어느 쪽이 WIP 해소 기준인가요?
오더별 제품원가에서는 둘 중 하나만 활성이어도 WIP 해소 대상입니다. 다만 DLV는 입고 완료의 결과 상태이고, TECO는 수동 선언이므로, 부분 입고 후 방치된 오더는 TECO를 걸어야 해소 대상에 들어옵니다.

🚀 이어서 보면 좋은 주제

이 글은 오더별 제품원가(Full Settlement) 기준이었습니다. 다음으로는 기간별 제품원가(Product Cost by Period)와 원가절감원장(Product Cost Collector)에서의 WIP 목표원가 계산, 결과분석 버전과 계정 결정(전기 규칙) 설정, 차이 카테고리(수량차이/가격차이/잔여차이) 분석, 그리고 S/4HANA의 이벤트 기반 생산회계(Event-Based Production Accounting)로 결산 체인이 어떻게 실시간화되는지를 살펴보면 흐름이 완성됩니다.

댓글 0

아직 댓글이 없습니다.