Uw Retour- & Terugbetalingsverwerkings Data Template
Uw Retour- & Terugbetalingsverwerkings Data Template
- Aanbevolen `data fields` om te verzamelen
- Belangrijkste processtappen om te volgen
- Richtlijnen voor `data-extractie`
Attributes Retour- & Terugbetalingsverwerking
| Naam | Omschrijving | ||
|---|---|---|---|
| Return Case ID ReturnCaseId | De unieke identificatie voor een klant's retour- en terugbetalingscase, die alle gerelateerde activiteiten koppelt. | ||
| Omschrijving De Return Case ID dient als de primaire identificatie voor elke unieke return proces instance. Het koppelt alle activiteiten die verband houden met een specifieke klantretour of terugbetalingsaanvraag, van de initiële aanmaak van de retourorder tot de uiteindelijke afsluiting ervan. Bij procesanalyse is deze ID fundamenteel voor het reconstrueren van het end-to-end traject van elke retourzending. Het maakt het mogelijk om de complete lifecycle te volgen, totale cycle times te meten en variaties tussen verschillende cases te analyseren. Alle events, data en metrics worden geaggregeerd en gecorreleerd met behulp van deze identificatie. Het belang Dit is de essentiële case identificatie die alle processtappen verbindt, waardoor het mogelijk wordt om elke retour van begin tot eind te traceren en te analyseren. Vindplaats Dit is doorgaans het Return Material Authorization (RMA) nummer of het Sales Order nummer van het type 'Returned Order' in de 'Sales and marketing' module. Te vinden in tabellen zoals 'SalesTable' waar 'SalesType' 'Returned Order' is. Voorbeelden RMA-001234RMA-001235RMA-001236 | |||
| Tijdstip Gebeurtenis EventTime | De tijdstempel die aangeeft wanneer een specifieke activiteit of gebeurtenis heeft plaatsgevonden. | ||
| Omschrijving
Dit Het belang Deze timestamp is essentieel voor het berekenen van alle op duur gebaseerde metrics, zoals cycle times en wachttijden, die fundamenteel zijn voor prestatieanalyse. Vindplaats Correspondeert met Voorbeelden 2023-10-26T10:00:00Z2023-10-26T14:30:15Z2023-10-27T09:05:42Z | |||
| Activiteitsnaam ActivityName | De naam van de specifieke business event of taak die heeft plaatsgevonden binnen het retour- en terugbetalingsproces. | ||
| Omschrijving Dit attribute beschrijft een specifieke stap of event in de retour- en terugbetalingslifecycle, zoals 'Retourorder Aangemaakt', 'Artikel Ontvangen', of 'Creditnota Geboekt'. Elke activiteit vertegenwoordigt een afzonderlijk punt in het proces dat in het systeem wordt vastgelegd. Het analyseren van de volgorde en frequentie van deze activiteiten is de kern van process mining. Het maakt de visualisatie van proceskaarten, identificatie van knelpunten tussen stappen en ontdekking van veelvoorkomende en ongebruikelijke procesvarianten mogelijk. De set activiteiten definieert de scope van het te analyseren proces. Het belang Het definieert de stappen van het proces, waardoor de Vindplaats Dit is een conceptueel attribute dat is afgeleid van systeemevents. Het kan worden gegenereerd door statuswijzigingen in tabellen zoals 'SalesTable' en 'WMSJournalTable' of specifieke event logs te mappen naar gebruiksvriendelijke namen. Voorbeelden Retourorder AangemaaktItem OntvangenDisposition Code toegepastCreditnota geboekt | |||
| Dispositiecode DispositionCode | Een code die het resultaat van de item inspectie en de volgende te ondernemen actie aangeeft. | ||
| Omschrijving De Disposition Code wordt toegekend tijdens de kwaliteitsinspectie van een geretourneerd artikel. Deze bepaalt de volgende stap in het proces, zoals 'Credit', 'Replace', 'Scrap', of 'Return to Customer'. Dit attribute is een kritiek beslissingspunt in het retourproces. Analyseren op basis van de disposition code stelt bedrijven in staat de uitkomsten van retouren te begrijpen, de financiële impact van het afschrijven van artikelen te volgen en de efficiëntie van verschillende oplossingspaden, zoals vervanging versus terugbetaling, te evalueren. Het belang Deze code bepaalt het pad dat een retourcase zal nemen na inspectie, wat cruciaal is voor het analyseren van procesvarianten en hun business outcomes. Vindplaats Dit is een sleutelveld in de kwaliteitsmanagement module. Het is gekoppeld aan de Quality Order of Inspection Order verwerking. Voorbeelden CRDTREPL-DSCRAPRTV | |||
| Product-ID ProductId | De unieke identificatie voor het geretourneerde product. | ||
| Omschrijving De Product ID, vaak de Stock Keeping Unit (SKU), identificeert het specifieke artikel dat door de klant wordt geretourneerd. Elke retourorderregel is gekoppeld aan een Product ID. Het analyseren van retouren per product is essentieel voor het identificeren van artikelen met hoge retourpercentages. Dit kan duiden op problemen met kwaliteitscontrole, onnauwkeurige productbeschrijvingen of fabricagefouten. Deze analyse helpt bij het prioriteren van productgerelateerde onderzoeken en verbeteringen. Het belang Maakt analyse van Vindplaats Dit komt overeen met het 'ItemId' veld in de 'SalesLine' tabel voor de retourorder. Voorbeelden SKU-A-123SKU-B-456SKU-C-789 | |||
| Retourkanaal ReturnChannel | De methode of het kanaal waarmee de klant de retourzending heeft geïnitieerd. | ||
| Omschrijving Dit attribute specificeert het kanaal dat door de klant wordt gebruikt om het retourproces te starten, bijvoorbeeld 'Online Portal', 'In-Store', 'Customer Service Call', of 'Mail'. Het segmenteren van de procesanalyse per retourkanaal helpt bij het evalueren van de prestaties en efficiëntie van elk kanaal. Een bedrijf kan cycle times, kosten en klanttevredenheid over kanalen heen vergelijken om best practices en gebieden voor investering of verbetering te identificeren. Dit is essentieel voor het 'Return Channel Utilization Performance' dashboard. Het belang Het maakt Vindplaats Deze informatie kan worden opgeslagen in de retourorderheader ('SalesTable') of worden afgeleid van de gebruiker die de order heeft aangemaakt. Het kan aangepaste logica of een speciaal veld vereisen. Voorbeelden WebportaalIn-Store KioskKlantenservice | |||
| Retourreden Code ReturnReasonCode | De door de klant opgegeven reden voor het retourneren van het artikel. | ||
| Omschrijving De Return Reason Code legt de door de klant opgegeven reden voor de retourzending vast, zoals 'Defect Artikel', 'Verkeerde Maat', 'Niet zoals Beschreven', of 'Niet Langer Nodig'. Deze informatie wordt doorgaans verzameld wanneer de retourzending wordt geïnitieerd. Het analyseren van retourredenen is van vitaal belang voor root cause analysis. Het helpt bedrijven problemen met productkwaliteit, problemen met productbeschrijvingen of logistieke fouten te identificeren. Inzichten uit deze data kunnen verbeteringen stimuleren in productontwerp, marketing en supply chain operations om toekomstige retouren te verminderen. Het belang Biedt cruciaal inzicht in waarom Vindplaats Dit wordt doorgaans opgeslagen op het niveau van de retourorderregel. Zoek naar reden code velden in de 'SalesLine' tabel voor retourorders. Voorbeelden DEFECTWRONG_ITEMNO_LONGER_WANTEDDAMAGED_IN_TRANSIT | |||
| Verantwoordelijke Gebruiker ResponsibleUser | De gebruiker of medewerker die een specifieke activiteit heeft uitgevoerd of daarvoor verantwoordelijk is. | ||
| Omschrijving Dit attribute identificeert de individuele gebruiker die verantwoordelijk is voor het uitvoeren van een processtap. Het kan de magazijnmedewerker zijn die het artikel heeft ontvangen, de kwaliteitsinspecteur, of de financiële medewerker die de creditnota heeft geboekt. Het analyseren van het proces per gebruiker helpt bij het begrijpen van de werkverdeling, het identificeren van top performers en het detecteren van potentiële trainingsbehoeften. Het kan ook worden gebruikt om cases te onderzoeken die door specifieke individuen of teams zijn afgehandeld en om een juiste scheiding van taken te waarborgen. Het belang Het maakt analyse mogelijk van Vindplaats Gevonden in 'created by' of 'modified by' velden op Voorbeelden Alice.WBob.JChris.P | |||
| Aangevraagd Terugbetalingsbedrag RequestedRefundAmount | De totale monetaire waarde van de door de klant aangevraagde terugbetaling. | ||
| Omschrijving Dit attribute vertegenwoordigt het initiële terugbetalingsbedrag zoals aangevraagd of verwacht aan het begin van het retourproces. Het is doorgaans gebaseerd op de oorspronkelijke aankoopprijs van de geretourneerde artikelen. Deze waarde dient als een baseline voor de 'Refund Amount Discrepancy Analysis'. Door het aangevraagde bedrag te vergelijken met het daadwerkelijk terugbetaalde bedrag, kan het bedrijf discrepanties identificeren die zijn veroorzaakt door restocking fees, gedeeltelijke terugbetalingen voor beschadigde goederen, of andere aanpassingen. Dit helpt bij het monitoren van financiële nauwkeurigheid en beleidsnaleving. Het belang Het dient als een Vindplaats Dit is doorgaans het regelbedrag of totale bedrag van de oorspronkelijke verkooporderregel die wordt geretourneerd, te vinden in 'SalesLine.LineAmount'. Voorbeelden 99.99150.0024.50 | |||
| Bronsysteem SourceSystem | Het informatiesysteem waaruit de event data werd geëxtraheerd. | ||
| Omschrijving Dit attribute identificeert het broninformatiesysteem waar de data vandaan komt. In deze context zal dit voornamelijk 'Microsoft Dynamics 365' zijn. In grotere organisaties kan een proces meerdere systemen omvatten. Het specificeren van het bronsysteem voor elke event is cruciaal voor data governance, het oplossen van data-extractieproblemen en het begrijpen van het technologische landschap van het proces. Het bevestigt de herkomst van de geanalyseerde data. Het belang Het biedt cruciale context over Vindplaats Dit is doorgaans een statische waarde die wordt toegevoegd tijdens het extractie-, transformatie- en laadproces (ETL) om de herkomst van de dataset te labelen. Voorbeelden Microsoft Dynamics 365 F&OD365-PROD | |||
| Credit Note ID CreditNoteId | De unieke identificatie voor het creditnotadocument dat voor een terugbetaling is aangemaakt. | ||
| Omschrijving Wanneer een terugbetaling wordt verwerkt, wordt een financieel document gegenereerd, bekend als een creditnota of creditmemo. Dit attribute slaat de unieke ID van dat document op. Deze ID biedt een directe link van het operationele retourproces naar de financiële records in het boekhoudsysteem. Het is nuttig voor auditdoeleinden en voor deep dives in financiële discrepanties, waardoor een analist een retourcase helemaal kan traceren tot de specifieke financiële transactie die deze heeft afgehandeld. Het belang Het koppelt het operationele Vindplaats Het creditnotanummer wordt doorgaans gevonden in het 'InvoiceId' veld van de 'CustInvoiceJour' tabel, waar het transactietype 'Credit note' is. Dit kan worden gekoppeld aan de retourorder. Voorbeelden CN-10056CN-10057CN-10058 | |||
| Eindtijd EndTime | De timestamp die aangeeft wanneer een specifieke activiteit is voltooid. | ||
| Omschrijving De End Time vertegenwoordigt de voltooiing timestamp voor een activiteit. Waar StartTime het begin markeert, markeert EndTime de conclusie, waardoor de berekening van de verwerkingstijd voor die specifieke taak mogelijk wordt. Dit attribute is cruciaal voor gedetailleerde prestatieanalyse, vooral voor taken met een meetbare duur, zoals 'Artikelinspectie'. Door de StartTime en EndTime te vergelijken, kunnen analisten nauwkeurig de actieve verwerkingstijd van taken meten, deze onderscheidend van de wachttijd tussen taken. Dit helpt bij het identificeren van inefficiënties binnen specifieke activiteiten, niet alleen daartussen. Het belang Het maakt de Vindplaats Dit moet vaak worden afgeleid. Het kan bijvoorbeeld de 'modifiedDateTime' zijn van een statuswijziging die een activiteit afsluit, of het kan de StartTime zijn van de daaropvolgende activiteit. Voorbeelden 2023-10-26T10:15:00Z2023-10-26T14:45:20Z2023-10-27T09:55:12Z | |||
| Is beleidsconform IsPolicyAdherent | Een vlag die aangeeft of de `return approval` voldoet aan de vastgestelde retour `policies`. | ||
| Omschrijving Dit is een berekend boolean attribute dat aangeeft of een retour voldoet aan alle criteria die zijn gedefinieerd in het retourbeleid van het bedrijf. Dit kan gebaseerd zijn op factoren zoals het retourvenster, de artikelconditie of de reden van retour. Dit attribute ondersteunt direct het 'Return Approval Compliance Overview' dashboard en de 'Compliant Return Approval Rate' KPI. Het stelt het bedrijf in staat om beleidscompliance te kwantificeren, cases te identificeren die als uitzondering zijn goedgekeurd, en de redenen en frequentie van dergelijke uitzonderingen te analyseren. Dit is van vitaal belang voor governance en kostenbeheersing. Het belang Het meet direct Vindplaats Dit is een afgeleid attribute. De logica zou moeten worden gebouwd door attributes van de retour (bijv. retourdatum versus aankoopdatum, retourreden) te vergelijken met vooraf gedefinieerde business rules. Voorbeelden truefalse | |||
| Klant-ID CustomerId | De unieke identificatie voor de klant die de retourzending heeft geïnitieerd. | ||
| Omschrijving De Klant ID is de unieke identificatie voor het klantaccount dat is gekoppeld aan de retourzending. Dit koppelt de retourtransactie terug aan een specifieke klant in het CRM of de klantendatabase. Het analyseren van retouren per klant maakt de identificatie mogelijk van klanten met ongewoon hoge retouractiviteit, wat kan duiden op frauduleus gedrag of chronische ontevredenheid. Het kan ook worden gebruikt om klanten te segmenteren, bijvoorbeeld om premium retourservices aan te bieden aan klanten met een hoge waarde. Het belang Het koppelt het Vindplaats Dit is het 'CustAccount' veld in de 'SalesTable' voor de retourorder. Voorbeelden CUST-00045CUST-00192CUST-00315 | |||
| Laatste data-update LastDataUpdate | De timestamp die aangeeft wanneer de data voor het proces voor het laatst is ververst. | ||
| Omschrijving Dit attribute registreert de datum en tijd waarop de data voor het laatst is geëxtraheerd uit het bronsysteem en is bijgewerkt in de process mining tool. Het biedt een referentiepunt voor de actualiteit van de geanalyseerde data. Het kennen van de laatste data-update tijd is belangrijk voor het begrijpen van de tijdigheid van de analyse. Het helpt gebruikers de dashboards en KPI's correct te interpreteren, wetende of ze naar real-time data kijken of een momentopname van een specifiek tijdstip. Dit is essentieel voor operationele monitoring. Het belang Geeft de Vindplaats Dit is een metadata attribute dat is gegenereerd en opgeslagen tijdens de data ingestion pipeline, en typisch de timestamp van de ETL job voltooiing vertegenwoordigt. Voorbeelden 2023-11-01T02:00:00Z2023-11-02T02:00:00Z | |||
| Magazijn-ID WarehouseId | De identificatie voor het magazijn of de locatie waar het geretourneerde artikel wordt ontvangen. | ||
| Omschrijving Dit attribute identificeert het specifieke fysieke magazijn of retourcentrum dat het geretourneerde artikel verwerkt. Verschillende locaties kunnen verschillende processen, resources of prestatieniveaus hebben. Het analyseren van het proces per magazijn maakt prestatiemetingen tussen locaties mogelijk. Het kan helpen identificeren welke faciliteiten het meest efficiënt zijn in het verwerken van retouren, regionale knelpunten benadrukken en beslissingen informeren over resource-allocatie en processtandaardisatie binnen het logistieke netwerk. Het belang Maakt Vindplaats Deze informatie wordt opgeslagen in het 'InventLocationId' veld op inventarisgerelateerde transacties, zoals het Arrival Journal ('WMSJournalTable') of op de 'SalesLine'. Voorbeelden WH-EASTWH-WESTCENTRAL-DC | |||
| Refund SLA Target Datum RefundSlaTargetDate | De streefdatum waarop de retour- en terugbetalingscase volledig moet zijn afgehandeld. | ||
| Omschrijving Dit attribute definieert de Service Level Agreement (SLA) deadline voor het oplossen van een retourcase. Het is de datum waarop de klant naar verwachting een definitieve oplossing moet hebben, zoals een geboekte terugbetaling of een verzonden vervanging. Deze streefdatum is essentieel voor prestatiemonitoring ten opzichte van serviceafspraken. Het wordt gebruikt om de 'Resolution SLA Adherence Rate' KPI te berekenen en het 'Refund Resolution SLA Performance' dashboard aan te sturen. Het vergelijken van deze datum met de daadwerkelijke voltooiingsdatum van het proces stelt het bedrijf in staat om SLA-schendingen te identificeren en proactief verouderende cases te beheren. Het belang Het is de Vindplaats Dit is mogelijk geen standaardveld. Het wordt vaak berekend op basis van de aanmaakdatum van de retourzending plus een vooraf gedefinieerde SLA-periode (bijv. 14 dagen). Het kan worden opgeslagen in een custom field. Voorbeelden 2023-11-10T23:59:59Z2023-11-15T23:59:59Z | |||
| Retourorderstatus ReturnOrderStatus | De algehele status van de retourorder op het moment van de event. | ||
| Omschrijving Dit attribute geeft de huidige status van de retourorderheader aan, zoals 'Open', 'Invoiced' of 'Canceled'. Het biedt een high-level overzicht van waar de case zich bevindt in zijn lifecycle. Hoewel activiteiten gedetailleerde processtappen bieden, is de algehele status nuttig voor het filteren en segmenteren van cases. Een analist kan bijvoorbeeld alleen focussen op 'Open' cases om de huidige werklast te begrijpen, of de processtroom van cases analyseren die uiteindelijk 'Canceled' worden. Het belang Biedt een Vindplaats Deze informatie bevindt zich in het 'SalesStatus' of 'DocumentStatus' veld van de 'SalesTable'. Voorbeelden Openstaande orderGeleverdGefactureerdGeannuleerd | |||
| Retourtype ReturnType | Categoriseert de `return` op basis van de verwachte uitkomst, zoals `Refund` of `Replacement`. | ||
| Omschrijving Dit attribute classificeert de retourcase op basis van het oplossingstype dat door de klant wordt gevraagd of door het bedrijf wordt aangeboden. Veelvoorkomende typen zijn een monetaire 'Terugbetaling', een omruiling voor een 'Vervangend' artikel, of 'Reparatie'. Deze categorisatie is nuttig voor het analyseren van verschillende procespaden. Het proces voor het uitvoeren van een terugbetaling verschilt aanzienlijk van het proces voor het verzenden van een vervangend artikel. Segmenteren op Return Type maakt een nauwkeurigere analyse mogelijk van de cycle times en knelpunten die specifiek zijn voor elk oplossingstraject. Het belang Het maakt de Vindplaats Dit kan een custom field zijn op de retourorderheader of afgeleid zijn op basis van de disposition code of daaropvolgende transacties zoals het aanmaken van een vervangende verkooporder. Voorbeelden TerugbetalingVervangingWinkelkrediet | |||
| SLA-Status SlaStatus | Geeft aan of de `case` is opgelost binnen de `Service Level Agreement target`. | ||
| Omschrijving Dit berekende attribute biedt een eenvoudige status van SLA compliance, typisch 'On Time' of 'Late'. Het wordt bepaald door de timestamp van de uiteindelijke activiteit (bijv. 'Retourorder Gesloten') te vergelijken met de 'RefundSlaTargetDate'. Dit attribute vereenvoudigt prestatiereporting op dashboards zoals 'Refund Resolution SLA Performance'. In plaats van gebruikers te vragen data te vergelijken, biedt het een directe en gemakkelijk te begrijpen status. Dit maakt snelle filtering en aggregatie mogelijk om de algehele 'Resolution SLA Adherence Rate' te berekenen. Het belang Biedt een eenvoudige, direct zichtbare indicator van Vindplaats Dit is een afgeleid attribute, berekend door de timestamp van de uiteindelijke resolutie-activiteit te vergelijken met het 'RefundSlaTargetDate' attribute. Voorbeelden Op tijdTe laat | |||
| Werkelijk terugbetalingsbedrag ActualRefundAmount | De uiteindelijke monetaire waarde van de aan de klant uitgevoerde terugbetaling. | ||
| Omschrijving Dit attribute is het uiteindelijke, bevestigde bedrag dat aan de klant is terugbetaald. Deze waarde wordt vastgelegd wanneer de creditnota wordt aangemaakt en geboekt. Dit is een kritiek attribute voor financiële analyse en wordt direct gebruikt in het 'Refund Amount Discrepancy Analysis' dashboard en de 'Refund Amount Accuracy Rate' KPI. Het analyseren van deze data helpt om de financiële impact van retouren en eventuele aanpassingen die tijdens het proces zijn gemaakt, te begrijpen. Het belang Dit vertegenwoordigt de daadwerkelijke financiële impact van de retourzending en is cruciaal voor het berekenen van de terugbetalingsnauwkeurigheid en het begrijpen van financiële uitkomsten. Vindplaats Deze waarde kan worden gevonden in de geboekte creditnota transactiedetails. Het is gerelateerd aan de 'CustTrans' en 'CustInvoiceJour' tabellen voor de creditnota. Voorbeelden 99.99135.000.00 | |||
Activiteiten Retour- & Terugbetalingsverwerking
| Activiteit | Omschrijving | ||
|---|---|---|---|
| Creditnota geboekt | De creditnota wordt officieel geboekt in de financiële grootboeken, waardoor het tegoed beschikbaar wordt voor de klant. Dit duidt op de voltooiing van de terugbetalingsactie vanuit het perspectief van het bedrijf. | ||
| Het belang Dit is een cruciale financiële mijlpaal, die bevestigt dat de terugbetaling in het systeem is verwerkt. Het is vaak een belangrijke activiteit voor het meten van de SLA-compliance van terugbetalingen. Vindplaats De boekings timestamp van het factuurjournaal voor de retourorder, die de creditnota finaliseert. De status van de retourorder verandert naar 'Gefactureerd'. Vastleggen
Gebeurtenistype explicit | |||
| Disposition Code toegepast | Deze activiteit vertegenwoordigt de voltooiing van de inspectie en de beslissing wat te doen met het geretourneerde artikel. Een disposition code, zoals 'Credit', 'Scrap', of 'Replace', wordt toegewezen aan de retourregel. | ||
| Het belang Dit is een belangrijk beslissingspunt dat het daaropvolgende procespad bepaalt, of het nu een terugbetaling, omruiling of afwijzing is. Vertragingen hier kunnen de algehele doorlooptijd aanzienlijk beïnvloeden. Vindplaats Deze event wordt vastgelegd wanneer het DispositionCode veld wordt ingevuld op de inventaristransactie van de retourorderregel of het gerelateerde journaal. Vastleggen De update event wanneer een DispositionCode wordt ingesteld voor de retourorderregel. Gebeurtenistype explicit | |||
| Item Ontvangen | Markeert de fysieke ontvangst van het geretourneerde item in het `warehouse` of het aangewezen `return center`. Dit wordt vastgelegd wanneer het `arrival journal` dat gekoppeld is aan de `return order` is geboekt. | ||
| Het belang Dit is een kritieke mijlpaal die het proces overdraagt van klantactie naar interne verwerking. Het is het startpunt voor het berekenen van alle interne afhandelingstijden, zoals inspectie en dispositie. Vindplaats De boekings timestamp van het WMS Journal of Item Arrival Journal dat is gekoppeld aan de ReturnOrder-regel. Dit werkt inventaristransacties bij naar een status 'Geregistreerd' of 'Ontvangen'. Vastleggen
Gebeurtenistype explicit | |||
| Retourorder Aangemaakt | Deze activiteit markeert de start van het retourproces, waarbij een Return Material Authorization (RMA) of Retourorder wordt aangemaakt in het systeem. Dit is een expliciete event die wordt vastgelegd bij het aanmaken van een nieuw ReturnOrder record in Dynamics 365. | ||
| Het belang Dit is de primaire start-event voor het gehele retourproces. Het analyseren van de tijd vanaf deze activiteit tot andere onthult de totale proces lead time en helpt bij het identificeren van early-stage knelpunten. Vindplaats Deze event wordt vastgelegd vanuit de creatie timestamp van de ReturnOrder header. Dit is doorgaans te vinden in de SalesTable waar de SalesType 'Returned Order' is. Vastleggen
Gebeurtenistype explicit | |||
| Retourorder Gesloten | De retourorder heeft zijn eindstatus bereikt, wat betekent dat alle fysieke en financiële transacties zijn voltooid. Dit gebeurt doorgaans nadat de creditnota is geboekt of de vervanging is verzonden. | ||
| Het belang Dit is de primaire eind-event voor een succesvol voltooid retourproces. De duur vanaf aanmaak tot dit punt vertegenwoordigt de totale case cycle time. Vindplaats Afgeleid van het wijzigen van het ReturnOrder Vastleggen Verandering van het veld SalesTable.Status of SalesTable.DocumentStatus naar een finale status. Gebeurtenistype inferred | |||
| Arrival Journal aangemaakt | Deze activiteit duidt erop dat het magazijn de aankomst van het geretourneerde artikel verwacht. Het is het aanmaken van een aankomstjournaal, dat het systeem voorbereidt op de fysieke ontvangst van de goederen. | ||
| Het belang Deze stap scheidt logistieke voorbereiding van de daadwerkelijke fysieke ontvangst. Het helpt bij het analyseren van magazijn gereedheid en het plannen van inkomende retouren. Vindplaats
Vastleggen
Gebeurtenistype explicit | |||
| Creditnota Aangemaakt | Een `credit note` wordt gegenereerd op basis van een `disposition` van 'Credit', die een `refund` aan de klant autoriseert. Dit is de formele start van het financiële afwikkelingsdeel van het proces. | ||
| Het belang Deze activiteit markeert de goedkeuring van de financiële terugbetaling. De tijd tussen dispositie en het aanmaken van de creditnota benadrukt administratieve vertragingen bij het initiëren van de terugbetaling. Vindplaats Dit kan worden afgeleid uit het aanmaken van een nieuw SalesTable record met een negatieve waarde, gekoppeld aan de oorspronkelijke retourorder, of door het uitvoeren van de 'Create credit note' batch job. Vastleggen
Gebeurtenistype explicit | |||
| Kwaliteitsorder gegenereerd | Een formele `quality order` wordt gecreëerd, wat aangeeft dat het geretourneerde item een gestructureerd inspectieproces moet ondergaan. Dit is gebruikelijk in scenario's waar `returns` gedetailleerde tests of controles tegen kwaliteitsstandaarden vereisen. | ||
| Het belang Deze activiteit markeert de start van een formeel inspectieproces. Het volgen van de tijd vanaf dit punt helpt bij het meten van de efficiëntie en duur van de kwaliteitsborging workflow. Vindplaats
Vastleggen
Gebeurtenistype explicit | |||
| Retourorder Bevestigd | Vertegenwoordigt de formele bevestiging van de retourorder binnen het systeem, wat vaak downstreamlogica activeert. Dit wordt meestal vastgelegd als een expliciete actie of een statuswijziging in de ReturnOrder-header. | ||
| Het belang Bevestiging is een cruciale stap voordat Vindplaats Dit kan worden geïdentificeerd door de 'Confirmation' journaalboeking voor de retourorder of een wijziging in het DocumentStatus veld op de SalesTable. Vastleggen Uitvoering van de 'Confirm sales order' functie voor de Gebeurtenistype explicit | |||
| Retourorder Geannuleerd | De retourorder is geannuleerd vóór voltooiing. Dit kan te wijten zijn aan een klantverzoek of als het artikel nooit is geretourneerd. | ||
| Het belang Dit vertegenwoordigt een alternatief, onsuccesvol einde van het proces. Het analyseren waarom retouren worden geannuleerd, kan inzichten verschaffen in klantgedrag of procesfouten. Vindplaats Afgeleid van het wijzigen van het ReturnOrder Vastleggen Verandering van het veld SalesTable.Status naar 'Cancelled'. Gebeurtenistype inferred | |||
| Vervangend Artikel Verzonden | De pakbon van het vervangende artikel wordt geboekt, wat aangeeft dat het naar de klant is verzonden. Dit markeert de voltooiing van het uitwisselingsproces. | ||
| Het belang Dit is een belangrijke mijlpaal in de omruilvariant, die de nakoming van de verplichting van het bedrijf aan de klant vertegenwoordigt. Het is cruciaal voor het bijhouden van omruil cycle times. Vindplaats De boekingsdatum van het pakbonjournaal voor de vervangende verkooporder. Dit werkt de orderstatus bij naar 'Geleverd'. Vastleggen
Gebeurtenistype explicit | |||
| Vervangende Bestelling Aangemaakt | Een nieuwe `sales order` wordt aangemaakt om een `replacement item` naar de klant te sturen. Deze activiteit vindt plaats wanneer de `disposition action` 'Replace and Credit' of 'Replace and Scrap' is. | ||
| Het belang Deze activiteit initieert de variant van het omruilproces. Dit pad afzonderlijk van het terugbetalingspad volgen is essentieel voor het begrijpen van de complexiteiten en kosten van omruilingen. Vindplaats Het aanmaken van een nieuw SalesTable record voor het vervangende artikel, vaak automatisch gegenereerd en gekoppeld aan de oorspronkelijke retourorder. Vastleggen
Gebeurtenistype explicit | |||
Extractie Guides
Stappen
- Vereiste: Registreer een applicatie in Azure Active Directory. Voordat u verbinding kunt maken met de Dynamics 365 API, moet u een applicatie registreren in uw Azure AD-tenant. Verleen deze applicatie gedelegeerde machtigingen voor toegang tot Dynamics 365 Finance & Operations, bijvoorbeeld de
Financials.ReadWrite.Allof een aangepaste machtiging. - Configureer Applicatie ID in Dynamics 365. Navigeer in Dynamics 365 naar Systeembeheer > Setup > Azure Active Directory-applicaties. Voeg de Applicatie (client) ID van uw Azure AD-appregistratie toe en koppel deze aan een gebruikersaccount dat de nodige security roles heeft om de vereiste data entities te lezen.
- Verkrijg een OAuth 2.0 Access Token. Schrijf een script, bijvoorbeeld in PowerShell of Python, om te authenticeren tegen de Microsoft identity platform endpoint. Gebruik de credentials van de applicatie (client ID en secret) om een access token aan te vragen voor de Dynamics 365 resource URL.
- Identificeer Uw Dynamics 365 Omgevings-URL. Zoek de basis-URL voor uw Dynamics 365 omgeving. De Web API endpoint zal doorgaans eruitzien als:
https://[YourD365FinanceAndOpsURL].dynamics.com/data. - Construeer en Voer OData API Requests uit. Voor elk van de 12 vereiste activiteiten, construeer een specifieke OData GET request URL. Gebruik
$selectom alleen de vereiste kolommen op te halen en$filterom het datumbereik en eventuele statuscondities te specificeren. Het authenticatietoken verkregen in stap 3 moet worden opgenomen als een Bearer token in de authorization header van elke request. - Ontwikkel een Extractiescript. Maak een script dat door de lijst met OData requests itereert. Dit script moet de authenticatie afhandelen, elke GET request uitvoeren en de resulterende JSON data opslaan. Besteed aandacht aan API limits en implementeer pauzes indien nodig.
- Behandel API Paginering. Dynamics 365 pagineert grote resultaten. Uw script moet controleren op een
@odata.nextLinkproperty in de response. Indien deze bestaat, moet uw script een vervolgrequest doen naar die URL om de volgende pagina met data op te halen, doorgaand totdat er geennextLinkmeer wordt geleverd. - Transformeer en Combineer de Data. Verwerk de JSON response van elk van de 12 API calls. Creëer voor elke activiteit een gestandaardiseerd record met
ReturnCaseId,ActivityName,EventTimeen andere attributes. Bijvoorbeeld, voor de 'Return Order Created' event, map deReturnOrderNumbernaarReturnCaseId, stelActivityNamein op 'Return Order Created', en mapcreatedDateTimenaarEventTime. Combineer de getransformeerde records van alle calls in een enkele lijst of table. - Schoon en Standaardiseer Timestamps. Zorg ervoor dat alle
EventTimewaarden in een consistent format zijn, bij voorkeur UTC met een format zoalsYYYY-MM-DDTHH:MM:SSZ. Behandel records met ontbrekende of ongeldige timestamps naar behoefte. - Exporteer de Finale Event Log. Zodra alle data is verzameld en getransformeerd in een enkele uniforme dataset, exporteert u deze naar een CSV-bestand. Zorg ervoor dat de kolomkoppen overeenkomen met de vereisten voor ProcessMind:
ReturnCaseId,ActivityName,EventTime,ResponsibleUser,DispositionCode, etc. Het bestand is nu klaar voor upload.
Configuratie
- API Endpoint URL: De basis-URL voor uw Dynamics 365 Finance & Operations instance. Deze volgt het formaat
https://[YourEnvironmentName].dynamics.com/data. - Azure AD Application: Een applicatie moet geregistreerd zijn in Azure AD met een client ID en secret. Het vereist API permissions voor toegang tot Dynamics 365 data entities.
- Date Range Filtering: Het is essentieel om in elke API call een date range filter toe te passen met de OData
$filterparameter op een relevant datumveld, zoalscreatedDateTimeofmodifiedDateTime. Een typische beginrange is de data van de laatste 3 tot 6 maanden om de extractie beheersbaar te houden. - Company Filter: Om data te extraheren voor een specifieke legal entity, voegt u de
cross-company=truequery parameter toe en gebruikt u vervolgens$filterop hetdataAreaIdveld. Bijvoorbeeld:?cross-company=true&$filter=dataAreaId eq '[YourCompanyCode]'. - Pagination Preference: Gebruik de
Prefer: odata.maxpagesize=[value]header in uw requests om het aantal records per pagina te beheren. Een waarde van1000tot5000is gangbaar. Dit helpt om API timeouts op grote entities te voorkomen. - API Throttling: Houd rekening met de Dynamics 365 API service protection limits. Het extractiescript moet logica bevatten om
429 (Too Many Requests)responses af te handelen, doorgaans via een exponential backoff of een eenvoudig pause-and-retry mechanisme.
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
- TDS Endpoint inschakelen: Zorg ervoor dat het Tabular Data Stream (TDS) endpoint is ingeschakeld voor uw Dynamics 365 Dataverse omgeving. Een systeembeheerder kan dit inschakelen in het Power Platform admin center onder Omgeving > Instellingen > Functies.
- Omgevings-URL identificeren: Vind uw omgevings-URL. Deze ziet er doorgaans uit als
yourorg.crm.dynamics.com. De servernaam van het TDS endpoint zal deze URL zijn met poort 5558, bijvoorbeeldyourorg.crm.dynamics.com,5558. - Verbinden met een SQL Client: Gebruik een SQL client die TDS ondersteunt, zoals SQL Server Management Studio (SSMS) of Azure Data Studio.
- Authenticeren: Maak verbinding met de server met behulp van uw Azure Active Directory-account dat de juiste machtigingen heeft, doorgaans System Administrator of System Customizer, in de Dataverse omgeving.
- Query voorbereiden: Kopieer de complete SQL query, zoals aangeleverd in de
query-sectie van dit document, naar een nieuw queryvenster in uw SQL client. - Parameters instellen: Zoek de placeholders binnen de query. Vervang
'{StartDate}'en'{EndDate}'door de gewenste datumbereik voor de extractie, bijvoorbeeld'2023-01-01'en'2023-12-31'. Update ook alle placeholder-waarden voor statuscodes of disposition codes om te matchen met uw specifieke Dynamics 365 configuratie. - Query uitvoeren: Voer de aangepaste query uit op de Dataverse database. De uitvoeringstijd zal variëren afhankelijk van het datavolume en het geselecteerde datumbereik.
- Resultaten controleren: Zodra de query voltooid is, controleert u de geretourneerde dataset om te verzekeren dat deze de verwachte kolommen bevat:
ReturnCaseId,ActivityName,EventTime, en de aanbevolen attributes. - Event Log exporteren: Exporteer de queryresultaten naar een CSV-bestand. De meeste SQL clients hebben een ingebouwde functie om resultaten direct naar een bestand op te slaan. Zorg ervoor dat het bestand wordt opgeslagen met UTF-8 encoding.
- Uploaden naar ProcessMind: Het geëxporteerde CSV-bestand is nu klaar om te worden geüpload naar ProcessMind als een nieuwe
event logvoor Process Mining analyse.
Configuratie
- Voorvereisten: U moet een gebruikersaccount hebben met ten minste leestoegang tot de relevante Dataverse tables (bijv. SalesTable, SalesLine, CustInvoiceJour). Permissions worden doorgaans beheerd via security roles zoals System Administrator of een custom role met voldoende table permissions.
- TDS Endpoint: Het Dataverse TDS endpoint moet zijn ingeschakeld voor de omgeving. Deze feature maakt directe, read-only SQL queries mogelijk tegen de Dataverse database.
- Datumtraject: De query omvat
'{StartDate}'en'{EndDate}'placeholders. Voor een initiële analyse wordt een datumtraject van 3 tot 6 maanden aanbevolen om een representatieve dataset te bieden zonder performance issues te veroorzaken. - Bedrijfsfilter: De query zoals geschreven wordt uitgevoerd over alle legal entities (bedrijven) waar de gebruiker toegang toe heeft. Voor een analyse van één enkel bedrijf, maakt u de opmerking ongedaan en voegt u een
WHEREclause toe die filtert op hetDATAAREAIDveld in elk deel van deUNION ALLstatement, bijvoorbeeldAND st.DATAAREAID = '[YourCompanyID]'. - Aangepaste Logica Placeholders: De query bevat placeholders zoals
[YourReplaceCode1]voor disposition codes en notities over het koppelen van replacement orders. Deze moeten worden geconfigureerd op basis van uw specifieke business process en Dynamics 365 setup. - Performance: Directe queries tegen het TDS endpoint voor grote datasets kunnen traag zijn. De connectie is geoptimaliseerd voor analytische queries, maar complexe joins over miljoenen rijen kunnen time-outen. Het wordt aanbevolen om 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}';