<?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="savePartyNameChange" short-description="Save Party Name Change">
        <!-- for special case in ecommerce, if no partyId is passed in use userLogin.partyId -->
        <if-empty field="parameters.partyId">
            <set field="parameters.partyId" from-field="userLogin.partyId"/>
        </if-empty>

        <make-value entity-name="PartyNameHistory" value-field="partyNameHistory"/>
        <set-pk-fields value-field="partyNameHistory" map="parameters"/>
        <now-timestamp field="partyNameHistory.changeDate"/>

        <if>
            <condition><not><if-empty field="parameters.groupName"/></not></condition>
            <then>
                <entity-one entity-name="PartyGroup" value-field="partyGroup"/>
                <if>
                    <condition><if-compare-field field="partyGroup.groupName" to-field="parameters.groupName" operator="not-equals"/></condition>
                    <then>
                        <set-nonpk-fields map="partyGroup" value-field="partyNameHistory"/>
                        <create-value value-field="partyNameHistory"/>
                    </then>
                </if>
            </then>
            <else-if>
                <condition>
                    <or>
                        <not><if-empty field="parameters.firstName"></if-empty></not>
                        <not><if-empty field="parameters.middleName"></if-empty></not>
                        <not><if-empty field="parameters.lastName"></if-empty></not>
                        <not><if-empty field="parameters.personalTitle"></if-empty></not>
                        <not><if-empty field="parameters.suffix"></if-empty></not>
                    </or>
                </condition>
                <then>
                    <entity-one entity-name="Person" value-field="person"/>
                    <if>
                        <condition>
                            <or>
                                <if-compare-field field="person.firstName" to-field="parameters.firstName" operator="not-equals"/>
                                <if-compare-field field="person.middleName" to-field="parameters.middleName" operator="not-equals"/>
                                <if-compare-field field="person.lastName" to-field="parameters.lastName" operator="not-equals"/>
                                <if-compare-field field="person.personalTitle" to-field="parameters.personalTitle" operator="not-equals"/>
                                <if-compare-field field="person.suffix" to-field="parameters.suffix" operator="not-equals"/>
                            </or>
                        </condition>
                        <then>
                            <set-nonpk-fields map="person" value-field="partyNameHistory"/>
                            <create-value value-field="partyNameHistory"/>
                        </then>
                    </if>
                </then>
            </else-if>
        </if>
    </simple-method>

    <simple-method method-name="getPartyNameForDate" short-description="Get Party Name For Date">
        <entity-and entity-name="PartyNameHistory" list="partyNameHistoryList">
            <field-map field-name="partyId" from-field="parameters.partyId"/>
            <order-by field-name="-changeDate"/>
        </entity-and>
        <entity-one entity-name="Person" value-field="person"/>
        <entity-one entity-name="PartyGroup" value-field="partyGroup"/>
        <if-empty field="parameters.compareDate">
            <now-timestamp field="nowTimestamp"/>
            <set field="parameters.compareDate" from-field="nowTimestamp"/>
        </if-empty>
        <!-- go through the list which is sorted by most recent first and find the oldest (last) one with the changeDate greater than the compareDate -->
        <iterate list="partyNameHistoryList" entry="partyNameHistory">
            <if-compare-field field="partyNameHistory.changeDate" to-field="parameters.compareDate" operator="greater" type="Timestamp">
                <set field="partyNameHistoryCurrent" from-field="partyNameHistory"/>
            </if-compare-field>
        </iterate>

        <if-empty field="partyNameHistoryCurrent">
            <if-not-empty field="person">
                <field-to-result field="person.firstName" result-name="firstName"/>
                <if-not-empty field="person.middleName">
                    <field-to-result field="person.middleName" result-name="middleName"/>
                </if-not-empty>
                <field-to-result field="person.lastName" result-name="lastName"/>
                <if-not-empty field="person.personalTitle">
                    <field-to-result field="person.personalTitle" result-name="personalTitle"/>
                </if-not-empty>
                <if-not-empty field="person.gender">
                    <field-to-result field="person.gender" result-name="gender"/>
                </if-not-empty>
                <if-not-empty field="person.suffix">
                    <field-to-result field="person.suffix" result-name="suffix"/>
                </if-not-empty>


                <if-compare field="parameters.lastNameFirst" operator="equals" value="Y">
                    <set field="fullName" value="${person.personalTitle} ${person.lastName}, ${person.firstName} ${person.middleName} ${person.suffix}"/>
                <else>
                    <set field="fullName" value="${person.personalTitle} ${person.firstName} ${person.middleName} ${person.lastName} ${person.suffix}"/>
                </else>
                </if-compare>
                <field-to-result field="fullName"/>

                <else>
                    <if-not-empty field="partyGroup">
                        <field-to-result field="partyGroup.groupName" result-name="groupName"/>
                        <field-to-result field="partyGroup.groupName" result-name="fullName"/>
                    </if-not-empty>
                </else>
            </if-not-empty>
            <else>
                <!-- partyNameHistoryCurrent has a value -->
                <if-not-empty field="person">
                    <field-to-result field="partyNameHistoryCurrent.firstName" result-name="firstName"/>
                    <if-not-empty field="partyNameHistoryCurrent.middleName">
                        <field-to-result field="partyNameHistoryCurrent.middleName" result-name="middleName"/>
                    </if-not-empty>
                    <field-to-result field="partyNameHistoryCurrent.lastName" result-name="lastName"/>
                    <if-not-empty field="partyNameHistoryCurrent.personalTitle">
                        <field-to-result field="partyNameHistoryCurrent.personalTitle" result-name="personalTitle"/>
                    </if-not-empty>
                    <if-not-empty field="partyNameHistoryCurrent.suffix">
                        <field-to-result field="partyNameHistoryCurrent.suffix" result-name="suffix"/>
                    </if-not-empty>
                    <if-not-empty field="person.gender">
                        <field-to-result field="person.gender" result-name="gender"/>
                    </if-not-empty>


                    <if-compare field="parameters.lastNameFirst" operator="equals" value="Y">
                        <set field="fullName" value="${partyNameHistoryCurrent.personalTitle} ${partyNameHistoryCurrent.lastName}, ${partyNameHistoryCurrent.firstName} ${partyNameHistoryCurrent.middleName} ${partyNameHistoryCurrent.suffix}"/>
                    <else>
                        <set field="fullName" value="${partyNameHistoryCurrent.personalTitle} ${partyNameHistoryCurrent.firstName} ${partyNameHistoryCurrent.middleName} ${partyNameHistoryCurrent.lastName} ${partyNameHistoryCurrent.suffix}"/>
                    </else>
                    </if-compare>
                    <field-to-result field="fullName"/>

                    <else>
                        <if-not-empty field="partyGroup">
                            <field-to-result field="partyNameHistoryCurrent.groupName" result-name="groupName"/>
                            <field-to-result field="partyNameHistoryCurrent.groupName" result-name="fullName"/>
                        </if-not-empty>
                    </else>
                </if-not-empty>
            </else>
        </if-empty>
    </simple-method>

    <!-- PostalAddressBoundary methods -->
    <simple-method method-name="getPostalAddressBoundary" short-description="Get Postal Address Boundary">
        <make-value entity-name="PostalAddressBoundary" value-field="postalAddressBoundaryLookupMap"/>
        <set field="postalAddressBoundaryLookupMap.geoId" from-field="parameters.geoId"/>
        <find-by-and entity-name="PostalAddressBoundary" map="postalAddressBoundaryLookupMap" list="postalAddressBoundaries"/>
        <iterate list="postalAddressBoundaries" entry="postalAddressBoundary">
            <get-related-one value-field="postalAddressBoundary" to-value-field="geo" relation-name="Geo"/>
            <field-to-list field="geo" list="geos"/>
        </iterate>
        <field-to-result field="geos"/>
    </simple-method>
    
    <!-- PartyIdentification methods -->
    <simple-method method-name="createPartyIdentifications" short-description="create mass party identification with association between value and type">
        <set field="partyIdentCtx.partyId" from-field="parameters.partyId"/>
        <iterate-map key="key" value="value" map="parameters.identifications">
            <entity-one entity-name="PartyIdentificationType" value-field="identificationType" use-cache="true">
                <field-map field-name="partyIdentificationTypeId" from-field="value"/>
            </entity-one>
            <if-not-empty field="identificationType">
                <set field="idValue" value="${parameters.identifications.${identificationType.partyIdentificationTypeId}}"/>
                <if-not-empty field="idValue">
                    <set field="partyIdentCtx.partyIdentificationTypeId" from-field="identificationType.partyIdentificationTypeId"/>
                    <set field="partyIdentCtx.idValue" from-field="idValue"/>
                    <call-service service-name="createPartyIdentification" in-map-name="partyIdentCtx"/>
                </if-not-empty> 
            </if-not-empty>
        </iterate-map>
    </simple-method>

    <!-- party profile default -->
    <simple-method method-name="setPartyProfileDefaults" short-description="Sets Party Profile Defaults">
        <if-empty field="parameters.partyId">
            <set from-field="userLogin.partyId" field="parameters.partyId"/>
        </if-empty>

        <!-- lookup existing value -->
        <entity-one entity-name="PartyProfileDefault" value-field="partyProfileDefault"/>
        <if-empty field="partyProfileDefault">
            <make-value entity-name="PartyProfileDefault" value-field="partyProfileDefault"/>
            <set-pk-fields value-field="partyProfileDefault" map="parameters"/>
            <create-value value-field="partyProfileDefault"/>
        </if-empty>

        <!-- update the fields -->
        <set-nonpk-fields map="parameters" value-field="partyProfileDefault"/>
        <store-value value-field="partyProfileDefault"/>
    </simple-method>

    <!-- create party content -->
    <!-- TODO: this method will be deleted in favor of new content methods and the PartyContentServices.xml -->
    <simple-method method-name="createPartyContent" short-description="Creates Party Associated Content" login-required="false">
           <!-- make sure we are logged in when passing a partyId -->
        <if-not-empty field="parameters.partyId">
            <if-empty field="parameters.userLogin">
                <add-error><fail-property resource="PartyUiLabels" property="PartyPermissionErrorForThisParty"/></add-error>
                <check-errors/>
            </if-empty>
        </if-not-empty>

        <!-- check permission when creating content on behalf of another party -->
        <if-empty field="parameters.partyId">
            <if-not-empty field="parameters.userLogin">
                <set from-field="userLogin.partyId" field="parameters.partyId"/>
                <if-compare-field to-field="userLogin.partyId" field="parameters.partyId" operator="not-equals">
                    <check-permission permission="PARTYMGR" action="_UPDATE">
                        <fail-property resource="PartyUiLabels" property="PartyPermissionErrorForThisParty"/>
                    </check-permission>
                </if-compare-field>
            </if-not-empty>
        </if-empty>
       <if-not-empty field="parameters._uploadedFile_fileName">
           <set field="absolute" value="true" type="Boolean"/>
           <call-class-method method-name="getDataResourceContentUploadPath" class-name="org.apache.ofbiz.content.data.DataResourceWorker" ret-field="uploadPath">
               <field field="delegator" type="org.apache.ofbiz.entity.Delegator"/>
               <field field="absolute" type="boolean"/>
           </call-class-method>
           <log level="info" message="[createPartyContent] - Found Subdir : ${uploadPath}"/>
           <!-- locate the file extension to use based on mime-type -->
           <set from-field="parameters._uploadedFile_contentType" field="extenLookup.mimeTypeId"/>
           <find-by-and entity-name="FileExtension" map="extenLookup" list="extensions"/>
           <first-from-list list="extensions" entry="extension"/>
           <set-service-fields service-name="createDataResource" map="parameters" to-map="dataResource"/>
           <!-- create the data resource object -->
           <set from-field="parameters._uploadedFile_fileName" field="dataResource.dataResourceName"/>
           <set from-field="parameters._uploadedFile_contentType" field="dataResource.mimeTypeId"/>
           <set value="LOCAL_FILE" field="dataResource.dataResourceTypeId"/>
           <call-service service-name="createDataResource" in-map-name="dataResource" break-on-error="false">
               <result-to-field result-name="dataResourceId" field="dataResourceId"/>
           </call-service>

           <set-service-fields service-name="updateDataResource" map="dataResource" to-map="dataResource"/>
           <set from-field="dataResourceId" field="dataResource.dataResourceId"/>
           <call-service service-name="updateDataResource" in-map-name="dataResource" break-on-error="false"/>
           <set from-field="dataResource.dataResourceId" field="lookup.dataResourceId"/>
           <find-by-primary-key entity-name="DataResource" map="lookup" value-field="dataResourceMap" use-cache="true"/>
       </if-not-empty>

       <set-service-fields service-name="createContent" map="parameters" to-map="createContentMap"/>
       <if-not-empty field="parameters._uploadedFile_fileName">
            <set from-field="dataResourceId" field="createContentMap.dataResourceId"/>
       </if-not-empty>
       <call-service service-name="createContent" in-map-name="createContentMap" break-on-error="false">
            <result-to-field result-name="contentId" field="contentId"/>
       </call-service>
       <!-- create the content role -->
       <if-not-empty field="parameters.partyId">
            <now-timestamp field="nowTimestamp"/>
            <set-service-fields service-name="createContentRole" map="parameters" to-map="contentRole"/>
            <set from-field="contentId" field="contentRole.contentId"/>
            <set from-field="parameters.partyId" field="contentRole.partyId"/>
            <set from-field="nowTimestamp" field="contentRole.fromDate"/>
            <set value="OWNER" field="contentRole.roleTypeId"/>
            <call-service service-name="createContentRole" in-map-name="contentRole" break-on-error="false"/>
            <!-- check party role -->
            <make-value entity-name="PartyRole" value-field="partyRole"/>
            <set-pk-fields value-field="partyRole" map="contentRole"/>
            <find-by-and entity-name="PartyRole" map="partyRole" list="pRoles"/>
            <if-empty field="pRoles">
                <set-service-fields service-name="createPartyRole" map="contentRole" to-map="partyRole"/>
                <call-service service-name="createPartyRole" in-map-name="partyRole" break-on-error="false"/>
            </if-empty>
       </if-not-empty>
       <if-not-empty field="parameters._uploadedFile_fileName">
            <!-- store the file -->
            <set-service-fields service-name="createAnonFile" map="dataResourceMap" to-map="fileCtx"/>
            <set from-field="parameters.uploadedFile" field="fileCtx.binData"/>
            <set from-field="dataResourceMap" field="fileCtx.dataResource"/>
            <call-service service-name="createAnonFile" in-map-name="fileCtx" include-user-login="true"/>
        </if-not-empty>
       <field-to-result field="contentId"/>
    </simple-method>

    <!-- Update party content -->
    <!-- TODO: this method will be deleted in favor of new content methods and the PartyContentServices.xml -->
    <simple-method method-name="updatePartyContent" short-description="Creates Party Associated Content" login-required="false">
           <!-- make sure we are logged in when passing a partyId -->
        <if-not-empty field="parameters.partyId">
            <if-empty field="parameters.userLogin">
                <add-error><fail-property resource="PartyUiLabels" property="PartyPermissionErrorForThisParty"/></add-error>
                <check-errors/>
            </if-empty>
        </if-not-empty>

        <!-- check permission when creating content on behalf of another party -->
        <if-empty field="parameters.partyId">
            <if-not-empty field="parameters.userLogin">
                <set from-field="userLogin.partyId" field="parameters.partyId"/>
                <if-compare-field to-field="userLogin.partyId" field="parameters.partyId" operator="not-equals">
                    <check-permission permission="PARTYMGR" action="_UPDATE">
                        <fail-property resource="PartyUiLabels" property="PartyPermissionErrorForThisParty"/>
                    </check-permission>
                </if-compare-field>
            </if-not-empty>
        </if-empty>

        <if-not-empty field="parameters._uploadedFile_fileName">
           <set from-field="parameters.contentId" field="lookupParam.contentId"/>
           <find-by-primary-key entity-name="Content" map="lookupParam" value-field="content" use-cache="true"/>
           <if-not-empty field="content.dataResourceId">
               <set-service-fields service-name="updateDataResource" map="parameters" to-map="dataResource"/>
               <set from-field="content.dataResourceId" field="dataResource.dataResourceId"/>
               <call-service service-name="updateDataResource" in-map-name="dataResource" break-on-error="false"/>
               <set from-field="content.dataResourceId" field="lookup.dataResourceId"/>
               <find-by-primary-key entity-name="DataResource" map="lookup" value-field="dataResourceMap" use-cache="true"/>
            <else>
               <set field="absolute" value="true" type="Boolean"/>
               <call-class-method method-name="getDataResourceContentUploadPath" class-name="org.apache.ofbiz.content.data.DataResourceWorker" ret-field="uploadPath">
                   <field field="delegator" type="org.apache.ofbiz.entity.Delegator"/>
                   <field field="absolute" type="boolean"/>
               </call-class-method>
               <log level="info" message="[createPartyContent] - Found Subdir : ${uploadPath}"/>
               <!-- locate the file extension to use based on mime-type -->
               <set from-field="parameters._uploadedFile_contentType" field="extenLookup.mimeTypeId"/>
               <find-by-and entity-name="FileExtension" map="extenLookup" list="extensions"/>
               <first-from-list list="extensions" entry="extension"/>
               <set-service-fields service-name="createDataResource" map="parameters" to-map="dataResource"/>
               <!-- create the data resource object -->
                <!-- create the data resource object -->
                <set from-field="parameters._uploadedFile_fileName" field="dataResource.dataResourceName"/>
                <set from-field="parameters._uploadedFile_contentType" field="dataResource.mimeTypeId"/>
                <set value="LOCAL_FILE" field="dataResource.dataResourceTypeId"/>
                <call-service service-name="createDataResource" in-map-name="dataResource" break-on-error="false">
                    <result-to-field result-name="dataResourceId" field="dataResourceId"/>
                </call-service>
                <set value="${uploadPath}/${dataResourceId}" field="dataResource.objectInfo"/>
                <if-not-empty field="extension">
                    <set value="${uploadPath}/${dataResourceId}.${extension.fileExtensionId}" field="dataResource.objectInfo"/>
                </if-not-empty>
                <set-service-fields service-name="updateDataResource" map="dataResource" to-map="dataResource"/>
                <set from-field="dataResourceId" field="dataResource.dataResourceId"/>
                <call-service service-name="updateDataResource" in-map-name="dataResource" break-on-error="false"/>
                <set from-field="dataResource.dataResourceId" field="lookup.dataResourceId"/>
                <find-by-primary-key entity-name="DataResource" map="lookup" value-field="dataResourceMap" use-cache="true"/>
            </else>
           </if-not-empty>
       </if-not-empty>
       <set-service-fields service-name="updateContent" map="parameters" to-map="updateContentMap"/>
       <if-not-empty field="dataResourceId">
           <set from-field="dataResourceId" field="updateContentMap.dataResourceId"/>
       </if-not-empty>
       <call-service service-name="updateContent" in-map-name="updateContentMap" break-on-error="false"/>
       <if-not-empty field="parameters._uploadedFile_fileName">
          <set-service-fields service-name="createAnonFile" map="dataResourceMap" to-map="fileCtx"/>
          <set from-field="parameters.uploadedFile" field="fileCtx.binData"/>
          <set from-field="dataResourceMap" field="fileCtx.dataResource"/>
          <call-service service-name="createAnonFile" in-map-name="fileCtx" include-user-login="true"/>
      </if-not-empty>
        <field-to-result  field="parameters.contentId" result-name="contentId"/>
    </simple-method>

    <!-- get parties based on PartyRelationship -->
    <simple-method method-name="getPartiesByRelationship"
            short-description="Gets all parties related to partyIdFrom using the PartyRelationship entity" login-required="false">
        <set from-field="parameters.partyIdFrom" field="lookupMap.partyIdFrom"/>
        <set from-field="parameters.partyIdTo" field="lookupMap.partyIdTo"/>
        <set from-field="parameters.roleTypeIdFrom" field="lookupMap.roleTypeIdFrom"/>
        <set from-field="parameters.roleTypeIdTo" field="lookupMap.roleTypeIdTo"/>
        <set from-field="parameters.statusId" field="lookupMap.statusId"/>
        <set from-field="parameters.priorityTypeId" field="lookupMap.priorityTypeId"/>
        <set from-field="parameters.partyRelationshipTypeId" field="lookupMap.partyRelationshipTypeId"/>

        <find-by-and entity-name="PartyRelationship" map="lookupMap" list="partyRelationships"/>
        <iterate list="partyRelationships" entry="partyRelationship">
            <get-related-one value-field="partyRelationship" relation-name="ToParty" to-value-field="party"/>
            <field-to-list field="party" list="parties"/>
        </iterate>
        <if-not-empty field="parties">
            <field-to-result field="parties"/>
        </if-not-empty>
    </simple-method>

    <simple-method method-name="getParentOrganizations" short-description="Gets Parent Organizations for an Organization Party">
        <set from-field="parameters.organizationPartyId" field="relatedPartyIdList[]"/>
        <set from-field="parameters.getParentsOfParents" field="recurse"/>
        <if-empty field="recurse"><set value="Y" field="recurse"/></if-empty>

        <set value="GROUP_ROLLUP" field="partyRelationshipTypeId"/>
        <set value="ORGANIZATION_UNIT" field="roleTypeIdFrom"/>
        <set value="PARENT_ORGANIZATION" field="roleTypeIdTo"/>
        <set value="Y" field="roleTypeIdFromInclueAllChildTypes"/>

        <set value="Y" field="includeFromToSwitched"/>
        <set value="true" field="useCache"/>

        <call-simple-method method-name="followPartyRelationshipsInline"/>

        <field-to-result field="relatedPartyIdList" result-name="parentOrganizationPartyIdList"/>
    </simple-method>

    <simple-method method-name="getRelatedParties" short-description="Get Parties Related to a Party">
        <set from-field="parameters.partyIdFrom" field="relatedPartyIdList[]"/>
        <set from-field="parameters.partyRelationshipTypeId" field="partyRelationshipTypeId"/>
        <set from-field="parameters.roleTypeIdFrom" field="roleTypeIdFrom"/>
        <set from-field="parameters.roleTypeIdFromInclueAllChildTypes" field="roleTypeIdFromInclueAllChildTypes"/>
        <set from-field="parameters.roleTypeIdTo" field="roleTypeIdTo"/>
        <set from-field="parameters.roleTypeIdToIncludeAllChildTypes" field="roleTypeIdToIncludeAllChildTypes"/>
        <set from-field="parameters.includeFromToSwitched" field="includeFromToSwitched"/>
        <set from-field="parameters.recurse" field="recurse"/>
        <set from-field="parameters.useCache" field="useCache"/>

        <call-simple-method method-name="followPartyRelationshipsInline"/>

        <field-to-result field="relatedPartyIdList"/>
    </simple-method>

    <simple-method method-name="followPartyRelationshipsInline" short-description="followPartyRelationshipsInline">
        <!--
            Uses the following fields in the env (with * are required):
             - relatedPartyIdList* (initial partyIdFrom should be in this list; accumulator of new partyIds, ie all partyIdTo found will be added to this, thus can support recursion)
             - partyRelationshipTypeId
             - roleTypeIdFrom
             - roleTypeIdFromInclueAllChildTypes
             - roleTypeIdTo
             - roleTypeIdToIncludeAllChildTypes
             - includeFromToSwitched
             - recurse
             - useCache (should be "true" or "false")
        -->

        <if-empty field="nowTimestamp"><now-timestamp field="nowTimestamp"/></if-empty>

        <!-- only create these if they don't already exist, more efficient and avoids potential problems in recursed calls -->
        <if-empty field="_inline_roleTypeIdFromList">
            <field-to-list field="roleTypeIdFrom" list="_inline_roleTypeIdFromList"/>
            <if-compare field="roleTypeIdFromInclueAllChildTypes" operator="equals" value="Y">
                <set value="_inline_roleTypeIdFromList" field="roleTypeIdListName"/>
                <call-simple-method method-name="getChildRoleTypesInline"/>
            </if-compare>
        </if-empty>
        <if-empty field="_inline_roleTypeIdToList">
            <field-to-list field="roleTypeIdTo" list="_inline_roleTypeIdToList"/>
            <if-compare field="roleTypeIdToInclueAllChildTypes" operator="equals" value="Y">
                <set value="_inline_roleTypeIdToList" field="roleTypeIdListName"/>
                <call-simple-method method-name="getChildRoleTypesInline"/>
            </if-compare>
        </if-empty>

        <call-simple-method method-name="followPartyRelationshipsInlineRecurse"/>
    </simple-method>
    <simple-method method-name="followPartyRelationshipsInlineRecurse" short-description="followPartyRelationshipsInlineRecurse">
        <clear-field field="_inline_NewRelatedPartyIdList"/>

        <iterate list="relatedPartyIdList" entry="relatedPartyId">
            <if>
                <condition><not><if-compare-field field="_inline_relatedPartyIdAlreadySearchedList" to-field="relatedPartyId" operator="contains"/></not></condition>
                <then>
                    <field-to-list field="relatedPartyId" list="_inline_relatedPartyIdAlreadySearchedList"/>

                    <clear-field field="_inline_PartyRelationshipList"/>
                    <entity-condition entity-name="PartyRelationship" list="_inline_PartyRelationshipList" use-cache="${useCache}">
                        <condition-list combine="and">
                            <condition-expr field-name="partyIdFrom" from-field="relatedPartyId"/>
                            <condition-expr field-name="roleTypeIdFrom" operator="in" from-field="_inline_roleTypeIdFromList" ignore-if-empty="true"/>
                            <condition-expr field-name="roleTypeIdTo" operator="in" from-field="_inline_roleTypeIdToList" ignore-if-empty="true"/>
                            <condition-expr field-name="partyRelationshipTypeId" from-field="partyRelationshipTypeId" ignore-if-empty="true"/>

                            <condition-expr field-name="fromDate" operator="less-equals" from-field="nowTimestamp"/>
                            <condition-list combine="or">
                                <condition-expr field-name="thruDate" operator="equals" from-field="nullField"/>
                                <condition-expr field-name="thruDate" operator="greater" from-field="nowTimestamp"/>
                            </condition-list>
                        </condition-list>

                        <!-- get the newest (highest date) first -->
                        <order-by field-name="-fromDate"/>
                    </entity-condition>
                    <iterate list="_inline_PartyRelationshipList" entry="_inline_PartyRelationship">
                        <if>
                            <condition>
                                <and>
                                    <not><if-compare-field field="relatedPartyIdList" to-field="_inline_PartyRelationship.partyIdTo" operator="contains"/></not>
                                    <not><if-compare-field field="_inline_NewRelatedPartyIdList" to-field="_inline_PartyRelationship.partyIdTo" operator="contains"/></not>
                                </and>
                            </condition>
                            <then>
                                <field-to-list field="_inline_PartyRelationship.partyIdTo" list="_inline_NewRelatedPartyIdList"/>
                            </then>
                        </if>
                    </iterate>

                    <if-compare field="includeFromToSwitched" operator="equals" value="Y">
                        <clear-field field="_inline_PartyRelationshipList"/>
                        <entity-condition entity-name="PartyRelationship" list="_inline_PartyRelationshipList" use-cache="${useCache}">
                            <condition-list combine="and">
                                <condition-expr field-name="partyIdTo" from-field="relatedPartyId"/>
                                <condition-expr field-name="roleTypeIdTo" operator="in" from-field="_inline_roleTypeIdFromList" ignore-if-empty="true"/>
                                <condition-expr field-name="roleTypeIdFrom" operator="in" from-field="_inline_roleTypeIdToList" ignore-if-empty="true"/>
                                <condition-expr field-name="partyRelationshipTypeId" from-field="partyRelationshipTypeId" ignore-if-empty="true"/>

                                <condition-expr field-name="fromDate" operator="less-equals" from-field="nowTimestamp"/>
                                <condition-list combine="or">
                                    <condition-expr field-name="thruDate" operator="equals" from-field="nullField"/>
                                    <condition-expr field-name="thruDate" operator="greater" from-field="nowTimestamp"/>
                                </condition-list>
                            </condition-list>

                            <!-- get the newest (highest date) first -->
                            <order-by field-name="-fromDate"/>
                        </entity-condition>
                        <iterate list="_inline_PartyRelationshipList" entry="_inline_PartyRelationship">
                            <if>
                                <condition>
                                    <and>
                                        <not><if-compare-field field="relatedPartyIdList" to-field="_inline_PartyRelationship.partyIdFrom" operator="contains"/></not>
                                        <not><if-compare-field field="_inline_NewRelatedPartyIdList" to-field="_inline_PartyRelationship.partyIdFrom" operator="contains"/></not>
                                    </and>
                                </condition>
                                <then>
                                    <field-to-list field="_inline_PartyRelationship.partyIdFrom" list="_inline_NewRelatedPartyIdList"/>
                                </then>
                            </if>
                        </iterate>
                    </if-compare>
                </then>
            </if>
        </iterate>

        <!-- if we found new ones, add them to the master list and if recurse=Y then recurse -->
        <if-not-empty field="_inline_NewRelatedPartyIdList">
            <list-to-list list="_inline_NewRelatedPartyIdList" to-list="relatedPartyIdList"/>
            <if-compare field="recurse" operator="equals" value="Y">
                <log level="verbose" message="Recursively calling followPartyRelationshipsInlineRecurse _inline_NewRelatedPartyIdList=${_inline_NewRelatedPartyIdList}"/>
                <call-simple-method method-name="followPartyRelationshipsInlineRecurse"/>
            </if-compare>
        </if-not-empty>
    </simple-method>

    <simple-method method-name="getChildRoleTypes" short-description="Get Child RoleTypes">
        <field-to-list field="roleTypeId" list="childRoleTypeIdList"/>
        <set value="childRoleTypeIdList" field="roleTypeIdListName"/>
        <call-simple-method method-name="getChildRoleTypesInline"/>
        <field-to-result field="childRoleTypeIdList"/>
    </simple-method>
    <simple-method method-name="getChildRoleTypesInline" short-description="getChildRoleTypes">
        <clear-field field="_inline_NewRoleTypeIdList"/>

        <iterate list="${roleTypeIdListName}" entry="roleTypeId">
            <if>
                <condition><not><if-compare-field field="_inline_roleTypeIdAlreadySearchedList" to-field="roleTypeId" operator="contains"/></not></condition>
                <then>
                    <field-to-list field="roleTypeId" list="_inline_roleTypeIdAlreadySearchedList"/>

                    <clear-field field="_inline_RoleTypeList"/>
                    <entity-condition entity-name="RoleType" list="_inline_RoleTypeList" use-cache="true">
                        <condition-expr field-name="parentTypeId" operator="equals" from-field="roleTypeId"/>
                    </entity-condition>
                    <iterate list="_inline_RoleTypeList" entry="newRoleType">
                        <if>
                            <condition>
                                <and>
                                    <not><if-compare-field field="${roleTypeIdListName}" to-field="newRoleType.roleTypeId" operator="contains"/></not>
                                    <not><if-compare-field field="_inline_NewRoleTypeIdList" to-field="newRoleType.roleTypeId" operator="contains"/></not>
                                </and>
                            </condition>
                            <then>
                                <field-to-list field="newRoleType.roleTypeId" list="_inline_NewRoleTypeIdList"/>
                            </then>
                        </if>
                    </iterate>
                </then>
            </if>
        </iterate>

        <!-- if we found some new types, add them to the main list -->
        <if-not-empty field="_inline_NewRoleTypeIdList">
            <list-to-list list="_inline_NewRoleTypeIdList" to-list="${roleTypeIdListName}"/>
            <log level="verbose" message="Recursively calling getChildRoleTypesInline roleTypeIdListName=${roleTypeIdListName}, _inline_NewRoleTypeIdList=${_inline_NewRoleTypeIdList}"/>
            <call-simple-method method-name="getChildRoleTypesInline"/>
        </if-not-empty>
    </simple-method>

    <simple-method method-name="getPartyEmail" short-description="Get the email of the party">
        <!-- first try to find primary email Address when not found get other email -->
        <entity-and entity-name="PartyContactWithPurpose" list="emailAddressesPurposes">
            <field-map field-name="partyId" from-field="parameters.partyId"/>
            <field-map field-name="contactMechPurposeTypeId" from-field="parameters.contactMechPurposeTypeId"/>
        </entity-and>
        <filter-list-by-date list="emailAddressesPurposes" to-list="emailAddressesPurposes1" from-field-name="purposeFromDate" thru-field-name="purposeThruDate"/>
        <filter-list-by-date list="emailAddressesPurposes1" to-list="emailAddresses" from-field-name="contactFromDate" thru-field-name="contactThruDate"/>
        <!-- any other email -->
        <if-empty field="emailAddresses">
            <entity-and entity-name="PartyAndContactMech" list="emailAddresses" filter-by-date="true">
                <field-map field-name="partyId" from-field="parameters.partyId"/>
                <field-map field-name="contactMechTypeId" value="EMAIL_ADDRESS"/>
            </entity-and>
        </if-empty> 
        <!-- any other electronic address -->
        <if-empty field="emailAddresses">
            <entity-and entity-name="PartyAndContactMech" list="emailAddresses" filter-by-date="true">
                <field-map field-name="partyId" from-field="parameters.partyId"/>
                <field-map field-name="contactMechTypeId" value="ELECTRONIC_ADDRESS"/>
            </entity-and>
        </if-empty>
        <if-not-empty field="emailAddresses">
            <first-from-list list="emailAddresses" entry="emailAddress"/>
            <field-to-result field="emailAddress.infoString" result-name="emailAddress"/>
            <field-to-result field="emailAddress.contactMechId" result-name="contactMechId"/>
        </if-not-empty>
    </simple-method>

    <simple-method method-name="getPartyTelephone" short-description="Get the telephone number of the party">
        <set field="findMap.partyId" from-field="parameters.partyId"/>
        <if-empty field="parameters.contactMechPurposeTypeId">
            <!-- search in this order if not provided-->
            <set field="type" value="PRIMARY_PHONE"/><field-to-list field="type" list="types"/>
            <set field="type" value="PHONE_MOBILE"/><field-to-list field="type" list="types"/>
            <set field="type" value="PHONE_WORK"/><field-to-list field="type" list="types"/>
            <set field="type" value="PHONE_QUICK"/><field-to-list field="type" list="types"/>
            <set field="type" value="PHONE_HOME"/><field-to-list field="type" list="types"/>
            <set field="type" value="PHONE_BILLING"/><field-to-list field="type" list="types"/>
            <set field="type" value="PHONE_SHIPPING"/><field-to-list field="type" list="types"/>
            <set field="type" value="PHONE_SHIP_ORIG"/><field-to-list field="type" list="types"/>
            <else>
                <set field="type" from-field="parameters.contactMechPurposeTypeId"/>
                <field-to-list field="type" list="types"/>
            </else>
        </if-empty>
        <set field="findMap.contactMechTypeId" value="TELECOM_NUMBER"/>
        <find-by-and entity-name="PartyContactDetailByPurpose" map="findMap" list="telephoneAll1"/>
        <filter-list-by-date list="telephoneAll1" to-list="telephoneAll2" from-field-name="purposeFromDate" thru-field-name="purposeThruDate"/>
        <filter-list-by-date list="telephoneAll2" to-list="telephoneAll3"/>
        <if-not-empty field="telephoneAll3">
            <iterate list="types" entry="type">
                <iterate list="telephoneAll3" entry="telephone">
                    <if-empty field="found">
                        <if-compare-field field="telephone.contactMechPurposeTypeId" to-field="type" operator="equals">
                            <set field="found" value="notImportant"/>
                            <field-to-result field="telephone.contactMechId" result-name="contactMechId"/>
                            <if-not-empty field="telephone.countryCode">
                                <field-to-result field="telephone.countryCode" result-name="countryCode"/>
                            </if-not-empty>
                            <if-not-empty field="telephone.areaCode">
                                <field-to-result field="telephone.areaCode" result-name="areaCode"/>
                            </if-not-empty>
                            <if-not-empty field="telephone.contactNumber">
                                <field-to-result field="telephone.contactNumber" result-name="contactNumber"/>
                            </if-not-empty>
                            <if-not-empty field="telephone.extension">
                                <field-to-result field="telephone.extension" result-name="extension"/>
                            </if-not-empty>
                            <field-to-result field="telephone.contactMechPurposeTypeId" result-name="contactMechPurposeTypeId"/>
                        </if-compare-field>
                    </if-empty>
                </iterate>
            </iterate>
            <else>
                <find-by-and entity-name="PartyAndContactMech" map="findMap" list="telephoneAll1"/>
                <filter-list-by-date list="telephoneAll1" to-list="telephoneAll2"/>
                <first-from-list list="telephoneAll2" entry="telephone"/>
                <field-to-result field="telephone.contactMechId" result-name="contactMechId"/>
                <if-not-empty field="telephone.tnCountryCode">
                    <field-to-result field="telephone.tnCountryCode" result-name="countryCode"/>
                </if-not-empty>
                <if-not-empty field="telephone.tnAreaCode">
                    <field-to-result field="telephone.tnAreaCode" result-name="areaCode"/>
                </if-not-empty>
                <if-not-empty field="telephone.tnContactNumber">
                    <field-to-result field="telephone.tnContactNumber" result-name="contactNumber"/>
                </if-not-empty>
                <if-not-empty field="telephone.extension">
                    <field-to-result field="telephone.extension" result-name="extension"/>
                </if-not-empty>
            </else>
        </if-not-empty>
    </simple-method>

    <simple-method method-name="getPartyPostalAddress" short-description="Get the postal address of the party">
        <set field="findMap.partyId" from-field="parameters.partyId"/>
        <if-empty field="parameters.contactMechPurposeTypeId">
                <!-- search in this order if not provided-->
                <set field="type" value="GENERAL_LOCATION"/><field-to-list field="type" list="types"/>
                <set field="type" value="BILLING_LOCATION"/><field-to-list field="type" list="types"/>
                <set field="type" value="PAYMENT_LOCATION"/><field-to-list field="type" list="types"/>
                <set field="type" value="SHIPPING_LOCATION"/><field-to-list field="type" list="types"/>
                <else>
                    <set field="type" from-field="parameters.contactMechPurposeTypeId"/><field-to-list field="type" list="types"/>
                </else>
        </if-empty>
        <set field="findMap.contactMechTypeId" value="POSTAL_ADDRESS"/>
        <find-by-and entity-name="PartyContactDetailByPurpose" map="findMap" list="addressAll1"></find-by-and>
        <filter-list-by-date list="addressAll1" to-list="addressAll2" from-field-name="purposeFromDate" thru-field-name="purposeThruDate"/>
        <filter-list-by-date list="addressAll2" to-list="addressAll3"/>
        <if-not-empty field="addressAll3">
            <iterate list="types" entry="type">
                <iterate list="addressAll3" entry="address">
                    <if-empty field="found">
                        <if-compare-field field="address.contactMechPurposeTypeId" to-field="type" operator="equals">
                            <set field="found" value="notImportant"/>
                            <field-to-result field="address.contactMechId" result-name="contactMechId"/>
                            <if-not-empty field="address.address1">
                                <field-to-result field="address.address1" result-name="address1"/>
                            </if-not-empty>
                            <if-not-empty field="address.address2">
                                <field-to-result field="address.address2" result-name="address2"/>
                            </if-not-empty>
                            <if-not-empty field="address.directions">
                                <field-to-result field="address.directions" result-name="directions"/>
                            </if-not-empty>
                            <if-not-empty field="address.city">
                                <field-to-result field="address.city" result-name="city"/>
                            </if-not-empty>
                            <if-not-empty field="address.postalCode">
                                <field-to-result field="address.postalCode" result-name="postalCode"/>
                            </if-not-empty>
                            <if-not-empty field="address.stateProvinceGeoId">
                                <field-to-result field="address.stateProvinceGeoId" result-name="stateProvinceGeoId"/>
                            </if-not-empty>
                            <if-not-empty field="address.countyGeoId">
                                <field-to-result field="address.countyGeoId" result-name="countyGeoId"/>
                            </if-not-empty>
                            <if-not-empty field="address.countryGeoId">
                                <field-to-result field="address.countryGeoId" result-name="countryGeoId"/>
                            </if-not-empty>
                            <field-to-result field="address.contactMechPurposeTypeId" result-name="contactMechPurposeTypeId"/>
                        </if-compare-field>
                    </if-empty>
                </iterate>
            </iterate>
            <else>
                <find-by-and entity-name="PartyAndContactMech" map="findMap" list="addressAll1"/>
                <filter-list-by-date list="addressAll1" to-list="addressAll2"/>
                <first-from-list list="addressAll2" entry="address"/>
                      <field-to-result field="address.contactMechId" result-name="contactMechId"/>
                      <if-not-empty field="address.paAddress1">
                          <field-to-result field="address.paAddress1" result-name="address1"/>
                      </if-not-empty>
                      <if-not-empty field="address.paAddress2">
                          <field-to-result field="address.paAddress2" result-name="address2"/>
                      </if-not-empty>
                      <if-not-empty field="address.paDirections">
                          <field-to-result field="address.paDirections" result-name="directions"/>
                      </if-not-empty>
                      <if-not-empty field="address.paCity">
                          <field-to-result field="address.paCity" result-name="city"/>
                      </if-not-empty>
                      <if-not-empty field="address.paPostalCode">
                          <field-to-result field="address.paPostalCode" result-name="postalCode"/>
                      </if-not-empty>
                      <if-not-empty field="address.paStateProvinceGeoId">
                          <field-to-result field="address.paStateProvinceGeoId" result-name="stateProvinceGeoId"/>
                      </if-not-empty>
                      <if-not-empty field="address.paCountyGeoId">
                          <field-to-result field="address.paCountyGeoId" result-name="countyGeoId"/>
                      </if-not-empty>
                      <if-not-empty field="address.paCountryGeoId">
                          <field-to-result field="address.paCountryGeoId" result-name="countryGeoId"/>
                      </if-not-empty>
            </else>
        </if-not-empty>
    </simple-method>

    <!-- address match map -->
    <simple-method method-name="createAddressMatchMap" short-description="create a AddressMatchMap">
        <call-object-method obj-field="parameters.mapValue" method-name="toUpperCase" ret-field="parameters.mapValue"/>
        <call-object-method obj-field="parameters.mapKey" method-name="toUpperCase" ret-field="parameters.mapKey"/>
        <make-value entity-name="AddressMatchMap" value-field="newEntity"/>
        <set-pk-fields map="parameters" value-field="newEntity"/>
        <set-nonpk-fields map="parameters" value-field="newEntity"/>
        <create-value value-field="newEntity"/>
    </simple-method>
    <simple-method method-name="clearAddressMatchMap" short-description="remove all AddressMatchMap">
        <entity-condition entity-name="AddressMatchMap" list="addrs">
            <use-iterator/>
        </entity-condition>
        <iterate list="addrs" entry="addr">
            <remove-value value-field="addr"/>
        </iterate>
    </simple-method>

    <!-- PartyRelationship services -->
    <simple-method method-name="createPartyRelationship" short-description="createPartyRelationship">
        <if-empty field="parameters.roleTypeIdFrom"><set field="parameters.roleTypeIdFrom" value="_NA_"/></if-empty>
        <if-empty field="parameters.roleTypeIdTo"><set field="parameters.roleTypeIdTo" value="_NA_"/></if-empty>
        <if-empty field="parameters.partyIdFrom"><set field="parameters.partyIdFrom" from-field="userLogin.partyId"/></if-empty>

        <if-empty field="parameters.fromDate"><now-timestamp field="parameters.fromDate"/></if-empty>

        <!-- check if not already exist -->
        <entity-and entity-name="PartyRelationship" list="partyRels" filter-by-date="true">
            <field-map field-name="partyIdFrom" from-field="parameters.partyIdFrom"/>
            <field-map field-name="roleTypeIdFrom" from-field="parameters.roleTypeIdFrom"/>
            <field-map field-name="partyIdTo" from-field="parameters.partyIdTo"/>
            <field-map field-name="roleTypeIdTo" from-field="parameters.roleTypeIdTo"/>
        </entity-and>

        <if-empty field="partyRels">
            <make-value entity-name="PartyRelationship" value-field="newEntity"/>
            <set-pk-fields map="parameters" value-field="newEntity"/>
            <set-nonpk-fields map="parameters" value-field="newEntity"/>
            <create-value value-field="newEntity"/>
        </if-empty>
    </simple-method>
    <simple-method method-name="updatePartyRelationship" short-description="updatePartyRelationship">
        <if-empty field="parameters.roleTypeIdFrom"><set field="parameters.roleTypeIdFrom" value="_NA_"/></if-empty>
        <if-empty field="parameters.roleTypeIdTo"><set field="parameters.roleTypeIdTo" value="_NA_"/></if-empty>

        <entity-one entity-name="PartyRelationship" value-field="lookedUpValue"/>
        <set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
        <store-value value-field="lookedUpValue"/>
    </simple-method>
    <simple-method method-name="deletePartyRelationship" short-description="deletePartyRelationship">
        <if-empty field="parameters.roleTypeIdFrom"><set field="parameters.roleTypeIdFrom" value="_NA_"/></if-empty>
        <if-empty field="parameters.roleTypeIdTo"><set field="parameters.roleTypeIdTo" value="_NA_"/></if-empty>

        <entity-one entity-name="PartyRelationship" value-field="lookedUpValue"/>
        <remove-value value-field="lookedUpValue"/>
    </simple-method>

    <simple-method method-name="createPartyRelationshipContactAccount" short-description="create a company/contact relationship and add the related roles">
        <set field="roleMap.partyId" from-field="parameters.accountPartyId"/>
        <set field="roleMap.roleTypeId" value="ACCOUNT"/>
        <entity-one entity-name="PartyRole" value-field="partyRole">
            <field-map field-name="partyId" from-field="roleMap.partyId"/>
            <field-map field-name="roleTypeId" from-field="roleMap.roleTypeId"/>
        </entity-one>
        <if-empty field="partyRole">
            <call-service service-name="createPartyRole" in-map-name="roleMap"/>
        </if-empty>
        <set field="roleMap.partyId" from-field="parameters.contactPartyId"/>
        <set field="roleMap.roleTypeId" value="CONTACT"/>
        <entity-one entity-name="PartyRole" value-field="partyRole">
            <field-map field-name="partyId" from-field="roleMap.partyId"/>
            <field-map field-name="roleTypeId" from-field="roleMap.roleTypeId"/>
        </entity-one>
        <if-empty field="partyRole">
            <call-service service-name="createPartyRole" in-map-name="roleMap"/>
        </if-empty>
        <set field="relMap.partyIdFrom" from-field="parameters.accountPartyId"/>
        <set field="relMap.roleTypeIdFrom" value="ACCOUNT"/>
        <set field="relMap.partyIdTo" from-field="parameters.contactPartyId"/>
        <set field="relMap.roleTypeIdTo" value="CONTACT"/>
        <set field="relMap.partyRelationshipTypeId" value="EMPLOYMENT"/>
        <set field="relMap.comments" from-field="parameters.comments"/> 
        <call-service service-name="createPartyRelationship" in-map-name="relMap"/>
    </simple-method>

    <!-- send party creation email notification -->
    <simple-method method-name="sendCreatePartyEmailNotification" short-description="Notification email on party creation" login-required="false">
        <map-to-map map="parameters" to-map="bodyParameters"/>
        <set field="emailType" value="PARTY_REGIS_CONFIRM"/>
        <set field="productStoreId" from-field="parameters.productStoreId" />
        <if-empty field="productStoreId">
            <log level="warning" message="No productStoreId specified."/>
        </if-empty>
        <entity-one entity-name="ProductStoreEmailSetting" value-field="storeEmail">
            <field-map field-name="emailType"/>
            <field-map field-name="productStoreId"/>
        </entity-one>
        <entity-and entity-name="WebSite" list="webSites">
            <field-map field-name="productStoreId" from-field="storeEmail.productStoreId"/>
        </entity-and>
        <first-from-list list="webSites" entry="webSite"/>
        <if-not-empty field="storeEmail.bodyScreenLocation">
            <entity-one entity-name="Person" value-field="person"/>
            <set field="bodyParameters.person" from-field="person"/>
            <set field="emailParams.bodyParameters" from-field="bodyParameters"/>

            <set field="emailParams.sendTo" from-field="parameters.emailAddress"/>
            <set field="emailParams.subject" from-field="storeEmail.subject"/>
            <set field="emailParams.sendFrom" from-field="storeEmail.fromAddress"/>
            <set field="emailParams.sendCc" from-field="storeEmail.ccAddress"/>
            <set field="emailParams.sendBcc" from-field="storeEmail.bccAddress"/>
            <set field="emailParams.contentType" from-field="storeEmail.contentType"/>
            <set field="emailParams.bodyScreenUri" from-field="storeEmail.bodyScreenLocation"/>
            <set field="emailParams.webSiteId" from-field="webSite.webSiteId"/>
            <set field="emailParams.emailType" from-field="emailType"/>
            <call-service service-name="sendMailFromScreen" in-map-name="emailParams"/>
        </if-not-empty>
    </simple-method>

    <!-- send personal information update email notification -->
    <simple-method method-name="sendUpdatePersonalInfoEmailNotification" short-description="Send the Notification email on personal information updation" login-required="false">
        <map-to-map map="parameters" to-map="bodyParameters"/>
        <set field="productStoreId" from-field="parameters.productStoreId" />
        <if-empty field="productStoreId">
            <log level="warning" message="No productStoreId specified."/>
        </if-empty>
        <entity-one entity-name="ProductStoreEmailSetting" value-field="storeEmail">
            <field-map field-name="emailType" value="UPD_PRSNL_INF_CNFRM"/>
            <field-map field-name="productStoreId"/>
        </entity-one>
        <entity-and entity-name="WebSite" list="webSites">
            <field-map field-name="productStoreId" from-field="storeEmail.productStoreId"/>
        </entity-and>
        <first-from-list list="webSites" entry="webSite"/>
        <if-not-empty field="storeEmail.bodyScreenLocation">
            <if-not-empty field="parameters.updatedUserLogin.partyId">
                <set field="partyId" from-field="parameters.updatedUserLogin.partyId"/>
            <else>
                <set field="partyId" from-field="parameters.partyId"/>
            </else>
            </if-not-empty>
            <entity-condition entity-name="PartyContactDetailByPurpose" list="partyContactDetailByPurposes" filter-by-date="true">
                <condition-list>
                    <condition-expr field-name="contactMechPurposeTypeId" operator="equals" value="PRIMARY_EMAIL"/>
                    <condition-expr field-name="partyId" operator="equals"  from-field="partyId"/>
                </condition-list>
            </entity-condition>
            <first-from-list list="partyContactDetailByPurposes" entry="partyContactDetailByPurpose"/>
            <entity-one entity-name="PartyAndPerson" value-field="partyAndPerson"/>
            <set field="bodyParameters.partyAndPerson" from-field="partyAndPerson"/>
            <set field="contactMechId" from-field="partyContactDetailByPurpose.contactMechId"/>
            <entity-one entity-name="ContactMech" value-field="contactMech"/>
            <set field="emailParams.sendTo" from-field="contactMech.infoString"/>
            <set field="emailParams.subject" from-field="storeEmail.subject"/>
            <set field="emailParams.sendFrom" from-field="storeEmail.fromAddress"/>
            <set field="emailParams.sendCc" from-field="storeEmail.ccAddress"/>
            <set field="emailParams.sendBcc" from-field="storeEmail.bccAddress"/>
            <set field="emailParams.contentType" from-field="storeEmail.contentType"/>
            <set field="emailParams.bodyParameters" from-field="bodyParameters"/>
            <set field="emailParams.bodyScreenUri" from-field="storeEmail.bodyScreenLocation"/>
            <set field="emailParams.webSiteId" from-field="webSite.webSiteId"/>

            <if-not-empty field="emailParams.sendTo">
                <call-service service-name="sendMailFromScreen" in-map-name="emailParams"/>
                <else>
                    <log level="warning" message="Tried to send Update Personal Info Notifcation with no to address; partyId is [${partyId}], subject is: ${emailParams.subject}"/>
                </else>
            </if-not-empty>
        </if-not-empty>
    </simple-method>

    <simple-method method-name="createUpdatePerson" short-description="Create and update a person" login-required="false">
        <call-map-processor xml-resource="component://party/minilang/party/PartyMapProcs.xml"
                processor-name="person" in-map-name="parameters" out-map-name="personMap"/>
        <check-errors/>
        <set field="partyId" from-field="parameters.partyId"/>
        <entity-one entity-name="Party" value-field="party"/>
        <set field="personContext.partyId" from-field="partyId"/>
        <set-service-fields service-name="createPerson" map="personMap" to-map="personContext"/>
        <if-empty field="party">
            <call-service service-name="createPerson" in-map-name="personContext">
                <result-to-field result-name="partyId" field="partyId"/>
            </call-service>
        <else><!-- If party object already exist, update the person record. -->
            <set field="personContext.userLogin" from-field="parameters.userLogin"/>
            <call-service service-name="updatePerson" in-map-name="personContext"/>
        </else>
        </if-empty>
        <field-to-result field="partyId"/>
    </simple-method>

    <simple-method method-name="quickCreateCustomer" short-description="Create customer profile on basis of First Name ,Last Name and Email Address" login-required="false">
        <call-map-processor xml-resource="component://party/minilang/contact/PartyContactMechMapProcs.xml"
                processor-name="person" in-map-name="parameters" out-map-name="personInMap"/>
        <call-map-processor xml-resource="component://party/minilang/contact/PartyContactMechMapProcs.xml"
                processor-name="emailAddress" in-map-name="parameters" out-map-name="emailAddressInMap"/>
        <check-errors/>
        
        <!-- create person  -->
        <call-service service-name="createPerson" in-map-name="personInMap">
            <result-to-field result-name="partyId"/>
            <result-to-result result-name="partyId"/>
        </call-service>

        <!-- Create email address -->
        <entity-one entity-name="UserLogin" value-field="userLogin">
            <field-map field-name="userLoginId" value="system"/>
        </entity-one>
        <set field="emailAddressInMap.partyId" from-field="partyId"/>
        <set field="emailAddressInMap.userLogin" from-field="userLogin"/>
        <set field="emailAddressInMap.contactMechPurposeTypeId" value="PRIMARY_EMAIL"/>
        <call-service service-name="createPartyEmailAddress" in-map-name="emailAddressInMap"/>

        <!-- Signup for Contact List -->
        <if-compare field="parameters.subscribeContactList" operator="equals" value="Y">
            <set field="signUpForContactListMap.partyId" from-field="partyId"/>
            <set field="signUpForContactListMap.contactListId" from-field="parameters.contactListId"/>
            <set field="signUpForContactListMap.email" from-field="parameters.emailAddress"/>
            <call-service service-name="signUpForContactList" in-map-name="signUpForContactListMap"/>
        </if-compare>

        <!-- Create the PartyRole -->
        <set field="createPartyRoleInMap.partyId" from-field="partyId"/>
        <set field="createPartyRoleInMap.roleTypeId" value="CUSTOMER"/>
        <set field="createPartyRoleInMap.userLogin" from-field="userLogin"/>
        <call-service service-name="createPartyRole" in-map-name="createPartyRoleInMap"/>
    </simple-method>

    <simple-method method-name="getPartyMainRole"
        short-description="Get the main role of this party which is a child of the MAIN_ROLE roletypeId">
        <entity-and entity-name="PartyRole" list="partyRoles">
            <field-map field-name="partyId" from-field="parameters.partyId" />
        </entity-and>
        <!-- find the role in the list -->
        <clear-field field="mainRoleTypeId"/>
        <iterate list="partyRoles" entry="partyRole">
            <if-empty field="mainRoleTypeId">
                <entity-and entity-name="RoleTypeIn3Levels" list="roleTypeIn3Levels">
                    <field-map field-name="topRoleTypeId" value="MAIN_ROLE" />
                    <field-map field-name="lowRoleTypeId" from-field="partyRole.roleTypeId" />
                </entity-and>
                <if-not-empty field="roleTypeIn3Levels">
                    <set field="mainRoleTypeId" from-field="partyRole.roleTypeId" />
                </if-not-empty>
            </if-empty>
        </iterate>
        <if-not-empty field="mainRoleTypeId">
            <field-to-result field="mainRoleTypeId" result-name="roleTypeId" />
            <entity-one entity-name="RoleType" value-field="roleType">
                <field-map field-name="roleTypeId" from-field="mainRoleTypeId" />
            </entity-one>
            <field-to-result field="roleType.description" result-name="description" />
        </if-not-empty>
    </simple-method>
    
    <!-- send account activated email notification -->
    <simple-method method-name="sendAccountActivatedEmailNotification" short-description="Notification email on account activated" login-required="false">
        <map-to-map map="parameters" to-map="bodyParameters"/>
        <set field="emailType" value="PRDS_CUST_ACTIVATED"/>
        <set field="productStoreId" from-field="parameters.productStoreId" />
        <entity-one entity-name="ProductStoreEmailSetting" value-field="storeEmail">
            <field-map field-name="emailType"/>
            <field-map field-name="productStoreId"/>
        </entity-one>
        <entity-and entity-name="WebSite" list="webSites">
            <field-map field-name="productStoreId" from-field="storeEmail.productStoreId"/>
        </entity-and>
        <first-from-list list="webSites" entry="webSite"/>
        <if-not-empty field="storeEmail.bodyScreenLocation">
            <entity-one entity-name="UserLogin" value-field="userLoginParty"/>
            <set field="parameters.partyId" from-field="userLoginParty.partyId"/>
            <entity-condition entity-name="PartyContactDetailByPurpose" list="partyContactDetailByPurposes" filter-by-date="true">
                <condition-list>
                    <condition-expr field-name="contactMechPurposeTypeId" operator="equals" value="PRIMARY_EMAIL"/>
                    <condition-expr field-name="partyId" operator="equals"  from-field="parameters.partyId"/>
                </condition-list>
            </entity-condition>
            <first-from-list list="partyContactDetailByPurposes" entry="partyContactDetailByPurpose"/>
            <entity-one entity-name="Person" value-field="person"/>
            <set field="bodyParameters.person" from-field="person"/>
            <set field="emailParams.bodyParameters" from-field="bodyParameters"/>
            <set field="contactMechId" from-field="partyContactDetailByPurpose.contactMechId"/>
            <entity-one entity-name="ContactMech" value-field="contactMech"/>
            <set field="emailParams.sendTo" from-field="contactMech.infoString"/>
            <set field="emailParams.subject" from-field="storeEmail.subject"/>
            <set field="emailParams.sendFrom" from-field="storeEmail.fromAddress"/>
            <set field="emailParams.sendCc" from-field="storeEmail.ccAddress"/>
            <set field="emailParams.sendBcc" from-field="storeEmail.bccAddress"/>
            <set field="emailParams.contentType" from-field="storeEmail.contentType"/>
            <set field="emailParams.bodyScreenUri" from-field="storeEmail.bodyScreenLocation"/>
            <set field="emailParams.webSiteId" from-field="webSite.webSiteId"/>
            <set field="emailParams.emailType" from-field="emailType"/>
            <call-service service-name="sendMailFromScreen" in-map-name="emailParams"/>
        </if-not-empty>
    </simple-method>
</simple-methods>
