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); }