Un filtre pour calculer la TVA et formater son affichage

Ce petit filtre a été écrit pour transformer un champ numérique contenant un prix hors taxes, en un champ contenant les prix hors taxes et TTC, bien formatés, avec les séparateurs de milliers et le signe €...

A ajouter dans mes_fonctions :

@define('tvaNormale', 1.196);
@define('tvaReduite', 1.055);

function ttc($ht, $taux='tvaNormale') {
        setlocale(LC_MONETARY, 'fr_FR');
        $taux = constant($taux);
        $ttc = $ht * $taux;
        $ttc = money_format('%i', $ttc);
        $ht  = money_format('%i', $ht);
        $tva = $ht . " HT" . " (" . $ttc . " TTC)";
        $tva = ereg_replace("EUR", "€", $tva);
        return $tva;
}

Utilisation

Dans un champ d’un article SPIP, par exemple #PS, on peut stocker un nombre qui correspond à un prix hors taxes. Ensuite, si on veut l’afficher avec le format défini par le filtre « ttc » il suffit d’appeler la balise #PS avec le filtre : [(#PS|ttc)].

Par défaut ce filtre utilise un taux de TVA à 19,6%, mais grâce à l’astuce de Patrice, il peut accepter le taux de TVA réduite à 5,5%. Pour cela, il suffit d’appeler la balise comme ceci : [(#PRIX_HT|ttc{tvaReduite})].

Explications

-  la 1re ligne modifie la manière dont le serveur va afficher les données au format monétaire (voir lien)
-  la 3e ligne calcule le montant TTC avec une TVA à 19,6% (par défaut) ou le taux envoyé en paramètre avec le filte.
-  les 4e et 5e lignes appliquent le format aux montants HT et TTC (voir lien)
-  la 6e ligne génère la chaine qui sera affichée (ici « 999,00 € HT (1234.56 € TTC) »
-  la 7e ligne s’assure que c’est bien le signe « € » qui s’affiche et non pas le code ISO « EUR » (c’est moins joli...).

un exemple en ligne : sur une fiche « formation » du catalogue des formations FinHarmony, en bas, dans la partie « prix ».

Discussion

3 discussions

  • Coucou,
    Super utile cette petite fonction.
    Pour moi, il y avait un bug dès qu’on passait au delà de 999 €. J’ai lu que money_format n’est pas définie pour Windows (http://php.net/manual/fr/function.money-format.php).
    J’ai dû remplacer mon code par :

    function ttc($ht, $taux='tvaNormale') {
            $taux = constant($taux);
                    $ht = number_format($ht, 2, '.', '');
            $ttc = $ht * $taux;
                    $ttc = number_format($ttc, 2, '.', '');
            $tva = $ttc;
            return $tva;
    }

    Plusieurs variantes ici.

    Répondre à ce message

  • 1

    Et hop

    $prix = money_format('%!n €', $prix); // 1 234,57 €

    • Bonjour,

      Merci, mais comment ne pas afficher les décimales ==> 1 234€ ?

      Je sèche lamentablement

    Répondre à ce message

  • 3

    On pourrait agrémenter ce filtre pour que la tva à 5.5% puisse également être appelée...

    peut-être comme ceci (non testé) :

    @define('tva1', 1.196);
    @define('tva2', 1.055);
    
    function ttc($ht, $taux='tva1') {
            setlocale(LC_MONETARY, 'fr_FR');
            $taux = constant($taux);
            $ttc = $ht * $taux;
            $ttc = money_format('%i', $ttc);
            $ht  = money_format('%i', $ht);
            $tva = $ht . " HT" . " (" . $ttc . " TTC)";
            $tva = ereg_replace("EUR", "€", $tva);
            return $tva;
    }

    Utilisation : [(#PS|ttc)] ou [(#PS|ttc{tva2})]

    • un spipeur

      Salut Pat, une petite question :
      Au fait pourquoi le @ ?
      Je le vois parfois, mais j’aimerais comprendre à quoi cela sert ?

    • Le @ sert à éviter les erreurs ou les warnings (cf : http://fr3.php.net/manual/fr/langua...).

      La fonction define() ne peut être appelée qu’une seule fois. Cette syntaxe permet donc aux utilisateurs qui le souhaitent, de définir (à l’avance) dans leurs squelettes leurs propres constantes (avec leurs propres taux de tva), sans toucher aux sources de ce filtre. Mais j’avoue que c’est un cas d’école ici.

    • Salut Patrice,

      Tes améliorations ont été testées avec succès, ça marche super bien !

      Du coup je les intègre au filtre, comme ça, ça profitera à tout le monde.

      A+

      Cyril

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom

Dernière modification de cette page le 2 novembre 2007