Il Suo template per i dati di gestione resi e rimborsi
Il Suo template per i dati di gestione resi e rimborsi
- Campi dati consigliati da raccogliere
- Fasi chiave del processo da tracciare
- Guida all'estrazione dei dati
Attributi della gestione resi e rimborsi
| Nome | Descrizione | ||
|---|---|---|---|
| ID pratica di reso ReturnCaseId | L'identificativo univoco della pratica di reso di un cliente, che collega tutte le attività correlate. | ||
| Descrizione L'ID Pratica di Reso funge da identificativo primario per ogni istanza del processo. Collega tutte le attività associate a una specifica richiesta, dalla creazione dell'ordine fino alla chiusura finale. Nell'analisi dei processi, questo ID è fondamentale per ricostruire il percorso end-to-end di ogni reso. Consente di tracciare il ciclo di vita completo, misurare i tempi di ciclo e analizzare le variazioni tra i casi. Tutti gli eventi e le metriche sono correlati tramite questo identificativo. Perché è importante Identificativo essenziale della pratica che connette tutti i passaggi, rendendo possibile tracciare ogni reso dall'inizio alla fine. Dove trovare In genere si tratta del numero RMA o del numero dell'ordine di vendita di tipo 'Returned Order', presente nella 'SalesTable'. Esempi RMA-001234RMA-001235RMA-001236 | |||
| Timestamp Evento EventTime | Il timestamp che indica quando una specifica attività o un evento si è verificato. | ||
| Descrizione L'Event Time (timestamp) registra la data e l'ora esatta di ogni attività. Fornisce l'ordine cronologico degli eventi nell'Event Log. Questo attributo è fondamentale per le analisi basate sul tempo. Serve a calcolare i tempi di ciclo tra le attività, individuare attese e bottleneck, misurare la durata totale delle pratiche e verificare il rispetto degli SLA. L'accuratezza dei timestamp influisce direttamente sull'affidabilità dell'analisi delle performance. Perché è importante Questo timestamp è essenziale per calcolare le metriche di durata, come i tempi di ciclo e di attesa, basi dell'analisi delle performance. Dove trovare Corrisponde ai campi data di creazione o modifica, come 'SalesTable.createdDateTime' per gli ordini o 'WMSJournalTrans.createdDateTime' per i giornali di magazzino. Esempi 2023-10-26T10:00:00Z2023-10-26T14:30:15Z2023-10-27T09:05:42Z | |||
| Nome attività ActivityName | Il nome dell'evento aziendale o della task specifica verificatasi nel processo di reso e rimborso. | ||
| Descrizione Questo attributo descrive un passaggio specifico nel ciclo di vita del reso, come 'Ordine di reso creato' o 'Nota di credito contabilizzata'. Ogni attività è un punto distinto registrato nel sistema. L'analisi della sequenza di queste attività è il cuore della Process Mining. Consente di visualizzare le mappe di processo, identificare i colli di bottiglia e scoprire varianti comuni o insolite. L'insieme delle attività definisce il perimetro dell'analisi. Perché è importante Definisce le fasi del processo, consentendo la visualizzazione del flusso e l'identificazione di bottleneck, rework e deviazioni. Dove trovare Attributo concettuale derivato dagli eventi di sistema, generato mappando i cambi di stato in nomi comprensibili per l'utente. Esempi Ordine di reso creatoArticolo RicevutoCodice disposizione applicatoNota di Credito Registrata | |||
| Canale di reso ReturnChannel | Il metodo o il canale attraverso cui il cliente ha avviato il reso. | ||
| Descrizione Questo attributo specifica il canale usato dal cliente per il reso (es. 'Portale online', 'In negozio', 'Assistenza clienti' o 'Posta'). Segmentare l'analisi per canale aiuta a valutarne l'efficienza. È possibile confrontare tempi di ciclo e costi tra i vari canali per identificare le best practice o le aree che richiedono interventi, alimentando la dashboard sull'utilizzo dei canali. Perché è importante Consente di confrontare le prestazioni dei canali di reso, aiutando a ottimizzare quelli più efficienti ed economici. Dove trovare Queste informazioni potrebbero trovarsi nell'intestazione dell'ordine di reso ('SalesTable') o derivare dall'utente che ha creato l'ordine. Esempi Portale WebKiosk in negozioSupporto Clienti | |||
| Codice di Disposizione DispositionCode | Un codice che indica l'esito dell'ispezione dell'articolo e l'azione successiva da intraprendere. | ||
| Descrizione Il Codice di Disposizione viene assegnato durante l'ispezione della qualità. Determina il passaggio successivo del processo, come 'Accredito', 'Sostituzione', 'Scarto' o 'Reso al cliente'. Questo attributo è un punto decisionale critico. L'analisi per codice di disposizione consente di comprendere gli esiti dei resi, tracciare l'impatto finanziario degli scarti e valutare l'efficienza dei diversi percorsi di risoluzione. Perché è importante Questo codice determina il percorso della pratica dopo l'ispezione, rendendolo cruciale per analizzare le varianti di processo e i risultati di business. Dove trovare Campo chiave nel modulo di gestione qualità, associato all'elaborazione del Quality Order o dell'Inspection Order. Esempi CRDTREPL-DSCRAPRTV | |||
| Codice motivo del reso ReturnReasonCode | Il motivo fornito dal cliente per la restituzione dell'articolo. | ||
| Descrizione Il Codice Motivo del Reso registra il motivo dichiarato dal cliente, come 'Articolo difettoso', 'Taglia errata' o 'Non corrispondente alla descrizione'. Analizzare i motivi dei resi è fondamentale per l'analisi delle cause radice. Aiuta a identificare problemi qualitativi, errori nelle schede prodotto o falle logistiche, guidando miglioramenti nel design e nel marketing per ridurre i resi futuri. Perché è importante Offre insight fondamentali sui motivi dei resi, permettendo analisi delle cause radice per ridurre i tassi di reso. Dove trovare Solitamente memorizzato a livello di riga. Cercare i campi del codice motivo nella tabella 'SalesLine' per gli ordini di reso. Esempi DIFETTOWRONG_ITEMNON_PIÙ_DESIDERATODANNEGGIATO_IN_TRANSITO | |||
| ID Prodotto ProductId | L'identificativo univoco del prodotto restituito. | ||
| Descrizione Il Product ID (spesso lo SKU) identifica l'articolo specifico restituito. Ogni riga dell'ordine di reso è associata a un Product ID. Analizzare i resi per prodotto è essenziale per identificare articoli con tassi di reso elevati, il che può segnalare problemi di qualità, descrizioni imprecise o difetti di fabbrica. Questa analisi aiuta a dare priorità agli interventi sui prodotti. Perché è importante Consente l'analisi dei resi per prodotto, aiutando a identificare articoli con problemi di qualità o volumi di reso elevati. Dove trovare Corrisponde al campo 'ItemId' nella tabella 'SalesLine' per l'ordine di reso. Esempi SKU-A-123SKU-B-456SKU-C-789 | |||
| Utente Responsabile ResponsibleUser | L'utente o il dipendente responsabile dell'esecuzione di una specifica attività. | ||
| Descrizione Questo attributo identifica l'utente responsabile di un passaggio del processo. Potrebbe essere l'operatore di magazzino, l'ispettore qualità o l'impiegato amministrativo. Analizzare il processo per utente aiuta a capire la distribuzione del carico di lavoro, identificare i profili più performanti e rilevare necessità di formazione. Serve anche a garantire la corretta segregazione dei compiti. Perché è importante Consente l'analisi della distribuzione del carico di lavoro e delle performance di singoli o team, individuando necessità di formazione. Dove trovare Reperibile nei campi 'creato da' o 'modificato da' dei record di transazione (es. 'SalesTable.createdBy' o ID utente nei giornali). Esempi Alice.WBob.JChris.P | |||
| Conforme alla policy IsPolicyAdherent | Un flag che indica se l'approvazione del reso è conforme alle policy di reso stabilite. | ||
| Descrizione Attributo booleano calcolato che indica se un reso soddisfa i criteri della policy aziendale (es. finestra temporale, condizioni dell'articolo). Supporta direttamente la dashboard sulla conformità delle approvazioni e il relativo KPI. Permette di quantificare l'aderenza alle regole, identificare le eccezioni approvate e analizzarne motivi e frequenza. Fondamentale per la governance e il controllo dei costi. Perché è importante Misura l'aderenza alle regole aziendali, aiutando a ridurre le approvazioni non conformi che causano perdite di fatturato. Dove trovare Attributo derivato. La logica viene costruita confrontando i dati del reso con le regole di business predefinite. Esempi truefalse | |||
| Data obiettivo SLA rimborso RefundSlaTargetDate | La data entro la quale la pratica di reso e rimborso dovrebbe essere risolta. | ||
| Descrizione Questo attributo definisce la scadenza SLA per risolvere la pratica di reso. È la data entro cui il cliente deve ricevere la risoluzione finale. Questa data è essenziale per il monitoraggio delle performance rispetto ai KPI di servizio. Viene usata per calcolare il tasso di aderenza agli SLA e alimentare la dashboard dedicata. Il confronto con la data di completamento effettiva permette di identificare le violazioni e gestire proattivamente i casi in ritardo. Perché è importante È il benchmark per misurare le performance, consentendo il monitoraggio degli SLA e l'identificazione delle pratiche in ritardo. Dove trovare Potrebbe non essere un campo standard, spesso è calcolato in base alla data di creazione più il periodo SLA predefinito. Esempi 2023-11-10T23:59:59Z2023-11-15T23:59:59Z | |||
| ID Cliente CustomerId | L'identificativo univoco del cliente che ha avviato il reso. | ||
| Descrizione Il Customer ID è l'identificativo univoco dell'account cliente associato al reso. Collega la transazione a un cliente specifico nel CRM o nel database. Analizzare i resi per cliente consente di identificare chi presenta un'attività di reso insolitamente alta, il che potrebbe indicare comportamenti fraudolenti o insoddisfazione cronica. Può anche essere utilizzato per segmentare i clienti e offrire, ad esempio, servizi di reso premium ai profili ad alto valore. Perché è importante Collega il reso a un cliente specifico, permettendo analisi comportamentali e l'identificazione di pattern di reso anomali o frodi. Dove trovare Corrisponde al campo 'CustAccount' nella 'SalesTable' per l'ordine di reso. Esempi CUST-00045CUST-00192CUST-00315 | |||
| ID Magazzino WarehouseId | L'identificativo del magazzino o della sede in cui viene ricevuto l'articolo reso. | ||
| Descrizione Questo attributo identifica il magazzino fisico o il centro resi che elabora l'articolo. Sedi diverse possono avere processi o livelli di performance differenti. Analizzare il processo per magazzino permette di effettuare un benchmarking tra le sedi. Aiuta a capire quali strutture sono più efficienti, evidenziare colli di bottiglia locali e guidare le decisioni sull'allocazione delle risorse o sulla standardizzazione dei processi. Perché è importante Consente di confrontare le prestazioni tra diversi magazzini o centri di reso, aiutando a identificare bottleneck locali o best practice. Dove trovare Queste informazioni sono memorizzate nel campo 'InventLocationId' delle transazioni di magazzino, come l'Arrival Journal ('WMSJournalTable') o nella 'SalesLine'. Esempi WH-EASTWH-WESTCENTRAL-DC | |||
| ID Nota di credito CreditNoteId | L'identificativo univoco del documento della nota di credito creato per un rimborso. | ||
| Descrizione Quando si elabora un rimborso, viene generata una nota di credito. Questo attributo ne memorizza l'ID univoco. L'ID collega il processo operativo ai record contabili. È utile per gli audit e per analizzare le discrepanze finanziarie, permettendo di tracciare la pratica fino alla transazione finale. Perché è importante Collega il processo operativo alla transazione finanziaria, fattore cruciale per l'audit e la riconciliazione. Dove trovare Il numero della nota di credito si trova solitamente nel campo 'InvoiceId' della tabella 'CustInvoiceJour', dove il tipo di transazione è 'Nota di credito'. Può essere ricollegato all'ordine di reso. Esempi CN-10056CN-10057CN-10058 | |||
| Importo del rimborso richiesto RequestedRefundAmount | Il valore monetario totale del rimborso richiesto dal cliente. | ||
| Descrizione Questo attributo rappresenta l'importo del rimborso atteso all'inizio del processo, solitamente basato sul prezzo di acquisto originale. Questo valore funge da base per l''Analisi discrepanze importo rimborso'. Confrontandolo con il rimborso effettivo, è possibile identificare discrepanze dovute a spese di riassortimento o rimborsi parziali per danni, garantendo l'accuratezza finanziaria. Perché è importante Serve come base per misurare l'accuratezza finanziaria confrontando il previsto con l'effettivo rimborsato. Dove trovare Solitamente è l'importo della riga dell'ordine di vendita originale restituito, presente in 'SalesLine.LineAmount'. Esempi 99.99150.0024.50 | |||
| Importo effettivo del rimborso ActualRefundAmount | Il valore monetario finale del rimborso emesso al cliente. | ||
| Descrizione Questo attributo è l'importo finale confermato e rimborsato al cliente, registrato alla contabilizzazione della nota di credito. Si tratta di un valore critico per l'analisi finanziaria, usato direttamente nella dashboard 'Analisi discrepanze importo rimborso' e per i KPI di accuratezza. Aiuta a comprendere l'impatto economico dei resi e gli aggiustamenti effettuati durante l'iter. Perché è importante Rappresenta l'effettivo impatto finanziario del reso, fondamentale per calcolare l'accuratezza del rimborso. Dove trovare Questo valore si trova nei dettagli della transazione della nota di credito contabilizzata, nelle tabelle 'CustTrans' e 'CustInvoiceJour'. Esempi 99.99135.000.00 | |||
| Ora di Fine EndTime | Il `timestamp` che indica quando una specifica attività è stata completata. | ||
| Descrizione L'Ora di Fine rappresenta il timestamp di completamento di un'attività. Mentre StartTime segna l'inizio, EndTime segna la conclusione, permettendo di calcolare il tempo di elaborazione della task specifica. Questo attributo è fondamentale per l'analisi delle performance, specialmente per task come l''Ispezione dell'articolo'. Confrontando StartTime ed EndTime, è possibile misurare con precisione il tempo di lavoro attivo, distinguendolo dai tempi di attesa. Ciò aiuta a individuare inefficienze all'interno delle singole attività. Perché è importante Permette il calcolo del tempo di elaborazione attivo, aiutando a distinguere tra tempi di attesa e tempo di lavoro effettivo. Dove trovare Spesso deve essere derivato, ad esempio dal 'modifiedDateTime' di un cambio di stato o dallo StartTime dell'attività successiva. Esempi 2023-10-26T10:15:00Z2023-10-26T14:45:20Z2023-10-27T09:55:12Z | |||
| Sistema di Origine SourceSystem | Il sistema informativo da cui sono stati estratti i dati dell'evento. | ||
| Descrizione Questo attributo identifica il sistema informativo di origine dei dati, in questo caso principalmente 'Microsoft Dynamics 365'. Nelle grandi aziende, un processo può coinvolgere più sistemi. Specificare la sorgente per ogni evento è fondamentale per la data governance, la risoluzione di problemi tecnici e per avere una visione chiara dell'ecosistema tecnologico analizzato. Perché è importante Fornisce contesto sull'origine dei dati, essenziale per la data governance e per comprendere l'ecosistema dei sistemi coinvolti. Dove trovare Questo è tipicamente un valore statico aggiunto durante il processo di estrazione, trasformazione e caricamento (ETL) dei dati per etichettare l'origine del dataset. Esempi Microsoft Dynamics 365 F&OD365-PROD | |||
| Stato ordine di reso ReturnOrderStatus | Lo stato generale dell'ordine di reso al momento dell'evento. | ||
| Descrizione Questo attributo indica lo stato attuale dell'intestazione dell'ordine di reso (es. 'Aperto', 'Fatturato' o 'Annullato'). Offre una visione d'insieme della fase in cui si trova la pratica. Mentre le attività offrono dettagli granulari, lo stato generale è utile per filtrare e segmentare l'analisi. Ad esempio, è possibile concentrarsi solo sui casi 'Aperti' per valutare il carico di lavoro corrente o studiare il flusso dei casi poi 'Annullati'. Perché è importante Fornisce un riepilogo dello stato della pratica, utile per filtrare i casi e comprenderne l'esito (es. annullamento). Dove trovare Queste informazioni si trovano nel campo 'SalesStatus' o 'DocumentStatus' della 'SalesTable'. Esempi Ordine apertoConsegnatoFatturatoAnnullato | |||
| Stato SLA SlaStatus | Indica se la pratica è stata risolta entro i termini stabiliti dal Service Level Agreement. | ||
| Descrizione Questo attributo calcolato indica lo stato di conformità SLA: 'In tempo' o 'In ritardo'. Si ottiene confrontando la data di chiusura della pratica con la data obiettivo. Semplifica il reporting sulle dashboard, offrendo uno stato immediato invece di costringere l'utente a confrontare manualmente le date. Permette di aggregare rapidamente i dati per calcolare il tasso di aderenza agli SLA globale. Perché è importante Fornisce un indicatore immediato della conformità SLA, facilitando il filtraggio dei casi in ritardo e l'analisi delle cause. Dove trovare Attributo derivato, calcolato confrontando il timestamp della risoluzione finale con il 'RefundSlaTargetDate'. Esempi In TempoIn Ritardo | |||
| Tipo di reso ReturnType | Categorizza il reso in base al risultato atteso, come Rimborso o Sostituzione. | ||
| Descrizione Questo attributo classifica la pratica in base al tipo di risoluzione: 'Rimborso', 'Sostituzione' o 'Riparazione'. Questa categorizzazione è utile per analizzare percorsi diversi. La procedura per un rimborso differisce molto da quella per spedire un articolo sostitutivo. Segmentare per Tipo di Reso permette un'analisi più accurata dei tempi e dei colli di bottiglia specifici per ogni percorso. Perché è importante Consente di segmentare l'analisi in base all'esito previsto, poiché i processi di rimborso e sostituzione hanno passaggi e tempi diversi. Dove trovare Può essere un campo personalizzato o derivare dal codice di disposizione o da transazioni successive, come la creazione di un ordine di sostituzione. Esempi RimborsoSostituzioneCredito in negozio | |||
| Ultimo `Data Update` LastDataUpdate | Il timestamp che indica l'ultimo aggiornamento dei dati del processo. | ||
| Descrizione Questo attributo registra data e ora dell'ultima estrazione dati dal sistema sorgente. Fornisce un riferimento sulla freschezza delle informazioni analizzate. Conoscere l'ultimo aggiornamento è fondamentale per valutare la tempestività dell'analisi. Aiuta gli utenti a interpretare correttamente dashboard e KPI, sapendo se si tratta di dati in tempo reale o di un'istantanea storica. È un elemento chiave per il monitoraggio operativo. Perché è importante Indica quanto sono recenti i dati, garantendo che gli analisti siano consapevoli dell'attualità degli insight di processo. Dove trovare Attributo di metadati memorizzato durante la pipeline di acquisizione, che rappresenta il timestamp di completamento del job ETL. Esempi 2023-11-01T02:00:00Z2023-11-02T02:00:00Z | |||
Attività della gestione resi e rimborsi
| Activity | Descrizione | ||
|---|---|---|---|
| Articolo Ricevuto | Segna la ricezione fisica dell'articolo. Viene registrato quando il giornale di arrivo associato all'ordine di reso viene postato. | ||
| Perché è importante Traguardo critico che segna il passaggio dall'azione del cliente all'elaborazione interna. È il punto di partenza per calcolare i tempi di gestione, come ispezione e disposizione. Dove trovare Il timestamp di registrazione del WMS Journal o dell'Item Arrival Journal associato alla riga del ReturnOrder. Questo aggiorna lo stato dell'inventario in 'Registrato' o 'Ricevuto'. Acquisisci Evento di registrazione del giornale di arrivo articoli collegato alla riga ordine di reso. Tipo di evento explicit | |||
| Codice disposizione applicato | Questa attività rappresenta il completamento dell'ispezione e la decisione sull'esito del prodotto reso. Alla riga viene assegnato un codice come 'Accredito', 'Scarto' o 'Sostituzione'. | ||
| Perché è importante Punto decisionale chiave che determina se procedere con rimborso, sostituzione o rifiuto. I ritardi qui pesano sul tempo di risoluzione totale. Dove trovare Questo evento viene acquisito quando viene popolato il campo DispositionCode nella transazione di magazzino della riga dell'ordine di reso. Acquisisci L'evento di aggiornamento quando viene impostato un DispositionCode per la riga dell'ordine di reso. Tipo di evento explicit | |||
| Nota di Credito Registrata | La nota di credito viene ufficialmente contabilizzata nei registri finanziari, rendendo il credito disponibile per il cliente. Questo segna il completamento dell'azione di rimborso. | ||
| Perché è importante Punto di riferimento finanziario cruciale che conferma l'elaborazione del rimborso. È un'attività chiave per misurare il rispetto degli SLA. Dove trovare Il timestamp di registrazione del giornale delle fatture per l'ordine di reso, che finalizza la nota di credito. Lo stato dell'ordine di reso passa a 'Fatturato'. Acquisisci Registrazione del giornale di fatturazione dell'ordine di reso. Tipo di evento explicit | |||
| Ordine di reso chiuso | L'ordine di reso ha raggiunto il suo stato finale, ovvero tutte le transazioni fisiche e finanziarie sono completate. Ciò avviene solitamente dopo la contabilizzazione della nota di credito o la spedizione della sostituzione. | ||
| Perché è importante Evento finale principale per un reso completato con successo. La durata fino a questo punto indica il tempo totale del ciclo pratica. Dove trovare Deducibile dal cambio di stato di ReturnOrder nel suo valore terminale (es. 'Fatturato' o 'Chiuso'). Indica la fine della lavorazione. Acquisisci Modifica del campo SalesTable.Status o SalesTable.DocumentStatus in uno stato finale. Tipo di evento inferred | |||
| Ordine di reso creato | Questa attività segna l'inizio del processo di reso, con la creazione di un RMA o di un ordine di reso. È un evento esplicito catturato alla creazione di un nuovo record ReturnOrder in Dynamics 365. | ||
| Perché è importante Evento di inizio principale dell'intero processo. Analizzare il tempo da questa attività alle successive rivela il lead time totale e i colli di bottiglia iniziali. Dove trovare Questo evento viene catturato dal timestamp di creazione dell'intestazione ReturnOrder, solitamente nella SalesTable dove SalesType è 'Returned Order'. Acquisisci Evento di creazione del record SalesTable con SalesType = 'Returned Order'. Tipo di evento explicit | |||
| Articolo in sostituzione spedito | Il documento di trasporto dell'articolo sostitutivo viene registrato, indicando la spedizione al cliente. Questo segna il completamento del processo di sostituzione. | ||
| Perché è importante Traguardo fondamentale nella variante di sostituzione, che segna l'adempimento dell'obbligo verso il cliente. Dove trovare La data di registrazione del documento di trasporto per l'ordine di vendita di sostituzione. Questo aggiorna lo stato dell'ordine in 'Consegnato'. Acquisisci Registrazione del documento di trasporto per l'ordine di vendita in sostituzione. Tipo di evento explicit | |||
| Giornale di arrivo creato | Questa attività indica che il magazzino è in attesa dell'arrivo dell'articolo. Consiste nella creazione di un giornale di arrivo, che prepara il sistema alla ricezione fisica. | ||
| Perché è importante Questo passaggio separa la preparazione logistica dalla ricezione fisica, aiutando a pianificare l'arrivo dei resi in magazzino. Dove trovare Creazione di un record in WMSJournalTable con JournalType 'Arrival', collegato alla riga dell'ordine di reso. Acquisisci Timestamp di creazione del record WMSJournalTable per il reso. Tipo di evento explicit | |||
| Nota di Credito Creata | Viene generata una nota di credito basata su una disposizione di tipo 'Accredito', autorizzando il rimborso al cliente. Questo segna l'inizio formale della fase di regolamento finanziario. | ||
| Perché è importante Questa attività segna l'approvazione del rimborso finanziario. Il tempo intercorso tra la disposizione e la nota di credito evidenzia i ritardi amministrativi nell'avvio del rimborso. Dove trovare Può essere dedotto dalla creazione di un nuovo record SalesTable con valore negativo o tramite l'esecuzione del batch job 'Crea nota di credito'. Acquisisci Creazione di una nota di credito, spesso tramite la registrazione della fattura dell'ordine di reso. Tipo di evento explicit | |||
| Ordine di Qualità Generato | Viene creato un ordine di qualità formale, indicando che l'articolo reso deve essere sottoposto a un processo di ispezione strutturato. Comune quando i resi richiedono test dettagliati. | ||
| Perché è importante Questa attività segna l'inizio di un processo di ispezione formale. Monitorare il tempo da questo punto aiuta a misurare l'efficienza del controllo qualità. Dove trovare Timestamp di creazione del record InventQualityOrderTable collegato all'ordine di reso. Acquisisci Creazione di un record InventQualityOrderTable. Tipo di evento explicit | |||
| Ordine di reso annullato | L'ordine di reso viene annullato prima del completamento. Può accadere su richiesta del cliente o se l'articolo non viene mai spedito indietro. | ||
| Perché è importante Rappresenta una fine del processo alternativa e non riuscita. Analizzare perché i resi vengono annullati offre insight sul comportamento dei clienti. Dove trovare Deducibile dal cambio di stato di ReturnOrder in 'Annullato'. Uno stato terminale distinto dalla chiusura con successo. Acquisisci Modifica del campo SalesTable.Status in 'Annullato'. Tipo di evento inferred | |||
| Ordine di reso confermato | Rappresenta la conferma formale dell'ordine di reso nel sistema, che spesso attiva logiche a valle. Questo evento viene solitamente registrato come un'azione esplicita o un cambio di stato nell'intestazione del ReturnOrder. | ||
| Perché è importante La conferma è un passaggio chiave prima dell'inizio della logistica. I ritardi in questa fase indicano arretrati amministrativi o di sistema. Dove trovare Può essere identificato tramite la registrazione della 'Conferma' per l'ordine di reso o da un cambio nel campo DocumentStatus della SalesTable. Acquisisci Esecuzione della funzione 'Conferma ordine cliente' per l'ordine di reso. Tipo di evento explicit | |||
| Ordine di sostituzione creato | Viene creato un nuovo ordine di vendita per inviare un articolo in sostituzione al cliente. Si verifica quando l'azione di disposizione è 'Sostituisci e accredita' o 'Sostituisci e scarta'. | ||
| Perché è importante Questa attività avvia la variante del processo di sostituzione. Monitorare questo percorso separatamente dal rimborso è essenziale per comprenderne i costi e le complessità. Dove trovare La creazione di un nuovo record SalesTable per l'articolo sostitutivo, spesso generato automaticamente e collegato all'ordine di reso originale. Acquisisci Creazione di un nuovo ordine di vendita collegato all'ordine di reso tramite l'azione di disposizione. Tipo di evento explicit | |||
Guide all'Estrazione
Fasi
- Prerequisito: Registrazione di un'applicazione in Azure Active Directory. Prima di connettersi alle API di Dynamics 365, deve registrare un'applicazione nel Suo tenant Azure AD. Conceda a questa applicazione i permessi delegati per accedere a Dynamics 365 Finance & Operations (ad esempio,
Financials.ReadWrite.Allo un permesso personalizzato). - Configurazione dell'ID applicazione in Dynamics 365. In Dynamics 365, vada su Amministrazione di sistema > Impostazioni > Applicazioni Azure Active Directory. Aggiunga l'ID applicazione (client) ottenuto dalla registrazione in Azure AD e lo associ a un account utente che abbia i ruoli di sicurezza necessari per leggere le entità di dati richieste.
- Ottenere un token di accesso OAuth 2.0. Crei uno script, ad esempio in PowerShell o Python, per autenticarsi presso l'endpoint della piattaforma di identità Microsoft. Utilizzi le credenziali dell'applicazione (ID client e segreto) per richiedere un token di accesso per l'URL della risorsa Dynamics 365.
- Identificare l'URL dell'ambiente Dynamics 365. Individui l'URL di base per il Suo ambiente Dynamics 365. L'endpoint dell'API Web apparirà tipicamente così:
https://[YourD365FinanceAndOpsURL].dynamics.com/data. - Costruire ed eseguire richieste API OData. Per ciascuna delle 12 attività richieste, costruisca un URL di richiesta GET OData specifico. Utilizzi
$selectper recuperare solo le colonne necessarie e$filterper specificare l'intervallo di date e le condizioni di stato. Il token di autenticazione ottenuto al punto 3 deve essere incluso come token Bearer nell'intestazione di autorizzazione di ogni richiesta. - Sviluppare uno script di estrazione. Crei uno script che iteri l'elenco delle richieste OData. Questo script deve gestire l'autenticazione, eseguire ogni richiesta GET e archiviare i dati JSON risultanti. Presti attenzione ai limiti delle API e implementi delle pause se necessario.
- Gestire l'impaginazione delle API. Dynamics 365 impagina i risultati di grandi dimensioni. Il Suo script deve verificare la presenza di una proprietà
@odata.nextLinknella risposta. Se esiste, lo script deve effettuare una richiesta successiva a quell'URL per recuperare la pagina di dati successiva, continuando fino a quando non viene più fornito alcunnextLink. - Trasformare e unire i dati. Elabori la risposta JSON di ciascuna delle 12 chiamate API. Per ogni attività, crei un record standardizzato contenente
ReturnCaseId,ActivityName,EventTimee altri attributi. Ad esempio, per l'evento 'Return Order Created', mappiReturnOrderNumbersuReturnCaseId, impostiActivityNamesu 'Return Order Created' e mappicreatedDateTimesuEventTime. Unisca i record trasformati di tutte le chiamate in un'unica tabella o elenco. - Pulire e standardizzare i timestamp. Si assicuri che tutti i valori
EventTimesiano in un formato coerente, preferibilmente UTC (es.YYYY-MM-DDTHH:MM:SSZ). Gestisca eventuali record con timestamp mancanti o non validi. - Esportare l'Event Log finale. Una volta raccolti e trasformati tutti i dati in un unico dataset unificato, lo esporti in un file CSV. Verifichi che le intestazioni delle colonne corrispondano ai requisiti di ProcessMind:
ReturnCaseId,ActivityName,EventTime,ResponsibleUser,DispositionCode, ecc. Il file è pronto per il caricamento.
Configurazione
- URL Endpoint API: l'URL di base per l'istanza di Dynamics 365 Finance & Operations. Segue il formato
https://[YourEnvironmentName].dynamics.com/data. - Applicazione Azure AD: è necessario registrare un'applicazione in Azure AD con un ID client e un segreto. Richiede i permessi API per accedere alle entità di dati di Dynamics 365.
- Filtraggio per intervallo di date: è fondamentale applicare un filtro per intervallo di date in ogni chiamata API utilizzando il parametro OData
$filtersu un campo data pertinente, comecreatedDateTimeomodifiedDateTime. Un intervallo iniziale tipico comprende gli ultimi 3-6 mesi di dati per mantenere l'estrazione gestibile. - Filtro Società: per estrarre i dati di una specifica entità legale, includa il parametro di query
cross-company=truee utilizzi$filtersul campodataAreaId. Ad esempio:?cross-company=true&$filter=dataAreaId eq '[YourCompanyCode]'. - Preferenza impaginazione: utilizzi l'intestazione
Prefer: odata.maxpagesize=[value]nelle Sue richieste per controllare il numero di record restituiti per pagina. Un valore compreso tra1000e5000è comune. Questo aiuta a prevenire i timeout delle API sulle entità di grandi dimensioni. - Limitazione delle API (Throttling): presti attenzione ai limiti di protezione del servizio API di Dynamics 365. Lo script di estrazione dovrebbe includere una logica per gestire le risposte
429 (Too Many Requests), tipicamente implementando un backoff esponenziale o un semplice meccanismo di pausa e riprova.
a Query di Esempio 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 Fasi
- Abilitare l'endpoint TDS: si assicuri che l'endpoint Tabular Data Stream (TDS) sia abilitato per il Suo ambiente Dynamics 365 Dataverse. Un amministratore di sistema può attivarlo nell'interfaccia di amministrazione di Power Platform sotto Ambiente > Impostazioni > Funzionalità.
- Identificare l'URL dell'ambiente: individui l'URL del Suo ambiente. Di solito appare come
yourorg.crm.dynamics.com. Il nome del server dell'endpoint TDS sarà questo URL seguito dalla porta 5558, ad esempio:yourorg.crm.dynamics.com,5558. - Connettersi con un client SQL: utilizzi un client SQL che supporti TDS, come SQL Server Management Studio (SSMS) o Azure Data Studio.
- Autenticazione: si connetta al server utilizzando il Suo account Azure Active Directory con le autorizzazioni appropriate (tipicamente System Administrator o System Customizer) nell'ambiente Dataverse.
- Preparare la query: copi la query SQL completa fornita nella sezione
querydi questo documento in una nuova finestra di query nel Suo client SQL. - Impostare i parametri: individui i segnaposto all'interno della query. Sostituisca
'{StartDate}'e'{EndDate}'con l'intervallo di date desiderato per l'estrazione, ad esempio'2023-01-01'e'2023-12-31'. Inoltre, aggiorni eventuali valori segnaposto per i codici di stato o di disposizione per farli corrispondere alla Sua configurazione specifica di Dynamics 365. - Eseguire la query: esegua la query modificata sul database Dataverse. Il tempo di esecuzione varierà a seconda del volume di dati e dell'intervallo di date selezionato.
- Revisione dei risultati: al termine della query, verifichi il dataset restituito per assicurarsi che contenga le colonne previste:
ReturnCaseId,ActivityName,EventTimee gli attributi consigliati. - Esportare l'Event Log: esporti i risultati della query in un file CSV. La maggior parte dei client SQL dispone di una funzione integrata per salvare i risultati direttamente su file. Si assicuri che il file sia salvato con codifica UTF-8.
- Caricamento su ProcessMind: il file CSV esportato è ora pronto per essere caricato su ProcessMind come nuovo Event Log per l'analisi di Process Mining.
Configurazione
- Prerequisiti: deve disporre di un account utente con almeno l'accesso in lettura alle tabelle Dataverse pertinenti (ad es. SalesTable, SalesLine, CustInvoiceJour). I permessi sono solitamente gestiti tramite ruoli di sicurezza come System Administrator o un ruolo personalizzato con autorizzazioni sufficienti sulle tabelle.
- TDS Endpoint: l'endpoint TDS di Dataverse deve essere abilitato per l'ambiente. Questa funzione consente di eseguire query SQL dirette in sola lettura sul database Dataverse.
- Intervallo di date: la query include i segnaposto
'{StartDate}'e'{EndDate}'. Per l'analisi iniziale, si consiglia un intervallo di date da 3 a 6 mesi per fornire un set di dati rappresentativo senza causare problemi di prestazioni. - Filtro Società: la query così com'è scritta verrà eseguita su tutte le entità legali (società) a cui l'utente ha accesso. Per l'analisi di una singola società, rimuova il commento e aggiunga una clausola
WHEREfiltrando sul campoDATAAREAIDin ogni parte dell'istruzioneUNION ALL, ad esempio,AND st.DATAAREAID = '[YourCompanyID]'. - Segnaposto per logica personalizzata: la query contiene segnaposto come
[YourReplaceCode1]per i codici di disposizione e note sul collegamento degli ordini di sostituzione. Questi devono essere configurati in base al Suo specifico processo aziendale e alla configurazione di Dynamics 365. - Prestazioni: le query dirette contro l'endpoint TDS per dataset di grandi dimensioni possono essere lente. La connessione è ottimizzata per query analitiche, ma join complessi su milioni di righe potrebbero andare in timeout. Si raccomanda di applicare filtri data restrittivi.
a Query di Esempio 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}';