Author: jleroux
Date: Mon Feb 24 09:29:45 2014
New Revision: 1571198

URL: http://svn.apache.org/r1571198
Log:
A slightly modified patch from Praveen Agrawal for "The getFeatureIdQtyMap 
function doesn't include the DISTINGUISHING_FEAT into the featureMap" 
https://issues.apache.org/jira/browse/OFBIZ-5544

The getFeatureIdQtyMap function in ShoppingCartItem.java doesn't include the 
DISTINGUISHING_FEAT in featureMap so if we want to calculate the Shipping 
amount based on Distinguishing feature, this method doesn't return the 
Distinguishing Feature in Feature Map. If we add DISTINGUISHING_FEAT as 
productFeatureApplTypeId in filterExprs then the feature map would contain the 
Distinguishing feature in addition to Standard and Required Feature.

Also in ShoppingCartItem.java, putAdditionalProductFeatureAndAppl method, i 
think the OrderAdjustment should only be included when the amount is not null.

jleroux: When the amount is null it's now not added in the adjustement (I moved 
that in the block above where the amount is already tested for null). But the 
OrderAdjustment is still created because a recurringAmount could still exist . 
I just added a warning for when both amounts are null. We could decide to not 
create an adjustement when there are no amounts at all. But I preferred a 
warning, because it's a weird situation and people could prefer to be aware...

Modified:
    
ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/ShoppingCartItem.java

Modified: 
ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/ShoppingCartItem.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/ShoppingCartItem.java?rev=1571198&r1=1571197&r2=1571198&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/ShoppingCartItem.java
 (original)
+++ 
ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/ShoppingCartItem.java
 Mon Feb 24 09:29:45 2014
@@ -79,7 +79,7 @@ public class ShoppingCartItem implements
     public static final String resource = "OrderUiLabels";
     public static final String resource_error = "OrderErrorUiLabels";
     public static String[] attributeNames = { "shoppingListId", 
"shoppingListItemSeqId", "surveyResponses",
-                                              "itemDesiredDeliveryDate", 
"itemComment", "fromInventoryItemId"};
+        "itemDesiredDeliveryDate", "itemComment", "fromInventoryItemId"};
 
     public static final MathContext generalRounding = new MathContext(10);
 
@@ -143,7 +143,7 @@ public class ShoppingCartItem implements
 
     private Map<String, String> contactMechIdsMap = FastMap.newInstance();
     private List<GenericValue> orderItemPriceInfos = null;
-    private List<GenericValue> itemAdjustments = FastList.newInstance();
+    private final List<GenericValue> itemAdjustments = FastList.newInstance();
     private boolean isPromo = false;
     private BigDecimal promoQuantityUsed = BigDecimal.ZERO;
     private Map<GenericPK, BigDecimal> quantityUsedPerPromoCandidate = new 
HashMap<GenericPK, BigDecimal>();
@@ -177,7 +177,7 @@ public class ShoppingCartItem implements
     public static ShoppingCartItem makePurchaseOrderItem(Integer cartLocation, 
String productId, BigDecimal selectedAmount, BigDecimal quantity,
             Map<String, GenericValue> additionalProductFeatureAndAppls, 
Map<String, Object> attributes, String prodCatalogId, ProductConfigWrapper 
configWrapper, String itemType, ShoppingCart.ShoppingCartItemGroup itemGroup,
             LocalDispatcher dispatcher, ShoppingCart cart, GenericValue 
supplierProduct, Timestamp shipBeforeDate, Timestamp shipAfterDate, Timestamp 
cancelBackOrderDate)
-                throws CartItemModifyException, ItemNotFoundException {
+                    throws CartItemModifyException, ItemNotFoundException {
         Delegator delegator = cart.getDelegator();
         GenericValue product = null;
 
@@ -191,7 +191,7 @@ public class ShoppingCartItem implements
             Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productId", productId);
 
             String excMsg = UtilProperties.getMessage(resource_error, 
"item.product_not_found",
-                                          messageMap , cart.getLocale());
+                    messageMap , cart.getLocale());
 
             Debug.logWarning(excMsg, module);
             throw new ItemNotFoundException(excMsg);
@@ -201,10 +201,10 @@ public class ShoppingCartItem implements
         // check to see if product is virtual
         if ("Y".equals(product.getString("isVirtual"))) {
             Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productName", product.getString("productName"),
-                                            "productId", 
product.getString("productId"));
+                    "productId", product.getString("productId"));
 
             String excMsg = UtilProperties.getMessage(resource_error, 
"item.cannot_add_product_virtual",
-                                          messageMap , cart.getLocale());
+                    messageMap , cart.getLocale());
 
             Debug.logWarning(excMsg, module);
             throw new CartItemModifyException(excMsg);
