Suppression impossible de factures PROV et Brouillons

Bonjour :slight_smile:

J’utilise Dolibarr 16.0.5~ynh1 en auto-hébergement sur un Rpi 2 sous Yunohost 11.2.3 (stable).

Je viens de rencontrer un soucis lorsque j’essaye de supprimer des factures brouillons et provisoires crées par erreur. Celles-ci ne se suppriment pas et j’obtiens ce message :

sql=DELETE FROM llx_facturedet WHERE fk_facture = 742

J’ai tenté de créer une nouvelle facture brouillon pour voir si le problème l’impactait aussi, et c’est le cas. A peine une facture brouillon crée (PROVxxx), je ne peux plus la supprimer et ai le même message d’erreur (avec dans le message d’erreur fk_facture = 744 si la facture que je te te de suppromer est PROV744)

Exemple :

Auriez-vous une idée du problème ? :confused: Un grand merci d’avance !

Bonjour @Caribou22
Votre message n’est pas si claire, mais pour supprimer une facture il faut vérifier s’il n’y a pas de payment avant et c’est ton cas pour la facture « brouillon ». Dans ce cas d’abord il faut supprimer l’entrée dans la table llx_facturedet
DELETE FROM llx_facturedet WHERE fk_facture = 742
Et en suite
DELETE FROM llx_facture WHERE rowid = 742
J’espère que ça puisse aider.
Courage

Bonjour et merci.
En effet, aucune des factures concernées n’a de paiement. J’essayais de les supprimer simplement avec le bouton « supprimer »

Exemple :

« il faut supprimer l’entrée dans la table llx_facturedet »

Je n’ai jamais fait ça, désolé (avant, le bouton « supprimer » fonctionnait bien). Comment le fait-on ?

Re bonjour,
Oui j’ai cru que vous essayer d’exécuter des requêtes SQL directement.
Vous avez la main sur votre base de donnée?

Je suis auto-hébergé sur mon propre serveur donc je suppose que oui, mais je ne l’ai jamais fait (j’ignore comment procéder du coup)

Je dois me connecter en SSH à mon serveur j’imagine ?

Re
Si vous connaissez le nom de domaine que vous avez configuré lors de l’installation de votre yunohost et le mot de passe vous pouvez y accéder, dessus il y a phpmyadmin, l’application permettant de mettre la main sur votre base de données.
Et certainement il y a un moyen de voir toutes ces informations.
Vous pouvez me contacter en privée, si vous souhaitez.
Cordialement.

Bonjour,

Il semble que l’installeur de Yunohost n’est pas une version à jour de Dolibarr.

Ce message indique que cette instruction ne fonctionne pas (ou que la version du code installé par Yunohost affiche ce message sans qu’il y ai de problème mais l’opération n’aboutis pas pour autant)

Etant fan de Yunohost, j’ai essayé de participer à la conception/mise a jour du package Dolibarr mais quelqu’un s’en occupe déjà et il/elle le fait bien mais je vais essayer de voir sur leur github si il y a quelque chose a faire…

Il semble que l’intégration de la version 17.0 dans Yunohost soit en cours (au 2 juin).

Info technique :

Reste à suivre que la 17.0.3 soit validée

1 « J'aime »

Merci pour ces nouvelles réponses ! :slight_smile:

@Anaruz J’ai installé l’application phpmyadmin et je suis apparemment au bon endroit :

Comment procéder pour supprimer ce qui doit l’être ensuite ? (Juste pour l’info dans un premier temps, car avant de mettre les mains dans le cambouis j’aurais aimé savoir pourquoi c’est arrivé. Et surtout, il faudrait que je puisse à nouveau supprimer mes factures sans passer par ça.)

@FHenry : Ok, ce serait donc juste un problème de mise à jour ? Bizarre quand-même car jusqu’à présent je n’avais pas eu le problème. S’il y a moyen de mettre à jour proprement Dolibarr dans Yunohost et que ça résoud le problème, je suis preneur :slight_smile:

Bonsoir @Caribou22
Mais je ne vois « fk_facture 744 »?
J’aurais besoin de voir vos logs aussi. là où il y a votre dolibar, dans documents il y un fichier « dolibarr.log » pour voir pourquoi la requête ne passe pas!
Cordialement

