osCommerce France : Accueil Forum Portail osCommerce France Réponses aux questions Foire aux contributions

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> [RESOLU] ATOS et problèmes d'arrondis, Erreur de 1 centime
wilbil
posté 22 Jan 2006, 12:09
Message #1


Ceinture blanche OSC
Icône de groupe

Groupe : Membres
Messages : 8
Inscrit : 12-January 06
Membre no 8538



Bonjour à tous,

Je suis en train d'intégrer ATOS (Mercanet) pour ma future boutique en ligne.
J'ai un caddie composé des articles suivants :

- Produit 1 : 9,90 €
- Frais de ports : 5,00 €

Je passe chez mercanet et là surprise !

Montant de la transaction 14,89 €

ARGLLLL ?!

Quelqu'un à une idée ?

Wilfrid
Go to the top of the page
 
wilbil
posté 22 Jan 2006, 14:28
Message #2


Ceinture blanche OSC
Icône de groupe

Groupe : Membres
Messages : 8
Inscrit : 12-January 06
Membre no 8538



Je vais donc me répondre à moi même !

Le problème se situe dans atos.php
Fonction Makerequest()

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

si je modifie par

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

Je retrouve bien mon centime...

Si quelqu'un a déjà eu ce problème... je suis preneur !
Car évidemment pour certains montant cela ne fonctionne pas !

Wilfrid
Go to the top of the page
 
wilbil
posté 22 Jan 2006, 14:54
Message #3


Ceinture blanche OSC
Icône de groupe

Groupe : Membres
Messages : 8
Inscrit : 12-January 06
Membre no 8538



La suite qui tue !

Si j'ajoute 1 centime dans la fonction appelante :

