| <?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="reserveProductInventory" short-description="Reserve Inventory for a Product"> |
| <!-- |
| this method can be called with some optional parameters: |
| -facilityId |
| -containerId |
| If the service definitions are used then only one of these two will ever be specified, or neither of them. |
| |
| Whatever it is called with, it will basically get a list of InventoryItems and reserve the first available inventory. |
| |
| If requireInventory is Y the quantity not reserved is returned, if N then a negative |
| availableToPromise will be used to track quantity ordered beyond what is in stock. |
| --> |
| |
| <log level="verbose" message="Parameters : ${parameters}"/> |
| <now-timestamp field="nowTimestamp"/> |
| |
| <!-- check the product; make sure its a physical item --> |
| <entity-one entity-name="Product" value-field="product"/> |
| <entity-one entity-name="Facility" value-field="facility" use-cache="true"/> |
| <get-related-one value-field="product" relation-name="ProductType" to-value-field="productType"/> |
| <if-compare field="productType.isPhysical" operator="equals" value="N"> |
| <set field="parameters.quantityNotReserved" value="0" type="BigDecimal"/> |
| <else> |
| <entity-one entity-name="OrderHeader" value-field="orderHeader"/> |
| |
| <!-- before we do the find, put together the orderBy list based on which reserveOrderEnumId is specified --> |
| <!-- FIFO=first in first out, so it should be order by ASCending receive or expire date |
| LIFO=last in first out, so it means order by DESCending receive or expire date |
| --> |
| <if-compare value="INVRO_GUNIT_COST" operator="equals" field="parameters.reserveOrderEnumId"> |
| <set value="-unitCost" field="orderByString"/> |
| <else> |
| <if-compare value="INVRO_LUNIT_COST" operator="equals" field="parameters.reserveOrderEnumId"> |
| <set value="+unitCost" field="orderByString"/> |
| <else> |
| <if-compare value="INVRO_FIFO_EXP" operator="equals" field="parameters.reserveOrderEnumId"> |
| <set value="+expireDate" field="orderByString"/> |
| <else> |
| <if-compare value="INVRO_LIFO_EXP" operator="equals" field="parameters.reserveOrderEnumId"> |
| <set value="-expireDate" field="orderByString"/> |
| <else> |
| <if-compare value="INVRO_LIFO_REC" operator="equals" field="parameters.reserveOrderEnumId"> |
| <set value="-datetimeReceived" field="orderByString"/> |
| <else> |
| <!-- the default reserveOrderEnumId is INVRO_FIFO_REC, ie FIFO based on date received --> |
| <set value="+datetimeReceived" field="orderByString"/> |
| <set value="INVRO_FIFO_REC" field="parameters.reserveOrderEnumId"/> |
| </else> |
| </if-compare> |
| </else> |
| </if-compare> |
| </else> |
| </if-compare> |
| </else> |
| </if-compare> |
| </else> |
| </if-compare> |
| |
| <set from-field="parameters.quantity" field="parameters.quantityNotReserved"/> |
| |
| <!-- first reserve against InventoryItems in FLT_PICKLOC type locations, then FLT_BULK locations, then InventoryItems with no locations --> |
| <entity-condition entity-name="InventoryItemAndLocation" list="inventoryItemAndLocations"> |
| <condition-list combine="and"> |
| <condition-expr field-name="productId" from-field="parameters.productId"/> |
| <condition-expr field-name="facilityId" from-field="parameters.facilityId" ignore-if-empty="true" ignore-if-null="true"/> |
| <condition-expr field-name="containerId" from-field="parameters.containerId" ignore-if-empty="true" ignore-if-null="true"/> |
| <condition-expr field-name="lotId" from-field="parameters.lotId" ignore-if-empty="true" ignore-if-null="true"/> |
| <condition-expr field-name="quantityOnHandTotal" operator="greater" value="0.0"/> |
| <condition-expr field-name="locationTypeEnumId" operator="equals" value="FLT_PICKLOC"/> |
| <condition-expr field-name="statusId" operator="not-equals" value="INV_NS_DEFECTIVE"/> |
| <condition-expr field-name="statusId" operator="not-equals" value="INV_DEFECTIVE"/> |
| </condition-list> |
| <order-by field-name="${orderByString}"/> |
| </entity-condition> |
| <iterate entry="inventoryItemAndLocation" list="inventoryItemAndLocations"> |
| <if-compare field="parameters.quantityNotReserved" operator="greater" value="0" type="Double"> |
| <!-- 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 --> |
| <make-value entity-name="InventoryItem" map="inventoryItemAndLocation" value-field="inventoryItem"/> |
| <call-simple-method method-name="reserveForInventoryItemInline"/> |
| </if-compare> |
| </iterate> |
| |
| <!-- still some left? try the FLT_BULK locations --> |
| <if-compare field="parameters.quantityNotReserved" operator="greater" value="0" type="BigDecimal"> |
| <entity-condition entity-name="InventoryItemAndLocation" list="inventoryItemAndLocations"> |
| <condition-list combine="and"> |
| <condition-expr field-name="productId" from-field="parameters.productId"/> |
| <condition-expr field-name="facilityId" from-field="parameters.facilityId" ignore-if-empty="true" ignore-if-null="true"/> |
| <condition-expr field-name="containerId" from-field="parameters.containerId" ignore-if-empty="true" ignore-if-null="true"/> |
| <condition-expr field-name="lotId" from-field="parameters.lotId" ignore-if-empty="true" ignore-if-null="true"/> |
| <condition-expr field-name="quantityOnHandTotal" operator="greater" value="0.0"/> |
| <condition-expr field-name="locationTypeEnumId" operator="equals" value="FLT_BULK"/> |
| <condition-expr field-name="statusId" operator="not-equals" value="INV_NS_DEFECTIVE"/> |
| <condition-expr field-name="statusId" operator="not-equals" value="INV_DEFECTIVE"/> |
| </condition-list> |
| <order-by field-name="${orderByString}"/> |
| </entity-condition> |
| <iterate entry="inventoryItemAndLocation" list="inventoryItemAndLocations"> |
| <if-compare field="parameters.quantityNotReserved" operator="greater" value="0" type="Double"> |
| <!-- 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 --> |
| <make-value entity-name="InventoryItem" map="inventoryItemAndLocation" value-field="inventoryItem"/> |
| <call-simple-method method-name="reserveForInventoryItemInline"/> |
| </if-compare> |
| </iterate> |
| </if-compare> |
| |
| <!-- last of all try reserving in InventoryItems that have no locationSeqId, ie are not in any particular location --> |
| <if-compare field="parameters.quantityNotReserved" operator="greater" value="0" type="BigDecimal"> |
| <entity-condition entity-name="InventoryItem" list="inventoryItems"> |
| <condition-list combine="and"> |
| <condition-expr field-name="productId" from-field="parameters.productId"/> |
| <condition-expr field-name="facilityId" from-field="parameters.facilityId" ignore-if-empty="true" ignore-if-null="true"/> |
| <condition-expr field-name="containerId" from-field="parameters.containerId" ignore-if-empty="true" ignore-if-null="true"/> |
| <condition-expr field-name="lotId" from-field="parameters.lotId" ignore-if-empty="true" ignore-if-null="true"/> |
| <condition-expr field-name="quantityOnHandTotal" operator="greater" value="0.0"/> |
| <condition-expr field-name="locationSeqId" operator="equals" from-field="nullField"/> |
| <condition-expr field-name="statusId" operator="not-equals" value="INV_NS_DEFECTIVE"/> |
| <condition-expr field-name="statusId" operator="not-equals" value="INV_DEFECTIVE"/> |
| </condition-list> |
| <order-by field-name="${orderByString}"/> |
| </entity-condition> |
| <iterate entry="inventoryItem" list="inventoryItems"> |
| <if> |
| <condition> |
| <and> |
| <if-compare field="parameters.quantityNotReserved" operator="greater" value="0" type="Double"/> |
| <if-empty field="inventoryItem.locationSeqId"/> |
| </and> |
| </condition> |
| <then> |
| <call-simple-method method-name="reserveForInventoryItemInline"/> |
| </then> |
| </if> |
| </iterate> |
| </if-compare> |
| |
| <!-- |
| if inventory is not required for purchase and quantityNotReserved != 0: |
| - subtract the remaining quantityNotReserved from the availableToPromise of the last non-serialized inventory item |
| - or if none was found create a non-ser InventoryItem with availableToPromise = -quantityNotReserved |
| --> |
| <if-compare field="parameters.quantityNotReserved" operator="not-equals" value="0" type="BigDecimal"> |
| <if-compare field="parameters.requireInventory" operator="equals" value="Y"> |
| <!-- use this else pattern to accomplish the anything but Y logic, ie if not specified default to inventory NOT required --> |
| <else> |
| <if-not-empty field="lastNonSerInventoryItem"> |
| <!-- subtract from quantityNotReserved from the availableToPromise of existing inventory item --> |
| <!-- instead of updating InventoryItem, add an InventoryItemDetail --> |
| <set from-field="lastNonSerInventoryItem.inventoryItemId" field="createDetailMap.inventoryItemId"/> |
| <set from-field="parameters.orderId" field="createDetailMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="createDetailMap.orderItemSeqId"/> |
| <set from-field="parameters.shipGroupSeqId" field="createDetailMap.shipGroupSeqId"/> |
| <calculate field="createDetailMap.availableToPromiseDiff" decimal-scale="6"> |
| <calcop field="parameters.quantityNotReserved" operator="negative"/> |
| </calculate> |
| |
| <if-not-empty field="parameters.reserveReasonEnumId"><set from-field="parameters.reserveReasonEnumId" field="createDetailMap.reasonEnumId"/></if-not-empty> |
| <call-service service-name="createInventoryItemDetail" in-map-name="createDetailMap"/> |
| <clear-field field="createDetailMap"/> |
| |
| <!-- get the promiseDatetime --> |
| <get-related-one value-field="lastNonSerInventoryItem" relation-name="ProductFacility" to-value-field="productFacility"/> |
| <clear-field field="daysToShip"/> |
| <set field="daysToShip" from-field="productFacility.daysToShip"/> |
| <if-empty field="daysToShip"> |
| <!-- if the product does not have its own days to ship, use Facility.defaultDaysToShip, if not then use 30 days as a USA industry default --> |
| <if-not-empty field="facility.defaultDaysToShip"> |
| <set field="daysToShip" from-field="facility.defaultDaysToShip" type="Long"/> |
| <else> |
| <set field="daysToShip" value="30" type="Long"/> |
| </else> |
| </if-not-empty> |
| </if-empty> |
| <!-- TODO: Convert this to a <set-calendar> operation --> |
| <call-bsh><![CDATA[ |
| java.sql.Timestamp orderDate = orderHeader.getTimestamp("orderDate"); |
| com.ibm.icu.util.Calendar cal = com.ibm.icu.util.Calendar.getInstance(); |
| cal.setTimeInMillis(orderDate.getTime()); |
| cal.add(com.ibm.icu.util.Calendar.DAY_OF_YEAR, daysToShip.intValue()); |
| return org.ofbiz.base.util.UtilMisc.toMap("promisedDatetime", new java.sql.Timestamp(cal.getTimeInMillis())); |
| ]]></call-bsh> |
| |
| <!-- create or update OrderItemShipGrpInvRes record --> |
| <set from-field="parameters.orderId" field="reserveOisgirMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="reserveOisgirMap.orderItemSeqId"/> |
| <set from-field="parameters.shipGroupSeqId" field="reserveOisgirMap.shipGroupSeqId"/> |
| <set from-field="lastNonSerInventoryItem.inventoryItemId" field="reserveOisgirMap.inventoryItemId"/> |
| <set from-field="parameters.reserveOrderEnumId" field="reserveOisgirMap.reserveOrderEnumId"/> |
| <set from-field="parameters.quantityNotReserved" field="reserveOisgirMap.quantity" type="BigDecimal"/> |
| <set from-field="parameters.quantityNotReserved" field="reserveOisgirMap.quantityNotAvailable" type="BigDecimal"/> |
| <set from-field="parameters.reservedDatetime" field="reserveOisgirMap.reservedDatetime"/> |
| <set from-field="promisedDatetime" field="reserveOisgirMap.promisedDatetime"/> |
| <set from-field="parameters.sequenceId" field="reserveOisgirMap.sequenceId"/> |
| <set from-field="parameters.priority" field="reserveOisgirMap.priority"/> |
| <call-service service-name="reserveOrderItemInventory" in-map-name="reserveOisgirMap"/> |
| <clear-field field="reserveOisgirMap"/> |
| <else> |
| <!-- no non-ser inv item, create a non-ser InventoryItem with availableToPromise = -quantityNotReserved --> |
| <clear-field field="createInventoryItemInMap"/> |
| <clear-field field="createInventoryItemOutMap"/> |
| <!-- the createInventoryItem service is run by the the system user here --> |
| <entity-one entity-name="UserLogin" value-field="permUserLogin"> |
| <field-map field-name="userLoginId" value="system"/> |
| </entity-one> |
| <set from-field="parameters.productId" field="createInventoryItemInMap.productId"/> |
| <set from-field="parameters.facilityId" field="createInventoryItemInMap.facilityId"/> |
| <set from-field="parameters.containerId" field="createInventoryItemInMap.containerId"/> |
| <set value="NON_SERIAL_INV_ITEM" field="createInventoryItemInMap.inventoryItemTypeId"/> |
| <set from-field="permUserLogin" field="createInventoryItemInMap.userLogin"/> |
| <call-service service-name="createInventoryItem" in-map-name="createInventoryItemInMap" include-user-login="false"> |
| <result-to-field result-name="inventoryItemId" field="createInventoryItemOutMap.inventoryItemId"/> |
| </call-service> |
| <entity-one entity-name="InventoryItem" value-field="newNonSerInventoryItem"> |
| <field-map field-name="inventoryItemId" from-field="createInventoryItemOutMap.inventoryItemId"/> |
| </entity-one> |
| |
| <!-- also create a detail record with the quantities --> |
| <set from-field="newNonSerInventoryItem.inventoryItemId" field="createDetailMap.inventoryItemId"/> |
| <set from-field="parameters.orderId" field="createDetailMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="createDetailMap.orderItemSeqId"/> |
| <set from-field="parameters.shipGroupSeqId" field="createDetailMap.shipGroupSeqId"/> |
| <calculate field="createDetailMap.availableToPromiseDiff" decimal-scale="6"> |
| <calcop field="parameters.quantityNotReserved" operator="negative"/> |
| </calculate> |
| <if-not-empty field="parameters.reserveReasonEnumId"><set from-field="parameters.reserveReasonEnumId" field="createDetailMap.reasonEnumId"/></if-not-empty> |
| <call-service service-name="createInventoryItemDetail" in-map-name="createDetailMap"/> |
| <clear-field field="createDetailMap"/> |
| |
| <!-- get the promiseDatetime --> |
| <get-related-one value-field="newNonSerInventoryItem" relation-name="ProductFacility" to-value-field="productFacility"/> |
| <clear-field field="daysToShip"/> |
| <set field="daysToShip" from-field="productFacility.daysToShip"/> |
| <if-empty field="daysToShip"> |
| <!-- if the product does not have its own days to ship, use Facility.defaultDaysToShip, if not then use 30 days as a USA industry default --> |
| <if-not-empty field="facility.defaultDaysToShip"> |
| <set field="daysToShip" from-field="facility.defaultDaysToShip" type="Long"/> |
| <else> |
| <set field="daysToShip" value="30" type="Long"/> |
| </else> |
| </if-not-empty> |
| </if-empty> |
| <!-- TODO: Convert this to a <set-calendar> operation --> |
| <call-bsh><![CDATA[ |
| java.sql.Timestamp orderDate = orderHeader.getTimestamp("orderDate"); |
| com.ibm.icu.util.Calendar cal = com.ibm.icu.util.Calendar.getInstance(); |
| cal.setTimeInMillis(orderDate.getTime()); |
| cal.add(com.ibm.icu.util.Calendar.DAY_OF_YEAR, daysToShip.intValue()); |
| return org.ofbiz.base.util.UtilMisc.toMap("promisedDatetime", new java.sql.Timestamp(cal.getTimeInMillis())); |
| ]]></call-bsh> |
| |
| <!-- create OrderItemShipGrpInvRes record --> |
| <set from-field="parameters.orderId" field="reserveOisgirMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="reserveOisgirMap.orderItemSeqId"/> |
| <set from-field="parameters.shipGroupSeqId" field="reserveOisgirMap.shipGroupSeqId"/> |
| <set from-field="newNonSerInventoryItem.inventoryItemId" field="reserveOisgirMap.inventoryItemId"/> |
| <set from-field="parameters.reserveOrderEnumId" field="reserveOisgirMap.reserveOrderEnumId"/> |
| <set from-field="parameters.quantityNotReserved" field="reserveOisgirMap.quantity" type="BigDecimal"/> |
| <set from-field="parameters.quantityNotReserved" field="reserveOisgirMap.quantityNotAvailable" type="BigDecimal"/> |
| <set from-field="parameters.reservedDatetime" field="reserveOisgirMap.reservedDatetime"/> |
| <set from-field="promisedDatetime" field="reserveOisgirMap.promisedDatetime"/> |
| <set from-field="parameters.sequenceId" field="reserveOisgirMap.sequenceId"/> |
| <set from-field="parameters.priority" field="reserveOisgirMap.priority"/> |
| <call-service service-name="reserveOrderItemInventory" in-map-name="reserveOisgirMap"/> |
| <clear-field field="reserveOisgirMap"/> |
| </else> |
| </if-not-empty> |
| |
| <set field="parameters.quantityNotReserved" value="0" type="BigDecimal"/> |
| </else> |
| </if-compare> |
| </if-compare> |
| </else> |
| </if-compare> |
| |
| <field-to-result field="parameters.quantityNotReserved" result-name="quantityNotReserved"/> |
| </simple-method> |
| |
| <simple-method method-name="reserveAnInventoryItem" short-description="Reserve a Specific Serialized InventoryItem"> |
| <!-- |
| Well the InventoryItem I want to reserve is already reserved, But my customer wants just this inventoryItem. |
| Let me find the reservation on this inventory, cancel it and re-reserve something else for the other order. |
| This way I'll get what I want and the other orderItem will also have a similar thing to issue. |
| --> |
| <entity-one entity-name="InventoryItem" value-field="inventoryItem"/> |
| <set field="facilityId" from-field="inventoryItem.facilityId"/> |
| <set field="inventoryReservationLookUp.inventoryItemId" from-field="inventoryItem.inventoryItemId"/> |
| <if-compare value="NON_SERIAL_INV_ITEM" operator="equals" field="inventoryItem.inventoryItemTypeId"> |
| <!-- Reservation was holding on to a InventoryItem shadow, Reduce number of Shadow's available --> |
| <set from-field="inventoryItem.inventoryItemId" field="createDetailMap.inventoryItemId"/> |
| <set from-field="parameters.orderId" field="createDetailMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="createDetailMap.orderItemSeqId"/> |
| <set field="createDetailMap.quantityOnHandDiff" value="-1" type="BigDecimal"/> |
| <set field="createDetailMap.availableToPromiseDiff" value="-1" type="BigDecimal"/> |
| <call-service service-name="createInventoryItemDetail" in-map-name="createDetailMap"/> |
| </if-compare> |
| <set-service-fields map="parameters" to-map="cancelOrderItemShipGrpInvResMap" service-name="cancelOrderItemShipGrpInvRes"/> |
| <set field="cancelOrderItemShipGrpInvResMap.cancelQuantity" from-field="parameters.quantity"/> |
| <!-- Step 1 cancel our reservation, we'll later reserve Inventory we want--> |
| <call-service service-name="cancelOrderItemShipGrpInvRes" in-map-name="cancelOrderItemShipGrpInvResMap"/> |
| <!-- Lets find the inventory to reserve --> |
| <entity-and entity-name="InventoryItem" list="inventoryItems"> |
| <field-map field-name="productId" from-field="parameters.productId"/> |
| <field-map field-name="inventoryItemTypeId" value="SERIALIZED_INV_ITEM"/> |
| <field-map field-name="serialNumber" from-field="parameters.serialNumber"/> |
| </entity-and> |
| <clear-field field="inventoryItem"/> |
| <first-from-list list="inventoryItems" entry="inventoryItem"/> |
| <!-- If no inventory item found for the serial number, than create it --> |
| <if-empty field="inventoryItem"> |
| <set field="receiveCtx.productId" from-field="parameters.productId"/> |
| <set field="receiveCtx.facilityId" from-field="facilityId"/> |
| <set field="receiveCtx.quantityAccepted" from-field="parameters.quantity"/> |
| <set field="receiveCtx.quantityRejected" value="0" type="BigDecimal"/> |
| <set field="receiveCtx.inventoryItemTypeId" value="SERIALIZED_INV_ITEM"/> |
| <set field="receiveCtx.serialNumber" from-field="parameters.serialNumber"/> |
| <call-service service-name="receiveInventoryProduct" in-map-name="receiveCtx"> |
| <result-to-field result-name="inventoryItemId" field="inventoryItemLookupPk.inventoryItemId"/> |
| </call-service> |
| <find-by-primary-key entity-name="InventoryItem" map="inventoryItemLookupPk" value-field="inventoryItem"/> |
| </if-empty> |
| <!--Step 2 Check if its reserved for other order --> |
| <set field="inventoryReservationLookUp.inventoryItemId" from-field="inventoryItem.inventoryItemId"/> |
| <find-by-and map="inventoryReservationLookUp" list="invReservations" entity-name="OrderItemShipGrpInvRes"/> |
| <first-from-list entry="inventoryItemReservation" list="invReservations"/> |
| <if-not-empty field="inventoryItemReservation"> |
| <set-service-fields map="inventoryItemReservation" to-map="cancelOrderItemShipGrpInvResMap" service-name="cancelOrderItemShipGrpInvRes"/> |
| <call-service service-name="cancelOrderItemShipGrpInvRes" in-map-name="cancelOrderItemShipGrpInvResMap"/> |
| <!-- Hold our inventoryItem --> |
| <refresh-value value-field="inventoryItem"/> |
| <set value="INV_PROMISED" field="inventoryItem.statusId"/> |
| <store-value value-field="inventoryItem"/> |
| <!-- get something else for other order --> |
| <!-- store OrderItemShipGrpInvRes record --> |
| <set from-field="inventoryItemReservation.orderId" field="reserveOisgirMap.orderId"/> |
| <set from-field="parameters.productId" field="reserveOisgirMap.productId"/> |
| <set from-field="inventoryItemReservation.orderItemSeqId" field="reserveOisgirMap.orderItemSeqId"/> |
| <set from-field="inventoryItemReservation.shipGroupSeqId" field="reserveOisgirMap.shipGroupSeqId"/> |
| <set from-field="inventoryItemReservation.reserveOrderEnumId" field="reserveOisgirMap.reserveOrderEnumId"/> |
| <set from-field="inventoryItemReservation.reservedDatetime" field="reserveOisgirMap.reservedDatetime"/> |
| <set field="reserveOisgirMap.quantity" value="1" type="BigDecimal"/> |
| <set field="reserveOisgirMap.requireInventory" from-field="parameters.requireInventory"/> |
| <if-not-empty field="inventoryItemReservation.sequenceId"> |
| <set field="reserveOisgirMap.sequenceId" from-field="inventoryItemReservation.sequenceId"/> |
| </if-not-empty> |
| <set from-field="parameters.priority" field="reserveOisgirMap.priority"/> |
| <call-service service-name="reserveProductInventory" in-map-name="reserveOisgirMap"/> |
| <clear-field field="reserveOisgirMap"/> |
| </if-not-empty> |
| |
| <!-- Step 3 Now Reserve for our order--> |
| <if-compare value="INV_AVAILABLE" operator="equals" field="inventoryItem.statusId"> |
| <!-- change status on inventoryItem --> |
| <set value="INV_PROMISED" field="inventoryItem.statusId"/> |
| <store-value value-field="inventoryItem"/> |
| </if-compare> |
| <set from-field="parameters.orderId" field="reserveOisgirMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="reserveOisgirMap.orderItemSeqId"/> |
| <set from-field="parameters.shipGroupSeqId" field="reserveOisgirMap.shipGroupSeqId"/> |
| <set from-field="inventoryItem.inventoryItemId" field="reserveOisgirMap.inventoryItemId"/> |
| <set from-field="parameters.reserveOrderEnumId" field="reserveOisgirMap.reserveOrderEnumId"/> |
| <set from-field="parameters.reservedDatetime" field="reserveOisgirMap.reservedDatetime"/> |
| <set from-field="promisedDatetime" field="reserveOisgirMap.promisedDatetime"/> |
| <set field="reserveOisgirMap.quantity" value="1" type="BigDecimal"/> |
| <if-not-empty field="parameters.sequenceId"> |
| <set field="reserveOisgirMap.sequenceId" from-field="parameters.sequenceId"/> |
| </if-not-empty> |
| <!-- store OrderItemShipGrpInvRes record --> |
| <set from-field="parameters.priority" field="reserveOisgirMap.priority"/> |
| <call-service service-name="reserveOrderItemInventory" in-map-name="reserveOisgirMap"/> |
| <clear-field field="reserveOisgirMap"/> |
| <field-to-result field="inventoryItem.inventoryItemId" result-name="inventoryItemId"/> |
| </simple-method> |
| |
| <simple-method method-name="reserveForInventoryItemInline" short-description="Does a reservation for one InventoryItem, meant to be called in-line"> |
| <!-- only do something with this inventoryItem if there is more inventory to reserve --> |
| <if-compare field="parameters.quantityNotReserved" 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 value="INV_PROMISED" field="inventoryItem.statusId"/> |
| <store-value value-field="inventoryItem"/> |
| |
| <!-- store OrderItemShipGrpInvRes record --> |
| <call-simple-method method-name="getPromisedDateTime"/> |
| <set from-field="parameters.orderId" field="reserveOisgirMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="reserveOisgirMap.orderItemSeqId"/> |
| <set from-field="parameters.shipGroupSeqId" field="reserveOisgirMap.shipGroupSeqId"/> |
| <set from-field="inventoryItem.inventoryItemId" field="reserveOisgirMap.inventoryItemId"/> |
| <set from-field="parameters.reserveOrderEnumId" field="reserveOisgirMap.reserveOrderEnumId"/> |
| <set from-field="parameters.reservedDatetime" field="reserveOisgirMap.reservedDatetime"/> |
| <set from-field="promisedDatetime" field="reserveOisgirMap.promisedDatetime"/> |
| <set field="reserveOisgirMap.quantity" value="1" type="BigDecimal"/> |
| <if-not-empty field="parameters.sequenceId"> |
| <set field="reserveOisgirMap.sequenceId" from-field="parameters.sequenceId"/> |
| </if-not-empty> |
| <call-service service-name="reserveOrderItemInventory" in-map-name="reserveOisgirMap"/> |
| <clear-field field="reserveOisgirMap"/> |
| |
| <calculate field="parameters.quantityNotReserved"> |
| <calcop field="parameters.quantityNotReserved" operator="subtract"><number value="1.0"/></calcop> |
| </calculate> |
| </if-compare> |
| </if-compare> |
| <if-compare field="inventoryItem.inventoryItemTypeId" operator="equals" value="NON_SERIAL_INV_ITEM"> |
| <!-- check reasonenumId reserve for ebay inventory --> |
| <if-not-empty field="parameters.reserveReasonEnumId"> |
| <if-compare field="parameters.reserveReasonEnumId" value="EBAY_INV_RES" operator="equals"> |
| <set field="ebayReserveReasonEnumId" from-field="parameters.reserveReasonEnumId"/> |
| </if-compare> |
| </if-not-empty> |
| <!-- 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> |
| <if-compare field="inventoryItem.statusId" operator="not-equals" value="INV_NS_ON_HOLD"/> |
| <if-compare field="inventoryItem.statusId" operator="not-equals" value="INV_NS_DEFECTIVE"/> |
| <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.quantityNotReserved" to-field="inventoryItem.availableToPromiseTotal" operator="greater" type="BigDecimal"> |
| <set from-field="inventoryItem.availableToPromiseTotal" field="parameters.deductAmount"/> |
| <else> |
| <set from-field="parameters.quantityNotReserved" field="parameters.deductAmount"/> |
| </else> |
| </if-compare-field> |
| |
| <!-- instead of updating InventoryItem, add an InventoryItemDetail --> |
| <set from-field="inventoryItem.inventoryItemId" field="createDetailMap.inventoryItemId"/> |
| <set from-field="parameters.orderId" field="createDetailMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="createDetailMap.orderItemSeqId"/> |
| <calculate field="createDetailMap.availableToPromiseDiff" decimal-scale="6"> |
| <calcop field="parameters.deductAmount" operator="negative"/> |
| </calculate> |
| <if-not-empty field="ebayReserveReasonEnumId"><set from-field="parameters.reserveReasonEnumId" field="createDetailMap.reasonEnumId"/></if-not-empty> |
| <call-service service-name="createInventoryItemDetail" in-map-name="createDetailMap"/> |
| <clear-field field="createDetailMap"/> |
| |
| <!-- create OrderItemShipGrpInvRes record and check for reserved from ebay don't need shipgroup--> |
| <if-empty field="ebayReserveReasonEnumId"> |
| <call-simple-method method-name="getPromisedDateTime"/> |
| <set from-field="parameters.orderId" field="reserveOisgirMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="reserveOisgirMap.orderItemSeqId"/> |
| <set from-field="parameters.shipGroupSeqId" field="reserveOisgirMap.shipGroupSeqId"/> |
| <set from-field="inventoryItem.inventoryItemId" field="reserveOisgirMap.inventoryItemId"/> |
| <set from-field="parameters.reserveOrderEnumId" field="reserveOisgirMap.reserveOrderEnumId"/> |
| <set from-field="parameters.reservedDatetime" field="reserveOisgirMap.reservedDatetime"/> |
| <set from-field="parameters.deductAmount" field="reserveOisgirMap.quantity" type="BigDecimal"/> |
| <set from-field="promisedDatetime" field="reserveOisgirMap.promisedDatetime"/> |
| <set from-field="parameters.priority" field="reserveOisgirMap.priority"/> |
| <if-not-empty field="parameters.sequenceId"> |
| <set field="reserveOisgirMap.sequenceId" from-field="parameters.sequenceId"/> |
| </if-not-empty> |
| <call-service service-name="reserveOrderItemInventory" in-map-name="reserveOisgirMap"/> |
| <clear-field field="reserveOisgirMap"/> |
| </if-empty> |
| <calculate field="parameters.quantityNotReserved" decimal-scale="6"> |
| <calcop operator="subtract" field="parameters.quantityNotReserved"> |
| <calcop operator="get" field="parameters.deductAmount"/> |
| </calcop> |
| </calculate> |
| </then> |
| </if> |
| <!-- keep track of the last non-serialized inventory item for use if inventory is not required for purchase --> |
| <!-- use env variable named lastNonSerInventoryItem --> |
| <set from-field="inventoryItem" field="lastNonSerInventoryItem"/> |
| </if-compare> |
| </if-compare> |
| </simple-method> |
| |
| <simple-method method-name="getPromisedDateTime" short-description="Get Inventory Promised Date/Time"> |
| <!-- get the promiseDatetime --> |
| <get-related-one value-field="inventoryItem" relation-name="ProductFacility" to-value-field="productFacility"/> |
| <set field="daysToShip" from-field="productFacility.daysToShip"/> |
| <if-empty field="daysToShip"> |
| <!-- if the product does not have its own days to ship, use Facility.defaultDaysToShip, if not then use 30 days as a USA industry default --> |
| <set field="daysToShip" from-field="facility.defaultDaysToShip" type="Long"/> |
| </if-empty> |
| <if-empty field="daysToShip"> |
| <set field="daysToShip" value="30" type="Long"/> |
| </if-empty> |
| <!-- TODO: Convert this to a <set-calendar> operation --> |
| <call-bsh><![CDATA[ |
| java.sql.Timestamp orderDate = orderHeader.getTimestamp("orderDate"); |
| com.ibm.icu.util.Calendar cal = com.ibm.icu.util.Calendar.getInstance(); |
| cal.setTimeInMillis(orderDate.getTime()); |
| cal.add(com.ibm.icu.util.Calendar.DAY_OF_YEAR, daysToShip.intValue()); |
| return org.ofbiz.base.util.UtilMisc.toMap("promisedDatetime", new java.sql.Timestamp(cal.getTimeInMillis())); |
| ]]></call-bsh> |
| </simple-method> |
| |
| <simple-method method-name="reserveOrderItemInventory" short-description="Reserve Order Item Inventory"> |
| <entity-one entity-name="OrderItemShipGrpInvRes" value-field="checkOisgirEntity"/> |
| |
| <entity-one entity-name="OrderItem" value-field="orderItem"/> |
| <set field="parameters.promisedDatetime" from-field="orderItem.shipBeforeDate"/> |
| <set field="parameters.currentPromisedDate" from-field="orderItem.shipBeforeDate"/> |
| |
| <if-empty field="checkOisgirEntity"> |
| <!-- create OrderItemShipGrpInvRes record --> |
| <make-value entity-name="OrderItemShipGrpInvRes" value-field="newOisgirEntity"/> |
| <set-pk-fields map="parameters" value-field="newOisgirEntity"/> |
| <set-nonpk-fields map="parameters" value-field="newOisgirEntity"/> |
| <now-timestamp field="nowTimestamp"/> |
| <set from-field="nowTimestamp" field="newOisgirEntity.createdDatetime"/> |
| <set from-field="parameters.priority" field="newOisgirEntity.priority"/> |
| <if-empty field="newOisgirEntity.reservedDatetime"> |
| <set from-field="nowTimestamp" field="newOisgirEntity.reservedDatetime"/> |
| </if-empty> |
| <create-value value-field="newOisgirEntity"/> |
| <else> |
| <calculate field="checkOisgirEntity.quantity" decimal-scale="6"> |
| <calcop operator="add" field="checkOisgirEntity.quantity"/> |
| <calcop operator="add" field="parameters.quantity"/> |
| </calculate> |
| <calculate field="checkOisgirEntity.quantityNotAvailable" decimal-scale="6"> |
| <calcop operator="add" field="checkOisgirEntity.quantityNotAvailable"/> |
| <calcop operator="add" field="parameters.quantityNotAvailable"/> |
| </calculate> |
| <store-value value-field="checkOisgirEntity"/> |
| </else> |
| </if-empty> |
| </simple-method> |
| |
| <simple-method method-name="cancelOrderInventoryReservation" short-description="Cancel Inventory Reservation for an Order"> |
| <!-- |
| Iterates through each OrderItemShipGrpInvRes on each OrderItem for the order |
| with the given orderId and cancels the reservation by removing the |
| OrderItemShipGrpInvRes and incrementing the corresponding non-serialized |
| inventoryItem's availableToPromise quantity, or setting the status of the |
| corresponding serialized inventoryItem to available. |
| --> |
| <set from-field="parameters.orderId" field="oisgirListLookupMap.orderId"/> |
| <if-not-empty field="parameters.orderItemSeqId"> |
| <set from-field="parameters.orderItemSeqId" field="oisgirListLookupMap.orderItemSeqId"/> |
| <log level="verbose" message="OISGIR Cancel for single item : ${oisgirListLookupMap}"/> |
| </if-not-empty> |
| <if-not-empty field="parameters.shipGroupSeqId"> |
| <set from-field="parameters.shipGroupSeqId" field="oisgirListLookupMap.shipGroupSeqId"/> |
| <log level="verbose" message="OISGIR Cancel for single item : ${oisgirListLookupMap}"/> |
| </if-not-empty> |
| <find-by-and entity-name="OrderItemShipGrpInvRes" map="oisgirListLookupMap" list="oisgirList" use-cache="false"/> |
| <iterate entry="oisgir" list="oisgirList"> |
| <set from-field="oisgir.orderId" field="cancelOisgirMap.orderId"/> |
| <set from-field="oisgir.orderItemSeqId" field="cancelOisgirMap.orderItemSeqId"/> |
| <set from-field="oisgir.shipGroupSeqId" field="cancelOisgirMap.shipGroupSeqId"/> |
| <set from-field="oisgir.inventoryItemId" field="cancelOisgirMap.inventoryItemId"/> |
| <call-service service-name="cancelOrderItemShipGrpInvRes" in-map-name="cancelOisgirMap"/> |
| <!-- checkDecomposeInventoryItem service is called to decompose a marketing package (if the product is a mkt pkg) --> |
| <set from-field="oisgir.inventoryItemId" field="checkDiiMap.inventoryItemId"/> |
| <call-service service-name="checkDecomposeInventoryItem" in-map-name="checkDiiMap"/> |
| </iterate> |
| </simple-method> |
| <simple-method method-name="cancelOrderItemInvResQty" short-description="Cancel Inventory Reservation Qty For An Item"> |
| <!-- |
| This will cancel the specified amount by looking through the reservations in order and cancelling |
| just the right amount |
| --> |
| <if-empty field="parameters.cancelQuantity"> |
| <set from-field="parameters.orderId" field="cancelMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="cancelMap.orderItemSeqId"/> |
| <set from-field="parameters.shipGroupSeqId" field="cancelMap.shipGroupSeqId"/> |
| <call-service service-name="cancelOrderInventoryReservation" in-map-name="cancelMap"/> |
| </if-empty> |
| <if-not-empty field="parameters.cancelQuantity"> |
| <set from-field="parameters.cancelQuantity" field="toCancelAmount"/> |
| |
| <set from-field="parameters.orderId" field="oisgirListLookupMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="oisgirListLookupMap.orderItemSeqId"/> |
| <set from-field="parameters.shipGroupSeqId" field="oisgirListLookupMap.shipGroupSeqId"/> |
| <find-by-and entity-name="OrderItemShipGrpInvRes" map="oisgirListLookupMap" list="oisgirList" use-cache="false"/> |
| <iterate entry="oisgir" list="oisgirList"> |
| <if-compare field="toCancelAmount" operator="greater" value="0" type="BigDecimal"> |
| <if-compare-field field="oisgir.quantity" to-field="toCancelAmount" operator="greater-equals" type="BigDecimal"> |
| <set from-field="toCancelAmount" field="cancelOisgirMap.cancelQuantity"/> |
| </if-compare-field> |
| <if-compare-field field="oisgir.quantity" to-field="toCancelAmount" operator="less" type="BigDecimal"> |
| <set from-field="oisgir.quantity" field="cancelOisgirMap.cancelQuantity"/> |
| </if-compare-field> |
| |
| <set from-field="oisgir.orderId" field="cancelOisgirMap.orderId"/> |
| <set from-field="oisgir.orderItemSeqId" field="cancelOisgirMap.orderItemSeqId"/> |
| <set from-field="oisgir.shipGroupSeqId" field="cancelOisgirMap.shipGroupSeqId"/> |
| <set from-field="oisgir.inventoryItemId" field="cancelOisgirMap.inventoryItemId"/> |
| <call-service service-name="cancelOrderItemShipGrpInvRes" in-map-name="cancelOisgirMap"/> |
| <!-- checkDecomposeInventoryItem service is called to decompose a marketing package (if the product is a mkt pkg) --> |
| <set from-field="oisgir.inventoryItemId" field="checkDiiMap.inventoryItemId"/> |
| <call-service service-name="checkDecomposeInventoryItem" in-map-name="checkDiiMap"/> |
| <!-- update the toCancelAmount --> |
| <calculate field="toCancelAmount" decimal-scale="6"> |
| <calcop operator="subtract" field="toCancelAmount"> |
| <calcop operator="get" field="cancelOisgirMap.cancelQuantity"/> |
| </calcop> |
| </calculate> |
| </if-compare> |
| </iterate> |
| </if-not-empty> |
| </simple-method> |
| <simple-method method-name="cancelOrderItemShipGrpInvRes" short-description="Cancel An Inventory Reservation"> |
| <entity-one entity-name="OrderItemShipGrpInvRes" value-field="orderItemShipGrpInvRes"/> |
| <get-related-one relation-name="InventoryItem" value-field="orderItemShipGrpInvRes" to-value-field="inventoryItem"/> |
| <if-compare value="SERIALIZED_INV_ITEM" operator="equals" field="inventoryItem.inventoryItemTypeId"> |
| <log level="verbose" message="Serialized inventory re-enabled."/> |
| <set value="INV_AVAILABLE" field="inventoryItem.statusId"/> |
| <remove-value value-field="orderItemShipGrpInvRes"/> |
| <store-value value-field="inventoryItem"/> |
| </if-compare> |
| <if-compare value="NON_SERIAL_INV_ITEM" operator="equals" field="inventoryItem.inventoryItemTypeId"> |
| <log level="verbose" message="Non-Serialized inventory item incrementing availableToPromise."/> |
| <set from-field="parameters.cancelQuantity" field="cancelQuantity"/> |
| <if-empty field="cancelQuantity"> |
| <set from-field="orderItemShipGrpInvRes.quantity" field="cancelQuantity"/> |
| </if-empty> |
| |
| <!-- instead of updating InventoryItem, add an InventoryItemDetail --> |
| <set from-field="inventoryItem.inventoryItemId" field="createDetailMap.inventoryItemId"/> |
| <set from-field="parameters.orderId" field="createDetailMap.orderId"/> |
| <set from-field="parameters.orderItemSeqId" field="createDetailMap.orderItemSeqId"/> |
| <set from-field="parameters.shipGroupSeqId" field="createDetailMap.shipGroupSeqId"/> |
| <set from-field="cancelQuantity" field="createDetailMap.availableToPromiseDiff"/> |
| <call-service service-name="createInventoryItemDetail" in-map-name="createDetailMap"/> |
| <clear-field field="createDetailMap"/> |
| |
| <if-compare-field field="cancelQuantity" to-field="orderItemShipGrpInvRes.quantity" operator="less" type="BigDecimal"> |
| <calculate field="orderItemShipGrpInvRes.quantity" decimal-scale="6"> |
| <calcop operator="subtract" field="orderItemShipGrpInvRes.quantity"> |
| <calcop operator="get" field="cancelQuantity"/> |
| </calcop> |
| </calculate> |
| <store-value value-field="orderItemShipGrpInvRes"/> |
| <else> |
| <remove-value value-field="orderItemShipGrpInvRes"/> |
| </else> |
| </if-compare-field> |
| </if-compare> |
| </simple-method> |
| </simple-methods> |