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/03/26 14:19:50 UTC

svn commit: r522494 - in /ofbiz/trunk/applications: manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java manufacturing/src/org/ofbiz/manufacturing/mrp/ProposedOrder.java order/entitydef/entitygroup.xml order/entitydef/entitymodel_view.xml

Author: jacopoc
Date: Mon Mar 26 05:19:49 2007
New Revision: 522494

URL: http://svn.apache.org/viewvc?view=rev&rev=522494
Log:
Improvements to the MRP algorithm: sales orders ship group dates are now considered, better handling of orders without dates (they are now moved far in the future).

Modified:
    ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java
    ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/ProposedOrder.java
    ofbiz/trunk/applications/order/entitydef/entitygroup.xml
    ofbiz/trunk/applications/order/entitydef/entitymodel_view.xml

Modified: ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java?view=diff&rev=522494&r1=522493&r2=522494
==============================================================================
--- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java (original)
+++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java Mon Mar 26 05:19:49 2007
@@ -84,6 +84,7 @@
         List listResult = null;
         try{
             listResult = delegator.findAll("InventoryEventPlanned");
+            //int numOfRecordsRemoved = delegator.removeByCondition("InventoryEventPlanned", null);
         } catch(GenericEntityException e) {
             Debug.logError(e,"Error : delegator.findAll(\"InventoryEventPlanned\")", module);
             return ServiceUtil.returnError("Problem, we can not find all the items of InventoryEventPlanned, for more detail look at the log");
@@ -111,6 +112,7 @@
                 while (listResultIt.hasNext()){
                     GenericValue tmpRequirement = (GenericValue)listResultIt.next();
                     listResultRoles.addAll(tmpRequirement.getRelated("RequirementRole"));
+                    //int numOfRecordsRemoved = delegator.removeRelated("RequirementRole", tmpRequirement);
                 }
                 delegator.removeAll(listResultRoles);
                 delegator.removeAll(listResult);
@@ -139,11 +141,14 @@
         // ----------------------------------------
         // Loads all the approved sales order items and purchase order items
         // ----------------------------------------
+        // This is the default required date for orders without dates spesified:
+        // by convention it is a date far in the future of 100 years.
+        Timestamp notAssignedDate = UtilDateTime.getYearStart(now, 0, 0, 100);
         resultList = null;
         iteratorResult = null;
-        parameters = UtilMisc.toMap("orderTypeId", "SALES_ORDER", "itemStatusId", "ITEM_APPROVED");
+        parameters = UtilMisc.toMap("orderTypeId", "SALES_ORDER", "oiStatusId", "ITEM_APPROVED");
         try {
-            resultList = delegator.findByAnd("OrderHeaderAndItems", parameters, UtilMisc.toList("orderId"));
+            resultList = delegator.findByAnd("OrderHeaderItemAndShipGroup", parameters, UtilMisc.toList("orderId"));
         } catch(GenericEntityException e) {
             Debug.logError(e, "Error : delegator.findByAnd(\"OrderItem\", parameters\")", module);
             Debug.logError(e, "Error : parameters = "+parameters,module);
@@ -154,11 +159,29 @@
             genericResult = (GenericValue) iteratorResult.next();
             String productId =  genericResult.getString("productId");
             Double eventQuantityTmp = new Double(-1.0 * genericResult.getDouble("quantity").doubleValue());
-            Timestamp estimatedShipDate = genericResult.getTimestamp("estimatedDeliveryDate");
-            if (estimatedShipDate == null) {
-                estimatedShipDate = now;
+            // This is the order in which order dates are considered:
+            //   OrderItemShipGroup.shipByDate
+            //   OrderItemShipGroup.shipAfterDate
+            //   OrderItem.shipBeforeDate
+            //   OrderItem.shipAfterDate
+            //   OrderItem.estimatedDeliveryDate
+            Timestamp requiredByDate = genericResult.getTimestamp("shipByDate");
+            if (UtilValidate.isEmpty(requiredByDate)) {
+                requiredByDate = genericResult.getTimestamp("shipAfterDate");
+                if (UtilValidate.isEmpty(requiredByDate)) {
+                    requiredByDate = genericResult.getTimestamp("oiShipBeforeDate");
+                    if (UtilValidate.isEmpty(requiredByDate)) {
+                        requiredByDate = genericResult.getTimestamp("oiShipAfterDate");
+                        if (UtilValidate.isEmpty(requiredByDate)) {
+                            requiredByDate = genericResult.getTimestamp("oiEstimatedDeliveryDate");
+                            if (requiredByDate == null) {
+                                requiredByDate = notAssignedDate;
+                            }
+                        }
+                    }
+                }
             }
-            parameters = UtilMisc.toMap("productId", productId, "eventDate", estimatedShipDate, "inventoryEventPlanTypeId", "SALE_ORDER_SHIP");
+            parameters = UtilMisc.toMap("productId", productId, "eventDate", requiredByDate, "inventoryEventPlanTypeId", "SALE_ORDER_SHIP");
             try {
                 InventoryEventPlannedServices.createOrUpdateInventoryEventPlanned(parameters, eventQuantityTmp, null, genericResult.getString("orderId") + "-" + genericResult.getString("orderItemSeqId"), false, delegator);
             } catch (GenericEntityException e) {
@@ -408,13 +431,16 @@
     }
 
     public static void logMrpError(String productId, String errorMessage, GenericDelegator delegator) {
-        try{
+        logMrpError(productId, UtilDateTime.nowTimestamp(), errorMessage, delegator);
+    }
+    public static void logMrpError(String productId, Timestamp eventDate, String errorMessage, GenericDelegator delegator) {
+        try {
             if (UtilValidate.isNotEmpty(productId) && UtilValidate.isNotEmpty(errorMessage)) {
                 GenericValue inventoryEventError = delegator.makeValue("InventoryEventPlanned", UtilMisc.toMap("productId", productId, 
-                                                                                                               "eventDate", UtilDateTime.nowTimestamp(),
+                                                                                                               "eventDate", eventDate,
                                                                                                                "inventoryEventPlanTypeId", "ERROR",
                                                                                                                "eventName", errorMessage));
-                inventoryEventError.create();
+                delegator.createOrStore(inventoryEventError);
             }
         } catch (GenericEntityException e) {
             Debug.logError(e, "Error calling logMrpError for productId [" + productId + "] and errorMessage [" + errorMessage + "]", module);
@@ -632,7 +658,7 @@
                         eventDate = inventoryEventForMRP.getTimestamp("eventDate");
                         // to be just before the requirement
                         eventDate.setTime(eventDate.getTime()-1);
-                        ProposedOrder proposedOrder = new ProposedOrder(product, facilityId, manufacturingFacilityId, isBuilt, eventDate, qtyToStock);
+                        ProposedOrder proposedOrder = new ProposedOrder(product, facilityId, manufacturingFacilityId, isBuilt, eventDate, qtyToStock, now);
                         proposedOrder.setMrpName(mrpName);
                         // calculate the ProposedOrder quantity and update the quantity object property.
                         proposedOrder.calculateQuantityToSupply(reorderQuantity, minimumStock, iteratorListInventoryEventForMRP);
@@ -676,7 +702,7 @@
                             requirementId = proposedOrder.create(ctx, userLogin);
                         }
                         if (UtilValidate.isEmpty(productFacility) && !isBuilt) {
-                            logMrpError(productId, "No ProductFacility record for [" + facilityId + "]; no requirement created.", delegator);
+                            logMrpError(productId, now, "No ProductFacility record for [" + facilityId + "]; no requirement created.", delegator);
                         }
                         
                         Map eventMap = UtilMisc.toMap("productId", product.getString("productId"),

Modified: ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/ProposedOrder.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/ProposedOrder.java?view=diff&rev=522494&r1=522493&r2=522494
==============================================================================
--- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/ProposedOrder.java (original)
+++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/ProposedOrder.java Mon Mar 26 05:19:49 2007
@@ -57,10 +57,11 @@
     protected String mrpName;
     protected Timestamp requiredByDate;
     protected Timestamp requirementStartDate;
+    protected Timestamp now;
     protected double quantity;
     
     
-    public ProposedOrder(GenericValue product, String facilityId, String manufacturingFacilityId, boolean isBuilt, Timestamp requiredByDate, double quantity) {
+    public ProposedOrder(GenericValue product, String facilityId, String manufacturingFacilityId, boolean isBuilt, Timestamp requiredByDate, double quantity, Timestamp now) {
         this.product = product;
         this.productId = product.getString("productId");
         this.facilityId = facilityId;

Modified: ofbiz/trunk/applications/order/entitydef/entitygroup.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/entitydef/entitygroup.xml?view=diff&rev=522494&r1=522493&r2=522494
==============================================================================
--- ofbiz/trunk/applications/order/entitydef/entitygroup.xml (original)
+++ ofbiz/trunk/applications/order/entitydef/entitygroup.xml Mon Mar 26 05:19:49 2007
@@ -50,6 +50,7 @@
     <entity-group group="org.ofbiz" entity="OrderHeaderItemAndInv" />
     <entity-group group="org.ofbiz" entity="OrderHeaderItemAndInvRoles" />
     <entity-group group="org.ofbiz" entity="OrderHeaderItemAndRoles" />    
+    <entity-group group="org.ofbiz" entity="OrderHeaderItemAndShipGroup" />
     <entity-group group="org.ofbiz" entity="OrderHeaderNote" />
     <entity-group group="org.ofbiz" entity="OrderHeaderNoteView" />
     <entity-group group="org.ofbiz" entity="OrderHeaderWorkEffort" />

Modified: ofbiz/trunk/applications/order/entitydef/entitymodel_view.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/entitydef/entitymodel_view.xml?view=diff&rev=522494&r1=522493&r2=522494
==============================================================================
--- ofbiz/trunk/applications/order/entitydef/entitymodel_view.xml (original)
+++ ofbiz/trunk/applications/order/entitydef/entitymodel_view.xml Mon Mar 26 05:19:49 2007
@@ -594,6 +594,44 @@
             <key-map field-name="productId"/>
         </relation>
     </view-entity>
+    <view-entity entity-name="OrderHeaderItemAndShipGroup"
+            package-name="org.ofbiz.order.order"
+            never-cache="true"
+            title="OrderHeader, OrderItem And ShipGroups View Entity">
+      <member-entity entity-alias="OH" entity-name="OrderHeader"/>
+      <member-entity entity-alias="OI" entity-name="OrderItem"/>
+      <member-entity entity-alias="OISGA" entity-name="OrderItemShipGroupAssoc"/>
+      <member-entity entity-alias="OISG" entity-name="OrderItemShipGroup"/>
+      <alias-all entity-alias="OH"/>
+      <alias-all entity-alias="OISGA"/>
+      <alias-all entity-alias="OISG"/>
+      <alias-all entity-alias="OI">
+        <exclude field="quantity"/>
+        <exclude field="cancelQuantity"/>
+        <exclude field="shipAfterDate"/>
+        <exclude field="shipBeforeDate"/>
+        <exclude field="estimatedShipDate"/>
+        <exclude field="estimatedDeliveryDate"/>
+      </alias-all>
+      <alias entity-alias="OI" name="oiQuantity" field="quantity"/>
+      <alias entity-alias="OI" name="oiCancelQuantity" field="cancelQuantity"/>
+      <alias entity-alias="OI" name="oiShipAfterDate" field="shipAfterDate"/>
+      <alias entity-alias="OI" name="oiShipBeforeDate" field="shipBeforeDate"/>
+      <alias entity-alias="OI" name="oiEstimatedShipDate" field="estimatedShipDate"/>
+      <alias entity-alias="OI" name="oiEstimatedDeliveryDate" field="estimatedDeliveryDate"/>
+      <alias entity-alias="OI" name="oiStatusId" field="statusId"/>
+      <view-link entity-alias="OH" rel-entity-alias="OI">
+        <key-map field-name="orderId"/>
+      </view-link>
+      <view-link entity-alias="OI" rel-entity-alias="OISGA">
+        <key-map field-name="orderId"/>
+        <key-map field-name="orderItemSeqId"/>
+      </view-link>
+      <view-link entity-alias="OISGA" rel-entity-alias="OISG">
+        <key-map field-name="orderId"/>
+        <key-map field-name="shipGroupSeqId"/>
+      </view-link>
+    </view-entity>
     <view-entity entity-name="OrderItemAndShipGroupAssoc"
             package-name="org.ofbiz.order.order"
             never-cache="true"