} catch (GenericEntityException e) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ManufacturingPackageConfiguratorError", locale));
}
GenericValue orderShipment = org.ofbiz.entity.util.EntityUtil.getFirst(orderShipments);
if (orderShipment != null && !orderReadHelpers.containsKey(orderShipment.getString("orderId"))) {
orderReadHelpers.put(orderShipment.getString("orderId"), new OrderReadHelper(delegator, orderShipment.getString("orderId")));
}
OrderReadHelper orderReadHelper = (OrderReadHelper)orderReadHelpers.get(orderShipment.getString("orderId"));
if (orderReadHelper != null) {
Map orderShipmentReadMap = UtilMisc.toMap("orderShipment", orderShipment, "orderReadHelper", orderReadHelper);
String partyId = (orderReadHelper.getPlacingParty() != null? orderReadHelper.getPlacingParty().getString("partyId"): null); // FIXME: is it the customer?
if (partyId != null) {
if (!partyOrderShipments.containsKey(partyId)) {
ArrayList orderShipmentReadMapList = new ArrayList();
partyOrderShipments.put(partyId, orderShipmentReadMapList);
}
ArrayList orderShipmentReadMapList = (ArrayList)partyOrderShipments.get(partyId);
orderShipmentReadMapList.add(orderShipmentReadMap);
}
}
}
// For each party: try to expand the shipment item products
// (search for components that needs to be packaged).
Iterator partyOrderShipmentsIt = partyOrderShipments.entrySet().iterator();
while (partyOrderShipmentsIt.hasNext()) {
Map.Entry partyOrderShipment = (Map.Entry)partyOrderShipmentsIt.next();
String partyId = (String)partyOrderShipment.getKey();
List orderShipmentReadMapList = (List)partyOrderShipment.getValue();
for (int i = 0; i < orderShipmentReadMapList.size(); i++) {
Map orderShipmentReadMap = (Map)orderShipmentReadMapList.get(i);
GenericValue orderShipment = (GenericValue)orderShipmentReadMap.get("orderShipment");
OrderReadHelper orderReadHelper = (OrderReadHelper)orderShipmentReadMap.get("orderReadHelper");
GenericValue orderItem = orderReadHelper.getOrderItem(orderShipment.getString("orderItemSeqId"));
// getProductsInPackages
Map serviceContext = new HashMap();
serviceContext.put("productId", orderItem.getString("productId"));
serviceContext.put("quantity", orderShipment.getBigDecimal("quantity"));
Map resultService = null;
try {
resultService = dispatcher.runSync("getProductsInPackages", serviceContext);
} catch (GenericServiceException e) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ManufacturingPackageConfiguratorError", locale));
}
List productsInPackages = (List)resultService.get("productsInPackages");
if (productsInPackages.size() == 1) {
BOMNode root = (BOMNode)productsInPackages.get(0);
String rootProductId = (root.getSubstitutedNode() != null? root.getSubstitutedNode().getProduct().getString("productId"): root.getProduct().getString("productId"));
if (orderItem.getString("productId").equals(rootProductId)) {
productsInPackages = null;
}
}
if (productsInPackages != null && productsInPackages.size() == 0) {
productsInPackages = null;
}
if (UtilValidate.isNotEmpty(productsInPackages)) {
orderShipmentReadMap.put("productsInPackages", productsInPackages);
}
}
}
// Group together products and components
// of the same box type.
HashMap boxTypes = new HashMap();
partyOrderShipmentsIt = partyOrderShipments.entrySet().iterator();
while (partyOrderShipmentsIt.hasNext()) {
HashMap boxTypeContent = new HashMap();
Map.Entry partyOrderShipment = (Map.Entry)partyOrderShipmentsIt.next();
String partyId = (String)partyOrderShipment.getKey();
List orderShipmentReadMapList = (List)partyOrderShipment.getValue();
for (int i = 0; i < orderShipmentReadMapList.size(); i++) {
Map orderShipmentReadMap = (Map)orderShipmentReadMapList.get(i);
GenericValue orderShipment = (GenericValue)orderShipmentReadMap.get("orderShipment");
OrderReadHelper orderReadHelper = (OrderReadHelper)orderShipmentReadMap.get("orderReadHelper");
List productsInPackages = (List)orderShipmentReadMap.get("productsInPackages");
if (productsInPackages != null) {
// there are subcomponents:
// this is a multi package shipment item
for (int j = 0; j < productsInPackages.size(); j++) {
BOMNode component = (BOMNode)productsInPackages.get(j);
HashMap boxTypeContentMap = new HashMap();
boxTypeContentMap.put("content", orderShipmentReadMap);
boxTypeContentMap.put("componentIndex", new Integer(j));
GenericValue product = component.getProduct();
String boxTypeId = product.getString("shipmentBoxTypeId");
if (boxTypeId != null) {
if (!boxTypes.containsKey(boxTypeId)) {
GenericValue boxType = null;
try {
boxType = delegator.findByPrimaryKey("ShipmentBoxType", UtilMisc.toMap("shipmentBoxTypeId", boxTypeId));
} catch (GenericEntityException e) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ManufacturingPackageConfiguratorError", locale));
}
boxTypes.put(boxTypeId, boxType);
boxTypeContent.put(boxTypeId, new ArrayList());
}
GenericValue boxType = (GenericValue)boxTypes.get(boxTypeId);
List boxTypeContentList = (List)boxTypeContent.get(boxTypeId);
boxTypeContentList.add(boxTypeContentMap);
}
}
} else {
// no subcomponents, the product has its own package:
// this is a single package shipment item
HashMap boxTypeContentMap = new HashMap();
boxTypeContentMap.put("content", orderShipmentReadMap);
GenericValue orderItem = orderReadHelper.getOrderItem(orderShipment.getString("orderItemSeqId"));
GenericValue product = null;
try {
product = orderItem.getRelatedOne("Product");
} catch (GenericEntityException e) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ManufacturingPackageConfiguratorError", locale));
}
String boxTypeId = product.getString("shipmentBoxTypeId");
if (boxTypeId != null) {
if (!boxTypes.containsKey(boxTypeId)) {
GenericValue boxType = null;
try {
boxType = delegator.findByPrimaryKey("ShipmentBoxType", UtilMisc.toMap("shipmentBoxTypeId", boxTypeId));
} catch (GenericEntityException e) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ManufacturingPackageConfiguratorError", locale));
}
boxTypes.put(boxTypeId, boxType);
boxTypeContent.put(boxTypeId, new ArrayList());
}
GenericValue boxType = (GenericValue)boxTypes.get(boxTypeId);
List boxTypeContentList = (List)boxTypeContent.get(boxTypeId);
boxTypeContentList.add(boxTypeContentMap);
}
}
}
// The packages and package contents are created.
Iterator boxTypeContentIt = boxTypeContent.entrySet().iterator();
while (boxTypeContentIt.hasNext()) {
Map.Entry boxTypeContentEntry = (Map.Entry)boxTypeContentIt.next();
String boxTypeId = (String)boxTypeContentEntry.getKey();
List contentList = (List)boxTypeContentEntry.getValue();
GenericValue boxType = (GenericValue)boxTypes.get(boxTypeId);
BigDecimal boxWidth = boxType.getBigDecimal("boxLength");
BigDecimal totalWidth = BigDecimal.ZERO;
if (boxWidth == null) {
boxWidth = BigDecimal.ZERO;
}
String shipmentPackageSeqId = null;
for (int i = 0; i < contentList.size(); i++) {
Map contentMap = (Map)contentList.get(i);
Map content = (Map)contentMap.get("content");
OrderReadHelper orderReadHelper = (OrderReadHelper)content.get("orderReadHelper");
List productsInPackages = (List)content.get("productsInPackages");
GenericValue orderShipment = (GenericValue)content.get("orderShipment");
GenericValue product = null;
BigDecimal quantity = BigDecimal.ZERO;
boolean subProduct = contentMap.containsKey("componentIndex");
if (subProduct) {
// multi package
Integer index = (Integer)contentMap.get("componentIndex");
BOMNode component = (BOMNode)productsInPackages.get(index.intValue());
product = component.getProduct();
quantity = component.getQuantity();
} else {
// single package
GenericValue orderItem = orderReadHelper.getOrderItem(orderShipment.getString("orderItemSeqId"));
try {
product = orderItem.getRelatedOne("Product");
} catch (GenericEntityException e) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ManufacturingPackageConfiguratorError", locale));
}