Il Suo Template Dati per il Processo Purchase to Pay - Elaborazione Fatture
Il Suo Template Dati per il Processo Purchase to Pay - Elaborazione Fatture
- Attributi consigliati da raccogliere
- Attività chiave da tracciare
- Guida all'estrazione per SAP S/4HANA
Acquisto al Pagamento - Attributi di Gestione Fatture
| Nome | Descrizione | ||
|---|---|---|---|
| Numero fattura InvoiceNumber | L'identificatore unico per il documento fattura fornitore, che funge da identificatore primario del caso per il processo. | ||
| Descrizione Il Numero Fattura è l'identificatore unico assegnato a ogni fattura fornitore all'interno di SAP S/4HANA. Collega tutte le attività correlate, come la creazione, il "parking", l'approvazione e il pagamento, in un'unica istanza di processo coesa. Nel Process Mining, questo attributo è fondamentale per tracciare il percorso end-to-end di ogni fattura. Consente la ricostruzione dell'intero flusso di processo, dalla ricezione al pagamento finale, permettendo l'analisi dei tempi di ciclo, dei colli di bottiglia e delle variazioni di processo a livello della singola fattura. Perché è importante È la chiave essenziale per collegare tutti gli eventi correlati, consentendo una traccia completa del ciclo di vita di una fattura attraverso il sistema. Dove trovare Questo è il Numero del Documento Contabile, trovato nella tabella BKPF, campo BELNR. Esempi 190000000119000000451900000132 | |||
| Nome attività ActivityName | Il nome dell'attività o dell'evento aziendale che si è verificato in un momento specifico per una fattura. | ||
| Descrizione Il Nome dell'Attività descrive un passo specifico o un cambiamento di stato all'interno del ciclo di vita dell'elaborazione delle fatture. Esempi includono 'Documento Fattura Creato', 'Fattura Inviata per Approvazione', 'Blocco Pagamento Impostato' e 'Pagamento Eseguito'. Questo attributo è cruciale per la costruzione della mappa di processo, che rappresenta visivamente il flusso di attività. Analizzare la sequenza, la frequenza e la durata tra queste attività aiuta a identificare colli di bottiglia, cicli di rilavorazione e variazioni di processo non conformi. Costituisce la spina dorsale di qualsiasi analisi di Process Mining. Perché è importante Definisce i passaggi del processo, consentendo la visualizzazione di mappe di processo e l'analisi dei flussi di processo e delle variazioni. Dove trovare Derivato da una combinazione di codici di transazione SAP (SY-TCODE), stati degli oggetti dei documenti di modifica (CDHDR/CDPOS) e valori specifici di campi che indicano cambiamenti di stato. Esempi Fattura ParcheggiataFattura ApprovataPagamento Eseguito | |||
| Timestamp Evento EventTime | La data e l'ora precise in cui si è verificata l'attività. | ||
| Descrizione Event Time è il timestamp che registra esattamente quando un'attività specifica è accaduta. Questi dati sono essenziali per calcolare durate, tempi di ciclo e tempi di attesa tra i diversi passaggi del processo. Nell'analisi di Process Mining, i timestamp accurati vengono utilizzati per misurare KPI di performance come 'Tempo di Ciclo Medio Fattura' e 'Tempo di Ciclo di Approvazione Fattura'. Analizzando il tempo trascorso tra le attività, le organizzazioni possono individuare i colli di bottiglia dove le fatture vengono ritardate e identificare opportunità per l'accelerazione del processo. Perché è importante Questo timestamp è il fondamento per tutte le analisi basate sul tempo, inclusi il monitoraggio delle prestazioni, l'identificazione dei colli di bottiglia e il tracciamento degli SLA. Dove trovare Tipicamente ricavato dalle tabelle dei documenti di modifica CDHDR (Intestazione) e CDPOS (Voce), utilizzando i campi UDATE e UTIME. Per alcuni eventi, potrebbe provenire da date di creazione o inserimento in tabelle come BKPF (CPUDT, CPUTM). Esempi 2023-04-15T10:30:00Z2023-04-18T14:05:21Z2023-05-02T09:00:00Z | |||
| Codice Società CompanyCode | L'unità organizzativa che rappresenta una società legalmente indipendente per la quale vengono creati i bilanci. | ||
| Descrizione Il Codice Società è un'unità organizzativa fondamentale in SAP Finance. Ogni fattura è assegnata a un codice società specifico, che determina l'entità legale responsabile della transazione. Nel Process Mining, filtrare o confrontare per Codice Società è essenziale per analizzare le prestazioni dei processi tra diverse unità di business, entità legali o paesi. Aiuta a identificare le differenze regionali nei livelli di efficienza, conformità e automazione, supportando iniziative di miglioramento mirate. Perché è importante Consente di segmentare e confrontare le prestazioni di elaborazione delle fatture tra diverse entità legali o posizioni geografiche all'interno dell'organizzazione. Dove trovare Questo è un campo standard nella tabella dell'header del documento BKPF, campo BUKRS. Esempi 1000US01DE01 | |||
| Data Scadenza Pagamento PaymentDueDate | La data entro la quale la fattura deve essere pagata per evitare di essere in ritardo. | ||
| Descrizione La Data di Scadenza del Pagamento è la data calcolata in cui il pagamento al fornitore è dovuto, basata sulla data della fattura e sui termini di pagamento concordati. Serve come scadenza critica nel processo. Questo attributo è essenziale per il KPI 'Tasso di Pagamento Puntuale' e la dashboard 'Performance Pagamenti Fornitori'. Confrontando la data di pagamento effettiva con la data di scadenza, un'azienda può misurare la sua capacità di rispettare gli obblighi di pagamento, il che influisce sulle relazioni con i fornitori e sulla reputazione finanziaria. Perché è importante È il benchmark primario per misurare le prestazioni di pagamento puntuale, fondamentale per mantenere buone relazioni con i fornitori ed evitare commissioni di ritardo. Dove trovare Questa data è spesso direttamente disponibile nella voce contabile fornitore nella tabella BSEG, campo ZFBDT (Data base per il calcolo della scadenza). La data di scadenza netta è calcolata da questa data base e dai termini di pagamento. Esempi 2023-05-302023-06-152023-07-01 | |||
| Importo Fattura AmountInCompanyCodeCurrency | L'importo lordo totale della fattura nella valuta locale del codice società. | ||
| Descrizione Questo attributo rappresenta il valore totale della fattura. È una metrica chiave per comprendere l'impatto finanziario e la portata dell'operazione di elaborazione delle fatture. Analizzare gli importi delle fatture aiuta a dare priorità alle fatture di alto valore per un'elaborazione più rapida, a identificare le tendenze di spesa e a correlare i problemi di processo con il valore finanziario. Ad esempio, può essere utilizzato per indagare se le fatture di alto valore hanno maggiori probabilità di essere bloccate o di avere tempi di approvazione più lunghi. Perché è importante Fornisce un contesto finanziario al processo, consentendo analisi basate sul valore monetario, come l'identificazione se le fatture di alto valore vengono elaborate in modo diverso. Dove trovare Questo valore è tipicamente derivato dalla somma delle voci rilevanti nella tabella BSEG, campo WRBTR (Importo in valuta locale). Esempi 1500.75125000.00850.20 | |||
| Motivo Blocco Pagamento PaymentBlockReason | Un codice che indica il motivo per cui una fattura è bloccata dal pagamento. | ||
| Descrizione Quando una fattura è bloccata per il pagamento, questo attributo fornisce il motivo specifico del blocco, come 'Discrepanza Quantità' o 'Discrepanza Prezzo'. Questi motivi sono configurati in SAP per standardizzare la gestione delle eccezioni. Questo attributo è cruciale per la dashboard 'Frequenza e Durata Blocchi di Pagamento'. Analizzare la frequenza dei diversi motivi di blocco aiuta a identificare le cause profonde dei ritardi di pagamento, come problemi con fornitori specifici, materiali o processi interni, consentendo azioni correttive mirate. Perché è importante Fornisce la causa radice specifica per i blocchi di pagamento, consentendo un'analisi mirata per ridurre i ritardi e migliorare l'elaborazione "first-time-right" (al primo tentativo). Dove trovare Situato nella voce di riga del fornitore della tabella BSEG, campo ZLSPR (Chiave Blocco Pagamento). Esempi RIA | |||
| Nome Utente UserName | L'ID utente SAP della persona o del sistema che ha eseguito l'attività. | ||
| Descrizione Questo attributo identifica l'utente che ha eseguito una transazione specifica o creato un documento. Può essere l'ID utente di un individuo o un ID di sistema per processi batch automatizzati. Analizzare per utente aiuta a comprendere la distribuzione del carico di lavoro, a identificare le esigenze di formazione e a individuare comportamenti utente insoliti. Ad esempio, può evidenziare quali utenti gestiscono frequentemente le eccezioni o quali fatture vengono elaborate automaticamente (ad esempio, utente 'BATCHUSER'), il che è fondamentale per il calcolo del KPI 'Tasso di Automazione Fatture'. Perché è importante Attribuisce le attività di processo a utenti specifici o account di sistema, consentendo l'analisi del carico di lavoro, il confronto delle prestazioni e il rilevamento dell'automazione. Dove trovare Estratto da campi come BKPF-USNAM (Inserito da) o CDHDR-USERNAME (Modificato da). Esempi SMITHJMUELLERTWF-BATCH | |||
| Numero del fornitore VendorNumber | L'identificatore unico per il fornitore che ha presentato la fattura. | ||
| Descrizione Il Numero Fornitore identifica il fornitore o creditore associato alla fattura. Collega la transazione della fattura ai dati anagrafici del fornitore. Questo attributo è critico per l'analisi incentrata sul fornitore, come la valutazione della 'Performance di Pagamento Fornitori' o l'identificazione di fornitori che presentano frequentemente fatture problematiche che portano a eccezioni o blocchi di pagamento. Aiuta nella gestione delle relazioni con i fornitori e nella valutazione dell'affidabilità dei fornitori. Perché è importante Consente l'analisi delle prestazioni del processo per fornitore, aiutando a identificare modelli, gestire le relazioni e valutare i problemi relativi ai fornitori. Dove trovare Tipicamente trovato nella tabella del segmento del documento contabile BSEG, campo LIFNR. Esempi 100345700012V9832 | |||
| Ordine d'Acquisto PurchasingDocument | Il numero dell'ordine di acquisto a cui è correlata la fattura. | ||
| Descrizione Il Numero del Documento di Acquisto collega la fattura del fornitore all'ordine di acquisto (PO) originale. Questo collegamento è fondamentale per il processo di matching a tre vie, che verifica la fattura rispetto all'ordine di acquisto e alla ricezione merci. L'analisi tramite questo attributo aiuta a comprendere i problemi relativi alle fatture basate su PO rispetto a quelle non basate su PO. È fondamentale per indagare sulle discrepanze di abbinamento e comprendere l'efficienza della parte di approvvigionamento del processo. Perché è importante Collega la fattura al processo di approvvigionamento, essenziale per analizzare le discrepanze di corrispondenza e la conformità agli ordini di acquisto. Dove trovare Questa informazione si trova tipicamente nella tabella segmento documento BSEG, campo EBELN (Numero Documento di Acquisto). Esempi 450000123445000056784500009012 | |||
| Tipo Documento DocumentType | Un codice che classifica diversi tipi di documenti contabili, come fatture fornitore o note di credito. | ||
| Descrizione Il Tipo di Documento viene utilizzato in SAP per distinguere tra diverse transazioni aziendali. Ad esempio, 'KR' rappresenta tipicamente una fattura fornitore standard, mentre 'KG' potrebbe essere una nota di credito fornitore. L'analisi per tipo di documento consente di segmentare il processo per comprendere come vengono gestiti i diversi tipi di transazione. Ad esempio, il processo per una nota di credito può essere significativamente diverso da quello di una fattura standard. Questa segmentazione fornisce intuizioni di processo più accurate e pertinenti. Perché è importante Aiuta a differenziare tra vari tipi di transazioni finanziarie, come fatture standard e note di credito, che spesso seguono percorsi di processo diversi. Dove trovare Trovato nella tabella di intestazione del documento BKPF, campo BLART. Esempi KRREKG | |||
| Conteggio Cicli di Approvazione ApprovalCycleCount | Un conteggio di quante volte una fattura è stata inviata per approvazione. | ||
| Descrizione Questa metrica conta il numero di volte in cui l'attività 'Fattura Inviata per Approvazione' si verifica per una singola fattura. Un conteggio maggiore di uno indica che la fattura è stata rifiutata o rimandata almeno una volta, richiedendo un nuovo ciclo di approvazione. Questo attributo supporta direttamente il KPI 'Tasso di Approvazione al Primo Passaggio'. Analizzando le fatture con elevati conteggi di cicli di approvazione, le organizzazioni possono identificare le ragioni delle approvazioni fallite, come informazioni insufficienti o codifica errata, e intraprendere azioni per migliorare il processo. Perché è importante Quantifica le rilavorazioni all'interno del sotto-processo di approvazione, aiutando a misurare il tasso di "first-time-right" e a identificare le ragioni dei rifiuti di approvazione. Dove trovare Calcolato contando le occorrenze dell'attività 'Fattura Inviata per Approvazione' per ogni InvoiceNumber unico. Esempi 123 | |||
| Data Fattura InvoiceDate | La data in cui il fornitore ha emesso il documento di fattura. | ||
| Descrizione La Data Fattura, anche conosciuta come data documento, è la data fornita dal fornitore sulla fattura. Viene utilizzata come punto di partenza per il calcolo della data di scadenza del pagamento in base ai termini di pagamento concordati. Nell'analisi, questa data è fondamentale per i calcoli finanziari, come la determinazione dell'invecchiamento delle fatture e l'idoneità agli sconti per pagamento anticipato. È un input chiave per il KPI 'Tasso di Acquisizione Sconti per Pagamento Anticipato'. Perché è importante Serve come base per il calcolo dei termini e delle scadenze di pagamento, il che è essenziale per gestire il capitale circolante e cogliere gli sconti. Dove trovare Trovato nella tabella di intestazione del documento BKPF, campo BLDAT (Data Documento). Esempi 2023-04-122023-05-152023-06-20 | |||
| È Automatizzato IsAutomated | Un indicatore che segnala se un'attività è stata eseguita da un utente di sistema automatizzato. | ||
| Descrizione Questo attributo booleano è vero se l'utente associato a un'attività è un account di sistema o batch noto, come 'WF-BATCH' o 'SAP_SYSTEM'. Aiuta a distinguere tra passaggi di processo manuali e automatizzati. Questo attributo è essenziale per calcolare il KPI 'Tasso di Automazione Fatture'. Analizzando quali parti del processo sono automatizzate, le organizzazioni possono misurare il successo delle loro iniziative di automazione e identificare ulteriori opportunità per ridurre lo sforzo manuale e migliorare l'efficienza. Perché è importante Distingue tra attività manuali e attività guidate dal sistema, il che è fondamentale per misurare i tassi di automazione e identificare opportunità di ulteriore automazione. Dove trovare Derivato dall'attributo UserName. Viene creata una mappatura o una regola per classificare specifici ID utente come 'automatizzati'. Esempi truefalse | |||
| È una Rilavorazione IsRework | Un indicatore che segnala se una fattura ha subito attività di rilavorazione, come un'approvazione rifiutata o un blocco di pagamento rimosso. | ||
| Descrizione Questo attributo contrassegna le fatture che hanno subito uno o più cicli di rilavorazione. La rilavorazione è identificata da sequenze specifiche di attività, ad esempio, 'Fattura Approvata' dopo 'Fattura Rifiutata', o 'Blocco Pagamento Rimosso' dopo 'Blocco Pagamento Impostato'. Questo attributo semplifica il calcolo del KPI 'Tasso di Rilavorazione Fatture'. Consente agli analisti di isolare e indagare facilmente i casi con rilavorazione per comprendere le cause profonde dell'inefficienza e dello sforzo manuale ripetuto. Perché è importante Identifica flussi di processo inefficienti dove il lavoro deve essere ripetuto, aiutando a quantificare gli sprechi e a individuare le cause profonde delle eccezioni di processo. Dove trovare Calcolato in base alla sequenza delle attività nel log degli eventi. Ad esempio, se 'Fattura Rifiutata' si verifica nella traccia di una fattura, questo indicatore verrebbe impostato su vero. Esempi truefalse | |||
| ID sistema sorgente SourceSystemId | L'identificatore del sistema SAP S/4HANA sorgente da cui i dati sono stati estratti. | ||
| Descrizione Questo attributo specifica il sistema di origine, ad esempio, 'S4H_PROD' o 'ERP_EU'. È particolarmente importante in ambienti con più istanze ERP o un mix di sistemi legacy e moderni. Per l'analisi, consente di confrontare le prestazioni dei processi tra diversi sistemi o regioni. Garantisce la provenienza dei dati ed è cruciale per la governance dei dati e la risoluzione dei problemi quando i dati provenienti da più fonti sono combinati in una piattaforma centrale di Process Mining. Perché è importante Fornisce contesto sull'origine dei dati, essenziale per la governance dei dati e per il confronto dei processi tra diversi sistemi o sedi aziendali. Dove trovare Questo valore è tipicamente derivato dall'ID del sistema SAP (sy-sysid) durante l'estrazione dei dati o configurato come valore statico nella pipeline ETL. Esempi S4PS4H_PROD_100ECC_EU | |||
| Motivo dello Storno ReversalReason | Un codice che indica il motivo per cui un documento di fattura è stato stornato. | ||
| Descrizione Se una fattura viene contabilizzata in modo errato, viene spesso stornata. Il codice Motivo di Storno spiega perché è stata intrapresa questa azione, ad esempio, 'Data di contabilizzazione errata' o 'Errore di inserimento dati'. L'analisi dei motivi di storno aiuta a identificare modelli di errori nel processo di contabilizzazione delle fatture. Questo insight può essere utilizzato per migliorare la formazione, rafforzare i controlli di sistema o affrontare problemi ricorrenti che portano a rilavorazioni finanziarie e oneri amministrativi. Perché è importante Spiega perché le fatture sono state annullate, fornendo un insight diretto sulle fonti di errore e rilavorazione nel processo di contabilizzazione. Dove trovare Trovato nell'intestazione del documento originale nella tabella BKPF, campo STGRD (Motivo di storno). Esempi 010205 | |||
| Nr Documento di Compensazione. ClearingDocumentNumber | Il numero del documento che compensa la fattura, tipicamente rappresentante il documento di pagamento. | ||
| Descrizione Il Numero del Documento di Compensazione collega una voce di fattura aperta alla transazione che la compensa, che è quasi sempre il documento di pagamento. Ciò conferma che la fattura è stata pagata. Questo attributo è il collegamento definitivo tra una fattura e il suo pagamento. Viene utilizzato per identificare l'attività 'Pagamento Eseguito' e il relativo timestamp, il che è essenziale per calcolare il tempo di ciclo end-to-end e il tasso di pagamento puntuale. Perché è importante Conferma che una fattura è stata pagata e la collega alla specifica transazione di pagamento, fondamentale per l'analisi del tempo di ciclo e delle prestazioni di pagamento. Dove trovare Trovato nella tabella del segmento del documento BSEG, campo AUGBL (Numero Documento di Compensazione). Esempi 150000000115000000231500000088 | |||
| Pagato puntualmente IsPaidOnTime | Un indicatore che è vero se la fattura è stata pagata alla scadenza o prima. | ||
| Descrizione Questo attributo booleano è il risultato del confronto tra la data di pagamento effettiva (il timestamp dell'attività 'Pagamento Eseguito') e la 'Data di Scadenza del Pagamento'. Fornisce un risultato chiaro e binario per lo stato di pagamento di ogni fattura. Questo è il calcolo principale per il KPI 'Tasso di Pagamento Puntuale'. Consente un facile filtraggio e analisi per comprendere le caratteristiche dei pagamenti in ritardo, come fornitori comuni, codici società o importi di fatture associati a ritardi. Perché è importante Misura direttamente l'aderenza ai termini di pagamento, un KPI critico per la gestione delle relazioni con i fornitori e le operazioni finanziarie. Dove trovare Calcolato confrontando l'EventTime dell'attività 'Pagamento Eseguito' con l'attributo PaymentDueDate. (Data Pagamento <= Data Scadenza Pagamento). Esempi truefalse | |||
| Tempo di Elaborazione Fattura InvoiceProcessingTime | Il tempo totale trascorso dalla prima all'ultima attività per una fattura. | ||
| Descrizione Questa metrica calcola la durata totale per l'elaborazione di una singola fattura, tipicamente dalla creazione o ricezione della fattura al pagamento finale. Fornisce un riepilogo a livello di caso del tempo di ciclo end-to-end. Questo attributo calcolato è la base per il KPI 'Tempo Medio di Ciclo Fattura' e la dashboard 'Tempo di Ciclo Fattura End-to-End'. Consente una rapida identificazione dei casi più lunghi e l'analisi dei fattori che contribuiscono a tempi di elaborazione prolungati. Perché è importante Misura l'efficienza end-to-end del processo per ogni fattura, evidenziando i casi con durate eccezionalmente lunghe che richiedono indagine. Dove trovare Calcolato prendendo la differenza tra il timestamp dell'ultimo evento e il primo evento per ogni InvoiceNumber unico. Esempi 10 giorni 4 ore25 giorni 1 ora5 giorni e 8 ore | |||
| Termini di Pagamento PaymentTerms | Il codice che definisce le condizioni di pagamento concordate con il fornitore, come le scadenze e i periodi di sconto. | ||
| Descrizione I Termini di Pagamento definiscono le regole per il pagamento di una fattura, inclusi eventuali sconti disponibili per il pagamento anticipato. Ad esempio, 'Z030' potrebbe significare 'Pagabile entro 30 giorni netti'. Questo attributo è essenziale per la pianificazione finanziaria e l'ottimizzazione del capitale circolante. Nel Process Mining, viene utilizzato per calcolare la 'Data di Scadenza del Pagamento' e per determinare l'idoneità agli sconti per pagamento anticipato, supportando direttamente il KPI 'Tasso di Acquisizione Sconti per Pagamento Anticipato'. Perché è importante Definisce le regole per le date di scadenza dei pagamenti e gli sconti, influenzando direttamente i KPI di pagamento puntuale e la gestione del capitale circolante. Dove trovare Trovato nella voce di riga del fornitore nella tabella BSEG, campo ZTERM (Chiave Termini di Pagamento). Esempi 0001Z030NT60 | |||
| Timestamp di Estrazione ExtractionTimestamp | La data e l'ora in cui i dati sono stati estratti dal sistema sorgente. | ||
| Descrizione Questo attributo registra il timestamp dell'evento di estrazione dei dati. Riflette l'aggiornamento dei dati analizzati nello strumento di Process Mining. Nell'analisi, questo viene utilizzato per comprendere la tempestività delle intuizioni generate. È fondamentale per le dashboard di monitoraggio operativo per garantire che le decisioni siano basate su informazioni aggiornate e per gestire efficacemente i cicli di aggiornamento dei dati. Perché è importante Indica la freschezza dei dati, assicurando che l'analisi e i report siano basati sulle informazioni più aggiornate disponibili. Dove trovare Questo non è un campo SAP. Viene generato e aggiunto dallo strumento di estrazione dati o dal processo ETL al momento dell'estrazione dei dati. Esempi 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
Acquisto al Pagamento - Attività di Gestione Fatture
| Activity | Descrizione | ||
|---|---|---|---|
| Documento Fattura Creato | Questo è il primo evento, che segna la creazione di un documento fattura in SAP. Può essere catturato quando un utente salva un nuovo documento fattura, che potrebbe essere in uno stato "parcheggiato" o pre-registrato. | ||
| Perché è importante Questa attività segna l'inizio del ciclo di vita dell'elaborazione delle fatture. Analizzare il tempo da questo evento ad altri è cruciale per misurare il tempo di consegna complessivo dell'elaborazione. Dove trovare Questo evento è catturato dalla data e ora di creazione (CPUDT, CPUTM) nella tabella dell'header del documento, tipicamente BKPF o RBKP per le fatture logistiche. Il codice transazione (BKPF-TCODE) come FB60, MIRO o MIR7 indica il metodo di creazione. Acquisisci Utilizzare il timestamp di creazione da BKPF-CPUDT e BKPF-CPUTM per il documento fattura. Tipo di evento explicit | |||
| Fattura Approvata | Questa attività indica che la fattura è stata approvata dall'autorità designata. Questo viene registrato quando il workflow di approvazione si conclude con successo o viene impostato un indicatore di rilascio. | ||
| Perché è importante Questa è una tappa critica che sblocca la fattura per il pagamento. I ritardi nelle approvazioni sono un collo di bottiglia comune e monitorare questa attività aiuta a individuare approvatori lenti o passaggi di processo. Dove trovare Questo può essere dedotto dal passaggio di rilascio finale in un workflow SAP o monitorando le modifiche ai campi di stato di rilascio nelle tabelle associate alla fattura o al suo documento di acquisto. Acquisisci Inferire da eventi di completamento del workflow o cambiamenti nel campo dello stato di rilascio di un documento. Tipo di evento inferred | |||
| Fattura Registrata | Questo è un evento finanziario chiave in cui la fattura "parcheggiata" o approvata viene formalmente registrata nel Conto Economico. Questa azione riconosce la passività verso il fornitore. | ||
| Perché è importante La registrazione è una tappa fondamentale che separa l'inserimento dati e l'approvazione dalla fase di liquidazione finanziaria. Il tempo dalla creazione della fattura alla registrazione è una misura chiave dell'efficienza di elaborazione interna. Dove trovare Questo evento è identificato dalla Data di Registrazione (BKPF-BUDAT) sull'header del documento. Per i documenti che sono stati prima "parcheggiati", la transizione a uno stato registrato fornisce il timestamp dell'evento. Acquisisci Utilizzare la data di registrazione (BKPF-BUDAT) come timestamp dell'evento. Tipo di evento explicit | |||
| Fattura Stornata | Un'attività che rappresenta lo storno di un documento di fattura precedentemente registrato. Questo è un evento terminale per una fattura errata, che viene quindi spesso reinserita correttamente. | ||
| Perché è importante Gli storni indicano errori critici che non sono stati rilevati prima nel processo. Monitorare la loro frequenza e le cause radice è essenziale per il miglioramento del processo e per ridurre le imprecisioni finanziarie. Dove trovare Uno storno è identificato quando viene creato un documento di storno. L'intestazione del documento originale (BKPF) conterrà il numero del documento di storno (BKPF-STBLG) e viceversa. La data di contabilizzazione del documento di storno è il tempo dell'evento. Acquisisci Identificare i documenti che hanno un valore nel campo BKPF-STBLG e utilizzare la data di contabilizzazione del documento di storno. Tipo di evento explicit | |||
| Pagamento Eseguito | Questa è l'attività finale nel processo standard, dove il pagamento viene effettuato e la fattura viene compensata. Ciò significa che i fondi sono stati erogati al fornitore. | ||
| Perché è importante Questo segna la fine del ciclo di vita della fattura P2P. È essenziale per il calcolo del tempo di ciclo end-to-end totale e per misurare le prestazioni di pagamento puntuale rispetto alla data di scadenza. Dove trovare Questo evento viene catturato dalle informazioni del documento di compensazione sulla voce contabile fornitore. La Data di Compensazione (BSEG-AUGDT) e il Documento di Compensazione (BSEG-AUGBL) indicano che il pagamento è stato effettuato. Acquisisci Utilizzare la data di compensazione (BSEG-AUGDT) dalla voce contabile fornitore compensata. Tipo di evento explicit | |||
| Blocco Pagamento Impostato | Un'attività in cui un blocco viene intenzionalmente posto su una fattura per impedirne il pagamento. Questo è spesso dovuto a discrepanze nel prezzo o nella quantità, o a una nota di credito in sospeso. | ||
| Perché è importante I blocchi di pagamento sono una causa primaria di ritardi nei pagamenti e controversie con i fornitori. Analizzare la frequenza, la durata e le ragioni dei blocchi è fondamentale per migliorare i tassi di pagamento puntuale. Dove trovare Questo evento viene catturato monitorando le modifiche al campo Chiave Blocco Pagamento (BSEG-ZLSPR) nella voce di fattura. I log delle modifiche in CDHDR e CDPOS forniscono il timestamp e l'utente per il momento in cui il blocco è stato impostato. Acquisisci Identificare quando il campo BSEG-ZLSPR viene popolato tramite documenti di modifica (CDHDR/CDPOS). Tipo di evento explicit | |||
| Blocco Pagamento Rimosso | Rappresenta la risoluzione di un problema, in cui un blocco di pagamento precedentemente impostato viene rimosso. Ciò rende la fattura nuovamente idonea al pagamento. | ||
| Perché è importante Il tempo tra l'impostazione e la rimozione di un blocco rappresenta il tempo di risoluzione per un'eccezione di processo. Accorciare questa durata è fondamentale per migliorare l'efficienza e le relazioni con i fornitori. Dove trovare Questo evento viene catturato quando il campo Chiave Blocco Pagamento (BSEG-ZLSPR) viene azzerato. Questa modifica viene registrata nelle tabelle CDHDR e CDPOS, fornendo un timestamp per la rimozione. Acquisisci Identificare quando il campo BSEG-ZLSPR viene cancellato tramite documenti di modifica (CDHDR/CDPOS). Tipo di evento explicit | |||
| Dati Fattura Aggiornati | Questa attività riflette una modifica apportata al documento fattura dopo la sua creazione iniziale. Ciò è comune durante i cicli di rilavorazione successivi a un rifiuto o per correggere errori. | ||
| Perché è importante Aggiornamenti frequenti segnalano rilavorazioni e potenziali problemi di qualità dei dati al punto di immissione. Tracciare questi cambiamenti aiuta a quantificare lo sforzo dedicato alle correzioni e a identificare errori comuni. Dove trovare Le modifiche ai campi chiave sono registrate nelle tabelle dei documenti di modifica di SAP, CDHDR (intestazione) e CDPOS (elemento). Gli eventi possono essere generati filtrando per le modifiche all'oggetto fattura pertinente. Acquisisci Estrarre gli eventi di modifica dalle tabelle CDHDR e CDPOS per l'oggetto fattura. Tipo di evento explicit | |||
| Fattura Inviata per Approvazione | Questa attività segna l'avvio di un workflow di approvazione formale per la fattura. Questo viene spesso dedotto quando lo stato della fattura cambia in 'in attesa di approvazione' o viene generato un elemento di workflow. | ||
| Perché è importante Questo è il punto di partenza per misurare il tempo di ciclo di approvazione. Comprendere quando iniziano le approvazioni è essenziale per identificare i colli di bottiglia nel workflow di approvazione stesso. Dove trovare Questo è tipicamente dedotto dall'inizio di un SAP Business Workflow (tabella SWW_WI2OBJ) collegato all'oggetto fattura (ad es. BUS2081) o da una modifica in un campo di stato personalizzato sull'header del documento. Acquisisci Inferire dalla creazione di un elemento di workflow correlato al documento di fattura. Tipo di evento inferred | |||
| Fattura Parcheggiata | Rappresenta una fattura che è stata inserita nel sistema ma non è ancora stata registrata nel libro mastro. Il "parking" viene utilizzato per salvare fatture incomplete o per una revisione successiva prima della registrazione. | ||
| Perché è importante Il "parking" (parcheggio) indica una pausa deliberata nel processo. Il monitoraggio della durata e della frequenza delle fatture "parcheggiate" aiuta a identificare le ragioni dei ritardi prima dell'inizio del ciclo formale di registrazione e approvazione. Dove trovare Questo può essere identificato da documenti creati tramite transazioni di "parking" (ad es. MIR7, FV60) o controllando specifici campi di stato nella tabella BKPF o tabelle dedicate ai documenti "parcheggiati" come VBKPF. Acquisisci Identificare i documenti creati tramite transazioni di 'parking' o verificare lo stato di un documento 'parcheggiato'. Tipo di evento explicit | |||
| Fattura Rifiutata | Rappresenta il rifiuto di una fattura durante il processo di approvazione. Questo evento innesca una rilavorazione, richiedendo correzione e nuova presentazione. | ||
| Perché è importante I rifiuti delle fatture sono un indicatore chiave di inefficienza dei processi e problemi di qualità dei dati. L'analisi della frequenza e dei motivi dei rifiuti aiuta a identificare opportunità di miglioramento e formazione. Dove trovare Questo viene dedotto da specifici aggiornamenti di stato in un workflow SAP, come uno stato 'rifiutato', o da eventi che annullano il workflow di approvazione corrente, rimandandolo al responsabile dell'elaborazione. Acquisisci Inferire da modifiche allo stato del workflow che indicano il rifiuto. Tipo di evento inferred | |||
| Pagamento in Ritardo Eseguito | Questo è un evento calcolato che si verifica quando il pagamento di una fattura viene eseguito dopo la sua data di scadenza calcolata. Viene derivato confrontando due campi data. | ||
| Perché è importante Questa attività supporta direttamente i KPI di pagamento puntuale e aiuta a identificare fornitori o unità di business con frequenti ritardi nei pagamenti, il che può danneggiare le relazioni con i fornitori e portare a penali. Dove trovare Questo viene calcolato confrontando la Data di Compensazione (BSEG-AUGDT) con la Data di Scadenza Netta. La data di scadenza è a sua volta calcolata dalla Data Base (BSEG-ZFBDT) e dai termini di pagamento (BSEG-ZTERM). Acquisisci Derivare confrontando BSEG-AUGDT > (BSEG-ZFBDT + giorni di termine di pagamento). Tipo di evento calculated | |||
| Proposta di Pagamento Creata | La fattura viene selezionata e inclusa in una proposta di pagamento nell'ambito di un'esecuzione di pagamento. Questo è il primo passo nel processo di pagamento automatizzato. | ||
| Perché è importante Questa attività indica l'intenzione di pagare. Ritardi tra questo passaggio e l'esecuzione finale del pagamento possono rivelare problemi con il processo di esecuzione del pagamento, le approvazioni o la comunicazione bancaria. Dove trovare Questo si trova nelle tabelle di esecuzione del pagamento, in particolare REGUP, che contiene le voci incluse in una proposta di pagamento. La data di esecuzione nella tabella REGUH corrispondente fornisce il timestamp. Acquisisci Identificare quando una fattura appare nella tabella REGUP da un'esecuzione di proposta di pagamento. Tipo di evento explicit | |||
Guide all'Estrazione
Fasi
- Prerequisites and Authorization: Assicurarsi che l'utente che esegue l'estrazione disponga delle autorizzazioni necessarie in SAP S/4HANA per accedere alle viste Core Data Services (CDS) richieste. Le viste chiave includono
I_InvoiceDocument,I_OperationalAcctgDocItem,I_ChangeDocument,I_ChangeDocumentItemeI_PaymentProposalItem. L'utente avrà anche bisogno dei permessi per eseguire query tramite l'interfaccia scelta, come un servizio OData o una connessione SQL diretta. - Identify Your Connection Method: Determinare come ci si connetterà al sistema SAP S/4HANA per eseguire la query SQL. I metodi comuni includono l'uso di SAP Data Services, SAP Data Intelligence, uno strumento ETL di terze parti con un connettore SAP, o una connessione SQL diretta al database SAP HANA se consentito dalle policy di sicurezza dell'organizzazione.
- Define Extraction Parameters: Prima di eseguire la query, definire i parametri chiave. Specificare l'intervallo di date per l'estrazione, ad esempio,
CreationDatetra'YYYY-MM-DD'e'YYYY-MM-DD'. Inoltre, identificare i valori specifici diCompanyCodeche si desidera includere per limitare l'ambito dell'estrazione dei dati. - Customize the SQL Query: Copiare la query SQL fornita nel client SQL o nello strumento di estrazione dati scelto. Esaminare attentamente i placeholder, come
'{StartDate}','{EndDate}'e('{CompanyCode1}', '{CompanyCode2}'). Sostituire questi placeholder con i valori effettivi definiti nel passaggio precedente. Potrebbe anche essere necessario regolare i nomi dei campi per lo stato del workflow in base alla propria specifica configurazione SAP. - Execute the Query: Eseguire la query SQL completa sul database SAP S/4HANA o tramite lo strato di servizio appropriato. La query è progettata per essere esaustiva e potrebbe richiedere un tempo significativo per l'esecuzione a seconda del volume dei dati e dell'intervallo di date selezionato. Monitorare l'esecuzione per eventuali errori o timeout.
- Review Initial Results: Una volta completata la query, eseguire una rapida revisione dell'output. Verificare che le colonne
InvoiceNumber,ActivityNameeEventTimesiano popolate. Verificare che si vedano una varietà di attività diverse nella colonnaActivityName, non solo 'Invoice Document Created'. - Address Data Transformation: La query è strutturata per produrre un formato di log degli eventi pulito. Tuttavia, assicurarsi che la colonna
EventTimesia in un formato timestamp consistente, comeYYYY-MM-DDTHH:MM:SS. La query fornita combina i campi di data e ora in un unico timestamp dove necessario. - Export the Data: Esportare il set di risultati finale dal proprio strumento in un file CSV (Comma-Separated Values). Questo formato è universalmente compatibile con gli strumenti di Process Mining, incluso ProcessMind.
- Prepare for Upload: Prima del caricamento, confermare che il file CSV utilizzi la codifica UTF-8 per prevenire problemi di caratteri. Assicurarsi che le intestazioni delle colonne nel file corrispondano esattamente agli attributi richiesti:
InvoiceNumber,ActivityName,EventTime,UserName,CompanyCode, ecc. - Upload to ProcessMind: Caricare il file CSV preparato nel proprio progetto di Process Mining. Mappare le colonne dal file ai corrispondenti campi di case ID, activity name e timestamp nella configurazione del modello di dati dello strumento.
Configurazione
- CDS Views Used: Le principali fonti di dati sono le standard SAP CDS views. Le viste chiave sono
I_InvoiceDocumentper i dati di intestazione,I_OperationalAcctgDocItemper i dettagli di contabilizzazione e compensazione finanziaria, eI_ChangeDocumentconI_ChangeDocumentItemper tracciare le modifiche storiche agli attributi delle fatture come i blocchi di pagamento e lo stato del workflow. - Date Range Filtering: È fondamentale filtrare i dati per un intervallo di date specifico per gestire le prestazioni. La query fornita utilizza un placeholder per la
CreationDatenella vistaI_InvoiceDocument. Un punto di partenza raccomandato è un periodo di dati da 3 a 6 mesi. - Company Code Filter: Per assicurare che l'estrazione sia pertinente e gestibile, filtrare sempre per uno o più
CompanyCode. La query include un placeholderWHERE inv.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')a questo scopo. - Document Type Filter: È possibile affinare ulteriormente l'estrazione filtrando per
InvoiceDocumentType. Ad esempio, si potrebbero voler includere le fatture fornitore standard (RE) ma escludere le note di credito. Questo può essere aggiunto alla clausolaWHEREdella CTE iniziale. - Prerequisites: L'utente che esegue la query necessita delle autorizzazioni di visualizzazione appropriate per i documenti finanziari e di acquisto all'interno dei codici azienda specificati. L'accesso al database HANA sottostante tramite un client SQL non è standard e richiede permessi speciali.
- Performance Considerations: L'estrazione dei dati dalle tabelle dei documenti di modifica (
I_ChangeDocument,I_ChangeDocumentItem) può essere intensiva in termini di prestazioni. L'applicazione di filtri rigorosi su data, codice azienda e classe oggetto (INCOMINGINVOICE) è essenziale per prevenire tempi di esecuzione lunghi.
a Query di Esempio sql
WITH InvoiceBase AS (
SELECT
inv.InvoiceDocument,
inv.FiscalYear,
inv.CompanyCode,
inv.Supplier AS VendorNumber,
inv.DocumentType,
inv.GrossInvoiceAmountInCoCoCrcy AS AmountInCompanyCodeCurrency,
inv.NetDueDate AS PaymentDueDate,
inv.PurchasingDocument,
inv.CreationDateTime,
inv.CreatedByUser,
accdoc.AccountingDocument,
accdoc.ClearingDate,
accdoc.ClearingJournalEntry,
accdoc.PaymentBlockReason,
accdoc.IsReversed
FROM I_InvoiceDocument AS inv
LEFT JOIN I_OperationalAcctgDocItem AS accdoc
ON inv.AccountingDocument = accdoc.AccountingDocument
AND inv.FiscalYear = accdoc.FiscalYear
AND inv.CompanyCode = accdoc.CompanyCode
WHERE
inv.CreationDate BETWEEN '{StartDate}' AND '{EndDate}'
AND inv.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')
)
-- 1. Invoice Document Created
SELECT
InvoiceDocument AS "InvoiceNumber",
'Invoice Document Created' AS "ActivityName",
CreationDateTime AS "EventTime",
CreatedByUser AS "UserName",
CompanyCode AS "CompanyCode",
VendorNumber AS "VendorNumber",
AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
PaymentDueDate AS "PaymentDueDate",
DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase
UNION ALL
-- 2. Invoice Parked
SELECT
i.InvoiceDocument AS "InvoiceNumber",
'Invoice Parked' AS "ActivityName",
i.CreationDateTime AS "EventTime",
i.CreatedByUser AS "UserName",
i.CompanyCode AS "CompanyCode",
i.Supplier AS "VendorNumber",
i.GrossInvoiceAmountInCoCoCrcy AS "AmountInCompanyCodeCurrency",
i.NetDueDate AS "PaymentDueDate",
i.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
i.PurchasingDocument AS "PurchasingDocument"
FROM I_InvoiceDocument AS i
WHERE
i.InvoiceDocumentIsParked = 'X'
AND i.CreationDate BETWEEN '{StartDate}' AND '{EndDate}'
AND i.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')
UNION ALL
-- 3, 4, 5. Workflow activities (Sent for Approval, Approved, Rejected) from Change Docs
SELECT
cdpos.ObjectValue AS "InvoiceNumber",
CASE
WHEN cdpos.ValueNew = '[StatusSentForApproval]' THEN 'Invoice Sent For Approval'
WHEN cdpos.ValueNew = '[StatusApproved]' THEN 'Invoice Approved'
WHEN cdpos.ValueNew = '[StatusRejected]' THEN 'Invoice Rejected'
END AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.InvoiceDocument
WHERE
cdhdr.ObjectClassName = 'INCOMINGINVOICE'
AND cdpos.FieldName = '[WorkflowStatusFieldName]'
AND cdpos.ValueNew IN ('[StatusSentForApproval]', '[StatusApproved]', '[StatusRejected]')
UNION ALL
-- 6. Invoice Data Updated
SELECT
cdpos.ObjectValue AS "InvoiceNumber",
'Invoice Data Updated' AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.InvoiceDocument
WHERE
cdhdr.ObjectClassName = 'INCOMINGINVOICE'
AND cdpos.FieldName IN ('GrossInvoiceAmount', 'DocumentDate', 'PaymentTerms')
AND cdhdr.ChangeDate BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
-- 7 & 8. Payment Block Set/Removed
SELECT
inv.InvoiceDocument AS "InvoiceNumber",
CASE
WHEN cdpos.ValueNew <> '' AND cdpos.ValueOld = '' THEN 'Payment Block Set'
WHEN cdpos.ValueNew = '' AND cdpos.ValueOld <> '' THEN 'Payment Block Removed'
END AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
cdpos.ValueNew AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.AccountingDocument
WHERE
cdhdr.ObjectClassName = 'BELEG'
AND cdpos.TableName = 'BSEG'
AND cdpos.FieldName = 'ZLSPR'
AND ( (cdpos.ValueNew <> '' AND cdpos.ValueOld = '') OR (cdpos.ValueNew = '' AND cdpos.ValueOld <> '') )
UNION ALL
-- 9. Invoice Posted
SELECT
inv.InvoiceDocument AS "InvoiceNumber",
'Invoice Posted' AS "ActivityName",
CAST(accdoc.PostingDate AS TIMESTAMP) AS "EventTime",
accdoc.CreatedByUser AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
accdoc.PaymentBlockReason AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase AS inv
JOIN I_OperationalAcctgDocItem AS accdoc ON inv.AccountingDocument = accdoc.AccountingDocument
WHERE inv.AccountingDocument IS NOT NULL AND inv.IsReversed = FALSE
UNION ALL
-- 10. Payment Proposal Created
SELECT
item.InvoiceReference AS "InvoiceNumber",
'Payment Proposal Created' AS "ActivityName",
CAST(prun.PaymentRunDate AS TIMESTAMP) AS "EventTime",
prun.CreatedByUser AS "UserName",
item.CompanyCode AS "CompanyCode",
item.Supplier AS "VendorNumber",
item.AmountInTransactionCurrency AS "AmountInCompanyCodeCurrency",
item.NetDueDate AS "PaymentDueDate",
item.AccountingDocumentType AS "DocumentType",
item.PaymentBlockReason AS "PaymentBlockReason",
item.PurchasingDocument AS "PurchasingDocument"
FROM I_PaymentProposalItem as item
JOIN I_PaymentRun as prun ON item.PaymentRunName = prun.PaymentRunName
JOIN InvoiceBase AS inv ON item.InvoiceReference = inv.InvoiceDocument
UNION ALL
-- 11 & 12. Payment Executed / Late Payment Executed
SELECT
InvoiceDocument AS "InvoiceNumber",
CASE
WHEN ClearingDate > PaymentDueDate THEN 'Late Payment Executed'
ELSE 'Payment Executed'
END AS "ActivityName",
CAST(ClearingDate AS TIMESTAMP) AS "EventTime",
CAST(NULL AS VARCHAR(12)) AS "UserName", -- User for clearing is not always straightforward
CompanyCode AS "CompanyCode",
VendorNumber AS "VendorNumber",
AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
PaymentDueDate AS "PaymentDueDate",
DocumentType AS "DocumentType",
'' AS "PaymentBlockReason",
PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase
WHERE ClearingDate IS NOT NULL AND IsReversed = FALSE
UNION ALL
-- 13. Invoice Reversed
SELECT
rev.OriginalInvoiceDocument AS "InvoiceNumber",
'Invoice Reversed' AS "ActivityName",
rev.CreationDateTime AS "EventTime",
rev.CreatedByUser AS "UserName",
rev.CompanyCode AS "CompanyCode",
rev.Supplier AS "VendorNumber",
rev.GrossInvoiceAmountInCoCoCrcy AS "AmountInCompanyCodeCurrency",
CAST(NULL AS DATE) AS "PaymentDueDate",
rev.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
rev.PurchasingDocument AS "PurchasingDocument"
FROM I_InvoiceDocument AS rev
WHERE rev.OriginalInvoiceDocument IN (SELECT InvoiceDocument FROM InvoiceBase) AND rev.IsReversal = 'X' Fasi
- Prerequisites and Authorization: Assicurarsi che l'utente che esegue l'estrazione disponga delle autorizzazioni necessarie in SAP S/4HANA per accedere alle viste Core Data Services (CDS) richieste. Le viste chiave includono
I_InvoiceDocument,I_OperationalAcctgDocItem,I_ChangeDocument,I_ChangeDocumentItemeI_PaymentProposalItem. L'utente avrà anche bisogno dei permessi per eseguire query tramite l'interfaccia scelta, come un servizio OData o una connessione SQL diretta. - Identify Your Connection Method: Determinare come ci si connetterà al sistema SAP S/4HANA per eseguire la query SQL. I metodi comuni includono l'uso di SAP Data Services, SAP Data Intelligence, uno strumento ETL di terze parti con un connettore SAP, o una connessione SQL diretta al database SAP HANA se consentito dalle policy di sicurezza dell'organizzazione.
- Define Extraction Parameters: Prima di eseguire la query, definire i parametri chiave. Specificare l'intervallo di date per l'estrazione, ad esempio,
CreationDatetra'YYYY-MM-DD'e'YYYY-MM-DD'. Inoltre, identificare i valori specifici diCompanyCodeche si desidera includere per limitare l'ambito dell'estrazione dei dati. - Customize the SQL Query: Copiare la query SQL fornita nel client SQL o nello strumento di estrazione dati scelto. Esaminare attentamente i placeholder, come
'{StartDate}','{EndDate}'e('{CompanyCode1}', '{CompanyCode2}'). Sostituire questi placeholder con i valori effettivi definiti nel passaggio precedente. Potrebbe anche essere necessario regolare i nomi dei campi per lo stato del workflow in base alla propria specifica configurazione SAP. - Execute the Query: Eseguire la query SQL completa sul database SAP S/4HANA o tramite lo strato di servizio appropriato. La query è progettata per essere esaustiva e potrebbe richiedere un tempo significativo per l'esecuzione a seconda del volume dei dati e dell'intervallo di date selezionato. Monitorare l'esecuzione per eventuali errori o timeout.
- Review Initial Results: Una volta completata la query, eseguire una rapida revisione dell'output. Verificare che le colonne
InvoiceNumber,ActivityNameeEventTimesiano popolate. Verificare che si vedano una varietà di attività diverse nella colonnaActivityName, non solo 'Invoice Document Created'. - Address Data Transformation: La query è strutturata per produrre un formato di log degli eventi pulito. Tuttavia, assicurarsi che la colonna
EventTimesia in un formato timestamp consistente, comeYYYY-MM-DDTHH:MM:SS. La query fornita combina i campi di data e ora in un unico timestamp dove necessario. - Export the Data: Esportare il set di risultati finale dal proprio strumento in un file CSV (Comma-Separated Values). Questo formato è universalmente compatibile con gli strumenti di Process Mining, incluso ProcessMind.
- Prepare for Upload: Prima del caricamento, confermare che il file CSV utilizzi la codifica UTF-8 per prevenire problemi di caratteri. Assicurarsi che le intestazioni delle colonne nel file corrispondano esattamente agli attributi richiesti:
InvoiceNumber,ActivityName,EventTime,UserName,CompanyCode, ecc. - Upload to ProcessMind: Caricare il file CSV preparato nel proprio progetto di Process Mining. Mappare le colonne dal file ai corrispondenti campi di case ID, activity name e timestamp nella configurazione del modello di dati dello strumento.
Configurazione
- CDS Views Used: Le principali fonti di dati sono le standard SAP CDS views. Le viste chiave sono
I_InvoiceDocumentper i dati di intestazione,I_OperationalAcctgDocItemper i dettagli di contabilizzazione e compensazione finanziaria, eI_ChangeDocumentconI_ChangeDocumentItemper tracciare le modifiche storiche agli attributi delle fatture come i blocchi di pagamento e lo stato del workflow. - Date Range Filtering: È fondamentale filtrare i dati per un intervallo di date specifico per gestire le prestazioni. La query fornita utilizza un placeholder per la
CreationDatenella vistaI_InvoiceDocument. Un punto di partenza raccomandato è un periodo di dati da 3 a 6 mesi. - Company Code Filter: Per assicurare che l'estrazione sia pertinente e gestibile, filtrare sempre per uno o più
CompanyCode. La query include un placeholderWHERE inv.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')a questo scopo. - Document Type Filter: È possibile affinare ulteriormente l'estrazione filtrando per
InvoiceDocumentType. Ad esempio, si potrebbero voler includere le fatture fornitore standard (RE) ma escludere le note di credito. Questo può essere aggiunto alla clausolaWHEREdella CTE iniziale. - Prerequisites: L'utente che esegue la query necessita delle autorizzazioni di visualizzazione appropriate per i documenti finanziari e di acquisto all'interno dei codici azienda specificati. L'accesso al database HANA sottostante tramite un client SQL non è standard e richiede permessi speciali.
- Performance Considerations: L'estrazione dei dati dalle tabelle dei documenti di modifica (
I_ChangeDocument,I_ChangeDocumentItem) può essere intensiva in termini di prestazioni. L'applicazione di filtri rigorosi su data, codice azienda e classe oggetto (INCOMINGINVOICE) è essenziale per prevenire tempi di esecuzione lunghi.
a Query di Esempio sql
WITH InvoiceBase AS (
SELECT
inv.InvoiceDocument,
inv.FiscalYear,
inv.CompanyCode,
inv.Supplier AS VendorNumber,
inv.DocumentType,
inv.GrossInvoiceAmountInCoCoCrcy AS AmountInCompanyCodeCurrency,
inv.NetDueDate AS PaymentDueDate,
inv.PurchasingDocument,
inv.CreationDateTime,
inv.CreatedByUser,
accdoc.AccountingDocument,
accdoc.ClearingDate,
accdoc.ClearingJournalEntry,
accdoc.PaymentBlockReason,
accdoc.IsReversed
FROM I_InvoiceDocument AS inv
LEFT JOIN I_OperationalAcctgDocItem AS accdoc
ON inv.AccountingDocument = accdoc.AccountingDocument
AND inv.FiscalYear = accdoc.FiscalYear
AND inv.CompanyCode = accdoc.CompanyCode
WHERE
inv.CreationDate BETWEEN '{StartDate}' AND '{EndDate}'
AND inv.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')
)
-- 1. Invoice Document Created
SELECT
InvoiceDocument AS "InvoiceNumber",
'Invoice Document Created' AS "ActivityName",
CreationDateTime AS "EventTime",
CreatedByUser AS "UserName",
CompanyCode AS "CompanyCode",
VendorNumber AS "VendorNumber",
AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
PaymentDueDate AS "PaymentDueDate",
DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase
UNION ALL
-- 2. Invoice Parked
SELECT
i.InvoiceDocument AS "InvoiceNumber",
'Invoice Parked' AS "ActivityName",
i.CreationDateTime AS "EventTime",
i.CreatedByUser AS "UserName",
i.CompanyCode AS "CompanyCode",
i.Supplier AS "VendorNumber",
i.GrossInvoiceAmountInCoCoCrcy AS "AmountInCompanyCodeCurrency",
i.NetDueDate AS "PaymentDueDate",
i.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
i.PurchasingDocument AS "PurchasingDocument"
FROM I_InvoiceDocument AS i
WHERE
i.InvoiceDocumentIsParked = 'X'
AND i.CreationDate BETWEEN '{StartDate}' AND '{EndDate}'
AND i.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')
UNION ALL
-- 3, 4, 5. Workflow activities (Sent for Approval, Approved, Rejected) from Change Docs
SELECT
cdpos.ObjectValue AS "InvoiceNumber",
CASE
WHEN cdpos.ValueNew = '[StatusSentForApproval]' THEN 'Invoice Sent For Approval'
WHEN cdpos.ValueNew = '[StatusApproved]' THEN 'Invoice Approved'
WHEN cdpos.ValueNew = '[StatusRejected]' THEN 'Invoice Rejected'
END AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.InvoiceDocument
WHERE
cdhdr.ObjectClassName = 'INCOMINGINVOICE'
AND cdpos.FieldName = '[WorkflowStatusFieldName]'
AND cdpos.ValueNew IN ('[StatusSentForApproval]', '[StatusApproved]', '[StatusRejected]')
UNION ALL
-- 6. Invoice Data Updated
SELECT
cdpos.ObjectValue AS "InvoiceNumber",
'Invoice Data Updated' AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.InvoiceDocument
WHERE
cdhdr.ObjectClassName = 'INCOMINGINVOICE'
AND cdpos.FieldName IN ('GrossInvoiceAmount', 'DocumentDate', 'PaymentTerms')
AND cdhdr.ChangeDate BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
-- 7 & 8. Payment Block Set/Removed
SELECT
inv.InvoiceDocument AS "InvoiceNumber",
CASE
WHEN cdpos.ValueNew <> '' AND cdpos.ValueOld = '' THEN 'Payment Block Set'
WHEN cdpos.ValueNew = '' AND cdpos.ValueOld <> '' THEN 'Payment Block Removed'
END AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
cdpos.ValueNew AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.AccountingDocument
WHERE
cdhdr.ObjectClassName = 'BELEG'
AND cdpos.TableName = 'BSEG'
AND cdpos.FieldName = 'ZLSPR'
AND ( (cdpos.ValueNew <> '' AND cdpos.ValueOld = '') OR (cdpos.ValueNew = '' AND cdpos.ValueOld <> '') )
UNION ALL
-- 9. Invoice Posted
SELECT
inv.InvoiceDocument AS "InvoiceNumber",
'Invoice Posted' AS "ActivityName",
CAST(accdoc.PostingDate AS TIMESTAMP) AS "EventTime",
accdoc.CreatedByUser AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
accdoc.PaymentBlockReason AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase AS inv
JOIN I_OperationalAcctgDocItem AS accdoc ON inv.AccountingDocument = accdoc.AccountingDocument
WHERE inv.AccountingDocument IS NOT NULL AND inv.IsReversed = FALSE
UNION ALL
-- 10. Payment Proposal Created
SELECT
item.InvoiceReference AS "InvoiceNumber",
'Payment Proposal Created' AS "ActivityName",
CAST(prun.PaymentRunDate AS TIMESTAMP) AS "EventTime",
prun.CreatedByUser AS "UserName",
item.CompanyCode AS "CompanyCode",
item.Supplier AS "VendorNumber",
item.AmountInTransactionCurrency AS "AmountInCompanyCodeCurrency",
item.NetDueDate AS "PaymentDueDate",
item.AccountingDocumentType AS "DocumentType",
item.PaymentBlockReason AS "PaymentBlockReason",
item.PurchasingDocument AS "PurchasingDocument"
FROM I_PaymentProposalItem as item
JOIN I_PaymentRun as prun ON item.PaymentRunName = prun.PaymentRunName
JOIN InvoiceBase AS inv ON item.InvoiceReference = inv.InvoiceDocument
UNION ALL
-- 11 & 12. Payment Executed / Late Payment Executed
SELECT
InvoiceDocument AS "InvoiceNumber",
CASE
WHEN ClearingDate > PaymentDueDate THEN 'Late Payment Executed'
ELSE 'Payment Executed'
END AS "ActivityName",
CAST(ClearingDate AS TIMESTAMP) AS "EventTime",
CAST(NULL AS VARCHAR(12)) AS "UserName", -- User for clearing is not always straightforward
CompanyCode AS "CompanyCode",
VendorNumber AS "VendorNumber",
AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
PaymentDueDate AS "PaymentDueDate",
DocumentType AS "DocumentType",
'' AS "PaymentBlockReason",
PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase
WHERE ClearingDate IS NOT NULL AND IsReversed = FALSE
UNION ALL
-- 13. Invoice Reversed
SELECT
rev.OriginalInvoiceDocument AS "InvoiceNumber",
'Invoice Reversed' AS "ActivityName",
rev.CreationDateTime AS "EventTime",
rev.CreatedByUser AS "UserName",
rev.CompanyCode AS "CompanyCode",
rev.Supplier AS "VendorNumber",
rev.GrossInvoiceAmountInCoCoCrcy AS "AmountInCompanyCodeCurrency",
CAST(NULL AS DATE) AS "PaymentDueDate",
rev.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
rev.PurchasingDocument AS "PurchasingDocument"
FROM I_InvoiceDocument AS rev
WHERE rev.OriginalInvoiceDocument IN (SELECT InvoiceDocument FROM InvoiceBase) AND rev.IsReversal = 'X' Fasi
- Access the ABAP Editor: Accedere al sistema SAP S/4HANA. Aprire la transazione
SE38(ABAP Editor). - Create the Program: Inserire un nome per il nuovo programma nel campo Program, ad esempio
Z_PM_INVOICE_EXTRACT, e fare clic sul pulsante 'Create'. Fornire un titolo, impostare il tipo su 'Executable Program' e salvarlo in un pacchetto appropriato. - Define Program Structure and Selection Screen: Nell'editor, definire le strutture dei dati per l'output finale del log degli eventi. Quindi, creare una schermata di selezione per consentire agli utenti di inserire parametri come un intervallo di date per la data di inserimento della fattura, i codici aziendali e i tipi di documento. Questo rende il programma riutilizzabile e flessibile.
- Implement Data Selection Logic: Scrivere le istruzioni SQL ABAP principali per selezionare i dati dalle varie tabelle SAP. Il programma interrogherà sequenzialmente ciascuna delle 13 attività richieste.
- Extract Header and Item Data: Per eventi fondamentali come 'Invoice Document Created' e 'Invoice Posted', selezionare i dati da tabelle primarie come
RBKP(Logistics Invoice Header) eBKPF(Accounting Document Header). - Extract Change Document Data: Per attività come 'Payment Block Set' e 'Payment Block Removed', interrogare le tabelle dei documenti di modifica
CDHDR(Change document header) eCDPOS(Change document items). Sarà necessario identificare le modifiche a campi specifici, ad esempioZLSPRnella tabellaBSEG. - Extract Payment Data: Per acquisire attività relative ai pagamenti, interrogare tabelle come
REGUP(Processed items from payment program) per le proposte di pagamento eBSAK(Cleared Vendor Items) per i pagamenti eseguiti. Differenziare 'Late Payment Executed' confrontando la data di compensazione (AUGDT) con la data di scadenza netta (ZFBDT). - Extract Workflow Data: Per le attività di approvazione, interrogare le tabelle SAP Business Workflow come
SWW_WI2OBJper collegare gli elementi del workflow agli oggetti fattura. Questa parte è fortemente dipendente dalla vostra specifica configurazione del workflow e potrebbe richiedere un significativo adattamento. - Unify Data into Event Log Format: Per ogni attività selezionata, formattare i dati in una struttura di tabella interna comune. Ogni riga di questa tabella rappresenta un singolo evento e deve contenere l'identificatore del caso (
InvoiceNumber),ActivityNameeEventTime, insieme ad altri attributi raccomandati. - Generate the Output File: Utilizzare le istruzioni ABAP
OPEN DATASET,TRANSFEReCLOSE DATASETper scrivere il contenuto della tabella interna finale in un file flat sul server applicativo SAP. Si raccomanda un formato CSV (valori separati da virgola). - Schedule and Execute: Eseguire il programma in primo piano per i test (usando
F8). Per le esecuzioni in produzione, schedularlo come job in background usando la transazioneSM36per eseguirlo durante le ore di minor traffico al fine di evitare di influenzare le prestazioni del sistema. - Retrieve and Upload: Utilizzare la transazione
AL11per navigare nella directory del server applicativo dove è stato salvato il file. Scaricare il file sul proprio sistema locale. Assicurarsi che il file sia codificato in UTF-8 e formattato correttamente prima di caricarlo nello strumento di Process Mining.
Configurazione
- Date Range: Definire un intervallo di date specifico per l'estrazione basato sulla data di inserimento della fattura (
RBKP-CPUDT) o sulla data di contabilizzazione (BKPF-BUDAT). Per l'analisi iniziale, si raccomanda un periodo di 3-6 mesi per garantire un volume di dati gestibile. - Company Code (BUKRS): È fondamentale filtrare per uno o più codici aziendali. L'estrazione di dati per tutti i codici aziendali in una grande organizzazione può portare a tempi di esecuzione estremamente lunghi e a file di grandi dimensioni.
- Document Type (BLART): Filtrare per tipi di documento rilevanti per isolare le fatture fornitore. I tipi comuni includono 'RE' (Fattura - Lorda) e 'KR' (Fattura Fornitore). Questo aiuta a escludere documenti irrilevanti dall'analisi.
- Vendor Account (LIFNR): Il programma può includere un filtro opzionale per numeri specifici di fornitori, utile per analisi mirate o test.
- Output File Configuration: Il programma dovrebbe avere parametri per definire il percorso del file di output sul server applicativo e il delimitatore di campo, ad esempio una virgola o un punto e virgola.
- Prerequisites: L'utente o l'account di sistema che esegue questo programma richiede l'accesso da sviluppatore per creare ed eseguire programmi ABAP (tramite
SE38) e ampie autorizzazioni di lettura per le tabelle FI, MM e Basis, incluseBKPF,BSEG,RBKP,RSEG,CDHDR,CDPOS, e le tabelle dei workflow.
a Query di Esempio abap
REPORT Z_PM_INVOICE_EXTRACT.
* --- Internal table structure for the final event log
TYPES: BEGIN OF ty_s_event_log,
invoicenumber TYPE char25,
activityname TYPE char50,
eventtime TYPE char19, "YYYY-MM-DD HH:MM:SS
username TYPE sy-uname,
companycode TYPE bukrs,
vendornumber TYPE lifnr,
amountincompanycodecurrency TYPE wrbtr,
paymentduedate TYPE char10, "YYYY-MM-DD
documenttype TYPE blart,
paymentblockreason TYPE char1,
purchasingdocument TYPE ebeln,
END OF ty_s_event_log.
DATA: lt_event_log TYPE STANDARD TABLE OF ty_s_event_log.
DATA: ls_event_log TYPE ty_s_event_log.
* --- Selection Screen for user inputs
PARAMETERS: p_path TYPE string DEFAULT '/usr/sap/tmp/invoice_events.csv'.
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY, " Entry Date
s_bukrs FOR bkpf-bukrs OBLIGATORY, " Company Code
s_blart FOR bkpf-blart. " Document Type
START-OF-SELECTION.
* --- 1. Invoice Document Created (from Logistics Invoice Verification)
SELECT CONCAT( rbkp~belnr, rbkp~gjahr ) AS invoicenumber,
'Invoice Document Created' AS activityname,
CONCAT( rbkp~cpudt, rbkp~cputm ) AS eventtime,
rbkp~usnam AS username,
rbkp~bukrs AS companycode,
rbkp~lifnr AS vendornumber,
rbkp~rmwwr AS amountincompanycodecurrency,
'' AS paymentduedate,
rbkp~blart AS documenttype,
rbkp~zuonr AS paymentblockreason,
'' AS purchasingdocument
FROM rbkp
INTO TABLE @DATA(lt_created)
WHERE rbkp~cpudt IN @s_erdat
AND rbkp~bukrs IN @s_bukrs
AND rbkp~blart IN @s_blart.
LOOP AT lt_created INTO DATA(ls_created).
ls_event_log-invoicenumber = ls_created-invoicenumber.
ls_event_log-activityname = ls_created-activityname.
ls_event_log-eventtime = |{ ls_created-eventtime(8) } { ls_created-eventtime+8(2) }:{ ls_created-eventtime+10(2) }:{ ls_created-eventtime+12(2) }|.
ls_event_log-username = ls_created-username.
ls_event_log-companycode = ls_created-companycode.
ls_event_log-vendornumber = ls_created-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_created-amountincompanycodecurrency.
ls_event_log-paymentduedate = ''.
ls_event_log-documenttype = ls_created-documenttype.
ls_event_log-paymentblockreason = ''.
ls_event_log-purchasingdocument = ls_created-purchasingdocument.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 2. Invoice Parked (assuming status 'A' or 'B' in RBKP)
SELECT CONCAT( belnr, gjahr ) AS invoicenumber,
'Invoice Parked' AS activityname,
CONCAT( cpudt, cputm ) AS eventtime,
usnam AS username,
bukrs AS companycode,
lifnr AS vendornumber,
rmwwr AS amountincompanycodecurrency,
'' AS paymentduedate,
blart AS documenttype,
'' AS paymentblockreason,
'' AS purchasingdocument
FROM rbkp
INTO TABLE @DATA(lt_parked)
WHERE rbstat IN ('A', 'B')
AND cpudt IN @s_erdat
AND bukrs IN @s_bukrs
AND blart IN @s_blart.
LOOP AT lt_parked INTO DATA(ls_parked).
ls_event_log-invoicenumber = ls_parked-invoicenumber.
ls_event_log-activityname = ls_parked-activityname.
ls_event_log-eventtime = |{ ls_parked-eventtime(8) } { ls_parked-eventtime+8(2) }:{ ls_parked-eventtime+10(2) }:{ ls_parked-eventtime+12(2) }|.
ls_event_log-username = ls_parked-username.
ls_event_log-companycode = ls_parked-companycode.
ls_event_log-vendornumber = ls_parked-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_parked-amountincompanycodecurrency.
ls_event_log-paymentduedate = ''.
ls_event_log-documenttype = ls_parked-documenttype.
ls_event_log-paymentblockreason = ''.
ls_event_log-purchasingdocument = ''.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 3, 4, 5. Sent For Approval, Approved, Rejected (Placeholder logic, needs adaptation)
* --- This logic is a generic template for SAP Business Workflow.
* --- Your implementation will vary. You must identify the correct workflow tasks.
SELECT obj.instid, wi.wi_cd, wi.wi_ct, wi.wi_stat, wi.wi_aagent
FROM sww_wi2obj AS obj
JOIN swwlog AS wi ON obj~instid = wi~wi_id
INTO TABLE @DATA(lt_workflow)
WHERE obj~typeid = 'BUS2081' " Business Object for Incoming Invoice
AND obj~catid = 'BO'
AND wi~wi_cd IN s_erdat.
LOOP AT lt_workflow INTO DATA(ls_workflow).
* --- This is a placeholder, adapt task IDs and logic
CASE ls_workflow-wi_stat.
WHEN 'STARTED'.
ls_event_log-activityname = 'Invoice Sent For Approval'.
WHEN 'COMPLETED'.
ls_event_log-activityname = 'Invoice Approved'.
WHEN 'CANCELLED'.
ls_event_log-activityname = 'Invoice Rejected'.
WHEN OTHERS.
CONTINUE.
ENDCASE.
* --- Code to get invoice details based on ls_workflow-instid needed here
* --- ... appending to lt_event_log ...
ENDLOOP.
* --- 6, 7, 8. Payment Block Set/Removed, Data Updated (from Change Docs)
SELECT h~objectid, h~username, h~udate, h~utime, p~fname, p~value_new, p~value_old
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectclas = p~objectclas AND h~objectid = p~objectid AND h~changenr = p~changenr
INTO TABLE @DATA(lt_changes)
WHERE h~objectclas = 'BELEGV'
AND h~udate IN s_erdat.
LOOP AT lt_changes INTO DATA(ls_change).
ls_event_log-invoicenumber = |{ ls_change-objectid+10(10) }{ ls_change-objectid(4) }|.
ls_event_log-username = ls_change-username.
ls_event_log-eventtime = |{ ls_change-udate } { ls_change-utime(2) }:{ ls_change-utime+2(2) }:{ ls_change-utime+4(2) }|.
IF ls_change-fname = 'ZLSPR'. " Payment Block
IF ls_change-value_old IS INITIAL AND ls_change-value_new IS NOT INITIAL.
ls_event_log-activityname = 'Payment Block Set'.
ls_event_log-paymentblockreason = ls_change-value_new.
ELSEIF ls_change-value_old IS NOT INITIAL AND ls_change-value_new IS INITIAL.
ls_event_log-activityname = 'Payment Block Removed'.
ls_event_log-paymentblockreason = ''.
ELSE.
CONTINUE.
ENDIF.
ELSE.
ls_event_log-activityname = 'Invoice Data Updated'.
ENDIF.
* --- Need to select other attributes based on invoice number
* --- ... appending to lt_event_log ...
ENDLOOP.
* --- 9. Invoice Posted
SELECT CONCAT( bkpf~belnr, bkpf~gjahr ) AS invoicenumber,
'Invoice Posted' AS activityname,
CONCAT( bkpf~cpudt, bkpf~cputm ) AS eventtime,
bkpf~usnam AS username,
bkpf~bukrs AS companycode,
bseg~lifnr AS vendornumber,
bseg~wrbtr AS amountincompanycodecurrency,
bseg~zfBDT AS paymentduedate,
bkpf~blart AS documenttype,
bseg~zlspr AS paymentblockreason,
bseg~ebeln AS purchasingdocument
FROM bkpf
JOIN bseg ON bkpf~bukrs = bseg~bukrs AND bkpf~belnr = bseg~belnr AND bkpf~gjahr = bseg~gjahr
INTO TABLE @DATA(lt_posted)
WHERE bkpf~cpudt IN @s_erdat
AND bkpf~bukrs IN @s_bukrs
AND bkpf~blart IN @s_blart
AND bseg~koart = 'K'. " Vendor line
LOOP AT lt_posted INTO DATA(ls_posted).
ls_event_log-invoicenumber = ls_posted-invoicenumber.
ls_event_log-activityname = ls_posted-activityname.
ls_event_log-eventtime = |{ ls_posted-eventtime(8) } { ls_posted-eventtime+8(2) }:{ ls_posted-eventtime+10(2) }:{ ls_posted-eventtime+12(2) }|.
ls_event_log-username = ls_posted-username.
ls_event_log-companycode = ls_posted-companycode.
ls_event_log-vendornumber = ls_posted-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_posted-amountincompanycodecurrency.
ls_event_log-paymentduedate = ls_posted-paymentduedate.
ls_event_log-documenttype = ls_posted-documenttype.
ls_event_log-paymentblockreason = ls_posted-paymentblockreason.
ls_event_log-purchasingdocument = ls_posted-purchasingdocument.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 10. Payment Proposal Created
SELECT CONCAT( regup~belnr, regup~gjahr ) AS invoicenumber,
'Payment Proposal Created' AS activityname,
CONCAT( reguh~erfdt, reguh~erfzt ) AS eventtime,
reguh~erfbu AS username,
regup~bukrs AS companycode,
regup~lifnr AS vendornumber,
regup~wrbtr AS amountincompanycodecurrency,
'' AS paymentduedate,
regup~blart AS documenttype,
'' AS paymentblockreason,
'' AS purchasingdocument
FROM regup
JOIN reguh ON regup~laufd = reguh~laufd AND regup~laufi = reguh~laufi
INTO TABLE @DATA(lt_proposal)
WHERE reguh~erfdt IN @s_erdat
AND regup~bukrs IN @s_bukrs.
LOOP AT lt_proposal INTO DATA(ls_proposal).
ls_event_log-invoicenumber = ls_proposal-invoicenumber.
ls_event_log-activityname = ls_proposal-activityname.
ls_event_log-eventtime = |{ ls_proposal-eventtime(8) } { ls_proposal-eventtime+8(2) }:{ ls_proposal-eventtime+10(2) }:{ ls_proposal-eventtime+12(2) }|.
ls_event_log-username = ls_proposal-username.
ls_event_log-companycode = ls_proposal-companycode.
ls_event_log-vendornumber = ls_proposal-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_proposal-amountincompanycodecurrency.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 11, 12. Payment Executed / Late Payment Executed
SELECT CONCAT( belnr, gjahr ) AS invoicenumber,
augdt,
zfBDT
FROM bsak
INTO TABLE @DATA(lt_cleared)
WHERE augdt IN @s_erdat
AND bukrs IN @s_bukrs.
LOOP AT lt_cleared INTO DATA(ls_cleared).
IF ls_cleared-augdt > ls_cleared-zfbdt.
ls_event_log-activityname = 'Late Payment Executed'.
ELSE.
ls_event_log-activityname = 'Payment Executed'.
ENDIF.
ls_event_log-invoicenumber = ls_cleared-invoicenumber.
ls_event_log-eventtime = |{ ls_cleared-augdt } 00:00:00|.
* --- Need to select other attributes based on invoice number
* --- ... appending to lt_event_log ...
ENDLOOP.
* --- 13. Invoice Reversed
SELECT CONCAT( stblg, stjah ) AS invoicenumber,
'Invoice Reversed' AS activityname,
CONCAT( cpudt, cputm ) AS eventtime,
usnam AS username,
bukrs AS companycode,
'' AS vendornumber,
'' AS amountincompanycodecurrency,
'' AS paymentduedate,
blart AS documenttype,
'' AS paymentblockreason,
'' AS purchasingdocument
FROM bkpf
INTO TABLE @DATA(lt_reversed)
WHERE stblg IS NOT NULL
AND cpudt IN @s_erdat
AND bukrs IN @s_bukrs.
LOOP AT lt_reversed INTO DATA(ls_reversed).
ls_event_log-invoicenumber = ls_reversed-invoicenumber.
ls_event_log-activityname = ls_reversed-activityname.
ls_event_log-eventtime = |{ ls_reversed-eventtime(8) } { ls_reversed-eventtime+8(2) }:{ ls_reversed-eventtime+10(2) }:{ ls_reversed-eventtime+12(2) }|.
ls_event_log-username = ls_reversed-username.
ls_event_log-companycode = ls_reversed-companycode.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- Write internal table to CSV file
OPEN DATASET p_path FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
ENDIF.
DATA: lv_line TYPE string.
FIELD-SYMBOLS: <fs_any> TYPE any.
* --- Header row
lv_line = 'InvoiceNumber,ActivityName,EventTime,UserName,CompanyCode,VendorNumber,AmountInCompanyCodeCurrency,PaymentDueDate,DocumentType,PaymentBlockReason,PurchasingDocument'.
TRANSFER lv_line TO p_path.
LOOP AT lt_event_log INTO ls_event_log.
CLEAR lv_line.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE ls_event_log TO <fs_any>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF sy-index = 1.
lv_line = <fs_any>.
ELSE.
CONCATENATE lv_line <fs_any> INTO lv_line SEPARATED BY ','.
ENDIF.
ENDDO.
TRANSFER lv_line TO p_path.
ENDLOOP.
CLOSE DATASET p_path.
WRITE: / 'Extraction complete. File saved to:', p_path.