fix: prevent tab cancel when approved orders exist

cancel.cfm previously only blocked cancel if orders had StatusID >= 1
(submitted to kitchen). If submitOrder() failed after addOrderToTab()
succeeded, the order stayed at StatusID 0 but was linked to the tab
with ApprovalStatus='approved'. This allowed cancelling the tab free.

Now checks TabOrders directly — any approved orders with non-zero
subtotals block the cancel, regardless of kitchen submission status.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
John Mizerek 2026-03-03 12:56:14 -08:00
parent c40e5c0181
commit 496ef74c4c

View file

@ -6,7 +6,7 @@
<cfscript>
/**
* Cancel Tab
* Only allowed if no orders have been submitted to kitchen (StatusID >= 1).
* Only allowed if no approved orders with non-zero subtotals exist.
* Releases the Stripe hold.
*
* POST: { TabID: int, UserID: int }
@ -29,15 +29,15 @@ try {
if (qTab.StatusID != 1) apiAbort({ "OK": false, "ERROR": "tab_not_open" });
if (qTab.OwnerUserID != userID) apiAbort({ "OK": false, "ERROR": "not_owner" });
// Check for submitted orders
qSubmitted = queryTimed("
SELECT COUNT(*) AS Cnt FROM TabOrders tbo
JOIN Orders o ON o.ID = tbo.OrderID
WHERE tbo.TabID = :tabID AND tbo.ApprovalStatus = 'approved' AND o.StatusID >= 1
// Check for any approved orders (regardless of kitchen status)
qApproved = queryTimed("
SELECT COUNT(*) AS Cnt, COALESCE(SUM(SubtotalCents), 0) AS TotalCents
FROM TabOrders
WHERE TabID = :tabID AND ApprovalStatus = 'approved'
", { tabID: { value: tabID, cfsqltype: "cf_sql_integer" } });
if (qSubmitted.Cnt > 0) {
apiAbort({ "OK": false, "ERROR": "has_submitted_orders", "MESSAGE": "Tab has orders in progress. Close the tab instead of cancelling." });
if (qApproved.Cnt > 0 && val(qApproved.TotalCents) > 0) {
apiAbort({ "OK": false, "ERROR": "has_orders", "MESSAGE": "Tab has approved orders. Close the tab instead of cancelling." });
}
// Cancel Stripe PI