payfrit-works/api/admin/randomizePrices.cfm
John Mizerek ec81af5cdd Add business info, order details, beacon management, and admin tools
API Improvements:
- api/businesses/get.cfm: Fetch address from Addresses table, hours from Hours table
- api/tasks/getDetails.cfm: Add CustomerPhone field from UserContactNumber
- api/orders/getDetail.cfm: New endpoint for order details with line items
- api/Application.cfm: Add new admin endpoints to public allowlist

Admin Tools:
- api/admin/beaconStatus.cfm: View all beacon-to-business mappings
- api/admin/updateBeaconMapping.cfm: Change beacon business assignment
- api/admin/setupBigDeansInfo.cfm: Set Big Dean's address and hours
- api/admin/listTables.cfm: List all database tables
- api/admin/describeTable.cfm: Get table structure and sample data
- api/admin/randomizePrices.cfm: Randomize item prices for testing
- Various Big Dean's debug/update scripts

Portal Enhancements:
- Enhanced CSS styling for portal pages
- Improved portal.js functionality

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 11:45:21 -08:00

179 lines
6.8 KiB
Text

<cfsetting showdebugoutput="false">
<cfsetting enablecfoutputonly="true">
<cfcontent type="application/json; charset=utf-8" reset="true">
<cfscript>
businessId = 27; // Big Dean's
// Categories are items with ItemParentItemID=0 AND ItemIsCollapsible=0
// Modifier templates are items with ItemParentItemID=0 AND ItemIsCollapsible=1
// Menu items are children of categories
// Modifiers are children of menu items or modifier templates
// Get category IDs (NOT modifier templates)
categoryIds = queryExecute("
SELECT ItemID
FROM Items
WHERE ItemBusinessID = :bizId
AND ItemParentItemID = 0
AND ItemIsCollapsible = 0
", { bizId: businessId }, { datasource: "payfrit" });
catIdList = "";
for (cat in categoryIds) {
catIdList = listAppend(catIdList, cat.ItemID);
}
// Now get actual menu items (direct children of categories)
// Exclude items that are template options (their parent is a collapsible modifier group)
items = queryExecute("
SELECT i.ItemID, i.ItemName
FROM Items i
WHERE i.ItemBusinessID = :bizId
AND i.ItemParentItemID IN (#catIdList#)
AND i.ItemIsCollapsible = 0
AND NOT EXISTS (
SELECT 1 FROM ItemTemplateLinks tl WHERE tl.TemplateItemID = i.ItemID
)
", { bizId: businessId }, { datasource: "payfrit" });
updated = [];
for (item in items) {
itemName = lcase(item.ItemName);
newPrice = 0;
// Drinks - $3-6
if (findNoCase("beer", itemName) || findNoCase("ale", itemName) || findNoCase("lager", itemName) || findNoCase("ipa", itemName) || findNoCase("stout", itemName)) {
newPrice = randRange(5, 9) - 0.01; // $4.99 - $8.99
}
else if (findNoCase("wine", itemName) || findNoCase("sangria", itemName)) {
newPrice = randRange(8, 14) - 0.01; // $7.99 - $13.99
}
else if (findNoCase("soda", itemName) || findNoCase("coke", itemName) || findNoCase("pepsi", itemName) || findNoCase("sprite", itemName) || findNoCase("lemonade", itemName) || findNoCase("tea", itemName) || findNoCase("coffee", itemName)) {
newPrice = randRange(3, 5) - 0.01; // $2.99 - $4.99
}
else if (findNoCase("margarita", itemName) || findNoCase("cocktail", itemName) || findNoCase("martini", itemName) || findNoCase("mojito", itemName)) {
newPrice = randRange(10, 15) - 0.01; // $9.99 - $14.99
}
// Appetizers / Starters - $8-14
else if (findNoCase("fries", itemName) || findNoCase("chips", itemName) || findNoCase("nachos", itemName) || findNoCase("wings", itemName) || findNoCase("calamari", itemName) || findNoCase("appetizer", itemName) || findNoCase("starter", itemName)) {
newPrice = randRange(8, 14) - 0.01; // $7.99 - $13.99
}
// Salads - $10-16
else if (findNoCase("salad", itemName)) {
newPrice = randRange(11, 17) - 0.01; // $10.99 - $16.99
}
// Soups - $6-10
else if (findNoCase("soup", itemName) || findNoCase("chowder", itemName)) {
newPrice = randRange(7, 11) - 0.01; // $6.99 - $10.99
}
// Burgers - $14-19
else if (findNoCase("burger", itemName)) {
newPrice = randRange(15, 20) - 0.01; // $14.99 - $19.99
}
// Sandwiches - $12-17
else if (findNoCase("sandwich", itemName) || findNoCase("wrap", itemName) || findNoCase("club", itemName) || findNoCase("blt", itemName)) {
newPrice = randRange(13, 18) - 0.01; // $12.99 - $17.99
}
// Fish & Seafood - $16-28
else if (findNoCase("fish", itemName) || findNoCase("salmon", itemName) || findNoCase("shrimp", itemName) || findNoCase("lobster", itemName) || findNoCase("crab", itemName) || findNoCase("scallop", itemName) || findNoCase("tuna", itemName) || findNoCase("halibut", itemName) || findNoCase("cod", itemName)) {
newPrice = randRange(17, 29) - 0.01; // $16.99 - $28.99
}
// Tacos - $13-18
else if (findNoCase("taco", itemName)) {
newPrice = randRange(14, 19) - 0.01; // $13.99 - $18.99
}
// Kids meals - $8-12
else if (findNoCase("kid", itemName) || findNoCase("child", itemName)) {
newPrice = randRange(9, 13) - 0.01; // $8.99 - $12.99
}
// Desserts - $7-12
else if (findNoCase("dessert", itemName) || findNoCase("cake", itemName) || findNoCase("pie", itemName) || findNoCase("sundae", itemName) || findNoCase("brownie", itemName) || findNoCase("cheesecake", itemName) || findNoCase("ice cream", itemName)) {
newPrice = randRange(8, 13) - 0.01; // $7.99 - $12.99
}
// Default entrees - $14-22
else {
newPrice = randRange(15, 23) - 0.01; // $14.99 - $22.99
}
queryExecute("
UPDATE Items
SET ItemPrice = :price
WHERE ItemID = :itemId
", { price: newPrice, itemId: item.ItemID }, { datasource: "payfrit" });
arrayAppend(updated, {
"ItemID": item.ItemID,
"ItemName": item.ItemName,
"NewPrice": newPrice
});
}
// Update modifier prices (children of menu items, NOT direct children of categories)
// Modifiers are items whose parent is NOT a category (i.e., parent is a menu item or modifier group)
modifiers = queryExecute("
SELECT ItemID, ItemName
FROM Items
WHERE ItemBusinessID = :bizId
AND ItemParentItemID > 0
AND ItemParentItemID NOT IN (#catIdList#)
", { bizId: businessId }, { datasource: "payfrit" });
for (mod in modifiers) {
modName = lcase(mod.ItemName);
modPrice = 0;
// Proteins are expensive add-ons
if (findNoCase("bacon", modName) || findNoCase("avocado", modName) || findNoCase("guac", modName)) {
modPrice = randRange(2, 4) - 0.01; // $1.99 - $3.99
}
else if (findNoCase("chicken", modName) || findNoCase("shrimp", modName) || findNoCase("steak", modName) || findNoCase("salmon", modName)) {
modPrice = randRange(4, 7) - 0.01; // $3.99 - $6.99
}
else if (findNoCase("cheese", modName) || findNoCase("egg", modName)) {
modPrice = randRange(1, 3) - 0.01; // $0.99 - $2.99
}
// Size upgrades
else if (findNoCase("large", modName) || findNoCase("extra", modName) || findNoCase("double", modName)) {
modPrice = randRange(2, 4) - 0.01; // $1.99 - $3.99
}
// Most modifiers (toppings, sauces, etc.) are free or cheap
else {
// 70% free, 30% small charge
if (randRange(1, 10) <= 7) {
modPrice = 0;
} else {
modPrice = randRange(1, 2) - 0.01; // $0.99 - $1.99
}
}
queryExecute("
UPDATE Items
SET ItemPrice = :price
WHERE ItemID = :itemId
", { price: modPrice, itemId: mod.ItemID }, { datasource: "payfrit" });
}
// Reset category prices to $0 (shouldn't have prices for reporting)
queryExecute("
UPDATE Items
SET ItemPrice = 0
WHERE ItemBusinessID = :bizId
AND ItemParentItemID = 0
", { bizId: businessId }, { datasource: "payfrit" });
// Reset modifier group prices to $0 (only options have prices)
queryExecute("
UPDATE Items
SET ItemPrice = 0
WHERE ItemBusinessID = :bizId
AND ItemIsCollapsible = 1
", { bizId: businessId }, { datasource: "payfrit" });
writeOutput(serializeJSON({
"OK": true,
"MESSAGE": "Updated prices for #arrayLen(updated)# menu items and #modifiers.recordCount# modifiers. Reset category and group prices to $0.",
"ITEMS": updated
}));
</cfscript>