Retour au blog Business Applications

Les champs personnalisés ne sont pas qu’une fonctionnalité : comment évaluer la flexibilité du modèle de données d’une application métier auto-hébergée

Les champs personnalisés peuvent soit adapter une application métier à votre processus, soit créer des données incohérentes, inaccessibles et difficiles à migrer. Utilisez ce cadre fondé sur des éléments vérifiables pour tester le modèle de données sous-jacent avant d’y engager des enregistrements opérationnels.

Équipe des opérations cartographiant des entités, relations et champs personnalisés gouvernés dans une application métier auto-hébergée

Les champs personnalisés sont une décision de gouvernance des données, pas une case à cocher

Une page produit indiquant « champs personnalisés pris en charge » répond à très peu de questions. Un champ peut être une zone de texte sans restriction, une liste contrôlée de valeurs autorisées, un lien vers un autre enregistrement ou un tableau répétable d’enregistrements associés. Ces choix déterminent si les personnes peuvent saisir des données cohérentes, si l’application peut appliquer les règles métier et si l’information reste utile dans les rapports, les exports et les intégrations.

Traitez l’évaluation comme une question d’adéquation du modèle de données : l’application peut-elle représenter les entités, les relations et les règles réellement utilisées par votre activité ? Une démonstration rapide de configuration ne constitue pas une preuve suffisante. Vous devez observer comment la même information personnalisée se comporte lorsque des enregistrements sont créés, modifiés, finalisés, recherchés, exportés, importés et consultés par des utilisateurs disposant d’autorisations différentes.

C’est particulièrement important pour une application auto-hébergée. L’hébergement vous donne le contrôle sur l’emplacement d’exécution de la charge de travail, mais il ne décide pas quels champs doivent exister, qui peut y accéder, comment une valeur retirée est interprétée ou si une intégration dépend d’une définition de champ. Ce sont des décisions de gouvernance que votre organisation doit prendre.

  • N’évaluez pas seulement « champs personnalisés : oui/non ». Évaluez le cycle de vie complet d’un champ représentatif.
  • Distinguez la commodité de l’interface utilisateur des règles de données appliquées et du contrôle d’accès.
  • Demandez des preuves dans un environnement de test utilisant vos propres enregistrements réalistes, et pas seulement des exemples du fournisseur.
Les champs personnalisés sont une décision de gouvernance des données, pas une case à cocher

Commencez par un petit modèle d’enregistrement réel

Avant d’ouvrir une instance d’essai, décrivez un flux de travail limité mais conséquent. Un enregistrement de prestation de services, un compte client, une demande d’achat ou une demande de modification de projet constitue généralement un meilleur point de départ qu’une liste abstraite de champs souhaités. Incluez les informations partagées par l’ensemble de l’enregistrement, celles qui appartiennent à une autre entité et celles qui se répètent.

Pour chaque élément, déterminez ce qu’il signifie sur le plan structurel. Une note en texte libre convient lorsque la variation est attendue et qu’aucun regroupement fiable n’est requis. Une valeur contrôlée convient davantage à un statut métier, une catégorie ou un motif qui doit pouvoir être filtré et analysé de manière cohérente. Une relation convient lorsque la valeur est en réalité une autre entité maintenue, telle qu’un client, un fournisseur ou un responsable. Les éléments associés répétitifs doivent être modélisés sous forme de lignes répétées lorsque l’application prend en charge ce modèle, plutôt que regroupés dans un champ de texte séparé par des virgules.

