Comment rendre pérenne des modifications de code?

Bonjour,

J’utilise Dolibarr (actuellement, version 18.0.2) pour mon activité. Je suis assez satisfait de l’outil, puissant, mais j’ai tout de même 2 problèmes que je décris en détail ci-dessous.

J’ai réussi à contourner ces problèmes en allant faire des modifications de code directement dans les fichiers PHP de Dolibarr. C’est pas très joli…

Du coup, ma question est la suivante : Est-ce que Dolibarr prévoir des mécanisme d’overload ou override de fonctions qui permettrait de faire ce type de modif sans toucher aux fichiers natifs de Dolibarr (afin d’éviter que tout soit cassé à la prochaine mise à jour).

Dans mon cas, je ne crois pas que les hook ou les triggers répondent, mais je ne suis pas vraiment expert Dolibarr, d’où cet appel à vos lumières.

Ci-dessous mes 2 problèmes et les modifications effectuées.

Je vous remercie d’avance pour votre aide.

Problème 1 :
J’ai mon activité en Polynésie Française, mais le compte courant de mon entreprise est en métropole. La devise de mon activité est donc le XPF, et celle de mon compte, l’EUR.

J’utilise le module multi-devise.

Le problème est que, lorsque je saisis un règlement sur une facture en XPF, je le saisis en XPF (jusque là, tout va bien). Mais l’écriture inscrite sur le compte bancaire est fausse : le montant est en XPF, et non en EUR.

J’ai corrigé ce problème avec un petit bout de code dans htdocs/compta/bank/class/account.class.php, fonction addLine, juste avant $accline = new AccountLine($this->db);

		// If $amount and $amount_main_currency are the same, it means the amount is in the main currency
		// In this case :
		//              check if the account currency is the same as the main currency.
		//                      YES : Do nothing
		//                      NO : Convert amount from $amount_main_currency
		if (isModEnabled("multicurrency")) {
			if ($amount === $amount_main_currency) {
				if ($this->multicurrency_code != $conf->currency) {
					list($currencyCode, $currencyRate) = MultiCurrency::getIdAndTxFromCode($this->db, $this->currency_code, $date);
						$amount = $amount_main_currency * $currencyRate;
				}
			}
		}

Problème 2 :
Je ne veux pas que les propal ou factures PDF soient générées automatiquement. Je veux les générer à la demande, en cliquant sur le bouton « Générer ».

J’ai donc activé le paramètre MAIN_DISABLE_PDF_AUTOUPDATE.

Mon soucis, c’est que avec ce paramètre activé, quand je clique sur « Générer », le PDF s’ouvre automatiquement, ce que je ne veux pas.
Je voudrais le même comportement que celui sans ce paramètre, à savoir que si je cliques sur « Générer », le document est généré, mais ne s’ouvre que si je le demande.

En plus, il y a conflit entre le paramètre MAIN_DISABLE_PDF_AUTOUPDATE et MAIN_ODT_AS_PDF_DEL_SOURCE : Si le premier est activé, le second ne fonctionne plus.

Là encore, il m’a suffit d’aller dans le fichier htdocs/includes/odtphp/odf.php (j’utilises un modèle odt automatiquement converti en PDF), et de commenter le bloc de ligne suivant :

				if (!empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
					$name=preg_replace('/\.od(x|t)/i', '', $name);
					header('Content-type: application/pdf');
					header('Content-Disposition: attachment; filename="'.$name.'.pdf"');
					readfile($name.".pdf");
				}

1 « J'aime »

Bonjour,

Si le système de hooks/trigger ne convient pas vous pouvez faire un fork du code de Dolibarr sur github, modifier le fork à votre convenance et installer ce dernier.

Vous devez réappliquer les modifs sur chaque mise à jour de Dolibarr si vous synchronisez le fork. En gros réappliquer des PR sur le nouveau tag.

Ce n’est pas différents si vous utilisez des hooks et/ou triggers, à chaque mise à jour de Dolibarr il faut vérifier que ceux-ci fonctionnent toujours correctement.

Bonjour,

Merci pour cette réponse.
Je craignais bien qu’il n’y ait pas d’autres solution, mais j’espérais me tromper.

Je n’ai pas beaucoup de modification de code pour l’instant. Je devrais pouvoir m’en sortir.

Question subsidiaire : le problème lié au multi-devise ne devrait-il pas faire l’objet d’une déclaration d’anomalie ?
C’est un peu un « bug » si en multi-devises, on ne peut pas avoir un compte en devise autre que la devise de la société. Non ?

Merci encore.

1 « J'aime »

Bonjour :slightly_smiling_face:
@TeHonu concernant la modif pour les devise il serait intéressant d’ouvrir un PR sur github car vous n’êtes sans doute pas seul dans ce cas.

Bonjour,
cette question de remplacement de function m’intéresse aussi sur Dolibarr et j’hésite à ouvrir un nouveau sujet vu la similitude…

S’il s’agit de remplacer une fonction (définie dans facture.class pour mon cas) définitivement, comment pourrait-on faire?
De fait cela revient à savoir s’il existe un moyen d’initialiser un remplacement permanent de l’appel de fonction « basique » par une autre fonction définie dans la class du module custom ?

bonsoir,

à titre personnel, j’essaierai d’inclure à travers un module, un hook pour:

  1. une nouvelle class extension de la classe Facture, genre Class MyFacture extends Facture

  2. Dans cette nouvelle class, vous redefinisser la fonction qui vous intéresse en la nommant exactement de la même manière que la méthode de la class Facture

  3. En dehors de la class, vous créer et affecter un nouvel objet MyFacture dans la variable qui contenait l’objet Facture jusqu’ici.

Normalement, dans la suite de l’exécution du code, à chaque fois que l’objet « Facture » sera appelé, ce sera en fait votre nouvelle classe MyFacture qui le sera.

Bonne nuit

1 « J'aime »

Bonsoir,
Merci beaucoup pour ce résumé, je vais voir si je peux me débrouiller avec cette technique.

Bonjour, le mieux serait de proposer vos corrections et améliorations pour intégration au core sur GitHub.
C’est ainsi que dolibarr évolue.

Bonjour
Le problème est le meme pour les transferts multidevise entre compte ayant différentes devise. Le transfert dans le compte bancaire est Ok mais le transfert en compta cree des décalage / incoherence dans le compte pivot en transférant en compabilite les montants en devise et non pas les montants en devise principale