Module DoliSCAN pour Dolibarr doliscan-for-dolibarr
| Réf | Intitulé | Cycle | Couverture | Verdict |
|---|---|---|---|---|
| Comptes DoliSCAN | ||||
| DSCDLB-024 |
Cycle de vie complet d'un compte DoliSCAN
DétailsObjectif : un compte DoliSCAN relie un utilisateur Dolibarr à ses identifiants sur doliscan.fr. Vérifications :
Point de contrôle manuel : depuis la configuration du module, créer un compte pour un utilisateur, puis vérifier qu'un second compte sur la même entité est refusé. Couverture automatique : test/phpunit/integration-dolibarr/MyAccountTest.php (9 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-025 |
Méthodes de gestion d'un compte : statuts, libellés, liens, spécimen
DétailsObjectif : couvrir les méthodes de cycle de vie au-delà du simple CRUD. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/MyAccountCrudTest.php (18 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-026 |
Workflow de statut d'un compte : brouillon, validé, annulé, rouvert
DétailsObjectif : chaque transition de statut a une garde qui refuse ce qui n'a pas de sens, et un contrôle de droit. Vérifications :
Point de contrôle manuel : dérouler ce cycle depuis la fiche du compte, avec un utilisateur qui a les droits, puis avec un utilisateur qui ne les a pas. Couverture automatique : test/phpunit/integration-dolibarr/MyAccountWorkflowTest.php (13 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-027 |
Résolution du compte DoliSCAN d'un utilisateur donné
DétailsObjectif : le pipeline de synchronisation résout les identifiants DoliSCAN de l'utilisateur courant par cette recherche. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/MyAccountFetchFirstTest.php (9 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-028 |
Chiffrement transparent de la clé d'API en base
DétailsObjectif : les clés d'API DoliSCAN étaient stockées en clair (faille de priorité 1). Elles sont désormais chiffrées à l'écriture et déchiffrées à la lecture, de façon transparente pour le code appelant. Vérifications :
Point de contrôle manuel : inspecter la colonne ds_api en base et vérifier qu'elle ne contient plus de jeton lisible pour les comptes créés récemment. Couverture automatique : test/phpunit/integration-dolibarr/MyAccountApiKeyEncryptionTest.php (5 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-099 |
Désactivation et réactivation du compte distant d'un salarié
DétailsObjectif : quand un salarié part ou revient, la désactivation ou la réactivation de son utilisateur Dolibarr doit être répercutée sur son compte DoliSCAN. Vérifications :
Point de contrôle manuel : le serveur est simulé. Désactiver un utilisateur Dolibarr titulaire d'un compte DoliSCAN et vérifier qu'il ne peut plus se connecter à l'application mobile, puis le réactiver et vérifier qu'il le peut de nouveau. Couverture automatique : test/phpunit/integration-dolibarr/RemoteAccountStateTest.php (5 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Dates ISO 8601 et fuseaux | ||||
| DSCDLB-004 |
Conversion des dates ISO 8601 UTC de l'API en date locale
DétailsObjectif : l'API doliscan.fr renvoie des dates ISO 8601 en UTC ("2026-03-31T22:00:00.000000Z" = 1er avril 2026 en Europe/Paris). Sans conversion, ces chaînes partent telles quelles dans les filtres SQL de Dolibarr qui stockent des dates locales, et la recherche de doublon échoue (bug PROV119 observé en production). Vérifications :
Couverture automatique : test/phpunit/unit/IsoDateConversionTest.php (8 methodes, suite unit). Les tests forcent le fuseau Europe/Paris. |
À tester | Couvert | Non testé |
| DSCDLB-005 |
La note de frais créée porte la date locale, pas la date UTC brute
DétailsObjectif : la période de la note de frais Dolibarr doit correspondre au mois réel, quel que soit le format de date renvoyé par l'API. Vérifications :
Point de contrôle manuel : après une synchronisation, ouvrir la note de frais dans Dolibarr et vérifier que la période affichée correspond au mois des dépenses, sans décalage d'un jour. Couverture automatique : test/phpunit/integration-dolibarr/CreateNdfIsoDateTest.php (3 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-079 |
Une date de fin inutilisable n'interrompt pas la synchronisation
DétailsObjectif : une date de fin mal formée levait une exception non rattrapée, qui arrêtait la tâche planifiée pour tous les comptes suivants. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/BadRemoteDateTest.php (2 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-080 |
Lecture tolérante des dates de l'API
DétailsObjectif : une date de l'API doit être lue sans qu'une valeur illisible puisse interrompre la synchronisation. Vérifications :
Couverture automatique : test/phpunit/unit/RemoteDateTest.php (2 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-081 |
Comparaison des dates d'une note de frais avec les bornes de synchronisation
DétailsObjectif : une date illisible devenait le 1er janvier 1970 : la note de frais paraissait antérieure à toute date de début et était écartée sans un mot. Vérifications :
Couverture automatique : test/phpunit/unit/CompareDatesTest.php (4 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| Déclencheurs Dolibarr | ||||
| DSCDLB-049 |
Réaction aux événements Dolibarr sur les utilisateurs
DétailsObjectif : le module réagit aux événements de création, d'activation ou de désactivation et de suppression d'un utilisateur Dolibarr pour tenir à jour le compte correspondant côté doliscan.fr. Vérifications :
Point de contrôle manuel : activer la création automatique, créer un utilisateur Dolibarr et vérifier qu'un compte DoliSCAN apparaît. Couverture automatique : test/phpunit/integration-dolibarr/DoliscanTriggersTest.php (6 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-100 |
Métadonnées du déclencheur et modification d'un projet
DétailsObjectif : le déclencheur s'annonçait comme une démonstration en développement dans la liste des déclencheurs, et la modification d'un projet sans rapport avec DoliSCAN pouvait échouer. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/TriggerMetadataTest.php (4 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Doublons et orphelines | ||||
| DSCDLB-019 |
Détection d'une note de frais existante sur la période et l'utilisateur
DétailsObjectif : éviter qu'une synchronisation quotidienne ne recrée chaque jour la note de frais du mois. La recherche porte sur le triplet date de début, date de fin, utilisateur. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/DoublonNDFTest.php (8 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-020 |
Reproduction du bug PROV119 : doublon non détecté sur dates ISO
DétailsObjectif : verrouiller le scénario de production du 27 avril 2026. Après la purge des brouillons, le réimport d'une même note de frais appelait la recherche de doublon avec des dates ISO 8601 UTC, comparées à des dates locales stockées en base. Aucune correspondance, donc création d'une note de frais PROV119 supplémentaire, l'ancienne devenant orpheline. Vérifications :
Point de contrôle manuel : activer la purge des brouillons, resynchroniser, et vérifier qu'aucune note de frais provisoire supplémentaire n'apparaît. Couverture automatique : test/phpunit/integration-dolibarr/DoublonNdfIsoDateTest.php (4 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-021 |
Détection d'une facture fournisseur déjà créée pour une dépense pro
DétailsObjectif : ne jamais créer deux fois la même facture fournisseur. Trois stratégies sont essayées dans l'ordre. Vérifications :
Point de contrôle manuel : resynchroniser un mois déjà importé et vérifier qu'aucune facture fournisseur n'est créée en double. Couverture automatique : test/phpunit/integration-dolibarr/DoublonFacFournisseurTest.php (8 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-022 |
Nettoyage des notes de frais orphelines avec tolérance de deux jours
DétailsObjectif : le nettoyage exigeait auparavant des dates strictement identiques. Or la dérive de fuseau produisait des orphelines décalées d'un jour, donc jamais détectées ni nettoyées. Une tolérance de plus ou moins deux jours est appliquée sur chaque date indépendamment. Vérifications :
Point de contrôle manuel : la page de diagnostics ne doit plus lister d'orphelines vides après une synchronisation. Couverture automatique : test/phpunit/integration-dolibarr/CleanupOrphanDateToleranceTest.php (7 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-089 |
Ancienne recherche de doublon de ligne limitée à la note de frais en cours
DétailsObjectif : la recherche de doublon conservée pour les lignes importées avant la clé d'import comparait date, montant, type et libellé sur toute la table : deux collègues qui déjeunent au même endroit, le même jour, pour le même prix, et la ligne du second n'était pas importée. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/LegacyDedupScopeTest.php (2 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Factures fournisseur | ||||
| DSCDLB-023 |
Création d'une facture fournisseur depuis une dépense professionnelle
DétailsObjectif : transformer une dépense pro en facture fournisseur Dolibarr correctement renseignée et payée. Vérifications :
Point de contrôle manuel : importer une dépense pro, ouvrir la facture fournisseur créée, vérifier le tiers, le montant, le mode de règlement et le paiement associé. Couverture automatique : test/phpunit/integration-dolibarr/CreateFactFournisseurTest.php (12 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-092 |
La création d'une facture fournisseur respecte la transaction de l'appelant
DétailsObjectif : la création validait et annulait une transaction qu'elle n'avait jamais ouverte : quand l'appelant en avait une, tout ce qui précédait était validé et son annulation n'annulait plus rien. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/FacFournisseurTransactionTest.php (1 méthode, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-093 |
Création des fournisseurs par défaut sans doublon
DétailsObjectif : le lien de création des fournisseurs par défaut créait sept tiers à chaque clic, et la correspondance pointait sur le premier trouvé. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/CreateDefaultSuppliersTest.php (2 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Helpers purs et compatibilité | ||||
| DSCDLB-001 |
Couche de compatibilité Dolibarr (config globale, droits, filtres ECM)
DétailsObjectif : le module doit fonctionner de Dolibarr 18 à 23 sans branche morte ni appel à une API absente. Vérifications :
Couverture automatique : test/phpunit/unit/BackportCompatTest.php (34 methodes, suite unit). |
À tester | Couvert | Non testé |
| DSCDLB-002 |
Type de retour uniforme SyncResult sur le pipeline d'import
DétailsObjectif : toutes les étapes d'import et de synchronisation renvoient le même objet de résultat, sans casser le code historique qui lisait ->message et ->error. Vérifications :
Couverture automatique : test/phpunit/unit/SyncResultTest.php (10 methodes, suite unit). |
À tester | Couvert | Non testé |
| DSCDLB-003 |
Helpers purs de calcul : TVA, libellés de ligne, mapping du moyen de paiement
DétailsObjectif : les fonctions du chemin critique de l'import multi-TVA sont exactes. Une régression ici corrompt silencieusement les factures fournisseur et les notes de frais. Vérifications :
Couverture automatique : test/phpunit/unit/MyndfPureHelpersTest.php (37 methodes, suite unit). |
À tester | Couvert | Non testé |
| DSCDLB-101 |
Compatibilité Dolibarr 24 : sélecteur de compte bancaire et jeton CSRF
DétailsObjectif : Dolibarr 24 passe le filtre du sélecteur de comptes bancaires par le filtre de recherche universel, et refuse par défaut un lien d'action sans jeton CSRF. Vérifications :
Point de contrôle manuel : le harnais tourne en Dolibarr 18. Sur une instance Dolibarr 24, vérifier que le sélecteur de compte bancaire de la configuration est rempli, puis utiliser le bouton de récupération du jeton administrateur. Couverture automatique : test/phpunit/integration-dolibarr/Dolibarr24CompatTest.php (3 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Import des notes de frais | ||||
| DSCDLB-008 |
Création de la note de frais Dolibarr d'accueil de l'import
DétailsObjectif : create_ndf() amorce le pipeline d'import en créant, ou en réutilisant, la note de frais Dolibarr de la période. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/CreateNdfTest.php (6 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-009 |
Aiguillage dépense pro vers facture fournisseur, dépense perso vers note de frais
DétailsObjectif : c'est la règle métier centrale du module. Une dépense marquée professionnelle devient une facture fournisseur ; une dépense personnelle devient une ligne de note de frais à rembourser au salarié. Vérifications :
Point de contrôle manuel : synchroniser un compte contenant une dépense pro et une dépense perso, puis vérifier qu'une facture fournisseur et une ligne de note de frais ont bien été créées, chacune pour le bon montant. Couverture automatique : test/phpunit/integration-dolibarr/ImportNDFTest.php (10 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-010 |
Garde-fous d'entrée de l'import (déjà importé, JSON invalide)
DétailsObjectif : rejeter une entrée invalide avant tout appel réseau, pour ne jamais corrompre la base sur une charge utile abîmée. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/ImportNDFGuardsTest.php (2 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-011 |
Import complet de bout en bout avec l'API simulée
DétailsObjectif : dérouler tout le pipeline hors ligne, de la charge utile DoliSCAN aux objets Dolibarr, et vérifier les routes d'API réellement appelées. Vérifications :
Point de contrôle manuel : depuis la fiche d'une note de frais DoliSCAN, relancer l'import et vérifier que le justificatif PDF est bien rattaché. Couverture automatique : test/phpunit/integration-dolibarr/ImportNDFHappyPathTest.php (6 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-012 |
Une seule note de frais par identifiant serveur, même si les dates changent
DétailsObjectif : reproduire et verrouiller le bug "une nouvelle note de frais à chaque synchronisation". En production, un seul enregistrement DoliSCAN avait engendré 4 notes de frais Dolibarr parce que la détection de doublon reposait sur l'égalité stricte des dates, lesquelles dérivent entre deux synchronisations. L'ancrage correct est l'identifiant serveur. Vérifications :
Point de contrôle manuel : lancer deux synchronisations de suite sur le même mois et vérifier dans la liste des notes de frais Dolibarr qu'il n'y en a toujours qu'une pour la période. Couverture automatique : test/phpunit/integration-dolibarr/ImportNDFDedupBySidTest.php (8 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-013 |
Deux péages identiques d'un aller-retour ne sont pas fusionnés
DétailsObjectif : cas remonté en production. Un salarié fait l'aller-retour chez un client dans la journée et paie deux péages distincts du même montant (même section d'autoroute). Les deux tickets sont deux dépenses distinctes dans l'application mobile, mais une seule arrivait dans Dolibarr. Cause : le repli de déduplication historique cherchait une ligne existante sur le quadruplet (date, montant TTC, type de frais, libellé), ce qui confond deux dépenses réellement différentes. La seconde était abandonnée en silence. Vérifications :
Point de contrôle manuel : saisir deux péages identiques le même jour dans l'application mobile, synchroniser, et compter les lignes dans la note de frais Dolibarr. Couverture automatique : test/phpunit/integration-dolibarr/AddLineNdfLegacyDedupTest.php (2 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-014 |
Le déplacement d'une ligne recalcule les totaux des deux notes de frais
DétailsObjectif : corriger le symptôme "note de frais vide mais total supérieur à zéro". Quand une ligne est rapatriée d'une note de frais orpheline vers la note active, les totaux doivent être recalculés des deux côtés. Vérifications :
Point de contrôle manuel : dans la liste des notes de frais Dolibarr, aucune note ne doit afficher un total non nul alors qu'elle n'a aucune ligne. Couverture automatique : test/phpunit/integration-dolibarr/MoveLineRecomputesTotalsTest.php (5 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-015 |
Plus de ligne technique "Fin de la note de frais"
DétailsObjectif : le module ajoutait autrefois une ligne technique à zéro en fin de note de frais pour forcer Dolibarr à recalculer ses totaux. Les versions actuelles de Dolibarr le font seules, et cette ligne résiduelle empêchait le nettoyage des notes de frais orphelines (qui ne supprime que celles à zéro ligne). Vérifications :
Point de contrôle manuel : ouvrir une note de frais importée et vérifier qu'aucune ligne "Fin de la note de frais" à 0,00 n'apparaît. Couverture automatique : test/phpunit/integration-dolibarr/EndOfNDFLineLegacyTest.php (3 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-016 |
Validation automatique seulement après la fin de la période
DétailsObjectif : la validation automatique était déclenchée juste après la création de la note de frais, donc avant l'insertion des lignes : la note était validée vide, et les lignes suivantes se heurtaient à une note déjà validée. La validation a été déplacée en fin d'import, et n'a lieu que si la période est terminée. Vérifications :
Point de contrôle manuel : activer la validation automatique, synchroniser en cours de mois (la note doit rester en brouillon), puis resynchroniser après la fin du mois. Couverture automatique : test/phpunit/integration-dolibarr/AutoValidateAfterPeriodEndTest.php (4 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-017 |
Façade objet NDFImporter du pipeline d'import
DétailsObjectif : le point d'entrée objet du pipeline capture la base et l'utilisateur une seule fois, et renvoie systématiquement un résultat de synchronisation uniforme. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/NDFImporterTest.php (6 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-018 |
Outil de rattrapage des lignes perdues par l'ancienne déduplication
DétailsObjectif : réparer les données déjà abîmées par le bug de déduplication des dépenses identiques. L'outil détecte les lignes manquantes et les reconstruit sur une note de frais de rattrapage en brouillon. Vérifications :
Point de contrôle manuel : lancer l'analyse de rattrapage sur un compte historique, contrôler la liste proposée avant de générer. Couverture automatique : test/phpunit/integration-dolibarr/RattrapageTest.php (4 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-082 |
Lignes de note de frais écrites par l'import, cas de TVA par cas de TVA
DétailsObjectif : figer ce que l'import écrit pour chaque cas de TVA, afin de pouvoir restructurer la création des lignes sans changer le résultat. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/AddLineNdfCharacterizationTest.php (8 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-083 |
Une note de frais gelée sur le serveur est gelée dans Dolibarr par sa méthode de statut
DétailsObjectif : le statut était écrit à la main, sans transaction ni déclencheur : rien en aval ne savait que la note de frais était gelée. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/FrozenStatusTest.php (3 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-084 |
Plafonnement d'une dépense personnelle au plafond de remboursement
DétailsObjectif : le plafonnement réécrit les montants qui finissent sur la note de frais, donc sur la paie du salarié, et doit répartir à nouveau la TVA sur le montant plafonné. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/MaxRebuildAmountTest.php (6 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-085 |
Plafonds de restauration par groupe d'utilisateurs
DétailsObjectif : les plafonds de restauration de l'onglet des règles particulières s'appliquent aux membres des groupes listés, et à eux seuls. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/RestaurantCapTest.php (3 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-086 |
Une dépense dont le type n'a pas de correspondance est signalée et reprise plus tard
DétailsObjectif : une dépense professionnelle sans correspondance était abandonnée avec une simple ligne de journal, et la note de frais close quand même ; une dépense personnelle devenait une ligne sans type de frais valide. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/UnmappedExpenseTypeTest.php (3 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-087 |
Lecture du détail d'une note de frais renvoyé par l'API
DétailsObjectif : le serveur répond une liste vide pour une note de frais qui ne contient encore aucune dépense. Elle était prise pour une réponse invalide : tout le compte passait en erreur et la date de dernière synchronisation n'avançait plus. Vérifications :
Couverture automatique : test/phpunit/unit/NdfDetailsParseTest.php (5 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-088 |
Réglage carburant jamais enregistré : aucune notice à l'import
DétailsObjectif : sur une installation où le réglage n'a jamais été enregistré, chaque ligne importée levait une notice de propriété indéfinie, qui inondait le journal et pouvait s'afficher au milieu de la page. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/MissingConfigKeyTest.php (1 méthode, suite integration). |
À tester | Non couvert | Non testé |
| Jetons d'API et horloge | ||||
| DSCDLB-039 |
Détection locale de l'expiration d'un jeton, sans appel réseau
DétailsObjectif : lire la date d'expiration inscrite dans le jeton d'API pour le renouveler AVANT de dépenser une requête HTTP vouée à répondre 401. La signature n'est jamais vérifiée localement, c'est le rôle du serveur. Vérifications :
Couverture automatique : test/phpunit/unit/TokenExpiryTest.php (28 methodes, suite unit). |
À tester | Couvert | Non testé |
| DSCDLB-040 |
Renouvellement automatique du jeton d'un utilisateur sur réponse 401
DétailsObjectif : quand le serveur DoliSCAN invalide le jeton d'un utilisateur, la synchronisation suivante reçoit un code 401. Le module doit recréer le compte côté serveur avec la clé administrateur, récupérer le nouveau jeton et le réenregistrer, sans intervention humaine. Aucun mot de passe n'est stocké par le module, seule la clé administrateur. Vérifications :
Point de contrôle manuel : un compte dont le jeton a été révoqué côté serveur doit se resynchroniser tout seul à l'exécution suivante, sans ticket de support. Couverture automatique : test/phpunit/integration-dolibarr/TokenRenewalTest.php (3 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-041 |
Auto-réparation du jeton pendant l'import (préventive et réactive)
DétailsObjectif : un jeton périmé faisait échouer l'import en silence ("ERROR download details"), la note de frais était perdue et le client ouvrait un ticket. Deux niveaux de réparation sont désormais en place. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/ImportNDFTokenAutoRepairTest.php (4 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-042 |
Récupération du jeton administrateur par code de sécurité
DétailsObjectif : quand la clé administrateur du module est invalidée côté serveur, tous les appels de niveau administrateur répondent 401. Le module doit le signaler et proposer un chemin de récupération par courriel, sans inonder la boîte de l'administrateur. Vérifications :
Point de contrôle manuel : depuis la page de configuration serveur, déclencher la récupération, relever le code reçu par courriel et le saisir. Couverture automatique : test/phpunit/integration-dolibarr/AdminTokenRecoveryTest.php (7 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-043 |
Contrôle du décalage d'horloge avec le serveur DoliSCAN
DétailsObjectif : une horloge locale qui dérive fausse la détection d'expiration des jetons. Le module interroge l'heure du serveur et classe l'écart. Vérifications :
Point de contrôle manuel : la page de diagnostics doit afficher l'écart d'horloge mesuré. Couverture automatique : test/phpunit/integration-dolibarr/ClockSkewTest.php (6 methodes, suite integration). |
À tester | Partiel | Non testé |
| Justificatifs | ||||
| DSCDLB-063 |
Un justificatif indisponible sur le serveur n'est pas enregistré comme PDF
DétailsObjectif : pour un document qu'il ne peut pas produire, le serveur DoliSCAN renvoie une image de remplacement avec un code 200. Elle était enregistrée sous le nom .pdf demandé et plus jamais retéléchargée, puisque toutes les procédures sautent un justificatif dont le fichier existe. Vérifications :
Point de contrôle manuel : le serveur est simulé. Sur un compte réel dont un justificatif n'est pas encore prêt, synchroniser et vérifier qu'aucun faux PDF n'est joint, puis resynchroniser une fois le justificatif prêt et vérifier que le vrai PDF est joint. Couverture automatique : test/phpunit/integration-dolibarr/PlaceholderReceiptTest.php (6 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-064 |
Recherche des justificatifs dans la GED sous Dolibarr 20 et suivants
DétailsObjectif : à partir de Dolibarr 20, la recherche dans la GED passe par le filtre de recherche universel. La parenthèse du dossier d'une note de frais brouillon, (PROVn), invalidait tout le filtre : le justificatif passait pour absent et son second enregistrement échouait. Vérifications :
Point de contrôle manuel : le harnais tourne en Dolibarr 18, avec le même analyseur de filtre que la 20. Sur une instance Dolibarr 20 ou plus, importer une note de frais restée en brouillon, resynchroniser ses justificatifs, et vérifier qu'aucune erreur n'apparaît et que chaque justificatif n'est présent qu'une fois. Couverture automatique : test/phpunit/integration-dolibarr/EcmFilesUsfFilterTest.php (6 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-065 |
Le lien des justificatifs utilise l'identifiant DoliSCAN du compte
DétailsObjectif : avec la correspondance multi-société, un salarié a volontairement un identifiant DoliSCAN différent dans chaque société. L'adresse des justificatifs était construite avec son courriel Dolibarr, et chaque téléchargement échouait sans message utile. Vérifications :
Point de contrôle manuel : le serveur est simulé. Sur une instance multi-société, pour un salarié dont l'identifiant DoliSCAN diffère de son courriel Dolibarr, synchroniser et vérifier que ses justificatifs sont téléchargés. Couverture automatique : test/phpunit/integration-dolibarr/JustificatifUrlLoginTest.php (3 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-066 |
Un justificatif impossible à écrire sur le disque est signalé
DétailsObjectif : un disque plein, un montage en lecture seule ou un mauvais propriétaire ne produisaient ni fichier, ni journal, ni erreur : l'import annonçait un succès et la note de frais restait sans justificatif. Vérifications :
Couverture automatique : test/phpunit/unit/WriteFileTest.php (4 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-117 |
Calendrier des nouvelles demandes d'un justificatif absent du serveur
DétailsObjectif : un justificatif auquel le serveur DoliSCAN répond 404 était redemandé à chaque passage de la tâche planifiée, sans fin. Le délai avant la demande suivante double à chaque 404, sans jamais devenir un abandon définitif, car l'application mobile peut envoyer le justificatif en retard. Vérifications :
Couverture automatique : test/phpunit/unit/ReceiptRetryScheduleTest.php (10 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-118 |
La tâche planifiée espace ses demandes d'un justificatif absent du serveur
DétailsObjectif : la resynchronisation des brouillons et l'import des notes encore ouvertes redemandaient chaque jour un justificatif auquel le serveur répond 404. La tâche planifiée attend désormais son délai, tandis qu'une personne qui synchronise depuis une page obtient toujours une nouvelle demande. Vérifications :
Point de contrôle manuel : le serveur est simulé. Sur un compte réel dont un justificatif est absent du serveur, vérifier dans le rapport de la tâche planifiée la date de la prochaine demande automatique, puis que la resynchronisation de la note depuis sa fiche redemande le justificatif. Couverture automatique : test/phpunit/integration-dolibarr/UnavailableReceiptRetryTest.php (4 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Multi-société | ||||
| DSCDLB-057 |
Isolation par entité des recherches de doublon et des purges
DétailsObjectif : pour une personne qui travaille dans deux sociétés, aucune recherche lancée dans une société ne doit aboutir sur une ligne de l'autre : sinon les lignes d'une société sont rattachées à la note de frais ou à la facture de l'autre. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/MultiEntityIsolationTest.php (14 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-058 |
Remise des notes de frais DoliSCAN dans leur entité et nettoyage des copies
DétailsObjectif : la synchronisation a longtemps enregistré les notes de frais DoliSCAN de toutes les sociétés dans l'entité 1, si bien que la liste restait vide dans les autres. La page de diagnostics les remet dans leur entité et nettoie les copies, sans jamais toucher à ce que la comptabilité détient. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/MyNdfEntityRepairTest.php (28 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-059 |
Déplacement d'un compte DoliSCAN d'une société à une autre
DétailsObjectif : la page de correspondance multi-société déplace un compte, et son jeton, vers une autre société : une erreur confierait les notes de frais d'un salarié à la mauvaise société. Vérifications :
Point de contrôle manuel : les requêtes de la page sont rejouées, pas la page elle-même. Sur une instance multi-société, déplacer un compte depuis la page de correspondance, puis vérifier qu'il apparaît dans la liste des comptes de la société d'arrivée et plus dans celle de départ. Couverture automatique : test/phpunit/integration-dolibarr/MulticompanyMappingActionsTest.php (4 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-060 |
Envoi des projets : seuls les salariés de la société courante sont transmis
DétailsObjectif : l'envoi des projets transmet au serveur DoliSCAN la liste des identifiants des salariés qui y ont accès. En multi-société, les adresses des salariés de toutes les autres sociétés partaient avec le numéro d'immatriculation de la société courante. Vérifications :
Point de contrôle manuel : le serveur est simulé. Après un envoi des projets, vérifier dans l'application mobile d'un salarié que les projets de sa société sont proposés, et pas ceux d'une autre société. Couverture automatique : test/phpunit/integration-dolibarr/PushProjectsEntityTest.php (4 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-061 |
Resynchronisation des justificatifs limitée à la société courante
DétailsObjectif : pour une personne qui travaille dans deux sociétés, la resynchronisation retraitait dans la société courante les notes de frais de l'autre, fichiers et entrées de la GED compris, avec les identifiants du premier compte trouvé. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/ResyncAllDocumentsEntityTest.php (2 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-062 |
Le repère de bascule de la recherche de doublon est lu et écrit par société
DétailsObjectif : la constante DOLISCAN_UPDATE_1_7_10 date le passage de la recherche de doublon à la clé d'import. Elle était écrite et lue dans l'entité 0 : en multi-société, une seule société décidait du comportement de toutes les autres. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/UpdateConstEntityTest.php (2 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Notes de frais DoliSCAN | ||||
| DSCDLB-029 |
Cycle de vie d'un enregistrement de note de frais DoliSCAN
DétailsObjectif : l'enregistrement DoliSCAN porte la charge utile brute venue du mobile et le lien vers la note de frais Dolibarr. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/MyNDFTest.php (11 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-030 |
Méthodes de gestion d'une note de frais : statuts, libellés, métadonnées
DétailsObjectif : couvrir les méthodes de cycle de vie au-delà du CRUD de base. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/MyNDFCrudTest.php (22 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-031 |
Filtres de recherche sur les listes : exactitude et non-régression SQL
DétailsObjectif : ces filtres alimentent les listes du module. Ils sont à rejouer avant et après toute modification de l'échappement SQL. Vérifications, sur les notes de frais comme sur les comptes :
Couverture automatique : test/phpunit/integration-dolibarr/FetchAllFilterTest.php (20 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-032 |
Filtres étendus : clés étrangères, entité, montants, injection SQL
DétailsObjectif : compléter la couverture des filtres sur les axes sensibles pour la sécurité et le cloisonnement. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/FetchAllExtendedFilterTest.php (7 methodes, suite integration). |
À tester | Couvert | Non testé |
| Pages d'administration et affichage | ||||
| DSCDLB-046 |
Toutes les pages d'administration se chargent sur une configuration vierge
DétailsObjectif : attraper la classe de bug qui a frappé la production le 27 avril 2026 : une erreur fatale de type sur une page de configuration, parce qu'une constante inexistante sur une installation neuve était transmise à une fonction au typage strict. Aucun test ne chargeait alors les pages d'administration de bout en bout. Chaque page est chargée dans un processus PHP réel et doit terminer sans erreur fatale, sans exception non rattrapée, sans conflit de typage et sans avertissement émis par un fichier du module. Vérifications :
Point de contrôle manuel : sur une installation neuve, ouvrir successivement chaque page de configuration du module. Couverture automatique : test/phpunit/integration-dolibarr/AdminPagesSmokeTest.php (19 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-047 |
Balayage HTTP de toutes les pages du module sur un serveur réel
DétailsObjectif : détecter par requête HTTP réelle les erreurs fatales, méthodes ou fonctions indéfinies et classes manquantes que l'analyse statique ne peut pas voir sur les variables globales de Dolibarr. Vérifications :
Couverture automatique : test/phpunit/http/AdminPagesHttpTest.php (5 methodes paramétrées, suite http, serveur PHP éphémère). |
À tester | Couvert | Non testé |
| DSCDLB-048 |
Les aides d'affichage tolèrent une configuration absente
DétailsObjectif : verrouiller la correction de l'erreur fatale de la page de configuration bancaire sur un module fraîchement installé, où les constantes de banque n'existent pas encore : la valeur nulle était refusée par un typage strict. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/DisplayHelpersTest.php (8 methodes, suite integration). |
À tester | Couvert | Non testé |
| DSCDLB-113 |
Courriel de retour d'expérience envoyé avec l'adresse de l'installation
DétailsObjectif : le formulaire de retour utilisait l'adresse saisie comme expéditeur : le serveur envoyait au nom d'un domaine qui ne l'y autorise pas, et le message était rejeté ou classé en indésirable sans que personne ne le sache. Vérifications :
Point de contrôle manuel : l'acheminement réel n'est pas testé. Envoyer un retour depuis la page À propos, vérifier qu'il arrive en boîte de réception, et qu'une réponse part vers l'adresse saisie. Couverture automatique : test/phpunit/integration-dolibarr/FeedbackMailSenderTest.php (4 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-114 |
Liste des produits achetables de la configuration carburant
DétailsObjectif : la page de configuration du carburant reposait sur une copie d'une fonction du cœur dont la requête était cassée dès qu'un fournisseur était passé. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/ProductSelectListTest.php (4 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-115 |
Libellés des champs et des statuts traduisibles
DétailsObjectif : les libellés des champs étaient en français brut et les statuts portaient des entités HTML, affichées littéralement et intraduisibles. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/FieldLabelsTest.php (3 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-116 |
Onglet Info des comptes et des notes de frais DoliSCAN
DétailsObjectif : l'onglet Info lisait des colonnes absentes des tables : le créateur n'était jamais affiché et chaque appel levait une notice. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/ObjectInfoTest.php (2 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Paquet et conformité Dolibarr | ||||
| DSCDLB-106 |
Descripteur du module (règles communes des modules)
DétailsObjectif : appliquer au descripteur du module les règles communes à tous les modules de l'équipe. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/ModuleDescriptorTest.php (9 méthodes héritées du paquet cap-rel/dolibarr-module-tests, règles descriptor.*, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-107 |
Activation du module (règles communes des modules)
DétailsObjectif : vérifier sur un vrai Dolibarr que l'activation du module installe tout ce qu'il déclare. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/ModuleInitTest.php (7 méthodes héritées du paquet cap-rel/dolibarr-module-tests, règles module-init.*, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-108 |
Règles de validation DoliStore du paquet
DétailsObjectif : le paquet livré doit passer la validation de la DoliStore. Vérifications :
Couverture automatique : test/phpunit/unit/DolistorePackagingRulesTest.php (5 méthodes héritées du paquet cap-rel/dolibarr-module-tests, règles dolistore.*, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-109 |
Conventions du code livré (règles communes des modules)
DétailsObjectif : appliquer au code livré les conventions communes à tous les modules de l'équipe. Vérifications :
Couverture automatique : test/phpunit/unit/SourceConventionsTest.php (5 méthodes héritées du paquet cap-rel/dolibarr-module-tests, règles source.*, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-110 |
Contenu de l'archive distribuée
DétailsObjectif : l'archive embarquait tous les fichiers Markdown de la racine, notes internes et listes de travail comprises. Vérifications :
Couverture automatique : test/phpunit/unit/BuildZipContentTest.php (5 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-111 |
Droits Unix des entrées de l'archive distribuée
DétailsObjectif : les dossiers de l'archive étaient stockés en 0777, accessibles en écriture à tout compte du serveur après décompression, et les fichiers prenaient le masque de celui qui construisait l'archive, parfois illisibles pour le serveur web. Vérifications :
Couverture automatique : test/phpunit/unit/BuildZipPermissionsTest.php (1 méthode, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-112 |
Index de la table des notes de frais DoliSCAN
DétailsObjectif : chaque synchronisation cherche une note de frais par sa clé d'import, et les diagnostics font une jointure sur le lien vers la note de frais Dolibarr : sans index, deux parcours complets de table qui grandissent avec l'historique. Vérifications :
Couverture automatique : test/phpunit/unit/SchemaIndexesTest.php (4 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| Permissions | ||||
| DSCDLB-044 |
Contexte système, garde de changement de statut et messages lisibles
DétailsObjectif : distinguer une action humaine, qui doit respecter les droits Dolibarr, d'un import automatique, qui rejoue côté serveur ce que l'utilisateur a déjà validé sur son mobile. Et, en cas de refus, expliquer pourquoi en français plutôt que de renvoyer un code. Vérifications :
Couverture automatique : test/phpunit/unit/PermsHelpersTest.php (16 methodes, suite unit). |
À tester | Couvert | Non testé |
| DSCDLB-045 |
Droits du module réellement déclarés et import automatique sans droits
DétailsObjectif : deux causes racines corrigées. D'une part le droit d'écriture sur les notes de frais DoliSCAN n'était pas déclaré alors que quatre méthodes le vérifiaient : le contrôle répondait non à tout le monde, administrateurs compris, et la validation échouait systématiquement. D'autre part les droits n'étaient jamais chargés sur les utilisateurs construits par le module (la simple relecture d'un utilisateur laisse ses droits vides). Vérifications :
Point de contrôle manuel : après une mise à jour du module, ouvrir la page de diagnostics ; si des permissions manquent, utiliser le bouton de réinstallation des permissions. Couverture automatique : test/phpunit/integration-dolibarr/PermissionsSystemContextTest.php (13 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-050 |
Contrôle d'accès des pages du module entre deux salariés, sur un serveur réel
DétailsObjectif : un salarié qui ne détient que les droits DoliSCAN sur ses propres données ne doit ni voir ni modifier ce qui appartient à un collègue, même en devinant l'identifiant dans l'adresse. Un bouton masqué ne suffit pas : le serveur doit répondre 403, sans aucune donnée du collègue. Vérifications :
Couverture automatique : test/phpunit/http/PagesAccessControlHttpTest.php (49 méthodes, suite http, serveur PHP éphémère). |
À tester | Non couvert | Non testé |
| DSCDLB-051 |
Un import tourne toujours au nom du propriétaire de la note de frais
DétailsObjectif : quand un responsable importe la note de frais d'un collègue, la note de frais Dolibarr doit être créée au nom du collègue, jamais au nom de la personne qui a cliqué. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/ImportUserForTest.php (4 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-052 |
Pages de maintenance réservées au super administrateur
DétailsObjectif : les trois pages de maintenance lisent les factures, les utilisateurs et les comptes DoliSCAN de toutes les sociétés : en multi-société, l'administrateur d'une seule société ne doit pas y accéder. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/MaintenancePagesGuardTest.php (4 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-053 |
Distinction entre administrateur d'une société et super administrateur
DétailsObjectif : en multi-société, l'administrateur d'une société ne doit pas pouvoir déplacer dans sa société le compte DoliSCAN d'un salarié d'une autre société, puis importer ses notes de frais. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/SuperAdminGuardTest.php (5 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-054 |
Où accorder un droit DoliSCAN manquant en mode transverse de multi-société
DétailsObjectif : le message qui signale un droit manquant doit envoyer l'administrateur là où il peut l'accorder. En mode transverse, l'onglet Permissions d'un utilisateur est en lecture seule hors de l'entité principale, et les droits dans une société viennent des groupes de l'utilisateur dans cette société. Vérifications :
Point de contrôle manuel : le mode transverse est simulé. Sur une instance multi-société en mode transverse, retirer un droit DoliSCAN à un salarié, lancer la synchronisation, suivre l'indication du message et vérifier que la page atteinte permet d'accorder le droit. Couverture automatique : test/phpunit/integration-dolibarr/PermsTransverseModeTest.php (4 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-055 |
Entrées de menu visibles seulement avec le droit DoliSCAN correspondant
DétailsObjectif : une entrée de menu visible de tous menait à une page qui répond 403 sans le bon droit. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/MenuDeclarationTest.php (5 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-056 |
Le droit de création de facture fournisseur n'est réclamé qu'aux salariés qui paient avec un moyen professionnel
DétailsObjectif : un salarié qui ne paie qu'avec ses propres moyens ne reçoit jamais de facture fournisseur de l'import : l'audit des droits (page de diagnostics, rapport de la tâche planifiée) ne doit pas lui réclamer ce droit. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/UserUsesProPaymentTest.php (5 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Sécurité | ||||
| DSCDLB-067 |
Le jeton administrateur DoliSCAN est chiffré en base
DétailsObjectif : ce jeton permet de créer, désactiver et supprimer tous les comptes distants de la société. Il était stocké en clair alors que les jetons des salariés étaient déjà chiffrés. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/AdminApiKeyStorageTest.php (5 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-068 |
Pages de correspondance : identifiants et libellés distants échappés
DétailsObjectif : les pages de correspondance affichent les identifiants DoliSCAN des comptes et les libellés de types de frais téléchargés depuis l'API : les deux arrivaient tels quels dans le HTML. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/AdminPagesEscapingTest.php (3 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-069 |
Un libellé malveillant saisi dans l'application n'atteint pas le navigateur
DétailsObjectif : de bout en bout, un libellé saisi dans l'application mobile ne doit jamais parvenir sous forme de balise au navigateur de l'administrateur. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/HostileRemoteLabelTest.php (2 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-070 |
Échappement des valeurs distantes dans les rapports et les lignes
DétailsObjectif : libellés, dates, champs du véhicule et noms de fichier viennent de ce que le salarié a saisi dans l'application. Insérés tels quels dans les rapports d'import et la description des lignes, ils permettaient une injection de script stockée. Vérifications :
Couverture automatique : test/phpunit/unit/EscapeRemoteHtmlTest.php (6 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-071 |
Un nom de fichier distant ne sort pas du dossier de son document
DétailsObjectif : le nom de fichier est saisi dans l'application mobile et renvoyé par un serveur dont l'adresse est un réglage libre : il ne doit jamais permettre d'écrire hors du dossier de la note de frais ou de la facture fournisseur. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/PathTraversalGuardTest.php (3 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-072 |
Assainissement des noms de fichier venus de l'API
DétailsObjectif : un nom de fichier venu de l'API doit pouvoir être utilisé sans risque dans un chemin de destination. Vérifications :
Couverture automatique : test/phpunit/unit/RemoteFileNameTest.php (3 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-073 |
Encodage des segments d'adresse des appels API
DétailsObjectif : identifiants, sid et noms de fichier étaient insérés tels quels dans le chemin des adresses de l'API : une barre oblique, un espace ou un point d'interrogation changeait le point d'entrée appelé ou tronquait le chemin. Vérifications :
Couverture automatique : test/phpunit/unit/UrlSegmentTest.php (3 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-074 |
Export CSV : aucune formule ne passe dans le tableur
DétailsObjectif : un salarié pouvait faire exécuter une formule dans le tableur du comptable en nommant une dépense =HYPERLINK(...) dans l'application mobile. Vérifications :
Couverture automatique : test/phpunit/unit/CsvFormulaTest.php (3 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-075 |
Aucun jeton dans les journaux
DétailsObjectif : les réponses de création de compte portent un jeton neuf ; les journaliser telles quelles l'écrivait en clair dans dolibarr.log, ce qui annulait le chiffrement en base. Vérifications :
Couverture automatique : test/phpunit/unit/RedactSecretsTest.php (8 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-076 |
Le jeton administrateur est masqué sur la page de configuration
DétailsObjectif : la page de configuration affichait le jeton DoliSCAN principal en entier : il doit rester reconnaissable sans être utilisable depuis une capture d'écran. Vérifications :
Couverture automatique : test/phpunit/unit/MaskApiKeyTest.php (2 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-077 |
Les sondes réseau vers un service externe sont désactivables
DétailsObjectif : trois sondes appelaient bl.cap-rel.fr, en dur, à chaque erreur réseau du module, sans moyen de les couper ; la détection de l'adresse IP publique se rabattait sur un tiers en HTTP, sans délai d'attente. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/SideChannelTest.php (6 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-078 |
Jeton de sortie de liste noire calculé sans avertissement en tâche planifiée
DétailsObjectif : en ligne de commande, l'adresse de l'appelant n'existe pas : la tâche planifiée levait un avertissement à chaque calcul du jeton. L'algorithme reste inchangé, le serveur décode exactement ce format. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/BlacklistTokenTest.php (2 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Synchronisation et tâche planifiée | ||||
| DSCDLB-033 |
Synchronisation d'un compte et d'une note de frais depuis l'API
DétailsObjectif : c'est le coeur de la synchronisation DoliSCAN vers Dolibarr. La synchronisation de compte récupère la liste des notes de frais du serveur, puis chaque note est traitée : téléchargement du PDF, puis import complet. Vérifications :
Point de contrôle manuel : lancer une synchronisation manuelle depuis la page d'accueil du module et suivre le compte rendu affiché. Couverture automatique : test/phpunit/integration-dolibarr/MyDoliSCANSyncTest.php (7 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-034 |
Tâche planifiée quotidienne : contrôle préalable et compte rendu
DétailsObjectif : point d'entrée appelé par l'ordonnanceur de Dolibarr. Il commence par vérifier la connexion administrateur, puis parcourt les comptes, et enregistre un compte rendu consultable. Vérifications :
Point de contrôle manuel : dans Dolibarr, ouvrir la tâche planifiée DoliSCAN, la lancer manuellement, puis consulter le compte rendu sur la page de configuration. Couverture automatique : test/phpunit/integration-dolibarr/MyDoliSCANCronTest.php (6 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-035 |
Bandeau d'alerte quand la tâche planifiée ne tourne plus
DétailsObjectif : prévenir visiblement l'utilisateur quand l'ordonnanceur Dolibarr a cessé de déclencher la synchronisation, cause fréquente de tickets de support. Vérifications :
Point de contrôle manuel : désactiver la tâche planifiée DoliSCAN et recharger une page du module ; le bandeau doit apparaître. Couverture automatique : test/phpunit/integration-dolibarr/CronStatusWarningTest.php (7 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-036 |
Format de la référence affichée après une synchronisation
DétailsObjectif : la référence visible dans la liste des notes de frais DoliSCAN suit le format historique "DOLISCAN-XX20260301" (initiales de l'utilisateur, puis date locale sans tirets). Le passage aux dates ISO l'avait transformée en chaîne illisible du type "20260331T22_00_00.000000Z". Vérifications :
Point de contrôle manuel : ouvrir la liste des notes de frais DoliSCAN et contrôler la colonne référence. Couverture automatique : test/phpunit/integration-dolibarr/SyncNdfRefFormatTest.php (4 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-037 |
Retéléchargement des justificatifs manquants
DétailsObjectif : récupérer les justificatifs absents de la gestion documentaire pour une note de frais donnée. Vérifications :
Point de contrôle manuel : supprimer un justificatif dans la gestion documentaire, relancer la resynchronisation des documents et vérifier qu'il revient. Couverture automatique : test/phpunit/integration-dolibarr/ResyncAllDocumentsNDFTest.php (3 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-038 |
Garde-fou sur un nom de fichier vide lors de la resynchronisation
DétailsObjectif : incident de production. Une ligne de dépense dont le nom de fichier était vide produisait un critère de recherche vide, qui atteignait la gestion documentaire sous la forme "nom de fichier LIKE %%" et correspondait donc à TOUTES les lignes. Les boucles suivantes supprimaient les orphelines et réécrivaient les autres, déclenchant les événements de modification de fichier sur tous les modules installés : 5578 mises à jour et 39041 appels de déclencheurs pour une seule exécution. Vérifications :
Point de contrôle manuel : lancer une resynchronisation complète et contrôler dans les journaux qu'aucune vague d'écritures documentaires n'est déclenchée. Couverture automatique : test/phpunit/integration-dolibarr/ResyncEmptyFileNameGuardTest.php (2 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-094 |
Une erreur SQL pendant la synchronisation est signalée, pas fatale
DétailsObjectif : une erreur passagère de la base (table verrouillée, migration en cours) transformait toute l'exécution de la tâche planifiée en erreur fatale au lieu d'un échec signalé. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/FetchAllFailureGuardTest.php (2 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-095 |
Un import en échec fait échouer la synchronisation du compte
DétailsObjectif : le résultat de l'import était jeté : un compte en échec comptait comme réussi, la date de dernière synchronisation avançait et le rapport ne montrait rien. Une société entière pouvait cesser d'importer sans un seul avertissement. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/SyncAccountReportsImportFailureTest.php (4 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-096 |
Attente entre deux appels API seulement quand le serveur la demande
DétailsObjectif : chaque appel à l'API était suivi d'une seconde d'attente : une société de deux cents notes de frais passait plus de dix minutes de la tâche planifiée à dormir. L'attente n'a plus lieu que sur un code 429. Vérifications :
Couverture automatique : test/phpunit/unit/ThrottleTest.php (7 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-097 |
Progression de la resynchronisation affichée seulement à la demande d'une page
DétailsObjectif : la progression s'écrivait directement sur la sortie, y compris depuis la tâche planifiée, au milieu du flux d'un autre appelant. Vérifications :
Couverture automatique : test/phpunit/unit/ProgressStreamTest.php (4 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-098 |
Mise à jour des listes de types de frais et de moyens de paiement du serveur
DétailsObjectif : la liste des types professionnels était téléchargée une seule fois, si bien qu'un type ajouté sur le serveur n'apparaissait jamais ; la liste des types personnels était vidée quand le serveur était injoignable. Vérifications :
Point de contrôle manuel : le serveur est simulé. Lorsqu'un type de frais est ajouté sur le serveur DoliSCAN, ouvrir l'onglet de configuration correspondant et vérifier qu'il y apparaît. Couverture automatique : test/phpunit/integration-dolibarr/ServerListRefreshTest.php (2 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| Traductions | ||||
| DSCDLB-102 |
Cohérence des fichiers de traduction du module
DétailsObjectif : une clé ajoutée en français seulement s'affiche sous son propre nom dans toutes les autres langues. Vérifications :
Couverture automatique : test/phpunit/unit/LangKeysConsistencyTest.php (8 méthodes, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-103 |
Fichiers de langue (règles communes des modules)
DétailsObjectif : appliquer aux fichiers de langue du module les règles communes à tous les modules de l'équipe. Vérifications :
Couverture automatique : test/phpunit/unit/LangFilesTest.php (9 méthodes héritées du paquet cap-rel/dolibarr-module-tests, règles lang.*, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-104 |
Aucune phrase française écrite en dur dans les pages
DétailsObjectif : une phrase française écrite directement dans la page ne peut pas être traduite : les utilisateurs des autres langues la lisent en français et les traducteurs ne la voient jamais. Vérifications :
Couverture automatique : test/phpunit/unit/FrenchStringsAreTranslatedTest.php (1 méthode, suite unit). |
À tester | Non couvert | Non testé |
| DSCDLB-105 |
Les modèles de numérotation chargent un fichier de langue livré
DétailsObjectif : les modèles de numérotation chargeaient des fichiers de langue que le module ne livre pas : leurs messages d'erreur s'affichaient sous forme de clés de traduction. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/LangDomainTest.php (3 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| TVA et arrondis | ||||
| DSCDLB-006 |
Correction du centime d'arrondi sur une dépense multi-TVA
DétailsObjectif : quand un justificatif porte plusieurs taux de TVA, la somme des TTC recalculés taux par taux peut s'écarter d'un ou deux centimes du TTC du ticket. L'écart est absorbé sur la dernière ligne de TVA pour que le total importé dans Dolibarr corresponde exactement au ticket, condition du rapprochement bancaire. Vérifications :
Point de contrôle manuel : importer un ticket de restaurant avec TVA 10 % et 20 %, ouvrir la facture fournisseur générée et vérifier que le TTC est identique au centime près au montant du ticket. Couverture automatique : test/phpunit/unit/VatRoundingTest.php (12 methodes, suite unit). |
À tester | Partiel | Non testé |
| DSCDLB-007 |
Contrôle et correction de la TVA d'une note de frais existante
DétailsObjectif : empêcher l'accumulation d'erreurs d'arrondi de corrompre la comptabilité de TVA. La fonction parcourt toutes les lignes d'une note de frais et recalcule HT et TVA à partir du TTC et du taux dès que l'écart dépasse 0,20. Vérifications :
Point de contrôle manuel : depuis la fiche d'une note de frais DoliSCAN, lancer la vérification TVA et contrôler le rapport affiché. Couverture automatique : test/phpunit/integration-dolibarr/CheckAndCorrectVATNDFTest.php (6 methodes, suite integration). |
À tester | Partiel | Non testé |
| DSCDLB-090 |
Détection et correction des lignes carburant à HT et TVA inversés
DétailsObjectif : avant correction, la branche carburant des véhicules utilitaires inversait HT et TVA (un ticket de 60 EUR à 20 % enregistré avec 10 de HT et 50 de TVA). Le total était juste, seule la déclaration de TVA le montrait. La page de diagnostics liste ces lignes et corrige celles des brouillons. Vérifications :
Couverture automatique : test/phpunit/integration-dolibarr/InvertedVatLinesTest.php (10 méthodes, suite integration). |
À tester | Non couvert | Non testé |
| DSCDLB-091 |
Une TVA à taux zéro n'interrompt pas l'import
DétailsObjectif : un ticket portant un montant de TVA à un taux nul provoquait une division par zéro, qui arrêtait l'import de toute la note de frais. Vérifications :
Couverture automatique : test/phpunit/unit/ZeroVatRateTest.php (5 méthodes, suite unit). |
À tester | Non couvert | Non testé |