Votre template de données pour le traitement des retours et remboursements
Microsoft Dynamics 365Votre template de données pour le traitement des retours et remboursements
- Champs de données recommandés à collecter
- Étapes clés du processus à suivre
- Guide pour l'extraction de `données`
Attributs de traitement des retours et remboursements
| Nom | Description | ||
|---|---|---|---|
| Heure de l'événement EventTime | L'horodatage indiquant quand une activité ou un événement spécifique s'est produit. | ||
| Description L'heure de l'événement, ou horodatage, enregistre la date et l'heure exactes auxquelles une activité a eu lieu. Chaque activité du journal d'événements a un horodatage correspondant, qui fournit l'ordre chronologique des événements. Cet attribut est essentiel pour toutes les analyses de Process Mining basées sur le temps. Il est utilisé pour calculer les temps de cycle entre les activités, identifier les temps d'attente et les goulots d'étranglement, mesurer la durée globale des cas et vérifier la conformité aux accords de niveau de service (SLA). La précision des horodatages a un impact direct sur la fiabilité de toute analyse de performance. Pourquoi c'est important Cet horodatage est essentiel pour calculer toutes les métriques basées sur la durée, telles que les temps de cycle et les temps d'attente, qui sont fondamentales pour l'analyse des performances. Où obtenir Correspond aux champs de date de création ou de modification dans diverses tables, telles que 'SalesTable.createdDateTime' pour la création de commande ou 'WMSJournalTrans.createdDateTime' pour les journaux d'entrepôt. Exemples 2023-10-26T10:00:00Z2023-10-26T14:30:15Z2023-10-27T09:05:42Z | |||
| ID du dossier de retour ReturnCaseId | L'identifiant unique d'un dossier de retour et de remboursement client, reliant toutes les activités connexes. | ||
| Description L'ID du dossier de retour sert d'identifiant principal pour chaque instance unique de processus de retour. Il relie toutes les activités associées à une demande spécifique de retour ou de remboursement client, de la création initiale de la commande de retour à sa clôture finale. Dans l'analyse des processus, cet ID est fondamental pour reconstituer le parcours de bout en bout de chaque retour. Il permet de suivre le cycle de vie complet, de mesurer les temps de cycle totaux et d'analyser les variations entre les différents cas. Tous les événements, les données et les métriques sont agrégés et corrélés à l'aide de cet identifiant. Pourquoi c'est important C'est l'identifiant de cas essentiel qui connecte toutes les étapes du processus, permettant de tracer et d'analyser chaque retour du début à la fin. Où obtenir C'est généralement le numéro d'Autorisation de Retour de Marchandise (RMA) ou le numéro de commande client de type 'Commande retournée' dans le module 'Ventes et marketing'. Trouvé dans des tables comme 'SalesTable' où 'SalesType' est 'Commande retournée'. Exemples RMA-001234RMA-001235RMA-001236 | |||
| Nom de l'activité ActivityName | Le nom de l'événement commercial ou de la tâche spécifique survenue au sein du processus de retour et de remboursement. | ||
| Description Cet attribut décrit une étape ou un événement spécifique dans le cycle de vie des retours et remboursements, tels que 'Commande de retour créée', 'Article reçu' ou 'Note de crédit comptabilisée'. Chaque activité représente un point distinct dans le processus qui est enregistré dans le système. L'analyse de la séquence et de la fréquence de ces activités est le cœur du process mining. Elle permet la visualisation des cartes de processus, l'identification des goulots d'étranglement entre les étapes et la découverte des variantes de processus courantes et rares. L'ensemble des activités définit le périmètre du processus analysé. Pourquoi c'est important Il définit les étapes du processus, permettant la visualisation du flux de processus et l'identification des goulots d'étranglement, du retravail et des déviations. Où obtenir Il s'agit d'un attribut conceptuel dérivé d'événements système. Il peut être généré en mappant les changements de statut dans des tables comme 'SalesTable' et 'WMSJournalTable' ou des journaux d'événements spécifiques à des noms conviviaux. Exemples Commande de retour crééeArticle ReçuCode de disposition appliquéNote de crédit comptabilisée | |||
| Canal de retour ReturnChannel | La méthode ou le canal par lequel le client a initié le retour. | ||
| Description Cet attribut spécifie le canal utilisé par le client pour initier le processus de retour, par exemple, 'Portail en ligne', 'En magasin', 'Appel au service client' ou 'Courrier'. La segmentation de l'analyse des processus par canal de retour aide à évaluer la performance et l'efficacité de chaque canal. Une entreprise peut comparer les temps de cycle, les coûts et la satisfaction client entre les canaux pour identifier les meilleures pratiques et les domaines d'investissement ou d'amélioration. Ceci est essentiel pour le dashboard 'Performance d'utilisation des canaux de retour'. Pourquoi c'est important Il permet la comparaison des performances entre différents canaux de retour, aidant à optimiser les plus efficaces et les plus rentables. Où obtenir Ces informations peuvent être stockées sur l'en-tête de la commande de retour ('SalesTable') ou dérivées de l'utilisateur qui a créé la commande. Elles peuvent nécessiter une logique personnalisée ou un champ dédié. Exemples Portail webIn-Store KioskSupport Client | |||
| Code de disposition DispositionCode | Un code indiquant le résultat de l'inspection de l'article et l'action suivante à entreprendre. | ||
| Description Le code de disposition est attribué lors de l'inspection qualité d'un article retourné. Il dicte l'étape suivante du processus, telle que 'Crédit', 'Remplacement', 'Mise au rebut' ou 'Retour au client'. Cet attribut est un point de décision critique dans le processus de retour. L'analyse par code de disposition permet aux entreprises de comprendre les résultats des retours, de suivre l'impact financier de la mise au rebut des articles et d'évaluer l'efficacité des différentes voies de résolution, comme le remplacement par rapport au remboursement. Pourquoi c'est important Ce code détermine le chemin qu'un dossier de retour prendra après l'inspection, ce qui est crucial pour analyser les variantes de processus et leurs résultats commerciaux. Où obtenir C'est un champ clé dans le module de gestion de la qualité. Il est associé au traitement des ordres de qualité ou des ordres d'inspection. Exemples CRDTREPL-DRebutRTV | |||
| Code de motif de retour ReturnReasonCode | Le motif fourni par le client pour le retour de l'article. | ||
| Description Le code de motif de retour capture la raison déclarée par le client pour le retour, telle que 'Article défectueux', 'Mauvaise taille', 'Non conforme à la description' ou 'Plus nécessaire'. Ces informations sont généralement recueillies lors de l'initiation du retour. L'analyse des motifs de retour est vitale pour l'analyse des causes profondes. Elle aide les entreprises à identifier les problèmes de qualité des produits, les problèmes liés aux descriptions de produits ou les erreurs logistiques. Les informations issues de ces données peuvent stimuler les améliorations dans la conception des produits, le marketing et les opérations de la chaîne d'approvisionnement afin de réduire les retours futurs. Pourquoi c'est important Fournit un aperçu essentiel des raisons pour lesquelles les retours se produisent, permettant une analyse des causes profondes pour réduire les taux de retour et améliorer la satisfaction client. Où obtenir Ceci est généralement stocké au niveau de la ligne de commande de retour. Recherchez les champs de code de motif dans la table 'SalesLine' pour les commandes de retour. Exemples DEFECTWRONG_ITEMNO_LONGER_WANTEDDAMAGED_IN_TRANSIT | |||
| ID Produit ProductId | L'identifiant unique du produit retourné. | ||
| Description L'ID produit, souvent la référence SKU (Stock Keeping Unit), identifie l'article spécifique qui est retourné par le client. Chaque ligne de commande de retour est associée à un ID produit. L'analyse des retours par produit est essentielle pour identifier les articles avec des taux de retour élevés. Cela peut signaler des problèmes de contrôle qualité, des descriptions de produits imprécises ou des défauts de fabrication. Cette analyse aide à prioriser les enquêtes et les améliorations liées aux produits. Pourquoi c'est important Permet l'analyse des retours par produit, aidant à identifier les articles présentant des problèmes de qualité ou des volumes de retour élevés. Où obtenir Ceci correspond au champ 'ItemId' de la table 'SalesLine' pour la commande de retour. Exemples SKU-A-123SKU-B-456SKU-C-789 | |||
| Utilisateur responsable ResponsibleUser | L'utilisateur ou l'employé qui a effectué ou est responsable d'une activité spécifique. | ||
| Description Cet attribut identifie l'utilisateur individuel responsable de l'exécution d'une étape du processus. Il peut s'agir de l'employé de l'entrepôt qui a réceptionné l'article, de l'inspecteur qualité ou du comptable qui a comptabilisé la note de crédit. L'analyse du processus par utilisateur aide à comprendre la répartition de la charge de travail, à identifier les meilleurs performeurs et à détecter les besoins de formation potentiels. Elle peut également être utilisée pour enquêter sur des cas traités par des individus ou des équipes spécifiques et pour assurer une séparation adéquate des tâches. Pourquoi c'est important Il permet l'analyse de la répartition de la charge de travail, de la performance par individu ou par équipe, et l'identification des opportunités de formation ou d'allocation de ressources. Où obtenir Trouvé dans les champs 'créé par' ou 'modifié par' des enregistrements de transaction, tels que 'SalesTable.createdBy' ou les ID utilisateur liés dans les tables de journal. Exemples Alice.WBob.JChris.P | |||
| Date cible SLA de remboursement RefundSlaTargetDate | La date cible à laquelle le dossier de retour et de remboursement devrait être entièrement résolu. | ||
| Description Cet attribut définit la date limite de l'accord de niveau de service (SLA) pour la résolution d'un dossier de retour. C'est la date à laquelle le client doit avoir une résolution finale, telle qu'un remboursement comptabilisé ou un remplacement expédié. Cette date cible est essentielle pour le suivi des performances par rapport aux engagements de service. Elle est utilisée pour calculer l'indicateur clé de performance (KPI) 'Taux de respect des SLA de résolution' et alimenter le 'Dashboard de performance des SLA de résolution des remboursements'. La comparaison de cette date avec la date d'achèvement réelle du processus permet à l'entreprise d'identifier les violations des SLA et de gérer de manière proactive les dossiers en attente. Pourquoi c'est important C'est la référence par rapport à laquelle la performance du processus est mesurée, permettant le suivi de la conformité aux SLA et l'identification des cas en retard. Où obtenir Ce n'est peut-être pas un champ standard. Il est souvent calculé en fonction de la date de création du retour plus une période SLA prédéfinie (par exemple, 14 jours). Il pourrait être stocké dans un champ personnalisé. Exemples 2023-11-10T23:59:59Z2023-11-15T23:59:59Z | |||
| Dernière mise à jour des données LastDataUpdate | L'horodatage indiquant la dernière fois que les données du processus ont été rafraîchies. | ||
| Description Cet attribut enregistre la date et l'heure de la dernière extraction des données du système source et de leur mise à jour dans l'outil de process mining. Il fournit un point de référence pour la fraîcheur des données analysées. Connaître la dernière heure de mise à jour des données est important pour comprendre l'actualité de l'analyse. Cela aide les utilisateurs à interpréter correctement les dashboards et les KPI, en sachant s'ils consultent des données en temps réel ou un instantané à un moment précis. C'est essentiel pour le suivi opérationnel. Pourquoi c'est important Indique la fraîcheur des données, garantissant que les analystes sont conscients de l'actualité de leurs insights processus. Où obtenir Il s'agit d'un attribut de métadonnées généré et stocké pendant le pipeline d'ingestion de données, représentant généralement l'horodatage de l'achèvement du travail ETL. Exemples 2023-11-01T02:00:00Z2023-11-02T02:00:00Z | |||
| Est conforme à la politique IsPolicyAdherent | Un indicateur signalant si l'approbation du retour est conforme aux politiques de retour établies. | ||
| Description Cet attribut booléen calculé indique si un retour répond à tous les critères définis dans la politique de retour de l'entreprise. Cela pourrait être basé sur des facteurs tels que la fenêtre de retour, l'état de l'article ou le motif du retour. Cet attribut prend directement en charge le dashboard 'Vue d'ensemble de la conformité des approbations de retour' et le KPI 'Taux d'approbation des retours conformes'. Il permet à l'entreprise de quantifier la conformité aux politiques, d'identifier les cas approuvés comme exceptions et d'analyser les raisons et la fréquence de ces exceptions. Ceci est vital pour la gouvernance et le contrôle des coûts. Pourquoi c'est important Il mesure directement la conformité aux règles métier, aidant à identifier et à réduire les approbations de retour non conformes qui peuvent entraîner une perte de revenus. Où obtenir Il s'agit d'un attribut dérivé. La logique devrait être construite en comparant les attributs du retour (par exemple, date de retour vs. date d'achat, motif du retour) par rapport à des règles métier prédéfinies. Exemples truefaux | |||
| Heure de fin EndTime | L'horodatage indiquant la date et l'heure de réalisation d'une activité spécifique. | ||
| Description L'heure de fin représente l'horodatage de l'achèvement d'une activité. Tandis que StartTime marque le début, EndTime marque la conclusion, permettant le calcul du temps de traitement pour cette tâche spécifique. Cet attribut est crucial pour une analyse de performance détaillée, en particulier pour les tâches ayant une durée mesurable, comme 'Inspection des articles'. En comparant StartTime et EndTime, les analystes peuvent mesurer précisément le temps de traitement actif des tâches, le distinguant du temps d'attente entre les tâches. Cela aide à identifier les inefficacités au sein d'activités spécifiques, et pas seulement entre elles. Pourquoi c'est important Il permet le calcul du temps de traitement actif pour les activités individuelles, aidant à différencier le temps d'attente du temps de travail réel. Où obtenir Ceci doit souvent être dérivé. Par exemple, il pourrait s'agir du 'modifiedDateTime' d'un changement de statut qui conclut une activité, ou de la StartTime de l'activité subséquente. Exemples 2023-10-26T10:15:00Z2023-10-26T14:45:20Z2023-10-27T09:55:12Z | |||
| ID client CustomerId | L'identifiant unique du client qui a initié le retour. | ||
| Description L'ID client est l'identifiant unique du compte client associé au retour. Il relie la transaction de retour à un client spécifique dans le CRM ou la base de données clients. L'analyse des retours par client permet d'identifier les clients présentant une activité de retour inhabituellement élevée, ce qui pourrait indiquer un comportement frauduleux ou une insatisfaction chronique. Elle peut également être utilisée pour segmenter les clients, par exemple, pour offrir des services de retour premium aux clients de grande valeur. Pourquoi c'est important Il relie le processus de retour à un client spécifique, permettant une analyse au niveau client et l'identification de modèles de retour ou de fraudes potentielles. Où obtenir Ceci est le champ 'CustAccount' de la 'SalesTable' pour la commande de retour. Exemples CUST-00045CUST-00192CUST-00315 | |||
| ID de l'entrepôt WarehouseId | L'identifiant de l'entrepôt ou du lieu où l'article retourné est réceptionné. | ||
| Description Cet attribut identifie l'entrepôt physique ou le centre de retour spécifique qui traite l'article retourné. Différents emplacements peuvent avoir des processus, des ressources ou des niveaux de performance différents. L'analyse du processus par entrepôt permet d'établir des comparatifs de performance entre les sites. Elle peut aider à identifier les installations les plus efficaces pour traiter les retours, à mettre en évidence les goulots d'étranglement régionaux et à éclairer les décisions concernant l'allocation des ressources et la standardisation des processus à travers le réseau logistique. Pourquoi c'est important Permet la comparaison des performances entre différents entrepôts ou centres de retour, aidant à identifier les goulots d'étranglement régionaux ou les meilleures pratiques. Où obtenir Ces informations sont stockées dans le champ 'InventLocationId' des transactions liées à l'inventaire, telles que le journal d'arrivée ('WMSJournalTable') ou sur la 'SalesLine'. Exemples WH-ESTWH-WESTCENTRAL-DC | |||
| ID de note de crédit CreditNoteId | L'identifiant unique du document de note de crédit créé pour un remboursement. | ||
| Description Lorsqu'un remboursement est traité, un document financier appelé note de crédit ou avoir est généré. Cet attribut stocke l'ID unique de ce document. Cet ID fournit un lien direct entre le processus de retour opérationnel et les enregistrements financiers du système comptable. Il est utile à des fins d'audit et pour des analyses approfondies des écarts financiers, permettant à un analyste de tracer un cas de retour jusqu'à la transaction financière spécifique qui l'a réglé. Pourquoi c'est important Il relie le processus opérationnel de retour à la transaction financière correspondante, ce qui est crucial pour l'audit et la réconciliation financière. Où obtenir Le numéro de note de crédit se trouve généralement dans le champ 'InvoiceId' de la table 'CustInvoiceJour', où le type de transaction est 'Note de crédit'. Il peut être lié à la commande de retour. Exemples CN-10056CN-10057CN-10058 | |||
| Montant de remboursement demandé RequestedRefundAmount | La valeur monétaire totale du remboursement demandé par le client. | ||
| Description Cet attribut représente le montant initial du remboursement tel que demandé ou prévu au début du processus de retour. Il est généralement basé sur le prix d'achat original des articles retournés. Cette valeur sert de base de référence pour l''Analyse des écarts de montant de remboursement'. En comparant le montant demandé au montant réellement remboursé, l'entreprise peut identifier les écarts causés par les frais de réapprovisionnement, les remboursements partiels pour les marchandises endommagées ou d'autres ajustements. Cela aide à surveiller la précision financière et le respect des politiques. Pourquoi c'est important Il sert de référence pour mesurer la précision financière en le comparant au montant réel du remboursement traité. Où obtenir C'est généralement le montant de la ligne ou le montant total de la ligne de commande de vente originale retournée, trouvé dans 'SalesLine.LineAmount'. Exemples 99.99150.0024.50 | |||
| Montant réel du remboursement ActualRefundAmount | La valeur monétaire finale du remboursement émis au client. | ||
| Description Cet attribut est le montant final confirmé qui a été remboursé au client. Cette valeur est enregistrée lorsque la note de crédit est créée et comptabilisée. C'est un attribut critique pour l'analyse financière et il est directement utilisé dans le dashboard 'Analyse des écarts de montant de remboursement' et le KPI 'Taux de précision du montant du remboursement'. L'analyse de ces données permet de comprendre l'impact financier des retours et de tout ajustement effectué pendant le processus. Pourquoi c'est important Ceci représente l'impact financier réel du retour et est crucial pour calculer la précision du remboursement et comprendre les résultats financiers. Où obtenir Cette valeur peut être trouvée dans les détails de la transaction de note de crédit comptabilisée. Elle est liée aux tables 'CustTrans' et 'CustInvoiceJour' pour la note de crédit. Exemples 99.99135.000.00 | |||
| Statut de la commande de retour ReturnOrderStatus | Le statut global de la commande de retour au moment de l'événement. | ||
| Description Cet attribut indique le statut actuel de l'en-tête de la commande de retour, tel que 'Ouvert', 'Facturé' ou 'Annulé'. Il offre une vue d'ensemble de l'emplacement du dossier dans son cycle de vie. Alors que les activités fournissent des étapes de processus granulaires, le statut global est utile pour filtrer et segmenter les cas. Par exemple, un analyste pourrait vouloir se concentrer uniquement sur les cas 'Ouverts' pour comprendre la charge de travail actuelle, ou analyser le flux de processus des cas qui sont finalement 'Annulés'. Pourquoi c'est important Fournit un résumé de haut niveau de l'état du cas, utile pour filtrer les cas et comprendre les résultats tels que les annulations. Où obtenir Ces informations se trouvent dans le champ 'SalesStatus' ou 'DocumentStatus' de la 'SalesTable'. Exemples Commande ouverteLivré`Facturé`Annulé | |||
| Statut SLA SlaStatus | Indique si le cas a été résolu dans les délais cibles de l'accord de niveau de service. | ||
| Description Cet attribut calculé fournit un statut simple de conformité aux SLA, généralement 'À temps' ou 'En retard'. Il est déterminé en comparant l'horodatage de l'activité finale (par exemple, 'Commande de retour clôturée') avec la 'RefundSlaTargetDate'. Cet attribut simplifie les rapports de performance sur des dashboards tels que 'Performance des SLA de résolution des remboursements'. Au lieu d'exiger des utilisateurs de comparer des dates, il fournit un statut direct et facilement compréhensible. Cela permet un filtrage et une agrégation rapides pour calculer le 'Taux de respect des SLA de résolution' global. Pourquoi c'est important Fournit un indicateur simple et rapide de conformité aux SLA, facilitant le filtrage des cas en retard et l'analyse des causes profondes des retards. Où obtenir Ceci est un attribut dérivé, calculé en comparant l'horodatage de l'activité de résolution finale avec l'attribut 'RefundSlaTargetDate'. Exemples À tempsEn retard | |||
| Système source SourceSystem | Le système d'information à partir duquel les données d'événement ont été extraites. | ||
| Description Cet attribut identifie le système d'information source d'où proviennent les données. Dans ce contexte, il s'agira principalement de 'Microsoft Dynamics 365'. Dans les grandes organisations, un processus peut s'étendre sur plusieurs systèmes. La spécification du système source pour chaque événement est cruciale pour la gouvernance des données, la résolution des problèmes d'extraction de données et la compréhension du paysage technologique du processus. Elle confirme l'origine des données analysées. Pourquoi c'est important Il fournit un contexte crucial sur l'origine des données, essentiel pour la gouvernance des données, la validation et la compréhension du paysage système du processus. Où obtenir C'est généralement une valeur statique ajoutée pendant le processus d'extraction, transformation et chargement des données (ETL) pour étiqueter l'origine de l'ensemble de données. Exemples `Microsoft Dynamics 365 F&O`D365-PROD | |||
| Type de retour ReturnType | Catégorise le retour en fonction du résultat attendu, tel qu'un remboursement ou un remplacement. | ||
| Description Cet attribut classe le dossier de retour en fonction du type de résolution recherché par le client ou offert par l'entreprise. Les types courants incluent un 'Remboursement' monétaire, un échange pour un article de 'Remplacement' ou une 'Réparation'. Cette catégorisation est utile pour analyser différents chemins de processus. Le processus d'émission d'un remboursement est significativement différent du processus d'expédition d'un article de remplacement. La segmentation par type de retour permet une analyse plus précise des temps de cycle et des goulots d'étranglement spécifiques à chaque chemin de résolution. Pourquoi c'est important Il permet la segmentation de l'analyse en fonction du résultat attendu, car les processus de remboursement et de remplacement ont des étapes et des temps de cycle différents. Où obtenir Ceci peut être un champ personnalisé sur l'en-tête de la commande de retour ou dérivé en fonction du code de disposition ou des transactions subséquentes comme la création d'une commande client de remplacement. Exemples RemboursementRemplacementAvoir en magasin | |||
Activités de traitement des retours et remboursements
| Activité | Description | ||
|---|---|---|---|
| Article Reçu | Marque la réception physique de l'article retourné à l'entrepôt ou au centre de retour désigné. Ceci est enregistré lorsque le journal d'arrivée associé à l'ordre de retour est validé. | ||
| Pourquoi c'est important C'est un jalon critique qui fait passer le processus de l'action client au traitement interne. C'est le point de départ pour le calcul de tous les temps de traitement internes, tels que l'inspection et la disposition. Où obtenir L'horodatage de la comptabilisation du Journal WMS ou du Journal d'arrivée des articles associé à la ligne de commande de retour. Cela met à jour les transactions d'inventaire à un statut 'Enregistré' ou 'Reçu'. Capture Événement de validation du journal d'arrivée d'article lié à la ligne de l'ordre de retour. Type d'événement explicit | |||
| Code de disposition appliqué | Cette activité représente l'achèvement de l'inspection et la décision sur la marche à suivre avec l'article retourné. Un code de disposition, tel que 'Crédit', 'Mise au rebut' ou 'Remplacement', est attribué à la ligne de retour. | ||
| Pourquoi c'est important C'est un point de décision clé qui détermine le chemin de processus subséquent, qu'il s'agisse d'un remboursement, d'un échange ou d'un rejet. Les retards à ce niveau peuvent impacter significativement le temps de résolution global. Où obtenir Cet événement est capturé lorsque le champ DispositionCode est renseigné sur la transaction d'inventaire de la ligne de commande de retour ou le journal associé. Capture L'événement de mise à jour lorsqu'un DispositionCode est défini pour la ligne de commande de retour. Type d'événement explicit | |||
| Commande de retour clôturée | La commande de retour a atteint son état final, ce qui signifie que toutes les transactions physiques et financières sont complètes. Cela se produit généralement après la comptabilisation de la note de crédit ou l'expédition du remplacement. | ||
| Pourquoi c'est important C'est l'événement de fin principal pour un processus de retour réussi. La durée entre la création et ce point représente le temps de cycle total du cas. Où obtenir Déduit du changement du champ de statut ReturnOrder à sa valeur terminale, telle que 'Facturé' ou 'Clôturé'. Cela indique qu'aucun traitement ultérieur n'est attendu. Capture Modification du champ SalesTable.Status ou SalesTable.DocumentStatus vers un état final. Type d'événement inferred | |||
| Commande de retour créée | Cette activité marque l'initiation du processus de retour, où une Autorisation de Retour de Marchandise (RMA) ou une commande de retour est créée dans le système. Il s'agit d'un événement explicite capturé lors de la création d'un nouvel enregistrement de commande de retour dans Dynamics 365. | ||
| Pourquoi c'est important C'est l'événement de début principal pour l'ensemble du processus de retours. L'analyse du temps écoulé entre cette activité et les autres révèle le délai global du processus et aide à identifier les goulots d'étranglement précoces. Où obtenir Cet événement est capturé à partir de l'horodatage de création de l'en-tête de la commande de retour. On le trouve généralement dans la SalesTable où le SalesType est 'Commande retournée'. Capture Événement de création de l'enregistrement SalesTable avec SalesType = 'Commande retournée'. Type d'événement explicit | |||
| Note de crédit comptabilisée | La note de crédit est officiellement comptabilisée dans les grands livres financiers, rendant le crédit disponible au client. Cela signifie l'achèvement de l'action de remboursement du point de vue de l'entreprise. | ||
| Pourquoi c'est important C'est un jalon financier crucial, confirmant que le remboursement a été traité dans le système. C'est souvent une activité clé pour mesurer la conformité au SLA de remboursement. Où obtenir L'horodatage de la comptabilisation du journal des factures pour la commande de retour, qui finalise la note de crédit. Le statut de la commande de retour passe à 'Facturé'. Capture Validation du journal des factures de l'ordre de retour. Type d'événement explicit | |||
| Article de remplacement expédié | Le bordereau d'expédition de l'article de remplacement est comptabilisé, indiquant qu'il a été expédié au client. Cela marque l'achèvement du processus d'exécution de l'échange. | ||
| Pourquoi c'est important C'est un jalon clé dans la variante d'échange, représentant l'exécution de l'obligation de l'entreprise envers le client. C'est crucial pour suivre les temps de cycle d'échange. Où obtenir La date de comptabilisation du journal des bordereaux d'expédition pour la commande client de remplacement. Cela met à jour le statut de la commande à 'Livré'. Capture Validation du bordereau d'expédition pour l'ordre de vente de remplacement. Type d'événement explicit | |||
| Commande de remplacement créée | Une nouvelle commande client est créée pour envoyer un article de remplacement au client. Cette activité se produit lorsque l'action de disposition est 'Remplacer et créditer' ou 'Remplacer et mettre au rebut'. | ||
| Pourquoi c'est important Cette activité initie la variante du processus d'échange. Suivre ce chemin séparément du chemin de remboursement est essentiel pour comprendre les complexités et les coûts des échanges. Où obtenir La création d'un nouvel enregistrement SalesTable pour l'article de remplacement, souvent généré automatiquement et lié à la commande de retour originale. Capture Création d'une nouvelle commande client liée à l'ordre de retour via l'action de disposition. Type d'événement explicit | |||
| Commande de retour annulée | La commande de retour est annulée avant son achèvement. Cela peut être dû à une demande du client ou si l'article n'a jamais été retourné. | ||
| Pourquoi c'est important Ceci représente une fin alternative et infructueuse du processus. L'analyse des raisons pour lesquelles les retours sont annulés peut fournir des informations sur le comportement des clients ou les échecs de processus. Où obtenir Déduit du changement du champ de statut ReturnOrder à 'Annulé'. Il s'agit d'un état terminal distinct d'une commande clôturée avec succès. Capture Modification du champ SalesTable.Status à 'Annulé'. Type d'événement inferred | |||
| Commande de retour confirmée | Représente la confirmation formelle de la commande de retour dans le système, déclenchant souvent une logique en aval. Ceci est généralement enregistré comme une action explicite ou un changement de statut sur l'en-tête de la commande de retour. | ||
| Pourquoi c'est important La confirmation est une étape clé avant le début de la logistique. Des retards entre la création et la confirmation peuvent indiquer des arriérés administratifs ou liés au système. Où obtenir Ceci peut être identifié par la comptabilisation du journal de 'Confirmation' pour la commande de retour ou un changement dans le champ DocumentStatus de la SalesTable. Capture Exécution de la fonction 'Confirmer la commande client' pour l'ordre de retour. Type d'événement explicit | |||
| Journal d'arrivée créé | Cette activité signifie que l'entrepôt s'attend à recevoir l'article retourné. C'est la création d'un journal d'arrivée, qui prépare le système à la réception physique des marchandises. | ||
| Pourquoi c'est important Cette étape sépare la préparation logistique de la réception physique réelle. Elle aide à analyser la préparation de l'entrepôt et à planifier les retours entrants. Où obtenir Création d'un enregistrement dans la WMSJournalTable avec JournalType 'Arrival'. Le journal est lié à la ligne de l'ordre de retour. Capture Horodatage de création de l'enregistrement WMSJournalTable pour le retour. Type d'événement explicit | |||
| Note de crédit créée | Une note de crédit est générée sur la base d'une disposition 'Crédit', autorisant un remboursement au client. C'est le début formel de la partie règlement financier du processus. | ||
| Pourquoi c'est important Cette activité marque l'approbation du remboursement financier. Le temps entre la disposition et la création de la note de crédit met en évidence les retards administratifs dans l'initiation du remboursement. Où obtenir Ceci peut être déduit de la création d'un nouvel enregistrement SalesTable avec une valeur négative, lié à la commande de retour originale, ou en exécutant la tâche par lots 'Créer une note de crédit'. Capture Création d'une note de crédit, souvent par la validation de la facture de l'ordre de retour. Type d'événement explicit | |||
| Ordre de Qualité Généré | Un ordre de qualité formel est créé, indiquant que l'article retourné doit subir un processus d'inspection structuré. Ceci est courant dans les scénarios où les retours nécessitent des tests détaillés ou des vérifications par rapport aux normes de qualité. | ||
| Pourquoi c'est important Cette activité marque le début d'un processus d'inspection formel. Le suivi du temps à partir de ce point permet de mesurer l'efficacité et la durée du workflow d'assurance qualité. Où obtenir Horodatage de création d'un enregistrement dans l'InventQualityOrderTable lié à l'ordre de retour. Capture Création d'un enregistrement InventQualityOrderTable. Type d'événement explicit | |||
Guides d'extraction
Étapes
- Prérequis : Enregistrer une application dans Azure Active Directory. Avant de pouvoir vous connecter à l'API Dynamics 365, vous devez enregistrer une application dans votre tenant Azure AD. Accordez à cette application des autorisations déléguées pour accéder à Dynamics 365 Finance & Operations, par exemple,
Financials.ReadWrite.Allou une permission personnalisée. - Configurer l'ID d'application dans Dynamics 365. Dans Dynamics 365, accédez à Administration système > Configuration > Applications Azure Active Directory. Ajoutez l'ID de l'application (client) de votre enregistrement d'application Azure AD et associez-le à un compte utilisateur qui dispose des rôles de sécurité nécessaires pour lire les entités de données requises.
- Obtenir un jeton d'accès OAuth 2.0. Écrivez un script, par exemple en PowerShell ou Python, pour vous authentifier auprès du point de terminaison de la plateforme d'identité Microsoft. Utilisez les identifiants de l'application (ID client et secret) pour demander un jeton d'accès pour l'URL de ressource Dynamics 365.
- Identifier l'URL de votre environnement Dynamics 365. Localisez l'URL de base de votre environnement Dynamics 365. Le point de terminaison de l'API Web ressemblera généralement à ceci :
https://[YourD365FinanceAndOpsURL].dynamics.com/data. - Construire et exécuter des requêtes API OData. Pour chacune des 12 activités requises, construisez une URL de requête GET OData spécifique. Utilisez
$selectpour ne récupérer que les colonnes requises et$filterpour spécifier la plage de dates et les conditions de statut. Le jeton d'authentification obtenu à l'étape 3 doit être inclus comme jeton Bearer dans l'en-tête d'autorisation de chaque requête. - Développer un script d'extraction. Créez un script qui itère à travers la liste des requêtes OData. Ce script doit gérer l'authentification, exécuter chaque requête GET et stocker les données JSON résultantes. Soyez attentif aux limites de l'API et implémentez des pauses si nécessaire.
- Gérer la pagination de l'API. Dynamics 365 pagine les résultats volumineux. Votre script doit vérifier la propriété
@odata.nextLinkdans la réponse. Si elle existe, votre script doit faire une requête subséquente à cette URL pour récupérer la page suivante de données, et continuer jusqu'à ce qu'aucunnextLinkne soit fourni. - Transformer et unir les données. Traitez la réponse JSON de chacun des 12 appels API. Pour chaque activité, créez un enregistrement standardisé contenant
ReturnCaseId,ActivityName,EventTimeet d'autres attributs. Par exemple, pour l'événement 'Return Order Created', mappez leReturnOrderNumberàReturnCaseId, définissezActivityNamesur 'Return Order Created' et mappezcreatedDateTimeàEventTime. Combinez les enregistrements transformés de tous les appels dans une seule liste ou table. - Nettoyer et standardiser les horodatages. Assurez-vous que toutes les valeurs
EventTimesont dans un format cohérent, de préférence UTC avec un format tel queYYYY-MM-DDTHH:MM:SSZ. Gérez les enregistrements avec des horodatages manquants ou invalides si nécessaire. - Exporter le journal d'événements final. Une fois toutes les données collectées et transformées en un ensemble de données unifié, exportez-le vers un fichier CSV. Assurez-vous que les en-têtes de colonne correspondent aux exigences de ProcessMind :
ReturnCaseId,ActivityName,EventTime,ResponsibleUser,DispositionCode, etc. Le fichier est maintenant prêt à être téléchargé.
Configuration
- API Endpoint URL: L'URL de base de votre instance Dynamics 365 Finance & Operations. Elle suit le format
https://[YourEnvironmentName].dynamics.com/data. - Azure AD Application: Une application doit être enregistrée dans Azure AD avec un ID client et un secret. Elle nécessite des autorisations API pour accéder aux entités de données Dynamics 365.
- Date Range Filtering: Il est essentiel d'appliquer un filtre de plage de dates dans chaque appel API en utilisant le paramètre OData
$filtersur un champ de date pertinent, tel quecreatedDateTimeoumodifiedDateTime. Une plage de départ typique est les 3 à 6 derniers mois de données pour que l'extraction reste gérable. - Company Filter: Pour extraire les données d'une entité juridique spécifique, incluez le paramètre de requête
cross-company=true, puis utilisez$filtersur le champdataAreaId. Par exemple,?cross-company=true&$filter=dataAreaId eq '[YourCompanyCode]'. - Pagination Preference: Utilisez l'en-tête
Prefer: odata.maxpagesize=[value]dans vos requêtes pour contrôler le nombre d'enregistrements retournés par page. Une valeur de1000à5000est courante. Cela aide à prévenir les expirations de délai API sur les grandes entités. - API Throttling: Soyez conscient des limites de protection de service de l'API Dynamics 365. Le script d'extraction doit inclure une logique pour gérer les réponses
429 (Too Many Requests), typiquement en implémentant un mécanisme de recul exponentiel ou une simple pause et réessai.
a Exemple de requête 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 Étapes
- Activer le point de terminaison TDS: Assurez-vous que le point de terminaison TDS (Tabular Data Stream) est activé pour votre environnement Dynamics 365 Dataverse. Un administrateur système peut l'activer dans le centre d'administration Power Platform sous Environnement > Paramètres > Fonctionnalités.
- Identifier l'URL de l'environnement: Trouvez l'URL de votre environnement. Elle ressemble généralement à
yourorg.crm.dynamics.com. Le nom du serveur du point de terminaison TDS sera cette URL avec le port 5558, par exemple,yourorg.crm.dynamics.com,5558. - Se connecter avec un client SQL: Utilisez un client SQL compatible avec TDS, tel que SQL Server Management Studio (SSMS) ou Azure Data Studio.
- Authentification: Connectez-vous au serveur en utilisant votre compte Azure Active Directory qui dispose des autorisations appropriées, généralement Administrateur système ou Personnalisateur système, dans l'environnement Dataverse.
- Préparer la requête: Copiez la requête SQL complète fournie dans la section
queryde ce document dans une nouvelle fenêtre de requête de votre client SQL. - Définir les paramètres: Localisez les espaces réservés dans la requête. Remplacez
'{StartDate}'et'{EndDate}'par la plage de dates souhaitée pour l'extraction, par exemple,'2023-01-01'et'2023-12-31'. Mettez également à jour toutes les valeurs des espaces réservés pour les codes de statut ou les codes de disposition afin qu'elles correspondent à votre configuration spécifique de Dynamics 365. - Exécuter la requête: Exécutez la requête modifiée par rapport à la base de données Dataverse. Le temps d'exécution variera en fonction du volume de données et de la plage de dates sélectionnée.
- Examiner les résultats: Une fois la requête terminée, examinez l'ensemble de données retourné pour vous assurer qu'il contient les colonnes attendues :
ReturnCaseId,ActivityName,EventTime, et les attributs recommandés. - Exporter le journal d'événements: Exportez les résultats de la requête vers un fichier CSV. La plupart des clients SQL ont une fonction intégrée pour enregistrer les résultats directement dans un fichier. Assurez-vous que le fichier est enregistré avec l'encodage UTF-8.
- Télécharger vers ProcessMind: Le fichier CSV exporté est maintenant prêt à être téléchargé vers ProcessMind en tant que nouveau journal d'événements pour l'analyse de Process Mining.
Configuration
- Prérequis: Vous devez disposer d'un compte utilisateur avec au moins un accès en lecture aux tables Dataverse pertinentes (par exemple, SalesTable, SalesLine, CustInvoiceJour). Les autorisations sont généralement gérées via des rôles de sécurité comme Administrateur système ou un rôle personnalisé avec des autorisations de table suffisantes.
- Point de terminaison TDS: Le point de terminaison TDS Dataverse doit être activé pour l'environnement. Cette fonctionnalité permet des requêtes SQL directes en lecture seule sur la base de données Dataverse.
- Plage de dates: La requête inclut les espaces réservés
'{StartDate}'et'{EndDate}'. Pour une analyse initiale, une plage de dates de 3 à 6 mois est recommandée pour fournir un ensemble de données représentatif sans causer de problèmes de performance. - Filtre par société: La requête, telle qu'écrite, s'exécutera sur toutes les entités juridiques (sociétés) auxquelles l'utilisateur a accès. Pour une analyse d'une seule société, décommentez et ajoutez une clause
WHEREfiltrant sur le champDATAAREAIDdans chaque partie de l'instructionUNION ALL, par exemple,AND st.DATAAREAID = '[YourCompanyID]'. - Espaces réservés pour la logique personnalisée: La requête contient des espaces réservés comme
[YourReplaceCode1]pour les codes de disposition et des notes sur la liaison des commandes de remplacement. Ceux-ci doivent être configurés en fonction de votre processus métier spécifique et de la configuration de Dynamics 365. - Performance: Les requêtes directes sur le point de terminaison TDS pour de grands ensembles de données peuvent être lentes. La connexion est optimisée pour les requêtes analytiques, mais les jointures complexes sur des millions de lignes peuvent entraîner un dépassement de délai. Il est recommandé d'appliquer des filtres de date stricts.
a Exemple de requête 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}';