This is an automated email from the ASF dual-hosted git repository. nmalin pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
commit 7968f62e51b9f710eec880c490cd4e3339f027b1 Author: Sebastian Berg <sebastian.b...@ecomify.de> AuthorDate: Fri Apr 17 11:40:47 2020 +0200 Improved: Convert InventoryIssueServices.xml mini lang to groovy (OFBIZ-11591) --- .../inventory/InventoryIssueServices.groovy | 233 +++++++++++++++++ .../product/inventory/InventoryIssueServices.xml | 279 --------------------- .../product/servicedef/services_facility.xml | 8 +- 3 files changed, 237 insertions(+), 283 deletions(-) diff --git a/applications/product/groovyScripts/product/inventory/InventoryIssueServices.groovy b/applications/product/groovyScripts/product/inventory/InventoryIssueServices.groovy new file mode 100644 index 0000000..a1b6f09 --- /dev/null +++ b/applications/product/groovyScripts/product/inventory/InventoryIssueServices.groovy @@ -0,0 +1,233 @@ +/* + * 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. + */ + +import org.apache.ofbiz.entity.GenericValue + + +/** + * Issues the Inventory for an Order that was Immediately Fulfilled + * @return + */ +def issueImmediatelyFulfilledOrder() { + GenericValue orderHeader = from("OrderHeader").where(parameters).queryOne() + + if (orderHeader) { + GenericValue productStore = from("ProductStore").where(productStoreId: orderHeader.productStoreId).queryOne() + + if (orderHeader.needsInventoryIssuance == "Y") { + List orderItemList = orderHeader.getRelated("OrderItem") + /* + * before issuing inventory, check to see if there is inventory information in this database + * if inventory info is not available for all of the products, then don't do the issuance, + * ie there has to be at least SOME inventory info in the database to facilitate inventory-less cases + */ + long iiCount = from("InventoryItem").where(facilityId: orderHeader.originFacilityId).queryCount() + + // now go through each order item and call a service to issue the inventory + if (iiCount > 0l) { + for (GenericValue orderItem : orderItemList) { + if (orderItem.productId) { + Map callSvcMap = orderItem.getAllFields() + callSvcMap.orderHeader = orderHeader + callSvcMap.orderItem = orderItem + callSvcMap.productStore = productStore + run service: "issueImmediatelyFulfilledOrderItem", with: callSvcMap + } + } + // now that the issuance is done, set the needsInventoryIssuance=N + orderHeader.needsInventoryIssuance = "N" + orderHeader.store() + logInfo("Issued inventory for orderId ${orderHeader.orderId}.") + } else { + logInfo("Not issuing inventory for orderId ${orderHeader.orderId}," + + " no inventory information available.") + } + } + } + return success() +} + +/** + * Issues the Inventory for an Order Item that was Immediately Fulfilled + * @return + */ +def issueImmediatelyFulfilledOrderItem() { + GenericValue lastNonSerInventoryItem + GenericValue orderItem = parameters.orderItem ?: + from("OrderItem").where(parameters).queryOne() + + // kind of like the inventory reservation routine (with a few variations...), find InventoryItems to issue from, + // but instead of doing the reservation just create an issuance and an inventory item detail for the change + if (orderItem.productId) { + // NOTE: the inventory will be issued from the OrderHeader.originFacilityId + GenericValue orderHeader = parameters.orderHeader ?: + from("OrderHeader").where(parameters).queryOne() + + // get the ProductStore to fund the reserveOrderEnumId + GenericValue productStore = parameters.productStore ?: + from("ProductStore").where(productStoreId: orderHeader.productStoreId).queryOne() + + // before we do the find, put together the orderBy list based on which reserveOrderEnumId is specified + String orderBy = "+datetimeReceived" + switch (productStore.reserveOrderEnumId) { + case "INVRO_FIFO_EXP": + orderBy = "+expireDate" + break + case "INVRO_LIFO_EXP": + orderBy = "-expireDate" + break + case "INVRO_LIFO_REC": + orderBy = "-datetimeReceived" + break + default: + break + } + Map lookupFieldMap = [productId: orderItem.productId, + facilityId: orderHeader.originFacilityId] + from("InventoryItem") + .where(lookupFieldMap) + .orderBy(orderBy) + .queryList() + .each { inventoryItem -> + // this is a little trick to get the InventoryItem value object without doing a query, possible + // since all fields on InventoryItem are also on InventoryItemAndLocation with the same names + GenericValue tmpLastNonSerInventoryItem = issueImmediateForInventoryItemInline(inventoryItem) + if (tmpLastNonSerInventoryItem) { + lastNonSerInventoryItem = tmpLastNonSerInventoryItem + } + } + + parameters.quantityNotIssued = orderItem.quantity + // if quantityNotIssued is not 0, then pull it from the last non-serialized inventory item found, + // in the quantityNotIssued field + if (parameters.quantityNotIssued != (BigDecimal) 0) { + BigDecimal availableToPromiseDiff = - parameters.quantityNotIssued + BigDecimal quantityOnHandDiff = - parameters.quantityNotIssued + if (lastNonSerInventoryItem) { + // create ItemIssuance record + Map serviceResult = run service: "createItemIssuance", + with: [orderId: parameters.orderId, + orderItemSeqId: parameters.orderItemSeqId, + inventoryItemId: lastNonSerInventoryItem.inventoryItemId, + quantity: parameters.quantityNotIssued] + String itemIssuanceId = serviceResult.itemIssuanceId + + // subtract from quantityNotIssued from the availableToPromise and quantityOnHand of existing inventory item + // instead of updating InventoryItem, add an InventoryItemDetail + run service: "createInventoryItemDetail", + with: [inventoryItemId: lastNonSerInventoryItem.inventoryItemId, + orderId: parameters.orderId, + orderItemSeqId: parameters.orderItemSeqId, + itemIssuanceId: itemIssuanceId, + availableToPromiseDiff: availableToPromiseDiff.setScale(6), + quantityOnHandDiff: quantityOnHandDiff.setScale(6)] + } else { + // no non-ser inv item, create a non-ser InventoryItem with availableToPromise = -quantityNotIssued + Map serviceResult = run service: "createInventoryItem", + with: [productId: orderItem.productId, + facilityId: orderHeader.originFacilityId, + inventoryItemTypeId: "NON_SERIAL_INV_ITEM"] + String newInventoryItemId = serviceResult.inventoryItemId + + // create ItemIssuance record + serviceResult = run service: "createItemIssuance", + with: [inventoryItemId: newInventoryItemId, + orderId: parameters.orderId, + orderItemSeqId: parameters.orderItemSeqId, + quantity: parameters.quantityNotIssued] + String itemIssuanceId = serviceResult.itemIssuanceId + + // also create a detail record with the quantities + run service: "createInventoryItemDetail", + with: [inventoryItemId: newInventoryItemId, + orderId: parameters.orderId, + orderItemSeqId: parameters.orderItemSeqId, + itemIssuanceId: itemIssuanceId, + availableToPromiseDiff: availableToPromiseDiff.setScale(6), + quantityOnHandDiff: quantityOnHandDiff.setScale(6)] + } + parameters.quantityNotIssued = 0 + } + } + return success() +} + +/** + * Does a issuance for one InventoryItem, meant to be called in-line + * @return + */ +def issueImmediateForInventoryItemInline(GenericValue inventoryItem) { + GenericValue lastNonSerInventoryItem + // only do something with this inventoryItem if there is more inventory to issue + if (parameters.quantityNotIssued > (BigDecimal) 0) { + if ("SERIALIZED_INV_ITEM" == inventoryItem.inventoryItemTypeId) { + if ("INV_AVAILABLE" == inventoryItem.statusId) { + // change status on inventoryItem + inventoryItem.statusId = "INV_DELIVERED" + run service: "updateInventoryItem", with: inventoryItem.getAllFields() + + // create ItemIssuance record + run service: "createItemIssuance", with: [orderId: parameters.orderId, + orderItemSeqId: parameters.orderItemSeqId, + inventoryItemId: inventoryItem.inventoryItemId, + quantity: (BigDecimal) 1] + + parameters.quantityNotIssued -= (BigDecimal) 1 + } + } + if (inventoryItem.inventoryItemTypeId == "NON_SERIAL_INV_ITEM") { + // reduce atp on inventoryItem if availableToPromise greater than 0, + // if not the code at the end of this method will handle it + if ((!inventoryItem.statusId || inventoryItem.statusId == "INV_AVAILABLE") && + inventoryItem.availableToPromiseTotal && + inventoryItem.availableToPromiseTotal > (BigDecimal) 0) { + parameters.deductAmount = parameters.quantityNotIssued > inventoryItem.availableToPromiseTotal ? + inventoryItem.availableToPromiseTotal : + parameters.quantityNotIssued + + // create ItemIssuance record + Map serviceResult = run service: "createItemIssuance", + with: [orderId: parameters.orderId, + orderitemSeqId: parameters.orderItemSeqId, + inventoryItemId: inventoryItem.inventoryItemId, + quantity: parameters.deductAmount] + String itemIssuanceId = serviceResult.itemIssuanceId + + // instead of updating InventoryItem, add an InventoryItemDetail + // update availableToPromiseDiff AND quantityOnHandDiff since this is an issuance + BigDecimal availableToPromiseDiff = - parameters.deductAmount + BigDecimal quantityOnHandDiff = - parameters.deductAmount + run service: "createInventoryItemDetail", + with: [inventoryItemId: inventoryItem.inventoryItemId, + orderId: parameters.orderId, + orderItemSeqId: parameters.orderItemSeqId, + itemIssuanceId: itemIssuanceId, + availableToPromiseDiff: availableToPromiseDiff.setScale(6), + quantityOnHandDiff: quantityOnHandDiff.setScale(6)] + + parameters.quantityNotIssued -= parameters.deductAmount + + // keep track of the last non-serialized inventory item for use if inventory is not sufficient for amount already issued + // use env variable named lastNonSerInventoryItem + lastNonSerInventoryItem = inventoryItem + } + } + } + return lastNonSerInventoryItem +} diff --git a/applications/product/minilang/product/inventory/InventoryIssueServices.xml b/applications/product/minilang/product/inventory/InventoryIssueServices.xml deleted file mode 100644 index c7e2ca6..0000000 --- a/applications/product/minilang/product/inventory/InventoryIssueServices.xml +++ /dev/null @@ -1,279 +0,0 @@ -<?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="issueImmediatelyFulfilledOrder" short-description="Issues the Inventory for an Order that was Immediately Fulfilled" login-required="false"> - <entity-one entity-name="OrderHeader" value-field="orderHeader"/> - - <entity-one entity-name="ProductStore" value-field="productStore"> - <field-map field-name="productStoreId" from-field="orderHeader.productStoreId"/> - </entity-one> - - <if-not-empty field="orderHeader"> - <if-compare field="orderHeader.needsInventoryIssuance" operator="equals" value="Y"> - <get-related list="orderItemList" relation-name="OrderItem" value-field="orderHeader"/> - - <!-- before issuing inventory, check to see if there is inventory information in this database --> - <!-- if inventory info is not available for all of the products, then don't do the issuance, - ie there has to be at least SOME inventory info in the database to facilitate inventory-less cases --> - <entity-count entity-name="InventoryItem" count-field="iiCount"> - <condition-expr field-name="facilityId" operator="equals" from-field="orderHeader.originFacilityId"/> - </entity-count> - - <!-- now go through each order item and call a service to issue the inventory --> - <if-compare field="iiCount" operator="greater" value="0" type="BigDecimal"> - <iterate list="orderItemList" entry="orderItem"> - <if-not-empty field="orderItem.productId"> - <clear-field field="callSvcMap"/> - <set-service-fields service-name="issueImmediatelyFulfilledOrderItem" map="orderItem" to-map="callSvcMap"/> - <set field="callSvcMap.orderHeader" from-field="orderHeader"/> - <set field="callSvcMap.orderItem" from-field="orderItem"/> - <set field="callSvcMap.productStore" from-field="productStore"/> - <call-service service-name="issueImmediatelyFulfilledOrderItem" in-map-name="callSvcMap"/> - </if-not-empty> - </iterate> - <!-- now that the issuance is done, set the needsInventoryIssuance=N --> - <set field="orderHeader.needsInventoryIssuance" value="N"/> - <store-value value-field="orderHeader"/> - <log level="info" message="Issued inventory for orderId ${orderHeader.orderId}."/> - <else> - <log level="info" message="Not issuing inventory for orderId ${orderHeader.orderId}, no inventory information available."/> - </else> - </if-compare> - </if-compare> - </if-not-empty> - </simple-method> - <simple-method method-name="issueImmediatelyFulfilledOrderItem" short-description="Issues the Inventory for an Order Item that was Immediately Fulfilled" login-required="false"> - <if-empty field="parameters.orderItem"> - <entity-one entity-name="OrderItem" value-field="orderItem"/> - <else> - <set field="orderItem" from-field="parameters.orderItem"/> - </else> - </if-empty> - - <!-- kind of like the inventory reservation routine (with a few variations...), find InventoryItems to issue from, but instead of doing the reservation just create an issuance and an inventory item detail for the change --> - <if-not-empty field="orderItem.productId"> - <now-timestamp field="nowTimestamp"/> - - <!-- NOTE: the inventory will be issued from the OrderHeader.originFacilityId --> - <if-empty field="parameters.orderHeader"> - <entity-one entity-name="OrderHeader" value-field="orderHeader"/> - <else> - <set field="orderHeader" from-field="parameters.orderHeader"/> - </else> - </if-empty> - - <!-- get the ProductStore to fund the reserveOrderEnumId --> - <if-empty field="parameters.productStore"> - <entity-one entity-name="ProductStore" value-field="productStore"> - <field-map field-name="productStoreId" from-field="orderHeader.productStoreId"/> - </entity-one> - <else> - <set field="productStore" from-field="parameters.productStore"/> - </else> - </if-empty> - - <!-- before we do the find, put together the orderBy list based on which reserveOrderEnumId is specified --> - <if-compare value="INVRO_FIFO_EXP" operator="equals" field="productStore.reserveOrderEnumId"> - <set field="orderByString" value="+expireDate"/> - <else> - <if-compare value="INVRO_LIFO_EXP" operator="equals" field="productStore.reserveOrderEnumId"> - <set field="orderByString" value="-expireDate"/> - <else> - <if-compare value="INVRO_LIFO_REC" operator="equals" field="productStore.reserveOrderEnumId"> - <set field="orderByString" value="-datetimeReceived"/> - <else> - <!-- the default reserveOrderEnumId is INVRO_FIFO_REC, ie FIFO based on date received --> - <set field="orderByString" value="+datetimeReceived"/> - </else> - </if-compare> - </else> - </if-compare> - </else> - </if-compare> - <field-to-list field="orderByString" list="orderByList"/> - <set field="lookupFieldMap.productId" from-field="orderItem.productId"/> - <set field="lookupFieldMap.facilityId" from-field="orderHeader.originFacilityId"/> - <find-by-and entity-name="InventoryItem" map="lookupFieldMap" list="inventoryItemList" order-by-list="orderByList"/> - - <set field="parameters.quantityNotIssued" from-field="orderItem.quantity"/> - - <iterate list="inventoryItemList" entry="inventoryItem"> - <!-- this is a little trick to get the InventoryItem value object without doing a query, possible since all fields on InventoryItem are also on InventoryItemAndLocation with the same names --> - <call-simple-method method-name="issueImmediateForInventoryItemInline"/> - </iterate> - - <!-- if quantityNotIssued is not 0, then pull it from the last non-serialized inventory item found, in the quantityNotIssued field --> - <if-compare field="parameters.quantityNotIssued" operator="not-equals" value="0" type="BigDecimal"> - <if-not-empty field="lastNonSerInventoryItem"> - <!-- create ItemIssuance record --> - <set field="issuanceCreateMap.orderId" from-field="parameters.orderId"/> - <set field="issuanceCreateMap.orderItemSeqId" from-field="parameters.orderItemSeqId"/> - <set field="issuanceCreateMap.inventoryItemId" from-field="lastNonSerInventoryItem.inventoryItemId"/> - <set field="issuanceCreateMap.quantity" from-field="parameters.quantityNotIssued"/> - <call-service service-name="createItemIssuance" in-map-name="issuanceCreateMap"> - <result-to-field result-name="itemIssuanceId"/> - </call-service> - - <!-- subtract from quantityNotIssued from the availableToPromise and quantityOnHand of existing inventory item --> - <!-- instead of updating InventoryItem, add an InventoryItemDetail --> - <set field="createDetailMap.inventoryItemId" from-field="lastNonSerInventoryItem.inventoryItemId"/> - <set field="createDetailMap.orderId" from-field="parameters.orderId"/> - <set field="createDetailMap.orderItemSeqId" from-field="parameters.orderItemSeqId"/> - <set field="createDetailMap.itemIssuanceId" from-field="itemIssuanceId"/> - <calculate field="createDetailMap.availableToPromiseDiff" decimal-scale="6"> - <calcop operator="negative" field="parameters.quantityNotIssued"/> - </calculate> - <calculate field="createDetailMap.quantityOnHandDiff" decimal-scale="6"> - <calcop operator="negative" field="parameters.quantityNotIssued"/> - </calculate> - <call-service service-name="createInventoryItemDetail" in-map-name="createDetailMap"/> - - <clear-field field="createDetailMap"/> - <clear-field field="itemIssuanceId"/> - <else> - <!-- no non-ser inv item, create a non-ser InventoryItem with availableToPromise = -quantityNotIssued --> - <clear-field field="createInvItemInMap"/> - <clear-field field="createInvItemOutMap"/> - <set field="createInvItemInMap.productId" from-field="orderItem.productId"/> - <set field="createInvItemInMap.facilityId" from-field="orderHeader.originFacilityId"/> - <set field="createInvItemInMap.inventoryItemTypeId" value="NON_SERIAL_INV_ITEM"/> - <call-service service-name="createInventoryItem" in-map-name="createInvItemInMap"> - <result-to-field result-name="inventoryItemId" field="createInvItemOutMap.inventoryItemId"/> - </call-service> - - <!-- create ItemIssuance record --> - <set field="issuanceCreateMap.orderId" from-field="parameters.orderId"/> - <set field="issuanceCreateMap.orderItemSeqId" from-field="parameters.orderItemSeqId"/> - <set field="issuanceCreateMap.inventoryItemId" from-field="createInvItemOutMap.inventoryItemId"/> - <set field="issuanceCreateMap.quantity" from-field="parameters.quantityNotIssued"/> - <call-service service-name="createItemIssuance" in-map-name="issuanceCreateMap"> - <result-to-field result-name="itemIssuanceId"/> - </call-service> - - <!-- also create a detail record with the quantities --> - <set field="createDetailMap.inventoryItemId" from-field="createInvItemOutMap.inventoryItemId"/> - <set field="createDetailMap.orderId" from-field="parameters.orderId"/> - <set field="createDetailMap.orderItemSeqId" from-field="parameters.orderItemSeqId"/> - <set field="createDetailMap.itemIssuanceId" from-field="itemIssuanceId"/> - <calculate field="createDetailMap.availableToPromiseDiff" decimal-scale="6"> - <calcop operator="negative" field="parameters.quantityNotIssued"/> - </calculate> - <calculate field="createDetailMap.quantityOnHandDiff" decimal-scale="6"> - <calcop operator="negative" field="parameters.quantityNotIssued"/> - </calculate> - <call-service service-name="createInventoryItemDetail" in-map-name="createDetailMap"/> - - <clear-field field="createDetailMap"/> - <clear-field field="itemIssuanceId"/> - </else> - </if-not-empty> - - <calculate field="parameters.quantityNotIssued" ><number value="0"/></calculate> - </if-compare> - </if-not-empty> - </simple-method> - <simple-method method-name="issueImmediateForInventoryItemInline" short-description="Does a issuance for one InventoryItem, meant to be called in-line"> - <!-- only do something with this inventoryItem if there is more inventory to issue --> - <if-compare field="parameters.quantityNotIssued" operator="greater" value="0" type="BigDecimal"> - <if-compare value="SERIALIZED_INV_ITEM" operator="equals" field="inventoryItem.inventoryItemTypeId"> - <if-compare value="INV_AVAILABLE" operator="equals" field="inventoryItem.statusId"> - <!-- change status on inventoryItem --> - <set field="inventoryItem.statusId" value="INV_DELIVERED"/> - <set-service-fields service-name="updateInventoryItem" map="inventoryItem" to-map="inventoryItemMap"/> - <call-service service-name="updateInventoryItem" in-map-name="inventoryItemMap"/> - - <!-- create ItemIssuance record --> - <set field="issuanceCreateMap.orderId" from-field="parameters.orderId"/> - <set field="issuanceCreateMap.orderItemSeqId" from-field="parameters.orderItemSeqId"/> - <set field="issuanceCreateMap.inventoryItemId" from-field="inventoryItem.inventoryItemId"/> - <calculate field="issuanceCreateMap.quantity" ><number value="1"/></calculate> - <call-service service-name="createItemIssuance" in-map-name="issuanceCreateMap"/> - <clear-field field="issuanceCreateMap"/> - - <calculate field="parameters.quantityNotIssued"> - <calcop operator="subtract" field="parameters.quantityNotIssued"><number value="1.0"/></calcop> - </calculate> - </if-compare> - </if-compare> - <if-compare field="inventoryItem.inventoryItemTypeId" operator="equals" value="NON_SERIAL_INV_ITEM"> - <!-- reduce atp on inventoryItem if availableToPromise greater than 0, if not the code at the end of this method will handle it --> - <if> - <condition> - <and> - <or> - <if-empty field="inventoryItem.statusId"/> - <if-compare field="inventoryItem.statusId" operator="equals" value="INV_AVAILABLE"/> - </or> - <not><if-empty field="inventoryItem.availableToPromiseTotal"/></not> - <if-compare field="inventoryItem.availableToPromiseTotal" operator="greater" value="0" type="BigDecimal"/> - </and> - </condition> - <then> - <if-compare-field field="parameters.quantityNotIssued" to-field="inventoryItem.availableToPromiseTotal" operator="greater" type="BigDecimal"> - <set field="parameters.deductAmount" from-field="inventoryItem.availableToPromiseTotal"/> - <else> - <set field="parameters.deductAmount" from-field="parameters.quantityNotIssued"/> - </else> - </if-compare-field> - - <!-- create ItemIssuance record --> - <set field="issuanceCreateMap.orderId" from-field="parameters.orderId"/> - <set field="issuanceCreateMap.orderItemSeqId" from-field="parameters.orderItemSeqId"/> - <set field="issuanceCreateMap.inventoryItemId" from-field="inventoryItem.inventoryItemId"/> - <set field="issuanceCreateMap.quantity" from-field="parameters.deductAmount"/> - <call-service service-name="createItemIssuance" in-map-name="issuanceCreateMap"> - <result-to-field result-name="itemIssuanceId"/> - </call-service> - - <!-- instead of updating InventoryItem, add an InventoryItemDetail --> - <set field="createDetailMap.inventoryItemId" from-field="inventoryItem.inventoryItemId"/> - <set field="createDetailMap.orderId" from-field="parameters.orderId"/> - <set field="createDetailMap.orderItemSeqId" from-field="parameters.orderItemSeqId"/> - <set field="createDetailMap.itemIssuanceId" from-field="itemIssuanceId"/> - <!-- update availableToPromiseDiff AND quantityOnHandDiff since this is an issuance --> - <calculate field="createDetailMap.availableToPromiseDiff" decimal-scale="6"> - <calcop operator="negative" field="parameters.deductAmount"/> - </calculate> - <calculate field="createDetailMap.quantityOnHandDiff" decimal-scale="6"> - <calcop operator="negative" field="parameters.deductAmount"/> - </calculate> - <call-service service-name="createInventoryItemDetail" in-map-name="createDetailMap"/> - <clear-field field="createDetailMap"/> - - <calculate field="parameters.quantityNotIssued" > - <calcop operator="subtract" field="parameters.quantityNotIssued"> - <calcop operator="get" field="parameters.deductAmount"/> - </calcop> - </calculate> - - <clear-field field="issuanceCreateMap"/> - <clear-field field="itemIssuanceId"/> - - <!-- keep track of the last non-serialized inventory item for use if inventory is not sufficient for amount already issued --> - <!-- use env variable named lastNonSerInventoryItem --> - <set field="lastNonSerInventoryItem" from-field="inventoryItem"/> - </then> - </if> - </if-compare> - </if-compare> - </simple-method> -</simple-methods> diff --git a/applications/product/servicedef/services_facility.xml b/applications/product/servicedef/services_facility.xml index 08a61b2..a534f9c 100644 --- a/applications/product/servicedef/services_facility.xml +++ b/applications/product/servicedef/services_facility.xml @@ -811,8 +811,8 @@ under the License. <attribute name="statusId" type="String" mode="IN" optional="true"/> </service> - <service name="issueImmediatelyFulfilledOrder" engine="simple" - location="component://product/minilang/product/inventory/InventoryIssueServices.xml" invoke="issueImmediatelyFulfilledOrder" auth="false"> + <service name="issueImmediatelyFulfilledOrder" engine="groovy" + location="component://product/groovyScripts/product/inventory/InventoryIssueServices.groovy" invoke="issueImmediatelyFulfilledOrder" auth="false"> <description> Issues the Inventory for an Order that was Immediately Fulfilled. Note that this skips the normal inventory reservation process, and the shipment process (no shipment is created). @@ -823,8 +823,8 @@ under the License. </type-validate> </attribute> </service> - <service name="issueImmediatelyFulfilledOrderItem" engine="simple" - location="component://product/minilang/product/inventory/InventoryIssueServices.xml" invoke="issueImmediatelyFulfilledOrderItem" auth="false"> + <service name="issueImmediatelyFulfilledOrderItem" engine="groovy" + location="component://product/groovyScripts/product/inventory/InventoryIssueServices.groovy" invoke="issueImmediatelyFulfilledOrderItem" auth="false"> <description> Issues the Inventory for an Order Item that was Immediately Fulfilled for more info see the issueImmediatelyFulfilledOrder service. </description>