You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by mr...@apache.org on 2016/06/18 12:08:06 UTC

svn commit: r1748969 - in /ofbiz/trunk/applications: datamodel/entitydef/ order/src/org/ofbiz/order/shoppingcart/shipping/ product/data/

Author: mridulpathak
Date: Sat Jun 18 12:08:06 2016
New Revision: 1748969

URL: http://svn.apache.org/viewvc?rev=1748969&view=rev
Log:
[OFBIZ-6940] Thanks Vishal Chhabria for your contribution and Jacopo for review.
New ProductPriceType 'SHIPPING_ALLOWANCE' and a new minimumPrice field in ProductStoreShipmentMeth entity.
========================================
New price type "SHIPPING_ALLOWANCE" can be used in the scenarios where default/list prices are comprehensive of the 'Shipping Cost' quota, this price type can help user to set the Shipping Allowance cost he has included in the the product's default/list price and then modify actual shipping cost by reducing the allowance cost from it.
minimumPrice field can be used to set the the lowest rate for a particular shipping type.

Modified:
    ofbiz/trunk/applications/datamodel/entitydef/product-entitymodel.xml
    ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/shipping/ShippingEstimateWrapper.java
    ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/shipping/ShippingEvents.java
    ofbiz/trunk/applications/product/data/ProductTypeData.xml

Modified: ofbiz/trunk/applications/datamodel/entitydef/product-entitymodel.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/datamodel/entitydef/product-entitymodel.xml?rev=1748969&r1=1748968&r2=1748969&view=diff
==============================================================================
--- ofbiz/trunk/applications/datamodel/entitydef/product-entitymodel.xml (original)
+++ ofbiz/trunk/applications/datamodel/entitydef/product-entitymodel.xml Sat Jun 18 12:08:06 2016
@@ -4225,6 +4225,9 @@ under the License.
       <field name="shipmentCustomMethodId" type="id"></field>
       <field name="shipmentGatewayConfigId" type="id"></field>
       <field name="sequenceNumber" type="numeric"></field>
+      <field name="allowancePercent" type="fixed-point"></field>
+      <field name="minimumPrice" type="currency-amount"></field>
+
       <prim-key field="productStoreShipMethId"/>
       <relation type="one-nofk" rel-entity-name="Party">
         <key-map field-name="companyPartyId" rel-field-name="partyId"/>

Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/shipping/ShippingEstimateWrapper.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/shipping/ShippingEstimateWrapper.java?rev=1748969&r1=1748968&r2=1748969&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/shipping/ShippingEstimateWrapper.java (original)
+++ ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/shipping/ShippingEstimateWrapper.java Sat Jun 18 12:08:06 2016
@@ -24,9 +24,13 @@ import java.util.List;
 import java.util.Map;
 
 import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.util.EntityQuery;
 import org.ofbiz.order.shoppingcart.ShoppingCart;
+import org.ofbiz.order.shoppingcart.ShoppingCartItem;
 import org.ofbiz.product.store.ProductStoreWorker;
 import org.ofbiz.service.LocalDispatcher;
 import org.ofbiz.service.ServiceUtil;
@@ -71,8 +75,21 @@ public class ShippingEstimateWrapper {
         this.partyId = cart.getPartyId();
         this.supplierPartyId = cart.getSupplierPartyId(shipGroup);
 
+        BigDecimal totalAllowance = BigDecimal.ZERO;
+        if (UtilValidate.isNotEmpty(cart.getShipGroupItems(shipGroup))) {
+            try {
+                for (ShoppingCartItem item : cart.getShipGroupItems(shipGroup).keySet()) {
+                    GenericValue allowanceProductPrice = EntityQuery.use(delegator).from("ProductPrice").where("productPriceTypeId", "SHIPPING_ALLOWANCE", "productId", item.getProductId()).filterByDate().queryFirst();
+                    if (UtilValidate.isNotEmpty(allowanceProductPrice) && UtilValidate.isNotEmpty(allowanceProductPrice.get("price"))) {
+                        totalAllowance = totalAllowance.add(allowanceProductPrice.getBigDecimal("price")).multiply(item.getQuantity());
+                    }
+                }
+            } catch (GenericEntityException gee) {
+                Debug.logError(gee.getMessage(), module);
+            }
+        }
         this.loadShippingMethods();
-        this.loadEstimates();
+        this.loadEstimates(totalAllowance);
     }
 
     protected void loadShippingMethods() {
@@ -84,7 +101,7 @@ public class ShippingEstimateWrapper {
         }
     }
 
