Datatemplate voor de verwerking van retouren en terugbetalingen
Datatemplate voor de verwerking van retouren en terugbetalingen
- Aanbevolen datavelden om te verzamelen
- Belangrijke processtappen om bij te houden
- Instructies voor data-extractie
Attributen voor de verwerking van retouren en terugbetalingen
| Naam | Beschrijving | ||
|---|---|---|---|
| Eventtijd EventTime | De timestamp die aangeeft wanneer een activiteit of event plaatsvond. | ||
| Beschrijving De eventtijd, oftewel de timestamp, legt de exacte datum en tijd van een activiteit vast. Elke activiteit in de event log heeft een bijbehorende timestamp, die de chronologische volgorde van de events aangeeft. Dit attribuut is nodig voor alle tijdsanalyses met process mining. Je gebruikt het om doorlooptijden tussen activiteiten te berekenen, wachttijden en bottlenecks op te sporen, de totale duur van een case te meten en te controleren of service level agreements (SLA’s) worden nageleefd. De nauwkeurigheid van de timestamps bepaalt mede hoe betrouwbaar de prestatieanalyse is. Waarom dit belangrijk is Deze timestamp is nodig om alle tijdsmetingen te berekenen, zoals doorlooptijden en wachttijden. Die vormen de basis voor prestatieanalyses. Waar vind je dit? Komt overeen met datumvelden voor aanmaak of wijziging in verschillende tabellen, zoals 'SalesTable.createdDateTime' voor het aanmaken van orders of 'WMSJournalTrans.createdDateTime' voor magazijnjournaals. Voorbeelden 2023-10-26T10:00:00Z2023-10-26T14:30:15Z2023-10-27T09:05:42Z | |||
| Retourcase-ID ReturnCaseId | De unieke identificatiecode van een retour- en terugbetalingscase van een klant. Deze koppelt alle bijbehorende activiteiten. | ||
| Beschrijving De retourcase-ID is de unieke identificatiecode van elke retourcase. De ID koppelt alle activiteiten aan een specifieke retour- of terugbetalingsaanvraag van een klant, vanaf het aanmaken van de retourorder tot de uiteindelijke afsluiting. Bij procesanalyse gebruik je deze ID om het volledige verloop van elke retour te reconstrueren. Je kunt het hele proces volgen, de totale doorlooptijd meten en verschillen tussen cases analyseren. Alle events, data en metingen worden met deze ID samengevoegd en aan elkaar gekoppeld. Waarom dit belangrijk is Deze case-ID koppelt alle processtappen aan elkaar. Zo kun je elke retour van begin tot eind volgen en analyseren. Waar vind je dit? Dit is meestal het nummer van de Return Material Authorization (RMA) of het nummer van een verkooporder van het type 'Returned Order' in de module 'Sales and marketing'. Je vindt het in tabellen zoals 'SalesTable', waar 'SalesType' de waarde 'Returned Order' heeft. Voorbeelden RMA-001234RMA-001235RMA-001236 | |||
| Activiteitsnaam ActivityName | De naam van de specifieke bedrijfsgebeurtenis of taak die plaatsvond tijdens het retour- en terugbetalingsproces. | ||
| Beschrijving Dit attribuut beschrijft een specifieke stap of gebeurtenis in het retour- en terugbetalingsproces, zoals 'Retourorder aangemaakt', 'Product ontvangen' of 'Creditnota geboekt'. Elke activiteit is een afzonderlijk procesmoment dat in het systeem wordt vastgelegd. De volgorde en frequentie van deze activiteiten vormen de basis van process mining. Je kunt er proceskaarten mee maken, bottlenecks tussen stappen opsporen en veelvoorkomende en afwijkende procesvarianten ontdekken. De activiteiten bepalen welk deel van het proces wordt geanalyseerd. Waarom dit belangrijk is Dit attribuut beschrijft de processtappen. Zo kun je het procesverloop in beeld brengen en bottlenecks, herstelwerk en afwijkingen opsporen. Waar vind je dit? Dit is een conceptueel attribuut dat is afgeleid van systeemevents. Je kunt het genereren door statuswijzigingen in tabellen zoals 'SalesTable' en 'WMSJournalTable' of specifieke event logs te koppelen aan begrijpelijke namen. Voorbeelden Retourorder aangemaaktProduct ontvangenAfhandelingscode toegepastCreditnota geboekt | |||
| Afhandelingscode DispositionCode | Een code die aangeeft wat de inspectie van het product heeft opgeleverd en welke actie hierna volgt. | ||
| Beschrijving De afhandelingscode wordt toegekend tijdens de kwaliteitsinspectie van een geretourneerd product. De code bepaalt de volgende processtap, bijvoorbeeld 'Credit', 'Replace', 'Scrap' of 'Return to Customer'. Dit attribuut is een belangrijk beslismoment in het retourproces. Door retouren per afhandelingscode te analyseren, krijgen bedrijven inzicht in de uitkomsten, de financiële gevolgen van het afschrijven van producten en de efficiëntie van verschillende afhandelingsroutes, zoals vervanging of terugbetaling. Waarom dit belangrijk is Deze code bepaalt welke route een retourcase na inspectie volgt. Dat is belangrijk om procesvarianten en de gevolgen daarvan voor de bedrijfsvoering te analyseren. Waar vind je dit? Dit is een belangrijk veld in de module voor kwaliteitsbeheer. Het hoort bij de verwerking van een Quality Order of Inspection Order. Voorbeelden CRDTREPL-DSCRAPRTV | |||
| Product-ID ProductId | De unieke identificatiecode van het product dat wordt geretourneerd. | ||
| Beschrijving De Product-ID, vaak de Stock Keeping Unit (SKU), geeft aan om welk artikel de klant retourneert. Elke retourorderregel is gekoppeld aan een Product-ID. Door retouren per product te analyseren, kun je artikelen met een hoog retourpercentage opsporen. Dat kan wijzen op problemen met de kwaliteitscontrole, onjuiste productbeschrijvingen of productiefouten. Deze analyse helpt om onderzoek naar producten en verbeteringen te prioriteren. Waarom dit belangrijk is Maakt het mogelijk retouren per product te analyseren en artikelen met kwaliteitsproblemen of veel retouren op te sporen. Waar vind je dit? Dit komt overeen met het veld 'ItemId' in de tabel 'SalesLine' van de retourorder. Voorbeelden SKU-A-123SKU-B-456SKU-C-789 | |||
| Redencode retour ReturnReasonCode | De reden die de klant opgeeft voor het retourneren van het artikel. | ||
| Beschrijving De redencode voor de retour legt vast waarom de klant het artikel terugstuurt, bijvoorbeeld 'Defect artikel', 'Verkeerde maat', 'Niet zoals beschreven' of 'Niet meer nodig'. Deze informatie wordt meestal verzameld wanneer de retour wordt aangemeld. Door retourredenen te analyseren, kun je de oorzaken achterhalen. Zo kunnen bedrijven problemen met de productkwaliteit, onjuiste productbeschrijvingen of fouten in de logistiek opsporen. Op basis van deze data kunnen ze het productontwerp, de marketing en de bedrijfsvoering in de supplychain verbeteren en toekomstige retouren beperken. Waarom dit belangrijk is Geeft inzicht in de redenen voor retouren en helpt de oorzaken te achterhalen, het retourpercentage te verlagen en de klanttevredenheid te verbeteren. Waar vind je dit? Deze informatie staat meestal op regelniveau van de retourorder. Zoek naar velden met redencodes in de tabel 'SalesLine' voor retourorders. Voorbeelden DEFECTVERKEERD_ARTIKELNIET_MEER_GEWENSTBESCHADIGD_TIJDENS_VERVOER | |||
| Retourkanaal ReturnChannel | De methode of het kanaal waarmee de klant de retour heeft aangemeld. | ||
| Beschrijving Dit attribuut geeft aan via welk kanaal de klant de retour heeft aangemeld, bijvoorbeeld 'Onlineportaal', 'In de winkel', 'Telefoontje naar de klantenservice' of 'Post'. Door de procesanalyse op te splitsen naar retourkanaal, kun je de prestaties en efficiëntie van elk kanaal beoordelen. Een bedrijf kan doorlooptijden, kosten en klanttevredenheid per kanaal vergelijken om goede werkwijzen en mogelijkheden voor investeringen of verbeteringen te vinden. Dit is belangrijk voor het dashboard 'Prestaties van het retourkanaal'. Waarom dit belangrijk is Hiermee kun je de prestaties van verschillende retourkanalen vergelijken en bepalen welke kanalen het efficiëntst en voordeligst zijn. Waar vind je dit? Deze informatie staat mogelijk in de kop van de retourorder ('SalesTable') of kan worden afgeleid van de gebruiker die de order heeft aangemaakt. Hiervoor is mogelijk aangepaste logica of een apart veld nodig. Voorbeelden WebportaalZelfbedieningskiosk in de winkelKlantenservice | |||
| Verantwoordelijke gebruiker ResponsibleUser | De gebruiker of medewerker die een activiteit heeft uitgevoerd of ervoor verantwoordelijk is. | ||
| Beschrijving Dit attribuut geeft aan welke gebruiker verantwoordelijk is voor een processtap. Dat kan de magazijnmedewerker zijn die het product heeft ontvangen, de kwaliteitsinspecteur of de financieel medewerker die de creditnota heeft geboekt. Door het proces per gebruiker te analyseren, krijg je inzicht in de verdeling van het werk, zie je wie goed presteert en ontdek je waar training nodig kan zijn. Je kunt ook cases onderzoeken die door specifieke medewerkers of teams zijn afgehandeld en controleren of taken goed gescheiden zijn. Waarom dit belangrijk is Hiermee kun je de werkverdeling en prestaties per medewerker of team analyseren en mogelijkheden voor training of een andere inzet van middelen opsporen. Waar vind je dit? Te vinden in de velden 'created by' of 'modified by' van transactierecords, zoals 'SalesTable.createdBy', of in gekoppelde gebruikers-ID’s in journaaltabellen. Voorbeelden Alice.WBob.JChris.P | |||
| Aangevraagd terugbetalingsbedrag RequestedRefundAmount | Het totale bedrag dat de klant als terugbetaling heeft aangevraagd. | ||
| Beschrijving Dit attribuut bevat het oorspronkelijke bedrag dat aan het begin van het retourproces is aangevraagd of verwacht. Het is meestal gebaseerd op de oorspronkelijke aankoopprijs van de geretourneerde artikelen. Deze waarde vormt het uitgangspunt voor de 'Analyse van verschillen in terugbetalingen'. Door het aangevraagde bedrag te vergelijken met het daadwerkelijk terugbetaalde bedrag, kan een bedrijf verschillen opsporen die ontstaan door herbevoorradingskosten, gedeeltelijke terugbetalingen voor beschadigde artikelen of andere correcties. Zo houd je de financiële juistheid en naleving van het beleid in de gaten. Waarom dit belangrijk is Vormt het uitgangspunt om de financiële juistheid te controleren door het te vergelijken met het daadwerkelijk verwerkte terugbetalingsbedrag. Waar vind je dit? Dit is meestal het regelbedrag of totaalbedrag van de oorspronkelijke verkooporderregel van het geretourneerde artikel. Je vindt het in 'SalesLine.LineAmount'. Voorbeelden 99.99150.0024.50 | |||
| Bronsysteem SourceSystem | Het informatiesysteem waaruit de eventdata is gehaald. | ||
| Beschrijving Dit attribuut geeft aan uit welk informatiesysteem de data afkomstig is. In dit geval is dat meestal 'Microsoft Dynamics 365'. In grotere organisaties kan een proces meerdere systemen omvatten. Het bronsysteem van elk event vastleggen is belangrijk voor gegevensbeheer, het oplossen van problemen met data-extractie en inzicht in de systemen die bij het proces betrokken zijn. Zo is duidelijk waar de geanalyseerde data vandaan komt. Waarom dit belangrijk is Dit geeft belangrijke informatie over de herkomst van de data. Die is nodig voor gegevensbeheer, validatie en inzicht in de systemen die bij het proces betrokken zijn. Waar vind je dit? Dit is meestal een vaste waarde die tijdens het proces van data-extractie, transformatie en laden (ETL) wordt toegevoegd om de herkomst van de dataset aan te geven. Voorbeelden Microsoft Dynamics 365 F&OD365-PROD | |||
| Creditnota-ID CreditNoteId | De unieke identificatiecode van de creditnota die voor een terugbetaling is aangemaakt. | ||
| Beschrijving Wanneer een terugbetaling wordt verwerkt, wordt een financieel document aangemaakt: een creditnota of creditmemo. Dit attribuut bevat de unieke ID van dat document. Via deze ID koppel je het operationele retourproces rechtstreeks aan de financiële administratie. Dat is handig voor audits en voor het onderzoeken van financiële verschillen. Een analist kan zo een retourcase volgen tot aan de specifieke financiële transactie waarmee deze is afgehandeld. Waarom dit belangrijk is Koppelt het operationele retourproces aan de bijbehorende financiële transactie. Dat is belangrijk voor audits en financiële aansluitingen. Waar vind je dit? Het nummer van de creditnota staat meestal in het veld 'InvoiceId' van de tabel 'CustInvoiceJour', waar het transactietype 'Credit note' is. Je kunt dit nummer koppelen aan de retourorder. Voorbeelden CN-10056CN-10057CN-10058 | |||
| Daadwerkelijk terugbetaald bedrag ActualRefundAmount | Het uiteindelijke bedrag dat aan de klant is terugbetaald. | ||
| Beschrijving Dit attribuut bevat het definitieve, bevestigde bedrag dat aan de klant is terugbetaald. Het bedrag wordt vastgelegd wanneer de creditnota wordt aangemaakt en geboekt. Dit attribuut is belangrijk voor financiële analyses en wordt rechtstreeks gebruikt in het dashboard 'Analyse van verschillen in terugbetalingen' en de KPI 'Nauwkeurigheid van terugbetalingen'. Door deze data te analyseren, krijg je inzicht in de financiële gevolgen van retouren en de correcties die tijdens het proces zijn aangebracht. Waarom dit belangrijk is Dit geeft de daadwerkelijke financiële gevolgen van de retour weer. Je hebt het nodig om de nauwkeurigheid van terugbetalingen te berekenen en de financiële uitkomsten te begrijpen. Waar vind je dit? Je vindt deze waarde in de details van de geboekte creditnotatransactie. De creditnota is gekoppeld aan de tabellen 'CustTrans' en 'CustInvoiceJour'. Voorbeelden 99.99135.000.00 | |||
| Eindtijd EndTime | De timestamp die aangeeft wanneer een activiteit is afgerond. | ||
| Beschrijving De eindtijd is de timestamp waarop een activiteit is afgerond. De starttijd geeft aan wanneer de activiteit begint, de eindtijd wanneer deze eindigt. Zo kun je de verwerkingstijd van de taak berekenen. Dit attribuut is belangrijk voor een gedetailleerde prestatieanalyse, vooral bij taken met een meetbare duur, zoals 'Productinspectie'. Door de starttijd en eindtijd te vergelijken, kunnen analisten de actieve verwerkingstijd van taken nauwkeurig meten en onderscheiden van de wachttijd tussen taken. Zo spoor je inefficiënties binnen activiteiten op, niet alleen tussen activiteiten. Waarom dit belangrijk is Hiermee bereken je de actieve verwerkingstijd van afzonderlijke activiteiten en maak je onderscheid tussen wachttijd en daadwerkelijke werktijd. Waar vind je dit? Deze waarde moet vaak worden afgeleid. Je kunt bijvoorbeeld de 'modifiedDateTime' gebruiken van een statuswijziging waarmee een activiteit eindigt, of de starttijd van de volgende activiteit. Voorbeelden 2023-10-26T10:15:00Z2023-10-26T14:45:20Z2023-10-27T09:55:12Z | |||
| Klant-ID CustomerId | De unieke identificatiecode van de klant die de retour heeft aangemeld. | ||
| Beschrijving De klant-ID is de unieke identificatiecode van de klantaccount die bij de retour hoort. Hiermee wordt de retourtransactie gekoppeld aan een specifieke klant in het CRM- of klantensysteem. Door retouren per klant te analyseren, kun je klanten opsporen die opvallend vaak artikelen retourneren. Dat kan wijzen op fraude of aanhoudende ontevredenheid. Je kunt klanten ook segmenteren, bijvoorbeeld om klanten met een hoge klantwaarde een betere retourservice aan te bieden. Waarom dit belangrijk is Koppelt het retourproces aan een specifieke klant. Zo kun je retourpatronen per klant analyseren en mogelijke fraude opsporen. Waar vind je dit? Dit is het veld 'CustAccount' in de tabel 'SalesTable' van de retourorder. Voorbeelden CUST-00045CUST-00192CUST-00315 | |||
| Laatste data-update LastDataUpdate | De timestamp die aangeeft wanneer de data voor het laatst is bijgewerkt. | ||
| Beschrijving Dit attribuut legt de datum en tijd vast waarop de data voor het laatst uit het bronsysteem is gehaald en in de process mining-tool is bijgewerkt. Zo zie je hoe actueel de geanalyseerde data is. Het tijdstip van de laatste data-update helpt je de actualiteit van de analyse te beoordelen. Je kunt dashboards en KPI’s goed interpreteren als je weet of je naar realtime data kijkt of naar een momentopname. Dit is belangrijk voor het volgen van de bedrijfsvoering. Waarom dit belangrijk is Dit geeft aan hoe actueel de data is, zodat analisten weten hoe recent de procesinzichten zijn. Waar vind je dit? Dit metadata-attribuut wordt aangemaakt en opgeslagen tijdens het data-inleesproces. Meestal is het de timestamp waarop de ETL-taak is afgerond. Voorbeelden 2023-11-01T02:00:00Z2023-11-02T02:00:00Z | |||
| Magazijn-ID WarehouseId | De identificatiecode van het magazijn of de locatie waar het geretourneerde artikel binnenkomt. | ||
| Beschrijving Dit attribuut geeft aan in welk fysiek magazijn of retourcentrum het geretourneerde artikel wordt verwerkt. Per locatie kunnen de processen, bronnen en prestaties verschillen. Door het proces per magazijn te analyseren, kun je de prestaties van locaties vergelijken. Zo ontdek je welke vestigingen retouren het efficiëntst verwerken, waar regionale bottlenecks zitten en hoe je de inzet van bronnen en standaardisatie van processen in het logistieke netwerk kunt verbeteren. Waarom dit belangrijk is Maakt het mogelijk de prestaties van magazijnen en retourcentra te vergelijken en regionale bottlenecks of goede werkwijzen op te sporen. Waar vind je dit? Deze informatie staat in het veld 'InventLocationId' van transacties die met voorraad te maken hebben, zoals het aankomstjournaal ('WMSJournalTable') of 'SalesLine'. Voorbeelden WH-EASTWH-WESTCENTRAL-DC | |||
| Retourtype ReturnType | Deelt de retour in op basis van de verwachte uitkomst, zoals terugbetaling of vervanging. | ||
| Beschrijving Dit attribuut deelt de retourcase in op basis van de oplossing die de klant vraagt of het bedrijf aanbiedt. Veelvoorkomende typen zijn een geldelijke 'Terugbetaling', een 'Vervanging' van het artikel of een 'Reparatie'. Deze indeling is handig om verschillende procesroutes te analyseren. Een terugbetaling verwerken verloopt heel anders dan een vervangend artikel verzenden. Door te segmenteren op retourtype kun je de doorlooptijden en bottlenecks van elke oplossingsroute nauwkeuriger analyseren. Waarom dit belangrijk is Hiermee kun je de analyse indelen naar de beoogde uitkomst. Processen voor terugbetalingen en vervangingen hebben namelijk verschillende stappen en doorlooptijden. Waar vind je dit? Dit kan een aangepast veld in de kop van de retourorder zijn. Je kunt het ook afleiden uit de afhandelingscode of uit latere transacties, zoals het aanmaken van een vervangende verkooporder. Voorbeelden TerugbetalingVervangingWinkeltegoed | |||
| SLA-status SlaStatus | Geeft aan of de case binnen de termijn van de Service Level Agreement is afgehandeld. | ||
| Beschrijving Dit berekende attribuut geeft eenvoudig aan of de SLA is nageleefd, meestal met 'Op tijd' of 'Te laat'. De status wordt bepaald door de timestamp van de laatste activiteit, bijvoorbeeld 'Retourorder gesloten', te vergelijken met 'RefundSlaTargetDate'. Dit attribuut maakt rapportages over prestaties eenvoudiger in dashboards zoals 'Prestaties van de SLA voor terugbetalingen'. Gebruikers hoeven geen datums meer te vergelijken, maar zien meteen een duidelijke status. Zo kunnen ze snel filteren en gegevens samenvoegen om het totale 'Percentage naleving van de afhandelings-SLA' te berekenen. Waarom dit belangrijk is Geeft in één oogopslag aan of de SLA is nageleefd. Zo kun je eenvoudig filteren op te late cases en de oorzaken van vertragingen analyseren. Waar vind je dit? Dit is een afgeleid attribuut. Je berekent het door de timestamp van de laatste afhandelingsactiviteit te vergelijken met het attribuut 'RefundSlaTargetDate'. Voorbeelden Op tijdTe laat | |||
| Status retourorder ReturnOrderStatus | De algemene status van de retourorder op het moment van de gebeurtenis. | ||
| Beschrijving Dit attribuut geeft de huidige status van de kop van de retourorder aan, bijvoorbeeld 'Open', 'Gefactureerd' of 'Geannuleerd'. Het geeft op hoofdlijnen aan waar de case zich in de levenscyclus bevindt. Activiteiten laten de afzonderlijke processtappen zien, terwijl de algemene status handig is om cases te filteren en te segmenteren. Een analist kan bijvoorbeeld alleen 'Open' cases bekijken om de huidige werkvoorraad te begrijpen, of het procesverloop analyseren van cases die uiteindelijk worden 'Geannuleerd'. Waarom dit belangrijk is Geeft op hoofdlijnen de status van de case weer. Dat is handig om cases te filteren en uitkomsten zoals annuleringen te begrijpen. Waar vind je dit? Deze informatie staat in het veld 'SalesStatus' of 'DocumentStatus' van 'SalesTable'. Voorbeelden Open orderGeleverdGefactureerdGeannuleerd | |||
| Uiterste datum terugbetaling volgens SLA RefundSlaTargetDate | De datum waarop de retourcase en terugbetaling volledig afgehandeld moeten zijn. | ||
| Beschrijving Dit attribuut bevat de deadline uit de Service Level Agreement (SLA) voor het afhandelen van een retourcase. Op die datum moet de klant een definitieve oplossing hebben, zoals een geboekte terugbetaling of een verzonden vervangend artikel. Deze streefdatum is belangrijk om de prestaties te toetsen aan de serviceafspraken. De datum wordt gebruikt voor de KPI 'Naleving van de afhandelings-SLA' en het dashboard 'Prestaties van de SLA voor terugbetalingen'. Door de datum te vergelijken met de werkelijke einddatum van het proces, kan een bedrijf SLA-overschrijdingen opsporen en cases die lang openstaan proactief opvolgen. Waarom dit belangrijk is Dit is de maatstaf voor de procesprestaties. Je kunt ermee bijhouden of de SLA wordt nageleefd en te late cases opsporen. Waar vind je dit? Dit is mogelijk geen standaardveld. De datum wordt vaak berekend door een vooraf bepaalde SLA-periode, bijvoorbeeld 14 dagen, op te tellen bij de aanmaakdatum van de retour. Mogelijk staat de datum in een aangepast veld. Voorbeelden 2023-11-10T23:59:59Z2023-11-15T23:59:59Z | |||
| Voldoet aan beleid IsPolicyAdherent | Een indicator die aangeeft of de goedkeuring van de retour voldoet aan het vastgestelde retourbeleid. | ||
| Beschrijving Dit berekende booleaanse attribuut geeft aan of een retour voldoet aan alle criteria van het retourbeleid van het bedrijf. De criteria kunnen bijvoorbeeld betrekking hebben op de retourtermijn, de staat van het artikel of de reden van retour. Dit attribuut ondersteunt het dashboard 'Overzicht van naleving bij goedkeuring van retouren' en de KPI 'Percentage goedgekeurde retouren dat aan het beleid voldoet'. Hiermee kan een bedrijf de naleving van het beleid meten, uitzonderingen opsporen en de redenen en frequentie ervan analyseren. Dat helpt bij goed bestuur en kostenbeheersing. Waarom dit belangrijk is Meet rechtstreeks of de bedrijfsregels worden nageleefd. Zo kun je goedkeuringen opsporen die niet aan de regels voldoen en het aantal ervan terugdringen, zodat omzetverlies wordt beperkt. Waar vind je dit? Dit is een afgeleid attribuut. Je moet het berekenen door retourgegevens, zoals de retourdatum ten opzichte van de aankoopdatum en de retourreden, te toetsen aan vooraf bepaalde bedrijfsregels. Voorbeelden truefalse | |||
Activiteiten voor de verwerking van retouren en terugbetalingen
| Activiteit | Beschrijving | ||
|---|---|---|---|
| Afhandelingscode toegepast | Deze activiteit geeft aan dat de inspectie is afgerond en dat is besloten wat er met het geretourneerde product gebeurt. Aan de retourorderregel wordt een afhandelingscode toegekend, zoals 'Credit', 'Scrap' of 'Replace'. | ||
| Waarom dit belangrijk is Dit is een belangrijk beslismoment dat de volgende procesroute bepaalt: terugbetaling, omruiling of afwijzing. Vertraging op dit punt kan de totale afhandelingstijd flink verlengen. Waar vind je dit? Dit event wordt vastgelegd wanneer het veld DispositionCode wordt ingevuld bij de voorraadtransactie van de retourorderregel of in een bijbehorend journaal. Vastleggen De update waarbij een DispositionCode wordt ingesteld voor de retourorderregel. Gebeurtenistype explicit | |||
| Creditnota geboekt | De creditnota wordt officieel in de financiële administratie geboekt, zodat het tegoed beschikbaar komt voor de klant. Vanuit het bedrijf gezien is de terugbetaling hiermee afgerond. | ||
| Waarom dit belangrijk is Dit is een belangrijk financieel moment dat bevestigt dat de terugbetaling in het systeem is verwerkt. Vaak is dit een belangrijke activiteit om de naleving van de SLA voor terugbetalingen te meten. Waar vind je dit? De boektimestamp van het factuurjournaal voor de retourorder, waarmee de creditnota definitief wordt. De status van de retourorder verandert in 'Invoiced'. Vastleggen Boeking van het factuurjournaal van de retourorder. Gebeurtenistype explicit | |||
| Product ontvangen | Dit markeert de fysieke ontvangst van het geretourneerde product in het magazijn of het aangewezen retourcentrum. Dit wordt vastgelegd wanneer het ontvangstjournaal voor de retourorder wordt geboekt. | ||
| Waarom dit belangrijk is Dit is een belangrijk moment waarop het proces overgaat van een klantactie naar interne verwerking. Vanaf hier kun je alle interne verwerkingstijden berekenen, bijvoorbeeld voor inspectie en afhandeling. Waar vind je dit? De boektimestamp van het WMS Journal of Item Arrival Journal dat bij de retourorderregel hoort. Hierdoor krijgen voorraadtransacties de status 'Registered' of 'Received'. Vastleggen Boeking van het Item Arrival Journal dat aan de retourorderregel is gekoppeld. Gebeurtenistype explicit | |||
| Retourorder aangemaakt | Deze activiteit markeert het begin van het retourproces. In het systeem wordt een Return Material Authorization (RMA) of retourorder aangemaakt. Dit expliciete event wordt vastgelegd wanneer een nieuwe ReturnOrder-record wordt aangemaakt in Dynamics 365. | ||
| Waarom dit belangrijk is Dit is het belangrijkste startevent van het volledige retourproces. Door de tijd tussen deze activiteit en andere activiteiten te analyseren, zie je de totale doorlooptijd en kun je bottlenecks in een vroeg stadium opsporen. Waar vind je dit? Dit event wordt vastgelegd aan de hand van de aanmaaktimestamp van de ReturnOrder-header. Deze staat meestal in SalesTable, waar SalesType de waarde 'Returned Order' heeft. Vastleggen Aanmaak van de SalesTable-record met SalesType = 'Returned Order'. Gebeurtenistype explicit | |||
| Retourorder gesloten | De retourorder heeft de eindstatus bereikt. Alle fysieke en financiële transacties zijn afgerond. Dit gebeurt meestal nadat de creditnota is geboekt of het vervangende product is verzonden. | ||
| Waarom dit belangrijk is Dit is het belangrijkste eindevent van een succesvol afgerond retourproces. De tijd tussen het aanmaken en dit moment is de totale doorlooptijd van de case. Waar vind je dit? Af te leiden uit de wijziging van het statusveld van ReturnOrder naar een eindstatus, zoals 'Invoiced' of 'Closed'. Dit geeft aan dat er geen verdere verwerking wordt verwacht. Vastleggen Wijziging van het veld SalesTable.Status of SalesTable.DocumentStatus naar een eindstatus. Gebeurtenistype inferred | |||
| Creditnota aangemaakt | Bij de afhandelingscode 'Credit' wordt een creditnota aangemaakt om de klant terug te betalen. Dit is het formele begin van de financiële afhandeling. | ||
| Waarom dit belangrijk is Deze activiteit markeert de goedkeuring van de terugbetaling. De tijd tussen de afhandelingsbeslissing en het aanmaken van de creditnota laat zien hoeveel administratieve vertraging er is bij het starten van de terugbetaling. Waar vind je dit? Dit is af te leiden uit de aanmaak van een nieuwe SalesTable-record met een negatieve waarde, gekoppeld aan de oorspronkelijke retourorder, of uit het uitvoeren van de batchtaak 'Create credit note'. Vastleggen Aanmaak van een creditnota, vaak door de factuur van de retourorder te boeken. Gebeurtenistype explicit | |||
| Kwaliteitsorder aangemaakt | Er wordt een formele kwaliteitsorder aangemaakt. Dit betekent dat het geretourneerde product volgens een vast proces moet worden geïnspecteerd. Dit gebeurt vaak als retouren uitgebreide tests of controles aan de hand van kwaliteitsnormen vereisen. | ||
| Waarom dit belangrijk is Deze activiteit markeert het begin van een formeel inspectieproces. Door de tijd vanaf dit moment te volgen, kun je de efficiëntie en duur van de kwaliteitscontrole meten. Waar vind je dit? Aanmaaktimestamp van een record in InventQualityOrderTable dat aan de retourorder is gekoppeld. Vastleggen Aanmaak van een InventQualityOrderTable-record. Gebeurtenistype explicit | |||
| Ontvangstjournaal aangemaakt | Deze activiteit geeft aan dat het magazijn de retourzending verwacht. Er wordt een ontvangstjournaal aangemaakt, zodat het systeem klaarstaat om de goederen fysiek te ontvangen. | ||
| Waarom dit belangrijk is Deze stap scheidt de logistieke voorbereiding van de fysieke ontvangst. Zo kun je de gereedheid van het magazijn en de planning van inkomende retouren analyseren. Waar vind je dit? Aanmaak van een record in WMSJournalTable met JournalType 'Arrival'. Het journaal is gekoppeld aan de retourorderregel. Vastleggen Aanmaaktimestamp van de WMSJournalTable-record voor de retourzending. Gebeurtenistype explicit | |||
| Retourorder bevestigd | Dit is de formele bevestiging van de retourorder in het systeem. Vaak worden hierdoor vervolgstappen gestart. Meestal wordt dit vastgelegd als een expliciete actie of statuswijziging op de ReturnOrder-header. | ||
| Waarom dit belangrijk is Bevestiging is een belangrijke stap voordat de logistiek kan beginnen. Vertraging tussen het aanmaken en bevestigen kan wijzen op administratieve achterstanden of problemen met het systeem. Waar vind je dit? Dit is te herkennen aan de journaalboeking 'Confirmation' voor de retourorder of een wijziging van het veld DocumentStatus in SalesTable. Vastleggen Uitvoering van de functie 'Confirm sales order' voor de retourorder. Gebeurtenistype explicit | |||
| Retourorder geannuleerd | De retourorder wordt geannuleerd voordat het proces is afgerond. Dit kan gebeuren op verzoek van de klant of omdat het product nooit is teruggestuurd. | ||
| Waarom dit belangrijk is Dit is een alternatieve, niet-succesvolle eindstatus van het proces. Door te analyseren waarom retouren worden geannuleerd, krijg je inzicht in klantgedrag en procesproblemen. Waar vind je dit? Af te leiden uit de wijziging van het statusveld van ReturnOrder naar 'Cancelled'. Dit is een andere eindstatus dan een succesvol gesloten order. Vastleggen Wijziging van het veld SalesTable.Status naar 'Cancelled'. Gebeurtenistype inferred | |||
| Vervangend product verzonden | De pakbon voor het vervangende product wordt geboekt, wat aangeeft dat het naar de klant is verzonden. Hiermee is de afhandeling van de omruiling afgerond. | ||
| Waarom dit belangrijk is Dit is een belangrijk moment in de omruilroute en geeft aan dat het bedrijf zijn verplichting aan de klant is nagekomen. Het is belangrijk om de doorlooptijd van omruilingen te volgen. Waar vind je dit? De boekingsdatum van het pakbonjournaal voor de vervangende verkooporder. Hierdoor verandert de orderstatus in 'Delivered'. Vastleggen Boeking van de pakbon voor de vervangende verkooporder. Gebeurtenistype explicit | |||
| Vervangende order aangemaakt | Er wordt een nieuwe verkooporder aangemaakt om een vervangend product naar de klant te sturen. Dit gebeurt wanneer de afhandelingsactie 'Replace and Credit' of 'Replace and Scrap' is. | ||
| Waarom dit belangrijk is Deze activiteit start de variant waarbij het product wordt omgeruild. Door deze route apart van de terugbetalingsroute te volgen, krijg je inzicht in de complexiteit en kosten van omruilingen. Waar vind je dit? Aanmaak van een nieuwe SalesTable-record voor het vervangende product. Deze wordt vaak automatisch aangemaakt en aan de oorspronkelijke retourorder gekoppeld. Vastleggen Aanmaak van een nieuwe verkooporder die via de afhandelingsactie aan de retourorder is gekoppeld. Gebeurtenistype explicit | |||
Extractiegidsen
Stappen
- Vereisten: registreer een applicatie in Azure Active Directory. Voordat je verbinding maakt met de Dynamics 365 API, registreer je een applicatie in je Azure AD-tenant. Geef deze applicatie gedelegeerde machtigingen om toegang te krijgen tot Dynamics 365 Finance & Operations, bijvoorbeeld
Financials.ReadWrite.Allof een aangepaste machtiging. - Configureer de applicatie-ID in Dynamics 365. Ga in Dynamics 365 naar System administration > Setup > Azure Active Directory applications. Voeg de Application (client) ID uit de Azure AD-appregistratie toe en koppel deze aan een gebruikersaccount met de benodigde beveiligingsrollen om de vereiste data-entiteiten te lezen.
- Vraag een OAuth 2.0-toegangstoken aan. Schrijf bijvoorbeeld een script in PowerShell of Python om je te authenticeren bij het endpoint van het Microsoft identity platform. Gebruik de inloggegevens van de applicatie (client-ID en geheim) om een toegangstoken aan te vragen voor de Dynamics 365-resource-URL.
- Zoek de URL van je Dynamics 365-omgeving. Zoek de basis-URL van je Dynamics 365-omgeving. Het Web API-endpoint ziet er meestal zo uit:
https://[YourD365FinanceAndOpsURL].dynamics.com/data. - Stel OData API-verzoeken samen en voer ze uit. Maak voor elk van de 12 vereiste activiteiten een specifieke OData GET-verzoek-URL. Gebruik
$selectom alleen de benodigde kolommen op te halen en$filterom de datumbereiken en eventuele statusvoorwaarden op te geven. Voeg het authenticatietoken uit stap 3 als Bearer-token toe aan de autorisatieheader van elk verzoek. - Schrijf een extractiescript. Maak een script dat de lijst met OData-verzoeken doorloopt. Het script regelt de authenticatie, voert elk GET-verzoek uit en slaat de JSON-data op. Houd rekening met API-limieten en voeg zo nodig pauzes toe.
- Verwerk API-paginering. Dynamics 365 verdeelt grote resultaten over meerdere pagina’s. Je script moet controleren of de respons de eigenschap
@odata.nextLinkbevat. Is dat zo, dan moet het script een volgend verzoek naar die URL sturen om de volgende datapagina op te halen. Herhaal dit tot er geennextLinkmeer wordt meegegeven. - Transformeer en voeg de data samen. Verwerk de JSON-respons van elk van de 12 API-aanroepen. Maak voor elke activiteit een gestandaardiseerde record met
ReturnCaseId,ActivityName,EventTimeen andere attributen. Koppel bij de activiteit ‘Retourorder aangemaakt’ bijvoorbeeldReturnOrderNumberaanReturnCaseId, stelActivityNamein op ‘Retourorder aangemaakt’ en koppelcreatedDateTimeaanEventTime. Voeg de getransformeerde records uit alle aanroepen samen in één lijst of tabel. - Maak timestamps consistent. Zorg dat alle waarden van
EventTimehetzelfde formaat hebben, bij voorkeur UTC in een notatie zoalsYYYY-MM-DDTHH:MM:SSZ. Verwerk records met ontbrekende of ongeldige timestamps waar nodig. - Exporteer het definitieve event log. Exporteer de data zodra alles is verzameld en omgezet naar één dataset, naar een CSV-bestand. Gebruik kolomkoppen die voldoen aan de vereisten van ProcessMind, zoals
ReturnCaseId,ActivityName,EventTime,ResponsibleUserenDispositionCode. Het bestand is nu klaar om te uploaden.
Configuratie
- API-endpoint-URL: de basis-URL van je Dynamics 365 Finance & Operations-omgeving. Deze heeft de volgende indeling:
https://[YourEnvironmentName].dynamics.com/data. - Azure AD-applicatie: registreer een applicatie in Azure AD met een client-ID en geheim. De applicatie heeft API-machtigingen nodig om toegang te krijgen tot Dynamics 365-data-entiteiten.
- Filter op datumbereik: pas in elke API-aanroep een filter op datumbereik toe met de OData-parameter
$filterop een relevant datumveld, zoalscreatedDateTimeofmodifiedDateTime. Begin bijvoorbeeld met de data van de afgelopen 3 tot 6 maanden om de extractie beheersbaar te houden. - Bedrijfsfilter: voeg de queryparameter
cross-company=truetoe om data voor een specifieke juridische entiteit op te halen en gebruik daarna$filterop het velddataAreaId. Bijvoorbeeld:?cross-company=true&$filter=dataAreaId eq '[YourCompanyCode]'. - Voorkeur voor paginering: gebruik de header
Prefer: odata.maxpagesize=[value]in je verzoeken om het aantal records per pagina in te stellen. Een waarde tussen1000en5000is gebruikelijk. Zo voorkom je time-outs bij grote entiteiten. - API-limieten: houd rekening met de limieten voor API-bescherming van Dynamics 365. Het extractiescript moet
429 (Too Many Requests)-responsen kunnen verwerken, bijvoorbeeld met een exponentiële wachttijd of door kort te pauzeren en het verzoek opnieuw te proberen.
a Voorbeeldquery graphql
/*
This is a conceptual guide representing multiple, distinct OData API calls.
You will need a script (e.g., Python, PowerShell) to execute these calls sequentially,
authenticate with a bearer token, handle pagination, and union the results into a single file.
Replace [YourD365URL], [StartDate], [EndDate], and [YourCompanyCode] with your specific values.
*/
// Base URL for all requests
const string BaseUrl = "https://[YourD365URL].dynamics.com/data";
const string CompanyFilter = "?cross-company=true&$filter=dataAreaId eq '[YourCompanyCode]' and ";
const string DateFilterCreated = "createdDateTime ge [StartDate]T00:00:00Z and createdDateTime le [EndDate]T23:59:59Z";
const string DateFilterModified = "modifiedDateTime ge [StartDate]T00:00:00Z and modifiedDateTime le [EndDate]T23:59:59Z";
// 1. Return Order Created
GET {BaseUrl}/ReturnOrderHeaders{CompanyFilter}{DateFilterCreated}&$select=ReturnOrderNumber,createdDateTime,createdby,ReturnReasonCodeId
// Mapping: ReturnOrderNumber -> ReturnCaseId, 'Return Order Created' -> ActivityName, createdDateTime -> EventTime, createdby -> ResponsibleUser, ReturnReasonCodeId -> ReturnReasonCode
// 2. Return Order Confirmed
// This often updates the header status. We look for a modification time on confirmed orders.
GET {BaseUrl}/ReturnOrderHeaders{CompanyFilter}ReturnOrderStatus eq 'Confirmed' and {DateFilterModified}&$select=ReturnOrderNumber,modifiedDateTime,modifiedby,ReturnReasonCodeId
// Mapping: ReturnOrderNumber -> ReturnCaseId, 'Return Order Confirmed' -> ActivityName, modifiedDateTime -> EventTime, modifiedby -> ResponsibleUser
// 3. Arrival Journal Created
GET {BaseUrl}/WarehouseArrivalJournalHeaders{CompanyFilter}{DateFilterCreated}&$expand=WarehouseArrivalJournalLines($select=InventTransactionId)&$select=JournalNumber,createdDateTime,createdby
// Note: This requires post-processing to link JournalNumber to a ReturnCaseId via InventTransactionId.
// Mapping: Link via InventTrans -> ReturnCaseId, 'Arrival Journal Created' -> ActivityName, createdDateTime -> EventTime, createdby -> ResponsibleUser
// 4. Item Received (Arrival Journal Posted)
GET {BaseUrl}/WarehouseArrivalJournalHeaders{CompanyFilter}JournalPosted eq 'Yes' and {DateFilterModified}&$expand=WarehouseArrivalJournalLines($select=InventTransactionId)&$select=JournalNumber,modifiedDateTime,modifiedby
// Mapping: Link via InventTrans -> ReturnCaseId, 'Item Received' -> ActivityName, modifiedDateTime -> EventTime, modifiedby -> ResponsibleUser
// 5. Quality Order Generated
GET {BaseUrl}/InventQualityOrders{CompanyFilter}{DateFilterCreated}&$select=QualityOrderId,InventTransId,createdDateTime,CreatedByUserId,ItemId
// Mapping: Link via InventTransId -> ReturnCaseId, 'Quality Order Generated' -> ActivityName, createdDateTime -> EventTime, CreatedByUserId -> ResponsibleUser, ItemId -> ProductId
// 6. Disposition Code Applied
// This is a status change on the return line.
GET {BaseUrl}/ReturnOrderLines{CompanyFilter}ReturnDispositionCodeId ne '' and {DateFilterModified}&$select=ReturnOrderNumber,modifiedDateTime,modifiedby,ReturnDispositionCodeId,ItemId
// Mapping: ReturnOrderNumber -> ReturnCaseId, 'Disposition Code Applied' -> ActivityName, modifiedDateTime -> EventTime, modifiedby -> ResponsibleUser, ReturnDispositionCodeId -> DispositionCode, ItemId -> ProductId
// 7. Credit Note Created
// Look for sales orders with type 'Returned Order' that are not yet invoiced.
GET {BaseUrl}/SalesOrderHeadersV2{CompanyFilter}SalesOrderProcessingStatus eq 'Open' and SalesOrderType eq 'ReturnedOrder' and {DateFilterCreated}&$select=SalesOrderNumber,createdDateTime,createdby
// Mapping: SalesOrderNumber -> ReturnCaseId, 'Credit Note Created' -> ActivityName, createdDateTime -> EventTime, createdby -> ResponsibleUser
// 8. Credit Note Posted
// Look for posted invoice journals linked to a return order.
GET {BaseUrl}/SalesInvoiceJournalHeaders{CompanyFilter}SalesOrderType eq 'ReturnedOrder' and {DateFilterCreated}&$select=SalesOrderNumber,InvoiceDate,createdby
// Mapping: SalesOrderNumber -> ReturnCaseId, 'Credit Note Posted' -> ActivityName, InvoiceDate -> EventTime, createdby -> ResponsibleUser
// 9. Replacement Order Created
// Disposition code on the return line triggers a replacement order.
GET {BaseUrl}/SalesOrderHeadersV2{CompanyFilter}SalesOrderOriginType eq 'ReturnOrder' and {DateFilterCreated}&$select=SalesOrderNumber,createdDateTime,createdby,ReturnOrderNumber
// Mapping: ReturnOrderNumber -> ReturnCaseId, 'Replacement Order Created' -> ActivityName, createdDateTime -> EventTime, createdby -> ResponsibleUser
// 10. Replacement Item Shipped
// Check for posted packing slips related to the replacement sales order.
GET {BaseUrl}/SalesPackingSlipJournals{CompanyFilter}{DateFilterCreated}&$select=SalesOrderNumber,DeliveryDate,createdby
// Note: This requires linking SalesOrderNumber back to the original ReturnOrderNumber for the ReturnCaseId.
// Mapping: Link SalesOrderNumber -> ReturnCaseId, 'Replacement Item Shipped' -> ActivityName, DeliveryDate -> EventTime, createdby -> ResponsibleUser
// 11. Return Order Closed
GET {BaseUrl}/ReturnOrderHeaders{CompanyFilter}ReturnOrderStatus eq 'Closed' and {DateFilterModified}&$select=ReturnOrderNumber,modifiedDateTime,modifiedby
// Mapping: ReturnOrderNumber -> ReturnCaseId, 'Return Order Closed' -> ActivityName, modifiedDateTime -> EventTime, modifiedby -> ResponsibleUser
// 12. Return Order Cancelled
GET {BaseUrl}/ReturnOrderHeaders{CompanyFilter}ReturnOrderStatus eq 'Canceled' and {DateFilterModified}&$select=ReturnOrderNumber,modifiedDateTime,modifiedby
// Mapping: ReturnOrderNumber -> ReturnCaseId, 'Return Order Cancelled' -> ActivityName, modifiedDateTime -> EventTime, modifiedby -> ResponsibleUser Stappen
- Schakel het TDS-endpoint in: controleer of het Tabular Data Stream (TDS)-endpoint is ingeschakeld voor je Dynamics 365 Dataverse-omgeving. Een systeembeheerder kan dit inschakelen in het Power Platform-beheercentrum, onder Environment > Settings > Features.
- Zoek de URL van de omgeving: zoek de URL van je omgeving. Deze ziet er meestal zo uit:
yourorg.crm.dynamics.com. De servernaam van het TDS-endpoint is deze URL met poort 5558, bijvoorbeeldyourorg.crm.dynamics.com,5558. - Maak verbinding met een SQL-client: gebruik een SQL-client die TDS ondersteunt, zoals SQL Server Management Studio (SSMS) of Azure Data Studio.
- Authenticatie: maak verbinding met de server via je Azure Active Directory-account. Dit account moet de juiste machtigingen hebben, meestal de rol System Administrator of System Customizer in de Dataverse-omgeving.
- Bereid de query voor: kopieer de volledige SQL-query uit het gedeelte
queryvan dit document naar een nieuw queryvenster in je SQL-client. - Stel parameters in: zoek de tijdelijke aanduidingen in de query. Vervang
'{StartDate}'en'{EndDate}'door het gewenste datumbereik voor de extractie, bijvoorbeeld'2023-01-01'en'2023-12-31'. Pas ook tijdelijke waarden voor statuscodes of afhandelingscodes aan je Dynamics 365-configuratie aan. - Voer de query uit: voer de aangepaste query uit op de Dataverse-database. De uitvoeringstijd hangt af van de hoeveelheid data en het gekozen datumbereik.
- Controleer de resultaten: controleer na afloop of de dataset de verwachte kolommen bevat:
ReturnCaseId,ActivityName,EventTimeen de aanbevolen attributen. - Exporteer het event log: exporteer de queryresultaten naar een CSV-bestand. De meeste SQL-clients hebben een ingebouwde functie om resultaten rechtstreeks naar een bestand op te slaan. Sla het bestand op met UTF-8-codering.
- Upload naar ProcessMind: het geëxporteerde CSV-bestand is klaar om als nieuw event log naar ProcessMind te uploaden voor process mining-analyse.
Configuratie
- Vereisten: je hebt een gebruikersaccount nodig met minimaal leestoegang tot de relevante Dataverse-tabellen, zoals SalesTable, SalesLine en CustInvoiceJour. Machtigingen worden meestal beheerd via beveiligingsrollen zoals System Administrator of een aangepaste rol met voldoende tabelmachtigingen.
- TDS-endpoint: het Dataverse TDS-endpoint moet zijn ingeschakeld voor de omgeving. Met deze functie kun je rechtstreeks alleen-lezen SQL-query’s uitvoeren op de Dataverse-database.
- Datumbereik: de query bevat de tijdelijke aanduidingen
'{StartDate}'en'{EndDate}'. Voor een eerste analyse raden we een datumbereik van 3 tot 6 maanden aan. Zo krijg je een representatieve dataset zonder prestatieproblemen te veroorzaken. - Bedrijfsfilter: de query wordt uitgevoerd voor alle juridische entiteiten (bedrijven) waartoe de gebruiker toegang heeft. Wil je één bedrijf analyseren, haal dan het commentaarteken weg en voeg in elk deel van de
UNION ALL-instructie eenWHERE-clausule toe die filtert op het veldDATAAREAID, bijvoorbeeldAND st.DATAAREAID = '[YourCompanyID]'. - Tijdelijke aanduidingen voor aangepaste logica: de query bevat aanduidingen zoals
[YourReplaceCode1]voor afhandelingscodes en opmerkingen over het koppelen van vervangende orders. Pas deze aan je bedrijfsproces en Dynamics 365-configuratie aan. - Prestaties: rechtstreekse query’s op het TDS-endpoint kunnen traag zijn bij grote datasets. De verbinding is geoptimaliseerd voor analytische query’s, maar complexe joins over miljoenen rijen kunnen een time-out veroorzaken. We raden aan strikte datumfilters toe te passen.
a Voorbeeldquery sql
SELECT
st.RETURNITEMNUM AS ReturnCaseId,
'Return Order Created' AS ActivityName,
st.CREATEDDATETIME AS EventTime,
st.CREATEDBY AS ResponsibleUser,
sl.RETURNDISPOSITIONCODEID AS DispositionCode,
sl.RETURNREASONCODEID AS ReturnReasonCode,
st.SALESORIGINID AS ReturnChannel,
sl.ITEMID AS ProductId
FROM SALESTABLE st
JOIN SALESLINE sl ON st.SALESID = sl.SALESID AND st.DATAAREAID = sl.DATAAREAID
WHERE st.SALESTYPE = 3 AND st.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
st.RETURNITEMNUM AS ReturnCaseId,
'Return Order Confirmed' AS ActivityName,
st.MODIFIEDDATETIME AS EventTime,
st.MODIFIEDBY AS ResponsibleUser,
sl.RETURNDISPOSITIONCODEID AS DispositionCode,
sl.RETURNREASONCODEID AS ReturnReasonCode,
st.SALESORIGINID AS ReturnChannel,
sl.ITEMID AS ProductId
FROM SALESTABLE st
JOIN SALESLINE sl ON st.SALESID = sl.SALESID AND st.DATAAREAID = sl.DATAAREAID
WHERE st.SALESTYPE = 3 AND st.DOCUMENTSTATUS = 1 AND st.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
st.RETURNITEMNUM AS ReturnCaseId,
'Arrival Journal Created' AS ActivityName,
wjt.CREATEDDATETIME AS EventTime,
wjt.CREATEDBY AS ResponsibleUser,
sl.RETURNDISPOSITIONCODEID AS DispositionCode,
sl.RETURNREASONCODEID AS ReturnReasonCode,
st.SALESORIGINID AS ReturnChannel,
sl.ITEMID AS ProductId
FROM SALESTABLE st
JOIN SALESLINE sl ON st.SALESID = sl.SALESID AND st.DATAAREAID = sl.DATAAREAID
JOIN WMSJOURNALTABLE wjt ON st.SALESID = wjt.ORDERID AND st.DATAAREAID = wjt.DATAAREAID
WHERE st.SALESTYPE = 3 AND wjt.JOURNALTYPE = 4 AND st.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
st.RETURNITEMNUM AS ReturnCaseId,
'Item Received' AS ActivityName,
wjt.POSTEDDATETIME AS EventTime,
wjt.POSTEDUSERID AS ResponsibleUser,
sl.RETURNDISPOSITIONCODEID AS DispositionCode,
sl.RETURNREASONCODEID AS ReturnReasonCode,
st.SALESORIGINID AS ReturnChannel,
sl.ITEMID AS ProductId
FROM SALESTABLE st
JOIN SALESLINE sl ON st.SALESID = sl.SALESID AND st.DATAAREAID = sl.DATAAREAID
JOIN WMSJOURNALTABLE wjt ON st.SALESID = wjt.ORDERID AND st.DATAAREAID = wjt.DATAAREAID
WHERE st.SALESTYPE = 3 AND wjt.JOURNALTYPE = 4 AND wjt.POSTEDDATETIME IS NOT NULL AND st.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
st.RETURNITEMNUM AS ReturnCaseId,
'Quality Order Generated' AS ActivityName,
iqot.CREATEDDATETIME AS EventTime,
iqot.CREATEDBY AS ResponsibleUser,
sl.RETURNDISPOSITIONCODEID AS DispositionCode,
sl.RETURNREASONCODEID AS ReturnReasonCode,
st.SALESORIGINID AS ReturnChannel,
iqot.ITEMID AS ProductId
FROM SALESTABLE st
JOIN SALESLINE sl ON st.SALESID = sl.SALESID AND st.DATAAREAID = sl.DATAAREAID
JOIN INVENTQUALITYORDERTABLE iqot ON sl.INVENTTRANSID = iqot.INVENTTRANSID AND sl.DATAAREAID = iqot.DATAAREAID
WHERE st.SALESTYPE = 3 AND st.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
st.RETURNITEMNUM AS ReturnCaseId,
'Disposition Code Applied' AS ActivityName,
iqot.VALIDATEDDATETIME AS EventTime,
iqot.VALIDATEDBY AS ResponsibleUser,
sl.RETURNDISPOSITIONCODEID AS DispositionCode,
sl.RETURNREASONCODEID AS ReturnReasonCode,
st.SALESORIGINID AS ReturnChannel,
iqot.ITEMID AS ProductId
FROM SALESTABLE st
JOIN SALESLINE sl ON st.SALESID = sl.SALESID AND st.DATAAREAID = sl.DATAAREAID
JOIN INVENTQUALITYORDERTABLE iqot ON sl.INVENTTRANSID = iqot.INVENTTRANSID AND sl.DATAAREAID = iqot.DATAAREAID
WHERE st.SALESTYPE = 3 AND iqot.VALIDATEDDATETIME IS NOT NULL AND st.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
st.RETURNITEMNUM AS ReturnCaseId,
'Credit Note Created' AS ActivityName,
st.MODIFIEDDATETIME AS EventTime,
st.MODIFIEDBY AS ResponsibleUser,
sl.RETURNDISPOSITIONCODEID AS DispositionCode,
sl.RETURNREASONCODEID AS ReturnReasonCode,
st.SALESORIGINID AS ReturnChannel,
sl.ITEMID AS ProductId
FROM SALESTABLE st
JOIN SALESLINE sl ON st.SALESID = sl.SALESID AND st.DATAAREAID = sl.DATAAREAID
WHERE st.SALESTYPE = 3 AND st.SALESSTATUS = 3 AND st.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
st.RETURNITEMNUM AS ReturnCaseId,
'Credit Note Posted' AS ActivityName,
cij.CREATEDDATETIME AS EventTime,
cij.CREATEDBY AS ResponsibleUser,
sl.RETURNDISPOSITIONCODEID AS DispositionCode,
sl.RETURNREASONCODEID AS ReturnReasonCode,
st.SALESORIGINID AS ReturnChannel,
sl.ITEMID AS ProductId
FROM SALESTABLE st
JOIN SALESLINE sl ON st.SALESID = sl.SALESID AND st.DATAAREAID = sl.DATAAREAID
JOIN CUSTINVOICEJOUR cij ON st.SALESID = cij.SALESID AND st.DATAAREAID = cij.DATAAREAID
WHERE st.SALESTYPE = 3 AND st.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
ro.RETURNITEMNUM AS ReturnCaseId,
'Replacement Order Created' AS ActivityName,
replacement_so.CREATEDDATETIME AS EventTime,
replacement_so.CREATEDBY AS ResponsibleUser,
NULL AS DispositionCode,
NULL AS ReturnReasonCode,
replacement_so.SALESORIGINID AS ReturnChannel,
replacement_sl.ITEMID AS ProductId
FROM SALESTABLE ro
JOIN SALESLINE rol ON ro.SALESID = rol.SALESID AND ro.DATAAREAID = rol.DATAAREAID
JOIN SALESTABLE replacement_so ON ro.CUSTACCOUNT = replacement_so.CUSTACCOUNT AND ro.DATAAREAID = replacement_so.DATAAREAID
JOIN SALESLINE replacement_sl ON replacement_so.SALESID = replacement_sl.SALESID AND replacement_so.DATAAREAID = replacement_sl.DATAAREAID
WHERE ro.SALESTYPE = 3
AND rol.RETURNDISPOSITIONCODEID IN ('[YourReplaceCode1]', '[YourReplaceCode2]')
AND replacement_so.SALESTYPE = 1
AND replacement_so.CREATEDDATETIME > ro.CREATEDDATETIME
-- The join above is a basic example and must be replaced with your system's specific logic for linking returns to replacements.
AND ro.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
ro.RETURNITEMNUM AS ReturnCaseId,
'Replacement Item Shipped' AS ActivityName,
cpsj.CREATEDDATETIME AS EventTime,
cpsj.CREATEDBY AS ResponsibleUser,
NULL AS DispositionCode,
NULL AS ReturnReasonCode,
replacement_so.SALESORIGINID AS ReturnChannel,
cpsl.ITEMID AS ProductId
FROM SALESTABLE ro
JOIN SALESLINE rol ON ro.SALESID = rol.SALESID AND ro.DATAAREAID = rol.DATAAREAID
JOIN SALESTABLE replacement_so ON ro.CUSTACCOUNT = replacement_so.CUSTACCOUNT AND ro.DATAAREAID = replacement_so.DATAAREAID
JOIN CUSTPACKINGSLIPJOUR cpsj ON replacement_so.SALESID = cpsj.SALESID AND replacement_so.DATAAREAID = cpsj.DATAAREAID
JOIN CUSTPACKINGSLIPTRANS cpsl ON cpsj.PACKINGSLIPID = cpsl.PACKINGSLIPID AND cpsj.SALESID = cpsl.SALESID AND cpsj.DATAAREAID = cpsl.DATAAREAID
WHERE ro.SALESTYPE = 3
AND rol.RETURNDISPOSITIONCODEID IN ('[YourReplaceCode1]', '[YourReplaceCode2]')
AND replacement_so.SALESTYPE = 1
AND replacement_so.CREATEDDATETIME > ro.CREATEDDATETIME
-- The join above is a basic example and must be replaced with your system's specific logic for linking returns to replacements.
AND ro.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
st.RETURNITEMNUM AS ReturnCaseId,
'Return Order Closed' AS ActivityName,
st.MODIFIEDDATETIME AS EventTime,
st.MODIFIEDBY AS ResponsibleUser,
sl.RETURNDISPOSITIONCODEID AS DispositionCode,
sl.RETURNREASONCODEID AS ReturnReasonCode,
st.SALESORIGINID AS ReturnChannel,
sl.ITEMID AS ProductId
FROM SALESTABLE st
JOIN SALESLINE sl ON st.SALESID = sl.SALESID AND st.DATAAREAID = sl.DATAAREAID
WHERE st.SALESTYPE = 3 AND st.SALESSTATUS = 3 AND st.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
SELECT
st.RETURNITEMNUM AS ReturnCaseId,
'Return Order Cancelled' AS ActivityName,
st.MODIFIEDDATETIME AS EventTime,
st.MODIFIEDBY AS ResponsibleUser,
sl.RETURNDISPOSITIONCODEID AS DispositionCode,
sl.RETURNREASONCODEID AS ReturnReasonCode,
st.SALESORIGINID AS ReturnChannel,
sl.ITEMID AS ProductId
FROM SALESTABLE st
JOIN SALESLINE sl ON st.SALESID = sl.SALESID AND st.DATAAREAID = sl.DATAAREAID
WHERE st.SALESTYPE = 3 AND st.SALESSTATUS = 4 AND st.CREATEDDATETIME BETWEEN '{StartDate}' AND '{EndDate}'; Klaar om te beginnen?
Gebruik deze template om data eenvoudiger te verzamelen en ontdek hoe je het retour- en terugbetalingsproces kunt verbeteren. Begin vandaag met snellere verwerking en hogere klanttevredenheid.
Voorkom vertraging bij retouren en terugbetalingen: optimaliseer je proces vandaag
Verkort de doorlooptijd met 30% en verhoog de klanttevredenheid.
Geen creditcard nodig. De installatie duurt maar een paar minuten.