blob: 9063feb73fa0b0e0ead27edee4ab26797871b95a [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://ofbiz.apache.org/Simple-Method" xsi:schemaLocation="http://ofbiz.apache.org/Simple-Method http://ofbiz.apache.org/dtds/simple-methods.xsd">
<simple-method method-name="updateRateAmount" short-description="update/create a rate amount value">
<!-- set defaults -->
<if-empty field="parameters.rateCurrencyUomId">
<property-to-field resource="general.properties" property="currency.uom.id.default" field="parameters.rateCurrencyUomId"/>
</if-empty>
<if-empty field="parameters.periodTypeId">
<set field="parameters.periodTypeId" value="RATE_HOUR"/>
</if-empty>
<if-empty field="parameters.emplPositionTypeId">
<set field="parameters.emplPositionTypeId" value="_NA_"/>
</if-empty>
<if-empty field="parameters.partyId">
<set field="parameters.partyId" value="_NA_"/>
</if-empty>
<if-empty field="parameters.workEffortId">
<set field="parameters.workEffortId" value="_NA_"/>
</if-empty>
<!-- try to find existing value -->
<entity-and entity-name="RateAmount" list="rateAmounts" filter-by-date="true">
<field-map field-name="rateTypeId" from-field="parameters.rateTypeId"/>
<field-map field-name="workEffortId" from-field="parameters.workEffortId"/>
<field-map field-name="rateCurrencyUomId" from-field="parameters.rateCurrencyUomId"/>
<field-map field-name="emplPositionTypeId" from-field="parameters.emplPositionTypeId"/>
<field-map field-name="partyId" from-field="parameters.partyId"/>
<field-map field-name="periodTypeId" from-field="parameters.periodTypeId"/>
</entity-and>
<!-- end existing value -->
<if-not-empty field="rateAmounts">
<first-from-list list="rateAmounts" entry="rateAmount"/>
<if-compare-field field="rateAmount.rateAmount" operator="not-equals" to-field="parameters.rateAmount">
<set-service-fields service-name="deleteRateAmount" map="rateAmount" to-map="delRateAmount"/>
<call-service service-name="deleteRateAmount" in-map-name="delRateAmount"/>
</if-compare-field>
</if-not-empty>
<make-value entity-name="RateAmount" value-field="newEntity"/>
<set-pk-fields map="parameters" value-field="newEntity"/>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<if-empty field="newEntity.fromDate"><now-timestamp field="newEntity.fromDate"/></if-empty>
<clear-field field="newEntity.thruDate"/>
<create-value value-field="newEntity"/>
</simple-method>
<simple-method method-name="deleteRateAmount" short-description="update/create a rate amount value">
<!-- set defaults -->
<if-empty field="parameters.rateCurrencyUomId">
<property-to-field resource="general.properties" property="currency.uom.id.default" field="parameters.rateCurrencyUomId"/>
</if-empty>
<if-empty field="parameters.periodTypeId">
<set field="parameters.periodTypeId" value="RATE_HOUR"/>
</if-empty>
<if-empty field="parameters.emplPositionTypeId">
<set field="parameters.emplPositionTypeId" value="_NA_"/>
</if-empty>
<if-empty field="parameters.partyId">
<set field="parameters.partyId" value="_NA_"/>
</if-empty>
<if-empty field="parameters.workEffortId">
<set field="parameters.workEffortId" value="_NA_"/>
</if-empty>
<entity-one entity-name="RateAmount" value-field="rateAmount"/>
<if-not-empty field="rateAmount">
<now-timestamp field="nowTimestamp"/>
<set field ="previousDay" value="${groovy: org.apache.ofbiz.base.util.UtilDateTime.adjustTimestamp(nowTimestamp,5,-1)}" type="Timestamp"/>
<set field="rateAmount.thruDate" value="${groovy: org.apache.ofbiz.base.util.UtilDateTime.getDayEnd(previousDay)}" type="Timestamp"/>
<store-value value-field="rateAmount"/>
<else>
<add-error>
<fail-property resource="AccountingErrorUiLabels" property="AccountingDeleteRateAmount"/>
</add-error>
</else>
</if-not-empty>
</simple-method>
<simple-method method-name="getRateAmount" short-description="Get the applicable rate amount value">
<!--
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-empty field="parameters.rateCurrencyUomId">
<property-to-field resource="general.properties" property="currency.uom.id.default" field="parameters.rateCurrencyUomId"/>
</if-empty>
<if-empty field="parameters.periodTypeId">
<set field="parameters.periodTypeId" value="RATE_HOUR"/>
</if-empty>
<if><!-- workeffort level -->
<condition>
<and>
<not><if-empty field="parameters.workEffortId"/></not>
<if-compare field="parameters.workEffortId" value="_NA_" operator="not-equals"/>
</and>
</condition>
<then>
<set field="level" value="workEffort"/>
<call-service service-name="getRatesAmountsFromWorkEffortId" in-map-name="parameters">
<result-to-field result-name="ratesList" field="parameters.ratesList"/>
</call-service>
<call-service service-name="filterRateAmountList" in-map-name="parameters">
<result-to-field result-name="filteredRatesList" field="parameters.ratesList"/>
</call-service>
</then>
<else-if> <!-- party level -->
<condition>
<and>
<not><if-empty field="parameters.partyId"/></not>
<if-compare field="parameters.partyId" value="_NA_" operator="not-equals"/>
</and>
</condition>
<then>
<set field="level" value="partyId"/>
<call-service service-name="getRatesAmountsFromPartyId" in-map-name="parameters">
<result-to-field result-name="ratesList" field="parameters.ratesList"/>
</call-service>
<call-service service-name="filterRateAmountList" in-map-name="parameters">
<result-to-field result-name="filteredRatesList" field="parameters.ratesList"/>
</call-service>
</then>
</else-if>
<else-if> <!-- emplPositionType level -->
<condition>
<and>
<not><if-empty field="parameters.emplPositionTypeId"/></not>
<if-compare field="parameters.emplPositionTypeId" value="_NA_" operator="not-equals"/>
</and>
</condition>
<then>
<set field="level" value="emplPositionType"/>
<call-service service-name="getRatesAmountsFromEmplPositionTypeId" in-map-name="parameters">
<result-to-field result-name="ratesList" field="parameters.ratesList"/>
</call-service>
<call-service service-name="filterRateAmountList" in-map-name="parameters">
<result-to-field result-name="filteredRatesList" field="parameters.ratesList"/>
</call-service>
</then>
</else-if>
</if>
<if-empty field="parameters.ratesList">
<entity-and entity-name="RateAmount" list="ratesList" filter-by-date="true">
<field-map field-name="rateTypeId" from-field="parameters.rateTypeId"/>
</entity-and>
<call-service service-name="filterRateAmountList" in-map-name="parameters">
<result-to-field result-name="filteredRatesList" field="parameters.ratesList"/>
</call-service>
</if-empty>
<if-empty field="parameters.ratesList">
<entity-one entity-name="RateType" value-field="rateType"/>
<log level="error" message="A valid rate amount could not be found for rateType: ${rateType.description}"/>
</if-empty>
<!-- We narrowed as much as we could the result, now returning the first record of the list -->
<if-not-empty field="parameters.ratesList">
<first-from-list list="parameters.ratesList" entry="amount"/>
<if-empty field="amount.rateAmount">
<set field="amount.rateAmount" value="0" type="BigDecimal"/>
</if-empty>
<field-to-result field="amount.rateAmount" result-name="rateAmount"/>
<field-to-result field="amount.periodTypeId" result-name="periodTypeId"/>
<field-to-result field="amount.rateCurrencyUomId" result-name="rateCurrencyUomId"/>
<field-to-result field="level"/>
<field-to-result field="amount.fromDate" result-name="fromDate"/>
</if-not-empty>
</simple-method>
<simple-method method-name="getRatesAmountsFromWorkEffortId" short-description="Get all the rateAmount for a given workEffortId">
<entity-and entity-name="RateAmount" list="amounts" filter-by-date="true">
<field-map field-name="rateTypeId" from-field="parameters.rateTypeId"/>
<field-map field-name="workEffortId" from-field="parameters.workEffortId"/>
<field-map field-name="periodTypeId" from-field="parameters.periodTypeId"/>
<field-map field-name="rateCurrencyUomId" from-field="parameters.rateCurrencyUomId"/>
</entity-and>
<if-empty field="amounts">
<entity-one entity-name="Uom" value-field="currencyUomId">
<field-map field-name="uomId" from-field="parameters.rateCurrencyUomId"/>
</entity-one>
<entity-one entity-name="PeriodType" value-field="periodType"/>
<entity-one entity-name="RateType" value-field="rateType"/>
<entity-one entity-name="WorkEffort" value-field="workEffort"/>
<entity-one entity-name="PartyNameView" value-field="partyNameView"/>
<log level="error" message="A valid rate entry could be found for rateType: ${rateType.description}, workEffort: ${workEffort.workEffortName}, party: ${partyNameView.lastName} ${partyNameView.middleName} ${partyNameView.firstName}${partyNameView.groupName} However.....not for the period: ${period.description} and currency: ${currencyUomId.description}"/>
</if-empty>
<field-to-result field="amounts" result-name="ratesList"/>
<field-to-result field="level"/>
</simple-method>
<simple-method method-name="getRatesAmountsFromPartyId" short-description="Get all the rateAmount for a given partyId">
<entity-and entity-name="RateAmount" list="amounts" filter-by-date="true">
<field-map field-name="rateTypeId" from-field="parameters.rateTypeId"/>
<field-map field-name="partyId" from-field="parameters.partyId"/>
<field-map field-name="periodTypeId" from-field="parameters.periodTypeId"/>
<field-map field-name="rateCurrencyUomId" from-field="parameters.rateCurrencyUomId"/>
</entity-and>
<if-empty field="amounts">
<entity-one entity-name="Uom" value-field="currencyUomId">
<field-map field-name="uomId" from-field="parameters.rateCurrencyUomId"/>
</entity-one>
<entity-one entity-name="PeriodType" value-field="periodType"/>
<entity-one entity-name="RateType" value-field="rateType"/>
<entity-one entity-name="PartyNameView" value-field="partyNameView"/>
<log level="error" message="A valid rate entry could be found for rateType: ${rateType.description}, party: ${partyNameView.lastName} ${partyNameView.middleName} ${partyNameView.firstName}${partyNameView.groupName} However..... NOT for the period: ${period.description} and currency: ${currencyUomId.description}"/>
</if-empty>
<field-to-result field="amounts" result-name="ratesList"/>
<field-to-result field="level"/>
</simple-method>
<simple-method method-name="getRatesAmountsFromEmplPositionTypeId" short-description="Get all the rateAmount for a given emplPositionTypeId">
<entity-and entity-name="RateAmount" list="amounts" filter-by-date="true">
<field-map field-name="rateTypeId" from-field="parameters.rateTypeId"/>
<field-map field-name="emplPositionTypeId" from-field="parameters.emplPositionTypeId"/>
<field-map field-name="periodTypeId" from-field="parameters.periodTypeId"/>
<field-map field-name="rateCurrencyUomId" from-field="parameters.rateCurrencyUomId"/>
</entity-and>
<if-empty field="amounts">
<entity-one entity-name="Uom" value-field="currencyUomId">
<field-map field-name="uomId" from-field="parameters.rateCurrencyUomId"/>
</entity-one>
<entity-one entity-name="PeriodType" value-field="periodType"/>
<entity-one entity-name="RateType" value-field="rateType"/>
<entity-one entity-name="EmplPositionType" value-field="emplPositionType"/>
<log level="error" message="A valid rate entry could be found for rateType: ${rateType.description}, emplPositionType: ${emplPositionType.description}.... However.....NOT for the period: ${period.description} and currency: ${currencyUomId.description}"/>
</if-empty>
<field-to-result field="amounts" result-name="ratesList"/>
<field-to-result field="level"/>
</simple-method>
<simple-method method-name="filterRateAmountList" short-description="Filter a list of rateAmount. The result is the
most heavily-filtered non-empty list">
<if-empty field="parameters.ratesList">
<log level="warning" message="The list parameters.ratesList was empty, not processing any further"/>
<return/>
</if-empty>
<!-- Check if there is a more specific rate -->
<set field="filterMap"/>
<!-- First : if there are rates from the list with the workEffortId from the parameter -->
<if-not-empty field="parameters.workEffortId">
<set field="filterMap.workEffortId" from-field="parameters.workEffortId"/>
<filter-list-by-and list="parameters.ratesList" map="filterMap" to-list="tempRatesFilteredList"/>
<if-not-empty field="tempRatesFilteredList">
<set field="parameters.ratesList" from-field="tempRatesFilteredList"/>
</if-not-empty>
<clear-field field="filterMap"/>
<clear-field field="tempRatesFilteredList"/>
</if-not-empty>
<!-- Then : if there are rates from the list with the partyId from the parameter -->
<if-not-empty field="parameters.partyId">
<set field="filterMap.partyId" from-field="parameters.partyId"/>
<filter-list-by-and list="parameters.ratesList" map="filterMap" to-list="tempRatesFilteredList"/>
<if-not-empty field="tempRatesFilteredList">
<set field="parameters.ratesList" from-field="tempRatesFilteredList"/>
</if-not-empty>
<clear-field field="filterMap"/>
<clear-field field="tempRatesFilteredList"/>
</if-not-empty>
<!-- Then : if there are rates from the list with the emplPositionTypeId from the parameter -->
<if-not-empty field="parameters.emplPositionTypeId">
<set field="filterMap.emplPositionTypeId" from-field="parameters.emplPositionTypeId"/>
<filter-list-by-and list="parameters.ratesList" map="filterMap" to-list="tempRatesFilteredList"/>
<if-not-empty field="tempRatesFilteredList">
<set field="parameters.ratesList" from-field="tempRatesFilteredList"/>
</if-not-empty>
<clear-field field="filterMap"/>
<clear-field field="tempRatesFilteredList"/>
</if-not-empty>
<!-- Finally : if there are rates from the list with the rateTypeId from the parameter -->
<if-not-empty field="parameters.rateTypeId">
<set field="filterMap.rateTypeId" from-field="parameters.rateTypeId"/>
<filter-list-by-and list="parameters.ratesList" map="filterMap" to-list="tempRatesFilteredList"/>
<if-not-empty field="tempRatesFilteredList">
<set field="parameters.ratesList" from-field="tempRatesFilteredList"/>
</if-not-empty>
<clear-field field="filterMap"/>
<clear-field field="tempRatesFilteredList"/>
</if-not-empty>
<!-- Return the list -->
<field-to-result field="parameters.ratesList" result-name="filteredRatesList"/>
</simple-method>
<!-- party rate services -->
<simple-method method-name="updatePartyRate" short-description="Update/Create PartyRate">
<!-- check if already exist is so expire current record -->
<entity-and entity-name="PartyRate" list="partyRates" filter-by-date="true">
<field-map field-name="partyId" from-field="parameters.partyId"/>
<field-map field-name="rateTypeId" from-field="parameters.rateTypeId"/>
</entity-and>
<if-not-empty field="partyRates">
<first-from-list list="partyRates" entry="partyRate"/>
<now-timestamp field="partyRate.thruDate"/>
<store-value value-field="partyRate"/>
</if-not-empty>
<make-value value-field="newEntity" entity-name="PartyRate"/>
<set-pk-fields map="parameters" value-field="newEntity"/>
<if-empty field="newEntity.fromDate"><now-timestamp field="newEntity.fromDate"/></if-empty>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<call-simple-method method-name="checkOtherDefaultRate"/>
<create-value value-field="newEntity"/>
<if-not-empty field="parameters.rateAmount">
<set-service-fields service-name="updateRateAmount" map="parameters" to-map="updRate"/>
<call-service service-name="updateRateAmount" in-map-name="updRate"/>
</if-not-empty>
</simple-method>
<simple-method method-name="checkOtherDefaultRate" short-description="remove an other defaultRate flag">
<set value="_CREATE" field="securityAction"/>
<check-permission permission="ACCOUNTING" action="${securityAction}">
<fail-property resource="AccountingUiLabels" property="AccountingPermissionError"/>
</check-permission>
<check-errors/>
<if-compare field="newEntity.defaultRate" value="Y" operator="equals">
<entity-and entity-name="PartyRate" list="rates" filter-by-date="true">
<field-map field-name="partyId" from-field="newEntity.partyId"/>
<field-map field-name="defaultRate" value="Y"/>
</entity-and>
<if-not-empty field="rates">
<first-from-list list="rates" entry="rate"/>
<set field="rate.defaultRate" value="N"/>
<store-value value-field="rate"/>
</if-not-empty>
</if-compare>
</simple-method>
<simple-method method-name="deletePartyRate" short-description="Delete PartyRate">
<entity-one entity-name="PartyRate" value-field="lookedUpValue"/>
<now-timestamp field="lookedUpValue.thruDate"/>
<store-value value-field="lookedUpValue"/>
<set-service-fields service-name="deleteRateAmount" map="parameters" to-map="delRateAmount"/>
<set field="delRateAmount.fromDate" from-field="parameters.rateAmountFromDate"/>
<call-service service-name="deleteRateAmount" in-map-name="delRateAmount"/>
</simple-method>
<!-- migrate service -->
<simple-method method-name="migrateRateFactor" short-description="migrate the several entities which were change in the rate refactor activity">
<entity-condition entity-name="OldEmplPositionTypeRate" list="posRates"/>
<iterate list="posRates" entry="posRate">
<make-value value-field="emplPositionTypeRate" entity-name="EmplPositionTypeRate"/>
<set-pk-fields value-field="posRate" map="emplPositionTypeRate"/>
<set-nonpk-fields map="emplPositionTypeRate" value-field="posRate"/>
<create-value value-field="emplPositionTypeRate"/>
<make-value value-field="rateAmount" entity-name="RateAmount"/>
<set-pk-fields value-field="posRate" map="rateAmount"/>
<set-nonpk-fields map="rateAmount" value-field="posRate"/>
<set field="rateAmount.workeffortId" value="_NA_"/>
<set field="rateAmount.partyId" value="_NA_"/>
<property-to-field resource="general.properties" property="currency.uom.id.default" field="rateAmount.rateCurrencyUomId"/>
<create-value value-field="rateAmount"/>
</iterate>
<entity-condition entity-name="OldPartyRate" list="partyRates"/>
<iterate list="oldPartyRates" entry="oldPartyRate">
<make-value value-field="partyRate" entity-name="PartyRate"/>
<set-pk-fields value-field="oldPartyRate" map="partyRate"/>
<set-nonpk-fields map="partyRate" value-field="oldPartyRate"/>
<create-value value-field="partyRate"/>
<make-value value-field="rateAmount" entity-name="RateAmount"/>
<set-pk-fields value-field="oldPartyRate" map="rateAmount"/>
<set-nonpk-fields map="rateAmount" value-field="oldPartyRate"/>
<set field="rateAmount.workeffortId" value="_NA_"/>
<set field="rateAmount.emplPositionTypeId" value="_NA_"/>
<set field="rateAmount.periodTypeId" value="RATE_HOUR"/>
<create-value value-field="rateAmount"/>
</iterate>
</simple-method>
</simple-methods>