← DocumentationDocumentation

X++ & standards Microsoft D365

Comment Skalp AI respecte les patterns d'extension Microsoft, applique les conventions XppBP et FxCop, et garantit la compatibilité avec les release waves One Version.

Les 3 patterns d'extension supportés

Depuis Dynamics 365 F&O 7.0 (anciennement AX 7), Microsoft a remplacé l'over-layering par un modèle d'extension. Le code core Microsoft n'est plus modifiable directement ; vous ajoutez votre logique métier en utilisant 3 patterns officiels.

Skalp AI utilise exclusivement ces 3 patterns. Aucun over-layering n'est jamais généré, garantissant que vos développements survivent aux release waves One Version (semestrielles) et aux upgrades majeurs sans intervention humaine.

Le choix du pattern dépend du besoin métier : étendre une table → Table Extension ; modifier un comportement existant → Chain of Command ; réagir à un événement → Event Handler. Skalp AI sélectionne le pattern le plus approprié et le documente dans le commentaire de la Pull Request.

Pattern 1 — Chain of Command (CoC)

Chain of Command (CoC) permet d'étendre une méthode existante sans la remplacer. Vous wrappez la méthode standard Microsoft avec votre propre logique avant et/ou après l'appel original. C'est le pattern recommandé pour modifier le comportement d'une classe, table ou formulaire standard.

Skalp AI génère des classes d'extension en CoC quand vous avez besoin d'ajouter une validation, un calcul, un side-effect ou une transformation autour d'une méthode existante. Le code suit la convention [ExtensionClassName]_Extension avec attribut [ExtensionOf(classStr(StandardClass))].

Exemple type : ajouter un contrôle de cohérence à la validation d'une commande PurchOrder avant la sauvegarde, sans toucher au code Microsoft. Le ticket génère une classe wrapper qui appelle next puis ajoute votre vérification métier.

Pattern 2 — Event Handlers

Les event handlers souscrivent à des événements pré- ou post-méthode publiés par les objets standards Microsoft. Quand l'événement est déclenché (onValidatingWrite, onInsert, onClicked, etc.), votre handler s'exécute.

Skalp AI génère des event handlers quand le besoin métier est asynchrone par nature : déclencher une intégration, envoyer une notification, alimenter un log d'audit, ou réagir à un changement de statut. Le code est packagé dans une classe statique avec attributs [SubscribesTo(...)].

Avantage clé : un event handler est complètement découplé du code principal. Il peut être désactivé sans impact sur le flux standard. Idéal pour les fonctionnalités optionnelles ou liées à un module spécifique.

Pattern 3 — Extension Classes (tables, formulaires, énumérations)

Les extension classes permettent d'ajouter des champs, méthodes, contrôles ou valeurs à une entité standard Microsoft sans la dupliquer. C'est le pattern le plus simple : il étend la définition de l'objet plutôt que son comportement.

