Project

General

Profile

Feature #433

Updated by Redmine Admin about 14 hours ago

# Menu Management System - Brief Explanation 

 ## Overview 
 The Menu Management system allows restaurants to organize their menu items hierarchically, manage recipes, and control which items are available at different stores through menu revisions. 

 --- 

 ## Core Entities 

 ### 1. **Brand** (Top Level) 
 - **Purpose**: Represents a restaurant chain/brand 
 - **Example**: "Pizza Palace" or "Curry House" 
 - **Contains**: Multiple stores, categories, menu items, recipes 

 ### 2. **Store** (Location) 
 - **Purpose**: Physical restaurant location 
 - **Example**: "Pizza Palace - Downtown Branch" 
 - **Contains**: Can have different menu revisions activated 

 ### 3. **Category** (Menu Grouping) 
 - **Purpose**: Groups menu items together (like "Main Courses", "Appetizers") 
 - **Fields**: 
   - `Name`: "Pizzas", "Indian Curries" 
   - `Code`: Optional identifier 
   - `Order`: Display order 
   - `ImageUrl`: Category image 
   - `BackgroundColour` / `ForegroundColour`: UI styling 
   - `IsActive` / `IsHidden`: Visibility control 
 - **Example**:  
   - Category: "Pizzas" (contains all pizza items) 
   - Category: "Indian Main Courses" (contains butter chicken, etc.) 

 ### 4. **Recipe** (Preparation Instructions) 
 - **Purpose**: Defines how to prepare a dish (for kitchen staff) 
 - **Fields**: 
   - `Name`: Recipe name 
   - `BrandId`: Which brand owns it 
 - **Example**: 
   - Recipe: "Margherita Pizza Recipe" 
   - Recipe: "Butter Chicken Recipe" 

 ### 5. **MenuItem** (The Actual Dish) 
 - **Purpose**: What customers see and order 
 - **Fields**: 
   - `Name`: "Margherita Pizza" or "Butter Chicken" 
   - `Description`: Customer-facing description 
   - `CategoryId`: Links to Category (e.g., "Pizzas") 
   - `RecipeId`: Links to Recipe (how to make it) 
   - `PriceExcludingTaxes`: Selling price 
   - `PluCode`: Product Look-Up code for POS 
   - `ImageUrl`: Product image 
   - `KitchenDescription`: Instructions for kitchen 
   - `Order`: Display order in menu 
   - `IsOptional`: Can have add-ons/modifiers 
   - `IsOptionalAutoEnabled`: Auto-enable optional items 
   - `HideOnTransaction` / `HideOnInvoice`: Visibility flags 
   - `IsRoyaltyExempt`: Financial flag 
   - `BackgroundColour` / `ForegroundColour`: UI styling 
 - **Example**: 
   - MenuItem: "Margherita Pizza" 
     - Category: "Pizzas" 
     - Recipe: "Margherita Pizza Recipe" 
     - Price: $12.99 
   - MenuItem: "Butter Chicken" 
     - Category: "Indian Main Courses" 
     - Recipe: "Butter Chicken Recipe" 
     - Price: $15.99 

 ### 6. **MenuRevision** (Menu Version Control) 
 - **Purpose**: Different versions of menus for different stores/profiles 
 - **Fields**: 
   - `Name`: "Summer Menu 2024", "Downtown Store Menu" 
   - `Description`: Notes about this revision 
   - `BrandId`: Which brand 
   - `ProfileId`: Links to a profile (store type, time period, etc.) 
   - `DerivedFromMenuRevisionId`: Can copy from another revision 
 - **Example**: 
   - MenuRevision: "Downtown Store - Full Menu" 
   - MenuRevision: "Airport Store - Limited Menu" (fewer items) 

 ### 7. **StoreOptionalItemMap** (Store-Specific Item Availability) 
 - **Purpose**: Controls which optional items/add-ons are available at specific stores 
 - **Links**: Store ↔ MenuItem (optional items) 

 ### 8. **StoreMenuNotificationStatus** (Menu Update Tracking) 
 - **Purpose**: Tracks when stores need to be notified about menu changes 
 - **Links**: Store ↔ MenuRevision ↔ OrderType 

 --- 

 ## Example Flow: Pizza & Butter Chicken 

 ### Scenario: "Pizza Palace" Brand with 2 Stores 

 #### Step 1: Create Categories 
 ``` 
 Category 1: 
 - Name: "Pizzas" 
 - Code: "PIZZA" 
 - Order: 1 
 - IsActive: true 

 Category 2: 
 - Name: "Indian Curries" 
 - Code: "CURRY" 
 - Order: 2 
 - IsActive: true 
 ``` 

 #### Step 2: Create Recipes 
 ``` 
 Recipe 1: 
 - Name: "Margherita Pizza Recipe" 
 - BrandId: Pizza Palace 

 Recipe 2: 
 - Name: "Butter Chicken Recipe" 
 - BrandId: Pizza Palace 
 ``` 

 #### Step 3: Create Menu Items 
 ``` 
 MenuItem 1: "Margherita Pizza" 
 - CategoryId: "Pizzas" (Category 1) 
 - RecipeId: "Margherita Pizza Recipe" (Recipe 1) 
 - PriceExcludingTaxes: $12.99 
 - Description: "Classic pizza with tomato, mozzarella, and basil" 
 - PluCode: "PIZ001" 
 - ImageUrl: "/images/margherita.jpg" 
 - KitchenDescription: "12-inch base, fresh mozzarella, basil garnish" 
 - Order: 1 
 - IsOptional: true (can add toppings) 

 MenuItem 2: "Butter Chicken" 
 - CategoryId: "Indian Curries" (Category 2) 
 - RecipeId: "Butter Chicken Recipe" (Recipe 2) 
 - PriceExcludingTaxes: $15.99 
 - Description: "Creamy tomato-based curry with tender chicken" 
 - PluCode: "CUR001" 
 - ImageUrl: "/images/butter-chicken.jpg" 
 - KitchenDescription: "Medium spice, serve with basmati rice" 
 - Order: 1 
 - IsOptional: false 
 ``` 

 #### Step 4: Create Menu Revisions 
 ``` 
 MenuRevision 1: "Downtown Store - Full Menu" 
 - BrandId: Pizza Palace 
 - ProfileId: FullMenuProfile 
 - Contains: All items (Pizza + Butter Chicken) 

 MenuRevision 2: "Airport Store - Pizza Only" 
 - BrandId: Pizza Palace 
 - ProfileId: LimitedMenuProfile 
 - Contains: Only Pizza items (no Butter Chicken) 
 ``` 

 #### Step 5: Activate Menu at Stores 
 ``` 
 Store 1: "Pizza Palace - Downtown" 
 - Active MenuRevision: "Downtown Store - Full Menu" 
 - Customers see: Both Pizza and Butter Chicken 

 Store 2: "Pizza Palace - Airport" 
 - Active MenuRevision: "Airport Store - Pizza Only" 
 - Customers see: Only Pizza (Butter Chicken hidden) 
 ``` 

 --- 

 ## Entity Relationships 

 ``` 
 Brand (1) ──→ (Many) Store 
 Brand (1) ──→ (Many) Category 
 Brand (1) ──→ (Many) Recipe 
 Brand (1) ──→ (Many) MenuItem 
 Brand (1) ──→ (Many) MenuRevision 

 Category (1) ──→ (Many) MenuItem 
 Recipe (1) ──→ (Many) MenuItem 

 MenuRevision (1) ──→ (Many) StoreMenuNotificationStatus 
 Store (1) ──→ (Many) StoreMenuNotificationStatus 
 Store (1) ──→ (Many) StoreOptionalItemMap 
 MenuItem (1) ──→ (Many) StoreOptionalItemMap 
 ``` 

 --- 

 ## Key Features 

 1. **Hierarchical Organization**: Brand → Category → MenuItem 
 2. **Recipe Management**: Separate recipes from menu items (one recipe can be used by multiple items) 
 3. **Menu Versioning**: Different menu revisions for different stores/profiles 
 4. **Store-Specific Control**: Each store can have different menu items available 
 5. **Optional Items**: Menu items can have add-ons/modifiers (like pizza toppings) 
 6. **Pricing**: Each menu item has its own price 
 7. **Visibility Control**: Hide items on transactions/invoices if needed 
 8. **Ordering**: Control display order of categories and items 

 --- 

 ## Workflow Example 

 1. **Admin creates Brand**: "Pizza Palace" 
 2. **Admin creates Categories**: "Pizzas", "Indian Curries" 
 3. **Admin creates Recipes**: "Margherita Recipe", "Butter Chicken Recipe" 
 4. **Admin creates Menu Items**: Links items to categories and recipes, sets prices 
 5. **Admin creates Menu Revisions**: Different menu versions 
 6. **Admin assigns Menu Revisions to Stores**: Each store gets appropriate menu 
 7. **Store activates Menu Revision**: Menu goes live at that store 
 8. **Customers order**: See menu items available at their store location 

 --- 

 ## Benefits 

 - **Centralized Management**: Manage all menu items at brand level 
 - **Flexibility**: Different stores can have different menus 
 - **Consistency**: Recipes ensure consistent preparation 
 - **Scalability**: Easy to add new items, categories, or stores 
 - **Control**: Fine-grained control over what's available where 

Back