Jouw datatemplate voor Order to Cash, facturatie en facturen
Jouw datatemplate voor Order to Cash, facturatie en facturen
- Aanbevolen attributen voor een volledige analyse
- Belangrijke processtappen en mijlpalen om te volgen
- Praktische richtlijnen 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 tijdens de levenscyclus van de factuur heeft plaatsgevonden. | ||
| Beschrijving Dit attribuut beschrijft een specifieke actie of statuswijziging in het billingproces, zoals 'Factuur aangemaakt', 'Factuur geboekt' of 'Betaling van klant ontvangen'. Deze activiteiten worden conceptueel afgeleid uit verschillende systeemgebeurtenissen, statuswijzigingen in documenten of specifieke transactiec codes die gebruikers uitvoeren. De volgorde van deze activiteiten vormt de procesflow en is de basis voor process mining-analyse. Door de activiteiten te onderzoeken, zie je welke stappen worden uitgevoerd, in welke volgorde en hoe vaak. Zo wordt duidelijk hoe het proces werkelijk verloopt ten opzichte van het ontworpen proces. Waarom dit belangrijk is Definieert de stappen in de procesmap en maakt het mogelijk om procesflows, afwijkingen en knelpunten zichtbaar te maken en te analyseren. Waar je het vindt Dit is een conceptueel attribuut dat uit meerdere bronnen wordt afgeleid, zoals transactiec codes (CDHDR-TCODE), statuswijzigingen van documenten (VBUK-FKSTK) en boekingen van boekhoudingsdocumenten. Voorbeelden Factuur aangemaaktFactuur geboektBetalingsherinnering verstuurdFactuur vereffend | |||
| Factuurnummer InvoiceNumber | De unieke identificatie van het billingdocument, die als primaire case-ID voor het facturatieproces dient. | ||
| Beschrijving Het factuurnummer, in SAP bekend als het Billing Document Number, identificeert elke factuur uniek. In process mining fungeert het als de CaseId. Het groepeert alle bijbehorende activiteiten, zoals aanmaken, boeken, verzenden, betalen en vereffenen, in één end-to-end-procesinstantie. Door processen op factuurnummer te analyseren, krijg je een volledig beeld van de levenscyclus van elke billingtransactie, van het begin tot de definitieve vereffening. Dit is belangrijk voor het berekenen van KPI's zoals Days Sales Outstanding (DSO) en de totale factuurcyclustijd. Zo ontstaat een duidelijke basis voor prestatiemeting en verbetering. Waarom dit belangrijk is Dit is de belangrijkste sleutel om het volledige verloop van een factuur te volgen. Je kunt er doorlooptijden, knelpunten en variaties per billingtransactie mee analyseren. Waar je het vindt SAP ECC-tabel: VBRK, veld: VBELN Voorbeelden 90001234900012359000123690001237 | |||
| Starttijd EventTime | De timestamp die aangeeft wanneer een specifieke activiteit of gebeurtenis plaatsvond. | ||
| Beschrijving Event Time legt de exacte datum en tijd van elke activiteit in de levenscyclus van de factuur vast. Deze timestamp is de basis voor alle tijdsanalyses in process mining, zoals het berekenen van doorlooptijden, het vinden van knelpunten en het volgen van procesprestaties ten opzichte van service level agreements. Dit attribuut wordt meestal samengesteld door een datumveld, zoals Posting Date (BUDAT), te combineren met een tijdveld (UZEIT) uit verschillende SAP-tabellen waarin wijzigingen of het aanmaken van documenten worden vastgelegd. Nauwkeurige timestamps zijn belangrijk voor een betrouwbaar event log en geldige prestatieanalyses. Waarom dit belangrijk is Dit attribuut vormt de basis voor alle prestatieanalyses. Je kunt er doorlooptijden, tijdsduur en wachttijden tussen processtappen mee berekenen. Waar je het vindt 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 fundamenteel organisatiegegeven. Binnen process mining gebruik je het bedrijfsnummer om de prestaties van billingprocessen tussen verschillende juridische entiteiten binnen een concern te analyseren en vergelijken. Zo vind je best practices bij de ene entiteit die ook elders kunnen worden toegepast en blijft de analyse in lijn met de organisatiestructuur. Waarom dit belangrijk is Maakt het mogelijk om processen tussen verschillende juridische entiteiten te filteren en vergelijken. Dat is belangrijk voor financiële analyses en benchmarks tussen organisatieonderdelen. Waar je het vindt SAP ECC-tabel: VBRK, veld: BUKRS Voorbeelden 10002000US01DE01 | |||
| Billingdocumenttype BillingDocumentType | Een code die het type billingdocument classificeert, zoals een factuur, creditnota of debetnota. | ||
| Beschrijving Het Billing Document Type deelt transacties in op basis van hun bedrijfsdoel. 'F2' is bijvoorbeeld een standaardklantfactuur en 'G2' staat voor een creditnota. Deze classificatie wordt in SAP geconfigureerd en bepaalt hoe verschillende billingdocumenten worden verwerkt. Voor process mining is dit attribuut belangrijk om verschillende billingscenario's te filteren en te vergelijken. Analisten kunnen het proces voor standaardfacturen los van creditnota's onderzoeken. Zo worden hun eigen flows, doorlooptijden en knelpunten zichtbaar en kun je gerichter verbeteren. Waarom dit belangrijk is Maakt segmentatie en analyse van verschillende billingprocessen mogelijk, zoals standaardfacturen en creditnota's, die vaak sterk van elkaar afwijkende procesflows hebben. Waar je het vindt 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 die verantwoordelijk is voor een gebeurtenis, zoals het aanmaken van een factuur of boeken van een betaling. Het is belangrijk om de menselijke kant van het proces te analyseren. Met deze data kun je prestatieverschillen tussen gebruikers of teams onderzoeken, opleidingsbehoeften herkennen en mogelijke complianceproblemen opsporen. Je kunt ook handmatige activiteiten van menselijke gebruikers onderscheiden van geautomatiseerde stappen door systeem- of batchgebruikers. Dat is belangrijk voor het berekenen van automatiseringspercentages. Waarom dit belangrijk is Maakt analyses mogelijk van gebruikersprestaties en werkverdeling. Ook helpt het om handmatige en geautomatiseerde activiteiten van elkaar te onderscheiden, ter ondersteuning van initiatieven voor automatisering en efficiëntie. Waar je het vindt 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 uitgegeven. | ||
| Beschrijving Het klantnummer koppelt een factuur aan een specifieke klant of zakenpartner. Dit attribuut is belangrijk om het billingproces te segmenteren en te analyseren op basis van klantkenmerken. Analisten kunnen dit veld gebruiken om Days Sales Outstanding (DSO) tussen klanten te vergelijken, te zien welke klanten vaak te laat betalen en compliance met betalingstermijnen te analyseren. Met dit inzicht kun je klantrelaties beheren en incassostrategieën afstemmen op verschillende klantsegmenten. Waarom dit belangrijk is Maakt klantgerichte analyses mogelijk. Zo herken je betaalgedrag, beoordeel je DSO per klant en stem je incassostrategieën beter af. Waar je het vindt 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 staat voor het totale nettobedrag van de factuur, exclusief belastingen. Het factuurbedrag is belangrijke financiële data die bij het facturatieproces hoort. Je gebruikt dit voor verschillende analyses, bijvoorbeeld om facturen in hoge en lage waarden in te delen en te zien of hun procesverloop verschilt. Je kunt het ook gebruiken om incassoactiviteiten te prioriteren of te onderzoeken waarom facturen met een hoge waarde langer nodig hebben om te worden goedgekeurd of betaald. Deze financiële context geeft extra diepgang aan procesanalyse. Waarom dit belangrijk is Biedt belangrijke financiële context. Zo kun je analyses uitvoeren op basis van de factuurwaarde, bijvoorbeeld om te zien of facturen met een hoge waarde een ander proces volgen of langer nodig hebben om te worden afgehandeld. Waar je het vindt SAP ECC-tabel: VBRK, veld: NETWR Voorbeelden 1500.7525000.00500.0012345.67 | |||
| Betalingstermijnen PaymentTerms | De voorwaarden waaronder een verkoper een verkoop afrondt, inclusief het betalingsschema. | ||
| Beschrijving Betalingstermijnen bepalen wanneer een betaling verschuldigd is, bijvoorbeeld 'Netto 30' of 'Netto 60'. Je spreekt deze voorwaarden met de klant af. Ze hebben veel invloed op de cashflow. Door het proces per betalingstermijn te analyseren, zie je of bepaalde voorwaarden samenhangen met langere betaalcycli of meer te late betalingen. Met die informatie kun je betere voorwaarden met klanten onderhandelen of je 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 je het betaalgedrag van klanten en de impact op de cashflow te analyseren op basis van afgesproken voorwaarden. Zo krijg je informatie voor het verbeteren van commerciële afspraken. Waar je het vindt 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 fiscale periode de transactie in het grootboek wordt opgenomen. Het is een belangrijke datum voor de boekhouding en financiële rapportage. Vertraging tussen het aanmaken van het document en de boeking kan wijzen op inefficiënties bij de interne verwerking van factuurdocumenten. Vanuit process mining markeert de boekingsdatum een belangrijke mijlpaal in de levenscyclus van de factuur. De tijd tussen het aanmaken en boeken van de factuur kan een belangrijke prestatie-indicator zijn voor de efficiëntie van de facturatieafdeling. Waarom dit belangrijk is Markeert een belangrijke financiële mijlpaal en is essentieel voor de boekhouding. De tijd tussen het aanmaken en boeken van de factuur laat zien hoe efficiënt de interne verwerking verloopt. Waar je het vindt SAP ECC-tabel: BKPF, veld: BUDAT Voorbeelden 2023-04-152023-04-172023-05-21 | |||
| Bronsysteem SourceSystem | Identificeert het bronsysteem waaruit de data is geëxtraheerd. | ||
| Beschrijving Dit attribuut geeft aan in welk systeem de data oorspronkelijk is vastgelegd. In een bedrijfsomgeving met meerdere ERP-instanties of geïntegreerde systemen helpt dit veld om data uit verschillende bronnen van elkaar te onderscheiden. Voor process mining is dit belangrijk voor datavalidatie en analyses waarin processen tussen systemen of organisatieonderdelen worden vergeleken. Tijdens de data-extractie wordt meestal een vaste waarde toegevoegd om de dataset te labelen. Waarom dit belangrijk is Geeft context bij de herkomst van de data. Dat is belangrijk in omgevingen met meerdere systemen om de dataintegriteit te bewaken en systeemspecifieke analyses mogelijk te maken. Waar je het vindt Dit is meestal een vaste waarde die tijdens het ETL-proces wordt toegevoegd en die de specifieke SAP ECC-instantie identificeert, bijvoorbeeld 'ECC_PROD_NA'. Voorbeelden SAP_ECC_PRODECC_EU_100SAP_US_FIN | |||
| Clearingdatum ClearingDate | De datum waarop de betaling is ontvangen en de factuur uit de openstaande vorderingen is verwijderd. | ||
| Beschrijving De clearingdatum is de datum waarop een openstaande post, zoals een factuur, in het financiële systeem als betaald of 'gecleard' wordt gemarkeerd. Deze datum geeft aan wanneer het geld als geïnd en afgestemd wordt beschouwd. Dit is een van de belangrijkste datums in de Order to Cash-cyclus. De clearingdatum vormt het eindpunt voor het berekenen van Days Sales Outstanding (DSO) en de totale doorlooptijd van factuur tot betaling. Door de clearingdatum te analyseren, kun je de effectiviteit van het incassoproces meten. Waarom dit belangrijk is Markeert de laatste stap in de levenscyclus van de factuur. De datum vormt het eindpunt voor berekeningen van DSO en de totale doorlooptijd en laat zien hoe efficiënt betalingen worden geïnd. Waar je het vindt SAP ECC-tabel: BSAD, veld: AUGDT Voorbeelden 2023-05-142023-06-012023-06-25 | |||
| Documentdatum DocumentDate | De datum op het oorspronkelijke document, opgegeven door de leverancier of de maker. | ||
| 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 rapportage en voor het berekenen van KPI's zoals Days Sales Outstanding (DSO). Vanuit het perspectief van de klant markeert de documentdatum het begin van de incassoperiode. Door verschillen tussen de documentdatum en de boekingsdatum te analyseren, kun je interne vertragingen bij de verwerking van facturen opsporen. Waarom dit belangrijk is Vormt de basis voor het berekenen van de ouderdom van facturen en DSO. Daarmee biedt deze datum een belangrijk referentiepunt voor analyses van financiën en betalingstermijnen. Waar je het vindt SAP ECC-tabel: VBRK, veld: FKDAT (factuurdatum) Voorbeelden 2023-04-152023-04-162023-05-20 | |||
| Is geautomatiseerd IsAutomated | Een vlag die aangeeft of een activiteit door een systeemgebruiker of via automatisering is uitgevoerd. | ||
| Beschrijving Dit berekende attribuut is een boolean-vlag die handmatige en geautomatiseerde activiteiten van elkaar onderscheidt. Meestal wordt de vlag afgeleid door het attribuut Gebruikersnaam te vergelijken met een lijst van bekende systeem- of batchgebruikers, zoals 'BATCHUSER' of 'SAPSYSTEM'. Deze vlag is belangrijk om de automatiseringsgraad van het facturatieproces te meten. Veel organisaties willen hiermee efficiënter werken en kosten verlagen. De KPI voor het geautomatiseerde facturatiepercentage wordt rechtstreeks op basis van dit attribuut berekend. Zo kun je de voortgang van automatiseringsinitiatieven volgen. Waarom dit belangrijk is Ondersteunt rechtstreeks de berekening van het geautomatiseerde facturatiepercentage. Zo kun je de procesefficiëntie meten en de impact van automatiseringsprojecten volgen. Waar je het vindt Afgeleid van het attribuut Gebruikersnaam. De logica ziet er bijvoorbeeld zo uit: IF UserName IN ('BATCH', 'SYSTEM', 'RFCUSER') THEN true ELSE false. Voorbeelden truefalse | |||
| Is herwerk IsRework | Een vlag die aangeeft of een activiteit een stap voor herwerk of correctie is. | ||
| Beschrijving Dit berekende attribuut identificeert activiteiten die herwerk vertegenwoordigen, zoals 'Factuur gecorrigeerd' of het terugdraaien van documenten. Meestal is het een boolean-vlag die wordt afgeleid van de activiteitsnaam of van transactiecodes voor correcties en annuleringen, zoals 'VF11' voor het annuleren van een factuurdocument. Met process mining kun je met deze vlag de hoeveelheid herwerk in het facturatieproces meten. De vlag ondersteunt KPI's zoals het factuurcorrectiepercentage en helpt herwerklussen in de procesmap zichtbaar te maken. Zo zie je inefficiënties en kwaliteitsproblemen die de proceskosten verhogen en betalingen vertragen. Waarom dit belangrijk is Helpt inefficiënties en kwaliteitsproblemen in het proces te meten door zichtbaar te maken hoeveel werk nodig is om fouten te corrigeren. Daarmee ondersteunt het rechtstreeks KPI's voor herwerk. Waar je het vindt 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. Het geeft belangrijke context bij de analyse, zodat je weet hoe actueel de data is. In dashboards en rapporten laat deze timestamp zien hoe recent de data is. Ook helpt dit om verwachtingen te managen over de zichtbaarheid van zeer recente transacties. De timestamp wordt meestal aan het einde van het data-extractieproces gegenereerd. Waarom dit belangrijk is Laat zien hoe actueel de data is. Dat is belangrijk voor operationele beslissingen op basis van de analyse. Waar je het vindt Gegenereerd en opgeslagen tijdens het ETL-proces. Voorbeelden 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| Nummer verkoopdocument SalesDocumentNumber | De identificatie van de oorspronkelijke verkooporder die tot de factuur heeft geleid. | ||
| Beschrijving Dit attribuut legt een directe link van de factuur naar de verkooporder die de transactie heeft gestart. Die traceerbaarheid is belangrijk voor een volledige end-to-end-analyse van Order to Cash. Door het facturatieproces te koppelen aan het voorafgaande verkooporderproces, kun je de totale doorlooptijd van klantorder tot ontvangst van betaling analyseren. Zo zie je of vertragingen bij de facturatie worden veroorzaakt door problemen in verkoop, fulfilment of de facturatieafdeling zelf. Dat geeft een vollediger beeld van het proces. Waarom dit belangrijk is Koppelt het facturatieproces terug aan de verkooporder. Zo kun je Order to Cash echt end-to-end analyseren en vertragingen tussen afdelingen opsporen. Waar je het vindt SAP ECC-tabel: VBRP, veld: VGBEL Voorbeelden 100000451000004610000047 | |||
| 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 een specifiek programma in SAP, zoals 'VF01' voor het aanmaken van een billingdocument. Door de T-Code van elke gebeurtenis vast te leggen, krijg je technisch inzicht in de manier waarop het proces is uitgevoerd. Deze informatie is waardevol voor oorzaakanalyses. Als fouten vaak voorkomen, kunnen analisten bijvoorbeeld controleren of een niet-standaardtransactiecode wordt gebruikt. De code helpt ook bij het afleiden van de activiteitsnaam en bij het begrijpen van de systeemfuncties die in het proces worden gebruikt. Waarom dit belangrijk is Geeft technische context bij de uitvoering van een activiteit. Zo kun je oorzaken van procesafwijkingen analyseren en niet-standaardacties van gebruikers herkennen. Waar je het vindt 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 het analyseren van data uit een multinationale organisatie is het valutaveld essentieel om financiële cijfers goed te interpreteren en om te rekenen. Zo kun je consistent rapporteren en voorkom je dat bedragen zonder de juiste valutaomrekening worden samengevoegd. Dat zou leiden tot een onjuiste financiële analyse. Waarom dit belangrijk is Biedt de nodige context voor alle geldbedragen. Zo blijft de financiële analyse betrouwbaar, vooral in een omgeving met meerdere valuta. Waar je het vindt SAP ECC-tabel: VBRK, veld: WAERK Voorbeelden USDEURGBPJPY | |||
| 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. Het is een belangrijk veld voor de inrichting van verkoop- en distributieprocessen. Met process mining kun je het facturatieproces vanuit het perspectief van de verkoopstructuur analyseren. Je kunt de prestaties van verschillende verkooporganisaties vergelijken, zien welke regio's of bedrijfsonderdelen efficiënter factureren en initiatieven ondersteunen om best practices te standaardiseren. Waarom dit belangrijk is Maakt prestatievergelijkingen en analyses tussen verschillende verkoopdivisies of regio's mogelijk. Zo zie je welke best practices werken en waar verbetering nodig is. Waar je het vindt SAP ECC-tabel: VBRK, veld: VKORG Voorbeelden 1000NA01EU01AP01 | |||
| Vervaldatum factuur InvoiceDueDate | De datum waarop de klant uiterlijk moet betalen. | ||
| Beschrijving De vervaldatum van de factuur is de uiterste betaaldatum volgens de betalingstermijnen. Deze datum is belangrijk voor het beheer van openstaande vorderingen 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. Door facturen op vervaldatum te analyseren, kun je de cashflow voorspellen en incassoactiviteiten voor komende of achterstallige betalingen prioriteren. De datum wordt meestal afgeleid van de basisdatum en de betalingstermijnen. Waarom dit belangrijk is Is de referentie voor het meten van tijdige betalingen en is belangrijk voor het beheer van openstaande vorderingen en cashflowprognoses. Waar je het vindt Wordt berekend op basis van de basisdatum (BSEG-ZFBDT) en betalingstermijnen (BSEG-ZTERM). De datum wordt niet altijd in een rechtstreeks veld opgeslagen. Voorbeelden 2023-05-152023-05-302023-06-20 | |||
Activiteiten voor Order to Cash - Facturatie en factuurverwerking
| Activiteit | Beschrijving | ||
|---|---|---|---|
| Betaling van klant ontvangen | Er is een betaling van de klant 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 ijkpunt in de cashconversiecyclus. De tijd tussen het verzenden van de factuur en het ontvangen van de betaling is een belangrijk onderdeel van Days Sales Outstanding (DSO). Waar je het vindt Vastgelegd als een nieuw document in BKPF en BSEG, meestal met een documenttype dat een klantbetaling aanduidt, zoals 'DZ'. De boekingsdatum (BUDAT) markeert de gebeurtenis. Vastleggen Vanaf de boekingsdatum van het klantbetalingsdocument in BKPF. Eventtype explicit | |||
| Factuur aangemaakt | Geeft aan dat het billingdocument in het systeem is aangemaakt. Deze gebeurtenis wordt vastgelegd wanneer een nieuwe regel met een specifiek documenttype voor facturen wordt aangemaakt in de tabelkop van het boekhoudingsdocument (BKPF). | ||
| Waarom dit belangrijk is Dit is het startpunt van het volledige facturatieproces. Door de tijd vanaf deze gebeurtenis te analyseren, meet je de Invoice Creation Cycle Time. Dit vormt ook de basis voor het berekenen van Days Sales Outstanding (DSO). Waar je het vindt Vastgelegd in tabel BKPF. De aanmaakdatum (CPUDT) en -tijd (CPUTM) van een specifiek documentnummer (BELNR) markeren deze gebeurtenis. Het documenttype (BLART) identificeert het document als factuur. Vastleggen Vanaf de aanmaaktimestamp (CPUDT) in tabel BKPF voor het factuurdocument. Eventtype explicit | |||
| Factuur geboekt | De factuur wordt formeel vastgelegd in het subgrootboek Debiteuren en het grootboek. Deze gebeurtenis maakt de factuur juridisch bindend en geeft de schuld van de klant weer. | ||
| Waarom dit belangrijk is Dit is een belangrijk ijkpunt waarop de incassotermijn officieel begint. De tijd tussen het aanmaken en boeken kan interne vertragingen zichtbaar maken die de cashflow beïnvloeden. Waar je het vindt Vastgelegd in tabel BKPF. De boekingsdatum (BUDAT) van het documentnummer (BELNR) markeert deze gebeurtenis. Bij geparkeerde documenten is dit het moment waarop het document wordt omgezet in een geboekt document. Vastleggen Vanaf de boekingsdatum (BUDAT) in tabel BKPF voor het factuurdocument. Eventtype explicit | |||
| Factuur naar klant verzonden | Geeft aan dat de factuur via een vastgesteld uitvoerkanaal, zoals print, e-mail of EDI, naar de klant is verzonden. Dit wordt meestal vastgelegd in de logs van het outputmanagementsysteem. | ||
| Waarom dit belangrijk is Deze gebeurtenis is een belangrijk ijkpunt waarop de betalingstermijn van de klant begint. Vertragingen hebben direct invloed op het moment waarop je betaling kunt verwachten en op de Payment Collection Efficiency. Waar je het vindt Kan worden afgeleid uit de verwerkingsdatum en -tijd in de berichtstatus-tabel (NAST) voor het outputtype dat bij de factuur hoort. Vastleggen Afgeleid uit een regel in de NAST-tabel met verwerkingsstatus '1' (succesvol verwerkt). Eventtype inferred | |||
| Factuur vereffend | De eindstatus van een volledig betaalde factuur. De openstaande post is gesloten door een bijbehorende betaling of creditnota. De factuur is volledig vereffend. | ||
| Waarom dit belangrijk is Markeert de succesvolle afronding van de Order to Cash-cyclus voor een factuur. Dit is de belangrijkste eindgebeurtenis voor het meten van de totale Average Invoice Cycle Time. Waar je het vindt Treedt op wanneer de velden voor het vereffeningsdocument (AUGBL) en de vereffeningsdatum (AUGDT) zijn ingevuld voor de factuurregel in tabel BSEG. Vastleggen De gebeurtenis vindt plaats op de vereffeningsdatum (AUGDT) die in tabel BSEG voor de factuurregel is vastgelegd. Eventtype explicit | |||
| Betaling aan factuur gekoppeld | De ontvangen klantbetaling is gekoppeld aan de specifieke openstaande factuur en gemarkeerd voor vereffening. Dit is de afstemmingsstap die de betaling aan de schuld koppelt. | ||
| Waarom dit belangrijk is Deze activiteit is belangrijk voor het meten van de Cash Application Cycle Time. Vertraging bij het koppelen van betalingen kan de werkelijke debiteurenstatus vertekenen en beschikbare cash aan het zicht onttrekken. Waar je het vindt Afgeleid uit de vereffeningsboeking, bijvoorbeeld F-32, die de vereffeningsvelden in de factuurregel vult. De timestamp van de gebeurtenis is de vereffeningsdatum. Vastleggen Afgeleid wanneer de vereffeningsdatum (AUGDT) is ingevuld in de factuurregeltabel (BSEG). Eventtype inferred | |||
| Betalingsherinnering verstuurd | Het systeem heeft een aanmaning of betalingsherinnering voor een achterstallige factuur aangemaakt en naar de klant verzonden. Dit wordt vastgelegd in de aanmaningshistorie. | ||
| Waarom dit belangrijk is Helpt de effectiviteit van de incassostrategie te beoordelen. De tijd tussen de herinnering en ontvangst van de betaling is belangrijk voor de KPI Payment Reminder Effectiveness. Waar je het vindt Vastgelegd in de aanmaningsdatatabellen, specifiek MHNK (kop van aanmaningsdata) en MHND (regels van aanmaningsdata), die door de aanmaningsrun worden aangemaakt (transactie F150). Vastleggen Vastgelegd bij het uitvoeren van een aanmaningsrun (F150) voor de achterstallige post. Eventtype explicit | |||
| Factuur afgeboekt | Een alternatieve eindstatus waarbij de factuur oninbaar wordt verklaard en het openstaande bedrag wordt afgeboekt op een rekening voor dubieuze debiteuren. De factuur wordt gesloten zonder betaling van de klant. | ||
| Waarom dit belangrijk is Geeft een negatief procesresultaat en omzetverlies weer. Door deze gebeurtenissen te volgen, kun je redenen voor dubieuze debiteuren analyseren en beleid voor kredietbeheer verbeteren. Waar je het vindt Afgeleid door de vereffeningsboeking van de factuur te analyseren. Als het vereffeningsdocument op een specifieke G/L-rekening voor dubieuze debiteuren wordt geboekt, wordt de factuur als afgeboekt beschouwd. Vastleggen Afgeleid wanneer de vereffeningsboeking een boeking op een aangewezen G/L-rekening voor dubieuze debiteuren bevat. Eventtype inferred | |||
| Factuur gecorrigeerd | Geeft een herstelactiviteit weer waarbij een eerste factuur onjuist bleek en vervolgens is teruggedraaid. Dit wordt vastgelegd door terugboekingsdocumenten te identificeren die aan de oorspronkelijke factuur zijn gekoppeld. | ||
| Waarom dit belangrijk is Maakt inefficiënties en kwaliteitsproblemen zichtbaar. Een hoog aantal correcties wijst op problemen in de onderliggende verkoop- of billingdata en ondersteunt het Invoice Rework And Error Rates-dashboard. Waar je het vindt Wordt geïdentificeerd door een terugboekingsdocument te vinden waarvan 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. Eventtype explicit | |||
| Factuur geparkeerd | Het factuurdocument is in een voorlopige status opgeslagen zonder dat het in het grootboek is geboekt. Dit gebeurt vaak wanneer informatie ontbreekt of eerst moet worden gecontroleerd voordat het document definitief wordt geboekt. | ||
| Waarom dit belangrijk is Volgt de stappen vóór het boeken en mogelijke vertragingen. Een lange parkeertijd kan wijzen op problemen met de datakwaliteit of knelpunten in het proces vóór goedkeuring. Waar je het vindt Geparkeerde documenten worden opgeslagen in tabel VBKPF. Het aanmaken van een document in deze tabel dat later wordt geboekt, staat voor deze activiteit. Vastleggen Vastgelegd wanneer een geparkeerd document wordt opgeslagen met een transactie zoals FV70. Eventtype explicit | |||
| Factuur goedgekeurd | Geeft de formele goedkeuring van de factuur weer, waarna deze kan worden geboekt of naar de klant kan worden verzonden. Dit wordt vaak afgeleid uit het omzetten van een geparkeerd document naar een geboekt document. | ||
| Waarom dit belangrijk is Volgt de interne goedkeuringsworkflow, die vaak een bron van knelpunten is. Door deze activiteit te analyseren, ondersteun je het Invoice Approval Flow Analysis-dashboard en zie je welke goedkeurders vertraging veroorzaken. Waar je het vindt Kan worden afgeleid uit de overgang van een geparkeerde status in VBKPF naar een geboekte status in BKPF. Als je een workflowsysteem gebruikt, kan dit ook een expliciete gebeurtenis in de workflowlogs zijn. Vastleggen Vergelijk de aanmaakdatum van het geparkeerde document (VBKPF) met de boekingsdatum van het definitieve document (BKPF). Eventtype inferred | |||
| Geschilcase aangemaakt | Er is formeel een geschil over de factuur geregistreerd, meestal naar aanleiding van een klacht van de klant. Dit wordt vastgelegd in het SAP Dispute Management-systeem. | ||
| Waarom dit belangrijk is Identificeert facturen waarbij betaling mogelijk wordt vertraagd en maakt onderliggende oorzaken van klantontevredenheid zichtbaar. Dit markeert het begin van een belangrijk proces voor het afhandelen van uitzonderingen. Waar je het vindt Vastgelegd wanneer een case wordt aangemaakt in de tabel voor geschilcases (UDM_CASE) die aan het boekhoudingsdocument van de factuur is gekoppeld. Vastleggen Vastgelegd wanneer een gebruiker via transactie UDM_DISPUTE een geschilcase aanmaakt. Eventtype explicit | |||
| Vervaldatum van factuur bereikt | Een berekende gebeurtenis die de dag markeert waarop de factuur volgens de betalingstermijnen officieel moet worden betaald. Het is geen activiteit die door een gebruiker of systeem wordt uitgevoerd, maar een belangrijk moment in de tijd. | ||
| Waarom dit belangrijk is Essentieel voor het analyseren van betaalgedrag en compliance. Dit is de basis om betalingen als op tijd of te laat te classificeren en de KPI On-Time Payment Rate te berekenen. Waar je het vindt Afgeleid door de huidige datum te vergelijken met de netto vervaldatum. De vervaldatum staat in veld BSEG-ZFBDT of wordt berekend op basis van de basisdatum en betalingstermijnen. Vastleggen Vergelijk de systeemdatum met het veld voor de netto vervaldatum in de factuurregel (BSEG). Eventtype calculated | |||
Extractiegidsen
Stappen
- ABAP Editor openen: Log in op je SAP ECC-systeem. Open de ABAP Editor met transact code
SE38. - Programma maken: Vul in het veld Program de naam van je nieuwe programma in, bijvoorbeeld
Z_PM_O2C_INVOICE_EXTRACT, en klik op de knop Create. Geef het programma een duidelijke titel en stel het Type in op 'Executable Program'. - Selectiescherm definiëren: Definieer in de broncode van het programma de parameters voor het selectiescherm. Hiermee kunnen gebruikers de data voor extractie filteren. Belangrijke parameters zijn het bereik van de documentaanmaakdatum (
S_ERDAT), Company Code (S_BUKRS) en Billing Document Type (S_VBTYP). - Datastructuren definiëren: Declareer een interne tabelstructuur voor de uiteindelijke event log-data. Deze structuur moet velden bevatten voor
InvoiceNumber,ActivityNameenEventTime, plus aanbevolen attributen zoalsUserName,BillingDocumentType,CustomerNumber,CompanyCodeenTotalInvoiceAmount. - Logica voor dataselectie implementeren: Schrijf de kern van de ABAP-logica voor het selecteren van data. Selecteer eerst de primaire factuurdocumenten uit de tabellen
VBRKenBKPFop basis van de invoer in het selectiescherm. Sla deze op in een tijdelijke interne tabel. - Activiteiten extraheren: Loop door de eerste lijst met factuurdocumenten. Voer voor elk document aanvullende selecties uit in verschillende tabellen om de 13 vereiste activiteiten te identificeren. Raadpleeg bijvoorbeeld tabel
NASTvoor gebeurtenissen zoals 'Invoice Sent To Customer',BSEGvoor clearinginformatie ('Invoice Cleared', 'Payment Applied') enMHNKvoor aanmaningsdata ('Payment Reminder Issued'). - Event log-tabel opbouwen: Vul voor elke activiteit uit de vorige stap een nieuw record in de uiteindelijke interne event log-tabel. Zorg dat
InvoiceNumber,ActivityName,EventTimeen de andere attributen correct uit de brontabellen worden overgenomen. - Naar de application server schrijven: Gebruik na afloop van de loop, wanneer de uiteindelijke event log-tabel volledig is gevuld, de statements
OPEN DATASET,LOOP AT... TRANSFERenCLOSE DATASETom de inhoud van de interne tabel naar een flat file op de SAP application server te schrijven. Geef een logisch bestandspad op waartoe je toegang hebt. - Het bestand ophalen: Gebruik transact code
AL11om de mappen op de application server te openen en het gegenereerde bestand te vinden. Stem met je SAP Basis-team af hoe je het bestand van de server naar je lokale computer of een gedeelde netwerklocatie downloadt. - Laatste opmaak: Open het gedownloade bestand en controleer of het een comma-separated value (CSV)-bestand met een headerregel is. Sla het bestand op met UTF-8-codering, zodat het compatibel is met ProcessMind voor upload.
Configuratie
- Vereisten: Toegang om ABAP-programma's te maken en uit te voeren (transactie SE38). Autorisatie om FI- en SD-tabellen te lezen, waaronder
VBRK,VBRP,BKPF,BSEG,NAST,MHNKenUDM_CASE_ATTR00(voor Dispute Management). - Selectie van datumbereik: Het programma moet een verplichte parameter voor het datumbereik hebben, meestal gebaseerd op de documentaanmaakdatum (
ERDATin VBRK/BKPF). Voor de eerste extractie raden we een periode van 3 tot 6 maanden aan, zodat de dataset beheersbaar blijft. - Belangrijke filters: Filter altijd op
CompanyCode(BUKRS) om de scope van de extractie te beperken. Het is ook sterk aan te raden om te filteren op Billing Document Type (VBTYPuit VBRK) of Accounting Document Type (BLARTuit BKPF), zodat alleen relevante factuurtypen worden meegenomen, bijvoorbeeld 'RV' voor standaardboekingsfacturen, en creditnota's of andere documenten worden uitgesloten. - Aandacht voor prestaties: Voor grote datasets over meer dan enkele maanden moet je het programma als background job uitvoeren om time-outs van de sessie te voorkomen. Optimaliseer de ABAP-logica met geïndexeerde tabelreads en vermijd geneste loops met databaseselecties daarin. De voorkeursaanpak is om data eerst in interne tabellen te selecteren en die daarna te verwerken.
- Configuratie van het uitvoerbestand: De ABAP-code moet het bestandspad op de application server en het scheidingsteken voor het CSV-bestand specificeren, meestal een komma of puntkomma. Zorg dat het pad een globaal geconfigureerde map is waartoe je toegang hebt.
a 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 dat je een databasegebruiker hebt met alleen-lezen toegang tot de benodigde SAP ECC-tabellen, waaronder VBRK, BKPF, BSAD, NAST, CDHDR, CDPOS, SCASE en de andere tabellen die in de query staan. Dit toegangsniveau is meestal alleen beschikbaar voor systeembeheerders of specifieke data-analyseteams.
- Verbinding maken 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.
- De SQL-query voorbereiden: Kopieer de volledige SQL-query uit de sectie 'query' naar de editor van je SQL-client.
- Placeholders aanpassen: De query bevat verschillende placeholders die je moet vervangen door waarden uit jouw omgeving. Het gaat om:
'YYYYMMDD': Vervang alle exemplaren door de begin- en einddatum van de gewenste analyseperiode. Filter de data op een beheersbare periode.'XXXX': Vervang dit door de Company Code(s) die je wilt analyseren.[Your Invoice Output Type]: Geef de outputtypecode op die wordt gebruikt om facturen naar klanten te versturen, bijvoorbeeld 'RD00'.[Your Bad Debt G/L Account]: Vul het grootboekrekeningnummer in dat wordt gebruikt om oninbare facturen af te boeken.[Your Dispute Case Invoice Attribute]: Geef de attribuutnaam op waarin het factuurnummer in je Dispute Management-configuratie wordt opgeslagen, bijvoorbeeld 'INVOICE_ID'.
- Timestamp-functies controleren: De query gebruikt de generieke syntaxis
CAST(CONCAT(date_field, time_field) AS TIMESTAMP). Mogelijk moet je deze aanpassen aan jouw databasesysteem, bijvoorbeeld metTO_TIMESTAMPvoor Oracle ofDATETIMEFROMPARTSvoor SQL Server. - De query uitvoeren: Voer de aangepaste query uit. Afhankelijk van de omvang van je SAP-tabellen en het geselecteerde datumbereik kan dit behoorlijk wat tijd kosten.
- De resultaten controleren: Controleer na afloop of de uitvoer de verwachte kolommen bevat: InvoiceNumber, ActivityName, EventTime en de aanbevolen attributen. Let ook op fouten of lege resultaten.
- Exporteren 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.
- Voorbereiden op upload: Controleer voordat je het bestand naar een process mining-tool uploadt of de CSV-kopteksten exact overeenkomen met de vereiste attribuutnamen, bijvoorbeeld
InvoiceNumber,ActivityName,EventTime,UserName.
Configuratie
- Databaseverbinding: Je hebt een directe, alleen-lezen SQL-verbinding met de onderliggende SAP ECC-database nodig. Deze methode omzeilt de SAP-applicatielaag volledig.
- Autorisatie: De databasegebruiker moet
SELECT-rechten hebben op alle tabellen die in de query worden gebruikt. Deze omvatten FI, SD en mogelijk FSCM. - Datumbereik: Filter de query op een specifiek datumbereik om de prestaties en hoeveelheid data beheersbaar te houden. We raden aan te beginnen met een periode van 3 tot 6 maanden. De placeholders voor het datumfilter
'YYYYMMDD'moeten op meerdere plaatsen in de query worden ingevuld. - Filter op Company Code: De query is bedoeld om te worden gefilterd op Company Code (
BUKRS). Het is gebruikelijk om telkens één of enkele company codes te analyseren. - Configuratie van documenttypen: De logica voor het herkennen van gebeurtenissen zoals factuurcorrecties, afboekingen of verzonden documenten is afhankelijk van standaard SAP-configuraties. Mogelijk moet je de query aanpassen als je organisatie aangepaste documenttypen (
BLART), outputtypen (KSCHL) of grootboekrekeningen voor deze processen gebruikt. - Aandacht voor prestaties: Het uitvoeren van deze query op een live 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 speciale reporting-replica van de database.
a 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 dat je een gelicentieerde ETL-tool met een gecertificeerde SAP-connector hebt, bijvoorbeeld Informatica PowerCenter with SAP Connector of Talend with SAP Connector. Controleer of je SAP-inloggegevens hebt met de benodigde autorisaties om de vereiste financiële, verkoop- en systeemtabellen te lezen (BKPF, BSEG, VBRK, NAST, MHNK, UDM_CASE_ATTR00, CDHDR, CDPOS).
- SAP-verbinding instellen: Maak in je ETL-tool een nieuwe verbinding met je SAP ECC-systeem. Configureer de verbindingsgegevens, waaronder application server, systeemnummer, client, gebruiker en wachtwoord. Test de verbinding om te controleren of deze werkt.
- Databronnen definiëren: Definieer voor elke te extraheren activiteit de bijbehorende SAP-tabel(len) als databron in je ETL-job. Voeg bijvoorbeeld VBRK toe voor het genereren van facturen, BKPF voor boekingsgebeurtenissen en NAST voor communicatie met klanten.
- Extractielogica per activiteit opbouwen: Maak voor elk van de 13 vereiste activiteiten een afzonderlijke dataflow of transformatie. Pas in elke flow filters toe om de relevante records te selecteren. Filter bijvoorbeeld op Company Code (BUKRS), documenttype (BLART) en een specifiek datumbereik, zoals aanmaakdatum ERDAT.
- Velden mappen en data transformeren: Koppel in elke dataflow de velden uit de SAP-brontabel aan de doelstructuur van de event log: InvoiceNumber, ActivityName, EventTime, UserName en andere aanbevolen attributen. Gebruik transformatieregels om voor elke flow de juiste 'ActivityName' vast in te vullen en datums en timestamps correct op te maken.
- Complexe activiteiten verwerken: Gebruik voor berekende gebeurtenissen zoals 'Invoice Due Date Reached' de Baseline Payment Date (ZFBDT) en de logica voor betalingsvoorwaarden om de vervaldatum te berekenen, of haal de Net Due Date (NETDT) uit BSEG. Voor gebeurtenissen uit wijzigingslogs, zoals 'Invoice Approved', moet je mogelijk tabellen zoals BKPF en CDHDR/CDPOS koppelen op basis van documentnummer en datum.
- Activiteitsdata combineren: Gebruik een 'Union' of 'Merge'-transformatie in je ETL-tool om de uitvoer van alle 13 afzonderlijke dataflows te combineren in één dataset. Controleer vóór de union of kolomnamen en datatypen in alle flows overeenkomen.
- Doelbestemming configureren: Definieer de uiteindelijke bestemming van je event log. Dit kan een flat file (CSV), een databasetabel of een directe verbinding met een staginggebied zijn.
- Extractieschema instellen: Configureer de parameters voor het datumbereik van de extractie. Bij de eerste load kun je 6 tot 12 maanden aan data extraheren. Stel voor volgende delta-loads in dat de job data ophaalt vanaf de datum van de laatste run.
- Uitvoeren en exporteren: Voer de ETL-job uit. Controleer na afloop of het uitvoerbestand aan het vereiste formaat voldoet. De uiteindelijke uitvoer moet één CSV-bestand zijn, waarbij elke rij één unieke gebeurtenis bevat en klaar is voor upload naar ProcessMind.
Configuratie
- SAP-verbinding: Je hebt een verbinding met de application server van het SAP ECC-doelsysteem nodig. De SAP-gebruiker heeft RFC-toegang en autorisaties nodig voor tabellen zoals VBRK, BKPF, BSEG, NAST en de andere tabellen uit de query.
- Licentie voor ETL-tool: Een geldige licentie voor de commerciële ETL-tool en de specifieke SAP-connector is verplicht.
- Datumbereik: We raden aan data over een periode van 3 tot 6 maanden te extraheren. Zo krijg je een representatieve steekproef zonder het systeem te zwaar te belasten. Gebruik een configureerbare parameter voor de begin- en einddatum.
- Belangrijke filters: Filter altijd op Company Code (BUKRS) om de scope van de extractie te beperken. Filter ook op de relevante Billing Document Types (VBRK-FKART) en Accounting Document Types (BKPF-BLART), zodat alleen standaardfacturen worden meegenomen en andere documenttypen, zoals creditnota's of interne documenten, worden uitgesloten.
- Prestaties: Extractie uit grote tabellen zoals BSEG kan traag zijn. Gebruik selectieve filters, haal geen onnodige velden op en plan de extractie buiten piekuren om de impact op het SAP-bronsysteem te beperken.
a 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 aan de slag te gaan?
Gebruik deze template om je datavoorbereiding efficiënter te maken en waardevolle inzichten in je facturatie- en factuurproces te krijgen. Zet vandaag de stap naar een snellere cashflow.
Versnel je cashflow: optimaliseer facturatie en facturen vandaag nog!
Verwijder inefficiënties, verkort de doorlooptijd met 30% en verbeter je cashflow.
Geen creditcard nodig. Start binnen enkele minuten met optimaliseren.