Author: jacopoc Date: Sun Oct 15 08:53:54 2006 New Revision: 464217 URL: http://svn.apache.org/viewvc?view=rev&rev=464217 Log: Applied patch that allows to override the default routing when a manual production run is created. Thanks to Scott Gray for the patch (OFBIZ-190).
Modified: incubator/ofbiz/trunk/applications/manufacturing/script/org/ofbiz/manufacturing/routing/RoutingServices.xml incubator/ofbiz/trunk/applications/manufacturing/servicedef/services_routing.xml incubator/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java Modified: incubator/ofbiz/trunk/applications/manufacturing/script/org/ofbiz/manufacturing/routing/RoutingServices.xml URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/manufacturing/script/org/ofbiz/manufacturing/routing/RoutingServices.xml?view=diff&rev=464217&r1=464216&r2=464217 ============================================================================== --- incubator/ofbiz/trunk/applications/manufacturing/script/org/ofbiz/manufacturing/routing/RoutingServices.xml (original) +++ incubator/ofbiz/trunk/applications/manufacturing/script/org/ofbiz/manufacturing/routing/RoutingServices.xml Sun Oct 15 08:53:54 2006 @@ -22,59 +22,90 @@ <simple-method method-name="getProductRouting" short-description="Get the product's routing and routing tasks"> <set from-field="parameters.productId" field="lookupRouting.productId"/> <set value="ROU_PROD_TEMPLATE" field="lookupRouting.workEffortGoodStdTypeId"/> - <find-by-and entity-name="WorkEffortGoodStandard" list-name="routings" map-name="lookupRouting"/> - <!-- TODO: we should consider the validity against a date passed as (optional) parameter --> - <filter-list-by-date list-name="routings"/> - <!-- TODO: we should consider the quantity to select the best routing --> - <first-from-list list-name="routings" entry-name="routingGS"/> - <!-- If there are no routings associated with our product and it's a variant, then - check to see if it's virtual product has a routing --> - <if-empty field-name="routingGS"> - <entity-one entity-name="Product" value-name="product" auto-field-map="false" > - <field-map field-name="productId" env-name="parameters.productId" /> - </entity-one> - <if-compare field-name="product.isVariant" operator="equals" value="Y"> - <entity-condition entity-name="ProductAssoc" list-name="virtualProductAssocList" filter-by-date="true"> + <!-- If applicableDate has been passed use the value with all filter-by-date calls--> + <if-not-empty field-name="applicableDate" map-name="parameters"> + <set from-field="parameters.applicableDate" field="filterDate"/> + <else> + <now-timestamp-to-env env-name="filterDate"/> + </else> + </if-not-empty> + <!-- If a workEffortId has been passed, use it to look up the desired routing--> + <if-not-empty field-name="workEffortId" map-name="parameters"> + <set from-field="parameters.workEffortId" field="lookupRouting.workEffortId"/> + <find-by-and entity-name="WorkEffortGoodStandard" list-name="routings" map-name="lookupRouting"/> + <filter-list-by-date list-name="routings" valid-date-name="filterDate"/> + <first-from-list list-name="routings" entry-name="routingGS"/> + <!-- If the routing is not associated with our product and it's a variant, then + check to see if it's virtual product has the routing --> + <if-empty field-name="routingGS"> + <entity-condition entity-name="ProductAssoc" list-name="virtualProductAssocList"> <condition-list combine="and"> <condition-expr field-name="productIdTo" env-name="parameters.productId" /> <condition-expr field-name="productAssocTypeId" value="PRODUCT_VARIANT" /> </condition-list> </entity-condition> - <first-from-list list-name="virtualProductAssocList" entry-name="virtualProductAssoc" /> + <filter-list-by-date list-name="virtualProductAssocList" valid-date-name="filterDate"/> + <first-from-list list-name="virtualProductAssocList" entry-name="virtualProductAssoc"/> <if-not-empty field-name="virtualProductAssoc"> <set from-field="virtualProductAssoc.productId" field="lookupRouting.productId"/> - <set value="ROU_PROD_TEMPLATE" field="lookupRouting.workEffortGoodStdTypeId"/> <find-by-and entity-name="WorkEffortGoodStandard" list-name="routings" map-name="lookupRouting"/> - <!-- TODO: we should consider the validity against a date passed as (optional) parameter --> - <filter-list-by-date list-name="routings"/> - <!-- TODO: we should consider the quantity to select the best routing --> + <!-- Consider the validity against a date passed as (optional) parameter --> + <filter-list-by-date list-name="routings" valid-date-name="filterDate"/> <first-from-list list-name="routings" entry-name="routingGS"/> </if-not-empty> - </if-compare> - </if-empty> - <if-not-empty field-name="routingGS"> - <clear-field field-name="lookupRouting"/> - <set from-field="routingGS.workEffortId" field="lookupRouting.workEffortId"/> - <find-by-primary-key entity-name="WorkEffort" value-name="routing" map-name="lookupRouting"/> + </if-empty> + <!-- No workEffortId has been passed, so retrieve the first routing found for this product--> <else> - <!-- The default routing is used when no explicit routing is associated to the product - and the ignoreDefaultRouting is not equals to Y --> - <if> - <condition> - <or> - <if-empty field-name="parameters.ignoreDefaultRouting"/> - <if-compare field-name="parameters.ignoreDefaultRouting" operator="equals" value="N"/> - </or> - </condition> - <then> - <clear-field field-name="lookupRouting"/> - <set value="DEFAULT_ROUTING" field="lookupRouting.workEffortId"/> - <find-by-primary-key entity-name="WorkEffort" value-name="routing" map-name="lookupRouting"/> - </then> - </if> + <find-by-and entity-name="WorkEffortGoodStandard" list-name="routings" map-name="lookupRouting"/> + <!-- Consider the validity against a date passed as (optional) parameter --> + <filter-list-by-date list-name="routings" valid-date-name="filterDate"/> + <!-- TODO: we should consider the quantity to select the best routing --> + <first-from-list list-name="routings" entry-name="routingGS"/> + <!-- If there are no routings associated with our product and it's a variant, then + check to see if it's virtual product has a routing --> + <if-empty field-name="routingGS"> + <entity-condition entity-name="ProductAssoc" list-name="virtualProductAssocList"> + <condition-list combine="and"> + <condition-expr field-name="productIdTo" env-name="parameters.productId" /> + <condition-expr field-name="productAssocTypeId" value="PRODUCT_VARIANT" /> + </condition-list> + </entity-condition> + <filter-list-by-date list-name="virtualProductAssocList" valid-date-name="filterDate"/> + <first-from-list list-name="virtualProductAssocList" entry-name="virtualProductAssoc"/> + <if-not-empty field-name="virtualProductAssoc"> + <set from-field="virtualProductAssoc.productId" field="lookupRouting.productId"/> + <set value="ROU_PROD_TEMPLATE" field="lookupRouting.workEffortGoodStdTypeId"/> + <find-by-and entity-name="WorkEffortGoodStandard" list-name="routings" map-name="lookupRouting"/> + <!-- Consider the validity against a date passed as (optional) parameter --> + <filter-list-by-date list-name="routings" valid-date-name="filterDate"/> + <!-- TODO: we should consider the quantity to select the best routing --> + <first-from-list list-name="routings" entry-name="routingGS"/> + </if-not-empty> + </if-empty> </else> </if-not-empty> - + <if-not-empty field-name="routingGS"> + <clear-field field-name="lookupRouting"/> + <set from-field="routingGS.workEffortId" field="lookupRouting.workEffortId"/> + <find-by-primary-key entity-name="WorkEffort" value-name="routing" map-name="lookupRouting"/> + <else> + <!-- The default routing is used when no explicit routing is associated to the product + and the ignoreDefaultRouting is not equals to Y --> + <if> + <condition> + <or> + <if-empty field-name="parameters.ignoreDefaultRouting"/> + <if-compare field-name="parameters.ignoreDefaultRouting" operator="equals" value="N"/> + </or> + </condition> + <then> + <clear-field field-name="lookupRouting"/> + <set value="DEFAULT_ROUTING" field="lookupRouting.workEffortId"/> + <find-by-primary-key entity-name="WorkEffort" value-name="routing" map-name="lookupRouting"/> + </then> + </if> + </else> + </if-not-empty> <if-not-empty field-name="routing"> <set from-field="routing.workEffortId" field="lookupTasks.workEffortIdFrom"/> <string-to-list string="sequenceNum" list-name="tasksOrder"/> Modified: incubator/ofbiz/trunk/applications/manufacturing/servicedef/services_routing.xml URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/manufacturing/servicedef/services_routing.xml?view=diff&rev=464217&r1=464216&r2=464217 ============================================================================== --- incubator/ofbiz/trunk/applications/manufacturing/servicedef/services_routing.xml (original) +++ incubator/ofbiz/trunk/applications/manufacturing/servicedef/services_routing.xml Sun Oct 15 08:53:54 2006 @@ -43,6 +43,8 @@ location="org/ofbiz/manufacturing/routing/RoutingServices.xml" invoke="getProductRouting"> <description>Get the product's routing and routing tasks</description> <attribute mode="IN" name="productId" optional="false" type="String"/> + <attribute mode="IN" name="workEffortId" optional="true" type="String"/> + <attribute mode="IN" name="applicableDate" optional="true" type="java.sql.Timestamp"/> <attribute mode="IN" name="ignoreDefaultRouting" optional="true" type="String"/><!-- If this is set to Y, the default routing is not returned --> <attribute mode="OUT" name="routing" type="GenericValue" optional="true"/> <attribute mode="OUT" name="tasks" type="java.util.List" optional="true"/> Modified: incubator/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java?view=diff&rev=464217&r1=464216&r2=464217 ============================================================================== --- incubator/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java (original) +++ incubator/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java Sun Oct 15 08:53:54 2006 @@ -191,35 +191,16 @@ Debug.logWarning(e.getMessage(), module); return ServiceUtil.returnError(e.getMessage()); } - - // ------------------- - // Components - // ------------------- - // The components are retrieved using the getManufacturingComponents service - // (that performs a bom breakdown and if needed runs the configurator). - List components = null; - Map serviceContext = new HashMap(); - serviceContext.put("productId", productId); // the product that we want to manufacture - serviceContext.put("quantity", pRQuantity); // the quantity that we want to manufacture - serviceContext.put("userLogin", userLogin); - Map resultService = null; - try { - resultService = dispatcher.runSync("getManufacturingComponents", serviceContext); - components = (List)resultService.get("components"); // a list of objects representing the product's components - if (workEffortId == null) { - workEffortId = (String)resultService.get("workEffortId"); // the product routing id - } - } catch (GenericServiceException e) { - Debug.logError(e, "Problem calling the getManufacturingComponents service", module); - return ServiceUtil.returnError(e.getMessage()); - } - + // ------------------- // Routing and routing tasks // ------------------- // Select the product's routing try { - Map routingInMap = UtilMisc.toMap("productId", productId, "userLogin", userLogin); + Map routingInMap = UtilMisc.toMap("productId", productId, "applicableDate", startDate, "userLogin", userLogin); + if (workEffortId != null) { + routingInMap.put("workEffortId", workEffortId); + } Map routingOutMap = dispatcher.runSync("getProductRouting", routingInMap); routing = (GenericValue)routingOutMap.get("routing"); routingTaskAssocs = (List)routingOutMap.get("tasks"); @@ -233,7 +214,26 @@ if (routingTaskAssocs == null || routingTaskAssocs.size()==0) { return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ManufacturingRoutingHasNoRoutingTask", locale)); } - + + // ------------------- + // Components + // ------------------- + // The components are retrieved using the getManufacturingComponents service + // (that performs a bom breakdown and if needed runs the configurator). + List components = null; + Map serviceContext = new HashMap(); + serviceContext.put("productId", productId); // the product that we want to manufacture + serviceContext.put("quantity", pRQuantity); // the quantity that we want to manufacture + serviceContext.put("userLogin", userLogin); + Map resultService = null; + try { + resultService = dispatcher.runSync("getManufacturingComponents", serviceContext); + components = (List)resultService.get("components"); // a list of objects representing the product's components + } catch (GenericServiceException e) { + Debug.logError(e, "Problem calling the getManufacturingComponents service", module); + return ServiceUtil.returnError(e.getMessage()); + } + // ProductionRun header creation, if (workEffortName == null) { String prdName = UtilValidate.isNotEmpty(product.getString("productName"))? product.getString("productName"): product.getString("productId");