This repository has been archived on 2026-03-21. You can view files and clone it, but cannot push or open issues or pull requests.
payfrit-biz/api/portal/team.cfm
John Mizerek d1910a7d34 Add staff role system: Staff keeps cash, Manager/Admin collect for restaurant
- Create tt_StaffRoles lookup table (Staff, Manager, Admin)
- Add RoleID column to Employees table (default: Staff)
- Wire portal role dropdown to addTeamMember API
- Return RoleName in team list and RoleID to Android
- Skip worker payout ledger and cash_debit for Manager/Admin roles
  on cash task completion (they collect on behalf of the restaurant)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 11:19:22 -08:00

104 lines
2.5 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 = queryTimed("
SELECT
e.ID,
e.UserID,
e.StatusID,
e.RoleID,
CAST(e.IsActive AS UNSIGNED) AS IsActive,
u.FirstName,
u.LastName,
u.EmailAddress,
u.ContactNumber,
COALESCE(sr.Name, 'Staff') AS RoleName,
CASE e.StatusID
WHEN 0 THEN 'Pending'
WHEN 1 THEN 'Invited'
WHEN 2 THEN 'Active'
WHEN 3 THEN 'Suspended'
ELSE 'Unknown'
END AS StatusName
FROM Employees e
JOIN Users u ON e.UserID = u.ID
LEFT JOIN tt_StaffRoles sr ON sr.ID = e.RoleID
WHERE e.BusinessID = ?
ORDER BY e.IsActive DESC, u.FirstName ASC
", [
{ value: businessId, cfsqltype: "cf_sql_integer" }
], { datasource: "payfrit" });
team = [];
for (row in qTeam) {
arrayAppend(team, {
"EmployeeID": row.ID,
"UserID": row.UserID,
"Name": trim(row.FirstName & " " & row.LastName),
"FirstName": row.FirstName,
"LastName": row.LastName,
"Email": row.EmailAddress,
"Phone": row.ContactNumber,
"RoleID": row.RoleID,
"RoleName": row.RoleName,
"StatusID": row.StatusID,
"StatusName": row.StatusName,
"IsActive": val(row.IsActive) == 1
});
}
try{logPerf(0);}catch(any e){}
writeOutput(serializeJSON({
"OK": true,
"TEAM": team,
"COUNT": arrayLen(team)
}));
abort;
} catch (any e) {
apiAbort({
"OK": false,
"ERROR": "server_error",
"MESSAGE": e.message
});
}
</cfscript>