Author: diveshdutta
Date: Sat Jun 20 14:58:45 2015
New Revision: 1686635

URL: http://svn.apache.org/r1686635
Log:
[OFBIZ-5347] 1) Fixed issue: Shipping costs not recalculated after changing 
sales order shipment method. For this introduced new service as per the design 
in this task. 2) This service will loads the cart save new shipping method in 
cart, re-do all the calculations for tax and promotion, and saves the cart 
again in order. 3) Also adding new SECA rule which will trigger resetGrandTotal 
service on new service updateShipGroupShipInfo. 

Modified:
    ofbiz/trunk/applications/order/servicedef/secas.xml
    ofbiz/trunk/applications/order/servicedef/services.xml
    
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java
    ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java
    
ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy
    ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/controller.xml
    ofbiz/trunk/applications/order/webapp/ordermgr/order/ordershippinginfo.ftl

Modified: ofbiz/trunk/applications/order/servicedef/secas.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/servicedef/secas.xml?rev=1686635&r1=1686634&r2=1686635&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/servicedef/secas.xml (original)
+++ ofbiz/trunk/applications/order/servicedef/secas.xml Sat Jun 20 14:58:45 2015
@@ -451,4 +451,7 @@ under the License.
         <condition field-name="orderTypeId" operator="equals" 
value="SALES_ORDER"/>
         <action service="checkOrderItemForProductGroupOrder" mode="sync"/>
     </eca>
+    <eca service="updateShipGroupShipInfo" event="commit">
+        <action service="resetGrandTotal" mode="sync"/>
+    </eca>
 </service-eca>

Modified: ofbiz/trunk/applications/order/servicedef/services.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/servicedef/services.xml?rev=1686635&r1=1686634&r2=1686635&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/servicedef/services.xml (original)
+++ ofbiz/trunk/applications/order/servicedef/services.xml Sat Jun 20 14:58:45 
2015
@@ -1187,4 +1187,12 @@ under the License.
         <attribute name="quantity" type="BigDecimal" mode="IN"/>
     </service>
     
+    <service name="updateShipGroupShipInfo" engine="java" 
location="org.ofbiz.order.order.OrderServices" invoke="updateShipGroupShipInfo" 
auth="true">
+            <description>Update Shipping Information on Order 
View</description>
+         <attribute name="contactMechId" type="String" mode="IN" 
optional="false"/>
+         <attribute name="orderId" type="String" mode="IN" optional="true"/>
+         <attribute name="oldContactMechId" type="String" mode="IN" 
optional="true"/>
+         <attribute name="shipGroupSeqId" type="String" mode="IN" 
optional="true"/>
+         <attribute name="shipmentMethod" type="String" mode="IN" 
optional="true"/>
+    </service>
 </services>

Modified: 
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java?rev=1686635&r1=1686634&r2=1686635&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java 
(original)
+++ 
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java 
Sat Jun 20 14:58:45 2015
@@ -33,6 +33,8 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
+import javolution.util.FastList;
+
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilDateTime;
 import org.ofbiz.base.util.UtilFormatOut;
@@ -3012,4 +3014,17 @@ public class OrderReadHelper {
         }
     }
 
+    public List<BigDecimal> getShippableSizes(String shipGrouSeqId) {
+        List<BigDecimal> shippableSizes = FastList.newInstance();
+
+        List<GenericValue> validItems = getValidOrderItems(shipGrouSeqId);
+        if (validItems != null) {
+            Iterator<GenericValue> i = validItems.iterator();
+            while (i.hasNext()) {
+                GenericValue item = i.next();
+                shippableSizes.add(this.getItemSize(item));
+            }
+        }
+        return shippableSizes;
+    }
 }

Modified: 
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java?rev=1686635&r1=1686634&r2=1686635&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java 
(original)
+++ ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java 
Sat Jun 20 14:58:45 2015
@@ -6371,4 +6371,110 @@ public class OrderServices {
 
         return ServiceUtil.returnSuccess();
     }
