2.2 Nouvelles fonctionnalités pour les développeurs et intégrateurs API REST : NOUVEAU : Endpoint API pour l’historique des prix d’un produit (#38420) : /products/{id}/pricelogs retourne l’historique des prix de vente. NOUVEAU : L’API GET /countries/{id} peut maintenant charger les régions et les états en option (#37715), évitant des appels supplémentaires. NOUVEAU : API Catégories – endpoint pour lister les types de catégories (#38207). NOUVEAU : API Remises – création d’une remise en montant fixe (#37091). NOUVEAU : Meilleure compatibilité API pour les utilisateurs, les tâches et les pièces jointes des tickets (#37644). NOUVEAU : Le champ default_rib (RIB par défaut) est maintenant inclus dans les réponses API des tiers (#38355). HOOKS : NOUVEAU : Hook dans le label d’une opération comptable (#37838) : hookmanager->executeHooks('addMor ...). NOUVEAU : Hook dans les formulaires de liste du portail web (#36844) : webportal_formlist. NOUVEAU : Hook selectForFormsListUrl dans Form::selectForForms (#37447) : permet de modifier l’URL d’une liste de sélection. NOUVEAU : Hooks dans la fiche réception (#37214). NOUVEAU : Hook dans BonPrelevement::EnregDestinataireSEPA() (#37419). NOUVEAU : Hook dans le formulaire email/message des tickets généré par FormTicket (#37580). NOUVEAU : Hook dans Add Hook for adapting virtual stock dans l’écran de réapprovisionnement (#37290). Avertissement : Renommage de hook : le hook info_admin a été renommé en messageOfTheDay. Mettez à jour vos modules si vous l’utilisez. EXTRACHAMPS (extrafields) : NOUVEAU : [RGPD] Ajout de la colonne personal_data dans llx_extrafields (#38194, #38133) : troisième étape du chantier d’anonymisation des extrachamps. Chaque extrachamp peut maintenant être marqué comme “données personnelles” pour faciliter les procédures RGPD (droit à l’oubli, anonymisation). NOUVEAU : L’interface d’administration des extrachamps affiche le flag personal_data et permet de le configurer. NOUVEAU : Option infobulle sur les extrachamps dans getNomUrl (#37431) : un extrachamp peut avoir une infobulle au survol. NOUVEAU : Utilisation du libellé du select (et non de la valeur technique) pour la substitution des extrachamps dans les emails (#37005). NOUVEAU : Support des extrachamps de type chkbxlst (checkbox list) avec des tables contenant jusqu’à 200 000 éléments (#37691) : amélioration des performances pour les très grandes listes. NOUVEAU : L’option MAIN_DISALLOW_UNSECURED_SELECT_INTO_EXTRAFIELDS_FILTER est activée par défaut (sécurité). MODULE BUILDER : NOUVEAU : Possibilité de spécifier si l’objet gère des lignes dans le Module Builder (#32664) : paramètre pour indiquer qu’un objet personnalisé a des lignes associées. NOUVEAU : Remplacement automatique des occurrences MyObject / MyModule lors de la génération (#38370) : le module builder substitue correctement ces tokens lors de la création du code. MÉTHODES ET UTILITAIRES : NOUVEAU : Nouvelle méthode calculateVATNumberFromProperties() : calcule automatiquement le numéro de TVA à partir des propriétés d’un objet. NOUVEAU : Nouvelle méthode dolOutputDates() pour afficher des dates de façon normalisée. NOUVEAU : Nouvelle méthode formatLogObject() pour formater un log en une seule ligne (#37135), facilitant la lecture des journaux. NOUVEAU : Méthode addMoreTagsToDefaultTagsInDolPrintHTML() : les modules tiers peuvent ajouter des balises HTML autorisées dans les sorties contrôlées. NOUVEAU : Le cron déverrouille automatiquement les tâches bloquées après un arrêt inattendu du serveur (#37332). NOUVEAU : La debugbar capture maintenant la backtrace lors des échecs de requêtes SQL (#36612), facilitant le diagnostic des erreurs de base de données. NOUVEAU : Déplacement des librairies JS dans htdocs/public/includes (au lieu de htdocs/includes) pour mieux séparer les ressources publiques. NOUVEAU : Le Module Builder peut indiquer qu’un objet gère des lignes (#32664). SÉCURITÉ DÉVELOPPEURS : NOUVEAU : Une page peut forcer sa propre valeur pour MAIN_SECURITY_CSRF_WITH_TOKEN, permettant à certaines pages de surcharger le niveau de protection CSRF globalement configuré.