La mise en place  d’une règle de promotion Magento de type “x achetés y gratuits” est plutôt fastidieuse et pas forcément claire.
( Note : Sur la version 1.4.1.1 de Magento, il y a un problème lorsqu’on souhaite créer une règle de type 1 acheté 1 offert , nous verrons plus loin comment corriger ce comportement. )

Voici un exemple sur comment configurer une règle de ce type  sur l’exemple suivant :
Pour l’achat de 2 téléphone Nokia 2610 , un 3ème téléphone Nokia 2610 sera offert 🙂  ( Pour 4  => 2 , ect… )

Pour commencer il faut se rendre dans “Promotions / Règles de prix Panier” puis cliquer sur “Ajouter une nouvelle règle”
Voici ensuite ce que nous allons saisir dans l’onglet “Informations règle”

Magento SalesRule Informations

  1. La règle s’applique à l’ensemble des sites web
  2. La règle s’applique à l’ensemble des groupes clients
  3. Le code pour utiliser le coupon est “TEL”
  4. Pas de limites d’utilisation du coupon
  5. Pas de limites d’utilisation par client

Dans l’onglet “Conditions” nous ne mettons rien car il n’y a pas de restrictions.

L’essentiel de la configuration va se réaliser dans l’onglet “Actions”

Magento Sales Rule Condition

  1.  Dans le type de promotion Choisir ” X achetés, Y gratuits”
  2.  Le champ “Remise” correspond au Y de la promotion, il faut donc saisir le nombre de produit que l’on souhaite offrir. ( Dans notre cas 1 )
  3. Le nombre de fois que cette promotion doit s’appliquer, laisser 0 pour que la règle s’applique indéfiniment. ( Dans notre cas ” 2 achetés, 1 gratuit”  : les règles suivantes s’appliquent 2 => 1 , 4  => 2 ,  6 => 3 … )
  4. Quantité qu’il faut acheter pour obtenir la remise ( Dans notre cas 2 )
  5. Sélection du produit pour lequel la règle doit s’appliquer, on se base sur son code produit (SKU). ( Dans notre cas la référence du produit est n2610 )

Sauvegardez votre règle et testez sur votre front office.

  • Ajouter 3 téléphone 2610 à votre panier
  • Saisissez le code “TEL”
  • Pour 2 téléphones achetés, 1 téléphone est bien offert 🙂

Coupon de réduction magento

 

Correction pour la création d’un règle de type 1 acheté / 1 offert sous Magento 1.4.1.1

En tentant d’appliquer une règle de type 1 acheté / 1 offert sous la version 1.4.1.1 j’ai constaté que cela ne fonctionnait pas.
Après analyse du code, il s’avère que cette fonctionnalité n’est pas disponible de base.

Voici comment le corriger.

Pour commencer enregistrez une copie du fichier app/code/core/Mage/SalesRule/Model/Validator.php dans le pool local (” app/code/local/Mage/SalesRule/Model/Validator.php”);

Le traitement de la règle est géré dans la fonction “Process” dans le case “buy_x_get_y” (lignes 319 à 338 )

Voici le code de base

case 'buy_x_get_y':
 $x = $rule->getDiscountStep();
 $y = $rule->getDiscountAmount();
 if (!$x || $y>=$x) {
  break;
 }
 $buy = 0; $free = 0;
 while ($buy+$free<$qty) {
  $buy += $x;
  if ($buy+$free>=$qty) {
   break;
  }
  $free += min($y, $qty-$buy-$free);
  if ($buy+$free>=$qty) {
  break;
 }
}
$discountAmount    = $free*$itemPrice;
$baseDiscountAmount= $free*$baseItemPrice;
break;

Comme vous pouvez le constater, la validation vérifie que la quantité y est supérieure ou égale à x
La règle 1 acheté => 1 offert ne fonctionne donc pas.
Pour corriger le comportement on va donc modifier la condition pour que la validation vérifie que la quantité y est strictement supérieure à x

Voici donc le code corrigé.

case 'buy_x_get_y':
 $x = $rule->getDiscountStep();
 $y = $rule->getDiscountAmount();
 if (!$x || $y>$x) { // Ligne modifiée
  break;
 }
 $buy = 0; $free = 0;
 while ($buy+$free<$qty) {
  $buy += $x;
  if ($buy+$free>$qty) { //Ligne modifiée
   break;
  }
  $free += min($y, $qty-$buy-$free);
  if ($buy+$free>$qty) { //Ligne modifiée
  break;
 }
}
$discountAmount    = $free*$itemPrice;
$baseDiscountAmount= $free*$baseItemPrice;
break;

Une fois ces changement effectués, la règle 1 acheté => 1 offert est bien fonctionnelle