Bonjour

Pour avoir les log il faut activer le module des log dans Dolibarr

J’ai réussi hier soir à activer les logs avec l’aide de @Anaruz :wink:

Voici un extrait de log pour info :

dolibarr.log (51,5 Ko)

Pour avoir cet extrait, j’ai tenté de supprimer depuis Dolibarr (pas depuis phpmyadmin, que je n’ai jamais manipulé) la facture PROV746, et j’obtiens en pop-up rouge :

sql=DELETE FROM llx_facturedet WHERE fk_facture = 746

je serai dispo en MP dans l’après-midi :wink:

Je vois bien dans la log a la fin le
ROLLBACK Transaction
ce qui veux dire que dolibarr détecte une erreur (ou à une information qui lui fait pensé qu’il ya un pb) et annule la suppression, mais pas d’autre erreur dans les log…

Il y a bien un warning
2023-08-12 10:47:21 WARNING 2a01:cb08:8148:4300:b11e:947e:6cb0:a9df Failed to read image using Imagick (Try to install package ‹ apt-get install php-imagick ghostscript › and check there is no policy to disable pdf convertion in /etc/ImageMagick*/policy.xml): attempt to perform an operation not allowed by the security policy `PDF’ @ error/constitute.c/IsCoderAuthorized/421

qui dit qu’il manque un un paquet php car votre PDF doit être générer en mode « non modifiable » (Configuration->PDF), mais un warning ne devrait faire planté comme çà.

Pouvez vous essayer de d’abords supprimer le pdf (poubelle a coté du doc PDF) et après la facture ?

Bonjour,

J’ai pu supprimer le PDF, mais pas la facture. Voici le log actualisé :
dolibarr.log (498,3 Ko)

Bonjour @Caribou22 :

Le problème c’est ça:

BEGIN Transaction
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df   Facture::deleteExtraFields delete
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df   sql=DELETE FROM llx_facture_extrafields WHERE fk_object = 746
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df   Facture::deleteObjectLinked
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df   sql=DELETE FROM llx_element_element WHERE (fk_source = 746 AND sourcetype = 'facture') OR (fk_target = 746 AND targettype = 'facture')
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df  sql=DELETE FROM llx_societe_remise_except WHERE fk_facture_source = 746 AND fk_facture_line IS NULL
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df  Facture::fetch_lines
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df  sql=SELECT l.rowid, l.fk_facture, l.fk_product, l.fk_parent_line, l.label as custom_label, l.description, l.product_type, l.price, l.qty, l.vat_src_code, l.tva_tx, l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.remise_percent, l.fk_remise_except, l.subprice, l.ref_ext, l.situation_percent, l.fk_prev_id, l.rang, l.special_code, l.date_start as date_start, l.date_end as date_end, l.info_bits, l.total_ht, l.total_tva, l.total_localtax1, l.total_localtax2, l.total_ttc, l.fk_code_ventilation, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.fk_unit, l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc, p.ref as product_ref, p.fk_product_type as fk_product_type, p.label as product_label, p.description as product_desc FROM llx_facturedet as l LEFT JOIN llx_product as p ON l.fk_product = p.rowid WHERE l.fk_facture = 746 ORDER BY l.rang, l.rowid
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df  sql=UPDATE llx_societe_remise_except SET fk_facture = NULL, fk_facture_line = NULL WHERE fk_facture_line IN (1277)
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df  sql=UPDATE llx_eventorganization_conferenceorboothattendee SET fk_invoice = NULL WHERE fk_invoice = 746
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df  sql=UPDATE llx_projet_task_time SET invoice_id = NULL, invoice_line_id = NULL WHERE invoice_id = 746
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df  sql=DELETE FROM llx_facturedet_extrafields WHERE fk_object IN (SELECT rowid FROM llx_facturedet WHERE fk_facture = 746)
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df  sql=DELETE FROM llx_facturedet WHERE fk_facture = 746
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df  sql=SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position FROM llx_c_type_contact as tc WHERE tc.element='facture' ORDER BY position ASC, code ASC
2023-08-12 10:47:23 DEBUG   2a01:cb08:8148:4300:b11e:947e:6cb0:a9df
ROLLBACK Transaction

Au lieu de

ROLLBACK Transaction

on doit voir

COMMIT Transaction

Votre code annule les opérations précédentes pour une raison qu’on ignore! On peut investiguer profondément. Surtout essayer d’exécuter les opération dans ce journal une par une et vérifier ce qui en résulter (phpmyadmin).
Courage

Bonjour et merci pour cette aide :slight_smile:
Le temps que la solution soit trouvée, comment puis-je supprimer proprement les factures en attendant ?

Si j’ai bien compris, si je veux par exemple supprimer proprement la facture 746 je dois exécuter ces commandes :

DELETE FROM llx_facture_extrafields WHERE fk_object = 746
DELETE FROM llx_element_element WHERE (fk_source = 746 AND sourcetype = 'facture') OR (fk_target = 746 AND targettype = 'facture')
DELETE FROM llx_societe_remise_except WHERE fk_facture_source = 746 AND fk_facture_line IS NULL
SELECT l.rowid, l.fk_facture, l.fk_product, l.fk_parent_line, l.label as custom_label, l.description, l.product_type, l.price, l.qty, l.vat_src_code, l.tva_tx, l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.remise_percent, l.fk_remise_except, l.subprice, l.ref_ext, l.situation_percent, l.fk_prev_id, l.rang, l.special_code, l.date_start as date_start, l.date_end as date_end, l.info_bits, l.total_ht, l.total_tva, l.total_localtax1, l.total_localtax2, l.total_ttc, l.fk_code_ventilation, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.fk_unit, l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc, p.ref as product_ref, p.fk_product_type as fk_product_type, p.label as product_label, p.description as product_desc FROM llx_facturedet as l LEFT JOIN llx_product as p ON l.fk_product = p.rowid WHERE l.fk_facture = 746 ORDER BY l.rang, l.rowid
UPDATE llx_societe_remise_except SET fk_facture = NULL, fk_facture_line = NULL WHERE fk_facture_line IN (1277)
UPDATE llx_eventorganization_conferenceorboothattendee SET fk_invoice = NULL WHERE fk_invoice = 746
UPDATE llx_projet_task_time SET invoice_id = NULL, invoice_line_id = NULL WHERE invoice_id = 746
DELETE FROM llx_facturedet_extrafields WHERE fk_object IN (SELECT rowid FROM llx_facturedet WHERE fk_facture = 746)
DELETE FROM llx_facturedet WHERE fk_facture = 746
SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position FROM llx_c_type_contact as tc WHERE tc.element='facture' ORDER BY position ASC, code ASC
DELETE FROM llx_facture WHERE rowid=746

C’est bien ça ? Elles sont toutes nécessaires ? C’est sans risques ? :^^
Merci d’avance, je suis dispo en MP pour poursuivre les investigations

Voici ou nous en sommes donc dans la recherche du bug. (Rappel : Je ne peux plus supprimer aucune facture depuis Dolibarr, même les dernières crées, en brouillon et sans paiement)

Observation : ça ne concerne que les factures clients. Aucun soucis avec les factures fournisseurs.

Voici les logs que j’obtiens quand je tente de supprimer une facture client (la plus récente, à l’état de brouillon sans paiement) depuis dolibarr :

2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7 BEGIN Transaction
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7   Facture::deleteExtraFields delete
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7   sql=DELETE FROM llx_facture_extrafields WHERE fk_object = 748
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7   Facture::deleteObjectLinked
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7   sql=DELETE FROM llx_element_element WHERE (fk_source = 748 AND sourcetype = 'facture') OR (fk_target = 748 AND targettype = 'facture')
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7  sql=DELETE FROM llx_societe_remise_except WHERE fk_facture_source = 748 AND fk_facture_line IS NULL
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7  Facture::fetch_lines
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7  sql=SELECT l.rowid, l.fk_facture, l.fk_product, l.fk_parent_line, l.label as custom_label, l.description, l.product_type, l.price, l.qty, l.vat_src_code, l.tva_tx, l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.remise_percent, l.fk_remise_except, l.subprice, l.ref_ext, l.situation_percent, l.fk_prev_id, l.rang, l.special_code, l.date_start as date_start, l.date_end as date_end, l.info_bits, l.total_ht, l.total_tva, l.total_localtax1, l.total_localtax2, l.total_ttc, l.fk_code_ventilation, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.fk_unit, l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc, p.ref as product_ref, p.fk_product_type as fk_product_type, p.label as product_label, p.description as product_desc FROM llx_facturedet as l LEFT JOIN llx_product as p ON l.fk_product = p.rowid WHERE l.fk_facture = 748 ORDER BY l.rang, l.rowid
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7  sql=UPDATE llx_eventorganization_conferenceorboothattendee SET fk_invoice = NULL WHERE fk_invoice = 748
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7  sql=UPDATE llx_projet_task_time SET invoice_id = NULL, invoice_line_id = NULL WHERE invoice_id = 748
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7  sql=DELETE FROM llx_facturedet_extrafields WHERE fk_object IN (SELECT rowid FROM llx_facturedet WHERE fk_facture = 748)
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7  sql=DELETE FROM llx_facturedet WHERE fk_facture = 748
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7  sql=SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position FROM llx_c_type_contact as tc WHERE tc.element='facture' ORDER BY position ASC, code ASC
2023-08-13 17:22:09 DEBUG   2a01:cb08:8148:4300:409c:a886:798e:8d7 ROLLBACK Transaction

Et voici ce que je devrais avoir :

2023-08-12 11:46:44 DEBUG   127.0.0.1       BEGIN Transaction
2023-08-12 11:46:44 INFO    127.0.0.1        Trigger 'ActionsBlockedLog' for action 'BILL_DELETE' launched by /opt/lampp/htdocs/dolibarr_1703/htdocs/core/triggers/interface_50_modBlockedlog_ActionsBlockedLog.class.php. id=7
2023-08-12 11:46:44 DEBUG   127.0.0.1         Facture::deleteExtraFields delete
2023-08-12 11:46:44 DEBUG   127.0.0.1         sql=DELETE FROM llx_facture_extrafields WHERE fk_object = 7
2023-08-12 11:46:44 INFO    127.0.0.1         Trigger 'ActionsBlockedLog' for action 'OBJECT_LINK_DELETE' launched by /opt/lampp/htdocs/dolibarr_1703/htdocs/core/triggers/interface_50_modBlockedlog_ActionsBlockedLog.class.php. id=7
2023-08-12 11:46:44 DEBUG   127.0.0.1         Facture::deleteObjectLinked
2023-08-12 11:46:44 DEBUG   127.0.0.1         sql=DELETE FROM llx_element_element WHERE (fk_source = 7 AND sourcetype = 'facture') OR (fk_target = 7 AND targettype = 'facture')
2023-08-12 11:46:44 DEBUG   127.0.0.1        sql=DELETE FROM llx_societe_remise_except WHERE fk_facture_source = 7 AND fk_facture_line IS NULL
2023-08-12 11:46:44 DEBUG   127.0.0.1        Facture::fetch_lines
2023-08-12 11:46:44 DEBUG   127.0.0.1        sql=SELECT l.rowid, l.fk_facture, l.fk_product, l.fk_parent_line, l.label as custom_label, l.description, l.product_type, l.price, l.qty, l.vat_src_code, l.tva_tx, l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.remise_percent, l.fk_remise_except, l.subprice, l.ref_ext, l.situation_percent, l.fk_prev_id, l.rang, l.special_code, l.date_start as date_start, l.date_end as date_end, l.info_bits, l.total_ht, l.total_tva, l.total_localtax1, l.total_localtax2, l.total_ttc, l.fk_code_ventilation, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.fk_unit, l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc, p.ref as product_ref, p.fk_product_type as fk_product_type, p.label as product_label, p.description as product_desc FROM llx_facturedet as l LEFT JOIN llx_product as p ON l.fk_product = p.rowid WHERE l.fk_facture = 7 ORDER BY l.rang, l.rowid
2023-08-12 11:46:44 DEBUG   127.0.0.1        sql=UPDATE llx_eventorganization_conferenceorboothattendee SET fk_invoice = NULL WHERE fk_invoice = 7
2023-08-12 11:46:44 DEBUG   127.0.0.1        sql=UPDATE llx_projet_task_time SET invoice_id = NULL, invoice_line_id = NULL WHERE invoice_id = 7
2023-08-12 11:46:44 DEBUG   127.0.0.1        sql=DELETE FROM llx_facturedet_extrafields WHERE fk_object IN (SELECT rowid FROM llx_facturedet WHERE fk_facture = 7)
2023-08-12 11:46:44 DEBUG   127.0.0.1        sql=DELETE FROM llx_facturedet WHERE fk_facture = 7
2023-08-12 11:46:44 DEBUG   127.0.0.1        sql=SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position FROM llx_c_type_contact as tc WHERE tc.element='facture' ORDER BY position ASC, code ASC
2023-08-12 11:46:44 DEBUG   127.0.0.1        Facture::delete_linked_contact
2023-08-12 11:46:44 DEBUG   127.0.0.1        sql=DELETE FROM llx_element_contact WHERE element_id = 7 AND fk_c_type_contact IN (60,50,62,61)
2023-08-12 11:46:44 DEBUG   127.0.0.1        sql=DELETE FROM llx_facture WHERE rowid = 7
2023-08-12 11:46:44 DEBUG   127.0.0.1         sql=DELETE FROM llx_ecm_files_extrafields WHERE fk_object IN ( SELECT rowid FROM llx_ecm_files WHERE filename LIKE '(PROV7)%' AND filepath = 'facture/(PROV7)' AND entity = 1)
2023-08-12 11:46:44 DEBUG   127.0.0.1         sql=DELETE FROM llx_ecm_files WHERE filename LIKE '(PROV7)%' AND filepath = 'facture/(PROV7)' AND entity = 1
2023-08-12 11:46:44 DEBUG   127.0.0.1       COMMIT Transaction
1 « J'aime »

Bonjour,

Je me permet de relancer le sujet car j’ai le même soucie en version 19.0.0.
Le problème semble venir du code de facture.class.php ligne 2870.
Il y a deux suppression appliqué en même temps :

  • $sqlef = "DELETE FROM ".$ef." WHERE fk_object IN (SELECT rowid FROM ".$main." WHERE fk_facture = ".((int) $rowid).")";
  • $sql = 'DELETE FROM '.MAIN_DB_PREFIX.'facturedet WHERE fk_facture = '.((int) $rowid);

Dans mon cas en « brouillon » aucune ligne n’existe ni dans facturedet ni dans extrafields, la question est ce que la valeur de retour de :

$this->db->query($sqlef) && $this->db->query($sql)
est false lorsque aucune ligne est supprimé ? Je pense que oui.

Car on a le résultat :

$this->error = $this->db->lasterror(). sql=.$sql;
$this->errors[] = $this->error;
$this->db->rollback();

Cordialement,

Bonjour,
Mettez à jour avec la version 19.0.2 dans un premier temps. Pour voir.

Bonjour,
J’ai mis à jours vers la version 19.0.2 et j’ai toujours le même message d’erreur.

sql=DELETE FROM llx_facturedet WHERE fk_facture = 2

Par ailleurs, les lignes de code de facture.class.php n’ont pas changé.

J’ai modifié le code pour savoir quel partie de la condition est fausse:
$this->db->query($sqlef);
$this->db->query($sql);
$this->delete_linked_contact();

Les deux premiers retournes 1 par contre le dernier retourne 0.
Ce qui fait que la condition de test est fausse pour la suppression de la facture.

La classe Facture hérite de CommonInvoice qui hérite de CommonObject.
Dans CommonObject la fonction delete_linked_contact retourne un integer :

  • Plus grand que 0 si il supprime quelque chose,
  • 0 Si rien n’est fait (mon cas comme il n’y a rien a supprimer),
  • 0 Si il y a un probléme.

On a un exemple de bug les amis.

La solution la plus simple est de modifier la ligne 2871 :

if ($this->db->query($sqlef) && $this->db->query($sql) && $this->delete_linked_contact()) {

Par:

if ($this->db->query($sqlef) && $this->db->query($sql) && $this->delete_linked_contact()>=0) {

Bug 29640 créé dans GitHub.