blob: 29c06f29f5cf39130a9906450d299ebd047bc261 [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"
xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/simple-methods-v2.xsd">
<simple-method method-name="getOrderedSummaryInformation" short-description="Get Summary Information About Orders for a Customer">
<!-- The permission checking is commented out to make this service work also when triggered from ecommerce -->
<!--if>
<condition>
<and>
<not><if-has-permission permission="ORDERMGR" action="_VIEW"/></not>
<if-compare-field field="parameters.partyId" to-field="userLogin.partyId" operator="not-equals"/>
</and>
</condition>
<then>
<string-to-list string="To get order summary information you must have the ORDERMGR_VIEW permission, or be logged in as the party to get the summary information for." list="error_list"/>
</then>
</if>
<check-errors/>
-->
<if-not-empty field="monthsToInclude">
<now-timestamp field="nowTimestamp"/>
<!-- TODO: Change this to use the <set-calendar> operation -->
<call-bsh><![CDATA[
calendar = com.ibm.icu.util.Calendar.getInstance();
calendar.setTimeInMillis(nowTimestamp.getTime());
calendar.add(com.ibm.icu.util.Calendar.MONTH, -monthsToInclude.intValue());
parameters.put("fromDate", new Timestamp(calendar.getTimeInMillis()));
]]></call-bsh>
<set from-field="nowTimestamp" field="parameters.thruDate"/>
</if-not-empty>
<if-empty field="parameters.roleTypeId">
<set value="PLACING_CUSTOMER" field="parameters.roleTypeId"/>
</if-empty>
<if-empty field="parameters.orderTypeId">
<set value="SALES_ORDER" field="parameters.orderTypeId"/>
</if-empty>
<if-empty field="parameters.statusId">
<set value="ORDER_COMPLETED" field="parameters.statusId"/>
</if-empty>
<entity-condition entity-name="OrderHeaderAndRoleSummary" list="orderInfoList">
<condition-list combine="and">
<condition-expr field-name="partyId" operator="equals" from-field="parameters.partyId"/>
<condition-expr field-name="roleTypeId" operator="equals" from-field="parameters.roleTypeId"/>
<condition-expr field-name="orderTypeId" operator="equals" from-field="parameters.orderTypeId"/>
<condition-expr field-name="statusId" operator="equals" from-field="parameters.statusId"/>
<condition-expr field-name="orderDate" operator="greater-equals" from-field="parameters.fromDate" ignore-if-null="true"/>
<condition-expr field-name="orderDate" operator="less-equals" from-field="parameters.thruDate" ignore-if-null="true"/>
</condition-list>
<select-field field-name="partyId"/>
<select-field field-name="roleTypeId"/>
<select-field field-name="totalGrandAmount"/>
<select-field field-name="totalSubRemainingAmount"/>
<select-field field-name="totalOrders"/>
</entity-condition>
<!-- first set the required OUT fields to zero -->
<calculate field="plainDoubleZero"><number value="0.0"/></calculate>
<calculate field="plainLongZero" type="Long"><number value="0"/></calculate>
<field-to-result field="plainDoubleZero" result-name="totalGrandAmount"/>
<field-to-result field="plainDoubleZero" result-name="totalSubRemainingAmount"/>
<field-to-result field="plainLongZero" result-name="totalOrders"/>
<!-- because we specified the partyId and the roleTypeId, should only be one item in list returned -->
<first-from-list list="orderInfoList" entry="orderInfo"/>
<if-not-empty field="orderInfo">
<field-to-result field="orderInfo.totalGrandAmount" result-name="totalGrandAmount"/>
<field-to-result field="orderInfo.totalSubRemainingAmount" result-name="totalSubRemainingAmount"/>
<field-to-result field="orderInfo.totalOrders" result-name="totalOrders"/>
</if-not-empty>
</simple-method>
<simple-method method-name="createOrderShipment" short-description="Create OrderShipment">
<set value="Create OrderShipment" field="operationName"/>
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCreateOrderShipment"/>
</check-permission>
<check-errors/>
<make-value value-field="newEntity" entity-name="OrderShipment"/>
<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="updateOrderShipment" short-description="Update OrderShipment">
<set value="Update OrderShipment" field="operationName"/>
<check-permission permission="ORDERMGR" action="_UPDATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunDeleteOrderShipment"/>
</check-permission>
<check-errors/>
<entity-one entity-name="OrderShipment" value-field="lookedUpValue"/>
<set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
<store-value value-field="lookedUpValue"/>
</simple-method>
<simple-method method-name="deleteOrderShipment" short-description="Delete OrderShipment">
<set value="Delete OrderShipment" field="operationName"/>
<check-permission permission="ORDERMGR" action="_DELETE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunDeleteOrderShipment"/>
</check-permission>
<check-errors/>
<entity-one entity-name="OrderShipment" value-field="lookedUpValue"/>
<remove-value value-field="lookedUpValue"/>
</simple-method>
<!-- order requirement methods -->
<simple-method method-name="createOrderRequirementCommitment" short-description="Create OrderRequirementCommitment">
<!-- The permission checking is commented out to make this service work also when triggered from ecommerce orders -->
<!--
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCheckCreateOrderRequirementCommitment"/>
</check-permission>
<check-errors/>
-->
<make-value value-field="newEntity" entity-name="OrderRequirementCommitment"/>
<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="createRequirementAndCommitment" short-description="create a requirement and commitment for it">
<set value="PRODUCT_REQUIREMENT" field="inputMap.requirementTypeId"/>
<!-- Include the facilityId corresponding to this order by looking up the ProductStore -->
<entity-one entity-name="OrderHeader" value-field="orderHeader" auto-field-map="true"/>
<get-related-one value-field="orderHeader" relation-name="ProductStore" to-value-field="productStore" use-cache="true"/>
<if-not-empty field="productStore.inventoryFacilityId">
<set from-field="productStore.inventoryFacilityId" field="inputMap.facilityId"/>
</if-not-empty>
<call-service service-name="createRequirement" in-map-name="inputMap">
<result-to-field field="parameters.requirementId" result-name="requirementId"/>
</call-service>
<!-- create the OrderRequirementCommitment to record the Requirement created for an order item -->
<set-service-fields to-map="orderReqCommitParams" service-name="createOrderRequirementCommitment" map="parameters"/>
<call-service service-name="createOrderRequirementCommitment" in-map-name="orderReqCommitParams"/>
<field-to-result field="parameters.requirementId" result-name="requirementId"/>
</simple-method>
<simple-method method-name="getProductFacilityAndQuantities" short-description="finds ProductFacility and QOH, ATP inventory for an inventoryItem">
<!-- Get the ProductFacility for the minimum stock level -->
<entity-one entity-name="ProductFacility" value-field="productFacility">
<field-map from-field="inventoryItem.productId" field-name="productId"/>
<field-map from-field="inventoryItem.facilityId" field-name="facilityId"/>
</entity-one>
<!-- Get the product's total quantityOnHand in the facility -->
<set from-field="inventoryItem.productId" field="inputMap.productId"/>
<set from-field="inventoryItem.facilityId" field="inputMap.facilityId"/>
<call-service service-name="getInventoryAvailableByFacility" in-map-name="inputMap">
<result-to-field field="quantityOnHandTotal" result-name="quantityOnHandTotal"/>
<result-to-field field="availableToPromiseTotal" result-name="availableToPromiseTotal"/>
</call-service>
<clear-field field="inputMap"/>
</simple-method>
<simple-method method-name="getProductRequirementMethod" short-description="finds the requirement method for the product">
<if-not-empty field="parameters.orderId">
<entity-one entity-name="OrderHeader" auto-field-map="true" value-field="order"/>
</if-not-empty>
<entity-one entity-name="Product" auto-field-map="true" value-field="product"/>
<set from-field="product.requirementMethodEnumId" field="requirementMethodId"/>
<if-empty field="requirementMethodId">
<set field="isMarketingPkg" value="${groovy: org.ofbiz.entity.util.EntityTypeUtil.hasParentType(delegator, 'ProductType', 'productTypeId', product.productTypeId, 'parentTypeId', 'MARKETING_PKG')}" type="Boolean"/>
<if>
<condition>
<and>
<if-compare field="isMarketingPkg" operator="equals" value="false" type="Boolean"/>
<if-compare field="product.productTypeId" operator="not-equals" value="DIGITAL_GOOD"/>
<not><if-empty field="order"/></not>
</and>
</condition>
<then>
<entity-one entity-name="ProductStore" value-field="productStore">
<field-map from-field="order.productStoreId" field-name="productStoreId"/>
</entity-one>
<set from-field="productStore.requirementMethodEnumId" field="requirementMethodId"/>
</then>
</if>
</if-empty>
</simple-method>
<simple-method method-name="checkCreateOrderRequirement" short-description="Create OrderRequirementCommitment and Requirement">
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCheckCreateOrderRequirement"/>
</check-permission>
<check-errors/>
<call-simple-method method-name="getProductRequirementMethod"/>
<if-compare field="order.orderTypeId" operator="equals" value="SALES_ORDER">
<if-compare field="requirementMethodId" operator="equals" value="PRODRQM_AUTO">
<!-- create the requirement -->
<set from-field="parameters.productId" field="inputMap.productId"/>
<set from-field="parameters.quantity" field="inputMap.quantity"/>
<call-simple-method method-name="createRequirementAndCommitment"/>
</if-compare>
</if-compare>
</simple-method>
<simple-method method-name="checkCreateStockRequirementQoh" short-description="Create a Requirement if QOH goes under the minimum stock level">
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCheckCreateStockRequirement"/>
</check-permission>
<check-errors/>
<!-- If the service is triggered by the updateItemIssuance service, get the ItemIssuance by the passed itemIssuanceId -->
<if-not-empty field="parameters.itemIssuanceId">
<entity-one entity-name="ItemIssuance" auto-field-map="true" value-field="itemIssuance"/>
<entity-one entity-name="InventoryItem" value-field="inventoryItem">
<field-map from-field="itemIssuance.inventoryItemId" field-name="inventoryItemId"/>
</entity-one>
<else>
<entity-one entity-name="InventoryItem" auto-field-map="true" value-field="inventoryItem"/>
</else>
</if-not-empty>
<set from-field="inventoryItem.productId" field="parameters.productId"/>
<call-simple-method method-name="getProductRequirementMethod"/>
<if-compare field="requirementMethodId" operator="equals" value="PRODRQM_STOCK">
<!-- get QOH, ATP quantities and find ProductFacility which has the minimum stock -->
<call-simple-method method-name="getProductFacilityAndQuantities"/>
<if-not-empty field="productFacility.minimumStock">
<!-- No requirements are created if we are already under stock -->
<if-compare-field field="quantityOnHandTotal" to-field="productFacility.minimumStock" operator="greater-equals" type="BigDecimal">
<calculate field="newQuantityOnHand">
<calcop field="quantityOnHandTotal" operator="subtract">
<calcop operator="get" field="parameters.quantity"/>
</calcop>
</calculate>
<!-- If this new issuance will cause the quantityOnHandTotal to go below the minimumStock, create a new requirement -->
<if-compare-field field="newQuantityOnHand" to-field="productFacility.minimumStock" operator="less" type="BigDecimal">
<set from-field="inventoryItem.productId" field="inputMap.productId"/>
<set from-field="productFacility.facilityId" field="inputMap.facilityId"/>
<if-not-empty field="productFacility.reorderQuantity">
<set from-field="productFacility.reorderQuantity" field="inputMap.quantity"/>
<else>
<set from-field="parameters.quantity" field="inputMap.quantity"/>
</else>
</if-not-empty>
<set value="PRODUCT_REQUIREMENT" field="inputMap.requirementTypeId"/>
<call-service service-name="createRequirement" in-map-name="inputMap">
<result-to-field field="parameters.requirementId" result-name="requirementId"/>
</call-service>
<field-to-result field="parameters.requirementId" result-name="requirementId"/>
</if-compare-field>
</if-compare-field>
</if-not-empty>
</if-compare>
</simple-method>
<simple-method method-name="checkCreateStockRequirementAtp" short-description="Create a Requirement if ATP goes under the minimum stock level">
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCheckCreateStockRequirement"/>
</check-permission>
<check-errors/>
<!-- assumes that inventoryItemId is one of the parameters and get the inventory item of the reservation -->
<entity-one entity-name="InventoryItem" value-field="inventoryItem" auto-field-map="true"/>
<!-- find the requirement method for this product -->
<set from-field="inventoryItem.productId" field="parameters.productId"/>
<call-simple-method method-name="getProductRequirementMethod"/>
<if-compare field="requirementMethodId" operator="equals" value="PRODRQM_STOCK_ATP">
<!-- get QOH, ATP quantities and find ProductFacility which has the minimum stock -->
<call-simple-method method-name="getProductFacilityAndQuantities"/>
<if-not-empty field="productFacility.minimumStock">
<!-- No requirements are created if we are not under stock -->
<!-- this service is supposed to be called after inventory is reserved, so inventory should have been updated already -->
<if-compare-field field="availableToPromiseTotal" to-field="productFacility.minimumStock" operator="less" type="BigDecimal">
<calculate field="oldAvailableToPromise">
<calcop field="availableToPromiseTotal" operator="add">
<calcop operator="get" field="parameters.quantity"/>
</calcop>
</calculate>
<!-- If before this reservation the availableToPromiseTotal was over minimumStock, create a new requirement -->
<if-compare-field field="oldAvailableToPromise" to-field="productFacility.minimumStock" operator="greater-equals" type="BigDecimal">
<set from-field="inventoryItem.productId" field="inputMap.productId"/>
<set from-field="productFacility.facilityId" field="inputMap.facilityId"/>
<if-not-empty field="productFacility.reorderQuantity">
<set from-field="productFacility.reorderQuantity" field="inputMap.quantity"/>
<else>
<set from-field="parameters.quantity" field="inputMap.quantity"/>
</else>
</if-not-empty>
<set value="PRODUCT_REQUIREMENT" field="inputMap.requirementTypeId"/>
<call-service service-name="createRequirement" in-map-name="inputMap">
<result-to-field field="parameters.requirementId" result-name="requirementId"/>
</call-service>
<field-to-result field="parameters.requirementId" result-name="requirementId"/>
</if-compare-field>
</if-compare-field>
</if-not-empty>
</if-compare>
</simple-method>
<simple-method method-name="createRequirementFromItemATP" short-description="Create a Requirement for an item based on ATP inventory quantity and minimum">
<!-- NOTE DEJ20090902: this service is not called anywhere, instead the createATPRequirementsForOrder service (written in Java) is called; why this is the case I don't know... -->
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCreateRequirementFromItemATP"/>
</check-permission>
<check-errors/>
<!-- assumes that inventoryItemId is one of the parameters and get the inventory item of the reservation -->
<entity-one entity-name="InventoryItem" value-field="inventoryItem" auto-field-map="true"/>
<!-- find the requirement method for this product -->
<set from-field="inventoryItem.productId" field="parameters.productId"/>
<call-simple-method method-name="getProductRequirementMethod"/>
<if-compare field="requirementMethodId" operator="equals" value="PRODRQM_ATP">
<!-- get the ATP, QOH quantities and the product facility's minimum stock -->
<call-simple-method method-name="getProductFacilityAndQuantities"/>
<if-empty field="productFacility">
<set field="minimumStock" value="0"/>
<else>
<set field="minimumStock" from-field="productFacility.minimumStock"/>
</else>
</if-empty>
<!-- are we below minimum stock? this service is supposed to be called after inventory is reserved, so inventory should have been updated already -->
<if-compare-field field="availableToPromiseTotal" to-field="minimumStock" operator="less" type="BigDecimal">
<!-- what is the right quantity? It is the lesser of the actual quantity and the quantity required to bring us back up to minimum stock -->
<calculate field="quantityShortfall">
<calcop field="minimumStock" operator="subtract">
<calcop operator="get" field="availableToPromiseTotal"/>
</calcop>
</calculate>
<if-compare-field field="quantityShortfall" operator="less" to-field="parameters.quantity" type="BigDecimal">
<set from-field="quantityShortfall" field="inputMap.quantity"/>
<else>
<set from-field="parameters.quantity" field="inputMap.quantity"/>
</else>
</if-compare-field>
<!-- TODO: we're not supporting the reorderQuantity of the productFacility. It seems that altering the requirement quantity
due to reorder quantities would affect the ability to link requirements and hence PO items back to the original order.
If we can support it while at the same time linking requirements back to the original sales order, that would be better. -->
<set from-field="parameters.productId" field="inputMap.productId"/>
<set from-field="inventoryItem.facilityId" field="inputMap.facilityId"/>
<!-- Retrieve and total the quantities of existing requirements for the product/facility -->
<entity-condition entity-name="Requirement" list="requirements">
<condition-list combine="and">
<condition-expr field-name="productId" operator="equals" from-field="parameters.productId"/>
<condition-expr field-name="requirementTypeId" operator="equals" value="PRODUCT_REQUIREMENT"/>
<condition-expr field-name="facilityId" operator="equals" from-field="facilityId"/>
<condition-expr field-name="statusId" operator="not-equals" value="REQ_ORDERED"/>
<condition-expr field-name="statusId" operator="not-equals" value="REQ_REJECTED"/>
</condition-list>
</entity-condition>
<iterate entry="requirement" list="requirements">
<calculate field="existingRequirementTotal">
<calcop operator="get" field="existingRequirementTotal"/>
<calcop operator="get" field="requirement.quantity"/>
</calculate>
</iterate>
<!-- Subtract the total quantity of existing requirements from the required quantity to determine if a new requirement needs to be created -->
<calculate field="newRequirementTotal">
<calcop operator="subtract" field="inputMap.quantity">
<calcop operator="get" field="existingRequirementTotal"/>
</calcop>
</calculate>
<!-- If a new requirement needs to be created, create it for the difference between the required quantity and the total quantity of existing requirements -->
<if-compare field="newRequirementTotal" operator="greater-equals" value="0">
<set from-field="inputMap.quantity" field="newRequirementTotal"/>
<call-simple-method method-name="createRequirementAndCommitment"/>
</if-compare>
</if-compare-field>
</if-compare>
</simple-method>
<simple-method method-name="checkCreateProductRequirementForFacility" short-description="Create Requirements for all the products in a facility with QOH under the minimum stock level">
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCheckCreateStockRequirement"/>
</check-permission>
<check-errors/>
<entity-and entity-name="ProductFacility" list="products">
<field-map from-field="parameters.facilityId" field-name="facilityId"/>
</entity-and>
<iterate list="products" entry="productFacility">
<set from-field="productFacility.productId" field="parameters.productId"/>
<clear-field field="requirementMethodId"/>
<call-simple-method method-name="getProductRequirementMethod"/>
<if-empty field="requirementMethodId">
<set field="requirementMethodId" from-field="parameters.defaultRequirementMethodId"/>
</if-empty>
<if>
<condition>
<or>
<if-compare field="requirementMethodId" operator="equals" value="PRODRQM_STOCK"/>
<if-compare field="requirementMethodId" operator="equals" value="PRODRQM_STOCK_ATP"/>
</or>
</condition>
<then>
<!-- get QOH, ATP and find ProductFacility which has the minimum stock -->
<if-not-empty field="productFacility.minimumStock">
<!-- Get the product's total quantityOnHand in the facility -->
<clear-field field="inputMap"/>
<set from-field="productFacility.productId" field="inputMap.productId"/>
<set from-field="productFacility.facilityId" field="inputMap.facilityId"/>
<call-service service-name="getInventoryAvailableByFacility" in-map-name="inputMap">
<result-to-field field="quantityOnHandTotal" result-name="quantityOnHandTotal"/>
<result-to-field field="availableToPromiseTotal" result-name="availableToPromiseTotal"/>
</call-service>
<if-compare field="requirementMethodId" operator="equals" value="PRODRQM_STOCK">
<set from-field="quantityOnHandTotal" field="currentQuantity"/>
<else>
<set from-field="availableToPromiseTotal" field="currentQuantity"/>
</else>
</if-compare>
<!-- No requirements are created if we are already under stock -->
<if-compare-field field="currentQuantity" to-field="productFacility.minimumStock" operator="less" type="BigDecimal">
<clear-field field="inputMap"/>
<set from-field="productFacility.productId" field="inputMap.productId"/>
<if-not-empty field="productFacility.reorderQuantity">
<set from-field="productFacility.reorderQuantity" field="inputMap.quantity" type="BigDecimal"/>
<else>
<set value="0" field="inputMap.quantity" type="BigDecimal"/>
</else>
</if-not-empty>
<calculate field="quantityShortfall">
<calcop field="productFacility.minimumStock" operator="subtract">
<calcop operator="get" field="currentQuantity"/>
</calcop>
</calculate>
<if-compare-field field="inputMap.quantity" to-field="quantityShortfall" operator="less" type="BigDecimal">
<set from-field="quantityShortfall" field="inputMap.quantity" type="BigDecimal"/>
</if-compare-field>
<set value="PRODUCT_REQUIREMENT" field="inputMap.requirementTypeId"/>
<set from-field="parameters.facilityId" field="inputMap.facilityId"/>
<call-service service-name="createRequirement" in-map-name="inputMap">
<result-to-field field="requirementId" result-name="requirementId"/>
</call-service>
<log level="info" message="Requirement creted with id [${requirementId}] for product with id [${productFacility.productId}]."/>
</if-compare-field>
</if-not-empty>
</then>
</if>
</iterate>
</simple-method>
<simple-method method-name="getNextOrderId" short-description="Get Next orderId">
<!-- try to find PartyAcctgPreference for parameters.partyId, see if we need any special order number sequencing -->
<entity-one entity-name="PartyAcctgPreference" value-field="partyAcctgPreference"/>
<log level="info" message="In getNextOrderId partyId is [${parameters.partyId}], partyAcctgPreference: ${partyAcctgPreference}"/>
<if-not-empty field="partyAcctgPreference">
<get-related-one relation-name="OrderCustomMethod" value-field="partyAcctgPreference" to-value-field="customMethod"/>
<else>
<log level="warning" message="Acctg preference not defined for partyId [${parameters.partyId}]"/>
</else>
</if-not-empty>
<if-not-empty field="customMethod">
<set field="customMethodName" from-field="customMethod.customMethodName"/>
<else><!-- retreive service from deprecated enumeration -->
<if-compare operator="equals" value="ODRSQ_ENF_SEQ" field="partyAcctgPreference.oldOrderSequenceEnumId">
<set field="customMethodName" value="orderSequence_enforced"/>
</if-compare>
</else>
</if-not-empty>
<if-not-empty field="customMethodName">
<set-service-fields service-name="${customMethodName}" map="parameters" to-map="customMethodMap"/>
<set field="customMethodMap.partyAcctgPreference" from-field="partyAcctgPreference"/>
<call-service service-name="${customMethodName}" in-map-name="customMethodMap">
<result-to-field result-name="orderId" field="orderIdTemp"/>
</call-service>
<else>
<!-- <log level="info" message="In getNextOrderId sequence by Standard"/> -->
<!-- default to the default sequencing: ODRSQ_STANDARD -->
<set from-field="parameters.orderId" field="orderIdTemp"/>
<if-empty field="orderIdTemp">
<sequenced-id sequence-name="OrderHeader" field="orderIdTemp"/>
<else>
<!-- check the provided ID -->
<check-id field="orderIdTemp"/>
<check-errors/>
</else>
</if-empty>
</else>
</if-not-empty>
<if-not-empty field="parameters.productStoreId">
<entity-one entity-name="ProductStore" value-field="productStore"/>
</if-not-empty>
<!-- use orderIdTemp along with the orderIdPrefix to create the real ID -->
<set field="orderId" value="${productStore.orderNumberPrefix}${partyAcctgPreference.orderIdPrefix}${str:toString(orderIdTemp)}"/>
<field-to-result field="orderId" result-name="orderId"/>
</simple-method>
<simple-method method-name="orderSequence_enforced" short-description="Enforced Sequence (no gaps, per organization)">
<log level="info" message="In getNextOrderId sequence enum Enforced"/>
<set field="partyAcctgPreference" from-field="parameters.partyAcctgPreference"/>
<!-- this is sequential sequencing, we can't skip a number, also it must be a unique sequence per partyIdFrom -->
<if-not-empty field="partyAcctgPreference.lastOrderNumber">
<calculate field="partyAcctgPreference.lastOrderNumber" type="Long">
<calcop operator="add" field="partyAcctgPreference.lastOrderNumber"/>
<number value="1"/>
</calculate>
<else>
<calculate field="partyAcctgPreference.lastOrderNumber" type="Long"><number value="1"/></calculate>
</else>
</if-not-empty>
<store-value value-field="partyAcctgPreference"/>
<set from-field="partyAcctgPreference.lastOrderNumber" field="orderId"/>
<field-to-result field="orderId" result-name="orderId"/>
</simple-method>
<simple-method method-name="createOrderHeader" short-description="Create OrderHeader">
<now-timestamp field="nowTimestamp"/>
<set value="Create OrderHeader" field="operationName"/>
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCreateOrderShipment"/>
</check-permission>
<check-errors/>
<make-value value-field="newEntity" entity-name="OrderHeader"/>
<if-not-empty field="parameters.orderId">
<set field="newEntity.orderId" from-field="parameters.orderId"/>
<else>
<sequenced-id sequence-name="OrderHeader" field="newEntity.orderId"/>
</else>
</if-not-empty>
<field-to-result field="newEntity.orderId" result-name="orderId"/>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<if-empty field="newEntity.statusId">
<set field="newEntity.statusId" value="ORDER_CREATED"/>
</if-empty>
<if-empty field="newEntity.orderDate">
<set field="newEntity.orderDate" from-field="nowTimestamp"/>
</if-empty>
<if-empty field="newEntity.entryDate">
<set field="newEntity.entryDate" from-field="nowTimestamp"/>
</if-empty>
<create-value value-field="newEntity"/>
</simple-method>
<simple-method method-name="updateOrderHeader" short-description="Update OrderHeader">
<set value="Update OrderHeader" field="operationName"/>
<check-permission permission="ORDERMGR" action="_UPDATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCreateOrderShipment"/>
</check-permission>
<check-errors/>
<entity-one entity-name="OrderHeader" value-field="orderHeader"/>
<if-empty field="orderHeader">
<add-error>
<fail-property resource="OrderErrorUiLabels" property="OrderOrderIdDoesNotExists"/>
</add-error>
</if-empty>
<check-errors/>
<set-nonpk-fields value-field="orderHeader" map="parameters"/>
<store-value value-field="orderHeader"/>
</simple-method>
<simple-method method-name="recreateOrderAdjustments" short-description="Auto create OrderAdjustments">
<entity-one entity-name="OrderHeader" value-field="order" auto-field-map="true"/>
<!-- all existing promo order items are cancelled -->
<get-related value-field="order" relation-name="OrderItem" list="orderItems"/>
<iterate list="orderItems" entry="orderItem">
<if>
<condition>
<and>
<if-compare field="orderItem.isPromo" value="Y" operator="equals"/>
<if-compare field="orderItem.statusId" value="ITEM_CANCELLED" operator="not-equals"/>
</and>
</condition>
<then>
<clear-field field="cancelOrderItemInMap"/>
<set-service-fields service-name="cancelOrderItemNoActions" to-map="cancelOrderItemInMap" map="parameters"/>
<set from-field="orderItem.orderItemSeqId" field="cancelOrderItemInMap.orderItemSeqId"/>
<call-service service-name="cancelOrderItemNoActions" in-map-name="cancelOrderItemInMap"/>
</then>
</if>
</iterate>
<get-related value-field="order" relation-name="OrderAdjustment" list="orderAdjustments"/>
<!-- Accumulate the total existing promotional adjustment -->
<set field="existingOrderAdjustmentTotal" value="0" type="BigDecimal"/>
<iterate list="orderAdjustments" entry="orderAdjustment">
<if>
<condition>
<and>
<not><if-empty field="orderAdjustment.orderAdjustmentTypeId"/></not>
<if-compare operator="equals" value="PROMOTION_ADJUSTMENT" field="orderAdjustment.orderAdjustmentTypeId"></if-compare>
</and>
</condition>
<then>
<calculate field="existingOrderAdjustmentTotal" decimal-scale="3">
<calcop operator="add">
<calcop operator="get" field="orderAdjustment.amount"/>
<calcop operator="get" field="existingOrderAdjustmentTotal"/>
</calcop>
</calculate>
</then>
</if>
</iterate>
<!-- Recalculate the promotions for the order -->
<set-service-fields service-name="loadCartFromOrder" to-map="loadCartFromOrderInMap" map="parameters"/>
<set value="true" field="loadCartFromOrderInMap.skipInventoryChecks" type="Boolean"/>
<set value="true" field="loadCartFromOrderInMap.skipProductChecks" type="Boolean"/>
<call-service service-name="loadCartFromOrder" in-map-name="loadCartFromOrderInMap">
<result-to-field result-name="shoppingCart" field="cart"/>
</call-service>
<call-object-method obj-field="cart" method-name="items" ret-field="items"/>
<iterate list="items" entry="item">
<call-object-method obj-field="item" method-name="getOrderItemSeqId" ret-field="orderItemSeqId"/>
<if-empty field="orderItemSeqId">
<!-- this is a new (promo) item -->
<!-- a new order item is created -->
<make-value value-field="newOrderItem" entity-name="OrderItem"/>
<set field="newOrderItem.orderId" from-field="parameters.orderId"/>
<call-object-method obj-field="item" method-name="getItemType" ret-field="newOrderItem.orderItemTypeId"/>
<call-object-method obj-field="item" method-name="getSelectedAmount" ret-field="newOrderItem.selectedAmount"/>
<call-object-method obj-field="item" method-name="getBasePrice" ret-field="newOrderItem.unitPrice"/>
<call-object-method obj-field="item" method-name="getListPrice" ret-field="newOrderItem.unitListPrice"/>
<call-object-method obj-field="item" method-name="getName" ret-field="newOrderItem.itemDescription"/>
<call-object-method obj-field="item" method-name="getStatusId" ret-field="newOrderItem.statusId"/>
<call-object-method obj-field="item" method-name="getProductId" ret-field="newOrderItem.productId"/>
<call-object-method obj-field="item" method-name="getQuantity" ret-field="newOrderItem.quantity"/>
<set field="newOrderItem.isModifiedPrice" value="N"/>
<set field="newOrderItem.isPromo" value="Y"/>
<if-empty field="newOrderItem.statusId">
<set field="newOrderItem.statusId" value="ITEM_CREATED"/>
</if-empty>
<make-next-seq-id value-field="newOrderItem" seq-field-name="orderItemSeqId"/>
<create-value value-field="newOrderItem"/>
<!-- and the orderItemSeqId is assigned to the shopping cart item-->
<call-object-method obj-field="item" method-name="setOrderItemSeqId">
<field field="newOrderItem.orderItemSeqId" type="String"/>
</call-object-method>
</if-empty>
</iterate>
<call-object-method obj-field="cart" method-name="makeAllAdjustments" ret-field="adjustments"/>
<!-- Accumulate the new promotion total from the recalculated promotion adjustments -->
<set field="newOrderAdjustmentTotal" value="0" type="BigDecimal"/>
<iterate list="adjustments" entry="adjustment">
<if>
<condition>
<and>
<not><if-empty field="adjustment.productPromoId"/></not>
<if-empty field="adjustment.orderAdjustmentId"/>
</and>
</condition>
<then>
<calculate field="newOrderAdjustmentTotal" decimal-scale="3">
<calcop operator="add">
<calcop operator="get" field="adjustment.amount"/>
<calcop operator="get" field="newOrderAdjustmentTotal"/>
</calcop>
</calculate>
</then>
</if>
</iterate>
<!-- Determine the difference between existing and new promotion adjustment totals, if any -->
<calculate field="orderAdjustmentTotalDifference" decimal-scale="3" type="BigDecimal">
<calcop operator="subtract" field="newOrderAdjustmentTotal">
<calcop operator="get" field="existingOrderAdjustmentTotal"/>
</calcop>
</calculate>
<!-- If the total has changed, create an OrderAdjustment to reflect the fact -->
<if-compare field="orderAdjustmentTotalDifference" value="0" operator="not-equals" type="BigDecimal">
<set field="createOrderAdjContext.orderAdjustmentTypeId" value="PROMOTION_ADJUSTMENT"/>
<set field="createOrderAdjContext.orderId" from-field="parameters.orderId"/>
<set field="createOrderAdjContext.orderItemSeqId" value="_NA_"/>
<set field="createOrderAdjContext.shipGroupSeqId" value="_NA_"/>
<set field="createOrderAdjContext.description" value="Adjustment due to order change"/>
<set field="createOrderAdjContext.amount" from-field="orderAdjustmentTotalDifference" type="BigDecimal"/>
<call-service service-name="createOrderAdjustment" in-map-name="createOrderAdjContext" include-user-login="true"/>
<check-errors/>
</if-compare>
</simple-method>
<!--UpdateOrderContactMech-->
<simple-method method-name="updateOrderContactMech" short-description="Update OrderContactMech">
<check-permission permission="ORDERMGR" action="_UPDATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunUpdateOrderContactMech"/>
</check-permission>
<check-errors/>
<make-value value-field="orderContactMechMap" entity-name="OrderContactMech"/>
<set-pk-fields map="parameters" value-field="orderContactMechMap"/>
<set from-field="parameters.orderId" field="inputMap.orderId"/>
<set from-field="parameters.contactMechPurposeTypeId" field="inputMap.contactMechPurposeTypeId"/>
<set from-field="parameters.contactMechId" field="inputMap.contactMechId"/>
<if-compare value="SHIPPING_LOCATION" field="parameters.contactMechPurposeTypeId" operator="equals">
<if-compare value="parameters.oldContactMechId" field="parameters.contactMechId" operator="not-equals">
<set field="orderItemShipGroupMap.orderId" from-field="parameters.orderId"/>
<set field="orderItemShipGroupMap.contactMechId" from-field="parameters.oldContactMechId"/>
<find-by-and entity-name="OrderItemShipGroup" list="shipGroupList" map="orderItemShipGroupMap"/>
<if-not-empty field="shipGroupList">
<iterate list="shipGroupList" entry="shipGroup">
<set field="inputMap.shipGroupSeqId" from-field="shipGroup.shipGroupSeqId"/>
<set field="inputMap.shipmentMethod" value="${shipGroup.shipmentMethodTypeId}@${shipGroup.carrierPartyId}@${shipGroup.carrierRoleTypeId}"/>
<set field="inputMap.oldContactMechId" from-field="parameters.oldContactMechId"/>
<set-service-fields to-map="orderItemShipGroupMap" service-name="updateOrderItemShipGroup" map="inputMap"/>
<call-service service-name="updateOrderItemShipGroup" in-map-name="orderItemShipGroupMap" include-user-login="true"/>
</iterate>
</if-not-empty>
</if-compare>
<else>
<find-by-and entity-name="OrderContactMech" map="inputMap" list="orderContactMechList"/>
<!-- If orderContactMechList value is null then create new entry in OrderContactMech entity-->
<if-empty field="orderContactMechList">
<set-service-fields service-name="createOrderContactMech" map="parameters" to-map="createOrderContactMechMap"/>
<call-service service-name="createOrderContactMech" in-map-name="createOrderContactMechMap" include-user-login="true"/>
<set from-field="parameters.orderId" field="orderContactMechLookupMap.orderId"/>
<set from-field="parameters.oldContactMechId" field="orderContactMechLookupMap.contactMechId"/>
<set from-field="parameters.contactMechPurposeTypeId" field="orderContactMechLookupMap.contactMechPurposeTypeId"/>
<set-service-fields service-name="removeOrderContactMech" map="orderContactMechLookupMap" to-map="removeOrderContactMechMap"/>
<call-service service-name="removeOrderContactMech" in-map-name="removeOrderContactMechMap" include-user-login="true"/>
</if-empty>
<store-value value-field="orderContactMechMap"/>
</else>
</if-compare>
</simple-method>
<!-- OrderItemShipGroup -->
<simple-method method-name="createOrderItemShipGroup" short-description="Create OrderItemShipGroup">
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCreateOrderItemShipGroup"/>
</check-permission>
<check-errors/>
<make-value value-field="newEntity" entity-name="OrderItemShipGroup"/>
<set-pk-fields map="parameters" value-field="newEntity"/>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<if-empty field="newEntity.shipGroupSeqId">
<make-next-seq-id value-field="newEntity" seq-field-name="shipGroupSeqId"/> <!-- this finds the next sub-sequence ID -->
<field-to-result field="newEntity.shipGroupSeqId" result-name="shipGroupSeqId"/>
</if-empty>
<create-value value-field="newEntity"/>
</simple-method>
<simple-method method-name="updateOrderItemShipGroup" short-description="Update OrderItemShipGroup">
<check-permission permission="ORDERMGR" action="_UPDATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunUpdateOrderItemShipGroup"/>
</check-permission>
<check-errors/>
<make-value value-field="lookupPKMap" entity-name="OrderItemShipGroup"/>
<set-pk-fields map="parameters" value-field="lookupPKMap"/>
<find-by-primary-key entity-name="OrderItemShipGroup" map="lookupPKMap" value-field="lookedUpValue"/>
<!-- splitting shipmentMethod request parameter value that contains "@" symbol
into "shipmentMethodTypeId", "carrierPartyId" and "carrierRoleTypeId".
-->
<call-bsh><![CDATA[
shipmentMethod = parameters.get("shipmentMethod");
if(shipmentMethod != null){
arr = shipmentMethod.split( "@" );
parameters.put("shipmentMethodTypeId", arr[0]);
parameters.put("carrierPartyId", arr[1]);
parameters.put("carrierRoleTypeId", arr[2]);
}
]]></call-bsh>
<set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
<set from-field="parameters.orderId" field="inputMap.orderId"/>
<set from-field="parameters.contactMechPurposeTypeId" field="inputMap.contactMechPurposeTypeId"/>
<set from-field="parameters.contactMechId" field="inputMap.contactMechId"/>
<find-by-and entity-name="OrderContactMech" map="inputMap" list="orderContactMechList"/>
<!-- If orderContactMechList value is null then create new entry in OrderContactMech entity-->
<if-empty field="orderContactMechList">
<set-service-fields service-name="createOrderContactMech" map="parameters" to-map="createOrderContactMechMap"/>
<call-service service-name="createOrderContactMech" in-map-name="createOrderContactMechMap" include-user-login="true"/>
</if-empty>
<store-value value-field="lookedUpValue"/>
<!-- Remove the old values from OrderContactMech entity with the help of oldContactMechId -->
<set from-field="parameters.orderId" field="shipGroupLookupMap.orderId"/>
<set from-field="parameters.oldContactMechId" field="shipGroupLookupMap.contactMechId"/>
<find-by-and entity-name="OrderItemShipGroup" map="shipGroupLookupMap" list="orderItemShipGroupList"/>
<if-empty field="orderItemShipGroupList">
<set from-field="parameters.orderId" field="inputMap.orderId"/>
<set from-field="parameters.contactMechPurposeTypeId" field="inputMap.contactMechPurposeTypeId"/>
<set from-field="parameters.oldContactMechId" field="inputMap.contactMechId"/>
<find-by-and entity-name="OrderContactMech" map="inputMap" list="orderContactMechList"/>
<set-service-fields service-name="createOrderContactMech" map="inputMap" to-map="removeOrderContactMechMap"/>
<call-service service-name="removeOrderContactMech" in-map-name="removeOrderContactMechMap" include-user-login="true"/>
</if-empty>
</simple-method>
<simple-method method-name="getOrderItemShipGroupEstimatedShipDate" short-description="Compute and return the OrderItemShipGroup estimated ship date based on the associated items.">
<entity-one entity-name="OrderItemShipGroup" value-field="orderItemShipGroup"/>
<if-compare field="orderItemShipGroup.maySplit" operator="equals" value="Y">
<set field="orderByList[]" value="+promisedDatetime"/>
<else>
<set field="orderByList[]" value="-promisedDatetime"/>
</else>
</if-compare>
<get-related value-field="orderItemShipGroup" relation-name="OrderItemShipGrpInvRes" list="orderItemShipGroupInvResList" order-by-list="orderByList"/>
<first-from-list entry="orderItemShipGroupInvRes" list="orderItemShipGroupInvResList"/>
<field-to-result field="orderItemShipGroupInvRes.promisedDatetime" result-name="estimatedShipDate"/>
</simple-method>
<simple-method method-name="createOrderContactMech" short-description="Create OrderContactMech">
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCreateOrderContactMech"/>
</check-permission>
<check-errors/>
<make-value value-field="newEntity" entity-name="OrderContactMech"/>
<set-pk-fields map="parameters" value-field="newEntity"/>
<create-value value-field="newEntity"/>
</simple-method>
<simple-method method-name="removeOrderContactMech" short-description="Remove OrderContactMech">
<check-permission permission="ORDERMGR" action="_DELETE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunRemoveOrderContactMech"/>
</check-permission>
<check-errors/>
<entity-one entity-name="OrderContactMech" value-field="lookedUpValue"/>
<remove-value value-field="lookedUpValue"/>
</simple-method>
<simple-method method-name="updateOrderNote" short-description="Update OrderNote">
<check-permission permission="ORDERMGR" action="_UPDATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunUpdateOrderNote"/>
</check-permission>
<check-errors/>
<entity-one entity-name="OrderHeaderNote" value-field="orderHeaderNote"/>
<set-nonpk-fields value-field="orderHeaderNote" map="parameters"/>
<store-value value-field="orderHeaderNote"/>
</simple-method>
<simple-method method-name="createOrderTerm" short-description="Create an OrderTerm">
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunCreateOrderTerm"/>
</check-permission>
<check-errors/>
<make-value value-field="newEntity" entity-name="OrderTerm"/>
<set-pk-fields map="parameters" value-field="newEntity"/>
<set value="_NA_" set-if-empty="true" field="newEntity.orderItemSeqId"/>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<create-value value-field="newEntity"/>
</simple-method>
<simple-method method-name="updateOrderTerm" short-description="Update OrderTerm">
<check-permission permission="ORDERMGR" action="_DELETE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunUpdateOrderTerm"/>
</check-permission>
<check-errors/>
<entity-one entity-name="OrderTerm" value-field="lookedUpValue"/>
<set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
<store-value value-field="lookedUpValue"/>
</simple-method>
<simple-method method-name="removeOrderTerm" short-description="Remove OrderTerm">
<check-permission permission="ORDERMGR" action="_DELETE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunRemoveOrderTerm"/>
</check-permission>
<check-errors/>
<entity-one entity-name="OrderTerm" value-field="lookedUpValue"/>
<remove-value value-field="lookedUpValue"/>
</simple-method>
<simple-method method-name="addPaymentMethodToOrder" short-description="Create an PaymentMethodToOrder">
<check-permission permission="ORDERMGR" action="_CREATE">
<fail-property resource="OrderErrorUiLabels" property="OrderSecurityErrorToRunAddPaymentMethodToOrder"/>
</check-permission>
<check-errors/>
<set field="inputMap.paymentMethodId" from-field="parameters.paymentMethodId"/>
<set field="inputMap.maxAmount" from-field="parameters.maxAmount"/>
<set field="inputMap.orderId" from-field="parameters.orderId"/>
<entity-one entity-name="PaymentMethod" value-field="paymentMethod">
<field-map field-name="paymentMethodId" from-field="parameters.paymentMethodId"/>
</entity-one>
<set field="inputMap.paymentMethodTypeId" from-field="paymentMethod.paymentMethodTypeId"/>
<!--In this method we calls createOrderPaymentPreference and returns orderPaymentPreferenceId field to authOrderPaymentPreference -->
<call-service service-name="createOrderPaymentPreference" in-map-name="inputMap" include-user-login="true">
<result-to-field field="parameters.orderPaymentPreferenceId" result-name="orderPaymentPreferenceId"/>
</call-service>
<field-to-result field="parameters.orderPaymentPreferenceId" result-name="orderPaymentPreferenceId"/>
</simple-method>
<simple-method method-name="getOrderStatus" short-description="Gets an order status" login-required="false">
<entity-one entity-name="OrderHeader" value-field="order"/>
<if-empty field="order">
<add-error>
<fail-property resource="OrderErrorUiLabels" property="OrderOrderIdDoesNotExists"/>
</add-error>
<check-errors/>
</if-empty>
<field-to-result field="order.statusId" result-name="statusId"/>
</simple-method>
<simple-method method-name="checkOrderIsOnBackOrder" short-description="Check if an Order is on Back Order" login-required="false">
<set field="zeroEnv" value="0" type="BigDecimal"/>
<entity-condition entity-name="OrderItemShipGrpInvRes" list="orderItemShipGrpInvResList">
<condition-list combine="and">
<condition-expr field-name="orderId" from-field="parameters.orderId"/>
<condition-expr field-name="quantityNotAvailable" operator="not-equals" from-field="nullField"/>
<condition-expr field-name="quantityNotAvailable" operator="greater" from-field="zeroEnv"/>
</condition-list>
</entity-condition>
<if-empty field="orderItemShipGrpInvResList">
<set field="isBackOrder" value="false" type="Boolean"/>
<else>
<set field="isBackOrder" value="true" type="Boolean"/>
</else>
</if-empty>
<field-to-result field="isBackOrder" result-name="isBackOrder"/>
</simple-method>
<simple-method method-name="createOrderItemChange" short-description="Creates a new Order Item Change record">
<make-value value-field="newEntity" entity-name="OrderItemChange"/>
<set-nonpk-fields map="parameters" value-field="newEntity"/>
<if-empty field="parameters.changeDatetime">
<now-timestamp field="nowTimestamp"/>
<set field="newEntity.changeDatetime" from-field="nowTimestamp"/>
</if-empty>
<if-empty field="parameters.changeUserLogin">
<set field="newEntity.changeUserLogin" from-field="userLogin.userLoginId"/>
</if-empty>
<sequenced-id sequence-name="OrderItemChange" field="newEntity.orderItemChangeId"/>
<create-value value-field="newEntity"/>
<field-to-result field="newEntity.orderItemChangeId" result-name="orderItemChangeId"/>
</simple-method>
<simple-method method-name="createUpdateShippingAddress" short-description="create and update Shipping address" login-required="false">
<set field="keepAddressBook" from-field="parameters.keepAddressBook" default-value="Y"/>
<call-map-processor xml-resource="component://order/script/org/ofbiz/order/customer/CheckoutMapProcs.xml"
processor-name="shipToAddress" in-map-name="parameters" out-map-name="shipToAddressCtx"/>
<check-errors/>
<set field="shipToAddressCtx.partyId" from-field="parameters.partyId"/>
<if-empty field="shipToAddressCtx.contactMechId">
<set field="shipToAddressCtx.contactMechPurposeTypeId" value="SHIPPING_LOCATION"/>
<call-service service-name="createPartyPostalAddress" in-map-name="shipToAddressCtx">
<result-to-field result-name="contactMechId" field="parameters.shipToContactMechId"/>
</call-service>
<log level="info" message="Shipping address created with contactMechId ${parameters.shipToContactMechId}"/>
<else>
<if-compare field="keepAddressBook" operator="equals" value="Y">
<make-value entity-name="PostalAddress" value-field="newValue"/>
<set-pk-fields value-field="newValue" map="shipToAddressCtx"/>
<find-by-primary-key entity-name="PostalAddress" map="newValue" value-field="oldValue"/>
<set-nonpk-fields map="shipToAddressCtx" value-field="newValue"/>
<if-compare-field field="oldValue" to-field="newValue" operator="not-equals" type="Object">
<set field="shipToAddressCtx.contactMechId" from-field="nullField"/>
<call-service service-name="createPartyPostalAddress" in-map-name="shipToAddressCtx">
<result-to-field result-name="contactMechId" field="parameters.shipToContactMechId"/>
</call-service>
</if-compare-field>
<entity-and entity-name="PartyContactMechPurpose" list="pcmpShipList" filter-by-date="true">
<field-map field-name="partyId" from-field="userLogin.partyId"/>
<field-map field-name="contactMechId" from-field="parameters.shipToContactMechId"/>
<field-map field-name="contactMechPurposeTypeId" value="SHIPPING_LOCATION"/>
</entity-and>
<!-- If purpose is not exists then create -->
<if-empty field="pcmpShipList">
<set-service-fields service-name="createPartyContactMechPurpose" map="parameters" to-map="serviceContext"/>
<set field="serviceContext.partyId" from-field="userLogin.partyId"/>
<entity-and entity-name="PartyContactMechPurpose" list="pcmpList" filter-by-date="true">
<field-map field-name="partyId" from-field="userLogin.partyId"/>
<field-map field-name="contactMechPurposeTypeId" value="SHIPPING_LOCATION"/>
</entity-and>
<if-not-empty field="pcmpList">
<first-from-list list="pcmpList" entry="pcmp"/>
<set-service-fields service-name="deletePartyContactMechPurposeIfExists" map="pcmp" to-map="serviceInMap"/>
<call-service service-name="deletePartyContactMechPurposeIfExists" in-map-name="serviceInMap"/>
<clear-field field="serviceInMap"/>
</if-not-empty>
<set field="serviceContext.partyId" from-field="userLogin.partyId"/>
<set field="serviceContext.contactMechId" from-field="parameters.shipToContactMechId"/>
<set field="serviceContext.contactMechPurposeTypeId" value="SHIPPING_LOCATION"/>
<call-service service-name="createPartyContactMechPurpose" in-map-name="serviceContext"/>
<clear-field field="pcmpList"/>
<clear-field field="serviceContext"/>
</if-empty>
<if-compare field="parameters.setDefaultShipping" operator="equals" value="Y">
<set-service-fields service-name="setPartyProfileDefaults" map="parameters" to-map="partyProfileDefaultsCtx"/>
<set field="partyProfileDefaultsCtx.defaultShipAddr" from-field="parameters.shipToContactMechId"/>
<set field="partyProfileDefaultsCtx.partyId" from-field="userLogin.partyId"/>
<call-service service-name="setPartyProfileDefaults" in-map-name="partyProfileDefaultsCtx"/>
</if-compare>
</if-compare>
<if-compare field="keepAddressBook" operator="equals" value="N">
<set field="shipToAddressCtx.shipToContactMechId" from-field="shipToAddressCtx.contactMechId"></set>
<if-compare-field field="shipToAddressCtx.shipToContactMechId" operator="equals" to-field="parameters.billToContactMechId">
<make-value entity-name="PostalAddress" value-field="newValue"/>
<set-pk-fields value-field="newValue" map="shipToAddressCtx"/>
<find-by-primary-key entity-name="PostalAddress" map="newValue" value-field="oldValue"/>
<set-nonpk-fields map="shipToAddressCtx" value-field="newValue"/>
<if-compare-field field="oldValue" to-field="newValue" operator="not-equals" type="Object">
<entity-and entity-name="PartyContactMechPurpose" list="pcmpList" filter-by-date="true">
<field-map field-name="contactMechId" from-field="shipToAddressCtx.shipToContactMechId"/>
<field-map field-name="partyId" from-field="userLogin.partyId"/>
<field-map field-name="contactMechPurposeTypeId" value="SHIPPING_LOCATION"/>
</entity-and>
<first-from-list list="pcmpList" entry="pcmp"/>
<if-not-empty field="pcmp">
<set-service-fields service-name="deletePartyContactMechPurposeIfExists" map="pcmp" to-map="serviceInMap"/>
<call-service service-name="deletePartyContactMechPurposeIfExists" in-map-name="serviceInMap"/>
</if-not-empty>
<set field="shipToAddressCtx.contactMechPurposeTypeId" value="SHIPPING_LOCATION"/>
<set field="shipToAddressCtx.contactMechId" from-field="nullField"/>
<call-service service-name="createPartyPostalAddress" in-map-name="shipToAddressCtx">
<result-to-field result-name="contactMechId" field="parameters.shipToContactMechId"/>
</call-service>
<log level="info" message="Shipping address updated with contactMechId ${shipToAddressCtx.shipToContactMechId}"/>
</if-compare-field>
<else>
<set field="shipToAddressCtx.userLogin" from-field="parameters.userLogin"/>
<call-service service-name="updatePartyPostalAddress" in-map-name="shipToAddressCtx">
<result-to-field result-name="contactMechId" field="parameters.shipToContactMechId"/>
</call-service>
<log level="info" message="Shipping address updated with contactMechId ${shipToAddressCtx.shipToContactMechId}"/>
</else>
</if-compare-field>
</if-compare>
</else>
</if-empty>
<field-to-result field="parameters.shipToContactMechId" result-name="contactMechId"/>
</simple-method>
<simple-method method-name="createUpdateBillingAddress" short-description="create and update billing address">
<set field="keepAddressBook" from-field="parameters.keepAddressBook" default-value="Y"/>
<if-compare field="parameters.useShippingAddressForBilling" operator="not-equals" value="Y">
<call-map-processor xml-resource="component://order/script/org/ofbiz/order/customer/CheckoutMapProcs.xml"
processor-name="billToAddress" in-map-name="parameters" out-map-name="billToAddressCtx"/>
</if-compare>
<check-errors/>
<set field="partyId" from-field="parameters.partyId"/>
<set field="billToAddressCtx.partyId" from-field="partyId"/>
<if-compare field="parameters.useShippingAddressForBilling" operator="equals" value="Y">
<if-empty field="parameters.billToContactMechId">
<set field="billToAddressCtx.contactMechPurposeTypeId" value="BILLING_LOCATION"/>
<set-service-fields service-name="createPartyContactMechPurpose" map="billToAddressCtx" to-map="serviceInMap"/>
<set field="serviceInMap.contactMechId" from-field="parameters.shipToContactMechId"/>
<call-service service-name="createPartyContactMechPurpose" in-map-name="serviceInMap"/>
<else>
<if-compare-field field="parameters.shipToContactMechId" operator="not-equals" to-field="parameters.billToContactMechId">
<entity-and entity-name="PartyContactMechPurpose" list="pcmpList" filter-by-date="true">
<field-map field-name="contactMechId" from-field="parameters.billToContactMechId"/>
<field-map field-name="partyId" from-field="partyId"/>
<field-map field-name="contactMechPurposeTypeId" value="BILLING_LOCATION"/>
</entity-and>
<first-from-list entry="pcmp" list="pcmpList"/>
<if-not-empty field="pcmp">
<set-service-fields service-name="deletePartyContactMechPurposeIfExists" map="pcmp" to-map="serviceInMap"/>
<call-service service-name="deletePartyContactMechPurposeIfExists" in-map-name="serviceInMap"/>
<clear-field field="serviceInMap"/>
</if-not-empty>
<if-compare field="keepAddressBook" operator="equals" value="N">
<set field="serviceInMap.contactMechId" from-field="parameters.billToContactMechId"/>
<call-service service-name="deletePartyContactMech" in-map-name="serviceInMap"/>
<clear-field field="serviceInMap"/>
</if-compare>
<!-- Check that the ship-to address doesn't already have a bill-to purpose -->
<entity-and entity-name="PartyContactMechPurpose" list="pcmpList" filter-by-date="true">
<field-map field-name="contactMechId" from-field="parameters.shipToContactMechId"/>
<field-map field-name="partyId" from-field="partyId"/>
<field-map field-name="contactMechPurposeTypeId" value="BILLING_LOCATION"/>
</entity-and>
<if-empty field="pcmpList">
<set field="billToAddressCtx.contactMechPurposeTypeId" value="BILLING_LOCATION"/>
<set-service-fields service-name="createPartyContactMechPurpose" map="billToAddressCtx" to-map="serviceInMap"/>
<set field="serviceInMap.contactMechId" from-field="parameters.shipToContactMechId"/>
<call-service service-name="createPartyContactMechPurpose" in-map-name="serviceInMap"/>
</if-empty>
<log level="info" message="Billing address updated with contactMechId ${parameters.billToContactMechId}"/>
</if-compare-field>
</else>
</if-empty>
<set field="parameters.billToContactMechId" from-field="parameters.shipToContactMechId"/>
</if-compare>
<if-compare field="parameters.useShippingAddressForBilling" operator="not-equals" value="Y">
<if-empty field="parameters.billToContactMechId">
<set field="billToAddressCtx.contactMechPurposeTypeId" value="BILLING_LOCATION"/>
<call-service service-name="createPartyPostalAddress" in-map-name="billToAddressCtx">
<result-to-field result-name="contactMechId" field="parameters.billToContactMechId"/>
</call-service>
<log level="info" message="Billing address created with contactmechId ${parameters.billToContactMechId}"/>
<else>
<if-compare-field field="parameters.shipToContactMechId" operator="equals" to-field="parameters.billToContactMechId">
<set field="billToAddressCtx.contactMechId" from-field="nullField"/>
<call-service service-name="createPartyPostalAddress" in-map-name="billToAddressCtx">
<result-to-field result-name="contactMechId" field="parameters.billToContactMechId"/>
</call-service>
<log level="info" message="Billing address updated with contactMechId ${parameters.billToContactMechId}"/>
<else>
<if-compare field="keepAddressBook" operator="equals" value="N">
<call-service service-name="updatePartyPostalAddress" in-map-name="billToAddressCtx">
<result-to-field result-name="contactMechId" field="parameters.billToContactMechId"/>
</call-service>
</if-compare>
<if-compare field="keepAddressBook" operator="equals" value="Y">
<make-value entity-name="PostalAddress" value-field="newValue"/>
<set-pk-fields value-field="newValue" map="billToAddressCtx"/>
<set-nonpk-fields value-field="newValue" map="billToAddressCtx"/>
<entity-one entity-name="PostalAddress" value-field="oldValue" auto-field-map="false">
<field-map field-name="contactMechId" from-field="billToAddressCtx.contactMechId"/>
</entity-one>
<if-compare-field field="oldValue" to-field="newValue" operator="not-equals" type="Object">
<set field="billToAddressCtx.contactMechId" from-field="nullField"/>
<call-service service-name="createPartyPostalAddress" in-map-name="billToAddressCtx">
<result-to-field result-name="contactMechId" field="parameters.billToContactMechId"/>
</call-service>
</if-compare-field>
</if-compare>
<log level="info" message="Billing Postal Address created billToContactMechId is ${parameters.billToContactMechId}"/>
</else>
</if-compare-field>
<entity-and entity-name="PartyContactMechPurpose" list="pcmpBillList" filter-by-date="true">
<field-map field-name="partyId" from-field="userLogin.partyId"/>
<field-map field-name="contactMechId" from-field="parameters.billToContactMechId"/>
<field-map field-name="contactMechPurposeTypeId" value="BILLING_LOCATION"/>
</entity-and>
<!-- If purpose is not exists then create -->
<if-empty field="pcmpBillList">
<set-service-fields service-name="createPartyContactMechPurpose" map="parameters" to-map="serviceContext"/>
<set field="serviceContext.partyId" from-field="userLogin.partyId"/>
<entity-and entity-name="PartyContactMechPurpose" list="pcmpList" filter-by-date="true">
<field-map field-name="partyId" from-field="userLogin.partyId"/>
<field-map field-name="contactMechPurposeTypeId" value="BILLING_LOCATION"/>
</entity-and>
<if-not-empty field="pcmpList">
<first-from-list list="pcmpList" entry="pcmp"/>
<set-service-fields service-name="deletePartyContactMechPurposeIfExists" map="pcmp" to-map="serviceInMap"/>
<call-service service-name="deletePartyContactMechPurposeIfExists" in-map-name="serviceInMap"/>
<clear-field field="serviceInMap"/>
</if-not-empty>
<set field="serviceContext.partyId" from-field="userLogin.partyId"/>
<set field="serviceContext.contactMechId" from-field="parameters.billToContactMechId"/>
<set field="serviceContext.contactMechPurposeTypeId" value="BILLING_LOCATION"/>
<call-service service-name="createPartyContactMechPurpose" in-map-name="serviceContext"/>
<clear-field field="pcmpList"/>
<clear-field field="serviceContext"/>
</if-empty>
<if-compare field="parameters.setDefaultBilling" operator="equals" value="Y">
<set-service-fields service-name="setPartyProfileDefaults" map="parameters" to-map="partyProfileDefaultsCtx"/>
<set field="partyProfileDefaultsCtx.defaultBillAddr" from-field="parameters.billToContactMechId"/>
<set field="partyProfileDefaultsCtx.partyId" from-field="userLogin.partyId"/>
<call-service service-name="setPartyProfileDefaults" in-map-name="partyProfileDefaultsCtx"/>
</if-compare>
</else>
</if-empty>
</if-compare>
<field-to-result field="parameters.billToContactMechId" result-name="contactMechId"/>
</simple-method>
<simple-method method-name="createUpdateCreditCard" short-description="create and update credit card">
<set-service-fields service-name="createCreditCard" map="parameters" to-map="creditCardContext"/>
<set field="creditCardContext.partyId" from-field="parameters.partyId"/>
<set field="creditCardContext.contactMechId" from-field="parameters.contactMechId"/>
<if-empty field="parameters.paymentMethodId">
<!-- call create Credit Card -->
<call-service service-name="createCreditCard" in-map-name="creditCardContext">
<result-to-field result-name="paymentMethodId" field="parameters.paymentMethodId"/>
</call-service>
<else>
<!-- call update Credit Card -->
<entity-and entity-name="PaymentMethod" list="paymentMethodList" filter-by-date="true">
<field-map field-name="partyId" from-field="partyId"/>
<field-map field-name="paymentMethodTypeId" value="CREDIT_CARD"/>
<order-by field-name="-fromDate"/>
</entity-and>
<first-from-list list="paymentMethodList" entry="paymentMethod"/>
<set field="creditCardContext.paymentMethodId" from-field="paymentMethod.paymentMethodId"/>
<call-service service-name="updateCreditCard" in-map-name="creditCardContext">
<result-to-field result-name="paymentMethodId" field="parameters.paymentMethodId"/>
</call-service>
</else>
</if-empty>
<set field="paymentMethodId" from-field="parameters.paymentMethodId"/>
<field-to-result field="parameters.paymentMethodId" result-name="paymentMethodId"/>
</simple-method>
<simple-method method-name="setUnitPriceAsLastPrice" short-description="Set unitPrice as lastPrice on create purchase order, edit purchase order items and on receive inventory against a purchase order">
<if>
<condition>
<and>
<not><if-empty field="parameters.facilityId"/></not>
<not><if-empty field="parameters.orderId"/></not>
</and>
</condition>
<then>
<entity-and list="orderSuppliers" entity-name="OrderHeaderItemAndRoles">
<field-map field-name="orderId" from-field="parameters.orderId"/>
<field-map field-name="roleTypeId" value="BILL_FROM_VENDOR"/>
<field-map field-name="orderTypeId" value="PURCHASE_ORDER"/>
</entity-and>
<first-from-list list="orderSuppliers" entry="orderSupplier"/>
<entity-and list="supplierProducts" entity-name="SupplierProduct">
<field-map from-field="parameters.productId" field-name="productId"/>
<field-map from-field="orderSupplier.partyId" field-name="partyId"/>
<field-map from-field="nullField" field-name="availableThruDate"/>
</entity-and>
<iterate entry="supplierProduct" list="supplierProducts">
<now-timestamp field="nowTimestamp"/>
<if-not-empty field="parameters.orderCurrencyUnitPrice">
<if-compare-field field="parameters.orderCurrencyUnitPrice" operator="not-equals" to-field="supplierProduct.lastPrice" type="BigDecimal">
<clone-value value-field="supplierProduct" new-value-field="newSupplierProduct"/>
<set field="newSupplierProduct.availableFromDate" from-field="nowTimestamp"/>
<set field="newSupplierProduct.lastPrice" from-field="parameters.orderCurrencyUnitPrice" type="BigDecimal"/>
<create-value value-field="newSupplierProduct"/>
<set field="supplierProduct.availableThruDate" from-field="nowTimestamp"/>
<store-value value-field="supplierProduct"/>
</if-compare-field>
<else>
<if-compare-field field="parameters.unitCost" operator="not-equals" to-field="supplierProduct.lastPrice" type="BigDecimal">
<clone-value value-field="supplierProduct" new-value-field="newSupplierProduct"/>
<set field="newSupplierProduct.availableFromDate" from-field="nowTimestamp"/>
<set field="newSupplierProduct.lastPrice" from-field="parameters.unitCost" type="BigDecimal"/>
<create-value value-field="newSupplierProduct"/>
<set field="supplierProduct.availableThruDate" from-field="nowTimestamp"/>
<store-value value-field="supplierProduct"/>
</if-compare-field>
</else>
</if-not-empty>
</iterate>
</then>
<else>
<if>
<condition>
<and>
<if-empty field="parameters.orderItems"/>
<not><if-empty field="parameters.orderId"/></not>
</and>
</condition>
<then>
<entity-and entity-name="OrderItem" list="orderItems">
<field-map field-name="orderId" from-field="parameters.orderId"/>
</entity-and>
<iterate entry="orderItem" list="orderItems">
<iterate-map key="orderItemSeqId" value="unitPrice" map="parameters.itemPriceMap">
<if>
<condition>
<if-compare-field field="orderItem.orderItemSeqId" operator="equals" to-field="orderItemSeqId"/>
</condition>
<then>
<iterate-map key="orderItemSeqId" value="Y" map="parameters.overridePriceMap">
<if>
<condition>
<if-compare-field field="orderItem.orderItemSeqId" operator="equals" to-field="orderItemSeqId"/>
</condition>
<then>
<set field="orderItem.unitPrice" from-field="unitPrice" type="BigDecimal"/>
<entity-and list="supplierProducts" entity-name="SupplierProduct">
<field-map from-field="orderItem.productId" field-name="productId"/>
<field-map from-field="parameters.supplierPartyId" field-name="partyId"/>
<field-map from-field="nullField" field-name="availableThruDate"/>
</entity-and>
<iterate entry="supplierProduct" list="supplierProducts">
<now-timestamp field="nowTimestamp"/>
<if>
<condition>
<if-compare-field field="orderItem.unitPrice" to-field="supplierProduct.lastPrice" operator="not-equals" type="BigDecimal"/>
</condition>
<then>
<make-value value-field="newSupplierProduct" entity-name="SupplierProduct"/>
<clone-value value-field="supplierProduct" new-value-field="newSupplierProduct"/>
<set from-field="nowTimestamp" field="newSupplierProduct.availableFromDate"/>
<set from-field="orderItem.unitPrice" field="newSupplierProduct.lastPrice"/>
<create-value value-field="newSupplierProduct"/>
<set from-field="nowTimestamp" field="supplierProduct.availableThruDate"/>
<store-value value-field="supplierProduct"/>
</then>
</if>
</iterate>
</then>
</if>
</iterate-map>
</then>
</if>
</iterate-map>
</iterate>
</then>
<else>
<iterate entry="orderItem" list="parameters.orderItems">
<entity-and list="supplierProducts" entity-name="SupplierProduct">
<field-map from-field="orderItem.productId" field-name="productId"/>
<field-map from-field="parameters.supplierPartyId" field-name="partyId"/>
<field-map from-field="nullField" field-name="availableThruDate"/>
</entity-and>
<iterate entry="supplierProduct" list="supplierProducts">
<now-timestamp field="nowTimestamp"/>
<if>
<condition>
<if-compare-field field="orderItem.unitPrice" to-field="supplierProduct.lastPrice" operator="not-equals" type="BigDecimal"/>
</condition>
<then>
<make-value value-field="newSupplierProduct" entity-name="SupplierProduct"/>
<clone-value value-field="supplierProduct" new-value-field="newSupplierProduct"/>
<set from-field="nowTimestamp" field="newSupplierProduct.availableFromDate"/>
<set from-field="orderItem.unitPrice" field="newSupplierProduct.lastPrice" type="BigDecimal"/>
<create-value value-field="newSupplierProduct"/>
<set from-field="nowTimestamp" field="supplierProduct.availableThruDate"/>
<store-value value-field="supplierProduct"/>
</then>
</if>
</iterate>
</iterate>
</else>
</if>
</else>
</if>
</simple-method>
<simple-method method-name="cancelAllBackOrders" short-description="Cancels those back orders from suppliers whose cancel back order date (cancelBackOrderDate) has passed the current date">
<now-timestamp field="nowTimestamp"/>
<entity-condition list="orders" entity-name="OrderHeader">
<condition-list combine="and">
<condition-expr field-name="orderTypeId" operator="equals" value="PURCHASE_ORDER"/>
<condition-expr field-name="statusId" operator="not-equals" value="ORDER_CANCELLED"/>
<condition-expr field-name="statusId" operator="not-equals" value="ORDER_COMPLETED"/>
</condition-list>
</entity-condition>
<iterate entry="currentOrder" list="orders">
<entity-and list="orderItems" entity-name="OrderItem">
<field-map field-name="orderId" from-field="currentOrder.orderId"/>
</entity-and>
<iterate entry="currentOrderItem" list="orderItems">
<set field="backOrderDate" from-field="currentOrderItem.cancelBackOrderDate" type="Timestamp"/>
<if>
<condition>
<and>
<not><if-empty field="backOrderDate"/></not>
<if-compare-field field="nowTimestamp" to-field="backOrderDate" operator="greater" type="Timestamp"/>
</and>
</condition>
<then>
<set field="orderItemMap.orderId" from-field="currentOrder.orderId"/>
<set field="orderItemMap.orderItemSeqId" from-field="currentOrderItem.orderItemSeqId"/>
<call-service service-name="cancelOrderItem" in-map-name="orderItemMap"/>
</then>
</if>
</iterate>
</iterate>
</simple-method>
<simple-method method-name="updateShippingMethodAndCharges" short-description="Updates shipping method and shipping charges from Order View page when Shipment is in picked status and items of Order are packed">
<!-- splitting shipmentMethodAndAmount request parameter value that contains "*" symbol
into "shipmentMethod" and "newAmount".
-->
<!-- shipmentMethod request parameter value contains "@" symbol
between "shipmentMethodTypeId" and "carrierPartyId".This will be splitted in updateOrderItemShipGroup method
-->
<call-bsh><![CDATA[
shipmentMethodAndAmount = parameters.get("shipmentMethodAndAmount");
if (shipmentMethodAndAmount != null) {
parameters.put("shipmentMethod", shipmentMethodAndAmount.substring(0, shipmentMethodAndAmount.indexOf("*")));
parameters.put("amount", shipmentMethodAndAmount.substring(shipmentMethodAndAmount.indexOf("*")+1));
parameters.put("shipmentMethodTypeId", shipmentMethodAndAmount.substring(0, shipmentMethodAndAmount.indexOf("@")));
}
]]></call-bsh>
<set field="newAmount" from-field="parameters.amount" type="BigDecimal"/>
<set field="shippingAmount" from-field="parameters.shippingAmount" type="BigDecimal"/>
<property-to-field field="percentAllowed" resource="shipment" property="shipment.default.cost_actual_over_estimated_percent_allowed"/>
<if-compare-field field="newAmount" operator="greater" to-field="shippingAmount" type="BigDecimal">
<set field="diffPercentage" value="${(newAmount - shippingAmount/shippingAmount)*100}" type="BigDecimal"/>
<else>
<set field="diffPercentage" value="${(shippingAmount - newAmount/newAmount)*100}" type="BigDecimal"/>
</else>
</if-compare-field>
<if-compare-field field="diffPercentage" operator="greater" to-field="percentAllowed" type="BigDecimal">
<set-service-fields map="parameters" to-map="updateOrderItemShipGroupContext" service-name="updateOrderItemShipGroup"/>
<call-service service-name="updateOrderItemShipGroup" in-map-name="updateOrderItemShipGroupContext"/>
<set-service-fields map="parameters" to-map="updateOrderAdjustmentContext" service-name="updateOrderAdjustment"/>
<call-service service-name="updateOrderAdjustment" in-map-name="updateOrderAdjustmentContext"/>
<set-service-fields map="parameters" to-map="updateShipmentRouteSegmentContext" service-name="updateShipmentRouteSegment"/>
<clear-field field="updateShipmentRouteSegmentContext.trackingIdNumber"/>
<clear-field field="updateShipmentRouteSegmentContext.trackingDigest"/>
<clear-field field="updateShipmentRouteSegmentContext.carrierServiceStatusId"/>
<call-service service-name="updateShipmentRouteSegment" in-map-name="updateShipmentRouteSegmentContext"/>
<set-service-fields map="parameters" to-map="upsShipmentConfirmContext" service-name="upsShipmentConfirm"/>
<call-service service-name="upsShipmentConfirm" in-map-name="upsShipmentConfirmContext"/>
<else>
<set-service-fields map="parameters" to-map="updateOrderItemShipGroupContext" service-name="updateOrderItemShipGroup"/>
<call-service service-name="updateOrderItemShipGroup" in-map-name="updateOrderItemShipGroupContext"/>
<set-service-fields map="parameters" to-map="updateShipmentRouteSegmentContext" service-name="updateShipmentRouteSegment"/>
<clear-field field="updateShipmentRouteSegmentContext.trackingIdNumber"/>
<clear-field field="updateShipmentRouteSegmentContext.trackingDigest"/>
<clear-field field="updateShipmentRouteSegmentContext.carrierServiceStatusId"/>
<call-service service-name="updateShipmentRouteSegment" in-map-name="updateShipmentRouteSegmentContext"/>
<set-service-fields map="parameters" to-map="upsShipmentConfirmContext" service-name="upsShipmentConfirm"/>
<call-service service-name="upsShipmentConfirm" in-map-name="upsShipmentConfirmContext"/>
</else>
</if-compare-field>
</simple-method>
<simple-method method-name="productAvailabalityByFacility" short-description="Calculate ATP and Qoh According For each facility">
<set field="facilityMap.ownerPartyId" from-field="parameters.ownerPartyId"/>
<find-by-and map="facilityMap" list="facilityList" entity-name="Facility"/>
<iterate entry="facility" list="facilityList">
<set field="getInventoryAvailableByFacilityMap.facilityId" from-field="facility.facilityId"/>
<set field="getInventoryAvailableByFacilityMap.productId" from-field="parameters.productId"/>
<call-service service-name="getInventoryAvailableByFacility" in-map-name="getInventoryAvailableByFacilityMap">
<result-to-field result-name="quantityOnHandTotal"/>
<result-to-field result-name="availableToPromiseTotal"/>
</call-service>
<set field="availabalityMap.facilityId" from-field="facility.facilityId"/>
<set field="availabalityMap.quantityOnHandTotal" from-field="quantityOnHandTotal"/>
<set field="availabalityMap.availableToPromiseTotal" from-field="availableToPromiseTotal"/>
<field-to-list field="availabalityMap" list="availabalityList"/>
<clear-field field="availabalityMap"/>
</iterate>
<field-to-result field="availabalityList"/>
</simple-method>
<simple-method method-name="createOrderPaymentApplication" short-description="Create Order Payment Application">
<entity-one value-field="paymentMap" entity-name="Payment"/>
<set field="createCtx.amountApplied" from-field="paymentMap.amount" type="BigDecimal"/>
<set field="createCtx.paymentId" from-field="paymentMap.paymentId"/>
<entity-one value-field="orderPaymentPreMap" entity-name="OrderPaymentPreference">
<field-map field-name="orderPaymentPreferenceId" from-field="paymentMap.paymentPreferenceId"/>
</entity-one>
<entity-and list="orderItemBilList" entity-name="OrderItemBilling">
<field-map field-name="orderId" from-field="orderPaymentPreMap.orderId"/>
<order-by field-name="invoiceId"/>
</entity-and>
<if-not-empty field="orderItemBilList">
<set field="createCtx.invoiceId" from-field="orderItemBilList[0].invoiceId"/>
<call-service service-name="createPaymentApplication" in-map-name="createCtx"/>
</if-not-empty>
</simple-method>
<simple-method method-name="MoveItemBetweenShipGroups" short-description="Move order items between ship groups">
<entity-one entity-name="OrderItemShipGroupAssoc" value-field="orderItemShipGroupAssoc">
<field-map field-name="orderId" from-field="parameters.orderId"/>
<field-map field-name="orderItemSeqId" from-field="parameters.orderItemSeqId"/>
<field-map field-name="shipGroupSeqId" from-field="parameters.toGroupIndex"/>
</entity-one>
<if-empty field="orderItemShipGroupAssoc">
<set-service-fields service-name="addOrderItemShipGroupAssoc" map="parameters" to-map="map"/>
<set field="map.quantity" value="0" type="BigDecimal"/>
<set field="map.shipGroupSeqId" from="parameters.toGroupIndex"/>
<call-service service-name="addOrderItemShipGroupAssoc" in-map-name="map"/>
<entity-one entity-name="OrderItemShipGroupAssoc" value-field="orderItemShipGroupAssoc">
<field-map field-name="orderId" from-field="parameters.orderId"/>
<field-map field-name="orderItemSeqId" from-field="parameters.orderItemSeqId"/>
<field-map field-name="shipGroupSeqId" from-field="parameters.toGroupIndex"/>
</entity-one>
</if-empty>
<clear-field field="map"/>
<set field="map.orderId" from-field="parameters.orderId"/>
<set field="map.orderItemSeqId" from-field="parameters.orderItemSeqId"/>
<set field="map.shipGroupSeqId" from-field="parameters.toGroupIndex"/>
<set field="map.quantity" value="${orderItemShipGroupAssoc.quantity + parameters.quantity}" type="BigDecimal"/>
<call-service service-name="updateOrderItemShipGroupAssoc" in-map-name="map"/>
<entity-one entity-name="OrderItemShipGroupAssoc" value-field="orderItemShipGroupAssoc">
<field-map field-name="orderId" from-field="parameters.orderId"/>
<field-map field-name="orderItemSeqId" from-field="parameters.orderItemSeqId"/>
<field-map field-name="shipGroupSeqId" from-field="parameters.fromGroupIndex"/>
</entity-one>
<if-empty field="orderItemShipGroupAssoc">
<add-error>
<fail-message message="The orderItemShipGroupAssoc qualified by orderId=${parameters.orderId} orderItemSeqId=${parameters.orderItemSeqId} shipGroupSeqId=${parameters.fromGroupIndex} does not exist"/>
</add-error>
</if-empty>
<check-errors/>
<clear-field field="map"/>
<set field="map.orderId" from-field="parameters.orderId"/>
<set field="map.orderItemSeqId" from-field="parameters.orderItemSeqId"/>
<set field="map.shipGroupSeqId" from-field="parameters.fromGroupIndex"/>
<set field="map.quantity" value="${orderItemShipGroupAssoc.quantity - parameters.quantity}" type="BigDecimal"/>
<call-service service-name="updateOrderItemShipGroupAssoc" in-map-name="map"/>
</simple-method>
</simple-methods>