svn commit: r495725 - /ofbiz/trunk/applications/product/src/org/ofbiz/shipment/thirdparty/usps/UspsServices.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r495725 - /ofbiz/trunk/applications/product/src/org/ofbiz/shipment/thirdparty/usps/UspsServices.java

jleroux@apache.org
Author: jleroux
Date: Fri Jan 12 12:30:31 2007
New Revision: 495725

URL: http://svn.apache.org/viewvc?view=rev&rev=495725
Log:
A patch from Daniel Kunkel "USPS Rate Estimation" (https://issues.apache.org/jira/browse/OFBIZ-270)

Modified:
    ofbiz/trunk/applications/product/src/org/ofbiz/shipment/thirdparty/usps/UspsServices.java

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/shipment/thirdparty/usps/UspsServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/shipment/thirdparty/usps/UspsServices.java?view=diff&rev=495725&r1=495724&r2=495725
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/shipment/thirdparty/usps/UspsServices.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/shipment/thirdparty/usps/UspsServices.java Fri Jan 12 12:30:31 2007
@@ -142,12 +142,12 @@
         }
 
         List shippableItemInfo = (List) context.get("shippableItemInfo");
-        List packages = getPackageSplit(shippableItemInfo, maxWeight);
+        List packages = getPackageSplit(dctx, shippableItemInfo, maxWeight);
         // TODO: Up to 25 packages can be included per request - handle more than 25
         for (ListIterator li = packages.listIterator(); li.hasNext();) {
             Map packageMap = (Map) li.next();
 
-            double packageWeight = calcPackageWeight(packageMap, shippableItemInfo, 0);
+            double packageWeight = calcPackageWeight(dctx, packageMap, shippableItemInfo, 0);
             if (packageWeight == 0) {
                 continue;
             }
@@ -160,10 +160,10 @@
             UtilXml.addChildElementValue(packageElement, "ZipDestination", destinationZip, requestDocument);
 
             double weightPounds = Math.floor(packageWeight);
-            UtilXml.addChildElementValue(packageElement, "Pounds", String.valueOf(weightPounds), requestDocument);
-
-            double weightOunces = Math.ceil(packageWeight % weightPounds * 16);
-            UtilXml.addChildElementValue(packageElement, "Ounces", String.valueOf(weightOunces), requestDocument);
+            double weightOunces = Math.ceil(packageWeight * 16 % 16);
+            DecimalFormat df = new DecimalFormat("#");
+            UtilXml.addChildElementValue(packageElement, "Pounds", df.format(weightPounds), requestDocument);
+            UtilXml.addChildElementValue(packageElement, "Ounces", df.format(weightOunces), requestDocument);
 
             // TODO: handle other container types, package sizes, and machinabile packages
             UtilXml.addChildElementValue(packageElement, "Container", "None", requestDocument);
@@ -201,8 +201,7 @@
         return result;
     }
 
-    // lifted from UpsServices with no changes - 2004.09.06 JFE
-    private static List getPackageSplit(List shippableItemInfo, double maxWeight) {
+    private static List getPackageSplit(DispatchContext dctx, List shippableItemInfo, double maxWeight) {
         // create the package list w/ the first pacakge
         List packages = new LinkedList();
 
@@ -240,7 +239,7 @@
                             for (int pi = 0; pi < packageSize; pi++) {
                                 if (!addedToPackage) {
                                     Map packageMap = (Map) packages.get(pi);
-                                    double packageWeight = calcPackageWeight(packageMap, shippableItemInfo, weight);
+                                    double packageWeight = calcPackageWeight(dctx, packageMap, shippableItemInfo, weight);
                                     if (packageWeight <= maxWeight) {
                                         Double qtyD = (Double) packageMap.get(productId);
                                         double qty = qtyD == null ? 0 : qtyD.doubleValue();
@@ -262,8 +261,9 @@
         return packages;
     }
 
-    // lifted from UpsServices with no changes - 2004.09.06 JFE
-    private static double calcPackageWeight(Map packageMap, List shippableItemInfo, double additionalWeight) {
+    private static double calcPackageWeight(DispatchContext dctx, Map packageMap, List shippableItemInfo, double additionalWeight) {
+
+        LocalDispatcher dispatcher = dctx.getDispatcher();
         double totalWeight = 0.00;
         Iterator i = packageMap.keySet().iterator();
         while (i.hasNext()) {
@@ -271,8 +271,36 @@
             Map productInfo = getProductItemInfo(shippableItemInfo, productId);
             double productWeight = ((Double) productInfo.get("weight")).doubleValue();
             double quantity = ((Double) packageMap.get(productId)).doubleValue();
+
+            // DLK - I'm not sure if this line is working. shipment_package seems to leave this value null so???
+            String weightUomId = (String) productInfo.get("weight_uom_id");
+
+            Debug.logInfo("Product Id : " + productId.toString() + " Product Weight : " + String.valueOf(productWeight) + " Product UomId : " + weightUomId + " assuming WT_oz if null. Quantity : " + String.valueOf(quantity), module);
+
+            if (UtilValidate.isEmpty(weightUomId)) {
+                weightUomId = "WT_oz"; // assume weight is in pounds
+                //  Most shipping modules assume pounds while ProductEvents.java assumes WT_oz. - Line 720 for example.
+            }
+            if (!"WT_lb".equals(weightUomId)) {
+                // attempt a conversion to pounds
+                Map result = new HashMap();
+                try {
+                    result = dispatcher.runSync("convertUom", UtilMisc.toMap("uomId", weightUomId, "uomIdTo", "WT_lb", "originalValue", new Double(productWeight)));
+                } catch (GenericServiceException ex) {
+                    Debug.logError(ex, module);
+                }
+                    
+                if (result.get(ModelService.RESPONSE_MESSAGE).equals(ModelService.RESPOND_SUCCESS)) {
+                    productWeight *= ((Double) result.get("convertedValue")).doubleValue();
+                } else {
+                    Debug.logError("Unsupported weightUom [" + weightUomId + "] for calcPackageWeight running productId " + productId + ", could not find a conversion factor to WT_lb",module);
+                }
+                    
+            }
+
             totalWeight += (productWeight * quantity);
         }
+        Debug.logInfo("Package Weight : " + String.valueOf(totalWeight) + " lbs.", module);
         return totalWeight + additionalWeight;
     }
 
@@ -868,7 +896,7 @@
                 }
 
                 double weightPounds = Math.floor(weight);
-                double weightOunces = Math.ceil(weight % weightPounds * 16);
+                double weightOunces = Math.ceil(weight * 16 % 16);
 
                 DecimalFormat df = new DecimalFormat("#");
                 UtilXml.addChildElementValue(packageElement, "Pounds", df.format(weightPounds), requestDocument);
@@ -1292,7 +1320,7 @@
 
         String responseString = null;
         try {
-            responseString = http.post();
+            responseString = http.get();
         } catch (HttpClientException e) {
             throw new UspsRequestException("Problem connecting with USPS server", e);
         }