+
+    /**
+     * This service runs when you update shipping method of Order from order 
view page.
+     */
+    public static Map<String, Object> updateShipGroupShipInfo(DispatchContext 
dctx, Map<String, ? extends Object> context) {
+        LocalDispatcher dispatcher = dctx.getDispatcher();
+        Delegator delegator = dctx.getDelegator();
+        Locale locale = (Locale) context.get("locale");
+        GenericValue userLogin  = (GenericValue)context.get("userLogin");
+        String orderId = (String)context.get("orderId");
+        String shipGroupSeqId = (String)context.get("shipGroupSeqId");
+        String contactMechId = (String)context.get("contactMechId");
+        String oldContactMechId = (String)context.get("oldContactMechId");
+        String shipmentMethod = (String)context.get("shipmentMethod");
+
+        //load cart from order to update new shipping method or address
+        ShoppingCart shoppingCart = null;
+        try {
+            shoppingCart = loadCartForUpdate(dispatcher, delegator, userLogin, 
orderId);
+        } catch(GeneralException e) {
+            Debug.logError(e, module);
+        }
+
+        String message = null;
+        if (UtilValidate.isNotEmpty(shipGroupSeqId)) {
+            OrderReadHelper orh = new OrderReadHelper(delegator, orderId);
+            List<GenericValue> shippingMethods = null;
+            String shipmentMethodTypeId = null;
+            String carrierPartyId = null;
+
+            // get shipment method from OrderItemShipGroup, if not available 
in parameters
+            if (UtilValidate.isNotEmpty(shipmentMethod)) {
+                String[] arr = shipmentMethod.split( "@" );
+                shipmentMethodTypeId = arr[0];
+                carrierPartyId = arr[1];
+            } else {
+                GenericValue orderItemshipGroup = 
orh.getOrderItemShipGroup(shipGroupSeqId);
+                shipmentMethodTypeId = 
orderItemshipGroup.getString("shipmentMethodTypeId");
+                carrierPartyId = 
orderItemshipGroup.getString("carrierPartyId");
+            }
+            int groupIdx =Integer.parseInt(shipGroupSeqId);
+
+            /* check whether new selected contact address is same as old 
contact.
+               If contact address is different, get applicable ship methods 
for changed contact */
+            if (UtilValidate.isNotEmpty(oldContactMechId) && 
oldContactMechId.equals(contactMechId)) {
+                shoppingCart.setShipmentMethodTypeId(groupIdx - 1, 
shipmentMethodTypeId);
+                shoppingCart.setCarrierPartyId(groupIdx - 1, carrierPartyId);
+            } else {
+                Map<String, BigDecimal> shippableItemFeatures = 
orh.getFeatureIdQtyMap(shipGroupSeqId);
+                BigDecimal shippableTotal = 
orh.getShippableTotal(shipGroupSeqId);
+                BigDecimal shippableWeight = 
orh.getShippableWeight(shipGroupSeqId);
+                List<BigDecimal> shippableItemSizes = 
orh.getShippableSizes(shipGroupSeqId);
+
+                GenericValue shippingAddress = null;
+                if(UtilValidate.isEmpty(shippingAddress)) {
+                    shippingAddress = orh.getShippingAddress(shipGroupSeqId);
+                }
+
+                shippingMethods = 
ProductStoreWorker.getAvailableStoreShippingMethods(delegator, 
orh.getProductStoreId(),
+                        shippingAddress, shippableItemSizes, 
shippableItemFeatures, shippableWeight, shippableTotal);
+
+                boolean isShippingMethodAvailable = false;
+                // search shipping method for ship group is applicable to new 
address or not.
+                for (GenericValue shippingMethod : shippingMethods) {
+                    isShippingMethodAvailable = 
shippingMethod.getString("partyId").equals(carrierPartyId) && 
shippingMethod.getString("shipmentMethodTypeId").equals(shipmentMethodTypeId);
+                    if (isShippingMethodAvailable) {
+                        shoppingCart.setShipmentMethodTypeId(groupIdx - 1, 
shipmentMethodTypeId);
+                        shoppingCart.setCarrierPartyId(groupIdx - 1, 
carrierPartyId);
+                        break;
+                    }
+                }
+
+                // set first shipping method from list, if shipping method for 
ship group is not applicable to new ship address.
+                if(!isShippingMethodAvailable) {
+                    shoppingCart.setShipmentMethodTypeId(groupIdx - 1, 
shippingMethods.get(0).getString("shipmentMethodTypeId"));
+                    shoppingCart.setCarrierPartyId(groupIdx - 1, 
shippingMethods.get(0).getString("carrierPartyId"));
+
+                    String newShipMethTypeDesc =null;
+                    String shipMethTypeDesc=null;
+                    try {
+                        shipMethTypeDesc = 
delegator.findOne("ShipmentMethodType", UtilMisc.toMap("shipmentMethodTypeId", 
shipmentMethodTypeId), false).getString("description");
+                        newShipMethTypeDesc = 
delegator.findOne("ShipmentMethodType", UtilMisc.toMap("shipmentMethodTypeId", 
shippingMethods.get(0).getString("shipmentMethodTypeId")), 
false).getString("description");
+                    } catch(GenericEntityException e) {
+                        Debug.logError(e, module);
+                    }
+                    // message to notify user for not applicability of 
shipping method
+                    message= "Shipping Method "+carrierPartyId+" 
"+shipMethTypeDesc+" is not applicable to shipping address. 
"+shippingMethods.get(0).getString("carrierPartyId")+" "+newShipMethTypeDesc+" 
has been set for shipping address.";
+                }
+                shoppingCart.setShippingContactMechId(groupIdx-1, 
contactMechId);
+            }
+        }
+
+        // save cart after updating shipping method and shipping address.
+        Map<String, Object> changeMap = new HashMap<String, Object>();
+        try {
+            saveUpdatedCartToOrder(dispatcher, delegator, shoppingCart, 
locale, userLogin, orderId, changeMap, true, false);
+        } catch(GeneralException e) {
+            Debug.logError(e, module);
+        }
+
+        if (UtilValidate.isNotEmpty(message)) {
+            return ServiceUtil.returnSuccess(message);
+        } else {
+            return ServiceUtil.returnSuccess();
+        }
+    }
 }

