Fix null/empty value handling in order APIs

Wrap numeric fields with val() to prevent "can't cast empty string to number"
errors when database values are null or empty strings.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
John Mizerek 2026-01-23 21:30:13 -08:00
parent 5f3f5a7345
commit 6727f42194
4 changed files with 67 additions and 67 deletions

View file

@ -105,20 +105,20 @@
<cfset rows = []>
<cfloop query="qLI">
<cfset arrayAppend(rows, {
"OrderLineItemID": qLI.OrderLineItemID,
"OrderLineItemParentOrderLineItemID": qLI.OrderLineItemParentOrderLineItemID,
"OrderLineItemOrderID": qLI.OrderLineItemOrderID,
"OrderLineItemItemID": qLI.OrderLineItemItemID,
"OrderLineItemStatusID": qLI.OrderLineItemStatusID,
"OrderLineItemPrice": qLI.OrderLineItemPrice,
"OrderLineItemQuantity": qLI.OrderLineItemQuantity,
"OrderLineItemRemark": qLI.OrderLineItemRemark,
"OrderLineItemIsDeleted": qLI.OrderLineItemIsDeleted,
"OrderLineItemID": val(qLI.OrderLineItemID),
"OrderLineItemParentOrderLineItemID": val(qLI.OrderLineItemParentOrderLineItemID),
"OrderLineItemOrderID": val(qLI.OrderLineItemOrderID),
"OrderLineItemItemID": val(qLI.OrderLineItemItemID),
"OrderLineItemStatusID": val(qLI.OrderLineItemStatusID),
"OrderLineItemPrice": val(qLI.OrderLineItemPrice),
"OrderLineItemQuantity": val(qLI.OrderLineItemQuantity),
"OrderLineItemRemark": qLI.OrderLineItemRemark ?: "",
"OrderLineItemIsDeleted": val(qLI.OrderLineItemIsDeleted),
"OrderLineItemAddedOn": qLI.OrderLineItemAddedOn,
"ItemName": qLI.ItemName,
"ItemParentItemID": qLI.ItemParentItemID,
"ItemParentName": qLI.ItemParentName,
"ItemIsCheckedByDefault": qLI.ItemIsCheckedByDefault
"ItemName": qLI.ItemName ?: "",
"ItemParentItemID": val(qLI.ItemParentItemID),
"ItemParentName": qLI.ItemParentName ?: "",
"ItemIsCheckedByDefault": val(qLI.ItemIsCheckedByDefault)
})>
</cfloop>
@ -126,24 +126,24 @@
"OK": true,
"ERROR": "",
"ORDER": {
"OrderID": qOrder.OrderID,
"OrderUUID": qOrder.OrderUUID,
"OrderUserID": qOrder.OrderUserID,
"OrderBusinessID": qOrder.OrderBusinessID,
"OrderBusinessDeliveryMultiplier": qOrder.OrderBusinessDeliveryMultiplier,
"OrderTypeID": qOrder.OrderTypeID,
"OrderDeliveryFee": qOrder.OrderDeliveryFee,
"BusinessDeliveryFee": businessDeliveryFee,
"OrderID": val(qOrder.OrderID),
"OrderUUID": qOrder.OrderUUID ?: "",
"OrderUserID": val(qOrder.OrderUserID),
"OrderBusinessID": val(qOrder.OrderBusinessID),
"OrderBusinessDeliveryMultiplier": val(qOrder.OrderBusinessDeliveryMultiplier),
"OrderTypeID": val(qOrder.OrderTypeID),
"OrderDeliveryFee": val(qOrder.OrderDeliveryFee),
"BusinessDeliveryFee": val(businessDeliveryFee),
"BusinessOrderTypes": businessOrderTypesArray,
"OrderStatusID": qOrder.OrderStatusID,
"OrderAddressID": qOrder.OrderAddressID,
"OrderPaymentID": qOrder.OrderPaymentID,
"OrderPaymentStatus": qOrder.OrderPaymentStatus,
"OrderRemarks": qOrder.OrderRemarks,
"OrderStatusID": val(qOrder.OrderStatusID),
"OrderAddressID": val(qOrder.OrderAddressID),
"OrderPaymentID": val(qOrder.OrderPaymentID),
"OrderPaymentStatus": qOrder.OrderPaymentStatus ?: "",
"OrderRemarks": qOrder.OrderRemarks ?: "",
"OrderAddedOn": qOrder.OrderAddedOn,
"OrderLastEditedOn": qOrder.OrderLastEditedOn,
"OrderSubmittedOn": qOrder.OrderSubmittedOn,
"OrderServicePointID": qOrder.OrderServicePointID
"OrderServicePointID": val(qOrder.OrderServicePointID)
},
"ORDERLINEITEMS": rows
})>

View file

