/** * Get Pending Tab Orders * Returns orders awaiting tab owner approval, with line item details. * * POST: { TabID: int, UserID: int (tab owner) } */ try { requestData = deserializeJSON(toString(getHttpRequestData().content)); tabID = val(requestData.TabID ?: 0); userID = val(requestData.UserID ?: 0); if (tabID == 0) apiAbort({ "OK": false, "ERROR": "missing_TabID" }); if (userID == 0) apiAbort({ "OK": false, "ERROR": "missing_UserID" }); qTab = queryTimed("SELECT OwnerUserID FROM Tabs WHERE ID = :tabID LIMIT 1", { tabID: { value: tabID, cfsqltype: "cf_sql_integer" } }); if (qTab.recordCount == 0) apiAbort({ "OK": false, "ERROR": "tab_not_found" }); if (qTab.OwnerUserID != userID) apiAbort({ "OK": false, "ERROR": "not_owner" }); qPending = queryTimed(" SELECT tbo.OrderID, tbo.UserID, tbo.SubtotalCents, tbo.TaxCents, tbo.AddedOn, u.FirstName, u.LastName FROM TabOrders tbo JOIN Users u ON u.ID = tbo.UserID WHERE tbo.TabID = :tabID AND tbo.ApprovalStatus = 'pending' ORDER BY tbo.AddedOn ", { tabID: { value: tabID, cfsqltype: "cf_sql_integer" } }); orders = []; for (row in qPending) { // Get line items for this order qItems = queryTimed(" SELECT oli.ID, oli.ItemID, oli.Price, oli.Quantity, oli.Remark, i.Name AS ItemName FROM OrderLineItems oli JOIN Items i ON i.ID = oli.ItemID WHERE oli.OrderID = :orderID AND oli.IsDeleted = 0 AND oli.ParentOrderLineItemID = 0 ", { orderID: { value: row.OrderID, cfsqltype: "cf_sql_integer" } }); items = []; for (item in qItems) { arrayAppend(items, { "Name": item.ItemName, "Price": item.Price, "Quantity": item.Quantity, "Remark": item.Remark ?: "" }); } arrayAppend(orders, { "OrderID": row.OrderID, "UserID": row.UserID, "UserName": "#row.FirstName# #row.LastName#", "SubtotalCents": row.SubtotalCents, "TaxCents": row.TaxCents, "AddedOn": toISO8601(row.AddedOn), "Items": items }); } apiAbort({ "OK": true, "PENDING_ORDERS": orders }); } catch (any e) { apiAbort({ "OK": false, "ERROR": "server_error", "MESSAGE": e.message }); }