Votre modèle de données pour la gestion des paiements fournisseurs
Microsoft Dynamics 365Votre modèle de données pour la gestion des paiements fournisseurs
- Attributs spécifiques au processus pour l'analyse financière
- Jalons d'activité critiques pour le suivi des paiements
- Instructions d'extraction détaillées pour Dynamics 365
Attributs du traitement des paiements fournisseurs
| Nom | Description | ||
|---|---|---|---|
| Activité Activity | La tâche spécifique ou le changement de statut qui s'est produit. | ||
| Description Cet attribut décrit l'événement ou l'étape réalisée dans le processus, tels que « Facture créée », « Facture approuvée » ou « Paiement comptabilisé ». Il transforme les types de transactions techniques et les changements de statut de workflow en événements métier lisibles. Dans Dynamics 365, ces activités sont souvent dérivées d'une combinaison d'insertions de tables (par ex., un nouvel enregistrement dans Pourquoi c'est important Il définit le flux de processus et la séquence d'événements pour la carte de processus. Où obtenir Dérivé de diverses tables de transactions et journaux d'historique de workflow Exemples Facture crééeFacture approuvéePaiement généré | |||
| Heure de l'événement EventTime | L'horodatage de l'activité. | ||
| Description Cet attribut enregistre la date et l'heure exactes auxquelles une activité spécifique a eu lieu. Il est utilisé pour séquencer les événements chronologiquement et calculer les durées entre les étapes. Pour Dynamics 365, il est généralement extrait de Pourquoi c'est important Essentiel pour le calcul des temps de cycle, des délais et l'identification des goulots d'étranglement. Où obtenir System fields CreatedDateTime or ModifiedDateTime on transaction tables Exemples 2023-10-01T08:30:00Z2023-10-01T14:15:22Z2023-10-05T09:00:00Z | |||
| Numéro de facture InvoiceNumber | L'identifiant unique attribué à la facture fournisseur. | ||
| Description Le numéro de facture sert d'identifiant de cas définitif pour cette vue de processus. Il regroupe de manière unique tous les événements relatifs à une seule facture fournisseur, permettant une analyse complète de son parcours de la réception au règlement. Dans Microsoft Dynamics 365, cela correspond généralement au champ Pourquoi c'est important C'est la clé fondamentale pour lier les activités de comptes fournisseurs disjointes en une seule instance de processus. Où obtenir Table: VendInvoiceJour, Field: InvoiceId Exemples INV-2023-00198223344ACME-OCT-22 | |||
| Dernière mise à jour des données LastDataUpdate | L'horodatage de l'extraction ou de l'actualisation des données. | ||
| Description Indique l'actualisation des données utilisées pour l'analyse. Il aide les utilisateurs à comprendre s'ils examinent des données en temps réel ou un instantané d'une période antérieure. Ceci est généralement généré par le processus ETL (Extraction, Transformation, Chargement) plutôt que d'être un champ au sein de Dynamics 365. Pourquoi c'est important Critique pour établir la confiance dans les tableaux de bord et les KPI. Où obtenir Généré par le script d'extraction Exemples 2023-10-25T12:00:00Z2023-11-01T06:00:00Z | |||
| Système source SourceSystem | Le nom du système d'où proviennent les données. | ||
| Description Identifie le logiciel ou l'environnement source d'où les données de processus ont été extraites. Dans ce contexte, cela indiquera systématiquement l'instance Microsoft Dynamics 365. Ceci est particulièrement utile dans les environnements multi-systèmes où les données peuvent être mélangées à partir d'ERPs et de solutions de numérisation externes. Pourquoi c'est important Assure la lignée des données et la traçabilité dans les analyses multi-systèmes. Où obtenir Codé en dur ou configuré lors de l'extraction Exemples Dynamics 365 F&OD365 PRODMicrosoft Dynamics | |||
| Code société CompanyCode | L'identifiant de l'entité juridique ou de la filiale. | ||
| Description Représente l'entité juridique au sein de l'organisation où la facture est traitée. Dans Microsoft Dynamics 365, ceci est strictement appliqué via le champ système Cet attribut est essentiel pour l'« Analyse du délai de bout en bout », permettant des comparaisons entre différentes filiales ou unités géographiques. Pourquoi c'est important Permet une analyse comparative entre différentes unités commerciales ou pays. Où obtenir Table: VendInvoiceJour, Field: DataAreaId Exemples USMFDEMFGBSI | |||
| Compte fournisseur VendorAccount | Le numéro de compte unique du fournisseur. | ||
| Description L'identifiant unique du fournisseur impliqué dans la transaction. Dans Dynamics 365, cela correspond au champ Cet attribut est central pour la « Vue de la complexité des relations fournisseurs », permettant l'analyse de la performance et des frictions par relation fournisseur spécifique. Pourquoi c'est important Permet la segmentation des performances du processus par fournisseur. Où obtenir Table: VendInvoiceJour, Field: InvoiceAccount or OrderAccount Exemples US-101V000452001 | |||
| Date d'échéance DueDate | La date à laquelle la facture devrait être payée. | ||
| Description La date contractuelle à laquelle le paiement doit être réglé pour éviter les pénalités. Dans Dynamics 365, elle est stockée en tant que C'est la référence principale pour le KPI « Taux de paiement à temps » et aide à prioriser le travail dans la vue « Débit et Volume du Processus des Comptes Fournisseurs ». Pourquoi c'est important La référence pour mesurer la performance des paiements à temps. Où obtenir Table: VendInvoiceJour or VendTrans, Field: DueDate Exemples 2023-11-302023-12-15 | |||
| Date de la facture InvoiceDate | La date du document indiquée sur la facture. | ||
| Description La date imprimée sur la facture du fournisseur. Dans Dynamics 365, il s'agit du champ Utilisée dans l'« Analyse du délai de bout en bout » pour mesurer le cycle de vie total du point de vue du fournisseur. Pourquoi c'est important Définit le début de la période de vieillissement de la facture. Où obtenir Table: VendInvoiceJour, Field: InvoiceDate Exemples 2023-10-012023-10-15 | |||
| Département Department | Le département responsable du coût. | ||
| Description La dimension financière indiquant le département interne. Dans Dynamics 365, les dimensions sont stockées dynamiquement (souvent dans Cet attribut est utilisé dans la « Vue de la complexité des relations fournisseurs » pour voir quels départements internes génèrent le plus de volume de comptes fournisseurs (AP). Pourquoi c'est important Permet l'exploration organisationnelle et l'analyse de la responsabilité. Où obtenir Table: VendInvoiceJour, Field: DefaultDimension (Requires DimensionAttributeLevelValue view) Exemples ITFinanceOpérations | |||
| ID utilisateur UserId | L'identifiant de l'utilisateur qui a effectué l'activité. | ||
| Description Identifie l'utilisateur système responsable d'une activité spécifique, telle que l'approbation d'une facture ou l'enregistrement d'un paiement. Sourced from Utilisé dans l'« Analyse des blocages et frictions de paiement » pour voir si certains processeurs déclenchent plus de blocages que d'autres. Pourquoi c'est important Permet l'analyse du comportement des ressources et la séparation des tâches. Où obtenir System fields CreatedBy/ModifiedBy on transaction/history tables Exemples jdoeadminworkflow_sys | |||
| Montant de la facture InvoiceAmount | La valeur monétaire totale de la facture. | ||
| Description La valeur totale de la facture dans la devise de la transaction. Dans Dynamics 365, on la trouve dans des champs comme Utilisé dans le dashboard « Détection des risques de double paiement » pour corréler les montants avec les détails du fournisseur. Pourquoi c'est important Critique pour l'analyse du volume des dépenses et du risque financier. Où obtenir Table: VendInvoiceJour, Field: InvoiceAmount Exemples 1500.00245.5010000.00 | |||
| Nom du fournisseur VendorName | Le nom de l'organisation du fournisseur. | ||
| Description Le nom descriptif du fournisseur. Dans D365, le compte fournisseur agit comme clé étrangère vers le Global Address Book ( La fourniture de noms lisibles par l'homme facilite la « Vue de la complexité des relations fournisseurs » et rend les dashboards accessibles aux utilisateurs métier. Pourquoi c'est important Fournit le contexte pour le numéro de compte fournisseur. Où obtenir Table: DirPartyTable (via VendTable), Field: Name Exemples Contoso Office SupplyFabrikam ElectronicsLitware Inc. | |||
| Numéro de commande d'achat PurchaseOrderNumber | Le numéro de référence du bon de commande associé. | ||
| Description Lie la facture au document d'achat original. Dans Dynamics 365, il s'agit du champ Cet attribut prend en charge le tableau de bord « Tendance des rapprochements et écarts de bons de commande » en distinguant les factures basées sur un bon de commande des factures sans bon de commande. Pourquoi c'est important Essentiel pour analyser le taux de rapprochement du processus d'achat au paiement. Où obtenir Table: VendInvoiceJour, Field: PurchId Exemples PO-000455000342PO-22-998 | |||
| Conditions de paiement PaymentTerms | Le code représentant les conditions de paiement convenues. | ||
| Description Le code de configuration qui dicte les dates d'échéance et les escomptes (par ex. : Net30). Dans Dynamics 365, il s'agit du Analysé parallèlement au « Temps de Cycle » pour voir si des retards de processus violent les termes convenus. Pourquoi c'est important Fournit le contexte pour le calcul de la date d'échéance. Où obtenir Table: VendInvoiceJour, Field: PaymTermId Exemples Net302%10Net30COD | |||
| Date d'escompte CashDiscountDate | La date à laquelle le paiement doit être effectué pour bénéficier d'un escompte. | ||
| Description La date limite pour bénéficier des incitatifs de paiement anticipé. Dans Dynamics 365, il s'agit du Cet attribut alimente le dashboard « Performance de la capture d'escompte en espèces », permettant à l'organisation de quantifier les opportunités d'économies manquées. Pourquoi c'est important Impacte directement le KPI d'efficacité financière du processus. Où obtenir Table: VendInvoiceJour or VendTrans, Field: CashDiscDate Exemples 2023-10-102023-10-20 | |||
| Devise Currency | Le code de devise de la facture. | ||
| Description Le code ISO de la devise dans laquelle la facture a été émise. Dans Dynamics 365, il s'agit du champ Important pour la standardisation des montants dans le mappage « Montant de l'activité » si une normalisation multidevise est requise. Pourquoi c'est important Contexte nécessaire à l'interprétation des valeurs financières. Où obtenir Table: VendInvoiceJour, Field: CurrencyCode Exemples USDEURGBP | |||
| Méthode de paiement PaymentMethod | La méthode utilisée pour payer la facture (par ex. : Chèque, Virement, TEF). | ||
| Description Définit la manière dont les fonds sont transférés au fournisseur. Dans Dynamics 365, il s'agit du champ Cet attribut est utilisé dans le tableau de bord « Délais d'exécution des paiements » pour évaluer l'efficacité des différents types de lots de paiement. Pourquoi c'est important Explique les variations dans la phase d'exécution des paiements. Où obtenir Table: VendInvoiceJour (joined to PaymMode info) or VendTrans Exemples CHECKACHVirement | |||
| Numéro de pièce VoucherNumber | Le numéro de pièce comptable associé à la transaction. | ||
| Description L'identifiant du grand livre général interne pour l'écriture comptable. Dans Dynamics 365, le champ Bien que technique, il est utile pour l'« Audit du chemin du processus et de la conformité » de retracer les écritures jusqu'au GL pour la réconciliation. Pourquoi c'est important Clé pour l'audit financier et le rapprochement. Où obtenir Table: VendInvoiceJour, Field: LedgerVoucher Exemples VOU-10023INV-ACC-992 | |||
| Paiement bloqué IsPaymentBlocked | Indicateur signalant si la facture est actuellement bloquée pour paiement. | ||
| Description Un indicateur booléen identifiant si la facture est en attente. Dans Dynamics 365, cela est souvent dérivé du statut C'est le principal facteur de l'« Analyse des blocages et frictions de paiement », soulignant les interruptions de processus. Pourquoi c'est important Identifie les points de friction immédiats et les interventions manuelles. Où obtenir Table: VendTrans, Field: Approved (inverted) or specialized Hold fields Exemples truefaux | |||
Activités de traitement des paiements fournisseurs
| Activité | Description | ||
|---|---|---|---|
| Facture approuvée | L'instance de workflow de la facture en attente atteint un statut terminé ou approuvé. La facture est maintenant prête à être comptabilisée au grand livre. | ||
| Pourquoi c'est important Calcule le délai moyen d'approbation. Les retards à ce niveau ont un impact direct sur la capacité à bénéficier des escomptes pour paiement anticipé. Où obtenir WorkflowTrackingStatusTable.CreatedDateTime lorsque le TrackingStatus est Completed. Alternativement, VendInvoiceInfoTable.RequestStatus est égal à Approved. Capture Enregistré lorsque l'instance de workflow est terminée Type d'événement explicit | |||
| Facture comptabilisée | La facture est comptabilisée au grand livre général, créant une dette dans le système. L'enregistrement passe des tables en attente aux tables de transactions comptabilisées. | ||
| Pourquoi c'est important Une étape majeure indiquant la reconnaissance financière de la dette. Cette activité permet de sélectionner la facture pour paiement. Où obtenir Création d'un enregistrement dans VendInvoiceJour et VendTrans. La TransDate représente la date d'enregistrement. Capture Enregistré lors de l'exécution de la transaction X Type d'événement explicit | |||
| Facture créée | La création initiale d'un enregistrement de facture fournisseur en attente dans le système. Cela marque l'entrée de la facture dans le workflow de Dynamics 365, soit manuellement, soit via l'importation d'entités de données. | ||
| Pourquoi c'est important Établit l'heure de début pour les calculs de délai du processus. Il permet aux organisations de mesurer le temps pendant lequel les factures restent dans le système avant d'être traitées ou enregistrées. Où obtenir VendInvoiceInfoTable.CreatedDateTime ou horodatage de création de VendInvoiceInfoTable.RecId. Cela correspond à l'en-tête de la facture fournisseur en attente. Capture Enregistré lors de la création de l'enregistrement dans VendInvoiceInfoTable Type d'événement explicit | |||
| Facture rapprochée du bon de commande | Le système lie avec succès la ligne de facture à un bon de commande ou un reçu de produit. Cette activité signifie la validation de la facture par rapport à la commande d'approvisionnement. | ||
| Pourquoi c'est important Critique pour le KPI du taux de rapprochement des bons de commande au premier passage. Il fait la distinction entre le traitement sans intervention manuelle et les factures nécessitant une intervention manuelle. Où obtenir VendInvoiceInfoLine.PurchId et VendInvoiceInfoTable.MatchStatus. Déduit lorsque le MatchStatus passe à Passed. Capture Comparer le champ MatchStatus avant/après Type d'événement inferred | |||
| Journal des paiements créé | La facture est sélectionnée et ajoutée à une ligne du journal des paiements. Cela indique l'intention de payer et initie généralement le workflow d'examen des paiements. | ||
| Pourquoi c'est important Marque la transition de la dette au traitement du décaissement. Utilisé pour mesurer les délais d'exécution des paiements. Où obtenir LedgerJournalTrans.CreatedDateTime. La facture est liée via le champ MarkedInvoice ou les tables de règlement. Capture Enregistré lors de la création de l'enregistrement dans LedgerJournalTrans Type d'événement explicit | |||
| Paiement comptabilisé | Le journal des paiements est comptabilisé au grand livre général, réglant la facture et soldant le compte fournisseur. Cela finalise le processus financier. | ||
| Pourquoi c'est important L'activité finale pour le « Temps de cycle moyen de la facture au paiement ». Elle confirme que les écritures comptables pour la réduction de trésorerie sont finalisées. Où obtenir LedgerJournalTrans est enregistré. Met à jour VendTrans pour afficher le règlement. L'événement réel est l'enregistrement du journal. Capture Enregistré lors de l'exécution de la transaction X Type d'événement explicit | |||
| Paiement généré | Le système génère le fichier de paiement (TEF, ISO20022) ou imprime les chèques. Le statut de paiement sur la ligne du journal se met à jour en « Envoyé » ou « Généré ». | ||
| Pourquoi c'est important Supporte le KPI de « Délai entre l'approbation et l'exécution ». Il confirme que l'instruction de paiement a été générée. Où obtenir Le statut de paiement de LedgerJournalTrans passe à Envoyé/Reçu. Souvent déduit des mises à jour de la ligne. Capture Comparer le champ PaymentStatus avant/après Type d'événement inferred | |||
| Blocage de paiement appliqué | Un blocage est appliqué à la transaction fournisseur, l'empêchant d'être sélectionnée dans une proposition de paiement. Cela est souvent effectué manuellement en cas de litige. | ||
| Pourquoi c'est important Supporte l'analyse des blocages de paiement et des frictions. Révèle les interventions manuelles qui retardent les décaissements. Où obtenir Le flag VendTrans.Approved est défini sur No, ou des champs de statut OnHold spécifiques sont renseignés. Nécessite le suivi des mises à jour de VendTrans. Capture Comparer le champ de statut avant/après Type d'événement inferred | |||
| Échec du rapprochement de facture | Le processus de rapprochement identifie un écart entre la facture et le bon de commande/réception (écart de prix ou de quantité). Cela interrompt souvent le processus jusqu'à sa résolution. | ||
| Pourquoi c'est important Identifie les points de friction spécifiques dans le processus de rapprochement. Soutient le tableau de bord « Tendance des rapprochements et écarts de bons de commande ». Où obtenir Le MatchStatus de VendInvoiceInfoTable passe à Failed ou Discrepancy. Également visible dans les écarts de rapprochement de VendInvoiceInfoLine. Capture Comparer le champ MatchStatus avant/après Type d'événement inferred | |||
| Facture mise à jour | Enregistre les modifications apportées à l'en-tête ou aux lignes de la facture avant la comptabilisation. Des mises à jour fréquentes peuvent indiquer des problèmes d'extraction de données ou des corrections manuelles nécessaires lors de la validation. | ||
| Pourquoi c'est important Une fréquence élevée de mises à jour suggère des boucles de retravail ou une mauvaise qualité des données source (par exemple, des erreurs d'OCR). Ceci soutient le Moniteur de retravail et de précision des données. Où obtenir Journal de base de données (SysDatabaseLog) sur VendInvoiceInfoTable si activé, ou déduit des changements de ModifiedDateTime si la fréquence de sondage est élevée. Capture Comparer ModifiedDateTime lors des extractions ultérieures Type d'événement inferred | |||
| Facture soumise pour approbation | La facture en attente est soumise au moteur de workflow pour examen. Cela marque la transition de la saisie/rapprochement des données à la phase d'autorisation. | ||
| Pourquoi c'est important Marque le début du cycle d'approbation. Essentiel pour analyser l'efficacité des hiérarchies internes. Où obtenir WorkflowTrackingStatusTable.CreatedDateTime where ContextTableId equals VendInvoiceInfoTable ID and Status is Submitted. Capture Enregistré lors de l'initiation de l'instance de workflow Type d'événement explicit | |||
| Journal des paiements approuvé | Le workflow du journal des paiements est approuvé, autorisant la génération des paiements. C'est la vérification finale avant que les fonds ne soient préparés pour le transfert. | ||
| Pourquoi c'est important Sépare la préparation administrative des paiements du goulot d'étranglement de l'autorisation. Où obtenir WorkflowTrackingStatusTable linking to the LedgerJournalTable (Header) ID. Status is Completed. Capture Enregistré lorsque l'instance de workflow est terminée Type d'événement explicit | |||
Guides d'extraction
Étapes
Accéder à l'espace de travail Gestion des données : Connectez-vous à votre environnement Microsoft Dynamics 365 Finance. Accédez aux Espaces de travail et sélectionnez Gestion des données. C'est la plateforme centrale pour la configuration des projets d'exportation de données.
Créer un projet d'exportation : Cliquez sur la vignette Exporter pour créer un nouveau projet de données. Nommez le projet clairement, par exemple, ProcessMining_AP_Export. Dans le champ Format des données cible, sélectionnez le format de destination (par exemple, Azure SQL DB pour BYOD ou CSV pour l'exportation basée sur des fichiers).
Ajouter des entités de données : Ajoutez les entités de données standards suivantes au projet une par une : VendorInvoiceHeaderEntity (pour les factures en attente), VendorInvoiceLineEntity (pour les lignes de facture), VendorInvoiceJournalHeaderEntity (pour les factures enregistrées), VendorPaymentJournalLineEntity (pour les paiements), et WorkflowHistoryEntity (pour les journaux d'approbation). Si WorkflowHistoryEntity n'est pas disponible par défaut, vous devrez peut-être activer une entité personnalisée ou une entité système spécifique exposée pour l'exportation.
Configurer les filtres d'entité : Pour chaque entité, cliquez sur l'icône Filtrer. Appliquez des filtres pour restreindre les données à l'élément CompanyInfo pertinent (DataAreaId) et définissez une plage de dates sur les champs CreatedDateTime ou InvoiceDate pour extraire les données uniquement pour la période d'analyse souhaitée (par exemple, les 12 derniers mois).
Configurer l'exportation récurrente : Pour garantir que le journal d'événements reste à jour, créez une tâche de données récurrente. Définissez la fréquence de récurrence (par exemple, quotidienne ou horaire) et activez le Push incrémentiel si pris en charge. Cela réduit la charge du système en n'exportant que les enregistrements modifiés.
Exécuter l'exportation initiale : Exécutez le projet manuellement pour la première fois en cliquant sur Exporter maintenant. Surveillez le résumé d'exécution pour vous assurer que tous les enregistrements sont exportés avec succès et sans erreurs.
Transformer les données : Une fois les données exportées vers votre destination (Azure SQL ou fichiers), utilisez le script SQL fourni dans la section Requête pour joindre ces tables. Cette logique de transformation convertit les enregistrements d'entités disparates en un journal d'événements chronologique unique.
Mapper les attributs : Assurez-vous que l'ensemble de données résultant mappe le Numéro de facture à l'ID de cas, l'Heure de l'événement à l'horodatage, et l'Activité au Nom de l'activité, conformément aux exigences de l'outil de Process Mining.
Valider et télécharger : Exécutez les contrôles de validation listés ci-dessous pour confirmer l'exactitude des données. Une fois vérifié, exportez le résultat final sous forme de fichier CSV ou Parquet et téléchargez-le dans ProcessMind.
Configuration
- Sélection des entités : Utilisez VendorInvoiceHeaderEntity et VendorInvoiceLineEntity pour les étapes de processus avant l'enregistrement. Utilisez VendorInvoiceJournalHeaderEntity pour le document légal et enregistré. Utilisez VendorPaymentJournalLineEntity pour le suivi des paiements.
- Push incrémentiel : Activez ce paramètre dans le projet de Gestion des données pour exporter uniquement les enregistrements nouveaux ou modifiés après le chargement complet initial. C'est essentiel pour les performances.
- Plages de dates : Filtrez par InvoiceDate >= [Date de début]. Évitez les exportations illimitées qui peuvent entraîner des dépassements de délai.
- Filtre par société : D365 est un système multi-entités. Filtrez toujours par DataAreaId pour éviter de mélanger les données de différentes entités juridiques, sauf si une analyse inter-sociétés est prévue.
- Historique des workflows : Les entités standards pour l'historique des workflows peuvent être volumineuses. Assurez-vous de n'exporter que l'historique lié aux types VendInvoice pour maintenir un volume gérable.
a Exemple de requête config
/*
SQL Transformation Script for D365 Finance AP Process
Assumes data is loaded into Staging tables in a SQL environment (BYOD/Data Lake)
*/
SELECT
I.InvoiceNumber AS [InvoiceNumber],
'Invoice Created' AS [Activity],
I.CreatedDateTime AS [EventTime],
I.DataAreaId AS [CompanyCode],
I.InvoiceAccount AS [VendorAccount],
I.InvoiceAmount AS [InvoiceAmount],
I.CurrencyCode AS [Currency],
'D365 FO' AS [SourceSystem],
GETDATE() AS [LastDataUpdate]
FROM Staging_VendorInvoiceHeaderEntity I
UNION ALL
/* Capture updates to invoice headers */
SELECT
I.InvoiceNumber,
'Invoice Updated',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceHeaderEntity I
WHERE I.ModifiedDateTime > I.CreatedDateTime
UNION ALL
/* Invoice Matching Activities */
SELECT
I.InvoiceNumber,
'Invoice Matched to PO',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceHeaderEntity I
WHERE I.MatchStatus = 'Matched' -- Adjust value based on system config
UNION ALL
SELECT
I.InvoiceNumber,
'Invoice Match Failed',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceHeaderEntity I
WHERE I.MatchStatus = 'Failed'
UNION ALL
/* Workflow Activities */
SELECT
RelatedContext AS InvoiceNumber,
CASE
WHEN Status = 'Submitted' THEN 'Invoice Submitted for Approval'
WHEN Status = 'Approved' THEN 'Invoice Approved'
ELSE 'Workflow Activity'
END AS [Activity],
CreatedDateTime AS [EventTime],
DataAreaId,
NULL AS [VendorAccount],
NULL AS [InvoiceAmount],
NULL AS [Currency],
'D365 FO',
GETDATE()
FROM Staging_WorkflowHistoryEntity
WHERE ContextTableId = 12345 -- Replace with TableId for VendInvoiceInfoTable
AND Status IN ('Submitted', 'Approved')
UNION ALL
/* Invoice Posted */
SELECT
J.InvoiceNumber,
'Invoice Posted',
J.PostedDateTime,
J.DataAreaId,
J.InvoiceAccount,
J.InvoiceAmount,
J.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceJournalHeaderEntity J
UNION ALL
/* Payment Block */
SELECT
I.InvoiceNumber,
'Payment Block Applied',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceJournalHeaderEntity I
WHERE I.OnHold = 'Yes'
UNION ALL
/* Payment Activities */
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Journal Created' AS [Activity],
P.CreatedDateTime AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue AS [VendorAccount],
P.DebitAmount AS [InvoiceAmount],
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
UNION ALL
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Journal Approved' AS [Activity],
P.ModifiedDateTime AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue,
P.DebitAmount,
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
WHERE P.PaymentStatus = 'Approved'
UNION ALL
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Generated' AS [Activity],
P.ModifiedDateTime AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue,
P.DebitAmount,
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
WHERE P.PaymentStatus = 'Sent'
UNION ALL
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Posted' AS [Activity],
P.PostedDate AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue,
P.DebitAmount,
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
WHERE P.IsPosted = 'Yes' Étapes
Vérifier la connectivité BYOD : Assurez-vous d'avoir SQL Server Management Studio (SSMS) ou un outil similaire installé et de pouvoir vous connecter à la base de données Azure SQL configurée comme cible Bring Your Own Database (BYOD) pour votre environnement Dynamics 365 Finance & Operations.
Confirmer l'exportation des entités : Naviguez vers l'espace de travail Gestion des données dans Dynamics 365. Vérifiez que les entités suivantes (ou leurs tables sous-jacentes) sont configurées pour l'exportation vers la base de données BYOD :
VendInvoiceInfoTable(Factures en attente),VendInvoiceInfoLine(Lignes en attente),VendInvoiceJour(Factures enregistrées),VendTrans(Transactions fournisseurs),LedgerJournalTrans(Lignes de journal),LedgerJournalTable(En-têtes de journal), etWorkflowTrackingStatusTable(Historique des workflows).Configurer le projet d'exportation : Si ces tables ne sont pas actuellement exportées, créez un nouveau projet d'exportation. Définissez le Format de données cible sur votre base de données SQL BYOD. Choisissez le Push incrémentiel pour maintenir les données synchronisées sans ré-exportations complètes. Exécutez la tâche pour peupler les tables.
Préparer l'environnement SQL : Ouvrez SSMS et connectez-vous à la base de données Azure SQL BYOD. Ouvrez une nouvelle fenêtre de requête.
Définir les paramètres : Dans le script fourni ci-dessous, localisez la section de déclaration des variables en haut. Mettez à jour les variables
@StartDateet@EndDatepour qu'elles correspondent à la période que vous souhaitez analyser. Si vous devez filtrer par une entité juridique spécifique, mettez à jour les conditions de filtreDATAAREAID.Exécuter le script : Exécutez le script T-SQL complet. Ce script utilise
UNION ALLpour combiner les données de plusieurs tables en un format de journal d'événements standardisé unique.Valider les données : Vérifiez les résultats pour les valeurs nulles dans les colonnes
InvoiceNumberouEventTime. Assurez-vous que les factures enregistrées (deVendInvoiceJour) et les factures en attente (deVendInvoiceInfoTable) apparaissent bien.Exporter le résultat : Cliquez avec le bouton droit sur la grille des résultats dans SSMS et sélectionnez Enregistrer les résultats sous.... Enregistrez le fichier au format CSV (séparé par des virgules).
Mettre en forme pour le téléchargement : Ouvrez le CSV dans Excel ou un éditeur de texte pour vous assurer que les formats de date sont conformes à la norme ISO 8601 (AAAA-MM-JJ HH:MM:SS) si requis par ProcessMind. Aucune autre transformation ne devrait être nécessaire si le script s'est exécuté avec succès.
Télécharger vers ProcessMind : Importez le fichier CSV dans ProcessMind, en mappant les colonnes
InvoiceNumberà l'ID de cas,Activityau Nom de l'activité, etEventTimeà l'Horodatage.
Configuration
- Stratégie d'exportation : Utilisez le Push incrémentiel pour les tables à volume élevé comme
LedgerJournalTransetVendTransafin de minimiser la charge BYOD. N'utilisez le Full Push que si des incohérences de données sont suspectées. - Gestion des fuseaux horaires : Dynamics 365 stocke les données en UTC. Le script suppose l'UTC. Si votre analyse nécessite l'heure locale, appliquez un ajustement
DATEADDdans le script ou lors de l'importation ProcessMind. - Filtrage par société : La colonne
DataAreaIdreprésente l'entité juridique. Le script extrait les données pour toutes les entités par défaut. AjoutezWHERE DataAreaId = 'usmf'(exemple) pour filtrer une filiale spécifique. - Historique des workflows : La table
WorkflowTrackingStatusTableest essentielle pour les horodatages d'approbation. Assurez-vous que cette table est incluse dans votre configuration d'exportation BYOD, car elle est souvent omise par défaut. - Rétention des données : Soyez conscient des routines de nettoyage dans D365 qui pourraient supprimer l'historique de workflow complété ou les lignes de journal enregistrées, car cela limiterait la profondeur historique de l'analyse du Process Mining.
a Exemple de requête sql
/* T-SQL Extraction Script for D365 AP Payment Processing */
/* Tables required: VendInvoiceInfoTable, VendInvoiceInfoLine, VendInvoiceJour, VendTrans, LedgerJournalTrans, LedgerJournalTable, WorkflowTrackingStatusTable */
DECLARE @StartDate DATETIME = '2023-01-01 00:00:00';
DECLARE @EndDate DATETIME = GETDATE();
WITH RawData AS (
/* 1. Invoice Created: Pending Invoice Header Creation */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Created' AS Activity,
T1.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
T1.CreatedBy AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoTable T1
WHERE T1.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 2. Invoice Updated: Modifications to Pending Invoice */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Updated' AS Activity,
T1.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
T1.ModifiedBy AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoTable T1
WHERE T1.ModifiedDateTime BETWEEN @StartDate AND @EndDate
AND T1.ModifiedDateTime > T1.CreatedDateTime
UNION ALL
/* 3. Invoice Matched to PO: Line Matching Success */
SELECT
H.Num AS InvoiceNumber,
'Invoice Matched to PO' AS Activity,
L.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
H.InvoiceAccount AS VendorAccount,
H.DataAreaId AS CompanyCode,
CAST(H.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
H.DueDate AS DueDate,
H.PurchId AS PurchaseOrderNumber,
L.ModifiedBy AS UserId,
H.VendorName AS VendorName,
H.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoLine L
JOIN dbo.VendInvoiceInfoTable H ON L.TableRefId = H.TableRefId AND L.DataAreaId = H.DataAreaId
WHERE L.MatchStatus = 1 /* 1 usually denotes Matched/Passed in enum */
AND L.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 4. Invoice Match Failed: Line Matching Discrepancy */
SELECT
H.Num AS InvoiceNumber,
'Invoice Match Failed' AS Activity,
L.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
H.InvoiceAccount AS VendorAccount,
H.DataAreaId AS CompanyCode,
CAST(H.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
H.DueDate AS DueDate,
H.PurchId AS PurchaseOrderNumber,
L.ModifiedBy AS UserId,
H.VendorName AS VendorName,
H.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoLine L
JOIN dbo.VendInvoiceInfoTable H ON L.TableRefId = H.TableRefId AND L.DataAreaId = H.DataAreaId
WHERE L.MatchStatus = 2 /* 2 usually denotes Failed in enum */
AND L.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 5. Invoice Submitted for Approval: Workflow Submission */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Submitted for Approval' AS Activity,
W.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
W.User AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.WorkflowTrackingStatusTable W
JOIN dbo.VendInvoiceInfoTable T1 ON W.ContextRecId = T1.RecId
WHERE W.TrackingStatus = 1 /* Submitted */
AND W.ContextTableId = 1425 /* TableId for VendInvoiceInfoTable, adjust if different in version */
AND W.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 6. Invoice Approved: Workflow Completion */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Approved' AS Activity,
W.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
W.User AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.WorkflowTrackingStatusTable W
JOIN dbo.VendInvoiceInfoTable T1 ON W.ContextRecId = T1.RecId
WHERE W.TrackingStatus = 2 /* Completed/Approved */
AND W.ContextTableId = 1425
AND W.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 7. Invoice Posted: Creation of VendInvoiceJour */
SELECT
J.InvoiceId AS InvoiceNumber,
'Invoice Posted' AS Activity,
J.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
J.InvoiceAccount AS VendorAccount,
J.DataAreaId AS CompanyCode,
CAST(J.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
J.DueDate AS DueDate,
J.PurchId AS PurchaseOrderNumber,
J.CreatedBy AS UserId,
J.InvoicingName AS VendorName,
J.InvoiceDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceJour J
WHERE J.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 8. Payment Block Applied: Updated on VendTrans */
SELECT
J.InvoiceId AS InvoiceNumber,
'Payment Block Applied' AS Activity,
VT.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
J.InvoiceAccount AS VendorAccount,
J.DataAreaId AS CompanyCode,
CAST(J.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
J.DueDate AS DueDate,
J.PurchId AS PurchaseOrderNumber,
VT.ModifiedBy AS UserId,
J.InvoicingName AS VendorName,
J.InvoiceDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendTrans VT
JOIN dbo.VendInvoiceJour J ON VT.Invoice = J.InvoiceId AND VT.AccountNum = J.InvoiceAccount AND VT.DataAreaId = J.DataAreaId
WHERE VT.Approved = 0 /* 0 indicates Not Approved/Blocked */
AND VT.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 9. Payment Journal Created: Line added to Journal */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Journal Created' AS Activity,
LJT.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJT.CreatedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTrans LJT
WHERE LJT.AccountType = 2 /* Vendor */
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJT.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 10. Payment Journal Approved: Workflow on Journal Header */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Journal Approved' AS Activity,
LJH.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJH.ModifiedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTable LJH
JOIN dbo.LedgerJournalTrans LJT ON LJH.JournalNum = LJT.JournalNum AND LJH.DataAreaId = LJT.DataAreaId
WHERE LJH.WorkflowApprovalStatus = 2 /* Approved */
AND LJT.AccountType = 2
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJH.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 11. Payment Generated: Payment Status Changed to Sent */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Generated' AS Activity,
LJT.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJT.ModifiedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTrans LJT
WHERE LJT.PaymentStatus = 2 /* Sent/Generated */
AND LJT.AccountType = 2
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJT.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 12. Payment Posted: Journal Line Posted */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Posted' AS Activity,
LJT.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJT.ModifiedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTrans LJT
WHERE LJT.Posted = 1 /* Posted */
AND LJT.AccountType = 2
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJT.ModifiedDateTime BETWEEN @StartDate AND @EndDate
)
SELECT *
FROM RawData
WHERE InvoiceNumber IS NOT NULL AND InvoiceNumber <> ''
ORDER BY InvoiceNumber, EventTime;