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"/>


Reply via email to