From 28c0de9f09b56b55c30331622277b7ecf4ef71f2 Mon Sep 17 00:00:00 2001 From: John Mizerek Date: Fri, 13 Mar 2026 17:53:09 -0700 Subject: [PATCH] Remove IsInvertedGroup feature from all APIs, KDS, and portal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feature cancelled — modifier wording handles the use case instead. Removes IsInvertedGroup from SELECTs, JSON responses, RemovedDefaults computation, and KDS/portal display logic. DB column left in place. Co-Authored-By: Claude Opus 4.6 --- api/menu/getForBuilder.cfm | 16 +++++---------- api/menu/items.cfm | 8 -------- api/menu/saveFromBuilder.cfm | 29 +++++++++----------------- api/orders/getCart.cfm | 9 ++------ api/orders/listForKDS.cfm | 40 +----------------------------------- api/orders/setLineItem.cfm | 8 ++------ api/tasks/getDetails.cfm | 34 ++---------------------------- kds/kds.js | 17 --------------- portal/menu-builder.html | 1 - 9 files changed, 22 insertions(+), 140 deletions(-) diff --git a/api/menu/getForBuilder.cfm b/api/menu/getForBuilder.cfm index 7c2a0bf..ea2d1a6 100644 --- a/api/menu/getForBuilder.cfm +++ b/api/menu/getForBuilder.cfm @@ -26,7 +26,6 @@ function buildOptionsTree(allOptions, parentId) { "sortOrder": allOptions.SortOrder[i], "requiresSelection": isNull(allOptions.RequiresSelection[i]) ? false : (allOptions.RequiresSelection[i] == 1), "maxSelections": isNull(allOptions.MaxSelections[i]) ? 0 : allOptions.MaxSelections[i], - "isInverted": structKeyExists(allOptions, "IsInvertedGroup") && !isNull(allOptions.IsInvertedGroup[i]) ? (allOptions.IsInvertedGroup[i] == 1) : false, "options": children }); } @@ -196,8 +195,7 @@ try { m.IsCheckedByDefault as IsDefault, m.SortOrder, m.RequiresChildSelection as RequiresSelection, - m.MaxNumSelectionReq as MaxSelections, - m.IsInvertedGroup + m.MaxNumSelectionReq as MaxSelections FROM Items m WHERE m.BusinessID = :businessID AND m.IsActive = 1 @@ -253,8 +251,7 @@ try { m.IsCheckedByDefault as IsDefault, m.SortOrder, m.RequiresChildSelection as RequiresSelection, - m.MaxNumSelectionReq as MaxSelections, - m.IsInvertedGroup + m.MaxNumSelectionReq as MaxSelections FROM Items m WHERE m.BusinessID = :businessID AND m.IsActive = 1 @@ -292,8 +289,7 @@ try { t.IsCheckedByDefault as IsDefault, t.SortOrder, t.RequiresChildSelection as RequiresSelection, - t.MaxNumSelectionReq as MaxSelections, - t.IsInvertedGroup + t.MaxNumSelectionReq as MaxSelections FROM Items t WHERE t.BusinessID = :businessID AND (t.CategoryID = 0 OR t.CategoryID IS NULL) @@ -308,7 +304,7 @@ try { arrayAppend(templateIds, qTemplates.ItemID[i]); } - qTemplateChildren = queryNew("ItemID,ParentItemID,Name,Price,IsDefault,SortOrder,RequiresSelection,MaxSelections,IsInvertedGroup"); + qTemplateChildren = queryNew("ItemID,ParentItemID,Name,Price,IsDefault,SortOrder,RequiresSelection,MaxSelections"); if (arrayLen(templateIds) > 0) { qTemplateChildren = queryTimed(" SELECT @@ -319,8 +315,7 @@ try { c.IsCheckedByDefault as IsDefault, c.SortOrder, c.RequiresChildSelection as RequiresSelection, - c.MaxNumSelectionReq as MaxSelections, - c.IsInvertedGroup + c.MaxNumSelectionReq as MaxSelections FROM Items c WHERE c.ParentItemID IN (:templateIds) AND c.IsActive = 1 @@ -343,7 +338,6 @@ try { "isTemplate": true, "requiresSelection": isNull(qTemplates.RequiresSelection[i]) ? false : (qTemplates.RequiresSelection[i] == 1), "maxSelections": isNull(qTemplates.MaxSelections[i]) ? 0 : qTemplates.MaxSelections[i], - "isInverted": isNull(qTemplates.IsInvertedGroup[i]) ? false : (qTemplates.IsInvertedGroup[i] == 1), "options": options }; } diff --git a/api/menu/items.cfm b/api/menu/items.cfm index 9d0e1f4..4d7e50f 100644 --- a/api/menu/items.cfm +++ b/api/menu/items.cfm @@ -208,7 +208,6 @@ i.RequiresChildSelection, i.MaxNumSelectionReq, i.IsCollapsible, - i.IsInvertedGroup, i.SortOrder, i.StationID, s.Name AS StationName, @@ -263,7 +262,6 @@ i.RequiresChildSelection, i.MaxNumSelectionReq, i.IsCollapsible, - i.IsInvertedGroup, i.SortOrder, i.StationID, s.Name, @@ -301,7 +299,6 @@ i.RequiresChildSelection, i.MaxNumSelectionReq, i.IsCollapsible, - i.IsInvertedGroup, i.SortOrder, i.StationID, s.Name, @@ -354,7 +351,6 @@ "RequiresChildSelection": 0, "MaxNumSelectionReq": 0, "IsCollapsible": 0, - "IsInvertedGroup": 0, "SortOrder": qCategories.SortOrder, "MenuID": isNull(qCategories.MenuID) ? 0 : val(qCategories.MenuID), "StationID": "", @@ -419,7 +415,6 @@ "RequiresChildSelection": q.RequiresChildSelection, "MaxNumSelectionReq": q.MaxNumSelectionReq, "IsCollapsible": q.IsCollapsible, - "IsInvertedGroup": q.IsInvertedGroup, "SortOrder": q.SortOrder, "MenuID": itemMenuID, "StationID": len(trim(q.StationID)) ? q.StationID : "", @@ -441,7 +436,6 @@ tmpl.RequiresChildSelection as TemplateRequired, tmpl.MaxNumSelectionReq as TemplateMaxSelections, tmpl.IsCollapsible as TemplateIsCollapsible, - tmpl.IsInvertedGroup as TemplateIsInvertedGroup, tl.SortOrder as TemplateSortOrder FROM lt_ItemID_TemplateItemID tl INNER JOIN Items tmpl ON tmpl.ID = tl.TemplateItemID AND tmpl.IsActive = 1 @@ -526,7 +520,6 @@ "RequiresChildSelection": qTemplateLinks.TemplateRequired, "MaxNumSelectionReq": qTemplateLinks.TemplateMaxSelections, "IsCollapsible": qTemplateLinks.TemplateIsCollapsible, - "IsInvertedGroup": qTemplateLinks.TemplateIsInvertedGroup, "SortOrder": qTemplateLinks.TemplateSortOrder, "StationID": "", "ItemName": "", @@ -551,7 +544,6 @@ "RequiresChildSelection": 0, "MaxNumSelectionReq": 0, "IsCollapsible": 0, - "IsInvertedGroup": 0, "SortOrder": opt.SortOrder, "StationID": "", "ItemName": "", diff --git a/api/menu/saveFromBuilder.cfm b/api/menu/saveFromBuilder.cfm index 5d82628..c4e5775 100644 --- a/api/menu/saveFromBuilder.cfm +++ b/api/menu/saveFromBuilder.cfm @@ -19,7 +19,6 @@ function saveOptionsRecursive(options, parentID, businessID) { var requiresSelection = (structKeyExists(opt, "requiresSelection") && opt.requiresSelection) ? 1 : 0; var maxSelections = structKeyExists(opt, "maxSelections") ? val(opt.maxSelections) : 0; var isDefault = (structKeyExists(opt, "isDefault") && opt.isDefault) ? 1 : 0; - var isInverted = (structKeyExists(opt, "isInverted") && opt.isInverted) ? 1 : 0; var optionID = 0; if (optDbId > 0) { @@ -32,7 +31,6 @@ function saveOptionsRecursive(options, parentID, businessID) { SortOrder = :sortOrder, RequiresChildSelection = :requiresSelection, MaxNumSelectionReq = :maxSelections, - IsInvertedGroup = :isInverted, ParentItemID = :parentID WHERE ID = :optID ", { @@ -43,19 +41,18 @@ function saveOptionsRecursive(options, parentID, businessID) { isDefault: isDefault, sortOrder: optSortOrder, requiresSelection: requiresSelection, - maxSelections: maxSelections, - isInverted: isInverted + maxSelections: maxSelections }); } else { queryTimed(" INSERT INTO Items ( BusinessID, ParentItemID, Name, Price, IsCheckedByDefault, SortOrder, IsActive, AddedOn, - RequiresChildSelection, MaxNumSelectionReq, IsInvertedGroup, CategoryID + RequiresChildSelection, MaxNumSelectionReq, CategoryID ) VALUES ( :businessID, :parentID, :name, :price, :isDefault, :sortOrder, 1, NOW(), - :requiresSelection, :maxSelections, :isInverted, 0 + :requiresSelection, :maxSelections, 0 ) ", { businessID: businessID, @@ -65,8 +62,7 @@ function saveOptionsRecursive(options, parentID, businessID) { isDefault: isDefault, sortOrder: optSortOrder, requiresSelection: requiresSelection, - maxSelections: maxSelections, - isInverted: isInverted + maxSelections: maxSelections }); var result = queryTimed("SELECT LAST_INSERT_ID() as newID"); @@ -338,15 +334,13 @@ try { UPDATE Items SET Name = :name, RequiresChildSelection = :requiresSelection, - MaxNumSelectionReq = :maxSelections, - IsInvertedGroup = :isInverted + MaxNumSelectionReq = :maxSelections WHERE ID = :modID ", { modID: modDbId, name: mod.name, requiresSelection: requiresSelection, - maxSelections: maxSelections, - isInverted: (structKeyExists(mod, "isInverted") && mod.isInverted) ? 1 : 0 + maxSelections: maxSelections }); // Only save template options ONCE (first time we encounter this template) @@ -366,7 +360,6 @@ try { SortOrder = :sortOrder, RequiresChildSelection = :requiresSelection, MaxNumSelectionReq = :maxSelections, - IsInvertedGroup = :isInverted, ParentItemID = :parentID WHERE ID = :modID ", { @@ -377,8 +370,7 @@ try { isDefault: (mod.isDefault ?: false) ? 1 : 0, sortOrder: modSortOrder, requiresSelection: requiresSelection, - maxSelections: maxSelections, - isInverted: (structKeyExists(mod, "isInverted") && mod.isInverted) ? 1 : 0 + maxSelections: maxSelections }); if (structKeyExists(mod, "options") && isArray(mod.options)) { @@ -390,11 +382,11 @@ try { INSERT INTO Items ( BusinessID, ParentItemID, Name, Price, IsCheckedByDefault, SortOrder, IsActive, AddedOn, - RequiresChildSelection, MaxNumSelectionReq, IsInvertedGroup, CategoryID + RequiresChildSelection, MaxNumSelectionReq, CategoryID ) VALUES ( :businessID, :parentID, :name, :price, :isDefault, :sortOrder, 1, NOW(), - :requiresSelection, :maxSelections, :isInverted, 0 + :requiresSelection, :maxSelections, 0 ) ", { businessID: businessID, @@ -404,8 +396,7 @@ try { isDefault: (mod.isDefault ?: false) ? 1 : 0, sortOrder: modSortOrder, requiresSelection: requiresSelection, - maxSelections: maxSelections, - isInverted: (structKeyExists(mod, "isInverted") && mod.isInverted) ? 1 : 0 + maxSelections: maxSelections }); modResult = queryTimed("SELECT LAST_INSERT_ID() as newModID"); diff --git a/api/orders/getCart.cfm b/api/orders/getCart.cfm index 158d0b1..4e56fa9 100644 --- a/api/orders/getCart.cfm +++ b/api/orders/getCart.cfm @@ -95,9 +95,7 @@ i.Name, i.ParentItemID, i.IsCheckedByDefault, - i.IsInvertedGroup, - parent.Name AS ItemParentName, - parent.IsInvertedGroup AS ParentIsInvertedGroup + parent.Name AS ItemParentName FROM OrderLineItems oli INNER JOIN Items i ON i.ID = oli.ItemID LEFT JOIN Items parent ON parent.ID = i.ParentItemID @@ -126,10 +124,7 @@ "Name": qLI.Name ?: "", "ParentItemID": val(qLI.ParentItemID), "ItemParentName": qLI.ItemParentName ?: "", - "IsCheckedByDefault": val(qLI.IsCheckedByDefault), - "IsInvertedGroup": val(qLI.IsInvertedGroup), - "ParentIsInvertedGroup": val(qLI.ParentIsInvertedGroup), - "_debug": "Qty=#val(qLI.Quantity)# IsChkDef=#val(qLI.IsCheckedByDefault)# ParentInv=#val(qLI.ParentIsInvertedGroup)#" + "IsCheckedByDefault": val(qLI.IsCheckedByDefault) })> diff --git a/api/orders/listForKDS.cfm b/api/orders/listForKDS.cfm index c73b855..5f73f9f 100644 --- a/api/orders/listForKDS.cfm +++ b/api/orders/listForKDS.cfm @@ -124,10 +124,8 @@ i.Name, i.ParentItemID, i.IsCheckedByDefault, - i.IsInvertedGroup, i.StationID, - parent.Name AS ItemParentName, - COALESCE(parent.IsInvertedGroup, 0) AS ParentIsInvertedGroup + parent.Name AS ItemParentName FROM OrderLineItems oli INNER JOIN Items i ON i.ID = oli.ItemID LEFT JOIN Items parent ON parent.ID = i.ParentItemID @@ -149,47 +147,11 @@ "ParentItemID": qLineItems.ParentItemID, "ItemParentName": qLineItems.ItemParentName, "IsCheckedByDefault": qLineItems.IsCheckedByDefault, - "IsInvertedGroup": qLineItems.IsInvertedGroup, - "ParentIsInvertedGroup": qLineItems.ParentIsInvertedGroup, "StationID": qLineItems.StationID, "StatusID": val(qLineItems.StatusID) })> - - - - - - - - - - - - - - - - - - diff --git a/api/orders/setLineItem.cfm b/api/orders/setLineItem.cfm index 23a1dcf..1da6fbc 100644 --- a/api/orders/setLineItem.cfm +++ b/api/orders/setLineItem.cfm @@ -254,9 +254,7 @@ i.Name, i.ParentItemID, i.IsCheckedByDefault, - i.IsInvertedGroup, - parent.Name AS ItemParentName, - parent.IsInvertedGroup AS ParentIsInvertedGroup + parent.Name AS ItemParentName FROM OrderLineItems oli INNER JOIN Items i ON i.ID = oli.ItemID LEFT JOIN Items parent ON parent.ID = i.ParentItemID @@ -283,9 +281,7 @@ "Name": qLI.Name ?: "", "ParentItemID": val(qLI.ParentItemID), "ItemParentName": qLI.ItemParentName ?: "", - "IsCheckedByDefault": val(qLI.IsCheckedByDefault), - "IsInvertedGroup": val(qLI.IsInvertedGroup), - "ParentIsInvertedGroup": val(qLI.ParentIsInvertedGroup) + "IsCheckedByDefault": val(qLI.IsCheckedByDefault) })> diff --git a/api/tasks/getDetails.cfm b/api/tasks/getDetails.cfm index ce82e52..2ae687b 100644 --- a/api/tasks/getDetails.cfm +++ b/api/tasks/getDetails.cfm @@ -167,8 +167,7 @@ i.Name AS ItemName, i.ParentItemID, i.Price AS ItemPrice, - i.IsCheckedByDefault, - i.IsInvertedGroup + i.IsCheckedByDefault FROM OrderLineItems oli INNER JOIN Items i ON i.ID = oli.ItemID WHERE oli.OrderID = ? @@ -187,39 +186,10 @@ "ItemPrice": qLineItems.LineItemPrice, "Quantity": qLineItems.Quantity, "Remark": qLineItems.Remark, - "IsModifier": qLineItems.ParentOrderLineItemID GT 0, - "IsCheckedByDefault": qLineItems.IsCheckedByDefault, - "IsInvertedGroup": qLineItems.IsInvertedGroup + "IsModifier": qLineItems.ParentOrderLineItemID GT 0 })> - - - - - - - - - - - - diff --git a/kds/kds.js b/kds/kds.js index 2867267..49e5fd4 100644 --- a/kds/kds.js +++ b/kds/kds.js @@ -413,23 +413,6 @@ function renderAllModifiers(modifiers, allItems) { const leafModifiers = []; function collectLeafModifiers(mods, depth = 0) { mods.forEach(mod => { - // Inverted groups: show removed defaults with "NO" prefix instead of listing all selected defaults - // Check both the item itself (if group header is in order) and proxy (first child carries the data) - const isInverted = mod.IsInvertedGroup || mod.ISINVERTEDGROUP || mod.IsInvertedGroupProxy || mod.ISINVERTEDGROUPPROXY; - if (isInverted) { - const removed = mod.RemovedDefaults || mod.REMOVEDDEFAULTS || []; - if (removed.length > 0) { - const groupName = mod.ItemParentName || mod.Name; - removed.forEach(name => { - leafModifiers.push({ mod: { Name: 'NO ' + name, ItemParentName: groupName }, path: [] }); - }); - } - return; - } - - // Skip default modifiers inside inverted groups — handled above with "NO" prefix - if (mod.IsCheckedByDefault && (mod.ParentIsInvertedGroup || mod.PARENTISINVERTEDGROUP)) return; - const children = allItems.filter(item => item.ParentOrderLineItemID === mod.OrderLineItemID); if (children.length === 0) { const path = getModifierPath(mod); diff --git a/portal/menu-builder.html b/portal/menu-builder.html index c22e07e..683e874 100644 --- a/portal/menu-builder.html +++ b/portal/menu-builder.html @@ -2419,7 +2419,6 @@ sortOrder: obj.sortOrder || 0, requiresSelection: obj.requiresSelection || false, maxSelections: obj.maxSelections || 0, - isInverted: obj.isInverted || false, options: [] };