Calcul des promotions
Il existe deux types de promotions, les promotions automatiques et les promotions manuelles (saisie par l'utilisateur).
Les promotions manuelles peuvent être saisis lors de la création d'une commande, mais seront supprimées quand celle-ci sera mis à jour.
Ce sont donc les promotions automatiques qui vont nous intéressés (la mise à jour d'une commande Neogia doit être aussi riche que celle d'OFBiz, et jamais plus pauvre).
C'est la méthode doPromotions() du fichier ProductPromoWorker.java qui applique les promotions automatique lors de l'ajout ou de la modification d'un produit à une commande.
Cependant, cette méthode travail uniquement avec le Cart! et c'est ce que l'on ne souhaite pas. Nous allons donc créer une Interface nommée ShoppingCartInterface. Les signatures de toutes les fonctions ayant un ShoppingCart en entrée seront changées en ShoppingCartInterface.
Cela implique par conséquent qu'il faudra implémenter les méthodes du Cart que l'on retrouve dans doPromotions() dans OrderHeader.
Voici la liste des méthodes à implémenter :
* getDelegator() : récupérer le délegator * getLocale() : retourne la localeget * getUserLogin() : retourne le userLogin * getAutoUserLogin() : - retourne l'utilisateur par défaut * clearAllPromotionInformation() : supprimer toutes les promotions * clearAllItemSalesTaxAdjustment() : supprime les Sales taxes appliquées aux orderItem * clearAllItemFixTaxAdjustement() : supprime les taxes PRODUCT\_FIX\_TAX appliquées aux orderItem * clearCartItemUseInPromoInfo() : supprime les promos associés aux orderItems * resetPromoRuleUse() : reset les promotions d'une commande * addProductVATTax() : retourne si le produit affiche son prix en TTC ou sans TVA * getShippingAddress() : récupère l'adresse de livraison * AgreementId() : pour les commandes d'achat, retourne les promos liées à un numéro d'agreement * getPartyId() : retourne le PartyId * getProductStoreId() : récupère le ProductStoreId * getCurrency() : retourne la currencyUomId * addProductPromoUse() : ajoute une promotion * items() : retourne la liste des orderItems * getItemIndex() : retourne l'index d'un orderItem dans la liste des orderItem (pour la gestion du cart) * getLineListOrderedByBasePrice() : retourne la liste des orderItems ordonnées par prix unitaire * removeCartItem() : supprimer un orderItem * getTotalQuantity() : retourne la quantité totale de la commande * getProductPromoCodesEntered() : récupère les promotions qui s'applique à la commande * getProductPromoUseCount() : retourne le nombre de promo * getProductPromoUseTotalDiscount() : retourne le montant d'une promotion * getSubTotalForPromotions() : retourne le montant totale des orderItems en fonction des promotions * getDesiredAlternateGiftByAction() : retourne les promos sur les cadeaux * confirmPromoRuleUse() : confirme les promos * getPartyDaysSinceCreated() : retourne le nombre de jour depuis la création de la commande * addFreeShippingProductPromoAction() : ajoute un freeShipping adjustment
L'algorithme de doPromotions() :
* suppression des promotions appliquées à la commande * chargement de l'adresse de livraison si elle est nulle (geoId) * Calcul des taxes * on récupère la liste de toutes les promotions * On calcul les les promos via runProductPromos ** c'est un calcul préliminaire qui a pour but unique de connaître le montant de chaque promos * création de deux listes de promos : promos par ligne - promos par en-tête * les listes sont triée par montant en descendant * concaténation de ces deux listes (promos par ligne suivi de promos par en-tête) * Une fois les promos triées correctement, on les applique une bonne fois pour toutes! * on recalcul les taxes pour finir
Maintenant voila la liste des méthodes appelées par doPromotions(), qui se trouve également dans ProductPromoWorker.java et dont le ShoppingCart en entrée doit être changé par un ShoppingCartInterface :
* getProductStorePromotions() * getAgreementPromotions() * runProductPromos() * runProductPromoRules() * checkCondition() * performAction() * getCartItemsUsed() * getCartItemsUsedTotalAmount() * distributeDiscountAmount()
De plus, certaines de ces méthodes, ci-dessus, instancient un ShoppingCartItem. Il a donc fallu mettre en place un ShoppingCartItemInterface et par conséquent ré-implémenter certaines méthodes au sein de OrderItem.
* getProduct : retourne le produit associé à la ligne * getParentProductId : retourne l'identifiant du produit parent (s'il existe) * getProductId : retourne l'identifiant du produit * getIsPromo : retourne s'il y a une promotion applicable * setIsPromo : indique si une promotion est applicable * getBasePrice : retourne le prix unitaire * getItemSubTotal : retourne le montant total d'une ligne (quantité * PU * total ajustement) * getQuantity : retourne la quantité totale d'une ligne (quantité commandée - quantité annulée) * getTaxedPrice : retourne le montant de la ligne (le montant de la promotion est inclue) * getAdjustments : retourne les ajustements associés à une ligne * addAdjustment : ajoute un ajustement à une ligne * getSpecialPromoPrice : retourne le prix d'une promotion automatique * addPromoQuantityCandidateUse : retourne le nombre de fois que l'on peux appliquer une promotion * getPromoQuantityCandidateUseActionAndAllConds : retourne le nombre de fois qu'a été appliquer une promotion * setAlternativeOptionProductIds