@@ -216,10 +216,10 @@ public class ShoppingCartItem implements
         if ("AGGREGATED".equals(product.getString("productTypeId")) || 
"AGGREGATED_SERVICE".equals(product.getString("productTypeId"))) {
             if (configWrapper == null || !configWrapper.isCompleted()) {
                 Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productName", product.getString("productName"),
-                                                "productId", 
product.getString("productId"));
+                        "productId", product.getString("productId"));
 
                 String excMsg = UtilProperties.getMessage(resource_error, 
"item.cannot_add_product_not_configured_correctly",
-                                              messageMap , cart.getLocale());
+                        messageMap , cart.getLocale());
 
                 Debug.logWarning(excMsg, module);
                 throw new CartItemModifyException(excMsg);
@@ -298,7 +298,7 @@ public class ShoppingCartItem implements
             Timestamp reservStart, BigDecimal reservLength, BigDecimal 
reservPersons, Timestamp shipBeforeDate, Timestamp shipAfterDate,
             Map<String, GenericValue> additionalProductFeatureAndAppls, 
Map<String, Object> attributes, String prodCatalogId, ProductConfigWrapper 
configWrapper,
             String itemType, ShoppingCart.ShoppingCartItemGroup itemGroup, 
LocalDispatcher dispatcher, ShoppingCart cart, Boolean triggerExternalOpsBool, 
Boolean triggerPriceRulesBool, String parentProductId, Boolean 
skipInventoryChecks, Boolean skipProductChecks)
-            throws CartItemModifyException, ItemNotFoundException {
+                    throws CartItemModifyException, ItemNotFoundException {
 
         return 
makeItem(cartLocation,productId,selectedAmount,quantity,unitPrice,
                 
reservStart,reservLength,reservPersons,null,null,shipBeforeDate,shipAfterDate,
@@ -317,7 +317,7 @@ public class ShoppingCartItem implements
             Timestamp reservStart, BigDecimal reservLength, BigDecimal 
reservPersons,String accommodationMapId,String accommodationSpotId, Timestamp 
shipBeforeDate, Timestamp shipAfterDate,
             Map<String, GenericValue> additionalProductFeatureAndAppls, 
Map<String, Object> attributes, String prodCatalogId, ProductConfigWrapper 
configWrapper,
             String itemType, ShoppingCart.ShoppingCartItemGroup itemGroup, 
LocalDispatcher dispatcher, ShoppingCart cart, Boolean triggerExternalOpsBool, 
Boolean triggerPriceRulesBool, String parentProductId, Boolean 
skipInventoryChecks, Boolean skipProductChecks)
-            throws CartItemModifyException, ItemNotFoundException {
+                    throws CartItemModifyException, ItemNotFoundException {
         Delegator delegator = cart.getDelegator();
         GenericValue product = findProduct(delegator, 
skipProductChecks.booleanValue(), prodCatalogId, productId, cart.getLocale());
         GenericValue parentProduct = null;
@@ -373,17 +373,17 @@ public class ShoppingCartItem implements
             ShoppingCart cart, Boolean triggerExternalOpsBool, Boolean 
triggerPriceRulesBool, GenericValue parentProduct, Boolean skipInventoryChecks, 
Boolean skipProductChecks) throws CartItemModifyException {
 
         return makeItem(cartLocation,product,selectedAmount,
-               quantity,unitPrice,reservStart,reservLength,reservPersons,
-               
null,null,shipBeforeDate,shipAfterDate,additionalProductFeatureAndAppls,attributes,
-               prodCatalogId,configWrapper,itemType,itemGroup,dispatcher,cart,
-               
triggerExternalOpsBool,triggerPriceRulesBool,parentProduct,skipInventoryChecks,skipProductChecks);
+                quantity,unitPrice,reservStart,reservLength,reservPersons,
+                
null,null,shipBeforeDate,shipAfterDate,additionalProductFeatureAndAppls,attributes,
+                prodCatalogId,configWrapper,itemType,itemGroup,dispatcher,cart,
+                
triggerExternalOpsBool,triggerPriceRulesBool,parentProduct,skipInventoryChecks,skipProductChecks);
     }
 
     /**
      * Makes a ShoppingCartItem and adds it to the cart.
      * @param accommodationMapId Optional. reservations add into workeffort
      * @param accommodationSpotId Optional. reservations add into workeffort
-    */
+     */
     public static ShoppingCartItem makeItem(Integer cartLocation, GenericValue 
product, BigDecimal selectedAmount,
             BigDecimal quantity, BigDecimal unitPrice, Timestamp reservStart, 
BigDecimal reservLength, BigDecimal reservPersons,
             String accommodationMapId,String accommodationSpotId,
@@ -392,7 +392,7 @@ public class ShoppingCartItem implements
             ShoppingCart cart, Boolean triggerExternalOpsBool, Boolean 
triggerPriceRulesBool, GenericValue parentProduct, Boolean skipInventoryChecks, 
Boolean skipProductChecks) throws CartItemModifyException {
 
         ShoppingCartItem newItem = new ShoppingCartItem(product, 
additionalProductFeatureAndAppls, attributes, prodCatalogId, configWrapper, 
cart.getLocale(), itemType, itemGroup, parentProduct);
-        
+
         selectedAmount = selectedAmount == null ? BigDecimal.ZERO : 
selectedAmount;
         unitPrice = unitPrice == null ? BigDecimal.ZERO : unitPrice;
         reservLength = reservLength == null ? BigDecimal.ZERO : reservLength;
@@ -403,10 +403,10 @@ public class ShoppingCartItem implements
         // check to see if product is virtual
         if ("Y".equals(product.getString("isVirtual"))) {
             Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productName", product.getString("productName"),
-                                            "productId", 
product.getString("productId"));
+                    "productId", product.getString("productId"));
 
             String excMsg = UtilProperties.getMessage(resource_error, 
"item.cannot_add_product_virtual",
-                                          messageMap , cart.getLocale());
+                    messageMap , cart.getLocale());
 
             Debug.logWarning(excMsg, module);
             throw new CartItemModifyException(excMsg);
@@ -422,55 +422,55 @@ public class ShoppingCartItem implements
         if ("ASSET_USAGE".equals(product.getString("productTypeId")) || 
"ASSET_USAGE_OUT_IN".equals(product.getString("productTypeId"))) {
             if (reservStart == null)    {
                 String excMsg = UtilProperties.getMessage(resource_error, 
"item.missing_reservation_starting_date",
-                                              cart.getLocale());
+                        cart.getLocale());
                 throw new CartItemModifyException(excMsg);
             }
 
             if (reservStart.before(UtilDateTime.nowTimestamp()))    {
                 String excMsg = UtilProperties.getMessage(resource_error, 
"item.reservation_from_tomorrow",
-                                              cart.getLocale());
+                        cart.getLocale());
                 throw new CartItemModifyException(excMsg);
             }
             newItem.setReservStart(reservStart);
 
             if (reservLength.compareTo(BigDecimal.ONE) < 0)    {
                 String excMsg = UtilProperties.getMessage(resource_error, 
"item.number_of_days",
-                                              cart.getLocale());
+                        cart.getLocale());
                 throw new CartItemModifyException(excMsg);
             }
             newItem.setReservLength(reservLength);
 
             if (product.get("reservMaxPersons") != null) {
                 BigDecimal reservMaxPersons = 
product.getBigDecimal("reservMaxPersons");
-                 if (reservMaxPersons.compareTo(reservPersons) < 0)    {
-                     Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("reservMaxPersons", product.getString("reservMaxPersons"),
-                                                     "reservPersons", 
reservPersons);
-                     String excMsg = UtilProperties.getMessage(resource_error, 
"item.maximum_number_of_person_renting",
-                                                   messageMap, 
cart.getLocale());
-
-                     Debug.logInfo(excMsg,module);
-                     throw new CartItemModifyException(excMsg);
-                 }
-             }
-             newItem.setReservPersons(reservPersons);
+                if (reservMaxPersons.compareTo(reservPersons) < 0)    {
+                    Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("reservMaxPersons", product.getString("reservMaxPersons"),
+                            "reservPersons", reservPersons);
+                    String excMsg = UtilProperties.getMessage(resource_error, 
"item.maximum_number_of_person_renting",
+                            messageMap, cart.getLocale());
 
-             if (product.get("reserv2ndPPPerc") != null)
-                 
newItem.setReserv2ndPPPerc(product.getBigDecimal("reserv2ndPPPerc"));
+                    Debug.logInfo(excMsg,module);
+                    throw new CartItemModifyException(excMsg);
+                }
+            }
+            newItem.setReservPersons(reservPersons);
 
