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