Skalp AI génère des Table Extensions pour ajouter des champs métier (centre de profit, indicateur RGPD, référence externe…), des Form Extensions pour adapter les écrans (ajout d'onglet, masquage conditionnel, bouton custom), et des Enum Extensions pour étendre les listes de valeurs métier.

L'extension respecte automatiquement la convention de nommage Microsoft : suffixe .Extension, prefixe métier cohérent avec votre modèle (ex : SKL_CustTable_Extension), attribut [ExtensionOf(...)] systématique.

Pas d'over-layering — jamais

L'over-layering (modification directe du code Microsoft via la couche SLN, USR, etc.) était la norme jusqu'à AX 2012. Microsoft l'a déprécié officiellement depuis D365 F&O 7.0 et l'a rendu impossible techniquement dans les environnements cloud à partir de 10.0.

Skalp AI ne génère JAMAIS d'over-layering, même en migration depuis AX 2012. Tout code AX 2012 over-layered est systématiquement réécrit en pattern d'extension (CoC, event handler ou extension class selon le cas) lors de la migration.

Conséquence pratique : votre code Skalp AI survit aux release waves One Version sans intervention. Vous évitez la dette technique majeure qui freine la plupart des clients D365 lors des upgrades.

Tests unitaires SysTest et ATL

Tout code généré par Skalp AI est livré avec des tests unitaires. Vous pouvez les exécuter dans votre pipeline Azure DevOps via le runner SysTest standard, et exiger un seuil de couverture minimum dans vos branch policies.

  • Framework SysTest (Microsoft natif) : tests isolés sur les classes X++ d'extension, mock des dépendances via les patterns standard.
  • Acceptance Test Library (ATL) : helpers Microsoft pour le data setup, l'isolation transactionnelle et les assertions métier — utilisable en complément de SysTest si votre stratégie de test repose dessus.
  • Tests exécutables localement dans Visual Studio (Test Explorer) et dans le pipeline CI Azure DevOps (étape Run SysTest sur l'image build).
  • Couverture mesurable via le rapport SysTest natif (par classe, par méthode, par ligne). Configurable comme gate de Pull Request si vous souhaitez bloquer les merges sous un seuil donné.
  • Tests intentionnellement minimalistes — focus sur le comportement métier, pas sur les wrappers triviaux. Vous gardez la maîtrise de votre stratégie de test globale.

Conventions XppBP / FxCop respectées

Le code généré passe par défaut les règles XppBP (Best Practice) et FxCop activées dans votre pipeline CI Azure DevOps. Pas de correction post-livraison à prévoir.

  • Nommage des classes : préfixe métier cohérent (par défaut analysé depuis votre code existant ; configurable au ticket).
  • Encapsulation : méthodes publiques minimales, members privés par défaut, pas de logique métier dans des helpers statiques globaux.
  • Gestion d'erreur : throw error() avec libellés label/labelId, jamais de message hardcodé en X++.
  • Performance : queries optimisées via QueryBuildDataSource, pas de while select dans des boucles, indexation respectée.
  • Sécurité : Privileges/Duties/Roles respectés, pas d'accès direct aux tables sensibles sans contrôle d'autorisation.
  • Documentation inline : commentaires XML sur les méthodes publiques pour faciliter la maintenance.

Compatibilité One Version

Microsoft livre One Version sous forme de release waves successives (typiquement 8 vagues par an, avec service updates intermédiaires). Chaque vague peut introduire des changements de signature de méthode, des dépréciations ou des nouveaux events.

Skalp AI génère du code qui suit les contrats publics actuels documentés par Microsoft. Quand une signature change dans une release wave, vos extensions CoC peuvent nécessiter une mise à jour mineure (changement de signature) — détectée automatiquement lors du build CI.

Pour chaque release wave, Microsoft publie un "upgrade analyzer" qui flagge les extensions impactées. Si une de vos extensions générées par Skalp AI est impactée, vous pouvez soumettre un ticket de mise à jour (typiquement 200 € pour adapter à la nouvelle signature, parfois requalifié comme bonus sans facturation).

Statistiquement, moins de 5 % des extensions sont impactées à chaque release wave. Le ratio s'améliore avec les patterns d'extension qui sont la voie supportée par Microsoft long-terme.

Questions fréquentes

Le code généré est-il propriétaire de Microsoft ou de Skalp AI ?

Ni l'un ni l'autre : le code généré pour vos tickets est votre propriété intellectuelle, livré dans votre dépôt Azure DevOps. Cet engagement contractuel figure dans le contrat cadre signé au démarrage. Skalp AI ne réutilise jamais votre code pour entraîner ses modèles ni le partager avec d'autres clients.

Skalp AI peut-elle utiliser des bibliothèques tierces (NuGet) ?

Sur D365 F&O, les bibliothèques externes sont limitées par Microsoft (pas d'ajout libre de NuGet dans un modèle d'extension). Skalp AI utilise uniquement les bibliothèques officiellement référencées par votre modèle existant + celles autorisées par Microsoft (System.Net, Newtonsoft.Json pour les services custom, etc.).

Comment Skalp AI gère-t-elle les conflits entre extensions ?

Si deux extensions wrappent la même méthode via CoC, l'ordre d'exécution est défini par l'ordre de référencement des modèles. Skalp AI place toujours ses extensions en bout de chaîne pour ne pas casser des dépendances existantes. Si un conflit est détecté lors de l'analyse pré-génération, le ticket est notifié et requalifié.

Est-ce que ça marche aussi avec Dynamics 365 Commerce / Retail ?

Oui. D365 Commerce (Retail) utilise le même socle technique que F&O — extensions, X++, modèles. Les patterns sont strictement identiques. Customisations sur Commerce HQ, Modern POS / Cloud POS et headless e-commerce supportées.

Qu'en est-il de la sécurité du code généré ?

Tous les contrôles standards D365 (Privileges, Duties, Roles, Record-Level Security) sont respectés. Skalp AI ne génère jamais de bypass de sécurité. Pour les sujets critiques (financier, RH, données personnelles), une revue spécifique côté votre RSSI est recommandée avant merge — même si techniquement le code respecte les patterns Microsoft.

Convaincu par la qualité du code ?

Le code généré reste 100 % dans votre dépôt. Vous gardez la maîtrise complète.

Rejoindre la liste d'attente