-             if (product.get("reservNthPPPerc") != null)
-                 
newItem.setReservNthPPPerc(product.getBigDecimal("reservNthPPPerc"));
+            if (product.get("reserv2ndPPPerc") != null)
+                
newItem.setReserv2ndPPPerc(product.getBigDecimal("reserv2ndPPPerc"));
 
-             if ((accommodationMapId != null) && (accommodationSpotId != 
null)) {
+            if (product.get("reservNthPPPerc") != null)
+                
newItem.setReservNthPPPerc(product.getBigDecimal("reservNthPPPerc"));
+
+            if ((accommodationMapId != null) && (accommodationSpotId != null)) 
{
                 
newItem.setAccommodationId(accommodationMapId,accommodationSpotId);
-             }
+            }
 
             // check to see if the related fixed asset is available for rent
             String isAvailable = 
checkAvailability(product.getString("productId"), quantity, reservStart, 
reservLength, cart);
             if (isAvailable.compareTo("OK") != 0) {
                 Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productId", product.getString("productId"),
-                                                "availableMessage", 
isAvailable);
+                        "availableMessage", isAvailable);
                 String excMsg = UtilProperties.getMessage(resource_error, 
"item.product_not_available",
-                                              messageMap, cart.getLocale());
+                        messageMap, cart.getLocale());
                 Debug.logInfo(excMsg, module);
                 throw new CartItemModifyException(isAvailable);
             }