@ -103,14 +103,14 @@ try {
// First pass: create all items
for (row in qItems) {
item = {
"LineItemID": row.OrderLineItemID,
"ItemID": row.OrderLineItemItemID,
"ParentLineItemID": row.OrderLineItemParentOrderLineItemID,
"ItemName": row.ItemName,
"Quantity": row.OrderLineItemQuantity,
"UnitPrice": row.OrderLineItemPrice,
"Remarks": row.OrderLineItemRemark,
"IsDefault": (row.ItemIsCheckedByDefault == 1),
"LineItemID": val(row.OrderLineItemID),
"ItemID": val(row.OrderLineItemItemID),
"ParentLineItemID": val(row.OrderLineItemParentOrderLineItemID),
"ItemName": row.ItemName ?: "",
"Quantity": val(row.OrderLineItemQuantity),
"UnitPrice": val(row.OrderLineItemPrice),
"Remarks": row.OrderLineItemRemark ?: "",
"IsDefault": (val(row.ItemIsCheckedByDefault) == 1),
"Modifiers": []
};
itemsById[row.OrderLineItemID] = item;

View file

@ -69,22 +69,22 @@
<cfset var businessDeliveryFee = qBusiness.recordCount GT 0 ? qBusiness.BusinessDeliveryFlatFee : 0>
<cfset out.Order = {
"OrderID": qOrder.OrderID,
"OrderUUID": qOrder.OrderUUID,
"OrderUserID": qOrder.OrderUserID,
"OrderBusinessID": qOrder.OrderBusinessID,
"OrderBusinessDeliveryMultiplier": qOrder.OrderBusinessDeliveryMultiplier,
"OrderTypeID": qOrder.OrderTypeID,
"OrderDeliveryFee": qOrder.OrderDeliveryFee,
"BusinessDeliveryFee": businessDeliveryFee,
"OrderStatusID": qOrder.OrderStatusID,
"OrderAddressID": qOrder.OrderAddressID,
"OrderPaymentID": qOrder.OrderPaymentID,
"OrderRemarks": qOrder.OrderRemarks,
"OrderID": val(qOrder.OrderID),
"OrderUUID": qOrder.OrderUUID ?: "",
"OrderUserID": val(qOrder.OrderUserID),
"OrderBusinessID": val(qOrder.OrderBusinessID),
"OrderBusinessDeliveryMultiplier": val(qOrder.OrderBusinessDeliveryMultiplier),
"OrderTypeID": val(qOrder.OrderTypeID),
"OrderDeliveryFee": val(qOrder.OrderDeliveryFee),
"BusinessDeliveryFee": val(businessDeliveryFee),
"OrderStatusID": val(qOrder.OrderStatusID),
"OrderAddressID": val(qOrder.OrderAddressID),
"OrderPaymentID": val(qOrder.OrderPaymentID),
"OrderRemarks": qOrder.OrderRemarks ?: "",
"OrderAddedOn": qOrder.OrderAddedOn,
"OrderLastEditedOn": qOrder.OrderLastEditedOn,
"OrderSubmittedOn": qOrder.OrderSubmittedOn,
"OrderServicePointID": qOrder.OrderServicePointID
"OrderServicePointID": val(qOrder.OrderServicePointID)
}>
<cfset var qLI = queryExecute(
@ -117,20 +117,20 @@
<cfset var rows = []>
<cfloop query="qLI">
<cfset arrayAppend(rows, {
"OrderLineItemID": qLI.OrderLineItemID,
"OrderLineItemParentOrderLineItemID": qLI.OrderLineItemParentOrderLineItemID,
"OrderLineItemOrderID": qLI.OrderLineItemOrderID,
"OrderLineItemItemID": qLI.OrderLineItemItemID,
"OrderLineItemStatusID": qLI.OrderLineItemStatusID,
"OrderLineItemPrice": qLI.OrderLineItemPrice,
"OrderLineItemQuantity": qLI.OrderLineItemQuantity,
"OrderLineItemRemark": qLI.OrderLineItemRemark,
"OrderLineItemIsDeleted": qLI.OrderLineItemIsDeleted,
"OrderLineItemID": val(qLI.OrderLineItemID),
"OrderLineItemParentOrderLineItemID": val(qLI.OrderLineItemParentOrderLineItemID),
"OrderLineItemOrderID": val(qLI.OrderLineItemOrderID),
"OrderLineItemItemID": val(qLI.OrderLineItemItemID),
"OrderLineItemStatusID": val(qLI.OrderLineItemStatusID),
"OrderLineItemPrice": val(qLI.OrderLineItemPrice),
"OrderLineItemQuantity": val(qLI.OrderLineItemQuantity),
"OrderLineItemRemark": qLI.OrderLineItemRemark ?: "",
"OrderLineItemIsDeleted": val(qLI.OrderLineItemIsDeleted),
"OrderLineItemAddedOn": qLI.OrderLineItemAddedOn,
"ItemName": qLI.ItemName,
"ItemParentItemID": qLI.ItemParentItemID,
"ItemParentName": qLI.ItemParentName,
"ItemIsCheckedByDefault": qLI.ItemIsCheckedByDefault
"ItemName": qLI.ItemName ?: "",
"ItemParentItemID": val(qLI.ItemParentItemID),
"ItemParentName": qLI.ItemParentName ?: "",
"ItemIsCheckedByDefault": val(qLI.ItemIsCheckedByDefault)
})>
</cfloop>

View file

@ -141,16 +141,16 @@ try {
} catch (any de) { completedAt = ""; }
arrayAppend(orders, {
"OrderID": row.OrderID,
"OrderID": val(row.OrderID),
"OrderUUID": row.OrderUUID ?: "",
"BusinessID": row.OrderBusinessID,
"BusinessID": val(row.OrderBusinessID),
"BusinessName": row.BusinessName ?: "Unknown",
"OrderTotal": round(total * 100) / 100,
"OrderStatusID": row.OrderStatusID,
"OrderTotal": round(val(total) * 100) / 100,
"OrderStatusID": val(row.OrderStatusID),
"StatusName": statusText,
"OrderTypeID": row.OrderTypeID ?: 0,
"OrderTypeID": val(row.OrderTypeID),
"TypeName": row.OrderTypeName ?: "Unknown",
"ItemCount": itemCount,
"ItemCount": val(itemCount),
"CreatedAt": createdAt,
"CompletedAt": completedAt
});