Uw Data Template voor Retour- & Terugbetalingsverwerking
Uw Data Template voor Retour- & Terugbetalingsverwerking
- Aanbevolen attributen om vast te leggen
- Belangrijkste activiteiten om te volgen
- Richtlijnen voor data-extractie
Retouren- en Terugbetalingsproces Attributen
| Naam | Omschrijving | ||
|---|---|---|---|
| Activiteitsnaam ActivityName | De naam van een specifieke business event of stap die binnen het retourenproces heeft plaatsgevonden. | ||
| Omschrijving Deze attribute beschrijft een enkele, afzonderlijke actie of statuswijziging in de retourlevenscyclus, zoals 'Return Order Created', 'Goods Receipt Posted', of 'Credit Memo Created'. Deze activiteiten vormen de bouwstenen van de proceskaart. Het analyseren van de sequentie en frequentie van deze activiteiten helpt bij het identificeren van de meest voorkomende procespaden, afwijkingen en rework loops. Het is cruciaal voor het begrijpen van wat er binnen een case gebeurt en in welke volgorde, en vormt de basis voor alle process mining analyse. Het belang Activiteiten definiëren de stappen in het proces. Het analyseren van hun volgorde, duur en frequentie vormt de kern van Process Mining en onthult hoe werk daadwerkelijk wordt uitgevoerd. Vindplaats Afgeleid van statuswijzigingen in tabellen zoals VBUK/VBUP, documentaanmaak-events (bijv. in VBAK, LIKP, VBRK), of wijzigingslogs in CDHDR/CDPOS-tabellen. Voorbeelden Retouropdracht aangemaaktGoederenontvangst geboektCreditnota aangemaaktItem van retouropdracht voltooid | |||
| Retourcase ID ReturnCaseId | De unieke identificatie voor een retouraanvraag van een klant, die alle gerelateerde activiteiten en documenten koppelt. | ||
| Omschrijving De Return Case ID dient als de primaire sleutel voor het volgen van de gehele levenscyclus van een retourproces, van initiatie tot afsluiting. Elke ID komt overeen met een specifieke klantretour, inclusief alle bijbehorende events zoals ordercreatie, levering, inspectie en creditnota-verwerking. In procesanalyse is deze attribute fundamenteel voor het construeren van de proceskaart. Het stelt het systeem in staat om individuele events te groeperen in end-to-end case journeys, waardoor de analyse van procesvarianten, cyclustijden en knelpunten voor elke afzonderlijke retourcase mogelijk is. Het belang Dit is de essentiële case-identificatie die alle stappen van een retourreis met elkaar verbindt, waardoor het mogelijk wordt de end-to-end procesflow en prestaties te analyseren. Vindplaats Dit is doorgaans het Return Order nummer uit de Sales and Distribution (SD) module. Te vinden in tabel VBAK (Sales Document Header Data), veld VBELN, waarbij de documentcategorie (VBAK-VBTYP) 'H' is voor retouren. Voorbeelden 600001236000045660000789 | |||
| Tijdstip Gebeurtenis EventTime | De exacte datum en tijd waarop de activiteit plaatsvond. | ||
| Omschrijving Deze timestamp markeert het precieze moment waarop een business event plaatsvond. Het wordt vastgelegd voor elke activiteit in het proces en biedt de chronologische sequentie van events binnen een case. Event Time is kritiek voor alle tijdgebaseerde analyse, inclusief het berekenen van cyclustijden tussen activiteiten, het identificeren van knelpunten waar tijd wordt besteed aan wachten, en het meten van de totale case duur. Het maakt prestatieanalyse en compliance-checks tegen service level agreements (SLA's) mogelijk. Het belang Deze timestamp is essentieel voor het berekenen van alle duren, het analyseren van procesprestaties, het identificeren van knelpunten en het begrijpen van de tijdlijn van elke retourcase. Vindplaats Afkomstig van diverse datum- en tijdvelden in SAP-tabellen. Voor aanmaakevents zijn dit vaak de velden ERDAT en ERZET (bijv. in VBAK). Voor wijzigingsevents zijn dit UDATE en UTIME in de CDHDR-tabel. Voorbeelden 2023-04-15T10:22:05Z2023-04-16T14:01:30Z2023-04-18T09:15:00Z | |||
| Bronsysteem SourceSystem | Het systeem waaruit de data is geëxtraheerd. | ||
| Omschrijving Deze attribute identificeert de herkomst van de data, wat essentieel is in omgevingen met meerdere systemen. Het biedt context en helpt data-lineage en -integriteit te waarborgen. Voor analyse wordt het gebruikt om data te segmenteren of te filteren bij het combineren van processen uit verschillende bronsystemen. Het bevestigt dat de events afkomstig zijn van de verwachte applicatie, in dit geval SAP ECC. Het belang Identificeert de oorsprong van de data, wat cruciaal is voor data governance en voor analyses die meerdere bedrijfssystemen omvatten. Vindplaats Dit is een statische waarde die is gedefinieerd tijdens data-extractie om de specifieke SAP ECC instance (bijv. 'ECC_PROD_100') te identificeren. Voorbeelden SAP_ECC_PRODSAPECC_FINANCE_200 | |||
| Laatste data-update LastDataUpdate | De timestamp die aangeeft wanneer de data voor dit proces voor het laatst is ververst. | ||
| Omschrijving Deze attribute legt de datum en tijd vast van de meest recente data-extractie of update. Het biedt transparantie over de actualiteit van de geanalyseerde data. In analyse is dit belangrijk voor het begrijpen van de tijdigheid van de inzichten. Gebruikers kunnen zien hoe actueel de data is, wat de relevantie van eventuele bevindingen beïnvloedt, vooral voor het monitoren van lopende operaties. Het belang Geeft de actualiteit van de data aan, en waarborgt dat gebruikers begrijpen hoe actueel de procesanalyse is en wanneer de volgende update kan worden verwacht. Vindplaats Dit is een metadata attribute die wordt gevuld met de execution timestamp van de data-extractie job. Voorbeelden 2023-05-20T02:00:00Z2023-05-21T02:00:00Z | |||
| Aangevraagd terugbetalingsbedrag RequestedRefundAmount | De verwachte waarde van de terugbetaling, doorgaans gebaseerd op de nettowaarde van het(de) geretourneerde artikel(en). | ||
| Omschrijving Deze attribute vertegenwoordigt de initiële monetaire waarde van de retour, zoals vastgelegd in de retouropdracht. Het dient als de basis voor financiële analyse en reconciliatie. Dit bedrag wordt vergeleken met de 'Actual Refund Amount' om discrepanties bij te houden, een belangrijke metric voor het 'Refund Amount Discrepancy Tracking' dashboard. Het analyseren van deze waarde helpt bij het monitoren van de financiële impact van retouren en het identificeren van potentiële issues in de prijsbepaling of creditberekening. Het belang Stelt de initiële financiële waarde van de retour vast, wat cruciaal is voor het bijhouden van financiële discrepanties en het begrijpen van de totale waarde van geretourneerde goederen. Vindplaats Deze waarde is doorgaans de nettowaarde van het itemniveau van de retouropdracht. Te vinden in tabel VBAP, veld NETWR. Voorbeelden 150.0049.991250.75 | |||
| Materiaalnummer MaterialNumber | De unieke identificatie voor het product dat wordt geretourneerd. | ||
| Omschrijving Het Material Number, of SKU, specificeert het exacte artikel dat bij de retour is betrokken. Dit maakt gedetailleerde analyse op productniveau mogelijk. Door retouren per Material Number te analyseren, kunnen bedrijven producten identificeren met hoge retourpercentages, wat kan duiden op kwaliteitsproblemen, onnauwkeurige beschrijvingen of fabricagefouten. Het is essentieel voor dashboards zoals 'Inventory Impact of Returns' en voor het begrijpen hoe verschillende producten door het retourenproces bewegen. Het belang Identificeert welke producten worden geretourneerd, en benadrukt potentiële problemen met kwaliteitscontrole of onnauwkeurige productbeschrijvingen. Vindplaats Gevonden in de Sales Document Item-tabel VBAP, veld MATNR. Voorbeelden RM-1025FG-2050-BACC-5591 | |||
| Retourkanaal ReturnChannel | Het kanaal waarlangs de retour is geïnitieerd, zoals online, in de winkel of via een callcenter. | ||
| Omschrijving Deze attribute specificeert de oorsprong of innamemethode voor de retouraanvraag. Het helpt onderscheid te maken tussen retouren geïnitieerd via een webportal, een fysieke winkel of via een klantenservicemedewerker. Het segmenteren van het proces per Retourkanaal is cruciaal voor het begrijpen van operationele verschillen en resource-allocatie. Zo kunnen retouren in de winkel snellere inspectietijden hebben, maar andere documentatiestappen vergeleken met online retouren. Dit is een belangrijke dimensie voor het 'Returns Process Throughput Trends' dashboard. Het belang Onderscheidt hoe retouren worden geïnitieerd, wat vaak de processtroom, resourcebehoeften en doorlooptijden voor verschillende kanalen beïnvloedt. Vindplaats Dit is vaak geen standaard SAP ECC-veld en moet mogelijk worden afgeleid uit een aangepast veld (bijv. in VBAK) of worden afgeleid uit andere data, zoals de Sales Organization (VKORG) of Distribution Channel (VTWEG). Raadpleeg de SAP ECC-documentatie voor specifieke implementatie. Voorbeelden Online portaalIn de winkelCallcenter | |||
| Retourreden ReturnReason | De reden code die de klant heeft opgegeven voor het retourneren van het artikel. | ||
| Omschrijving Deze attribute geeft aan waarom een product werd geretourneerd, met behulp van vooraf gedefinieerde reden codes in SAP. Voorbeelden zijn 'Beschadigd tijdens transport', 'Verkeerd artikel verzonden', of 'Past niet'. Dit is een kritieke dimensie voor root cause analyse. Door de proceskaart of KPI's te filteren op Return Reason, kunnen analisten identificeren of bepaalde redenen geassocieerd zijn met langere verwerkingstijden, hogere inspectiefoutpercentages of specifieke procesafwijkingen. Dit inzicht kan verbeteringen stimuleren in productkwaliteit, logistiek of verkoopprocessen. Het belang Verklaart waarom retouren plaatsvinden, waardoor root cause-analyse mogelijk wordt om retourpercentages te verminderen door problemen met productkwaliteit, verzending of beschrijving aan te pakken. Vindplaats Gevonden in de Sales Document Item-tabel VBAP, veld ABGRU (Reden voor afwijzing van verkoopdocumenten). Voorbeelden 001 - Beschadigd product002 - Verkeerd product005 - Te laat aangekomen | |||
| Verwerkingsagent ProcessingAgent | De user ID van de medewerker die de activiteit heeft uitgevoerd. | ||
| Omschrijving Deze attribute legt de gebruikersnaam vast van de persoon die verantwoordelijk is voor het uitvoeren van een specifieke processtap, zoals het aanmaken van de retouropdracht of het boeken van de goederenontvangst. Het wordt vaak aangeduid als de 'Changed By' of 'Created By' gebruiker. Analyse per Processing Agent is essentieel voor prestatiemanagement en resourceanalyse. Het helpt bij het identificeren van toppresteerders, agents die mogelijk aanvullende training nodig hebben, en de werkverdeling binnen een team. Het wordt gebruikt in dashboards zoals 'Agent Return Processing Performance' om cyclustijden en doorvoer te vergelijken. Het belang Volgt gebruikersbetrokkenheid, waardoor analyse van teamprestaties, werkverdeling en identificatie van trainingsbehoeften of best practices mogelijk is. Vindplaats Doorgaans te vinden in velden zoals ERNAM (Created by) of AENAM (Changed by) in headertabellen zoals VBAK, LIKP, VBRK. Voor change events is het USERNAME in CDHDR. Voorbeelden CBURNSDSCRANTONJHALPERT | |||
| Werkelijk terugbetalingsbedrag ActualRefundAmount | Het uiteindelijke bedrag dat aan de klant is gecrediteerd, zoals geboekt in de financiële documenten. | ||
| Omschrijving Deze attribute is de definitieve, bevestigde terugbetalingswaarde die werd verwerkt en geboekt in het boekhoudsysteem. Dit bedrag kan afwijken van het aangevraagde bedrag als gevolg van restocking fees, aanpassingen gebaseerd op de artikelconditie, of andere beleidstoepassingen. Dit is een kritieke attribute voor het 'Refund Amount Discrepancy Tracking' dashboard. Het vergelijken hiervan met het aangevraagde bedrag helpt bij het identificeren van systemische problemen in het terugbetalingsberekenings- en goedkeuringsproces, wat de financiële nauwkeurigheid waarborgt. Het belang Vertegenwoordigt het uiteindelijke financiële resultaat van de retour. Het vergelijken hiervan met het aangevraagde bedrag helpt de nauwkeurigheid te waarborgen en financiële lekken te identificeren. Vindplaats Afkomstig van het financiële document dat is gekoppeld aan de creditnota. Doorgaans te vinden in de BSEG-tabel (Accounting Document Segment), veld WRBTR (Amount in document currency), voor de relevante G/L-boekhouding. Voorbeelden 150.0045.001200.75 | |||
| Bedrijfscode CompanyCode | De juridische entiteit of het bedrijf dat verantwoordelijk is voor de transactie. | ||
| Omschrijving De Company Code vertegenwoordigt een op zichzelf staande boekhoudkundige eenheid binnen SAP. Alle financiële transacties, inclusief retouren en terugbetalingen, worden geboekt op een specifieke company code. Deze attribute is essentieel voor financiële rapportage en voor het segmenteren van het proces in multinationale of multi-entiteitsorganisaties. Analyse per Company Code maakt vergelijking van de prestaties van het retourenproces tussen verschillende juridische entiteiten binnen de onderneming mogelijk. Het belang Maakt filtering en vergelijking van retourprocessen mogelijk over verschillende juridische entiteiten binnen een organisatie heen, wat cruciaal is voor financiële analyse. Vindplaats Gevonden in de Sales Document Header-tabel VBAK, veld BUKRS_VF (Bedrijfscode voor facturering). Voorbeelden 10002000US01 | |||
| Creditnotanummer CreditMemoNumber | De unieke identificatie voor het creditnota-document dat voor de terugbetaling is uitgegeven. | ||
| Omschrijving De Credit Memo is het officiële factureringsdocument in SAP dat de aan de klant te betalen terugbetaling formaliseert. Dit nummer identificeert dat financiële document uniek. Deze attribute is essentieel voor financiële reconciliatie en voor het volgen van het proces van de operationele retour tot de financiële afwikkeling. Het dient als een belangrijke mijlpaal in het proces en wordt gebruikt om gerelateerde boekhoudkundige documenten te vinden voor attributes zoals 'Actual Refund Amount'. Het belang Biedt een directe link naar het financiële document dat de terugbetaling aan de klant autoriseert, wat essentieel is voor financiële auditing en reconciliatie. Vindplaats De creditnota is een factureringsdocument. Het nummer ervan is te vinden in de VBRK-tabel (Billing Document: Header Data), veld VBELN. De link wordt gevonden via de documentflow van de retouropdracht. Voorbeelden 900011229000334490005566 | |||
| End-to-End Cyclustijd EndToEndCycleTime | De totale verstreken tijd van de eerste tot de laatste activiteit voor een retourcase. | ||
| Omschrijving Dit is een case-level metric berekend als de duur tussen de allereerste event (bijv. 'Return Order Created') en de uiteindelijke event (bijv. 'Return Order Completed' of 'Credit Memo Cleared'). Het vertegenwoordigt de totale tijd die een retour in het proces doorbrengt. Dit is een primaire key performance indicator voor de algehele procesefficiëntie. Het wordt gebruikt in trendanalyse en benchmarking om verbeteringen over tijd te volgen. Het analyseren van de distributie van deze metric helpt bij het identificeren van de factoren, zoals producttype of retourreden, die correleren met langere of kortere afhandelingstijden. Het belang Meet de totale duur van het retourproces, en biedt een belangrijke indicator voor de algehele procesefficiëntie en klantervaring. Vindplaats Dit is een berekende metric. Het is de timestamp van de laatste activiteit in een case min de timestamp van de eerste activiteit. Voorbeelden 5 dagen 4 uur12 dagen 8 uur3 dagen 2 uur | |||
| Klant-ID CustomerId | De unieke identificatie voor de klant die de retour initieert. | ||
| Omschrijving Deze attribute identificeert de specifieke klant (de 'Sold-to Party' in SAP-termen) die het product retourneert. Het koppelt de retourtransactie aan de klant stamdata. Analyse per Customer ID helpt bij het identificeren van klanten met frequente retouren, wat kan duiden op ontevredenheid of mogelijk misbruik van het retourbeleid. Het kan ook worden gebruikt met klantsegmentatie data om te begrijpen of bepaalde klantgroepen verschillend retourgedrag of proceservaringen hebben. Het belang Koppelt retouren aan specifieke klanten, waardoor analyse van klantgedrag, identificatie van herhaalde retouren en impact op klantrelaties mogelijk wordt. Vindplaats Gevonden in de Sales Document Header-tabel VBAK, veld KUNNR (Verkoop aan partij). Voorbeelden CUST-100432CUST-203991CUST-831102 | |||
| Naleving retourbeleid ReturnPolicyAdherence | Een vlag die aangeeft of de retour voldoet aan alle gedefinieerde bedrijfsregels en -beleid. | ||
| Omschrijving Deze berekende boolean attribute geeft aan of een retourcase het standaard, voorgeschreven bedrijfsbeleid heeft gevolgd. De logica kan het controleren van meerdere voorwaarden omvatten, zoals of de retour is geïnitieerd binnen de toegestane termijn, of de reden code geldig is voor het product, of dat managergoedkeuring is verkregen voor een uitzondering. Deze attribute drijft het 'Return Approval Policy Compliance' dashboard aan. Het maakt directe meting van de compliance rate mogelijk en helpt bij het identificeren welke beleidsregels het meest frequent worden omzeild, wat gerichte procesverbetering of training mogelijk maakt. Het belang Meet compliance tegen bedrijfsregels, helpt om beleid consistent af te dwingen en gevallen te identificeren die speciale beoordeling of goedkeuring vereisen. Vindplaats Dit is een afgeleide attribute gebaseerd op een set bedrijfsregels. Bijvoorbeeld: (Return Initiation Date - Original Purchase Date) <= 30 dagen AND ReturnReason IS NOT NULL. Voorbeelden truefalse | |||
| Origineel verkoopdocument OriginalSalesDocument | Het nummer van de oorspronkelijke verkooporder waartegen de retour wordt gedaan. | ||
| Omschrijving Deze attribute biedt een directe link terug naar de initiële aankoop van de klant. Het is een referentiedocument dat de retour koppelt aan de oorspronkelijke transactiedetails. Het hebben van deze link is uiterst waardevol voor diepgaandere analyse. Het stelt analisten in staat te onderzoeken waarom verkopen van bepaalde orders worden geretourneerd, om de oorspronkelijke prijzen en voorwaarden te controleren, en om de complete klant order-tot-retour levenscyclus te begrijpen. Het kan helpen vragen te beantwoorden over de vraag of producten die via specifieke campagnes of kanalen zijn verkocht hogere retourpercentages hebben. Het belang Koppelt de retour aan de oorspronkelijke verkoop, waardoor een compleet overzicht van de klanttransactie en een diepere root cause-analyse mogelijk wordt. Vindplaats Deze referentie is opgeslagen op itemniveau van de retouropdracht. Het is te vinden in tabel VBAP, veld VGBEL (Document number of the reference document). Voorbeelden 100034561000987110012345 | |||
| Status retouropdracht ReturnOrderStatus | De algehele verwerkingsstatus van de retouropdrachtcase. | ||
| Omschrijving Deze attribute geeft een momentopname van de huidige status van de retourcase, zoals 'Open', 'In Process' of 'Completed'. Het is afgeleid van de combinatie van statussen op header- of itemniveau van het verkoopdocument. In analyse is deze attribute nuttig voor het filteren van cases om zich te concentreren op actieve of voltooide retouren. Het kan helpen bij het monitoren van de algehele werkbelasting en voortgang van open cases en biedt een high-level resultaat voor elke retourreis. Het belang Biedt een overzicht op hoog niveau van waar een case zich bevindt in zijn levenscyclus, waardoor filtering en analyse van open, lopende of gesloten retouren mogelijk is. Vindplaats Afgeleid van de statusvelden in tabellen VBUK (Header Status) en VBUP (Item Status). Bijvoorbeeld, VBUK-GBSTK is de algemene verwerkingsstatus van het document. Voorbeelden OpenIn VerwerkingVoltooid | |||
| Terugbetaling SLA Doeldatum RefundSLATargetDate | De datum waarop de terugbetaling naar verwachting zal worden verwerkt volgens de service level agreements. | ||
| Omschrijving Deze attribute definieert de deadline voor het voltooien van het terugbetalingsproces voor een gegeven retourcase. Het wordt doorgaans berekend op basis van bedrijfsregels, zoals '5 werkdagen na goederenontvangst'. Deze doeldatum is de benchmark waartegen de feitelijke prestaties worden gemeten. Het is de kerncomponent voor het 'Refund Processing SLA Compliance' dashboard, waardoor het bedrijf de naleving van klantafspraken kan monitoren en cases kan identificeren die het risico lopen hun SLA te overschrijden. Het belang Stelt de prestatietarget voor het verwerken van terugbetalingen vast, waardoor het bedrijf de SLA-compliance kan meten en rapporteren en achterstallige cases kan prioriteren. Vindplaats Dit is doorgaans geen standaard SAP-veld en zou moeten worden afgeleid op basis van bedrijfsregels. Het kan worden berekend uit een sleuteldatumveld (bijv. goederenontvangstdatum uit MKPF) plus een geconfigureerde duur. Raadpleeg de SAP ECC-documentatie of bedrijfsvereisten. Voorbeelden 2023-04-25T23:59:59Z2023-04-28T23:59:59Z2023-05-02T23:59:59Z | |||
| Verschil in terugbetalingsbedrag RefundAmountDiscrepancy | Het berekende verschil tussen de daadwerkelijke en aangevraagde terugbetalingsbedragen. | ||
| Omschrijving Deze berekende metric kwantificeert het monetaire verschil tussen wat initieel werd aangevraagd in de retouropdracht en wat uiteindelijk werd uitgegeven in de creditnota. Een positieve waarde kan duiden op een gedeeltelijke terugbetaling, terwijl een negatieve waarde ongebruikelijk is, maar een overbetaling zou kunnen aangeven. Deze attribute is de belangrijkste maatstaf voor het 'Refund Amount Discrepancy Tracking' dashboard. Het helpt om snel cases met financiële afwijkingen te identificeren en te analyseren, die te wijten kunnen zijn aan beoordelingen van de artikelconditie, restocking fees of fouten. Het monitoren hiervan helpt financiële controle en naleving van het beleid te waarborgen. Het belang Meet direct financiële afwijkingen in het terugbetalingsproces, helpt bij het identificeren van beleidsnon-compliance, verwerkingsfouten of financieel lek. Vindplaats Berekend veld: ActualRefundAmount - RequestedRefundAmount. Voorbeelden 0.00-4.99-50.00 | |||
| Vestiging Plant | De fysieke locatie of faciliteit waar het geretourneerde artikel wordt ontvangen en verwerkt. | ||
| Omschrijving De Plant in SAP vertegenwoordigt een fysieke locatie, zoals een magazijn of distributiecentrum, waar goederen worden verwerkt. Voor retouren is dit doorgaans de locatie waar het artikel wordt ontvangen en geïnspecteerd. Analyse van het proces per Plant helpt bij het identificeren van prestatieverschillen tussen verschillende faciliteiten. Het kan benadrukken welke magazijnen efficiënter zijn in artikelinspectie of een hogere doorvoer hebben, ter ondersteuning van het 'Item Inspection Throughput & Efficiency' dashboard. Het belang Identificeert de fysieke locatie die de retour verwerkt, waardoor prestatievergelijking tussen verschillende magazijnen of distributiecentra mogelijk wordt. Vindplaats Gevonden op itemniveau in de retourorder, tabel VBAP, veld WERKS. Voorbeelden PL01WH02DC05 | |||
| Voldoet aan SLA IsSLACompliant | Een vlag die aangeeft of de terugbetaling binnen de afgesproken service level agreement (SLA) is verwerkt. | ||
| Omschrijving Dit is een berekende boolean attribute die de werkelijke datum van de activiteit 'Refund Processed' vergelijkt met de 'Refund SLA Target Date'. Het resultaat is 'true' als de terugbetaling op tijd is voltooid en 'false' in andere gevallen. Deze attribute vereenvoudigt analyse en rapportage door een duidelijke, binaire uitkomst te bieden voor de SLA-prestaties van elke case. Het wordt gebruikt om de algehele 'Refund Processing SLA Compliance' rate te berekenen en maakt eenvoudig filteren mogelijk om niet-compliant cases te isoleren en te analyseren. Het belang Biedt een duidelijke, binaire indicator van de SLA-prestaties voor elke case, waardoor compliance-monitoring en -rapportage worden vereenvoudigd. Vindplaats Dit is een berekende attribute. De logica is: 'Refund Processed' EventTime <= RefundSLATargetDate. Voorbeelden truefalse | |||
Retouren- en Terugbetalingsproces Activiteiten
| Activiteit | Omschrijving | ||
|---|---|---|---|
| Creditnota aangemaakt | Een factuurdocument (creditnota) wordt gegenereerd om de financiële creditering aan de klant te autoriseren. Dit is het officiële financiële document dat het terugbetalingsbedrag formaliseert. | ||
| Het belang Dit is een belangrijke financiële mijlpaal in het proces. Het analyseren van de tijd om de creditnota aan te maken helpt bij het identificeren van vertragingen in de financiële documentverwerking na goederenontvangst en inspectie. Vindplaats Dit is een expliciete event vastgelegd in de VBRK-tabel (Billing Document Header). De creation date is VBRK-ERDAT. De creditnota is gekoppeld aan de retouropdracht of creditnota-aanvraag in de documentflow. Vastleggen Gebruik creation timestamp (ERDAT) uit de VBRK-tabel voor het relevante factureringsdocument. Gebeurtenistype explicit | |||
| Creditnota geboekt naar FI | De creditnota wordt vrijgegeven aan de financiële boekhouding, waardoor het een officiële debiteurenboeking wordt. Deze stap triggert het daadwerkelijke terugbetalingsproces aan de klant. | ||
| Het belang Deze activiteit markeert het punt waarop de terugbetaling financieel wordt erkend door het bedrijf. Vertragingen tussen het aanmaken en boeken van de creditnota kunnen de daadwerkelijke terugbetaling aan de klant vertragen. Vindplaats Dit is een afgeleide event, geïdentificeerd wanneer de posting status in de billing document header (VBRK-RFBSK) wordt bijgewerkt naar 'C' (Posting document has been created). De daadwerkelijke accounting document creation date bevindt zich in de BKPF-tabel. Vastleggen Identificeer de timestamp wanneer VBRK-RFBSK is ingesteld op 'C', of gebruik de aanmaakdatum (CPUDT) uit het gekoppelde BKPF boekhoudkundige document. Gebeurtenistype inferred | |||
| Gebruiksbeslissing genomen | Na inspectie neemt een kwaliteitsingenieur of inspecteur een formele beslissing over de conditie van het geretourneerde item. Deze beslissing bepaalt het verdere proces, zoals terug naar voorraad, afschrijven of reparatie. | ||
| Het belang Deze activiteit is cruciaal voor het begrijpen van de inspectie-efficiëntie en de resultaten ervan. De beslissing heeft directe invloed op het terugbetalingsbedrag en het voorraadbeheer. Vindplaats Indien SAP QM wordt gebruikt, is dit een expliciet event vastgelegd in tabel QAVE (Gebruiksbeslissing inspectieverwerking). De beslissingstijd wordt opgeslagen in QAVE-VDATUM. De koppeling naar de levering bevindt zich in tabel QALS. Vastleggen Gebruik de usage decision date (VDATUM) uit de QAVE-tabel, gekoppeld via de inspectielot (QALS-PRUEFLOS). Gebeurtenistype explicit | |||
| Goederenontvangst geboekt | Deze activiteit vindt plaats wanneer het geretourneerde fysieke artikel wordt ontvangen in het magazijn of verwerkingscentrum. Het wordt vastgelegd door het boeken van een goederenbewegingsdocument tegen de retourlevering. | ||
| Het belang Een belangrijke mijlpaal die aangeeft dat het bedrijf het geretourneerde item in bezit heeft genomen. Het is het startpunt voor fysieke inspectie en beïnvloedt de voorraadnauwkeurigheid. Vindplaats Deze event kan worden afgeleid uit de goederenbewegingsstatus van het retourleveringsitem in de VBUP-tabel (bijv. WBSTA = 'C'). De exacte timestamp bevindt zich in de materiaaldocumentheader (MKPF-BUDAT) voor de corresponderende goederenontvangst. Vastleggen Vind de boekingsdatum (BUDAT) uit tabel MKPF voor het materiaaldocument dat is gekoppeld aan de retourlevering. Gebeurtenistype inferred | |||
| Retouropdracht aangemaakt | Deze activiteit markeert de initiatie van het retourenproces wanneer een klant een product wil retourneren. Het wordt vastgelegd wanneer een nieuw verkoopdocument van het type 'Return' (bijv. RE) wordt aangemaakt in SAP ECC. | ||
| Het belang Dit is de primaire start event voor het retourenproces. Het analyseren van de tijd van deze activiteit tot andere helpt bij het meten van de totale cyclustijd en het identificeren van initiële verwerkingsvertragingen. Vindplaats Dit is een expliciete event vastgelegd in de VBAK-tabel (Sales Document Header). De creation timestamp is opgeslagen in VBAK-ERDAT en VBAK-ERZET voor het corresponderende verkoopdocumentnummer (VBAK-VBELN) met ordertype VBAK-AUART = 'RE'. Vastleggen Gebruik creation timestamp (ERDAT, ERZET) uit de VBAK-tabel voor verkoopdocumenttype 'RE'. Gebeurtenistype explicit | |||
| Retouropdracht voltooid | Deze activiteit markeert het einde van het retourenproces vanuit een verkoop- en distributieperspectief. Het vindt plaats wanneer alle regelitems op de retouropdracht volledig zijn verwerkt en afgesloten. | ||
| Het belang Dit is de primaire eind event voor het proces. Het meten van de tijd van 'Return Order Created' tot deze activiteit geeft de end-to-end cyclustijd voor de retourcase. Vindplaats Dit is een afgeleide event uit de statustabellen. Het wordt vastgelegd wanneer de algehele status van de verkoopdocumentheader (VBUK-GBSTK) wordt bijgewerkt naar 'C' (Completely processed). Vastleggen Identificeer de timestamp uit wijzigingsdocumenten (CDHDR/CDPOS) wanneer het headerstatusveld VBUK-GBSTK verandert naar 'C'. Gebeurtenistype inferred | |||
| Blok voor retouropdracht verwijderd | Vertegenwoordigt de goedkeuring van de retouraanvraag, waardoor deze naar de volgende fase kan gaan. Dit wordt doorgaans vastgelegd door een wijziging in de documentstatus of het verwijderen van een leverings- of factureringsblokkering. | ||
| Het belang Deze activiteit is een kritieke goedkeuringsmijlpaal. Het meten van de tijd die nodig is om deze stap te bereiken, helpt bij het identificeren van knelpunten in het retourautorisatie- en goedkeuringsproces. Vindplaats Dit is een afgeleide event, afgeleid van changelogs voor het verkoopdocument. Controleer de tabellen CDHDR en CDPOS op wijzigingen in blokvelden in VBAK of VBAP, of statusvelden in VBUK/VBUP. Vastleggen Identificeer de timestamp uit wijzigingsdocumenttabellen (CDHDR/CDPOS) wanneer een relevante blokkeringsstatus wordt verwijderd. Gebeurtenistype inferred | |||
| Creditnota afgeboekt | De openstaande creditpost in de debiteuren wordt afgeboekt, doorgaans door een uitgaande betaling aan de klant. Deze event markeert de definitieve financiële afsluiting van de terugbetaling. | ||
| Het belang Deze activiteit bevestigt de cash-out event en voltooit de financiële kant van het proces. Het is het ware einde van de terugbetalingsreis vanuit het perspectief van de klant. Vindplaats Dit is een expliciete event uit de FI module. De clearing date voor het boekhoudkundige document is opgeslagen in de BSEG-tabel (BSEG-AUGDT) voor het corresponderende klantregelitem. Vastleggen Gebruik de clearing date (AUGDT) uit de BSEG- of BSAD-tabel voor het boekhoudkundige document dat is gekoppeld aan de creditnota. Gebeurtenistype explicit | |||
| Creditnota-aanvraag aangemaakt | Een creditnota-aanvraag wordt aangemaakt om de behoefte aan een terugbetaling formeel vast te leggen. In veel configuraties dient de retourorder zelf als creditnota-aanvraag. | ||
| Het belang Dit is de formele start van het financiële afwikkelingsdeel van het retourenproces. Het vormt een trigger voor daaropvolgende financiële goedkeuringen en documentcreatie. Vindplaats Dit kan een expliciete event zijn in VBAK voor een verkoopdocument van het type 'Credit Memo Request' (bijv. CR), of het kan dezelfde event zijn als 'Return Order Created' als het ordertype is geconfigureerd voor ordergerelateerde facturering. Vastleggen Gebruik creation timestamp (ERDAT) uit VBAK voor documenttype 'CR', of hergebruik de retouropdracht creation event. Gebeurtenistype explicit | |||
| Item van retouropdracht afgewezen | Een specifiek item op de retourorder wordt afgewezen, hetzij tijdens de initiële beoordeling, hetzij na inspectie. Dit betekent dat er voor dit item geen verdere verwerking, zoals een terugbetaling, zal plaatsvinden. | ||
| Het belang Het analyseren van afwijzingen helpt bij het identificeren van ongeldige retouraanvragen en kan de communicatie over klantbeleid informeren. Het is een belangrijk pad in het proces dat niet leidt tot een terugbetaling. Vindplaats Dit is een afgeleide event. Het wordt doorgaans vastgelegd door een unieke 'Reason for Rejection' code die is ingesteld voor het item in de VBAP-tabel (VBAP-ABGRU). De timestamp moet worden verkregen uit changelogs. Vastleggen Identificeer de timestamp uit wijzigingsdocumenten (CDHDR/CDPOS) wanneer het VBAP-ABGRU-veld wordt gevuld voor een retouritem. Gebeurtenistype inferred | |||
| Item van retouropdracht voltooid | Een individueel regelitem binnen de retourorder wordt als volledig verwerkt gemarkeerd. Dit gebeurt doorgaans nadat alle logistieke en financiële vervolgdocumenten voor dat item zijn voltooid. | ||
| Het belang Tracking op itemniveau helpt bij het identificeren welke producten of retourredenen de langste vertragingen veroorzaken. Het biedt een meer gedetailleerd beeld van de procesvoltooiing. Vindplaats Dit is een afgeleide event uit de statustabellen. Het wordt vastgelegd wanneer de algehele status van het verkoopdocumentitem (VBUP-GBSTK) wordt bijgewerkt naar 'C' (Completely processed). Vastleggen Identificeer de timestamp uit wijzigingsdocumenten (CDHDR/CDPOS) wanneer het itemstatusveld VBUP-GBSTK verandert naar 'C'. Gebeurtenistype inferred | |||
| Retourlevering aangemaakt | Een leveringsdocument wordt gegenereerd om de fysieke ontvangst van de geretourneerde goederen te beheren. Dit event betekent dat het logistieke proces voor de retour is gestart. | ||
| Het belang Volgt de overgang van administratieve verwerking naar fysieke logistiek. Vertragingen hier kunnen van invloed zijn op magazijnplanning en de totale retourcyclustijd. Vindplaats Dit is een expliciete event vastgelegd in de LIKP-tabel (Delivery Header). De creation timestamp bevindt zich in LIKP-ERDAT. De link naar de bron-retouropdracht is te vinden in de LIPS-tabel (LIPS-VGBEL). Vastleggen Gebruik creation timestamp (ERDAT) uit de LIKP-tabel voor de levering die is gekoppeld aan de retouropdracht. Gebeurtenistype explicit | |||
Extractie Guides
Stappen
- ABAP-programma maken: Gebruik transactiecode
SE38om een nieuw uitvoerbaar ABAP-programma aan te maken, bijvoorbeeldZ_PM_RETURN_EXTRACTION. Geef een beschrijvende titel op en sla het op als een lokaal object of binnen een ontwikkelingspakket. - Selectiescherm definiëren: Definieer in het programma een selectiescherm om gebruikers in staat te stellen de data te filteren. Belangrijke filters zijn onder andere het aanmaakdatumtraject voor retourorders (
S_ERDAT), het verkoopdocumenttype voor retouren (S_AUART, bijv. 'RE') en de bedrijfscode (P_BUKRS). - Datastructuren definiëren: Maak een lokaal structuurtype aan dat overeenkomt met het vereiste event log-formaat. Deze structuur moet velden bevatten voor
ReturnCaseId,ActivityName,EventTime,SourceSystem,LastDataUpdate,ProcessingAgent,ReturnReasonen andere vereiste attributes. - Dataselectielogica implementeren: Schrijf de kern-ABAP-logica om data te selecteren voor elk van de 12 vereiste activiteiten. Dit omvat het bevragen van verschillende SAP-tabellen zoals VBAK, VBAP, LIKP, VBRK, BKPF, CDHDR en CDPOS. Gebruik de documentenstroomtabel (VBFA) om gerelateerde documenten zoals leveringen en creditnota's te koppelen aan de originele retourorder.
- 'Retourorder aangemaakt' extraheren: Selecteer records uit de tabellen
VBAKenVBAPop basis van de selectieschermcriteria. Het verkoopdocumentnummer (VBAK-VBELN) zal dienen als deReturnCaseId. - Statuswijzigingen en sleutel-events extraheren: Voor activiteiten zoals 'Blokkering retourorder opgeheven' of 'Retourorderitem afgewezen', bevraag de wijzigingsdocumenttabellen (
CDHDR,CDPOS) of statusvelden in tabellen zoalsVBAP(ABGRU). Voor logistieke en financiële vervolgactiviteiten, selecteer uit tabellen zoalsLIKP,MKPF,VBRKenBKPF, en gebruikVBFAom te garanderen dat ze gekoppeld zijn aan de initiële set retourorders. - Event Log-tabel vullen: Voor elke opgehaalde activiteit, maak een nieuw record aan in een interne tabel gedefinieerd met uw event log-structuur. Wijs de data van de bron-SAP-tabellen toe aan de corresponderende velden, bijvoorbeeld, wijs
VBAK-ERNAMtoe aanProcessingAgentenVBAK-ERDATenVBAK-ERZETaanEventTime. - Activiteitendata combineren: Zorg ervoor dat elke SELECT-statement voor een activiteit zijn resultaten toevoegt aan de enkele, hoofd interne tabel. Dit creëert de uiteindelijke flat file-structuur waarin elke rij één event vertegenwoordigt.
- Timestamps en systeeminfo afhandelen: Gebruik het systeemveld
SY-DATUMenSY-UZEITom deLastDataUpdatetimestamp voor elke rij te vullen. GebruikSY-SYSIDom deSourceSystemte vullen. - Outputfunctionaliteit implementeren: Voeg functionaliteit toe om de resultaten weer te geven in een ALV-grid (SAP List Viewer) voor online analyse met behulp van functieblokken zoals
REUSE_ALV_GRID_DISPLAY. Bied een optie om de uiteindelijke interne tabel als een CSV- of plat tekstbestand te downloaden naar de lokale machine van de gebruiker. - Uitvoeren en exporteren: Voer het programma uit via
SE38. Voer de gewenste selectiecriteria in en voer uit. Zodra de data wordt weergegeven of verwerkt, gebruikt u de exportfunctie van het programma om het event log-bestand op te slaan. Zorg ervoor dat het bestand wordt opgeslagen in een formaat dat compatibel is met ProcessMind, doorgaans CSV met een headerrij.
Configuratie
- Datumtraject: Geef op het selectiescherm een datumtraject op voor de aanmaakdatum van de retourorder. Een bereik van 3 tot 6 maanden wordt aanbevolen voor een initiële analyse om de balans te vinden tussen datavolume en procesinzicht.
- Retourdocumenttype: Filter op het specifieke verkoopdocumenttype dat in uw systeem voor retouren wordt gebruikt, bijvoorbeeld 'RE' voor retouren, 'CR' voor creditnota-aanvraag. Dit is een cruciaal filter om het juiste proces te isoleren. Voer deze waarden in de
S_AUARTselectieoptie in. - Bedrijfscode: Geef de relevante bedrijfscode (
P_BUKRS) op om de data te beperken tot een specifieke juridische entiteit. Dit is essentieel in omgevingen met meerdere bedrijven. - Vereisten: De gebruiker die het programma uitvoert, heeft autorisaties nodig voor
SE38(programma-uitvoering) en toegang tot de onderliggende SD-, MM- en FI-tabellen (bijv. VBAK, LIKP, VBRK, BKPF, CDHDR). Voor ontwikkeling is een ABAP-ontwikkelaarsrol vereist. - Prestaties: Bij zeer grote datasets over meerdere jaren kan het programma lange uitvoertijden hebben. Overweeg het als een achtergrondtaak (
SM36) uit te voeren en de output naar het bestandssysteem van de applicatieserver te schrijven in plaats van het online weer te geven.
a Voorbeeldquery abap
REPORT Z_PM_RETURN_EXTRACTION.
" =======================================================================
" DATA DECLARATIONS
" =======================================================================
TYPES: BEGIN OF ty_event_log,
returncaseid TYPE vbeln_va,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE sysysid,
lastdataupdate TYPE timestamp,
processingagent TYPE ernam,
returnreason TYPE augru,
materialnumber TYPE matnr,
returnchannel TYPE string, " Placeholder, needs custom logic
requestedrefundamount TYPE netwr,
actualrefundamount TYPE netwr,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lv_timestamp TYPE timestamp,
lv_last_update TYPE timestamp.
" =======================================================================
" SELECTION SCREEN
" =======================================================================
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY,
s_auart FOR vbak-auart.
PARAMETERS: p_bukrs TYPE bukrs OBLIGATORY.
" =======================================================================
" MAIN LOGIC
" =======================================================================
START-OF-SELECTION.
" Set static values for the extraction run
GET TIME STAMP FIELD lv_last_update.
" 1. Return Order Created & 6. Credit Memo Request Created
" Note: In many SAP standard processes, the Return Order itself acts as the Credit Memo Request.
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, h~augru, i~matnr, i~netwr
INTO TABLE @DATA(lt_return_orders)
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN @s_erdat
AND h~auart IN @s_auart
AND h~bukrs_vf = @p_bukrs.
LOOP AT lt_return_orders INTO DATA(ls_return_order).
" Activity: Return Order Created
ls_event_log-returncaseid = ls_return_order-vbeln.
ls_event_log-activityname = 'Return Order Created'.
CONVERT DATE ls_return_order-erdat TIME ls_return_order-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_return_order-ernam.
ls_event_log-returnreason = ls_return_order-augru.
ls_event_log-materialnumber = ls_return_order-matnr.
ls_event_log-requestedrefundamount = ls_return_order-netwr.
APPEND ls_event_log TO lt_event_log.
" Activity: Credit Memo Request Created
ls_event_log-activityname = 'Credit Memo Request Created'.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
IF lt_return_orders IS NOT INITIAL.
" 2. Return Order Block Removed (Example for Delivery Block)
SELECT objectid, udate, utime, username
FROM cdhdr
INTO TABLE @DATA(lt_block_changes)
FOR ALL ENTRIES IN @lt_return_orders
WHERE objectclas = 'VERKBELEG'
AND objectid = @lt_return_orders-vbeln
AND tcode = 'VA02'.
IF sy-subrc = 0.
SELECT objectid, fname, value_new
INTO TABLE @DATA(lt_cdpos_block)
FROM cdpos
FOR ALL ENTRIES IN @lt_block_changes
WHERE objectclas = @lt_block_changes-objectclas
AND objectid = @lt_block_changes-objectid
AND changenr = @lt_block_changes-changenr
AND tabname = 'VBAK'
AND fname = 'LIFSK' " Delivery Block field
AND value_new = ''.
LOOP AT lt_cdpos_block INTO DATA(ls_cdpos_block).
READ TABLE lt_block_changes INTO DATA(ls_block_change) WITH KEY objectid = ls_cdpos_block-objectid.
IF sy-subrc = 0.
ls_event_log-returncaseid = ls_cdpos_block-objectid.
ls_event_log-activityname = 'Return Order Block Removed'.
CONVERT DATE ls_block_change-udate TIME ls_block_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_block_change-username.
CLEAR: ls_event_log-returnreason, ls_event_log-materialnumber, ls_event_log-requestedrefundamount, ls_event_log-actualrefundamount.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
ENDIF.
" Get subsequent documents from flow
SELECT vbelv, vbtyp_n, vbeln, rfbsk
INTO TABLE @DATA(lt_doc_flow)
FROM vbfa
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbelv = @lt_return_orders-vbeln
AND vbtyp_n IN ('J', 'R', 'M'). " J=Delivery, R=Goods Mvmt, M=Invoice
" 3. Return Delivery Created
SELECT vbeln, erdat, erzet, ernam FROM likp
INTO TABLE @DATA(lt_deliveries)
FOR ALL ENTRIES IN @lt_doc_flow
WHERE vbeln = @lt_doc_flow-vbeln AND @lt_doc_flow-vbtyp_n = 'J'.
LOOP AT lt_deliveries INTO DATA(ls_delivery).
READ TABLE lt_doc_flow INTO DATA(ls_doc_flow_del) WITH KEY vbeln = ls_delivery-vbeln.
ls_event_log-returncaseid = ls_doc_flow_del-vbelv.
ls_event_log-activityname = 'Return Delivery Created'.
CONVERT DATE ls_delivery-erdat TIME ls_delivery-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_delivery-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 4. Goods Receipt Posted
SELECT mblnr, mjahr, budat, cputm, usnam FROM mkpf
INTO TABLE @DATA(lt_goods_receipt)
FOR ALL ENTRIES IN @lt_doc_flow
WHERE xblnr = @lt_doc_flow-vbeln AND @lt_doc_flow-vbtyp_n = 'R'.
LOOP AT lt_goods_receipt INTO DATA(ls_goods_receipt).
READ TABLE lt_doc_flow INTO DATA(ls_doc_flow_gr) WITH KEY vbeln = ls_goods_receipt-mblnr.
ls_event_log-returncaseid = ls_doc_flow_gr-vbelv.
ls_event_log-activityname = 'Goods Receipt Posted'.
CONVERT DATE ls_goods_receipt-budat TIME ls_goods_receipt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_goods_receipt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 5. Usage Decision Made (Requires QM Module implementation)
SELECT q~prueflos, q~vdatu, q~vzeit, q~vname
FROM qals AS q
INNER JOIN qave AS v ON q~prueflos = v~prueflos
INTO TABLE @DATA(lt_usage_decisions)
FOR ALL ENTRIES IN @lt_deliveries
WHERE q~kdauf = @lt_deliveries-vbeln.
LOOP AT lt_usage_decisions INTO DATA(ls_ud).
SELECT SINGLE vbelv FROM vbfa INTO @DATA(lv_vbelv_ud) WHERE vbeln = @ls_ud-prueflos.
ls_event_log-returncaseid = lv_vbelv_ud.
ls_event_log-activityname = 'Usage Decision Made'.
CONVERT DATE ls_ud-vdatu TIME ls_ud-vzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_ud-vname.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 7. Credit Memo Created
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, i~netwr, i~vgbel
INTO TABLE @DATA(lt_cred_memos)
FROM vbrk AS h
INNER JOIN vbrp AS i ON h~vbeln = i~vbeln
FOR ALL ENTRIES IN @lt_doc_flow
WHERE h~vbeln = @lt_doc_flow-vbeln AND @lt_doc_flow-vbtyp_n = 'M'.
LOOP AT lt_cred_memos INTO DATA(ls_cred_memo).
ls_event_log-returncaseid = ls_cred_memo-vgbel.
ls_event_log-activityname = 'Credit Memo Created'.
CONVERT DATE ls_cred_memo-erdat TIME ls_cred_memo-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_cred_memo-ernam.
ls_event_log-actualrefundamount = ls_cred_memo-netwr.
APPEND ls_event_log TO lt_event_log.
" 8. Credit Memo Posted To FI
SELECT SINGLE budat, cputime, usnam FROM bkpf
INTO @DATA(ls_bkpf_post)
WHERE awkey = @ls_cred_memo-vbeln AND awtyp = 'VBRK'.
IF sy-subrc = 0.
ls_event_log-activityname = 'Credit Memo Posted To FI'.
CONVERT DATE ls_bkpf_post-budat TIME ls_bkpf_post-cputime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-processingagent = ls_bkpf_post-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 12. Credit Memo Cleared
SELECT SINGLE augdt FROM bseg
INTO @DATA(lv_augdt)
WHERE bukrs = @p_bukrs
AND belnr = @ls_cred_memo-vbeln
AND augdt IS NOT NULL.
IF sy-subrc = 0 AND lv_augdt IS NOT INITIAL.
ls_event_log-activityname = 'Credit Memo Cleared'.
CONVERT DATE lv_augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
CLEAR: ls_event_log-processingagent.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 9. Return Order Item Completed
SELECT vbeln, erdat, erzet, ernam, abgru FROM vbap
INTO TABLE @DATA(lt_items_completed)
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbeln = @lt_return_orders-vbeln
AND gbsta = 'C'.
LOOP AT lt_items_completed INTO DATA(ls_item_completed).
ls_event_log-returncaseid = ls_item_completed-vbeln.
ls_event_log-activityname = 'Return Order Item Completed'.
CONVERT DATE ls_item_completed-erdat TIME ls_item_completed-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_item_completed-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 10. Return Order Completed
SELECT vbeln, erdat, erzet, ernam FROM vbak
INTO TABLE @DATA(lt_orders_completed)
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbeln = @lt_return_orders-vbeln
AND gbsta = 'C'.
LOOP AT lt_orders_completed INTO DATA(ls_order_completed).
ls_event_log-returncaseid = ls_order_completed-vbeln.
ls_event_log-activityname = 'Return Order Completed'.
CONVERT DATE ls_order_completed-erdat TIME ls_order_completed-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_order_completed-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 11. Return Order Item Rejected
SELECT vbeln, erdat, erzet, ernam FROM vbap
INTO TABLE @DATA(lt_items_rejected)
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbeln = @lt_return_orders-vbeln
AND abgru IS NOT NULL AND abgru <> ''.
LOOP AT lt_items_rejected INTO DATA(ls_item_rejected).
ls_event_log-returncaseid = ls_item_rejected-vbeln.
ls_event_log-activityname = 'Return Order Item Rejected'.
CONVERT DATE ls_item_rejected-erdat TIME ls_item_rejected-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_item_rejected-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
ENDIF.
" =======================================================================
" OUTPUT
" =======================================================================
cl_salv_table=>factory(
IMPORTING
r_salv_table = DATA(lo_alv)
CHANGING
t_table = lt_event_log ).
lo_alv->display( ). Stappen
- Vereisten: Zorg ervoor dat u een databasegebruiker hebt met leesrechten voor de vereiste SAP ECC-tabellen. Dit omvat tabellen van de Sales and Distribution (SD), Materials Management (MM) en Financial Accounting (FI) modules. U hebt een geschikt SQL-clienttool nodig, zoals DBeaver, SAP HANA Studio of Oracle SQL Developer, om verbinding te maken met de database.
- Systeemspecificaties identificeren: Voordat u de query uitvoert, moet u de specifieke documenttypen identificeren die in uw organisatie voor retouren worden gebruikt. De query gebruikt een placeholder
[YOUR_RETURN_ORDER_TYPES], die u moet vervangen door werkelijke waarden, zoals 'RE' voor standaardretouren. - Query voorbereiden: Kopieer de volledige SQL-query uit de 'query'-sectie naar uw SQL-client.
- Parameters configureren: Zoek de Common Table Expression (CTE) genaamd
BaseReturnOrdersaan het begin van de query. Wijzig deWHERE-clausule om het gewenste datumtraject te specificeren door[START_DATE]en[END_DATE]te vervangen. Werk de lijst met retourordertypen bij en filter, indien nodig, op een specifieke bedrijfscode (BUKRS_VF). - Query uitvoeren: Voer de gewijzigde query uit op de SAP ECC-database. De uitvoeringstijd kan variëren, afhankelijk van het geselecteerde datumtraject en de grootte van de database.
- Ruwe data controleren: Zodra de query is voltooid, voert u een snelle controle uit van de output. Controleer of de kolommen
ReturnCaseId,ActivityNameenEventTimezijn gevuld en dat er data verschijnt voor meerdere activiteiten. - Exporteren naar CSV: Exporteer de gehele resultaatset vanuit uw SQL-client naar een CSV-bestand. Gebruik UTF-8-codering om ervoor te zorgen dat alle tekens correct worden behouden.
- Voorbereiden op upload: Open het CSV-bestand en controleer of de kolomheaders exact overeenkomen met de vereiste attributes:
ReturnCaseId,ActivityName,EventTime,SourceSystem, enz. Pas de headers aan als uw SQL-client deze heeft gewijzigd tijdens het exporteren. - Definitieve upload: Upload het opgeschoonde CSV-bestand naar het ProcessMind-platform voor analyse.
Configuratie
- Retourdocumenttypen: De query moet worden geconfigureerd met de specifieke verkoopdocumenttypen die retourorders in uw SAP-systeem vertegenwoordigen. Dit gebeurt door de placeholder
[YOUR_RETURN_ORDER_TYPES]te vervangen. Veelvoorkomende voorbeelden zijn 'RE' of aangepaste 'Z'-typen. - Datumtraject: Het is cruciaal om een geschikt datumtraject voor de extractie te definiëren. Een databereik van 3 tot 6 maanden wordt doorgaans aanbevolen voor een initiële analyse. Stel dit in met de placeholders
[START_DATE]en[END_DATE]in het formaat 'YYYYMMDD'. - Bedrijfscode: Voor organisaties met meerdere bedrijfscodes is het filteren van de data essentieel voor een gerichte analyse. U kunt een filter toevoegen zoals
VBAK.BUKRS_VF = '[YOUR_COMPANY_CODE]'in de initiële CTE om de reikwijdte te beperken. - Databasesyntaxis: De geleverde query maakt gebruik van gangbare SQL-functies. Datum- en tijdconversies, zoals
TO_TIMESTAMPen string-samenvoeging (CONCAT), kunnen echter kleine syntaxisaanpassingen vereisen, afhankelijk van het onderliggende databasesysteem (bijv. Oracle, HANA, DB2). - Vereiste autorisaties: De databasegebruiker heeft leesrechten nodig voor de volgende sleuteltabellen: VBAK, VBAP, VBFA, LIKP, LIPS, VBRK, VBRP, MKPF, MSEG, BKPF, BSAD, QALS, QAVE, CDHDR en CDPOS.
a Voorbeeldquery sql
WITH BaseReturnOrders AS (
SELECT
VBAK.VBELN AS ReturnOrderNumber,
VBAP.POSNR AS ReturnOrderItemNumber
FROM VBAK
JOIN VBAP ON VBAK.VBELN = VBAP.VBELN
WHERE VBAK.AUART IN ('[YOUR_RETURN_ORDER_TYPES]') -- e.g., 'RE'
AND VBAK.ERDAT BETWEEN '[START_DATE]' AND '[END_DATE]' -- e.g., '20230101' and '20231231'
)
-- 1. Return Order Created
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(VBAK.ERDAT, VBAK.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
VBAK.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
UNION ALL
-- 2. Return Order Block Removed
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Block Removed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON B.ReturnOrderNumber = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBAK'
AND CDPOS.FNAME IN ('LIFSK', 'FAKSK')
AND CDPOS.VALUE_NEW = ''
AND CDPOS.VALUE_OLD <> ''
UNION ALL
-- 3. Return Delivery Created
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Delivery Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(LIKP.ERDAT, LIKP.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
LIKP.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'J'
JOIN LIKP ON VBFA.VBELN = LIKP.VBELN
UNION ALL
-- 4. Goods Receipt Posted
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Goods Receipt Posted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(MKPF.CPUDT, MKPF.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
MKPF.USNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'J'
JOIN LIPS ON VBFA.VBELN = LIPS.VBELN AND VBFA.POSNN = LIPS.POSNR
JOIN MSEG ON LIPS.VBELN = MSEG.LFBNR AND LIPS.POSNR = MSEG.LFPOS
JOIN MKPF ON MSEG.MBLNR = MKPF.MBLNR AND MSEG.MJAHR = MKPF.MJAHR
WHERE MSEG.BWART IN ('651', '653', '655') -- Standard returns movement types
UNION ALL
-- 5. Usage Decision Made
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Usage Decision Made' AS "ActivityName",
TO_TIMESTAMP(CONCAT(QAVE.ADAT, QAVE.ATIM), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
QAVE.AENAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'J'
JOIN QALS ON VBFA.VBELN = QALS.VBELN AND VBFA.POSNN = QALS.POSNR -- Linking inspection lot to delivery item
JOIN QAVE ON QALS.PRUEFLOS = QAVE.PRUEFLOS
UNION ALL
-- 6. Credit Memo Request Created (assumes a separate doc, or can be the return order itself)
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Request Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CMR_VBAK.ERDAT, CMR_VBAK.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CMR_VBAK.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'K' -- 'K' is Credit Memo Request
JOIN VBAK AS CMR_VBAK ON VBFA.VBELN = CMR_VBAK.VBELN
UNION ALL
-- 7. Credit Memo Created
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(VBRK.ERDAT, VBRK.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
VBRK.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
VBRP.NETWR AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'M'
JOIN VBRK ON VBFA.VBELN = VBRK.VBELN
JOIN VBRP ON VBRK.VBELN = VBRP.VBELN AND VBFA.POSNN = VBRP.POSNR
WHERE VBRK.FKART IN ('[YOUR_CREDIT_MEMO_TYPES]') -- e.g., 'G2'
UNION ALL
-- 8. Credit Memo Posted To FI
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Posted To FI' AS "ActivityName",
TO_TIMESTAMP(CONCAT(BKPF.CPUDT, BKPF.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
BKPF.USNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
VBRP.NETWR AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'M'
JOIN VBRK ON VBFA.VBELN = VBRK.VBELN
JOIN VBRP ON VBRK.VBELN = VBRP.VBELN AND VBFA.POSNN = VBRP.POSNR
JOIN BKPF ON VBRK.VBELN = BKPF.AWKEY AND BKPF.AWTYP = 'VBRK'
UNION ALL
-- 9. Return Order Item Completed
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Item Completed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON CONCAT(B.ReturnOrderNumber, LPAD(B.ReturnOrderItemNumber, 6, '0')) = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBUP'
AND CDPOS.FNAME = 'GBSTA'
AND CDPOS.VALUE_NEW = 'C'
UNION ALL
-- 10. Return Order Completed
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Completed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON B.ReturnOrderNumber = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBUK'
AND CDPOS.FNAME = 'GBSTK'
AND CDPOS.VALUE_NEW = 'C'
UNION ALL
-- 11. Return Order Item Rejected
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Item Rejected' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
CDPOS.VALUE_NEW AS "ReturnReason", -- Using rejection reason for this specific event
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON CONCAT(B.ReturnOrderNumber, LPAD(B.ReturnOrderItemNumber, 6, '0')) = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBAP'
AND CDPOS.FNAME = 'ABGRU'
AND CDPOS.VALUE_NEW <> ''
UNION ALL
-- 12. Credit Memo Cleared
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Cleared' AS "ActivityName",
TO_TIMESTAMP(BSAD.AUGDT, 'YYYYMMDD') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CLEAR_DOC.USNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
VBRP.NETWR AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'M'
JOIN VBRK ON VBFA.VBELN = VBRK.VBELN
JOIN VBRP ON VBRK.VBELN = VBRP.VBELN AND VBFA.POSNN = VBRP.POSNR
JOIN BSAD ON VBRK.VBELN = BSAD.VBELN
JOIN BKPF AS CLEAR_DOC ON BSAD.AUGBL = CLEAR_DOC.BELNR AND BSAD.BUKRS = CLEAR_DOC.BUKRS AND BSAD.GJAHR_AUGL = CLEAR_DOC.GJAHR;