@@ -542,30 +542,30 @@ public class ShoppingCartItem implements
     }
 
     public static void isValidCartProduct(ProductConfigWrapper configWrapper, 
GenericValue product, Timestamp nowTimestamp, Locale locale) throws 
CartItemModifyException {
-            // check to see if introductionDate hasn't passed yet
-            if (product.get("introductionDate") != null && 
nowTimestamp.before(product.getTimestamp("introductionDate"))) {
-                Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productName", product.getString("productName"),
-                                                "productId", 
product.getString("productId"));
+        // check to see if introductionDate hasn't passed yet
+        if (product.get("introductionDate") != null && 
nowTimestamp.before(product.getTimestamp("introductionDate"))) {
+            Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productName", product.getString("productName"),
+                    "productId", product.getString("productId"));
 
-                String excMsg = UtilProperties.getMessage(resource_error, 
"item.cannot_add_product_not_yet_available",
-                                              messageMap , locale);
+            String excMsg = UtilProperties.getMessage(resource_error, 
"item.cannot_add_product_not_yet_available",
+                    messageMap , locale);
 
-                Debug.logWarning(excMsg, module);
-                throw new CartItemModifyException(excMsg);
-            }
+            Debug.logWarning(excMsg, module);
+            throw new CartItemModifyException(excMsg);
+        }
 
