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 2009/05/26 07:32:06 UTC
svn commit: r778565 - in /ofbiz/trunk/applications:
manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java
product/script/org/ofbiz/product/cost/CostServices.xml
product/servicedef/services_cost.xml
Author: jacopoc
Date: Tue May 26 05:32:04 2009
New Revision: 778565
URL: http://svn.apache.org/viewvc?rev=778565&view=rev
Log:
Misc fixes and enhancements for the costing routines: there is still room for improvements but at least now the standard costing and actual costing are based on the same rules.
Modified:
ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java
ofbiz/trunk/applications/product/script/org/ofbiz/product/cost/CostServices.xml
ofbiz/trunk/applications/product/servicedef/services_cost.xml
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=778565&r1=778564&r2=778565&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 Tue May 26 05:32:04 2009
@@ -1012,6 +1012,28 @@
dispatcher.runSync(customMethod.getString("customMethodName"), inMap);
}
}
+ // Now get the cost information associated to the fixed asset and compute the costs
+ GenericValue fixedAsset = workEffort.getRelatedOne("FixedAsset");
+ if (UtilValidate.isEmpty(fixedAsset) && UtilValidate.isNotEmpty(routingTask)) {
+ fixedAsset = routingTask.getRelatedOne("FixedAsset");
+ }
+ if (UtilValidate.isNotEmpty(fixedAsset)) {
+ List setupCosts = fixedAsset.getRelatedByAnd("FixedAssetStdCost", UtilMisc.toMap("fixedAssetStdCostTypeId", "SETUP_COST"));
+ GenericValue setupCost = EntityUtil.getFirst(EntityUtil.filterByDate(setupCosts));
+ List usageCosts = fixedAsset.getRelatedByAnd("FixedAssetStdCost", UtilMisc.toMap("fixedAssetStdCostTypeId", "USAGE_COST"));
+ GenericValue usageCost = EntityUtil.getFirst(EntityUtil.filterByDate(usageCosts));
+ if (UtilValidate.isNotEmpty(setupCost) || UtilValidate.isNotEmpty(usageCost)) {
+ String currencyUomId = (setupCost != null? setupCost.getString("amountUomId"): usageCost.getString("amountUomId"));
+ BigDecimal fixedAssetCost = (setupCost.getBigDecimal("amount").multiply(BigDecimal.valueOf(actualSetupMillis.doubleValue()))).add(usageCost.getBigDecimal("amount").multiply(BigDecimal.valueOf(actualMilliSeconds.doubleValue()))).setScale(decimals, rounding);
+ fixedAssetCost = fixedAssetCost.divide(BigDecimal.valueOf(3600000)).setScale(decimals, rounding);
+ // store the cost
+ Map inMap = UtilMisc.toMap("userLogin", userLogin, "workEffortId", productionRunTaskId);
+ inMap.put("costComponentTypeId", "ACTUAL_ROUTE_COST");
+ inMap.put("costUomId", currencyUomId);
+ inMap.put("cost", fixedAssetCost);
+ dispatcher.runSync("createCostComponent", inMap);
+ }
+ }
} catch (Exception e) {
return ServiceUtil.returnError("Unable to create routing costs for the production run task [" + productionRunTaskId + "]: " + e.getMessage());
}
@@ -1876,8 +1898,8 @@
Timestamp toDate = (Timestamp)context.get("toDate");
BigDecimal addQuantityProduced = (BigDecimal)context.get("addQuantityProduced");
BigDecimal addQuantityRejected = (BigDecimal)context.get("addQuantityRejected");
- Double addSetupTime = (Double)context.get("addSetupTime");
- Double addTaskTime = (Double)context.get("addTaskTime");
+ BigDecimal addSetupTime = (BigDecimal)context.get("addSetupTime");
+ BigDecimal addTaskTime = (BigDecimal)context.get("addTaskTime");
String comments = (String)context.get("comments");
Boolean issueRequiredComponents = (Boolean)context.get("issueRequiredComponents");
Map componentsLocationMap = (Map)context.get("componentsLocationMap");
@@ -1898,10 +1920,10 @@
addQuantityRejected = BigDecimal.ZERO;
}
if (addSetupTime == null) {
- addSetupTime = Double.valueOf(0);
+ addSetupTime = BigDecimal.ZERO;
}
if (addTaskTime == null) {
- addTaskTime = Double.valueOf(0);
+ addTaskTime = BigDecimal.ZERO;
}
if (comments == null) {
comments = "";
Modified: ofbiz/trunk/applications/product/script/org/ofbiz/product/cost/CostServices.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/script/org/ofbiz/product/cost/CostServices.xml?rev=778565&r1=778564&r2=778565&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/script/org/ofbiz/product/cost/CostServices.xml (original)
+++ ofbiz/trunk/applications/product/script/org/ofbiz/product/cost/CostServices.xml Tue May 26 05:32:04 2009
@@ -180,12 +180,12 @@
<set-service-fields service-name="getEstimatedTaskTime" map="parameters" to-map="inputMap"/>
<set from-field="parameters.workEffortId" field="inputMap.taskId"/>
<call-service service-name="getEstimatedTaskTime" in-map-name="inputMap">
- <result-to-field result-name="estimatedTaskTime"/>
+ <result-to-field result-name="estimatedTaskTime" field="totalEstimatedTaskTime"/>
<result-to-field result-name="setupTime"/>
</call-service>
<calculate field="estimatedTaskTime" decimal-scale="6">
- <calcop field="estimatedTaskTime" operator="subtract">
+ <calcop field="totalEstimatedTaskTime" operator="subtract">
<calcop field="setupTime" operator="get"/>
</calcop>
</calculate>
@@ -222,7 +222,42 @@
</calcop>
</calculate>
+ <!-- Now compute the costs derived from CostComponentCalc records associated with the task -->
+ <get-related relation-name="WorkEffortCostCalc" list="weccs" value-field="task"/>
+ <filter-list-by-date list="weccs"/>
+ <iterate entry="wecc" list="weccs">
+ <clear-field field="totalCostComponentCost"/>
+ <clear-field field="totalCostComponentTime"/>
+ <get-related-one relation-name="CostComponentCalc" to-value-field="costComponentCalc" value-field="wecc"/>
+ <get-related-one relation-name="CustomMethod" to-value-field="customMethod" value-field="costComponentCalc"/>
+ <if-empty field="customMethod">
+ <if-not-empty field="costComponentCalc.perMilliSecond">
+ <if-compare operator="not-equals" value="0" field="costComponentCalc.perMilliSecond" type="BigDecimal">
+ <calculate field="totalCostComponentTime" decimal-scale="6">
+ <calcop field="totalEstimatedTaskTime" operator="divide">
+ <calcop field="costComponentCalc.perMilliSecond" operator="get"/>
+ </calcop>
+ </calculate>
+ <calculate field="totalCostComponentCost" decimal-scale="6">
+ <calcop field="totalCostComponentTime" operator="multiply">
+ <calcop field="costComponentCalc.variableCost" operator="get"/>
+ </calcop>
+ </calculate>
+ <calculate field="totalCostComponentCost" decimal-scale="6">
+ <calcop field="totalCostComponentCost" operator="add">
+ <calcop field="costComponentCalc.fixedCost" operator="get"/>
+ </calcop>
+ </calculate>
+ <set field="costsByType.${wecc.costComponentTypeId}" from-field="totalCostComponentCost"/>
+ </if-compare>
+ </if-not-empty>
+ <else>
+ <!-- FIXME: formulas are still not supported for standard costs -->
+ </else>
+ </if-empty>
+ </iterate>
<field-to-result field="taskCost"/>
+ <field-to-result field="costsByType"/>
</simple-method>
<!-- services to automatically generate cost information -->
@@ -296,12 +331,25 @@
<set from-field="routing.workEffortId" field="callSvcMap.routingId"/>
<call-service service-name="getTaskCost" in-map-name="callSvcMap">
<result-to-field result-name="taskCost" field="taskCost"/>
+ <result-to-field result-name="costsByType" field="costsByType"/>
</call-service>
<calculate field="totalTaskCost" decimal-scale="6">
<calcop field="totalTaskCost" operator="add">
<calcop field="taskCost" operator="get"/>
</calcop>
</calculate>
+ <iterate-map map="costsByType" key="costType" value="costAmount">
+ <if-not-empty field="totalCostsByType.${costType}">
+ <calculate field="totalCostsByType.${costType}" decimal-scale="6">
+ <calcop field="costAmount" operator="add">
+ <calcop field="totalCostsByType.${costType}" operator="get"/>
+ </calcop>
+ </calculate>
+ <else>
+ <set field="totalCostsByType.${costType}" from-field="costAmount"/>
+ </else>
+ </if-not-empty>
+ </iterate-map>
</iterate>
<calculate field="totalCost" decimal-scale="6">
@@ -331,7 +379,15 @@
<call-service service-name="recreateCostComponent" in-map-name="callSvcMap"/>
</if-compare>
</if-not-empty>
-
+ <iterate-map map="totalCostsByType" key="costType" value="totalCostAmount">
+ <clear-field field="callSvcMap"/>
+ <set value="${parameters.costComponentTypePrefix}_${costType}" field="callSvcMap.costComponentTypeId"/>
+ <set from-field="parameters.productId" field="callSvcMap.productId"/>
+ <set from-field="parameters.currencyUomId" field="callSvcMap.costUomId"/>
+ <set from-field="totalCostAmount" field="callSvcMap.cost"/>
+ <call-service service-name="recreateCostComponent" in-map-name="callSvcMap"/>
+ </iterate-map>
+
<field-to-result field="totalCost"/>
</simple-method>
<simple-method method-name="calculateProductAverageCost" short-description="Calculate inventory average cost for a product">
Modified: ofbiz/trunk/applications/product/servicedef/services_cost.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/services_cost.xml?rev=778565&r1=778564&r2=778565&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/servicedef/services_cost.xml (original)
+++ ofbiz/trunk/applications/product/servicedef/services_cost.xml Tue May 26 05:32:04 2009
@@ -72,6 +72,7 @@
<attribute mode="IN" name="productId" optional="true" type="String"/>
<attribute mode="IN" name="routingId" optional="true" type="String"/>
<attribute mode="OUT" name="taskCost" type="BigDecimal" optional="false"/>
+ <attribute mode="OUT" name="costsByType" type="Map" optional="true"/>
</service>
<service name="calculateProductCosts" engine="simple" auth="true"
location="component://product/script/org/ofbiz/product/cost/CostServices.xml" invoke="calculateProductCosts">