function confirmation() {
global $_POST, $_SERVER, $order, $currency;

$sips = $this->makeRequest($order->info['total']+0.01, $currency);

J'obtiens sur le site de ATOS un montant de

14.81 €...


Ce qui tue encore plus c'est que :

$order->info[total] = 14.8
et que
$this->_getCurrencyUnit($currency) = 100

comprends plus rien !!!!
Go to the top of the page
 
wilbil
posté 22 Jan 2006, 15:01
Message #4


Ceinture blanche OSC
Icône de groupe

Groupe : Membres
Messages : 8
Inscrit : 12-January 06
Membre no 8538



Résolu en partie mais demande d'explication par des "experts du PHP"

J'ai remplacé :

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

par

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

le sprintf foutait la grouille...

Wilfrid
Go to the top of the page
 
demoalt
posté 30 Aug 2006, 19:23
Message #5


Ceinture jaune+ OSC
Icône de groupe

Groupe : Membres
Messages : 131
Inscrit : 10-April 05
Membre no 5450



j'ai le meme bug...
fais la correction ...
bizarre ca doit venir de la configuration du serveur!
Go to the top of the page
 
Wombat
posté 11 Nov 2006, 20:41
Message #6


Ceinture jaune OSC
Icône de groupe

Groupe : Membres
Messages : 52
Inscrit : 28-May 06
Lieu : Valence
Membre no 10555



Salut à tous, je suis bien content d'avoir trouvé un sujet sur ce pb qui me titille depuis un bout de temps.

Donc je viens de supprimer le sprintf ... mais du coup ca bug. Je me retrouve avec le message suivant sur la page checkout_confirmation.php:

CITATION
Une erreur inattendue est arrivée au cours de la demande.
Veuillez choisir un autre moyen de paiement.
: /home/www/quatrues/www/catalog/atos/request 'pathfile=/home/www/quatrues/www/catalog/atos/pathfile.parmcom.cyberplus' merchant_id=048991624700013 amount=5235.54 currency_code=978 language=fr 'normal_return_url=http://www.quatrues.com/catalog/atos_response.php?osCsid=ad2831f75bf4cf29fe1810ecb01642a2' 'cancel_return_url=http://www.quatrues.com/catalog/atos_response.php?osCsid=ad2831f75bf4cf29fe1810ecb01642a2' 'automatic_response_url=http://www.quatrues.com/catalog/checkout_process.php?osCsid=ad2831f75bf4cf29fe1810ecb01642a2' customer_id=2 customer_ip_address=84.98.98.73


Avez vous-une idée de l'erreur ? Je trouve bizarre que seul ma petite modif foute le bazar de la sorte!

Ou peut-etre ai-je oublié une étape !

Edit: je viens de m'apercevoir que je n'ai ce problème que lorsque le prix comporte des centimes, en effet pour 120,00€ l'erreur n'est pas apparue !
Donc comment mettre en forme $amount sans avoir ce probleme de centime !

Ce message a été modifié par Wombat - 11 Nov 2006, 23:01.
Go to the top of the page
 
Wombat
posté 11 Nov 2006, 23:20
Message #7


Ceinture jaune OSC
Icône de groupe

Groupe : Membres
Messages : 52
Inscrit : 28-May 06
Lieu : Valence
Membre no 10555



Bon j'ai "résolu" mon problème en bidouillant les arrondis:

CITATION
$amount= $amount * 100;
$amount = ceil($amount);
$amount= $amount / 100;
$amount = sprintf("%3d", $amount * $this->_getCurrencyUnit($currency));


J'ai regardé pour plusieures commandes différentes et ca semble fonctionner. atos doit arrondir au centime inférieur qq part. Enfin bref je suis pas au clair sur le problème mais bon tant que ca fonctionne ^^.
Go to the top of the page
 
demoalt
posté 22 Nov 2006, 16:50
Message #8


Ceinture jaune+ OSC
Icône de groupe

Groupe : Membres
Messages : 131
Inscrit : 10-April 05
Membre no 5450



je vais essayer cela au plus vite... car en supprimant de mon coté le sprintf ... j'ai eu ce genre d'erreur:
CITATION

SIPScode : -1
error : Error parameter (amount=2519.1799866221) too long
message :
Go to the top of the page
 
demoalt
posté 22 Nov 2006, 17:07
Message #9


Ceinture jaune+ OSC
Icône de groupe

Groupe : Membres
Messages : 131
Inscrit : 10-April 05
Membre no 5450



la solution de wombat semblait marcher à merveille wink.gif

mais c'est le sprintf qui foire tout!
donc du coup ma solution pour éviter mon espèce de "too long"....

CITATION

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

cela assure que la valeur envoyée a ATOS a maximum 2 décimales qui le convertit...
et ca marche avec la valeur bizarre qui a été utilisée!


Ce message a été modifié par demoalt - 23 Nov 2006, 00:33.
Go to the top of the page
 
bpe33
posté 25 Nov 2006, 17:23
Message #10


Ceinture blanche+ OSC
Icône de groupe

Groupe : Membres
Messages : 21
Inscrit : 3-March 05
Membre no 4994



CITATION(demoalt @ 22 Nov 2006, 11:07) [snapback]207105[/snapback]

la solution de wombat semblait marcher à merveille wink.gif

mais c'est le sprintf qui foire tout!
donc du coup ma solution pour éviter mon espèce de "too long"....

CITATION

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

cela assure que la valeur envoyée a ATOS a maximum 2 décimales qui le convertit...
et ca marche avec la valeur bizarre qui a été utilisée!



et bien moi aussi je le voyais ce centime d'euro perdu ! de temps en temps

je viens de mettre

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


donc je vais voir, en tout cas pas de bug pour l'instant


-------

EDIT : avec la solution 1, ca m'a fait 3/4 fois des retour d'erreur d'ATOS, message "amount (13179.71) not numeric"

je testerai plus tard la version 2 $amount = (int)(round($amount,2) * $this->_getCurrencyUnit($currency));

quand j'aurais resolu deja mes soucis recents de retour reponse ATOS grrrr sad.gif



Ce message a été modifié par bpe33 - 28 Nov 2006, 20:41.


--------------------
oscom MS2 + FR + contrib sur mutualisé 90plan
Go to the top of the page
 
demoalt
posté 30 Nov 2006, 16:46
Message #11


Ceinture jaune+ OSC
Icône de groupe

Groupe : Membres
Messages : 131
Inscrit : 10-April 05
Membre no 5450



CITATION(demoalt @ 22 Nov 2006, 11:07) [snapback]207105[/snapback]

la solution de wombat semblait marcher à merveille wink.gif

mais c'est le sprintf qui foire tout!
donc du coup ma solution pour éviter mon espèce de "too long"....

CITATION

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

cela assure que la valeur envoyée a ATOS a maximum 2 décimales qui le convertit...
et ca marche avec la valeur bizarre qui a été utilisée!


ca ne semble pas marcher de mon côté, du coup, j'ai réesayé
avec le code suivant et cela semble marcher!

CITATION

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


Go to the top of the page
 
Wombat
posté 2 Dec 2006, 17:41
Message #12


Ceinture jaune OSC
Icône de groupe

Groupe : Membres
Messages : 52
Inscrit : 28-May 06
Lieu : Valence
Membre no 10555



on viens de me dire que l'erreur s'est reproduite chez moi mais dans l'autre sens (1 centime de plus au niveau du paiement par rapport au prix réel)

Je vais essayer avec

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


Je vous dis si ca fonctionne.
Go to the top of the page
 
lateralus
posté 19 Dec 2006, 12:14
Message #13


Ceinture jaune+ OSC
Icône de groupe

Groupe : Membres
Messages : 80
Inscrit : 20-July 05
Lieu : Scionzier (74)
Membre no 6571



Yes, super les gars, ça maaaaaaaaaaaarche wink.gif

Voici la formule magique : (includes/modules/payment/atos.php) (ligne 526)
Remplacer la ligne :
CODE
$amount = sprintf("%03d", $amount * $this->_getCurrencyUnit($currency));

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

Par contre, celle-ci ne marche pas chez moi :
$amount = (int)round($amount * $this->_getCurrencyUnit($currency),2);

PS : encore merci à ceux qui ont trouvé la solution....je vous tire ma casquette, z'êtes trop fort wink.gif

Ce message a été modifié par lateralus - 19 Dec 2006, 12:17.


--------------------
Affichage sstotal HT, Bookmark, Browse by Categories 2.5, Category box enhancement, Contact us choice 1.0.1, Featured products 1.5.5.1, MultiGeoZone MultiTable Shipping 1.101, Os Active Desktop 2.3, Paymenttypes 1.2, Phpmyvisites 2.1, Session counter, Skype Contact 1.0, Stats products per month 1, Store Pick Up Version 1.4, Updated spiders.txt, Who's Online Enhancement 2.00, BackButtons, Google Analytics, stats_sales_csv_1.2, google_position_1.3, Customers List Improved 1.4, boxe defilante, add_button_back, xsell_v2.2_1, product_sort_v1.6, Description in Product Listing 2.5
Go to the top of the page
 
petitbiston
posté 22 Dec 2006, 15:09
Message #14


Ceinture jaune+ OSC
Icône de groupe

Groupe : Membres
Messages : 153
Inscrit : 25-November 05
Lieu : Côte Atlantique
Membre no 7990



J'ai egalement eu cette expérience étrange d'avoir un x,89 au lieu d'un x.90

Edit : Modif effectuée, commande passée sur le meme produit en question, toujours 0.01 centimes en moins.

Ce message a été modifié par petitbiston - 3 Jan 2007, 13:00.


--------------------
* * * * Take Care * * * *
Go to the top of the page
 
sylab
posté 10 Jan 2007, 18:19
Message #15


Ceinture blanche OSC
Icône de groupe

Groupe : Membres
Messages : 1
Inscrit : 10-January 07
Membre no 14514



Bonjoiur a tous,

j'ai le même probleme avec atos (mon code est en asp au lieu du php);

pouvez vous m'aider a convertir cette ligne du code cité par laterlaus (convertir du PHP en ASP)


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


en asp ça donnera quoi exactement ??

D'avance merci a tous, car chez atos pas moyen d'avoir de l'aide !!!!!!!!!

Merci a vous
Go to the top of the page
 
Cactus
posté 20 Mar 2007, 17:12
Message #16


Ceinture orange OSC
Icône de groupe

Groupe : Membres
Messages : 202
Inscrit : 20-April 04
Lieu : pau
Membre no 2319



solution qui fonctionne :

//avant: $amount = 266.71996
//on réduit à 2 chiffre derrière la virgule et on arrondit au plus proche.

$amount = round($amount,2);
//après: $amount = 266.72

//Il faut laisser le sprintf qui joue ici le rôle de spécificateur de type (entier sans espace)
//_getCurrencyUnit($currency) renvoie la valeur de l'unité de la monnaie, en l'occurance 100 pour l'EURO
//Si vous laissiez faire cette multiplication sans arrondir vous auriez eu $amount = 266.71996 * 100, ce qui explique bien le cts en moins ou en plus à ce niveau !

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

//après: $amount = 26672 (un entier sans espace)




--------------------
la boutique des sous-vêtement pour homme
b2b osc largement modifiée, depuis 8 ans déjà !!!
Go to the top of the page
 
patv
posté 10 May 2007, 21:59
Message #17


Ceinture blanche OSC
Icône de groupe

Groupe : Membres
Messages : 17
Inscrit : 8-May 06
Membre no 10289



Bonjour,

Je viens de découvrir que j'avais ce problème d'arrondi avec Atos.

J'ai essayé la proposition faite par Cactus, mais cela n'a rien changé.

La solution qui pour moi fonctionne est la suivante :

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

Bonne journée !


--------------------
OSC: Creload6 SP1.4
Solution Bancaire: E-Transactions
Kit ATOS: ATOS-SIPS v5 pour Linux
OS: Linux
Server: Apache (hébergement mutualisé OVH 90Plan)
Contributions: StorePickUp, PDFInvoice, Distingo
Go to the top of the page
 
dreamy
posté 11 Jun 2007, 13:50
Message #18


Ceinture blanche+ OSC
Icône de groupe

Groupe : Membres
Messages : 25
Inscrit : 16-August 04
Lieu : Seine et marne
Membre no 3059



Merci pour l'astuce smile.gif

La manip de lateralus fonctionne très bien chez moi avec la V6 d'ATOS.

Ce message a été modifié par dreamy - 11 Jun 2007, 13:50.
Go to the top of the page
 
la loutre
posté 18 Jun 2007, 09:04
Message #19


Ceinture jaune+ OSC
Icône de groupe

Groupe : Membres
Messages : 159
Inscrit : 18-October 05
Lieu : saone et loire
Membre no 7507



après avoir essayé toutes les solutions, celle de Cactus a l'air de fonctionner...à suivre unsure.gif

Bon ben non, ça ne marche pas non plus... wacko.gif
Est-ce que certains auraient trouvé la solution qui fonctionne ? ça vient bien d'atos mais pas moyen de trouver comment faire pour règler définitivement ce problème de centimes...

Ce message a été modifié par la loutre - 18 Jun 2007, 12:58.


--------------------
ms2 - php5- featured product - define MainPage - column product listing - More pics6 - Xsell product - duplication boxe category - Personal invoice number- welcome email username & password - Product_description v1.5 - Order Editor v2.6.1 - ultimate seo - headerTag - sitemap - googlesite xml feed - Admin Access Level Account
Go to the top of the page
 
milerwan
posté 28 Mar 2017, 13:36
Message #20


Ceinture orange OSC
Icône de groupe

Groupe : Membres
Messages : 188
Inscrit : 18-October 06
Membre no 12709



Citation (patv @ 10 May 2007, 22:59) *
Bonjour,

Je viens de découvrir que j'avais ce problème d'arrondi avec Atos.

J'ai essayé la proposition faite par Cactus, mais cela n'a rien changé.

La solution qui pour moi fonctionne est la suivante :

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


Bonne journée !

Après plusieurs essais pour dénicher l’arrondi récalcitrant, j’ai trouvé un 75.80 qui donne 75.79.
L’arrondi offert par ce code n’est donc pas satisfaisant.
Seule la fonction tep_round permet d’obtenir à coup sûr l’arrondi correct car c’est cette fonction qu’utilise oscommerce pour calculer les montants arrondis (en faisant l’essai avec round() l’arrondi n’est pas bon).

Etant donné que ma valeur de devise est de 1.00000000, je n’ai jamais eu de problème mais, dans l’absolu et pour bien faire, il faut ajouter une deuxième ligne pour appliquer l’arrondi sur le résultat de la multiplication montant/devise pour peu que la devise contienne des décimales :

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


Tout est bon de mon côté.

Ce message a été modifié par milerwan - 14 Apr 2017, 12:34.


--------------------
osCommerce v2.3.4 BS
Go to the top of the page
 

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



RSS Version bas débit Nous sommes le : 18th November 2017 - 22:42
Ce site est déclaré auprès de la commision Nationale
de l'Informatique et des Libertés (déclaration n°: 1043896)