Author: apatel
Date: Mon Aug 10 12:36:53 2009 New Revision: 802764 URL: http://svn.apache.org/viewvc?rev=802764&view=rev Log: Use product average cost in COGS transactions. Thanks Sumit for patch. Thanks Vince and Eva for defining requirement and reviewing implementation. Modified: ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/ledger/GeneralLedgerServices.xml ofbiz/trunk/applications/accounting/servicedef/services_cost.xml ofbiz/trunk/applications/product/script/org/ofbiz/product/cost/CostServices.xml ofbiz/trunk/applications/product/servicedef/secas.xml Modified: ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/ledger/GeneralLedgerServices.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/ledger/GeneralLedgerServices.xml?rev=802764&r1=802763&r2=802764&view=diff ============================================================================== --- ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/ledger/GeneralLedgerServices.xml (original) +++ ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/ledger/GeneralLedgerServices.xml Mon Aug 10 12:36:53 2009 @@ -1324,10 +1324,14 @@ </entity-and> <first-from-list list="billToCustomers" entry="billToCustomer"/> <!-- TODO: handle serialized inventory --> + <set field="getProdAvgCostMap.inventoryItem" from-field="inventoryItem"/> + <call-service service-name="getProductAverageCost" in-map-name="getProdAvgCostMap"> + <result-to-field result-name="unitCost"/> + </call-service> <calculate field="origAmount" decimal-scale="${ledgerDecimals}" rounding-mode="${roundingMode}"> <calcop operator="multiply"> <calcop operator="get" field="itemIssuance.quantity"/> - <calcop operator="get" field="inventoryItem.unitCost"/> + <calcop operator="get" field="unitCost"/> </calcop> </calculate> <!-- prepare the doble posting (D/C) entries (AcctgTransEntry) --> @@ -1382,10 +1386,14 @@ </entity-and> <first-from-list list="billToCustomers" entry="billToCustomer"/> <!-- TODO: handle serialized inventory --> + <set field="getProdAvgCostMap.inventoryItem" from-field="inventoryItem"/> + <call-service service-name="getProductAverageCost" in-map-name="getProdAvgCostMap"> + <result-to-field result-name="unitCost"/> + </call-service> <calculate field="origAmount" decimal-scale="${ledgerDecimals}" rounding-mode="${roundingMode}"> <calcop operator="multiply"> <calcop operator="get" field="parameters.canceledQuantity"/> - <calcop operator="get" field="inventoryItem.unitCost"/> + <calcop operator="get" field="unitCost"/> </calcop> </calculate> <!-- prepare the doble posting (D/C) entries (AcctgTransEntry) --> @@ -1442,10 +1450,19 @@ </else> </if-not-empty> <!-- TODO: handle serialized inventory --> + <if-not-empty field="shipmentReceipt.returnId"> + <set field="getProdAvgCostMap.inventoryItem" from-field="inventoryItem"/> + <call-service service-name="getProductAverageCost" in-map-name="getProdAvgCostMap"> + <result-to-field result-name="unitCost"/> + </call-service> + <else> + <set field="unitCost" from-field="inventoryItem.unitCost"/> + </else> + </if-not-empty> <calculate field="origAmount" decimal-scale="${ledgerDecimals}" rounding-mode="${roundingMode}"> <calcop operator="multiply"> <calcop operator="get" field="shipmentReceipt.quantityAccepted"/> - <calcop operator="get" field="inventoryItem.unitCost"/> + <calcop operator="get" field="unitCost"/> </calcop> </calculate> <!-- prepare the doble posting (D/C) entries (AcctgTransEntry) --> Modified: ofbiz/trunk/applications/accounting/servicedef/services_cost.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/servicedef/services_cost.xml?rev=802764&r1=802763&r2=802764&view=diff ============================================================================== --- ofbiz/trunk/applications/accounting/servicedef/services_cost.xml (original) +++ ofbiz/trunk/applications/accounting/servicedef/services_cost.xml Mon Aug 10 12:36:53 2009 @@ -93,4 +93,19 @@ <auto-attributes include="pk" mode="IN" optional="false"/> </service> + <service name="updateProductAverageCostOnReceiveInventory" default-entity-name="ProductAverageCost" engine="simple" + location="component://product/script/org/ofbiz/product/cost/CostServices.xml" invoke="updateProductAverageCostOnReceiveInventory" auth="true"> + <description>Update a Product Average Cost record on receive inventory</description> + <permission-service service-name="acctgCostPermissionCheck" main-action="UPDATE"/> + <attribute name="facilityId" type="String" mode="IN" optional="false"/> + <attribute name="productId" type="String" mode="IN" optional="false"/> + <attribute name="inventoryItemId" type="String" mode="IN" optional="false"/> + </service> + + <service name="getProductAverageCost" engine="simple" + location="component://product/script/org/ofbiz/product/cost/CostServices.xml" invoke="getProductAverageCost" auth="true"> + <description>Get Average cost of a product</description> + <attribute name="inventoryItem" type="org.ofbiz.entity.GenericValue" mode="IN" optional="true"/> + <attribute name="unitCost" type="BigDecimal" mode="OUT" optional="false"/> + </service> </services> 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=802764&r1=802763&r2=802764&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 Mon Aug 10 12:36:53 2009 @@ -490,4 +490,75 @@ <field-to-result field="currencyUomId"/> </if-compare> </simple-method> + + <simple-method method-name="updateProductAverageCostOnReceiveInventory" short-description="Update a Product Average Cost record on receive inventory"> + <entity-one entity-name="InventoryItem" value-field="inventoryItem"/> + <set field="organizationPartyId" from-field="inventoryItem.ownerPartyId"/> + <if-empty field="organizationPartyId"> + <entity-one entity-name="Facility" value-field="facility" auto-field-map="true"/> + <set field="organizationPartyId" from-field="facility.ownerPartyId"/> + <if-empty field="organizationPartyId"> + <get-related-one relation-name="ProductStore" to-value-field="productStore" value-field="facility"/> + <set field="organizationPartyId" from-field="productStore.ownerPartyId"/> + <if-empty field="organizationPartyId"> + <add-error error-list-name="error_list"><fail-message message="Owner Party is missing, please provide any of the Inventory Owner or Facility Owner or ProductStore Owner."/></add-error> + </if-empty> + <check-errors/> + </if-empty> + </if-empty> + + <entity-and entity-name="ProductAverageCost" list="productAverageCostList" filter-by-date="true"> + <field-map field-name="productId" from-field="parameters.productId"/> + <field-map field-name="facilityId" from-field="parameters.facilityId"/> + <field-map field-name="productAverageCostTypeId" value="SIMPLE_AVG_COST"/> + <field-map field-name="organizationPartyId"/> + </entity-and> + <first-from-list list="productAverageCostList" entry="productAverageCost"/> + + <set-service-fields service-name="createProductAverageCost" map="parameters" to-map="productAverageCostMap"/> + <set field="productAverageCostMap.productAverageCostTypeId" value="SIMPLE_AVG_COST"/> + <set field="productAverageCostMap.organizationPartyId" from-field="organizationPartyId"/> + <if-empty field="productAverageCost"> + <set field="productAverageCostMap.averageCost" from-field="inventoryItem.unitCost"/> + <else> + <!-- Expire existing one and calculate average cost --> + <set-service-fields service-name="updateProductAverageCost" map="productAverageCost" to-map="updateProductAverageCostMap"/> + <now-timestamp field="updateProductAverageCostMap.thruDate"/> + <call-service service-name="updateProductAverageCost" in-map-name="updateProductAverageCostMap"/> + + <set field="productAverageCostMap.averageCost" value="${(productAverageCost.averageCost + inventoryItem.unitCost)/2}" type="BigDecimal"/> + <property-to-field resource="arithmetic" property="finaccount.decimals" field="roundingDecimals" default="2"/> + <property-to-field resource="arithmetic" property="finaccount.roundingSimpleMethod" field="roundingMode" default="HalfUp"/> + <calculate field="productAverageCostMap.averageCost" type="BigDecimal" decimal-scale="${roundingDecimals}" rounding-mode="${roundingMode}"> + <calcop operator="get" field="productAverageCostMap.averageCost"/> + </calculate> + </else> + </if-empty> + <call-service service-name="createProductAverageCost" in-map-name="productAverageCostMap"/> + <log level="info" message="For facilityId ${parameters.facilityId}, Average cost of product ${parameters.productId} is set from ${updateProductAverageCostMap.averageCost} to ${productAverageCostMap.averageCost}"/> + </simple-method> + + <simple-method method-name="getProductAverageCost" short-description="Service to get the average cost of product"> + <set field="inventoryItem" from-field="parameters.inventoryItem"/> + <set field="getPartyAcctgPrefMap.organizationPartyId" from-field="inventoryItem.ownerPartyId"/> + <call-service service-name="getPartyAccountingPreferences" in-map-name="getPartyAcctgPrefMap"> + <result-to-field result-name="partyAccountingPreference"/> + </call-service> + <if-compare field="partyAccountingPreference.cogsMethodId" operator="equals" value="COGS_AVG_COST"> + <entity-and entity-name="ProductAverageCost" list="productAverageCostList" filter-by-date="true"> + <field-map field-name="productAverageCostTypeId" value="SIMPLE_AVG_COST"/> <!-- TODO: handle for WEIGHTED_AVG_COST and MOVING_AVG_COST --> + <field-map field-name="organizationPartyId" from-field="inventoryItem.ownerPartyId"/> + <field-map field-name="productId" from-field="inventoryItem.productId"/> + <field-map field-name="facilityId" from-field="inventoryItem.facilityId"/> + </entity-and> + <first-from-list list="productAverageCostList" entry="productAverageCost"/> + </if-compare> + <if-not-empty field="productAverageCost"> + <set field="unitCost" from-field="productAverageCost.averageCost" type="BigDecimal"/> + <else> + <set field="unitCost" from-field="inventoryItem.unitCost" type="BigDecimal"/> + </else> + </if-not-empty> + <field-to-result field="unitCost"/> + </simple-method> </simple-methods> Modified: ofbiz/trunk/applications/product/servicedef/secas.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/secas.xml?rev=802764&r1=802763&r2=802764&view=diff ============================================================================== --- ofbiz/trunk/applications/product/servicedef/secas.xml (original) +++ ofbiz/trunk/applications/product/servicedef/secas.xml Mon Aug 10 12:36:53 2009 @@ -123,4 +123,10 @@ <condition field-name="orderId" operator="is-not-empty"/> <action service="updateIssuanceShipmentAndPoOnReceiveInventory" mode="sync"/> </eca> + + <!-- Set the average cost of product --> + <eca service="receiveInventoryProduct" event="commit"> + <action service="updateProductAverageCostOnReceiveInventory" mode="sync"/> + </eca> + </service-eca> |
Free forum by Nabble | Edit this page |