Datatemplate voor Order to Cash-facturatie en factuurverwerking
Datatemplate voor Order to Cash-facturatie en factuurverwerking
- Aanbevolen attributen voor een volledige analyse
- Belangrijke processtappen en mijlpalen om te volgen
- Praktische aanwijzingen voor data-extractie uit SAP ECC
Attributen voor Order to Cash-facturatie en factuurverwerking
| Naam | Beschrijving | ||
|---|---|---|---|
| Activiteit ActivityName | De naam van de bedrijfsgebeurtenis of processtap die plaatsvond tijdens de levenscyclus van de factuur. | ||
| Beschrijving Dit attribuut beschrijft een specifieke actie of statuswijziging in het facturatieproces, zoals ‘Factuur gegenereerd’, ‘Factuur geboekt’ of ‘Klantbetaling ontvangen’. Deze activiteiten worden afgeleid uit verschillende systeemgebeurtenissen, statuswijzigingen in documenten of transacties die gebruikers uitvoeren. De volgorde van de activiteiten vormt de procesflow en is de basis voor process mining. Door de activiteiten te bekijken, zie je welke stappen worden uitgevoerd, in welke volgorde en hoe vaak. Zo wordt duidelijk hoe het proces werkelijk verloopt en hoe dat zich verhoudt tot het ontworpen proces. Waarom dit belangrijk is Dit bepaalt de stappen op de proceskaart en maakt het mogelijk procesflows, afwijkingen en bottlenecks zichtbaar te maken en te analyseren. Waar vind je dit? Dit is een conceptueel attribuut dat wordt afgeleid uit meerdere bronnen, zoals transactiecodes (CDHDR-TCODE), documentstatuswijzigingen (VBUK-FKSTK) en boekingen in boekhoudkundige documenten. Voorbeelden Factuur aangemaaktFactuur geboektBetalingsherinnering verstuurdFactuur afgeletterd | |||
| Factuurnummer InvoiceNumber | De unieke identificatie van het factuurdocument. Dit is de primaire case-ID voor het facturatieproces. | ||
| Beschrijving Het factuurnummer, in SAP bekend als het factuurdocumentnummer, identificeert elke factuur uniek. Bij process mining fungeert het als Case-ID en groepeert het alle bijbehorende activiteiten, zoals aanmaken, boeken, verzenden, betalen en vereffenen, in één end-to-end procesinstantie. Met een analyse op basis van het factuurnummer krijg je een volledig beeld van de levenscyclus van elke factuurtransactie, vanaf het begin tot de uiteindelijke vereffening. Dit is belangrijk voor het berekenen van KPI’s zoals Days Sales Outstanding (DSO) en de totale factuurdoorlooptijd. Zo ontstaat een duidelijke basis om prestaties te meten en te verbeteren. Waarom dit belangrijk is Dit is de sleutel om het volledige verloop van een factuur te volgen en doorlooptijden, bottlenecks en afwijkingen per factuurtransactie te analyseren. Waar vind je dit? SAP ECC-tabel: VBRK, veld: VBELN Voorbeelden 90001234900012359000123690001237 | |||
| Starttijd EventTime | De timestamp die aangeeft wanneer een specifieke activiteit of gebeurtenis plaatsvond. | ||
| Beschrijving De gebeurtenistijd legt de precieze datum en tijd van elke activiteit in de levenscyclus van de factuur vast. Deze timestamp vormt de basis voor alle tijdsanalyses in process mining, zoals het berekenen van doorlooptijden, het vinden van bottlenecks en het bewaken van de procesprestaties ten opzichte van service level agreements. Dit attribuut wordt meestal samengesteld uit een datumveld, zoals boekingsdatum (BUDAT), en een tijdveld (UZEIT) uit verschillende SAP-tabellen waarin wijzigingen of documentaanmaak worden vastgelegd. Nauwkeurige timestamps zijn nodig voor een betrouwbaar event log en geldige prestatieanalyses. Waarom dit belangrijk is Dit attribuut vormt de basis voor prestatieanalyses en maakt het mogelijk doorlooptijden, tijdsduur en wachttijden tussen processtappen te berekenen. Waar vind je dit? Samengesteld uit verschillende datum- en tijdvelden in meerdere tabellen, zoals BKPF (BUDAT, CPUTM), VBRK (ERDAT, ERZET) en wijzigingslogtabellen zoals CDHDR (UDATE, UTIME). Voorbeelden 2023-04-15T10:30:00Z2023-04-16T11:00:00Z2023-05-20T09:00:00Z | |||
| Bedrijfsnummer CompanyCode | De identificatie van de juridische entiteit die de factuur heeft uitgegeven. | ||
| Beschrijving Het bedrijfsnummer vertegenwoordigt een zelfstandige juridische en boekhoudkundige eenheid in SAP. Alle financiële transacties, waaronder facturen, worden op een specifiek bedrijfsnummer geboekt. Dit is een belangrijk organisatiegegeven. Bij process mining gebruik je het bedrijfsnummer om de prestaties van facturatieprocessen bij verschillende juridische entiteiten binnen een organisatie te analyseren en te vergelijken. Zo kun je goede werkwijzen bij de ene entiteit vinden en toepassen bij andere. Ook sluit de analyse zo aan op de organisatiestructuur. Waarom dit belangrijk is Maakt het mogelijk processen bij verschillende juridische entiteiten te filteren en te vergelijken. Dit is belangrijk voor financiële analyses en vergelijkingen binnen de organisatie. Waar vind je dit? SAP ECC-tabel: VBRK, veld: BUKRS Voorbeelden 10002000US01DE01 | |||
| Factuurdocumenttype BillingDocumentType | Een code die het type factuurdocument aangeeft, zoals een factuur, creditnota of debetnota. | ||
| Beschrijving Het factuurdocumenttype deelt transacties in op basis van hun bedrijfsdoel. ‘F2’ is bijvoorbeeld een standaardklantfactuur en ‘G2’ een creditnota. In SAP bepaalt deze classificatie hoe verschillende factuurdocumenten worden verwerkt. Bij process mining is dit attribuut belangrijk om verschillende facturatiescenario’s te filteren en te vergelijken. Analisten kunnen standaardfacturen apart bekijken van creditnota’s om de bijbehorende procesflows, doorlooptijden en uitdagingen te begrijpen. Dat helpt om verbeteringen gerichter aan te pakken. Waarom dit belangrijk is Maakt het mogelijk verschillende facturatieprocessen, zoals standaardfacturen en creditnota’s, apart te analyseren. De procesflows kunnen sterk van elkaar verschillen. Waar vind je dit? SAP ECC-tabel: VBRK, veld: FKART Voorbeelden F2G2L2IV | |||
| Gebruikersnaam UserName | De ID van de gebruiker die de activiteit heeft uitgevoerd of het document heeft aangemaakt. | ||
| Beschrijving Dit attribuut legt de SAP-gebruikers-ID vast van degene die verantwoordelijk is voor een gebeurtenis, zoals het aanmaken van een factuur of het boeken van een betaling. Zo kun je de menselijke kant van het proces analyseren. Met deze data kun je prestatieverschillen tussen gebruikers of teams onderzoeken, opleidingsbehoeften vaststellen en mogelijke complianceproblemen opsporen. Je kunt ook handmatige activiteiten van gebruikers onderscheiden van geautomatiseerde stappen door systeem- of batchgebruikers. Dat is belangrijk om de automatiseringsgraad te berekenen. Waarom dit belangrijk is Maakt analyses mogelijk van gebruikersprestaties en werkverdeling. Ook helpt het handmatige activiteiten te onderscheiden van geautomatiseerde stappen, als basis voor initiatieven rond automatisering en efficiëntie. Waar vind je dit? SAP ECC-tabel: VBRK, veld: ERNAM (aangemaakt door), of BKPF, veld: USNAM (gebruikersnaam), of CDHDR, veld: USERNAME (gebruiker). Voorbeelden JSMITHBW_BATCHLROSSIMKUMAR | |||
| Klantnummer CustomerNumber | Een uniek nummer dat de klant identificeert aan wie de factuur is gericht. | ||
| Beschrijving Het klantnummer koppelt een factuur aan een specifieke klant of zakenpartner. Met dit attribuut kun je het facturatieproces analyseren en uitsplitsen op basis van klantkenmerken. Analisten kunnen dit veld gebruiken om Days Sales Outstanding (DSO) per klant te vergelijken, te zien welke klanten vaak te laat betalen of de naleving van betalingstermijnen te analyseren. Inzicht in deze patronen helpt bij het beheren van klantrelaties en het afstemmen van incassostrategieën op verschillende klantgroepen. Waarom dit belangrijk is Maakt analyses per klant mogelijk. Zo kun je betaalgedrag onderzoeken, DSO per klant bepalen en incassostrategieën afstemmen. Waar vind je dit? SAP ECC-tabel: VBRK, veld: KUNRG (betaler) of KUNAG (opdrachtgever). Voorbeelden 100023200541CUST-A487910345 | |||
| Totaal factuurbedrag TotalInvoiceAmount | De totale nettowaarde van het factuurdocument. | ||
| Beschrijving Dit attribuut geeft het totale nettobedrag van de factuur weer, exclusief belastingen. Het factuurbedrag is een belangrijk financieel gegeven in het facturatieproces. Je kunt facturen bijvoorbeeld indelen in hoge en lage bedragen om te zien of de procesflows verschillen. Ook kun je incasso’s prioriteren of onderzoeken waarom facturen met hoge bedragen langer op goedkeuring of betaling wachten. Deze financiële context voegt een extra dimensie toe aan de procesanalyse. Waarom dit belangrijk is Geeft financiële context voor analyses op basis van factuurwaarde. Zo kun je nagaan of facturen met hoge bedragen een ander proces volgen of langer op vereffening wachten. Waar vind je dit? SAP ECC-tabel: VBRK, veld: NETWR Voorbeelden 1500.7525000.00500.0012345.67 | |||
| Betalingstermijnen PaymentTerms | De voorwaarden waaronder een verkoper een verkoop afrondt, waaronder het betalingsschema. | ||
| Beschrijving Betalingstermijnen bepalen wanneer een betaling verschuldigd is, bijvoorbeeld ‘Netto 30’ of ‘Netto 60’. Deze voorwaarden worden met de klant afgesproken en hebben invloed op de kasstroom. Een analyse per betalingstermijn kan laten zien of bepaalde voorwaarden samengaan met langere betalingstermijnen of vaker te late betalingen. Met die informatie kan het bedrijf betere voorwaarden met klanten afspreken of de financiële planning aanpassen. De betalingstermijn is ook een belangrijke invoer voor het berekenen van de vervaldatum van de factuur. Waarom dit belangrijk is Helpt het betaalgedrag van klanten en de invloed op de kasstroom te analyseren aan de hand van afgesproken voorwaarden. Dit geeft aanknopingspunten om commerciële afspraken te verbeteren. Waar vind je dit? SAP ECC-tabel: VBRK, veld: ZTERM Voorbeelden Z030Z060Z001 | |||
| Boekingsdatum PostingDate | De datum waarop het document in de financiële administratie wordt geboekt. | ||
| Beschrijving De boekingsdatum bepaalt in welke boekingsperiode de transactie in het grootboek wordt opgenomen. Deze datum is belangrijk voor de boekhouding en financiële rapportages. Vertraging tussen het aanmaken en boeken van een document kan wijzen op inefficiënties in de interne verwerking van factuurdocumenten. Bij process mining markeert de boekingsdatum een belangrijke stap in de levenscyclus van de factuur. De tijd tussen het genereren en boeken van de factuur kan dienen als KPI voor de efficiëntie van de facturatieafdeling. Waarom dit belangrijk is Markeert een belangrijke financiële stap en is belangrijk voor de boekhouding. De tijd tussen het aanmaken en boeken van een factuur geeft aan hoe efficiënt de interne verwerking verloopt. Waar vind je dit? SAP ECC-tabel: BKPF, veld: BUDAT Voorbeelden 2023-04-152023-04-172023-05-21 | |||
| Bronsysteem SourceSystem | Geeft aan uit welk bronsysteem de data is gehaald. | ||
| Beschrijving Dit attribuut geeft aan uit welk registratiesysteem de data afkomstig is. In organisaties met meerdere ERP-instanties of geïntegreerde systemen helpt dit veld om data uit verschillende bronnen van elkaar te onderscheiden. Bij process mining is dit belangrijk voor datavalidatie en voor analyses waarin processen tussen systemen of organisatieonderdelen worden vergeleken. Het veld wordt tijdens de data-extractie meestal gevuld met een vaste waarde om de dataset te labelen. Waarom dit belangrijk is Geeft context over de herkomst van de data. Dat is belangrijk in omgevingen met meerdere systemen, om de data-integriteit te bewaken en analyses per systeem mogelijk te maken. Waar vind je dit? Dit is meestal een vaste waarde die tijdens het ETL-proces (extractie, transformatie en laden) wordt toegevoegd. De waarde identificeert de specifieke SAP ECC-instantie, bijvoorbeeld ‘ECC_PROD_NA’. Voorbeelden SAP_ECC_PRODECC_EU_100SAP_US_FIN | |||
| Documentdatum DocumentDate | De datum op het oorspronkelijke document, opgegeven door de leverancier of aanmaker. | ||
| Beschrijving De documentdatum is de datum waarop het oorspronkelijke document is uitgegeven. Bij facturatie is dit meestal de datum waarop de factuur is aangemaakt. Vaak vormt deze datum de basis voor het berekenen van de vervaldatum. Deze datum is belangrijk voor financiële rapportages en voor het berekenen van KPI’s zoals Days Sales Outstanding (DSO). Vanuit het oogpunt van de klant is dit het begin van de incassoperiode. Verschillen tussen de documentdatum en de boekingsdatum kunnen wijzen op interne vertragingen bij de verwerking van inkomende facturen. Waarom dit belangrijk is Vormt de basis voor het berekenen van de ouderdom van facturen en DSO. Ook is dit een belangrijk referentiepunt voor financiële analyses en analyses van betalingstermijnen. Waar vind je dit? SAP ECC-tabel: VBRK, veld: FKDAT (factuurdatum) Voorbeelden 2023-04-152023-04-162023-05-20 | |||
| Geautomatiseerd IsAutomated | Een indicator die aangeeft of een activiteit door een systeemgebruiker of via automatisering is uitgevoerd. | ||
| Beschrijving Dit berekende attribuut is een booleaanse indicator die handmatige en geautomatiseerde activiteiten van elkaar onderscheidt. Meestal wordt de waarde bepaald door het attribuut Gebruikersnaam te vergelijken met een lijst van bekende systeem- of batchgebruikers, zoals ‘BATCHUSER’ of ‘SAPSYSTEM’. Deze indicator is belangrijk om de automatiseringsgraad van het facturatieproces te meten. Veel organisaties willen de efficiëntie verbeteren en kosten verlagen. De KPI voor het percentage geautomatiseerde facturatie wordt rechtstreeks op basis van dit attribuut berekend en laat zien hoe automatiseringsinitiatieven vorderen. Waarom dit belangrijk is Ondersteunt rechtstreeks de berekening van het percentage geautomatiseerde facturatie. Zo kun je de procesefficiëntie meten en de impact van automatiseringsprojecten volgen. Waar vind je dit? Afgeleid van het attribuut Gebruikersnaam. De logica kan bijvoorbeeld zijn: IF UserName IN ('BATCH', 'SYSTEM', 'RFCUSER') THEN true ELSE false. Voorbeelden truefalse | |||
| Herstelwerk IsRework | Een indicator die aangeeft of een activiteit een stap voor herstelwerk of correctie is. | ||
| Beschrijving Dit berekende attribuut herkent activiteiten die herstelwerk vertegenwoordigen, zoals ‘Factuur gecorrigeerd’ of het terugdraaien van documenten. Meestal is dit een booleaanse indicator die wordt afgeleid van de activiteitsnaam of van transactiecodes voor correcties en annuleringen, zoals ‘VF11’ voor het annuleren van een factuurdocument. Bij process mining helpt deze indicator om de hoeveelheid herstelwerk in het facturatieproces te meten. De indicator ondersteunt KPI’s zoals het percentage factuurcorrecties en maakt herstelwerklussen op de proceskaart zichtbaar. Zo komen inefficiënties en kwaliteitsproblemen aan het licht die de bedrijfskosten verhogen en betalingen vertragen. Waarom dit belangrijk is Helpt inefficiënties en kwaliteitsproblemen te meten door zichtbaar te maken hoeveel werk nodig is om fouten te corrigeren. Ondersteunt rechtstreeks KPI’s voor herstelwerk. Waar vind je dit? Afgeleid van de activiteitsnaam of transactiecode. Bijvoorbeeld: IF ActivityName = 'Invoice Corrected' OR TransactionCode = 'VF11' THEN true ELSE false. Voorbeelden truefalse | |||
| Laatste data-update LastDataUpdate | De timestamp van de meest recente data-update of extractie uit het bronsysteem. | ||
| Beschrijving Dit attribuut geeft aan wanneer de dataset voor het laatst vanuit het bronsysteem is bijgewerkt. Zo weet je hoe actueel de data is die je bekijkt. In dashboards en rapporten laat deze timestamp zien hoe recent de data is. Ook helpt die om verwachtingen te bepalen over wanneer zeer recente transacties zichtbaar worden. De timestamp wordt meestal aangemaakt aan het einde van het data-extractieproces. Waarom dit belangrijk is Laat zien hoe actueel de data is. Dat is belangrijk voor operationele beslissingen op basis van de analyse. Waar vind je dit? Aangemaakt en opgeslagen tijdens het ETL-proces (extractie, transformatie en laden). Voorbeelden 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| Transactiecode TransactionCode | De SAP-transactiecode waarmee een activiteit wordt uitgevoerd. | ||
| Beschrijving De transactiecode, of T-Code, is een unieke identificatie voor een specifieke functie of programma in SAP, zoals ‘VF01’ voor het aanmaken van een factuurdocument. Door de T-Code van elke gebeurtenis vast te leggen, krijg je op systeemniveau inzicht in de uitvoering van het proces. Deze informatie is waardevol voor oorzaakanalyse. Als er bijvoorbeeld vaak fouten optreden, kunnen analisten nagaan of een niet-standaard transactiecode wordt gebruikt. De code helpt ook om de activiteitsnaam af te leiden en te begrijpen welke systeemfuncties in het proces worden gebruikt. Waarom dit belangrijk is Geeft technische context over de uitvoering van een activiteit. Zo kun je oorzaken van procesafwijkingen onderzoeken en niet-standaard handelingen van gebruikers opsporen. Waar vind je dit? SAP ECC-tabel: CDHDR, veld: TCODE Voorbeelden VF01VF02FB01F-28 | |||
| Valuta Currency | De valutacode voor de bedragen op de factuur. | ||
| Beschrijving Dit attribuut geeft de valuta van de transactie aan, zoals USD, EUR of JPY. Het biedt de nodige context voor geldbedragen, zoals het totale factuurbedrag. Bij analyses van data uit een internationale organisatie is het valutaveld nodig om financiële bedragen correct te interpreteren en om te rekenen. Zo kun je consistent rapporteren en voorkom je dat bedragen zonder de juiste valutaomrekening worden samengevoegd, wat tot onjuiste financiële analyses zou leiden. Waarom dit belangrijk is Geeft context bij alle geldbedragen en zorgt voor een juiste financiële analyse, vooral wanneer meerdere valuta worden gebruikt. Waar vind je dit? SAP ECC-tabel: VBRK, veld: WAERK Voorbeelden USDEURGBPJPY | |||
| Vereffeningsdatum ClearingDate | De datum waarop de betaling is ontvangen en de factuur in de debiteurenadministratie is vereffend. | ||
| Beschrijving De vereffeningsdatum is de datum waarop een openstaande post, zoals een factuur, in het financiële systeem als betaald of ‘vereffend’ wordt gemarkeerd. Op deze datum wordt het geld als geïnd en afgestemd beschouwd. Dit is een van de belangrijkste datums in de Order to Cash-cyclus. De datum vormt het eindpunt voor het berekenen van Days Sales Outstanding (DSO) en de totale doorlooptijd van factuur tot betaling. Met een analyse van de vereffeningsdatum kun je de effectiviteit van het incassoproces meten. Waarom dit belangrijk is Markeert de laatste stap in de levenscyclus van de factuur. De datum is het eindpunt voor de berekening van DSO en de totale doorlooptijd en geeft inzicht in de efficiëntie van de inning. Waar vind je dit? SAP ECC-tabel: BSAD, veld: AUGDT Voorbeelden 2023-05-142023-06-012023-06-25 | |||
| Verkoopdocumentnummer SalesDocumentNumber | De identificatie van de oorspronkelijke verkooporder die tot de factuur heeft geleid. | ||
| Beschrijving Dit attribuut koppelt de factuur rechtstreeks aan de verkooporder waarmee de transactie is gestart. Die traceerbaarheid is nodig voor een volledige end-to-end-analyse van Order to Cash. Door het facturatieproces te koppelen aan het voorafgaande verkooporderproces, kunnen organisaties de totale doorlooptijd van klantorder tot ontvangst van betaling analyseren. Zo wordt duidelijk of vertragingen bij de facturatie ontstaan in de verkoop, de orderafhandeling of de facturatieafdeling zelf. Dat geeft een volledig beeld van het proces. Waarom dit belangrijk is Koppelt het facturatieproces aan de verkooporder. Zo kun je Order to Cash van begin tot eind analyseren en vertragingen tussen afdelingen opsporen. Waar vind je dit? SAP ECC-tabel: VBRP, veld: VGBEL Voorbeelden 100000451000004610000047 | |||
| Verkooporganisatie SalesOrganization | De organisatie-eenheid die verantwoordelijk is voor de verkoop van producten of diensten. | ||
| Beschrijving De verkooporganisatie is een organisatie-eenheid in SAP die verantwoordelijk is voor de distributie van goederen en diensten en voor het onderhandelen over verkoopvoorwaarden. Dit veld helpt de verkoop en distributie te structureren. Bij process mining kun je met dit attribuut het facturatieproces analyseren vanuit de verkoopstructuur. Je kunt de prestaties van verschillende verkooporganisaties vergelijken en zien welke regio’s of bedrijfsonderdelen hun facturatie efficiënter uitvoeren. Ook helpt dit om goede werkwijzen breder toe te passen. Waarom dit belangrijk is Maakt het mogelijk prestaties tussen verkoopafdelingen of regio’s te vergelijken. Zo kun je goede werkwijzen en verbeterpunten vinden. Waar vind je dit? SAP ECC-tabel: VBRK, veld: VKORG Voorbeelden 1000NA01EU01AP01 | |||
| Vervaldatum factuur InvoiceDueDate | De datum waarop de klant de betaling uiterlijk moet voldoen. | ||
| Beschrijving De vervaldatum van de factuur is de uiterste betaaldatum volgens de betalingstermijnen. Deze datum is belangrijk voor het beheer van debiteuren en het starten van incassoactiviteiten. Je gebruikt dit attribuut om de KPI voor tijdige betalingen te berekenen door de vervaldatum te vergelijken met de werkelijke betaaldatum. Een analyse op basis van vervaldatum helpt bij het voorspellen van de kasstroom en het prioriteren van incasso’s voor betalingen die binnenkort vervallen of al achterstallig zijn. De datum wordt meestal afgeleid van de basisdatum en de betalingstermijnen. Waarom dit belangrijk is Dit is de maatstaf voor tijdige betalingen en is belangrijk voor het beheer van debiteuren en het voorspellen van de kasstroom. Waar vind je dit? Berekend op basis van de basisdatum (BSEG-ZFBDT) en betalingstermijnen (BSEG-ZTERM). De datum is niet altijd in een afzonderlijk veld opgeslagen. Voorbeelden 2023-05-152023-05-302023-06-20 | |||
Activiteiten voor Order to Cash-facturatie en factuurverwerking
| Activiteit | Beschrijving | ||
|---|---|---|---|
| Factuur aangemaakt | Dit markeert het aanmaken van het facturatiedocument in het systeem. De gebeurtenis wordt vastgelegd wanneer een nieuwe regel wordt aangemaakt in de tabel met kopgegevens van boekingsdocumenten (BKPF), met een specifiek documenttype voor facturen. | ||
| Waarom dit belangrijk is Dit is het begin van het volledige facturatieproces. De tijd vanaf deze gebeurtenis helpt de doorlooptijd van het aanmaken van facturen te meten en vormt de basis voor de berekening van Days Sales Outstanding (DSO). Waar vind je dit? Vastgelegd in tabel BKPF. De aanmaakdatum (CPUDT) en -tijd (CPUTM) voor een specifiek documentnummer (BELNR) markeren deze gebeurtenis. Het documenttype (BLART) geeft aan dat het om een factuur gaat. Vastleggen Gebaseerd op de timestamp van aanmaak (CPUDT) in tabel BKPF voor het facturatiedocument. Gebeurtenistype explicit | |||
| Factuur afgeletterd | De definitieve status van een volledig betaalde factuur. De openstaande post is afgesloten met een bijbehorende betaling of creditnota. De factuur is volledig voldaan. | ||
| Waarom dit belangrijk is Dit markeert de succesvolle afronding van de Order to Cash-cyclus voor een factuur. Dit is de belangrijkste eindgebeurtenis voor het meten van de gemiddelde doorlooptijd van facturen. Waar vind je dit? Dit gebeurt wanneer de velden voor het afletterdocument (AUGBL) en de afletterdatum (AUGDT) zijn ingevuld voor de factuurregel in tabel BSEG. Vastleggen De gebeurtenis vindt plaats op de afletterdatum (AUGDT) die voor de factuurregel in tabel BSEG is vastgelegd. Gebeurtenistype explicit | |||
| Factuur geboekt | De factuur wordt officieel vastgelegd in het subgrootboek voor debiteuren en het grootboek. Vanaf dit moment is de factuur juridisch bindend en staat de schuld van de klant geregistreerd. | ||
| Waarom dit belangrijk is Dit is een belangrijk moment waarop de betalingstermijn officieel begint. De tijd tussen het aanmaken en boeken kan interne vertragingen zichtbaar maken die de cashflow beïnvloeden. Waar vind je dit? Vastgelegd in tabel BKPF. De boekingsdatum (BUDAT) voor het documentnummer (BELNR) markeert deze gebeurtenis. Bij geparkeerde documenten is dit het moment waarop het document wordt omgezet naar een geboekt document. Vastleggen Gebaseerd op de boekingsdatum (BUDAT) in tabel BKPF voor het facturatiedocument. Gebeurtenistype explicit | |||
| Factuur naar klant verstuurd | Dit geeft aan dat de factuur via een vastgelegd uitvoerkanaal naar de klant is verstuurd, bijvoorbeeld per post, e-mail of EDI. Meestal wordt dit vastgelegd in de logs van het outputmanagementsysteem. | ||
| Waarom dit belangrijk is Deze gebeurtenis is een belangrijk moment waarop de betalingstermijn van de klant begint. Vertraging heeft direct invloed op het moment waarop je de betaling kunt verwachten en op de efficiëntie van de inning. Waar vind je dit? Dit kan worden afgeleid uit de verwerkingsdatum en -tijd in de berichtstatustabel (NAST) voor het uitvoertype dat bij de factuur hoort. Vastleggen Afgeleid uit een regel in tabel NAST met verwerkingsstatus ‘1’ (succesvol verwerkt). Gebeurtenistype inferred | |||
| Klantbetaling ontvangen | De betaling van de klant is ontvangen en in het systeem geboekt als kasontvangst of bankstorting. Hierdoor ontstaat een afzonderlijk betalingsdocument dat nog niet aan de specifieke factuur is gekoppeld. | ||
| Waarom dit belangrijk is Dit is een belangrijk moment in de cash conversion cycle. De tijd tussen het versturen van de factuur en de ontvangst van de betaling vormt een belangrijk deel van de Days Sales Outstanding (DSO). Waar vind je dit? Vastgelegd als een nieuw document in BKPF en BSEG, meestal met een documenttype voor klantbetalingen, zoals ‘DZ’. De boekingsdatum (BUDAT) markeert de gebeurtenis. Vastleggen Gebaseerd op de boekingsdatum van het klantbetalingsdocument in BKPF. Gebeurtenistype explicit | |||
| Betaling aan factuur gekoppeld | De ontvangen klantbetaling is gekoppeld aan de specifieke openstaande factuur, die daarmee kan worden afgeletterd. Dit is de afstemmingsstap die de betaling aan de openstaande schuld koppelt. | ||
| Waarom dit belangrijk is Deze activiteit is belangrijk voor het meten van de doorlooptijd van de betalingsverwerking. Vertraging bij het verwerken van betalingen kan een verkeerd beeld geven van de openstaande vorderingen en beschikbare cash verhullen. Waar vind je dit? Afgeleid uit de aflettertransactie, bijvoorbeeld F-32, die de aflettervelden in de factuurregel invult. De timestamp van de gebeurtenis is de afletterdatum. Vastleggen Afgeleid wanneer de afletterdatum (AUGDT) is ingevuld in de factuurregeltabel (BSEG). Gebeurtenistype inferred | |||
| Betalingsherinnering verstuurd | Het systeem heeft een aanmaning of betalingsherinnering voor een achterstallige factuur aangemaakt en naar de klant verstuurd. Dit wordt vastgelegd in de aanmaningshistorie. | ||
| Waarom dit belangrijk is Hiermee kun je de effectiviteit van de incassostrategie beoordelen. De tijd tussen de herinnering en de ontvangst van de betaling is belangrijk voor de KPI voor de effectiviteit van betalingsherinneringen. Waar vind je dit? Vastgelegd in de aanmaningstabellen, met name MHNK (kopgegevens van aanmaningen) en MHND (regels van aanmaningen). Deze worden aangemaakt tijdens de aanmaningsrun (transactie F150). Vastleggen Vastgelegd wanneer een aanmaningsrun (F150) wordt uitgevoerd voor de achterstallige post. Gebeurtenistype explicit | |||
| Factuur afgeboekt | Een alternatieve eindstatus waarbij de factuur als oninbaar wordt beschouwd en het openstaande bedrag wordt afgeboekt op een rekening voor dubieuze debiteuren. De factuur wordt afgesloten zonder betaling van de klant. | ||
| Waarom dit belangrijk is Dit is een ongunstige uitkomst voor het proces en leidt tot omzetverlies. Door deze gebeurtenissen te volgen, kun je oorzaken van oninbare vorderingen analyseren en het kredietbeheer verbeteren. Waar vind je dit? Afgeleid uit de analyse van de vereffeningsboeking voor de factuur. Als het vereffeningsdocument wordt geboekt op een specifieke grootboekrekening voor dubieuze debiteuren, wordt de factuur als afgeboekt beschouwd. Vastleggen Afgeleid wanneer de vereffeningsboeking een boeking op een aangewezen grootboekrekening voor dubieuze debiteuren bevat. Gebeurtenistype inferred | |||
| Factuur gecorrigeerd | Dit is herstelwerk: een factuur bleek onjuist en is daarna teruggedraaid. Dit wordt vastgesteld aan de hand van terugboekingsdocumenten die aan de oorspronkelijke factuur zijn gekoppeld. | ||
| Waarom dit belangrijk is Dit maakt inefficiënties en kwaliteitsproblemen zichtbaar. Veel correcties wijzen op problemen met eerdere verkoop- of facturatiedata en ondersteunen het dashboard voor factuurherstel en foutpercentages. Waar vind je dit? Vastgesteld door een terugboekingsdocument te vinden waarin BKPF-STBLG naar het oorspronkelijke document verwijst. Het aanmaken van dit terugboekingsdocument is de gebeurtenis. Vastleggen Vastgelegd wanneer een terugboekingsdocument wordt aangemaakt, bijvoorbeeld via FB08. Gebeurtenistype explicit | |||
| Factuur geparkeerd | Het facturatiedocument is voorlopig opgeslagen, maar nog niet in het grootboek geboekt. Dit gebeurt vaak als gegevens ontbreken of eerst moeten worden gecontroleerd voordat het document definitief wordt geboekt. | ||
| Waarom dit belangrijk is Hiermee volg je stappen vóór het boeken en mogelijke vertragingen. Een lange periode in geparkeerde status kan wijzen op problemen met de datakwaliteit of knelpunten in het goedkeuringsproces. Waar vind je dit? Geparkeerde documenten worden opgeslagen in tabel VBKPF. Deze activiteit wordt gemarkeerd wanneer hier een document wordt aangemaakt dat later wordt geboekt. Vastleggen Vastgelegd wanneer een geparkeerd document wordt opgeslagen met een transactie zoals FV70. Gebeurtenistype explicit | |||
| Factuur goedgekeurd | Dit staat voor de formele goedkeuring van de factuur, waarna deze kan worden geboekt of naar de klant kan worden verstuurd. Vaak wordt dit afgeleid uit het omzetten van een geparkeerd document naar een geboekt document. | ||
| Waarom dit belangrijk is Hiermee volg je de interne goedkeuringsworkflow, waar vaak knelpunten ontstaan. Analyse van deze activiteit ondersteunt het dashboard voor analyse van factuurgoedkeuringen en laat zien waar goedkeurders vertraging veroorzaken. Waar vind je dit? Dit kan worden afgeleid uit de overgang van een document van geparkeerde status (in VBKPF) naar geboekte status (in BKPF). Als er een workflowsysteem wordt gebruikt, kan deze gebeurtenis ook expliciet in de workflowlogs staan. Vastleggen Vergelijk de aanmaakdatum van het geparkeerde document (VBKPF) met de boekingsdatum van het definitieve document (BKPF). Gebeurtenistype inferred | |||
| Geschil aangemaakt | Er is formeel een geschil over de factuur geregistreerd, meestal naar aanleiding van een klacht van de klant. Dit wordt vastgelegd in SAP Dispute Management. | ||
| Waarom dit belangrijk is Hiermee vind je facturen waarbij betaling mogelijk vertraging oploopt en zie je welke problemen tot ontevredenheid bij klanten leiden. Dit markeert het begin van een belangrijk proces voor de afhandeling van uitzonderingen. Waar vind je dit? Vastgelegd wanneer een case wordt aangemaakt in de geschillentabel (UDM_CASE) en gekoppeld aan het boekingsdocument van de factuur. Vastleggen Vastgelegd wanneer een gebruiker via transactie UDM_DISPUTE een geschil aanmaakt. Gebeurtenistype explicit | |||
| Vervaldatum factuur bereikt | Een berekende gebeurtenis die de dag markeert waarop de factuur volgens de betalingstermijn moet worden betaald. Dit is geen activiteit van een gebruiker of systeem, maar een belangrijk tijdstip. | ||
| Waarom dit belangrijk is Essentieel voor de analyse van betaalgedrag en compliance. Dit is het uitgangspunt om tijdige en te late betalingen vast te stellen en de KPI voor tijdige betalingen te berekenen. Waar vind je dit? Afgeleid door de huidige datum te vergelijken met de nettovervaldatum. De vervaldatum staat in veld BSEG-ZFBDT of wordt berekend op basis van de basisdatum en betalingstermijn. Vastleggen Vergelijk de systeemdatum met het veld voor de nettovervaldatum in de factuurregel (BSEG). Gebeurtenistype calculated | |||
Extractiegidsen
Stappen
- Open de ABAP-editor: Log in op SAP ECC. Open de ABAP-editor met transactiecode
SE38. - Maak een programma aan: Vul bij Programma een naam in, bijvoorbeeld
Z_PM_O2C_INVOICE_EXTRACT, en klik op de knop Maken. Geef het programma een duidelijke titel en stel het type in op 'Uitvoerbaar programma'. - Definieer het selectiescherm: Leg in de programmacode de parameters voor het selectiescherm vast. Hiermee kunnen gebruikers de te extraheren data filteren. Belangrijke parameters zijn het datumbereik voor het aanmaken van documenten (
S_ERDAT), de bedrijfscode (S_BUKRS) en het factuurdocumenttype (S_VBTYP). - Definieer de datastructuren: Declareer een interne tabelstructuur voor de uiteindelijke event log-data. Neem hierin de velden
InvoiceNumber,ActivityNameenEventTimeop, plus aanbevolen attributen zoalsUserName,BillingDocumentType,CustomerNumber,CompanyCodeenTotalInvoiceAmount. - Bouw de selectielogica: Schrijf de ABAP-logica om data te selecteren. Selecteer eerst de belangrijkste factuurdocumenten uit de tabellen
VBRKenBKPF, op basis van de invoer op het selectiescherm. Sla deze op in een tijdelijke interne tabel. - Extraheer activiteiten: Loop door de lijst met factuurdocumenten. Selecteer voor elk document data uit verschillende tabellen om de 13 vereiste activiteiten te vinden. Raadpleeg bijvoorbeeld tabel
NASTvoor gebeurtenissen als 'Factuur naar klant verzonden',BSEGvoor aflettergegevens ('Factuur afgeletterd', 'Betaling verwerkt') enMHNKvoor aanmaningsgegevens ('Betalingsherinnering verstuurd'). - Vul de event log-tabel: Voeg voor elke gevonden activiteit een record toe aan de uiteindelijke interne event log-tabel. Koppel
InvoiceNumber,ActivityName,EventTimeen de overige attributen aan de juiste velden in de brontabellen. - Schrijf naar de applicatieserver: Zodra de loop is afgerond en de event log-tabel is gevuld, gebruik je de statements
OPEN DATASET,LOOP AT... TRANSFERenCLOSE DATASETom de inhoud naar een tekstbestand op de SAP-applicatieserver te schrijven. Geef een logisch en toegankelijk bestandspad op. - Haal het bestand op: Gebruik transactiecode
AL11om de mappen op de applicatieserver te bekijken en het bestand te vinden. Vraag je SAP Basis-team om het bestand naar je computer of een gedeelde netwerklocatie te downloaden. - Controleer de opmaak: Open het gedownloade bestand en controleer of het een CSV-bestand met een kopregel is. Sla het op met UTF-8-codering, zodat je het in ProcessMind kunt uploaden.
Configuratie
- Vereisten: Toegang om ABAP-programma's aan te maken en uit te voeren (transactie SE38). Je hebt leesrechten nodig voor FI- en SD-tabellen, waaronder
VBRK,VBRP,BKPF,BSEG,NAST,MHNKenUDM_CASE_ATTR00(voor Dispute Management). - Datumbereik selecteren: Het programma moet een verplicht datumbereik bevatten, meestal gebaseerd op de aanmaakdatum van het document (
ERDATin VBRK/BKPF). Voor de eerste extractie is een periode van 3 tot 6 maanden aan te raden, zodat de dataset beheersbaar blijft. - Belangrijke filters: Filter altijd op
CompanyCode(BUKRS) om de extractie af te bakenen. Filter bij voorkeur ook op factuurdocumenttype (VBTYPuit VBRK) of boekingsdocumenttype (BLARTuit BKPF), zodat alleen relevante factuurtypen worden meegenomen. Gebruik bijvoorbeeld 'RV' voor standaardboekingsfacturen en sluit creditnota's en andere documenten uit. - Prestaties: Voer het programma voor grote datasets van meer dan enkele maanden uit als achtergrondtaak om time-outs te voorkomen. Optimaliseer de ABAP-logica met geïndexeerde tabelreads en vermijd geneste loops met databaseopvragingen. Selecteer de data eerst in interne tabellen en verwerk die daarna.
- Uitvoerbestand instellen: Geef in de ABAP-code het bestandspad op de applicatieserver en het scheidingsteken voor het CSV-bestand op, meestal een komma of puntkomma. Gebruik een globaal ingestelde en toegankelijke map.
Voorbeeldquery abap
REPORT Z_PM_O2C_INVOICE_EXTRACT.
*&---------------------------------------------------------------------*
*& Tables
*&---------------------------------------------------------------------*
TABLES: VBRK, BKPF.
*&---------------------------------------------------------------------*
*& Type Definitions for Event Log Output
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
invoicenumber TYPE vbrk-vbeln,
activityname TYPE string,
eventtime TYPE timestamp,
username TYPE xubname,
billingdocumenttype TYPE vbrk-vbtyp,
customernumber TYPE vbrk-kunnr,
companycode TYPE vbrk-bukrs,
totalinvoiceamount TYPE vbrk-netwr,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: gt_event_log TYPE TABLE OF ty_event_log,
gs_event_log TYPE ty_event_log.
DATA: BEGIN OF gs_invoice,
vbeln TYPE vbrk-vbeln, " SD Doc (Invoice)
awkey TYPE bkpf-awkey, " Accounting Doc Reference Key
bukrs TYPE vbrk-bukrs, " Company Code
kunnr TYPE vbrk-kunnr, " Customer
vbtyp TYPE vbrk-vbtyp, " SD Doc Type
netwr TYPE vbrk-netwr, " Net Value
waerk TYPE vbrk-waerk, " Currency
fkdat TYPE vbrk-fkdat, " Billing Date
erdat TYPE vbrk-erdat, " Creation Date
erzet TYPE vbrk-erzet, " Creation Time
ernam TYPE vbrk-ernam, " Creator
belnr TYPE bkpf-belnr, " Acct Doc
gjahr TYPE bkpf-gjahr, " Fiscal Year
cpudt TYPE bkpf-cpudt, " Acct Doc Entry Date
cputm TYPE bkpf-cputm, " Acct Doc Entry Time
usnam TYPE bkpf-usnam, " Acct Doc User
stblg TYPE bkpf-stblg, " Reversal Doc
END OF gs_invoice.
DATA: gt_invoices LIKE TABLE OF gs_invoice.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbrk-erdat OBLIGATORY,
s_bukrs FOR vbrk-bukrs OBLIGATORY,
s_vbtyp FOR vbrk-vbtyp.
PARAMETERS: p_path TYPE string DEFAULT '/usr/sap/trans/tmp/invoice_extract.csv' OBLIGATORY.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
" 1. Select base set of invoices
SELECT vbrk~vbeln, vbrk~bukrs, vbrk~kunnr, vbrk~vbtyp, vbrk~netwr, vbrk~waerk,
vbrk~fkdat, vbrk~erdat, vbrk~erzet, vbrk~ernam,
bkpf~belnr, bkpf~gjahr, bkpf~cpudt, bkpf~cputm, bkpf~usnam, bkpf~stblg, bkpf~awkey
INTO CORRESPONDING FIELDS OF TABLE gt_invoices
FROM vbrk
INNER JOIN bkpf ON bkpf~awkey = vbrk~vbeln AND bkpf~awtyp = 'VBRK'
WHERE vbrk~erdat IN s_erdat
AND vbrk~bukrs IN s_bukrs
AND vbrk~vbtyp IN s_vbtyp.
IF gt_invoices IS INITIAL.
MESSAGE 'No invoices found for the selected criteria.' TYPE 'I'.
RETURN.
ENDIF.
LOOP AT gt_invoices INTO gs_invoice.
CLEAR gs_event_log.
gs_event_log-invoicenumber = gs_invoice-vbeln.
gs_event_log-billingdocumenttype = gs_invoice-vbtyp.
gs_event_log-customernumber = gs_invoice-kunnr.
gs_event_log-companycode = gs_invoice-bukrs.
gs_event_log-totalinvoiceamount = gs_invoice-netwr.
" Activity: Invoice Generated (using accounting doc creation)
gs_event_log-activityname = 'Invoice Generated'.
gs_event_log-username = gs_invoice-usnam.
CONCATENATE gs_invoice-cpudt gs_invoice-cputm INTO DATA(lv_ts_gen).
CONVERT DATE gs_invoice-cpudt TIME gs_invoice-cputm INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Posted (same as generated for non-parked docs)
gs_event_log-activityname = 'Invoice Posted'.
gs_event_log-username = gs_invoice-usnam.
CONVERT DATE gs_invoice-cpudt TIME gs_invoice-cputm INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Approved (inferred by posting)
gs_event_log-activityname = 'Invoice Approved'.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Sent To Customer
SELECT SINGLE addat, aduhr FROM nast
INTO (DATA(lv_nast_date), DATA(lv_nast_time))
WHERE kappl = 'V3' AND objky = gs_invoice-vbeln AND vszst > '0'.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Sent To Customer'.
gs_event_log-username = sy-uname.
CONVERT DATE lv_nast_date TIME lv_nast_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Invoice Corrected / Reversed
IF gs_invoice-stblg IS NOT INITIAL.
SELECT SINGLE cpudt, cputm, usnam FROM bkpf
INTO (DATA(lv_rev_date), DATA(lv_rev_time), DATA(lv_rev_user))
WHERE belnr = gs_invoice-stblg AND gjahr = gs_invoice-gjahr.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Corrected'.
gs_event_log-username = lv_rev_user.
CONVERT DATE lv_rev_date TIME lv_rev_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
" Activity: Payment Applied, Cleared, Due Date, Written Off (from BSEG)
SELECT SINGLE augdt, augbl, zfBDT, hkont FROM bseg
INTO (DATA(lv_augdt), DATA(lv_augbl), DATA(lv_zfbdt), DATA(lv_hkont))
WHERE bukrs = gs_invoice-bukrs
AND belnr = gs_invoice-belnr
AND gjahr = gs_invoice-gjahr
AND koart = 'D'. " Customer line
IF sy-subrc = 0.
" Due Date Reached (Calculated event)
IF lv_zfbdt IS NOT INITIAL.
gs_event_log-activityname = 'Invoice Due Date Reached'.
gs_event_log-username = 'System'.
CONVERT DATE lv_zfbdt INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Cleared, Applied, Write-Off
IF lv_augdt IS NOT INITIAL.
SELECT SINGLE usnam, cpudt, cputm, blart FROM bkpf
INTO (DATA(lv_clear_user), DATA(lv_clear_date), DATA(lv_clear_time), DATA(lv_clear_type))
WHERE belnr = lv_augbl AND bukrs = gs_invoice-bukrs.
IF sy-subrc = 0.
gs_event_log-username = lv_clear_user.
CONVERT DATE lv_clear_date TIME lv_clear_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
IF lv_clear_type = 'DZ'. " Standard Customer Payment
gs_event_log-activityname = 'Customer Payment Received'. APPEND gs_event_log TO gt_event_log.
gs_event_log-activityname = 'Payment Applied To Invoice'. APPEND gs_event_log TO gt_event_log.
gs_event_log-activityname = 'Invoice Cleared'. APPEND gs_event_log TO gt_event_log.
ELSE. " Assuming other clearing doc types could be write-offs
gs_event_log-activityname = 'Invoice Written Off'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
" Activity: Payment Reminder Issued (Dunning)
SELECT COUNT(*) FROM mhnk WHERE kunnr = gs_invoice-kunnr AND bukrs = gs_invoice-bukrs AND lafdn > gs_invoice-cpudt.
IF sy-subrc = 0 AND sy-dbcnt > 0.
SELECT SINGLE lafdn FROM mhnk
INTO DATA(lv_dunning_date)
WHERE kunnr = gs_invoice-kunnr AND bukrs = gs_invoice-bukrs AND lafdn > gs_invoice-cpudt.
gs_event_log-activityname = 'Payment Reminder Issued'.
gs_event_log-username = 'System'.
CONVERT DATE lv_dunning_date INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Invoice Parked (Example from VBKPF, may require system specific logic)
SELECT SINGLE cpudt, cputm, usnam FROM vbkpf
INTO (DATA(lv_park_date), DATA(lv_park_time), DATA(lv_park_user))
WHERE awkey = gs_invoice-vbeln AND awsys = 'LOG' AND bstat = 'V'.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Parked'.
gs_event_log-username = lv_park_user.
CONVERT DATE lv_park_date TIME lv_park_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Dispute Case Created (Requires Dispute Management module)
SELECT SINGLE create_date, create_time, create_user FROM udm_case_attr00
INTO (DATA(lv_disp_date), DATA(lv_disp_time), DATA(lv_disp_user))
WHERE [Your logic to link invoice to dispute case, e.g., via a custom field or object link].
IF sy-subrc = 0.
gs_event_log-activityname = 'Dispute Case Created'.
gs_event_log-username = lv_disp_user.
CONVERT DATE lv_disp_date TIME lv_disp_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Write data to file
*&---------------------------------------------------------------------*
OPEN DATASET p_path FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
ENDIF.
" Header
DATA(lv_header) = 'InvoiceNumber,ActivityName,EventTime,UserName,BillingDocumentType,CustomerNumber,CompanyCode,TotalInvoiceAmount'.
TRANSFER lv_header TO p_path.
LOOP AT gt_event_log INTO gs_event_log.
DATA(lv_line) = |
{ gs_event_log-invoicenumber }|
,{ gs_event_log-activityname }|
,{ gs_event_log-eventtime }|
,{ gs_event_log-username }|
,{ gs_event_log-billingdocumenttype }|
,{ gs_event_log-customernumber }|
,{ gs_event_log-companycode }|
,{ gs_event_log-totalinvoiceamount }|.
TRANSFER lv_line TO p_path.
ENDLOOP.
CLOSE DATASET p_path.
WRITE: 'Extraction complete. File created at:', p_path. Stappen
- Vereisten en toegang: Zorg voor een databasegebruiker met alleen-lezen toegang tot de benodigde SAP ECC-tabellen, waaronder VBRK, BKPF, BSAD, NAST, CDHDR, CDPOS, SCASE en andere tabellen in de query. Deze toegang wordt meestal alleen verleend aan systeembeheerders of specifieke data-analyseteams.
- Maak verbinding met de database: Gebruik een standaard SQL-client, zoals DBeaver, Oracle SQL Developer of Microsoft SQL Server Management Studio, om verbinding te maken met de SAP ECC-database.
- Bereid de SQL-query voor: Kopieer de volledige SQL-query uit het onderdeel 'query' naar de editor van je SQL-client.
- Vervang de tijdelijke waarden: Vervang de tijdelijke waarden in de query door gegevens uit je eigen omgeving:
'YYYYMMDD': Vervang alle voorkomens door de begin- en einddatum van de analyseperiode. Beperk de periode tot een beheersbare omvang.'XXXX': Vervang dit door de bedrijfscode(s) die je wilt analyseren.[Your Invoice Output Type]: Vul de uitvoertypecode in waarmee facturen naar klanten worden verstuurd, bijvoorbeeld 'RD00'.[Your Bad Debt G/L Account]: Vul het grootboekrekeningnummer in waarop oninbare facturen worden afgeboekt.[Your Dispute Case Invoice Attribute]: Vul de attribuutnaam in waarin het factuurnummer in de configuratie van Dispute Management wordt opgeslagen, bijvoorbeeld 'INVOICE_ID'.
- Controleer de timestamp-functies: De query gebruikt de generieke syntaxis
CAST(CONCAT(date_field, time_field) AS TIMESTAMP). Mogelijk moet je deze aanpassen aan je databasesysteem, bijvoorbeeld doorTO_TIMESTAMPte gebruiken voor Oracle ofDATETIMEFROMPARTSvoor SQL Server. - Voer de query uit: Voer de aangepaste query uit. Afhankelijk van de omvang van de SAP-tabellen en het gekozen datumbereik kan dit enige tijd duren.
- Controleer de resultaten: Controleer na afloop of de uitvoer de verwachte kolommen bevat: InvoiceNumber, ActivityName, EventTime en de aanbevolen attributen. Kijk ook of er fouten zijn of dat de resultaten leeg zijn.
- Exporteer naar CSV: Exporteer de volledige resultatenset vanuit je SQL-client naar een CSV-bestand. Gebruik UTF-8-codering om problemen met speciale tekens te voorkomen.
- Bereid de upload voor: Controleer vóór het uploaden naar een process mining-tool of de CSV-kolomkoppen exact overeenkomen met de vereiste attribuutnamen, bijvoorbeeld
InvoiceNumber,ActivityName,EventTimeenUserName.
Configuratie
- Databaseverbinding: Je hebt een directe SQL-verbinding met alleen-lezen toegang tot de onderliggende SAP ECC-database nodig. Deze methode omzeilt de SAP-applicatielaag volledig.
- Autorisatie: De databasegebruiker moet
SELECT-rechten hebben op alle tabellen in de query. Het gaat om tabellen uit de FI- en SD-modules en mogelijk ook FSCM. - Datumbereik: Beperk de query tot een specifiek datumbereik om de prestaties en hoeveelheid data beheersbaar te houden. Begin bij voorkeur met een periode van 3 tot 6 maanden. De tijdelijke datumwaarden
'YYYYMMDD'moeten op meerdere plekken in de query worden ingevuld. - Filter op bedrijfscode: De query is bedoeld om te filteren op bedrijfscode (
BUKRS). Het is gebruikelijk om één of enkele bedrijfscodes tegelijk te analyseren. - Configuratie van documenttypen: De logica voor gebeurtenissen zoals factuurcorrecties, afboekingen en verzonden documenten is afhankelijk van de standaardconfiguratie van SAP. Mogelijk moet je de query aanpassen als je organisatie eigen documenttypen (
BLART), uitvoertypen (KSCHL) of grootboekrekeningen voor deze processen gebruikt. - Prestaties: Een query uitvoeren op een actief SAP-productiesysteem kan veel systeembronnen gebruiken en de prestaties van de bedrijfsvoering beïnvloeden. Voer grote extracties bij voorkeur buiten piekuren uit of gebruik een aparte rapportagedatabase.
Voorbeeldquery sql
WITH InvoiceBase AS (
SELECT
VBRK.VBELN AS InvoiceNumber,
VBRK.FKART AS BillingDocumentType,
VBRK.KUNRG AS CustomerNumber,
VBRK.BUKRS AS CompanyCode,
VBRK.NETWR AS TotalInvoiceAmount,
VBRK.ERNAM AS CreatorName,
VBRK.ERDAT AS CreationDate,
VBRK.ERZET AS CreationTime
FROM VBRK
WHERE VBRK.ERDAT BETWEEN '20230101' AND '20231231' -- Filter by Invoice Creation Date
AND VBRK.BUKRS IN ('1000') -- Filter by Company Code
AND VBRK.FKART NOT IN ('S1', 'S2') -- Exclude cancelled invoices
)
-- 1. Invoice Generated
SELECT
ib.InvoiceNumber,
'Invoice Generated' AS ActivityName,
CAST(CONCAT(ib.CreationDate, ib.CreationTime) AS TIMESTAMP) AS EventTime,
ib.CreatorName AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM InvoiceBase ib
UNION ALL
-- 2. Invoice Parked
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Parked' AS ActivityName,
CAST(CONCAT(b.CPUDT, b.CPUTM) AS TIMESTAMP) AS EventTime,
b.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF b
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND b.BSTAT = 'V' AND b.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 3. Invoice Posted
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Posted' AS ActivityName,
CAST(CONCAT(b.CPUDT, b.CPUTM) AS TIMESTAMP) AS EventTime,
b.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF b
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND b.BSTAT = '' AND b.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 4. Invoice Approved (from Parked to Posted)
SELECT
SUBSTRING(h.OBJECTID, 4, 10) AS InvoiceNumber,
'Invoice Approved' as ActivityName,
CAST(CONCAT(h.UDATE, h.UTIME) AS TIMESTAMP) AS EventTime,
h.USERNAME AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM CDHDR h
JOIN CDPOS p ON h.MANDANT = p.MANDANT AND h.OBJECTCLAS = p.OBJECTCLAS AND h.OBJECTID = p.OBJECTID AND h.CHANGENR = p.CHANGENR
JOIN InvoiceBase ib ON SUBSTRING(h.OBJECTID, 4, 10) = ib.InvoiceNumber
WHERE h.OBJECTCLAS = 'BELEGV'
AND p.TABNAME = 'BKPF'
AND p.FNAME = 'BSTAT'
AND p.VALUE_OLD = 'V'
AND p.VALUE_NEW = ' '
AND h.UDATE BETWEEN '20230101' AND '20231231'
UNION ALL
-- 5. Invoice Sent To Customer
SELECT
n.OBJKY AS InvoiceNumber,
'Invoice Sent To Customer' AS ActivityName,
CAST(CONCAT(n.DATVR, n.UHRVR) AS TIMESTAMP) AS EventTime,
n.VSTAT AS UserName, -- User who processed is not directly available, using processing status as a proxy
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM NAST n
JOIN InvoiceBase ib ON n.OBJKY = ib.InvoiceNumber
WHERE n.KSCHL = '[Your Invoice Output Type]' -- E.g., 'RD00'
AND n.VSTAT = '1' -- Processed successfully
AND n.DATVR BETWEEN '20230101' AND '20231231'
UNION ALL
-- 6. Invoice Corrected (Reversed)
SELECT
SUBSTRING(orig_doc.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Corrected' AS ActivityName,
CAST(CONCAT(rev_doc.CPUDT, rev_doc.CPUTM) AS TIMESTAMP) AS EventTime,
rev_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
rev_doc.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF orig_doc
JOIN BKPF rev_doc ON orig_doc.STBLG = rev_doc.BELNR AND orig_doc.BUKRS = rev_doc.BUKRS AND orig_doc.GJAHR = rev_doc.STJAH
JOIN InvoiceBase ib ON SUBSTRING(orig_doc.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE orig_doc.AWTYP = 'VBRK' AND orig_doc.STBLG IS NOT NULL AND rev_doc.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 7. Invoice Due Date Reached
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Due Date Reached' AS ActivityName,
CAST(CONCAT(bs.ZFBDT, '000000') AS TIMESTAMP) AS EventTime,
'System' AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSEG bs
JOIN BKPF b ON bs.MANDT = b.MANDT AND bs.BUKRS = b.BUKRS AND bs.BELNR = b.BELNR AND bs.GJAHR = b.GJAHR
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND bs.KOART = 'D' AND bs.ZFBDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 8. Payment Reminder Issued
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Payment Reminder Issued' AS ActivityName,
CAST(CONCAT(h.LAUFD, '000000') AS TIMESTAMP) AS EventTime,
h.LAUFI AS UserName, -- Dunning Run ID
ib.BillingDocumentType,
ib.CustomerNumber,
d.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM MHND d
JOIN MHNK h ON d.MANDT = h.MANDT AND d.LAUFD = h.LAUFD AND d.LAUFI = h.LAUFI
JOIN BKPF b ON d.MANDT = b.MANDT AND d.BUKRS = b.BUKRS AND d.BELNR = b.BELNR AND d.GJAHR = b.GJAHR
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE h.LAUFD BETWEEN '20230101' AND '20231231'
UNION ALL
-- 9. Dispute Case Created
SELECT
attr.ATTR_VALUE AS InvoiceNumber,
'Dispute Case Created' AS ActivityName,
sc.CREATE_TIME AS EventTime,
sc.CREATED_BY AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM SCMG_T_CASE_ATTR attr
JOIN SCASE sc ON attr.CASE_GUID = sc.CASE_GUID
JOIN InvoiceBase ib ON attr.ATTR_VALUE = ib.InvoiceNumber
WHERE attr.ATTR_NAME = '[Your Dispute Case Invoice Attribute]' -- e.g., 'INVOICE_ID'
AND CAST(sc.CREATE_TIME AS DATE) BETWEEN '20230101' AND '20231231'
UNION ALL
-- 10, 11, 12. Clearing Events (Payment, Clearing, Write-Off)
SELECT
InvoiceNumber,
ActivityName,
EventTime,
UserName,
BillingDocumentType,
CustomerNumber,
CompanyCode,
TotalInvoiceAmount
FROM (
SELECT
bsad.XBLNR AS InvoiceNumber,
CASE
WHEN clearing_item.HKONT = '[Your Bad Debt G/L Account]' THEN 'Invoice Written Off'
ELSE 'Customer Payment Received'
END AS ActivityName,
CAST(CONCAT(clearing_doc.CPUDT, clearing_doc.CPUTM) AS TIMESTAMP) AS EventTime,
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
LEFT JOIN BSEG clearing_item ON clearing_doc.MANDT = clearing_item.MANDT AND clearing_doc.BUKRS = clearing_item.BUKRS AND clearing_doc.BELNR = clearing_item.BELNR AND clearing_doc.GJAHR = clearing_item.GJAHR AND clearing_item.HKONT = '[Your Bad Debt G/L Account]' -- e.g. '148000'
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
UNION ALL
SELECT
bsad.XBLNR AS InvoiceNumber,
'Payment Applied To Invoice' AS ActivityName,
CAST(CONCAT(bsad.AUGDT, '000000') AS TIMESTAMP) AS EventTime,
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
UNION ALL
SELECT
bsad.XBLNR AS InvoiceNumber,
'Invoice Cleared' AS ActivityName,
CAST(CONCAT(bsad.AUGDT, '235959') AS TIMESTAMP) AS EventTime, -- Add time to separate from 'Payment Applied'
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
) AS ClearingEvents Stappen
- Vereisten: Zorg voor een licentie voor een ETL-tool met een gecertificeerde SAP-connector, zoals Informatica PowerCenter met SAP Connector of Talend met SAP Connector. Controleer of je SAP-inloggegevens de benodigde autorisaties hebben om financiële, verkoop- en systeemtabellen te lezen, waaronder BKPF, BSEG, VBRK, NAST, MHNK, UDM_CASE_ATTR00, CDHDR en CDPOS.
- Maak verbinding met SAP: Maak in de ETL-tool een nieuwe verbinding met SAP ECC. Vul de verbindingsgegevens in, waaronder de applicatieserver, het systeemnummer, de client, de gebruiker en het wachtwoord. Test de verbinding.
- Definieer de databronnen: Stel voor elke activiteit die je wilt extraheren de bijbehorende SAP-tabel(len) in als databron voor de ETL-taak. Gebruik bijvoorbeeld VBRK voor het aanmaken van facturen, BKPF voor boekingsgebeurtenissen en NAST voor klantcommunicatie.
- Bouw de extractielogica per activiteit: Maak voor elk van de 13 vereiste activiteiten een aparte datastroom of transformatie. Pas filters toe om de juiste records te selecteren, bijvoorbeeld op bedrijfscode (BUKRS), documenttype (BLART) en een specifiek datumbereik (zoals aanmaakdatum ERDAT).
- Koppel velden en transformeer data: Koppel in elke datastroom de SAP-bronvelden aan de structuur van het event log: InvoiceNumber, ActivityName, EventTime, UserName en andere aanbevolen attributen. Stel met transformatieregels voor elke datastroom de juiste 'ActivityName' in en zorg dat datums en timestamps de juiste notatie hebben.
- Verwerk complexe activiteiten: Bereken voor gebeurtenissen zoals 'Vervaldatum factuur bereikt' de vervaldatum met de basisbetaaldatum (ZFBDT) en de betalingsvoorwaarden, of haal de netto vervaldatum (NETDT) rechtstreeks op uit BSEG. Voor gebeurtenissen uit wijzigingslogboeken, zoals 'Factuur goedgekeurd', moet je mogelijk tabellen als BKPF en CDHDR/CDPOS combineren op basis van documentnummer en datum.
- Combineer de activiteitendata: Gebruik een 'Union'- of 'Merge'-transformatie in de ETL-tool om de uitvoer van alle 13 datastromen samen te voegen tot één dataset. Controleer vóór het samenvoegen of de kolomnamen en datatypen in alle datastromen overeenkomen.
- Stel de doellocatie in: Kies waar het uiteindelijke event log wordt opgeslagen. Dat kan een tekstbestand (CSV), een databasetabel of een directe verbinding met een staginggebied zijn.
- Stel het extractieschema in: Stel de datumbereikparameters voor de extractie in. Voor de eerste keer kun je 6 tot 12 maanden aan data ophalen. Stel voor volgende delta-extracties in dat de taak data vanaf de datum van de vorige uitvoering ophaalt.
- Voer de taak uit en exporteer de data: Voer de ETL-taak uit. Controleer daarna of het uitvoerbestand de juiste indeling heeft. De uitvoer moet één CSV-bestand zijn met één unieke gebeurtenis per rij, klaar om te uploaden naar ProcessMind.
Configuratie
- SAP-verbinding: Je hebt een verbinding met de applicatieserver van het SAP ECC-doelsysteem nodig. De SAP-gebruiker moet RFC-toegang hebben en autorisaties voor tabellen zoals VBRK, BKPF, BSEG en NAST, plus de overige tabellen in de query.
- ETL-toollicentie: Een geldige licentie voor de commerciële ETL-tool en de bijbehorende SAP-connector is vereist.
- Datumbereik: Haal bij voorkeur data op over een periode van 3 tot 6 maanden. Zo krijg je een representatieve steekproef zonder het systeem te zwaar te belasten. Gebruik instelbare parameters voor de begin- en einddatum.
- Belangrijke filters: Filter altijd op bedrijfscode (BUKRS) om de extractie af te bakenen. Filter ook op relevante factuurdocumenttypen (VBRK-FKART) en boekingsdocumenttypen (BKPF-BLART), zodat standaardfacturen worden meegenomen en andere documenttypen, zoals creditnota's of interne documenten, worden uitgesloten.
- Prestaties: Data-extractie uit grote tabellen zoals BSEG kan traag zijn. Gebruik gerichte filters, haal alleen benodigde velden op en plan de extractie buiten piekuren om de impact op het SAP-bronsysteem te beperken.
Voorbeeldquery config
// ETL Data Extraction Logic for SAP Order-to-Cash Invoicing
// This represents the configuration logic within a graphical ETL tool.
// == Global Parameters ==
// $StartDate: '[Start Date]' (e.g., '2023-01-01')
// $EndDate: '[End Date]' (e.g., '2023-06-30')
// $CompanyCodes: '[Company Code(s)]' (e.g., '1000', '2000')
// $BillingDocTypes: '[Billing Document Type(s)]' (e.g., 'F1', 'F2')
// == Source 1: Invoice Generated ==
// Tables: VBRK
DATA_SOURCE generated_invoices FROM VBRK WHERE
ERDAT >= $StartDate AND ERDAT <= $EndDate
AND BUKRS IN ($CompanyCodes)
AND FKART IN ($BillingDocTypes)
MAP {
InvoiceNumber: VBELN,
ActivityName: 'Invoice Generated',
EventTime: ERDAT + ERZET, // Combine date and time
UserName: ERNAM,
BillingDocumentType: FKART,
CustomerNumber: KUNAG,
CompanyCode: BUKRS,
TotalInvoiceAmount: NETWR
}
// == Source 2: Invoice Posted ==
// Tables: BKPF joined with VBRK
DATA_SOURCE posted_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.BUDAT >= $StartDate AND A.BUDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = ' '
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Posted',
EventTime: A.BUDAT + A.CPUTM, // Posting date and entry time
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 3: Invoice Parked ==
// Tables: BKPF joined with VBRK
DATA_SOURCE parked_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.CPUDT >= $StartDate AND A.CPUDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = 'V'
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Parked',
EventTime: A.CPUDT + A.CPUTM,
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 4: Invoice Approved (Transition from Parked to Posted) ==
// Tables: BKPF joined with VBRK
DATA_SOURCE approved_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.BUDAT >= $StartDate AND A.BUDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = ' '
AND EXISTS (SELECT 1 FROM VBELEGV C WHERE C.BELNR = A.BELNR) // Check if it was ever parked
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Approved',
EventTime: A.BUDAT + A.CPUTM, // Use posting date as approval date
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 5: Invoice Sent To Customer ==
// Tables: NAST joined with VBRK
DATA_SOURCE sent_invoices FROM NAST as A
INNER JOIN VBRK as B ON (A.OBJKY = B.VBELN)
WHERE A.ERDAT >= $StartDate AND A.ERDAT <= $EndDate
AND B.BUKRS IN ($CompanyCodes)
AND A.VSTAT = '1' // Successfully processed
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Sent To Customer',
EventTime: A.ERDAT + A.ERUHR,
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: B.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 6: Invoice Corrected (Reversed) ==
// Tables: VBRK (for the reversal document)
DATA_SOURCE corrected_invoices FROM VBRK as A
WHERE A.ERDAT >= $StartDate AND A.ERDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.SFAKN <> '' // SFAKN is the original cancelled invoice
MAP {
InvoiceNumber: A.SFAKN, // Case ID is the original invoice
ActivityName: 'Invoice Corrected',
EventTime: A.ERDAT + A.ERZET,
UserName: A.ERNAM,
BillingDocumentType: A.FKART,
CustomerNumber: A.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: NULL // Amount belongs to the reversal doc, not original
}
// == Source 7: Invoice Due Date Reached ==
// Tables: BSEG joined with VBRK
DATA_SOURCE due_invoices FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
WHERE A.NETDT >= $StartDate AND A.NETDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.KOART = 'D' // Customer line item
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Due Date Reached',
EventTime: A.NETDT, // Net due date
UserName: 'System',
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 8: Payment Reminder Issued ==
// Tables: MHNK, MHND, VBRK
DATA_SOURCE reminders FROM MHNK as A
INNER JOIN MHND as D ON (A.LAUFD = D.LAUFD AND A.LAUFI = D.LAUFI)
INNER JOIN VBRK as B ON (SUBSTRING(D.XBLNR, 1, 10) = B.VBELN) // XBLNR may need parsing
WHERE A.LAUFD >= $StartDate AND A.LAUFD <= $EndDate
AND D.BUKRS IN ($CompanyCodes)
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Payment Reminder Issued',
EventTime: A.LAUFD, // Dunning date
UserName: A.IDAPS,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: D.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 9: Dispute Case Created ==
// Tables: UDM_CASE_ATTR00
DATA_SOURCE disputes FROM UDM_CASE_ATTR00 as A
WHERE A.CREATE_TIMESTAMP >= $StartDate // Timestamp format may vary
AND A.FIN_COMP_CODE IN ($CompanyCodes)
AND A.PROCESS = 'FIN_FSCM_DIS'
MAP {
InvoiceNumber: A.BILL_DOC_ID,
ActivityName: 'Dispute Case Created',
EventTime: A.CREATE_TIMESTAMP,
UserName: A.CREATE_USER,
BillingDocumentType: NULL,
CustomerNumber: A.BP_NUMBER,
CompanyCode: A.FIN_COMP_CODE,
TotalInvoiceAmount: A.DISPUTED_AMOUNT
}
// == Source 10: Customer Payment Received ==
// Tables: BKPF
DATA_SOURCE payments FROM BKPF
WHERE BUDAT >= $StartDate AND BUDAT <= $EndDate
AND BUKRS IN ($CompanyCodes)
AND BLART = 'DZ' // Example for Customer Payment
MAP {
InvoiceNumber: NULL, // Invoice not yet known
ActivityName: 'Customer Payment Received',
EventTime: BUDAT + CPUTM,
UserName: USNAM,
BillingDocumentType: NULL,
CustomerNumber: NULL, // Requires join to BSEG to get customer
CompanyCode: BUKRS,
TotalInvoiceAmount: NULL
}
// == Source 11 & 12: Payment Applied To Invoice & Invoice Cleared ==
// Tables: BSEG joined with VBRK
DATA_SOURCE cleared_items FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
WHERE A.AUGDT >= $StartDate AND A.AUGDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.AUGBL <> ''
// Generate two records from this source
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Payment Applied To Invoice',
EventTime: A.AUGDT, // Clearing Date
UserName: H.USNAM, // User from header of original invoice doc
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
UNION WITH {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Cleared',
EventTime: A.AUGDT, // Clearing Date
UserName: H.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 13: Invoice Written Off ==
// Tables: BSEG (for the invoice line) and BKPF (for clearing doc type)
DATA_SOURCE written_off FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
INNER JOIN BKPF as C ON (A.AUGBL = C.BELNR AND A.BUKRS = C.BUKRS AND A.AUGGJ = C.GJAHR)
WHERE A.AUGDT >= $StartDate AND A.AUGDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND C.BLART = '[Your Write-Off Document Type]' // e.g., 'AB'
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Written Off',
EventTime: A.AUGDT,
UserName: C.USNAM, // User who posted the write-off
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Final Union of all sources ==
OUTPUT generated_invoices
UNION ALL posted_invoices
UNION ALL parked_invoices
UNION ALL approved_invoices
UNION ALL sent_invoices
UNION ALL corrected_invoices
UNION ALL due_invoices
UNION ALL reminders
UNION ALL disputes
UNION ALL payments
UNION ALL cleared_items
UNION ALL written_off Klaar om te beginnen?
Gebruik deze template om de datavoorbereiding eenvoudiger te maken en inzicht te krijgen in het facturatieproces. Zet vandaag de eerste stap naar een snellere cashflow.
Versnel de cashflow: verbeter vandaag nog de facturatie en factuurverwerking!
Verminder inefficiënties, verkort de doorlooptijd met 30% en verbeter de cashflow.
Je hebt geen creditcard nodig. Begin binnen enkele minuten met verbeteren.