// Check for an active (uncompleted) chat task at a business // Input: BusinessID, ServicePointID (optional), UserID (optional) // Output: { OK: true, HAS_ACTIVE_CHAT: true/false, TASK_ID: ... } function apiAbort(required struct payload) { writeOutput(serializeJSON(payload)); abort; } 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 {}; } try { data = readJsonBody(); businessID = val(structKeyExists(data, "BusinessID") ? data.BusinessID : 0); servicePointID = val(structKeyExists(data, "ServicePointID") ? data.ServicePointID : 0); userID = val(structKeyExists(data, "UserID") ? data.UserID : 0); if (businessID == 0) { apiAbort({ "OK": false, "ERROR": "missing_params", "MESSAGE": "BusinessID is required" }); } // Look for any active chat task at this business (TaskTypeID = 2, not completed) // Priority order: // 1. Chats that are claimed (worker is responding) // 2. Chats that have messages (ongoing conversation) // 3. Most recently created chat qChat = queryExecute(" SELECT t.TaskID, t.TaskTitle, t.TaskSourceID, (SELECT COUNT(*) FROM ChatMessages m WHERE m.TaskID = t.TaskID) as MessageCount FROM Tasks t WHERE t.TaskBusinessID = :businessID AND t.TaskTypeID = 2 AND t.TaskCompletedOn IS NULL ORDER BY CASE WHEN t.TaskClaimedByUserID > 0 THEN 0 ELSE 1 END, (SELECT COUNT(*) FROM ChatMessages m WHERE m.TaskID = t.TaskID) DESC, t.TaskAddedOn DESC LIMIT 1 ", { businessID: { value: businessID, cfsqltype: "cf_sql_integer" } }, { datasource: "payfrit" }); if (qChat.recordCount > 0) { apiAbort({ "OK": true, "HAS_ACTIVE_CHAT": true, "TASK_ID": qChat.TaskID, "TASK_TITLE": qChat.TaskTitle }); } else { apiAbort({ "OK": true, "HAS_ACTIVE_CHAT": false, "TASK_ID": 0, "TASK_TITLE": "" }); } } catch (any e) { apiAbort({ "OK": false, "ERROR": "server_error", "MESSAGE": e.message }); }