/******************************************************************************* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. *******************************************************************************/ package org.apache.ofbiz.shipment.weightPackage; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.apache.ofbiz.base.util.GeneralException; import org.apache.ofbiz.base.util.UtilProperties; import org.apache.ofbiz.base.util.UtilValidate; import org.apache.ofbiz.entity.Delegator; import org.apache.ofbiz.entity.GenericValue; import org.apache.ofbiz.entity.util.EntityQuery; import org.apache.ofbiz.entity.util.EntityUtilProperties; import org.apache.ofbiz.service.DispatchContext; import org.apache.ofbiz.service.ServiceUtil; public class WeightPackageServices { private static BigDecimal ZERO = BigDecimal.ZERO; public static Map<String, Object> setPackageInfo(DispatchContext dctx, Map<String, ? extends Object> context) { Delegator delegator = dctx.getDelegator(); WeightPackageSession weightPackageSession = (WeightPackageSession) context.get("weightPackageSession"); Locale locale = (Locale) context.get("locale"); String orderId = (String) context.get("orderId"); BigDecimal packageWeight = (BigDecimal) context.get("packageWeight"); BigDecimal packageLength = (BigDecimal) context.get("packageLength"); BigDecimal packageWidth = (BigDecimal) context.get("packageWidth"); BigDecimal packageHeight = (BigDecimal) context.get("packageHeight"); String shipmentBoxTypeId = (String) context.get("shipmentBoxTypeId"); // User can either enter all the dimensions or shipment box type, but not both if (UtilValidate.isNotEmpty(packageLength) || UtilValidate.isNotEmpty(packageWidth) || UtilValidate.isNotEmpty(packageHeight)) { // Check if user entered any dimensions if (UtilValidate.isNotEmpty(shipmentBoxTypeId)) { // check also if user entered shipment box type return ServiceUtil.returnError(UtilProperties.getMessage("ProductErrorUiLabels", "ProductErrorEnteredBothDimensionAndPackageInputBoxField", locale)); } else if (!(UtilValidate.isNotEmpty(packageLength) && UtilValidate.isNotEmpty(packageWidth) && UtilValidate.isNotEmpty(packageHeight))) { // check if user does not enter all the dimensions return ServiceUtil.returnError(UtilProperties.getMessage("ProductErrorUiLabels", "ProductErrorNotEnteredAllFieldsInDimension", locale)); } } // Check package weight, it must be greater than ZERO if (UtilValidate.isEmpty(packageWeight) || packageWeight.compareTo(ZERO) <= 0) { return ServiceUtil.returnError(UtilProperties.getMessage("ProductErrorUiLabels", "ProductErrorPackageWeightCannotBeNullOrZero", locale)); } try { // Checked no of packages, it should not be greater than ordered quantity List<GenericValue> orderItems = EntityQuery.use(delegator).from("OrderItem").where("orderId", orderId, "statusId", "ITEM_APPROVED").queryList(); BigDecimal orderedItemQty = ZERO; for (GenericValue orderItem : orderItems) { orderedItemQty = orderedItemQty.add(orderItem.getBigDecimal("quantity")); } int packageQuantity = weightPackageSession.getPackedLines(orderId).size(); if ((orderedItemQty.intValue() - packageQuantity) > 0) { weightPackageSession.createWeightPackageLine(orderId, packageWeight, packageLength, packageWidth, packageHeight, shipmentBoxTypeId); } else { return ServiceUtil.returnError(UtilProperties.getMessage("ProductErrorUiLabels", "ProductErrorNumberOfPackageCannotBeGreaterThanTheNumberOfOrderedQuantity", locale)); } } catch (GeneralException e) { return ServiceUtil.returnError(e.getMessage()); } return ServiceUtil.returnSuccess(); } public static Map<String, Object> updatePackedLine(DispatchContext dctx, Map<String, ? extends Object> context) { WeightPackageSession weightPackageSession = (WeightPackageSession) context.get("weightPackageSession"); Locale locale = (Locale) context.get("locale"); BigDecimal packageWeight = (BigDecimal) context.get("packageWeight"); BigDecimal packageLength = (BigDecimal) context.get("packageLength"); BigDecimal packageWidth = (BigDecimal) context.get("packageWidth"); BigDecimal packageHeight = (BigDecimal) context.get("packageHeight"); String shipmentBoxTypeId = (String) context.get("shipmentBoxTypeId"); Integer weightPackageSeqId = (Integer) context.get("weightPackageSeqId"); // User can either enter all the dimensions or shipment box type, but not both if (UtilValidate.isNotEmpty(packageLength) || UtilValidate.isNotEmpty(packageWidth) || UtilValidate.isNotEmpty(packageHeight)) { // Check if user entered any dimensions if (UtilValidate.isNotEmpty(shipmentBoxTypeId)) { // check also if user entered shipment box type weightPackageSession.setDimensionAndShipmentBoxType(weightPackageSeqId); return ServiceUtil.returnError(UtilProperties.getMessage("ProductErrorUiLabels", "ProductErrorEnteredBothDimensionAndPackageInputBoxField", locale)); } else if (!(UtilValidate.isNotEmpty(packageLength) && UtilValidate.isNotEmpty(packageWidth) && UtilValidate.isNotEmpty(packageHeight))) { // check if user does not enter all the dimensions weightPackageSession.setDimensionAndShipmentBoxType(weightPackageSeqId); return ServiceUtil.returnError(UtilProperties.getMessage("ProductErrorUiLabels", "ProductErrorNotEnteredAllFieldsInDimension", locale)); } } // Check package weight, it must be greater than ZERO if (UtilValidate.isEmpty(packageWeight) || packageWeight.compareTo(ZERO) <= 0) { return ServiceUtil.returnError(UtilProperties.getMessage("ProductErrorUiLabels", "ProductErrorPackageWeightCannotBeNullOrZero", locale)); } weightPackageSession.setPackageWeight(packageWeight, weightPackageSeqId); weightPackageSession.setPackageLength(packageLength, weightPackageSeqId); weightPackageSession.setPackageWidth(packageWidth, weightPackageSeqId); weightPackageSession.setPackageHeight(packageHeight, weightPackageSeqId); weightPackageSession.setShipmentBoxTypeId(shipmentBoxTypeId, weightPackageSeqId); return ServiceUtil.returnSuccess(); } public static Map<String, Object> deletePackedLine(DispatchContext dctx, Map<String, ? extends Object> context) { WeightPackageSession weightPackageSession = (WeightPackageSession) context.get("weightPackageSession"); Integer weightPackageSeqId = (Integer) context.get("weightPackageSeqId"); weightPackageSession.deletePackedLine(weightPackageSeqId); return ServiceUtil.returnSuccess(); } public static Map<String, Object> completePackage(DispatchContext dctx, Map<String, ? extends Object> context) { WeightPackageSession weightPackageSession = (WeightPackageSession) context.get("weightPackageSession"); Locale locale = (Locale) context.get("locale"); Delegator delegator = dctx.getDelegator(); String orderId = (String) context.get("orderId"); String shipmentId = (String) context.get("shipmentId"); String invoiceId = (String) context.get("invoiceId"); String dimensionUomId = (String) context.get("dimensionUomId"); String weightUomId = (String) context.get("weightUomId"); BigDecimal estimatedShippingCost = (BigDecimal) context.get("estimatedShippingCost"); BigDecimal newEstimatedShippingCost = (BigDecimal) context.get("newEstimatedShippingCost"); if (UtilValidate.isEmpty(newEstimatedShippingCost)) { newEstimatedShippingCost = ZERO; } weightPackageSession.setDimensionUomId(dimensionUomId); weightPackageSession.setWeightUomId(weightUomId); weightPackageSession.setShipmentId(shipmentId); weightPackageSession.setInvoiceId(invoiceId); weightPackageSession.setEstimatedShipCost(estimatedShippingCost); weightPackageSession.setActualShipCost(newEstimatedShippingCost); Map<String, Object> response = new HashMap<String, Object>(); try { String getActualShippingQuoteFromUps = EntityUtilProperties.getPropertyValue("shipment", "shipment.ups.shipping", "N", delegator); String result = weightPackageSession.complete(orderId, locale, getActualShippingQuoteFromUps); if ("showWarningForm".equals(result)) { response.put("showWarningForm", true); } else if ("success".equals(result)) { response.put("shipmentId", shipmentId); } else { response = ServiceUtil.returnError(UtilProperties.getMessage("ProductErrorUiLabels", "ProductErrorNoItemsCurrentlySetToBeShippedCannotComplete", locale)); } } catch (GeneralException e) { return ServiceUtil.returnError(e.getMessage(), e.getMessageList()); } return response; } public static Map<String, Object> completeShipment(DispatchContext dctx, Map<String, ? extends Object> context) { Locale locale = (Locale) context.get("locale"); Delegator delegator = dctx.getDelegator(); WeightPackageSession weightPackageSession = (WeightPackageSession) context.get("weightPackageSession"); String shipmentId = (String) context.get("shipmentId"); String orderId = (String) context.get("orderId"); Map<String, Object> response = new HashMap<String, Object>(); try { String getActualShippingQuoteFromUps = EntityUtilProperties.getPropertyValue("shipment", "shipment.ups.shipping", "N", delegator); if (weightPackageSession.completeShipment(orderId, getActualShippingQuoteFromUps)) { response.put("shipmentId", shipmentId); } else { response = ServiceUtil.returnError(UtilProperties.getMessage("ProductErrorUiLabels", "ProductErrorNoItemsCurrentlySetToBeShippedCannotComplete", locale)); } } catch (GeneralException e) { return ServiceUtil.returnError(e.getMessage(), e.getMessageList()); } return response; } public static Map<String, Object> savePackagesInfo(DispatchContext dctx, Map<String, ? extends Object> context) { Locale locale = (Locale) context.get("locale"); Delegator delegator = dctx.getDelegator(); WeightPackageSession weightPackageSession = (WeightPackageSession) context.get("weightPackageSession"); String orderId = (String) context.get("orderId"); String getActualShippingQuoteFromUps = EntityUtilProperties.getPropertyValue("shipment", "shipment.ups.shipping", "N", delegator); try { weightPackageSession.savePackagesInfo(orderId, getActualShippingQuoteFromUps); } catch (GeneralException e) { return ServiceUtil.returnError(e.getMessage()); } return ServiceUtil.returnSuccess(UtilProperties.getMessage("ProductUiLabels", "FacilityThereIsProblemOccurredInPaymentCapture", locale)); } }