// Check for an active (uncompleted) chat task at a service point // Input: BusinessID, ServicePointID // 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); if (businessID == 0) { apiAbort({ "OK": false, "ERROR": "missing_params", "MESSAGE": "BusinessID is required" }); } if (servicePointID == 0) { // No service point - can't find specific chat apiAbort({ "OK": true, "HAS_ACTIVE_CHAT": false, "TASK_ID": 0, "TASK_TITLE": "" }); } // Look for any active chat task at this service point // TaskTypeID = 2 (Chat), not completed, at this service point qChat = queryExecute(" SELECT t.TaskID, t.TaskTitle, (SELECT MAX(cm.CreatedOn) FROM ChatMessages cm WHERE cm.TaskID = t.TaskID) as LastMessageTime FROM Tasks t WHERE t.TaskBusinessID = :businessID AND t.TaskTypeID = 2 AND t.TaskCompletedOn IS NULL AND t.TaskSourceType = 'servicepoint' AND t.TaskSourceID = :servicePointID ORDER BY CASE WHEN t.TaskClaimedByUserID > 0 THEN 0 ELSE 1 END, t.TaskAddedOn DESC LIMIT 1 ", { businessID: { value: businessID, cfsqltype: "cf_sql_integer" }, servicePointID: { value: servicePointID, 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 }); }