Évaluation technique · ERP

Fidelio (Commsoft Phoenix)

Lecture d'ingénierie d'un ERP legacy : architecture, surface d'intégration, ergonomie, pérennité, sécurité, dépendance fournisseur. Fondée sur l'observation directe de l'instance de production.

Instance editionsvaudreuil.fidelio.ca/Phoenix Date 2026-07-09 Méthode observation directe (Playwright, Console SQL, trace réseau) Contexte chantier d'automatisation de bons de commande

Verdict en une ligne

Exploitable en lecture, structurellement hostile à l'écriture automatisée et à l'intégration moderne. Fidelio expose de la donnée récupérable (SQL, PDF), mais toute automatisation d'écriture doit être arrachée à l'outil via des contournements sur-mesure et fragiles, faute d'API. Pile technologique legacy, comportements non déterministes, évolution captive d'un support externe.

§ Résumé exécutif

Fidelio est un ERP Commsoft Phoenix sur SQL Server, servi par une UI web ASP.NET à base d'iframes imbriquées, de fenêtres dhtmlx, de grilles SlickGrid et d'une passerelle RPC générique interne (« Heimdall »). Il n'expose aucune API d'intégration documentée : les échanges passent soit par la BD, soit par cette passerelle dont les identifiants d'enregistrement sont encodés/obfusqués.

On peut extraire de la donnée de façon robuste (Console SQL, PDF). Injecter de la donnée par programme, en revanche, est une lutte permanente : chaque voie testée (saisie grille, import Excel, appels d'API) bute sur un mur d'une nature différente. L'écriture est automatisable dans certains cas — nous l'avons prouvé sur un bon de commande de 48 lignes — mais seulement au prix d'un moteur défensif sur-mesure (validation ligne par ligne, attentes de plusieurs secondes par ligne, tentatives multiples), là où un ERP doté d'une API ferait l'opération en une requête sub-seconde. Ce contraste est le painpoint.

Ce document consigne l'ensemble des points de friction constatés — intégration, automatisation, ergonomie, pile technologique, fiabilité, sécurité, dépendance fournisseur — pour éclairer une décision de pérennité de la plateforme (maintenir vs remplacer).

01 Carte de notation

Notation qualitative (1 = très faible, 5 = solide), sur les plans technique, intégration, ergonomie et gouvernance.

Lecture / extraction de données Console SQL Server accessible ; rapports PDF téléchargeables. Fiable via automation headless.
Écriture / intégration automatisée Aucune API. Faisable seulement via contournements sur-mesure fragiles, au coût/effort disproportionné (voir §04, §05).
Surface d'API / interopérabilité Passerelle RPC interne non documentée + IDs encodés → non exploitable de l'extérieur.
Pérennité de la pile technologique dhtmlx / jQuery UI (fin de vie) / iframes imbriquées / SlickGrid ancien. Dette technique lourde et figée.
Architecture web / UI Fonctionnelle mais lourde, capricieuse et à couches. Fenêtres modales empilées, navigation dépendante de la vue.
Ergonomie / productivité opérateur Accès aux fonctions conditionné à la « bonne vue », chargement paresseux et lent des lignes, overlays bloquants.
Fiabilité / déterminisme Lookups async sensibles au timing ; fenêtres hors-écran ; import au comportement incohérent d'un essai à l'autre.
Sécurité / gouvernance des accès Pas de 2FA ni device-binding, compte de service unique partagé à privilèges larges. Session fragile.
Indépendance / portabilité (lock-in) Schéma propriétaire, IDs non portables, toute évolution passe par le support éditeur externe.

02 Architecture constatée

CoucheTechnologie
ProduitCommsoft Phoenix (Fidelio)
Base de donnéesMicrosoft SQL Server — schéma in_* / ac_* / pa_*
Serveur webASP.NET — pages Razor .cshtml, login Splash.aspx
UI clientiframes imbriquées + fenêtres dhtmlx + jQuery UI + grilles SlickGrid
Passerelle RPCHeimdall/PhoenixService.svc/Rest/ (Invoke, InvokeStatic, CreateData…)
Service fichiersHeimdall/FileService.svc/File/ImportFromExcel
Rapportsendpoint Rest/ShowReport → PDF

La passerelle RPC est générique : la vraie méthode voyage dans le corps JSON, et les enregistrements sont désignés par un dmId de session.

POST /Heimdall/PhoenixService.svc/Rest/CreateData
{ "dmType":"AcAchatNovexco", "dmId":"_7H214KXSM" }

POST /Heimdall/PhoenixService.svc/Rest/Invoke
{ "dmId":"_7H214KXSM", "methodName":"IsOrderInProgress", "parameters":["",true,6] }
BloquantIDs d'enregistrement encodés

Les identifiants internes sont obfusqués (mojibake : V£xvu}†´.¯, V!!™¯£´6cf). On ne peut pas construire d'appels RPC ciblés sans passer par l'UI qui génère ces IDs. L'« API-replay » direct est un cul-de-sac, et ces IDs ne sont pas portables vers un autre système.

