Author: nmalin
Date: Thu Jun 29 07:46:02 2017 New Revision: 1800245 URL: http://svn.apache.org/viewvc?rev=1800245&view=rev Log: Improved: Convert RateServices.xml mini-lang to groovyDSL (OFBIZ-9381) finish the service conversion : getRateAmount, getRatesAmountsFromWorkEffortId, getRatesAmountsFromPartyId, getRatesAmountsFromEmplPositionTypeId and filterRateAmountList I create a generic groovy function getRateAmoutForm to remove duplicate code and refactoring the filterRateAmount for simplicity Removed: ofbiz/ofbiz-framework/trunk/applications/accounting/minilang/rate/ Modified: ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/rate/RateServices.groovy ofbiz/ofbiz-framework/trunk/applications/accounting/servicedef/services_rate.xml Modified: ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/rate/RateServices.groovy URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/rate/RateServices.groovy?rev=1800245&r1=1800244&r2=1800245&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/rate/RateServices.groovy (original) +++ ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/rate/RateServices.groovy Thu Jun 29 07:46:02 2017 @@ -128,3 +128,142 @@ def expirePartyRate() { } return success() } + +// Get the applicable rate amount value +def getRateAmount() { + /* Search for the applicable rate from most specific to most general in the RateAmount entity + Defaults for periodTypeId is per hour and default currency is the currency in general.properties + The order is: + 1. for specific rateTypeId, workEffortId (workEffort) + 2. for specific rateTypeId, partyId (party) + 3. for specific rateTypeId, emplPositionTypeId (emplPositionType) + 4. for specific rateTypeId (rateType) + + Then, the results are filtered to improve the result. If you pass a workEffortId and a partyId, + the service will first search the list of all the rateAmount with the specified workEffortId. Then, if + there is at least one rateAmount with same partyId than the one in the parameter in the list, the list will + be reduced to those entries. + At the end, the first record of the list is chosen. + + For a easier debugging time, there is a log triggered when no records are found for the input. This log + shows up when there are rateAmounts corresponding to the input parameters without the rateCurrencyUomId and + the periodTypeId.*/ + if (!parameters.rateCurrencyUomId) { + parameters.rateCurrencyUomId = UtilProperties.getPropertyValue('general.properties', 'currency.uom.id.default', 'USD') + } + if (!parameters.periodTypeId) { + parameters.periodTypeId = 'RATE_HOUR' + } + String serviceName = null; + if (parameters.workEffortId && parameters.workEffortId != '_NA_') { + // workeffort level + level = 'workEffort' + serviceName = 'getRatesAmountsFromWorkEffortId' + } else if (parameters.partyId && parameters.partyId != '_NA_') { + // party level + level='partyId' + serviceName = 'getRatesAmountsFromPartyId' + } else if (parameters.emplPositionTypeId && parameters.emplPositionTypeId != '_NA_') { + // party level + level = 'emplPositionTypeId' + serviceName = 'getRatesAmountsFromEmplPositionTypeId' + } + if (serviceName) { + logError(parameters.toString() + " " + serviceName.toString()) + Map result = run service: serviceName, with: parameters + parameters.ratesList = result.ratesList + logError(parameters.ratesList.toString()) + result = run service: 'filterRateAmountList', with: parameters + parameters.ratesList = result.filteredRatesList + } + + if (UtilValidate.isEmpty(parameters.ratesList)) { + parameters.ratesList = from('RateAmount').where([rateTypeId: parameters.rateTypeId]).queryList(); + Map result = run service: 'filterRateAmountList', with: parameters + parameters.ratesList = EntityUtil.filterByDate(result.filteredRatesList) + } + + if (UtilValidate.isEmpty(parameters.ratesList)) { + rateType = from('RateAmount').where([rateTypeId: parameters.rateTypeId]).queryOne() + logError('A valid rate amount could not be found for rateType: ' + rateType.description) + } + + // We narrowed as much as we could the result, now returning the first record of the list + Map result = success() + if (UtilValidate.isNotEmpty(parameters.ratesList)) { + rateAmount = parameters.ratesList[0] + if (! rateAmount.rateAmount) rateAmount.rateAmount = BigDecimal.ZERO + result.rateAmount = rateAmount.rateAmount + result.periodTypeId = rateAmount.periodTypeId + result.rateCurrencyUomId = rateAmount.rateCurrencyUomId + result.level = level + result.fromDate = rateAmount.fromDate + } + return result +} + +//Generic fonction to resolve a rate amount from a pk field +def getRatesAmountsFrom(String field) { + String entityName = null + if (field == 'workEffortId') entityName = 'WorkEffort' + if (field == 'partyId') entityName = 'Party' + if (field == 'emplPositionTypeId') entityName = 'EmplPositionType' + + Map condition = [rateTypeId: parameters.rateTypeId, + periodTypeId: parameters.periodTypeId, + rateCurrencyUomId: parameters.rateCurrencyUomId] + condition.put(field, parameters.get(field)) + List ratesList = from('RateAmount').where(condition).filterByDate().queryList() + if (UtilValidate.isEmpty(ratesList)) { + GenericValue periodType = from('PeriodType').where([periodTypeId: parameters.periodTypeId]).queryOne() + GenericValue rateType = from('RateType').where([rateTypeId: parameters.rateTypeId]).queryOne() + GenericValue partyNameView = from('PartyNameView').where([partyId: parameters.partyId]).queryOne() + logError('A valid rate entry could be found for rateType:' + rateType.description + ', ' + entityName + ':' + parameters.get(field) + + ', party: ' + partyNameView.lastName + partyNameView.middleName + partyNameView.firstName + partyNameView.groupName + + ' However.....not for the period:' + periodType.description + ' and currency:' + parameters.rateCurrencyUomId) + } + Map result = success() + result.ratesList = ratesList + return result +} +// Get all the rateAmount for a given workEffortId +def getRatesAmountsFromWorkEffortId() { + return getRatesAmountsFrom('workEffortId') +} +// Get all the rateAmount for a given partyId +def getRatesAmountsFromPartyId() { + return getRatesAmountsFrom('partyId') +} +// Get all the rateAmount for a given emplPositionTypeId +def getRatesAmountsFromEmplPositionTypeId() { + return getRatesAmountsFrom('emplPositionTypeId') +} + +//Filter a list of rateAmount. The result is the most heavily-filtered non-empty list +def filterRateAmountList() { + if (UtilValidate.isEmpty(parameters.ratesList)) { + logWarning('The list parameters.ratesList was empty, not processing any further') + return success() + } + //Check if there is a more specific rate + Map filterMap = [:] + if (parameters.workEffortId) { + filterMap.workEffortId = parameters.workEffortId + } + if (parameters.partyId) { + filterMap.partyId = parameters.partyId + } + if (parameters.emplPositionTypeId) { + filterMap.emplPositionTypeId = parameters.emplPositionTypeId + } + if (parameters.rateTypeId) { + filterMap.rateTypeId = parameters.rateTypeId + } + List tempRatesFilteredList = EntityUtil.filterByAnd(parameters.ratesList, filterMap) + if (UtilValidate.isNotEmpty(tempRatesFilteredList)) { + parameters.ratesList = tempRatesFilteredList + } + Map result = success() + result.filteredRatesList = parameters.ratesList + return result +} \ No newline at end of file Modified: ofbiz/ofbiz-framework/trunk/applications/accounting/servicedef/services_rate.xml URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/applications/accounting/servicedef/services_rate.xml?rev=1800245&r1=1800244&r2=1800245&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/applications/accounting/servicedef/services_rate.xml (original) +++ ofbiz/ofbiz-framework/trunk/applications/accounting/servicedef/services_rate.xml Thu Jun 29 07:46:02 2017 @@ -56,8 +56,8 @@ under the License. <override name="rateTypeId" optional="false"/> <override name="fromDate" optional="false"/> </service> - <service name="getRateAmount" default-entity-name="RateAmount" engine="simple" auth="true" - location="component://accounting/minilang/rate/RateServices.xml" invoke="getRateAmount"> + <service name="getRateAmount" default-entity-name="RateAmount" engine="groovy" auth="true" + location="component://accounting/groovyScripts/rate/RateServices.groovy" invoke="getRateAmount"> <description>Get Rate Amount</description> <permission-service service-name="acctgBasePermissionCheck" main-action="VIEW"/> <auto-attributes include="pk" mode="IN" optional="true"/> @@ -68,41 +68,38 @@ under the License. <attribute name="fromDate" type="Timestamp" mode="OUT" optional="true"/> <override name="rateTypeId" optional="false"/> </service> - <service name="getRatesAmountsFromWorkEffortId" default-entity-name="RateAmount" engine="simple" auth="true" - location="component://accounting/minilang/rate/RateServices.xml" invoke="getRatesAmountsFromWorkEffortId"> + <service name="getRatesAmountsFromWorkEffortId" default-entity-name="RateAmount" engine="groovy" auth="true" + location="component://accounting/groovyScripts/rate/RateServices.groovy" invoke="getRatesAmountsFromWorkEffortId"> <description>Get all Rates Amounts for a given workEffortId</description> <permission-service service-name="acctgBasePermissionCheck" main-action="VIEW"/> <auto-attributes include="pk" mode="IN" optional="true"/> <attribute name="periodTypeId" type="String" mode="INOUT" optional="true"/> <attribute name="rateCurrencyUomId" type="String" mode="INOUT" optional="true"/> - <attribute name="fromDate" type="Timestamp" mode="OUT" optional="true"/> <attribute name="ratesList" type="List" mode="OUT" optional="true"/> <override name="workEffortId" optional="false"/> </service> - <service name="getRatesAmountsFromPartyId" default-entity-name="RateAmount" engine="simple" auth="true" - location="component://accounting/minilang/rate/RateServices.xml" invoke="getRatesAmountsFromPartyId"> + <service name="getRatesAmountsFromPartyId" default-entity-name="RateAmount" engine="groovy" auth="true" + location="component://accounting/groovyScripts/rate/RateServices.groovy" invoke="getRatesAmountsFromPartyId"> <description>Get all Rates Amounts for a given partyId</description> <permission-service service-name="acctgBasePermissionCheck" main-action="VIEW"/> <auto-attributes include="pk" mode="IN" optional="true"/> <attribute name="periodTypeId" type="String" mode="INOUT" optional="true"/> <attribute name="rateCurrencyUomId" type="String" mode="INOUT" optional="true"/> - <attribute name="fromDate" type="Timestamp" mode="OUT" optional="true"/> <attribute name="ratesList" type="List" mode="OUT" optional="true"/> <override name="partyId" optional="false"/> </service> - <service name="getRatesAmountsFromEmplPositionTypeId" default-entity-name="RateAmount" engine="simple" auth="true" - location="component://accounting/minilang/rate/RateServices.xml" invoke="getRatesAmountsFromEmplPositionTypeId"> + <service name="getRatesAmountsFromEmplPositionTypeId" default-entity-name="RateAmount" engine="groovy" auth="true" + location="component://accounting/groovyScripts/rate/RateServices.groovy" invoke="getRatesAmountsFromEmplPositionTypeId"> <description>Get all Rates Amounts for a given emplPositionTypeId</description> <permission-service service-name="acctgBasePermissionCheck" main-action="VIEW"/> <auto-attributes include="pk" mode="IN" optional="true"/> <attribute name="periodTypeId" type="String" mode="INOUT" optional="true"/> <attribute name="rateCurrencyUomId" type="String" mode="INOUT" optional="true"/> - <attribute name="fromDate" type="Timestamp" mode="OUT" optional="true"/> <attribute name="ratesList" type="List" mode="OUT" optional="true"/> <override name="emplPositionTypeId" optional="false"/> </service> - <service name="filterRateAmountList" default-entity-name="RateAmount" engine="simple" auth="true" - location="component://accounting/minilang/rate/RateServices.xml" invoke="filterRateAmountList"> + <service name="filterRateAmountList" default-entity-name="RateAmount" engine="groovy" auth="true" + location="component://accounting/groovyScripts/rate/RateServices.groovy" invoke="filterRateAmountList"> <description>Get the most specific non-empty Rate Amount list from a list of Rate Amount, given the input parameters : workEffortId, partyId, emplPositionTypeId and rateTypeId</description> <auto-attributes include="pk" mode="IN" optional="true"/> |
Free forum by Nabble | Edit this page |