-            // check to see if salesDiscontinuationDate has passed
-            if (product.get("salesDiscontinuationDate") != null && 
nowTimestamp.after(product.getTimestamp("salesDiscontinuationDate"))) {
-                Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productName", product.getString("productName"),
-                                                "productId", 
product.getString("productId"));
+        // check to see if salesDiscontinuationDate has passed
+        if (product.get("salesDiscontinuationDate") != null && 
nowTimestamp.after(product.getTimestamp("salesDiscontinuationDate"))) {
+            Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productName", product.getString("productName"),
+                    "productId", product.getString("productId"));
 
-                String excMsg = UtilProperties.getMessage(resource_error, 
"item.cannot_add_product_no_longer_available",
-                                              messageMap , locale);
+            String excMsg = UtilProperties.getMessage(resource_error, 
"item.cannot_add_product_no_longer_available",
+                    messageMap , locale);
 
-                Debug.logWarning(excMsg, module);
-                throw new CartItemModifyException(excMsg);
-            }
-            /*
+            Debug.logWarning(excMsg, module);
+            throw new CartItemModifyException(excMsg);
+        }
+        /*
             if (product.get("salesDiscWhenNotAvail") != null && 
"Y".equals(product.getString("salesDiscWhenNotAvail"))) {
                 // check atp and if <= 0 then the product is no more available 
because
                 // all the units in warehouse are reserved by other sales 
orders and no new purchase orders will be done
@@ -581,19 +581,19 @@ public class ShoppingCartItem implements
                     throw new CartItemModifyException(excMsg);
                 }
             }
-             */
+         */
 
-            // check to see if the product is fully configured
-            if ("AGGREGATED".equals(product.getString("productTypeId"))|| 
"AGGREGATED_SERVICE".equals(product.getString("productTypeId"))) {
-                if (configWrapper == null || !configWrapper.isCompleted()) {
-                    Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productName", product.getString("productName"),
-                                                    "productId", 
product.getString("productId"));
-                    String excMsg = UtilProperties.getMessage(resource_error, 
"item.cannot_add_product_not_configured_correctly",
-                                                  messageMap , locale);
-                    Debug.logWarning(excMsg, module);
-                    throw new CartItemModifyException(excMsg);
-                }
+        // check to see if the product is fully configured
+        if ("AGGREGATED".equals(product.getString("productTypeId"))|| 
"AGGREGATED_SERVICE".equals(product.getString("productTypeId"))) {
+            if (configWrapper == null || !configWrapper.isCompleted()) {
+                Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productName", product.getString("productName"),
+                        "productId", product.getString("productId"));
+                String excMsg = UtilProperties.getMessage(resource_error, 
"item.cannot_add_product_not_configured_correctly",
+                        messageMap , locale);
+                Debug.logWarning(excMsg, module);
+                throw new CartItemModifyException(excMsg);
             }
