Add fixOrder admin script for webhook recovery

This commit is contained in:
John Pinkyfloyd 2026-02-15 15:45:22 -08:00
parent be29352b21
commit ce334cf95c

108
api/admin/fixOrder.cfm Normal file
View file

@ -0,0 +1,108 @@
<cfsetting showdebugoutput="false">
<cfcontent type="application/json; charset=utf-8">
<cfscript>
// Fix order that missed webhook - updates status and creates kitchen task
// Usage: ?businessId=55 (defaults to most recent order)
function readJsonBody() {
var raw = getHttpRequestData().content;
if (isNull(raw)) raw = "";
if (!len(trim(raw))) return {};
try {
var data = deserializeJSON(raw);
if (isStruct(data)) return data;
} catch (any e) {}
return {};
}
data = readJsonBody();
businessId = val(structKeyExists(url, "businessId") ? url.businessId : (structKeyExists(data, "businessId") ? data.businessId : 55));
orderId = val(structKeyExists(url, "orderId") ? url.orderId : (structKeyExists(data, "orderId") ? data.orderId : 0));
// Find order
if (orderId > 0) {
qOrder = queryExecute("
SELECT o.ID, o.UUID, o.UserID, o.BusinessID, o.StatusID, o.ServicePointID, o.PaymentStatus,
u.FirstName, sp.Name AS ServicePointName
FROM Orders o
LEFT JOIN Users u ON u.ID = o.UserID
LEFT JOIN ServicePoints sp ON sp.ID = o.ServicePointID
WHERE o.ID = :orderId
LIMIT 1
", { orderId: { value: orderId, cfsqltype: "cf_sql_integer" } }, { datasource: "payfrit" });
} else {
qOrder = queryExecute("
SELECT o.ID, o.UUID, o.UserID, o.BusinessID, o.StatusID, o.ServicePointID, o.PaymentStatus,
u.FirstName, sp.Name AS ServicePointName
FROM Orders o
LEFT JOIN Users u ON u.ID = o.UserID
LEFT JOIN ServicePoints sp ON sp.ID = o.ServicePointID
WHERE o.BusinessID = :businessId
ORDER BY o.ID DESC
LIMIT 1
", { businessId: { value: businessId, cfsqltype: "cf_sql_integer" } }, { datasource: "payfrit" });
}
if (qOrder.recordCount == 0) {
writeOutput(serializeJSON({ "OK": false, "MESSAGE": "No orders found" }));
abort;
}
orderId = qOrder.ID;
businessId = qOrder.BusinessID;
result = {
"OrderID": orderId,
"UserName": qOrder.FirstName,
"CurrentStatus": qOrder.StatusID,
"PaymentStatus": qOrder.PaymentStatus,
"ServicePointID": qOrder.ServicePointID,
"ServicePointName": qOrder.ServicePointName
};
// Update order status to Submitted (1) if it's still Cart (0)
if (qOrder.StatusID == 0) {
queryExecute("
UPDATE Orders
SET StatusID = 1,
PaymentStatus = 'paid',
SubmittedOn = NOW()
WHERE ID = :orderId
", { orderId: { value: orderId, cfsqltype: "cf_sql_integer" } }, { datasource: "payfrit" });
result["StatusUpdated"] = true;
} else {
result["StatusUpdated"] = false;
}
// Check if kitchen task exists
qTask = queryExecute("
SELECT ID FROM Tasks WHERE OrderID = :orderId
", { orderId: { value: orderId, cfsqltype: "cf_sql_integer" } }, { datasource: "payfrit" });
if (qTask.recordCount == 0) {
// Create kitchen task
tableName = len(trim(qOrder.ServicePointName)) ? qOrder.ServicePointName : "Table";
taskTitle = "Prepare Order ##" & orderId & " for " & tableName;
queryExecute("
INSERT INTO Tasks (
BusinessID, OrderID, Title, CreatedOn, ClaimedByUserID
) VALUES (
:businessId, :orderId, :title, NOW(), 0
)
", {
businessId: { value: businessId, cfsqltype: "cf_sql_integer" },
orderId: { value: orderId, cfsqltype: "cf_sql_integer" },
title: { value: taskTitle, cfsqltype: "cf_sql_varchar" }
}, { datasource: "payfrit" });
result["TaskCreated"] = true;
} else {
result["TaskCreated"] = false;
result["ExistingTaskID"] = qTask.ID;
}
result["OK"] = true;
result["MESSAGE"] = "Order fixed";
writeOutput(serializeJSON(result));
</cfscript>