-    protected void loadEstimates() {
+    protected void loadEstimates(BigDecimal totalAllowance) {
         this.shippingEstimates = new HashMap<GenericValue, BigDecimal>();
         if (shippingMethods != null) {
             for (GenericValue shipMethod : shippingMethods) {
@@ -96,7 +113,7 @@ public class ShippingEstimateWrapper {
 
                 Map<String, Object> estimateMap = ShippingEvents.getShipGroupEstimate(dispatcher, delegator, "SALES_ORDER",
                         shippingMethodTypeId, carrierPartyId, carrierRoleTypeId, shippingCmId, productStoreId,
-                        supplierPartyId, shippableItemInfo, shippableWeight, shippableQuantity, shippableTotal, partyId, productStoreShipMethId);
+                        supplierPartyId, shippableItemInfo, shippableWeight, shippableQuantity, shippableTotal, partyId, productStoreShipMethId, totalAllowance);
 
                 if (!ServiceUtil.isError(estimateMap)) {
                     BigDecimal shippingTotal = (BigDecimal) estimateMap.get("shippingTotal");

Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/shipping/ShippingEvents.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/shipping/ShippingEvents.java?rev=1748969&r1=1748968&r2=1748969&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/shipping/ShippingEvents.java (original)
+++ ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/shipping/ShippingEvents.java Sat Jun 18 12:08:06 2016
@@ -146,6 +146,16 @@ public class ShippingEvents {
             String shipmentMethodTypeId, String carrierPartyId, String carrierRoleTypeId, String shippingContactMechId,
             String productStoreId, String supplierPartyId, List<Map<String, Object>> itemInfo, BigDecimal shippableWeight, BigDecimal shippableQuantity,
             BigDecimal shippableTotal, String partyId, String productStoreShipMethId) {
+        return getShipGroupEstimate(dispatcher, delegator, orderTypeId,
+                shipmentMethodTypeId, carrierPartyId, carrierRoleTypeId, shippingContactMechId,
+                productStoreId, supplierPartyId, itemInfo, shippableWeight, shippableQuantity,
+                shippableTotal, partyId, productStoreShipMethId, BigDecimal.ZERO);
+    }
+
+    public static Map<String, Object> getShipGroupEstimate(LocalDispatcher dispatcher, Delegator delegator, String orderTypeId,
+            String shipmentMethodTypeId, String carrierPartyId, String carrierRoleTypeId, String shippingContactMechId,
+            String productStoreId, String supplierPartyId, List<Map<String, Object>> itemInfo, BigDecimal shippableWeight, BigDecimal shippableQuantity,
+            BigDecimal shippableTotal, String partyId, String productStoreShipMethId, BigDecimal totalAllowance) {
         String standardMessage = "A problem occurred calculating shipping. Fees will be calculated offline.";
         List<String> errorMessageList = new LinkedList<String>();
 
@@ -248,6 +258,21 @@ public class ShippingEvents {
             return ServiceUtil.returnError(standardMessage);
         }
 
+        // Calculate the allowance price(Already included in Product's default/list price)
+        // using shippingAllowance percent and deduct it from Actual Shipping Cost.
+        if (BigDecimal.ZERO.compareTo(shippingTotal) < 0 && BigDecimal.ZERO.compareTo(totalAllowance) < 0) {
+            BigDecimal shippingAllowancePercent = storeShipMethod.getBigDecimal("allowancePercent") != null ? storeShipMethod.getBigDecimal("allowancePercent") : BigDecimal.ZERO;
+            totalAllowance = totalAllowance.multiply(shippingAllowancePercent.divide(BigDecimal.valueOf(100)));
+            shippingTotal = shippingTotal.subtract(totalAllowance);
+        }
+
+        // Check if minimum price is set for any Shipping Option, if yes, 
+        // compare it with total shipping and use greater of the two.
+        BigDecimal minimumPrice = storeShipMethod.getBigDecimal("minimumPrice");
+        if (UtilValidate.isNotEmpty(minimumPrice) && shippingTotal.compareTo(minimumPrice) < 0){
+             shippingTotal = minimumPrice;
+        }
+
         // return the totals
         Map<String, Object> responseResult = ServiceUtil.returnSuccess();
         responseResult.put("shippingTotal", shippingTotal);

Modified: ofbiz/trunk/applications/product/data/ProductTypeData.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/data/ProductTypeData.xml?rev=1748969&r1=1748968&r2=1748969&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/data/ProductTypeData.xml (original)
+++ ofbiz/trunk/applications/product/data/ProductTypeData.xml Sat Jun 18 12:08:06 2016
@@ -466,6 +466,7 @@ under the License.
     <ProductPriceType description="Special Promo Price" productPriceTypeId="SPECIAL_PROMO_PRICE"/>
     <ProductPriceType description="Box Price" productPriceTypeId="BOX_PRICE"/>
     <ProductPriceType description="Minimum Order Price" productPriceTypeId="MINIMUM_ORDER_PRICE"/>
+    <ProductPriceType description="Shipping Allowance Price" productPriceTypeId="SHIPPING_ALLOWANCE"/>
 
     <ProductPricePurpose description="Purchase/Initial" productPricePurposeId="PURCHASE"/>
     <ProductPricePurpose description="Recurring Charge" productPricePurposeId="RECURRING_CHARGE"/>