blob: cf62eeba42eb4e313375392ab119b36bdd708609 [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="createWorkEffortAndPartyAssign" short-description="Create Work Effort and assign to a party with a role">
<set-service-fields service-name="createWorkEffort" map="parameters" to-map="create"/>
<call-service service-name="createWorkEffort" in-map-name="create">
<result-to-field result-name="workEffortId"/>
</call-service>
<check-errors />
<make-value value-field="newEntity" entity-name="WorkEffortPartyAssignment"/>
<set-pk-fields map="parameters" value-field="newEntity"/>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<set field="newEntity.workEffortId" from-field="workEffortId"/>
<if-empty field="newEntity.fromDate">
<now-timestamp field="newEntity.fromDate"/>
</if-empty>
<set field="newEntity.assignedByUserLoginId" from-field="userLogin.userLoginId"/>
<create-value value-field="newEntity"/>
<field-to-result field="workEffortId"/>
</simple-method>
<simple-method method-name="createWorkEffort" short-description="Create Work Effort">
<make-value value-field="newEntity" entity-name="WorkEffort"/>
<if-empty field="parameters.workEffortId">
<sequenced-id sequence-name="WorkEffort" field="newEntity.workEffortId"/>
<else>
<check-id field="parameters.workEffortId"/>
<check-errors/>
<set field="newEntity.workEffortId" from-field="parameters.workEffortId"/>
</else>
</if-empty>
<field-to-result field="newEntity.workEffortId" result-name="workEffortId"/>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<now-timestamp field="nowTimestamp"/>
<set from-field="nowTimestamp" field="newEntity.lastStatusUpdate"/>
<set from-field="nowTimestamp" field="newEntity.lastModifiedDate"/>
<set from-field="nowTimestamp" field="newEntity.createdDate"/>
<set field="newEntity.revisionNumber" value="1" type="Long"/>
<set from-field="userLogin.userLoginId" field="newEntity.lastModifiedByUserLogin"/>
<set from-field="userLogin.userLoginId" field="newEntity.createdByUserLogin"/>
<create-value value-field="newEntity"/>
<!-- create new status entry, and set lastStatusUpdate date -->
<make-value value-field="newWorkEffortStatus" entity-name="WorkEffortStatus"/>
<set from-field="newEntity.workEffortId" field="newWorkEffortStatus.workEffortId"/>
<set from-field="newEntity.currentStatusId" field="newWorkEffortStatus.statusId"/>
<set from-field="nowTimestamp" field="newWorkEffortStatus.statusDatetime"/>
<set from-field="userLogin.userLoginId" field="newWorkEffortStatus.setByUserLogin"/>
<create-value value-field="newWorkEffortStatus"/>
<!-- Attach the workeffort to a requirement if passed -->
<if-not-empty field="parameters.requirementId">
<make-value value-field="workFullfillment" entity-name="WorkRequirementFulfillment"/>
<set from-field="newEntity.workEffortId" field="workFullfillment.workEffortId"/>
<set from-field="parameters.requirementId" field="workFullfillment.requirementId"/>
<create-value value-field="workFullfillment"/>
</if-not-empty>
<!-- attach to a customer request if passed and copy attached docs -->
<if-not-empty field="parameters.custRequestId">
<!-- check status of customer request if valid -->
<entity-one entity-name="CustRequest" value-field="lookedUpValue"/>
<set field="goodStatusId" value="CRQ_ACCEPTED"/>
<if-compare-field operator="not-equals" field="lookedUpValue.statusId" to-field="goodStatusId" >
<set field="entity" value="Customer request"/>
<add-error>
<fail-property resource="CommonUiLabels" property="CommonErrorStatusNotValid"/>
</add-error>
<check-errors/>
</if-compare-field>
<!-- create customer request / work effort relation -->
<make-value value-field="custRequestWorkEffort" entity-name="CustRequestWorkEffort"/>
<set field="custRequestWorkEffort.workEffortId" from-field="newEntity.workEffortId"/>
<set field="custRequestWorkEffort.custRequestId" from-field="parameters.custRequestId"/>
<create-value value-field="custRequestWorkEffort"/>
<!-- update status of customer request -->
<set field="updCustReq.custRequestId" from-field="parameters.custRequestId"/>
<set field="updCustReq.statusId" value="CRQ_REVIEWED"/>
<set field="updCustReq.webSiteId" from-field="parameters.webSiteId"/>
<call-service service-name="setCustRequestStatus" in-map-name="updCustReq"/>
<entity-and entity-name="CustRequestContent" list="custRequestContents">
<field-map field-name="custRequestId" from-field="parameters.custRequestId"/>
</entity-and>
<iterate list="custRequestContents" entry="custRequestContent">
<set field="newWorkEffortContent.workEffortId" from-field="newEntity.workEffortId"/>
<set field="newWorkEffortContent.contentId" from-field="custRequestContent.contentId"/>
<set field="newWorkEffortContent.workEffortContentTypeId" value="SUPPORTING_MEDIA"/>
<call-service service-name="createWorkEffortContent" in-map-name="newWorkEffortContent"/>
</iterate>
</if-not-empty>
</simple-method>
<simple-method method-name="updateWorkEffort" short-description="Update Work Effort">
<!-- check permissions before moving on: if update or delete logged in user must be associated OR have the corresponding UPDATE or DELETE permissions -->
<!-- temporarily commented out, because users assigned to a project or phase should
have the capability to modify status on sub-tasks, right? Hmmmm.... -->
<!-- <set from-field="workEffortId" map-name="parameters" to-map-name="findWepaMap"/>
<set from-field="partyId" map-name="userLogin" to-map-name="findWepaMap"/>
<find-by-and entity-name="WorkEffortPartyAssignment" map="findWepaMap" list="wepaList"/>
<if-empty field="wepaList">
<check-permission permission="WORKEFFORTMGR" action="_UPDATE">
<fail-property resource="WorkEffortUiLabels" property="WorkEffortUpdatePermissionError"/>
</check-permission>
<check-errors/>
</if-empty>-->
<entity-one entity-name="WorkEffort" value-field="lookedUpValue"/>
<clone-value value-field="lookedUpValue" new-value-field="savedValue"/>
<now-timestamp field="nowTimestamp"/>
<!-- if necessary create new status entry, and set lastStatusUpdate date -->
<if>
<condition>
<and>
<not><if-empty field="parameters.currentStatusId"/></not>
<if-compare-field field="parameters.currentStatusId" to-field="lookedUpValue.currentStatusId" operator="not-equals"/>
</and>
</condition>
<then>
<if-not-empty field="lookedUpValue.currentStatusId">
<!-- check if the status change is a valid change -->
<entity-and entity-name="StatusValidChange" list="validChange">
<field-map field-name="statusId" from-field="lookedUpValue.currentStatusId"/>
<field-map field-name="statusIdTo" from-field="parameters.currentStatusId"/>
</entity-and>
<if-empty field="validChange">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortStatusChangeNotValid"/>
</add-error>
<log level="error" message="The status change from ${lookedUpValue.currentStatusId} to ${parameters.currentStatusId} is not a valid change"/>
<check-errors/>
</if-empty>
</if-not-empty>
<set from-field="nowTimestamp" field="lookedUpValue.lastStatusUpdate"/>
<make-value value-field="newWorkEffortStatus" entity-name="WorkEffortStatus"/>
<set from-field="lookedUpValue.workEffortId" field="newWorkEffortStatus.workEffortId"/>
<set from-field="parameters.currentStatusId" field="newWorkEffortStatus.statusId"/>
<set from-field="parameters.reason" field="newWorkEffortStatus.reason"/>
<set from-field="nowTimestamp" field="newWorkEffortStatus.statusDatetime"/>
<set from-field="userLogin.userLoginId" field="newWorkEffortStatus.setByUserLogin"/>
<create-value value-field="newWorkEffortStatus"/>
</then>
</if>
<!-- after checking status change, set all parameters -->
<set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
<!-- only save if something has changed -->
<if-compare-field field="lookedUpValue" to-field="savedValue" operator="not-equals" type="Object">
<!-- only set lastModifiedDate after comparing new & old to see if anything has changed -->
<set from-field="nowTimestamp" field="lookedUpValue.lastModifiedDate"/>
<set from-field="userLogin.userLoginId" field="lookedUpValue.lastModifiedByUserLogin"/>
<if-not-empty field="lookedUpValue.revisionNumber">
<set field="lookedUpValue.revisionNumber" value="${lookedUpValue.revisionNumber + 1}" type="Long"/>
<else>
<set field="lookedUpValue.revisionNumber" value="1" type="Long"/>
</else>
</if-not-empty>
<store-value value-field="lookedUpValue"/>
</if-compare-field>
</simple-method>
<simple-method method-name="deleteWorkEffort" short-description="Delete Work Effort">
<!-- check permissions before moving on: if update or delete logged in user must be associated OR have the corresponding UPDATE or DELETE permissions -->
<entity-and entity-name="WorkEffortPartyAssignment" list="wepaList">
<field-map field-name="workEffortId" from-field="parameters.workEffortId"/>
<field-map field-name="partyId" from-field="userLogin.partyId"/>
</entity-and>
<if-empty field="wepaList">
<check-permission permission="WORKEFFORTMGR" action="_DELETE">
<fail-property resource="WorkEffortUiLabels" property="WorkEffortDeletePermissionError"/>
</check-permission>
<check-errors/>
</if-empty>
<entity-one entity-name="WorkEffort" value-field="lookedUpValue"/>
<!-- Remove associated/dependent entries from other entities here -->
<remove-related value-field="lookedUpValue" relation-name="WorkEffortKeyword"/>
<remove-related value-field="lookedUpValue" relation-name="WorkEffortAttribute"/>
<remove-related value-field="lookedUpValue" relation-name="WorkOrderItemFulfillment"/>
<remove-related value-field="lookedUpValue" relation-name="FromWorkEffortAssoc"/>
<remove-related value-field="lookedUpValue" relation-name="ToWorkEffortAssoc"/>
<remove-related value-field="lookedUpValue" relation-name="NoteData"/>
<remove-related value-field="lookedUpValue" relation-name="RecurrenceInfo"/>
<remove-related value-field="lookedUpValue" relation-name="RuntimeData"/>
<remove-related value-field="lookedUpValue" relation-name="WorkEffortPartyAssignment"/>
<remove-related value-field="lookedUpValue" relation-name="WorkEffortFixedAssetAssign"/>
<remove-related value-field="lookedUpValue" relation-name="WorkEffortSkillStandard"/>
<remove-related value-field="lookedUpValue" relation-name="WorkEffortStatus"/>
<!-- Delete actual main entity last -->
<remove-value value-field="lookedUpValue"/>
</simple-method>
<simple-method method-name="copyWorkEffort" short-description="Copy a WorkEffort">
<entity-one entity-name="WorkEffort" value-field="sourceWorkEffort">
<field-map field-name="workEffortId" from-field="parameters.sourceWorkEffortId" />
</entity-one>
<if-empty field="sourceWorkEffort">
<set field="errorString" value="sourceWorkEffortId = ${parameters.sourceWorkEffortId}" />
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortNotFound" />
</add-error>
<check-errors />
</if-empty>
<set field="targetWorkEffortId" from-field="parameters.targetWorkEffortId" />
<if-empty field="targetWorkEffortId">
<sequenced-id sequence-name="WorkEffort" field="targetWorkEffortId" />
</if-empty>
<set-service-fields service-name="createWorkEffort" map="sourceWorkEffort" to-map="createWorkEffortCtx"/>
<set field="createWorkEffortCtx.workEffortId" from-field="targetWorkEffortId" />
<set field="createWorkEffortCtx.userLogin" from-field="parameters.userLogin" />
<call-service service-name="createWorkEffort" in-map-name="createWorkEffortCtx" />
<check-errors />
<entity-one entity-name="WorkEffort" value-field="targetWorkEffort">
<field-map field-name="workEffortId" from-field="targetWorkEffortId" />
</entity-one>
<set field="copyWorkEffortAssocs" from-field="parameters.copyWorkEffortAssocs" default-value="N" />
<if-compare field="copyWorkEffortAssocs" operator="equals" value="Y">
<set-service-fields service-name="copyWorkEffortAssocs" map="parameters" to-map="copyWorkEffortAssocsCtx"/>
<set field="copyWorkEffortAssocsCtx.targetWorkEffortId" from-field="targetWorkEffortId" />
<call-service service-name="copyWorkEffortAssocs" in-map-name="copyWorkEffortAssocsCtx" />
<check-errors />
</if-compare>
<set field="copyRelatedValues" from-field="parameters.copyRelatedValues" default-value="N" />
<if-compare field="copyRelatedValues" operator="equals" value="Y">
<set field="excludeExpiredRelations" from-field="parameters.excludeExpiredRelations" default-value="N" />
<set field="modelRelationList" from-field="groovy:delegator.getModelEntity('WorkEffort').getRelationsManyList();" />
<iterate list="modelRelationList" entry="modelRelation">
<set field="relatedEntityName" from-field="groovy:modelRelation.getRelEntityName();" />
<if-compare field="relatedEntityName" operator="not-equals" value="WorkEffortAssoc">
<set field="relationName" from-field="groovy:modelRelation.getCombinedName();" />
<set field="keyMap" from-field="groovy:modelRelation.findKeyMap('workEffortId');" set-if-null="true" />
<if-not-empty field="keyMap">
<set field="relatedIdFieldName" from-field="groovy:keyMap.getRelFieldName();" />
<get-related relation-name="${relationName}" list="relationValues" value-field="sourceWorkEffort" />
<if-compare field="excludeExpiredRelations" operator="equals" value="Y">
<set field="fromDateModelField" from-field="groovy:delegator.getModelEntity(relatedEntityName).getField('fromDate');" set-if-null="true" />
<if-not-empty field="fromDateModelField">
<filter-list-by-date list="relationValues" />
</if-not-empty>
</if-compare>
<iterate list="relationValues" entry="relatedValue">
<clone-value value-field="relatedValue" new-value-field="newRelatedValue" />
<set field="newRelatedValue[relatedIdFieldName]" from-field="targetWorkEffortId" />
<make-value value-field="newRelatedPks" entity-name="${relatedEntityName}" />
<set-pk-fields value-field="newRelatedPks" map="newRelatedValue" />
<find-by-primary-key entity-name="${relatedEntityName}" map="newRelatedPks" value-field="duplicateCheck" />
<if-empty field="duplicateCheck">
<create-value value-field="newRelatedValue" />
</if-empty>
</iterate>
</if-not-empty>
</if-compare>
</iterate>
</if-compare>
<field-to-result field="targetWorkEffortId" result-name="workEffortId" />
</simple-method>
<!-- communication event workeffort -->
<simple-method method-name="makeCommunicationEventWorkEffort" short-description="Make a Communication Event WorkEffort">
<make-value entity-name="CommunicationEventWorkEff" value-field="lookupMap"/>
<set-pk-fields map="parameters" value-field="lookupMap"/>
<find-by-primary-key entity-name="CommunicationEventWorkEff" map="lookupMap" value-field="eventWe"/>
<if-not-empty field="eventWe.workEffortId">
<set-nonpk-fields map="parameters" value-field="eventWe"/>
<set field="eventWe.description" from-field="parameters.relationDescription"/>
<store-value value-field="eventWe"/>
</if-not-empty>
<if-empty field="eventWe.workEffortId">
<set-nonpk-fields map="parameters" value-field="lookupMap"/>
<set field="eventWe.description" from-field="parameters.relationDescription"/>
<create-value value-field="lookupMap"/>
</if-empty>
<field-to-result field="lookupMap.workEffortId" result-name="workEffortId"/>
<field-to-result field="lookupMap.communicationEventId" result-name="communicationEventId"/>
</simple-method>
<simple-method method-name="updateCommunicationEventWorkEff" short-description="Update a CommunicationEventWorkEff">
<!-- Find old value -->
<make-value entity-name="CommunicationEventWorkEff" value-field="communicationEventWorkEff"/>
<set-pk-fields value-field="communicationEventWorkEff" map="parameters"/>
<find-by-primary-key entity-name="CommunicationEventWorkEff" map="communicationEventWorkEff" value-field="communicationEventWorkEff"/>
<if-empty field="communicationEventWorkEff">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortCannotUpdateContactInfo"/>
</add-error>
</if-empty>
<check-errors/>
<set-nonpk-fields map="parameters" value-field="communicationEventWorkEff"/>
<store-value value-field="communicationEventWorkEff"/>
</simple-method>
<simple-method method-name="deleteCommunicationEventWorkEff" short-description="Delete a CommunicationEventWorkEff">
<!-- Find old value -->
<make-value entity-name="CommunicationEventWorkEff" value-field="communicationEventWorkEff"/>
<set-pk-fields value-field="communicationEventWorkEff" map="parameters"/>
<find-by-primary-key entity-name="CommunicationEventWorkEff" map="communicationEventWorkEff" value-field="communicationEventWorkEff"/>
<if-empty field="communicationEventWorkEff">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortCannotDeleteContactInfo"/>
</add-error>
</if-empty>
<check-errors/>
<remove-value value-field="communicationEventWorkEff"/>
</simple-method>
<!-- WorkEffortPartyAssignment -->
<simple-method method-name="assignPartyToWorkEffort" short-description="Assign Party to Work Effort">
<!-- check if the requested party Assignment already exist -->
<entity-and entity-name="WorkEffortPartyAssignment" list="currentAssignments" filter-by-date="true">
<field-map field-name="workEffortId" from-field="parameters.workEffortId"/>
<field-map field-name="partyId" from-field="parameters.partyId"/>
<field-map field-name="roleTypeId" from-field="parameters.roleTypeId"/>
</entity-and>
<if-not-empty field="currentAssignments">
<first-from-list list="currentAssignments" entry="firstAssignment"/>
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortPartyAssignmentError"/>
</add-error>
</if-not-empty>
<check-errors/>
<make-value value-field="newEntity" entity-name="WorkEffortPartyAssignment"/>
<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>
<field-to-result field="newEntity.fromDate" result-name="fromDate"/>
<set field="newEntity.assignedByUserLoginId" from-field="userLogin.userLoginId"/>
<if-not-empty field="parameters.statusId">
<now-timestamp field="newEntity.statusDateTime"/>
<call-class-method class-name="org.apache.ofbiz.workeffort.workeffort.WorkEffortPartyAssignmentServices" method-name="updateWorkflowEngine">
<field field="newEntity" type="org.apache.ofbiz.entity.GenericValue"/>
<field field="userLogin" type="org.apache.ofbiz.entity.GenericValue"/>
<field field="dispatcher" type="org.apache.ofbiz.service.LocalDispatcher"/>
</call-class-method>
</if-not-empty>
<create-value value-field="newEntity"/>
</simple-method>
<simple-method method-name="updatePartyToWorkEffortAssignment" short-description="Update WorkEffortPartyAssignment entity">
<entity-one entity-name="WorkEffortPartyAssignment" value-field="workEffortPartyAssignment"/>
<!-- to be dropped later (use now workEffortGenericPermission)
<if-compare-field field="userLogin.partyId" to-field="workEffortPartyAssignment.partyId" operator="not-equals">
<check-permission permission="WORKEFFORTMGR" action="_UPDATE"/>
<check-errors/>
</if-compare-field>
-->
<set from-field="workEffortPartyAssignment.statusId" field="oldStatusId"/>
<set-nonpk-fields map="parameters" value-field="workEffortPartyAssignment"/>
<if-compare-field field="parameters.statusId" to-field="oldStatusId" operator="not-equals">
<now-timestamp field="workEffortPartyAssignment.statusDateTime"/>
<call-class-method class-name="org.apache.ofbiz.workeffort.workeffort.WorkEffortPartyAssignmentServices" method-name="updateWorkflowEngine" >
<field field="workEffortPartyAssignment" type="org.apache.ofbiz.entity.GenericValue"/>
<field field="userLogin" type="org.apache.ofbiz.entity.GenericValue"/>
<field field="dispatcher" type="org.apache.ofbiz.service.LocalDispatcher"/>
</call-class-method>
</if-compare-field>
<store-value value-field="workEffortPartyAssignment"/>
</simple-method>
<simple-method method-name="deletePartyToWorkEffortAssignment" short-description="Update WorkEffortPartyAssignment entity">
<set-service-fields service-name="updatePartyToWorkEffortAssignment" map="parameters" to-map="del"/>
<now-timestamp field="del.thruDate"/>
<call-service service-name="updatePartyToWorkEffortAssignment" in-map-name="del"/>
</simple-method>
<!-- Create a WorkEffortContactMech -->
<simple-method method-name="createWorkEffortContactMech" short-description="Create a WorkEffortContactMech">
<make-value value-field="newValue" entity-name="WorkEffortContactMech"/>
<if-empty field="parameters.contactMechId">
<if-not-empty field="parameters.partyId">
<set-service-fields service-name="createPartyContactMech" map="parameters" to-map="context"/>
<call-service service-name="createPartyContactMech" in-map-name="context">
<default-message resource="PartyUiLabels" property="PartyContactMechanismSuccessfullyCreated"/>
<result-to-field result-name="contactMechId" field="newValue.contactMechId"/>
</call-service>
<log level="info" message="Party ContactMech created"/>
<else>
<set-service-fields service-name="createContactMech" map="parameters" to-map="context"/>
<call-service service-name="createContactMech" in-map-name="context">
<default-message resource="PartyUiLabels" property="PartyContactMechanismSuccessfullyCreated"/>
<result-to-field result-name="contactMechId" field="newValue.contactMechId"/>
</call-service>
<log level="info" message="ContactMech created"/>
</else>
</if-not-empty>
<else>
<set from-field="parameters.contactMechId" field="newValue.contactMechId"/>
</else>
</if-empty>
<log level="info" message="Creating a WorkEffortContactMech"/>
<set from-field="parameters.workEffortId" field="newValue.workEffortId"/>
<set-nonpk-fields map="parameters" value-field="newValue"/>
<field-to-result field="newValue.contactMechId" result-name="contactMechId"/>
<field-to-request field="newValue.contactMechId" request-name="contactMechId"/>
<now-timestamp field="newValue.fromDate"/>
<create-value value-field="newValue"/>
</simple-method>
<simple-method method-name="updateWorkEffortContactMech" short-description="Update a WorkEffortContactMech">
<make-value entity-name="WorkEffortContactMech" value-field="newWorkEffortContactMech"/>
<!-- Find old value -->
<entity-one entity-name="WorkEffortContactMech" value-field="workEffortContactMech"/>
<if-empty field="workEffortContactMech">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortCannotUpdateContactInfo"/>
</add-error>
</if-empty>
<check-errors/>
<clone-value value-field="workEffortContactMech" new-value-field="newWorkEffortContactMech"/>
<!-- If we already have a new contactMechId don't update ContactMech -->
<if-empty field="parameters.newContactMechId">
<log level="info" message="Calling map procs"/>
<call-map-processor xml-resource="component://party/minilang/contact/ContactMechMapProcs.xml"
processor-name="updateContactMech" in-map-name="parameters" out-map-name="context"/>
<to-string field="context.contactMechId"/>
<log level="info" message="Calling generic updateContactMech method"/>
<call-service service-name="updateContactMech" in-map-name="context">
<default-message property="PartyContactMechanismSuccessfullyUpdated" resource="PartyUiLabels"/>
<result-to-field result-name="contactMechId" field="newWorkEffortContactMech.contactMechId"/>
</call-service>
<else>
<set from-field="parameters.newContactMechId" field="newWorkEffortContactMech.contactMechId"/>
</else>
</if-empty>
<if-compare-field to-field="newWorkEffortContactMech.contactMechId" field="parameters.contactMechId" operator="not-equals">
<set-nonpk-fields map="parameters" value-field="newWorkEffortContactMech"/>
<now-timestamp field="newWorkEffortContactMech.fromDate"/>
<now-timestamp field="workEffortContactMech.thruDate"/>
<create-value value-field="newWorkEffortContactMech"/>
<store-value value-field="workEffortContactMech"/>
</if-compare-field>
<field-to-result field="newWorkEffortContactMech.contactMechId" result-name="contactMechId"/>
<field-to-request field="newWorkEffortContactMech.contactMechId" request-name="contactMechId"/>
</simple-method>
<simple-method method-name="createWorkEffortPostalAddress" short-description="Create a PostalAddress for WorkEffort">
<make-value entity-name="WorkEffortContactMech" value-field="newValue"/>
<log level="info" message="Creating postal address"/>
<if-not-empty field="parameters.addToParty">
<call-map-processor xml-resource="component://party/minilang/contact/PartyContactMechMapProcs.xml"
processor-name="postalAddress" in-map-name="parameters" out-map-name="context"/>
<call-service service-name="createPartyPostalAddress" in-map-name="context">
<default-message resource="PartyUiLabels" property="PartyContactMechanismSuccessfullyCreated"/>
<result-to-field result-name="contactMechId" field="newValue.contactMechId"/>
</call-service>
<log level="info" message="Party ContactMech created"/>
<else>
<call-map-processor xml-resource="component://party/minilang/contact/ContactMechMapProcs.xml"
processor-name="postalAddress" in-map-name="parameters" out-map-name="context"/>
<call-service in-map-name="context" service-name="createPostalAddress">
<default-message resource="PartyUiLabels" property="PartyPostalAddressSuccessfullyCreated"/>
<result-to-field result-name="contactMechId" field="newValue.contactMechId"/>
</call-service>
</else>
</if-not-empty>
<log level="info" message="ContactMech for postal address was ${newValue.contactMechId}, now creating work effort contact mech"/>
<call-map-processor xml-resource="component://workeffort/minilang/workeffort/WorkflowMapProcessors.xml"
processor-name="workEffortContactMech" in-map-name="parameters" out-map-name="context2"/>
<set from-field="newValue.contactMechId" field="context2.contactMechId"/>
<log level="info" message="Copied id to context2: ${context2.contactMechId}"/>
<call-service in-map-name="context2" break-on-error="true" service-name="createWorkEffortContactMech">
<default-message resource="PartyUiLabels" property="PartyContactMechanismSuccessfullyCreated"/>
</call-service>
<field-to-request field="newValue.contactMechId" request-name="contactMechId"/>
<field-to-result field="newValue.contactMechId" result-name="contactMechId"/>
</simple-method>
<simple-method method-name="updateWorkEffortPostalAddress" short-description="Update a PostalAddress for WorkEffort">
<make-value entity-name="WorkEffortContactMech" value-field="newValue"/>
<call-map-processor xml-resource="component://party/minilang/contact/ContactMechMapProcs.xml"
processor-name="postalAddress" in-map-name="parameters" out-map-name="context"/>
<call-service in-map-name="context" service-name="updatePostalAddress">
<default-message resource="PartyUiLabels" property="PartyPostalAddressSuccessfullyUpdated"/>
<result-to-field result-name="contactMechId" field="newValue.contactMechId"/>
</call-service>
<call-map-processor xml-resource="component://workeffort/minilang/workeffort/WorkflowMapProcessors.xml"
processor-name="workEffortContactMech" in-map-name="parameters" out-map-name="context2"/>
<set from-field="newValue.contactMechId" field="context2.newContactMechId"/>
<set field="context2.contactMechTypeId" value="POSTAL_ADDRESS"/>
<log level="info" message="Copied id to context2: ${context2.newContactMechId}"/>
<call-service in-map-name="context2" service-name="updateWorkEffortContactMech">
<default-message resource="PartyUiLabels" property="PartyContactMechanismSuccessfullyUpdated"/>
</call-service>
<field-to-request field="newValue.contactMechId" request-name="contactMechId"/>
<field-to-result field="newValue.contactMechId" result-name="contactMechId"/>
</simple-method>
<simple-method method-name="createWorkEffortTelecomNumber" short-description="Create a TelecomNumber for WorkEffort">
<make-value entity-name="WorkEffortContactMech" value-field="newValue"/>
<log level="info" message="Creating telecom number"/>
<if-not-empty field="parameters.addToParty">
<call-map-processor xml-resource="component://party/minilang/contact/PartyContactMechMapProcs.xml"
processor-name="telecomNumber" in-map-name="parameters" out-map-name="context"/>
<call-service service-name="createPartyTelecomNumber" in-map-name="context">
<default-message resource="PartyUiLabels" property="PartyContactMechanismSuccessfullyCreated"/>
<result-to-field result-name="contactMechId" field="newValue.contactMechId"/>
</call-service>
<log level="info" message="Party ContactMech created"/>
<else>
<call-map-processor xml-resource="component://party/minilang/contact/ContactMechMapProcs.xml"
processor-name="telecomNumber" in-map-name="parameters" out-map-name="context"/>
<call-service in-map-name="context" service-name="createTelecomNumber">
<default-message resource="PartyUiLabels" property="PartyTelecomNumberSuccessfullyCreated"/>
<result-to-field result-name="contactMechId" field="newValue.contactMechId"/>
</call-service>
</else>
</if-not-empty>
<call-map-processor xml-resource="component://workeffort/minilang/workeffort/WorkflowMapProcessors.xml"
processor-name="workEffortContactMech" in-map-name="parameters" out-map-name="context2"/>
<set from-field="newValue.contactMechId" field="context2.contactMechId"/>
<log level="info" message="Copied id to context2: ${context2.contactMechId}"/>
<call-service in-map-name="context2" break-on-error="true" service-name="createWorkEffortContactMech">
<default-message resource="PartyUiLabels" property="PartyContactMechanismSuccessfullyCreated"/>
</call-service>
<field-to-request field="newValue.contactMechId" request-name="contactMechId"/>
<field-to-result field="newValue.contactMechId" result-name="contactMechId"/>
</simple-method>
<simple-method method-name="updateWorkEffortTelecomNumber" short-description="Update a TelecomNumber for WorkEffort">
<make-value entity-name="WorkEffortContactMech" value-field="newValue"/>
<call-map-processor xml-resource="component://party/minilang/contact/ContactMechMapProcs.xml"
processor-name="telecomNumber" in-map-name="parameters" out-map-name="context"/>
<call-service in-map-name="context" service-name="updateTelecomNumber">
<default-message resource="PartyUiLabels" property="PartyTelecomNumberSuccessfullyUpdated"/>
<result-to-field result-name="contactMechId" field="newValue.contactMechId"/>
</call-service>
<call-map-processor xml-resource="component://workeffort/minilang/workeffort/WorkflowMapProcessors.xml"
processor-name="workEffortContactMech" in-map-name="parameters" out-map-name="context2"/>
<set from-field="newValue.contactMechId" field="context2.newContactMechId"/>
<set field="context2.contactMechTypeId" value="TELECOM_NUMBER"/>
<log level="info" message="Copied id to context2: ${context2.newContactMechId}"/>
<call-service in-map-name="context2" service-name="updateWorkEffortContactMech">
<default-message resource="PartyUiLabels" property="PartyContactMechanismSuccessfullyUpdated"/>
</call-service>
<log level="info" message="Setting result id: ${newValue.contactMechId}"/>
<field-to-request field="newValue.contactMechId" request-name="contactMechId"/>
<field-to-result field="newValue.contactMechId" result-name="contactMechId"/>
</simple-method>
<simple-method method-name="createWorkEffortEmailAddress" short-description="Create an email address for WorkEffort">
<call-map-processor xml-resource="component://workeffort/minilang/workeffort/WorkflowMapProcessors.xml"
processor-name="emailAddress" in-map-name="parameters" out-map-name="cwecmMap"/>
<check-errors/>
<set field="cwecmMap.contactMechTypeId" value="EMAIL_ADDRESS"/>
<call-service service-name="createWorkEffortContactMech" in-map-name="cwecmMap">
<default-message resource="PartyUiLabels" property="PartyContactMechanismSuccessfullyCreated"/>
<result-to-result result-name="contactMechId"/>
<result-to-request result-name="contactMechId"/>
</call-service>
</simple-method>
<simple-method method-name="updateWorkEffortEmailAddress" short-description="Update an email address for WorkEffort">
<call-map-processor xml-resource="component://workeffort/minilang/workeffort/WorkflowMapProcessors.xml"
processor-name="emailAddress" in-map-name="parameters" out-map-name="uwecmMap"/>
<check-errors/>
<set field="uwecmMap.contactMechTypeId" value="EMAIL_ADDRESS"/>
<call-service service-name="updateWorkEffortContactMech" in-map-name="uwecmMap">
<default-message resource="PartyUiLabels" property="PartyTelecomNumberSuccessfullyUpdated"/>
<result-to-result result-name="contactMechId"/>
<result-to-request result-name="contactMechId"/>
</call-service>
</simple-method>
<simple-method method-name="quickAssignPartyToWorkEffort" short-description="Quick Assign Party To WorkEffort as Owner">
<if-not-empty field="parameters.quickAssignPartyId">
<now-timestamp field="nowTimestamp"/>
<!-- add a party assignment for the creator of the event, use the list method and let the EE do the update or create... -->
<make-value value-field="newPartyRole" entity-name="PartyRole"/>
<set from-field="parameters.quickAssignPartyId" field="newPartyRole.partyId"/>
<set value="CAL_OWNER" field="newPartyRole.roleTypeId"/>
<field-to-list field="newPartyRole" list="newPartyRoleList"/>
<store-list list="newPartyRoleList"/>
<make-value value-field="newWorkEffortPartyAssignment" entity-name="WorkEffortPartyAssignment"/>
<set from-field="parameters.workEffortId" field="newWorkEffortPartyAssignment.workEffortId"/>
<set from-field="parameters.quickAssignPartyId" field="newWorkEffortPartyAssignment.partyId"/>
<set value="CAL_OWNER" field="newWorkEffortPartyAssignment.roleTypeId"/>
<set value="PRTYASGN_ASSIGNED" field="newWorkEffortPartyAssignment.statusId"/>
<set from-field="nowTimestamp" field="newWorkEffortPartyAssignment.fromDate"/>
<create-value value-field="newWorkEffortPartyAssignment"/>
</if-not-empty>
</simple-method>
<simple-method method-name="quickAssignPartyToWorkEffortWithRole" short-description="Quick Assign Party To WorkEffort">
<if-not-empty field="parameters.quickAssignPartyId">
<!-- add a party assignment for the creator of the event, use the list method and let the EE do the update or create... -->
<make-value value-field="newPartyRole" entity-name="PartyRole"/>
<set from-field="parameters.quickAssignPartyId" field="newPartyRole.partyId"/>
<set from-field="parameters.roleTypeId" field="newPartyRole.roleTypeId"/>
<set field="newPartyRoleList[]" from-field="newPartyRole"/>
<store-list list="newPartyRoleList"/>
<make-value value-field="newWorkEffortPartyAssignment" entity-name="WorkEffortPartyAssignment"/>
<set from-field="parameters.workEffortId" field="newWorkEffortPartyAssignment.workEffortId"/>
<set from-field="parameters.quickAssignPartyId" field="newWorkEffortPartyAssignment.partyId"/>
<set from-field="parameters.roleTypeId" field="newWorkEffortPartyAssignment.roleTypeId"/>
<set value="CAL_ACCEPTED" field="newWorkEffortPartyAssignment.statusId"/>
<now-timestamp field="newWorkEffortPartyAssignment.fromDate"/>
<create-value value-field="newWorkEffortPartyAssignment"/>
</if-not-empty>
</simple-method>
<simple-method method-name="createWorkEffortNote" short-description="Create Work Effort Note">
<make-value value-field="newEntity" entity-name="NoteData"/>
<sequenced-id sequence-name="NoteData" field="newEntity.noteId"/>
<field-to-result field="newEntity.noteId" result-name="noteId"/>
<set from-field="parameters.noteInfo" field="newEntity.noteInfo"/>
<if-not-empty field="parameters.noteParty">
<set from-field="parameters.noteParty" field="newEntity.noteParty"/>
<else>
<set field="newEntity.noteParty" from-field="parameters.userLogin.partyId"></set>
</else>
</if-not-empty>
<set from-field="parameters.noteName" field="newEntity.noteName"/>
<now-timestamp field="newEntity.noteDateTime"/>
<create-value value-field="newEntity"/>
<!-- create new status entry, and set lastStatusUpdate date -->
<make-value value-field="newWorkEffortNote" entity-name="WorkEffortNote"/>
<set from-field="newEntity.noteId" field="newWorkEffortNote.noteId"/>
<set from-field="parameters.workEffortId" field="newWorkEffortNote.workEffortId"/>
<set from-field="parameters.internalNote" field="newWorkEffortNote.internalNote"/>
<create-value value-field="newWorkEffortNote"/>
</simple-method>
<simple-method method-name="updateWorkEffortNote" short-description="Update Work Effort Note">
<entity-one entity-name="WorkEffortNote" value-field="lookedUpValue"/>
<entity-one entity-name="NoteData" value-field="lookedUpValueForNoteData"/>
<set-nonpk-fields map="parameters" value-field="lookedUpValueForNoteData"/>
<set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
<store-value value-field="lookedUpValue"/>
<store-value value-field="lookedUpValueForNoteData"/>
</simple-method>
<simple-method method-name="createWorkEffortAndAssoc" short-description="Create a WorkEffort and association">
<if-empty field="parameters.fromDate">
<now-timestamp field="parameters.fromDate"/>
<else>
<entity-one entity-name="WorkEffortAssoc" value-field="lookedUpValue"/>
</else>
</if-empty>
<if-not-empty field="lookedUpValue">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortWorkEffortAssocIdAlreadyExist"/>
</add-error>
<check-errors/>
<else>
<if-empty field="parameters.workEffortIdTo">
<set-service-fields service-name="createWorkEffort" map="parameters" to-map="createWorkeEffortParams"/>
<call-service in-map-name="createWorkeEffortParams" service-name="createWorkEffort">
<result-to-result result-name="workEffortId"/>
<result-to-field result-name="workEffortId" field="workEffortIdTo"/>
</call-service>
<set field="parameters.workEffortIdTo" from-field="workEffortIdTo"/>
</if-empty>
<set-service-fields service-name="createWorkEffortAssoc" map="parameters" to-map="createWorkEffortAssocParams"/>
<call-service in-map-name="createWorkEffortAssocParams" service-name="createWorkEffortAssoc"/>
</else>
</if-not-empty>
</simple-method>
<simple-method method-name="createWorkEffortAssoc" short-description="Create a WorkEffort association">
<if-empty field="parameters.fromDate">
<now-timestamp field="parameters.fromDate"/>
<else>
<entity-one entity-name="WorkEffortAssoc" value-field="lookedUpValue"/>
</else>
</if-empty>
<if-not-empty field="lookedUpValue">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortWorkEffortAssocIdAlreadyExist"/>
</add-error>
<check-errors/>
<else>
<make-value value-field="newEntity" entity-name="WorkEffortAssoc"/>
<set-pk-fields map="parameters" value-field="newEntity"/>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<if-empty field="newEntity.sequenceNum">
<set field="newEntity.sequenceNum" value="0" type="Long"/>
</if-empty>
<create-value value-field="newEntity"/>
</else>
</if-not-empty>
</simple-method>
<simple-method method-name="copyWorkEffortAssocs" short-description="Copy WorkEffort associations">
<set field="deepCopy" from-field="parameters.deepCopy" default-value="N" />
<set field="excludeExpiredAssocs" from-field="parameters.excludeExpiredAssocs" default-value="N" />
<entity-and entity-name="WorkEffortAssoc" list="workEffortAssocs">
<field-map field-name="workEffortIdFrom" from-field="parameters.sourceWorkEffortId" />
</entity-and>
<if-compare field="excludeExpiredAssocs" operator="equals" value="Y">
<filter-list-by-date list="workEffortAssocs" />
</if-compare>
<iterate list="workEffortAssocs" entry="workEffortAssoc">
<set field="workEffortIdTo" from-field="workEffortAssoc.workEffortIdTo" />
<if-compare field="deepCopy" operator="equals" value="Y">
<clear-field field="copyWorkEffortCtx" />
<set-service-fields service-name="copyWorkEffort" map="parameters" to-map="copyWorkEffortCtx"/>
<clear-field field="copyWorkEffortCtx.targetWorkEffortId"/>
<set field="copyWorkEffortCtx.sourceWorkEffortId" from-field="workEffortIdTo" />
<set field="copyWorkEffortCtx.copyWorkEffortAssocs" value="Y" />
<call-service service-name="copyWorkEffort" in-map-name="copyWorkEffortCtx">
<result-to-field result-name="workEffortId" field="workEffortIdTo" />
</call-service>
<check-errors />
</if-compare>
<clone-value value-field="workEffortAssoc" new-value-field="newWorkEffortAssoc" />
<set field="newWorkEffortAssoc.workEffortIdFrom" from-field="parameters.targetWorkEffortId" />
<set field="newWorkEffortAssoc.workEffortIdTo" from-field="workEffortIdTo" />
<create-value value-field="newWorkEffortAssoc" />
</iterate>
</simple-method>
<simple-method method-name="assignInventoryToWorkEffort" short-description="Create or update WorkEffortInventoryAssign">
<set value="Create or update WorkEffortInventoryAssign" field="operationName"/>
<entity-one entity-name="WorkEffortInventoryAssign" value-field="foundEntity"/>
<if-not-empty field="foundEntity">
<calculate field="foundEntity.quantity" type="Double">
<calcop operator="get" field="foundEntity.quantity"/>
<calcop operator="get" field="parameters.quantity"/>
</calculate>
<store-value value-field="foundEntity"/>
<else>
<make-value value-field="newEntity" entity-name="WorkEffortInventoryAssign"/>
<set-pk-fields map="parameters" value-field="newEntity"/>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<create-value value-field="newEntity"/>
</else>
</if-not-empty>
</simple-method>
<!-- CustRequestItem workeffort -->
<simple-method method-name="checkCustRequestItemExists" short-description="Checks to see if a CustRequestItem exists">
<make-value entity-name="CustRequestItem" value-field="lookupMap"/>
<set-pk-fields map="parameters" value-field="lookupMap"/>
<find-by-primary-key entity-name="CustRequestItem" map="lookupMap" value-field="custRequestItem"/>
<if-not-empty field="custRequestItem">
<set field="custRequestItemExists" value="true"/>
<field-to-result field="custRequestItemExists"/>
<log level="info" message="custRequestItemExists: ${custRequestItemExists}"/>
<else>
<log level="info" message="custRequestItemExists: empty"/>
</else>
</if-not-empty>
</simple-method>
<simple-method method-name="setWorkEffortFixedAssetAssign" short-description="Based on task's estimate dates, write assign entries for the fixed asset the task is assigned to">
<entity-one entity-name="WorkEffort" value-field="workEffort"/>
<set from-field="workEffort.workEffortId" field="findMap.workEffortId"/>
<set from-field="workEffort.fixedAssetId" field="findMap.fixedAssetId"/>
<find-by-and entity-name="WorkEffortFixedAssetAssign" map="findMap" list="existingAssignments"/>
<filter-list-by-date list="existingAssignments"/>
<iterate list="existingAssignments" entry="existingAssignment">
<remove-value value-field="existingAssignment"/>
</iterate>
<make-value value-field="newEntity" entity-name="WorkEffortFixedAssetAssign"/>
<set from-field="workEffort.workEffortId" field="newEntity.workEffortId"/>
<set from-field="workEffort.fixedAssetId" field="newEntity.fixedAssetId"/>
<set from-field="workEffort.currentStatusId" field="newEntity.statusId"/>
<set from-field="workEffort.estimatedStartDate" field="newEntity.fromDate"/>
<set from-field="workEffort.estimatedCompletionDate" field="newEntity.thruDate"/>
<create-value value-field="newEntity"/>
</simple-method>
<!-- WorkEffort-FixedAsset -->
<simple-method method-name="createWorkEffortFixedAssetStd"
short-description="Create a WorkEffort FixedAsset Standard">
<entity-one entity-name="WorkEffortFixedAssetStd" value-field="lookedUpValue"/>
<if-not-empty field="lookedUpValue">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortFixedAssetAlreadyExist"/>
</add-error>
<check-errors />
<else>
<make-value entity-name="WorkEffortFixedAssetStd" value-field="newWEFixedAssetStd"/>
<set-pk-fields map="parameters" value-field="newWEFixedAssetStd"/>
<set-nonpk-fields map="parameters" value-field="newWEFixedAssetStd"/>
<create-value value-field="newWEFixedAssetStd"/>
</else>
</if-not-empty>
</simple-method>
<simple-method method-name="removeWorkEffortFixedAssetStd"
short-description="Delete a WorkEffort FixedAsset Standard">
<entity-one entity-name="WorkEffortFixedAssetStd" value-field="lookedUpValue"/>
<remove-value value-field="lookedUpValue"/>
</simple-method>
<simple-method method-name="createWorkEffortFixedAssetAssign"
short-description="Create a WorkEffort FixedAsset Assign">
<entity-one entity-name="WorkEffortFixedAssetAssign" value-field="lookedUpValue"/>
<if-not-empty field="lookedUpValue">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortFixedAssetAlreadyExist"/>
</add-error>
<else>
<make-value entity-name="WorkEffortFixedAssetAssign" value-field="newWEFixedAssetAssign"/>
<set-pk-fields map="parameters" value-field="newWEFixedAssetAssign"/>
<set-nonpk-fields map="parameters" value-field="newWEFixedAssetAssign"/>
<!-- if the user hasn't specified a fromDate, set it from the actual start date of the task
if there is no actual start date, default to now (to the current date and time) -->
<if-empty field="parameters.fromDate">
<entity-one entity-name="WorkEffort" value-field="prodRunTask"/>
<now-timestamp field="newWEFixedAssetAssign.fromDate"/>
<if-not-empty field="prodRunTask.estimatedStartDate">
<set field="newWEFixedAssetAssign.fromDate" from-field="prodRunTask.estimatedStartDate"/>
</if-not-empty>
<if-not-empty field="prodRunTask.actualStartDate">
<set field="newWEFixedAssetAssign.fromDate" from-field="prodRunTask.actualStartDate"/>
</if-not-empty>
</if-empty>
<create-value value-field="newWEFixedAssetAssign"/>
</else>
</if-not-empty>
</simple-method>
<simple-method method-name="removeWorkEffortFixedAssetAssign"
short-description="Remove a WorkEffort FixedAsset Assign">
<entity-one entity-name="WorkEffortFixedAssetAssign" value-field="lookedUpValue"/>
<remove-value value-field="lookedUpValue"/>
</simple-method>
<!-- Create/Update/Delete Work Effort Review-->
<simple-method method-name="createWorkEffortReview" short-description="Create Work Effort Review">
<entity-one entity-name="WorkEffortReview" value-field="lookedUpValue"/>
<if-not-empty field="lookedUpValue">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortWorkEffortReviewAlreadyExist"/>
</add-error>
<check-errors/>
<else>
<make-value entity-name="WorkEffortReview" value-field="newEntity"/>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<set-pk-fields map="parameters" value-field="newEntity"/>
<if-empty field="newEntity.userLoginId">
<set field="newEntity.userLoginId" from-field="parameters.userLogin.userLoginId"/>
</if-empty>
<if-empty field="newEntity.reviewDate">
<now-timestamp field="nowTimestamp"/>
<set field="newEntity.reviewDate" from-field="nowTimestamp"/>
</if-empty>
<create-value value-field="newEntity"/>
</else>
</if-not-empty>
</simple-method>
<simple-method method-name="deleteWorkEffortReview"
short-description="Remove a WorkEffort Review">
<entity-one entity-name="WorkEffortReview" value-field="lookedUpValue"/>
<remove-value value-field="lookedUpValue"/>
</simple-method>
<simple-method method-name="indexWorkEffortKeywords" short-description="Index the Keywords for a WorkEffort" login-required="false">
<!-- this service is meant to be called from an entity ECA for entities that include a workEffortId
if it is the WorkEffort entity itself triggering this action, then a worokEffort parameter
will be passed and we can save a few cycles looking that up -->
<set from-field="parameters.workEffort" field="workEffort"/>
<if-empty field="workEffort">
<set from-field="parameters.workEffortId" field="findWorkEffortMap.workEffortId"/>
<find-by-primary-key entity-name="WorkEffort" map="findWorkEffortMap" value-field="workEffort"/>
</if-empty>
<check-errors />
<!-- index keywords -->
<call-class-method class-name="org.apache.ofbiz.workeffort.workeffort.WorkEffortKeywordIndex" method-name="indexKeywords">
<field field="workEffort" type="org.apache.ofbiz.entity.GenericValue"/>
</call-class-method>
</simple-method>
<simple-method method-name="createWorkEffortKeyword" short-description="Create Work Effort Keyword">
<entity-one entity-name="WorkEffortKeyword" value-field="lookedUpValue"/>
<if-not-empty field="lookedUpValue">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortKeywordAlreadyExist"/>
</add-error>
<else>
<make-value value-field="newEntity" entity-name="WorkEffortKeyword"/>
<if-empty field="parameters.workEffortId">
<add-error>
<fail-property resource="WorkEffortUiLabels" property="WorkEffortIdMissing"/>
</add-error>
</if-empty>
<if-empty field="parameters.keyword">
<add-error>
<fail-property resource="ProductUiLabels" property="productevents.keyword_missing"/>
</add-error>
</if-empty>
<check-errors/>
<set-pk-fields value-field="newEntity" map="parameters"></set-pk-fields>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<create-value value-field="newEntity"/>
</else>
</if-not-empty>
<check-errors/>
</simple-method>
<simple-method method-name="deleteWorkEffortKeyword"
short-description="Remove a WorkEffort Keyword">
<entity-one entity-name="WorkEffortKeyword" value-field="lookedUpValue"/>
<remove-value value-field="lookedUpValue"/>
</simple-method>
<simple-method method-name="createWorkEffortKeywords" short-description="Create all Work Effort Keyword">
<set from-field="parameters.workEffortId" field="findWorkEffortMap.workEffortId"/>
<find-by-primary-key entity-name="WorkEffort" map="findWorkEffortMap" value-field="workEffortInstance"/>
<call-class-method class-name="org.apache.ofbiz.workeffort.workeffort.WorkEffortKeywordIndex" method-name="indexKeywords">
<field field="workEffortInstance" type="org.apache.ofbiz.entity.GenericValue"/>
</call-class-method>
</simple-method>
<simple-method method-name="deleteWorkEffortKeywords"
short-description="Remove all WorkEffort Keyword">
<set from-field="parameters.workEffortId" field="findWorkEffortMap.workEffortId"/>
<find-by-primary-key entity-name="WorkEffort" map="findWorkEffortMap" value-field="workEffortInstance"/>
<if-not-empty field="workEffortInstance.workEffortId">
<remove-related relation-name="WorkEffortKeyword" value-field="workEffortInstance"/>
</if-not-empty>
<check-errors/>
</simple-method>
<simple-method method-name="duplicateWorkEffort" short-description="Duplicate a WorkEffort">
<set field="removeWorkEffortAssocs" from-field="parameters.removeWorkEffortAssocs" default-value="N" />
<set field="removeWorkEffortContents" from-field="parameters.removeWorkEffortContents" default-value="N" />
<set field="removeWorkEffortNotes" from-field="parameters.removeWorkEffortNotes" default-value="N" />
<set field="removeWorkEffortAssignmentRates" from-field="parameters.removeWorkEffortAssignmentRates" default-value="N" />
<if>
<condition>
<or>
<if-compare field="removeWorkEffortAssocs" operator="equals" value="Y" />
<if-compare field="removeWorkEffortContents" operator="equals" value="Y" />
<if-compare field="removeWorkEffortNotes" operator="equals" value="Y" />
<if-compare field="removeWorkEffortAssignmentRates" operator="equals" value="Y" />
</or>
</condition>
<then>
<check-permission permission="WORKEFFORTMGR" action="_DELETE">
<fail-property resource="WorkEffortUiLabels" property="WorkEffortDeletePermissionError" />
</check-permission>
<check-errors />
</then>
</if>
<!-- Get the old WorkEffort -->
<set field="workEffortId" from-field="parameters.workEffortId"/>
<if-empty field="workEffortId">
<sequenced-id sequence-name="WorkEffort" field="workEffortId"/>
</if-empty>
<entity-one entity-name="WorkEffort" value-field="oldWorkEffort">
<field-map field-name="workEffortId" from-field="parameters.oldWorkEffortId"/>
</entity-one>
<!-- Check the status to give to the new WorkEffort -->
<if-empty field="parameters.statusId">
<entity-one entity-name="StatusItem" value-field="oldStatus">
<field-map field-name="statusId" from-field="oldWorkEffort.currentStatusId"/>
</entity-one>
<entity-and entity-name="StatusItem" list="statusList">
<field-map field-name="statusTypeId" from-field="oldStatus.statusTypeId"/>
<order-by field-name="sequenceId"/>
</entity-and>
<set field="oldWorkEffort.currentStatusId" from-field="statusList[0].statusId"/>
<else>
<set field="oldWorkEffort.currentStatusId" from-field="parameters.statusId"/>
</else>
</if-empty>
<!-- Create the new WorkEffort from the old one and the status -->
<set-service-fields service-name="createWorkEffort" map="oldWorkEffort" to-map="createWorkEffortCtx"/>
<set field="createWorkEffortCtx.workEffortId" from-field="workEffortId"/>
<set field="createWorkEffortCtx.userLogin" from-field="parameters.userLogin"/>
<call-service service-name="createWorkEffort" in-map-name="createWorkEffortCtx"/>
<check-errors />
<entity-one entity-name="WorkEffort" value-field="newWorkEffort" />
<set field="workEffortAssocFindContext.workEffortIdFrom" from-field="parameters.oldWorkEffortId" />
<set field="reverseWorkEffortFindContext.workEffortIdTo" from-field="parameters.oldWorkEffortId" />
<set field="duplicateWorkEffortAssocs" from-field="parameters.duplicateWorkEffortAssocs" default-value="N" />
<if-compare field="duplicateWorkEffortAssocs" operator="equals" value="Y">
<find-by-and entity-name="WorkEffortAssoc" map="workEffortAssocFindContext" list="foundValues" />
<iterate list="foundValues" entry="foundValue">
<clone-value value-field="foundValue" new-value-field="newTempValue" />
<set from-field="workEffortId" field="newTempValue.workEffortIdFrom" />
<create-value value-field="newTempValue" />
</iterate>
<entity-and entity-name="WorkEffortAssoc" list="foundValues">
<field-map field-name="workEffortIdTo" from-field="parameters.oldWorkEffortId" />
</entity-and>
<iterate list="foundValues" entry="foundValue">
<clone-value value-field="foundValue" new-value-field="newTempValue" />
<set from-field="workEffortId" field="newTempValue.workEffortIdTo" />
<create-value value-field="newTempValue" />
</iterate>
</if-compare>
<set field="workEffortFindContext.workEffortId" from-field="parameters.oldWorkEffortId" />
<set field="duplicateWorkEffortNotes" from-field="parameters.duplicateWorkEffortNotes" default-value="N" />
<if-compare field="duplicateWorkEffortNotes" operator="equals" value="Y">
<find-by-and entity-name="WorkEffortNote" map="workEffortFindContext" list="foundValues" />
<iterate list="foundValues" entry="foundValue">
<clone-value value-field="foundValue" new-value-field="newTempValue" />
<set from-field="workEffortId" field="newTempValue.workEffortId" />
<create-value value-field="newTempValue" />
</iterate>
</if-compare>
<set field="duplicateWorkEffortContents" from-field="parameters.duplicateWorkEffortContents" default-value="N" />
<if-compare field="duplicateWorkEffortContents" operator="equals" value="Y">
<find-by-and entity-name="WorkEffortContent" map="workEffortFindContext" list="foundValues" />
<iterate list="foundValues" entry="foundValue">
<clone-value value-field="foundValue" new-value-field="newTempValue" />
<set from-field="workEffortId" field="newTempValue.workEffortId" />
<create-value value-field="newTempValue" />
</iterate>
</if-compare>
<set field="duplicateWorkEffortAssignmentRates" from-field="parameters.duplicateWorkEffortAssignmentRates" default-value="N" />
<if-compare field="duplicateWorkEffortAssignmentRates" operator="equals" value="Y">
<find-by-and entity-name="RateAmount" map="workEffortFindContext" list="foundValuesAll" />
<filter-list-by-date list="foundValuesAll" to-list="foundValues" />
<iterate list="foundValues" entry="foundValue">
<clone-value value-field="foundValue" new-value-field="newTempValue" />
<set from-field="workEffortId" field="newTempValue.workEffortId" />
<create-value value-field="newTempValue" />
</iterate>
</if-compare>
<if-compare field="removeWorkEffortAssocs" operator="equals" value="Y">
<remove-by-and entity-name="WorkEffortAssoc" map="workEffortAssocFindContext" />
<!-- small difference here, also do the reverse assocs... -->
<remove-by-and entity-name="WorkEffortAssoc" map="reverseWorkEffortFindContext" />
</if-compare>
<if-compare field="removeWorkEffortContents" operator="equals" value="Y">
<remove-by-and entity-name="WorkEffortContent" map="workEffortFindContext" />
</if-compare>
<if-compare field="removeWorkEffortNotes" operator="equals" value="Y">
<remove-by-and entity-name="WorkEffortNote" map="workEffortFindContext" />
</if-compare>
<if-compare field="removeWorkEffortAssignmentRates" operator="equals" value="Y">
<remove-by-and entity-name="RateAmount" map="workEffortFindContext" />
</if-compare>
<field-to-result field="workEffortId"/>
</simple-method>
<!-- WorkEffort ServiceTest Services -->
<simple-method method-name="testCreateEventService" short-description="test to create new event (workeffort) service" login-required="false">
<log level="info" message="====================Create an event test case=========================================="/>
<set field="createEventMap.workEffortTypeId" value="EVENT"/>
<set field="createEventMap.quickAssignPartyId" value="DemoCustomer"/>
<set field="createEventMap.workEffortName" value="Create Work Effort"/>
<set field="createEventMap.currentStatusId" value="CAL_TENTATIVE"/>
<entity-one entity-name="UserLogin" value-field="createEventMap.userLogin">
<field-map field-name="userLoginId" value="system"/>
</entity-one>
<call-service service-name="createWorkEffort" in-map-name="createEventMap">
<result-to-field result-name="workEffortId" field="eventMap.workEffortId"/>
</call-service>
<call-simple-method method-name="testUpdateEventService"/>
<entity-one entity-name="WorkEffort" value-field="workEffort">
<field-map field-name="workEffortId" from-field="eventMap.workEffortId"/>
</entity-one>
<assert>
<not><if-empty field="workEffort"/></not>
<if-compare-field field="workEffort.workEffortId" to-field="eventMap.workEffortId" operator="equals"/>
<if-compare-field field="workEffort.workEffortTypeId" to-field="updateEventMap.workEffortTypeId" operator="equals"/>
<if-compare-field field="workEffort.workEffortName" to-field="updateEventMap.workEffortName" operator="equals"/>
<if-compare-field field="workEffort.currentStatusId" to-field="updateEventMap.currentStatusId" operator="equals"/>
</assert>
<check-errors/>
</simple-method>
<simple-method method-name="testUpdateEventService" short-description="test to update an event(workeffort) service" login-required="false">
<log level="info" message="====================Update an event test case=========================================="/>
<set field="updateEventMap.workEffortId" from-field="eventMap.workEffortId"/>
<set field="updateEventMap.workEffortTypeId" value="EVENT"/>
<set field="updateEventMap.workEffortName" value="Update an event"/>
<set field="updateEventMap.currentStatusId" value="CAL_ACCEPTED"/>
<entity-one entity-name="UserLogin" value-field="updateEventMap.userLogin">
<field-map field-name="userLoginId" value="system"/>
</entity-one>
<call-service service-name="updateWorkEffort" in-map-name="updateEventMap"/>
<check-errors/>
</simple-method>
<simple-method method-name="testCreateProjectService" short-description="test to create new project(workeffort) service" login-required="false">
<log level="info" message="====================Create a new project test case=========================================="/>
<set field="createProjectMap.workEffortTypeId" value="PROJECT"/>
<set field="createProjectMap.quickAssignPartyId" value="DemoCustomer"/>
<set field="createProjectMap.workEffortName" value="Create a project"/>
<set field="createProjectMap.currentStatusId" value="CAL_TENTATIVE"/>
<entity-one entity-name="UserLogin" value-field="createProjectMap.userLogin">
<field-map field-name="userLoginId" value="system"/>
</entity-one>
<call-service service-name="createWorkEffort" in-map-name="createProjectMap">
<result-to-field result-name="workEffortId" field="projectMap.workEffortId"/>
</call-service>
<call-simple-method method-name="testUpdateProjectService"/>
<call-simple-method method-name="testCreateWorkEffortNoteService"/>
<entity-one entity-name="WorkEffort" value-field="workEffort">
<field-map field-name="workEffortId" from-field="projectMap.workEffortId"/>
</entity-one>
<entity-one entity-name="NoteData" value-field="noteData">
<field-map field-name="noteId" from-field="workEffortNoteMap.noteId"/>
</entity-one>
<assert>
<not><if-empty field="workEffort"/></not>
<if-compare-field field="workEffort.workEffortId" to-field="projectMap.workEffortId" operator="equals"/>
<if-compare-field field="workEffort.workEffortTypeId" to-field="updateProjectMap.workEffortTypeId" operator="equals"/>
<if-compare-field field="workEffort.workEffortName" to-field="updateProjectMap.workEffortName" operator="equals"/>
<if-compare-field field="workEffort.currentStatusId" to-field="updateProjectMap.currentStatusId" operator="equals"/>
</assert>
<assert>
<not><if-empty field="noteData"/></not>
<if-compare-field field="noteData.noteParty" to-field="createWorkEffortNoteMap.noteParty" operator="equals"/>
<if-compare-field field="noteData.noteInfo" to-field="createWorkEffortNoteMap.noteInfo" operator="equals"/>
</assert>
<check-errors/>
</simple-method>
<simple-method method-name="testUpdateProjectService" short-description="test to update an project(workeffort) service" login-required="false">
<log level="info" message="====================Update a project test case=========================================="/>
<set field="updateProjectMap.workEffortId" from-field="projectMap.workEffortId"/>
<set field="updateProjectMap.workEffortTypeId" value="PROJECT"/>
<set field="updateProjectMap.workEffortName" value="Update a project"/>
<set field="updateProjectMap.currentStatusId" value="CAL_ACCEPTED"/>
<entity-one entity-name="UserLogin" value-field="updateProjectMap.userLogin">
<field-map field-name="userLoginId" value="system"/>
</entity-one>
<call-service service-name="updateWorkEffort" in-map-name="updateProjectMap"/>
<check-errors/>
</simple-method>
<simple-method method-name="testCreateWorkEffortNoteService" short-description="test to create new workeffort note service" login-required="false">
<log level="info" message="====================Create a work effort note test case=========================================="/>
<set field="createWorkEffortNoteMap.workEffortId" from-field="projectMap.workEffortId"/>
<set field="createWorkEffortNoteMap.noteParty" value="DemoCustomer"/>
<set field="createWorkEffortNoteMap.noteInfo" value="This is a note for party 'DemoCustomer'"/>
<entity-one entity-name="UserLogin" value-field="createWorkEffortNoteMap.userLogin">
<field-map field-name="userLoginId" value="system"/>
</entity-one>
<call-service service-name="createWorkEffortNote" in-map-name="createWorkEffortNoteMap">
<result-to-field result-name="noteId" field="workEffortNoteMap.noteId"/>
</call-service>
<check-errors/>
</simple-method>
<simple-method method-name="getHours"
short-description="get the planned and estimated hours for a task and add to the highInfo map">
<!-- input is 'lowInfo' map output is 'highInfo map -->
<!-- hoursPartyId: if provided only the hours of that party -->
<!-- add the planned hours together -->
<get-related value-field="lowInfo" relation-name="WorkEffortSkillStandard" list="estimates"/>
<if-not-empty field="estimates">
<iterate list="estimates" entry="estimate">
<if-not-empty field="estimate.estimatedDuration">
<if-not-empty field="highInfo.plannedHours">
<calculate field="highInfo.plannedHours" type="Double">
<calcop operator="add" field="estimate.estimatedDuration">
<calcop operator="get" field="highInfo.plannedHours"/>
</calcop>
</calculate>
<else>
<set field="highInfo.plannedHours" from-field="estimate.estimatedDuration" type="Double"/>
</else>
</if-not-empty>
</if-not-empty>
</iterate>
</if-not-empty>
<!-- get the actual billed / non billed hours -->
<get-related value-field="lowInfo" relation-name="TimeEntry" list="actuals"/>
<if-not-empty field="actuals">
<iterate list="actuals" entry="actual">
<if-not-empty field="actual.hours">
<get-related-one value-field="actual" relation-name="Timesheet" to-value-field="timesheet"/>
<!-- check if only a part of the registered hours need to be taken into account -->
<set field="originalActualHours" from-field="actual.hours" type="Double"/>
<entity-condition entity-name="PartyRate" list="partyRates">
<condition-list combine="and">
<condition-expr field-name="partyId" from-field="timesheet.partyId"/>
<condition-expr field-name="rateTypeId" from-field="actual.rateTypeId"/>
<condition-expr field-name="fromDate" operator="less-equals" from-field="actual.fromDate"/>
<condition-list combine="or">
<condition-expr field-name="thruDate" operator="equals" from-field="nullField"/>
<condition-expr field-name="thruDate" operator="greater-equals" from-field="actual.fromDate"/>
</condition-list>
</condition-list>
</entity-condition>
<if-not-empty field="partyRates">
<first-from-list list="partyRates" entry="partyRate"/>
<if-not-empty field="partyRate.percentageUsed">
<calculate field="actual.hours" type="Double">
<calcop operator="multiply" field="actual.hours">
<calcop operator="get" field="partyRate.percentageUsed"/>
</calcop>
</calculate>
<calculate field="actual.hours" type="Double">
<calcop operator="divide" field="actual.hours">
<number value="100"/>
</calcop>
</calculate>
</if-not-empty>
</if-not-empty>
<if>
<condition>
<or>
<if-empty field="parameters.hoursPartyId"/>
<and>
<not><if-empty field="parameters.hoursPartyId"/></not>
<if-compare-field field="timesheet.partyId" to-field="parameters.hoursPartyId" operator="equals"/>
</and>
</or>
</condition>
<then>
<if-not-empty field="highInfo.originalActualHours">
<calculate field="highInfo.originalActualHours" type="Double">
<calcop operator="get" field="highInfo.originalActualHours">
<calcop operator="add" field="originalActualHours"/>
</calcop>
</calculate>
<else>
<set field="highInfo.originalActualHours" from-field="originalActualHours" type="Double"/>
</else>
</if-not-empty>
<if-not-empty field="highInfo.actualHours">
<calculate field="highInfo.actualHours" type="Double">
<calcop operator="get" field="highInfo.actualHours">
<calcop operator="add" field="actual.hours"/>
</calcop>
</calculate>
<else>
<set field="highInfo.actualHours" from-field="actual.hours" type="Double"/>
</else>
</if-not-empty>
<if-empty field="actual.invoiceId">
<if-not-empty field="highInfo.actualNonBilledHours">
<calculate field="highInfo.actualNonBilledHours" type="Double">
<calcop operator="get" field="highInfo.actualNonBilledHours">
<calcop operator="add" field="actual.hours"/>
</calcop>
</calculate>
<else>
<set field="highInfo.actualNonBilledHours" from-field="actual.hours" type="Double"/>
</else>
</if-not-empty>
</if-empty>
</then>
</if>
<!-- keep also a general total for the actual hours of all participants -->
<if-not-empty field="highInfo.actualTotalHours">
<calculate field="highInfo.actualTotalHours" type="Double">
<calcop operator="add" field="actual.hours">
<calcop operator="get" field="highInfo.actualTotalHours"/>
</calcop>
</calculate>
<else>
<set field="highInfo.actualTotalHours" from-field="actual.hours" type="Double"/>
</else>
</if-not-empty>
<!-- keep also a general total for the actual hours of all participants however not yet billed -->
<if-empty field="actual.invoiceId">
<if-not-empty field="highInfo.actualNonBilledTotalHours">
<calculate field="highInfo.actualNonBilledTotalHours" type="Double">
<calcop operator="add" field="actual.hours">
<calcop operator="get" field="highInfo.actualNonBilledTotalHours"/>
</calcop>
</calculate>
<else>
<set field="highInfo.actualNonBilledTotalHours" from-field="actual.hours" type="Double"/>
</else>
</if-not-empty>
</if-empty>
</if-not-empty>
</iterate>
</if-not-empty>
</simple-method>
<!-- iCalendar services -->
<simple-method method-name="getICalWorkEfforts" short-description="Get All Work Efforts Related To An iCalendar Publish Point" login-required="false">
<!-- Servlet already confirmed workEffortId is a valid publish point -->
<set field="workEffortId" from-field="parameters.workEffortId"/>
<entity-condition entity-name="WorkEffortPartyAssignment" list="assignedParties" filter-by-date="true">
<condition-list combine="and">
<condition-expr field-name="workEffortId" from-field="workEffortId"/>
<condition-expr field-name="roleTypeId" value="ICAL_MEMBER"/>
</condition-list>
</entity-condition>
<iterate list="assignedParties" entry="assignedParty">
<entity-condition list="resultList" entity-name="WorkEffortAndPartyAssign" filter-by-date="true">
<condition-list combine="and">
<condition-expr field-name="scopeEnumId" value="WES_PUBLIC"/>
<condition-expr field-name="workEffortTypeId" value="PUBLISH_PROPS" operator="not-equals"/>
<condition-expr field-name="workEffortTypeId" operator="equals" from-field="parameters.workEffortTypeId" ignore-if-empty="true"/>
<condition-expr field-name="partyId" from-field="assignedParty.partyId"/>
</condition-list>
</entity-condition>
<list-to-list list="resultList" to-list="workEfforts"/>
</iterate>
<entity-and entity-name="WorkEffortFixedAssetAssign" list="assignedFixedAssets" filter-by-date="true">
<field-map field-name="workEffortId" from-field="workEffortId"/>
</entity-and>
<iterate list="assignedFixedAssets" entry="assignedFixedAsset">
<entity-condition list="resultList" entity-name="WorkEffortAndFixedAssetAssign" filter-by-date="true">
<condition-list combine="and">
<condition-expr field-name="scopeEnumId" value="WES_PUBLIC"/>
<condition-expr field-name="workEffortTypeId" value="PUBLISH_PROPS" operator="not-equals"/>
<condition-expr field-name="workEffortTypeId" operator="equals" from-field="parameters.workEffortTypeId" ignore-if-empty="true"/>
<condition-expr field-name="fixedAssetId" from-field="assignedFixedAsset.fixedAssetId"/>
</condition-list>
</entity-condition>
<list-to-list list="resultList" to-list="workEfforts"/>
</iterate>
<entity-condition entity-name="WorkEffortAssocToView" list="resultList" filter-by-date="true">
<condition-list combine="and">
<condition-expr field-name="workEffortIdFrom" operator="equals" from-field="workEffortId"/>
<condition-expr field-name="workEffortTypeId" operator="equals" from-field="parameters.workEffortTypeId" ignore-if-empty="true"/>
</condition-list>
</entity-condition>
<list-to-list list="resultList" to-list="workEfforts"/>
<set field="workEfforts" from-field="groovy:org.apache.ofbiz.workeffort.workeffort.WorkEffortWorker.removeDuplicateWorkEfforts(workEfforts);" type="List"/>
<field-to-result field="workEfforts"/>
</simple-method>
<simple-method method-name="getPartyICalUrl" short-description="Get The Party iCalendar URL" login-required="false">
<!-- RFC 2445 4.8.4.1 and 4.8.4.3 Value must be a URI (4.3.3) -->
<set field="partyId" from-field="parameters.partyId"/>
<entity-condition entity-name="PartyContactWithPurpose" list="contactMechs">
<condition-list combine="and">
<condition-list combine="or">
<condition-expr field-name="contactMechPurposeTypeId" value="ICAL_URL"/>
<condition-expr field-name="contactMechPurposeTypeId" value="PRIMARY_EMAIL"/>
</condition-list>
<condition-expr field-name="partyId" from-field="partyId"/>
<condition-expr field-name="purposeThruDate" from-field="null"/>
</condition-list>
<order-by field-name="contactMechPurposeTypeId"/>
</entity-condition>
<if-compare field="util:size(contactMechs)" operator="greater" value="0" type="Integer">
<field-to-result field="contactMechs[0].infoString" result-name="iCalUrl"/>
</if-compare>
</simple-method>
</simple-methods>