Author: jacopoc
Date: Wed Apr 14 16:12:57 2010 New Revision: 934004 URL: http://svn.apache.org/viewvc?rev=934004&view=rev Log: Fixed bug reported by Giorgio Tomaselli: when the same order item requiring production runs is associated to multiple shipments, in the "work with shipment plans" screen it was not possible to generate the production runs for 2nd, 3rd etc.. shipments. Fixed by adding an optional shipGroupSeqId to the WorkOrderItemFulfillment entity that can be used to specify the key to the specific OrderItemShipGroupAssoc. Modified: ofbiz/trunk/applications/manufacturing/servicedef/services_production_run.xml ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMHelper.java ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMNode.java ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMTree.java ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/WorkWithShipmentPlans.groovy ofbiz/trunk/applications/order/entitydef/entitymodel.xml Modified: ofbiz/trunk/applications/manufacturing/servicedef/services_production_run.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/servicedef/services_production_run.xml?rev=934004&r1=934003&r2=934004&view=diff ============================================================================== --- ofbiz/trunk/applications/manufacturing/servicedef/services_production_run.xml (original) +++ ofbiz/trunk/applications/manufacturing/servicedef/services_production_run.xml Wed Apr 14 16:12:57 2010 @@ -56,6 +56,7 @@ under the License. <description>Explodes a product id and creates all the needed production runs; if an order id is also provided, it links the production runs to the sales order.</description> <attribute mode="IN" name="orderId" optional="false" type="String"/> <attribute mode="IN" name="orderItemSeqId" optional="true" type="String"/> + <attribute mode="IN" name="shipGroupSeqId" optional="true" type="String"/> <attribute mode="IN" name="quantity" optional="true" type="BigDecimal"/> <attribute mode="IN" name="fromDate" optional="true" type="String"/> <attribute mode="IN" name="shipmentId" optional="true" type="String"/> Modified: ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMHelper.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMHelper.java?rev=934004&r1=934003&r2=934004&view=diff ============================================================================== --- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMHelper.java (original) +++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMHelper.java Wed Apr 14 16:12:57 2010 @@ -149,12 +149,12 @@ public class BOMHelper { GenericValue shipmentPlan = (GenericValue)shipmentPlansIt.next(); GenericValue orderItem = shipmentPlan.getRelatedOne("OrderItem"); - List productionRuns = delegator.findByAndCache("WorkOrderItemFulfillment", UtilMisc.toMap("orderId", shipmentPlan.getString("orderId"), "orderItemSeqId", shipmentPlan.getString("orderItemSeqId"))); + List productionRuns = delegator.findByAndCache("WorkOrderItemFulfillment", UtilMisc.toMap("orderId", shipmentPlan.getString("orderId"), "orderItemSeqId", shipmentPlan.getString("orderItemSeqId"), "shipGroupSeqId", shipmentPlan.getString("shipGroupSeqId"))); if (UtilValidate.isNotEmpty(productionRuns)) { Debug.logError("Production Run for order item (" + orderItem.getString("orderId") + "/" + orderItem.getString("orderItemSeqId") + ") not created.", module); continue; } - Map result = dispatcher.runSync("createProductionRunsForOrder", UtilMisc.<String, Object>toMap("quantity", shipmentPlan.getBigDecimal("quantity"), "orderId", shipmentPlan.getString("orderId"), "orderItemSeqId", shipmentPlan.getString("orderItemSeqId"), "shipmentId", shipmentId, "userLogin", userLogin)); + Map result = dispatcher.runSync("createProductionRunsForOrder", UtilMisc.<String, Object>toMap("quantity", shipmentPlan.getBigDecimal("quantity"), "orderId", shipmentPlan.getString("orderId"), "orderItemSeqId", shipmentPlan.getString("orderItemSeqId"), "shipGroupSeqId", shipmentPlan.getString("shipGroupSeqId"), "shipmentId", shipmentId, "userLogin", userLogin)); } } catch (Exception e) { // if there is an exception for either, the other probably wont work Modified: ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMNode.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMNode.java?rev=934004&r1=934003&r2=934004&view=diff ============================================================================== --- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMNode.java (original) +++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMNode.java Wed Apr 14 16:12:57 2010 @@ -504,7 +504,7 @@ public class BOMNode { } } - public Map createManufacturingOrder(String facilityId, Date date, String workEffortName, String description, String routingId, String orderId, String orderItemSeqId, String shipmentId, boolean useSubstitute, boolean ignoreSupplierProducts) throws GenericEntityException { + public Map createManufacturingOrder(String facilityId, Date date, String workEffortName, String description, String routingId, String orderId, String orderItemSeqId, String shipGroupSeqId, String shipmentId, boolean useSubstitute, boolean ignoreSupplierProducts) throws GenericEntityException { String productionRunId = null; Timestamp endDate = null; if (isManufactured(ignoreSupplierProducts)) { @@ -514,7 +514,7 @@ public class BOMNode { for (int i = 0; i < childrenNodes.size(); i++) { oneChildNode = (BOMNode)childrenNodes.get(i); if (oneChildNode != null) { - Map tmpResult = oneChildNode.createManufacturingOrder(facilityId, date, null, null, null, null, null, shipmentId, false, false); + Map tmpResult = oneChildNode.createManufacturingOrder(facilityId, date, null, null, null, null, null, shipGroupSeqId, shipmentId, false, false); String childProductionRunId = (String)tmpResult.get("productionRunId"); Timestamp childEndDate = (Timestamp)tmpResult.get("endDate"); if (maxEndDate == null) { @@ -573,7 +573,7 @@ public class BOMNode { try { if (productionRunId != null) { if (orderId != null && orderItemSeqId != null) { - delegator.create("WorkOrderItemFulfillment", UtilMisc.toMap("workEffortId", productionRunId, "orderId", orderId, "orderItemSeqId", orderItemSeqId)); + delegator.create("WorkOrderItemFulfillment", UtilMisc.toMap("workEffortId", productionRunId, "orderId", orderId, "orderItemSeqId", orderItemSeqId, "shipGroupSeqId", shipGroupSeqId)); } for (int i = 0; i < childProductionRuns.size(); i++) { delegator.create("WorkEffortAssoc", UtilMisc.toMap("workEffortIdFrom", (String)childProductionRuns.get(i), "workEffortIdTo", productionRunId, "workEffortAssocTypeId", "WORK_EFF_PRECEDENCY", "fromDate", startDate)); Modified: ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMTree.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMTree.java?rev=934004&r1=934003&r2=934004&view=diff ============================================================================== --- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMTree.java (original) +++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/bom/BOMTree.java Wed Apr 14 16:12:57 2010 @@ -325,7 +325,7 @@ public class BOMTree { * @param delegator The delegator used. * @throws GenericEntityException If a db problem occurs. */ - public String createManufacturingOrders(String facilityId, Date date, String workEffortName, String description, String routingId, String orderId, String orderItemSeqId, String shipmentId, GenericValue userLogin) throws GenericEntityException { + public String createManufacturingOrders(String facilityId, Date date, String workEffortName, String description, String routingId, String orderId, String orderItemSeqId, String shipGroupSeqId, String shipmentId, GenericValue userLogin) throws GenericEntityException { String workEffortId = null; if (root != null) { if (UtilValidate.isEmpty(facilityId)) { @@ -345,7 +345,7 @@ public class BOMTree { facilityId = shipment.getString("originFacilityId"); } } - Map tmpMap = root.createManufacturingOrder(facilityId, date, workEffortName, description, routingId, orderId, orderItemSeqId, shipmentId, true, true); + Map tmpMap = root.createManufacturingOrder(facilityId, date, workEffortName, description, routingId, orderId, orderItemSeqId, shipGroupSeqId, shipmentId, true, true); workEffortId = (String)tmpMap.get("productionRunId"); } return workEffortId; Modified: ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java?rev=934004&r1=934003&r2=934004&view=diff ============================================================================== --- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java (original) +++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java Wed Apr 14 16:12:57 2010 @@ -2509,10 +2509,10 @@ public class ProductionRunServices { String shipmentId = (String) context.get("shipmentId"); String orderItemSeqId = (String) context.get("orderItemSeqId"); + String shipGroupSeqId = (String) context.get("shipGroupSeqId"); BigDecimal quantity = (BigDecimal) context.get("quantity"); String fromDateStr = (String) context.get("fromDate"); - BigDecimal amount = null; Date fromDate = null; if (UtilValidate.isNotEmpty(fromDateStr)) { try { @@ -2528,7 +2528,12 @@ public class ProductionRunServices { if (orderItemSeqId != null) { try { - GenericValue orderItem = delegator.findByPrimaryKey("OrderItem", UtilMisc.toMap("orderId", orderId, "orderItemSeqId", orderItemSeqId)); + GenericValue orderItem = null; + if (UtilValidate.isNotEmpty(shipGroupSeqId)) { + orderItem = delegator.findByPrimaryKey("OrderItemShipGroupAssoc", UtilMisc.toMap("orderId", orderId, "orderItemSeqId", orderItemSeqId, "shipGroupSeqId", shipGroupSeqId)); + } else { + orderItem = delegator.findByPrimaryKey("OrderItem", UtilMisc.toMap("orderId", orderId, "orderItemSeqId", orderItemSeqId)); + } if (orderItem == null) { return ServiceUtil.returnError("OrderItem [" + orderItemSeqId + "] not found."); } @@ -2551,37 +2556,56 @@ public class ProductionRunServices { } ArrayList productionRuns = new ArrayList(); for (int i = 0; i < orderItems.size(); i++) { - GenericValue orderItem = (GenericValue)orderItems.get(i); - if (orderItem.get("productId") == null) { + GenericValue orderItemOrShipGroupAssoc = (GenericValue)orderItems.get(i); + String productId = null; + BigDecimal amount = null; + GenericValue orderItem = null; + if ("OrderItemShipGroupAssoc".equals(orderItemOrShipGroupAssoc.getEntityName())) { + try { + orderItem = orderItemOrShipGroupAssoc.getRelatedOne("OrderItem"); + } catch(GenericEntityException gee) { + Debug.logInfo("Unable to find order item for " + orderItemOrShipGroupAssoc, module); + } + } else { + orderItem = orderItemOrShipGroupAssoc; + } + if (orderItem == null || orderItem.get("productId") == null) { continue; + } else { + productId = orderItem.getString("productId"); } - if (orderItem.get("quantity") != null) { - quantity = orderItem.getBigDecimal("quantity"); + if (orderItem.get("selectedAmount") != null) { + amount = orderItem.getBigDecimal("selectedAmount"); + } + if (amount == null) { + amount = BigDecimal.ZERO; + } + if (orderItemOrShipGroupAssoc.get("quantity") != null) { + quantity = orderItemOrShipGroupAssoc.getBigDecimal("quantity"); } else { continue; } try { - List existingProductionRuns = delegator.findByAndCache("WorkOrderItemFulfillment", UtilMisc.toMap("orderId", orderItem.getString("orderId"), "orderItemSeqId", orderItem.getString("orderItemSeqId"))); + List existingProductionRuns = null; + if (UtilValidate.isNotEmpty(shipGroupSeqId)) { + existingProductionRuns = delegator.findByAndCache("WorkOrderItemFulfillment", UtilMisc.toMap("orderId", orderItemOrShipGroupAssoc.getString("orderId"), "orderItemSeqId", orderItemOrShipGroupAssoc.getString("orderItemSeqId"), "shipGroupSeqId", shipGroupSeqId)); + } else { + existingProductionRuns = delegator.findByAndCache("WorkOrderItemFulfillment", UtilMisc.toMap("orderId", orderItemOrShipGroupAssoc.getString("orderId"), "orderItemSeqId", orderItemOrShipGroupAssoc.getString("orderItemSeqId"))); + } if (UtilValidate.isNotEmpty(existingProductionRuns)) { - Debug.logWarning("Production Run for order item [" + orderItem.getString("orderId") + "/" + orderItem.getString("orderItemSeqId") + "] already exists.", module); + Debug.logWarning("Production Run for order item [" + orderItemOrShipGroupAssoc.getString("orderId") + "/" + orderItemOrShipGroupAssoc.getString("orderItemSeqId") + "] and ship group [" + shipGroupSeqId + "] already exists.", module); continue; } } catch (GenericEntityException gee) { return ServiceUtil.returnError("Error reading the WorkOrderItemFulfillment: " + gee.getMessage()); } - if (orderItem.get("selectedAmount") != null) { - amount = orderItem.getBigDecimal("selectedAmount"); - } - if (amount == null) { - amount = BigDecimal.ZERO; - } try { ArrayList components = new ArrayList(); - BOMTree tree = new BOMTree(orderItem.getString("productId"), "MANUF_COMPONENT", fromDate, BOMTree.EXPLOSION_MANUFACTURING, delegator, dispatcher, userLogin); + BOMTree tree = new BOMTree(productId, "MANUF_COMPONENT", fromDate, BOMTree.EXPLOSION_MANUFACTURING, delegator, dispatcher, userLogin); tree.setRootQuantity(quantity); tree.setRootAmount(amount); tree.print(components); - productionRuns.add(tree.createManufacturingOrders(null, fromDate, null, null, null, orderId, orderItem.getString("orderItemSeqId"), shipmentId, userLogin)); + productionRuns.add(tree.createManufacturingOrders(null, fromDate, null, null, null, orderId, orderItem.getString("orderItemSeqId"), shipGroupSeqId, shipmentId, userLogin)); } catch (GenericEntityException gee) { return ServiceUtil.returnError("Error creating bill of materials tree: " + gee.getMessage()); } @@ -2613,7 +2637,7 @@ public class ProductionRunServices { tree.setRootQuantity(quantity); tree.setRootAmount(BigDecimal.ZERO); tree.print(components); - workEffortId = tree.createManufacturingOrders(facilityId, startDate, workEffortName, description, routingId, null, null, null, userLogin); + workEffortId = tree.createManufacturingOrders(facilityId, startDate, workEffortName, description, routingId, null, null, null, null, userLogin); } catch (GenericEntityException gee) { return ServiceUtil.returnError("Error creating bill of materials tree: " + gee.getMessage()); } Modified: ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/WorkWithShipmentPlans.groovy URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/WorkWithShipmentPlans.groovy?rev=934004&r1=934003&r2=934004&view=diff ============================================================================== --- ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/WorkWithShipmentPlans.groovy (original) +++ ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/WorkWithShipmentPlans.groovy Wed Apr 14 16:12:57 2010 @@ -147,7 +147,7 @@ if (shipmentPlans) { } rows.add(oneRow); // Select the production runs, if available - productionRuns = delegator.findByAnd("WorkOrderItemFulfillment", [orderId : shipmentPlan.orderId , orderItemSeqId : shipmentPlan.orderItemSeqId],["workEffortId"]); // TODO: add shipmentId + productionRuns = delegator.findByAnd("WorkOrderItemFulfillment", [orderId : shipmentPlan.orderId, orderItemSeqId : shipmentPlan.orderItemSeqId, shipGroupSeqId : shipmentPlan.shipGroupSeqId],["workEffortId"]); // TODO: add shipmentId if (productionRuns) { workInProgress = "true"; productionRunsId = ""; Modified: ofbiz/trunk/applications/order/entitydef/entitymodel.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/entitydef/entitymodel.xml?rev=934004&r1=934003&r2=934004&view=diff ============================================================================== --- ofbiz/trunk/applications/order/entitydef/entitymodel.xml (original) +++ ofbiz/trunk/applications/order/entitydef/entitymodel.xml Wed Apr 14 16:12:57 2010 @@ -1325,6 +1325,7 @@ under the License. <field name="workEffortId" type="id-ne"></field> <field name="orderId" type="id-ne"></field> <field name="orderItemSeqId" type="id-ne"></field> + <field name="shipGroupSeqId" type="id"></field> <prim-key field="workEffortId"/> <prim-key field="orderId"/> <prim-key field="orderItemSeqId"/> @@ -1338,6 +1339,11 @@ under the License. <relation type="one" fk-name="WORDER_ITFMT_WEFRT" rel-entity-name="WorkEffort"> <key-map field-name="workEffortId"/> </relation> + <relation type="one-nofk" rel-entity-name="OrderItemShipGroupAssoc"> + <key-map field-name="orderId"/> + <key-map field-name="orderItemSeqId"/> + <key-map field-name="shipGroupSeqId"/> + </relation> </entity> <!-- ========================================================= --> |
Free forum by Nabble | Edit this page |