You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by mr...@apache.org on 2026/10/26 15:44:43 UTC
(ofbiz-framework) branch release24.09 updated: Fix regressions in ShipmentReceiptServices and ProductFeatureServicesScript
This is an automated email from the ASF dual-hosted git repository.
mridulpathak pushed a commit to branch release24.09
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
The following commit(s) were added to refs/heads/release24.09 by this push:
new ef97472bdd Fix regressions in ShipmentReceiptServices and ProductFeatureServicesScript
ef97472bdd is described below
commit ef97472bddc194b0d03bc3c3ee4e4215339ece56
Author: Mridul Pathak <mr...@gmail.com>
AuthorDate: Thu Oct 22 18:04:59 2026 +0530
Fix regressions in ShipmentReceiptServices and ProductFeatureServicesScript
Four regressions from the minilang conversion:
- cancelReceivedItems skips the inventory item steps for a receipt that has no inventory item.
- quickReceiveReturn adds the receive fields to the existing receiveCtx instead of replacing it, so the unitCost from getReturnItemInitialCost reaches receiveInventoryProduct.
- updateIssuanceShipmentAndPoOnReceiveInventory converts orderCurrencyUnitPrice or unitCost to a BigDecimal with the user locale and leaves the order item price untouched when neither is given.
- applyFeatureToProductFromTypeAndCode only falls back to the feature default sequence number when sequenceNum is null, so an explicit 0 is kept.
---
.../feature/ProductFeatureServicesScript.groovy | 4 +-
.../shipment/ShipmentReceiptServices.groovy | 66 +++++++++++-----------
2 files changed, 37 insertions(+), 33 deletions(-)
diff --git a/applications/product/src/main/groovy/org/apache/ofbiz/product/product/feature/ProductFeatureServicesScript.groovy b/applications/product/src/main/groovy/org/apache/ofbiz/product/product/feature/ProductFeatureServicesScript.groovy
index 82bb585d2e..50cc42e8c0 100644
--- a/applications/product/src/main/groovy/org/apache/ofbiz/product/product/feature/ProductFeatureServicesScript.groovy
+++ b/applications/product/src/main/groovy/org/apache/ofbiz/product/product/feature/ProductFeatureServicesScript.groovy
@@ -34,7 +34,9 @@ Map applyFeatureToProductFromTypeAndCode() {
for (GenericValue productFeature : productFeatures) {
Map applyFeatureContext = [*: parameters]
applyFeatureContext.productFeatureId = productFeature.productFeatureId
- applyFeatureContext.sequenceNum = applyFeatureContext.sequenceNum ?: productFeature.defaultSequenceNum
+ if (applyFeatureContext.sequenceNum == null) {
+ applyFeatureContext.sequenceNum = productFeature.defaultSequenceNum
+ }
run service: 'applyFeatureToProduct', with: applyFeatureContext
}
return success()
diff --git a/applications/product/src/main/groovy/org/apache/ofbiz/product/shipment/ShipmentReceiptServices.groovy b/applications/product/src/main/groovy/org/apache/ofbiz/product/shipment/ShipmentReceiptServices.groovy
index 14387bd364..78b22f486a 100644
--- a/applications/product/src/main/groovy/org/apache/ofbiz/product/shipment/ShipmentReceiptServices.groovy
+++ b/applications/product/src/main/groovy/org/apache/ofbiz/product/shipment/ShipmentReceiptServices.groovy
@@ -21,6 +21,7 @@ package org.apache.ofbiz.product.shipment
import java.math.RoundingMode
import java.sql.Timestamp
+import org.apache.ofbiz.base.util.ObjectType
import org.apache.ofbiz.base.util.UtilDateTime
import org.apache.ofbiz.base.util.UtilProperties
import org.apache.ofbiz.entity.GenericValue
@@ -259,17 +260,17 @@ Map quickReceiveReturn() {
parameters.inventoryItemTypeId = 'SERIALIZED_INV_ITEM'
returnItem.returnQuantity = BigDecimal.ONE
}
- receiveCtx = [inventoryItemTypeId: parameters.inventoryItemTypeId,
- statusId: returnItem.expectedItemStatus,
- productId: returnItem.productId,
- returnItemSeqId: returnItem.returnItemSeqId,
- returnId: returnItem.returnId,
- quantityAccepted: returnItem.returnQuantity,
- facilityId: returnHeader.destinationFacilityId,
- shipmentId: shipmentId, // important: associate ShipmentReceipt with return shipment created
- comments: "Returned Item RA# ${returnItem.returnId}",
- datetimeReceived: nowTimestamp,
- quantityRejected: BigDecimal.ZERO
+ receiveCtx << [inventoryItemTypeId: parameters.inventoryItemTypeId,
+ statusId: returnItem.expectedItemStatus,
+ productId: returnItem.productId,
+ returnItemSeqId: returnItem.returnItemSeqId,
+ returnId: returnItem.returnId,
+ quantityAccepted: returnItem.returnQuantity,
+ facilityId: returnHeader.destinationFacilityId,
+ shipmentId: shipmentId, // important: associate ShipmentReceipt with return shipment created
+ comments: "Returned Item RA# ${returnItem.returnId}",
+ datetimeReceived: nowTimestamp,
+ quantityRejected: BigDecimal.ZERO
]
Map serviceResult = run service: 'receiveInventoryProduct', with: receiveCtx
result.successMessageList = serviceResult.successMessageList
@@ -310,14 +311,12 @@ BigDecimal getReceivedQuantityForOrderItem (GenericValue orderItem) {
*/
Map updateIssuanceShipmentAndPoOnReceiveInventory() {
GenericValue orderItem = from('OrderItem').where(parameters).queryOne()
- if (parameters.orderCurrencyUnitPrice) {
- if (parameters.orderCurrencyUnitPrice != orderItem.unitPrice) {
- orderItem.unitPrice = new BigDecimal (parameters.orderCurrencyUnitPrice)
- orderItem.store()
- }
- } else {
- if (parameters.unitCost != orderItem.unitPrice) {
- orderItem.unitPrice = parameters.unitCost
+ // orderCurrencyUnitPrice takes precedence over unitCost; both are Strings, an empty one leaves the price untouched
+ Object newUnitPriceValue = parameters.orderCurrencyUnitPrice ?: parameters.unitCost
+ if (newUnitPriceValue) {
+ BigDecimal newUnitPrice = ObjectType.simpleTypeOrObjectConvert(newUnitPriceValue, 'BigDecimal', null, locale)
+ if (newUnitPrice != orderItem.unitPrice) {
+ orderItem.unitPrice = newUnitPrice
orderItem.store()
}
}
@@ -392,20 +391,23 @@ Map cancelReceivedItems() {
shipmentReceipt.quantityRejected = 0.0
shipmentReceipt.store()
- // create record for InventoryItemDetail entity
+ // a receipt without accepted units has no inventory item (OFBIZ-13376), so there is nothing to zero out or balance
GenericValue inventoryItem = delegator.getRelatedOne('InventoryItem', shipmentReceipt, false)
- Map inventoryItemDetailMap = [inventoryItemId: inventoryItem.inventoryItemId]
- inventoryItemDetailMap.quantityOnHandDiff = inventoryItem.quantityOnHandTotal * (-1)
- inventoryItemDetailMap.availableToPromiseDiff = inventoryItem.availableToPromiseTotal * (-1)
- run service: 'createInventoryItemDetail', with: inventoryItemDetailMap
-
- // Balance the inventory item
- // balanceInventoryItems requires ORDERMGR_UPDATE; run as the "system" user since this is a trusted side
- // effect of an already-permitted shipment-receipt operation
- Map balanceInventoryItemMap = [inventoryItemId: inventoryItem.inventoryItemId,
- priorityOrderId: shipmentReceipt.orderId, priorityOrderItemSeqId: shipmentReceipt.orderItemSeqId,
- userLogin: from('UserLogin').where(userLoginId: 'system').cache().queryOne()]
- run service: 'balanceInventoryItems', with: balanceInventoryItemMap
+ if (inventoryItem) {
+ // create record for InventoryItemDetail entity
+ Map inventoryItemDetailMap = [inventoryItemId: inventoryItem.inventoryItemId]
+ inventoryItemDetailMap.quantityOnHandDiff = inventoryItem.quantityOnHandTotal * (-1)
+ inventoryItemDetailMap.availableToPromiseDiff = inventoryItem.availableToPromiseTotal * (-1)
+ run service: 'createInventoryItemDetail', with: inventoryItemDetailMap
+
+ // Balance the inventory item
+ // balanceInventoryItems requires ORDERMGR_UPDATE; run as the "system" user since this is a trusted side
+ // effect of an already-permitted shipment-receipt operation
+ Map balanceInventoryItemMap = [inventoryItemId: inventoryItem.inventoryItemId,
+ priorityOrderId: shipmentReceipt.orderId, priorityOrderItemSeqId: shipmentReceipt.orderItemSeqId,
+ userLogin: from('UserLogin').where(userLoginId: 'system').cache().queryOne()]
+ run service: 'balanceInventoryItems', with: balanceInventoryItemMap
+ }
// update the shipment status, if shipment was received
GenericValue shipment = delegator.getRelatedOne('Shipment', shipmentReceipt, false)