Accueil Forums How to WooCommerce Arrondi des prix

Ce sujet a 7 réponses, 5 participants et a été mis à jour par  Olivier, il y a 3 mois et 1 semaine.

8 sujets de 1 à 8 (sur un total de 8)
  • Auteur
    Messages
  • #54307

    Carole H
    Participant

    Bonjour,
    Je me permets de vous écrire car je suis en train de finaliser un site et j’ai un petit problème qui me résiste pour les prix.

    Comme c’est un site Suisse, j’ai arrondi les prix au 0 ou 5 centimes.

    Ca fonctionne plutôt bien sauf pour le Sous-total.

    Aucune idée pourquoi.
    J’ai essayé plein de nom mais rien ne change.

    /* Arrondir les prix au 0 ou 5 centimes */
    add_filter( 'woocommerce_product_get_price ', 'round_price_product', 10, 1 );
    add_filter( 'woocommerce_tax_round', 'round_price_product', 10, 1);
    add_filter( 'woocommerce_calculated_total', 'round_price_product', 10, 1);
    add_filter( 'woocommerce_coupon_get_discount_amount', 'round_price_product', 10, 1);
    
    add_filter( 'woocommerce_cart_product_subtotal', 'round_price_product', 10, 1 ); // ici woocommerce_cart_product_subtotal ne fonctionne pas
    
    function round_price_product( $price ){
    return round(($price + 0.000001) * 20) / 20;
    
    }

    Je vous remercie d’avance si vous avez une piste où chercher.
    Belle journée

    #54386

    Guy
    Modérateur

    Bonjour,

    Comme c’est un site Suisse, j’ai arrondi les prix au 0 ou 5 centimes.

    Simple curiosité mais, est-ce qu’il y a une obligation légale pour du e-commerce ?
    Parce que je comprends que dans un commerce physique on ne pourra pas me rendre 3 centimes, mais pour des paiements électroniques je ne vois pas le problème.

    return round(($price + 0.000001) * 20) / 20;

    Le code c’est pas trop mon truc, mais ce calcul je le trouve bizarre. Ca pourrait avoir un sens mais alors il faudrait enlever les décimales après la multiplication. Et dans ce cas ça ne sert à rien d’ajouter des centimes.

    Je verrais plus quelque chose comme: return round($price * 20, 0) / 20;

     

    #54421

    Mathieu
    Modérateur

    le calcul d’arrondi vient de la façon dont PHP gère les nombres à virgule flottante.
    si on prend par exemple ce calcul :
    $prix = (1.045 - 1) * 100;
    $prix devrait contenir 4,5 mais en interne PHP stocke 4.4999999999999929
    donc on obtient ces résultats :

    echo round($prix); // 4 puisque l'arrondi est calculé à partir de 4,499
    echo round($prix + 0.000000001); // 5 ce qui est bien le résultat attendu

    il y a le même problème pour la comparaison :

    $prix == 4.5 // retourne FALSE
    abs($prix - 4.5) < 0.000000001 // retourne TRUE

    Développeur PHP et WordPress En Alsace dans l'annuaire des prestataires WordPress et WooCommerce
    Création d'extensions pour WordPress et WooCommerce - Personnalisation d'extensions existantes
    🔶 Si vous appréciez mon aide, vous pouvez me faire un don de n'importe quel montant en cliquant ici.

    1 Utilisateur a dit : Merci à l'auteur pour ce message.
    Guy
    #54446

    Carole H
    Participant

    Merci à vous deux pour votre réponse.

    Mon arrondi fonctionne bien, c’est juste pour le sous total dans le processus de commande et les factures PDF qui ne s’arrondit pas.

    Admettons qu’un produit soit à 22.90 + 7.7% de TVA = CHF 24.66

    Partout il me met bien CHF 24.65 sauf pour le sous total.

    Merci d’avance en tout cas pour votre temps
    Belle journée

    #54455

    Mathieu
    Modérateur

    qu’indique exactement la loi suisse au sujet de l’arrondi des totaux intermédiaires ? en France par exemple, il est interdit d’afficher des sous-totaux arrondis lors des calculs de T.V.A., seul la somme totale peut l’être.

    par exemple si vous avez 10 produits à 24,66.
    chaque sous total sera indiqué à 24,65 mais ensuite le total sera de 246,60 ou alors de 10 × 24,65 = 246,50 ?

    Développeur PHP et WordPress En Alsace dans l'annuaire des prestataires WordPress et WooCommerce
    Création d'extensions pour WordPress et WooCommerce - Personnalisation d'extensions existantes
    🔶 Si vous appréciez mon aide, vous pouvez me faire un don de n'importe quel montant en cliquant ici.

    #58012

    jf
    Participant

    Salut à tous,

    Ce n’est pas une question légale, c’est une question de monnaie. Le centimes n’existent pas dans la monnaie helvétique. La plus petite pièce est 5 centimes, puis 10 centimes, 20 centimes 50 centimes.

    La plupart des logiciels comptables suisses ne permettent pas d’enregistrer des montants de 1-2-3-4-6-7-8-9 centimes, il faut arrondir.

    Dans le cas présent, c’est le sous-total qui n’est pas arrondi.

    J’ai déjà été confronté à un cas similaire, la façon de procéder pour que cela fonctionne parfaitement et de commander à Woocommerce un plugin qui effectue les arrondis. Cela m’a coûté 200 euros et cela fonctionne parfaitement depuis, mais moi c’était pour certains frais.

    Bonne journée

     

     

     

     

     

     

     

    #59321

    Carole H
    Participant

    Bonjour,

    Avec un peu de délai, voici le code que j’ai utilisé et qui fonctionne autant pour le site que lors de la création des PDFs.

    add_filter( 'woocommerce_cart_tax_total', 'round_subtotal', 10, 3);
    add_filter( 'woocommerce_get_price_excluding_tax', 'round_price_product', 10, 1 );
    add_filter( 'woocommerce_get_price_including_tax', 'round_price_product', 10, 1 );
    add_filter( 'woocommerce_tax_round', 'round_price_product', 10, 1);
    add_filter( 'woocommerce_product_get_price', 'round_price_product', 10, 1);
    add_filter( 'woocommerce_calculated_total', 'round_price_product', 10, 1);
    add_filter( 'woocommerce_calculated_subtotal', 'round_price_product', 10, 1);
    add_filter( 'woocommerce_cart_subtotal', 'round_subtotal', 10, 3);
    
    function round_subtotal( $cart_subtotal, $compound, $instance ) {
    $origValue = $cart_subtotal;
    preg_match( '/\d+\.\d+/', $origValue, $floatValue);
    $roundedValue = number_format( round_price_product( $floatValue[0] ), 2 );
    $returnValue = str_replace( $floatValue, $roundedValue, $origValue );
    return $returnValue;
    }
    function round_price_product( $price ){
    // Return rounded price
    return round( $price * 2, 1 ) / 2;
    }
    
    

    J’espère que ca vous aidera.

    Belle journée

    1 Utilisateur a dit : Merci à l'auteur pour ce message.
    #63503

    Olivier
    Participant

    Bonjour le forum,

    Je me greffe sur ce sujet car j’utilise le code donné par Carole H. pour arrondir les prix. Cependant je suis confronté à un souci que je n’arrive pas à comprendre et fixer malgré des recherches intensives.

    En bref, tout fonctionne bien, sauf pour le “total des lignes produits” du panier qui ne s’arrondi pas. Si je ne me trompe pas sur le nom du “hook” : woocommerce_cart_item_subtotal

    En pièce jointe une image pour illustrer le souci. Le total dans le rectangle rouge N°2 est bien arrondi mais pas le total dans le N°1.

    Merci d’avance pour votre aide précieuse.

    Bonne journée,

    Olivier.

    ****************

    Woocommerce 3.4.2

    Woocommerce Bulk Discount 2.4.5 ( https://fr.wordpress.org/plugins/woocommerce-bulk-discount/ )

    WordPress 4.9.6 (PHP 7.1.8)

     

    Pièces Jointes:
8 sujets de 1 à 8 (sur un total de 8)

Vous devez être connecté pour répondre à ce sujet.