/* Clean up duplicate employee records for a business POST: { "BusinessID": 17 } */ 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 {}; } data = readJsonBody(); businessId = structKeyExists(data, "BusinessID") ? val(data.BusinessID) : 0; if (businessId <= 0) { apiAbort({ "OK": false, "ERROR": "BusinessID required" }); } try { // Find duplicate UserIDs for this business (keep the one with highest status or oldest) qDupes = queryExecute(" SELECT UserID, COUNT(*) as cnt, MIN(EmployeeID) as keepId FROM lt_Users_Businesses_Employees WHERE BusinessID = ? GROUP BY UserID HAVING COUNT(*) > 1 ", [{ value: businessId, cfsqltype: "cf_sql_integer" }], { datasource: "payfrit" }); deleted = 0; for (row in qDupes) { // Delete all but the one we want to keep (the one with lowest EmployeeID) qDel = queryExecute(" DELETE FROM lt_Users_Businesses_Employees WHERE BusinessID = ? AND UserID = ? AND EmployeeID != ? ", [ { value: businessId, cfsqltype: "cf_sql_integer" }, { value: row.UserID, cfsqltype: "cf_sql_integer" }, { value: row.keepId, cfsqltype: "cf_sql_integer" } ], { datasource: "payfrit" }); deleted += (row.cnt - 1); } // Get remaining employees qRemaining = queryExecute(" SELECT e.EmployeeID, e.UserID, u.UserFirstName, u.UserLastName FROM lt_Users_Businesses_Employees e JOIN Users u ON e.UserID = u.UserID WHERE e.BusinessID = ? ORDER BY e.EmployeeID ", [{ value: businessId, cfsqltype: "cf_sql_integer" }], { datasource: "payfrit" }); remaining = []; for (r in qRemaining) { arrayAppend(remaining, { "EmployeeID": r.EmployeeID, "UserID": r.UserID, "Name": trim(r.UserFirstName & " " & r.UserLastName) }); } writeOutput(serializeJSON({ "OK": true, "DUPLICATES_FOUND": qDupes.recordCount, "DELETED": deleted, "REMAINING": remaining })); } catch (any e) { apiAbort({ "OK": false, "ERROR": e.message }); }