Ajustements personnalisés

Les ajustements personnalisés doivent implémenter l'interface com.ibm.commerce.marketing.promotion.reward.Adjustment. Voici un exemple de définition :


package com.ibm.commerce.marketing.promotion.reward;

import java.math.BigDecimal;
import java.util.Vector;

import com.ibm.commerce.marketing.promotion.runtime.LineItemSet;
import com.ibm.commerce.marketing.promotion.runtime.PromotionContext;
import com.ibm.commerce.marketing.promotion.runtime.PromotionRuntimeException;
import com.ibm.commerce.marketing.promotion.xml.XMLizable;

/**
 * <code>Adjustment</code> interface contains the methods common to
 * all adjustments.
 * This interface extends <code>XMLizable</code> and <code>Cloneable</code> 
 * interfaces. 
 * All the adjustments should implement this interface.
 */

public interface Adjustment extends XMLizable, Cloneable {
   /**
    * IBM copyright notice field.
    */
    public static final String COPYRIGHT =
          com.ibm.commerce.copyright.IBMCopyright.SHORT_COPYRIGHT;
       /**
        * Indicates Whole Order.
        */
        
    public static final Integer WHOLE_ORDER = new Integer(1);
       /**
        * Indicates all Affected Items.
        */

    public static final Integer ALL_AFFECTED_ITEMS = new Integer(2);
       /**
        * Indicates Individual Affected Items.
        */

    public static final Integer INDIVIDUAL_AFFECTED_ITEMS = new Integer(3);
       /**
        * This method gets the type of Adjustment. Adjustment can be one of the 
        * following types for whole Order, for All Affected Items, and for 
        * Individual Affected Items.
        * @return Integer  <code>1 </code> Order as a whole
        *                   <code>2 </code> All Affected Items
        *                   <code>3 </code> Individual Affected Items 
        */

    Integer getAdjustmentType();

       /**
        * This method sets the promotion level.
        * @return Integer <code>1 </code> Order as a whole
        *                   <code>2 </code> All Affected Items
        *                   <code>3 </code> Individual Affecte Items 
        */

    void setAdjustmentType(Integer adjustmentType);

       /**
        * Applies adjustment to affected order items
        * @param targeted targeted order items
        * @param affected affected order items
        * @param context PromotionExecutionContext
        * @return the actual adjustment
        * @throws PromotionRuntimeException when the computation 
        * encounters a problem
        */

    boolean apply(
          LineItemSet targeted, 
          BigDecimal targetedAmount,
          int targetedAmountTypes,
          LineItemSet affected,
          Vector affectedVector,
          Vector adjustmentVector,
          PromotionContext context)
          throws PromotionRuntimeException;
}

Cette interface est aussi une sous-classe de XMLizable. Les trois constantes déclarées sur l'interface représentent trois manières différentes d'association d'un ajustement aux articles concernés. Examinons la méthode apply, qui reçoit les paramètres suivants :

LineItemSet targeted
Ce paramètre d'entrée est le groupe d'articles de commande (ou les sections de ces articles) permettant de se qualifier pour la promotion dont cet ajustement fait partie.
BigDecimal targetedAmount
Ce paramètre d'entrée n'est pas utilisé actuellement et une valeur Null sera toujours transmise aux ajustements.
int targetedAmountType
Ce paramètre d'entrée n'est pas utilisé actuellement.
LineItemSet affected
Ce paramètre de sortie est le groupe d'articles de commande, identifiés par la promotion, auquel l'ajustement sera lié.
Vector affectedVector
Paramètre de sortie. Généralement, lorsque la méthode apply se termine, ce vecteur est incrémenté d'une unité. Le paramètre affecté est ajouté à la fin de ce vecteur. Cependant, dans certaines situations, la méthode apply peut fractionner le groupe LineItemSet et appliquer des ajustements distincts aux différents sous-ensembles. Dans ce cas, tous les sous-ensembles résultants seront ajoutés à ce vecteur.
Vector adjustmentVector
Paramètre de sortie. Généralement, lorsque la méthode apply se termine, ce vecteur est incrémenté d'une unité. L'ajustement est ajouté à la fin de ce vecteur. Cependant, dans certaines situations, la méthode apply peut fractionner le groupe LineItemSet et appliquer des ajustements distincts aux différents sous-ensembles. Dans ce cas, chaque ajustement qui en résulte est ajouté à ce vecteur. Les éléments sur le vecteur affectedVector et ce paramètre ont une relation de type un-à-un basée sur leur index dans le vecteur .
PromotionContext context
Fournit le contexte dans lequel l'ajustement est exécuté.

