Author: sichen
Date: Tue Jan 30 15:11:32 2007
New Revision: 501633
URL: http://svn.apache.org/viewvc?view=rev&rev=501633
Log:
Added QOH and ATP for the approved product requirements list. The idea is to
be able to see what the inventory is before creating POs based on requirements.
Modified:
ofbiz/trunk/applications/order/script/org/ofbiz/order/order/OrderServices.xml
ofbiz/trunk/applications/order/src/org/ofbiz/order/requirement/RequirementServices.java
ofbiz/trunk/applications/order/webapp/ordermgr/requirement/RequirementForms.xml
Modified:
ofbiz/trunk/applications/order/script/org/ofbiz/order/order/OrderServices.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/script/org/ofbiz/order/order/OrderServices.xml?view=diff&rev=501633&r1=501632&r2=501633
==============================================================================
---
ofbiz/trunk/applications/order/script/org/ofbiz/order/order/OrderServices.xml
(original)
+++
ofbiz/trunk/applications/order/script/org/ofbiz/order/order/OrderServices.xml
Tue Jan 30 15:11:32 2007
@@ -127,6 +127,14 @@
<simple-method method-name="createRequirementAndCommitment"
short-description="create a requirement and commitment for it">
<set value="PRODUCT_REQUIREMENT" field="inputMap.requirementTypeId"/>
+
+ <!-- Include the facilityId corresponding to this order by looking up
the ProductStore -->
+ <entity-one entity-name="OrderHeader" value-name="orderHeader"
auto-field-map="true"/>
+ <get-related-one value-name="orderHeader" relation-name="ProductStore"
to-value-name="productStore" use-cache="true"/>
+ <if-not-empty field-name="productStore.inventoryFacilityId">
+ <set from-field="productStore.inventoryFacilityId"
field="inputMap.facilityId"/>
+ </if-not-empty>
+
<call-service service-name="createRequirement" in-map-name="inputMap">
<result-to-field field-name="parameters.requirementId"
result-name="requirementId"/>
</call-service>
Modified:
ofbiz/trunk/applications/order/src/org/ofbiz/order/requirement/RequirementServices.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/requirement/RequirementServices.java?view=diff&rev=501633&r1=501632&r2=501633
==============================================================================
---
ofbiz/trunk/applications/order/src/org/ofbiz/order/requirement/RequirementServices.java
(original)
+++
ofbiz/trunk/applications/order/src/org/ofbiz/order/requirement/RequirementServices.java
Tue Jan 30 15:11:32 2007
@@ -24,13 +24,14 @@
import javolution.util.FastMap;
import org.ofbiz.base.util.*;
+import org.ofbiz.entity.*;
+import org.ofbiz.entity.condition.*;
import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
-import org.ofbiz.entity.*;
-import org.ofbiz.entity.condition.*;
import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.GenericServiceException;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ServiceUtil;
@@ -45,6 +46,7 @@
public static final Map getRequirementsForSupplier(DispatchContext ctx,
Map context) {
GenericDelegator delegator = ctx.getDelegator();
+ LocalDispatcher dispatcher = ctx.getDispatcher();
Locale locale = (Locale) context.get("locale");
EntityCondition requirementConditions = (EntityCondition)
context.get("requirementConditions");
@@ -71,27 +73,59 @@
}
List requirementAndRoles =
delegator.findByAnd("RequirementAndRole", conditions, orderBy);
+ // maps to cache the associated suppliers and products data
+ Map suppliers = FastMap.newInstance();
+ Map gids = FastMap.newInstance();
+ Map inventories = FastMap.newInstance();
+
// join in fields with extra data about the suppliers and products
List requirements = FastList.newInstance();
for (Iterator iter = requirementAndRoles.iterator();
iter.hasNext(); ) {
GenericValue requirement = (GenericValue) iter.next();
+ String productId = requirement.getString("productId");
+ partyId = requirement.getString("partyId");
+ String facilityId = requirement.getString("facilityId");
Map union = FastMap.newInstance();
// get an available supplier product
- conditions = UtilMisc.toList(
- new EntityExpr("partyId", EntityOperator.EQUALS,
requirement.get("partyId")),
- new EntityExpr("productId", EntityOperator.EQUALS,
requirement.get("productId")),
- EntityUtil.getFilterByDateExpr("availableFromDate",
"availableThruDate")
- );
- GenericValue supplierProduct = EntityUtil.getFirst(
delegator.findByAnd("SupplierProduct", conditions) );
- if (supplierProduct != null) {
- union.putAll(supplierProduct.getAllFields());
+ String supplierKey = partyId + "^" + productId;
+ GenericValue supplierProduct = (GenericValue)
suppliers.get(supplierKey);
+ if (supplierProduct == null) {
+ conditions = UtilMisc.toList(
+ new EntityExpr("partyId", EntityOperator.EQUALS,
partyId),
+ new EntityExpr("productId", EntityOperator.EQUALS,
productId),
+
EntityUtil.getFilterByDateExpr("availableFromDate", "availableThruDate")
+ );
+ supplierProduct = EntityUtil.getFirst(
delegator.findByAnd("SupplierProduct", conditions) );
+ suppliers.put(supplierKey, supplierProduct);
}
+ if (supplierProduct != null)
union.putAll(supplierProduct.getAllFields());
// for good identification, get the UPCA type (UPC code)
- GenericValue gid =
delegator.findByPrimaryKey("GoodIdentification",
UtilMisc.toMap("goodIdentificationTypeId", "UPCA", "productId",
requirement.get("productId")));
+ GenericValue gid = (GenericValue) gids.get(productId);
+ if (gid == null) {
+ gid = delegator.findByPrimaryKey("GoodIdentification",
UtilMisc.toMap("goodIdentificationTypeId", "UPCA", "productId",
requirement.get("productId")));
+ gids.put(productId, gid);
+ }
if (gid != null) union.put("idValue", gid.get("idValue"));
+ // the ATP and QOH quantities
+ if (UtilValidate.isNotEmpty(facilityId)) {
+ String inventoryKey = facilityId + "^" + productId;
+ Map inventory = (Map) inventories.get(inventoryKey);
+ if (inventory == null) {
+ inventory =
dispatcher.runSync("getInventoryAvailableByFacility",
UtilMisc.toMap("productId", productId, "facilityId", facilityId));
+ if (ServiceUtil.isError(inventory)) {
+ return inventory;
+ }
+ inventories.put(inventoryKey, inventory);
+ }
+ if (inventory != null) {
+ union.put("qoh", inventory.get("quantityOnHandTotal"));
+ union.put("atp",
inventory.get("availableToPromiseTotal"));
+ }
+ }
+
// add all the requirement fields last, to overwrite any
conflicting fields
union.putAll(requirement.getAllFields());
requirements.add(union);
@@ -100,6 +134,9 @@
Map results = ServiceUtil.returnSuccess();
results.put("requirementsForSupplier", requirements);
return results;
+ } catch (GenericServiceException e) {
+ Debug.logError(e, module);
+ return
ServiceUtil.returnError(UtilProperties.getMessage(resource_error,
"OrderServiceExceptionSeeLogs", locale));
} catch (GenericEntityException e) {
Debug.logError(e, module);
return
ServiceUtil.returnError(UtilProperties.getMessage(resource_error,
"OrderEntityExceptionSeeLogs", locale));
Modified:
ofbiz/trunk/applications/order/webapp/ordermgr/requirement/RequirementForms.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/webapp/ordermgr/requirement/RequirementForms.xml?view=diff&rev=501633&r1=501632&r2=501633
==============================================================================
---
ofbiz/trunk/applications/order/webapp/ordermgr/requirement/RequirementForms.xml
(original)
+++
ofbiz/trunk/applications/order/webapp/ordermgr/requirement/RequirementForms.xml
Tue Jan 30 15:11:32 2007
@@ -320,6 +320,8 @@
<field name="minimumOrderQuantity"
widget-area-style="tabletextright"><display/></field>
<field name="lastPrice" widget-area-style="tabletextright"><display
type="currency" currency="${currencyUomId}"/></field>
<field name="requiredByDate"><display/></field>
+ <field name="atp" title="${uiLabelMap.ProductAtp}"
widget-area-style="tabletextright"><display/></field>
+ <field name="qoh" title="${uiLabelMap.ProductQoh}"
widget-area-style="tabletextright"><display/></field>
<field name="quantity"><text size="4"/></field>
<field name="comments"><display/></field>
<field name="_rowSubmit"
title="${uiLabelMap.CommonSelect}"><check/></field>