Template Dati: Elaborazione Fatture Contabilità Fornitori
Il tuo Modello Dati per l'Elaborazione delle Fatture di Contabilità Fornitori
- Attributi consigliati per un'analisi completa
- Attività di processo chiave da monitorare efficacemente
- Guida all'estrazione dei dati passo dopo passo
Attributi di Elaborazione Fatture Fornitori
| Nome | Descrizione | ||
|---|---|---|---|
Attività ActivityName | Il nome di uno specifico evento o passaggio aziendale che si è verificato nel ciclo di vita dell'elaborazione della fattura. | ||
Descrizione L'attività rappresenta una fase o un'azione distinta all'interno del processo di contabilità fornitori, come 'Fattura Ricevuta', 'Fattura Registrata' o 'Pagamento Eseguito'. Questi sono i blocchi costitutivi della mappa di processo. L'analisi delle attività è fondamentale per il Process Mining. Aiuta a visualizzare il flusso di processo, identificare i percorsi comuni, rilevare le deviazioni dal processo standard e misurare la frequenza e la durata di ogni passaggio. La sequenza di queste attività per una data fattura forma il suo percorso di processo. Perché è importante Definisce i passaggi del processo, consentendo la visualizzazione e l'analisi del flusso di processo, l'identificazione dei colli di bottiglia e il rilievo dei cicli di rilavorazione. Dove trovare Derivato da varie fonti, inclusi i cambiamenti di stato del documento (es. BKPF-BSTAT), i documenti di modifica (tabelle CDHDR/CDPOS) o i log di workflow. Ciò richiede tipicamente una logica di estrazione personalizzata. Esempi Fattura RicevutaFattura ApprovataPagamento EseguitoFattura Bloccata per Pagamento | |||
Fattura Invoice | L'identificatore univoco per un documento di fattura, che serve come ID del case primario per il processo di Contabilità Fornitori. | ||
Descrizione La Fattura è l'oggetto centrale che connette tutte le attività correlate, dalla ricezione al pagamento. In SAP S/4HANA, questa è tipicamente una chiave composita formata dal Codice Società (BUKRS), un Numero Documento univoco (BELNR) e l'Anno Fiscale (GJAHR). L'analisi per fattura consente una visione completa end-to-end del ciclo di vita della fattura. Questo è fondamentale per il calcolo di metriche chiave come il tempo di ciclo totale, l'identificazione dei colli di bottiglia per le singole fatture e la comprensione dei diversi percorsi che una fattura può intraprendere attraverso il processo. Perché è importante Identifica in modo univoco il percorso di ogni fattura, rendendo possibile tracciare il suo intero ciclo di vita e analizzare le performance del processo caso per caso. Dove trovare Questa è una chiave composita derivata dalle tabelle BKPF (Intestazione Documento Contabile) o RBKP (Intestazione Documento: Ricevimento Fattura) usando i campi BUKRS, BELNR e GJAHR. Esempi 1000-1900000001-20231710-1900000002-20232000-5100000003-2024 | |||
Ora Evento EventTime | La data e l'ora esatte in cui si è verificata l'attività. | ||
Descrizione Event Time è il timestamp associato a ogni attività, che fornisce la sequenza cronologica degli eventi per una fattura. Questo dato è fondamentale per comprendere il flusso di processo ed eseguire qualsiasi analisi basata sul tempo. Nell'analisi, Event Time viene utilizzato per ordinare correttamente le attività, calcolare i tempi di ciclo tra i diversi passaggi, identificare i tempi di attesa e analizzare le prestazioni di processo su diversi periodi di tempo (ad es. mese su mese). È la base di tutti i KPI basati sulla durata. Perché è importante Questo timestamp è fondamentale per ordinare gli eventi cronologicamente e calcolare tutte le metriche basate sul tempo, come i tempi di ciclo e le durate, che sono essenziali per il Process Mining. Dove trovare Ricavato da vari campi data/ora nelle tabelle SAP, come Data di Creazione (BKPF-CPUDT), Data di Registrazione (BKPF-BUDAT), Data di Compensazione (BSAK-AUGDT) o timestamp dei log di modifica (CDHDR-UDATE/UTIME). Esempi 2023-10-01T09:00:00Z2023-10-05T14:30:15Z2023-10-15T11:21:05Z | |||
Sistema di Origine SourceSystem | Il sistema da cui sono stati estratti i dati. | ||
Descrizione Questo attributo identifica l'origine dei dati di processo. Per questa visualizzazione, il valore sarà tipicamente 'SAP S/4HANA'. In ambienti con più ERP o sistemi integrati, questo campo è cruciale per la data lineage e la segregazione. Assicura che l'analisi sia eseguita sul dataset corretto e aiuta a diagnosticare i problemi di qualità dei dati risalendo alla loro origine. Perché è importante Identifica l'origine dei dati, che è cruciale per la governance dei dati, la risoluzione dei problemi e negli ambienti multi-sistema. Dove trovare Questo è tipicamente un valore statico aggiunto durante il processo di estrazione dei dati per etichettare l'origine del set di dati. Esempi SAP S/4HANASAP ECC 6.0S4H_PROD_100 | |||
Ultimo Aggiornamento Dati LastDataUpdate | Il timestamp che indica l'ultimo aggiornamento dei dati per questo record dal sistema sorgente. | ||
Descrizione Questo attributo fornisce la data e l'ora dell'estrazione o dell'aggiornamento più recente dei dati da SAP S/4HANA. È un campo metadata critico per comprendere la 'freschezza' dei dati in analisi. Questa informazione è importante affinché gli utenti sappiano quanto sia attuale l'analisi del processo. Aiuta a gestire le aspettative sulla latenza dei dati ed è vitale per la pianificazione dei data refresh e per il mantenimento dell'integrità dei dati. Perché è importante Indica la freschezza dei dati, assicurando che gli utenti siano consapevoli dell'attualità della loro analisi del processo. Dove trovare Questo valore viene generato e associato a ogni record al momento dell'estrazione dei dati dal sistema sorgente. Esempi 2024-05-20T04:00:00Z2024-05-21T04:00:00Z | |||
Codice Società CompanyCode | L'unità organizzativa per la quale la fattura viene elaborata. | ||
Descrizione Il Codice Società è la più piccola unità organizzativa per la quale può essere predisposto un set completo e autonomo di conti per la rendicontazione esterna. Nel contesto della gestione delle fatture fornitori (AP), rappresenta l'entità legale che deve denaro al fornitore. L'analisi per Codice Società consente di confrontare le performance del processo tra diverse entità legali all'interno dell'organizzazione. Ciò aiuta a identificare quali parti dell'azienda seguono processi standard e quali presentano una maggiore efficienza, cicli più lunghi o tassi di rilavorazione più elevati. Perché è importante Consente il confronto delle performance di processo tra diverse entità legali, aiutando a identificare problemi specifici per regione o business unit e le migliori pratiche. Dove trovare Presente nelle tabelle di intestazione del documento, principalmente BKPF-BUKRS per le fatture FI e RBKP-BUKRS per le fatture MM. Esempi 10001710US01DE01 | |||
Data Scadenza Fattura InvoiceDueDate | La data entro la quale il pagamento della fattura è dovuto al fornitore. | ||
Descrizione La Data di Scadenza Fattura rappresenta il termine ultimo per saldare il fornitore ed evitare penali per ritardo, mantenendo al contempo un'ottima relazione commerciale. Questa data è calcolata in base alla data di base della fattura e ai termini di pagamento concordati con il fornitore. Questa data è fondamentale per la dashboard 'Conformità Pagamenti e Scadenze' e per il KPI 'Tasso di Pagamento Puntuale'. Confrontando la data di scadenza con la data di pagamento effettiva, l'analisi può rivelare se i pagamenti vengono effettuati in tempo, in anticipo o in ritardo, con dirette conseguenze finanziarie e relazionali. Perché è importante Questo è il fattore trainante principale per l'analisi dei pagamenti puntuali, consentendo la misurazione delle prestazioni di pagamento e del loro impatto sulle relazioni con i fornitori e sulle penali di mora. Dove trovare Questa data è spesso calcolata. La data di scadenza netta si trova nel campo BSEG-NETDT. Può anche essere derivata dalla data base per il pagamento (BSEG-ZFBDT) e dai termini di pagamento (BSEG-ZTERM). Esempi 2023-10-312023-11-152024-01-10 | |||
Importo Fattura InvoiceAmount | L'importo lordo totale della fattura nella valuta originale del documento. | ||
Descrizione Questo è il valore totale della fattura così come presentata dal fornitore. Include il costo di beni o servizi, tasse e qualsiasi altro onere, al netto di detrazioni o sconti. L'Importo Fattura è un attributo finanziario cruciale utilizzato per un'ampia gamma di analisi. Aiuta a dare priorità alle fatture di valore elevato, a comprendere l'impatto finanziario dei ritardi di processo (ad esempio, penali di mora su fatture di valore elevato) e a segmentare il processo (ad esempio, 'Le fatture di alto valore seguono un percorso di approvazione diverso?'). È anche essenziale per identificare potenziali pagamenti duplicati. Perché è importante Fornisce un contesto finanziario al processo, consentendo analisi basate sul valore, la prioritizzazione delle fatture di alto valore e la quantificazione degli impatti finanziari. Dove trovare Rintracciabile in tabelle come RBKP-RMWWR (Gross invoice amount) per le fatture MM o calcolato dalle voci di riga in BSEG (campo WRBTR) per le fatture FI. Esempi 1500.00250.7512345.50 | |||
Nome Fornitore VendorName | Il nome del fornitore che ha presentato la fattura. | ||
Descrizione Questo attributo contiene il nome ufficiale del fornitore. È collegato tramite il Numero Fornitore memorizzato sul documento di fattura. L'analisi dei fornitori è cruciale per gestire le relazioni e identificare problemi di processo specifici per determinati fornitori. Può aiutare a rispondere a domande come: 'Quali fornitori presentano il maggior numero di fatture con discrepanze?' o 'Stiamo pagando costantemente i nostri fornitori strategici in tempo?'. È anche un campo chiave, insieme al numero di fattura e all'importo, per rilevare potenziali pagamenti duplicati. Perché è importante Consente l'analisi delle performance di processo per fornitore, contribuendo a identificare i fornitori problematici e a gestire efficacemente le relazioni strategiche con essi. Dove trovare Recuperato dalla tabella dati anagrafici fornitori LFA1 (campo NAME1), tramite collegamento con il numero fornitore (LIFNR) presente in BKPF o RBKP. Esempi Office Supplies Inc.Global Consulting GroupMachine Parts GmbH | |||
Nome Utente UserName | L'user ID della persona che ha eseguito l'attività. | ||
Descrizione Questo attributo registra l'SAP user ID responsabile dell'esecuzione di una specifica attività, come la registrazione, l'approvazione o la compensazione di una fattura. Collega i passi di processo agli utenti individuali. L'analisi per User Name è essenziale per comprendere la distribuzione del carico di lavoro, identificare i top performer e individuare gli utenti che potrebbero richiedere formazione aggiuntiva. È anche fondamentale per analizzare i colli di bottiglia nelle approvazioni all'interno dei dashboard, poiché aiuta a identificare quali approvatori specifici stanno causando ritardi nel processo. Perché è importante Attribuisce le attività a individui specifici, permettendo l'analisi delle performance degli utenti, del carico di lavoro e della conformità alle politiche di segregazione delle mansioni. Dove trovare Tipicamente trovato nelle tabelle di intestazione come BKPF-USNAM (Inserito da) o nelle tabelle dei documenti di modifica CDHDR-USERNAME (Modificato da). Esempi ABROWNJSMITHAUTOMAZIONE_CONTABILITA_FORNITORI | |||
Numero Ordine d'Acquisto PurchaseOrderNumber | L'identificatore univoco dell'ordine di acquisto associato alla fattura, se applicabile. | ||
Descrizione Questo attributo collega una fattura a un ordine di acquisto (PO) pre-approvato. La presenza di un numero di PO è la base per il processo di riconciliazione a 3 vie (PO-Fattura-Ricevimento Merci). Questo è un attributo vitale per l'analisi della conformità e dell'efficienza. Viene utilizzato per calcolare il KPI 'PO-Less Invoice Percentage', che misura l'aderenza alle politiche di approvvigionamento. È anche fondamentale per il dashboard '3-Way Matching Performance', consentendo l'analisi del processo di matching per le fatture basate su PO. Perché è importante Cruciale per analizzare l'efficienza del matching a 3 vie e misurare la conformità alle politiche di approvvigionamento, identificando le fatture elaborate senza un ordine di acquisto. Dove trovare Rintracciabile nelle tabelle delle voci di riga della fattura, ad esempio RSEG-EBELN (per le fatture MM) o BSEG-EBELN (per le fatture FI). Esempi 45000012344500005678 | |||
Data di Compensazione ClearingDate | La data in cui è stato effettuato un pagamento e la fattura è stata compensata dalle partite aperte. | ||
Descrizione La Data di Compensazione indica il saldo finanziario della fattura. È la data in cui si verifica l'attività 'Pagamento Compensato', che segna il passaggio finale per la maggior parte delle fatture elaborate con successo. Questa data viene utilizzata per calcolare la data di pagamento effettiva da confrontare con la Data di Scadenza della Fattura. È quindi essenziale per calcolare il KPI 'Tasso di Pagamento Puntuale' e per qualsiasi analisi relativa alla performance dei pagamenti. Segna anche il punto finale per il calcolo del tempo di ciclo end-to-end della fattura. Perché è importante Contrassegna la liquidazione finale di una fattura, fungendo da punto finale per i calcoli del tempo di ciclo e la base per l'analisi dei pagamenti puntuali. Dove trovare Trovato nelle tabelle relative agli elementi liquidati, come BSAK-AUGDT per i fornitori. Esempi 2023-10-282023-11-142024-01-09 | |||
È Automatizzato IsAutomated | Un flag che indica se l'attività è stata eseguita automaticamente dal sistema anziché da un utente umano. | ||
Descrizione Questo attributo booleano distingue tra attività avviate manualmente e quelle eseguite da processi di sistema, workflow o bot. Ad esempio, un ciclo di pagamento automatico o una registrazione di fattura generata dal sistema verrebbero contrassegnati come automatizzati. L'analisi di questo attributo aiuta a comprendere il livello di automazione nel processo di Contabilità Fornitori. Può essere utilizzata per misurare il successo delle iniziative di automazione, confrontare l'efficienza dei passi automatizzati rispetto a quelli manuali e identificare ulteriori opportunità di automazione. Perché è importante Aiuta a misurare il grado di automazione nel processo, consentendo l'analisi dell'efficacia dell'automazione e identificando opportunità di ulteriore miglioramento. Dove trovare Derivato in base al Nome Utente (es. ID utente di sistema come 'SAP_SYSTEM' o 'BATCHUSER') o a specifici codici di transazione associati a processi automatizzati. Esempi truefalse | |||
È un Pagamento in Ritardo IsLatePayment | Un flag booleano che indica se la fattura è stata pagata dopo la sua data di scadenza. | ||
Descrizione Questo attributo calcolato è un semplice indicatore vero/falso che indica se il pagamento di una fattura è stato effettuato dopo la sua data di scadenza ufficiale. È derivato confrontando la 'Clearing Date' con la 'Invoice Due Date'. Questo indicatore semplifica l'analisi per il dashboard 'Payment Compliance & Aging' e il KPI 'On-Time Payment Rate'. Consente un facile filtraggio e un'aggregazione per contare il numero di pagamenti in ritardo, calcolare la percentuale di pagamenti puntuali e identificare fornitori o codici società con alti tassi di pagamenti in ritardo. Perché è importante Misura direttamente la conformità ai termini di pagamento, semplifica il calcolo dei KPI di pagamento puntuale e aiuta a identificare le aree con scarse performance di pagamento. Dove trovare Attributo calcolato. La logica è: SE ClearingDate > InvoiceDueDate ALLORA vero ALTRIMENTI falso. Esempi truefalse | |||
Motivo di Blocco BlockingReason | La ragione per cui una fattura è bloccata per il pagamento, indicando una discrepanza. | ||
Descrizione Quando una fattura non supera un controllo di validazione durante il 3-way match o altre fasi di verifica, viene bloccata per il pagamento. La Causa di Blocco specifica la natura del problema, come una discrepanza di quantità, una variazione di prezzo o il mancato ricevimento della merce. Questo attributo è fondamentale per la dashboard 'Analisi delle Rilavorazioni per Discrepanze di Fattura'. L'analisi della frequenza delle diverse cause di blocco aiuta a identificare le cause profonde delle inefficienze di processo. Ad esempio, se la 'Variazione di prezzo' è una causa comune, potrebbe indicare problemi con i dati anagrafici nel sistema di acquisto. Perché è importante Fornisce insight diretti sulle cause alla radice delle discrepanze delle fatture e delle rilavorazioni, consentendo sforzi mirati di miglioramento del processo. Dove trovare Memorizzato nelle tabelle delle posizioni delle fatture come RSEG, in campi che iniziano con SPGR* (es. SPGRP, SPGRQ, SPGRT). Può essere trovato anche in RBKP_BLOCKED. Esempi Discrepanza di PrezzoDiscrepanza di QuantitàMancato Ricevimento Merce | |||
Numero Fattura Fornitore VendorInvoiceNumber | Il numero di fattura fornito dal fornitore sul proprio documento. | ||
Descrizione Questo è il numero di riferimento del sistema contabile del fornitore, come riportato sulla fattura fisica o elettronica. Viene inserito manualmente o acquisito tramite OCR al momento del ricevimento della fattura. Questo campo è estremamente importante per scopi operativi e di analisi, in particolare per la dashboard 'Pagamenti di Fatture Potenzialmente Duplicati'. Un metodo comune per rilevare i duplicati è la ricerca di più documenti di fattura interni che condividono lo stesso Nome Fornitore, Numero Fattura Fornitore e Importo Fattura. È il riferimento esterno primario per una fattura. Perché è importante È un campo chiave per rilevare potenziali pagamenti duplicati e funge da riferimento esterno primario per la comunicazione con i fornitori. Dove trovare Memorizzato nel campo 'Riferimento' sull'intestazione del documento, tipicamente BKPF-XBLNR. Esempi INV-2023-9876733401120231015-001 | |||
Sconto Usufruito DiscountTaken | Un flag booleano che indica se uno sconto per pagamento anticipato è stato applicato con successo. | ||
Descrizione Questo attributo indica se uno sconto cassa è stato effettivamente applicato al momento del pagamento della fattura. È un componente critico per misurare l'efficienza finanziaria nel processo di Contabilità Fornitori. Questo indicatore è il nucleo del KPI 'Early Payment Discount Capture Rate'. Filtrando le fatture per cui era possibile uno sconto (in base ai Termini di Pagamento) e analizzando successivamente questo indicatore, un'azienda può calcolare con precisione quanti soldi sono stati risparmiati e quante opportunità di risparmio sono state perse. Ciò fornisce una misura chiara e quantificabile delle prestazioni della Contabilità Fornitori. Perché è importante Misura direttamente il successo nel cogliere gli sconti per pagamento anticipato disponibili, che ha un impatto diretto sul risultato economico dell'azienda. Dove trovare Derivato verificando se il campo dell'importo dello sconto (BSEG-SKNTO) è maggiore di zero nel documento di pagamento. Esempi truefalse | |||
Tempo di Elaborazione ProcessingTime | La durata di una singola attività. | ||
Descrizione Il Tempo di Elaborazione, o durata dell'attività, è il tempo trascorso tra l'inizio e la fine di un'attività. Questa metrica è calcolata dai dati del log degli eventi. Questa misura calcolata è cruciale per la dashboard 'Heatmap Durata Attività e Rilavorazioni'. Aiuta a individuare quali passaggi specifici del processo richiedono più tempo. L'analisi dei tempi di elaborazione può evidenziare inefficienze, come lunghi passaggi di approvazione o attività prolungate di risoluzione delle discrepanze, guidando sforzi di miglioramento mirati. Perché è importante Quantifica il tempo trascorso sulle singole attività, aiutando a identificare i passaggi più lunghi e i colli di bottiglia nel processo. Dove trovare Calcolato trovando la differenza tra l'EventTime dell'attività corrente e l'EventTime dell'attività successiva per la stessa fattura. Esempi P2DT3H4MPT5HP7D | |||
Termini di Pagamento PaymentTerms | Le condizioni concordate con il fornitore per il pagamento di una fattura, con opportunità di sconto incluse. | ||
Descrizione I Termini di Pagamento definiscono le regole per le date di scadenza e i potenziali sconti per pagamento anticipato. Ad esempio, un termine come 'Z001' potrebbe corrispondere a 'Pagabile entro 30 giorni, sconto del 2% se pagato in 10 giorni'. Questo attributo è la base per la dashboard 'Tasso di Cattura degli Sconti per Pagamento Anticipato'. Analizzando i termini di pagamento, è possibile identificare tutte le fatture idonee per uno sconto. Confrontando questo dato con gli sconti effettivamente ottenuti si rivelano le opportunità di risparmio perse e si misura l'efficienza del processo di pagamento. Perché è importante È essenziale per analizzare le opportunità di sconto per pagamenti anticipati, misurare le performance finanziarie del processo di pagamento e identificare i mancati risparmi. Dove trovare Rintracciabile nelle voci di riga dei fornitori, tabella BSEG-ZTERM, o sull'intestazione della fattura in RBKP-ZTERM. Esempi Z0010001NT30 | |||
Tipo Documento Fattura InvoiceDocumentType | Una classificazione del documento di fattura, che controlla come viene elaborato in SAP. | ||
Descrizione Il Tipo Documento è un elemento di configurazione chiave in SAP che classifica i documenti contabili. Ad esempio, 'KR' è tipicamente utilizzato per le fatture fornitori, 'RE' per le fatture MM e 'KG' per le note di credito fornitori. Questo tipo determina elementi come l'intervallo di numerazione e quali campi sono obbligatori. Nell'analisi dei processi, il filtro per Tipo Documento consente di confrontare i flussi di processo per diversi tipi di fatture. Ad esempio, il processo di approvazione per una nota di credito potrebbe essere diverso da quello di una fattura standard. Questo è utile per la dashboard 'Varianti di Routing Approvazione Fatture'. Perché è importante Permette la segmentazione del processo in base alla gestione dei diversi tipi di fattura, rivelando variazioni nei percorsi di elaborazione e nei tempi di ciclo. Dove trovare Direttamente dalla tabella dell'intestazione del documento, campo BKPF-BLART. Esempi KRREKG | |||
Valuta Fattura InvoiceCurrency | Il codice valuta per l'importo della fattura (es. USD, EUR). | ||
Descrizione Questo attributo specifica la valuta in cui è denominato l'Importo della Fattura. Fornisce un contesto essenziale per qualsiasi valore finanziario. In un'organizzazione multinazionale, analizzare le fatture senza considerare la loro valuta può essere fuorviante. Questo campo consente una gestione corretta dei dati finanziari, sia convertendo tutti gli importi in un'unica valuta di reporting, sia segmentando l'analisi per valuta per comprendere le attività finanziarie regionali. Perché è importante Fornisce il contesto necessario per l'Importo della Fattura, consentendo un'analisi finanziaria e una reportistica accurate, specialmente in contesti multinazionali. Dove trovare Presente nelle tabelle di intestazione del documento, principalmente BKPF-WAERS o RBKP-WAERS. Esempi USDEURGBPJPY | |||
Attività di Elaborazione Fatture Fornitori
| Activity | Descrizione | ||
|---|---|---|---|
Fattura Annullata | Il documento di fattura è stato stornato, annullandone di fatto l'impatto finanziario. Questo è uno stato finale alternativo per il processo, spesso dovuto a registrazioni errate o controversie con i fornitori. | ||
Perché è importante Il monitoraggio degli annullamenti aiuta a identificare le cause dei fallimenti di processo, come invii duplicati o dati di fattura errati, che possono indicare problemi a monte. Dove trovare Questo viene registrato esplicitamente quando viene creato un documento di storno. L'intestazione del documento originale (BKPF) conterrà il numero del documento di storno (STBLG) e la relativa causale. Acquisisci Identifica la data di registrazione del documento di storno, che è collegato nell'intestazione del documento originale (BKPF-STBLG). Tipo di evento explicit | |||
Fattura Approvata | La fattura ha ricevuto tutte le approvazioni necessarie all'interno del sistema di workflow. Questo è spesso il passaggio finale prima che una fattura possa essere registrata o sbloccata per il pagamento. | ||
Perché è importante Questo traguardo chiave segna la fine del ciclo di approvazione. Il tempo tra l'inoltro e l'approvazione è una metrica cruciale per l'efficienza. Dove trovare Acquisito dai log di SAP Business Workflow come fase di completamento o rilascio finale. In alternativa, può essere dedotto dalla rimozione di un blocco di pagamento dopo l'instradamento. Acquisisci Estrai gli eventi di completamento del workflow dai log del workflow SAP o identifica l'evento finale di 'release'. Tipo di evento explicit | |||
Fattura Bloccata per Pagamento | Il sistema ha applicato automaticamente o manualmente un blocco sulla fattura, impedendone il pagamento. Ciò è tipicamente dovuto a discrepanze nel prezzo, nella quantità o alla mancanza di approvazioni. | ||
Perché è importante È un indicatore chiave di problemi e rilavorazioni. Analizzare le motivazioni e le durate dei blocchi aiuta a identificare le cause profonde dei ritardi nei pagamenti e delle inefficienze di processo. Dove trovare Questo è uno stato esplicito registrato nel campo Chiave di Blocco Pagamento (ZLSPR) nella voce del fornitore del documento contabile (tabella BSEG). Acquisisci Registrato tramite documenti di modifica quando il campo BSEG-ZLSPR viene compilato con un motivo di blocco. Tipo di evento explicit | |||
Fattura Registrata | La fattura è formalmente registrata nel Libro Mastro Generale, creando una passività finanziaria. Un documento parcheggiato diventa un documento registrato, oppure viene effettuata una registrazione diretta. | ||
Perché è importante Questo è un traguardo finanziario cruciale. Conferma l'obbligo di pagamento dell'azienda ed è spesso un prerequisito per la pianificazione del pagamento. Dove trovare Questo evento è identificato dalla Data di Registrazione (BUDAT) nell'intestazione del documento (BKPF). Un documento registrato ha uno stato del documento (BKPF-BSTAT) vuoto. Acquisisci Utilizza il timestamp di registrazione (BKPF-BUDAT) per i documenti che non sono 'parcheggiati' (BKPF-BSTAT è vuoto). Tipo di evento explicit | |||
Fattura Ricevuta | Questa attività segna la creazione di un documento di fattura in SAP, sia manualmente che tramite un'interfaccia automatizzata come OCR/VIM. Questo evento è tipicamente acquisito dalla data e ora di creazione dell'intestazione del documento contabile. | ||
Perché è importante Come punto di partenza del processo, questa attività è essenziale per calcolare il tempo di ciclo end-to-end della fattura e misurare il throughput dell'intero processo di Contabilità Fornitori. Dove trovare Questo evento è acquisito dalla tabella dell'intestazione del documento contabile (BKPF), utilizzando la data (CPUDT) e l'ora (CPUTM) di creazione del documento. Acquisisci Utilizza il timestamp di creazione (BKPF-CPUDT, BKPF-CPUTM) per il documento di fattura. Tipo di evento explicit | |||
Pagamento Eseguito | È stato effettuato un pagamento per la fattura. Questo viene registrato quando la sessione di pagamento è completata e un documento di pagamento viene creato e contabilizzato. | ||
Perché è importante Questa attività è cruciale per l'analisi del cash flow e per misurare il KPI 'On-Time Payment Rate' confrontando questa data con la data di scadenza della fattura. Dove trovare Viene acquisito dalla data di registrazione del documento di pagamento che compensa la fattura. Il numero del documento di pagamento è indicato nel campo del documento di compensazione (AUGBL) della voce di fattura (BSEG). Acquisisci Identifica la data di registrazione (BUDAT) del documento di pagamento che compensa la voce di riga della fattura. Tipo di evento explicit | |||
Pagamento Liquidato | Questa attività segna la chiusura finale della fattura, dove il pagamento e la fattura vengono riconciliati tra loro nel sottoconto. Ciò significa che il processo è completo. | ||
Perché è importante Essendo la fase finale del processo, questa attività è essenziale per un calcolo accurato del tempo di ciclo end-to-end. Conferma che il debito è stato saldato. Dove trovare Si tratta di un evento esplicito, segnalato dalla presenza della data di compensazione (campo AUGDT) nella voce del fornitore del documento di fattura (tabella BSEG). Acquisisci Utilizza la data di compensazione (BSEG-AUGDT) della voce di fattura. Tipo di evento explicit | |||
Data Scadenza Fattura Superata | Un evento calcolato che indica che la data di scadenza netta della fattura è trascorsa senza che un pagamento sia stato saldato. Questo segnala una situazione di pagamento in ritardo o scaduto. | ||
Perché è importante Essenziale per la dashboard 'Conformità e Scadenze Pagamenti', questa attività aiuta a identificare e gestire proattivamente le fatture scadute e ad analizzare le cause profonde dei ritardi nei pagamenti. Dove trovare Questo non è un evento esplicito in SAP. Viene calcolato confrontando la data corrente del sistema con la Data di Scadenza Netta (calcolata da BSEG-ZFBDT o dalla data di base e dai termini di pagamento). Acquisisci Evento calcolato che si attiva quando il timestamp dell'evento è maggiore della data di scadenza netta della fattura. Tipo di evento calculated | |||
Discrepanza Risolta | Questa attività indica che un problema precedentemente identificato, che probabilmente aveva causato un blocco di pagamento, è stato analizzato e risolto. Viene registrata quando un blocco di pagamento viene rimosso da una fattura. | ||
Perché è importante Il monitoraggio di questo ciclo di rilavorazione è fondamentale per la dashboard 'Analisi delle Rilavorazioni per Discrepanze nelle Fatture'. Aiuta a quantificare il tempo e lo sforzo impiegati per correggere gli errori. Dove trovare Questo è desunto dai documenti di modifica che indicano la rimozione di un blocco di pagamento. Il log delle modifiche per il campo BSEG-ZLSPR è la fonte primaria. Acquisisci Identifica i documenti di modifica per la tabella BSEG dove il campo ZLSPR passa da un valore a vuoto. Tipo di evento inferred | |||
Fattura Inviata per Approvazione | La fattura è stata inoltrata in un workflow per le approvazioni richieste basate su regole aziendali. Questo segna l'inizio del sotto-processo di approvazione. | ||
Perché è importante Questa attività è il punto di partenza per misurare il KPI 'Average Invoice Approval Time' e analizzare i colli di bottiglia nel processo di approvazione. Dove trovare Può essere acquisito dai log di SAP Business Workflow (tabelle SWW*) che registrano l'avvio di un'istanza di workflow collegata all'oggetto fattura (es. BUS2081). Acquisisci Estrai gli eventi di avvio del workflow dai log del workflow SAP (ad es., tabella SWW_WIHEAD) collegati al documento di fattura. Tipo di evento explicit | |||
Fattura Parcheggiata | Rappresenta una fattura che è stata inserita nel sistema ma non ancora registrata nel libro mastro generale. Questo è spesso un passaggio intenzionale per salvare un documento incompleto in vista di elaborazioni o approvazioni future. | ||
Perché è importante Il monitoraggio delle fatture 'parcheggiate' aiuta a identificare i ritardi prima dell'inizio del processo di registrazione formale e può evidenziare problemi di completezza dei dati o di validazione iniziale. Dove trovare Questo stato è desunto dal campo dello stato del documento nell'intestazione del documento contabile (BKPF-BSTAT = 'V' per Parcheggiato). L'evento si verifica quando lo stato viene impostato. Acquisisci Identifica i documenti di modifica per la tabella BKPF dove il campo BSTAT è impostato su 'V' (Vor-erfasst/Pre-entered). Tipo di evento inferred | |||
Fattura Rifiutata | Un approvatore ha rifiutato la fattura durante il workflow di approvazione. Questa azione di solito rimanda la fattura al responsabile dell'elaborazione per correzioni o chiarimenti. | ||
Perché è importante Il monitoraggio dei rifiuti evidenzia i cicli di rilavorazione all'interno del processo di approvazione e può indicare problemi di conformità alle politiche o di codifica errata delle fatture. Dove trovare Questo viene acquisito come uno specifico evento di risultato nei log di SAP Business Workflow associati alla fattura. Acquisisci Estrai gli eventi con stato 'rejected' del workflow dai log del workflow SAP. Tipo di evento explicit | |||
Ordine d'Acquisto Corrispondente | Questa attività indica che la fattura è stata abbinata con successo a un ordine di acquisto corrispondente. Questo è un passo critico nel processo di riconciliazione a 3 vie (3-way matching) per le fatture legate agli acquisti. | ||
Perché è importante Analizzare questa attività è fondamentale per misurare l'efficienza del processo di riconciliazione e per i KPI 'Performance del Matching a 3 vie' e 'Percentuale di fatture senza Ordine di Acquisto'. Dove trovare Questo è desunto quando una voce di fattura nella tabella BSEG o ACDOCA contiene un numero d'ordine d'acquisto (EBELN) e una posizione (EBELP) validi. Acquisisci Deducibile dalla presenza di un riferimento all'Ordine d'Acquisto (BSEG-EBELN) sul documento di fattura al momento della creazione. Tipo di evento inferred | |||
Proposta di Pagamento Creata | La fattura è stata inclusa in una proposta di pagamento come parte di un ciclo di pagamento (es. F110). È ora prevista per il pagamento in attesa dell'esecuzione finale del ciclo. | ||
Perché è importante Questa attività mostra la transizione da una passività aperta a un elemento attivamente in fase di preparazione per il pagamento, contribuendo ad analizzare l'efficienza delle operazioni di pagamento. Dove trovare Questo evento è esplicitamente registrato nelle tabelle dati delle esecuzioni di pagamento, specificamente REGUP (Voci Elaborate dal Programma di Pagamento) e REGUH (Intestazione). Acquisisci Identifica quando una fattura appare nella tabella REGUP per un ciclo di pagamento identificato in REGUH. Tipo di evento explicit | |||
Riscontro Ricevimento Merci | Questa attività indica che le quantità e i valori della fattura sono stati abbinati con successo a un corrispondente documento di entrata merci. Questa è la convalida finale in uno scenario di riconciliazione a 3 vie. | ||
Perché è importante Il monitoraggio di ciò aiuta a individuare le inefficienze nel processo di matching a tre vie e a identificare le discrepanze tra i beni ricevuti e ciò che viene fatturato dal fornitore. Dove trovare Questo è desunto dalla presenza di un riferimento al documento materiale (ricevimento merci) nella voce di fattura, spesso collegato tramite la cronologia della posizione dell'ordine d'acquisto. Acquisisci Deducibile dalla presenza di un riferimento al documento di Ricevimento Merci sulla voce di riga della fattura (ad es., in RSEG per le fatture MIRO). Tipo di evento inferred | |||
Guide all'Estrazione
Fasi
- Prerequisiti e Accesso: Assicurati di disporre di un utente con accesso in lettura allo schema del database SAP S/4HANA (solitamente SAPABAP1 o simile) dove risiedono le view CDS. Avrai bisogno di uno strumento client SQL in grado di connettersi al database SAP HANA, come SAP HANA Studio, DBeaver o strumenti di query di database simili.
- Identifica le View CDS Core: Le view CDS primarie per questa estrazione sono I_JournalEntry, I_JournalEntryItem, I_SupplierInvoiceAPI01, I_ChangeDocument, I_WorkflowStatusDetails e I_PaymentProposalItem. Acquisisci familiarità con i loro campi chiave.
- Definisci l'Ambito della Query: Apri il tuo client SQL e connettiti al database SAP HANA. Prima di eseguire la query completa, definisci l'ambito della tua estrazione. Ciò implica l'impostazione dell'identificatore corretto del sistema sorgente, l'intervallo di date per le fatture (CreationDateTime) e i Codici Società pertinenti.
- Prepara la Query Principale: Copia la query SQL completa fornita nella sezione query nel tuo client SQL. La query utilizza le Common Table Expressions (CTE) per selezionare inizialmente una popolazione base di fatture e quindi costruisce un log degli eventi unendo i dati per 15 diverse attività.
- Imposta i Parametri della Query: Nella query SQL copiata, individua le variabili segnaposto. Sostituisci '[YYYY-MM-DD]' con le date di inizio e fine del periodo di analisi. Sostituisci '[Your Company Code 1]', '[Your Company Code 2]' con l'elenco dei Codici Società SAP che desideri analizzare.
- Esegui la Query di Estrazione: Esegui la query SQL completa. A seconda del volume di dati e dell'intervallo di date selezionato, l'operazione potrebbe richiedere da diversi minuti a diverse ore per essere completata.
- Revisiona i Risultati Preliminari: Una volta terminata la query, esamina le prime centinaia di righe dell'output. Verifica la coerenza dei dati, assicurati che tutte le colonne siano popolate come previsto e conferma la presenza di diversi valori ActivityName.
- Esporta il Log degli Eventi: Esporta l'intero set di risultati dal tuo client SQL in un file CSV. Assicurati che il file sia codificato in UTF-8 per prevenire problemi di caratteri. Dai un nome descrittivo al file, ad esempio sap_s4hana_ap_event_log.csv.
- Prepara per l'Upload: Prima di caricare su uno strumento di process mining, conferma che le intestazioni delle colonne nel file CSV corrispondano esattamente ai nomi degli attributi richiesti: Invoice, ActivityName, EventTime, SourceSystem, LastDataUpdate, UserName, ecc.
- Carica nello Strumento di Process Mining: Carica il file CSV generato sulla tua piattaforma di process mining, mappando le colonne ai corrispondenti campi di ID caso, attività e timestamp.
Configurazione
- Principali Viste CDS: L'estrazione si basa su una combinazione di Viste CDS standard di S/4HANA. Le viste principali sono:
- I_JournalEntry e I_JournalEntryItem: Per intestazioni, voci, dettagli di contabilizzazione e informazioni di compensazione dei documenti finanziari principali.
- I_SupplierInvoiceAPI01: Per dettagli specifici delle fatture MM (Logistica), inclusi i riferimenti agli ordini d'acquisto (PO) e i blocchi di pagamento.
- I_ChangeDocument: Per tracciare il timestamp esatto delle modifiche, come l'impostazione o la rimozione di un blocco di pagamento.
- I_WorkflowStatusDetails: Per estrarre gli eventi relativi al workflow di approvazione delle fatture.
- I_PaymentProposalItem: Per identificare quando una fattura è inclusa in una proposta di ciclo di pagamento.
- I_Supplier: Per arricchire i dati con le informazioni anagrafiche dei fornitori, come VendorName.
- Filtro per Intervallo di Date: È fondamentale applicare un filtro per intervallo di date per limitare il volume dei dati. La query fornita filtra per CreationDateTime nella CTE Invoices_Base. Si raccomanda un intervallo di 3-6 mesi per un'analisi iniziale, per garantire prestazioni gestibili.
- Filtri Obbligatori: Filtrare sempre per CompanyCode. L'analisi simultanea dei dati di tutti i CompanyCode può essere estremamente lenta e potrebbe non essere rilevante per il business. Filtrare inoltre per JournalEntryType per selezionare solo i documenti relativi ai fornitori (ad es. 'KR', 'RE').
- Prerequisiti: L'utente del database che esegue l'operazione deve disporre dell'autorizzazione SELECT su tutte le viste CDS utilizzate nella query e sullo schema HANA sottostante. L'accesso a livello di applicazione nella SAP GUI non è sufficiente.
- Considerazioni sulle Prestazioni: Le query dirette su I_ChangeDocument possono richiedere molte risorse. La query fornita tenta di ridurre l'impatto pre-filtrando le fatture. Per dataset molto grandi, considerare l'esecuzione dell'estrazione durante le ore non di punta o in lotti con intervalli di date più piccoli.
a Query di Esempio sql
`sql
-- Common Table Expression (CTE) to select the base set of AP Invoices
WITH Invoices_Base AS (
SELECT
I_JournalEntry.CompanyCode,
I_JournalEntry.AccountingDocument,
I_JournalEntry.FiscalYear,
CONCAT(I_JournalEntry.CompanyCode, CONCAT(I_JournalEntry.AccountingDocument, I_JournalEntry.FiscalYear)) AS InvoiceId,
I_JournalEntry.CreationDateTime,
I_JournalEntry.CreatedByUser,
I_JournalEntry.DocumentStatus,
I_JournalEntry.JournalEntryType,
I_JournalEntry.ReversalReferenceJournalEntry,
I_JournalEntry.IsReversed,
I_JournalEntry.ReversalDate,
IJE_ITEM.NetDueDate,
IJE_ITEM.Supplier,
SUP.SupplierName AS VendorName,
IJE_ITEM.AmountInCompanyCodeCurrency AS InvoiceAmount,
MM.PurchaseOrder AS PurchaseOrderNumber,
MM.PaymentBlockingReason
FROM I_JournalEntry
-- Join to get item details like due date and supplier
LEFT JOIN I_JournalEntryItem AS IJE_ITEM
ON I_JournalEntry.CompanyCode = IJE_ITEM.CompanyCode
AND I_JournalEntry.AccountingDocument = IJE_ITEM.AccountingDocument
AND I_JournalEntry.FiscalYear = IJE_ITEM.FiscalYear
AND IJE_ITEM.IsSupplier = 'X'
-- Join to get vendor name from master data
LEFT JOIN I_Supplier AS SUP
ON IJE_ITEM.Supplier = SUP.Supplier
-- Join to get MM Invoice specific data like PO Number and Payment Block
LEFT JOIN I_SupplierInvoiceAPI01 AS MM
ON I_JournalEntry.AccountingDocument = MM.AccountingDocument
AND I_JournalEntry.CompanyCode = MM.CompanyCode
AND I_JournalEntry.FiscalYear = MM.FiscalYear
WHERE
I_JournalEntry.JournalEntryType IN ('KR', 'RE') -- Standard Vendor Invoice Types
AND I_JournalEntry.CompanyCode IN ('[Your Company Code 1]', '[Your Company Code 2]')
AND I_JournalEntry.CreationDateTime BETWEEN '[YYYY-MM-DD]T00:00:00Z' AND '[YYYY-MM-DD]T23:59:59Z'
)
-- Event: 1. Invoice Received
SELECT
B.InvoiceId AS "Invoice",
'Invoice Received' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
UNION ALL
-- Event: 2. Invoice Parked
SELECT
B.InvoiceId AS "Invoice",
'Invoice Parked' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.DocumentStatus = 'V' -- 'V' stands for Parked
UNION ALL
-- Event: 3. Purchase Order Matched
SELECT
B.InvoiceId AS "Invoice",
'Purchase Order Matched' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.PurchaseOrderNumber IS NOT NULL AND B.PurchaseOrderNumber <> ''
UNION ALL
-- Event: 4. Goods Receipt Matched
SELECT
B.InvoiceId AS "Invoice",
'Goods Receipt Matched' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_SupplierInvoiceItemAPI01 AS MM_ITEM
ON B.AccountingDocument = MM_ITEM.AccountingDocument
AND B.FiscalYear = MM_ITEM.FiscalYear
WHERE MM_ITEM.GoodsReceipt IS NOT NULL AND MM_ITEM.GoodsReceipt <> ''
UNION ALL
-- Event: 5. Invoice Blocked For Payment
SELECT
B.InvoiceId AS "Invoice",
'Invoice Blocked For Payment' AS "ActivityName",
B.CreationDateTime AS "EventTime", -- Approximates block time as creation time if blocked on entry
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.PaymentBlockingReason IS NOT NULL AND B.PaymentBlockingReason <> ''
UNION ALL
-- Event: 6. Discrepancy Resolved (Payment Block Removed)
SELECT
B.InvoiceId AS "Invoice",
'Discrepancy Resolved' AS "ActivityName",
CD.ChangeTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
CD.UserName AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_ChangeDocument AS CD
ON CONCAT(B.CompanyCode, B.AccountingDocument, B.FiscalYear) = CD.ObjectValue
WHERE CD.ChangeDocumentObject = 'INVOICE'
AND CD.TableName = 'RBKP'
AND CD.FieldName = 'ZLSPR' -- Field for Payment Block
AND CD.NewFieldValue = '' -- Block was removed
UNION ALL
-- Event: 7, 8, 9. Workflow Events (Routed, Approved, Rejected)
SELECT
B.InvoiceId AS "Invoice",
CASE WF.WorkflowStatus
WHEN 'READY' THEN 'Invoice Routed For Approval'
WHEN 'APPROVED' THEN 'Invoice Approved'
WHEN 'REJECTED' THEN 'Invoice Rejected'
END AS "ActivityName",
WF.WorkflowStatusChangedDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
WF.WorkflowStatusChangedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_WorkflowStatusDetails AS WF
ON B.InvoiceId = WF.WorkflowScenarioInstance
WHERE WF.WorkflowStatus IN ('READY', 'APPROVED', 'REJECTED')
UNION ALL
-- Event: 10. Invoice Posted
SELECT
B.InvoiceId AS "Invoice",
'Invoice Posted' AS "ActivityName",
JE.PostingDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntry AS JE
ON B.AccountingDocument = JE.AccountingDocument
AND B.CompanyCode = JE.CompanyCode
AND B.FiscalYear = JE.FiscalYear
WHERE B.DocumentStatus <> 'V' -- Any status other than Parked is considered Posted for AP
UNION ALL
-- Event: 11. Payment Proposal Created
SELECT
B.InvoiceId AS "Invoice",
'Payment Proposal Created' AS "ActivityName",
PPI.PaymentProposalRunDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
PPI.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_PaymentProposalItem AS PPI
ON B.CompanyCode = PPI.CompanyCode
AND B.AccountingDocument = PPI.AccountingDocument
AND B.FiscalYear = PPI.FiscalYear
UNION ALL
-- Event: 12. Payment Executed
-- This links the invoice to its clearing document, which is the payment document
SELECT DISTINCT
B.InvoiceId AS "Invoice",
'Payment Executed' AS "ActivityName",
CLEAR_JE.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
CLEAR_JE.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
INNER JOIN I_JournalEntry AS CLEAR_JE
ON IJE_ITEM.ClearingJournalEntry = CLEAR_JE.AccountingDocument
AND IJE_ITEM.CompanyCode = CLEAR_JE.CompanyCode
WHERE IJE_ITEM.ClearingJournalEntry IS NOT NULL AND IJE_ITEM.ClearingJournalEntry <> ''
AND CLEAR_JE.JournalEntryType = 'KZ' -- Vendor Payment Document Type
UNION ALL
-- Event: 13. Invoice Due Date Passed
SELECT
B.InvoiceId AS "Invoice",
'Invoice Due Date Passed' AS "ActivityName",
ADD_DAYS(B.NetDueDate, 1) AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
'SYSTEM' AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
LEFT JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
WHERE B.NetDueDate < CURRENT_DATE
AND IJE_ITEM.ClearingDate IS NULL -- Invoice is not yet cleared
UNION ALL
-- Event: 14. Payment Cleared
SELECT DISTINCT
B.InvoiceId AS "Invoice",
'Payment Cleared' AS "ActivityName",
IJE_ITEM.ClearingDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
IJE_ITEM.ChangedByUser AS "UserName", -- User who cleared it
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
WHERE IJE_ITEM.ClearingDate IS NOT NULL
UNION ALL
-- Event: 15. Invoice Cancelled
SELECT
B.InvoiceId AS "Invoice",
'Invoice Cancelled' AS "ActivityName",
B.ReversalDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName", -- User who created the original document
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.IsReversed = 'X';
`Fasi
- Prerequisiti e Accesso: Assicurati di disporre di un utente con accesso in lettura allo schema del database SAP S/4HANA (solitamente SAPABAP1 o simile) dove risiedono le view CDS. Avrai bisogno di uno strumento client SQL in grado di connettersi al database SAP HANA, come SAP HANA Studio, DBeaver o strumenti di query di database simili.
- Identifica le View CDS Core: Le view CDS primarie per questa estrazione sono I_JournalEntry, I_JournalEntryItem, I_SupplierInvoiceAPI01, I_ChangeDocument, I_WorkflowStatusDetails e I_PaymentProposalItem. Acquisisci familiarità con i loro campi chiave.
- Definisci l'Ambito della Query: Apri il tuo client SQL e connettiti al database SAP HANA. Prima di eseguire la query completa, definisci l'ambito della tua estrazione. Ciò implica l'impostazione dell'identificatore corretto del sistema sorgente, l'intervallo di date per le fatture (CreationDateTime) e i Codici Società pertinenti.
- Prepara la Query Principale: Copia la query SQL completa fornita nella sezione query nel tuo client SQL. La query utilizza le Common Table Expressions (CTE) per selezionare inizialmente una popolazione base di fatture e quindi costruisce un log degli eventi unendo i dati per 15 diverse attività.
- Imposta i Parametri della Query: Nella query SQL copiata, individua le variabili segnaposto. Sostituisci '[YYYY-MM-DD]' con le date di inizio e fine del periodo di analisi. Sostituisci '[Your Company Code 1]', '[Your Company Code 2]' con l'elenco dei Codici Società SAP che desideri analizzare.
- Esegui la Query di Estrazione: Esegui la query SQL completa. A seconda del volume di dati e dell'intervallo di date selezionato, l'operazione potrebbe richiedere da diversi minuti a diverse ore per essere completata.
- Revisiona i Risultati Preliminari: Una volta terminata la query, esamina le prime centinaia di righe dell'output. Verifica la coerenza dei dati, assicurati che tutte le colonne siano popolate come previsto e conferma la presenza di diversi valori ActivityName.
- Esporta il Log degli Eventi: Esporta l'intero set di risultati dal tuo client SQL in un file CSV. Assicurati che il file sia codificato in UTF-8 per prevenire problemi di caratteri. Dai un nome descrittivo al file, ad esempio sap_s4hana_ap_event_log.csv.
- Prepara per l'Upload: Prima di caricare su uno strumento di process mining, conferma che le intestazioni delle colonne nel file CSV corrispondano esattamente ai nomi degli attributi richiesti: Invoice, ActivityName, EventTime, SourceSystem, LastDataUpdate, UserName, ecc.
- Carica nello Strumento di Process Mining: Carica il file CSV generato sulla tua piattaforma di process mining, mappando le colonne ai corrispondenti campi di ID caso, attività e timestamp.
Configurazione
- Principali Viste CDS: L'estrazione si basa su una combinazione di Viste CDS standard di S/4HANA. Le viste principali sono:
- I_JournalEntry e I_JournalEntryItem: Per intestazioni, voci, dettagli di contabilizzazione e informazioni di compensazione dei documenti finanziari principali.
- I_SupplierInvoiceAPI01: Per dettagli specifici delle fatture MM (Logistica), inclusi i riferimenti agli ordini d'acquisto (PO) e i blocchi di pagamento.
- I_ChangeDocument: Per tracciare il timestamp esatto delle modifiche, come l'impostazione o la rimozione di un blocco di pagamento.
- I_WorkflowStatusDetails: Per estrarre gli eventi relativi al workflow di approvazione delle fatture.
- I_PaymentProposalItem: Per identificare quando una fattura è inclusa in una proposta di ciclo di pagamento.
- I_Supplier: Per arricchire i dati con le informazioni anagrafiche dei fornitori, come VendorName.
- Filtro per Intervallo di Date: È fondamentale applicare un filtro per intervallo di date per limitare il volume dei dati. La query fornita filtra per CreationDateTime nella CTE Invoices_Base. Si raccomanda un intervallo di 3-6 mesi per un'analisi iniziale, per garantire prestazioni gestibili.
- Filtri Obbligatori: Filtrare sempre per CompanyCode. L'analisi simultanea dei dati di tutti i CompanyCode può essere estremamente lenta e potrebbe non essere rilevante per il business. Filtrare inoltre per JournalEntryType per selezionare solo i documenti relativi ai fornitori (ad es. 'KR', 'RE').
- Prerequisiti: L'utente del database che esegue l'operazione deve disporre dell'autorizzazione SELECT su tutte le viste CDS utilizzate nella query e sullo schema HANA sottostante. L'accesso a livello di applicazione nella SAP GUI non è sufficiente.
- Considerazioni sulle Prestazioni: Le query dirette su I_ChangeDocument possono richiedere molte risorse. La query fornita tenta di ridurre l'impatto pre-filtrando le fatture. Per dataset molto grandi, considerare l'esecuzione dell'estrazione durante le ore non di punta o in lotti con intervalli di date più piccoli.
a Query di Esempio sql
`sql
-- Common Table Expression (CTE) to select the base set of AP Invoices
WITH Invoices_Base AS (
SELECT
I_JournalEntry.CompanyCode,
I_JournalEntry.AccountingDocument,
I_JournalEntry.FiscalYear,
CONCAT(I_JournalEntry.CompanyCode, CONCAT(I_JournalEntry.AccountingDocument, I_JournalEntry.FiscalYear)) AS InvoiceId,
I_JournalEntry.CreationDateTime,
I_JournalEntry.CreatedByUser,
I_JournalEntry.DocumentStatus,
I_JournalEntry.JournalEntryType,
I_JournalEntry.ReversalReferenceJournalEntry,
I_JournalEntry.IsReversed,
I_JournalEntry.ReversalDate,
IJE_ITEM.NetDueDate,
IJE_ITEM.Supplier,
SUP.SupplierName AS VendorName,
IJE_ITEM.AmountInCompanyCodeCurrency AS InvoiceAmount,
MM.PurchaseOrder AS PurchaseOrderNumber,
MM.PaymentBlockingReason
FROM I_JournalEntry
-- Join to get item details like due date and supplier
LEFT JOIN I_JournalEntryItem AS IJE_ITEM
ON I_JournalEntry.CompanyCode = IJE_ITEM.CompanyCode
AND I_JournalEntry.AccountingDocument = IJE_ITEM.AccountingDocument
AND I_JournalEntry.FiscalYear = IJE_ITEM.FiscalYear
AND IJE_ITEM.IsSupplier = 'X'
-- Join to get vendor name from master data
LEFT JOIN I_Supplier AS SUP
ON IJE_ITEM.Supplier = SUP.Supplier
-- Join to get MM Invoice specific data like PO Number and Payment Block
LEFT JOIN I_SupplierInvoiceAPI01 AS MM
ON I_JournalEntry.AccountingDocument = MM.AccountingDocument
AND I_JournalEntry.CompanyCode = MM.CompanyCode
AND I_JournalEntry.FiscalYear = MM.FiscalYear
WHERE
I_JournalEntry.JournalEntryType IN ('KR', 'RE') -- Standard Vendor Invoice Types
AND I_JournalEntry.CompanyCode IN ('[Your Company Code 1]', '[Your Company Code 2]')
AND I_JournalEntry.CreationDateTime BETWEEN '[YYYY-MM-DD]T00:00:00Z' AND '[YYYY-MM-DD]T23:59:59Z'
)
-- Event: 1. Invoice Received
SELECT
B.InvoiceId AS "Invoice",
'Invoice Received' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
UNION ALL
-- Event: 2. Invoice Parked
SELECT
B.InvoiceId AS "Invoice",
'Invoice Parked' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.DocumentStatus = 'V' -- 'V' stands for Parked
UNION ALL
-- Event: 3. Purchase Order Matched
SELECT
B.InvoiceId AS "Invoice",
'Purchase Order Matched' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.PurchaseOrderNumber IS NOT NULL AND B.PurchaseOrderNumber <> ''
UNION ALL
-- Event: 4. Goods Receipt Matched
SELECT
B.InvoiceId AS "Invoice",
'Goods Receipt Matched' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_SupplierInvoiceItemAPI01 AS MM_ITEM
ON B.AccountingDocument = MM_ITEM.AccountingDocument
AND B.FiscalYear = MM_ITEM.FiscalYear
WHERE MM_ITEM.GoodsReceipt IS NOT NULL AND MM_ITEM.GoodsReceipt <> ''
UNION ALL
-- Event: 5. Invoice Blocked For Payment
SELECT
B.InvoiceId AS "Invoice",
'Invoice Blocked For Payment' AS "ActivityName",
B.CreationDateTime AS "EventTime", -- Approximates block time as creation time if blocked on entry
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.PaymentBlockingReason IS NOT NULL AND B.PaymentBlockingReason <> ''
UNION ALL
-- Event: 6. Discrepancy Resolved (Payment Block Removed)
SELECT
B.InvoiceId AS "Invoice",
'Discrepancy Resolved' AS "ActivityName",
CD.ChangeTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
CD.UserName AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_ChangeDocument AS CD
ON CONCAT(B.CompanyCode, B.AccountingDocument, B.FiscalYear) = CD.ObjectValue
WHERE CD.ChangeDocumentObject = 'INVOICE'
AND CD.TableName = 'RBKP'
AND CD.FieldName = 'ZLSPR' -- Field for Payment Block
AND CD.NewFieldValue = '' -- Block was removed
UNION ALL
-- Event: 7, 8, 9. Workflow Events (Routed, Approved, Rejected)
SELECT
B.InvoiceId AS "Invoice",
CASE WF.WorkflowStatus
WHEN 'READY' THEN 'Invoice Routed For Approval'
WHEN 'APPROVED' THEN 'Invoice Approved'
WHEN 'REJECTED' THEN 'Invoice Rejected'
END AS "ActivityName",
WF.WorkflowStatusChangedDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
WF.WorkflowStatusChangedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_WorkflowStatusDetails AS WF
ON B.InvoiceId = WF.WorkflowScenarioInstance
WHERE WF.WorkflowStatus IN ('READY', 'APPROVED', 'REJECTED')
UNION ALL
-- Event: 10. Invoice Posted
SELECT
B.InvoiceId AS "Invoice",
'Invoice Posted' AS "ActivityName",
JE.PostingDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntry AS JE
ON B.AccountingDocument = JE.AccountingDocument
AND B.CompanyCode = JE.CompanyCode
AND B.FiscalYear = JE.FiscalYear
WHERE B.DocumentStatus <> 'V' -- Any status other than Parked is considered Posted for AP
UNION ALL
-- Event: 11. Payment Proposal Created
SELECT
B.InvoiceId AS "Invoice",
'Payment Proposal Created' AS "ActivityName",
PPI.PaymentProposalRunDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
PPI.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_PaymentProposalItem AS PPI
ON B.CompanyCode = PPI.CompanyCode
AND B.AccountingDocument = PPI.AccountingDocument
AND B.FiscalYear = PPI.FiscalYear
UNION ALL
-- Event: 12. Payment Executed
-- This links the invoice to its clearing document, which is the payment document
SELECT DISTINCT
B.InvoiceId AS "Invoice",
'Payment Executed' AS "ActivityName",
CLEAR_JE.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
CLEAR_JE.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
INNER JOIN I_JournalEntry AS CLEAR_JE
ON IJE_ITEM.ClearingJournalEntry = CLEAR_JE.AccountingDocument
AND IJE_ITEM.CompanyCode = CLEAR_JE.CompanyCode
WHERE IJE_ITEM.ClearingJournalEntry IS NOT NULL AND IJE_ITEM.ClearingJournalEntry <> ''
AND CLEAR_JE.JournalEntryType = 'KZ' -- Vendor Payment Document Type
UNION ALL
-- Event: 13. Invoice Due Date Passed
SELECT
B.InvoiceId AS "Invoice",
'Invoice Due Date Passed' AS "ActivityName",
ADD_DAYS(B.NetDueDate, 1) AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
'SYSTEM' AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
LEFT JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
WHERE B.NetDueDate < CURRENT_DATE
AND IJE_ITEM.ClearingDate IS NULL -- Invoice is not yet cleared
UNION ALL
-- Event: 14. Payment Cleared
SELECT DISTINCT
B.InvoiceId AS "Invoice",
'Payment Cleared' AS "ActivityName",
IJE_ITEM.ClearingDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
IJE_ITEM.ChangedByUser AS "UserName", -- User who cleared it
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
WHERE IJE_ITEM.ClearingDate IS NOT NULL
UNION ALL
-- Event: 15. Invoice Cancelled
SELECT
B.InvoiceId AS "Invoice",
'Invoice Cancelled' AS "ActivityName",
B.ReversalDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName", -- User who created the original document
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.IsReversed = 'X';
`Fasi
- Specifiche e Progettazione: Prima di procedere con la codifica, collabori con gli analisti di business per confermare le condizioni di attivazione esatte e i campi dati per ciascuna delle 15 attività richieste. Identifichi le SAP tables pertinenti, i document types (ad esempio, 'KR', 'RE') e i company codes da includere nell'ambito.
- Creazione Programma ABAP: Avvii l'ABAP Editor utilizzando il transaction code SE38. Crei un nuovo programma eseguibile, ad esempio, Z_PM_AP_INVOICE_EXTRACT. Fornisca un titolo descrittivo e imposti l'applicazione su 'Contabilità Finanziaria'.
- Definizione Schermata di Selezione: Nel programma, definisca una selection screen (utilizzando le parole chiave PARAMETERS e SELECT-OPTIONS) per consentire agli utenti di specificare l'intervallo di date per l'estrazione (riferito alla data di creazione delle fatture), i Company Codes target (BUKRS) e i Document Types di fattura pertinenti (BLART). Includa anche un parametro per il percorso del file di output sul server delle applicazioni.
- Dichiarazioni Dati: Definisca una struttura di internal table che corrisponda al formato finale dell'event log (ad esempio, TY_EVENT_LOG), inclusi tutti gli attributi richiesti e raccomandati. Dichiari le internal tables per contenere i dati selezionati da varie SAP source tables come BKPF, BSEG, RBKP, RSEG, CDHDR, CDPOS e REGUH.
- Selezione Dati Principali: Avvii la logica di estrazione selezionando il set primario di fatture da RBKP (Fatture Logistiche) e BKPF (Fatture Finanziarie) in base ai criteri della selection screen dell'utente. Memorizzi queste chiavi di fattura primarie in un'internal table per guidare le successive ricerche dati.
- Estrazione Attività Sequenzialmente: Per ogni fattura nel set principale, esegua una serie di selezioni per trovare i timestamp e i dettagli per ogni attività di business. Ad esempio, interroghi CDHDR e CDPOS per le modifiche al blocco pagamenti, interroghi REGUH e REGUP per i dati di esecuzione pagamenti e interroghi BKPF per i dettagli del documento di storno. Aggiunga un nuovo record alla tabella finale dell'event log per ogni attività identificata.
- Logica per Eventi Calcolati: Implementi la logica ABAP per le attività che non sono direttamente memorizzate in un campo di tabella. Per l'evento 'Scadenza Fattura Superata', utilizzi la data di scadenza fattura (BSEG-ZFBDT + termini di pagamento) e la data di compensazione (BSEG-AUGDT). Se la data di compensazione è successiva alla data di scadenza, crei un nuovo record di evento con il timestamp impostato sulla data di scadenza.
- Trasformazione e Arricchimento Dati: Man mano che raccoglie i dati per ogni attività, popoli tutti gli attributi richiesti. Questo comporta la ricerca dei nomi dei fornitori da LFA1, la conversione di date e orari in una singola stringa di timestamp (CONCATENATE...INTO...) e l'impostazione del valore SourceSystem.
- Generazione File di Output: Una volta che tutte le fatture e le relative attività sono state elaborate e raccolte nell'internal table finale, utilizzi le istruzioni OPEN DATASET, LOOP AT ... TRANSFER e CLOSE DATASET per scrivere i dati su un file nel percorso del server delle applicazioni specificato nella selection screen.
- Download e Preparazione per l'Upload: Utilizzi il transaction code CG3Y per scaricare il file generato dal server delle applicazioni alla sua macchina locale. Si assicuri che il file sia salvato in formato CSV codificato UTF-8. Verifichi che le intestazioni delle colonne corrispondano agli attributi richiesti (Invoice, ActivityName, EventTime, ecc.) prima di caricare lo strumento di Process Mining.
Configurazione
- Intervallo di date: Definire l'opzione di selezione P_CPUDT per la data di creazione della fattura (BKPF-CPUDT o RBKP-CPUDT). Per un'analisi iniziale, si consiglia un intervallo di 6-12 mesi di dati.
- Codice società (P_BUKRS): Un parametro SELECT-OPTIONS obbligatorio per filtrare per codici società specifici. Non è raccomandato elaborare tutti i codici società contemporaneamente, a meno che non sia assolutamente necessario.
- Tipo documento fattura (P_BLART): Un parametro SELECT-OPTIONS per filtrare per i tipi di documento fattura pertinenti. I tipi comuni includono 'KR' (Fattura Fornitore), 'KG' (Nota di Credito Fornitore), 'RE' (Verifica Fattura Logistica).
- Modalità di esecuzione: Il programma dovrebbe essere eseguito come background job (SM36/SM37) per grandi volumi di dati, al fine di evitare timeout nel processo di dialogo in primo piano. Si consiglia di pianificarne l'esecuzione durante le ore non di punta.
- Percorso file di output: Un PARAMETER per specificare il percorso e il nome del file sul server applicazioni SAP (ad esempio, nella directory /tmp/). Il file viene scritto qui prima di essere scaricato.
- Prerequisiti: L'utente che esegue il report necessita dell'autorizzazione per leggere dalle tabelle FI, CO e MM (BKPF, BSEG, RBKP, RSEG, LFA1), dalle tabelle dei documenti di modifica (CDHDR, CDPOS) e dalle tabelle del workflow. Inoltre, è richiesto l'oggetto autorizzazione S_DATASET per scrivere file sul server applicazioni.
a Query di Esempio abap
`abap
*&---------------------------------------------------------------------*
*& Report Z_PM_AP_INVOICE_EXTRACT
*&---------------------------------------------------------------------*
*& This report extracts Accounts Payable invoice lifecycle events for
*& process mining analysis.
*&---------------------------------------------------------------------*
REPORT z_pm_ap_invoice_extract.
*&---------------------------------------------------------------------*
*& Data Structures
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
invoice TYPE belnr_d,
activityname TYPE string,
eventtime TYPE string,
sourcesystem TYPE logsys,
lastdataupdate TYPE string,
username TYPE uname,
companycode TYPE bukrs,
vendorname TYPE name1_gp,
invoiceamount TYPE wrbtr,
purchaseordernumber TYPE ebeln,
invoiceduedate TYPE d,
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
DATA: gv_system_id TYPE logsys.
DATA: gv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs OBLIGATORY,
s_cpudt FOR bkpf-cpudt OBLIGATORY DEFAULT sy-datum,
s_blart FOR bkpf-blart.
PARAMETERS: p_fpath TYPE string OBLIGATORY DEFAULT '/tmp/ap_extract.csv'.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
" Get System ID and Update Timestamp
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = gv_system_id
EXCEPTIONS
own_logical_system_not_defined = 1
OTHERS = 2.
CONCATENATE sy-datum sy-uzeit INTO gv_last_update.
" Internal tables for SAP data
DATA: lt_bkpf TYPE TABLE OF bkpf,
lt_rbkp TYPE TABLE OF rbkp.
" Select base documents
SELECT * FROM bkpf INTO TABLE lt_bkpf
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND blart IN s_blart
AND ( blart = 'KR' OR blart = 'KG' ). " Example FI Invoice Types
SELECT * FROM rbkp INTO TABLE lt_rbkp
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND blart IN s_blart
AND blart = 'RE'. " Example MM Invoice Type
" --- Process each invoice document ---
LOOP AT lt_bkpf ASSIGNING FIELD-SYMBOL(<fs_bkpf>).
PERFORM process_invoice USING <fs_bkpf>.
ENDLOOP.
LOOP AT lt_rbkp ASSIGNING FIELD-SYMBOL(<fs_rbkp>).
PERFORM process_mm_invoice USING <fs_rbkp>.
ENDLOOP.
" Write output to file
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*& Form PROCESS_INVOICE (Handles FI Invoices)
*&---------------------------------------------------------------------*
FORM process_invoice USING iv_bkpf TYPE bkpf.
DATA: ls_bseg TYPE bseg,
ls_lfa1 TYPE lfa1,
ld_due_date TYPE d.
DATA: ls_event TYPE ty_event_log.
" Get Vendor and other details from first line item
SELECT SINGLE * FROM bseg INTO ls_bseg
WHERE bukrs = iv_bkpf-bukrs
AND belnr = iv_bkpf-belnr
AND gjahr = iv_bkpf-gjahr
AND koart = 'K'.
IF sy-subrc = 0.
SELECT SINGLE name1 FROM lfa1 INTO ls_lfa1-name1 WHERE lifnr = ls_bseg-lifnr.
CALL FUNCTION 'DETERMINE_DUE_DATE'
EXPORTING
i_zfbdt = ls_bseg-zfbdt
i_zbd1t = ls_bseg-zbd1t
i_zbd2t = ls_bseg-zbd2t
i_zbd3t = ls_bseg-zbd3t
i_zbd1p = ls_bseg-zbd1p
i_zbd2p = ls_bseg-zbd2p
i_zterm = ls_bseg-zterm
IMPORTING
e_faedt = ld_due_date.
ENDIF.
" Helper function to populate common fields
MACRO set_common_fields.
ls_event-invoice = iv_bkpf-belnr.
ls_event-sourcesystem = gv_system_id.
ls_event-lastdataupdate = gv_last_update.
ls_event-companycode = iv_bkpf-bukrs.
ls_event-vendorname = ls_lfa1-name1.
ls_event-invoiceduedate = ld_due_date.
SELECT SINGLE wrbtr FROM bseg INTO ls_event-invoiceamount WHERE belnr = iv_bkpf-belnr AND gjahr = iv_bkpf-gjahr AND koart = 'K'.
ENDMACRO.
" 1. Invoice Received
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Received'.
CONCATENATE iv_bkpf-cpudt iv_bkpf-cputm INTO ls_event-eventtime.
ls_event-username = iv_bkpf-usnam.
APPEND ls_event TO gt_event_log.
" 2. Invoice Parked (if document was created as parked)
IF iv_bkpf-bstat = 'V'.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Parked'.
CONCATENATE iv_bkpf-cpudt iv_bkpf-cputm INTO ls_event-eventtime.
ls_event-username = iv_bkpf-usnam.
APPEND ls_event TO gt_event_log.
ENDIF.
" 10. Invoice Posted (For non-parked, same as received. For parked, this needs CDHDR/CDPOS logic not shown for brevity)
IF iv_bkpf-bstat <> 'V'.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Posted'.
CONCATENATE iv_bkpf-budat iv_bkpf-cputm INTO ls_event-eventtime. " Using posting date
ls_event-username = iv_bkpf-usnam.
APPEND ls_event TO gt_event_log.
ENDIF.
" 5. & 7. Invoice Blocked / Discrepancy Resolved from Change Docs
DATA: lt_cdhdr TYPE TABLE OF cdhdr, lt_cdpos TYPE TABLE OF cdpos.
DATA(ld_objectkey) = |{ iv_bkpf-bukrs }{ iv_bkpf-belnr }{ iv_bkpf-gjahr }|.
SELECT * FROM cdhdr INTO TABLE lt_cdhdr WHERE objectclas = 'BELEG' AND objectid = ld_objectkey.
IF sy-subrc = 0.
SELECT * FROM cdpos INTO TABLE lt_cdpos FOR ALL ENTRIES IN lt_cdhdr
WHERE changenr = lt_cdhdr-changenr AND tabname = 'BSEG' AND fname = 'ZLSPR'.
LOOP AT lt_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>).
READ TABLE lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>) WITH KEY changenr = <fs_cdpos>-changenr.
IF sy-subrc = 0.
CLEAR ls_event.
set_common_fields.
IF <fs_cdpos>-value_new IS NOT INITIAL AND <fs_cdpos>-value_old IS INITIAL.
ls_event-activityname = 'Invoice Blocked For Payment'.
ELSEIF <fs_cdpos>-value_new IS INITIAL AND <fs_cdpos>-value_old IS NOT INITIAL.
ls_event-activityname = 'Discrepancy Resolved'.
ELSE.
CONTINUE.
ENDIF.
CONCATENATE <fs_cdhdr>-udate <fs_cdhdr>-utime INTO ls_event-eventtime.
ls_event-username = <fs_cdhdr>-username.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDIF.
" 6. 8. 9. Workflow Events (Routed, Approved, Rejected) - Simplified Example
" This requires knowledge of specific workflow templates. Placeholder logic:
" SELECT ... FROM SWW_WI2OBJ ... WHERE INSTID = [Invoice Object]
" SELECT ... FROM SWWWIHEAD ... to get status and times
" 11. & 12. & 14. Payment Proposal, Executed, Cleared
IF ls_bseg-augbl IS NOT INITIAL.
DATA: ls_regup TYPE regup.
SELECT SINGLE * FROM regup INTO ls_regup WHERE vblnr = ls_bseg-belnr.
IF sy-subrc = 0.
DATA(ld_rundate) = ls_regup-laufd.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Payment Proposal Created'.
CONCATENATE ld_rundate '000000' INTO ls_event-eventtime.
APPEND ls_event TO gt_event_log.
ENDIF.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Payment Executed'.
CONCATENATE ls_bseg-augdt '120000' INTO ls_event-eventtime. " Using clearing date as proxy
APPEND ls_event TO gt_event_log.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Payment Cleared'.
CONCATENATE ls_bseg-augdt '120001' INTO ls_event-eventtime.
APPEND ls_event TO gt_event_log.
ENDIF.
" 13. Invoice Due Date Passed (Calculated)
IF ls_bseg-augdt IS NOT INITIAL AND ld_due_date IS NOT INITIAL.
IF ls_bseg-augdt > ld_due_date.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Due Date Passed'.
CONCATENATE ld_due_date '235959' INTO ls_event-eventtime.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDIF.
" 15. Invoice Cancelled
IF iv_bkpf-stblg IS NOT INITIAL.
DATA: ls_rev_bkpf TYPE bkpf.
SELECT SINGLE * FROM bkpf INTO ls_rev_bkpf WHERE belnr = iv_bkpf-stblg.
IF sy-subrc = 0.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Cancelled'.
CONCATENATE ls_rev_bkpf-cpudt ls_rev_bkpf-cputm INTO ls_event-eventtime.
ls_event-username = ls_rev_bkpf-usnam.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PROCESS_MM_INVOICE (Handles MM/Logistics Invoices)
*&---------------------------------------------------------------------*
FORM process_mm_invoice USING iv_rbkp TYPE rbkp.
" This form would be similar to PROCESS_INVOICE, but starts with RBKP.
" It needs to find the corresponding FI document in BKPF via AWKEY.
" The logic for PO/GR Matched would be included here.
" For demonstration, creating placeholder events for MM-specific activities.
DATA: ls_event TYPE ty_event_log.
ls_event-invoice = iv_rbkp-belnr.
ls_event-sourcesystem = gv_system_id.
ls_event-lastdataupdate = gv_last_update.
ls_event-companycode = iv_rbkp-bukrs.
" 1. Invoice Received (MM)
ls_event-activityname = 'Invoice Received'.
CONCATENATE iv_rbkp-cpudt iv_rbkp-cputm INTO ls_event-eventtime.
ls_event-username = iv_rbkp-usnam.
APPEND ls_event TO gt_event_log.
" 3. Purchase Order Matched (Implicit)
ls_event-activityname = 'Purchase Order Matched'.
CONCATENATE iv_rbkp-cpudt iv_rbkp-cputm INTO ls_event-eventtime.
ls_event-username = iv_rbkp-usnam.
APPEND ls_event TO gt_event_log.
" 4. Goods Receipt Matched (Implicit)
ls_event-activityname = 'Goods Receipt Matched'.
CONCATENATE iv_rbkp-cpudt iv_rbkp-cputm INTO ls_event-eventtime.
ls_event-username = iv_rbkp-usnam.
APPEND ls_event TO gt_event_log.
" NOTE: The rest of the events (Block, Pay, etc.) would be found by linking
" RBKP to BKPF and then reusing the logic from PROCESS_INVOICE.
" Link: BKPF-AWKEY = CONCATENATE( RBKP-BELNR, RBKP-GJAHR ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form WRITE_OUTPUT_FILE
*&---------------------------------------------------------------------*
FORM write_output_file.
DATA: lv_string TYPE string.
OPEN DATASET p_fpath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
RETURN.
ENDIF.
" Write Header
lv_string = 'Invoice,ActivityName,EventTime,SourceSystem,LastDataUpdate,UserName,CompanyCode,VendorName,InvoiceAmount,PurchaseOrderNumber,InvoiceDueDate'.
TRANSFER lv_string TO p_fpath.
" Write Data
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_event>).
" Create a comma-separated string, handling potential commas in data
CONCATENATE <fs_event>-invoice
<fs_event>-activityname
<fs_event>-eventtime
<fs_event>-sourcesystem
<fs_event>-lastdataupdate
<fs_event>-username
<fs_event>-companycode
<fs_event>-vendorname
<fs_event>-invoiceamount
<fs_event>-purchaseordernumber
<fs_event>-invoiceduedate
INTO lv_string SEPARATED BY ','.
TRANSFER lv_string TO p_fpath.
ENDLOOP.
CLOSE DATASET p_fpath.
WRITE: / 'Extraction complete. File written to:', p_fpath.
ENDFORM.
`