[RESOLU] ATOS et problèmes d'arrondis, Erreur de 1 centime |
Bienvenue invité ( Connexion | Inscription )
[RESOLU] ATOS et problèmes d'arrondis, Erreur de 1 centime |
22 Jan 2006, 12:09
Message
#1
|
|
Ceinture blanche OSC 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 |
|
22 Jan 2006, 14:28
Message
#2
|
|
Ceinture blanche OSC 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 |
|
22 Jan 2006, 14:54
Message
#3
|
|
Ceinture blanche OSC 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 !!!! |
|
22 Jan 2006, 15:01
Message
#4
|
|
Ceinture blanche OSC 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 |
|
30 Aug 2006, 19:23
Message
#5
|
|
Ceinture jaune+ OSC Groupe : Membres Messages : 133 Inscrit : 10-April 05 Membre no 5450 |
j'ai le meme bug...
fais la correction ... bizarre ca doit venir de la configuration du serveur! |
|
11 Nov 2006, 20:41
Message
#6
|
|
Ceinture jaune OSC 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. |
|
11 Nov 2006, 23:20
Message
#7
|
|
Ceinture jaune OSC 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 ^^. |
|
22 Nov 2006, 16:50
Message
#8
|
|
Ceinture jaune+ OSC Groupe : Membres Messages : 133 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 : |
|
22 Nov 2006, 17:07
Message
#9
|
|
Ceinture jaune+ OSC Groupe : Membres Messages : 133 Inscrit : 10-April 05 Membre no 5450 |
la solution de wombat semblait marcher à merveille
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. |
|
25 Nov 2006, 17:23
Message
#10
|
|
Ceinture blanche+ OSC 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 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 Ce message a été modifié par bpe33 - 28 Nov 2006, 20:41. -------------------- oscom MS2 + FR + contrib sur mutualisé 90plan
|
|
30 Nov 2006, 16:46
Message
#11
|
|
Ceinture jaune+ OSC Groupe : Membres Messages : 133 Inscrit : 10-April 05 Membre no 5450 |
CITATION(demoalt @ 22 Nov 2006, 11:07) [snapback]207105[/snapback] la solution de wombat semblait marcher à merveille 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); |
|
2 Dec 2006, 17:41
Message
#12
|
|
Ceinture jaune OSC 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. |
|
19 Dec 2006, 12:14
Message
#13
|
|
Ceinture jaune+ OSC Groupe : Membres Messages : 80 Inscrit : 20-July 05 Lieu : Scionzier (74) Membre no 6571 |
Yes, super les gars, ça maaaaaaaaaaaarche
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 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
|
|
22 Dec 2006, 15:09
Message
#14
|
|
Ceinture jaune+ OSC 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 * * * *
|
|
10 Jan 2007, 18:19
Message
#15
|
|
Ceinture blanche OSC 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 |
|
20 Mar 2007, 17:12
Message
#16
|
|
Ceinture orange OSC 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à !!! |
|
10 May 2007, 21:59
Message
#17
|
|
Ceinture blanche OSC 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 |
|
11 Jun 2007, 13:50
Message
#18
|
|
Ceinture blanche+ OSC Groupe : Membres Messages : 25 Inscrit : 16-August 04 Lieu : Seine et marne Membre no 3059 |
Merci pour l'astuce
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. |
|
18 Jun 2007, 09:04
Message
#19
|
|
Ceinture jaune+ OSC 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
Bon ben non, ça ne marche pas non plus... 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
|
|
28 Mar 2017, 13:36
Message
#20
|
|
Ceinture orange OSC Groupe : Membres Messages : 191 Inscrit : 18-October 06 Membre no 12709 |
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
|
|
Version bas débit | Nous sommes le : 16th April 2024 - 06:16 |
Ce site est déclaré auprès de la commision Nationale de l'Informatique et des Libertés (déclaration n°: 1043896) |