+        }
     }
 
     /**
@@ -728,7 +728,7 @@ public class ShoppingCartItem implements
     /** Creates new ShoppingCartItem object. */
     protected ShoppingCartItem(GenericValue product, Map<String, GenericValue> 
additionalProductFeatureAndAppls, Map<String, Object> attributes, String 
prodCatalogId, Locale locale, String itemType, 
ShoppingCart.ShoppingCartItemGroup itemGroup) {
         this(product, additionalProductFeatureAndAppls, attributes, 
prodCatalogId, null, locale, itemType, itemGroup, null);
-         if (product != null) {
+        if (product != null) {
             String productName = 
ProductContentWrapper.getProductContentAsText(product, "PRODUCT_NAME", 
this.locale, null);
             // if the productName is null or empty, see if there is an 
associated virtual product and get the productName of that product
             if (UtilValidate.isEmpty(productName)) {
@@ -947,7 +947,7 @@ public class ShoppingCartItem implements
                 return msg;
             } else {
                 Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("quantityReq", quantity,
-                                                "quantityAvail", 
fixedAsset.getString("productionCapacity"));
+                        "quantityAvail", 
fixedAsset.getString("productionCapacity"));
                 String msg = UtilProperties.getMessage(resource_error, 
"item.availableQnt", messageMap , cart.getLocale());
                 return msg;
             }
@@ -1027,7 +1027,7 @@ public class ShoppingCartItem implements
 
         if (this.isPromo) {
             Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productName", this.getName(),
-                                            "productId",   productId);
+                    "productId",   productId);
             String excMsg = UtilProperties.getMessage(resource, 
"OrderCannotChangeQuantityInPromotion", messageMap , cart.getLocale());
             throw new CartItemModifyException(excMsg);
         }
@@ -1040,8 +1040,8 @@ public class ShoppingCartItem implements
             if (_product != null && quantity.compareTo(this.quantity) > 0) {
                 if (!isInventoryAvailableOrNotRequired(quantity, 
productStoreId, dispatcher)) {
                     Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("requestedQuantity", 
UtilFormatOut.formatQuantity(quantity.doubleValue()),
-                                                    "productName",       
this.getName(),
-                                                    "productId",         
productId);
+                            "productName",       this.getName(),
+                            "productId",         productId);
                     String excMsg = UtilProperties.getMessage(resource, 
"OrderDoNotHaveEnoughProducts", messageMap , cart.getLocale());
                     Debug.logWarning(excMsg, module);
                     throw new CartItemModifyException(excMsg);
@@ -1132,7 +1132,7 @@ public class ShoppingCartItem implements
                 }
             }
             cart.setItemShipGroupQty(this, quantity, shipGroupIndex);
-            */
+             */
             cart.setItemShipGroupQty(this, quantity, 0);
         }
     }
@@ -1158,10 +1158,10 @@ public class ShoppingCartItem implements
                 }else{
                     priceContext.put("product", this.getProduct());
                 }
-                
+
                 priceContext.put("quantity", this.getQuantity());
                 priceContext.put("amount", this.getSelectedAmount());
