Su plantilla de datos para el procesamiento de devoluciones y reembolsos
Su plantilla de datos para el procesamiento de devoluciones y reembolsos
- Campos de datos recomendados para recopilar
- Pasos clave del proceso a rastrear
- Guía para la extracción de `datos`
Atributos de procesamiento de devoluciones y reembolsos
| Nombre | Descripción | ||
|---|---|---|---|
| Hora del Evento EventTime | El timestamp que indica cuándo ocurrió una actividad o evento específico. | ||
| Descripción Event Time, o el timestamp, registra la fecha y hora exactas en que tuvo lugar una actividad. Cada actividad en el registro de eventos tiene un timestamp correspondiente, que proporciona el orden cronológico de los eventos. Este atributo es crítico para todo análisis de process mining basado en el tiempo. Se utiliza para calcular los tiempos de ciclo entre actividades, identificar tiempos de espera y cuellos de botella, medir la duración total del caso y verificar el cumplimiento de los acuerdos de nivel de servicio (SLA). La precisión de los timestamps impacta directamente la fiabilidad de cualquier análisis de rendimiento. Por qué es importante Esta marca de tiempo es esencial para calcular todas las métricas basadas en la duración, como los tiempos de ciclo y los tiempos de espera, que son fundamentales para el análisis del rendimiento. Dónde obtener Corresponde a los campos de fecha de creación o modificación de varias tablas, como 'SalesTable.createdDateTime' para la creación de pedidos o 'WMSJournalTrans.createdDateTime' para diarios de almacén. Ejemplos 2023-10-26T10:00:00Z2023-10-26T14:30:15Z2023-10-27T09:05:42Z | |||
| ID de caso de devolución ReturnCaseId | El identificador único para el caso de devolución y reembolso de un cliente, que vincula todas las actividades relacionadas. | ||
| Descripción El ID de caso de devolución sirve como identificador principal para cada instancia única de proceso de devolución. Vincula todas las actividades asociadas con una solicitud específica de devolución o reembolso de un cliente, desde la creación inicial de la orden de devolución hasta su cierre final. En el análisis de procesos, este ID es fundamental para reconstruir el recorrido completo de cada devolución. Permite el seguimiento del ciclo de vida completo, la medición de los tiempos de ciclo totales y el análisis de variaciones entre diferentes casos. Todos los eventos, datos y métricas se agregan y correlacionan utilizando este identificador. Por qué es importante Este es el identificador esencial del caso que conecta todos los pasos del proceso, haciendo posible rastrear y analizar cada devolución de principio a fin. Dónde obtener Este es típicamente el número de Autorización de Devolución de Material (RMA) o el número de Orden de Venta de tipo 'Orden Devuelta' en el módulo de 'Ventas y marketing'. Se encuentra en tablas como 'SalesTable' donde 'SalesType' es 'Returned Order'. Ejemplos RMA-001234RMA-001235RMA-001236 | |||
| Nombre de la Actividad ActivityName | El nombre del evento de negocio o tarea específica que ocurrió dentro del proceso de devolución y reembolso. | ||
| Descripción Este atributo describe un paso o evento específico en el ciclo de vida de devolución y reembolso, como 'Orden de Devolución Creada', 'Artículo Recibido' o 'Nota de Crédito Contabilizada'. Cada actividad representa un punto distinto en el proceso que se registra en el sistema. Analizar la secuencia y frecuencia de estas actividades es el núcleo del Process Mining. Permite la visualización de mapas de procesos, la identificación de cuellos de botella entre pasos y el descubrimiento de variantes de proceso comunes y poco comunes. El conjunto de actividades define el alcance del proceso que se analiza. Por qué es importante Define los pasos del proceso, permitiendo la visualización del flujo del proceso y la identificación de cuellos de botella, retrabajos y desviaciones. Dónde obtener Este es un atributo conceptual derivado de eventos del sistema. Puede generarse mapeando cambios de estado en tablas como 'SalesTable' y 'WMSJournalTable' o registros de eventos específicos a nombres fáciles de usar. Ejemplos Orden de devolución creadaArtículo RecibidoCódigo de Disposición AplicadoNota de Crédito Contabilizada | |||
| Canal de devolución ReturnChannel | El método o canal a través del cual el cliente inició la devolución. | ||
| Descripción Este atributo especifica el canal utilizado por el cliente para iniciar el proceso de devolución, por ejemplo, 'Portal en línea', 'En tienda', 'Llamada al servicio de atención al cliente' o 'Correo postal'. Segmentar el análisis del proceso por canal de devolución ayuda a evaluar el rendimiento y la eficiencia de cada canal. Una empresa puede comparar los tiempos de ciclo, los costos y la satisfacción del cliente entre canales para identificar las mejores prácticas y áreas de inversión o mejora. Esto es clave para el dashboard de 'Rendimiento de Utilización del Canal de Devolución'. Por qué es importante Permite la comparación de rendimiento entre diferentes canales de devolución, ayudando a optimizar los más eficientes y rentables. Dónde obtener Esta información podría almacenarse en el encabezado de la orden de devolución ('SalesTable') o derivarse del usuario que creó la orden. Puede requerir lógica personalizada o un campo dedicado. Ejemplos Portal webQuiosco en TiendaSoporte al Cliente | |||
| Código de Disposición DispositionCode | Un código que indica el resultado de la inspección del artículo y la siguiente acción a tomar. | ||
| Descripción El Código de disposición se asigna durante la inspección de calidad de un artículo devuelto. Este dicta el siguiente paso en el proceso, como 'Crédito', 'Reemplazo', 'Desecho' o 'Devolver al Cliente'. Este atributo es un punto de decisión crítico en el proceso de devoluciones. Analizar por código de disposición permite a las empresas comprender los resultados de las devoluciones, rastrear el impacto financiero del desecho de artículos y evaluar la eficiencia de diferentes rutas de resolución, como reemplazo versus reembolso. Por qué es importante Este código determina la ruta que seguirá un caso de devolución después de la inspección, lo que lo hace crucial para analizar las variantes del proceso y sus resultados comerciales. Dónde obtener Este es un campo clave en el módulo de gestión de calidad. Está asociado con el procesamiento de la Orden de Calidad o la Orden de Inspección. Ejemplos CRDTREPL-DDESECHORTV | |||
| Código de motivo de devolución ReturnReasonCode | El motivo proporcionado por el cliente para devolver el artículo. | ||
| Descripción El Código de Motivo de Devolución registra la razón declarada por el cliente para la devolución, como 'Artículo Defectuoso', 'Talla Incorrecta', 'No como se describió' o 'Ya no se necesita'. Esta información se recopila generalmente cuando se inicia la devolución. Analizar los motivos de devolución es vital para el análisis de la causa raíz. Ayuda a las empresas a identificar problemas de calidad del producto, problemas con las descripciones del producto o errores logísticos. Los insights de estos datos pueden impulsar mejoras en el diseño del producto, el marketing y las operaciones de la cadena de suministro para reducir futuras devoluciones. Por qué es importante Proporciona una visión crítica sobre por qué ocurren las devoluciones, permitiendo el análisis de la causa raíz para reducir las tasas de devolución y mejorar la satisfacción del cliente. Dónde obtener Esto se almacena típicamente a nivel de línea de orden de devolución. Busque campos de código de motivo en la tabla 'SalesLine' para las órdenes de devolución. Ejemplos DEFECTARTÍCULO_INCORRECTONO_LONGER_WANTEDDAMAGED_IN_TRANSIT | |||
| ID de Producto ProductId | El identificador único para el producto que se devuelve. | ||
| Descripción El ID de producto, a menudo la Unidad de Mantenimiento de Existencias (SKU), identifica el artículo específico que el cliente está devolviendo. Cada línea de orden de devolución está asociada con un ID de producto. Analizar las devoluciones por producto es esencial para identificar artículos con altas tasas de devolución. Esto puede indicar problemas de control de calidad, descripciones de producto inexactas o defectos de fabricación. Este análisis ayuda a priorizar las investigaciones y mejoras relacionadas con el producto. Por qué es importante Permite el análisis de las devoluciones por producto, ayudando a identificar artículos con problemas de calidad o altos volúmenes de devolución. Dónde obtener Esto corresponde al campo 'ItemId' en la tabla 'SalesLine' para la orden de devolución. Ejemplos SKU-A-123SKU-B-456SKU-C-789 | |||
| Usuario Responsable ResponsibleUser | El usuario o empleado que realizó o es responsable de una actividad específica. | ||
| Descripción Este atributo identifica al usuario individual responsable de ejecutar un paso del proceso. Podría ser el trabajador del almacén que recibió el artículo, el inspector de calidad o el empleado de finanzas que contabilizó la nota de crédito. Analizar el proceso por usuario ayuda a comprender la distribución de la carga de trabajo, identificar a los de mejor rendimiento y detectar posibles necesidades de capacitación. También se puede utilizar para investigar casos manejados por individuos o equipos específicos y asegurar una adecuada segregación de funciones. Por qué es importante Permite el análisis de la distribución de la carga de trabajo, el rendimiento por individuo o equipo, y la identificación de oportunidades de capacitación o asignación de recursos. Dónde obtener Se encuentra en los campos 'creado por' o 'modificado por' de los registros de transacciones, como 'SalesTable.createdBy' o en los ID de usuario vinculados en las tablas de diarios. Ejemplos Alice.WBob.JChris.P | |||
| Es Adherente a la Política IsPolicyAdherent | Un indicador que señala si la aprobación de la devolución cumple con las políticas de devolución establecidas. | ||
| Descripción Este es un atributo booleano calculado que indica si una devolución cumple con todos los criterios definidos en la política de devoluciones de la empresa. Esto podría basarse en factores como el período de devolución, la condición del artículo o el motivo de la devolución. Este atributo respalda directamente el dashboard de 'Resumen de Cumplimiento de Aprobación de Devoluciones' y el KPI de 'Tasa de Aprobación de Devoluciones Conformes'. Permite a la empresa cuantificar el cumplimiento de la política, identificar casos que se aprueban como excepciones y analizar las razones y la frecuencia de dichas excepciones. Esto es vital para la gobernanza y el control de costos. Por qué es importante Mide directamente el cumplimiento de las reglas de negocio, ayudando a identificar y reducir las aprobaciones de devolución no conformes que pueden llevar a la pérdida de ingresos. Dónde obtener Este es un atributo derivado. La lógica debería construirse comparando los atributos de la devolución (por ejemplo, fecha de devolución vs. fecha de compra, motivo de devolución) con reglas de negocio predefinidas. Ejemplos truefalse | |||
| Estado de orden de devolución ReturnOrderStatus | El estado general de la orden de devolución en el momento del evento. | ||
| Descripción Este atributo indica el estado actual del encabezado de la orden de devolución, como 'Abierta', 'Facturada' o 'Cancelada'. Proporciona una vista de alto nivel de dónde se encuentra el caso en su ciclo de vida. Aunque las actividades proporcionan pasos de proceso granulares, el estado general es útil para filtrar y segmentar casos. Por ejemplo, un analista podría querer centrarse solo en los casos 'Abiertos' para comprender la carga de trabajo actual, o analizar el flujo de proceso de los casos que finalmente son 'Cancelados'. Por qué es importante Proporciona un resumen de alto nivel del estado del caso, lo cual es útil para filtrar casos y comprender resultados como las cancelaciones. Dónde obtener Esta información se encuentra en el campo 'SalesStatus' o 'DocumentStatus' de la tabla 'SalesTable'. Ejemplos Orden abiertaEntregadoFacturadoCancelado | |||
| Estado de SLA SlaStatus | Indica si el caso se resolvió dentro del objetivo del Acuerdo de Nivel de Servicio. | ||
| Descripción Este atributo calculado proporciona un estado simple de cumplimiento de SLA, típicamente 'A Tiempo' o 'Retrasado'. Se determina comparando la marca de tiempo de la actividad final (por ejemplo, 'Orden de Devolución Cerrada') con la 'RefundSlaTargetDate'. Este atributo simplifica la elaboración de informes de rendimiento en dashboards como 'Rendimiento del SLA de Resolución de Reembolsos'. En lugar de requerir que los usuarios comparen fechas, proporciona un estado directo y fácilmente comprensible. Esto permite un filtrado y una agregación rápidos para calcular la 'Tasa General de Adherencia al SLA de Resolución'. Por qué es importante Proporciona un indicador simple y rápido del cumplimiento del SLA, facilitando la filtración de casos atrasados y el análisis de las causas raíz de los retrasos. Dónde obtener Este es un atributo derivado, calculado comparando la marca de tiempo de la actividad de resolución final con el atributo 'RefundSlaTargetDate'. Ejemplos A TiempoRetrasado | |||
| Fecha Objetivo de SLA de Reembolso RefundSlaTargetDate | La fecha objetivo en la que el caso de devolución y reembolso debería estar completamente resuelto. | ||
| Descripción Este atributo define la fecha límite del Acuerdo de Nivel de Servicio (SLA) para resolver un caso de devolución. Es la fecha en la que se espera que el cliente tenga una resolución final, como un reembolso contabilizado o un reemplazo enviado. Esta fecha objetivo es esencial para el monitoreo del rendimiento frente a los compromisos de servicio. Se utiliza para calcular el KPI de 'Tasa de Adherencia al SLA de Resolución' y alimentar el dashboard de 'Rendimiento del SLA de Resolución de Reembolsos'. Comparar esta fecha con la fecha real de finalización del proceso permite a la empresa identificar incumplimientos de SLA y gestionar proactivamente los casos antiguos. Por qué es importante Es el referente contra el cual se mide el rendimiento del proceso, permitiendo el seguimiento del cumplimiento del SLA y la identificación de casos atrasados. Dónde obtener Esto puede no ser un campo estándar. A menudo se calcula basándose en la fecha de creación de la devolución más un período de SLA predefinido (por ejemplo, 14 días). Podría almacenarse en un campo personalizado. Ejemplos 2023-11-10T23:59:59Z2023-11-15T23:59:59Z | |||
| Hora de Finalización EndTime | La marca de tiempo que indica cuándo se completó una actividad específica. | ||
| Descripción La Hora de Fin representa la marca de tiempo de finalización de una actividad. Mientras que StartTime marca el comienzo, EndTime marca la conclusión, lo que permite el cálculo del tiempo de procesamiento para esa tarea específica. Este atributo es crucial para un análisis de rendimiento detallado, especialmente para tareas con una duración medible, como 'Inspección de Artículo'. Al comparar StartTime y EndTime, los analistas pueden medir con precisión el tiempo de procesamiento activo de las tareas, distinguiéndolo del tiempo de espera entre tareas. Esto ayuda a identificar ineficiencias dentro de actividades específicas, no solo entre ellas. Por qué es importante Permite el cálculo del tiempo de procesamiento activo para actividades individuales, ayudando a diferenciar entre el tiempo de espera y el tiempo de trabajo real. Dónde obtener Esto a menudo debe derivarse. Por ejemplo, podría ser el 'modifiedDateTime' de un cambio de estado que concluye una actividad, o podría ser el StartTime de la actividad subsiguiente. Ejemplos 2023-10-26T10:15:00Z2023-10-26T14:45:20Z2023-10-27T09:55:12Z | |||
| ID de Almacén WarehouseId | El identificador del almacén o la ubicación donde se recibe el artículo devuelto. | ||
| Descripción Este atributo identifica el almacén físico o centro de devoluciones específico que procesa el artículo devuelto. Diferentes ubicaciones pueden tener distintos procesos, recursos o niveles de rendimiento. Analizar el proceso por almacén permite la evaluación comparativa del rendimiento entre ubicaciones. Puede ayudar a identificar qué instalaciones son más eficientes en el procesamiento de devoluciones, destacar cuellos de botella regionales e informar las decisiones sobre la asignación de recursos y la estandarización de procesos en toda la red logística. Por qué es importante Permite la comparación de rendimiento entre diferentes almacenes o centros de devolución, ayudando a identificar cuellos de botella regionales o mejores prácticas. Dónde obtener Esta información se almacena en el campo 'InventLocationId' en transacciones relacionadas con el inventario, como el Diario de Llegada ('WMSJournalTable') o en la 'SalesLine'. Ejemplos WH-EASTWH-WESTCENTRAL-DC | |||
| ID de cliente CustomerId | El identificador único para el cliente que inició la devolución. | ||
| Descripción El ID de cliente es el identificador único de la cuenta de cliente asociada a la devolución. Esto vincula la transacción de devolución a un cliente específico en el CRM o la base de datos de clientes. Analizar las devoluciones por cliente permite identificar a aquellos con una actividad de devolución inusualmente alta, lo que podría indicar comportamiento fraudulento o insatisfacción crónica. También se puede utilizar para segmentar clientes, por ejemplo, para ofrecer servicios de devolución premium a clientes de alto valor. Por qué es importante Vincula el proceso de devolución a un cliente específico, permitiendo el análisis a nivel de cliente y la identificación de patrones de devolución o posible fraude. Dónde obtener Este es el campo 'CustAccount' en la 'SalesTable' para la orden de devolución. Ejemplos CUST-00045CUST-00192CUST-00315 | |||
| ID de Nota de Crédito CreditNoteId | El identificador único para el documento de nota de crédito creado para un reembolso. | ||
| Descripción Cuando se procesa un reembolso, se genera un documento financiero conocido como nota de crédito o memo de crédito. Este atributo almacena el ID único de ese documento. Este ID proporciona un vínculo directo desde el proceso operativo de devolución a los registros financieros en el sistema contable. Es útil para fines de auditoría y para análisis profundos de discrepancias financieras, permitiendo a un analista rastrear un caso de devolución hasta la transacción financiera específica que lo resolvió. Por qué es importante Vincula el proceso operativo de devolución con la transacción financiera correspondiente, lo cual es crucial para la auditoría y la conciliación financiera. Dónde obtener El número de nota de crédito se encuentra típicamente en el campo 'InvoiceId' de la tabla 'CustInvoiceJour', donde el tipo de transacción es 'Credit note'. Esto se puede vincular de nuevo a la orden de devolución. Ejemplos CN-10056CN-10057CN-10058 | |||
| Monto de Reembolso Real ActualRefundAmount | El valor monetario final del reembolso emitido al cliente. | ||
| Descripción Este atributo es el monto final y confirmado que se reembolsó al cliente. Este valor se registra cuando se crea y contabiliza la nota de crédito. Este es un atributo crítico para el análisis financiero y se utiliza directamente en el dashboard de 'Análisis de Discrepancias en el Monto del Reembolso' y el KPI de 'Tasa de Precisión del Monto del Reembolso'. Analizar estos datos ayuda a comprender el impacto financiero de las devoluciones y cualquier ajuste realizado durante el proceso. Por qué es importante Esto representa el impacto financiero real de la devolución y es crucial para calcular la precisión del reembolso y comprender los resultados financieros. Dónde obtener Este valor se puede encontrar en los detalles de la transacción de la nota de crédito contabilizada. Está relacionado con las tablas 'CustTrans' y 'CustInvoiceJour' para la nota de crédito. Ejemplos 99.99135.000.00 | |||
| Monto de reembolso solicitado RequestedRefundAmount | El valor monetario total del reembolso solicitado por el cliente. | ||
| Descripción Este atributo representa el monto de reembolso inicial solicitado o esperado al comienzo del proceso de devolución. Generalmente se basa en el precio de compra original de los artículos devueltos. Este valor sirve como línea base para el 'Análisis de Discrepancias en el Monto del Reembolso'. Al comparar el monto solicitado con el monto real reembolsado, la empresa puede identificar discrepancias causadas por tarifas de reposición, reembolsos parciales por bienes dañados o otros ajustes. Esto ayuda a monitorear la precisión financiera y la adherencia a las políticas. Por qué es importante Sirve como línea base para medir la precisión financiera, comparándolo con el monto de reembolso real procesado. Dónde obtener Esto es típicamente el monto de la línea o el monto total de la línea de la orden de venta original que se devuelve, que se encuentra en 'SalesLine.LineAmount'. Ejemplos 99.99150.0024.50 | |||
| Source System SourceSystem | El sistema de información del que se extrajeron los datos del evento. | ||
| Descripción Este atributo identifica el sistema de información de origen donde se originaron los datos. En este contexto, será principalmente 'Microsoft Dynamics 365'. En organizaciones más grandes, un proceso podría abarcar múltiples sistemas. Especificar el sistema de origen para cada evento es crucial para la gobernanza de datos, la resolución de problemas de extracción de datos y la comprensión del panorama tecnológico del proceso. Confirma el origen de los datos que se analizan. Por qué es importante Proporciona un contexto crucial sobre el origen de los datos, lo cual es esencial para la gobernanza de datos, la validación y la comprensión del panorama del sistema del proceso. Dónde obtener Este es típicamente un valor estático añadido durante el proceso de extracción, transformación y carga de datos (ETL) para etiquetar el origen del conjunto de datos. Ejemplos Microsoft Dynamics 365 F&OD365-PROD | |||
| Tipo de devolución ReturnType | Categoriza la devolución según el resultado esperado, como Reembolso o Reemplazo. | ||
| Descripción Este atributo clasifica el caso de devolución según el tipo de resolución buscado por el cliente u ofrecido por la empresa. Los tipos comunes incluyen un 'Reembolso' monetario, un intercambio por un artículo de 'Reemplazo' o una 'Reparación'. Esta categorización es útil para analizar diferentes rutas de proceso. El proceso para emitir un reembolso es significativamente diferente al proceso para enviar un artículo de reemplazo. La segmentación por Tipo de Devolución permite un análisis más preciso de los tiempos de ciclo y los cuellos de botella específicos de cada ruta de resolución. Por qué es importante Permite la segmentación del análisis basándose en el resultado previsto, ya que los procesos de reembolso y reemplazo tienen diferentes pasos y tiempos de ciclo. Dónde obtener Esto puede ser un campo personalizado en el encabezado de la orden de devolución o derivado basado en el código de disposición o transacciones subsiguientes como la creación de una orden de venta de reemplazo. Ejemplos ReembolsoReemplazoCrédito en tienda | |||
| Última actualización de datos LastDataUpdate | El timestamp que indica la última vez que se actualizaron los datos del proceso. | ||
| Descripción Este atributo registra la fecha y hora en que los datos fueron extraídos por última vez del sistema de origen y actualizados en la herramienta de Process Mining. Proporciona un punto de referencia para la actualidad de los datos que se analizan. Conocer la última hora de actualización de los datos es importante para comprender la puntualidad del análisis. Ayuda a los usuarios a interpretar los dashboards y los KPIs correctamente, sabiendo si están viendo datos en tiempo real o una instantánea de un momento específico. Esto es clave para el monitoreo operativo. Por qué es importante Indica la actualidad de los datos, asegurando que los analistas estén al tanto de cuán actualizadas son sus perspectivas del proceso. Dónde obtener Este es un atributo de metadatos generado y almacenado durante la pipeline de ingesta de datos, que típicamente representa la marca de tiempo de la finalización del trabajo ETL. Ejemplos 2023-11-01T02:00:00Z2023-11-02T02:00:00Z | |||
Actividades de procesamiento de devoluciones y reembolsos
| Actividad | Descripción | ||
|---|---|---|---|
| Artículo Recibido | Marca la recepción física del artículo devuelto en el almacén o centro de devolución designado. Esto se registra cuando se contabiliza el diario de llegadas asociado con el pedido de devolución. | ||
| Por qué es importante Este es un hito crítico que transfiere el proceso de la acción del cliente al procesamiento interno. Es el punto de partida para calcular todos los tiempos de manejo internos, como la inspección y la disposición. Dónde obtener La marca de tiempo de contabilización del Diario de WMS o del Diario de Llegada de Artículos asociado con la línea ReturnOrder. Esto actualiza las transacciones de inventario a un estado 'Registrado' o 'Recibido'. Capturar Evento de registro (posting) del diario de recepción de artículos vinculado a la línea de la orden de devolución. Tipo de evento explicit | |||
| Código de Disposición Aplicado | Esta actividad representa la finalización de la inspección y la decisión sobre qué hacer con el artículo devuelto. Se asigna un código de disposición, como 'Crédito', 'Desecho' o 'Reemplazo', a la línea de devolución. | ||
| Por qué es importante Este es un punto clave de toma de decisiones que determina la ruta de proceso subsiguiente, ya sea un reembolso, un intercambio o un rechazo. Las demoras aquí pueden impactar significativamente el tiempo total de resolución. Dónde obtener Este evento se captura cuando el campo DispositionCode se rellena en la transacción de inventario de la línea de orden de devolución o en el diario relacionado. Capturar El evento de actualización cuando se establece un DispositionCode para la línea de orden de devolución. Tipo de evento explicit | |||
| Nota de Crédito Contabilizada | La nota de crédito se contabiliza oficialmente en los libros financieros, lo que pone el crédito a disposición del cliente. Esto significa la finalización de la acción de reembolso desde la perspectiva de la empresa. | ||
| Por qué es importante Este es un hito financiero crucial que confirma que el reembolso ha sido procesado en el sistema. A menudo es una actividad clave para medir el cumplimiento del SLA de reembolso. Dónde obtener La marca de tiempo de contabilización del diario de facturas para la orden de devolución, que finaliza la nota de crédito. El estado de la orden de devolución cambia a 'Facturada'. Capturar Contabilización del diario de facturas del pedido de devolución. Tipo de evento explicit | |||
| Orden de devolución cerrada | La orden de devolución ha alcanzado su estado final, lo que significa que todas las transacciones físicas y financieras están completas. Esto suele ocurrir después de que se contabiliza la nota de crédito o se envía el reemplazo. | ||
| Por qué es importante Este es el evento final principal para un proceso de devolución completado con éxito. La duración desde la creación hasta este punto representa el tiempo total del ciclo del caso. Dónde obtener Se deduce del cambio del campo de estado de ReturnOrder a su valor final, como 'Invoiced' o 'Closed', lo que indica que el proceso ha concluido. Capturar Cambio de los campos SalesTable.Status o SalesTable.DocumentStatus a un estado final. Tipo de evento inferred | |||
| Orden de devolución creada | Esta actividad marca el inicio del proceso de devolución, donde se crea en el sistema una Autorización de Devolución de Material (RMA) o una Orden de Devolución. Este es un evento explícito capturado al crear un nuevo registro de ReturnOrder en Dynamics 365. | ||
| Por qué es importante Este es el evento de inicio principal para todo el proceso de devoluciones. Analizar el tiempo desde esta actividad hasta otras revela el tiempo de entrega general del proceso y ayuda a identificar cuellos de botella en las etapas tempranas. Dónde obtener Este evento se captura de la marca de tiempo de creación del encabezado de ReturnOrder. Esto se encuentra típicamente en SalesTable donde el SalesType es 'Returned Order'. Capturar Evento de creación del registro en SalesTable con SalesType = 'Returned Order'. Tipo de evento explicit | |||
| Artículo de Reemplazo Enviado | El albarán del artículo de reemplazo se contabiliza, lo que indica que ha sido enviado al cliente. Esto marca la finalización del proceso de cumplimiento de intercambio. | ||
| Por qué es importante Este es un hito clave en la variante de intercambio, que representa el cumplimiento de la obligación de la empresa con el cliente. Es crucial para el seguimiento de los tiempos de ciclo de intercambio. Dónde obtener La fecha de contabilización del diario de albarán para la orden de venta de reemplazo. Esto actualiza el estado de la orden a 'Entregado'. Capturar Contabilización del albarán para el pedido de venta de reemplazo. Tipo de evento explicit | |||
| Diario de Llegadas Creado | Esta actividad significa que el almacén espera la llegada del artículo devuelto. Es la creación de un diario de llegada, que prepara el sistema para la recepción física de la mercancía. | ||
| Por qué es importante Este paso separa la preparación logística de la recepción física real. Ayuda a analizar la preparación del almacén y a planificar las devoluciones entrantes. Dónde obtener Creación de un registro en WMSJournalTable con JournalType 'Arrival'. El diario está vinculado a la línea de la orden de devolución. Capturar Creation timestamp of the WMSJournalTable record for the return. Tipo de evento explicit | |||
| Nota de Crédito Creada | Se genera una nota de crédito basada en una disposición de 'Crédito', autorizando un reembolso al cliente. Este es el inicio formal de la parte de liquidación financiera del proceso. | ||
| Por qué es importante Esta actividad marca la aprobación del reembolso financiero. El tiempo entre la disposición y la creación de la nota de crédito resalta las demoras administrativas al iniciar el reembolso. Dónde obtener Esto se puede inferir de la creación de un nuevo registro de SalesTable con un valor negativo, vinculado a la orden de devolución original, o ejecutando el trabajo por lotes 'Crear nota de crédito'. Capturar Creación de una nota de crédito, a menudo mediante la contabilización de la factura del pedido de devolución. Tipo de evento explicit | |||
| Orden de Calidad Generada | Se crea una orden de calidad formal, indicando que el artículo devuelto debe someterse a un proceso de inspección estructurado. Esto es común en escenarios donde las devoluciones requieren pruebas detalladas o verificaciones contra estándares de calidad. | ||
| Por qué es importante Esta actividad marca el inicio de un proceso formal de inspección. El seguimiento del tiempo a partir de este punto ayuda a medir la eficiencia y la duración del flujo de trabajo de garantía de calidad. Dónde obtener timestamp de creación de un registro en InventQualityOrderTable vinculado a la orden de devolución. Capturar Creation of an InventQualityOrderTable record. Tipo de evento explicit | |||
| Orden de devolución cancelada | La orden de devolución se cancela antes de su finalización. Esto podría deberse a una solicitud del cliente o si el artículo nunca fue devuelto. | ||
| Por qué es importante Esto representa un final alternativo y fallido del proceso. Analizar por qué se cancelan las devoluciones puede proporcionar insights sobre el comportamiento del cliente o fallas del proceso. Dónde obtener Se deduce del cambio en el campo de estado de ReturnOrder a 'Cancelled'. Se trata de un estado final distinto al de un pedido cerrado correctamente. Capturar Change of the SalesTable.Status field to 'Cancelled'. Tipo de evento inferred | |||
| Orden de devolución confirmada | Representa la confirmación formal de la orden de devolución en el sistema, lo que a menudo activa una lógica posterior. Generalmente, se registra como una acción explícita o un cambio de estado en el encabezado de la ReturnOrder. | ||
| Por qué es importante La confirmación es un paso clave antes de que pueda comenzar la logística. Los retrasos entre la creación y la confirmación pueden indicar atrasos administrativos o relacionados con el sistema. Dónde obtener Esto se puede identificar por la contabilización del diario de 'Confirmación' para la orden de devolución o un cambio en el campo DocumentStatus en la tabla SalesTable. Capturar Ejecución de la función 'Confirmar pedido de venta' para la orden de devolución. Tipo de evento explicit | |||
| Orden de reemplazo creada | Se crea un nuevo pedido de venta para enviar un artículo de reemplazo al cliente. Esta actividad ocurre cuando la acción de disposición es 'Reemplazar y Acreditar' o 'Reemplazar y Desechar'. | ||
| Por qué es importante Esta actividad inicia la variante del proceso de intercambio. Rastrear este camino por separado del camino de reembolso es esencial para comprender las complejidades y los costos de los intercambios. Dónde obtener La creación de un nuevo registro de SalesTable para el artículo de reemplazo, a menudo generado automáticamente y vinculado a la orden de devolución original. Capturar Creación de un nuevo Pedido de Venta vinculado al Pedido de Devolución a través de la acción de disposición. Tipo de evento explicit | |||
Guías de Extracción
Pasos
- Prerequisite: Register an Application in Azure Active Directory. Antes de poder conectarse a la API de Dynamics 365, debe registrar una aplicación en su inquilino de Azure AD. Conceda a esta aplicación permisos delegados para acceder a Dynamics 365 Finance & Operations, por ejemplo,
Financials.ReadWrite.Allo un permiso personalizado. - Configure Application ID in Dynamics 365. En Dynamics 365, navegue a Administración del sistema > Configuración > Aplicaciones de Azure Active Directory. Agregue el ID de aplicación (cliente) de su registro de aplicación de Azure AD y asócielo a una cuenta de usuario que tenga los roles de seguridad necesarios para leer las entidades de datos requeridas.
- Obtain an OAuth 2.0 Access Token. Escriba un script, por ejemplo en PowerShell o Python, para autenticarse contra el endpoint de la plataforma de identidad de Microsoft. Use las credenciales de la aplicación (ID de cliente y secreto) para solicitar un token de acceso para la URL del recurso de Dynamics 365.
- Identify Your Dynamics 365 Environment URL. Localice la URL base de su entorno de Dynamics 365. El endpoint de la Web API típicamente se verá así:
https://[YourD365FinanceAndOpsURL].dynamics.com/data. - Construct and Execute OData API Requests. Para cada una de las 12 actividades requeridas, construya una URL de solicitud OData GET específica. Use
$selectpara recuperar solo las columnas requeridas y$filterpara especificar el rango de fechas y cualquier condición de estado. El token de autenticación obtenido en el paso 3 debe incluirse como un Bearer token en el encabezado de autorización de cada solicitud. - Develop an Extraction Script. Cree un script que itere a través de la lista de solicitudes OData. Este script debe manejar la autenticación, ejecutar cada solicitud GET y almacenar los datos JSON resultantes. Preste atención a los límites de la API e implemente pausas si es necesario.
- Handle API Pagination. Dynamics 365 pagina resultados grandes. Su script debe verificar la propiedad
@odata.nextLinken la respuesta. Si existe, su script debe hacer una solicitud posterior a esa URL para recuperar la siguiente página de datos, continuando hasta que no se proporcionenextLink. - Transform and Union the Data. Procese la respuesta JSON de cada una de las 12 llamadas a la API. Para cada actividad, cree un registro estandarizado que contenga
ReturnCaseId,ActivityName,EventTimey otros atributos. Por ejemplo, para el evento 'Pedido de devolución creado', mapeeReturnOrderNumberaReturnCaseId, establezcaActivityNameen 'Pedido de devolución creado' y mapeecreatedDateTimeaEventTime. Combine los registros transformados de todas las llamadas en una sola lista o tabla. - Clean and Standardize Timestamps. Asegúrese de que todos los valores de
EventTimeestén en un formato consistente, preferiblemente UTC con un formato comoYYYY-MM-DDTHH:MM:SSZ. Maneje cualquier registro con timestamps faltantes o inválidos según sea necesario. - Export the Final Event Log. Una vez que todos los datos se recopilan y transforman en un único conjunto de datos unificado, expórtelos a un archivo CSV. Asegúrese de que los encabezados de las columnas coincidan con los requisitos de ProcessMind:
ReturnCaseId,ActivityName,EventTime,ResponsibleUser,DispositionCode, etc. El archivo ahora está listo para su carga.
Configuración
- API Endpoint URL: La URL base para su instancia de Dynamics 365 Finance & Operations. Sigue el formato
https://[YourEnvironmentName].dynamics.com/data. - Azure AD Application: Se debe registrar una aplicación en Azure AD con un ID de cliente y un secreto. Requiere permisos de API para acceder a las entidades de datos de Dynamics 365.
- Date Range Filtering: Es fundamental aplicar un filtro de rango de fechas en cada llamada a la API utilizando el parámetro OData
$filteren un campo de fecha relevante, comocreatedDateTimeomodifiedDateTime. Un rango inicial típico es de los últimos 3 a 6 meses de datos para que la extracción sea manejable. - Company Filter: Para extraer datos de una entidad legal específica, incluya el parámetro de consulta
cross-company=truey luego use$filteren el campodataAreaId. Por ejemplo,?cross-company=true&$filter=dataAreaId eq '[YourCompanyCode]'. - Pagination Preference: Utilice el encabezado
Prefer: odata.maxpagesize=[value]en sus solicitudes para controlar el número de registros devueltos por página. Un valor de1000a5000es común. Esto ayuda a evitar tiempos de espera (timeouts) de la API en entidades grandes. - API Throttling: Tenga en cuenta los límites de protección del servicio de la API de Dynamics 365. El script de extracción debe incluir lógica para manejar respuestas
429 (Demasiadas solicitudes), normalmente implementando un retroceso exponencial (exponential backoff) o un mecanismo simple de pausa y reintento.
a Consulta de ejemplo 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 Pasos
- Enable TDS Endpoint: Asegúrese de que el endpoint de Tabular Data Stream (TDS) esté habilitado para su entorno de Dynamics 365 Dataverse. Un administrador del sistema puede habilitarlo en el centro de administración de Power Platform, en Entorno > Configuración > Características.
- Identify Environment URL: Encuentre la URL de su entorno. Normalmente se ve así:
yourorg.crm.dynamics.com. El nombre del servidor del endpoint TDS será esta URL con el puerto 5558, por ejemplo,yourorg.crm.dynamics.com,5558. - Connect with a SQL Client: Utilice un cliente SQL que admita TDS, como SQL Server Management Studio (SSMS) o Azure Data Studio.
- Authenticate: Conéctese al servidor utilizando su cuenta de Azure Active Directory que tenga los permisos adecuados, normalmente Administrador del sistema o Personalizador del sistema, en el entorno de Dataverse.
- Prepare the Query: Copie la consulta SQL completa proporcionada en la sección
queryde este documento en una nueva ventana de consulta de su cliente SQL. - Set Parameters: Localice los marcadores de posición dentro de la consulta. Reemplace
'{StartDate}'y'{EndDate}'con el rango de fechas deseado para la extracción, por ejemplo,'2023-01-01'y'2023-12-31'. Además, actualice cualquier valor de marcador de posición para códigos de estado o códigos de disposición para que coincida con su configuración específica de Dynamics 365. - Execute the Query: Ejecute la consulta modificada en la base de datos de Dataverse. El tiempo de ejecución variará según el volumen de datos y el rango de fechas seleccionado.
- Review Results: Una vez que la consulta se complete, revise el conjunto de datos devuelto para asegurarse de que contiene las columnas esperadas:
ReturnCaseId,ActivityName,EventTimey los atributos recomendados. - Export the Event Log: Exporte los resultados de la consulta a un archivo CSV. La mayoría de los clientes SQL tienen una función incorporada para guardar los resultados directamente en un archivo. Asegúrese de que el archivo se guarde con codificación UTF-8.
- Upload to ProcessMind: El archivo CSV exportado ahora está listo para ser cargado en ProcessMind como un nuevo registro de eventos para el análisis de process mining.
Configuración
- Prerequisites: Debe tener una cuenta de usuario con al menos acceso de lectura a las tablas relevantes de Dataverse (por ejemplo, SalesTable, SalesLine, CustInvoiceJour). Los permisos se gestionan normalmente a través de roles de seguridad como Administrador del sistema o un rol personalizado con permisos de tabla suficientes.
- TDS Endpoint: El endpoint TDS de Dataverse debe estar habilitado para el entorno. Esta característica permite realizar consultas SQL directas de solo lectura en la base de datos de Dataverse.
- Date Range: La consulta incluye los marcadores de posición
'{StartDate}'y'{EndDate}'. Para un análisis inicial, se recomienda un rango de fechas de 3 a 6 meses para proporcionar un conjunto de datos representativo sin causar problemas de rendimiento. - Company Filter: La consulta tal como está escrita se ejecutará en todas las entidades legales (empresas) a las que el usuario tenga acceso. Para el análisis de una sola empresa, descomente y agregue una cláusula
WHEREque filtre por el campoDATAAREAIDen cada parte de la instrucciónUNION ALL, por ejemplo,AND st.DATAAREAID = '[YourCompanyID]'. - Custom Logic Placeholders: La consulta contiene marcadores de posición como
[YourReplaceCode1]para códigos de disposición y notas sobre la vinculación de pedidos de reemplazo. Estos deben configurarse según su proceso de negocio específico y la configuración de Dynamics 365. - Performance: Las consultas directas contra el TDS endpoint para grandes conjuntos de datos pueden ser lentas. La conexión está optimizada para consultas analíticas, pero las uniones complejas en millones de filas pueden provocar tiempos de espera. Se recomienda aplicar filtros de fecha estrictos.
a Consulta de ejemplo 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}';