Erreur suppression facture avec fichiers joints

Bonjour,

Je pense qu’il pourrait y avoir un bug concernant les factures clients (et un bug « caché » pour celles des fournisseurs…).
En résumé, quand je supprime une facture (client ou fournisseur) qui possède des fichiers joints, ces fichiers sont bien supprimés du disque dur (ainsi que le dossier du disque dur concernant la facture), mais pas de la base de données (table ‹ llx_ecm_files ›).

Voici une description un peu plus détaillée du problème pour une facture client qui affiche une erreur (pas d’erreur pour une facture fournisseur) :

  1. Création d’un brouillon de facture client
  2. Ajout d’un fichier joint (ici ‹ Liste client - 2020-07-26.xlsx ›)
  3. Ajout d’une ligne dans la fiche
  4. Validation de la facture (ici référence affectée ‹ FA2008-0001 ›)
  5. Suppression de la facture
  6. Création d’un brouillon de facture client
  7. Ajout du même fichier joint qu’à l’étape 2
  8. Ajout d’une ligne dans la fiche
  9. Validation de la facture
    –> Si la référence générée est la même que celle de l’étape 4 (pas d’autre facture client validée entre temps), la validation est annulée par cette erreur : « Duplicate entry ‹ facture/FA2008-0001-FA2008-0001-Liste client - 2020-07-26.xlsx-1 › for key ‹ uk_ecm_files › »

–> De ce que j’ai pu comprendre, le problème est qu’à l’étape 5, la suppression de la facture client supprime bien les fichiers sur le disque dur,
mais dans la base de données, seulement la ligne correspondante au fichier pdf généré pour la facture client est supprimée, mais pas la ligne correspondante au fichier joint (si plusieurs fichiers joints, même problème pour tous).
Donc lors de la validation à l’étape 9, quand les fichiers doivent être renommés (PROV… en FA2008-0001…), une erreur est renvoyée car le fichier joint pour cette référence de facture client existe déjà dans la base de données,
car l’index ‹ uk_ecm_files › regroupant les colonnes ‹ filepath ›, ‹ filename › et ‹ entity › de la table ‹ llx_ecm_files › doit être unique.

NB1 : Essayer avec différents fichiers joints et même problème.

NB2 : À noter que la suppression manuelle des fichiers joints (avec l’icône de poubelle) via l’onglet ‹ Fiche › ou l’onglet ‹ Fichiers joints › de la facture client fonctionne correctement,
à la fois pour le fichier sur le disque dur et à la fois pour la ligne correspondante dans la base de données (donc c’est bien possible à un moment donné…) !

NB3 : Pour une facture fournisseur, le message d’erreur n’apparait pas, donc la validation de la 2ème facture fournisseur fonctionne, mais les lignes des fichiers joints dans la base de données ne sont tout de même pas supprimées :
Pour une facture client, les fichiers sont stockés dans « facture/FA2008-0001 » (colonne ‹ filepath › de la table) pour la 1ère facture (supprimée), et aussi pour la 2ème.
Pour une facture fournisseur, les fichiers sont stockés dans « fournisseur/facture/1/0/SI2008-0001 », pour la 1ère facture fournisseur (supprimée), mais pour la 2ème, le chemin d’accès est incrémenté en « fournisseur/facture/2/0/SI2008-0001 », il n’y a donc pas d’erreur avec l’index ‹ uk_ecm_files › qui doit être unique, puisque du coup il ne l’est pas avec ce nouveau chemin d’accès.

Voici ce que je peux supposer au niveau des fichiers php de Dolibarr :
Fichier ‹ core\lib\files.lib.php › ligne 1233, appel fonction ‹ delete › du fichier ‹ ecm\class\ecmfiles.class.php › : $result = $ecmfile->delete($user);
–> problème dans la boucle ‹ foreach ›, ou dans les ‹ if › ? qui fait que la fonction ‹ delete › concernant la requête SQL DELETE des fichiers joints n’est pas appelée ?

Voici le log correspondant à l’action ‹ Supprimer › la facture client (étape 5), on voir clairement que la requête DELETE dans la table ‹ llx_ecm_files › ne concerne qu’une seule ligne (celle du fichier pdf généré pour la facture), alors que le fichier joint est bien supprimé du disque dur :
https://textup.fr/475576zp

Voici ma config :
Dolibarr 12.0.1 (depuis version initiale 11.0.3)
Apache 2.4.43 (Win64)
OpenSSL 1.1.1g
PHP 7.4.8
MariaDB 10.5.4
Hébergement local, installation manuelle complète (via le tuto du wiki de Dolibarr)
Windows 10 version 2004 (10.0.19041.388)
Thème Eldy
Aucun module externe
Testé sur Firefox et Chrome à jour
Problème reproduit sur la démo Dolibarr (12.0.0), le 12/08/2020 à 16h56

Ce n’est peut-être pas un bug très gênant en soi (concrètement il n’empêche pas le bon fonctionnement de la facturation), mais en toute logique, cela paraîtrait normal qu’à la suppression d’une facture, les lignes dans la base de données correspondantes aux fichiers joints de cette facture soient supprimées, au même titre que celle concernant le fichier pdf généré, et celle concernant la facture elle-même.

En espérant avoir été assez clair dans mes explications.

Kevin

Bonjour,

Je peux confirmer le bug.

Par contre si on valide la facture avant d’ajouter le fichier joint, il n’y a pas de bug, on peut ajouter le même fichier, bien que la ligne du précédent fichier dans la table ecm_files soit toujours présente.

Cdlt

Bonjour @pascal_z, @Kev,

Bug à remonter sur github !

@pascal_z, effectivement, si le fichier joint est ajouté après la validation de la 2ème facture client, seulement un avertissement est affiché, et en théorie pas de problème avec la ligne déjà présente dans la table ‹ ecm_files ›.

@RomainDeschamps, je ne suis malheureusement pas bilingue, mais je vais faire de mon mieux pour traduire mon poste sur github.

Merci à vous.

Bug posté sur github : https://github.com/Dolibarr/dolibarr/issues/14474

1 « J'aime »

Suite au report du bug sur github, je confirme qu’il a été résolu avec la version 12.0.3.