Uw Inkoop tot betaling - Factuurverwerking datatemplate
Uw Inkoop tot betaling - Factuurverwerking datatemplate
- Aanbevolen attributen om vast te leggen
- Belangrijkste activiteiten om te volgen
- Extractiehandleiding voor SAP S/4HANA
Inkoop tot betaling - Factuurverwerkings-attributen
| Naam | Omschrijving | ||
|---|---|---|---|
| Factuurnummer InvoiceNumber | De unieke ID voor het factuurdocument van de leverancier, die dient als de primaire case kenmerk voor het proces. | ||
| Omschrijving Het Invoice Number is de unieke ID 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 belangrijk voor het volgen van de volledige procesgang van elke factuur. Het maakt de reconstructie van de volledige processtroom mogelijk, van ontvangst tot uiteindelijke betaling, waardoor analyse van doorlooptijden, knelpunten en procesvarianten op individueel factuurniveau mogelijk worden. Het belang Het is de onmisbaar om alle gerelateerde gebeurtenissen te verbinden, waardoor een volledige trace van de levenscyclus van een factuur door het systeem mogelijk worden. Vindplaats Dit is het Boekhouding Document Number, te vinden in tabel BKPF, veld BELNR. Voorbeelden 190000000119000000451900000132 | |||
| Activiteitsnaam ActivityName | De naam van de bedrijfsactiviteit of het `gebeurtenis` dat op een specifiek tijdsTip voor een factuur heeft plaatsgevonden. | ||
| Omschrijving De activiteitsnaam 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 belangrijk 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 knelpunten, herstelwerk-loops en niet-conforme procesvarianten vinden. 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 vastlegt wanneer een specifieke activiteit plaatsvond. Deze gegevens zijn belangrijk voor het berekenen van doorlooptijden, doorlooptijden en wachttijden tussen verschillende stappen in het proces. In process mining-analyse worden nauwkeurige tijdstempels 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 vinden voor procesversnelling. Het belang Deze timestamp is de basis voor alle tijdsgebaseerde analyses, inclusief prestaties 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 gebeurtenissen 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 onderdeel die een juridisch onafhankelijk bedrijf vertegenwoordigt waarvoor financiële overzichten worden opgesteld. | ||
| Omschrijving De De bedrijfscode is een fundamentele onderdeel 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 belangrijk om de procesprestaties over verschillende bedrijfsonderdelen, juridische entiteiten of landen te analyseren. Het helpt bij het vinden 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 hoogwaardige voor snellere verwerking, het vinden van trends in uitgaven en het correleren van procesproblemen met financiële waarde. Het kan bijvoorbeeld worden gebruikt om te onderzoeken of facturen met hoogwaardige vaker worden geblokkeerd of langere goedkeuringstijden hebben. Het belang Biedt financiële context aan het proces, waardoor analyse op basis van financiële waarde mogelijk is, zoals het vinden of facturen met hoogwaardige 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 vinden 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 belangrijk 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 belangrijk 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 `kenmerk` voor de leverancier die de factuur heeft ingediend. | ||
| Omschrijving Het Leveranciersnummer laat zien welke 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 vinden, 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 'Aantal Discrepancy' of 'Price Mismatch'. Deze redenen zijn in SAP geconfigureerd voor een gestandaardiseerde afhandeling van uitzonderingen. Dit attribuut is belangrijk 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 belangrijk 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 vinden, zoals onvolledige Informatie of onjuiste codering, en het proces verbeteren. Het belang Kwantificeert rework binnen het goedkeuringssubproces, en helpt zo de 'first-time-right' ratio te meten en redenen voor afgekeurde goedkeuringen te vinden. 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 vinden 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 herkomstele 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 `kenmerk` van het bron SAP S/4HANA systeem waaruit de `data` is opgehaald. | ||
| 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 belangrijk voor data governance en probleemoplossing 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 belangrijk 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 opgehaald. | ||
| 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 belangrijk voor operationele dashboards om te waarborgen dat beslissingen gebaseerd zijn op actuele Informatie en om dataverversingscycli effectief te beheren. Het belang Geeft de relevantie 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 belangrijk 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 belangrijk is voor het beheren van werkkapitaal en het gebruikmaken van kortingen. Vindplaats Gevonden in de documentheader-tabel BKPF, veld BLDAT (Documentdatum). Voorbeelden 2023-04-122023-05-152023-06-20 | |||
| 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 vinden van kansen voor verdere automatisering. Vindplaats Afgeleid van de GebruikerNaam attribuut. 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 rework 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 volgorde 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 basisberekening 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 attribuut. (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 belangrijk is voor doorlooptijd- en betalingsprestatie-analyse. Vindplaats Gevonden in de documentsigmenttabel BSEG, veld AUGBL (Vereffeningsdocumentnummer). Voorbeelden 150000000115000000231500000088 | |||
Inkoop tot betaling - 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 belangrijk voor het berekenen van de totale end-to-end doorlooptijd en voor het meten van tijdige betalingsprestaties ten opzichte van de vervaldatum. Vindplaats Dit gebeurtenis 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 gebeurtenis 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 belangrijke maatstaf voor interne verwerkingsefficiëntie. Vindplaats Dit gebeurtenis 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 gebeurtenis. 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 gebeurtenis 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 belangrijk 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 gebeurtenis 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-gebeurtenissen of wijzigingen in het vrijgavestatusveld van een document. Gebeurtenistype inferred | |||
| Factuurdocument aangemaakt | Dit is het eerste gebeurtenis, 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 belangrijk voor het verbeteren van tijdige betalingen. Vindplaats Dit gebeurtenis 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 belangrijk voor het verbeteren van de efficiency en leveranciersrelaties. Vindplaats Dit gebeurtenis 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 inzichtelijk maken. 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 `gebeurtenis` leidt tot rework, 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 vinden van verbeterkansen en trainingsbehoeften. Vindplaats Dit wordt afgeleid uit specifieke statusupdates in een SAP-workflow, zoals de status 'afgewezen', of uit gebeurtenissen 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 vinden 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 Verzonden ter Goedkeuring | 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 belangrijk voor het vinden 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 reworkcycli 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 vinden. 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-gebeurtenissen uit tabellen CDHDR en CDPOS voor het factuurobject. Gebeurtenistype explicit | |||
| Te late betaling uitgevoerd | Dit is een berekend `gebeurtenis` 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 | |||
Extractiegidsen
Stappen
- Verplichten 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,ActiviteitNaamenEventTimezijn gevuld. Controleer of u een verscheidenheid aan verschillende activiteiten ziet in deActiviteitNaam-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 attributen:
InvoiceNumber,ActiviteitNaam,EventTime,GebruikerNaam,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-attributen zoals betalingsblokkades en workflow status. - Datumfilter: Het is belangrijk 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. - Verplichten: 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 belangrijk 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
- Verplichten 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,ActiviteitNaamenEventTimezijn gevuld. Controleer of u een verscheidenheid aan verschillende activiteiten ziet in deActiviteitNaam-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 attributen:
InvoiceNumber,ActiviteitNaam,EventTime,GebruikerNaam,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-attributen zoals betalingsblokkades en workflow status. - Datumfilter: Het is belangrijk 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. - Verplichten: 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 belangrijk 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 Bewerkenor: Log in op uw SAP S/4HANA-systeem. Open transactie
SE38(ABAP Bewerkenor). - 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 volgordeel query's uitvoeren voor elk van de 13 vereiste activiteiten.
- Extraheer Header en Item Data: Voor fundamentele gebeurtenissen 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 vinden, 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 gebeurtenis en moet de case-identificatie (
InvoiceNumber),ActiviteitNaamenEventTimebevatten, samen met andere aanbevolen attributen. - 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 producpakketuns 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 zorgen. - Bedrijfscode (BUKRS): Het is belangrijk 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.
- Verplichten: 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 volledige 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.