You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2007/04/26 11:48:01 UTC

svn commit: r532685 - in /ofbiz/trunk/applications/manufacturing: servicedef/services_mrp.xml src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java

Author: jacopoc
Date: Thu Apr 26 02:48:00 2007
New Revision: 532685

URL: http://svn.apache.org/viewvc?view=rev&rev=532685
Log:
Implemented service to set the estimated ship dates for order items that need production, based on scheduled outstanding production runs.

Modified:
    ofbiz/trunk/applications/manufacturing/servicedef/services_mrp.xml
    ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java

Modified: ofbiz/trunk/applications/manufacturing/servicedef/services_mrp.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/servicedef/services_mrp.xml?view=diff&rev=532685&r1=532684&r2=532685
==============================================================================
--- ofbiz/trunk/applications/manufacturing/servicedef/services_mrp.xml (original)
+++ ofbiz/trunk/applications/manufacturing/servicedef/services_mrp.xml Thu Apr 26 02:48:00 2007
@@ -63,4 +63,8 @@
         <attribute name="facilityId" type="String" mode="IN" optional="true"/>
         <attribute name="eventName" type="String" mode="IN" optional="true"/>
     </service>
+    <service name="setEstimatedDeliveryDates" engine="java"
+            location="org.ofbiz.manufacturing.jobshopmgt.ProductionRunServices" invoke="setEstimatedDeliveryDates">
+        <description>Set estimated ship dates for order items based on outstanding production runs</description>
+    </service>
 </services>

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?view=diff&rev=532685&r1=532684&r2=532685
==============================================================================
--- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java (original)
+++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java Thu Apr 26 02:48:00 2007
@@ -27,6 +27,8 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
 import java.math.BigDecimal;
 
 import org.ofbiz.base.util.Debug;
@@ -52,6 +54,9 @@
 import org.ofbiz.service.ModelService;
 import org.ofbiz.service.ServiceUtil;
 
