Uw Purchase to Pay - Factuurverwerking Data Template
Uw Purchase to Pay - Factuurverwerking Data Template
- Aanbevolen attributen om vast te leggen
- Belangrijkste activiteiten om te volgen
- Extractiehandleiding voor SAP S/4HANA
Purchase to Pay - Factuurverwerkings-attributes
| Naam | Omschrijving | ||
|---|---|---|---|
| Factuurnummer InvoiceNumber | De unieke identificatiecode voor het factuurdocument van de leverancier, die dient als de primaire case identifier voor het proces. | ||
| Omschrijving Het Invoice Number is de unieke identificatiecode die aan elke leveranciersfactuur binnen SAP S/4HANA wordt toegewezen. Het koppelt alle gerelateerde activiteiten, zoals aanmaak, blokkering, goedkeuring en betaling, aan één enkele, samenhangende case. In process mining is dit attribuut fundamenteel voor het volgen van de end-to-end reis van elke factuur. Het maakt de reconstructie van de volledige procesflow mogelijk, van ontvangst tot uiteindelijke betaling, waardoor analyse van doorlooptijden, bottlenecks en procesvarianten op individueel factuurniveau mogelijk wordt. Het belang Het is de essentiële sleutel om alle gerelateerde events te verbinden, waardoor een volledige trace van de levenscyclus van een factuur door het systeem mogelijk wordt. Vindplaats Dit is het Accounting Document Number, te vinden in tabel BKPF, veld BELNR. Voorbeelden 190000000119000000451900000132 | |||
| Activiteitsnaam ActivityName | De naam van de bedrijfsactiviteit of het `event` dat op een specifiek tijdstip voor een factuur heeft plaatsgevonden. | ||
| Omschrijving De Activity Name beschrijft een specifieke stap of statuswijziging binnen de levenscyclus van de factuurverwerking. Voorbeelden hiervan zijn 'Invoice Document Created', 'Invoice Sent For Approval', 'Payment Block Set' en 'Payment Executed'. Dit attribuut is cruciaal voor het opbouwen van het procesmap, die de flow van activiteiten visueel weergeeft. Door de volgorde, frequentie en duur tussen deze activiteiten te analyseren, kunt u bottlenecks, rework loops en niet-conforme procesvarianten identificeren. Het vormt de basis van elke process mining analyse. Het belang Het definieert de stappen in het proces, wat de visualisatie van proceskaarten en de analyse van processtromen en variaties mogelijk maakt. Vindplaats Afgeleid van een combinatie van SAP-transactiecodes (SY-TCODE), statussen van wijzigingsdocumentobjecten (CDHDR/CDPOS) en specifieke veldwaarden die statuswijzigingen aangeven. Voorbeelden Factuur geparkeerdFactuur GoedgekeurdBetaling Uitgevoerd | |||
| Tijdstip Gebeurtenis EventTime | De exacte datum en tijd waarop de activiteit plaatsvond. | ||
| Omschrijving Event Time is de timestamp die precies vastlegt wanneer een specifieke activiteit plaatsvond. Deze data is essentieel voor het berekenen van duraties, doorlooptijden en wachttijden tussen verschillende stappen in het proces. In process mining-analyse worden accurate timestamps gebruikt om prestatie-KPI's zoals 'Gemiddelde Factuurdoorlooptijd' en 'Factuurgoedkeuringsdoorlooptijd' te meten. Door de verstreken tijd tussen activiteiten te analyseren, kunnen organisaties knelpunten opsporen waar facturen vertraagd worden en kansen identificeren voor procesversnelling. Het belang Deze timestamp is het fundament voor alle tijdsgebaseerde analyses, inclusief performance monitoring, bottleneck-identificatie en het volgen van SLA's. Vindplaats Meestal afkomstig uit de wijzigingsdocumenttabellen CDHDR (Header) en CDPOS (Item), via de velden UDATE en UTIME. Voor sommige events kan de informatie komen uit aanmaak- of invoerdata in tabellen zoals BKPF (CPUDT, CPUTM). Voorbeelden 2023-04-15T10:30:00Z2023-04-18T14:05:21Z2023-05-02T09:00:00Z | |||
| Bedrijfscode CompanyCode | De organisatorische eenheid die een juridisch onafhankelijk bedrijf vertegenwoordigt waarvoor financiële overzichten worden opgesteld. | ||
| Omschrijving De Company Code is een fundamentele organisatorische eenheid in SAP Finance. Elke factuur wordt toegewezen aan een specifieke Company Code, die bepaalt welke juridische entiteit verantwoordelijk is voor de transactie. In process mining is het filteren of vergelijken op Company Code essentieel om de procesprestaties over verschillende bedrijfsonderdelen, juridische entiteiten of landen te analyseren. Het helpt bij het identificeren van regionale verschillen in efficiëntie, compliance en automatiseringsgraad, wat gerichte verbeterinitiatieven ondersteunt. Het belang Het maakt segmentatie en vergelijking van factuurverwerkingsprestaties mogelijk over verschillende juridische entiteiten of geografische locaties binnen de organisatie. Vindplaats Dit is een standaard veld in de document header Voorbeelden 1000US01DE01 | |||
| Documenttype DocumentType | Een code die verschillende soorten boekingsdocumenten classificeert, zoals leveranciersfacturen of creditnota's. | ||
| Omschrijving Het Documenttype wordt in SAP gebruikt om verschillende bedrijfstransacties te onderscheiden. Zo staat 'KR' doorgaans voor een standaard leveranciersfactuur, terwijl 'KG' een creditnota van een leverancier kan zijn. Analyseren op documenttype maakt het mogelijk om het proces te segmenteren en zo te begrijpen hoe verschillende typen transacties worden afgehandeld. Het proces voor een creditnota kan bijvoorbeeld aanzienlijk verschillen van dat van een standaardfactuur. Deze segmentatie levert nauwkeurigere en relevantere procesinzichten op. Het belang Het helpt onderscheid te maken tussen verschillende soorten financiële transacties, zoals standaardfacturen en creditnota's, die vaak verschillende procespaden volgen. Vindplaats Gevonden in de documentheader-tabel BKPF, veld BLART. Voorbeelden KRREKG | |||
| Factuurbedrag AmountInCompanyCodeCurrency | Het totale brutobedrag van de factuur in de lokale valuta van de bedrijfscode. | ||
| Omschrijving Dit Het analyseren van factuurbedragen helpt bij het prioriteren van facturen met hoge waarde voor snellere verwerking, het identificeren van trends in uitgaven en het correleren van procesproblemen met financiële waarde. Het kan bijvoorbeeld worden gebruikt om te onderzoeken of facturen met hoge waarde vaker worden geblokkeerd of langere goedkeuringstijden hebben. Het belang Biedt financiële context aan het proces, waardoor analyse op basis van monetaire waarde mogelijk is, zoals het identificeren of facturen met hoge waarde anders worden verwerkt. Vindplaats Deze waarde wordt doorgaans afgeleid van de som van relevante regel Voorbeelden 1500.75125000.00850.20 | |||
| Gebruikersnaam UserName | De SAP `user ID` van de persoon of het systeem dat de activiteit heeft uitgevoerd. | ||
| Omschrijving Dit Analyseren per gebruiker helpt bij het begrijpen van de werkverdeling, het identificeren van trainingsbehoeften en het opsporen van ongebruikelijk gebruikersgedrag. Het kan bijvoorbeeld benadrukken welke gebruikers frequent uitzonderingen afhandelen of welke facturen automatisch worden verwerkt (bijv. gebruiker 'BATCHUSER'), wat cruciaal is voor het berekenen van de Het belang Het koppelt procesactiviteiten aan specifieke gebruikers- of systeemaccounts, wat workload-analyse, prestatievergelijking en automatiseringsdetectie mogelijk maakt. Vindplaats Afkomstig van velden zoals BKPF-USNAM (Ingevoerd door) of CDHDR-USERNAME (Gewijzigd door). Voorbeelden SMITHJMUELLERTWF-BATCH | |||
| Inkooporder PurchasingDocument | Het inkooporder nummer waaraan de factuur gerelateerd is. | ||
| Omschrijving Het Inkoopdocumentnummer koppelt de leveranciersfactuur aan de oorspronkelijke inkooporder ( Analyseren op basis van dit Het belang Koppelt de factuur aan het inkoopproces, wat essentieel is voor het analyseren van matching-afwijkingen en PO-compliance. Vindplaats Deze informatie is doorgaans te vinden in de document segment Voorbeelden 450000123445000056784500009012 | |||
| Leveranciersnummer VendorNumber | De unieke `identifier` voor de leverancier die de factuur heeft ingediend. | ||
| Omschrijving Het Leveranciersnummer identificeert de leverancier of crediteur die aan de factuur is gekoppeld. Het koppelt de factuurtransactie aan de leveranciersstam Dit Het belang Maakt analyse van procesprestaties per leverancier mogelijk, en helpt patronen te identificeren, relaties te beheren en leveranciersgerelateerde problemen te beoordelen. Vindplaats Doorgaans te vinden in de segmenttabel voor boekhoudingsdocumenten BSEG, veld LIFNR. Voorbeelden 100345700012V9832 | |||
| Reden betalingsblokkade PaymentBlockReason | Een code die aangeeft waarom een factuur is geblokkeerd voor betaling. | ||
| Omschrijving Wanneer een factuur is geblokkeerd voor betaling, geeft dit attribuut de specifieke reden aan, zoals 'Quantity Discrepancy' of 'Price Mismatch'. Deze redenen zijn in SAP geconfigureerd voor een gestandaardiseerde afhandeling van uitzonderingen. Dit attribuut is essentieel voor het dashboard 'Betalingsblokkades: Frequentie & Duur'. Het analyseren van deze redenen helpt bij het vinden van de grondoorzaak van vertragingen, zoals problemen met specifieke leveranciers of interne processen, waardoor gerichte verbeteringen mogelijk zijn. Het belang Biedt de specifieke hoofdoorzaak voor betalingsblokkades, waardoor gerichte analyse mogelijk is om vertragingen te verminderen en de 'first-time-right' verwerking te verbeteren. Vindplaats Gevonden in de leverancierspost in tabel BSEG, veld ZLSPR (Betalingsblokkadesleutel). Voorbeelden RIA | |||
| Uiterste betaaldatum PaymentDueDate | De datum waarop de factuur uiterlijk betaald moet zijn om te voorkomen dat deze te laat is. | ||
| Omschrijving De Vervaldatum van Betaling is de berekende datum waarop de betaling aan de leverancier verschuldigd is, gebaseerd op de factuurdatum en de overeengekomen betalingsvoorwaarden. Het dient als een kritieke deadline in het proces. Dit Het belang Het is de primaire benchmark voor het meten van tijdige betalingsprestaties, wat cruciaal is voor het onderhouden van goede leveranciersrelaties en het vermijden van boetes voor te late betaling. Vindplaats Deze datum is vaak direct beschikbaar in de leveranciersregel in tabel BSEG, veld ZFBDT (basisdatum voor de berekening van de vervaldatum). De netto vervaldatum wordt berekend op basis van deze basisdatum en de betalingsvoorwaarden. Voorbeelden 2023-05-302023-06-152023-07-01 | |||
| Aantal goedkeuringscycli ApprovalCycleCount | Een telling van hoe vaak een factuur ter goedkeuring is verzonden. | ||
| Omschrijving Deze statistiek telt hoe vaak de activiteit 'Invoice Sent For Approval' voorkomt bij een enkele factuur. Een aantal hoger dan é}én geeft aan dat de factuur ten minste é}én keer is afgewezen of teruggestuurd, waardoor een nieuwe goedkeuringscyclus nodig was. Dit attribuut ondersteunt direct de KPI 'First-Pass Approval Rate'. Door facturen met veel goedkeuringscycli te analyseren, kunnen organisaties de redenen voor mislukte goedkeuringen identificeren, zoals onvolledige informatie of onjuiste codering, en het proces verbeteren. Het belang Kwantificeert herwerk binnen het goedkeuringssubproces, en helpt zo de 'first-time-right' ratio te meten en redenen voor afgekeurde goedkeuringen te identificeren. Vindplaats Berekend door het aantal keren dat de activiteit 'Factuur Ter Goedkeuring Verzonden' voorkomt voor elk uniek InvoiceNumber te tellen. Voorbeelden 123 | |||
| Annuleringsreden ReversalReason | Een code die de reden aangeeft waarom een factuurdocument werd geannuleerd. | ||
| Omschrijving Als een factuur incorrect wordt geboekt, wordt deze vaak geannuleerd. De Reversal Reason-code verklaart waarom deze actie werd ondernomen, bijvoorbeeld 'Incorrecte boekingsdatum' of 'Gegevensinvoerfout'. Het analyseren van redenen voor annulering helpt bij het identificeren van foutpatronen in het factuurboekingsproces. Dit inzicht kan worden gebruikt om training te verbeteren, systeemcontroles te versterken of terugkerende problemen aan te pakken die leiden tot financieel herstelwerk en administratieve overhead. Het belang Verklaart waarom facturen werden geannuleerd, wat direct inzicht geeft in de oorzaken van fouten en herstelwerk in het boekingsproces. Vindplaats Gevonden in de header van het originele document in tabel BKPF, veld STGRD (Reden van omkering). Voorbeelden 010205 | |||
| Betalingstermijnen PaymentTerms | De code die de betalingsvoorwaarden definieert die met de leverancier zijn overeengekomen, zoals vervaldata en kortingsperiodes. | ||
| Omschrijving Betalingsvoorwaarden definiëren de regels voor het betalen van een factuur, inclusief eventuele kortingen voor vroegtijdige betaling. Bijvoorbeeld, 'Z030' kan betekenen 'Betaalbaar binnen 30 dagen netto'. Dit Het belang Definieert de regels voor uiterste betaaldatums en kortingen, met directe impact op tijdige betalings-KPI's en werkkapitaalbeheer. Vindplaats Gevonden in de leverancierspost in tabel BSEG, veld ZTERM (Betalingsconditiesleutel). Voorbeelden 0001Z030NT60 | |||
| Bronsysteem-ID SourceSystemId | De `identifier` van het bron SAP S/4HANA systeem waaruit de `data` is geëxtraheerd. | ||
| Omschrijving Dit attribuut specificeert het bronsysteem, bijvoorbeeld 'S4H_PROD' of 'ERP_EU'. Dit is vooral belangrijk in omgevingen met meerdere ERP-instanties of een mix van legacy- en moderne systemen. Voor analyses maakt dit het mogelijk om procesprestaties over verschillende systemen of regio's te vergelijken. Het waarborgt de herkomst van de data en is essentieel voor data governance en troubleshooting wanneer data uit meerdere bronnen wordt gecombineerd in een centraal process mining platform. Het belang Het biedt context over de herkomst van de data, wat essentieel is voor data governance en voor het vergelijken van processen tussen verschillende systemen of bedrijfslocaties. Vindplaats Deze waarde wordt doorgaans afgeleid van de SAP-systeem-ID (sy-sysid) tijdens de data-extractie of als statische waarde geconfigureerd in de ETL-pijplijn. Voorbeelden S4PS4H_PROD_100ECC_EU | |||
| Extractie `Timestamp` ExtractionTimestamp | De datum en tijd waarop de `data` uit het bronsysteem is geëxtraheerd. | ||
| Omschrijving Dit attribuut legt de timestamp van de data-extractie vast. Het geeft aan hoe actueel de data is die in de process mining tool wordt geanalyseerd. In de analyse wordt dit gebruikt om te bepalen hoe recent de gegenereerde inzichten zijn. Dit is cruciaal voor operationele dashboards om te waarborgen dat beslissingen gebaseerd zijn op actuele informatie en om data-verversingscycli effectief te beheren. Het belang Geeft de actualiteit van de data aan, en zorgt ervoor dat analyses en rapportages gebaseerd zijn op de meest actuele beschikbare informatie. Vindplaats Dit is geen SAP-veld. Het wordt gegenereerd en toegevoegd door de data-extractietool of het ETL-proces op het moment dat de data wordt opgehaald. Voorbeelden 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Factuurdatum InvoiceDate | De datum waarop de leverancier het factuurdocument heeft uitgegeven. | ||
| Omschrijving De Factuurdatum, ook bekend als de documentdatum, is de datum die door de leverancier op de factuur wordt vermeld. Deze wordt gebruikt als uitgangspunt voor het berekenen van de uiterste betaaldatum op basis van de overeengekomen betalingsvoorwaarden. Bij analyse is deze datum fundamenteel voor financiële berekeningen, zoals het bepalen van de ouderdom van facturen en de geschiktheid voor vroegbetalingskortingen. Het is een belangrijke Het belang Dient als de basis voor het berekenen van betalingsvoorwaarden en vervaldata, wat essentieel is voor het beheren van werkkapitaal en het benutten van kortingen. Vindplaats Gevonden in de documentheader-tabel BKPF, veld BLDAT (Documentdatum). Voorbeelden 2023-04-122023-05-152023-06-20 | |||
| Factuurverwerkingstijd InvoiceProcessingTime | De totale verstreken tijd vanaf de eerste activiteit tot de laatste activiteit voor een factuur. | ||
| Omschrijving Deze statistiek berekent de totale duur voor de verwerking van een enkele factuur, doorgaans vanaf de aanmaak of ontvangst tot de uiteindelijke betaling. Het biedt een samenvatting van de end-to-end doorlooptijd op case-niveau. Dit berekende attribuut vormt de basis voor de KPI 'Gemiddelde doorlooptijd factuur' en het dashboard 'End-to-End doorlooptijd factuur'. Hiermee kunnen de langstlopende cases snel worden geïdentificeerd en factoren die bijdragen aan vertragingen worden geanalyseerd. Het belang Meet de end-to-end efficiëntie van het proces voor elke factuur en belicht gevallen met uitzonderlijk lange doorlooptijden die nader onderzoek vereisen. Vindplaats Berekend door het verschil te nemen tussen de timestamp van de laatste event en de eerste event voor elk uniek InvoiceNumber. Voorbeelden 10 dagen 4 uur25 dagen 1 uur5 dagen 8 uur | |||
| Is Geautomatiseerd IsAutomated | Een indicator die aangeeft of een activiteit is uitgevoerd door een geautomatiseerde systeemgebruiker. | ||
| Omschrijving Dit Dit Het belang Onderscheidt handmatige en systeemgestuurde activiteiten, wat fundamenteel is voor het meten van automatiseringspercentages en het identificeren van kansen voor verdere automatisering. Vindplaats Afgeleid van de UserName attribute. Een mapping of regel wordt gecreëerd om specifieke gebruikers-ID's te classificeren als 'geautomatiseerd'. Voorbeelden truefalse | |||
| Is herstelwerk IsRework | Een indicator die aangeeft of een factuur herstelwerkzaamheden heeft ondergaan, zoals een afgewezen goedkeuring of een verwijderde betalingsblokkade. | ||
| Omschrijving Dit Dit Het belang Identificeert inefficiënte processtromen waar werk moet worden herhaald, en helpt verspilling te kwantificeren en de grondoorzaken van procesuitzonderingen op te sporen. Vindplaats Berekend op basis van de sequentie van activiteiten in de event log. Als bijvoorbeeld 'Factuur Afgewezen' voorkomt in de trace voor een factuur, wordt deze indicator ingesteld op 'waar'. Voorbeelden truefalse | |||
| Tijdig betaald IsPaidOnTime | Een indicator die waar is als de factuur op of vóór de uiterste betaaldatum is betaald. | ||
| Omschrijving Dit Dit is de kernberekening voor de Het belang Meet direct de naleving van betalingsvoorwaarden, wat een kritieke KPI is voor leveranciersrelatiebeheer en financiële operaties. Vindplaats Berekend door de EventTime van de activiteit 'Betaling Uitgevoerd' te vergelijken met de PaymentDueDate attribute. (Betaaldatum <= PaymentDueDate). Voorbeelden truefalse | |||
| Vereffeningsdocumentnr. ClearingDocumentNumber | Het documentnummer dat de factuur afboekt, meestal het betalingsdocument. | ||
| Omschrijving Het Clearingsdocumentnummer koppelt een openstaand factuuritem aan de transactie die het afboekt, wat bijna altijd het betalingsdocument is. Dit bevestigt dat de factuur is betaald. Dit Het belang Bevestigt dat een factuur is betaald en koppelt deze aan de specifieke betaaltransactie, wat cruciaal is voor doorlooptijd- en betalingsprestatie-analyse. Vindplaats Gevonden in de documentsigmenttabel BSEG, veld AUGBL (Vereffeningsdocumentnummer). Voorbeelden 150000000115000000231500000088 | |||
Purchase to Pay - Factuurverwerkingsactiviteiten
| Activiteit | Omschrijving | ||
|---|---|---|---|
| Betaling Uitgevoerd | Dit is de laatste activiteit in het standaardproces, waarbij de betaling wordt gedaan en de factuur wordt afgeboekt. Dit betekent dat de gelden aan de leverancier zijn uitgekeerd. | ||
| Het belang Dit markeert het einde van de levenscyclus van de P2P-factuur. Het is essentieel voor het berekenen van de totale end-to-end doorlooptijd en voor het meten van tijdige betalingsprestaties ten opzichte van de vervaldatum. Vindplaats Dit event wordt vastgelegd op basis van de clearingdocument-informatie op de leveranciersregel. De Clearing Date (BSEG-AUGDT) en het Clearing Document (BSEG-AUGBL) geven aan dat de betaling is uitgevoerd. Vastleggen Gebruik de clearingsdatum (BSEG-AUGDT) van het afgeboekte leveranciersregel Gebeurtenistype explicit | |||
| Factuur geboekt | Dit is een belangrijk financieel event waarbij de geparkeerde of goedgekeurde factuur formeel in het Grootboek wordt geboekt. Hiermee wordt de schuld aan de leverancier officieel erkend. | ||
| Het belang Boeking is een belangrijke mijlpaal die data-invoer en goedkeuring scheidt van de financiële afwikkelingsfase. De tijd van factuurcreatie tot boeking is een cruciale maatstaf voor interne verwerkingsefficiëntie. Vindplaats Dit event wordt geïdentificeerd door de Boekingsdatum (BKPF-BUDAT) in de documentkop. Voor documenten die eerst worden geparkeerd, vormt de overgang naar een geboekte status de timestamp voor het event. Vastleggen Gebruik de boekingsdatum (BKPF-BUDAT) als de Gebeurtenistype explicit | |||
| Factuur gestorneerd | Een activiteit die de annulering van een eerder geboekt factuurdocument vertegenwoordigt. Dit is een afsluitende event voor een incorrecte factuur, die vervolgens vaak correct opnieuw wordt ingevoerd. | ||
| Het belang Annuleringen duiden op kritieke fouten die niet eerder in het proces zijn opgemerkt. Het bijhouden van hun frequentie en hoofdoorzaken is essentieel voor procesverbetering en het verminderen van financiële onnauwkeurigheden. Vindplaats Een omkering wordt geïdentificeerd wanneer een omkerend document wordt aangemaakt. De oorspronkelijke documentheader (BKPF) zal het nummer van het omkerende document (BKPF-STBLG) bevatten en vice versa. De boekingsdatum van het omkerende document is de event time. Vastleggen Identificeer documenten die een waarde hebben in het veld BKPF-STBLG en gebruik de boekingsdatum van het omkerende document. Gebeurtenistype explicit | |||
| Factuur Goedgekeurd | Deze activiteit betekent dat de factuur is goedgekeurd door de aangewezen autoriteit. Dit wordt vastgelegd wanneer de goedkeurings-`workflow` succesvol wordt afgerond of een vrijgave-indicator wordt ingesteld. | ||
| Het belang Dit is een kritieke mijlpaal die de factuur deblokkeert voor betaling. Vertragingen bij goedkeuringen zijn een veelvoorkomend Vindplaats Dit kan worden afgeleid uit de laatste vrijgavestap in een SAP-workflow of door wijzigingen in vrijgavestatusvelden te volgen in tabellen die horen bij de factuur of het inkoopdocument. Vastleggen Afleiden uit workflow-voltooiings-events of wijzigingen in het vrijgavestatusveld van een document. Gebeurtenistype inferred | |||
| Factuurdocument aangemaakt | Dit is het eerste event, dat de aanmaak van een factuurdocument in SAP markeert. Dit kan worden vastgelegd wanneer een gebruiker een nieuw factuurdocument opslaat, wat zowel in geparkeerde als in voorlopig geboekte status kan zijn. | ||
| Het belang Deze activiteit markeert het begin van de factuurverwerkingslevenscyclus. Het analyseren van de tijd van dit Vindplaats Dit Vastleggen Gebruik Gebeurtenistype explicit | |||
| Betalingsblokkade Ingesteld | Een activiteit waarbij opzettelijk een blokkade op een factuur wordt geplaatst om te voorkomen dat deze wordt betaald. Dit komt vaak door verschillen in prijs of hoeveelheid, of een openstaande creditnota. | ||
| Het belang Betalingsblokkades zijn een belangrijke oorzaak van late betalingen en geschillen met leveranciers. Het analyseren van de frequentie, duur en redenen voor blokkades is cruciaal voor het verbeteren van tijdige betalingen. Vindplaats Dit event wordt vastgelegd door wijzigingen in het veld Payment Block Key (BSEG-ZLSPR) in de factuurregel te volgen. De wijzigingslogs in CDHDR en CDPOS bevatten de timestamp en de gebruiker die de blokkering heeft ingesteld. Vastleggen Identificeer wanneer het BSEG-ZLSPR-veld wordt gevuld via wijzigingsdocumenten (CDHDR/CDPOS). Gebeurtenistype explicit | |||
| Betalingsblokkade Verwijderd | Vertegenwoordigt de oplossing van een probleem, waarbij een eerder ingestelde betalingsblokkade wordt opgeheven. Dit maakt de factuur weer betaalbaar. | ||
| Het belang De tijd tussen het instellen en opheffen van een blokkade vertegenwoordigt de oplossingstijd voor een procesuitzondering. Het verkorten van deze duur is cruciaal voor het verbeteren van de efficiëntie en leveranciersrelaties. Vindplaats Dit event wordt vastgelegd wanneer het veld Payment Block Key (BSEG-ZLSPR) wordt gewist. Deze wijziging wordt gelogd in de tabellen CDHDR en CDPOS, wat een timestamp voor de verwijdering oplevert. Vastleggen Identificeer wanneer het BSEG-ZLSPR-veld wordt leeggemaakt via wijzigingsdocumenten (CDHDR/CDPOS). Gebeurtenistype explicit | |||
| Betalingsvoorstel aangemaakt | De factuur wordt geselecteerd en opgenomen in een betalingsvoorstel als onderdeel van een betalingsrun. Dit is de eerste stap in het geautomatiseerde betalingsproces. | ||
| Het belang Deze activiteit duidt op de intentie tot betaling. Vertragingen tussen deze stap en de definitieve betalingsuitvoering kunnen problemen met het betalingsrunproces, goedkeuringen of bankcommunicatie aan het licht brengen. Vindplaats Dit is te vinden in de betalingsrun Vastleggen Identificeer wanneer een factuur verschijnt in de REGUP-tabel vanuit een betalingsvoorstelrun. Gebeurtenistype explicit | |||
| Factuur afgewezen | Vertegenwoordigt de afwijzing van een factuur tijdens het goedkeuringsproces. Dit `event` leidt tot herwerk, waarvoor correctie en herindiening nodig zijn. | ||
| Het belang Factuurafwijzingen zijn een belangrijke indicator van procesinefficiëntie en datakwaliteitsproblemen. Het analyseren van de frequentie en redenen van afwijzing helpt bij het identificeren van verbeterkansen en trainingsbehoeften. Vindplaats Dit wordt afgeleid uit specifieke statusupdates in een SAP-workflow, zoals de status 'afgewezen', of uit events die de huidige goedkeuringsworkflow annuleren en terugsturen naar de verwerker. Vastleggen Afleiden uit workflow-statuswijzigingen die afwijzing aangeven. Gebeurtenistype inferred | |||
| Factuur geparkeerd | Vertegenwoordigt een factuur die in het systeem is ingevoerd, maar nog niet is geboekt in het grootboek. Parking wordt gebruikt om onvolledige facturen op te slaan of voor latere controle voor boeking. | ||
| Het belang Parking duidt op een bewuste pauze in het proces. Het bijhouden van de duur en frequentie van geparkeerde facturen helpt bij het identificeren van redenen voor vertragingen voordat de formele boeking- en goedkeuringscyclus begint. Vindplaats Dit kan worden geïdentificeerd aan de hand van documenten die zijn aangemaakt via Vastleggen Identificeer documenten die zijn aangemaakt via parkeertransacties of controleer op een geparkeerde documentstatus. Gebeurtenistype explicit | |||
| Factuur ter goedkeuring verzonden | Deze activiteit markeert de start van een formele goedkeuringsworkflow voor de factuur. Dit wordt vaak afgeleid wanneer de status van de factuur verandert naar 'wacht op goedkeuring' of wanneer er een workflow-item wordt aangemaakt. | ||
| Het belang Dit is het startpunt voor het meten van de goedkeuringscyclusduur. Begrijpen wanneer goedkeuringen beginnen is essentieel voor het identificeren van Vindplaats Dit wordt doorgaans afgeleid uit de start van een SAP Vastleggen Afleiden uit de creatie van een workflow-item gerelateerd aan het factuurdocument. Gebeurtenistype inferred | |||
| Factuurdata Bijgewerkt | Deze activiteit weerspiegelt een wijziging aan het factuurdocument na de initiële aanmaak. Dit komt vaak voor tijdens herwerkcycli na een afwijzing of om fouten te corrigeren. | ||
| Het belang Frequente updates duiden op herstelwerk en potentiële datakwaliteitsproblemen bij de invoer. Het bijhouden van deze wijzigingen helpt de inspanning voor correcties te kwantificeren en veelvoorkomende fouten te identificeren. Vindplaats Wijzigingen in sleutelvelden worden gelogd in SAP's wijzigingsdocumenttabellen, CDHDR (header) en CDPOS (item). Events kunnen worden gegenereerd door te filteren op wijzigingen in het relevante factuurobject. Vastleggen Extraheer wijzigings-events uit tabellen CDHDR en CDPOS voor het factuurobject. Gebeurtenistype explicit | |||
| Te late betaling uitgevoerd | Dit is een berekend `event` dat optreedt wanneer de betaling van een factuur wordt uitgevoerd na de berekende vervaldatum. Het wordt afgeleid door twee datumvelden te vergelijken. | ||
| Het belang Deze activiteit ondersteunt direct Vindplaats Dit wordt berekend door de Clearingsdatum (BSEG-AUGDT) te vergelijken met de Netto Vervaldatum. De vervaldatum zelf wordt berekend op basis van de Vastleggen Afleiden door BSEG-AUGDT te vergelijken met (BSEG-ZFBDT + dagen betalingstermijn). Gebeurtenistype calculated | |||
Extractie Guides
Stappen
- Vereisten en autorisatie: Zorg ervoor dat de gebruiker die de extractie uitvoert de nodige autorisaties heeft in SAP S/4HANA om toegang te krijgen tot de vereiste Core Data Services (CDS) views. Belangrijke views zijn
I_InvoiceDocument,I_OperationalAcctgDocItem,I_ChangeDocument,I_ChangeDocumentItemenI_PaymentProposalItem. De gebruiker heeft ook machtigingen nodig om query's uit te voeren via de gekozen interface, zoals een OData service of een directe SQL-verbinding. - Bepaal uw verbindingsmethode: Bepaal hoe u verbinding maakt met het SAP S/4HANA-systeem om de SQL-query uit te voeren. Veelvoorkomende methoden zijn het gebruik van SAP Data Services, SAP Data Intelligence, een ETL-tool van derden met een SAP-connector, of een directe SQL-verbinding met de SAP HANA-database indien toegestaan door het beveiligingsbeleid van uw organisatie.
- Definieer extractieparameters: Voordat u de query uitvoert, definieert u de belangrijkste parameters. Specificeer het datumbereik voor de extractie, bijvoorbeeld
CreationDatetussen'JJJJ-MM-DD'en'JJJJ-MM-DD'. Identificeer ook de specifiekeCompanyCode-waarden die u wilt opnemen om de omvang van de data-extractie te beperken. - Pas de SQL-query aan: Kopieer de meegeleverde SQL-query naar uw gekozen SQL-client of data-extractietool. Bekijk zorgvuldig de placeholders, zoals
'{StartDate}','{EndDate}'en('{CompanyCode1}', '{CompanyCode2}'). Vervang deze placeholders door de werkelijke waarden die u in de vorige stap hebt gedefinieerd. Mogelijk moet u ook veldnamen voor workflow status aanpassen op basis van uw specifieke SAP-configuratie. - Voer de query uit: Voer de volledige SQL-query uit op de SAP S/4HANA-database of via de juiste servicelaag. De query is ontworpen om uitgebreid te zijn en kan, afhankelijk van het datavolume en het geselecteerde datumbereik, aanzienlijke tijd in beslag nemen. Monitor de uitvoering op mogelijke fouten of timeouts.
- Controleer de eerste resultaten: Zodra de query is voltooid, voert u een snelle controle uit van de output. Controleer of de kolommen
InvoiceNumber,ActivityNameenEventTimezijn gevuld. Controleer of u een verscheidenheid aan verschillende activiteiten ziet in deActivityName-kolom, en niet alleen 'Invoice Document Created'. - Pak datatransformatie aan: De query is gestructureerd om een schone event log-indeling te produceren. Zorg er echter voor dat de
EventTime-kolom een consistent timestamp-formaat heeft, zoalsJJJJ-MM-DDTHH:MM:SS. De meegeleverde query combineert waar nodig datum- en tijdvelden tot één enkele timestamp. - Exporteer de data: Exporteer de uiteindelijke resultaatset van uw tool naar een CSV-bestand (Comma-Separated Values). Dit formaat is universeel compatibel met process mining tools, inclusief ProcessMind.
- Voorbereiden op uploaden: Controleer vóór het uploaden of het CSV-bestand UTF-8-codering gebruikt om karakterproblemen te voorkomen. Zorg ervoor dat de kolomheaders in het bestand exact overeenkomen met de vereiste attributes:
InvoiceNumber,ActivityName,EventTime,UserName,CompanyCode, enz. - Uploaden naar ProcessMind: Upload het voorbereide CSV-bestand naar uw process mining-project. Map de kolommen uit uw bestand naar de corresponderende case ID, activity name en timestamp-velden in de datamodelconfiguratie van de tool.
Configuratie
- CDS Views Used: De primaire databronnen zijn standaard SAP CDS views. De belangrijkste views zijn
I_InvoiceDocumentvoor header data,I_OperationalAcctgDocItemvoor financiële boeking en vereffeningsdetails, enI_ChangeDocumentmetI_ChangeDocumentItemvoor het bijhouden van historische wijzigingen in factuur-attributes zoals betalingsblokkades en workflow status. - Datumfilter: Het is cruciaal om de data te filteren op een specifiek datumbereik om de prestaties te beheren. De meegeleverde query gebruikt een placeholder voor de
CreationDatein deI_InvoiceDocumentview. Een aanbevolen startpunt is een periode van 3 tot 6 maanden aan data. - Bedrijfscodefilter: Om ervoor te zorgen dat de extractie relevant en beheersbaar is, filtert u altijd op een of meer
CompanyCode. De query bevat hiervoor een placeholderWHERE inv.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}'). - Documenttypefilter: U kunt de extractie verder verfijnen door te filteren op
InvoiceDocumentType. U wilt bijvoorbeeld standaard leveranciersfacturen (RE) opnemen, maar creditnota's uitsluiten. Dit kan worden toegevoegd aan deWHEREclause van de initiële CTE. - Vereisten: De gebruiker die de query uitvoert, heeft de juiste weergaveautorisaties nodig voor financiële en inkoopdocumenten binnen de opgegeven bedrijfscodes. Toegang tot de onderliggende HANA-database via een SQL-client is niet standaard en vereist speciale machtigingen.
- Prestatieoverwegingen: Het extraheren van data uit wijzigingsdocumenttabellen (
I_ChangeDocument,I_ChangeDocumentItem) kan prestatie-intensief zijn. Het toepassen van strikte filters op datum, bedrijfscode en objectklasse (INCOMINGINVOICE) is essentieel om lange uitvoeringstijden te voorkomen.
a Voorbeeldquery sql
WITH InvoiceBase AS (
SELECT
inv.InvoiceDocument,
inv.FiscalYear,
inv.CompanyCode,
inv.Supplier AS VendorNumber,
inv.DocumentType,
inv.GrossInvoiceAmountInCoCoCrcy AS AmountInCompanyCodeCurrency,
inv.NetDueDate AS PaymentDueDate,
inv.PurchasingDocument,
inv.CreationDateTime,
inv.CreatedByUser,
accdoc.AccountingDocument,
accdoc.ClearingDate,
accdoc.ClearingJournalEntry,
accdoc.PaymentBlockReason,
accdoc.IsReversed
FROM I_InvoiceDocument AS inv
LEFT JOIN I_OperationalAcctgDocItem AS accdoc
ON inv.AccountingDocument = accdoc.AccountingDocument
AND inv.FiscalYear = accdoc.FiscalYear
AND inv.CompanyCode = accdoc.CompanyCode
WHERE
inv.CreationDate BETWEEN '{StartDate}' AND '{EndDate}'
AND inv.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')
)
-- 1. Invoice Document Created
SELECT
InvoiceDocument AS "InvoiceNumber",
'Invoice Document Created' AS "ActivityName",
CreationDateTime AS "EventTime",
CreatedByUser AS "UserName",
CompanyCode AS "CompanyCode",
VendorNumber AS "VendorNumber",
AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
PaymentDueDate AS "PaymentDueDate",
DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase
UNION ALL
-- 2. Invoice Parked
SELECT
i.InvoiceDocument AS "InvoiceNumber",
'Invoice Parked' AS "ActivityName",
i.CreationDateTime AS "EventTime",
i.CreatedByUser AS "UserName",
i.CompanyCode AS "CompanyCode",
i.Supplier AS "VendorNumber",
i.GrossInvoiceAmountInCoCoCrcy AS "AmountInCompanyCodeCurrency",
i.NetDueDate AS "PaymentDueDate",
i.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
i.PurchasingDocument AS "PurchasingDocument"
FROM I_InvoiceDocument AS i
WHERE
i.InvoiceDocumentIsParked = 'X'
AND i.CreationDate BETWEEN '{StartDate}' AND '{EndDate}'
AND i.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')
UNION ALL
-- 3, 4, 5. Workflow activities (Sent for Approval, Approved, Rejected) from Change Docs
SELECT
cdpos.ObjectValue AS "InvoiceNumber",
CASE
WHEN cdpos.ValueNew = '[StatusSentForApproval]' THEN 'Invoice Sent For Approval'
WHEN cdpos.ValueNew = '[StatusApproved]' THEN 'Invoice Approved'
WHEN cdpos.ValueNew = '[StatusRejected]' THEN 'Invoice Rejected'
END AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.InvoiceDocument
WHERE
cdhdr.ObjectClassName = 'INCOMINGINVOICE'
AND cdpos.FieldName = '[WorkflowStatusFieldName]'
AND cdpos.ValueNew IN ('[StatusSentForApproval]', '[StatusApproved]', '[StatusRejected]')
UNION ALL
-- 6. Invoice Data Updated
SELECT
cdpos.ObjectValue AS "InvoiceNumber",
'Invoice Data Updated' AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.InvoiceDocument
WHERE
cdhdr.ObjectClassName = 'INCOMINGINVOICE'
AND cdpos.FieldName IN ('GrossInvoiceAmount', 'DocumentDate', 'PaymentTerms')
AND cdhdr.ChangeDate BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
-- 7 & 8. Payment Block Set/Removed
SELECT
inv.InvoiceDocument AS "InvoiceNumber",
CASE
WHEN cdpos.ValueNew <> '' AND cdpos.ValueOld = '' THEN 'Payment Block Set'
WHEN cdpos.ValueNew = '' AND cdpos.ValueOld <> '' THEN 'Payment Block Removed'
END AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
cdpos.ValueNew AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.AccountingDocument
WHERE
cdhdr.ObjectClassName = 'BELEG'
AND cdpos.TableName = 'BSEG'
AND cdpos.FieldName = 'ZLSPR'
AND ( (cdpos.ValueNew <> '' AND cdpos.ValueOld = '') OR (cdpos.ValueNew = '' AND cdpos.ValueOld <> '') )
UNION ALL
-- 9. Invoice Posted
SELECT
inv.InvoiceDocument AS "InvoiceNumber",
'Invoice Posted' AS "ActivityName",
CAST(accdoc.PostingDate AS TIMESTAMP) AS "EventTime",
accdoc.CreatedByUser AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
accdoc.PaymentBlockReason AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase AS inv
JOIN I_OperationalAcctgDocItem AS accdoc ON inv.AccountingDocument = accdoc.AccountingDocument
WHERE inv.AccountingDocument IS NOT NULL AND inv.IsReversed = FALSE
UNION ALL
-- 10. Payment Proposal Created
SELECT
item.InvoiceReference AS "InvoiceNumber",
'Payment Proposal Created' AS "ActivityName",
CAST(prun.PaymentRunDate AS TIMESTAMP) AS "EventTime",
prun.CreatedByUser AS "UserName",
item.CompanyCode AS "CompanyCode",
item.Supplier AS "VendorNumber",
item.AmountInTransactionCurrency AS "AmountInCompanyCodeCurrency",
item.NetDueDate AS "PaymentDueDate",
item.AccountingDocumentType AS "DocumentType",
item.PaymentBlockReason AS "PaymentBlockReason",
item.PurchasingDocument AS "PurchasingDocument"
FROM I_PaymentProposalItem as item
JOIN I_PaymentRun as prun ON item.PaymentRunName = prun.PaymentRunName
JOIN InvoiceBase AS inv ON item.InvoiceReference = inv.InvoiceDocument
UNION ALL
-- 11 & 12. Payment Executed / Late Payment Executed
SELECT
InvoiceDocument AS "InvoiceNumber",
CASE
WHEN ClearingDate > PaymentDueDate THEN 'Late Payment Executed'
ELSE 'Payment Executed'
END AS "ActivityName",
CAST(ClearingDate AS TIMESTAMP) AS "EventTime",
CAST(NULL AS VARCHAR(12)) AS "UserName", -- User for clearing is not always straightforward
CompanyCode AS "CompanyCode",
VendorNumber AS "VendorNumber",
AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
PaymentDueDate AS "PaymentDueDate",
DocumentType AS "DocumentType",
'' AS "PaymentBlockReason",
PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase
WHERE ClearingDate IS NOT NULL AND IsReversed = FALSE
UNION ALL
-- 13. Invoice Reversed
SELECT
rev.OriginalInvoiceDocument AS "InvoiceNumber",
'Invoice Reversed' AS "ActivityName",
rev.CreationDateTime AS "EventTime",
rev.CreatedByUser AS "UserName",
rev.CompanyCode AS "CompanyCode",
rev.Supplier AS "VendorNumber",
rev.GrossInvoiceAmountInCoCoCrcy AS "AmountInCompanyCodeCurrency",
CAST(NULL AS DATE) AS "PaymentDueDate",
rev.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
rev.PurchasingDocument AS "PurchasingDocument"
FROM I_InvoiceDocument AS rev
WHERE rev.OriginalInvoiceDocument IN (SELECT InvoiceDocument FROM InvoiceBase) AND rev.IsReversal = 'X' Stappen
- Vereisten en autorisatie: Zorg ervoor dat de gebruiker die de extractie uitvoert de nodige autorisaties heeft in SAP S/4HANA om toegang te krijgen tot de vereiste Core Data Services (CDS) views. Belangrijke views zijn
I_InvoiceDocument,I_OperationalAcctgDocItem,I_ChangeDocument,I_ChangeDocumentItemenI_PaymentProposalItem. De gebruiker heeft ook machtigingen nodig om query's uit te voeren via de gekozen interface, zoals een OData service of een directe SQL-verbinding. - Bepaal uw verbindingsmethode: Bepaal hoe u verbinding maakt met het SAP S/4HANA-systeem om de SQL-query uit te voeren. Veelvoorkomende methoden zijn het gebruik van SAP Data Services, SAP Data Intelligence, een ETL-tool van derden met een SAP-connector, of een directe SQL-verbinding met de SAP HANA-database indien toegestaan door het beveiligingsbeleid van uw organisatie.
- Definieer extractieparameters: Voordat u de query uitvoert, definieert u de belangrijkste parameters. Specificeer het datumbereik voor de extractie, bijvoorbeeld
CreationDatetussen'JJJJ-MM-DD'en'JJJJ-MM-DD'. Identificeer ook de specifiekeCompanyCode-waarden die u wilt opnemen om de omvang van de data-extractie te beperken. - Pas de SQL-query aan: Kopieer de meegeleverde SQL-query naar uw gekozen SQL-client of data-extractietool. Bekijk zorgvuldig de placeholders, zoals
'{StartDate}','{EndDate}'en('{CompanyCode1}', '{CompanyCode2}'). Vervang deze placeholders door de werkelijke waarden die u in de vorige stap hebt gedefinieerd. Mogelijk moet u ook veldnamen voor workflow status aanpassen op basis van uw specifieke SAP-configuratie. - Voer de query uit: Voer de volledige SQL-query uit op de SAP S/4HANA-database of via de juiste servicelaag. De query is ontworpen om uitgebreid te zijn en kan, afhankelijk van het datavolume en het geselecteerde datumbereik, aanzienlijke tijd in beslag nemen. Monitor de uitvoering op mogelijke fouten of timeouts.
- Controleer de eerste resultaten: Zodra de query is voltooid, voert u een snelle controle uit van de output. Controleer of de kolommen
InvoiceNumber,ActivityNameenEventTimezijn gevuld. Controleer of u een verscheidenheid aan verschillende activiteiten ziet in deActivityName-kolom, en niet alleen 'Invoice Document Created'. - Pak datatransformatie aan: De query is gestructureerd om een schone event log-indeling te produceren. Zorg er echter voor dat de
EventTime-kolom een consistent timestamp-formaat heeft, zoalsJJJJ-MM-DDTHH:MM:SS. De meegeleverde query combineert waar nodig datum- en tijdvelden tot één enkele timestamp. - Exporteer de data: Exporteer de uiteindelijke resultaatset van uw tool naar een CSV-bestand (Comma-Separated Values). Dit formaat is universeel compatibel met process mining tools, inclusief ProcessMind.
- Voorbereiden op uploaden: Controleer vóór het uploaden of het CSV-bestand UTF-8-codering gebruikt om karakterproblemen te voorkomen. Zorg ervoor dat de kolomheaders in het bestand exact overeenkomen met de vereiste attributes:
InvoiceNumber,ActivityName,EventTime,UserName,CompanyCode, enz. - Uploaden naar ProcessMind: Upload het voorbereide CSV-bestand naar uw process mining-project. Map de kolommen uit uw bestand naar de corresponderende case ID, activity name en timestamp-velden in de datamodelconfiguratie van de tool.
Configuratie
- CDS Views Used: De primaire databronnen zijn standaard SAP CDS views. De belangrijkste views zijn
I_InvoiceDocumentvoor header data,I_OperationalAcctgDocItemvoor financiële boeking en vereffeningsdetails, enI_ChangeDocumentmetI_ChangeDocumentItemvoor het bijhouden van historische wijzigingen in factuur-attributes zoals betalingsblokkades en workflow status. - Datumfilter: Het is cruciaal om de data te filteren op een specifiek datumbereik om de prestaties te beheren. De meegeleverde query gebruikt een placeholder voor de
CreationDatein deI_InvoiceDocumentview. Een aanbevolen startpunt is een periode van 3 tot 6 maanden aan data. - Bedrijfscodefilter: Om ervoor te zorgen dat de extractie relevant en beheersbaar is, filtert u altijd op een of meer
CompanyCode. De query bevat hiervoor een placeholderWHERE inv.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}'). - Documenttypefilter: U kunt de extractie verder verfijnen door te filteren op
InvoiceDocumentType. U wilt bijvoorbeeld standaard leveranciersfacturen (RE) opnemen, maar creditnota's uitsluiten. Dit kan worden toegevoegd aan deWHEREclause van de initiële CTE. - Vereisten: De gebruiker die de query uitvoert, heeft de juiste weergaveautorisaties nodig voor financiële en inkoopdocumenten binnen de opgegeven bedrijfscodes. Toegang tot de onderliggende HANA-database via een SQL-client is niet standaard en vereist speciale machtigingen.
- Prestatieoverwegingen: Het extraheren van data uit wijzigingsdocumenttabellen (
I_ChangeDocument,I_ChangeDocumentItem) kan prestatie-intensief zijn. Het toepassen van strikte filters op datum, bedrijfscode en objectklasse (INCOMINGINVOICE) is essentieel om lange uitvoeringstijden te voorkomen.
a Voorbeeldquery sql
WITH InvoiceBase AS (
SELECT
inv.InvoiceDocument,
inv.FiscalYear,
inv.CompanyCode,
inv.Supplier AS VendorNumber,
inv.DocumentType,
inv.GrossInvoiceAmountInCoCoCrcy AS AmountInCompanyCodeCurrency,
inv.NetDueDate AS PaymentDueDate,
inv.PurchasingDocument,
inv.CreationDateTime,
inv.CreatedByUser,
accdoc.AccountingDocument,
accdoc.ClearingDate,
accdoc.ClearingJournalEntry,
accdoc.PaymentBlockReason,
accdoc.IsReversed
FROM I_InvoiceDocument AS inv
LEFT JOIN I_OperationalAcctgDocItem AS accdoc
ON inv.AccountingDocument = accdoc.AccountingDocument
AND inv.FiscalYear = accdoc.FiscalYear
AND inv.CompanyCode = accdoc.CompanyCode
WHERE
inv.CreationDate BETWEEN '{StartDate}' AND '{EndDate}'
AND inv.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')
)
-- 1. Invoice Document Created
SELECT
InvoiceDocument AS "InvoiceNumber",
'Invoice Document Created' AS "ActivityName",
CreationDateTime AS "EventTime",
CreatedByUser AS "UserName",
CompanyCode AS "CompanyCode",
VendorNumber AS "VendorNumber",
AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
PaymentDueDate AS "PaymentDueDate",
DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase
UNION ALL
-- 2. Invoice Parked
SELECT
i.InvoiceDocument AS "InvoiceNumber",
'Invoice Parked' AS "ActivityName",
i.CreationDateTime AS "EventTime",
i.CreatedByUser AS "UserName",
i.CompanyCode AS "CompanyCode",
i.Supplier AS "VendorNumber",
i.GrossInvoiceAmountInCoCoCrcy AS "AmountInCompanyCodeCurrency",
i.NetDueDate AS "PaymentDueDate",
i.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
i.PurchasingDocument AS "PurchasingDocument"
FROM I_InvoiceDocument AS i
WHERE
i.InvoiceDocumentIsParked = 'X'
AND i.CreationDate BETWEEN '{StartDate}' AND '{EndDate}'
AND i.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')
UNION ALL
-- 3, 4, 5. Workflow activities (Sent for Approval, Approved, Rejected) from Change Docs
SELECT
cdpos.ObjectValue AS "InvoiceNumber",
CASE
WHEN cdpos.ValueNew = '[StatusSentForApproval]' THEN 'Invoice Sent For Approval'
WHEN cdpos.ValueNew = '[StatusApproved]' THEN 'Invoice Approved'
WHEN cdpos.ValueNew = '[StatusRejected]' THEN 'Invoice Rejected'
END AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.InvoiceDocument
WHERE
cdhdr.ObjectClassName = 'INCOMINGINVOICE'
AND cdpos.FieldName = '[WorkflowStatusFieldName]'
AND cdpos.ValueNew IN ('[StatusSentForApproval]', '[StatusApproved]', '[StatusRejected]')
UNION ALL
-- 6. Invoice Data Updated
SELECT
cdpos.ObjectValue AS "InvoiceNumber",
'Invoice Data Updated' AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.InvoiceDocument
WHERE
cdhdr.ObjectClassName = 'INCOMINGINVOICE'
AND cdpos.FieldName IN ('GrossInvoiceAmount', 'DocumentDate', 'PaymentTerms')
AND cdhdr.ChangeDate BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
-- 7 & 8. Payment Block Set/Removed
SELECT
inv.InvoiceDocument AS "InvoiceNumber",
CASE
WHEN cdpos.ValueNew <> '' AND cdpos.ValueOld = '' THEN 'Payment Block Set'
WHEN cdpos.ValueNew = '' AND cdpos.ValueOld <> '' THEN 'Payment Block Removed'
END AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
cdpos.ValueNew AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.AccountingDocument
WHERE
cdhdr.ObjectClassName = 'BELEG'
AND cdpos.TableName = 'BSEG'
AND cdpos.FieldName = 'ZLSPR'
AND ( (cdpos.ValueNew <> '' AND cdpos.ValueOld = '') OR (cdpos.ValueNew = '' AND cdpos.ValueOld <> '') )
UNION ALL
-- 9. Invoice Posted
SELECT
inv.InvoiceDocument AS "InvoiceNumber",
'Invoice Posted' AS "ActivityName",
CAST(accdoc.PostingDate AS TIMESTAMP) AS "EventTime",
accdoc.CreatedByUser AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
accdoc.PaymentBlockReason AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase AS inv
JOIN I_OperationalAcctgDocItem AS accdoc ON inv.AccountingDocument = accdoc.AccountingDocument
WHERE inv.AccountingDocument IS NOT NULL AND inv.IsReversed = FALSE
UNION ALL
-- 10. Payment Proposal Created
SELECT
item.InvoiceReference AS "InvoiceNumber",
'Payment Proposal Created' AS "ActivityName",
CAST(prun.PaymentRunDate AS TIMESTAMP) AS "EventTime",
prun.CreatedByUser AS "UserName",
item.CompanyCode AS "CompanyCode",
item.Supplier AS "VendorNumber",
item.AmountInTransactionCurrency AS "AmountInCompanyCodeCurrency",
item.NetDueDate AS "PaymentDueDate",
item.AccountingDocumentType AS "DocumentType",
item.PaymentBlockReason AS "PaymentBlockReason",
item.PurchasingDocument AS "PurchasingDocument"
FROM I_PaymentProposalItem as item
JOIN I_PaymentRun as prun ON item.PaymentRunName = prun.PaymentRunName
JOIN InvoiceBase AS inv ON item.InvoiceReference = inv.InvoiceDocument
UNION ALL
-- 11 & 12. Payment Executed / Late Payment Executed
SELECT
InvoiceDocument AS "InvoiceNumber",
CASE
WHEN ClearingDate > PaymentDueDate THEN 'Late Payment Executed'
ELSE 'Payment Executed'
END AS "ActivityName",
CAST(ClearingDate AS TIMESTAMP) AS "EventTime",
CAST(NULL AS VARCHAR(12)) AS "UserName", -- User for clearing is not always straightforward
CompanyCode AS "CompanyCode",
VendorNumber AS "VendorNumber",
AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
PaymentDueDate AS "PaymentDueDate",
DocumentType AS "DocumentType",
'' AS "PaymentBlockReason",
PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase
WHERE ClearingDate IS NOT NULL AND IsReversed = FALSE
UNION ALL
-- 13. Invoice Reversed
SELECT
rev.OriginalInvoiceDocument AS "InvoiceNumber",
'Invoice Reversed' AS "ActivityName",
rev.CreationDateTime AS "EventTime",
rev.CreatedByUser AS "UserName",
rev.CompanyCode AS "CompanyCode",
rev.Supplier AS "VendorNumber",
rev.GrossInvoiceAmountInCoCoCrcy AS "AmountInCompanyCodeCurrency",
CAST(NULL AS DATE) AS "PaymentDueDate",
rev.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
rev.PurchasingDocument AS "PurchasingDocument"
FROM I_InvoiceDocument AS rev
WHERE rev.OriginalInvoiceDocument IN (SELECT InvoiceDocument FROM InvoiceBase) AND rev.IsReversal = 'X' Stappen
- Toegang tot de ABAP Editor: Log in op uw SAP S/4HANA-systeem. Open transactie
SE38(ABAP Editor). - Maak het Programma aan: Voer een naam in voor uw nieuwe programma in het Program-veld, bijvoorbeeld
Z_PM_INVOICE_EXTRACT, en klik op de knop 'Create'. Geef een titel op, stel het type in op 'Executable Program' en sla het op in een geschikt pakket. - Definieer Programmastructuur en Selectiescherm: Definieer in de editor de datastructuren voor de uiteindelijke event log-output. Creëer vervolgens een selectiescherm waarmee gebruikers parameters kunnen invoeren, zoals een datumbereik voor de factuurinvoerdatum, bedrijfscodes en documenttypes. Dit maakt het programma herbruikbaar en flexibel.
- Implementeer Data Selectie Logica: Schrijf de kern ABAP SQL-statements om data te selecteren uit de verschillende SAP-tabellen. Het programma zal sequentieel query's uitvoeren voor elk van de 13 vereiste activiteiten.
- Extraheer Header en Item Data: Voor fundamentele events zoals 'Factuurdocument Aangemaakt' en 'Factuur Geboekt', selecteert u data uit primaire tabellen zoals
RBKP(Logistieke Factuur Header) enBKPF(Boekingsdocument Header). - Extraheer Wijzigingsdocumentdata: Voor activiteiten zoals 'Betalingsblokkade Ingesteld' en 'Betalingsblokkade Verwijderd', query de wijzigingsdocumenttabellen
CDHDR(Wijzigingsdocument header) enCDPOS(Wijzigingsdocument items). U moet wijzigingen in specifieke velden identificeren, bijvoorbeeldZLSPRin tabelBSEG. - Extraheer Betalingsdata: Om betalingsgerelateerde activiteiten vast te leggen, query tabellen zoals
REGUP(Verwerkte items uit betalingsprogramma) voor betalingsvoorstellen enBSAK(Vereffende Leveranciersitems) voor uitgevoerde betalingen. Differentieer 'Te Late Betaling Uitgevoerd' door de vereffeningsdatum (AUGDT) te vergelijken met de netto vervaldatum (ZFBDT). - Extraheer Workflow Data: Voor goedkeuringsactiviteiten, query SAP Business Workflow-tabellen zoals
SWW_WI2OBJom workflow-items te koppelen aan factuurobjecten. Dit deel is sterk afhankelijk van uw specifieke workflow-configuratie en kan aanzienlijke aanpassingen vereisen. - Unificeer Data in Event Log Formaat: Voor elke geselecteerde activiteit, formatteer de data in een gemeenschappelijke interne tabelstructuur. Elke rij in deze tabel vertegenwoordigt een enkele event en moet de case-identificatie (
InvoiceNumber),ActivityNameenEventTimebevatten, samen met andere aanbevolen attributes. - Genereer het Output Bestand: Gebruik ABAP-statements
OPEN DATASET,TRANSFERenCLOSE DATASETom de inhoud van de uiteindelijke interne tabel naar een plat bestand op de SAP-applicatieserver te schrijven. Een komma-gescheiden waarde (CSV) formaat wordt aanbevolen. - Plan en Voer uit: Voer het programma op de voorgrond uit voor testen (met
F8). Plan het voor productieruns als een background job met transactieSM36om tijdens daluren uit te voeren en zo impact op de systeemprestaties te voorkomen. - Ophalen en Uploaden: Gebruik transactie
AL11om naar de applicatieserverdirectory te navigeren waar het bestand is opgeslagen. Download het bestand naar uw lokale systeem. Zorg ervoor dat het bestand UTF-8 gecodeerd en correct geformatteerd is voordat u het uploadt naar de process mining tool.
Configuratie
- Datumbereik: Definieer een specifiek datumbereik voor de extractie op basis van de factuurinvoerdatum (
RBKP-CPUDT) of boekingsdatum (BKPF-BUDAT). Voor een initiële analyse wordt een periode van 3 tot 6 maanden aanbevolen om een beheersbaar datavolume te garanderen. - Bedrijfscode (BUKRS): Het is cruciaal om te filteren op één of meerdere bedrijfscodes. Het extraheren van data voor alle bedrijfscodes in een grote organisatie kan leiden tot extreem lange looptijden en grote bestanden.
- Documenttype (BLART): Filter op relevante documenttypes om leveranciersfacturen te isoleren. Veelvoorkomende types zijn 'RE' (Factuur - Bruto) en 'KR' (Leveranciersfactuur). Dit helpt irrelevante documenten van de analyse uit te sluiten.
- Leveranciersrekening (LIFNR): Het programma kan een optioneel filter voor specifieke leveranciersnummers bevatten, wat nuttig is voor gerichte analyse of testen.
- Output Bestandsconfiguratie: Het programma moet parameters hebben om het outputbestandspad op de applicatieserver en de veldscheidingsteken te definiëren, bijvoorbeeld een komma of puntkomma.
- Vereisten: De gebruiker of het systeemaccount dat dit programma uitvoert, heeft ontwikkelaarstoegang nodig om ABAP-programma's te maken en uit te voeren (via
SE38) en uitgebreide leesautorisaties voor FI-, MM- en Basis-tabellen, inclusiefBKPF,BSEG,RBKP,RSEG,CDHDR,CDPOSen workflow-tabellen.
a Voorbeeldquery abap
REPORT Z_PM_INVOICE_EXTRACT.
* --- Internal table structure for the final event log
TYPES: BEGIN OF ty_s_event_log,
invoicenumber TYPE char25,
activityname TYPE char50,
eventtime TYPE char19, "YYYY-MM-DD HH:MM:SS
username TYPE sy-uname,
companycode TYPE bukrs,
vendornumber TYPE lifnr,
amountincompanycodecurrency TYPE wrbtr,
paymentduedate TYPE char10, "YYYY-MM-DD
documenttype TYPE blart,
paymentblockreason TYPE char1,
purchasingdocument TYPE ebeln,
END OF ty_s_event_log.
DATA: lt_event_log TYPE STANDARD TABLE OF ty_s_event_log.
DATA: ls_event_log TYPE ty_s_event_log.
* --- Selection Screen for user inputs
PARAMETERS: p_path TYPE string DEFAULT '/usr/sap/tmp/invoice_events.csv'.
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY, " Entry Date
s_bukrs FOR bkpf-bukrs OBLIGATORY, " Company Code
s_blart FOR bkpf-blart. " Document Type
START-OF-SELECTION.
* --- 1. Invoice Document Created (from Logistics Invoice Verification)
SELECT CONCAT( rbkp~belnr, rbkp~gjahr ) AS invoicenumber,
'Invoice Document Created' AS activityname,
CONCAT( rbkp~cpudt, rbkp~cputm ) AS eventtime,
rbkp~usnam AS username,
rbkp~bukrs AS companycode,
rbkp~lifnr AS vendornumber,
rbkp~rmwwr AS amountincompanycodecurrency,
'' AS paymentduedate,
rbkp~blart AS documenttype,
rbkp~zuonr AS paymentblockreason,
'' AS purchasingdocument
FROM rbkp
INTO TABLE @DATA(lt_created)
WHERE rbkp~cpudt IN @s_erdat
AND rbkp~bukrs IN @s_bukrs
AND rbkp~blart IN @s_blart.
LOOP AT lt_created INTO DATA(ls_created).
ls_event_log-invoicenumber = ls_created-invoicenumber.
ls_event_log-activityname = ls_created-activityname.
ls_event_log-eventtime = |{ ls_created-eventtime(8) } { ls_created-eventtime+8(2) }:{ ls_created-eventtime+10(2) }:{ ls_created-eventtime+12(2) }|.
ls_event_log-username = ls_created-username.
ls_event_log-companycode = ls_created-companycode.
ls_event_log-vendornumber = ls_created-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_created-amountincompanycodecurrency.
ls_event_log-paymentduedate = ''.
ls_event_log-documenttype = ls_created-documenttype.
ls_event_log-paymentblockreason = ''.
ls_event_log-purchasingdocument = ls_created-purchasingdocument.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 2. Invoice Parked (assuming status 'A' or 'B' in RBKP)
SELECT CONCAT( belnr, gjahr ) AS invoicenumber,
'Invoice Parked' AS activityname,
CONCAT( cpudt, cputm ) AS eventtime,
usnam AS username,
bukrs AS companycode,
lifnr AS vendornumber,
rmwwr AS amountincompanycodecurrency,
'' AS paymentduedate,
blart AS documenttype,
'' AS paymentblockreason,
'' AS purchasingdocument
FROM rbkp
INTO TABLE @DATA(lt_parked)
WHERE rbstat IN ('A', 'B')
AND cpudt IN @s_erdat
AND bukrs IN @s_bukrs
AND blart IN @s_blart.
LOOP AT lt_parked INTO DATA(ls_parked).
ls_event_log-invoicenumber = ls_parked-invoicenumber.
ls_event_log-activityname = ls_parked-activityname.
ls_event_log-eventtime = |{ ls_parked-eventtime(8) } { ls_parked-eventtime+8(2) }:{ ls_parked-eventtime+10(2) }:{ ls_parked-eventtime+12(2) }|.
ls_event_log-username = ls_parked-username.
ls_event_log-companycode = ls_parked-companycode.
ls_event_log-vendornumber = ls_parked-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_parked-amountincompanycodecurrency.
ls_event_log-paymentduedate = ''.
ls_event_log-documenttype = ls_parked-documenttype.
ls_event_log-paymentblockreason = ''.
ls_event_log-purchasingdocument = ''.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 3, 4, 5. Sent For Approval, Approved, Rejected (Placeholder logic, needs adaptation)
* --- This logic is a generic template for SAP Business Workflow.
* --- Your implementation will vary. You must identify the correct workflow tasks.
SELECT obj.instid, wi.wi_cd, wi.wi_ct, wi.wi_stat, wi.wi_aagent
FROM sww_wi2obj AS obj
JOIN swwlog AS wi ON obj~instid = wi~wi_id
INTO TABLE @DATA(lt_workflow)
WHERE obj~typeid = 'BUS2081' " Business Object for Incoming Invoice
AND obj~catid = 'BO'
AND wi~wi_cd IN s_erdat.
LOOP AT lt_workflow INTO DATA(ls_workflow).
* --- This is a placeholder, adapt task IDs and logic
CASE ls_workflow-wi_stat.
WHEN 'STARTED'.
ls_event_log-activityname = 'Invoice Sent For Approval'.
WHEN 'COMPLETED'.
ls_event_log-activityname = 'Invoice Approved'.
WHEN 'CANCELLED'.
ls_event_log-activityname = 'Invoice Rejected'.
WHEN OTHERS.
CONTINUE.
ENDCASE.
* --- Code to get invoice details based on ls_workflow-instid needed here
* --- ... appending to lt_event_log ...
ENDLOOP.
* --- 6, 7, 8. Payment Block Set/Removed, Data Updated (from Change Docs)
SELECT h~objectid, h~username, h~udate, h~utime, p~fname, p~value_new, p~value_old
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectclas = p~objectclas AND h~objectid = p~objectid AND h~changenr = p~changenr
INTO TABLE @DATA(lt_changes)
WHERE h~objectclas = 'BELEGV'
AND h~udate IN s_erdat.
LOOP AT lt_changes INTO DATA(ls_change).
ls_event_log-invoicenumber = |{ ls_change-objectid+10(10) }{ ls_change-objectid(4) }|.
ls_event_log-username = ls_change-username.
ls_event_log-eventtime = |{ ls_change-udate } { ls_change-utime(2) }:{ ls_change-utime+2(2) }:{ ls_change-utime+4(2) }|.
IF ls_change-fname = 'ZLSPR'. " Payment Block
IF ls_change-value_old IS INITIAL AND ls_change-value_new IS NOT INITIAL.
ls_event_log-activityname = 'Payment Block Set'.
ls_event_log-paymentblockreason = ls_change-value_new.
ELSEIF ls_change-value_old IS NOT INITIAL AND ls_change-value_new IS INITIAL.
ls_event_log-activityname = 'Payment Block Removed'.
ls_event_log-paymentblockreason = ''.
ELSE.
CONTINUE.
ENDIF.
ELSE.
ls_event_log-activityname = 'Invoice Data Updated'.
ENDIF.
* --- Need to select other attributes based on invoice number
* --- ... appending to lt_event_log ...
ENDLOOP.
* --- 9. Invoice Posted
SELECT CONCAT( bkpf~belnr, bkpf~gjahr ) AS invoicenumber,
'Invoice Posted' AS activityname,
CONCAT( bkpf~cpudt, bkpf~cputm ) AS eventtime,
bkpf~usnam AS username,
bkpf~bukrs AS companycode,
bseg~lifnr AS vendornumber,
bseg~wrbtr AS amountincompanycodecurrency,
bseg~zfBDT AS paymentduedate,
bkpf~blart AS documenttype,
bseg~zlspr AS paymentblockreason,
bseg~ebeln AS purchasingdocument
FROM bkpf
JOIN bseg ON bkpf~bukrs = bseg~bukrs AND bkpf~belnr = bseg~belnr AND bkpf~gjahr = bseg~gjahr
INTO TABLE @DATA(lt_posted)
WHERE bkpf~cpudt IN @s_erdat
AND bkpf~bukrs IN @s_bukrs
AND bkpf~blart IN @s_blart
AND bseg~koart = 'K'. " Vendor line
LOOP AT lt_posted INTO DATA(ls_posted).
ls_event_log-invoicenumber = ls_posted-invoicenumber.
ls_event_log-activityname = ls_posted-activityname.
ls_event_log-eventtime = |{ ls_posted-eventtime(8) } { ls_posted-eventtime+8(2) }:{ ls_posted-eventtime+10(2) }:{ ls_posted-eventtime+12(2) }|.
ls_event_log-username = ls_posted-username.
ls_event_log-companycode = ls_posted-companycode.
ls_event_log-vendornumber = ls_posted-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_posted-amountincompanycodecurrency.
ls_event_log-paymentduedate = ls_posted-paymentduedate.
ls_event_log-documenttype = ls_posted-documenttype.
ls_event_log-paymentblockreason = ls_posted-paymentblockreason.
ls_event_log-purchasingdocument = ls_posted-purchasingdocument.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 10. Payment Proposal Created
SELECT CONCAT( regup~belnr, regup~gjahr ) AS invoicenumber,
'Payment Proposal Created' AS activityname,
CONCAT( reguh~erfdt, reguh~erfzt ) AS eventtime,
reguh~erfbu AS username,
regup~bukrs AS companycode,
regup~lifnr AS vendornumber,
regup~wrbtr AS amountincompanycodecurrency,
'' AS paymentduedate,
regup~blart AS documenttype,
'' AS paymentblockreason,
'' AS purchasingdocument
FROM regup
JOIN reguh ON regup~laufd = reguh~laufd AND regup~laufi = reguh~laufi
INTO TABLE @DATA(lt_proposal)
WHERE reguh~erfdt IN @s_erdat
AND regup~bukrs IN @s_bukrs.
LOOP AT lt_proposal INTO DATA(ls_proposal).
ls_event_log-invoicenumber = ls_proposal-invoicenumber.
ls_event_log-activityname = ls_proposal-activityname.
ls_event_log-eventtime = |{ ls_proposal-eventtime(8) } { ls_proposal-eventtime+8(2) }:{ ls_proposal-eventtime+10(2) }:{ ls_proposal-eventtime+12(2) }|.
ls_event_log-username = ls_proposal-username.
ls_event_log-companycode = ls_proposal-companycode.
ls_event_log-vendornumber = ls_proposal-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_proposal-amountincompanycodecurrency.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 11, 12. Payment Executed / Late Payment Executed
SELECT CONCAT( belnr, gjahr ) AS invoicenumber,
augdt,
zfBDT
FROM bsak
INTO TABLE @DATA(lt_cleared)
WHERE augdt IN @s_erdat
AND bukrs IN @s_bukrs.
LOOP AT lt_cleared INTO DATA(ls_cleared).
IF ls_cleared-augdt > ls_cleared-zfbdt.
ls_event_log-activityname = 'Late Payment Executed'.
ELSE.
ls_event_log-activityname = 'Payment Executed'.
ENDIF.
ls_event_log-invoicenumber = ls_cleared-invoicenumber.
ls_event_log-eventtime = |{ ls_cleared-augdt } 00:00:00|.
* --- Need to select other attributes based on invoice number
* --- ... appending to lt_event_log ...
ENDLOOP.
* --- 13. Invoice Reversed
SELECT CONCAT( stblg, stjah ) AS invoicenumber,
'Invoice Reversed' AS activityname,
CONCAT( cpudt, cputm ) AS eventtime,
usnam AS username,
bukrs AS companycode,
'' AS vendornumber,
'' AS amountincompanycodecurrency,
'' AS paymentduedate,
blart AS documenttype,
'' AS paymentblockreason,
'' AS purchasingdocument
FROM bkpf
INTO TABLE @DATA(lt_reversed)
WHERE stblg IS NOT NULL
AND cpudt IN @s_erdat
AND bukrs IN @s_bukrs.
LOOP AT lt_reversed INTO DATA(ls_reversed).
ls_event_log-invoicenumber = ls_reversed-invoicenumber.
ls_event_log-activityname = ls_reversed-activityname.
ls_event_log-eventtime = |{ ls_reversed-eventtime(8) } { ls_reversed-eventtime+8(2) }:{ ls_reversed-eventtime+10(2) }:{ ls_reversed-eventtime+12(2) }|.
ls_event_log-username = ls_reversed-username.
ls_event_log-companycode = ls_reversed-companycode.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- Write internal table to CSV file
OPEN DATASET p_path FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
ENDIF.
DATA: lv_line TYPE string.
FIELD-SYMBOLS: <fs_any> TYPE any.
* --- Header row
lv_line = 'InvoiceNumber,ActivityName,EventTime,UserName,CompanyCode,VendorNumber,AmountInCompanyCodeCurrency,PaymentDueDate,DocumentType,PaymentBlockReason,PurchasingDocument'.
TRANSFER lv_line TO p_path.
LOOP AT lt_event_log INTO ls_event_log.
CLEAR lv_line.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE ls_event_log TO <fs_any>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF sy-index = 1.
lv_line = <fs_any>.
ELSE.
CONCATENATE lv_line <fs_any> INTO lv_line SEPARATED BY ','.
ENDIF.
ENDDO.
TRANSFER lv_line TO p_path.
ENDLOOP.
CLOSE DATASET p_path.
WRITE: / 'Extraction complete. File saved to:', p_path.