payfrit-works/api/portal/team.cfm
John Mizerek 245a37aeab Fix IsActive bit field comparison in team API
Cast BIT(1) to UNSIGNED INT in SQL and use val() for comparison
to correctly handle MySQL bit fields in ColdFusion/Lucee.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-11 17:39:48 -08:00

98 lines
2.4 KiB
Text

<cfsetting showdebugoutput="false">
<cfsetting enablecfoutputonly="true">
<cfcontent type="application/json; charset=utf-8" reset="true">
<cfheader name="Cache-Control" value="no-store">
<cfscript>
/*
PATH: /api/portal/team.cfm
INPUT (JSON):
{ "BusinessID": 17 }
OUTPUT (JSON):
{ OK: true, TEAM: [ { EmployeeID, UserID, Name, Email, Phone, StatusID, StatusName, IsActive } ] }
*/
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": "missing_business_id" });
}
try {
// Get employees for this business with user details
// Cast BIT to INT to avoid binary comparison issues
qTeam = queryExecute("
SELECT
e.EmployeeID,
e.UserID,
e.EmployeeStatusID,
CAST(e.EmployeeIsActive AS UNSIGNED) AS EmployeeIsActive,
u.UserFirstName,
u.UserLastName,
u.UserEmailAddress,
u.UserContactNumber,
CASE e.EmployeeStatusID
WHEN 0 THEN 'Pending'
WHEN 1 THEN 'Invited'
WHEN 2 THEN 'Active'
WHEN 3 THEN 'Suspended'
ELSE 'Unknown'
END AS StatusName
FROM lt_Users_Businesses_Employees e
JOIN Users u ON e.UserID = u.UserID
WHERE e.BusinessID = ?
ORDER BY e.EmployeeIsActive DESC, u.UserFirstName ASC
", [
{ value: businessId, cfsqltype: "cf_sql_integer" }
], { datasource: "payfrit" });
team = [];
for (row in qTeam) {
arrayAppend(team, {
"EmployeeID": row.EmployeeID,
"UserID": row.UserID,
"Name": trim(row.UserFirstName & " " & row.UserLastName),
"FirstName": row.UserFirstName,
"LastName": row.UserLastName,
"Email": row.UserEmailAddress,
"Phone": row.UserContactNumber,
"StatusID": row.EmployeeStatusID,
"StatusName": row.StatusName,
"IsActive": val(row.EmployeeIsActive) == 1
});
}
writeOutput(serializeJSON({
"OK": true,
"TEAM": team,
"COUNT": arrayLen(team)
}));
abort;
} catch (any e) {
apiAbort({
"OK": false,
"ERROR": "server_error",
"MESSAGE": e.message
});
}
</cfscript>