-                
+
                 if (cart.getOrderType().equals("PURCHASE_ORDER")) {
                     priceContext.put("currencyUomId", cart.getCurrency());
                     Map<String, Object> priceResult = 
dispatcher.runSync("calculatePurchasePrice", priceContext);
@@ -1172,13 +1172,13 @@ public class ShoppingCartItem implements
                     if (!validPriceFound.booleanValue()) {
                         throw new CartItemModifyException("Could not find a 
valid price for the product with ID [" + this.getProductId() + "] and supplier 
with ID [" + partyId + "], not adding to cart.");
                     }
-                    
+
                     if(isAlternativePacking){
                         this.setBasePrice(((BigDecimal) 
priceResult.get("price")).divide(pieces, RoundingMode.HALF_UP));
                     }else{
                         this.setBasePrice(((BigDecimal) 
priceResult.get("price")));
                     }
-                    
+
                     this.setDisplayPrice(this.basePrice);
                     this.orderItemPriceInfos = 
UtilGenerics.checkList(priceResult.get("orderItemPriceInfos"));
                 } else {
@@ -1221,7 +1221,7 @@ public class ShoppingCartItem implements
                     if (Boolean.FALSE.equals(validPriceFound)) {
                         throw new CartItemModifyException("Could not find a 
valid price for the product with ID [" + this.getProductId() + "], not adding 
to cart.");
                     }
-                    
+
                     //set alternative product price
                     if(isAlternativePacking){
                         int decimals = 2;
@@ -1252,10 +1252,10 @@ public class ShoppingCartItem implements
                         if (priceResult.get("price") != null) {
                             this.setDisplayPrice(((BigDecimal) 
priceResult.get("price")));
                         }
-                        
+
                         this.setSpecialPromoPrice((BigDecimal) 
priceResult.get("specialPromoPrice"));
                     }
-                    
+
                     this.orderItemPriceInfos = 
UtilGenerics.checkList(priceResult.get("orderItemPriceInfos"));
 
                     // If product is configurable, the price is taken from the 
configWrapper.
@@ -1312,7 +1312,7 @@ public class ShoppingCartItem implements
     /** Returns the reservation start date with a number of days added. */
     public Timestamp getReservStart(BigDecimal addDays) {
         if (addDays.compareTo(BigDecimal.ZERO) == 0)
-                return this.reservStart;
+            return this.reservStart;
         else    {
             if (this.reservStart != null)
                 return new Timestamp((long)(this.reservStart.getTime() + 
(addDays.doubleValue() * 86400000.0)));
@@ -1751,26 +1751,26 @@ public class ShoppingCartItem implements
     }
     /** Returns the item's description. */
     public String getName() {
-       if (itemDescription != null) {
-          return itemDescription;
-       } else {
-        GenericValue product = getProduct();
-        if (product != null) {
-            String productName = 
ProductContentWrapper.getProductContentAsText(product, "PRODUCT_NAME", 
this.locale, null);
-            // if the productName is null or empty, see if there is an 
associated virtual product and get the productName of that product
-            if (UtilValidate.isEmpty(productName)) {
-                GenericValue parentProduct = this.getParentProduct();
-                if (parentProduct != null) {
-                    productName = 
ProductContentWrapper.getProductContentAsText(parentProduct, "PRODUCT_NAME", 
this.locale, null);
+        if (itemDescription != null) {
+            return itemDescription;
+        } else {
+            GenericValue product = getProduct();
+            if (product != null) {
+                String productName = 
ProductContentWrapper.getProductContentAsText(product, "PRODUCT_NAME", 
this.locale, null);
+                // if the productName is null or empty, see if there is an 
associated virtual product and get the productName of that product
+                if (UtilValidate.isEmpty(productName)) {
+                    GenericValue parentProduct = this.getParentProduct();
+                    if (parentProduct != null) {
+                        productName = 
ProductContentWrapper.getProductContentAsText(parentProduct, "PRODUCT_NAME", 
this.locale, null);
+                    }
+                }
+                if (productName == null) {
+                    return "";
+                } else {
+                    return productName;
                 }
-            }
-            if (productName == null) {
-                return "";
             } else {
-                return productName;
-            }
-        } else {
-               return "";
+                return "";
             }
         }
     }
@@ -1893,18 +1893,18 @@ public class ShoppingCartItem implements
     }
 
     /** Returns a List of the item's features for supplier*/
-   public List<GenericValue> getFeaturesForSupplier(LocalDispatcher 
dispatcher,String partyId) {
-       List<GenericValue> featureAppls = getStandardFeatureList();
-       if (UtilValidate.isNotEmpty(featureAppls)) {
-           try {
-              Map<String, Object> result = 
dispatcher.runSync("convertFeaturesForSupplier", UtilMisc.toMap("partyId", 
partyId, "productFeatures", featureAppls));
-              featuresForSupplier = 
UtilGenerics.checkList(result.get("convertedProductFeatures"));
-           } catch (GenericServiceException e) {
-               Debug.logError(e, "Unable to get features for supplier from 
product : " + this.productId, module);
-           }
-       }
-       return featuresForSupplier;
-   }
+    public List<GenericValue> getFeaturesForSupplier(LocalDispatcher 
dispatcher,String partyId) {
+        List<GenericValue> featureAppls = getStandardFeatureList();
+        if (UtilValidate.isNotEmpty(featureAppls)) {
+            try {
+                Map<String, Object> result = 
dispatcher.runSync("convertFeaturesForSupplier", UtilMisc.toMap("partyId", 
partyId, "productFeatures", featureAppls));
+                featuresForSupplier = 
UtilGenerics.checkList(result.get("convertedProductFeatures"));
+            } catch (GenericServiceException e) {
+                Debug.logError(e, "Unable to get features for supplier from 
product : " + this.productId, module);
+            }
+        }
+        return featuresForSupplier;
+    }
 
     /** Returns the item's size (length + girth) */
     public BigDecimal getSize() {
@@ -2077,8 +2077,8 @@ public class ShoppingCartItem implements
 
     /** Returns the total line price. */
     public BigDecimal getItemSubTotal(BigDecimal quantity) {
-//        Debug.logInfo("Price" + getBasePrice() + " quantity" +  quantity + " 
Rental adj:" + getRentalAdjustment() + " other adj:" + getOtherAdjustments(), 
module);
-          return 
getBasePrice().multiply(quantity).multiply(getRentalAdjustment()).add(getOtherAdjustments());
+        //        Debug.logInfo("Price" + getBasePrice() + " quantity" +  
quantity + " Rental adj:" + getRentalAdjustment() + " other adj:" + 
getOtherAdjustments(), module);
+        return 
getBasePrice().multiply(quantity).multiply(getRentalAdjustment()).add(getOtherAdjustments());
     }
 
     public BigDecimal getItemSubTotal() {
@@ -2136,8 +2136,8 @@ public class ShoppingCartItem implements
         BigDecimal amount = (BigDecimal) 
additionalProductFeatureAndAppl.get("amount");
         if (amount != null) {
             amount = amount.multiply(this.getQuantity());
+            orderAdjustment.set("amount", amount);
         }
-        orderAdjustment.set("amount", amount);
 
         BigDecimal recurringAmount = (BigDecimal) 
additionalProductFeatureAndAppl.get("recurringAmount");
         if (recurringAmount != null) {
@@ -2146,6 +2146,10 @@ public class ShoppingCartItem implements
             //Debug.logInfo("Setting recurringAmount " + recurringAmount + " 
for " + orderAdjustment, module);
         }
 
+        if (amount == null && recurringAmount == null) {
+            Debug.logWarning("In putAdditionalProductFeatureAndAppl the amount 
and recurringAmount are null for this adjustment: " + orderAdjustment, module);
+        }
+
         this.addAdjustment(orderAdjustment);
     }
 
@@ -2181,6 +2185,7 @@ public class ShoppingCartItem implements
                 featureAppls = product.getRelated("ProductFeatureAppl", null, 
null, false);
                 List<EntityExpr> filterExprs = 
UtilMisc.toList(EntityCondition.makeCondition("productFeatureApplTypeId", 
EntityOperator.EQUALS, "STANDARD_FEATURE"));
                 
filterExprs.add(EntityCondition.makeCondition("productFeatureApplTypeId", 
EntityOperator.EQUALS, "REQUIRED_FEATURE"));
+                
filterExprs.add(EntityCondition.makeCondition("productFeatureApplTypeId", 
EntityOperator.EQUALS, "DISTINGUISHING_FEAT"));
                 featureAppls = EntityUtil.filterByOr(featureAppls, 
filterExprs);
             } catch (GenericEntityException e) {
                 Debug.logError(e, "Unable to get features from product : " + 
product.get("productId"), module);
@@ -2474,7 +2479,7 @@ public class ShoppingCartItem implements
             throw new IllegalStateException("Bad product id");
         }
 
-          this._parentProduct = ProductWorker.getParentProduct(productId, 
this.getDelegator());
+        this._parentProduct = ProductWorker.getParentProduct(productId, 
this.getDelegator());
 
         return this._parentProduct;
     }


Reply via email to