Je datatemplate voor crediteurenbeheer en betalingsverwerking
Je datatemplate voor crediteurenbeheer en betalingsverwerking
- Kern-attributen voor leveranciers- en betalingsanalyse
- Essentiële stappen in het proces voor de betalingscyclus
- Gespecialiseerde extractielogica voor SAP S/4HANA-systemen
Attributen voor de verwerking van crediteurenfacturen
| Naam | Beschrijving | ||
|---|---|---|---|
| Activiteit Activity | De specifieke taak of gebeurtenissentatuswijziging geregistreerd voor de factuur. | ||
| Beschrijving Dit attribuut vertegenwoordigt de afzonderlijke processtappen die plaatsvinden tijdens de levenscyclus van de factuur. Het registreert gebeurtenissen 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 belangrijk voor het mappen van de processtroom variant. Het stelt de process mining engine in staat de volgorde van stappen te visualiseren, herstelwerk-loops te vinden en te bepalen waar het proces afwijkt van het standaard 'happy path'. Het is de basiscomponent van de event log. Waarom het belangrijk is Het definieert de stappen in de proceskaart, waardoor de visualisatie van de workflow en knelpunten mogelijk is. Waar te verkrijgen Afgeleid van Transactiecodes (TCODE) of Wijzigingsdocumentheader (CDHDR) en Item (CDPOS) Voorbeelden Factuur geboektBetalingsblokkade ToegepastBetalingsrun UitgevoerdFactuur afgeletterd | |||
| Factuurnummer InvoiceNumber | De unieke kenmerk voor de crediteurenfactuur die wordt verwerkt. | ||
| Beschrijving Het Factuurnummer is de primary key 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 gebeurtenissen op basis van deze kenmerk stelt analysesten in staat de volledige end-to-end geschiedenis van elke betalingsverplichting te reconstrueren. Waarom het belangrijk is Het fungeert als de definitieve Case-ID, waarmee het betalingsproces van begin tot eind gereconstrueerd kan worden. Waar te verkrijgen SAP Tabel BKPF (Boekingsdocument Header) veld BELNR of ACDOCA veld BELNR Voorbeelden 1900000523510000289119000006015100003002 | |||
| TijdsTip Gebeurtenis EventTime | De exacte timestamp wanneer de activiteit plaatsvond. | ||
| Beschrijving De Eventtijd registreert de specifieke datum en tijd wanneer een activiteit in de SAP-database is vastgelegd. Het biedt de tijdlijn die nodig is om gebeurtenissen volgordeel 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 belangrijk 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 belangrijk is voor het vinden van knelpunten en het beoordelen van KPI-prestaties zoals Gemiddelde Factuurgoedkeuringstijd. Waarom het belangrijk is Het biedt de chronologische volgorde van gebeurtenissen en vormt de basis voor alle tijdsgebonden prestatieberekeningen. Waar te verkrijgen 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 kenmerk van de SAP S/4HANA-instantie waar de data vandaan kwam. | ||
| Beschrijving Dit attribuut identificeert de specifieke ERP-installatie of -client waaruit de procesdata is opgehaald. In omgevingen met meerdere SAP-instanties of legacysystemen 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 analysesten data te scheiden bij het benchmarken van prestaties tussen verschillende regionale systeeminstallaties of bij het bevestigen van dataconsistentie tijdens systeemmigratieprojecten. Het zorgt ervoor dat procesvariaties die zijn toe te schrijven aan systeemconfiguratie correct worden gecontextualiseerd. Waarom het belangrijk is Het onderscheidt databronnen in omgevingen met meerdere systemen, wat zorgt voor nauwkeurige segmentatie. Waar te verkrijgen Systeem-ID (SY-SYSID) uit de SAP-installatiecontext Voorbeelden SAP_PROD_01S4H_NA_100ERP_EU_200 | |||
| Tijdstip van extractie LastDataUpdate | De timestamp die aangeeft wanneer het record voor het laatst is opgehaald of vernieuwd. | ||
| Beschrijving 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 relevantie van de dataset zelf. Dit is belangrijk 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 realtime 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. Waarom het belangrijk is Het Informapakketmeert gebruikers over de relevantie van data, belangrijk voor operationele dashboards. Waar te verkrijgen Gegenereerd door het ETL- / extractieproces Voorbeelden 2023-10-27T23:59:59.000Z2023-11-01T06:00:00.000Z | |||
| Bedrijfscode CompanyCode | De onderdeel waarvoor de balans en winst- en verliesrekening worden opgesteld. | ||
| Beschrijving De Bedrijfscode vertegenwoordigt de onafhankelijke boekhoudkundige entiteit binnen de onderneming. Het is de centrale onderdeel 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 vinden of een specifieke vestiging een hoger percentage handmatige betalingsblokkades heeft vergeleken met de bedrijfsstandaard. Waarom het belangrijk is Het segmenteert het proces per juridische entiteit, wat interne benchmarking vergemakkelijkt. Waar te verkrijgen 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. | ||
| Beschrijving 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 indicator gebruikt om het aantal niet-conforme 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. Waarom het belangrijk is Het vereenvoudigt de berekening van 'on-time prestaties'-KPI's. Waar te verkrijgen Calculated: Vereffeningsdatum > Netto vervaldatum Voorbeelden truefalse | |||
| Betalingstermijnen PaymentTerms | De sleutel die de overeengekomen voorwaarden voor betaling en kortingen vertegenwoordigt. | ||
| Beschrijving 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 belangrijk 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 vinden of de betaling binnen het optimale venster is gedaan om besparingen te realiseren. Waarom het belangrijk is Het bepaalt de verwachte tijdslijn en financiële prikkels, belangrijk voor kortingsanalyse. Waar te verkrijgen SAP Tabel BSEG veld ZTERM Voorbeelden Z001NT300001 | |||
| Documenttype DocumentType | Classificeert het boekhoudkundig document (bijv. crediteurenfactuur, betaling, creditnota). | ||
| Beschrijving 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 analysest zou bijvoorbeeld creditnota's willen uitsluiten om zich uitsluitend te richten op de efficiëntie van uitgaande betalingen. Het helpt ook bij het vinden van de mix van verwerkte transactietypen en ondersteunt het Process Variant Complexity dashboard. Waarom het belangrijk is Het categoriseert de case (factuur versus creditnota), wat gefilterde analyse mogelijk maakt. Waar te verkrijgen SAP Tabel BKPF veld BLART Voorbeelden KRREKZKG | |||
| Factuurbedrag InvoiceAmount | Het totale brutobedrag van de factuur in de documentvaluta. | ||
| Beschrijving 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 Bedrag in Document Valuta. In de analyse wordt het Invoice Bedrag 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 hoogwaardige, waar procesfouten een groter financieel risico met zich meebrengen. Waarom het belangrijk is Het geeft het financiële gewicht van de case aan, belangrijk voor het prioriteren van procesinefficiënties met hoogwaardige. Waar te verkrijgen 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. | ||
| Beschrijving 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 analysesten 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. Waarom het belangrijk is Het onderscheidt handmatig en geautomatiseerd werk, wat de berekening van automatiseringspercentages mogelijk maakt. Waar te verkrijgen 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. | ||
| Beschrijving Dit attribuut wordt berekend door de gebeurtenis 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 kernmetriek voor de Touchless Invoice Rate KPI. Het stelt de organisatie in staat het succes van automatiseringsinitiatieven te volgen en te vinden welke case types (bijv. per Leverancier of Regio) succesvol door het systeem stromen zonder menselijke tussenkomst. Waarom het belangrijk is Het is de primaire maatstaf voor procesautomatisering en efficiëntie. Waar te verkrijgen Berekend op basis van de volgorde van activiteiten en gebruikerstypen Voorbeelden truefalse | |||
| Leveranciersnummer VendorNumber | De unieke kenmerk voor de leverancier gekoppeld aan de factuur. | ||
| Beschrijving 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 belangrijk voor het dashboard voor de Compliance van Leveranciersbetalingstermijnen. Het stelt analysesten in staat procesprestaties per leverancier te aggregeren, door specifieke leveranciers te vinden die consequent blokkades, prijsverschillen of vertragingen veroorzaken. Het ondersteunt strategische inkoopbeslissingen en leveranciersrelatiebeheer. Waarom het belangrijk is Het maakt prestatie-aggregatie per leverancier mogelijk, belangrijk voor het vinden van hoofdoorzaken van vertragingen. Waar te verkrijgen 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. | ||
| Beschrijving 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 metriek 'Dagen Te Laat Betaald', wat helpt de efficiëntie van het crediteurenteam en het risico op leverancierswrijving te kwantificeren. Waarom het belangrijk is Het is de streefdatum voor het proces; het missen ervan beïnvloedt de kredietwaardigheid en brengt kosten met zich mee. Waar te verkrijgen Calculated: 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. | ||
| Beschrijving 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. Waarom het belangrijk is Het identificeert de specifieke oorzaak van procesonderbrekingen, waardoor gerichte hoofdoorzaakanalyse mogelijk is. Waar te verkrijgen SAP Tabel BSEG veld ZLSPR Voorbeelden ABR* | |||
| Valutadatum ClearingDate | De datum waarop de factuur is vereffend door betaling. | ||
| Beschrijving 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. Waarom het belangrijk is Het markeert de voltooiing van het betaalproces en wordt gebruikt om de tijdigheid van betalingen te bepalen. Waar te verkrijgen SAP Tabel BSEG of AUGDT veld AUGDT Voorbeelden 2023-11-012023-11-15 | |||
| Boekjaar FiscalYear | Het boekjaar waartoe de factuur behoort. | ||
| Beschrijving Het Boekjaar is een periode die wordt gebruikt voor financiële rapportage. Samen met Bedrijfscode en Documentnummer vormt het de samengestelde primary key voor een financieel document in SAP. Bij analyse is dit een technische noodzaak voor het uniek vinden 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. Waarom het belangrijk is Technische vereiste voor unieke case-identificatie in SAP FI. Waar te verkrijgen SAP Tabel BKPF veld GJAHR Voorbeelden 20232024 | |||
| Contantkortingsdagen 1 CashDiscountDays1 | Het aantal dagen vanaf de basisdatum waarbinnen de eerste contante korting beschikbaar is. | ||
| Beschrijving 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. Waarom het belangrijk is Het definieert het potentieel voor financiële besparingen. Waar te verkrijgen SAP Tabel BSEG veld ZBD1T Voorbeelden 10140 | |||
| Contantkortingspercentage 1 CashDiscountPercentage1 | Het percentage korting beschikbaar indien betaald binnen de eerste kortingstermijn. | ||
| Beschrijving 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 Bedrag, kunnen de dashboards de totale gemiste besparingen visualiseren als gevolg van procesinefficiënties, wat de business case voor automatisering ondersteunt. Waarom het belangrijk is Het kwantificeert de potentiële besparingsgraad, belangrijk voor ROI-berekeningen. Waar te verkrijgen SAP Tabel BSEG veld ZBD1P Voorbeelden 2.03.00.0 | |||
| Inkoopdocument PurchasingDocument | Het Inkoopordernummer gekoppeld aan de factuur. | ||
| Beschrijving 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 belangrijk voor de Three Way Match Rate Analysis. Het stelt analysesten in staat facturen met een PO te scheiden van facturen zonder PO, die doorgaans heel verschillende goedkeuringsworkflows hebben. Het mogelijk maakt ook end-to-end process mining door crediteurendata te koppelen aan inkoopdata. Waarom het belangrijk is Het koppelt crediteurenbeheer aan inkoop, wat 3-wegs matching analyse en procesuitbreiding mogelijk maakt. Waar te verkrijgen SAP Tabel BSEG veld EBELN Voorbeelden 45000012344500009876 | |||
| Misgelopen kortingsbedrag DiscountLostAmount | De financiële waarde van contante kortingen die beschikbaar waren maar niet zijn benut. | ||
| Beschrijving 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 metriek 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. Waarom het belangrijk is Het kwantificeert het directe financiële verlies als gevolg van procesvertragingen. Waar te verkrijgen Calculated: Als vereffeningsdatum > kortingsdatum, dan factuurbedrag * kortingspercentage Voorbeelden 30.000.00150.00 | |||
| Referentiedatum BaselineDate | De datum vanaf welke betalingstermijnen van toepassing zijn en vervaldatums worden berekend. | ||
| Beschrijving 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. Waarom het belangrijk is Het is het ankerpunt voor alle berekeningen van vervaldata. Waar te verkrijgen SAP Tabel BSEG veld ZFBDT Voorbeelden 2023-10-012023-10-15 | |||
| Valuta Currency | De valutacode gekoppeld aan het factuurbedrag. | ||
| Beschrijving 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 belangrijk 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 meetwaarden zoals Totale Uitgaven of Gemiddelde Factuurwaarde betekenisloos zijn in een multi-currency-omgeving. Waarom het belangrijk is Het biedt context voor financiële bedragen, belangrijk voor nauwkeurige wereldwijde rapportage. Waar te verkrijgen SAP Tabel BKPF veld WAERS Voorbeelden USDEURGBPJPY | |||
Activiteiten voor de verwerking van crediteurenfacturen
| Activiteit | Beschrijving | ||
|---|---|---|---|
| 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). | ||
| Waarom het belangrijk is De financiële realisatie van de betaling, gebruikt om Days Payable Outstanding (DPO) te berekenen. Waar te verkrijgen 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. | ||
| Waarom het belangrijk is 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. Waar te verkrijgen 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. | ||
| Waarom het belangrijk is Blokkeren is de voornaamste oorzaak van te late betalingen en procesinefficiëntie, met directe gevolgen voor het dashboard voor handmatige betalingsblokkade-analyse. Waar te verkrijgen 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. | ||
| Waarom het belangrijk is Dient vaak als een proxy voor 'Factuur Goedgekeurd' in systemen zonder expliciete workflow-logs, wat het einde van de knelpuntperiode markeert. Waar te verkrijgen 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. | ||
| Waarom het belangrijk is De operationele betaalverplichting, belangrijk voor het analyseren van de efficiëntie van het betalingsbatchproces. Waar te verkrijgen 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. | ||
| Waarom het belangrijk is Dit is het belangrijkste startpunt voor de financiële tijdlijn, waarmee de basislijn wordt vastgesteld voor vervaldata en ouderdomsanalyse. Waar te verkrijgen 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. | ||
| Waarom het belangrijk is Frequente wijzigingen duiden op stamdatafouten of handmatige aanpassingen die de cashflowprognoses en de naleving van leveranciersbetalingstermijnen beïnvloeden. Waar te verkrijgen 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. | ||
| Waarom het belangrijk is Geeft aan dat de factuur is geselecteerd voor betaling en de validatiecontroles binnen het betaalprogramma heeft doorstaan. Waar te verkrijgen 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 vinden met een 'geparkeerde' statuscode voordat ze overgaan naar 'geboekt'. | ||
| Waarom het belangrijk is Parkeren markeert het begin van de data-invoerfase en helpt de vertraging te meten tussen ontvangst en financiële verplichting. Waar te verkrijgen 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. | ||
| Waarom het belangrijk is Vertegenwoordigt herstelwerk en procesfouten, en identificeert verspilling en mogelijke dubbele inspanning. Waar te verkrijgen 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. | ||
| Waarom het belangrijk is Dient als referentiepunt voor de On-Time Payment Performance en Late Payment Penalty Tracker. Waar te verkrijgen Calculated: 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 gebeurtenis die de datum aangeeft waarop de voorwaarde voor contantkorting is verlopen. Afgeleid door de kortingsvervaldatum te vergelijken met de huidige datum of betalingsdatum. | ||
| Waarom het belangrijk is Essentieel voor de Early Payment Discount Optimizer om gemiste financiële kansen te visualiseren. Waar te verkrijgen Calculated: 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. | ||
| Waarom het belangrijk is Belangrijk voor het analyseren van matchingsefficiëntie en de datakwaliteit van de toeleveringsketen. Waar te verkrijgen 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. | ||
| Waarom het belangrijk is Identificeert de hoofdoorzaken van handmatig rework en ondersteunt de analyse van de drie-wegs matchingsratio. Waar te verkrijgen Afgeleid uit BSEG-ZLSPR waarde 'R' (of systeemspecifieke configuratie voor prijsblokkeringen) op het moment van boeken. Vastleggen Vergelijk ZLSPR-waarde met 'R' Gebeurtenistype inferred | |||
Extractiegidsen
Stappen
Verplichte CDS Views vinden: 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_LeverancierInvoice (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 belangrijk voor de prestaties bij het bevragen van de Operational Boekhouding 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 processen: 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 processen: Controleer de logica voor Invoice Due en Cash Discount Lost. Dit zijn berekende gebeurtenissen 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 tijdstempels 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 bronnen 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
Verplichte CDS Views vinden: 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_LeverancierInvoice (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 belangrijk voor de prestaties bij het bevragen van de Operational Boekhouding 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 processen: 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 processen: Controleer de logica voor Invoice Due en Cash Discount Lost. Dit zijn berekende gebeurtenissen 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 tijdstempels 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 bronnen 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