Il Suo template dei dati per la gestione dei pagamenti ai fornitori
Il Suo template dei dati per la gestione dei pagamenti ai fornitori
- Attributi fondamentali per l’analisi di fornitori e pagamenti
- Tappe essenziali del processo di pagamento
- Logica di estrazione specifica per i sistemi SAP S/4HANA
Attributi della gestione dei pagamenti ai fornitori
| Nome | Descrizione | ||
|---|---|---|---|
| Attività Activity | Attività specifica o modifica dello stato dell’evento registrata per la fattura. | ||
| Descrizione Questo attributo rappresenta le singole fasi del processo che si verificano durante il ciclo di vita della fattura. Registra eventi quali la creazione, la contabilizzazione e il blocco della fattura, l’approvazione e la compensazione del pagamento. I nomi delle attività derivano dai codici transazione, dalle voci del registro delle modifiche o dagli aggiornamenti di stato del flusso di lavoro nel sistema di origine. Ai fini dell’analisi, questo campo è fondamentale per mappare le varianti del flusso del processo. Consente al motore di Process Mining di visualizzare la sequenza delle fasi, individuare i cicli di rilavorazione e determinare dove il processo si discosta dal percorso ottimale standard. È un elemento fondamentale dell’event log. Perché è importante Definisce i nodi della mappa del processo e consente di visualizzare il flusso di lavoro e i colli di bottiglia. Dove reperirli Ricavato dai codici transazione (TCODE) o dalla testata (CDHDR) e dalle posizioni (CDPOS) del documento di modifica Esempi Fattura registrataBlocco del pagamento applicatoEsecuzione del ciclo di pagamentoFattura compensata | |||
| Numero fattura InvoiceNumber | Identificativo univoco della fattura del fornitore in elaborazione. | ||
| Descrizione Il numero fattura è la chiave primaria per tracciare il ciclo di vita di una partita da pagare nel sistema SAP S/4HANA. Corrisponde in particolare al numero del documento contabile generato quando la fattura viene contabilizzata nel libro mastro. Nella terminologia SAP standard, è il numero documento (BELNR) associato a una specifica società e a un esercizio. Nell’analisi dei processi, questo attributo funge da ID del caso. Collega tutte le attività, dalla ricezione e dal parcheggio iniziali della fattura ai diversi blocchi di approvazione e alle modifiche, fino al pagamento e alla compensazione finale. Raggruppando gli eventi in base a questo identificativo, gli analisti possono ricostruire l’intera cronologia di ogni obbligazione di pagamento. Perché è importante Funge da ID definitivo del caso e consente di ricostruire il flusso del processo di pagamento dall’inizio alla fine. Dove reperirli Tabella SAP BKPF (testata del documento contabile), campo BELNR, oppure tabella ACDOCA, campo BELNR Esempi 1900000523510000289119000006015100003002 | |||
| Ora dell’evento EventTime | Data e ora esatte in cui si è verificata l’attività. | ||
| Descrizione L’ora dell’evento registra la data e l’ora precise in cui un’attività è stata registrata nel database SAP. Fornisce la dimensione temporale necessaria per ordinare gli eventi in sequenza all’interno di un caso. In genere, questo timestamp viene ricavato combinando i campi della data e dell’ora CPU presenti nei registri di sistema o nelle testate dei documenti. Nell’analisi, questo attributo è essenziale per calcolare i tempi di ciclo, la durata e la produttività. Consente di misurare gli intervalli tra le fasi, ad esempio il tempo che intercorre tra la ricezione della fattura e l’approvazione finale, un dato fondamentale per individuare i colli di bottiglia e valutare KPI come il tempo medio di approvazione delle fatture. Perché è importante Definisce l’ordine cronologico degli eventi ed è alla base di tutti i calcoli delle prestazioni basati sul tempo. Dove reperirli Tabella SAP BKPF, campi CPUDT (data di inserimento) e CPUTM (ora di inserimento), oppure campi UDATE e UTIME della tabella CDHDR Esempi 2023-10-12T08:30:00.000Z2023-10-12T14:15:22.000Z2023-10-15T09:00:00.000Z | |||
| Sistema di origine SourceSystem | Identificativo dell’istanza SAP S/4HANA da cui provengono i dati. | ||
| Descrizione Questo attributo identifica l’installazione ERP o il client specifico da cui sono stati estratti i dati del processo. Negli ambienti con più istanze SAP o sistemi legacy in esecuzione in parallelo, il campo garantisce la tracciabilità dei dati e consente confronti tra sistemi. Nell’analisi, questo campo funge da filtro di alto livello. Aiuta gli analisti a separare i dati per confrontare le prestazioni tra installazioni di sistema in diverse aree geografiche o per verificare la coerenza dei dati durante i progetti di migrazione. Consente di contestualizzare correttamente le variazioni del processo riconducibili alla configurazione del sistema. Perché è importante Distingue le origini dei dati negli ambienti con più sistemi e consente una segmentazione accurata. Dove reperirli ID di sistema (SY-SYSID) del contesto di installazione SAP Esempi SAP_PROD_01S4H_NA_100ERP_EU_200 | |||
| Ultimo aggiornamento dei dati LastDataUpdate | Timestamp che indica quando il record è stato estratto o aggiornato l’ultima volta. | ||
| Descrizione L’ultimo aggiornamento dei dati indica il momento in cui i dati sono stati caricati correttamente nella piattaforma di Process Mining. Non corrisponde all’ora dell’evento aziendale, ma indica quanto sono aggiornati i dati. È un’informazione fondamentale per mantenere affidabili le Dashboard di analisi. Nell’analisi, questo attributo aiuta a capire quanto siano aggiornate le informazioni visualizzate. È particolarmente importante per monitorare Dashboard quasi in tempo reale, come l’Analisi dei blocchi di pagamento, e garantire che le decisioni si basino sullo stato più recente del sistema SAP S/4HANA. Perché è importante Indica quanto sono aggiornati i dati, un’informazione fondamentale per le Dashboard operative. Dove reperirli Generato dal processo ETL o di estrazione Esempi 2023-10-27T23:59:59.000Z2023-11-01T06:00:00.000Z | |||
| Condizioni di pagamento PaymentTerms | Codice che rappresenta le condizioni concordate per i pagamenti e gli sconti. | ||
| Descrizione Le condizioni di pagamento definiscono la scadenza di una fattura e l’eventuale applicazione di sconti per il pagamento anticipato. Questo codice, ad esempio Z001, corrisponde a regole come «30 giorni netti» o «2% entro 10 giorni, 30 giorni netti». Viene copiato dai dati anagrafici del fornitore alla fattura, ma può essere modificato manualmente. Nell’analisi, questo attributo è centrale per le Dashboard Ottimizzazione degli sconti per pagamento anticipato e Conformità delle condizioni di pagamento dei fornitori. Consente al sistema di calcolare la data di scadenza di riferimento e di verificare se il pagamento è stato effettuato entro il periodo ottimale per usufruire dello sconto. Perché è importante Determina le tempistiche previste e gli incentivi finanziari, elementi fondamentali per l’analisi degli sconti. Dove reperirli Tabella SAP BSEG, campo ZTERM Esempi Z001NT300001 | |||
| Data di compensazione ClearingDate | Data in cui la fattura è stata compensata con il pagamento. | ||
| Descrizione La data di compensazione registra il momento in cui la partita aperta nel libro mastro della contabilità fornitori è stata chiusa, in genere tramite un ciclo di pagamento o una registrazione manuale del pagamento. Segna di fatto la fine della passività. Nell’analisi, questo attributo serve a calcolare il tempo di ciclo complessivo del processo. È il timestamp utilizzato per l’attività «Pagamento compensato» e viene confrontato con la scadenza netta per determinare la puntualità dei pagamenti. Alimenta direttamente la Dashboard Efficienza della compensazione dei pagamenti. Perché è importante Segna il completamento del processo di pagamento e serve a determinarne la puntualità. Dove reperirli Tabella SAP BSEG o AUGDT, campo AUGDT Esempi 2023-11-012023-11-15 | |||
| Importo fattura InvoiceAmount | Importo lordo totale della fattura nella valuta del documento. | ||
| Descrizione Questo attributo rappresenta il valore finanziario della fattura registrato nel documento di origine. Corrisponde alla passività da saldare nei confronti del fornitore. In SAP S/4HANA è in genere memorizzato nel campo dell’importo nella valuta del documento. Nell’analisi, l’importo della fattura serve a stabilire le priorità del lavoro. Dashboard come Distribuzione delle attività manuali utilizzano questo campo per evidenziare se le attività manuali che richiedono molto impegno vengono svolte su fatture di basso valore. Consente all’organizzazione di concentrare gli interventi di ottimizzazione sulle transazioni di valore elevato, per le quali gli errori di processo comportano un rischio finanziario maggiore. Perché è importante Indica il peso finanziario del caso ed è essenziale per dare priorità alle inefficienze di processo associate a importi elevati. Dove reperirli Tabella SAP BKPF o BSEG, campo WRBTR Esempi 1500.00250.5010000.00 | |||
| Motivo del blocco del pagamento PaymentBlockReason | Codice che indica perché una fattura è bloccata per il pagamento. | ||
| Descrizione Questo attributo contiene il codice del motivo specifico applicato a una fattura che impedisce al ciclo di pagamento automatico di selezionarla. Tra gli esempi figurano A per il blocco del pagamento, R per la verifica della fattura e i blocchi manuali impostati dagli utenti. Nell’analisi, questo campo è il principale riferimento per la Dashboard Analisi dei blocchi manuali dei pagamenti. Aggregando la frequenza dei diversi motivi di blocco, l’organizzazione può individuare problemi sistemici, come frequenti scostamenti di prezzo o ricevute merci mancanti, che rallentano il processo di pagamento. Perché è importante Individua la causa specifica delle interruzioni del processo e consente di analizzarne le cause profonde in modo mirato. Dove reperirli Tabella SAP BSEG, campo ZLSPR Esempi ABR* | |||
| Nome utente UserName | ID dell’utente che ha eseguito l’attività specifica. | ||
| Descrizione Il nome utente registra l’ID di accesso della persona o dell’agente di sistema responsabile dell’esecuzione di una fase del processo. Può trattarsi di un utente che inserisce dati manualmente o dell’ID di un processo in background, ad esempio BATCH_USER, che esegue attività automatiche. Nell’analisi, questo attributo consente di calcolare il tasso di automazione delle attività. Distinguendo gli utenti umani dagli account di sistema, gli analisti possono misurare il livello di automazione del processo. Il dato viene inoltre utilizzato nella Dashboard Distribuzione delle attività manuali per valutare il carico di lavoro dei team. Perché è importante Distingue il lavoro manuale da quello automatizzato e consente di calcolare il tasso di automazione. Dove reperirli Tabella SAP BKPF, campo USNAM, oppure tabella CDHDR, campo USERNAME Esempi BSMITHWF-BATCHRJONES | |||
| Numero fornitore VendorNumber | Identificativo univoco del fornitore associato alla fattura. | ||
| Descrizione Il numero fornitore corrisponde allo specifico conto del creditore nel sottocontabile SAP. Collega la fattura ai dati anagrafici che contengono le condizioni di pagamento, le coordinate bancarie e i recapiti. In S/4HANA è spesso associato al concetto di Business Partner, ma in molte tabelle mantiene il nome del campo legacy LIFNR. Nell’analisi, questo attributo è fondamentale per la Dashboard Conformità delle condizioni di pagamento dei fornitori. Consente agli analisti di aggregare le prestazioni del processo per fornitore e individuare quelli che causano con regolarità blocchi, scostamenti di prezzo o ritardi. Supporta le decisioni strategiche sugli acquisti e la gestione dei rapporti con i fornitori. Perché è importante Consente di aggregare le prestazioni per fornitore, un aspetto fondamentale per individuare le cause profonde dei ritardi. Dove reperirli Tabella SAP BKPF, campo LIFNR, oppure tabella ACDOCA, campo LIFNR Esempi 100050VEND-US-99200400 | |||
| Pagamento in ritardo IsLatePayment | Indicatore booleano che segnala se il pagamento è stato effettuato dopo la data di scadenza netta. | ||
| Descrizione Questo attributo calcolato restituisce true se la data di compensazione è successiva alla data di scadenza netta. Funge da classificatore binario delle prestazioni del processo. In fase di analisi, questo indicatore viene utilizzato per contare i casi non conformi ai fini del KPI Frequenza delle penali per ritardo nei pagamenti. Semplifica la creazione delle Dashboard, perché consente di contare i valori «True» senza dover ricorrere a calcoli complessi sulle date nel livello di visualizzazione. Perché è importante Semplifica il calcolo dei KPI relativi ai pagamenti puntuali. Dove reperirli Calcolato: data di compensazione > data di scadenza netta Esempi truefalse | |||
| Scadenza netta NetDueDate | Data calcolata entro la quale la fattura deve essere pagata per evitare penali. | ||
| Descrizione La scadenza netta è il termine ultimo per il pagamento. Si calcola aggiungendo alla data di riferimento il numero massimo di giorni previsto dalle condizioni di pagamento. A volte è memorizzata esplicitamente, ma spesso viene calcolata nelle viste di analisi. Nell’analisi, è il principale valore di riferimento per il monitoraggio dei pagamenti in ritardo e delle penali. Confrontando la data di compensazione effettiva con la scadenza netta si calcola la metrica «Giorni di ritardo nel pagamento», utile per valutare l’efficienza del team di contabilità fornitori e il rischio di tensioni nei rapporti con i fornitori. Perché è importante È la scadenza prevista per il processo: non rispettarla può compromettere il merito creditizio e comportare costi. Dove reperirli Calcolata come: data di riferimento + numero massimo di giorni delle condizioni di pagamento (ZBD1T/ZBD2T/ZBD3T) Esempi 2023-11-302023-12-01 | |||
| Senza intervento manuale IsTouchless | Indicatore booleano che segnala se la fattura è stata elaborata senza intervento manuale. | ||
| Descrizione Questo attributo viene calcolato analizzando il flusso di eventi di un caso. Se il caso include solo attività automatizzate, ad esempio eseguite dall’utente «system» o tramite specifici TCODES in background, e non presenta modifiche o blocchi manuali, viene contrassegnato come elaborato senza intervento manuale. In fase di analisi, costituisce la metrica principale per il KPI Tasso di fatture elaborate senza intervento manuale. Consente all’organizzazione di monitorare i risultati delle iniziative di automazione e di individuare i tipi di caso, ad esempio per fornitore o area geografica, che attraversano correttamente il sistema senza interventi umani. Perché è importante È la misura principale dell’automazione e dell’efficienza del processo. Dove reperirli Calcolato in base alla sequenza delle attività e ai tipi di utente Esempi truefalse | |||
| Società CompanyCode | Unità organizzativa per la quale vengono redatti lo stato patrimoniale e il conto economico. | ||
| Descrizione La società è l’entità contabile indipendente all’interno dell’organizzazione. È l’unità organizzativa centrale della contabilità esterna e serve a strutturare i dati finanziari. Ogni fattura è assegnata a una sola società. Nell’analisi, questo attributo consente di segmentare i KPI per entità giuridica o area geografica. Le Dashboard lo utilizzano per confrontare l’efficienza dei team di contabilità fornitori delle diverse società controllate. Ad esempio, aiuta a individuare se una filiale presenta una percentuale di blocchi manuali dei pagamenti superiore a quella standard dell’organizzazione. Perché è importante Segmenta il processo per entità giuridica e facilita i confronti interni. Dove reperirli Tabella SAP BKPF, campo BUKRS Esempi US01DE1010002000 | |||
| Tipo documento DocumentType | Classifica il documento contabile, ad esempio come fattura fornitore, pagamento o nota di credito. | ||
| Descrizione In SAP, il tipo documento è un codice di due caratteri che classifica la transazione contabile. Tra i tipi più comuni figurano KR per le fatture dei fornitori, KZ per i pagamenti ai fornitori e RE per la ricezione lorda delle fatture. Determina l’intervallo di numerazione e lo stato dei campi del documento. Nell’analisi, questo attributo serve a definire l’ambito del processo. Ad esempio, un analista può escludere le note di credito per concentrarsi esclusivamente sull’efficienza dei pagamenti in uscita. Aiuta inoltre a identificare la composizione delle tipologie di transazione elaborate e supporta la Dashboard Complessità delle varianti di processo. Perché è importante Classifica il caso, ad esempio come fattura o nota di credito, e consente di filtrare l’analisi. Dove reperirli Tabella SAP BKPF, campo BLART Esempi KRREKZKG | |||
| Data di riferimento BaselineDate | Data a partire dalla quale si applicano le condizioni di pagamento e si calcolano le scadenze. | ||
| Descrizione La data di riferimento è il punto di partenza per calcolare la scadenza netta e i periodi di sconto per pagamento anticipato. In genere corrisponde alla data della fattura o alla data di contabilizzazione, a seconda della configurazione e dei dati anagrafici del fornitore. Nell’analisi, questa data è un requisito tecnico per calcolare lo stato «In ritardo». Errori nella data di riferimento possono causare pagamenti anticipati, con conseguenze sul flusso di cassa, o pagamenti in ritardo, con possibili penali. Verificare che la data sia corretta rientra nell’analisi della conformità delle condizioni di pagamento dei fornitori. Perché è importante È il riferimento per tutti i calcoli delle scadenze. Dove reperirli Tabella SAP BSEG, campo ZFBDT Esempi 2023-10-012023-10-15 | |||
| Documento di acquisto PurchasingDocument | Numero dell’ordine di acquisto associato alla fattura. | ||
| Descrizione Questo attributo collega la fattura al processo di approvvigionamento a monte. Contiene il numero dell’ordine di acquisto (PO) con cui viene confrontata la fattura. Non tutte le fatture, ad esempio quelle relative a spese varie, fanno riferimento a un ordine di acquisto. Nell’analisi, questo campo è fondamentale per l’analisi del tasso di corrispondenza a tre vie. Consente agli analisti di distinguere le fatture associate a un ordine di acquisto da quelle che non lo sono, che in genere seguono flussi di approvazione molto diversi. Facilita inoltre il Process Mining end-to-end collegando i dati della contabilità fornitori a quelli degli acquisti. Perché è importante Collega la contabilità fornitori agli acquisti, consentendo l’analisi della corrispondenza a tre vie e l’estensione del processo. Dove reperirli Tabella SAP BSEG, campo EBELN Esempi 45000012344500009876 | |||
| Esercizio FiscalYear | Esercizio finanziario a cui appartiene la fattura. | ||
| Descrizione L’esercizio è il periodo utilizzato per la rendicontazione finanziaria. In SAP, insieme alla società e al numero documento, costituisce la chiave primaria composta di un documento finanziario. Nell’analisi, è un requisito tecnico per identificare in modo univoco i casi e consente inoltre di confrontare i dati tra esercizi. Garantisce che l’ID del caso «Numero fattura» resti univoco anche negli archivi con decenni di dati. Perché è importante Requisito tecnico per identificare in modo univoco i casi in SAP FI. Dove reperirli Tabella SAP BKPF, campo GJAHR Esempi 20232024 | |||
| Giorni per lo sconto in contanti 1 CashDiscountDays1 | Numero di giorni dalla data di riferimento durante i quali è disponibile il primo sconto in contanti. | ||
| Descrizione Questo attributo definisce il periodo in cui sono valide le condizioni di pagamento più vantaggiose, ad esempio «10» in «2% entro 10 giorni, 30 giorni netti». Il dato proviene dalle condizioni memorizzate nella singola posizione della fattura. Nell’analisi, aiuta a determinare la «data obiettivo» per l’Ottimizzazione degli sconti per pagamento anticipato. Se la fattura viene compensata entro questo periodo, lo sconto viene applicato. Il campo consente di misurare il costo opportunità dei cicli di elaborazione lenti. Perché è importante Definisce il periodo utile per ottenere un risparmio finanziario. Dove reperirli Tabella SAP BSEG, campo ZBD1T Esempi 10140 | |||
| Importo degli sconti persi DiscountLostAmount | Valore monetario degli sconti per pagamento in contanti disponibili ma non utilizzati. | ||
| Descrizione Questo attributo calcolato rappresenta il valore degli sconti non sfruttati. Si ottiene verificando se il pagamento è stato effettuato dopo la scadenza prevista per lo sconto e, in tal caso, calcolando l’importo dello sconto perso in base alla percentuale applicabile alla fattura. In fase di analisi, è una metrica finanziaria fondamentale per l’ottimizzatore degli sconti per pagamento anticipato. Quantifica in termini monetari il costo delle inefficienze e fornisce una motivazione concreta per migliorare il processo. Perché è importante Quantifica la perdita finanziaria diretta dovuta ai ritardi del processo. Dove reperirli Calcolato: se la data di compensazione > data limite per lo sconto, allora importo fattura × percentuale di sconto Esempi 30.000.00150.00 | |||
| Percentuale del primo sconto in contanti CashDiscountPercentage1 | Percentuale di sconto disponibile se il pagamento viene effettuato entro il primo periodo previsto. | ||
| Descrizione Questo attributo rappresenta la percentuale dell’incentivo finanziario offerto dal fornitore per il pagamento anticipato, ad esempio «2» in «2% entro 10 giorni». Nell’analisi, serve a calcolare il valore dello «sconto in contanti potenziale». Moltiplicando questa percentuale per l’importo della fattura, le Dashboard possono mostrare il denaro che non è stato risparmiato a causa delle inefficienze del processo e supportare la valutazione dei vantaggi dell’automazione. Perché è importante Quantifica il potenziale tasso di risparmio ed è essenziale per calcolare il ROI. Dove reperirli Tabella SAP BSEG, campo ZBD1P Esempi 2.03.00.0 | |||
| Valuta Currency | Codice della valuta associata all’importo della fattura. | ||
| Descrizione L’attributo valuta specifica la denominazione dell’importo della fattura, ad esempio USD, EUR o GBP. Consente di interpretare correttamente i valori finanziari ed è essenziale per aggregare i dati di società internazionali. Nell’analisi, questo campo garantisce il calcolo corretto dei KPI finanziari. Spesso viene utilizzato per convertire i valori in una valuta di rendicontazione comune per le Dashboard globali. Senza questo attributo, metriche aggregate come la spesa totale o il valore medio delle fatture non avrebbero significato in un ambiente con più valute. Perché è importante Fornisce il contesto necessario per interpretare gli importi finanziari e redigere rendicontazioni globali accurate. Dove reperirli Tabella SAP BKPF, campo WAERS Esempi USDEURGBPJPY | |||
Attività della gestione dei pagamenti ai fornitori
| Attività | Descrizione | ||
|---|---|---|---|
| Blocco del pagamento applicato | Indica che è stato applicato un blocco al pagamento della riga della fattura, impedendone l’inclusione nel ciclo di pagamento. L’attività viene rilevata monitorando le modifiche al campo ZLSPR nella tabella BSEG tramite i documenti di modifica. | ||
| Perché è importante I blocchi sono la causa principale dei pagamenti in ritardo e degli ostacoli nel processo e incidono direttamente sulla Dashboard Analisi dei blocchi manuali dei pagamenti. Dove reperirli Tabelle CDPOS e CDHDR (documenti di modifica), per individuare gli aggiornamenti al campo BSEG-ZLSPR. Acquisizione Registrato quando cambia il valore ZLSPR nei record CDPOS Tipo di evento explicit | |||
| Blocco del pagamento rimosso | Indica che un blocco del pagamento applicato in precedenza è stato rimosso, rendendo la fattura disponibile per il pagamento. L’attività viene rilevata quando il campo ZLSPR in BSEG passa da un valore a null o vuoto. | ||
| Perché è importante Nei sistemi senza registri espliciti dei flussi di lavoro, spesso funge da indicatore dell’attività 'Fattura approvata' e segna la fine del periodo di blocco. Dove reperirli Tabelle CDPOS e CDHDR, per individuare i record in cui BSEG-ZLSPR diventa vuoto. Acquisizione Registrato quando CDPOS rileva la rimozione di ZLSPR Tipo di evento explicit | |||
| Creazione del documento di pagamento | Generazione del documento contabile che accredita la banca e addebita il fornitore. Il documento è registrato nella tabella BKPF con un tipo documento di pagamento (ad esempio, ZP o KZ). | ||
| Perché è importante Rappresenta la contabilizzazione finanziaria del pagamento ed è utilizzato per calcolare i giorni medi di pagamento (DPO). Dove reperirli Tabella BKPF, filtrata per tipo documento (BLART) specifico dei pagamenti. Acquisizione Registrato alla creazione del documento di pagamento BKPF Tipo di evento explicit | |||
| Esecuzione del ciclo di pagamento | Indica l’esecuzione del ciclo di pagamento, durante la quale vengono generate le istruzioni di trasferimento dei fondi. L’evento è rilevato tramite l’aggiornamento dello stato nelle tabelle REGUH o REGUP. | ||
| Perché è importante Rappresenta l’impegno operativo a effettuare il pagamento ed è fondamentale per analizzare l’efficienza del processo di raggruppamento dei pagamenti. Dove reperirli Tabella REGUH, in genere correlata alla data e all’identificativo del ciclo. Acquisizione Registrato all’aggiornamento dello stato del ciclo di pagamento Tipo di evento explicit | |||
| Fattura registrata | Rappresenta la registrazione ufficiale della passività nel libro mastro generale. L’attività è ricavata dalla data e ora di creazione nella tabella BKPF o dalla data di registrazione nella tabella ACDOCA. | ||
| Perché è importante È il punto di partenza principale della cronologia finanziaria e definisce la base di riferimento per le scadenze e l’analisi dell’anzianità. Dove reperirli Tabella BKPF, utilizzando CPUDT (data di inserimento) e CPUTM (ora di inserimento). Acquisizione Registrato alla creazione del record BKPF Tipo di evento explicit | |||
| Pagamento compensato | Indica la compensazione finale, quando la partita aperta nel conto del fornitore viene chiusa con il pagamento. Il dato è ricavato dal campo AUGDT (data di compensazione) della tabella BSEG. | ||
| Perché è importante Stato finale del processo: indica che il ciclo è concluso e che i conti sono in pareggio. Un’elevata percentuale di compensazioni manuali segnala inefficienze nella riconciliazione. Dove reperirli Tabella BSEG, campo AUGDT (data di compensazione). Acquisizione Registrato quando viene compilato il campo AUGDT Tipo di evento explicit | |||
| Condizioni di pagamento modificate | Registra una modifica alle condizioni di pagamento di una fattura aperta, che cambia la scadenza o il diritto allo sconto. La modifica viene tracciata tramite i registri delle modifiche al campo ZTERM nella tabella BSEG. | ||
| Perché è importante Modifiche frequenti possono indicare errori nei dati anagrafici o sostituzioni manuali che incidono sulle previsioni dei flussi di cassa e sulla conformità alle condizioni di pagamento dei fornitori. Dove reperirli Tabelle CDPOS e CDHDR, per individuare gli aggiornamenti al campo BSEG-ZTERM. Acquisizione Registrato quando cambia il valore ZTERM nei record CDPOS Tipo di evento explicit | |||
| Fattura parcheggiata | Indica che una fattura è stata inserita in SAP ma non è ancora stata registrata nel libro mastro generale; questa modalità viene spesso usata per l’inserimento preliminare dei dati. L’attività è rilevata direttamente dalla tabella VBKPF oppure individuando in BKPF i documenti con stato parcheggiato prima della registrazione. | ||
| Perché è importante Il parcheggio segna l’inizio della fase di inserimento dei dati e aiuta a misurare il tempo che intercorre tra la ricezione e la registrazione dell’obbligazione finanziaria. Dove reperirli Tabella VBKPF per i dati di intestazione dei documenti parcheggiati oppure BKPF con uno stato documento specifico (BSTAT = V). Acquisizione Registrato alla creazione della voce VBKPF Tipo di evento explicit | |||
| Fattura stornata | Indica che il documento della fattura è stato stornato o annullato. L’evento è rilevato verificando che il campo STBLG (documento di storno) della tabella BKPF sia valorizzato. | ||
| Perché è importante Indica una rilavorazione e un errore di processo, mettendo in evidenza attività superflue e possibili duplicazioni. Dove reperirli Tabella BKPF, campo STBLG non vuoto. Acquisizione Registrato quando viene compilato il campo STBLG Tipo di evento explicit | |||
| Proposta di pagamento creata | Indica che la fattura è stata inclusa in un ciclo di proposta di pagamento (F110), il primo passaggio del programma di pagamento automatico. L’attività viene rilevata dalla tabella REGUH, che contiene i dati di liquidazione. | ||
| Perché è importante Indica che la fattura è stata selezionata per il pagamento e ha superato i controlli di convalida del programma di pagamento. Dove reperirli Timestamp di creazione della tabella REGUH (chiavi LAUFD e LAUFI). Acquisizione Registrato alla creazione del record REGUH Tipo di evento explicit | |||
| Scadenza della fattura | Data e ora calcolate che indicano il momento in cui la fattura raggiunge la scadenza netta. Si ricavano aggiungendo i giorni previsti dalle condizioni di pagamento alla data di riferimento presente nella tabella BSEG. | ||
| Perché è importante Funge da riferimento per la Dashboard Prestazioni dei pagamenti puntuali e per il monitoraggio delle penali per ritardi nei pagamenti. Dove reperirli Calcolo: BSEG-ZFBDT (data di riferimento) + BSEG-ZBD1T/ZBD2T/ZBD3T (giorni). Acquisizione Ricavare confrontando la data corrente con la data di scadenza netta Tipo di evento calculated | |||
| Sconto di cassa perso | Evento calcolato che indica la data in cui è scaduto il diritto a uno sconto di cassa. Si ricava confrontando la data di scadenza dello sconto con la data corrente o quella del pagamento. | ||
| Perché è importante Essenziale per l’ottimizzatore degli sconti per pagamenti anticipati, che consente di visualizzare le opportunità finanziarie perse. Dove reperirli Calcolo: BSEG-ZFBDT + BSEG-ZBD1T (giorni per lo sconto 1). Acquisizione Ricavare confrontando la data con la data di scadenza dello sconto Tipo di evento calculated | |||
| Scostamento di prezzo rilevato | Attività dedotta che indica una discrepanza tra il prezzo della fattura e quello dell’ordine di acquisto. Si ricava osservando l’applicazione automatica, al momento della registrazione, di una specifica chiave di blocco del pagamento (in genere 'R' per la verifica della fattura). | ||
| Perché è importante Individua le cause profonde delle rilavorazioni manuali e supporta l’analisi del tasso di abbinamento a tre vie. Dove reperirli Deducibile dal valore 'R' di BSEG-ZLSPR (o dalla configurazione specifica del sistema per i blocchi di prezzo) al momento della registrazione. Acquisizione Confrontare il valore di ZLSPR con 'R' Tipo di evento inferred | |||
| Scostamento di quantità rilevato | Attività dedotta che indica una discrepanza tra la quantità fatturata e quella ricevuta. Si ricava osservando l’applicazione alla riga di una specifica chiave di blocco del pagamento (in genere 'M' per lo scostamento di quantità). | ||
| Perché è importante Fondamentale per analizzare l’efficienza degli abbinamenti e la qualità dei dati della catena di fornitura. Dove reperirli Deducibile dal valore 'M' di BSEG-ZLSPR (o dalla configurazione specifica del sistema per i blocchi relativi alle quantità). Acquisizione Confrontare il valore di ZLSPR con 'M' Tipo di evento inferred | |||
Guide all’estrazione
Passaggi
Individui le viste CDS necessarie: verifichi la disponibilità delle viste CDS standard di SAP S/4HANA. Le viste principali richieste sono I_JournalEntry (testata), I_OperationalAcctgDocItem (posizioni, equivalente di BSEG), I_SupplierInvoice (logistica), I_PaymentProposalItem (F110) e I_ChangeDocument (per i log).
Configuri le autorizzazioni utente: verifichi che l’utente del database o l’utente tecnico del servizio disponga dei privilegi SELECT sulle viste SQL DDL associate alle entità CDS. In genere, la gestione avviene tramite SAP HANA Studio o ABAP Development Tools per Eclipse (ADT).
Predisponga l’ambiente SQL: apra l’interfaccia SQL, ad esempio SAP HANA Studio, DBeaver collegato a HANA o un connettore di Process Mining che accetti SQL. Questo metodo presuppone l’accesso SQL diretto al livello HANA, dove le viste CDS sono esposte come viste.
Definisca l’ambito: determini il codice società (CompanyCode) e l’intervallo di esercizi da includere, così da limitare il volume dei dati. È fondamentale per le prestazioni delle query sulla vista delle posizioni dei documenti contabili operativi.
Imposti la logica delle attività: copi la query SQL fornita di seguito. La query utilizza UNION ALL per combinare 14 blocchi logici distinti in un’unica struttura di Event Log. Ogni blocco riguarda un’attività specifica, ad esempio la registrazione della fattura o la compensazione del pagamento.
Gestisca i documenti di modifica: la query include sezioni dedicate alle modifiche dei termini di pagamento e alla gestione dei blocchi. Queste si basano sulla vista I_ChangeDocument. Se la vista non è attiva nella versione S/4 in uso, potrebbe essere necessario racchiudere le tabelle sottostanti (CDHDR/CDPOS) in una vista CDS personalizzata.
Verifichi gli eventi calcolati: riveda la logica relativa alla scadenza della fattura e agli sconti per pagamento in contanti persi. Si tratta di eventi calcolati, generati aggiungendo giorni alla data di riferimento presente nella vista delle posizioni operative.
Esegua l’estrazione: avvii la query. Per i set di dati di grandi dimensioni, si consiglia vivamente di suddividere l’estrazione per esercizio o codice società, così da evitare l’esaurimento della memoria.
Verifichi i formati delle date: si assicuri che la colonna EventTime abbia il formato YYYY-MM-DD HH:MM:SS. SAP HANA SQL restituisce timestamp che potrebbe essere necessario convertire in base all’applicazione di destinazione.
Esporti i dati: salvi il risultato in un file CSV o Parquet. Verifichi che le intestazioni corrispondano alle colonne definite nell’istruzione SELECT finale.
Trasformi i dati per il caricamento: se lo strumento di Process Mining richiede un formato CSV specifico, ad esempio una particolare maschera per le date, applichi le trasformazioni in uno script di post-elaborazione o nella query SQL tramite le funzioni TO_VARCHAR.
Esegua la convalida finale: carichi un campione in ProcessMind e verifichi che l’ID del caso (numero fattura) raggruppi correttamente tutte le attività, dalla registrazione alla compensazione.
Configurazione
- Filtro per codice società: limiti la query a specifiche unità organizzative (CompanyCode = '1000') per mantenere il contesto e garantire le prestazioni.
- Intervallo di date: applichi un filtro su PostingDate o CreationDate, ad esempio per gli ultimi 12 mesi, per gestire il volume dei dati.
- Tipo di conto: filtri I_OperationalAcctgDocItem per FinancialAccountType = 'K' (fornitore), escludendo le righe di contabilità generale e clienti.
- Attivazione delle viste CDS: verifichi che le viste I_JournalEntry, I_OperationalAcctgDocItem e I_PaymentProposalItem siano attive e abilitate all’accesso SQL.
- Prestazioni dei log delle modifiche: le query su I_ChangeDocument possono richiedere molte risorse. Limiti le sottoquery a ObjectClass 'BELEG' e a nomi di campo specifici, come ZLSPR e ZTERM.
a Query di esempio sql
/* SAP S/4HANA CDS View Extraction for Accounts Payable */
/* Combined Event Log Query */
/* 1. Invoice Parked */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Parked' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
JE.CreatedByUser AS UserName,
NULL AS ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
CASE WHEN JE.CreationDateTime > ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) THEN 'True' ELSE 'False' END AS IsLatePayment,
'False' AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K' -- Vendor
AND JE.AccountingDocumentCategory = 'V' -- Parked Document
UNION ALL
/* 2. Invoice Posted */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Posted' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
JEItem.PaymentBlockingReason AS PaymentBlockReason,
JE.CreatedByUser AS UserName,
NULL AS ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
'False' AS IsLatePayment,
CASE WHEN JE.CreatedByUser = 'BATCH_USER' THEN 'True' ELSE 'False' END AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JE.AccountingDocumentCategory <> 'V' -- Exclude Parked
UNION ALL
/* 3. Price Variance Detected (Inferred at Posting) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Price Variance Detected' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
JEItem.PaymentBlockingReason AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.PaymentBlockingReason = 'R' -- Standard SAP Price Variance Block Key
UNION ALL
/* 4. Quantity Variance Detected (Inferred at Posting) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Quantity Variance Detected' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
JEItem.PaymentBlockingReason AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.PaymentBlockingReason = 'M' -- Standard SAP Quantity Variance Block Key
UNION ALL
/* 5. Payment Block Applied (via Change Document) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Block Applied' AS Activity,
CD.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
CD.NewValue AS PaymentBlockReason,
CD.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_ChangeDocument AS CD
JOIN I_JournalEntry AS JE ON CD.ObjectValue = CONCAT(JE.CompanyCode, JE.AccountingDocument)
JOIN I_OperationalAcctgDocItem AS JEItem ON JE.AccountingDocument = JEItem.AccountingDocument AND JE.CompanyCode = JEItem.CompanyCode
WHERE CD.ObjectClass = 'BELEG'
AND CD.TableName = 'BSEG'
AND CD.FieldName = 'ZLSPR'
AND CD.OldValue IS NULL AND CD.NewValue IS NOT NULL
UNION ALL
/* 6. Payment Block Removed (via Change Document) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Block Removed' AS Activity,
CD.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
CD.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_ChangeDocument AS CD
JOIN I_JournalEntry AS JE ON CD.ObjectValue = CONCAT(JE.CompanyCode, JE.AccountingDocument)
JOIN I_OperationalAcctgDocItem AS JEItem ON JE.AccountingDocument = JEItem.AccountingDocument AND JE.CompanyCode = JEItem.CompanyCode
WHERE CD.ObjectClass = 'BELEG'
AND CD.TableName = 'BSEG'
AND CD.FieldName = 'ZLSPR'
AND CD.OldValue IS NOT NULL AND (CD.NewValue IS NULL OR CD.NewValue = '')
UNION ALL
/* 7. Payment Terms Changed (via Change Document) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Terms Changed' AS Activity,
CD.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
CD.NewValue AS PaymentTerms,
NULL AS PaymentBlockReason,
CD.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_ChangeDocument AS CD
JOIN I_JournalEntry AS JE ON CD.ObjectValue = CONCAT(JE.CompanyCode, JE.AccountingDocument)
JOIN I_OperationalAcctgDocItem AS JEItem ON JE.AccountingDocument = JEItem.AccountingDocument AND JE.CompanyCode = JEItem.CompanyCode
WHERE CD.ObjectClass = 'BELEG'
AND CD.TableName = 'BSEG'
AND CD.FieldName = 'ZTERM'
UNION ALL
/* 8. Invoice Due (Calculated) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Due' AS Activity,
TO_TIMESTAMP(ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays))) AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) < CURRENT_DATE
UNION ALL
/* 9. Cash Discount Lost (Calculated) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Cash Discount Lost' AS Activity,
TO_TIMESTAMP(ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.CashDiscount1Days))) AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.CashDiscount1Days > 0
AND (JEItem.ClearingDate IS NULL OR JEItem.ClearingDate > ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.CashDiscount1Days)))
UNION ALL
/* 10. Payment Proposal Created */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Proposal Created' AS Activity,
PPI.ProposalRunDate AS EventTime, -- Often just a date, cast to timestamp if needed
JE.CompanyCode,
PPI.Supplier AS VendorNumber,
PPI.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
PPI.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_PaymentProposalItem AS PPI
JOIN I_JournalEntry AS JE
ON PPI.CompanyCode = JE.CompanyCode
AND PPI.AccountingDocument = JE.AccountingDocument
AND PPI.FiscalYear = JE.FiscalYear
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JEItem.FinancialAccountType = 'K'
UNION ALL
/* 11. Payment Run Executed */
/* Derived from existence in payment tables with a run ID */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Run Executed' AS Activity,
PPI.PaymentRunDate AS EventTime,
JE.CompanyCode,
PPI.Supplier AS VendorNumber,
PPI.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
PPI.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_PaymentProposalItem AS PPI
JOIN I_JournalEntry AS JE
ON PPI.CompanyCode = JE.CompanyCode
AND PPI.AccountingDocument = JE.AccountingDocument
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
WHERE PPI.PaymentRunID IS NOT NULL
UNION ALL
/* 12. Payment Document Created */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Document Created' AS Activity,
PayJE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
PayJE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
PayJE.CreatedByUser AS UserName,
PayJE.PostingDate AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
JOIN I_JournalEntry AS PayJE
ON JEItem.ClearingJournalEntry = PayJE.AccountingDocument
AND JEItem.ClearingJournalEntryFiscalYear = PayJE.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.ClearingJournalEntry IS NOT NULL
UNION ALL
/* 13. Payment Cleared */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Cleared' AS Activity,
TO_TIMESTAMP(JEItem.ClearingDate) AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
'System' AS UserName,
JEItem.ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
CASE WHEN JEItem.ClearingDate > ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) THEN 'True' ELSE 'False' END AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.ClearingDate IS NOT NULL
UNION ALL
/* 14. Invoice Reversed */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Reversed' AS Activity,
RevJE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
RevJE.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
JOIN I_JournalEntry AS RevJE
ON JE.ReverseDocument = RevJE.AccountingDocument
AND JE.ReverseDocumentFiscalYear = RevJE.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JE.ReverseDocument IS NOT NULL Passaggi
- Verifichi che sia disponibile l’accesso SQL diretto allo schema SAP HANA che contiene ACDOCA, BKPF, BSEG, VBKPF, REGUH, REGUP e le tabelle applicabili dei documenti di modifica. Sostituisca [Your SAP HANA schema] e i dettagli di connessione con i valori approvati per il Suo sistema.
- Confermi l’insieme delle fatture e il periodo di rendicontazione. Imposti [Start date] e [End date] nel formato YYYYMMDD e configuri [Company code filter] come predicato SQL valido, ad esempio BUKRS IN ('1000','2000').
- Verifichi la versione SAP e la configurazione locale per i documenti parcheggiati, i campi di stato del programma di pagamento, i tipi di documento di pagamento e l’archiviazione dei documenti di modifica. La query utilizza oggetti di origine documentati e mappature conservative dei campi, ma prima dell’uso in produzione occorre verificare le estensioni locali e le differenze tra versioni.
- Esegua la query su SAP HANA tramite un client SQL o un servizio di estrazione approvato. La query crea una riga di evento per ogni attività estratta esplicitamente. ProcessMind non deduce le attività assenti dal risultato.
- Riveda i dati di origine e modifichi i predicati di configurazione indicati per lo stato di parcheggio, i tipi di documento di pagamento, lo stato della proposta e dell’esecuzione dei pagamenti e le classi degli oggetti dei documenti di modifica. Non allarghi l’ambito di questi predicati senza prima riconciliare i documenti contabili duplicati o non pertinenti.
- Convalidi le join utilizzando InvoiceNumber, CompanyCode, esercizio, numero del documento contabile, numero fornitore e posizione, ove applicabile. Verifichi che nel sistema di destinazione i numeri dei documenti fattura siano rappresentati in modo coerente in BKPF, BSEG, ACDOCA, REGUH e REGUP.
- Riconcili gli eventi calcolati. L’evento Invoice Due viene generato alla data di scadenza netta calcolata; l’evento Cash Discount Lost viene generato alla prima scadenza applicabile per lo sconto, se non è stato effettuato alcun pagamento prima di tale data. Queste righe derivate devono essere chiaramente distinte dagli eventi basati sui record di origine.
- Esporti il risultato in un file CSV UTF-8 semplice o in un altro formato tabellare supportato da ProcessMind. Mantenga esattamente i nomi delle colonne InvoiceNumber, Activity, EventTime, SourceSystem e LastDataUpdate. Mantenga una riga per evento e non aggreghi le attività per fattura.
- Carichi l’Event Log in ProcessMind e mappi InvoiceNumber come identificativo del caso, Activity come nome dell’attività ed EventTime come timestamp dell’evento. Mappi le altre colonne come attributi dell’evento o del caso, in base alla configurazione di importazione di ProcessMind.
Configurazione
- Intervallo di date: per la prima estrazione, utilizzi un periodo mobile da 3 a 6 mesi. Applichi in modo coerente i predicati relativi alla data di registrazione, alla data di modifica e alla data del programma di pagamento; estenda l’intervallo quando convalida termini di pagamento lunghi.
- Schema: sostituisca [Your SAP HANA schema] con lo schema che contiene gli oggetti SAP. Verifichi se l’ambiente espone gli oggetti dipendenti dal client tramite lo schema selezionato o se richiede un predicato client esplicito.
- Filtro per società: configuri [Company code filter] per limitare BUKRS ai codici società richiesti. Applichi lo stesso ambito a BKPF, BSEG, ACDOCA, REGUH, REGUP e alle origini dei documenti di modifica, ove i relativi campi siano disponibili.
- Filtro per documento: riveda il predicato relativo al tipo di documento fattura e quello relativo al tipo di documento di pagamento. La query include alcuni esempi comuni, ma i tipi di documento sono configurabili e devono essere adeguati al sistema di destinazione.
- Fatture parcheggiate: verifichi come viene rappresentato lo stato dei documenti parcheggiati in VBKPF o BKPF. La query utilizza un predicato configurabile per lo stato di parcheggio, poiché la codifica può variare a seconda della versione e dell’implementazione.
- Modifiche ai pagamenti: verifichi la classe dell’oggetto, il nome della tabella, i nomi dei campi e la rappresentazione dei valori dei documenti di modifica per BSEG-ZLSPR e BSEG-ZTERM. L’archiviazione dei documenti di modifica e i nomi dei campi devono essere verificati nel sistema di destinazione.
- Programma di pagamento: verifichi i campi REGUH e REGUP utilizzati per lo stato della proposta e dell’esecuzione, la data di esecuzione, l’identificativo dell’esecuzione e il collegamento al documento contabile. La configurazione locale del programma di pagamento può influire sui valori di stato disponibili.
- Prestazioni: limiti l’intervallo di date e i codici società, selezioni solo le colonne necessarie e applichi i filtri specifici per le origini prima delle join. Per i set di dati di grandi dimensioni, materializzi sottoinsiemi di origine filtrati oppure utilizzi una vista di calcolo HANA o uno schema di estrazione approvati.
- Autorizzazioni: è necessario disporre dell’autorizzazione di lettura per gli oggetti dello schema SAP HANA pertinenti e per le eventuali viste che espongono dati contabili, del programma di pagamento e dei documenti di modifica. Si coordini con i team SAP per la sicurezza e la governance dei dati.
- Prerequisiti funzionali: le funzionalità pertinenti di contabilità finanziaria, contabilità fornitori, programma di pagamento e documenti di modifica devono essere attive e contenere dati. Se una tabella di origine non è utilizzata nell’implementazione, configuri una sostituzione approvata in base alla progettazione del sistema.
- Gestione dei timestamp: BKPF e BSEG forniscono comunemente date e orari in campi separati. La query li combina in un timestamp. Verifichi il fuso orario del sistema di origine e applichi la conversione necessaria prima di caricare i dati in ProcessMind.
- Protezione dei dati: limiti i dati dei fornitori e contabili all’ambito approvato e applichi le politiche dell’organizzazione in materia di conservazione, mascheramento e accesso.
a Query di esempio sql
WITH
params AS (
SELECT
TO_DATE('[Start date]', 'YYYYMMDD') AS start_date,
TO_DATE('[End date]', 'YYYYMMDD') AS end_date,
'[Source system identifier]' AS source_system
FROM DUMMY
),
base_bkpf AS (
SELECT
b.MANDT,
b.BUKRS,
b.BELNR,
b.GJAHR,
b.BLART,
b.BLDAT,
b.BUDAT,
b.CPUDT,
b.CPUTM,
b.USNAM,
b.STBLG,
b.STJAH,
b.XBLNR,
b.WAERS,
b.BKTXT,
p.source_system,
p.start_date,
p.end_date
FROM [Your SAP HANA schema].BKPF b
CROSS JOIN params p
WHERE b.BUDAT BETWEEN TO_VARCHAR(p.start_date, 'YYYYMMDD') AND TO_VARCHAR(p.end_date, 'YYYYMMDD')
AND [Company code filter]
),
invoice_bseg AS (
SELECT
k.MANDT,
k.BUKRS,
k.BELNR,
k.GJAHR,
k.BLART,
k.BLDAT,
k.BUDAT,
k.CPUDT,
k.CPUTM,
k.USNAM,
k.STBLG,
k.STJAH,
k.XBLNR,
k.WAERS,
k.BKTXT,
k.source_system,
s.BUZEI,
s.LIFNR,
s.WRBTR,
s.DMBTR,
s.ZTERM,
s.ZLSPR,
s.ZFBDT,
s.ZBD1T,
s.ZBD2T,
s.ZBD3T,
s.AUGDT,
s.AUGBL,
s.SHKZG,
s.SGTXT,
s.XREF1,
s.XREF2,
s.XREF3
FROM base_bkpf k
INNER JOIN [Your SAP HANA schema].BSEG s
ON s.MANDT = k.MANDT
AND s.BUKRS = k.BUKRS
AND s.BELNR = k.BELNR
AND s.GJAHR = k.GJAHR
WHERE s.LIFNR IS NOT NULL
AND s.LIFNR <> ''
),
acdoca_invoice AS (
SELECT
a.RCLNT AS MANDT,
a.RBUKRS AS BUKRS,
a.BELNR,
a.GJAHR,
a.BUZEI,
a.RACCT,
a.HSL,
a.WSL,
a.RWCUR,
a.BUDAT,
a.BLDAT,
a.AUGDT,
a.AUGBL
FROM [Your SAP HANA schema].ACDOCA a
WHERE a.BUDAT BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
AND [ACDOCA company code filter]
),
invoice_cases AS (
SELECT DISTINCT
i.MANDT,
i.BUKRS,
i.BELNR,
i.GJAHR,
i.BUZEI,
i.LIFNR,
i.WRBTR,
i.ZTERM,
i.ZLSPR,
i.ZFBDT,
i.ZBD1T,
i.ZBD2T,
i.ZBD3T,
i.AUGDT,
i.AUGBL,
i.BLART,
i.BLDAT,
i.BUDAT,
i.CPUDT,
i.CPUTM,
i.USNAM,
i.STBLG,
i.STJAH,
i.XBLNR,
i.WAERS,
i.source_system,
COALESCE(NULLIF(i.XBLNR, ''), i.BELNR) AS InvoiceNumber,
ADD_DAYS(TO_DATE(COALESCE(NULLIF(i.ZFBDT, ''), i.BLDAT), 'YYYYMMDD'), COALESCE(TO_INTEGER(NULLIF(i.ZBD3T, '')), 0)) AS NetDueDate,
ADD_DAYS(TO_DATE(COALESCE(NULLIF(i.ZFBDT, ''), i.BLDAT), 'YYYYMMDD'), COALESCE(TO_INTEGER(NULLIF(i.ZBD1T, '')), 0)) AS DiscountDueDate1,
ADD_DAYS(TO_DATE(COALESCE(NULLIF(i.ZFBDT, ''), i.BLDAT), 'YYYYMMDD'), COALESCE(TO_INTEGER(NULLIF(i.ZBD2T, '')), 0)) AS DiscountDueDate2
FROM invoice_bseg i
LEFT JOIN acdoca_invoice a
ON a.MANDT = i.MANDT
AND a.BUKRS = i.BUKRS
AND a.BELNR = i.BELNR
AND a.GJAHR = i.GJAHR
AND a.BUZEI = i.BUZEI
),
change_events AS (
SELECT
c.MANDT,
c.OBJECTID,
c.TABKEY,
c.FNAME,
c.VALUE_OLD,
c.VALUE_NEW,
c.UDATE,
c.UTIME,
c.USERNAME
FROM [Your SAP HANA schema].[Your change document item table name] c
WHERE c.TABNAME = 'BSEG'
AND c.FNAME IN ('ZLSPR', 'ZTERM')
AND c.UDATE BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
AND [Change document object class filter]
),
reguh_events AS (
SELECT
r.MANDT,
r.LAUFD,
r.LAUFI,
r.XVORL,
r.ZBUKR,
r.LIFNR,
r.VBLNR,
r.AUSFD,
r.AUSDT,
r.LAUFD AS RunDate,
r.ZALDT,
r.RZAWE,
r.XEINZ,
r.XPGRO,
r.XAVIS,
r.XVORL AS ProposalIndicator
FROM [Your SAP HANA schema].REGUH r
WHERE r.LAUFD BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
),
regup_events AS (
SELECT
u.MANDT,
u.LAUFD,
u.LAUFI,
u.ZBUKR,
u.LIFNR,
u.VBLNR,
u.BUKRS,
u.BELNR,
u.GJAHR,
u.BUZEI,
u.XVORL,
u.AUGBL,
u.AUGDT
FROM [Your SAP HANA schema].REGUP u
WHERE u.LAUFD BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
),
events AS (
SELECT
i.InvoiceNumber,
'Invoice Parked' AS Activity,
TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
i.source_system AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
i.LIFNR AS VendorNumber,
i.BUKRS AS CompanyCode,
i.WRBTR AS InvoiceAmount,
i.BLART AS DocumentType,
i.ZTERM AS PaymentTerms,
i.ZLSPR AS PaymentBlockReason,
i.USNAM AS UserName,
i.AUGDT AS ClearingDate,
i.NetDueDate,
CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END AS IsLatePayment,
FALSE AS IsTouchless
FROM invoice_cases i
INNER JOIN [Your SAP HANA schema].VBKPF v
ON v.MANDT = i.MANDT
AND v.BUKRS = i.BUKRS
AND v.BELNR = i.BELNR
AND v.GJAHR = i.GJAHR
WHERE [VBKPF parked status predicate]
UNION ALL
SELECT i.InvoiceNumber, 'Invoice Posted', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i
UNION ALL
SELECT i.InvoiceNumber, 'Payment Block Applied', TO_TIMESTAMP(c.UDATE || LPAD(COALESCE(c.UTIME, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, c.VALUE_NEW, c.USERNAME, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN change_events c ON c.OBJECTID = i.BELNR AND c.FNAME = 'ZLSPR' AND COALESCE(c.VALUE_OLD, '') = '' AND COALESCE(c.VALUE_NEW, '') <> ''
UNION ALL
SELECT i.InvoiceNumber, 'Price Variance Detected', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.ZLSPR = 'R'
UNION ALL
SELECT i.InvoiceNumber, 'Quantity Variance Detected', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.ZLSPR = 'M'
UNION ALL
SELECT i.InvoiceNumber, 'Payment Terms Changed', TO_TIMESTAMP(c.UDATE || LPAD(COALESCE(c.UTIME, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, c.VALUE_NEW, i.ZLSPR, c.USERNAME, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN change_events c ON c.OBJECTID = i.BELNR AND c.FNAME = 'ZTERM'
UNION ALL
SELECT i.InvoiceNumber, 'Payment Block Removed', TO_TIMESTAMP(c.UDATE || LPAD(COALESCE(c.UTIME, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, c.VALUE_OLD, c.USERNAME, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN change_events c ON c.OBJECTID = i.BELNR AND c.FNAME = 'ZLSPR' AND COALESCE(c.VALUE_OLD, '') <> '' AND COALESCE(c.VALUE_NEW, '') = ''
UNION ALL
SELECT i.InvoiceNumber, 'Invoice Due', TO_TIMESTAMP(TO_VARCHAR(i.NetDueDate, 'YYYYMMDD') || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.NetDueDate IS NOT NULL
UNION ALL
SELECT i.InvoiceNumber, 'Cash Discount Lost', TO_TIMESTAMP(TO_VARCHAR(CASE WHEN i.DiscountDueDate1 <= i.DiscountDueDate2 THEN i.DiscountDueDate1 ELSE i.DiscountDueDate2 END, 'YYYYMMDD') || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.AUGDT IS NULL OR i.AUGDT > CASE WHEN i.DiscountDueDate1 <= i.DiscountDueDate2 THEN i.DiscountDueDate1 ELSE i.DiscountDueDate2 END
UNION ALL
SELECT i.InvoiceNumber, 'Payment Proposal Created', TO_TIMESTAMP(r.RunDate || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN regup_events u ON u.BUKRS = i.BUKRS AND u.BELNR = i.BELNR AND u.GJAHR = i.GJAHR AND u.BUZEI = i.BUZEI INNER JOIN reguh_events r ON r.MANDT = u.MANDT AND r.LAUFD = u.LAUFD AND r.LAUFI = u.LAUFI AND r.LIFNR = u.LIFNR WHERE [Payment proposal status predicate]
UNION ALL
SELECT i.InvoiceNumber, 'Payment Run Executed', TO_TIMESTAMP(r.RunDate || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN regup_events u ON u.BUKRS = i.BUKRS AND u.BELNR = i.BELNR AND u.GJAHR = i.GJAHR AND u.BUZEI = i.BUZEI INNER JOIN reguh_events r ON r.MANDT = u.MANDT AND r.LAUFD = u.LAUFD AND r.LAUFI = u.LAUFI AND r.LIFNR = u.LIFNR WHERE [Payment run executed status predicate]
UNION ALL
SELECT i.InvoiceNumber, 'Payment Document Created', TO_TIMESTAMP(p.CPUDT || LPAD(COALESCE(p.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, p.BLART, i.ZTERM, i.ZLSPR, p.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN [Your SAP HANA schema].BKPF p ON p.MANDT = i.MANDT AND p.BUKRS = i.BUKRS AND p.BELNR = i.AUGBL AND p.GJAHR = i.GJAHR WHERE p.BLART IN ('ZP', 'KZ')
UNION ALL
SELECT i.InvoiceNumber, 'Payment Cleared', TO_TIMESTAMP(i.AUGDT || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.AUGDT IS NOT NULL
UNION ALL
SELECT i.InvoiceNumber, 'Invoice Reversed', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.STBLG IS NOT NULL AND i.STBLG <> ''
)
SELECT
InvoiceNumber,
Activity,
EventTime,
SourceSystem,
LastDataUpdate,
VendorNumber,
CompanyCode,
InvoiceAmount,
DocumentType,
PaymentTerms,
PaymentBlockReason,
UserName,
ClearingDate,
NetDueDate,
IsLatePayment,
IsTouchless
FROM events
WHERE EventTime IS NOT NULL
ORDER BY InvoiceNumber, EventTime, Activity; È pronto a iniziare?
Trasformi i dati finanziari in informazioni utili e inizi subito a ottimizzare i cicli di pagamento. Il nostro team è a Sua disposizione in ogni fase del percorso di Process Mining.
Ottimizzi la gestione dei pagamenti ai fornitori in SAP S/4HANA
Elimini i colli di bottiglia e riduca del 30% il tempo di ciclo.
Non è richiesta la carta di credito. Configurazione in 5 minuti.