매입채무 지급 처리 데이터 템플릿
매입채무 지급 처리 데이터 템플릿
- 공급업체 및 지급 분석에 필요한 주요 속성
- 지급 주기의 주요 프로세스 단계
- SAP S/4HANA 시스템에 맞춘 추출 로직
매입채무 지급 처리 속성
| 이름 | 설명 | ||
|---|---|---|---|
| 송장 번호 InvoiceNumber | 처리 중인 공급업체 송장을 식별하는 고유 번호입니다. | ||
| 설명 송장 번호는 SAP S/4HANA에서 매입채무 항목의 전체 처리 이력을 추적하는 기본 키입니다. 총계정원장에 송장을 전기할 때 생성되는 회계 문서 번호를 가리킵니다. SAP 표준 용어로는 특정 회사 코드와 회계연도에 속하는 문서 번호(BELNR)에 해당합니다. 프로세스 분석에서는 이 속성을 Case ID로 사용합니다. 송장 접수와 임시 저장부터 각종 승인 차단 및 변경, 최종 지급 반제까지 서로 다른 활동을 연결합니다. 이 번호를 기준으로 이벤트를 그룹화하면 지급 의무의 전체 처리 이력을 재구성할 수 있습니다. 중요한 이유 확정적인 Case ID로 사용되며, 지급 프로세스 흐름을 처음부터 끝까지 재구성할 수 있습니다. 확보 방법 SAP BKPF 테이블(회계 문서 헤더)의 BELNR 필드 또는 ACDOCA 테이블의 BELNR 필드 예시 1900000523510000289119000006015100003002 | |||
| 이벤트 시각 EventTime | 활동이 발생한 정확한 시각입니다. | ||
| 설명 이벤트 시각은 활동이 SAP 데이터베이스에 반영된 날짜와 시간을 기록합니다. 케이스 내 이벤트를 시간순으로 정렬하는 데 필요한 시간 정보를 제공합니다. 일반적으로 시스템 로그나 문서 헤더의 CPU 날짜 및 CPU 시간 필드를 조합해 이 시각을 구성합니다. 분석에서는 처리 시간, 소요 기간, 처리량을 계산하는 데 이 속성이 필요합니다. 송장 접수부터 최종 승인까지 각 단계 사이에 걸린 시간을 측정해 병목을 찾고, 평균 송장 승인 시간과 같은 KPI를 평가할 수 있습니다. 중요한 이유 이벤트의 시간순서를 제공하며, 시간 기반 성과 지표를 계산하는 기준이 됩니다. 확보 방법 SAP BKPF 테이블의 CPUDT(입력 날짜) 및 CPUTM(입력 시간) 필드 또는 CDHDR 테이블의 UDATE 및 UTIME 필드 예시 2023-10-12T08:30:00.000Z2023-10-12T14:15:22.000Z2023-10-15T09:00:00.000Z | |||
| 활동 Activity | 송장에 기록된 특정 작업 또는 이벤트 상태 변경입니다. | ||
| 설명 이 속성은 송장 처리 과정에서 발생하는 개별 단계를 나타냅니다. 송장 생성, 전기, 차단, 승인, 지급 반제 등의 이벤트를 기록합니다. 활동명은 원천 시스템의 트랜잭션 코드, 변경 로그 항목 또는 워크플로 상태 업데이트에서 가져옵니다. 분석에서는 이 필드로 프로세스 흐름의 변형을 매핑합니다. process mining 엔진에서 단계의 순서를 시각화하고, 재작업이 반복되는 구간을 찾으며, 표준 경로에서 벗어나는 지점을 파악할 수 있습니다. 이벤트 로그를 구성하는 주요 요소입니다. 중요한 이유 프로세스 맵의 노드를 정의해 워크플로와 병목을 시각화합니다. 확보 방법 트랜잭션 코드(TCODE) 또는 변경 문서 헤더(CDHDR)와 항목(CDPOS)에서 도출 예시 송장 전기지급 보류 설정지급 실행송장 반제 | |||
| 원천 시스템 SourceSystem | 데이터가 생성된 SAP S/4HANA 인스턴스의 식별자입니다. | ||
| 설명 이 속성은 프로세스 데이터를 추출한 ERP 설치 환경 또는 클라이언트를 식별합니다. 여러 SAP 인스턴스나 레거시 시스템을 함께 운영하는 환경에서는 데이터 계보를 유지하고 시스템 간 비교를 수행하는 데 사용됩니다. 분석에서는 상위 수준의 필터로 활용합니다. 지역별 시스템 설치 환경의 성과를 비교하거나 시스템 마이그레이션 중 데이터 일관성을 검증할 때 데이터를 구분할 수 있습니다. 시스템 구성에 따른 프로세스 차이를 정확히 해석하는 데도 도움이 됩니다. 중요한 이유 여러 시스템을 사용하는 환경에서 데이터 원천을 구분해 정확한 세분화를 지원합니다. 확보 방법 SAP 설치 환경의 시스템 ID(SY-SYSID) 예시 SAP_PROD_01S4H_NA_100ERP_EU_200 | |||
| 최종 데이터 업데이트 LastDataUpdate | 레코드를 마지막으로 추출하거나 새로 고친 시각입니다. | ||
| 설명 최종 데이터 업데이트는 데이터가 process mining 플랫폼에 성공적으로 적재된 시점을 나타냅니다. 비즈니스 이벤트가 발생한 시각이 아니라 데이터 세트의 최신성을 보여줍니다. 분석 대시보드에 대한 신뢰를 유지하는 데 중요합니다. 분석에서는 사용자가 조회 중인 정보가 얼마나 최신인지 파악할 수 있습니다. 지급 차단 분석과 같은 준실시간 대시보드를 모니터링할 때 특히 중요하며, 최신 SAP S/4HANA 시스템 상태를 바탕으로 의사결정할 수 있도록 합니다. 중요한 이유 데이터의 최신성을 알려주므로 운영 대시보드에서 중요합니다. 확보 방법 ETL 또는 추출 프로세스에서 생성 예시 2023-10-27T23:59:59.000Z2023-11-01T06:00:00.000Z | |||
| 공급업체 번호 VendorNumber | 송장과 관련된 공급업체를 식별하는 고유 번호입니다. | ||
| 설명 공급업체 번호는 SAP 보조원장의 특정 채권자 계정을 가리킵니다. 송장을 지급 조건, 은행 정보, 연락처가 포함된 마스터 데이터와 연결합니다. S/4HANA에서는 비즈니스 파트너 개념과 연결되는 경우가 많지만, 여러 테이블에서 기존 필드명 LIFNR을 그대로 사용합니다. 분석에서는 공급업체 지급 조건 준수 대시보드의 주요 속성입니다. 공급업체별로 프로세스 성과를 집계해 차단, 가격 차이 또는 지연을 반복적으로 유발하는 공급업체를 파악할 수 있습니다. 전략적 소싱과 공급업체 관계 관리에도 활용됩니다. 중요한 이유 공급업체별 성과를 집계해 지연의 근본 원인을 찾을 수 있습니다. 확보 방법 SAP BKPF 테이블의 LIFNR 필드 또는 ACDOCA 테이블의 LIFNR 필드 예시 100050VEND-US-99200400 | |||
| 무접촉 처리 여부 IsTouchless | 송장이 수작업 개입 없이 처리되었는지 나타내는 불리언 플래그입니다. | ||
| 설명 케이스의 이벤트 흐름을 분석해 계산합니다. 케이스에 자동화된 활동(예: 'system' 사용자, 특정 백그라운드 TCODE)만 있고 수동 변경이나 지급 차단이 없으면 무접촉 처리로 표시됩니다. 분석에서는 무접촉 송장 비율 KPI의 주요 지표로 사용됩니다. 조직은 이 지표를 통해 자동화 추진 성과를 추적하고, 공급업체나 지역별로 어떤 케이스가 사람의 개입 없이 시스템에서 처리되는지 파악할 수 있습니다. 중요한 이유 프로세스 자동화와 효율성을 측정하는 주요 지표입니다. 확보 방법 활동 순서와 사용자 유형을 기준으로 계산 예시 truefalse | |||
| 문서 유형 DocumentType | 회계 문서의 유형을 구분합니다(예: 공급업체 송장, 지급, 대변 메모). | ||
| 설명 문서 유형은 SAP에서 회계 거래를 분류하는 두 자리 코드입니다. 일반적인 유형으로는 공급업체 송장의 'KR', 공급업체 지급의 'KZ', 총액 기준 송장 접수의 'RE'가 있습니다. 문서 번호 범위와 필드 상태를 결정합니다. 분석에서는 프로세스 범위를 필터링하는 데 사용합니다. 예를 들어 지급 효율성만 분석하려는 경우 대변 메모를 제외할 수 있습니다. 처리 중인 거래 유형의 구성도 파악할 수 있으며, 프로세스 변형 복잡도 대시보드에도 활용됩니다. 중요한 이유 케이스를 송장과 대변 메모 등으로 분류해 조건별 분석을 지원합니다. 확보 방법 SAP BKPF 테이블의 BLART 필드 예시 KRREKZKG | |||
| 반제일 ClearingDate | 지급으로 송장이 반제된 날짜입니다. | ||
| 설명 반제일은 매입채무 원장의 미결 항목이 지급 실행이나 수동 지급 전기를 통해 정리된 날짜를 기록합니다. 이 시점에 채무가 종결됩니다. 분석에서는 프로세스의 최종 처리 시간을 계산하는 데 사용합니다. '지급 반제' 활동의 시각으로 사용되며, 순만기일과 비교해 정시 지급 성과를 판단합니다. 지급 반제 효율성 대시보드에도 직접 반영됩니다. 중요한 이유 지급 프로세스의 완료 시점을 나타내며, 지급 적시성을 판단하는 데 사용됩니다. 확보 방법 SAP BSEG 테이블의 AUGDT 필드 예시 2023-11-012023-11-15 | |||
| 사용자 이름 UserName | 특정 활동을 수행한 사용자의 ID입니다. | ||
| 설명 사용자 이름에는 프로세스 단계를 수행한 사람 또는 시스템 에이전트의 로그인 ID가 기록됩니다. 데이터를 입력한 사용자일 수도 있고, 자동 작업을 수행하는 백그라운드 작업 ID(예: 'BATCH_USER')일 수도 있습니다. 분석에서는 이 속성을 사용해 활동 자동화율을 계산합니다. 사람 사용자와 시스템 계정을 구분하면 프로세스의 자동화 수준을 측정할 수 있습니다. 팀별 업무량을 평가하는 수동 처리 지점 분포 대시보드에도 활용됩니다. 중요한 이유 수동 작업과 자동 작업을 구분해 자동화율을 계산할 수 있습니다. 확보 방법 SAP BKPF 테이블의 USNAM 필드 또는 CDHDR 테이블의 USERNAME 필드 예시 BSMITHWF-BATCHRJONES | |||
| 송장 금액 InvoiceAmount | 문서 통화로 표시된 송장의 총액입니다. | ||
| 설명 이 속성은 원천 문서에 기록된 송장의 재무 가치를 나타냅니다. 공급업체에 지급해야 할 채무 금액입니다. SAP S/4HANA에서는 일반적으로 문서 통화 금액 필드에 저장됩니다. 분석에서는 송장 금액을 기준으로 업무 우선순위를 정합니다. 수동 처리 지점 분포와 같은 대시보드에서 작업 부담이 큰 수동 활동이 소액 송장에 집중되는지 확인할 수 있습니다. 프로세스 실패로 인한 재무 위험이 큰 고액 거래에 개선 노력을 집중하는 데 도움이 됩니다. 중요한 이유 케이스의 재무 규모를 보여주므로 고액 거래의 프로세스 비효율을 우선적으로 파악할 수 있습니다. 확보 방법 SAP BKPF 또는 BSEG 테이블의 WRBTR 필드 예시 1500.00250.5010000.00 | |||
| 순만기일 NetDueDate | 위약금을 피하기 위해 송장을 지급해야 하는 계산된 날짜입니다. | ||
| 설명 순만기일은 지급 최종 기한입니다. 기준일에 최대 지급 조건 일수를 더해 계산합니다. 시스템에 명시적으로 저장되기도 하지만 분석 뷰에서 계산하는 경우가 많습니다. 분석에서는 연체 지급 및 위약금 추적의 주요 기준으로 사용합니다. 실제 반제일을 순만기일과 비교해 '연체 지급 일수'를 계산하면 매입채무 팀의 효율성과 공급업체 관계 악화 위험을 파악할 수 있습니다. 중요한 이유 프로세스의 목표 기한입니다. 기한을 넘기면 신용 평가에 영향을 주고 비용이 발생할 수 있습니다. 확보 방법 계산식: 기준일 + 최대 지급 조건 일수(ZBD1T/ZBD2T/ZBD3T) 예시 2023-11-302023-12-01 | |||
| 지급 조건 PaymentTerms | 합의된 지급 및 할인 조건을 나타내는 코드입니다. | ||
| 설명 지급 조건은 송장의 지급 기한과 조기 지급 시 현금 할인이 적용되는지를 정합니다. 이 코드(예: 'Z001')는 '30일 이내 지급' 또는 '10일 이내 지급 시 2% 할인, 그 외에는 30일 이내 지급'과 같은 규칙에 연결됩니다. 공급업체 마스터에서 송장으로 복사되지만 수동으로 변경할 수 있습니다. 분석에서는 조기 지급 할인 최적화 및 공급업체 지급 조건 준수 대시보드의 주요 속성입니다. 기준 만기일을 계산하고 절감 효과를 얻을 수 있는 기간 안에 지급했는지 확인할 수 있습니다. 중요한 이유 예상 지급 일정과 재무상 혜택을 정하므로 할인 분석에 중요합니다. 확보 방법 SAP BSEG 테이블의 ZTERM 필드 예시 Z001NT300001 | |||
| 지급 지연 여부 IsLatePayment | 결제가 순 만기일 이후에 이루어졌는지 나타내는 불리언 플래그입니다. | ||
| 설명 이 계산 속성은 반제일이 순 만기일보다 늦으면 true로 표시됩니다. 프로세스 성과를 이진값으로 분류하는 데 사용됩니다. 분석에서는 이 플래그를 사용해 연체료 발생 빈도 KPI의 규정 미준수 사례 수를 집계합니다. 시각화 단계에서 날짜를 복잡하게 계산하지 않아도 되며, true 값만 세면 되므로 대시보드를 간편하게 만들 수 있습니다. 중요한 이유 정시 처리 KPI를 간편하게 계산할 수 있습니다. 확보 방법 계산식: 반제일 > 순 만기일 예시 truefalse | |||
| 지급 차단 사유 PaymentBlockReason | 송장의 지급을 차단한 사유를 나타내는 코드입니다. | ||
| 설명 이 속성에는 자동 지급 실행에서 송장이 선택되지 않도록 설정한 구체적인 사유 코드가 들어 있습니다. 예를 들어 'A'는 지급 차단, 'R'은 송장 검증을 나타내며 사용자가 수동으로 설정한 차단도 포함됩니다. 분석에서는 수동 지급 차단 분석 대시보드의 주요 기준으로 사용합니다. 차단 사유별 발생 빈도를 집계하면 잦은 가격 차이나 입고 누락처럼 지급 프로세스를 지연시키는 구조적 문제를 진단할 수 있습니다. 중요한 이유 프로세스가 중단된 구체적인 원인을 파악해 원인별 분석과 대응을 지원합니다. 확보 방법 SAP BSEG 테이블의 ZLSPR 필드 예시 ABR* | |||
| 회사 코드 CompanyCode | 대차대조표와 손익계산서를 작성하는 조직 단위입니다. | ||
| 설명 회사 코드는 기업 내 독립적인 회계 단위를 나타냅니다. 외부 회계의 중심 조직 단위로, 재무 데이터를 구성하는 데 사용됩니다. 모든 송장은 하나의 회사 코드에 배정됩니다. 분석에서는 법인 또는 지역별로 KPI를 구분할 수 있습니다. 대시보드에서 자회사별 매입채무 팀의 효율성을 비교하는 데 사용합니다. 예를 들어 특정 지점의 수동 지급 차단 비율이 회사 기준보다 높은지 확인할 수 있습니다. 중요한 이유 법인별로 프로세스를 구분해 내부 성과 비교를 지원합니다. 확보 방법 SAP BKPF 테이블의 BUKRS 필드 예시 US01DE1010002000 | |||
| 구매 문서 PurchasingDocument | 송장과 연결된 구매 주문 번호입니다. | ||
| 설명 이 속성은 송장을 상위 조달 프로세스와 연결합니다. 송장 대조에 사용되는 구매 주문(PO) 번호가 포함됩니다. 기타 비용과 같이 모든 송장에 PO 참조가 있는 것은 아닙니다. 분석에서는 3자 대조율 분석에 중요합니다. PO가 있는 송장과 없는 송장을 구분할 수 있으며, 두 유형은 승인 워크플로가 크게 다를 수 있습니다. 매입채무 데이터와 조달 데이터를 연결해 전체 프로세스를 process mining으로 분석하는 데도 활용됩니다. 중요한 이유 매입채무와 조달 프로세스를 연결해 3자 대조 분석과 프로세스 확장을 지원합니다. 확보 방법 SAP BSEG 테이블의 EBELN 필드 예시 45000012344500009876 | |||
| 기준일 BaselineDate | 지급 조건이 적용되고 만기일 계산이 시작되는 날짜입니다. | ||
| 설명 기준일은 순만기일과 현금 할인 기간을 계산하는 시작점입니다. 설정과 공급업체 마스터 데이터에 따라 일반적으로 송장일 또는 전기일을 사용합니다. 분석에서는 '지급 지연 여부'를 계산하기 위한 기술적 기준입니다. 기준일이 잘못되면 조기 지급으로 현금 흐름에 영향이 생기거나, 지급 지연으로 위약금이 발생할 수 있습니다. 공급업체 지급 조건 준수 분석의 일부로 기준일의 정확성을 확인합니다. 중요한 이유 모든 만기일 계산의 기준이 됩니다. 확보 방법 SAP BSEG 테이블의 ZFBDT 필드 예시 2023-10-012023-10-15 | |||
| 미수취 할인액 DiscountLostAmount | 적용 가능했지만 받지 못한 현금 할인액입니다. | ||
| 설명 이 계산 속성은 놓친 절감액을 나타냅니다. 결제가 할인 기한 이후에 이루어졌는지 확인하고, 기한을 넘긴 경우 송장 금액에 적용되는 할인율을 기준으로 미수취 할인액을 계산합니다. 분석에서는 조기 결제 할인 최적화의 주요 재무 지표로 사용됩니다. 비효율로 인한 비용을 실제 금액으로 보여 주므로 프로세스 개선의 사업적 근거를 마련하는 데 도움이 됩니다. 중요한 이유 프로세스 지연으로 발생한 직접적인 재무 손실을 수치화합니다. 확보 방법 계산식: 반제일 > 할인일인 경우 송장 금액 × 할인율 예시 30.000.00150.00 | |||
| 통화 Currency | 송장 금액에 적용되는 통화 코드입니다. | ||
| 설명 통화 속성은 송장 금액의 표시 통화를 지정합니다(예: USD, EUR, GBP). 재무 금액을 올바르게 해석하고 여러 국가의 회사 코드를 아우르는 데이터를 집계하는 데 필요합니다. 분석에서는 재무 KPI를 정확하게 계산하는 데 사용합니다. 글로벌 대시보드에서 값을 보고 통화로 환산할 때도 활용합니다. 이 속성이 없으면 여러 통화를 사용하는 환경에서 총지출이나 평균 송장 금액과 같은 집계 지표를 의미 있게 해석하기 어렵습니다. 중요한 이유 재무 금액의 통화 정보를 제공해 글로벌 보고의 정확성을 높입니다. 확보 방법 SAP BKPF 테이블의 WAERS 필드 예시 USDEURGBPJPY | |||
| 현금 할인 기간 1 CashDiscountDays1 | 기준일부터 첫 번째 현금 할인을 받을 수 있는 기간(일수)입니다. | ||
| 설명 이 속성은 가장 유리한 지급 조건을 적용받을 수 있는 기간을 나타냅니다(예: '10일 이내 지급 시 2% 할인, 그 외에는 30일 이내 지급'에서 '10'). 송장 개별 항목에 저장된 지급 조건에서 가져옵니다. 분석에서는 조기 지급 할인 최적화의 '목표일'을 계산하는 데 사용합니다. 이 기간 안에 송장을 반제하면 할인을 적용받습니다. 처리 주기가 길어져 발생하는 기회비용을 측정하는 데도 도움이 됩니다. 중요한 이유 재무적 절감 기회를 얻을 수 있는 기간을 정합니다. 확보 방법 SAP BSEG 테이블의 ZBD1T 필드 예시 10140 | |||
| 현금 할인율 1 CashDiscountPercentage1 | 첫 번째 할인 기간 내에 지급할 때 적용되는 할인율입니다. | ||
| 설명 이 속성은 공급업체가 조기 지급에 제공하는 재무상 혜택의 비율을 나타냅니다(예: '10일 이내 지급 시 2% 할인'에서 '2'). 분석에서는 '잠재 현금 할인액'을 계산하는 데 사용합니다. 이 비율에 송장 금액을 곱하면 프로세스 비효율로 놓친 할인액을 대시보드에서 확인할 수 있습니다. 자동화의 사업 타당성을 검토할 때도 활용됩니다. 중요한 이유 잠재 절감률을 수치화해 투자 수익률(ROI) 계산에 활용합니다. 확보 방법 SAP BSEG 테이블의 ZBD1P 필드 예시 2.03.00.0 | |||
| 회계연도 FiscalYear | 송장이 속한 회계연도입니다. | ||
| 설명 회계연도는 재무 보고에 사용하는 기간입니다. 회사 코드 및 문서 번호와 함께 SAP 재무 문서의 복합 기본 키를 구성합니다. 분석에서는 케이스를 고유하게 식별하기 위한 기술적 요건이며, 전년 대비 보고에도 활용됩니다. 수십 년간 축적된 데이터에서도 '송장 번호' Case ID가 고유하게 유지되도록 합니다. 중요한 이유 SAP FI에서 케이스를 고유하게 식별하기 위한 기술적 요건입니다. 확보 방법 SAP BKPF 테이블의 GJAHR 필드 예시 20232024 | |||
매입채무 지급 처리 활동
| 활동 | 설명 | ||
|---|---|---|---|
| 송장 전기 | 총계정원장에 채무를 공식적으로 기록하는 단계입니다. BKPF 테이블의 생성 타임스탬프 또는 ACDOCA 테이블의 입력일을 기준으로 확인합니다. | ||
| 중요한 이유 재무 처리 일정의 기준이 되는 시작점으로, 지급 기한과 경과 기간 분석의 기준을 설정합니다. 확보 방법 BKPF 테이블의 CPUDT(입력일) 및 CPUTM(입력 시간)을 사용합니다. 기록 BKPF 레코드 생성 시 기록 이벤트 유형 explicit | |||
| 지급 문서 생성 | 은행 계정을 대변에, 공급업체 계정을 차변에 기록하는 회계 문서가 생성됩니다. 지급 문서 유형(예: ZP, KZ)으로 BKPF에서 확인할 수 있습니다. | ||
| 중요한 이유 지급이 재무적으로 처리된 시점으로, 매입채무 지급일수(DPO) 계산에 사용됩니다. 확보 방법 지급에 해당하는 문서 유형(BLART)으로 필터링한 BKPF 테이블. 기록 BKPF 지급 문서 생성 시 기록 이벤트 유형 explicit | |||
| 지급 반제 | 공급업체 계정의 미결 항목이 지급과 상계되는 최종 반제 단계입니다. BSEG 테이블의 AUGDT(반제일) 필드에서 확인합니다. | ||
| 중요한 이유 프로세스가 완료되고 장부가 일치하는 최종 상태입니다. 수동 반제 비율이 높으면 대사 효율이 낮다는 의미일 수 있습니다. 확보 방법 BSEG 테이블의 AUGDT(반제일) 필드. 기록 AUGDT 필드 입력 시 기록 이벤트 유형 explicit | |||
| 지급 보류 설정 | 송장 개별 항목에 지급 보류가 설정되어 지급 실행 대상에 포함되지 않는 상태를 나타냅니다. 변경 문서를 통해 BSEG 테이블의 ZLSPR 필드 변경을 모니터링해 기록합니다. | ||
| 중요한 이유 지급 보류는 연체와 프로세스 지연의 주요 원인으로, 수동 지급 보류 분석 대시보드에 직접 반영됩니다. 확보 방법 CDPOS 및 CDHDR 테이블(변경 문서)에서 BSEG-ZLSPR 필드의 변경을 확인합니다. 기록 CDPOS에서 ZLSPR 레코드 변경 시 기록 이벤트 유형 explicit | |||
| 지급 보류 해제 | 기존에 설정된 지급 보류가 해제되어 송장을 지급할 수 있는 상태를 나타냅니다. BSEG의 ZLSPR 필드 값이 다른 값에서 null 또는 빈 값으로 변경되었는지 확인합니다. | ||
| 중요한 이유 명시적인 워크플로 로그가 없는 시스템에서는 '송장 승인'의 대리 지표로 사용되며, 병목이 해소된 시점을 나타냅니다. 확보 방법 CDPOS 및 CDHDR 테이블에서 BSEG-ZLSPR이 빈 값으로 변경되었는지 확인합니다. 기록 CDPOS에서 ZLSPR 보류 해제 기록 시 기록 이벤트 유형 explicit | |||
| 지급 실행 | 이벤트는 자금 이체 지시가 생성되는 지급 실행을 나타냅니다. REGUH 또는 REGUP 테이블의 상태 업데이트로 추적합니다. | ||
| 중요한 이유 지급을 확정하는 운영 단계로, 지급 일괄 처리의 효율성을 분석할 때 중요합니다. 확보 방법 일반적으로 실행일 및 식별 정보와 연계되는 REGUH 테이블. 기록 지급 실행 상태 업데이트 시 기록 이벤트 유형 explicit | |||
| 가격 차이 감지 | 송장 가격과 구매 주문서 가격이 일치하지 않음을 나타내는 추정 활동입니다. 전기 시 특정 지급 보류 키가 자동 적용되는지 확인해 파악하며, 송장 검증에는 일반적으로 'R'이 사용됩니다. | ||
| 중요한 이유 수동 재작업의 근본 원인을 파악하고 3자 대사율 분석을 지원합니다. 확보 방법 전기 시점의 BSEG-ZLSPR 값 'R' 또는 가격 보류에 대한 시스템별 설정을 기준으로 추정합니다. 기록 ZLSPR 값이 'R'인지 비교 이벤트 유형 inferred | |||
| 송장 임시 저장 | 송장이 SAP에 입력되었지만 아직 총계정원장에 전기되지 않은 상태를 나타내며, 주로 예비 데이터 입력에 사용됩니다. VBKPF 테이블에서 직접 확인하거나 전기 상태 코드가 임시 저장을 나타내는 BKPF 문서를 찾아 전기 전 상태를 기록합니다. | ||
| 중요한 이유 임시 저장은 데이터 입력 단계의 시작을 나타내며, 송장 접수부터 재무상 채무가 기록될 때까지 걸리는 시간을 측정하는 데 도움이 됩니다. 확보 방법 임시 저장 문서의 헤더 데이터가 담긴 VBKPF 테이블 또는 특정 문서 상태(BSTAT = V)의 BKPF. 기록 VBKPF 항목 생성 시 기록 이벤트 유형 explicit | |||
| 송장 지급 기한 도래 | 송장의 순지급 기한이 도래한 시점을 나타내는 계산된 타임스탬프입니다. BSEG 테이블의 기준일에 지급 조건의 일수를 더해 산출합니다. | ||
| 중요한 이유 정시 지급 성과 및 연체료 추적의 기준점으로 사용됩니다. 확보 방법 계산식: BSEG-ZFBDT(기준일) + BSEG-ZBD1T/ZBD2T/ZBD3T(일수). 기록 현재 날짜와 순지급 기한을 비교해 산출 이벤트 유형 calculated | |||
| 송장 취소 | 송장 문서가 역분개되거나 취소되었음을 나타냅니다. BKPF 테이블의 STBLG(역분개 문서) 필드로 확인합니다. | ||
| 중요한 이유 재작업과 프로세스 실패를 나타내며, 낭비와 중복 작업 가능성을 파악하는 데 사용됩니다. 확보 방법 BKPF 테이블의 STBLG 필드가 비어 있지 않음. 기록 STBLG 필드 입력 시 기록 이벤트 유형 explicit | |||
| 수량 차이 감지 | 송장 수량과 입고 수량이 일치하지 않음을 나타내는 추정 활동입니다. 개별 항목에 특정 지급 보류 키가 적용되었는지 확인해 파악하며, 수량 차이에는 일반적으로 'M'이 사용됩니다. | ||
| 중요한 이유 대사 효율과 공급망 데이터 품질을 분석하는 데 중요합니다. 확보 방법 BSEG-ZLSPR 값 'M' 또는 수량 보류에 대한 시스템별 설정을 기준으로 추정합니다. 기록 ZLSPR 값이 'M'인지 비교 이벤트 유형 inferred | |||
| 지급 제안 생성 | 송장이 자동 지급 프로그램의 첫 단계인 지급 제안 실행(F110)에 포함되었음을 나타냅니다. 정산 데이터를 저장하는 REGUH 테이블에서 확인합니다. | ||
| 중요한 이유 송장이 지급 대상으로 선택되고 지급 프로그램의 유효성 검사를 통과했음을 나타냅니다. 확보 방법 REGUH 테이블 생성 시각(LAUFD 및 LAUFI 키). 기록 REGUH 레코드 생성 시 기록 이벤트 유형 explicit | |||
| 지급 조건 변경 | 미결 송장의 지급 조건이 변경된 기록입니다. 변경에 따라 지급 기한이나 할인 적용 여부가 달라질 수 있습니다. BSEG 테이블의 ZTERM 필드 변경 로그를 통해 추적합니다. | ||
| 중요한 이유 변경이 잦으면 기준정보 오류나 수동 재정의가 있음을 나타낼 수 있으며, 현금 흐름 예측과 공급업체 지급 조건 준수에 영향을 줍니다. 확보 방법 CDPOS 및 CDHDR 테이블에서 BSEG-ZTERM 필드의 변경을 확인합니다. 기록 CDPOS에서 ZTERM 레코드 변경 시 기록 이벤트 유형 explicit | |||
| 현금 할인 기회 상실 | 현금 할인 적용 기한이 만료된 날짜를 나타내는 계산된 이벤트입니다. 할인 지급 기한을 현재 날짜 또는 실제 지급일과 비교해 산출합니다. | ||
| 중요한 이유 조기 지급 할인 최적화 도구에서 놓친 재무 절감 기회를 시각화하는 데 필요합니다. 확보 방법 계산식: BSEG-ZFBDT + BSEG-ZBD1T(할인 기간 1). 기록 날짜와 할인 지급 기한을 비교해 산출 이벤트 유형 calculated | |||
데이터 추출 가이드
단계
필요한 CDS 뷰 확인: SAP S/4HANA 표준 CDS 뷰를 사용할 수 있는지 확인합니다. 필요한 주요 뷰는 I_JournalEntry(헤더), I_OperationalAcctgDocItem(항목/BSEG에 해당), I_SupplierInvoice(물류), I_PaymentProposalItem(F110), I_ChangeDocument(로그)입니다.
사용자 권한 설정: 데이터베이스 사용자 또는 기술 서비스 사용자가 CDS 엔터티와 연결된 DDL SQL 뷰에 SELECT 권한을 보유하는지 확인합니다. 일반적으로 SAP HANA Studio 또는 ABAP Eclipse Development Tools(ADT)에서 설정합니다.
SQL 환경 준비: SQL 인터페이스(예: SAP HANA Studio, HANA에 연결된 DBeaver 또는 SQL을 지원하는 process mining 커넥터)를 엽니다. 이 방법은 CDS 뷰가 뷰로 노출되는 HANA 계층에 직접 SQL로 접근할 수 있다고 가정합니다.
범위 설정: 데이터 양을 제한할 회사 코드(CompanyCode)와 회계연도 범위를 정합니다. Operational Accounting Document Item 뷰를 조회할 때 성능을 위해 중요합니다.
활동 로직 구현: 아래에 제공된 SQL 쿼리를 복사합니다. 이 쿼리는 UNION ALL을 사용해 14개의 개별 로직 블록을 하나의 이벤트 로그 구조로 결합합니다. 각 블록은 송장 전기, 지급 반제와 같은 특정 활동을 대상으로 합니다.
변경 문서 처리: 쿼리에는 지급 조건 변경과 차단 변경 관련 구문이 포함되어 있습니다. 이 구문은 I_ChangeDocument 뷰를 사용합니다. 사용 중인 S/4 릴리스에서 이 뷰가 활성화되어 있지 않으면 기본 테이블(CDHDR/CDPOS)을 사용자 지정 CDS 뷰로 감싸야 할 수 있습니다.
계산 이벤트 확인: Invoice Due와 Cash Discount Lost의 로직을 검토합니다. 이 이벤트는 운영 항목 뷰의 기준일에 일수를 더해 생성됩니다.
추출 실행: 쿼리를 실행합니다. 대용량 데이터의 경우 메모리 초과를 방지하기 위해 회계연도나 회사 코드별로 나누어 추출하는 것이 좋습니다.
날짜 형식 확인: EventTime 열이 YYYY-MM-DD HH:MM:SS 형식인지 확인합니다. SAP HANA SQL에서 반환되는 타임스탬프는 대상 애플리케이션에 따라 형식 변환이 필요할 수 있습니다.
데이터 내보내기: 결과를 CSV 또는 Parquet 파일로 저장합니다. 헤더가 최종 SELECT 문에 정의된 열 이름과 일치하는지 확인합니다.
업로드용 데이터 변환: process mining 도구에서 특정 CSV 형식(예: 특정 날짜 마스킹)을 요구하는 경우 후처리 스크립트나 SQL의 TO_VARCHAR 함수로 변환합니다.
최종 검증: 샘플 데이터를 ProcessMind에 불러와 Case ID(송장 번호)가 전기부터 반제까지 모든 활동을 올바르게 묶는지 확인합니다.
구성
- 회사 코드 필터: 쿼리를 특정 조직 단위(CompanyCode = '1000')로 제한해 맥락과 성능을 유지합니다.
- 날짜 범위: 데이터 양을 관리할 수 있도록 PostingDate 또는 CreationDate에 필터를 적용합니다(예: 최근 12개월).
- 계정 유형: I_OperationalAcctgDocItem에서 FinancialAccountType = 'K'(공급업체)로 필터링해 총계정원장 및 고객 항목을 제외합니다.
- CDS 뷰 활성화: I_JournalEntry, I_OperationalAcctgDocItem, I_PaymentProposalItem 뷰가 활성화되어 있고 SQL 접근이 허용되는지 확인합니다.
- 변경 로그 성능: I_ChangeDocument 조회는 리소스를 많이 사용할 수 있습니다. ObjectClass 'BELEG'와 ZLSPR, ZTERM 같은 특정 필드 이름으로 하위 쿼리 범위를 제한합니다.
샘플 쿼리 sql
/* SAP S/4HANA CDS View Extraction for Accounts Payable */
/* Combined Event Log Query */
/* 1. Invoice Parked */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Parked' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
JE.CreatedByUser AS UserName,
NULL AS ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
CASE WHEN JE.CreationDateTime > ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) THEN 'True' ELSE 'False' END AS IsLatePayment,
'False' AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K' -- Vendor
AND JE.AccountingDocumentCategory = 'V' -- Parked Document
UNION ALL
/* 2. Invoice Posted */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Posted' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
JEItem.PaymentBlockingReason AS PaymentBlockReason,
JE.CreatedByUser AS UserName,
NULL AS ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
'False' AS IsLatePayment,
CASE WHEN JE.CreatedByUser = 'BATCH_USER' THEN 'True' ELSE 'False' END AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JE.AccountingDocumentCategory <> 'V' -- Exclude Parked
UNION ALL
/* 3. Price Variance Detected (Inferred at Posting) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Price Variance Detected' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
JEItem.PaymentBlockingReason AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.PaymentBlockingReason = 'R' -- Standard SAP Price Variance Block Key
UNION ALL
/* 4. Quantity Variance Detected (Inferred at Posting) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Quantity Variance Detected' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
JEItem.PaymentBlockingReason AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.PaymentBlockingReason = 'M' -- Standard SAP Quantity Variance Block Key
UNION ALL
/* 5. Payment Block Applied (via Change Document) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Block Applied' AS Activity,
CD.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
CD.NewValue AS PaymentBlockReason,
CD.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_ChangeDocument AS CD
JOIN I_JournalEntry AS JE ON CD.ObjectValue = CONCAT(JE.CompanyCode, JE.AccountingDocument)
JOIN I_OperationalAcctgDocItem AS JEItem ON JE.AccountingDocument = JEItem.AccountingDocument AND JE.CompanyCode = JEItem.CompanyCode
WHERE CD.ObjectClass = 'BELEG'
AND CD.TableName = 'BSEG'
AND CD.FieldName = 'ZLSPR'
AND CD.OldValue IS NULL AND CD.NewValue IS NOT NULL
UNION ALL
/* 6. Payment Block Removed (via Change Document) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Block Removed' AS Activity,
CD.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
CD.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_ChangeDocument AS CD
JOIN I_JournalEntry AS JE ON CD.ObjectValue = CONCAT(JE.CompanyCode, JE.AccountingDocument)
JOIN I_OperationalAcctgDocItem AS JEItem ON JE.AccountingDocument = JEItem.AccountingDocument AND JE.CompanyCode = JEItem.CompanyCode
WHERE CD.ObjectClass = 'BELEG'
AND CD.TableName = 'BSEG'
AND CD.FieldName = 'ZLSPR'
AND CD.OldValue IS NOT NULL AND (CD.NewValue IS NULL OR CD.NewValue = '')
UNION ALL
/* 7. Payment Terms Changed (via Change Document) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Terms Changed' AS Activity,
CD.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
CD.NewValue AS PaymentTerms,
NULL AS PaymentBlockReason,
CD.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_ChangeDocument AS CD
JOIN I_JournalEntry AS JE ON CD.ObjectValue = CONCAT(JE.CompanyCode, JE.AccountingDocument)
JOIN I_OperationalAcctgDocItem AS JEItem ON JE.AccountingDocument = JEItem.AccountingDocument AND JE.CompanyCode = JEItem.CompanyCode
WHERE CD.ObjectClass = 'BELEG'
AND CD.TableName = 'BSEG'
AND CD.FieldName = 'ZTERM'
UNION ALL
/* 8. Invoice Due (Calculated) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Due' AS Activity,
TO_TIMESTAMP(ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays))) AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) < CURRENT_DATE
UNION ALL
/* 9. Cash Discount Lost (Calculated) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Cash Discount Lost' AS Activity,
TO_TIMESTAMP(ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.CashDiscount1Days))) AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.CashDiscount1Days > 0
AND (JEItem.ClearingDate IS NULL OR JEItem.ClearingDate > ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.CashDiscount1Days)))
UNION ALL
/* 10. Payment Proposal Created */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Proposal Created' AS Activity,
PPI.ProposalRunDate AS EventTime, -- Often just a date, cast to timestamp if needed
JE.CompanyCode,
PPI.Supplier AS VendorNumber,
PPI.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
PPI.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_PaymentProposalItem AS PPI
JOIN I_JournalEntry AS JE
ON PPI.CompanyCode = JE.CompanyCode
AND PPI.AccountingDocument = JE.AccountingDocument
AND PPI.FiscalYear = JE.FiscalYear
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JEItem.FinancialAccountType = 'K'
UNION ALL
/* 11. Payment Run Executed */
/* Derived from existence in payment tables with a run ID */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Run Executed' AS Activity,
PPI.PaymentRunDate AS EventTime,
JE.CompanyCode,
PPI.Supplier AS VendorNumber,
PPI.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
PPI.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_PaymentProposalItem AS PPI
JOIN I_JournalEntry AS JE
ON PPI.CompanyCode = JE.CompanyCode
AND PPI.AccountingDocument = JE.AccountingDocument
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
WHERE PPI.PaymentRunID IS NOT NULL
UNION ALL
/* 12. Payment Document Created */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Document Created' AS Activity,
PayJE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
PayJE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
PayJE.CreatedByUser AS UserName,
PayJE.PostingDate AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
JOIN I_JournalEntry AS PayJE
ON JEItem.ClearingJournalEntry = PayJE.AccountingDocument
AND JEItem.ClearingJournalEntryFiscalYear = PayJE.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.ClearingJournalEntry IS NOT NULL
UNION ALL
/* 13. Payment Cleared */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Cleared' AS Activity,
TO_TIMESTAMP(JEItem.ClearingDate) AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
'System' AS UserName,
JEItem.ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
CASE WHEN JEItem.ClearingDate > ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) THEN 'True' ELSE 'False' END AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.ClearingDate IS NOT NULL
UNION ALL
/* 14. Invoice Reversed */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Reversed' AS Activity,
RevJE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
RevJE.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
JOIN I_JournalEntry AS RevJE
ON JE.ReverseDocument = RevJE.AccountingDocument
AND JE.ReverseDocumentFiscalYear = RevJE.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JE.ReverseDocument IS NOT NULL 단계
- ACDOCA, BKPF, BSEG, VBKPF, REGUH, REGUP 및 해당 변경 문서 테이블이 포함된 SAP HANA 스키마에 직접 SQL로 액세스할 수 있는지 확인합니다. [Your SAP HANA schema]와 연결 정보를 시스템에서 승인한 값으로 바꿉니다.
- 송장 대상 범위와 보고 기간을 확인합니다. [Start date]와 [End date]를 YYYYMMDD 형식으로 설정하고, [Company code filter]에는 BUKRS IN ('1000','2000')과 같이 유효한 SQL 조건을 지정합니다.
- 보류 문서, 지급 프로그램 상태 필드, 지급 문서 유형, 변경 문서 저장 방식에 관한 SAP 릴리스 및 로컬 구성을 확인합니다. 쿼리는 문서화된 소스 객체와 보수적인 필드 매핑을 사용하지만, 운영 환경에서 사용하기 전에 로컬 확장과 릴리스별 차이를 점검해야 합니다.
- 승인된 SQL 클라이언트 또는 추출 서비스를 사용해 SAP HANA에서 쿼리를 실행합니다. 쿼리는 명시적으로 추출한 각 활동에 대해 이벤트 행 하나를 생성합니다. 결과에 없는 활동을 ProcessMind가 추론하지는 않습니다.
- 소스 데이터를 검토하고 보류 상태, 지급 문서 유형, 지급 제안 및 지급 실행 상태, 변경 문서 객체 클래스에 표시된 구성 조건을 조정합니다. 중복되거나 관련 없는 회계 문서를 대조하지 않은 상태에서 조건 범위를 넓히지 마세요.
- 해당하는 경우 InvoiceNumber, CompanyCode, 회계연도, 회계 문서 번호, 공급업체 번호, 개별 항목을 기준으로 조인을 검증합니다. 대상 시스템에서 BKPF, BSEG, ACDOCA, REGUH, REGUP 간에 송장 문서 번호가 일관된 형식으로 표시되는지 확인합니다.
- 계산된 이벤트를 대조합니다. Invoice Due는 계산된 순 만기일에 생성되며, Cash Discount Lost는 해당 기한 전에 지급이 없을 때 가장 먼저 도래하는 할인 기한에 생성됩니다. 이 행은 파생 데이터이므로 소스 레코드에서 가져온 이벤트와 명확히 구분해야 합니다.
- 결과를 UTF-8 CSV 또는 ProcessMind에서 지원하는 다른 표 형식으로 내보냅니다. InvoiceNumber, Activity, EventTime, SourceSystem, LastDataUpdate 열 이름을 정확히 유지합니다. 이벤트마다 행을 하나씩 두고 송장별로 활동을 집계하지 않습니다.
- 이벤트 로그를 ProcessMind에 업로드하고 InvoiceNumber를 케이스 식별자, Activity를 활동 이름, EventTime을 이벤트 타임스탬프로 매핑합니다. ProcessMind 가져오기 설정에 따라 나머지 열은 이벤트 또는 케이스 속성으로 매핑합니다.
구성
- 날짜 범위: 초기 추출에는 최근 3~6개월의 기간을 사용합니다. 전기일, 변경일, 지급 프로그램 날짜 조건을 일관되게 적용하고, 지급 조건이 긴 경우 검증을 위해 기간을 늘립니다.
- 스키마: [Your SAP HANA schema]를 SAP 객체가 포함된 스키마로 바꿉니다. 선택한 스키마에서 클라이언트 종속 객체를 제공하는지, 별도의 클라이언트 조건이 필요한지 확인합니다.
- 회사 필터: [Company code filter]를 설정해 BUKRS를 필요한 회사 코드로 제한합니다. 해당 필드를 사용할 수 있는 경우 BKPF, BSEG, ACDOCA, REGUH, REGUP 및 변경 문서 소스에 동일한 범위를 적용합니다.
- 문서 필터: 송장 문서 유형 조건과 지급 문서 유형 조건을 검토합니다. 쿼리에는 일반적인 예가 포함되어 있지만 문서 유형은 설정에 따라 다르므로 대상 시스템에 맞춰야 합니다.
- 보류 송장: VBKPF 또는 BKPF에서 보류 문서 상태가 어떻게 표시되는지 확인합니다. 릴리스와 구현 방식에 따라 상태 코드가 다를 수 있으므로 쿼리에는 설정 가능한 보류 상태 조건이 사용됩니다.
- 지급 변경: BSEG-ZLSPR 및 BSEG-ZTERM의 변경 문서 객체 클래스, 테이블 이름, 필드 이름, 값 표시 방식을 확인합니다. 대상 시스템에서 변경 문서 저장 방식과 필드 이름을 검증해야 합니다.
- 지급 프로그램: 제안 및 실행 상태, 실행일, 실행 식별자, 회계 문서 연결에 사용되는 REGUH 및 REGUP 필드를 확인합니다. 로컬 지급 프로그램 설정에 따라 사용할 수 있는 상태 값이 달라질 수 있습니다.
- 성능: 날짜 범위와 회사 코드를 제한하고 필요한 열만 선택하며, 조인 전에 각 소스에 맞는 필터를 적용합니다. 대용량 데이터의 경우 필터링한 소스 하위 집합을 구체화하거나 승인된 HANA 계산 뷰 또는 추출 스키마를 사용합니다.
- 권한: 관련 SAP HANA 스키마 객체와 회계, 지급 프로그램, 변경 문서 데이터를 제공하는 뷰에 대한 읽기 권한이 필요합니다. SAP 보안 및 데이터 거버넌스 팀과 협의하세요.
- 기능 전제 조건: 관련 재무 회계, 매입채무, 지급 프로그램, 변경 문서 기능이 활성화되어 있고 데이터가 채워져 있어야 합니다. 구현에서 소스 테이블을 사용하지 않는 경우 시스템 설계에 따라 승인된 대체 소스를 설정합니다.
- 타임스탬프 처리: BKPF와 BSEG는 일반적으로 날짜와 시간을 별도 필드로 제공합니다. 쿼리는 이를 결합해 타임스탬프를 만듭니다. 소스 시스템의 시간대를 확인하고 ProcessMind에 업로드하기 전에 필요한 변환을 적용합니다.
- 데이터 보호: 공급업체 및 회계 데이터의 범위를 승인된 용도로 제한하고 조직의 보존, 마스킹, 접근 정책을 적용합니다.
샘플 쿼리 sql
WITH
params AS (
SELECT
TO_DATE('[Start date]', 'YYYYMMDD') AS start_date,
TO_DATE('[End date]', 'YYYYMMDD') AS end_date,
'[Source system identifier]' AS source_system
FROM DUMMY
),
base_bkpf AS (
SELECT
b.MANDT,
b.BUKRS,
b.BELNR,
b.GJAHR,
b.BLART,
b.BLDAT,
b.BUDAT,
b.CPUDT,
b.CPUTM,
b.USNAM,
b.STBLG,
b.STJAH,
b.XBLNR,
b.WAERS,
b.BKTXT,
p.source_system,
p.start_date,
p.end_date
FROM [Your SAP HANA schema].BKPF b
CROSS JOIN params p
WHERE b.BUDAT BETWEEN TO_VARCHAR(p.start_date, 'YYYYMMDD') AND TO_VARCHAR(p.end_date, 'YYYYMMDD')
AND [Company code filter]
),
invoice_bseg AS (
SELECT
k.MANDT,
k.BUKRS,
k.BELNR,
k.GJAHR,
k.BLART,
k.BLDAT,
k.BUDAT,
k.CPUDT,
k.CPUTM,
k.USNAM,
k.STBLG,
k.STJAH,
k.XBLNR,
k.WAERS,
k.BKTXT,
k.source_system,
s.BUZEI,
s.LIFNR,
s.WRBTR,
s.DMBTR,
s.ZTERM,
s.ZLSPR,
s.ZFBDT,
s.ZBD1T,
s.ZBD2T,
s.ZBD3T,
s.AUGDT,
s.AUGBL,
s.SHKZG,
s.SGTXT,
s.XREF1,
s.XREF2,
s.XREF3
FROM base_bkpf k
INNER JOIN [Your SAP HANA schema].BSEG s
ON s.MANDT = k.MANDT
AND s.BUKRS = k.BUKRS
AND s.BELNR = k.BELNR
AND s.GJAHR = k.GJAHR
WHERE s.LIFNR IS NOT NULL
AND s.LIFNR <> ''
),
acdoca_invoice AS (
SELECT
a.RCLNT AS MANDT,
a.RBUKRS AS BUKRS,
a.BELNR,
a.GJAHR,
a.BUZEI,
a.RACCT,
a.HSL,
a.WSL,
a.RWCUR,
a.BUDAT,
a.BLDAT,
a.AUGDT,
a.AUGBL
FROM [Your SAP HANA schema].ACDOCA a
WHERE a.BUDAT BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
AND [ACDOCA company code filter]
),
invoice_cases AS (
SELECT DISTINCT
i.MANDT,
i.BUKRS,
i.BELNR,
i.GJAHR,
i.BUZEI,
i.LIFNR,
i.WRBTR,
i.ZTERM,
i.ZLSPR,
i.ZFBDT,
i.ZBD1T,
i.ZBD2T,
i.ZBD3T,
i.AUGDT,
i.AUGBL,
i.BLART,
i.BLDAT,
i.BUDAT,
i.CPUDT,
i.CPUTM,
i.USNAM,
i.STBLG,
i.STJAH,
i.XBLNR,
i.WAERS,
i.source_system,
COALESCE(NULLIF(i.XBLNR, ''), i.BELNR) AS InvoiceNumber,
ADD_DAYS(TO_DATE(COALESCE(NULLIF(i.ZFBDT, ''), i.BLDAT), 'YYYYMMDD'), COALESCE(TO_INTEGER(NULLIF(i.ZBD3T, '')), 0)) AS NetDueDate,
ADD_DAYS(TO_DATE(COALESCE(NULLIF(i.ZFBDT, ''), i.BLDAT), 'YYYYMMDD'), COALESCE(TO_INTEGER(NULLIF(i.ZBD1T, '')), 0)) AS DiscountDueDate1,
ADD_DAYS(TO_DATE(COALESCE(NULLIF(i.ZFBDT, ''), i.BLDAT), 'YYYYMMDD'), COALESCE(TO_INTEGER(NULLIF(i.ZBD2T, '')), 0)) AS DiscountDueDate2
FROM invoice_bseg i
LEFT JOIN acdoca_invoice a
ON a.MANDT = i.MANDT
AND a.BUKRS = i.BUKRS
AND a.BELNR = i.BELNR
AND a.GJAHR = i.GJAHR
AND a.BUZEI = i.BUZEI
),
change_events AS (
SELECT
c.MANDT,
c.OBJECTID,
c.TABKEY,
c.FNAME,
c.VALUE_OLD,
c.VALUE_NEW,
c.UDATE,
c.UTIME,
c.USERNAME
FROM [Your SAP HANA schema].[Your change document item table name] c
WHERE c.TABNAME = 'BSEG'
AND c.FNAME IN ('ZLSPR', 'ZTERM')
AND c.UDATE BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
AND [Change document object class filter]
),
reguh_events AS (
SELECT
r.MANDT,
r.LAUFD,
r.LAUFI,
r.XVORL,
r.ZBUKR,
r.LIFNR,
r.VBLNR,
r.AUSFD,
r.AUSDT,
r.LAUFD AS RunDate,
r.ZALDT,
r.RZAWE,
r.XEINZ,
r.XPGRO,
r.XAVIS,
r.XVORL AS ProposalIndicator
FROM [Your SAP HANA schema].REGUH r
WHERE r.LAUFD BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
),
regup_events AS (
SELECT
u.MANDT,
u.LAUFD,
u.LAUFI,
u.ZBUKR,
u.LIFNR,
u.VBLNR,
u.BUKRS,
u.BELNR,
u.GJAHR,
u.BUZEI,
u.XVORL,
u.AUGBL,
u.AUGDT
FROM [Your SAP HANA schema].REGUP u
WHERE u.LAUFD BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
),
events AS (
SELECT
i.InvoiceNumber,
'Invoice Parked' AS Activity,
TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
i.source_system AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
i.LIFNR AS VendorNumber,
i.BUKRS AS CompanyCode,
i.WRBTR AS InvoiceAmount,
i.BLART AS DocumentType,
i.ZTERM AS PaymentTerms,
i.ZLSPR AS PaymentBlockReason,
i.USNAM AS UserName,
i.AUGDT AS ClearingDate,
i.NetDueDate,
CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END AS IsLatePayment,
FALSE AS IsTouchless
FROM invoice_cases i
INNER JOIN [Your SAP HANA schema].VBKPF v
ON v.MANDT = i.MANDT
AND v.BUKRS = i.BUKRS
AND v.BELNR = i.BELNR
AND v.GJAHR = i.GJAHR
WHERE [VBKPF parked status predicate]
UNION ALL
SELECT i.InvoiceNumber, 'Invoice Posted', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i
UNION ALL
SELECT i.InvoiceNumber, 'Payment Block Applied', TO_TIMESTAMP(c.UDATE || LPAD(COALESCE(c.UTIME, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, c.VALUE_NEW, c.USERNAME, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN change_events c ON c.OBJECTID = i.BELNR AND c.FNAME = 'ZLSPR' AND COALESCE(c.VALUE_OLD, '') = '' AND COALESCE(c.VALUE_NEW, '') <> ''
UNION ALL
SELECT i.InvoiceNumber, 'Price Variance Detected', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.ZLSPR = 'R'
UNION ALL
SELECT i.InvoiceNumber, 'Quantity Variance Detected', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.ZLSPR = 'M'
UNION ALL
SELECT i.InvoiceNumber, 'Payment Terms Changed', TO_TIMESTAMP(c.UDATE || LPAD(COALESCE(c.UTIME, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, c.VALUE_NEW, i.ZLSPR, c.USERNAME, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN change_events c ON c.OBJECTID = i.BELNR AND c.FNAME = 'ZTERM'
UNION ALL
SELECT i.InvoiceNumber, 'Payment Block Removed', TO_TIMESTAMP(c.UDATE || LPAD(COALESCE(c.UTIME, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, c.VALUE_OLD, c.USERNAME, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN change_events c ON c.OBJECTID = i.BELNR AND c.FNAME = 'ZLSPR' AND COALESCE(c.VALUE_OLD, '') <> '' AND COALESCE(c.VALUE_NEW, '') = ''
UNION ALL
SELECT i.InvoiceNumber, 'Invoice Due', TO_TIMESTAMP(TO_VARCHAR(i.NetDueDate, 'YYYYMMDD') || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.NetDueDate IS NOT NULL
UNION ALL
SELECT i.InvoiceNumber, 'Cash Discount Lost', TO_TIMESTAMP(TO_VARCHAR(CASE WHEN i.DiscountDueDate1 <= i.DiscountDueDate2 THEN i.DiscountDueDate1 ELSE i.DiscountDueDate2 END, 'YYYYMMDD') || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.AUGDT IS NULL OR i.AUGDT > CASE WHEN i.DiscountDueDate1 <= i.DiscountDueDate2 THEN i.DiscountDueDate1 ELSE i.DiscountDueDate2 END
UNION ALL
SELECT i.InvoiceNumber, 'Payment Proposal Created', TO_TIMESTAMP(r.RunDate || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN regup_events u ON u.BUKRS = i.BUKRS AND u.BELNR = i.BELNR AND u.GJAHR = i.GJAHR AND u.BUZEI = i.BUZEI INNER JOIN reguh_events r ON r.MANDT = u.MANDT AND r.LAUFD = u.LAUFD AND r.LAUFI = u.LAUFI AND r.LIFNR = u.LIFNR WHERE [Payment proposal status predicate]
UNION ALL
SELECT i.InvoiceNumber, 'Payment Run Executed', TO_TIMESTAMP(r.RunDate || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN regup_events u ON u.BUKRS = i.BUKRS AND u.BELNR = i.BELNR AND u.GJAHR = i.GJAHR AND u.BUZEI = i.BUZEI INNER JOIN reguh_events r ON r.MANDT = u.MANDT AND r.LAUFD = u.LAUFD AND r.LAUFI = u.LAUFI AND r.LIFNR = u.LIFNR WHERE [Payment run executed status predicate]
UNION ALL
SELECT i.InvoiceNumber, 'Payment Document Created', TO_TIMESTAMP(p.CPUDT || LPAD(COALESCE(p.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, p.BLART, i.ZTERM, i.ZLSPR, p.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN [Your SAP HANA schema].BKPF p ON p.MANDT = i.MANDT AND p.BUKRS = i.BUKRS AND p.BELNR = i.AUGBL AND p.GJAHR = i.GJAHR WHERE p.BLART IN ('ZP', 'KZ')
UNION ALL
SELECT i.InvoiceNumber, 'Payment Cleared', TO_TIMESTAMP(i.AUGDT || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.AUGDT IS NOT NULL
UNION ALL
SELECT i.InvoiceNumber, 'Invoice Reversed', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.STBLG IS NOT NULL AND i.STBLG <> ''
)
SELECT
InvoiceNumber,
Activity,
EventTime,
SourceSystem,
LastDataUpdate,
VendorNumber,
CompanyCode,
InvoiceAmount,
DocumentType,
PaymentTerms,
PaymentBlockReason,
UserName,
ClearingDate,
NetDueDate,
IsLatePayment,
IsTouchless
FROM events
WHERE EventTime IS NOT NULL
ORDER BY InvoiceNumber, EventTime, Activity; 시작할 준비가 되셨나요?
재무 데이터를 실행 가능한 인사이트로 바꾸고 지금 지급 주기 최적화를 시작하세요. process mining을 진행하는 동안 단계마다 지원해 드립니다.
SAP S/4HANA에서 매입채무 지급 처리 개선
병목을 없애고 처리 시간을 30% 단축하세요.
신용카드가 필요하지 않습니다. 설정은 5분이면 완료됩니다.