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/admin/randomizePrices.cfm
John Mizerek 1210249f54 Normalize database column and table names across entire codebase
Update all SQL queries, query result references, and ColdFusion code to match
the renamed database schema. Tables use plural CamelCase, PKs are all `ID`,
column prefixes stripped (e.g. BusinessName→Name, UserFirstName→FirstName).

Key changes:
- Strip table-name prefixes from all column references (Businesses, Users,
  Addresses, Hours, Menus, Categories, Items, Stations, Orders,
  OrderLineItems, Tasks, TaskCategories, TaskRatings, QuickTaskTemplates,
  ScheduledTaskDefinitions, ChatMessages, Beacons, ServicePoints, Employees,
  VisitorTrackings, ApiPerfLogs, tt_States, tt_Days, tt_AddressTypes,
  tt_OrderTypes, tt_TaskTypes)
- Rename PK references from {TableName}ID to ID in all queries
- Rewrite 7 admin beacon files to use ServicePoints.BeaconID instead of
  dropped lt_Beacon_Businesses_ServicePoints link table
- Rewrite beacon assignment files (list, save, delete) for new schema
- Fix FK references incorrectly changed to ID (OrderLineItems.OrderID,
  Categories.MenuID, Tasks.CategoryID, ServicePoints.BeaconID)
- Update Addresses: AddressLat→Latitude, AddressLng→Longitude
- Update Users: UserPassword→Password, UserIsEmailVerified→IsEmailVerified,
  UserIsActive→IsActive, UserBalance→Balance, etc.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:39:12 -08:00

179 lines
6.7 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 ParentItemID=0 AND IsCollapsible=0
// Modifier templates are items with ParentItemID=0 AND IsCollapsible=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 ID
FROM Items
WHERE BusinessID = :bizId
AND ParentItemID = 0
AND IsCollapsible = 0
", { bizId: businessId }, { datasource: "payfrit" });
catIdList = "";
for (cat in categoryIds) {
catIdList = listAppend(catIdList, cat.ID);
}
// 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.ID, i.Name
FROM Items i
WHERE i.BusinessID = :bizId
AND i.ParentItemID IN (#catIdList#)
AND i.IsCollapsible = 0
AND NOT EXISTS (
SELECT 1 FROM lt_ItemID_TemplateItemID tl WHERE tl.TemplateItemID = i.ID
)
", { bizId: businessId }, { datasource: "payfrit" });
updated = [];
for (item in items) {
itemName = lcase(item.Name);
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 Price = :price
WHERE ItemID = :itemId
", { price: newPrice, itemId: item.ID }, { datasource: "payfrit" });
arrayAppend(updated, {
"ItemID": item.ID,
"Name": item.Name,
"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 ID, Name
FROM Items
WHERE BusinessID = :bizId
AND ParentItemID > 0
AND ParentItemID NOT IN (#catIdList#)
", { bizId: businessId }, { datasource: "payfrit" });
for (mod in modifiers) {
modName = lcase(mod.Name);
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 Price = :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 Price = 0
WHERE BusinessID = :bizId
AND ParentItemID = 0
", { bizId: businessId }, { datasource: "payfrit" });
// Reset modifier group prices to $0 (only options have prices)
queryExecute("
UPDATE Items
SET Price = 0
WHERE BusinessID = :bizId
AND IsCollapsible = 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>