Publié le

Afficher les prix hors taxe dans les vues d'administration de Drupal Commerce

Pour faciliter la gestion courante d'une boutique E-Commerce, il peut être utile d'afficher directement les prix hors taxe (HT) dans les vues d'administration, notamment pour faciliter les calculs de comptabilité au jour le jour.

Par défaut, Drupal Commerce affiche dans ses vues les prix TTC (toutes taxes comprises) et ne propose pas d'option permettant d'afficher le prix HT uniquement.

Cet article propose une solution basée sur le développement d'un formatter personnalisé permettant de modifier la façon dont sont affichés les prix dans les vues, et donc de les afficher hors taxe.

Logique du module

Le module repose sur un formatter Drupal personnalisé pour les champs de type commerce_price qui transforme l'affichage des prix en calculant le montant hors taxe à partir du prix TTC et du taux de TVA à appliquer.

Il se base sur les adjustements, des données attachés aux orders items permettant de leur appliquer des taxes, des frais divers, des promotions, etc.

Création d'un formatter personnalisé

Pour créer un formatter Drupal personnalisé, le plus simple est d'utiliser le générateur fourni par Drush avec la commande drush generate field-formatter.

Celui-ci va alors vous guider en vous posant les questions nécessaires à la génération des fichiers de votre module de formatter sans avoir à écrire une seule ligne de code.

Une fois celui-ci créé, vous pouvez éditer le fichier présent dans src/Plugin/Field/FieldFormatter et commencer son développement.


Dans notre cas, j'ai généré via Drush un formatter nommé ExcludingVatPriceFormatter.php.

Pour que celui-ci soit applicable aux champs de type commerce_price, il suffit de déclarer son type dans l'annotation de notre classe comme ceci :

/**
 * Plugin implementation of the 'Excluding VAT Price Formatter' formatter.
 *
 * @FieldFormatter(
 *   id = "excluding_vat_price_formatter",
 *   label = @Translation("Excluding VAT Price Formatter"),
 *   field_types = {"commerce_price"},
 * )
 */

Nous bouclons ensuite sur les items à formater pour récupérer le taux de TVA à appliquer (le taux maximal est utilisé si plusieurs taux sont déclarés, à ajuster selon vos besoins).

Une fois ce taux obtenu, nous pouvons nous en servir pour calculer le prix hors taxe, formater ce prix avec le service commerce_price.currency_formatter de Drupal Commerce, retourner cet élément et le tour est joué.

Voici l'intégralité du code de mon formatter :

<?php

declare(strict_types=1);

namespace Drupal\excluding_vat_price_formatter\Plugin\Field\FieldFormatter;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\commerce_price\Plugin\Field\FieldFormatter\PriceDefaultFormatter;

/**
 * Plugin implementation of the 'Excluding VAT Price Formatter' formatter.
 *
 * @FieldFormatter(
 *   id = "excluding_vat_price_formatter",
 *   label = @Translation("Excluding VAT Price Formatter"),
 *   field_types = {"commerce_price"},
 * )
 */
final class ExcludingVatPriceFormatter extends PriceDefaultFormatter {

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
    $elements = [];

    foreach ($items as $delta => $item) {
      $price = $item->toPrice();
      $order_item = $item->getEntity();
      $final_vat_factor = 1;

      if ($order_item && $order_item->hasField('adjustments')) {
        // Use collectAdjustments when available (order summary page)
        if (method_exists($order_item, 'collectAdjustments')) {
          $adjustments = $order_item->collectAdjustments();
        } else {
          $adjustments = $order_item->getAdjustments();
        }

        $vat_factors = [];

        foreach ($adjustments as $adjustment) {
          if ($adjustment->getType() === 'tax') {
            $vat_factors[] = 1 + $adjustment->getPercentage();
          }
        }

        if (!empty($vat_factors)) {
          // Use the highest VAT factor if multiple are present.
          $final_vat_factor = max($vat_factors);
        }
      }

      // Calculate the price excluding VAT.
      $price_excluding_vat = $price->divide((string) $final_vat_factor);

      // Format the price.
      $currency_formatter = \Drupal::service('commerce_price.currency_formatter');
      $formatted_price = $currency_formatter->format(
        $price_excluding_vat->getNumber(),
        $price_excluding_vat->getCurrencyCode()
      );

      $elements[$delta] = ['#markup' => $formatted_price];
    }

    return $elements;
  }

}

Utilisation du formatter personnalisé

Une fois votre formatter terminé, n'oubliez pas d'activer le module que vous venez de créer à partir de l'onglet Extension de votre installation de Drupal ou directement avec Drush via la commande drush en excluding_vat_price_formatter (ou le nom système de votre propre module).

Vous pouvez alors administrer vos Vues via Structure > Vues, puis modifier les paramètres des champs Prix des vues d'administration pour utiliser votre formatter personnalisé et afficher les prix en hors taxes. N'oubliez pas de modifier également le label de vos champ en Prix unitaire (HT) par exemple pour clarifier que les prix sont bel et bien affichés HT et non TTC.