| <?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> |