Drupal Commerce 2.x - Adjustments: L'ajustement de prix

Soumis par GoZ le lun 04/12/2017 - 13:21

Drupal Commerce 2.x - Adjustments: L'ajustement de prix

Avec Drupal Commerce 2.x arrive une nouvelle notion: les Adjustments.

Qu'est ce que l'adjustment ?

L'adjustment, ou ajustement en français, permet de modifier le montant d'une ligne de commande ou d'une commande, que ce soit en le diminuant ou en l'augmentant.

Deux exemples d'ajustements tarifaire intégrés au fonctionnement du core:

* La taxe (TVA): La taxe augmentera le montant de la ligne de commande suivant le taux de TVA applicable au produit.
* Une promotion: Le montant de la ligne de commande ou de la commande diminuera de la promotion souhaitée.

Comment est appliqué un ajustement tarifaire ?
Chaque module gère la façon dont il va ajouter son ajustement à la commande.

* Pour la taxe par exemple, celle-ci sera ajoutée lors de l'application d'un plugin de type taxe ou lors de l'appel au transformateur de la commande (order_processor). La notion de transformateur fera l'objet d'un autre billet.
* Pour la promotion en revanche, celle-ci ne sera ajoutée que lors de l'application d'un plugin de type promotion, soit lors du rafraîchissement d'une commande ou lors de l'affichage d'un montant calculé.

$order->addAdjustment(new Adjustment([
'type' => 'promotion',
'label' => t('Discount'),
'amount' => $adjustment_amount->multiply('-1'),
'source_id' => $promotion->id(),
]));

Selon les besoins de votre métier, libre alors de l'appliquer également via les transformateurs ou via d'autres moyens.

Quand un ajustement tarifaire est-il visible ?
Lors de la majorité des traitements de notre commande, les ajustements ne sont pas prix en compte. Par exemple lors de l'appel au [résolveur (resolver) de prix](/drupal-commerce-2x-rendre-un-prix-dynamique-ou-calcule-un-service-tiers), seul le prix unitaire est pris en compte. L'ajustement s'appliquera par la suite.

Dans le cas de la promotion, tant que les transformateurs de la commande ne sont pas appelés, les ajustements ne sont pas visibles. Et même alors, elle ne modifie que le montant total de la ligne de commande ou de la commande à laquelle elle est rattachée.

De ce fait, pour continuer sur nos 2 cas promotions / tax, le montant ajusté ne sera visible qu'après avoir exécuté les transformateurs soit :

* Après un rafraîchissement de la commande.
* Lors de l'affichage d'un montant calculé.

Quand utiliser un ajustement ?

C'est toujours une histoire purement métier.
La première chose à se rappeler concernant les prix, c'est que le [price resolver](/drupal-commerce-2x-rendre-un-prix-dynamique-ou-calcule-un-service-tiers) permet de définir le prix unitaire.
On souhaite ensuite rajouter un coup supplémentaire lié à ce tarif.

* Si ce que l'on souhaite ajouter (frais supplémentaire ou dégressif) est lié au montant total, on a tout intérêt à passer par un ajustement. Le calcul sera automatiquement fait lorsque l'on aura besoin d'afficher le montant total ou lors d'une mise à jour de la commande.
* Si ce que l'on souhaite ajouter est lié au montant et quantité d'un produit, soit d'une ligne de commande et qu'il ne s'agit que de frais informatif, on peut alors utiliser un ajustement. Dans le cas où il s'agit d'ajustement avec complément physique (par exemple un conditionnement de livraison spécifique: palette, carton rembourré etc), il peut être plus avantageux de passer par un type de ligne de commande spécifique et un produit spécifique aillant ses propres spécificités. En bref, s'il n'y a qu'un montant, l'ajustement fera l'affaire. S'il faut pouvoir faire d'avantage, partir sur une autre solution sera certainement une meilleure idée.

Un exemple d'ajustement personnalisé que l'on pourrait ajouter: nous souhaitons vendre des produits et y ajouter des frais de traitement, ou dans le cas de réservation (pré-réservation, réservation etc), des frais de réservations. Dans ce cas, il est simple d'ajouter notre propre transformateur qui ajoutera notre ajustement de frais de traitement/réservation à notre commande.

$order->addAdjustment(new Adjustment([
'type' => 'booking_fees',
'label' => 'Booking fees',
'amount' => new Price("$booking_fees", $order->getStore()->getDefaultCurrencyCode()),
]));

Il faudra également au préalable déclarer notre plugin de type d'ajustement en créant un fichier dans son module `MON_MODULE.commerce_adjustment_types.yml`:

booking_fees:
label: Booking fees
has_ui: true
weight: 0

Peut-on utiliser les ajustements sur autre chose qu'une commande et qu'une ligne de commande ?

Par défaut, non, seuls les entités implémentant `OrderInterface` et `OrderItemInterface` permettent d'utiliser les ajustements car elles seules implémentent l'interface `EntityAdjustableInterface`.

Cependant, libre à vous d'intégrer cette fonctionnalité à vos développements en ajoutant l'implémentation de l'interface `EntityAdjustableInterface` aux entités sur lesquelles vous souhaitez pouvoir utiliser les ajustements et rajouter le code métier qui permettra d'ajouter la logique de traitement de ces ajustements.