Modified: 
ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy?rev=1686635&r1=1686634&r2=1686635&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy
 (original)
+++ 
ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy
 Sat Jun 20 14:58:45 2015
@@ -29,6 +29,7 @@ import org.ofbiz.order.order.*;
 import org.ofbiz.party.contact.*;
 import org.ofbiz.product.inventory.InventoryWorker;
 import org.ofbiz.product.catalog.CatalogWorker;
+import org.ofbiz.product.store.ProductStoreWorker;
 import org.ofbiz.accounting.payment.*;
 
 orderId = parameters.orderId;
@@ -420,8 +421,19 @@ if (orderHeader) {
     context.shippingContactMechList = shippingContactMechList;
 
     // list to find all the shipmentMethods from the view named 
"ProductStoreShipmentMethView".
-    if (productStore) {
-        context.productStoreShipmentMethList = 
from("ProductStoreShipmentMethView").where("productStoreId", 
productStore.productStoreId).orderBy("sequenceNumber").cache(true).queryList();
+    shipGroupShippingMethods = [:];
+    shipGroups.each { shipGroup ->
+        shipGroupSeqId = shipGroup.shipGroupSeqId;
+        shippableItemFeatures = 
orderReadHelper.getFeatureIdQtyMap(shipGroupSeqId);
+        shippableTotal = orderReadHelper.getShippableTotal(shipGroupSeqId);
+        shippableWeight = orderReadHelper.getShippableWeight(shipGroupSeqId);
+        shippableItemSizes = orderReadHelper.getShippableSizes(shipGroupSeqId);
+        shippingAddress = orderReadHelper.getShippingAddress(shipGroupSeqId);
+
+        List<GenericValue> productStoreShipmentMethList = 
ProductStoreWorker.getAvailableStoreShippingMethods(delegator, 
orderReadHelper.getProductStoreId(),
+                shippingAddress, shippableItemSizes, shippableItemFeatures, 
shippableWeight, shippableTotal);
+        shipGroupShippingMethods.put(shipGroupSeqId, 
productStoreShipmentMethList);
+        context.shipGroupShippingMethods = shipGroupShippingMethods;
     }
 
     // Get a map of returnable items

Modified: ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/controller.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/controller.xml?rev=1686635&r1=1686634&r2=1686635&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/controller.xml 
(original)
+++ ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/controller.xml Sat 
Jun 20 14:58:45 2015
@@ -1701,7 +1701,7 @@ under the License.
     <request-map uri="addShippingAddress">
         <security https="true" auth="true"/>
         <event type="service" invoke="createUpdateShippingAddress"/>
-        <response name="success" type="request" 
value="updateOrderItemShipGroup"/>
+        <response name="success" type="request" 
value="updateShipGroupShipInfo"/>
         <response name="error" type="view" value="orderview"/>
     </request-map>
     <request-map uri="getAssociatedStateList">
@@ -1888,6 +1888,13 @@ under the License.
         <response name="success" type="view" value="splitship"/>
         <response name="error" type="request" value="splitship"/>
     </request-map>
+    
+    <request-map uri="updateShipGroupShipInfo">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="updateShipGroupShipInfo"/>
+        <response name="success" type="view" value="orderview"/>
+        <response name="error" type="view" value="orderview"/>
+    </request-map>
 
     <!--
         These are just examples of reports developed using JasperReport and 
not really

Modified: 
ofbiz/trunk/applications/order/webapp/ordermgr/order/ordershippinginfo.ftl
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/webapp/ordermgr/order/ordershippinginfo.ftl?rev=1686635&r1=1686634&r2=1686635&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/webapp/ordermgr/order/ordershippinginfo.ftl 
(original)
+++ ofbiz/trunk/applications/order/webapp/ordermgr/order/ordershippinginfo.ftl 
Sat Jun 20 14:58:45 2015
@@ -353,7 +353,7 @@ under the License.
          <br class="clear"/>
       </div>
       <div class="screenlet-body" 
id="ShipGroupScreenletBody_${shipGroup.shipGroupSeqId}">
-          <form name="updateOrderItemShipGroup" method="post" 
action="<@ofbizUrl>updateOrderItemShipGroup</@ofbizUrl>">
+          <form name="updateOrderItemShipGroup" method="post" 
action="<@ofbizUrl>updateShipGroupShipInfo</@ofbizUrl>">
         <input type="hidden" name="orderId" value="${orderId!}"/>
         <input type="hidden" name="shipGroupSeqId" 
value="${shipGroup.shipGroupSeqId!}"/>
         <input type="hidden" name="contactMechPurposeTypeId" 
value="SHIPPING_LOCATION"/>
@@ -404,7 +404,7 @@ under the License.
                                   <#if 
shipGroup.shipmentMethodTypeId?has_content>
                                   <option 
value="${shipGroup.shipmentMethodTypeId}@${shipGroup.carrierPartyId!}@${shipGroup.carrierRoleTypeId!}"><#if
 shipGroup.carrierPartyId?? && shipGroup.carrierPartyId != 
"_NA_">${shipGroup.carrierPartyId!}</#if>&nbsp;${shipmentMethodType.get("description",locale)!}</option>
                                   </#if>
-                                  <#list productStoreShipmentMethList as 
productStoreShipmentMethod>
+                                  <#list 
shipGroupShippingMethods[shipGroup.shipGroupSeqId] as 
productStoreShipmentMethod>
                                     <#assign shipmentMethodTypeAndParty = 
productStoreShipmentMethod.shipmentMethodTypeId + "@" + 
productStoreShipmentMethod.partyId + "@" + 
productStoreShipmentMethod.roleTypeId>
                                     <#if 
productStoreShipmentMethod.partyId?has_content || 
productStoreShipmentMethod?has_content>
                                     <option 
value="${shipmentMethodTypeAndParty!}"><#if productStoreShipmentMethod.partyId 
!= 
"_NA_">${productStoreShipmentMethod.partyId!}</#if>&nbsp;${productStoreShipmentMethod.get("description",locale)?default("")}</option>


Reply via email to