+import javolution.util.FastList;
+import javolution.util.FastMap;
+
 /**
  * Services for Production Run maintenance
  *
@@ -2484,6 +2489,110 @@
             return ServiceUtil.returnError(e.getMessage());
         }
         result.put("inventoryItemIds", inventoryItemIds);
+        return result;
+    }
+    
+    public static Map setEstimatedDeliveryDates(DispatchContext ctx, Map context) {
+        Map result = new HashMap();
+        GenericDelegator delegator = ctx.getDelegator();
+        Timestamp now = UtilDateTime.nowTimestamp();
+        
+        Map products = FastMap.newInstance();
+
+        try {
+            List resultList = delegator.findByAnd("WorkEffortAndGoods", UtilMisc.toMap("workEffortGoodStdTypeId", "PRUN_PROD_DELIV",
+                                                                                  "statusId", "WEGS_CREATED",
+                                                                                  "workEffortTypeId", "PROD_ORDER_HEADER"));
+            Iterator iteratorResult = resultList.iterator();
+            while (iteratorResult.hasNext()) {
+                GenericValue genericResult = (GenericValue) iteratorResult.next();
+                if ("PRUN_CLOSED".equals(genericResult.getString("currentStatusId")) ||
+                    "PRUN_CREATED".equals(genericResult.getString("currentStatusId"))) {
+                    continue;
+                }
+                Double qtyToProduce = genericResult.getDouble("quantityToProduce");
+                if (qtyToProduce == null) {
+                    qtyToProduce = new Double(0);
+                }
+                Double qtyProduced = genericResult.getDouble("quantityProduced");
+                if (qtyProduced == null) {
+                    qtyProduced = new Double(0);
+                }
+                if (qtyProduced.compareTo(qtyToProduce) >= 0) {
+                    continue;
+                }
+                double qtyDiff = qtyToProduce.doubleValue() - qtyProduced.doubleValue();
+                String productId =  genericResult.getString("productId");
+                Timestamp estimatedShipDate = genericResult.getTimestamp("estimatedCompletionDate");
+                if (estimatedShipDate == null) {
+                    estimatedShipDate = now;
+                }
+                if (!products.containsKey(productId)) {
+                    products.put("productId", new TreeMap());
+                }
+                TreeMap productMap = (TreeMap)products.get(productId);
+                if (!productMap.containsKey(estimatedShipDate)) {
+                    productMap.put(estimatedShipDate, UtilMisc.toMap("remainingQty", new Double(0.0), "reservations", FastList.newInstance()));
+                }
+                Map dateMap = (Map)productMap.get(estimatedShipDate);
+                Double remainingQty = (Double)productMap.get("remainingQty");
+                //List reservations = (List)productMap.get("reservations");
+                remainingQty = new Double(remainingQty.doubleValue() + qtyDiff);
+            }
+
+            // backorders
+            List backordersCondList = FastList.newInstance();
+            backordersCondList.add(new EntityExpr("quantityNotAvailable", EntityOperator.NOT_EQUAL, null));
+            backordersCondList.add(new EntityExpr("quantityNotAvailable", EntityOperator.GREATER_THAN, new Double(0.0)));
+            backordersCondList.add(new EntityExpr(new EntityExpr("statusId", EntityOperator.EQUALS, "ITEM_CREATED"), EntityOperator.OR, new EntityExpr("statusId", EntityOperator.LESS_THAN, "ITEM_APPROVED")));
+
+            List backorders = delegator.findByCondition("OrderItemAndShipGrpInvResAndItem", new EntityConditionList(backordersCondList, EntityOperator.AND), null, UtilMisc.toList("shipBeforeDate"));
+            Iterator backordersIt = resultList.iterator();
+            while (backordersIt.hasNext()) {
+                GenericValue genericResult = (GenericValue) backordersIt.next();
+                String productId = genericResult.getString("productId");
+                Timestamp requiredByDate = genericResult.getTimestamp("shipBeforeDate");
+                Double quantityNotAvailable = genericResult.getDouble("quantityNotAvailable");
+                double quantityNotAvailableRem = quantityNotAvailable.doubleValue();
+                if (requiredByDate == null) {
+                    // TODO: what happens if requiredByDate is null?
+                    continue;
+                }
+                if (!products.containsKey(productId)) {
+                    continue;
+                }
+                TreeMap productMap = (TreeMap)products.get(productId);
+                SortedMap subsetMap = productMap.headMap(requiredByDate);
+                // iterate and 'reserve'
+                Iterator subsetMapKeysIt = subsetMap.keySet().iterator();
+                while (subsetMapKeysIt.hasNext()) {
+                    Timestamp currentDate = (Timestamp)subsetMapKeysIt.next();
+                    Map currentDateMap = (Map) subsetMap.get(currentDate);
+                    //List reservations = (List)currentDateMap.get("reservations");
+                    Double remainingQty = (Double)currentDateMap.get("remainingQty");
+                    if (remainingQty.doubleValue() == 0) {
+                        continue;
+                    }
+                    if (remainingQty.doubleValue() >= quantityNotAvailableRem) {
+                        remainingQty = new Double(remainingQty.doubleValue() - quantityNotAvailableRem);
+                        GenericValue orderItemShipGrpInvRes = delegator.findByPrimaryKey("OrderItemShipGrpInvRes", UtilMisc.toMap("orderId", genericResult.getString("orderId"),
+                                                                                                                                  "shipGroupSeqId", genericResult.getString("shipGroupSeqId"),
+                                                                                                                                  "orderItemSeqId", genericResult.getString("orderItemSeqId"),
+                                                                                                                                  "inventoryItemId", genericResult.getString("inventoryItemId")));
+                        orderItemShipGrpInvRes.set("promisedDatetime", currentDate);
+                        orderItemShipGrpInvRes.store();
+                        // Todo: set the reservation
+                        break;
+                    } else {
+                        quantityNotAvailableRem = quantityNotAvailableRem - remainingQty.doubleValue();
+                        remainingQty = new Double(0.0);
+                    }
+                }
+            }
+        } catch(GenericEntityException e) {
+            Debug.logError(e, "Error", module);
+            return ServiceUtil.returnError("Problem running the setEstimatedDeliveryDates service");
+        }
         return result;
     }
 }