Uw data template voor crediteuren betalingsverwerking
Uw data template voor crediteuren betalingsverwerking
- Kern-attributes voor leveranciers- en betalingsanalyse
- Essentiële procesmijlpalen voor de betalingscyclus
- Gespecialiseerde extractielogica voor SAP S/4HANA-systemen
Attributes voor de verwerking van crediteurenfacturen
| Naam | Omschrijving | ||
|---|---|---|---|
| Activiteit Activity | De specifieke taak of eventstatuswijziging geregistreerd voor de factuur. | ||
| Omschrijving Dit attribuut vertegenwoordigt de afzonderlijke processtappen die plaatsvinden tijdens de levenscyclus van de factuur. Het registreert events zoals factuurcreatie, boeking, blokkering, goedkeuring en betalingsafwikkeling. De activity namen zijn afgeleid van transactiecodes, change log entries of workflow status updates die in het bronsysteem worden gevonden. Voor de analyse is dit veld cruciaal voor het mappen van de procesflow variant. Het stelt de process mining engine in staat de sequentie van stappen te visualiseren, rework loops te identificeren en te bepalen waar het proces afwijkt van het standaard 'happy path'. Het is de kerncomponent van de event log. Het belang Het definieert de knooppunten in de proceskaart, waardoor de visualisatie van de workflow en knelpunten mogelijk is. Vindplaats Afgeleid van Transactiecodes (TCODE) of Wijzigingsdocumentheader (CDHDR) en Item (CDPOS) Voorbeelden Factuur geboektBetalingsblokkade ToegepastBetalingsrun UitgevoerdFactuur afgeletterd | |||
| Factuurnummer InvoiceNumber | De unieke identifier voor de crediteurenfactuur die wordt verwerkt. | ||
| Omschrijving Het Factuurnummer is de primaire sleutel voor het volgen van de levenscyclus van een te betalen post binnen het SAP S/4HANA-systeem. Het verwijst specifiek naar het boekhoudkundige documentnummer dat wordt gegenereerd bij het boeken van de factuur naar het grootboek. In standaard SAP-terminologie komt dit overeen met het Documentnummer (BELNR) dat te vinden is binnen een specifieke Bedrijfscode en Boekjaar. In procesanalyse dient dit attribuut als de Case ID. Het koppelt alle verschillende activiteiten – van de initiële ontvangst en parkering van de factuur, via diverse goedkeuringsblokkades en wijzigingen, naar de uiteindelijke vereffeningsbetaling. Het groeperen van events op basis van deze identifier stelt analisten in staat de volledige end-to-end geschiedenis van elke betalingsverplichting te reconstrueren. Het belang Het fungeert als de definitieve Case ID, waarmee het betalingsproces van begin tot eind gereconstrueerd kan worden. Vindplaats SAP Tabel BKPF (Boekingsdocument Header) veld BELNR of ACDOCA veld BELNR Voorbeelden 1900000523510000289119000006015100003002 | |||
| Tijdstip Gebeurtenis EventTime | De exacte timestamp wanneer de activiteit plaatsvond. | ||
| Omschrijving De Eventtijd registreert de specifieke datum en tijd wanneer een activiteit in de SAP-database is vastgelegd. Het biedt de temporele dimensie die nodig is om events sequentieel binnen een case te ordenen. Deze timestamp wordt meestal geconstrueerd door de combinatie van de velden CPU Date en CPU Time uit de systeemlogs of documentheaders. Bij analyse is dit attribuut essentieel voor het berekenen van doorlooptijden, duur en doorvoer. Het maakt het meten van tijdsverschillen tussen stappen mogelijk, zoals de tijd tussen factuurontvangst en definitieve goedkeuring, wat cruciaal is voor het identificeren van knelpunten en het beoordelen van KPI-prestaties zoals Gemiddelde Factuurgoedkeuringstijd. Het belang Het biedt de chronologische volgorde van gebeurtenissen en vormt de basis voor alle tijdsgebonden prestatieberekeningen. Vindplaats SAP-tabel BKPF veld CPUDT (Invoerdatum) en CPUTM (Invoertijd), of CDHDR-velden UDATE en UTIME Voorbeelden 2023-10-12T08:30:00.000Z2023-10-12T14:15:22.000Z2023-10-15T09:00:00.000Z | |||
| Bronsysteem SourceSystem | De identifier van de SAP S/4HANA-instantie waar de data vandaan kwam. | ||
| Omschrijving Dit attribuut identificeert de specifieke ERP-installatie of -client waaruit de procesdata is geëxtraheerd. In omgevingen met meerdere SAP-instances of legacy systemen die parallel draaien, zorgt dit veld ervoor dat de data lineage wordt gehandhaafd en maakt het vergelijkingen tussen systemen mogelijk. Voor de analyse fungeert dit veld als een high-level filter. Het helpt analisten data te scheiden bij het benchmarken van prestaties tussen verschillende regionale systeeminstallaties of bij het valideren van dataconsistentie tijdens systeemmigratieprojecten. Het zorgt ervoor dat procesvariaties die zijn toe te schrijven aan systeemconfiguratie correct worden gecontextualiseerd. Het belang Het onderscheidt databronnen in omgevingen met meerdere systemen, wat zorgt voor nauwkeurige segmentatie. Vindplaats Systeem-ID (SY-SYSID) uit de SAP-installatiecontext Voorbeelden SAP_PROD_01S4H_NA_100ERP_EU_200 | |||
| Laatste data-update LastDataUpdate | De timestamp die aangeeft wanneer het record voor het laatst is geëxtraheerd of vernieuwd. | ||
| Omschrijving Last Data Update geeft het moment aan waarop de data succesvol is geladen in het process mining platform. Het weerspiegelt niet het tijdstip van de bedrijfstransactie, maar eerder de actualiteit van de dataset zelf. Dit is cruciaal voor het behouden van vertrouwen in de analytics dashboards. Bij analyse helpt dit attribuut gebruikers te begrijpen hoe actueel de informatie is die zij bekijken. Het is met name belangrijk bij het monitoren van dashboards die bijna real-time zijn, zoals de Payment Block Analysis, om ervoor te zorgen dat beslissingen worden genomen op basis van de meest recente status van het SAP S/4HANA systeem. Het belang Het informeert gebruikers over de actualiteit van data, cruciaal voor operationele dashboards. Vindplaats Gegenereerd door het ETL- / extractieproces Voorbeelden 2023-10-27T23:59:59.000Z2023-11-01T06:00:00.000Z | |||
| Bedrijfscode CompanyCode | De organisatorische eenheid waarvoor de balans en winst- en verliesrekening worden opgesteld. | ||
| Omschrijving De Bedrijfscode vertegenwoordigt de onafhankelijke boekhoudkundige entiteit binnen de onderneming. Het is de centrale organisatorische eenheid in de externe verslaglegging en wordt gebruikt om de financiële data te structureren. Elke factuur wordt aan precies één Bedrijfscode toegewezen. Bij analyse maakt dit attribuut de segmentatie van KPI's per juridische entiteit of regio mogelijk. Het wordt gebruikt in dashboards om de efficiëntie van crediteurenteams over verschillende dochterondernemingen heen te vergelijken. Het helpt bijvoorbeeld te identificeren of een specifieke vestiging een hoger percentage handmatige betalingsblokkades heeft vergeleken met de bedrijfsstandaard. Het belang Het segmenteert het proces per juridische entiteit, wat interne benchmarking vergemakkelijkt. Vindplaats SAP Tabel BKPF veld BUKRS Voorbeelden US01DE1010002000 | |||
| Betaling te laat IsLatePayment | Een booleaanse vlag die aangeeft of de betaling na de uiterste betaaldatum is verricht. | ||
| Omschrijving Dit berekende attribuut is 'true' als de Clearing Date strikt groter is dan de Net Due Date. Het dient als een binaire classifier voor procesprestaties. In de analyse wordt deze flag gebruikt om het aantal niet-compliante cases te tellen voor de Late Payment Penalty Frequency KPI. Het vereenvoudigt de dashboardcreatie door een eenvoudige telling van 'True' waarden toe te staan, in plaats van complexe datumfuncties in de visualisatielaag te vereisen. Het belang Het vereenvoudigt de berekening van 'on-time performance'-KPI's. Vindplaats Berekend: Vereffeningsdatum > Netto vervaldatum Voorbeelden truefalse | |||
| Betalingstermijnen PaymentTerms | De sleutel die de overeengekomen voorwaarden voor betaling en kortingen vertegenwoordigt. | ||
| Omschrijving Betalingstermijnen definiëren wanneer een factuur verschuldigd is en of er contantkortingen van toepassing zijn voor vroegtijdige betaling. Deze code (bijv. 'Z001') verwijst naar regels zoals 'Net 30' of '2% 10, Net 30'. Het wordt gekopieerd van de Vendor Master naar de Factuur, maar kan handmatig worden gewijzigd. Bij analyse is dit attribuut cruciaal voor de Early Payment Discount Optimizer en de Vendor Payment Term Compliance dashboards. Het stelt het systeem in staat om de basisvervaldatum te berekenen en te identificeren of de betaling binnen het optimale venster is gedaan om besparingen te realiseren. Het belang Het bepaalt de verwachte tijdslijn en financiële prikkels, essentieel voor kortingsanalyse. Vindplaats SAP Tabel BSEG veld ZTERM Voorbeelden Z001NT300001 | |||
| Documenttype DocumentType | Classificeert het boekhoudkundig document (bijv. crediteurenfactuur, betaling, creditnota). | ||
| Omschrijving Het Documenttype is een tweeletterige code in SAP die de boekhoudkundige transactie classificeert. Veelvoorkomende typen zijn 'KR' voor Crediteurenfacturen, 'KZ' voor Crediteurenbetalingen en 'RE' voor Bruto Factuurontvangst. Het bepaalt de nummerreeks en veldstatus van het document. Bij analyse wordt dit attribuut gebruikt om de procesomvang te filteren. Een analist zou bijvoorbeeld creditnota's willen uitsluiten om zich uitsluitend te richten op de efficiëntie van uitgaande betalingen. Het helpt ook bij het identificeren van de mix van verwerkte transactietypen en ondersteunt het Process Variant Complexity dashboard. Het belang Het categoriseert de case (factuur versus creditnota), wat gefilterde analyse mogelijk maakt. Vindplaats SAP Tabel BKPF veld BLART Voorbeelden KRREKZKG | |||
| Factuurbedrag InvoiceAmount | Het totale brutobedrag van de factuur in de documentvaluta. | ||
| Omschrijving Dit attribuut weerspiegelt de financiële waarde van de factuur zoals vastgelegd in het brondocument. Het vertegenwoordigt de verplichting die met de leverancier moet worden vereffend. In SAP S/4HANA wordt dit doorgaans opgeslagen in het veld Amount in Document Currency. In de analyse wordt het Invoice Amount gebruikt om werk te prioriteren. Dashboards zoals Manual Touch Point Distribution gebruiken dit veld om te laten zien of arbeidsintensieve handmatige activiteiten worden verspild aan facturen met een lage waarde. Het stelt de organisatie in staat optimalisatie-inspanningen te richten op transacties met een hoge waarde, waar procesfouten een groter financieel risico met zich meebrengen. Het belang Het geeft het financiële gewicht van de case aan, essentieel voor het prioriteren van procesinefficiënties met hoge waarde. Vindplaats SAP Tabel BKPF of BSEG veld WRBTR Voorbeelden 1500.00250.5010000.00 | |||
| Gebruikersnaam UserName | De ID van de gebruiker die de specifieke activiteit heeft uitgevoerd. | ||
| Omschrijving De Gebruikersnaam legt de login ID vast van de persoon of systeemagent die verantwoordelijk is voor het uitvoeren van een processtap. Dit kan een handmatige gebruiker zijn die data invoert of een achtergrondtaak ID (bijv. 'BATCH_USER') die geautomatiseerde taken uitvoert. Bij analyse maakt dit attribuut de berekening van de Automatisering van Activiteiten mogelijk. Door onderscheid te maken tussen menselijke gebruikers en systeemaccounts, kunnen analisten de automatiseringsgraad in het proces meten. Het wordt ook gebruikt in het dashboard voor de Verdeling van Handmatige Contactpunten om de werkdruk over teams te beoordelen. Het belang Het onderscheidt handmatig en geautomatiseerd werk, wat de berekening van automatiseringspercentages mogelijk maakt. Vindplaats SAP Tabel BKPF veld USNAM of CDHDR veld USERNAME Voorbeelden BSMITHWF-BATCHRJONES | |||
| Is touchless IsTouchless | Een booleaanse vlag die aangeeft of de factuur is verwerkt zonder handmatige tussenkomst. | ||
| Omschrijving Dit attribuut wordt berekend door de event stream van een case te analyseren. Als de case alleen geautomatiseerde activiteiten (bijv. 'systeem' gebruiker, specifieke achtergrond TCODES) bevat en geen handmatige wijzigingen of blokkeringen, wordt deze gemarkeerd als touchless. In de analyse is dit de kernmetric voor de Touchless Invoice Rate KPI. Het stelt de organisatie in staat het succes van automatiseringsinitiatieven te volgen en te identificeren welke case types (bijv. per Leverancier of Regio) succesvol door het systeem stromen zonder menselijke tussenkomst. Het belang Het is de primaire maatstaf voor procesautomatisering en efficiëntie. Vindplaats Berekend op basis van de volgorde van activiteiten en gebruikerstypen Voorbeelden truefalse | |||
| Leveranciersnummer VendorNumber | De unieke identifier voor de leverancier gekoppeld aan de factuur. | ||
| Omschrijving Het Crediteurnummer komt overeen met het specifieke crediteurenaccount in het SAP-subgrootboek. Het koppelt de factuur aan de stamdata die betalingstermijnen, bankgegevens en contactinformatie bevat. In S/4HANA is dit vaak gekoppeld aan het Business Partner-concept, maar behoudt het de legacy veldnaam LIFNR in veel tabellen. Bij analyse is dit attribuut fundamenteel voor het dashboard voor de Compliance van Leveranciersbetalingstermijnen. Het stelt analisten in staat procesprestaties per leverancier te aggregeren, door specifieke leveranciers te identificeren die consequent blokkades, prijsverschillen of vertragingen veroorzaken. Het ondersteunt strategische inkoopbeslissingen en leveranciersrelatiebeheer. Het belang Het maakt prestatie-aggregatie per leverancier mogelijk, cruciaal voor het identificeren van hoofdoorzaken van vertragingen. Vindplaats SAP Tabel BKPF veld LIFNR of ACDOCA veld LIFNR Voorbeelden 100050VEND-US-99200400 | |||
| Netto vervaldatum NetDueDate | De berekende datum waarop de factuur uiterlijk betaald moet zijn om boetes te voorkomen. | ||
| Omschrijving De Uiterste Betaaldatum is de uiteindelijke deadline voor betaling. Het wordt berekend door de maximale betalingstermijndagen toe te voegen aan de Basisdatum. Hoewel soms expliciet opgeslagen, is het vaak een berekend veld in analyseweergaven. Bij analyse is dit de primaire benchmark voor de Tracker voor Late Betalingen en Boetes. Het vergelijken van de daadwerkelijke Vereffeningsdatum met de Uiterste Betaaldatum genereert de metric 'Dagen Te Laat Betaald', wat helpt de efficiëntie van het crediteurenteam en het risico op leverancierswrijving te kwantificeren. Het belang Het is de streefdatum voor het proces; het missen ervan beïnvloedt de kredietwaardigheid en brengt kosten met zich mee. Vindplaats Berekend: Basisdatum + Max. aantal betalingstermijndagen (ZBD1T/ZBD2T/ZBD3T) Voorbeelden 2023-11-302023-12-01 | |||
| Reden betalingsblokkade PaymentBlockReason | De code die aangeeft waarom een factuur geblokkeerd is voor betaling. | ||
| Omschrijving Dit attribuut bevat de specifieke redencode die aan een factuur wordt toegekend en die voorkomt dat de automatische betaalrun deze oppakt. Voorbeelden zijn 'A' voor geblokkeerd voor betaling, 'R' voor factuurverificatie, of handmatige blokkeringen die door gebruikers zijn ingesteld. In de analyse is dit veld de primaire driver voor het Manual Payment Block Analysis dashboard. Door de frequentie van verschillende blokkeringsredenen te aggregeren, kan de organisatie systemische problemen diagnosticeren, zoals frequente prijsverschillen of ontbrekende goederenontvangsten, die het betaalproces vertragen. Het belang Het identificeert de specifieke oorzaak van procesonderbrekingen, waardoor gerichte hoofdoorzaakanalyse mogelijk is. Vindplaats SAP Tabel BSEG veld ZLSPR Voorbeelden ABR* | |||
| Valutadatum ClearingDate | De datum waarop de factuur is vereffend door betaling. | ||
| Omschrijving De Vereffeningsdatum registreert wanneer de openstaande post in de crediteurenadministratie werd vereffend, doorgaans via een betaalrun of een handmatige betalingsboeking. Dit markeert effectief het einde van de verplichting. Bij analyse wordt dit attribuut gebruikt om de uiteindelijke doorlooptijd van het proces te berekenen. Het is de timestamp die wordt gebruikt voor de activiteit 'Betaling Vereffend' en wordt vergeleken met de Uiterste Betaaldatum om de Tijdige Betalingsprestatie te bepalen. Het is een directe input voor het dashboard voor de efficiëntie van betalingsvereffening. Het belang Het markeert de voltooiing van het betaalproces en wordt gebruikt om de tijdigheid van betalingen te bepalen. Vindplaats SAP Tabel BSEG of AUGDT veld AUGDT Voorbeelden 2023-11-012023-11-15 | |||
| Basisdatum BaselineDate | De datum vanaf welke betalingstermijnen van toepassing zijn en vervaldatums worden berekend. | ||
| Omschrijving De Basisdatum is het startpunt voor het berekenen van de netto vervaldatum en de contantkortingsperioden. Dit is doorgaans de factuurdatum of de boekingsdatum, afhankelijk van de configuratie en leveranciersstamgegevens. In de analyse is deze datum een technische vereiste voor het berekenen van de status 'Is Te Laat'. Fouten in de basisdatum leiden vaak tot voortijdige betalingen (impact op de cashflow) of late betalingen (gevolgen van boetes). Het controleren van de nauwkeurigheid van deze datum is onderdeel van de analyse van de naleving van leveranciersbetalingsvoorwaarden. Het belang Het is het ankerpunt voor alle berekeningen van vervaldata. Vindplaats SAP Tabel BSEG veld ZFBDT Voorbeelden 2023-10-012023-10-15 | |||
| Boekjaar FiscalYear | Het boekjaar waartoe de factuur behoort. | ||
| Omschrijving Het Boekjaar is een periode die wordt gebruikt voor financiële rapportage. Samen met Bedrijfscode en Documentnummer vormt het de samengestelde primaire sleutel voor een financieel document in SAP. Bij analyse is dit een technische noodzaak voor het uniek identificeren van cases, maar het ondersteunt ook jaar-op-jaar rapportage. Het zorgt ervoor dat de 'Factuurnummer' Case ID uniek blijft over decennia aan data historie. Het belang Technische vereiste voor unieke case-identificatie in SAP FI. Vindplaats SAP Tabel BKPF veld GJAHR Voorbeelden 20232024 | |||
| Contantkortingsdagen 1 CashDiscountDays1 | Het aantal dagen vanaf de basisdatum waarbinnen de eerste contante korting beschikbaar is. | ||
| Omschrijving Dit attribuut definieert het tijdvenster voor de meest gunstige betalingsvoorwaarden (bijv. '10' in '2% 10, Netto 30'). Het is afkomstig van de voorwaarden die zijn opgeslagen in de factuurregel. In de analyse helpt dit bij het bepalen van de 'Target Date' voor de Early Payment Discount Optimizer. Als de factuur binnen dit venster wordt afgeboekt, wordt de korting gerealiseerd. Dit veld helpt bij het meten van de opportuniteitskosten van trage verwerkingscycli. Het belang Het definieert het potentieel voor financiële besparingen. Vindplaats SAP Tabel BSEG veld ZBD1T Voorbeelden 10140 | |||
| Contantkortingspercentage 1 CashDiscountPercentage1 | Het percentage korting beschikbaar indien betaald binnen de eerste kortingstermijn. | ||
| Omschrijving Dit attribuut vertegenwoordigt het financiële kortingspercentage dat door de leverancier wordt aangeboden voor vroegtijdige betaling (bijv. '2' in '2% 10'). In de analyse wordt dit gebruikt om de 'Potential Cash Discount' waarde te berekenen. Door dit percentage te vermenigvuldigen met het Invoice Amount, kunnen de dashboards de totale gemiste besparingen visualiseren als gevolg van procesinefficiënties, wat de business case voor automatisering ondersteunt. Het belang Het kwantificeert de potentiële besparingsgraad, essentieel voor ROI-berekeningen. Vindplaats SAP Tabel BSEG veld ZBD1P Voorbeelden 2.03.00.0 | |||
| Inkoopdocument PurchasingDocument | Het Inkoopordernummer gekoppeld aan de factuur. | ||
| Omschrijving Dit attribuut koppelt de factuur aan het stroomopwaartse inkoopproces. Het bevat het inkoopordernummer (PO-nummer) waarmee de factuur wordt gematcht. Niet alle facturen (bijv. diverse uitgaven) zullen een PO-referentie hebben. In de analyse is dit veld essentieel voor de Three Way Match Rate Analysis. Het stelt analisten in staat facturen met een PO te scheiden van facturen zonder PO, die doorgaans heel verschillende goedkeuringsworkflows hebben. Het faciliteert ook end-to-end process mining door crediteurendata te koppelen aan inkoopdata. Het belang Het koppelt crediteurenbeheer aan inkoop, wat 3-wegs matching analyse en procesuitbreiding mogelijk maakt. Vindplaats SAP Tabel BSEG veld EBELN Voorbeelden 45000012344500009876 | |||
| Misgelopen kortingsbedrag DiscountLostAmount | De monetaire waarde van contante kortingen die beschikbaar waren maar niet zijn benut. | ||
| Omschrijving Dit berekende attribuut vertegenwoordigt het 'geld dat is blijven liggen'. Het wordt afgeleid door te controleren of de betaling na de kortingstermijn is voldaan en, indien dit het geval is, de waarde van het gemiste kortingspercentage toegepast op het factuurbedrag te berekenen. In de analyse is dit een kritische financiële metric voor de Early Payment Discount Optimizer. Het kwantificeert de kosten van inefficiëntie in harde valuta, en biedt zo een overtuigende business case voor procesverbeteringen. Het belang Het kwantificeert het directe financiële verlies als gevolg van procesvertragingen. Vindplaats Berekend: Als vereffeningsdatum > kortingsdatum, dan factuurbedrag * kortingspercentage Voorbeelden 30.000.00150.00 | |||
| Valuta Currency | De valutacode gekoppeld aan het factuurbedrag. | ||
| Omschrijving Het Valuta-attribuut specificeert de valuta van het Factuurbedrag, zoals USD, EUR of GBP. Het maakt een correcte interpretatie van financiële waarden mogelijk en is essentieel bij het aggregeren van data over internationale bedrijfscodes heen. Bij analyse zorgt dit veld ervoor dat financiële KPI's correct worden berekend. Het wordt vaak gebruikt om waarden te normaliseren naar een rapportagevaluta voor globale dashboards. Zonder dit attribuut zouden geaggregeerde metrics zoals Totale Uitgaven of Gemiddelde Factuurwaarde betekenisloos zijn in een multi-currency-omgeving. Het belang Het biedt context voor financiële bedragen, essentieel voor nauwkeurige wereldwijde rapportage. Vindplaats SAP Tabel BKPF veld WAERS Voorbeelden USDEURGBPJPY | |||
Activiteiten voor de verwerking van crediteurenfacturen
| Activiteit | Omschrijving | ||
|---|---|---|---|
| Betaaldocument aangemaakt | De generatie van het boekhoudkundige document dat de bank crediteert en de leverancier debiteert. Dit is te vinden in BKPF met een betalingsdocumenttype (bijv. ZP, KZ). | ||
| Het belang De financiële realisatie van de betaling, gebruikt om Days Payable Outstanding (DPO) te berekenen. Vindplaats BKPF-tabel, gefilterd op Documenttype (BLART) specifiek voor betalingen. Vastleggen Vastgelegd wanneer BKPF-betaaldocument is aangemaakt Gebeurtenistype explicit | |||
| Betaling uitgevoerd | Markeert de definitieve reconciliatie waarbij de openstaande post op de leveranciersrekening wordt vereffend met de betaling. Vastgelegd uit het veld AUGDT (Vereffeningsdatum) in de BSEG-tabel. | ||
| Het belang De eindstatus van het proces, die aangeeft dat de levenscyclus is voltooid en de boeken in evenwicht zijn. Hoge handmatige vereffeningspercentages duiden op inefficiënties in de reconciliatie. Vindplaats BSEG-tabel, veld AUGDT (vereffeningsdatum). Vastleggen Vastgelegd wanneer het veld AUGDT is ingevuld Gebeurtenistype explicit | |||
| Betalingsblokkade Toegepast | Dit betekent dat er een betalingsblokkade is ingesteld op de factuurregel, waardoor deze niet wordt meegenomen in de betaalrun. Dit wordt vastgelegd door wijzigingen in het ZLSPR-veld in de BSEG-tabel te monitoren aan de hand van wijzigingsdocumenten. | ||
| Het belang Blokkeren is de voornaamste oorzaak van te late betalingen en procesinefficiëntie, met directe gevolgen voor het dashboard voor handmatige betalingsblokkade-analyse. Vindplaats CDPOS- en CDHDR-tabellen (wijzigingsdocumenten), op zoek naar updates van veld BSEG-ZLSPR. Vastleggen Vastgelegd wanneer CDPOS-records veranderen in ZLSPR Gebeurtenistype explicit | |||
| Betalingsblokkade Verwijderd | Geeft aan dat een eerder toegepaste betalingsblokkering is opgeheven, waardoor de factuur effectief wordt vrijgegeven voor betaling. Dit wordt geïdentificeerd wanneer het ZLSPR-veld in BSEG verandert van een waarde naar nul of leeg. | ||
| Het belang Dient vaak als een proxy voor 'Factuur Goedgekeurd' in systemen zonder expliciete workflow-logs, wat het einde van de knelpuntperiode markeert. Vindplaats CDPOS- en CDHDR-tabellen, op zoek naar BSEG-ZLSPR die leeg wordt. Vastleggen Vastgelegd bij verwijdering van ZLSPR uit CDPOS-records Gebeurtenistype explicit | |||
| Betalingsrun Uitgevoerd | Vertegenwoordigt de uitvoering van de betaalrun waarbij betalingsinstructies worden gegenereerd. Dit wordt bijgehouden aan de hand van de statusupdate in de REGUH- of REGUP-tabellen. | ||
| Het belang De operationele betaalverplichting, cruciaal voor het analyseren van de efficiëntie van het betalingsbatchproces. Vindplaats REGUH-tabel, doorgaans gerelateerd aan de uitvoerdatum en identificatie. Vastleggen Vastgelegd wanneer de status van de betaalrun wordt bijgewerkt Gebeurtenistype explicit | |||
| Factuur geboekt | Vertegenwoordigt de officiële vastlegging van de verplichting in het Grootboek. Deze activiteit is afgeleid van de aanmaaktimestamp in de BKPF-tabel of de invoerdatum in de ACDOCA-tabel. | ||
| Het belang Dit is het belangrijkste startpunt voor de financiële tijdlijn, waarmee de basislijn wordt vastgesteld voor vervaldata en ouderdomsanalyse. Vindplaats BKPF-tabel, waarbij CPUDT (ingangsdatum) en CPUTM (ingangstijd) worden gebruikt. Vastleggen Vastgelegd wanneer BKPF-record is aangemaakt Gebeurtenistype explicit | |||
| Betalingstermijnen gewijzigd | Registreert een update van de betalingsvoorwaarden op een openstaande factuur, wat de vervaldatum of het kortingsrecht wijzigt. Dit wordt bijgehouden in de wijzigingslogboeken van het ZTERM-veld in de BSEG-tabel. | ||
| Het belang Frequente wijzigingen duiden op stamdatafouten of handmatige aanpassingen die de cashflowprognoses en de naleving van leveranciersbetalingstermijnen beïnvloeden. Vindplaats CDPOS- en CDHDR-tabellen, op zoek naar updates van veld BSEG-ZTERM. Vastleggen Vastgelegd wanneer CDPOS-records veranderen in ZTERM Gebeurtenistype explicit | |||
| Betalingsvoorstel aangemaakt | Dit betekent dat de factuur is opgenomen in een betaalvoorstelrun (F110), de eerste stap van het geautomatiseerde betaalprogramma. Dit wordt vastgelegd in de REGUH-tabel die afwikkelingsgegevens opslaat. | ||
| Het belang Geeft aan dat de factuur is geselecteerd voor betaling en de validatiecontroles binnen het betaalprogramma heeft doorstaan. Vindplaats Aanmaaktimestamp van de REGUH-tabel (LAUFD- en LAUFI-sleutels). Vastleggen Vastgelegd wanneer REGUH-record is aangemaakt Gebeurtenistype explicit | |||
| Factuur geparkeerd | Geeft aan dat een factuur in SAP is ingevoerd, maar nog niet is geboekt in het Grootboek, vaak gebruikt voor voorlopige datainvoer. Dit wordt expliciet vastgelegd in de VBKPF-tabel of door documenten in BKPF te identificeren met een 'geparkeerde' statuscode voordat ze overgaan naar 'geboekt'. | ||
| Het belang Parkeren markeert het begin van de data-invoerfase en helpt de vertraging te meten tussen ontvangst en financiële verplichting. Vindplaats VBKPF tabel voor header data van geparkeerde documenten of BKPF met specifieke documentstatus (BSTAT = V). Vastleggen Vastgelegd wanneer VBKPF-boeking is aangemaakt Gebeurtenistype explicit | |||
| Factuur gestorneerd | Geeft aan dat het factuurdocument is geannuleerd of teruggedraaid. Vastgelegd door het STBLG-veld (Annuleringsdocument) in de BKPF-tabel te controleren. | ||
| Het belang Vertegenwoordigt herstelwerk en procesfouten, en identificeert verspilling en mogelijke dubbele inspanning. Vindplaats BKPF tabel, veld STBLG is niet leeg. Vastleggen Vastgelegd wanneer het veld STBLG is ingevuld Gebeurtenistype explicit | |||
| Factuur vervallen | Een berekende timestamp die het moment weergeeft waarop de factuur de uiterste betaaldatum heeft bereikt. Dit is afgeleid door het aantal dagen van de betalingsvoorwaarden op te tellen bij de basisdatum die in de BSEG-tabel te vinden is. | ||
| Het belang Dient als referentiepunt voor de On-Time Payment Performance en Late Payment Penalty Tracker. Vindplaats Berekend: BSEG-ZFBDT (basisdatum) + BSEG-ZBD1T/ZBD2T/ZBD3T (dagen). Vastleggen Afleiden door de huidige datum te vergelijken met de netto vervaldatum Gebeurtenistype calculated | |||
| Gemiste contantkorting | Een berekende event die de datum aangeeft waarop de voorwaarde voor contantkorting is verlopen. Afgeleid door de kortingsvervaldatum te vergelijken met de huidige datum of betalingsdatum. | ||
| Het belang Essentieel voor de Early Payment Discount Optimizer om gemiste financiële kansen te visualiseren. Vindplaats Berekend: BSEG-ZFBDT + BSEG-ZBD1T (kortingsdagen 1). Vastleggen Afleiden door de datum te vergelijken met de kortingsvervaldatum Gebeurtenistype calculated | |||
| Hoeveelheidsverschil Gedetecteerd | Afgeleide activiteit die een discrepantie aangeeft tussen de gefactureerde hoeveelheid en de ontvangen hoeveelheid. Dit wordt afgeleid door een specifieke Betalingsblokkeringssleutel (doorgaans 'M' voor Hoeveelheidsverschil) te observeren die op de regelpositie is toegepast. | ||
| Het belang Cruciaal voor het analyseren van matchingsefficiëntie en de datakwaliteit van de toeleveringsketen. Vindplaats Afgeleid uit BSEG-ZLSPR waarde 'M' (of systeemspecifieke configuratie voor kwantiteitsblokkeringen). Vastleggen Vergelijk ZLSPR-waarde met 'M' Gebeurtenistype inferred | |||
| Prijsverschil Gedetecteerd | Afgeleide activiteit die een mismatch aangeeft tussen de factuurprijs en de inkooporderprijs. Dit wordt afgeleid door een specifieke Betalingsblokkeringssleutel (doorgaans 'R' voor Factuurverificatie) te observeren die automatisch wordt toegepast bij het boeken. | ||
| Het belang Identificeert de hoofdoorzaken van handmatig herwerk en ondersteunt de analyse van de drie-wegs matchingsratio. Vindplaats Afgeleid uit BSEG-ZLSPR waarde 'R' (of systeemspecifieke configuratie voor prijsblokkeringen) op het moment van boeken. Vastleggen Vergelijk ZLSPR-waarde met 'R' Gebeurtenistype inferred | |||
Extractie Guides
Stappen
Vereiste CDS Views identificeren: Controleer of de standaard SAP S/4HANA CDS views beschikbaar zijn. De belangrijkste views die nodig zijn, zijn I_JournalEntry (Header), I_OperationalAcctgDocItem (Items/BSEG equivalent), I_SupplierInvoice (Logistics), I_PaymentProposalItem (F110) en I_ChangeDocument (voor logs).
Gebruikersrechten configureren: Zorg ervoor dat de databasegebruiker of technische servicegebruiker SELECT-rechten heeft op de DDL SQL views die gekoppeld zijn aan de CDS entiteiten. Dit wordt doorgaans beheerd via SAP HANA Studio of de ABAP Eclipse Development Tools (ADT).
De SQL-omgeving voorbereiden: Open uw SQL-interface (bijv. SAP HANA Studio, DBeaver verbonden met HANA, of een Process Mining connector die SQL accepteert). Deze methode gaat uit van directe SQL-toegang tot de HANA-laag waar CDS views beschikbaar zijn als views.
Bereik definiëren: Bepaal de Company Code en het bereik van het Boekjaar om het datavolume te beperken. Dit is cruciaal voor de prestaties bij het bevragen van de Operational Accounting Document Item view.
Activiteitenlogica implementeren: Kopieer de onderstaande SQL-query. Deze query gebruikt UNION ALL om 14 verschillende logische blokken te combineren tot één event log structuur. Elk blok richt zich op een specifieke activity (bijv. Factuur geboekt, Betaling afgehandeld).
Wijzigingsdocumenten verwerken: De query bevat secties voor wijzigingen in betalingsvoorwaarden en de manipulatie van blokkades. Deze zijn afhankelijk van de I_ChangeDocument view. Als deze view niet actief is in uw specifieke S/4-release, moet u mogelijk de onderliggende tabellen (CDHDR/CDPOS) in een custom CDS view 'wrappen'.
Berekende Events verwerken: Controleer de logica voor Invoice Due en Cash Discount Lost. Dit zijn berekende events die worden gegenereerd door dagen toe te voegen aan de basisdatum die in de operational item view te vinden is.
Extractie uitvoeren: Voer de query uit. Voor grote datasets wordt het sterk aanbevolen om de extractie te partitioneren per Boekjaar of Company Code om geheugenoverloop te voorkomen.
Datumformaten controleren: Zorg ervoor dat de EventTime-kolom is geformatteerd als YYYY-MM-DD HH:MM:SS. SAP HANA SQL retourneert timestamps die mogelijk gecast moeten worden, afhankelijk van uw doelapplicatie.
Data exporteren: Sla de resultaten op als een CSV- of Parquet-bestand. Zorg ervoor dat de headers overeenkomen met de kolommen die zijn gedefinieerd in de uiteindelijke SELECT-statement.
Transformeren voor upload: Als uw process mining tool een specifiek CSV-formaat vereist (bijv. specifieke datummaskering), pas dan deze transformaties toe in een post-processing script of binnen de SQL met behulp van TO_VARCHAR-functies.
Eindvalidatie: Laad een sample in ProcessMind en controleer of de Case ID (Factuurnummer) alle activiteiten van boeking tot afhandeling correct groepeert.
Configuratie
- Filter op bedrijfscode: Beperk de query tot specifieke organisatorische eenheden (CompanyCode = '1000') om context en prestaties te behouden.
- Datumbereik: Pas een filter toe op PostingDate of CreationDate (bijv. laatste 12 maanden) om het datavolume te beheren.
- Rekeningtype: Filter I_OperationalAcctgDocItem op FinancialAccountType = 'K' (Leverancier) om GL- en klantregels uit te sluiten.
- CDS View Activering: Zorg ervoor dat views I_JournalEntry, I_OperationalAcctgDocItem, en I_PaymentProposalItem actief en vrijgegeven zijn voor SQL-toegang.
- Prestaties wijzigingslog: Het bevragen van I_ChangeDocument kan veel resources vragen. Beperk deze sub-queries op ObjectClass 'BELEG' en specifieke veldnamen zoals ZLSPR en ZTERM.
a Voorbeeldquery 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 Stappen
Vereiste CDS Views identificeren: Controleer of de standaard SAP S/4HANA CDS views beschikbaar zijn. De belangrijkste views die nodig zijn, zijn I_JournalEntry (Header), I_OperationalAcctgDocItem (Items/BSEG equivalent), I_SupplierInvoice (Logistics), I_PaymentProposalItem (F110) en I_ChangeDocument (voor logs).
Gebruikersrechten configureren: Zorg ervoor dat de databasegebruiker of technische servicegebruiker SELECT-rechten heeft op de DDL SQL views die gekoppeld zijn aan de CDS entiteiten. Dit wordt doorgaans beheerd via SAP HANA Studio of de ABAP Eclipse Development Tools (ADT).
De SQL-omgeving voorbereiden: Open uw SQL-interface (bijv. SAP HANA Studio, DBeaver verbonden met HANA, of een Process Mining connector die SQL accepteert). Deze methode gaat uit van directe SQL-toegang tot de HANA-laag waar CDS views beschikbaar zijn als views.
Bereik definiëren: Bepaal de Company Code en het bereik van het Boekjaar om het datavolume te beperken. Dit is cruciaal voor de prestaties bij het bevragen van de Operational Accounting Document Item view.
Activiteitenlogica implementeren: Kopieer de onderstaande SQL-query. Deze query gebruikt UNION ALL om 14 verschillende logische blokken te combineren tot één event log structuur. Elk blok richt zich op een specifieke activity (bijv. Factuur geboekt, Betaling afgehandeld).
Wijzigingsdocumenten verwerken: De query bevat secties voor wijzigingen in betalingsvoorwaarden en de manipulatie van blokkades. Deze zijn afhankelijk van de I_ChangeDocument view. Als deze view niet actief is in uw specifieke S/4-release, moet u mogelijk de onderliggende tabellen (CDHDR/CDPOS) in een custom CDS view 'wrappen'.
Berekende Events verwerken: Controleer de logica voor Invoice Due en Cash Discount Lost. Dit zijn berekende events die worden gegenereerd door dagen toe te voegen aan de basisdatum die in de operational item view te vinden is.
Extractie uitvoeren: Voer de query uit. Voor grote datasets wordt het sterk aanbevolen om de extractie te partitioneren per Boekjaar of Company Code om geheugenoverloop te voorkomen.
Datumformaten controleren: Zorg ervoor dat de EventTime-kolom is geformatteerd als YYYY-MM-DD HH:MM:SS. SAP HANA SQL retourneert timestamps die mogelijk gecast moeten worden, afhankelijk van uw doelapplicatie.
Data exporteren: Sla de resultaten op als een CSV- of Parquet-bestand. Zorg ervoor dat de headers overeenkomen met de kolommen die zijn gedefinieerd in de uiteindelijke SELECT-statement.
Transformeren voor upload: Als uw process mining tool een specifiek CSV-formaat vereist (bijv. specifieke datummaskering), pas dan deze transformaties toe in een post-processing script of binnen de SQL met behulp van TO_VARCHAR-functies.
Eindvalidatie: Laad een sample in ProcessMind en controleer of de Case ID (Factuurnummer) alle activiteiten van boeking tot afhandeling correct groepeert.
Configuratie
- Filter op bedrijfscode: Beperk de query tot specifieke organisatorische eenheden (CompanyCode = '1000') om context en prestaties te behouden.
- Datumbereik: Pas een filter toe op PostingDate of CreationDate (bijv. laatste 12 maanden) om het datavolume te beheren.
- Rekeningtype: Filter I_OperationalAcctgDocItem op FinancialAccountType = 'K' (Leverancier) om GL- en klantregels uit te sluiten.
- CDS View Activering: Zorg ervoor dat views I_JournalEntry, I_OperationalAcctgDocItem, en I_PaymentProposalItem actief en vrijgegeven zijn voor SQL-toegang.
- Prestaties wijzigingslog: Het bevragen van I_ChangeDocument kan veel resources vragen. Beperk deze sub-queries op ObjectClass 'BELEG' en specifieke veldnamen zoals ZLSPR en ZTERM.
a Voorbeeldquery 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