La documentation de Frappe illustre ces distinctions : Data est du texte générique ; Select utilise des valeurs définies dans ses options ; Link établit un lien vers une autre donnée de référence ; et Table représente une relation de table enfant. Sa documentation sur les Child DocTypes décrit également les enregistrements enfants comme étant rattachés à un parent et conservant les informations sur le parent et la séquence de lignes. Les noms exacts diffèrent selon les produits, mais la question d’évaluation est universelle : la structure disponible correspond-elle au sens de vos informations ? Consultez la documentation de Frappe sur les Field Types (https://docs.frappe.io/framework/user/en/basics/doctypes/fieldtypes) et sur les Child / Table DocTypes (https://docs.frappe.io/framework/user/en/basics/doctypes/child-doctype).

  • Listez les entités principales : par exemple, client, projet, demande et personne.
  • Identifiez les relations un-à-un, un-à-plusieurs et plusieurs-à-un.
  • Marquez chaque valeur qui doit être contrôlée plutôt que saisie librement.
  • Identifiez les données répétitives, telles que plusieurs contacts, jalons, éléments ou validations.
  • Rédigez les règles métier qui rendent un enregistrement complet ou valide.
Commencez par un petit modèle d’enregistrement réel

Vérifiez les types de champs et les règles dans la documentation officielle

Consultez la documentation officielle de l’application concernant les types de champs et la configuration des règles, puis vérifiez ces capacités dans la version que vous prévoyez d’utiliser. Ne vous limitez pas à vérifier qu’un champ peut être ajouté. Établissez s’il peut être obligatoire, recevoir une valeur par défaut, être validé, limité à des valeurs contrôlées et devenir conditionnellement obligatoire ou en lecture seule.

Par exemple, Frappe documente des paramètres distincts pour les valeurs par défaut, mandatory_depends_on et read_only_depends_on. Cela permet, en principe, de tester des règles telles que l’obligation de fournir un motif lorsqu’un enregistrement atteint un état particulier, ou l’interdiction de nouvelles modifications lorsqu’une condition est remplie. Ne déduisez pas qu’une autre application a un comportement identique simplement parce qu’elle propose elle aussi des champs personnalisés. Consultez la documentation Frappe sur DocField : https://docs.frappe.io/framework/user/en/basics/doctypes/docfield.

Testez délibérément les saisies invalides. Un utilisateur peut-il laisser une valeur obligatoire vide ? Peut-il choisir une catégorie non valide ? Une valeur par défaut est-elle visible et compréhensible ? L’application applique-t-elle la règle lors de l’enregistrement, de l’import et via l’API lorsque ces voies sont pertinentes ? Une règle qui ne fonctionne que dans un formulaire peut néanmoins laisser des enregistrements incohérents ailleurs.

  • Créez un champ obligatoire et tentez d’enregistrer sans le renseigner.
  • Ajoutez une valeur par défaut et vérifiez à quel moment elle est appliquée.
  • Utilisez un champ à valeurs contrôlées pour une catégorie de reporting ; essayez de saisir une valeur non approuvée.
  • Testez une condition qui rend un champ obligatoire ou en lecture seule.
  • Consignez si chaque règle est appliquée dans l’interface, les imports et les API prises en charge.

Testez la cohérence entre les enregistrements, les équipes et les flux de travail

Une configuration utilisable doit s’appliquer de façon cohérente à l’échelle de votre activité. Créez plusieurs enregistrements dans le cadre du flux de travail normal, en utilisant différents utilisateurs ou rôles si possible. Vérifiez que chaque équipe voit les mêmes définitions de champs, valeurs par défaut et valeurs contrôlées prévues lorsque la politique exige cette cohérence.

Accordez une attention particulière aux frontières du flux de travail. Un champ qui peut être modifié après la finalisation d’un document peut en changer le sens, le statut, la valeur ou les effets en aval. Les recommandations de Frappe sur Allow on Submit avertissent explicitement que les champs modifiables après soumission doivent pouvoir être modifiés sans risque et signalent les dépendances dans les rapports, les flux de travail, les intégrations, les autorisations et la logique côté serveur. Appliquez ce principe même si vous évaluez une autre plateforme. Consultez la documentation Frappe sur Allow on Submit : https://docs.frappe.io/framework/doctypes/allow-on-submit.

Lorsqu’un processus exige la fidélité historique, déterminez quelles valeurs doivent rester fixes après approbation ou finalisation et lesquelles peuvent être modifiées sans risque sur le plan opérationnel. Consignez le résultat comme une règle, et non comme une attente informelle.

  • Créez des enregistrements équivalents dans plus d’un contexte d’équipe.
  • Comparez la disponibilité des champs, les valeurs et les valeurs par défaut.
  • Faites passer un enregistrement par ses étapes significatives de statut ou d’approbation.
  • Tentez des modifications autorisées et interdites après finalisation.
  • Identifiez les rapports, intégrations et autorisations affectés par chaque champ modifiable.

Évaluez séparément les autorisations pour les enregistrements, les champs, les rapports, les exports et les imports

Les tests d’autorisation ne doivent pas s’arrêter à « cet utilisateur peut-il ouvrir l’enregistrement ? ». Déterminez qui peut consulter, créer, modifier et supprimer des enregistrements ; qui peut voir ou modifier des champs sensibles ; et qui peut modifier la définition du champ elle-même. Testez également les rapports, les exports et les imports indépendamment. Une personne qui ne peut pas modifier un enregistrement peut tout de même être en mesure d’exporter des informations si cette capacité lui est accordée séparément.

Frappe documente des autorisations distinctes pour la lecture, l’écriture, la création, la suppression, la consultation de rapports, l’export CSV/Excel et l’utilisation de son Data Import Tool. Il documente également des niveaux d’autorisation qui peuvent regrouper des champs et appliquer des rôles différents à chaque niveau. Ces exemples montrent pourquoi une seule vérification générale des autorisations est insuffisante. Consultez la documentation Frappe sur Users and Permissions : https://docs.frappe.io/framework/user/en/basics/users-and-permissions.

Ne considérez pas les champs masqués comme sécurisés par défaut. Établissez, au moyen de la documentation officielle du produit et d’un test avec un compte restreint, si les champs sensibles sont omis des formulaires, rapports, exports et méthodes d’accès à distance prises en charge, et si les tentatives directes de lecture ou d’écriture sont refusées. Testez le comportement du produit et de la version spécifiques que vous envisagez, plutôt que de supposer qu’un paramètre de visibilité constitue un contrôle d’accès.

  • Testez un utilisateur standard, un responsable, un utilisateur de reporting et un administrateur.
  • Tentez de consulter, modifier et créer des valeurs de champs sensibles avec chaque rôle.
  • Testez séparément l’accès aux rapports et l’export de données.
  • Testez si un utilisateur d’import peut renseigner des champs restreints.
  • Utilisez un compte restreint pour tenter des lectures et écritures de données sensibles via les API prises en charge.
  • Documentez qui peut modifier les définitions de champs et les listes de valeurs contrôlées.

Vérifiez que les données personnalisées fonctionnent là où les décisions sont prises

Un champ personnalisé n’a de valeur opérationnelle que si les personnes peuvent l’utiliser au-delà du formulaire d’enregistrement. Testez-le dans les vues de liste, les filtres, le tri, les vues enregistrées, les tableaux de bord, les rapports et les exports. Vérifiez que les résultats restent compréhensibles lorsqu’un champ est vide, lorsque les valeurs évoluent dans le temps et lorsqu’un enregistrement comporte plusieurs lignes enfants.

Frappe documente des fonctions de liste incluant les filtres, le tri et la pagination, ainsi que les Query Reports avec des colonnes et des filtres configurables liés à un DocType de référence pour le contrôle d’accès. Ce sont des capacités utiles à rechercher, et non une hypothèse selon laquelle chaque application expose les champs personnalisés de la même manière. Consultez la documentation Frappe sur List : https://docs.frappe.io/framework/user/en/api/list.

Utilisez une question issue de votre rythme opérationnel hebdomadaire. Par exemple : « Quelles demandes actives présentent un motif à risque élevé et n’ont aucun responsable attribué ? » Si vous ne pouvez pas y répondre de manière fiable sans ouvrir manuellement les enregistrements ou exporter puis corriger un tableur, la conception de champ proposée n’a pas encore démontré sa valeur.

  • Filtrez les enregistrements selon chaque champ personnalisé important.
  • Triez selon un champ de date, numérique ou à valeurs contrôlées, lorsque cela est pertinent.
  • Créez ou examinez un rapport comprenant des champs personnalisés et des données relationnelles.
  • Exportez un ensemble représentatif d’enregistrements et examinez les noms de colonnes, les valeurs et les champs vides.
  • Vérifiez que les autorisations de rapport et d’export correspondent à votre politique d’accès.

Suivez les champs personnalisés à travers les API, les imports et les applications connectées

Une intégration peut transformer un champ bien conçu en dépendance fragile si son nom, ses valeurs autorisées, ses autorisations ou son comportement de mise à jour ne sont pas clairs. Identifiez chaque voie par laquelle un enregistrement représentatif peut être créé ou modifié : l’interface de l’application, les imports, une API prise en charge et tout flux de travail connecté que vous prévoyez d’utiliser.

La documentation REST de Frappe décrit la sélection de champs, le filtrage par conditions, le tri et la pagination des enregistrements. Ces comportements documentés illustrent un test efficace : vérifiez que vos champs personnalisés sont renvoyés lorsqu’ils sont demandés et peuvent être filtrés lorsque cela est nécessaire. Testez séparément tout comportement de création, de mise à jour ou de suppression requis par votre intégration, en vous appuyant sur la documentation officielle et la version que vous prévoyez d’utiliser. Consultez la documentation Frappe sur l’API REST : https://docs.frappe.io/framework/user/en/api/rest.

Les opérations en masse méritent leur propre test. La documentation d’ERPNext sur Data Import indique que les feuilles téléversées sont validées avant l’import, que les avertissements sont présentés par ligne ou par colonne et doivent être résolus avant l’import, et que les imports réussis sont enregistrés dans un journal d’importation. Que votre application choisie fonctionne ou non de cette manière, déterminez si les erreurs sont détectées avant que les données métier ne soient validées et si le résultat est auditable. Consultez la documentation ERPNext sur Data Import : https://docs.frappe.io/erpnext/data-import.

  • Créez un enregistrement représentatif par chaque voie prise en charge requise.
  • Relisez-le et comparez chaque valeur personnalisée avec la source.
  • Mettez à jour un champ autorisé et confirmez les effets attendus sur le flux de travail.
  • Tentez une mise à jour non valide et examinez l’erreur ainsi que l’état de l’enregistrement qui en résulte.
  • Testez la sélection de champs, le filtrage, le tri et la pagination dans l’API si les intégrations en ont besoin.
  • Exécutez un petit import contenant à la fois des lignes valides et des lignes délibérément invalides.

Évaluez la sécurité des changements de schéma avant d’en avoir besoin

Les champs évoluent. Les équipes renommant des catégories, remplacent des processus et retirent des valeurs. La question essentielle n’est pas seulement de savoir si un administrateur peut effectuer une modification, mais ce qu’il advient ensuite des enregistrements existants, des rapports, des intégrations et de l’interprétation historique.

Tenez un registre des changements pour chaque champ significatif : objectif métier, responsable, type, valeurs autorisées, valeur par défaut, validation, politique d’accès, dépendances et approche de retrait. Avant d’approuver un changement, identifiez quels rapports enregistrés, imports, consommateurs d’API et flux de travail y font référence. Testez le changement sur des copies d’enregistrements représentatifs avant de l’appliquer largement.

Les valeurs contrôlées exigent une attention particulière. La documentation ORM d’Odoo décrit une solution de repli ondelete pour les options Selection étendues, y compris la définition d’une valeur à null, la suppression en cascade, la définition d’une valeur par défaut, l’attribution d’une valeur de remplacement spécifiée ou l’exécution d’un traitement personnalisé. C’est un modèle de décision utile : lorsqu’une valeur est retirée, décidez explicitement du traitement des enregistrements qui détiennent cette valeur. Ne laissez jamais le sens historique devenir accidentel. Consultez la documentation de l’API ORM d’Odoo : https://www.odoo.com/documentation/19.0/developer/reference/backend/orm.html.

  • Renommez un champ de test non critique et examinez les rapports, exports et intégrations.
  • Tentez un changement de type de champ en utilisant des valeurs existantes représentatives.
  • Retirez une valeur contrôlée et vérifiez le traitement des enregistrements existants.
  • Documentez une approche approuvée de remplacement, de valeur nulle ou autre conservation pour les valeurs retirées.
  • Vérifiez si les enregistrements finalisés exigent un contrôle des changements plus strict.
  • Conservez une trace des décisions de schéma et de leurs dates de prise d’effet.

Questions fréquentes

Quel est le test le plus important lors de l’évaluation des champs personnalisés ?

Construisez un modèle d’enregistrement réaliste et suivez-le tout au long de son cycle de vie : saisie, validation, flux de travail, autorisations, recherche, reporting, export, import et toute intégration API requise. Un champ qui ne fonctionne que dans un formulaire n’a pas encore démontré son utilité opérationnelle.

Chaque catégorie personnalisée doit-elle être une liste déroulante ou une valeur contrôlée ?

Non. Utilisez des valeurs contrôlées lorsque la cohérence est nécessaire pour le filtrage, le reporting, l’automatisation ou la gouvernance. Utilisez du texte libre lorsque des variations significatives sont attendues et ne doivent pas être forcées dans une liste artificielle. Si la valeur est en réalité un autre objet métier maintenu, testez une relation plutôt qu’une liste déroulante.

Pourquoi tester l’accès par API aux champs restreints ?

Masquer un champ dans une interface utilisateur ne constitue pas une preuve suffisante que les données sous-jacentes sont protégées. Testez un utilisateur restreint par chaque voie d’accès prise en charge que vous prévoyez d’utiliser, y compris les API, le reporting, les exports et les imports, afin de vérifier que les contrôles d’accès sont appliqués.

Que devons-nous préserver lors d’une migration ?

Préservez les identifiants d’enregistrement stables lorsque l’application les utilise pour les mises à jour, mappez délibérément les relations et testez séparément les pièces jointes et les lignes enfants répétables. La documentation d’ERPNext indique par exemple que les mises à jour utilisent la colonne ID exportée et que le retrait d’une ligne de table enfant d’un fichier de mise à jour est traité comme une suppression intentionnelle. Votre application cible peut différer ; répétez donc son comportement réel. Consultez la documentation ERPNext sur Data Import : https://docs.frappe.io/erpnext/data-import.

Quand une application configurable est-elle le mauvais choix ?

Choisissez un système conçu pour un usage précis ou un développement dédié lorsque votre processus central dépend de règles de domaine complexes, de calculs spécialisés, de contrôles réglementaires exceptionnellement stricts, d’une gestion de relations à fort volume ou d’un modèle de données qui ne peut pas être représenté et gouverné proprement avec les structures prises en charge par l’application. La configuration doit réduire le risque opérationnel, et non dissimuler une inadéquation fondamentale.

Sources et lectures complémentaires

  1. Field Types — Frappe Framework
  2. DocField — Frappe Framework
  3. Child / Table DocType — Frappe Framework
  4. Users and Permissions — Frappe Framework
  5. REST API — Frappe Framework
  6. List — Frappe Framework
  7. Query Report — Frappe Framework
  8. Data Import — ERPNext
  9. Allow on Submit — Frappe Framework
  10. ORM API — Odoo