Il existe un type spécial d'ajustements, appelé MonetaryAdjustments. Actuellement, dans un environnement de détaillant en ligne, quatre types de valeurs monétaires différentes sont associés à un achat. Il s'agit de : le prix, l'expédition et la manutention, les taxes et les taxes afférentes à l'expédition et à la manutention. Les promotions qui modifient ces valeurs associent un ajustement MonetaryAdjustment aux articles concernés. MonetaryAdjustment est une sous-classe de l'interface Adjustment. Par conséquent, toutes les caractéristiques des ajustements s'appliquent à MonetaryAdjustment. En plus de l'ajustement, MonetaryAdjustment comporte un certain nombre d'extensions. La définition de l'interface est la suivante :


package com.ibm.commerce.marketing.promotion.reward;

import java.math.BigDecimal;
import com.ibm.commerce.marketing.promotion.runtime.AssociatedOrderItem;
import com.ibm.commerce.marketing.promotion.runtime.PromotionContext;

public interface MonetaryAdjustment extends Adjustment {
       /**
        * IBM copyright notice field.
        */
       public static final String COPYRIGHT =
             com.ibm.commerce.copyright.IBMCopyright.SHORT_COPYRIGHT;

       /**
        * Adjustment is on the sub total of an order or a subset of an order.
        */
       public static final int PRICE = 1;
       
       /**
        * Adjustment is on the shipping charges of an order or a subset of an order.
        */
       public static final int SHIPPING = 2;

       /**
        * Adjustment is on the tax levied on the shipping charges of an order or a
        * subset of an order.
        */
       public static final int SHIPPING_TAX = 4;
       /**
        * Adjustment is on the tax levied on an order or a subset of an order
        */
       public static final int TAX = 8;

       /**
        * A simple BigDecimal constant value of 0.
        */
       public static final BigDecimal ZERO = new BigDecimal("0");

       /**
        * Returns the target of a monetary adjustmennt. Possible values are:
        * SUBTOTAL=1, SHIPPING=2, SHIPPING_TAX=4, TAX=8. 
        * @return target of a monetary adjustment
        */
       int getTheTypeOfMonetaryValueToBeAdjusted();

       /**
        * Returns the monetary adjustment that need to be apply to each unit of an order
        * item or a portion of an order item (as identified by the AssociationOrderItem).
        * It is guaranteed that all units in <code>one</code> have been adjusted by
        * exactly the same set of monetary adjustments.
        * @param one the order item or portion of an order item for which a per unit 
        * adjustment amount needs to be calculated.
        * @param all all of the AssociatedOrderItems to which this 
        * adjustment applies.
        * @param context PromotionContext
        * @return a perUnit value, value could be positive which means a discount, 
        * negative which means a markup, or zero which means no change is needed.
        */
       BigDecimal getPerUnitAdjustment(
              AssociatedOrderItem one,
              AssociatedOrderItem all[],
              PromotionContext context);
}

Par rapport à l'interface Adjustment, deux méthodes supplémentaires sont définies. La première, getTheTypeOfMonetaryValueToBeAdjusted, renvoie une mappe de bits représentant les valeurs monétaires auxquelles l'ajustement est appliqué. MonetaryAdjustment peut être appliqué à plusieurs valeurs monétaires si la mappe de bits renvoyée par cette méthode comporte plus d'un bit défini à 1. La seconde méthode, BigDecimal, exécute la logique de distribution des ajustements monétaires définis par un MonetaryAdjustment aux articles concernés spécifiques. Les commentaires dans la définition de l'interface doivent être suffisants pour expliquer le comportement de cette méthode.

Tous les ajustements monétaires doivent implémenter l'interface MonetaryAdjustment.

Remarque : toutes les implémentations d'ajustement personnalisé doivent autoriser les unités d'exécution multiples et être réentrantes.

Après avoir implémenté l'ajustement de la promotion, vous devez veiller à ce que l'ajustement soit pris en charge par le sous système de commandes. Par défaut, les méthodes d'application d'ajustement suivantes sont prises en charge :

  • WHOLE_ORDER
  • INDIVIDUAL_AFFECTED_ITEMS
  • ALL_AFFECTED_ITEMS