매입채무 지급 처리 데이터 템플릿
매입채무 지급 처리 데이터 템플릿
- 재무 분석을 위한 프로세스별 속성
- 지급 추적에 필요한 주요 활동 단계
- Dynamics 365 데이터 추출 상세 안내
매입채무 지급 처리 속성
| 이름 | 설명 | ||
|---|---|---|---|
| 송장 번호 InvoiceNumber | 공급업체 송장에 부여된 고유 식별자입니다. | ||
| 설명 송장 번호는 이 프로세스 보기에서 케이스를 식별하는 기준입니다. 송장 한 건에 해당하는 모든 이벤트를 고유하게 묶어 접수부터 정산까지의 전체 이력을 분석할 수 있습니다. Microsoft Dynamics 365에서는 일반적으로 중요한 이유 서로 분리된 매입채무 활동을 하나의 프로세스 인스턴스로 연결하는 기본 키입니다. 확보 방법 테이블: VendInvoiceJour, 필드: InvoiceId 예시 INV-2023-00198223344ACME-OCT-22 | |||
| 이벤트 시간 EventTime | 활동이 발생한 시각입니다. | ||
| 설명 이 속성은 특정 활동이 발생한 정확한 날짜와 시간을 기록합니다. 이벤트를 시간순으로 정렬하고 단계 간 소요 시간을 계산하는 데 사용합니다. Dynamics 365에서는 조회하는 테이블에 따라 일반적으로 중요한 이유 처리 시간과 리드 타임을 계산하고 병목을 찾는 데 필요합니다. 확보 방법 거래 테이블의 시스템 필드 CreatedDateTime 또는 ModifiedDateTime 예시 2023-10-01T08:30:00Z2023-10-01T14:15:22Z2023-10-05T09:00:00Z | |||
| 활동 Activity | 발생한 구체적인 작업 또는 상태 변경입니다. | ||
| 설명 이 속성은 '송장 생성', '송장 승인', '지급 전기'와 같이 프로세스에서 수행된 이벤트나 단계를 설명합니다. 기술적인 거래 유형과 워크플로 상태 변경을 이해하기 쉬운 업무 이벤트로 나타냅니다. Dynamics 365에서는 테이블에 새 레코드가 입력된 경우(예: 중요한 이유 프로세스 맵의 흐름과 이벤트 순서를 정의합니다. 확보 방법 다양한 거래 테이블과 워크플로 이력 로그에서 도출됩니다. 예시 송장 생성송장 승인지급 생성 | |||
| 마지막 데이터 업데이트 LastDataUpdate | 데이터를 추출하거나 새로 고친 시각입니다. | ||
| 설명 분석에 사용된 데이터의 최신 상태를 나타냅니다. 사용자가 실시간 데이터와 이전 기간의 스냅샷 중 무엇을 보고 있는지 파악하는 데 도움이 됩니다. 일반적으로 Dynamics 365 자체의 필드가 아니라 ETL(추출, 변환, 적재) 프로세스에서 생성됩니다. 중요한 이유 대시보드와 KPI의 신뢰도를 확보하는 데 중요합니다. 확보 방법 추출 스크립트에서 생성됩니다. 예시 2023-10-25T12:00:00Z2023-11-01T06:00:00Z | |||
| 원본 시스템 SourceSystem | 데이터가 생성된 시스템의 이름입니다. | ||
| 설명 프로세스 데이터를 추출한 소프트웨어 또는 환경을 식별합니다. 이 경우 Microsoft Dynamics 365 인스턴스를 나타냅니다. ERP와 외부 스캔 솔루션 등 여러 시스템의 데이터를 결합하는 환경에서 특히 유용합니다. 중요한 이유 여러 시스템을 분석할 때 데이터 계보와 추적 가능성을 보장합니다. 확보 방법 데이터 추출 시 하드코딩하거나 설정합니다. 예시 Dynamics 365 F&OD365 PRODMicrosoft Dynamics | |||
| 공급업체 계정 VendorAccount | 공급업체의 고유 계정 번호입니다. | ||
| 설명 거래에 참여한 공급업체를 식별하는 고유 값입니다. Dynamics 365에서는 이 속성은 '공급업체 관계 복잡도 보기'에서 중심적으로 사용되며, 공급업체별 성과와 지연 요인을 분석할 수 있습니다. 중요한 이유 공급업체별로 프로세스 성과를 구분해 분석할 수 있습니다. 확보 방법 테이블: VendInvoiceJour, 필드: InvoiceAccount 또는 OrderAccount 예시 US-101V000452001 | |||
| 공급업체명 VendorName | 공급업체 조직의 이름입니다. | ||
| 설명 공급업체를 설명하는 이름입니다. D365에서 공급업체 계정은 Global Address Book의 외래 키 역할을 하며, 실제 이름은 사람이 읽기 쉬운 이름을 사용하면 '공급업체 관계 복잡성 보기'를 활용하기 쉽고, 비즈니스 사용자도 대시보드를 편리하게 이용할 수 있습니다. 중요한 이유 공급업체 계정 번호에 대한 정보를 제공합니다. 확보 방법 테이블: DirPartyTable(VendTable 경유), 필드: Name 예시 Contoso 사무용품Fabrikam 전자제품Litware Inc. | |||
| 구매 주문 번호 PurchaseOrderNumber | 관련 구매 주문의 참조 번호입니다. | ||
| 설명 송장과 원본 구매 문서를 연결합니다. Dynamics 365에서는 이 속성을 사용하면 'PO 대조 및 불일치 추이' 대시보드에서 구매 주문이 있는 송장과 없는 송장을 구분할 수 있습니다. 중요한 이유 구매부터 지급까지의 대조율을 분석하는 데 필요합니다. 확보 방법 테이블: VendInvoiceJour, 필드: PurchId 예시 PO-000455000342PO-22-998 | |||
| 부서 Department | 비용을 부담하는 부서입니다. | ||
| 설명 내부 부서를 나타내는 재무 차원입니다. Dynamics 365에서는 차원이 동적으로 저장되는 경우가 많아(주로 '공급업체 관계 복잡도 보기'에서 어느 부서가 미지급금(AP) 처리량을 가장 많이 발생시키는지 확인하는 데 사용됩니다. 중요한 이유 조직별로 한 단계 아래까지 분석하고 책임 소재를 파악할 수 있습니다. 확보 방법 테이블: VendInvoiceJour, 필드: DefaultDimension(DimensionAttributeLevelValue 뷰 필요) 예시 IT재무운영 | |||
| 사용자 ID UserId | 해당 활동을 수행한 사용자의 식별자입니다. | ||
| 설명 송장 승인이나 지급 전기와 같은 특정 활동을 담당한 시스템 사용자를 식별합니다. D365의 '지급 보류 및 마찰 분석'에서 특정 담당자가 다른 담당자보다 보류를 더 자주 발생시키는지 확인하는 데 사용됩니다. 중요한 이유 리소스의 업무 처리 방식과 직무 분리를 분석할 수 있습니다. 확보 방법 거래/이력 테이블의 시스템 필드 CreatedBy/ModifiedBy 예시 jdoeadminworkflow_sys | |||
| 송장 금액 InvoiceAmount | 송장의 총 금액입니다. | ||
| 설명 거래 통화로 표시된 송장의 총 금액입니다. Dynamics 365에서는 송장 분개 테이블의 '중복 지급 위험 탐지' 대시보드에서 금액과 공급업체 정보를 연계하는 데 사용합니다. 중요한 이유 지출 규모와 재무 위험을 분석하는 데 중요합니다. 확보 방법 테이블: VendInvoiceJour, 필드: InvoiceAmount 예시 1500.00245.5010000.00 | |||
| 송장 날짜 InvoiceDate | 송장에 기재된 문서 날짜입니다. | ||
| 설명 공급업체 송장에 인쇄된 날짜입니다. Dynamics 365에서는 '처음부터 끝까지 소요 시간 분석'에서 공급업체 관점의 전체 처리 기간을 측정하는 데 사용됩니다. 중요한 이유 송장 경과 기간을 계산하는 시작일입니다. 확보 방법 테이블: VendInvoiceJour, 필드: InvoiceDate 예시 2023-10-012023-10-15 | |||
| 지급 기한 DueDate | 송장을 지급해야 하는 날짜입니다. | ||
| 설명 지급 지연에 따른 위약금을 피하려면 결제를 완료해야 하는 계약상 기한입니다. Dynamics 365에서는 송장 헤더 또는 거래 레코드의 '정시 지급률' KPI의 기준이 되며, 'AP 프로세스 처리량 및 규모' 보기에서 업무 우선순위를 정하는 데 활용됩니다. 중요한 이유 정시 지급 실적을 측정하는 기준입니다. 확보 방법 테이블: VendInvoiceJour 또는 VendTrans, 필드: DueDate 예시 2023-11-302023-12-15 | |||
| 회사 코드 CompanyCode | 법인 또는 자회사를 식별하는 값입니다. | ||
| 설명 송장이 처리되는 조직 내 법인을 나타냅니다. Microsoft Dynamics 365에서는 이 속성은 '전체 처리 시간 분석'에 필요하며, 자회사나 지역 단위별로 비교할 수 있습니다. 중요한 이유 사업부나 국가별로 비교 분석할 수 있습니다. 확보 방법 테이블: VendInvoiceJour, 필드: DataAreaId 예시 USMFDEMFGBSI | |||
| 전표 번호 VoucherNumber | 거래에 연결된 원장의 전표 번호입니다. | ||
| 설명 회계 항목을 식별하는 내부 총계정원장 번호입니다. Dynamics 365에서는 기술적인 항목이지만, '프로세스 경로 및 규정 준수 감사'에서 조정을 위해 항목을 총계정원장까지 추적할 때 유용합니다. 중요한 이유 재무 감사와 조정에 필요한 식별자입니다. 확보 방법 테이블: VendInvoiceJour, 필드: LedgerVoucher 예시 VOU-10023INV-ACC-992 | |||
| 지급 방법 PaymentMethod | 송장 대금을 지급하는 방법입니다(예: 수표, 전신 송금, EFT). | ||
| 설명 공급업체에 대금을 이체하는 방법을 나타냅니다. Dynamics 365에서는 '지급 실행 소요 시간' 대시보드에서 지급 배치 유형별 효율성을 평가하는 데 사용됩니다. 중요한 이유 지급 실행 단계에서 발생하는 차이를 설명합니다. 확보 방법 테이블: VendInvoiceJour(PaymMode 정보와 조인) 또는 VendTrans 예시 수표ACH전신 송금 | |||
| 지급 보류 여부 IsPaymentBlocked | 현재 송장의 지급이 보류 중인지 나타내는 플래그입니다. | ||
| 설명 송장이 보류 상태인지 나타내는 불리언 값입니다. Dynamics 365에서는 '지급 보류 및 마찰 분석'의 주요 지표로, 프로세스가 중단되는 지점을 보여줍니다. 중요한 이유 즉각적인 마찰 지점과 수작업 개입을 파악할 수 있습니다. 확보 방법 테이블: VendTrans, 필드: Approved(반전 적용) 또는 전용 보류 필드 예시 truefalse | |||
| 지급 조건 PaymentTerms | 합의된 지급 조건을 나타내는 코드입니다. | ||
| 설명 지급 기한과 할인 조건을 정하는 설정 코드입니다(예: Net30). Dynamics 365에서는 '처리 시간'과 함께 분석해 프로세스 지연으로 합의된 조건을 지키지 못하는지 확인합니다. 중요한 이유 지급 기한을 계산할 때 참고하는 정보입니다. 확보 방법 테이블: VendInvoiceJour, 필드: PaymTermId 예시 Net302%10Net30COD | |||
| 통화 Currency | 송장의 통화 코드입니다. | ||
| 설명 송장 발행 통화의 ISO 코드입니다. Dynamics 365에서는 다중 통화 금액을 표준화해야 하는 경우 '활동 금액' 매핑에 필요한 정보입니다. 중요한 이유 재무 값을 해석하는 데 필요한 정보입니다. 확보 방법 테이블: VendInvoiceJour, 필드: CurrencyCode 예시 USDEURGBP | |||
| 현금 할인 기한 CashDiscountDate | 할인을 받으려면 지급을 완료해야 하는 날짜입니다. | ||
| 설명 조기 지급 할인을 받기 위한 기한입니다. Dynamics 365에서는 이 속성은 '현금 할인 적용 실적' 대시보드에 사용되며, 놓친 절감 기회를 금액으로 파악할 수 있습니다. 중요한 이유 프로세스의 재무 효율성 KPI에 직접 영향을 줍니다. 확보 방법 테이블: VendInvoiceJour 또는 VendTrans, 필드: CashDiscDate 예시 2023-10-102023-10-20 | |||
매입채무 지급 처리 활동
| 활동 | 설명 | ||
|---|---|---|---|
| 송장 생성 | 시스템에서 미결 공급업체 송장 레코드를 처음 생성하는 단계입니다. 수동 입력 또는 데이터 엔터티 가져오기를 통해 송장이 Dynamics 365 워크플로에 등록된 시점을 나타냅니다. | ||
| 중요한 이유 프로세스 처리 시간 계산의 시작 시점을 정합니다. 송장이 처리되거나 전기되기 전까지 시스템에 머무는 시간을 측정할 수 있습니다. 확보 방법 VendInvoiceInfoTable.CreatedDateTime 또는 VendInvoiceInfoTable.RecId 생성 타임스탬프입니다. 미결 공급업체 송장 헤더를 나타냅니다. 기록 VendInvoiceInfoTable에 레코드가 생성될 때 기록됩니다. 이벤트 유형 explicit | |||
| 송장 승인 | 미결 송장의 워크플로 인스턴스가 완료 또는 승인 상태에 도달합니다. 이제 송장을 원장에 전기할 수 있습니다. | ||
| 중요한 이유 평균 승인 처리 시간을 계산합니다. 이 단계의 지연은 조기 지급 할인 적용 가능성에 직접 영향을 줍니다. 확보 방법 TrackingStatus가 Completed인 WorkflowTrackingStatusTable.CreatedDateTime을 사용합니다. 또는 VendInvoiceInfoTable.RequestStatus가 Approved인지 확인합니다. 기록 워크플로 인스턴스가 완료될 때 기록됩니다. 이벤트 유형 explicit | |||
| 송장 전기 | 송장을 총계정원장에 전기해 시스템에 채무를 기록합니다. 레코드는 미결 테이블에서 전기된 거래 테이블로 이동합니다. | ||
| 중요한 이유 채무가 재무 기록에 반영되는 주요 단계입니다. 이 활동 이후 송장을 지급 대상으로 선택할 수 있습니다. 확보 방법 VendInvoiceJour 및 VendTrans에 레코드가 생성됩니다. TransDate는 전기 날짜를 나타냅니다. 기록 거래 X가 실행될 때 기록됩니다. 이벤트 유형 explicit | |||
| 송장과 구매 주문 대조 완료 | 시스템이 송장 항목을 구매 주문 또는 제품 입고 기록과 연결합니다. 이 활동은 송장과 조달 주문의 대조 및 검증이 완료되었음을 나타냅니다. | ||
| 중요한 이유 최초 구매 주문 대조 성공률 KPI를 계산하는 데 필요합니다. 수동 개입 없이 처리된 송장과 수동 처리가 필요한 송장을 구분합니다. 확보 방법 VendInvoiceInfoLine.PurchId 및 VendInvoiceInfoTable.MatchStatus를 사용합니다. MatchStatus가 Passed로 변경될 때 추정합니다. 기록 변경 전후의 MatchStatus 필드를 비교합니다. 이벤트 유형 inferred | |||
| 지급 분개 생성 | 송장을 선택해 지급 분개 항목에 추가합니다. 지급 의사를 나타내며 일반적으로 지급 검토 워크플로가 시작됩니다. | ||
| 중요한 이유 채무 처리에서 현금 지급 처리로 넘어가는 시점을 나타냅니다. 지급 실행 처리 시간을 측정하는 데 사용합니다. 확보 방법 LedgerJournalTrans.CreatedDateTime을 사용합니다. MarkedInvoice 필드 또는 정산 테이블을 통해 송장과 연결합니다. 기록 LedgerJournalTrans에 레코드가 생성될 때 기록됩니다. 이벤트 유형 explicit | |||
| 지급 생성 | 시스템이 지급 파일(EFT, ISO20022)을 생성하거나 수표를 인쇄합니다. 분개 항목의 지급 상태가 Sent 또는 Generated로 변경됩니다. | ||
| 중요한 이유 승인부터 실행까지의 지연 시간 KPI에 활용할 수 있습니다. 지급 지시가 생성되었음을 확인합니다. 확보 방법 LedgerJournalTrans.PaymentStatus가 Sent 또는 Recieved로 변경됩니다. 항목 업데이트 내역으로 추정하는 경우가 많습니다. 기록 변경 전후의 PaymentStatus 필드를 비교합니다. 이벤트 유형 inferred | |||
| 지급 전기 | 지급 분개를 총계정원장에 전기해 송장을 정산하고 공급업체 잔액을 상계합니다. 이 단계에서 재무 처리가 완료됩니다. | ||
| 중요한 이유 송장부터 지급까지의 평균 처리 시간을 계산할 때 마지막 활동으로 사용합니다. 현금 감소에 대한 회계 처리가 완료되었음을 확인합니다. 확보 방법 LedgerJournalTrans가 전기됩니다. VendTrans가 업데이트되어 정산 상태를 나타냅니다. 실제 이벤트는 분개 전기입니다. 기록 거래 X가 실행될 때 기록됩니다. 이벤트 유형 explicit | |||
| 송장 대조 실패 | 대조 과정에서 송장과 구매 주문 또는 입고 기록 간의 가격이나 수량 차이를 확인합니다. 차이가 해결될 때까지 프로세스가 중단되는 경우가 많습니다. | ||
| 중요한 이유 대조 과정에서 문제가 발생하는 구간을 구체적으로 찾아냅니다. 구매 주문 대조 및 차이 추이 대시보드에 활용할 수 있습니다. 확보 방법 VendInvoiceInfoTable.MatchStatus가 Failed 또는 Discrepancy로 변경될 때 확인합니다. VendInvoiceInfoLine의 대조 차이에서도 확인할 수 있습니다. 기록 변경 전후의 MatchStatus 필드를 비교합니다. 이벤트 유형 inferred | |||
| 송장 수정 | 전기 전에 송장 헤더나 항목에 적용된 변경 사항을 기록합니다. 수정이 잦으면 데이터 추출 문제나 검증 과정에서 필요한 수동 수정이 있음을 나타낼 수 있습니다. | ||
| 중요한 이유 수정이 잦으면 재작업이 반복되거나 원본 데이터의 품질이 낮을 수 있습니다(예: OCR 오류). 재작업 및 데이터 정확도 모니터링에 활용할 수 있습니다. 확보 방법 활성화된 경우 VendInvoiceInfoTable의 데이터베이스 로그(SysDatabaseLog)를 사용합니다. 또는 폴링 주기가 짧으면 ModifiedDateTime 변경 내역으로 추정할 수 있습니다. 기록 후속 데이터 추출에서 ModifiedDateTime을 비교합니다. 이벤트 유형 inferred | |||
| 승인 요청을 위해 송장 제출 | 미결 송장을 검토를 위해 워크플로 엔진에 제출합니다. 데이터 입력 및 대조 단계에서 승인 단계로 넘어가는 시점입니다. | ||
| 중요한 이유 승인 처리 시간의 시작 시점을 표시합니다. 내부 승인 체계의 효율성을 분석하는 데 필요합니다. 확보 방법 WorkflowTrackingStatusTable.CreatedDateTime을 사용합니다. ContextTableId가 VendInvoiceInfoTable ID와 같고 Status가 Submitted인 레코드입니다. 기록 워크플로 인스턴스가 시작될 때 기록됩니다. 이벤트 유형 explicit | |||
| 지급 보류 적용 | 공급업체 거래를 보류해 지급 제안에서 선택되지 않도록 합니다. 분쟁이 있을 때 수동으로 보류하는 경우가 많습니다. | ||
| 중요한 이유 지급 보류 및 지연 분석에 활용할 수 있습니다. 현금 지급을 늦추는 수동 개입을 찾아냅니다. 확보 방법 VendTrans.Approved 플래그가 No로 설정되거나 특정 OnHold 상태 필드에 값이 입력됩니다. VendTrans 업데이트 내역을 추적해야 합니다. 기록 변경 전후의 상태 필드를 비교합니다. 이벤트 유형 inferred | |||
| 지급 분개 승인 | 지급 분개 워크플로가 승인되어 지급 생성이 허가됩니다. 자금 이체를 준비하기 전 마지막으로 확인하는 단계입니다. | ||
| 중요한 이유 지급 준비에 필요한 행정 처리와 승인 병목을 구분합니다. 확보 방법 LedgerJournalTable(헤더) ID와 연결된 WorkflowTrackingStatusTable을 사용합니다. Status는 Completed입니다. 기록 워크플로 인스턴스가 완료될 때 기록됩니다. 이벤트 유형 explicit | |||
데이터 추출 가이드
단계
데이터 관리 작업 영역 열기: Microsoft Dynamics 365 Finance 환경에 로그인합니다. 작업 영역으로 이동해 데이터 관리를 선택합니다. 이곳에서 데이터 내보내기 프로젝트를 구성합니다.
내보내기 프로젝트 만들기: 내보내기 타일을 클릭해 새 데이터 프로젝트를 만듭니다. ProcessMining_AP_Export와 같이 알아보기 쉬운 이름을 지정합니다. 대상 데이터 형식 필드에서 내보낼 형식을 선택합니다(BYOD의 경우 Azure SQL DB, 파일로 내보내는 경우 CSV 등).
데이터 엔터티 추가: 다음 표준 데이터 엔터티를 프로젝트에 하나씩 추가합니다. VendorInvoiceHeaderEntity(미결 송장), VendorInvoiceLineEntity(송장 개별 항목), VendorInvoiceJournalHeaderEntity(전기된 송장), VendorPaymentJournalLineEntity(지급), WorkflowHistoryEntity(승인 로그)입니다. WorkflowHistoryEntity를 기본적으로 사용할 수 없다면 사용자 지정 엔터티 또는 내보내기용으로 제공되는 특정 시스템 엔터티를 활성화해야 할 수 있습니다.
엔터티 필터 구성: 각 엔터티에서 필터 아이콘을 클릭합니다. 관련 CompanyInfo(DataAreaId)만 포함하도록 필터를 적용하고, CreatedDateTime 또는 InvoiceDate 필드에 날짜 범위를 설정해 분석 기간(예: 최근 12개월)에 해당하는 데이터만 추출합니다.
정기 내보내기 설정: 이벤트 로그를 최신 상태로 유지하려면 정기 데이터 작업을 만듭니다. 실행 주기(예: 매일 또는 매시간)를 설정하고 지원되는 경우 증분 푸시를 활성화합니다. 변경된 레코드만 내보내므로 시스템 부하를 줄일 수 있습니다.
초기 내보내기 실행: 내보내기 지금 실행을 클릭해 처음으로 프로젝트를 수동 실행합니다. 실행 요약을 확인해 오류 없이 모든 레코드가 내보내졌는지 점검합니다.
데이터 변환: 데이터를 대상(Azure SQL 또는 파일)으로 내보낸 후 쿼리 섹션의 SQL 스크립트를 사용해 테이블을 조인합니다. 이 변환 로직은 서로 다른 엔터티의 레코드를 하나의 시간순 이벤트 로그로 통합합니다.
속성 매핑: 결과 데이터 세트에서 InvoiceNumber를 케이스 ID에, EventTime을 타임스탬프에, Activity를 활동 이름에 매핑합니다. process mining 도구의 요구사항에 맞게 설정합니다.
검증 및 업로드: 아래에 나열된 검증을 실행해 데이터가 정확한지 확인합니다. 검증이 끝나면 최종 결과를 CSV 또는 Parquet 파일로 내보내 ProcessMind에 업로드합니다.
구성
- 엔터티 선택: 전기 전 단계에는 VendorInvoiceHeaderEntity와 VendorInvoiceLineEntity를 사용합니다. 법적으로 전기된 문서에는 VendorInvoiceJournalHeaderEntity, 지급 추적에는 VendorPaymentJournalLineEntity를 사용합니다.
- 증분 푸시: 데이터 관리 프로젝트에서 이 설정을 활성화하면 최초 전체 적재 이후 새 레코드나 수정된 레코드만 내보냅니다. 성능을 위해 반드시 설정하는 것이 좋습니다.
- 날짜 범위: InvoiceDate >= [Start Date] 조건으로 필터링합니다. 시간 초과를 방지하려면 범위를 지정하지 않은 내보내기는 피하세요.
- 회사 필터: D365는 여러 법인을 지원하는 시스템입니다. 법인 간 분석이 필요한 경우가 아니라면 DataAreaId로 필터링해 서로 다른 법인의 데이터가 섞이지 않도록 합니다.
- 워크플로 기록: 워크플로 기록을 포함하는 표준 엔터티는 데이터량이 많을 수 있습니다. 데이터 규모를 관리할 수 있도록 VendInvoice 유형과 관련된 기록만 내보내세요.
샘플 쿼리 sql
/*
SQL Transformation Script for D365 Finance AP Process
Assumes data is loaded into Staging tables in a SQL environment (BYOD/Data Lake)
*/
SELECT
I.InvoiceNumber AS [InvoiceNumber],
'Invoice Created' AS [Activity],
I.CreatedDateTime AS [EventTime],
I.DataAreaId AS [CompanyCode],
I.InvoiceAccount AS [VendorAccount],
I.InvoiceAmount AS [InvoiceAmount],
I.CurrencyCode AS [Currency],
'D365 FO' AS [SourceSystem],
GETDATE() AS [LastDataUpdate]
FROM Staging_VendorInvoiceHeaderEntity I
UNION ALL
/* Capture updates to invoice headers */
SELECT
I.InvoiceNumber,
'Invoice Updated',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceHeaderEntity I
WHERE I.ModifiedDateTime > I.CreatedDateTime
UNION ALL
/* Invoice Matching Activities */
SELECT
I.InvoiceNumber,
'Invoice Matched to PO',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceHeaderEntity I
WHERE I.MatchStatus = 'Matched' -- Adjust value based on system config
UNION ALL
SELECT
I.InvoiceNumber,
'Invoice Match Failed',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceHeaderEntity I
WHERE I.MatchStatus = 'Failed'
UNION ALL
/* Workflow Activities */
SELECT
RelatedContext AS InvoiceNumber,
CASE
WHEN Status = 'Submitted' THEN 'Invoice Submitted for Approval'
WHEN Status = 'Approved' THEN 'Invoice Approved'
ELSE 'Workflow Activity'
END AS [Activity],
CreatedDateTime AS [EventTime],
DataAreaId,
NULL AS [VendorAccount],
NULL AS [InvoiceAmount],
NULL AS [Currency],
'D365 FO',
GETDATE()
FROM Staging_WorkflowHistoryEntity
WHERE ContextTableId = 12345 -- Replace with TableId for VendInvoiceInfoTable
AND Status IN ('Submitted', 'Approved')
UNION ALL
/* Invoice Posted */
SELECT
J.InvoiceNumber,
'Invoice Posted',
J.PostedDateTime,
J.DataAreaId,
J.InvoiceAccount,
J.InvoiceAmount,
J.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceJournalHeaderEntity J
UNION ALL
/* Payment Block */
SELECT
I.InvoiceNumber,
'Payment Block Applied',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceJournalHeaderEntity I
WHERE I.OnHold = 'Yes'
UNION ALL
/* Payment Activities */
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Journal Created' AS [Activity],
P.CreatedDateTime AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue AS [VendorAccount],
P.DebitAmount AS [InvoiceAmount],
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
UNION ALL
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Journal Approved' AS [Activity],
P.ModifiedDateTime AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue,
P.DebitAmount,
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
WHERE P.PaymentStatus = 'Approved'
UNION ALL
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Generated' AS [Activity],
P.ModifiedDateTime AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue,
P.DebitAmount,
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
WHERE P.PaymentStatus = 'Sent'
UNION ALL
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Posted' AS [Activity],
P.PostedDate AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue,
P.DebitAmount,
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
WHERE P.IsPosted = 'Yes' 단계
BYOD 연결 확인: SQL Server Management Studio(SSMS) 또는 유사한 도구가 설치되어 있고, Dynamics 365 Finance & Operations 환경의 BYOD(Bring Your Own Database) 대상으로 구성된 Azure SQL Database에 연결할 수 있는지 확인합니다.
엔터티 내보내기 확인: Dynamics 365의 데이터 관리 작업 영역으로 이동합니다. 다음 엔터티(또는 기반 테이블)가 BYOD 데이터베이스로 내보내도록 구성되어 있는지 확인합니다.
VendInvoiceInfoTable(미결 송장),VendInvoiceInfoLine(미결 송장 개별 항목),VendInvoiceJour(전기된 송장),VendTrans(공급업체 거래),LedgerJournalTrans(분개장 라인),LedgerJournalTable(분개장 헤더),WorkflowTrackingStatusTable(워크플로 기록)입니다.내보내기 작업 구성: 이 테이블이 현재 내보내지지 않는다면 새 내보내기 작업을 만듭니다. 대상 데이터 형식을 BYOD SQL 데이터베이스로 설정합니다. 전체 데이터를 다시 내보내지 않고 동기화하려면 증분 푸시를 선택합니다. 작업을 실행해 테이블을 채웁니다.
SQL 환경 준비: SSMS를 열고 BYOD Azure SQL 데이터베이스에 연결합니다. 새 쿼리 창을 엽니다.
매개변수 설정: 아래에 제공된 스크립트의 상단에서 변수 선언 부분을 찾습니다. 분석할 기간에 맞게
@StartDate및@EndDate변수를 수정합니다. 특정 법인만 필터링하려면DATAAREAID필터 조건을 수정합니다.스크립트 실행: 전체 T-SQL 스크립트를 실행합니다. 이 스크립트는
UNION ALL을 사용해 여러 테이블의 데이터를 표준 이벤트 로그 형식 하나로 결합합니다.데이터 검증:
InvoiceNumber또는EventTime열에 NULL 값이 있는지 확인합니다. 전기된 송장(VendInvoiceJour)과 미결 송장(VendInvoiceInfoTable)이 모두 결과에 포함되어 있는지 점검합니다.결과 내보내기: SSMS의 결과 그리드를 마우스 오른쪽 버튼으로 클릭하고 **결과 저장 형식...**을 선택합니다. 파일을 CSV(쉼표로 구분) 형식으로 저장합니다.
업로드 형식 확인: CSV를 Excel 또는 텍스트 편집기에서 열어, ProcessMind에서 요구하는 경우 날짜 형식이 ISO 8601(YYYY-MM-DD HH:MM:SS)을 따르는지 확인합니다. 스크립트가 정상적으로 실행되었다면 추가 변환은 필요하지 않습니다.
ProcessMind에 업로드: CSV 파일을 ProcessMind로 가져옵니다.
InvoiceNumber열은 케이스 ID에,Activity는 활동 이름에,EventTime은 타임스탬프에 매핑합니다.
구성
- 내보내기 방식: BYOD 부하를 줄이려면
LedgerJournalTrans및VendTrans와 같이 데이터량이 많은 테이블에 증분 푸시를 사용합니다. 데이터 불일치가 의심되는 경우에만 전체 푸시를 사용하세요. - 시간대 처리: Dynamics 365는 데이터를 UTC로 저장하며 스크립트도 UTC를 기준으로 합니다. 현지 시간이 필요한 경우 스크립트나 ProcessMind로 가져오는 과정에서
DATEADD조정을 적용합니다. - 회사 필터링:
DataAreaId열은 법인을 나타냅니다. 기본적으로 스크립트는 모든 법인의 데이터를 추출합니다. 특정 자회사만 대상으로 하려면WHERE DataAreaId = 'usmf'와 같이 조건을 추가합니다. - 워크플로 기록:
WorkflowTrackingStatusTable테이블은 승인 시각을 확인하는 데 중요합니다. 기본 설정에서 누락되는 경우가 많으므로 BYOD 내보내기 설정에 이 테이블이 포함되어 있는지 확인합니다. - 데이터 보존: D365에서 완료된 워크플로 기록이나 전기된 분개 항목을 삭제하는 정리 작업이 있는지 확인합니다. 이러한 작업은 process mining 분석에서 확인할 수 있는 과거 데이터 범위를 제한할 수 있습니다.
샘플 쿼리 sql
/* T-SQL Extraction Script for D365 AP Payment Processing */
/* Tables required: VendInvoiceInfoTable, VendInvoiceInfoLine, VendInvoiceJour, VendTrans, LedgerJournalTrans, LedgerJournalTable, WorkflowTrackingStatusTable */
DECLARE @StartDate DATETIME = '2023-01-01 00:00:00';
DECLARE @EndDate DATETIME = GETDATE();
WITH RawData AS (
/* 1. Invoice Created: Pending Invoice Header Creation */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Created' AS Activity,
T1.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
T1.CreatedBy AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoTable T1
WHERE T1.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 2. Invoice Updated: Modifications to Pending Invoice */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Updated' AS Activity,
T1.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
T1.ModifiedBy AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoTable T1
WHERE T1.ModifiedDateTime BETWEEN @StartDate AND @EndDate
AND T1.ModifiedDateTime > T1.CreatedDateTime
UNION ALL
/* 3. Invoice Matched to PO: Line Matching Success */
SELECT
H.Num AS InvoiceNumber,
'Invoice Matched to PO' AS Activity,
L.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
H.InvoiceAccount AS VendorAccount,
H.DataAreaId AS CompanyCode,
CAST(H.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
H.DueDate AS DueDate,
H.PurchId AS PurchaseOrderNumber,
L.ModifiedBy AS UserId,
H.VendorName AS VendorName,
H.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoLine L
JOIN dbo.VendInvoiceInfoTable H ON L.TableRefId = H.TableRefId AND L.DataAreaId = H.DataAreaId
WHERE L.MatchStatus = 1 /* 1 usually denotes Matched/Passed in enum */
AND L.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 4. Invoice Match Failed: Line Matching Discrepancy */
SELECT
H.Num AS InvoiceNumber,
'Invoice Match Failed' AS Activity,
L.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
H.InvoiceAccount AS VendorAccount,
H.DataAreaId AS CompanyCode,
CAST(H.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
H.DueDate AS DueDate,
H.PurchId AS PurchaseOrderNumber,
L.ModifiedBy AS UserId,
H.VendorName AS VendorName,
H.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoLine L
JOIN dbo.VendInvoiceInfoTable H ON L.TableRefId = H.TableRefId AND L.DataAreaId = H.DataAreaId
WHERE L.MatchStatus = 2 /* 2 usually denotes Failed in enum */
AND L.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 5. Invoice Submitted for Approval: Workflow Submission */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Submitted for Approval' AS Activity,
W.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
W.User AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.WorkflowTrackingStatusTable W
JOIN dbo.VendInvoiceInfoTable T1 ON W.ContextRecId = T1.RecId
WHERE W.TrackingStatus = 1 /* Submitted */
AND W.ContextTableId = 1425 /* TableId for VendInvoiceInfoTable, adjust if different in version */
AND W.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 6. Invoice Approved: Workflow Completion */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Approved' AS Activity,
W.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
W.User AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.WorkflowTrackingStatusTable W
JOIN dbo.VendInvoiceInfoTable T1 ON W.ContextRecId = T1.RecId
WHERE W.TrackingStatus = 2 /* Completed/Approved */
AND W.ContextTableId = 1425
AND W.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 7. Invoice Posted: Creation of VendInvoiceJour */
SELECT
J.InvoiceId AS InvoiceNumber,
'Invoice Posted' AS Activity,
J.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
J.InvoiceAccount AS VendorAccount,
J.DataAreaId AS CompanyCode,
CAST(J.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
J.DueDate AS DueDate,
J.PurchId AS PurchaseOrderNumber,
J.CreatedBy AS UserId,
J.InvoicingName AS VendorName,
J.InvoiceDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceJour J
WHERE J.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 8. Payment Block Applied: Updated on VendTrans */
SELECT
J.InvoiceId AS InvoiceNumber,
'Payment Block Applied' AS Activity,
VT.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
J.InvoiceAccount AS VendorAccount,
J.DataAreaId AS CompanyCode,
CAST(J.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
J.DueDate AS DueDate,
J.PurchId AS PurchaseOrderNumber,
VT.ModifiedBy AS UserId,
J.InvoicingName AS VendorName,
J.InvoiceDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendTrans VT
JOIN dbo.VendInvoiceJour J ON VT.Invoice = J.InvoiceId AND VT.AccountNum = J.InvoiceAccount AND VT.DataAreaId = J.DataAreaId
WHERE VT.Approved = 0 /* 0 indicates Not Approved/Blocked */
AND VT.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 9. Payment Journal Created: Line added to Journal */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Journal Created' AS Activity,
LJT.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJT.CreatedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTrans LJT
WHERE LJT.AccountType = 2 /* Vendor */
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJT.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 10. Payment Journal Approved: Workflow on Journal Header */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Journal Approved' AS Activity,
LJH.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJH.ModifiedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTable LJH
JOIN dbo.LedgerJournalTrans LJT ON LJH.JournalNum = LJT.JournalNum AND LJH.DataAreaId = LJT.DataAreaId
WHERE LJH.WorkflowApprovalStatus = 2 /* Approved */
AND LJT.AccountType = 2
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJH.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 11. Payment Generated: Payment Status Changed to Sent */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Generated' AS Activity,
LJT.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJT.ModifiedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTrans LJT
WHERE LJT.PaymentStatus = 2 /* Sent/Generated */
AND LJT.AccountType = 2
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJT.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 12. Payment Posted: Journal Line Posted */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Posted' AS Activity,
LJT.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJT.ModifiedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTrans LJT
WHERE LJT.Posted = 1 /* Posted */
AND LJT.AccountType = 2
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJT.ModifiedDateTime BETWEEN @StartDate AND @EndDate
)
SELECT *
FROM RawData
WHERE InvoiceNumber IS NOT NULL AND InvoiceNumber <> ''
ORDER BY InvoiceNumber, EventTime; 시작할 준비가 되셨나요?
이 템플릿으로 탄탄한 데이터 기반을 마련하고 지금 바로 지급 워크플로 개선을 시작하세요. Dynamics 365의 특정 테이블을 매핑하는 데 도움이 필요하시면 저희 팀이 지원해 드립니다.
지금 매입채무 지급 처리 개선하기
처리 주기를 30% 단축하고 D365 지연을 줄이세요.
신용카드가 필요하지 않습니다. 설정은 5분이면 완료됩니다.