03 Ce qui marche · ce qui bloque

Fiable

  • Login headless (compte AdminEV) — pas de 2FA
  • Console SQL en lecture → JSON (23 000+ lignes prouvées)
  • Rapport PDF d'un PO existant (ShowReport)
  • PDF depuis un formulaire ouvert (contourne l'indexation)
  • Transfert de localisation cellule-par-cellule (mais lent)

Fragile / bloqué / coûteux

  • Saisie de lignes SlickGrid — faisable mais exige un moteur défensif sur-mesure (§05)
  • Import Excel — dépend d'une « définition » par compte, comportement incohérent
  • Upload fichier via extension Chrome — bloqué par CDP
  • Fenêtres dhtmlx hors-écran en headless
  • Appels d'API directs — IDs encodés

04 Catalogue des points de friction

Recensement exhaustif des frictions constatées, regroupées par dimension. Sévérité : Bloquant Sévère À surveiller

A · Intégration & interopérabilité

BloquantAucune API d'intégration

Pas d'API REST/SOAP publique documentée, pas de webhooks, pas de connecteurs. Les seules portes sont la BD (SQL Server) et la passerelle RPC interne (non documentée, IDs encodés). Toute intégration se fait « par-dessus » l'UI ou en lisant la BD — jamais de façon supportée.

BloquantÉcriture SQL directe = danger

Prix, taxes, totaux et numérotation d'un PO sont calculés par la logique métier à la saisie. Un INSERT brut dans ac_achats/ac_achats_ln produirait des enregistrements incohérents (0 $, sans taxes, mal numérotés) cassant rapports, réception et compta. La discipline SELECT-only s'impose — donc pas d'écriture par la BD.

SévèrePasserelle RPC générique et opaque

Le seul « point d'API » réel est un tunnel RPC interne où la méthode voyage dans le corps JSON et les cibles sont des dmId de session éphémères. Non documenté, non versionné, non contractuel : rien sur quoi bâtir une intégration stable.

B · Automatisation d'écriture

SévèreSaisie de grille : faisable, mais au prix d'un moteur sur-mesure

Le remplissage cellule-par-cellule d'une grille SlickGrid est piégé : lookups produit asynchrones et lents, verrou d'édition qui ne se libère pas sur événements synthétiques (colonne quantité proxy nécessitant un clavier « trusted »), overlays qui interceptent les clics. C'est automatisable — nous atteignons 100 % sur 48 lignes — uniquement avec une machine à états défensive : validation par ligne, attentes de plusieurs secondes, tentatives multiples, neutralisation de popups. Effort d'ingénierie considérable, et cassable à la moindre évolution de l'UI (voir §05).

SévèreImport Excel à « définition » captive et non déterministe

L'import xlsx exige une définition de mapping (colonnes→champs) activée par compte, un format très strict (fournisseur en G, code produit en FS, quantité en FY, sur ~468 colonnes, données dès la ligne 3), et affiche un comportement incohérent d'un essai à l'autre même une fois tout en place — y compris en usage manuel par un humain.

SévèreDeux mondes d'automatisation incompatibles

En headless, l'upload de fichier fonctionne mais les fenêtres dhtmlx s'ouvrent hors-écran (coordonnées négatives). En pilotant le vrai Chrome (extension), les fenêtres s'affichent mais Chrome bloque le remplissage d'input fichier via CDP (« Not allowed ») et intercepte les clics manuels. Les deux capacités manquantes sont dans deux environnements qu'on ne peut pas combiner.

C · Ergonomie & productivité opérateur

SévèreNavigation modale dépendante de la « bonne vue »

Des fonctions cœur ne sont accessibles que depuis un mode précis : il faut impérativement être dans la vue Achats ou Standard pour atteindre la fenêtre « Commande d'achats ». L'opérateur doit connaître ces conditions cachées ; se tromper de vue = fonction introuvable, sans indication.

SévèreChargement paresseux et lent des lignes

À chaque ligne saisie, le lookup produit (description, prix) se résout de façon asynchrone et lente — plusieurs secondes, jusqu'à une vingtaine dans nos mesures avant stabilisation. Sur une commande de dizaines de lignes, cela s'accumule en minutes d'attente pure, à l'écran comme en automation.

À surveillerOverlays bloquants récurrents

Des modales interrompent le flux (ex. « produit déjà dans une PO ouverte ») et recouvrent la grille, bloquant clics et saisie tant qu'elles ne sont pas explicitement fermées. Multiplié par le volume de lignes, c'est une friction constante.

À surveillerFenêtres dhtmlx empilées / mal placées

L'UI empile des fenêtres flottantes (dhtmlx) qui peuvent s'ouvrir hors du viewport ou l'une sur l'autre. Gestion manuelle de la taille/position parfois nécessaire ; désorientant pour l'opérateur.

D · Pile technologique & pérennité

SévèreFront-end sur des briques en fin de vie

L'interface repose sur dhtmlx (fenêtrage propriétaire ancien), jQuery UI (officiellement en fin de maintenance) et un SlickGrid d'ancienne génération, le tout dans des iframes imbriquées. Pile figée, peu compatible avec les navigateurs et outils modernes, coûteuse à faire évoluer et à tester.

À surveillerArchitecture web à couches, dette accumulée

ASP.NET Razor côté serveur + empilement d'iframes et de fenêtres côté client : chaque écran est une composition fragile. Ce type d'architecture rend le débogage, l'automatisation et l'audit d'accessibilité difficiles, et signale un socle technique daté.

E · Fiabilité & déterminisme

SévèreComportement non déterministe

À configuration identique, la même opération (notamment l'import Excel) réussit ou échoue selon les essais, sans cause visible. Un système dont on ne peut pas prédire le résultat est difficile à exploiter en confiance et impossible à automatiser proprement.

À surveillerIndexation retardée des nouveaux enregistrements

Un bon de commande tout juste créé n'est pas immédiatement trouvable dans les recherches ni le rapport par numéro (délai d'indexation). Il faut capturer son PDF depuis le formulaire encore ouvert, pas via une recherche par n°.

À surveillerSession & timing fragiles

La session tombe à la fermeture des onglets ; les lookups (produit, fournisseur, PO) sont asynchrones et sensibles au timing, imposant des retries et des attentes généreuses partout.

F · Sécurité & gouvernance

SévèreAuthentification faible, compte de service partagé

Login simple sans 2FA ni device-binding, sur un compte de service unique (AdminEV) à privilèges larges, partagé. Pratique pour l'automation, mais posture de sécurité faible : pas de traçabilité individuelle, surface de compromission élevée, aucune séparation des rôles observée côté intégration.

G · Indépendance & dépendance fournisseur

SévèreVerrouillage fournisseur & évolution captive

Schéma de données propriétaire, IDs internes non portables, définitions d'import gérées côté éditeur, absence d'API : toute évolution ou intégration passe par le support externe de l'éditeur. L'organisation n'est pas autonome pour adapter, connecter ou faire évoluer son ERP — un facteur de coût et de risque structurel dans la durée.

05 Étude de cas — le coût réel d'automatiser autour de l'absence d'API

Objectif : créer un bon de commande de 48 lignes (fournisseur Les Éditions CEC) par automatisation. Résultat après ingénierie d'un moteur défensif dédié :

48 / 48
lignes saisies, 0 échec
7,6 min
durée totale (~9,5 s/ligne)
< 1 s
équivalent via une vraie API

La réussite n'a été possible qu'en construisant une machine à états par ligne : ouverture d'éditeur, saisie via clavier « trusted », sondage du lookup jusqu'à stabilisation (jusqu'à ~20 s), neutralisation des popups, vérification que le code, la description et la quantité sont bien conformes, jusqu'à 5 tentatives, suppression et reprise de la ligne en cas d'échec, et collecte des lignes récalcitrantes pour reprise humaine.

Autrement dit : on peut le faire, mais l'effort pour contourner l'absence d'API est disproportionné, l'exécution reste lente, et l'ensemble est cassable à la moindre évolution de l'UI. Ce qu'un ERP interopérable règle en une requête documentée exige ici un projet d'automatisation à part entière — c'est la démonstration concrète du coût structurel de la plateforme.

06 Possibilités réelles

Ce sur quoi on peut s'appuyer aujourd'hui, de façon fiable :

07 Lecture stratégique — maintenir vs remplacer

08 Verdict technique

Fidelio remplit sa fonction d'ERP transactionnel, mais du point de vue technologique, d'intégration et de pérennité, c'est une plateforme fermée, legacy et captive. Elle donne accès à ses données en lecture, mais se comporte comme une boîte noire dès qu'on veut y écrire, l'intégrer, la faire évoluer ou l'auditer : pas d'API, identifiants opaques, UI à couches capricieuse, comportements non déterministes, sécurité d'accès faible, évolution dépendante d'un tiers.

Pour une organisation qui veut automatiser, intégrer et durer, Fidelio est un frein structurel : chaque capacité doit être arrachée à l'outil plutôt qu'offerte par lui. Les intégrations réalistes se limitent à lire Fidelio et à préparer le travail que des humains valident dans son interface — ou, au prix fort, à automatiser en écriture par des contournements fragiles. Ce constat plaide pour évaluer sérieusement une plateforme API-first dans toute réflexion de pérennité.