Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forum osCommerce-fr _ Modules de Paiement et de Livraison _ {Résolu}[ Atos ] Pb de montant arrondi

Écrit par : xiaopigu23 5 Oct 2004, 12:08

Voila mon pb: a la sortie du checkout_confirmation, le total de ma commande est:
$order->info['total'] = 9.20 euros (normal)

Quand j'arrive sur la page de saisie de CB, il est de 9.19 euors confused.gif



Dans le module ATOS, le montant initial a subi ce traitement (dans la fonction qui crée la commande à envoyer a ATOS):

$amount = sprintf("%03d", $amount * $this->_getCurrencyUnit($currency));

Quelqu'un peut-il me m'expliquer cette ligne?
Avez-vous deja rencontré ce probleme?


confused.gif

Écrit par : toffee 5 Oct 2004, 13:13

question bete mais des fois utile ... t'as mis a jour le taux de conversion du $ vers l'Euro ?
tu dois avoir EUR = 1.00000000 et $ = 1.xxxxxxxxx suivant le cours actuel.

Écrit par : xiaopigu23 5 Oct 2004, 14:06

QUOTE (toffee @ 05 oct 2004, 08:13)
question bete mais des fois utile ... t'as mis a jour le taux de conversion du $ vers l'Euro ?
tu dois avoir EUR = 1.00000000 et $ = 1.xxxxxxxxx suivant le cours actuel.

Dans l'Admin de la boutique tu veux dire ? Je n'ai que l'euro dans les devises

ps. Je ne travaille qu'en euros, tous mes prix sont stockés en euros

Écrit par : toffee 5 Oct 2004, 14:22

oui, dans localisation tu fais actualiser les devises apres avoir configuré ton OSC pour l'euro par defaut (normalement si tu as la langue français par defaut et l'ajustement auto langue/monaie c'est bon).

Il semblerait que le script soit a la base configuré pour tout gerer en $ et qu'il convertisse vers l'euro donc c'est possible que sans faire cette manip le taux de conversion a + de 1.000000 te mette dedans ... g eu le meme probleme, et je l'ai résolu comme ca.

A ton écoute ... bonne chance smile.gif

Écrit par : vinioute 27 Oct 2004, 15:19

Il y a un bug dans le module :

CODE

$amount = sprintf("%03d", $amount * $this->_getCurrencyUnit($currency));

à remplacer par :
CODE

$amount = str_pad ($amount * $this->_getCurrencyUnit($currency), 3, 0, STR_PAD_LEFT);


Vinioute

Écrit par : xiaopigu23 27 Oct 2004, 22:17


es-tu sûr de ton code vinioute ?

si j'ai un montant de $amount=154.0522

ton instruction donne 15405.22 (au lieu de 15405)


Pour ma part, j'ai finalement laissé le sprintf tel quel... malgré le centime d'ecart de tps en tps

Écrit par : vinioute 4 Nov 2004, 17:38

Oki alors si tu préfères ça devrait être mieux :

QUOTE

$amount = str_pad (round($amount * $this->_getCurrencyUnit($currency), 0), 3, 0, STR_PAD_LEFT);

Écrit par : Gnidhal 21 Mar 2007, 15:34

Je pense qu'il y a plus simple :

CODE
      $amount = sprintf("%03d", round($amount,2) * $this->_getCurrencyUnit($currency));

ça devrait effectuer l'arrondi sur deux décimales du montant à transmettre à la banque qui jusque là se trouvait juste tronqué avant conversion en centimes :

123.2151 se trouve converti en 12321 par la ligne du module Atos alors qu'osC calcule 123.22 par arrondi dans la facture.
Avec cette petite modif le montant transmis sera 12322. (soit l'équivalent de la facture)

C'est, il me semble, plus propre dans le code de la contrib Atos.

Écrit par : broquerea 3 Oct 2007, 09:09

Bonjour,

J'ai un souci de montant inférieur de 0,01 € par rapport au prix réel de la commande.
Concernant atos.php (html/boutique/includes/modules/payment) : j’ai modifié selon le topic du forum d’OsCommerce ci-dessus la ligne suivante :

l.526 :

$amount = sprintf("%03d", $amount * $this->_getCurrencyUnit($currency));

Remplacé par :
$amount = sprintf("%03d", round($amount,2) * $this->_getCurrencyUnit($currency));

Mais je viens d'avoir à nouveau un écart sur une commande de 145,69 € au lieu de 145,70...
J'hésite à mettre ce code en production sur le site :
$amount = str_pad (round($amount * $this->_getCurrencyUnit($currency), 0), 3, 0, STR_PAD_LEFT);

Quelqu'un peut-il m'aider s'il vous plaît ?
Elsa Hermantier
Pôle Internet
04 68 41 98 77

Écrit par : demoalt 28 Jul 2008, 18:57

Aucun des patchs ne semblent fonctionner ici. Je viens de trouver la solution (logique en plus).

Oscommerce fait ses arrondis avec la fonction tep_round qui est différente de la fonction round, de ce fait les arrondis sont complètement différents.
Le problème se pose à partir de la 3eme décimale qui affecte l'arrondi sur la 2eme décimale.

Le bon code est:

$amount = tep_round($amount,2)*$this->_getCurrencyUnit($currency);

Dites en moi des nouvelles

Écrit par : dero 28 Jul 2008, 21:45

J'ai trouvé la solution sur le forum mais je ne sais plus ou

Ce qui est certain c'est que mon probleme de difference de centime est réglé depuis cette modif

Dans le Module ATOS
Remplacer

Citation
$amount = sprintf("%03d", $amount * $this->_getCurrencyUnit($currency));

Par ceci
Citation
$amount = (int)(round($amount,2) * $this->_getCurrencyUnit($currency));


Et Voila

Écrit par : demoalt 29 Jul 2008, 11:01

après un comparatif, les patchs

de gnidall, dero et la mienne fonctionnent. les autres ne donnent pas les bonnes valeurs.

Écrit par : LaMachine 2 Feb 2012, 12:21

Je ressors les vieux messages pour signaler que le problème est de nouveau présent sur ma boutique, il y a parfois 1 centime de différence (en faveur du client) sur certaines commandes.
Il y a longtemps j'avais ce code :

Citation
$amount = sprintf("%03d", $amount * $this->_getCurrencyUnit($currency));


Que j'avais remplacé par celui-ci :
Citation
$amount = sprintf("%03d", round($amount,2) * $this->_getCurrencyUnit($currency));


Et ça marchait correctement.
Mais depuis un certain temps j'ai de nouveau cet écart de 1 centime entre la commande et le payement du client reçu en banque (sur certaines commandes, pas toutes).

Je viens d'essayer les 2 autres codes notés dans ce post :

Citation
$amount = tep_round($amount,2)*$this->_getCurrencyUnit($currency);

Citation
$amount = (int)(round($amount,2) * $this->_getCurrencyUnit($currency));

Et ça ne marche pas mieux. sad.gif
Vous n'auriez pas pas vous aussi constaté ce problème de nouveau ? Et trouvé une solution ?

Écrit par : planetaire 17 Feb 2012, 16:49

J'ai également ce problème d'arrondi avec un module ATOS 2.8

Voici la ligne en question sur cette version :

Code
$amount = sprintf('%03d', (int)(round($amount,2) * $this->_getCurrencyUnit($currency)));

Cela semble pourtant correct.

Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)