Votre modèle de données pour le traitement des paiements fournisseurs
Votre modèle de données pour le traitement des paiements fournisseurs
- Attributs du processus pour l’analyse financière
- Étapes clés du processus de paiement à suivre
- Instructions détaillées d’extraction pour Dynamics 365
Attributs du traitement des paiements fournisseurs
| Nom | Description | ||
|---|---|---|---|
| Activité Activity | Tâche ou changement de statut précis qui s’est produit. | ||
| Description Cet attribut décrit l’événement ou l’étape du processus, par exemple « Facture créée », « Facture approuvée » ou « Paiement comptabilisé ». Il traduit les types de transactions techniques et les changements de statut du flux de travail en événements compréhensibles pour l’entreprise. Dans Dynamics 365, ces activités sont souvent déduites d’une combinaison d’insertions dans les tables, par exemple la création d’un enregistrement dans Pourquoi est-ce important ? Il définit le flux du processus et la séquence des événements représentés sur la carte de processus. Où trouver ces données Déduit de différentes tables de transactions et des journaux d’historique du flux de travail Exemples Facture crééeFacture approuvéePaiement généré | |||
| Heure de l’événement EventTime | Horodatage auquel l’activité s’est produite. | ||
| Description Cet attribut enregistre la date et l’heure exactes auxquelles une activité a eu lieu. Il sert à ordonner les événements chronologiquement et à calculer les durées entre les étapes. Dans Dynamics 365, il provient généralement de Pourquoi est-ce important ? Indispensable pour calculer les temps de cycle et les délais, et repérer les goulots d’étranglement. Où trouver ces données Champs système CreatedDateTime ou ModifiedDateTime des tables de transactions Exemples 2023-10-01T08:30:00Z2023-10-01T14:15:22Z2023-10-05T09:00:00Z | |||
| Numéro de facture InvoiceNumber | Identifiant unique attribué à la facture fournisseur. | ||
| Description Le numéro de facture est l’identifiant de cas de référence pour cette vue du processus. Il regroupe de manière unique tous les événements associés à une facture fournisseur et permet d’analyser son parcours complet, de la réception au règlement. Dans Microsoft Dynamics 365, il correspond généralement au champ Pourquoi est-ce important ? Il s’agit de la clé essentielle qui relie les activités distinctes des comptes fournisseurs au sein d’une même instance de processus. Où trouver ces données Table : VendInvoiceJour, champ : InvoiceId Exemples INV-2023-00198223344ACME-OCT-22 | |||
| Dernière mise à jour des données LastDataUpdate | Horodatage de l’extraction ou de l’actualisation des données. | ||
| Description Indique l’actualité des données utilisées pour l’analyse. Permet de savoir si vous consultez des données en temps réel ou un instantané d’une période antérieure. Cet horodatage est généralement généré par le processus ETL (extraction, transformation, chargement) et non par un champ de Dynamics 365. Pourquoi est-ce important ? Indispensable pour établir la confiance dans les Dashboards et les KPI. Où trouver ces données Généré par le script d’extraction Exemples 2023-10-25T12:00:00Z2023-11-01T06:00:00Z | |||
| Système source SourceSystem | Nom du système d’où proviennent les données. | ||
| Description Identifie le logiciel ou l’environnement source à partir duquel les données du processus ont été extraites. Dans ce contexte, il s’agit toujours de l’instance Microsoft Dynamics 365. Cet attribut est particulièrement utile dans les environnements comportant plusieurs systèmes, où les données peuvent provenir d’ERP et de solutions de numérisation externes. Pourquoi est-ce important ? Garantit la traçabilité de l’origine des données dans les analyses portant sur plusieurs systèmes. Où trouver ces données Défini en dur ou configuré lors de l’extraction Exemples Dynamics 365 F&OD365 PRODMicrosoft Dynamics | |||
| Code société CompanyCode | Identifiant de l’entité juridique ou de la filiale. | ||
| Description Désigne l’entité juridique de l’organisation dans laquelle la facture est traitée. Dans Microsoft Dynamics 365, le champ système Cet attribut est essentiel à l’analyse des délais de bout en bout et permet de comparer différentes filiales ou unités géographiques. Pourquoi est-ce important ? Permet de comparer différentes unités opérationnelles ou différents pays. Où trouver ces données Table : VendInvoiceJour, champ : DataAreaId Exemples USMFDEMFGBSI | |||
| Compte fournisseur VendorAccount | Numéro de compte unique du fournisseur. | ||
| Description Identifiant unique du fournisseur concerné par la transaction. Dans Dynamics 365, il correspond au champ Cet attribut est au cœur de la vue « Complexité des relations fournisseurs », qui permet d’analyser les performances et les points de friction propres à chaque relation fournisseur. Pourquoi est-ce important ? Permet de comparer les performances du processus par fournisseur. Où trouver ces données Table : VendInvoiceJour, champ : InvoiceAccount ou OrderAccount Exemples US-101V000452001 | |||
| Date d’échéance DueDate | Date à laquelle la facture doit être payée. | ||
| Description La date contractuelle à laquelle le paiement doit être effectué pour éviter des pénalités. Dans Dynamics 365, elle est enregistrée dans le champ Elle sert de référence principale pour le KPI « Taux de paiement à temps » et aide à hiérarchiser les tâches dans la vue « Débit et volume du processus fournisseurs ». Pourquoi est-ce important ? La référence pour mesurer le respect des délais de paiement. Où trouver ces données Table : VendInvoiceJour ou VendTrans, champ : DueDate Exemples 2023-11-302023-12-15 | |||
| Date de facture InvoiceDate | La date indiquée sur la facture. | ||
| Description La date figurant sur la facture du fournisseur. Dans Dynamics 365, il s’agit du champ Elle est utilisée dans l’analyse « Délai de bout en bout » pour mesurer la durée totale du cycle du point de vue du fournisseur. Pourquoi est-ce important ? Détermine le début de la période de vieillissement de la facture. Où trouver ces données Table : VendInvoiceJour, champ : InvoiceDate Exemples 2023-10-012023-10-15 | |||
| ID utilisateur UserId | L’identifiant de l’utilisateur qui a effectué l’activité. | ||
| Description Identifie l’utilisateur système responsable d’une activité donnée, par exemple l’approbation d’une facture ou la comptabilisation d’un paiement. Cette information provient des champs Elle permet, dans l’analyse « Blocages de paiement et points de friction », de déterminer si certains gestionnaires déclenchent davantage de blocages que d’autres. Pourquoi est-ce important ? Permet d’analyser le comportement des ressources et la séparation des tâches. Où trouver ces données Champs système CreatedBy/ModifiedBy des tables de transactions et d’historique Exemples jdoeadminworkflow_sys | |||
| Montant de la facture InvoiceAmount | Montant total de la facture. | ||
| Description Montant total de la facture dans la devise de transaction. Dans Dynamics 365, il figure dans des champs tels que Utilisé dans le Dashboard de détection des risques de paiements en double pour rapprocher les montants des informations sur les fournisseurs. Pourquoi est-ce important ? Indispensable pour analyser le volume des dépenses et les risques financiers. Où trouver ces données Table : VendInvoiceJour, champ : InvoiceAmount Exemples 1500.00245.5010000.00 | |||
| Nom du fournisseur VendorName | Le nom de l’organisation fournisseur. | ||
| Description Le nom usuel du fournisseur. Dans D365, le compte fournisseur sert de clé étrangère vers le carnet d’adresses global ( Des noms faciles à lire facilitent l’utilisation de la vue « Complexité des relations fournisseurs » et rendent les Dashboards accessibles aux équipes métier. Pourquoi est-ce important ? Donne du contexte au numéro de compte fournisseur. Où trouver ces données Table : DirPartyTable (via VendTable), champ : Nom Exemples Contoso Office SupplyFabrikam ElectronicsLitware Inc. | |||
| Numéro de commande d’achat PurchaseOrderNumber | Le numéro de référence de la commande d’achat associée. | ||
| Description Relie la facture au document d’achat d’origine. Dans Dynamics 365, il s’agit du champ Cet attribut alimente le Dashboard « Correspondance des commandes d’achat et tendances des écarts », qui distingue les factures associées à une commande d’achat des factures sans commande. Pourquoi est-ce important ? Indispensable pour analyser le taux de correspondance du processus d’approvisionnement au paiement. Où trouver ces données Table : VendInvoiceJour, champ : PurchId Exemples PO-000455000342PO-22-998 | |||
| Service Department | Le service responsable du coût. | ||
| Description La dimension financière qui indique le service interne. Dans Dynamics 365, les dimensions sont stockées de manière dynamique, souvent dans Cet attribut est utilisé dans la vue « Complexité des relations fournisseurs » pour repérer les services internes qui génèrent le plus grand volume de factures fournisseurs. Pourquoi est-ce important ? Permet d’examiner les données par unité organisationnelle et d’analyser la répartition des responsabilités. Où trouver ces données Table : VendInvoiceJour, champ : DefaultDimension (nécessite la vue DimensionAttributeLevelValue) Exemples InformatiqueFinanceOpérations | |||
| Conditions de paiement PaymentTerms | Le code correspondant aux conditions de paiement convenues. | ||
| Description Le code de configuration qui détermine les dates d’échéance et les remises, par exemple Net30. Dans Dynamics 365, il s’agit du champ Il est analysé avec le « Temps de cycle » pour vérifier si les retards du processus entraînent le non-respect des conditions convenues. Pourquoi est-ce important ? Précise le contexte du calcul de la date d’échéance. Où trouver ces données Table : VendInvoiceJour, champ : PaymTermId Exemples Net302%10Net30COD | |||
| Date limite de remise CashDiscountDate | La date limite à laquelle le paiement doit être effectué pour bénéficier d’une remise. | ||
| Description La date limite pour bénéficier des remises pour paiement anticipé. Dans Dynamics 365, elle correspond au champ Cet attribut alimente le Dashboard « Performance de la récupération des remises », qui permet à l’organisation de quantifier les économies manquées. Pourquoi est-ce important ? A une incidence directe sur le KPI d’efficacité financière du processus. Où trouver ces données Table : VendInvoiceJour ou VendTrans, champ : 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 Ce code est nécessaire pour normaliser les montants dans l’association « Montant de l’activité » lorsque la conversion multidevise est requise. Pourquoi est-ce important ? Un contexte nécessaire à l’interprétation des valeurs financières. Où trouver ces données Table : VendInvoiceJour, champ : CurrencyCode Exemples USDEURGBP | |||
| Mode de paiement PaymentMethod | Le moyen utilisé pour régler la facture (par exemple, chèque, virement bancaire ou transfert électronique de fonds). | ||
| Description Indique comment les fonds sont transférés au fournisseur. Dans Dynamics 365, il s’agit du champ Cet attribut est utilisé dans le Dashboard « Délais d’exécution des paiements » pour évaluer l’efficacité des différents types de lots de paiement. Pourquoi est-ce important ? Permet d’expliquer les variations dans la phase d’exécution des paiements. Où trouver ces données Table : VendInvoiceJour (avec jointure aux informations PaymMode) ou VendTrans Exemples CHÈQUEACHVIREMENT | |||
| Numéro de pièce comptable VoucherNumber | Le numéro de pièce comptable associé à la transaction. | ||
| Description Identifiant interne de l’écriture dans le grand livre. Dans Dynamics 365, le champ Bien qu’il soit technique, cet identifiant est utile pour l’analyse « Parcours du processus et audit de conformité », car il permet de remonter des écritures jusqu’au grand livre à des fins de rapprochement. Pourquoi est-ce important ? Élément clé pour l’audit financier et le rapprochement. Où trouver ces données Table : VendInvoiceJour, champ : LedgerVoucher Exemples VOU-10023INV-ACC-992 | |||
| Paiement bloqué IsPaymentBlocked | Indicateur précisant si la facture est actuellement bloquée pour paiement. | ||
| Description Indicateur booléen qui précise si la facture est en attente. Dans Dynamics 365, il est souvent dérivé du statut Cet indicateur est au cœur de l’analyse « Blocages de paiement et points de friction » et met en évidence les interruptions du processus. Pourquoi est-ce important ? Permet de repérer les points de friction immédiats et les interventions manuelles. Où trouver ces données Table : VendTrans, champ : Approved (inversé) ou champs Hold spécifiques Exemples truefalse | |||
Activités du traitement des paiements fournisseurs
| Activité | Description | ||
|---|---|---|---|
| Facture approuvée | L’instance de flux de travail de la facture en attente atteint le statut terminé ou approuvé. La facture peut alors être comptabilisée dans le grand livre. | ||
| Pourquoi est-ce important ? Permet de calculer le délai moyen d’approbation. Les retards à cette étape réduisent directement les possibilités de bénéficier de remises pour paiement anticipé. Où trouver ces données WorkflowTrackingStatusTable.CreatedDateTime lorsque TrackingStatus est Completed. Autre possibilité : VendInvoiceInfoTable.RequestStatus est égal à Approved. Données à recueillir Enregistré à la fin de l’instance de flux de travail Type d’événement explicit | |||
| Facture comptabilisée | La facture est comptabilisée dans le grand livre général, ce qui crée une dette dans le système. L’enregistrement passe des tables des factures en attente aux tables des transactions comptabilisées. | ||
| Pourquoi est-ce important ? Étape importante qui marque la constatation comptable de la dette. La facture peut alors être sélectionnée pour paiement. Où trouver ces données Création d’un enregistrement dans VendInvoiceJour et VendTrans. TransDate correspond à la date de comptabilisation. Données à recueillir Enregistré lors de l’exécution de la transaction X Type d’événement explicit | |||
| Facture créée | Création initiale d’un enregistrement de facture fournisseur en attente dans le système. Cet événement marque l’entrée de la facture dans le flux de travail Dynamics 365, par saisie manuelle ou import d’une entité de données. | ||
| Pourquoi est-ce important ? Définit l’heure de début utilisée pour calculer le délai total du processus. Les organisations peuvent ainsi mesurer le temps pendant lequel les factures restent dans le système avant leur traitement ou leur comptabilisation. Où trouver ces données Horodatage de création de VendInvoiceInfoTable.CreatedDateTime ou de VendInvoiceInfoTable.RecId. Il s’agit de l’en-tête de facture fournisseur en attente. Données à recueillir Enregistré lors de la création d’un enregistrement dans VendInvoiceInfoTable Type d’événement explicit | |||
| Facture rapprochée avec la commande d’achat | Le système associe correctement la ligne de facture à une commande d’achat ou à un reçu de produit. Cette activité indique que la facture a été vérifiée par rapport à la commande d’approvisionnement. | ||
| Pourquoi est-ce important ? Indicateur essentiel pour le KPI du taux de rapprochement des commandes d’achat dès la première tentative. Il permet de distinguer le traitement sans intervention manuelle des factures nécessitant une intervention. Où trouver ces données VendInvoiceInfoLine.PurchId et VendInvoiceInfoTable.MatchStatus. Déduit lorsque MatchStatus passe à Passed. Données à recueillir Comparer le champ MatchStatus avant et après Type d’événement inferred | |||
| Journal de paiement créé | La facture est sélectionnée et ajoutée à une ligne du journal de paiement. Cela indique l’intention de payer et lance généralement le flux de travail d’examen du paiement. | ||
| Pourquoi est-ce important ? Marque le passage du suivi des dettes au traitement des décaissements. Sert à mesurer les délais d’exécution des paiements. Où trouver ces données LedgerJournalTrans.CreatedDateTime. La facture est associée au moyen du champ MarkedInvoice ou des tables de règlement. Données à recueillir Enregistré lors de la création d’un enregistrement dans LedgerJournalTrans Type d’événement explicit | |||
| Paiement comptabilisé | Le journal de paiement est comptabilisé dans le grand livre général, ce qui règle la facture et solde le compte fournisseur. Cette étape clôt le processus financier. | ||
| Pourquoi est-ce important ? Dernière activité prise en compte dans le temps de cycle moyen entre la facture et le paiement. Elle confirme que les écritures comptables correspondant à la sortie de trésorerie sont finalisées. Où trouver ces données LedgerJournalTrans est comptabilisé. VendTrans est mis à jour pour indiquer le règlement. L’événement réel correspond à la comptabilisation du journal. Données à recueillir 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 (EFT, ISO20022) ou imprime les chèques. Le statut du paiement sur la ligne du journal passe à Sent ou Generated. | ||
| Pourquoi est-ce important ? Alimente le KPI du délai entre l’approbation et l’exécution. Confirme que l’ordre de paiement a été généré. Où trouver ces données LedgerJournalTrans.PaymentStatus passe à Sent/Recieved. L’événement est souvent déduit des mises à jour de la ligne. Données à recueillir Comparer le champ PaymentStatus avant et après Type d’événement inferred | |||
| Blocage du paiement appliqué | La transaction fournisseur est mise en attente et ne peut plus être sélectionnée dans une proposition de paiement. Cette mesure est souvent appliquée manuellement en cas de litige. | ||
| Pourquoi est-ce important ? Alimente l’analyse des blocages de paiement et des points de friction. Révèle les interventions manuelles qui retardent les décaissements. Où trouver ces données L’indicateur VendTrans.Approved est défini sur No, ou des champs de statut OnHold spécifiques sont renseignés. Le suivi des mises à jour de VendTrans est nécessaire. Données à recueillir Comparer le champ de statut avant et après Type d’événement inferred | |||
| Échec du rapprochement de la facture | Le rapprochement révèle un écart entre la facture et la commande d’achat ou le reçu, par exemple une différence de prix ou de quantité. Le processus est souvent suspendu jusqu’à la résolution de l’écart. | ||
| Pourquoi est-ce important ? Repère les points de friction précis du rapprochement. Alimente le Dashboard des rapprochements de commandes d’achat et des tendances d’écarts. Où trouver ces données VendInvoiceInfoTable.MatchStatus passe à Failed ou Discrepancy. Les écarts de rapprochement sont également visibles dans VendInvoiceInfoLine. Données à recueillir Comparer le champ MatchStatus avant et 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 sa comptabilisation. Des mises à jour fréquentes peuvent révéler des problèmes d’extraction des données ou des corrections manuelles nécessaires lors de la validation. | ||
| Pourquoi est-ce important ? Des mises à jour fréquentes peuvent signaler des boucles de reprise ou une mauvaise qualité des données sources, par exemple des erreurs de reconnaissance optique de caractères (OCR). Cet indicateur alimente le suivi des reprises et de la précision des données. Où trouver ces données Journal de base de données (SysDatabaseLog) sur VendInvoiceInfoTable, s’il est activé, ou déduction à partir des changements de ModifiedDateTime si la fréquence d’interrogation est élevée. Données à recueillir Comparer ModifiedDateTime entre les extractions successives Type d’événement inferred | |||
| Facture soumise à approbation | La facture en attente est transmise au moteur de flux de travail pour examen. Elle passe ainsi de la saisie et du rapprochement à la phase d’autorisation. | ||
| Pourquoi est-ce important ? Marque le début du temps de cycle d’approbation. Cet indicateur est essentiel pour analyser l’efficacité des circuits de validation internes. Où trouver ces données WorkflowTrackingStatusTable.CreatedDateTime lorsque ContextTableId correspond à l’ID de VendInvoiceInfoTable et que Status est Submitted. Données à recueillir Enregistré au démarrage de l’instance de flux de travail Type d’événement explicit | |||
| Journal de paiement approuvé | Le flux de travail du journal de paiement est approuvé, ce qui autorise la génération des paiements. Il s’agit du dernier contrôle avant la préparation du transfert des fonds. | ||
| Pourquoi est-ce important ? Permet de distinguer la préparation administrative des paiements du goulot d’étranglement lié à leur autorisation. Où trouver ces données WorkflowTrackingStatusTable associé à l’ID de LedgerJournalTable (en-tête). Le statut est Completed. Données à recueillir Enregistré à la fin de l’instance de flux de travail Type d’événement explicit | |||
Guides d’extraction
Étapes
Accédez à l’espace de travail Gestion des données : Connectez-vous à votre environnement Microsoft Dynamics 365 Finance. Ouvrez Espaces de travail et sélectionnez Gestion des données. C’est depuis cet espace central que vous configurez les projets d’exportation de données.
Créez un projet d’exportation : Cliquez sur la vignette Exportation pour créer un projet de données. Donnez-lui un nom explicite, 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 une exportation vers des fichiers.
Ajoutez les entités de données : Ajoutez au projet, une par une, les entités de données standard suivantes : VendorInvoiceHeaderEntity (factures en attente), VendorInvoiceLineEntity (lignes de facture), VendorInvoiceJournalHeaderEntity (factures comptabilisées), VendorPaymentJournalLineEntity (paiements) et WorkflowHistoryEntity (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 proposée à l’exportation.
Configurez les filtres des entités : Pour chaque entité, cliquez sur l’icône Filtrer. Limitez les données à la valeur CompanyInfo (DataAreaId) concernée et définissez une période à partir des champs CreatedDateTime ou InvoiceDate afin de n’extraire que les données de la période à analyser, par exemple les 12 derniers mois.
Configurez une exportation récurrente : Pour que le journal d’événements reste à jour, créez une tâche de données récurrente. Définissez la fréquence, par exemple quotidienne ou horaire, et activez Incremental push lorsque cette option est disponible. Seuls les enregistrements modifiés seront ainsi exportés, ce qui réduit la charge du système.
Lancez l’exportation initiale : Exécutez manuellement le projet pour la première fois en cliquant sur Exporter maintenant. Consultez le récapitulatif d’exécution pour vérifier que tous les enregistrements ont été exportés sans erreur.
Transformez les données : Une fois les données exportées vers leur destination (Azure SQL ou fichiers), utilisez le script SQL fourni dans la section Query pour joindre ces tables. Cette transformation regroupe les enregistrements issus de différentes entités dans un journal d’événements unique, classé par ordre chronologique.
Associez les attributs : Vérifiez que le jeu de données obtenu associe InvoiceNumber à Case ID, EventTime à Timestamp et Activity à Activity Name, conformément aux exigences de l’outil de Process Mining.
Validez et importez les données : Effectuez les contrôles de validation ci-dessous pour vérifier l’exactitude des données. Une fois la validation terminée, exportez le résultat final au format CSV ou Parquet, puis importez-le dans ProcessMind.
Configuration
- Sélection des entités : Utilisez VendorInvoiceHeaderEntity et VendorInvoiceLineEntity pour les étapes du processus antérieures à la comptabilisation. Utilisez VendorInvoiceJournalHeaderEntity pour le document légal comptabilisé et VendorPaymentJournalLineEntity pour le suivi des paiements.
- Incremental Push : Activez ce paramètre dans le projet Gestion des données afin de n’exporter que les nouveaux enregistrements ou ceux qui ont été modifiés après le chargement complet initial. Cette option est essentielle pour préserver les performances.
- Périodes : Filtrez sur InvoiceDate >= [Start Date]. Évitez les exportations sans limite de période, qui risquent d’expirer.
- Filtre sur l’entreprise : D365 est un système multi-entités. Filtrez toujours sur DataAreaId pour éviter de mélanger les données de différentes entités juridiques, sauf si vous souhaitez effectuer une analyse interentreprises.
- Historique des flux de travail : Les entités standard contenant l’historique des flux de travail peuvent générer un volume important de données. N’exportez que l’historique lié aux types VendInvoice afin d’en limiter le volume.
Exemple de requête sql
/*
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érifiez la connexion BYOD : Assurez-vous que SQL Server Management Studio (SSMS) ou un outil similaire est installé et que vous pouvez 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.
Vérifiez l’exportation des entités : Ouvrez l’espace de travail Gestion des données dans Dynamics 365. Vérifiez que les entités suivantes, ou les tables sous-jacentes correspondantes, sont configurées pour être exportées vers la base de données BYOD :
VendInvoiceInfoTable(factures en attente),VendInvoiceInfoLine(lignes en attente),VendInvoiceJour(factures comptabilisées),VendTrans(transactions fournisseurs),LedgerJournalTrans(lignes de journal),LedgerJournalTable(en-têtes de journal) etWorkflowTrackingStatusTable(historique des flux de travail).Configurez la tâche d’exportation : Si ces tables ne sont pas déjà exportées, créez une nouvelle tâche d’exportation. Définissez la Target Data Format sur votre base de données SQL BYOD. Choisissez Incremental Push pour synchroniser les données sans effectuer d’exportations complètes. Exécutez la tâche pour alimenter les tables.
Préparez 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éfinissez les paramètres : Dans le script ci-dessous, repérez la section de déclaration des variables au début. Modifiez les variables
@StartDateet@EndDateselon la période à analyser. Pour filtrer sur une entité juridique précise, modifiez les conditions de filtrageDATAAREAID.Exécutez le script : Exécutez le script T-SQL complet. Il utilise
UNION ALLpour regrouper les données de plusieurs tables dans un format de journal d’événements standardisé.Validez les données : Vérifiez si les colonnes
InvoiceNumberouEventTimecontiennent des valeurs nulles. Assurez-vous que les factures comptabilisées (issues deVendInvoiceJour) et les factures en attente (issues deVendInvoiceInfoTable) apparaissent bien.Exportez le résultat : Faites un clic droit sur la grille de résultats dans SSMS et sélectionnez Save Results As.... Enregistrez le fichier au format CSV (valeurs séparées par des virgules).
Préparez le fichier pour l’importation : Ouvrez le CSV dans Excel ou dans un éditeur de texte pour vérifier que les dates sont au format ISO 8601 (YYYY-MM-DD HH:MM:SS), si ProcessMind l’exige. Aucune autre transformation n’est nécessaire si le script s’est exécuté correctement.
Importez les données dans ProcessMind : Importez le fichier CSV dans ProcessMind et associez les colonnes
InvoiceNumberà Case ID,Activityà Activité etEventTimeà Timestamp.
Configuration
- Stratégie d’exportation : Utilisez Incremental Push pour les tables volumineuses comme
LedgerJournalTransetVendTransafin de réduire la charge BYOD. N’utilisez Full Push que si vous soupçonnez des incohérences dans les données. - Gestion des fuseaux horaires : Dynamics 365 stocke les données en UTC. Le script part du principe qu’elles sont en UTC. Si votre analyse nécessite l’heure locale, appliquez un ajustement
DATEADDdans le script ou lors de l’importation dans ProcessMind. - Filtrage par entreprise : La colonne
DataAreaIdreprésente l’entité juridique. Par défaut, le script extrait les données de toutes les entités. AjoutezWHERE DataAreaId = 'usmf'(à titre d’exemple) pour filtrer sur une filiale précise. - Historique des flux de travail : La table
WorkflowTrackingStatusTableest essentielle pour obtenir les horodatages des approbations. Vérifiez qu’elle figure dans la configuration d’exportation BYOD, car elle est souvent omise par défaut. - Conservation des données : Tenez compte des routines de nettoyage de D365 susceptibles de supprimer l’historique des flux de travail terminés ou les lignes de journal comptabilisées, ce qui limitera la profondeur historique de l’analyse Process Mining.
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; Prêt à commencer ?
Utilisez ce modèle pour établir une base de données fiable et commencer dès aujourd’hui à optimiser vos flux de paiement. Notre équipe peut vous aider à associer les tables propres à votre environnement Dynamics 365.
Optimisez dès maintenant le traitement des paiements fournisseurs
Réduisez les temps de cycle de 30 % et éliminez les retards liés à D365.
Aucune carte bancaire requise. Configuration en cinq minutes.