The duplicate modifiers were caused by the app creating nested groups.
That's now fixed, so we can remove the deduplication workaround.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Updated listForKDS.cfm to include OrderTypeName in response
- Added getLocationLabel/getLocationValue helpers in kds.js
- Takeaway orders now show "Type: Takeaway"
- Delivery orders now show "Type: Delivery"
- Dine-in orders continue to show "Table: [name]"
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Auto-expire stale chats older than 20 minutes in createChat.cfm
- Add expireStaleChats.cfm for scheduled cleanup
- Add abandonOrder.cfm for Start Fresh functionality
- Add closeAllChats action to debugTasks.cfm
- Fix setOrderType NULL value for non-delivery orders
- Add ForceNew parameter to setLineItem for customized items
- Add public endpoint allowlist entries for new endpoints
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
createPaymentIntent.cfm now fetches the order's delivery fee
and includes it in the total amount charged to the customer.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
loadCartPayload now includes ItemName, ItemParentName, and
ItemIsCheckedByDefault so the cart displays proper breadcrumbs
immediately after adding items.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
getCart.cfm now returns ItemName, ItemParentName, and
ItemIsCheckedByDefault for each line item, enabling the
Flutter app to display modifier breadcrumbs like
"Select Drink: Coke" without needing a separate menu lookup.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- setLineItem.cfm: Attach default children from ItemTemplateLinks
(fixes drink choices not being saved for combos)
- listForKDS.cfm: Include ItemParentName for modifier categories
- kds.js: Display modifiers as "Category: Selection" format
- Various other accumulated fixes for menu builder, orders, and admin
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously the KDS was skipping modifiers marked as "checked by default",
but for exclusive selection groups (like drink choices) the customer's
actual selection should always be visible to the kitchen.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Display Pending/Invited/Active/Suspended from EmployeeStatusID
- Add CSS for pending and suspended status badges
- Update getStatusClass to handle employee status codes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>
- Replace Role column with Phone column in team table
- Add formatPhone() helper to format phone numbers nicely
- Add cleanupDuplicateEmployees.cfm admin script to remove duplicates
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add setHiring.cfm API endpoint to update BusinessIsHiring
- Add endpoint to Application.cfm allowlist
- Update portal.js to load and sync hiring toggle state
- Wire toggle to call API and show feedback toasts
- Bump portal.js version for cache busting
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add avatar.cfm: GET/POST for user profile photos with multi-extension support
- Add profile.cfm: GET/POST for user profile (name, email, phone)
- Add history.cfm: Order history endpoint with pagination
- Add addresses/list.cfm and add.cfm: Delivery address management
- Add setOrderType.cfm: Set delivery/takeaway type on orders
- Add checkToken.cfm: Debug endpoint for token validation
- Fix headerValue() in Application.cfm to use servlet request object
(Lucee CGI scope doesn't expose custom HTTP headers like X-User-Token)
- Update public allowlist for new endpoints
- Add privacy.html page
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Categories Migration:
- Add ItemCategoryID column to Items table (api/admin/addItemCategoryColumn.cfm)
- Migration script to populate Categories from unified schema (api/admin/migrateToCategories.cfm)
- Updated items.cfm and getForBuilder.cfm to use Categories table with fallback
KDS Station Selection:
- KDS now prompts for station selection on load (Kitchen, Bar, or All Stations)
- Station filter persists in localStorage
- Updated listForKDS.cfm to filter orders by station
- Simplified KDS UI with station badge in header
Portal Improvements:
- Fixed drag-and-drop in station assignment (proper event propagation)
- Fixed Back button links to use BASE_PATH for local development
- Added console logging for debugging station assignment
- Order detail API now calculates Subtotal, Tax, Tip, Total properly
Admin Tools:
- setupBigDeansStations.cfm - Create Kitchen and Bar stations for Big Dean's
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>
- New endpoint: api/tasks/getDetails.cfm
- Returns task info, customer info, service point, order line items
- Joins Tasks, Orders, Users, ServicePoints, OrderLineItems tables
- Add getDetails.cfm to public endpoints allowlist in Application.cfm
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Menu Builder - Required Selections:
- Added "Selection Rules" section for modifier groups
- Required (Yes/No) dropdown to mark if customer must select an option
- Max Selections input (0 = unlimited) to limit selections
- Visual "Required" badge (red) and "Max X" badge in modifier list
- Updated saveFromBuilder.cfm to persist ItemRequiresChildSelection
and ItemMaxNumSelectionReq to database
Portal Fixes:
- Fixed menu-builder link to include BASE_PATH for local dev
- Fixed stats.cfm to not reference non-existent Categories table
- Menu items count now uses ItemParentItemID > 0 (not ItemCategoryID)
Stripe Configuration:
- Added api/config/stripe.cfm for centralized Stripe key management
- Supports test/live mode switching
- Fee configuration variables (5% customer, 5% business, 2.9% + $0.30 card)
Payment Intent API:
- Updated createPaymentIntent.cfm with proper fee structure
- Customer pays: subtotal + tax + tip + 5% Payfrit fee + card processing
- Platform receives 10% total (5% from customer + 5% from business)
- Saves fee breakdown to order record
Beacon Management:
- Updated switchBeacons.cfm to move beacons between businesses
- Currently configured: Big Dean's (27) -> In-N-Out (17)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Portal local development:
- Add BASE_PATH detection to all portal files (login, portal.js, menu-builder, station-assignment)
- Allows portal to work at /biz.payfrit.com/ path locally
Menu Builder fixes:
- Fix duplicate template options in getForBuilder.cfm query
- Filter template children by business ID with DISTINCT
New APIs:
- api/portal/myBusinesses.cfm - List businesses for logged-in user
- api/stations/list.cfm - List KDS stations
- api/menu/updateStations.cfm - Update item station assignments
- api/setup/reimportBigDeans.cfm - Full Big Dean's menu import script
Admin utilities:
- Various debug and migration scripts for menu/template management
- Beacon switching, category cleanup, modifier template setup
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Task System:
- Tasks auto-created when KDS marks order Ready (status 3)
- Duplicate task prevention via TaskOrderID check
- Task completion now marks associated order as Completed (status 4)
- Fixed isNull() check for TaskCompletedOn (use len() instead)
- Added TaskOrderID to task queries for order linking
Worker APIs:
- api/workers/myBusinesses.cfm with GROUP BY to prevent duplicates
- api/tasks/listMine.cfm for worker's claimed tasks with filters
- api/tasks/complete.cfm updates both task and order status
- api/tasks/accept.cfm for claiming tasks
KDS/Portal:
- KDS only shows orders with status < 4
- Portal dashboard improvements
Admin/Debug:
- Debug endpoints for tasks and businesses
- Test data reset endpoint
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Portal:
- New business portal UI (portal/index.html, portal.css, portal.js)
- Dashboard with real-time stats (orders today, revenue, pending, menu items)
- Business info endpoint (api/businesses/get.cfm)
- Portal stats endpoint (api/portal/stats.cfm)
- Menu page links to existing full-featured menu editor
Stripe Connect:
- Onboarding endpoint (api/stripe/onboard.cfm)
- Status check endpoint (api/stripe/status.cfm)
- Payment intent creation (api/stripe/createPaymentIntent.cfm)
- Webhook handler (api/stripe/webhook.cfm)
Beacon APIs:
- List all beacons (api/beacons/list_all.cfm)
- Get business from beacon (api/beacons/getBusinessFromBeacon.cfm)
Task System:
- List pending tasks (api/tasks/listPending.cfm)
- Accept task (api/tasks/accept.cfm)
Other:
- HUD interface for quick order status display
- KDS debug/test pages
- Updated Application.cfm with public endpoint allowlist
- Order status check improvements
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
API Changes:
- checkStatusUpdate.cfm: Fixed to use OrderStatusID != 7 instead of non-existent OrderIsDeleted column
- Application.cfm: Added checkStatusUpdate.cfm to public API allowlist
- getOrCreateCart.cfm: Fixed delivery fee to only apply for OrderTypeID = 2 (delivery)
Order Type Logic:
- 1 = Dine-in (no delivery fee)
- 2 = Delivery (delivery fee applied)
- 3 = Takeaway (no delivery fee)
- 4 = Ship-to (no delivery fee)
Status Translation:
- Uses OrderStatusID != 7 to filter deleted orders (tt_OrderStatuses table)
🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Backend changes:
- New API endpoint: checkStatusUpdate.cfm - polls order status and detects changes
- Updated admin.html: added test section for manually updating order status
- Status flow: 1(submitted) → 2(preparing) → 3(ready) → 4(completed)
- Human-readable status messages for each state
Testing interface:
- Order ID input field
- Status dropdown selector
- Direct integration with existing updateStatus.cfm endpoint
This enables real-time status notifications for customer orders with 30-second polling interval (Option 2 approach, with planned migration to self-hosted push).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Created admin.html for BusinessID=17 to manually create test orders
- Service point selector with all tables
- Dynamic menu item rows with quantities
- Three-step order creation: cart → line items → submit
- Modern gradient UI with purple theme
- Success/error notifications
- Form auto-resets after successful order creation
Technical details:
- Fixed case sensitivity: API returns uppercase keys (ORDER, ORDERLINEITEMS)
- Fixed parameter naming: BusinessID (not OrderBusinessID)
- Added links to KDS display and debug view
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Rewrote modifier rendering to display leaf modifiers only
- Added breadcrumb paths for full context (e.g., "Customize Spread: Extra")
- Eliminated nested div wrappers that were breaking the display
- Added comprehensive debug logging for troubleshooting
- Modifiers now show complete hierarchy without clutter
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- index.html: Complete KDS interface with dark theme
- Responsive grid layout for order cards
- Status indicator with connection monitoring
- Configuration panel for settings
- Empty state display
- kds.js: Real-time order management JavaScript
- Auto-refresh with configurable interval
- Order status updates via API
- Elapsed time calculation with visual warnings
- Hierarchical line item rendering with recursive modifiers
- LocalStorage-based configuration persistence
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Created listForKDS.cfm API endpoint for retrieving active orders
- Filters by BusinessID and optional ServicePointID
- Returns orders with StatusID 1-3 (New, Preparing, Ready)
- Includes nested line items with item names
- Joins customer and service point information
- Created updateStatus.cfm API endpoint for order status transitions
- Updates OrderStatusID (New -> Preparing -> Ready -> Completed)
- Updates OrderLastEditedOn timestamp
- Validates order exists before updating
- Built complete HTML/JavaScript KDS web application
- Real-time order display with configurable auto-refresh (default 5s)
- Color-coded status cards: Blue (New), Orange (Preparing), Green (Ready)
- Elapsed time tracking with visual warnings at 10min and 15min
- Hierarchical line item display showing root items with nested modifiers
- One-click status progression buttons
- Persistent configuration (BusinessID, ServicePointID filter, refresh interval)
- Responsive grid layout for multiple concurrent orders
- Dark theme optimized for kitchen environments
- Updated Application.cfm to allow public access to KDS endpoints
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Cart management improvements:
- Added cart endpoints to public API allowlist (getOrCreateCart, setLineItem, getCart, submit)
- Fixed setLineItem null parameter handling for remarks
- Standardized API responses to use uppercase keys (ORDER, ORDERLINEITEMS)
- Updated getCart to match response format consistency
- Added CategoryName to menu items endpoint
These changes enable the mobile app to browse menu with categories and manage cart operations without authentication.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>