Yannick Warnier a écrit :
Le mardi 27 mars 2007 à 10:22 +0200, Rodolphe Quiedeville a écrit :
Yannick Warnier a écrit :
Salut,
Pour ceux qui n'ont pas suivi le bug 17811
http://savannah.nongnu.org/bugs/?17811
Je propose de faire la modification suivante dans le code, modification
qui pourrait (si mal configurée) apporter pas mal d'effets de bord dans
Dolibarr
ATTENTION GROS PAVE DANS LA MARE. :-)
Pour moi la modif proposée n'est pas bonne. En effet, la fonction price
est une fonction qui formate un montant pour l'affichage. Cette ne
fonction ne devrait en aucun cas modifier une valeur en base ou en
mémoire au moment de l'affichage. Si la valeur réelle est 1.2345 alors
la fonction price doit renvoyer 1.2345 sinon cela signifie que ce que
voit l'utilisateur n'est pas ce que contient la base ou la donnée, et
la, c'est super grave.
La gestion des arrondis ne doit surtout pas se faire au moment de
l'affichage (que ce soit écran HTML ou PDF) mais au moment du stockage
en base, c'est à-dire au moment ou on insère un ligne détail dans une
facture par exemple.
Le problème étant que les décimales ne sont pas toujours arrondies comme
on le voudrait, et que le nombre de décimales à utiliser pour les
calculs intermédiaires dépend souvent du type de produits que l'on veut
vendre.
Ainsi, la solution que je propose est la suivante:
1) on ajoute deux variables de configuration globales (modifiables
uniquement par l'admin) qui donnent un nombre de décimales par défaut
selon le type de montant:
$show_3_decimals_if_smaller_than = 1;
$show_4_decimals_if_smaller_than = 0.5;
2) le code de la fonction price(), qui est l'endroit où l'on effectue
les arrondis jusqu'ici, deviendrait du type:
...
// On pose par defaut 2 decimales
$decimal = 2;
$amount = ereg_replace(',','.',$amount);
$abs = abs($amount);
if($abs < $show_4_decimals_if_smaller_than){
$decimal = 4;
}elseif($abs < $show_3_decimals_if_smaller_than){
$decimal = 3;
}
// ensuite la fonction price() arrondit en fonction de $decimal
...
3) On pourrait également (dans un second temps) proposer des paramètres
à la fonction price() qui permettent de modifier le nombre de chiffres
après la virgule au cas par cas.
Je ne pense pas qu'il y ait une seule monnaie au monde qui propose une
écriture à plus de 4 décimales mais je me trompe peut-être...
Attention à bien différencier la notion de décimale dans le prix final
et le prix unitaire. 5 décimales sont intéressantes quand on vent des
produits par 100 000 pièces, la cinquième décimale devient alors une
dizaine dans le prix finales.
Mes 2 cents
Merci pour tes 2 cents.
Je n'ai pas eu le temps de faire le développement en soi et je serai
incapable de le faire avant dimanche, mais que ça n'empêche pas qui veut
de faire une 2.1 RC1 ou même une release stable.
Je réglerai le problème dimanche, promis.
Yannick
_______________________________________________
Dolibarr-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/dolibarr-dev
--
Laurent Destailleur.
---------------------------------------------------------------
EMail: [EMAIL PROTECTED]
Web: http://www.destailleur.fr
IM: IRC=Eldy, Jabber=Eldy
AWStats (Author) : http://awstats.sourceforge.net
CVSChangeLogBuilder (Author) : http://cvschangelogb.sourceforge.net
AWBot (Author) : http://awbot.sourceforge.net
Dolibarr (Contributor) : http://www.dolibarr.org
_______________________________________________
Dolibarr-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/dolibarr-dev