JikoXpress Pro - Menu & Dish Management System
Version: 1.0
Target Market: East African Restaurant Industry
System Type: Kitchen Management System with Component-Based Inventory
1. System Overview
JikoXpress Pro is a comprehensive restaurant kitchen management system designed specifically for the East African market. The system provides component-based inventory tracking, flexible menu scheduling, comprehensive waste management, and detailed profit analytics.
Core Philosophy: Track everything at the component (dish) level, regardless of how items are sold - standalone, in combos, or custom builds.
2. Core Concepts
2.1 Dish (Component)
The fundamental building block of the entire system. A dish is any individual food item that can be:
- Sold standalone
- Combined into menu schedules
- Tracked in inventory
- Used in custom builds
Dish Properties
| Property | Type | Description |
|---|---|---|
id |
UUID | Unique identifier |
name |
String | Display name (e.g., "Ugali", "Maharage") |
prepCost |
BigDecimal | Cost to prepare one portion |
sellingPrice |
BigDecimal | Standalone selling price |
currentInventory |
Integer | Available portions |
canSellStandalone |
Boolean | Whether item can be sold individually |
imageUrl |
String | Required dish photo |
thumbnailUrl |
String | Auto-generated thumbnail |
active |
Boolean | Whether dish is available |
Dish Examples
Dish: Ugali
- prepCost: 100 TSH
- sellingPrice: 300 TSH
- canSellStandalone: true
Dish: Maharage (Beans)
- prepCost: 200 TSH
- sellingPrice: 400 TSH
- canSellStandalone: true
Dish: Chai (Tea)
- prepCost: 20 TSH
- sellingPrice: 100 TSH
- canSellStandalone: true
Important: Dishes do NOT have time-based visibility. Time visibility is handled at the Menu Schedule level only.
2.2 Menu Schedule
Pre-defined combinations of dishes with time-based visibility and promotional pricing.
Menu Schedule Properties
| Property | Type | Description |
|---|---|---|
id |
UUID | Unique identifier |
name |
String | Display name (e.g., "Lunch Special") |
components |
List<Dish> | Dishes included in this menu |
componentCost |
BigDecimal | Auto-calculated from components |
sellingPrice |
BigDecimal | Manually set (can be promotional) |
category |
Enum | MAIN_FOOD, DRINKS, SNACKS, DESSERTS |
session |
Enum | BREAKFAST, LUNCH, DINNER, ALL_DAY |
scheduleType |
Enum | ONE_TIME, DAILY, WEEKLY, PERMANENT |
menuType |
Enum | COMBO, INDIVIDUAL_ITEM |
visibleFrom |
LocalTime | Start time for visibility |
visibleUntil |
LocalTime | End time for visibility |
activeDays |
Set<DayOfWeek> | For recurring schedules |
validFrom |
LocalDate | Start date validity |
validUntil |
LocalDate | End date validity |
active |
Boolean | Master on/off switch |
heroImageUrl |
String | Optional custom combo image |
Key Concepts
1. Category vs Session:
Category (Product Type): Session (Time Slot):
- MAIN_FOOD - BREAKFAST (6am-10am)
- DRINKS - LUNCH (12pm-3pm)
- SNACKS - DINNER (6pm-9pm)
- DESSERTS - ALL_DAY
2. Schedule Types:
ONE_TIME: Special event menu (e.g., "New Year Special")
DAILY: Repeats every day within time window
WEEKLY: Repeats on specific days (e.g., Mon-Fri only)
PERMANENT: Always available (within time window)
COMBO: Multiple components (e.g., Ugali + Maharage)
INDIVIDUAL_ITEM: Single component as menu item (e.g., standalone Chai)
Menu Schedule Examples
Name: "Ugali + Maharage Special"
Components: [Ugali, Maharage]
Category: MAIN_FOOD
Session: LUNCH
Schedule Type: DAILY
Menu Type: COMBO
Visible: 12:00 - 15:00
Component Cost: 300 TSH (100 + 200)
Selling Price: 600 TSH
Profit Margin: 300 TSH (50%)
Name: "Chai"
Components: [Chai]
Category: DRINKS
Session: BREAKFAST
Schedule Type: DAILY
Menu Type: INDIVIDUAL_ITEM
Visible: 06:00 - 10:00
Component Cost: 20 TSH
Selling Price: 100 TSH
Profit Margin: 80 TSH
2.3 Selling Price Strategy
Critical Design Decision: Selling prices exist at BOTH levels.
Where Prices Are Set
| Level | Purpose | Example |
|---|---|---|
| Dish Level | Standalone/custom build sales | Ugali = 300 TSH |
| Menu Schedule Level | Combo/promotional pricing | "Ugali + Maharage" = 600 TSH |
Price Usage Rules
Flow 1: Customer orders Menu Schedule
→ Use MENU price (600 TSH)
→ Allocate revenue proportionally to components
Flow 2: Customer orders standalone dish
→ Use DISH price (300 TSH)
→ Full revenue to that dish
Flow 3: Custom build
→ Sum of DISH prices (300 + 400 = 700 TSH)
→ Each component gets full price
Same Components, Different Prices
Scenario Price Source Amount
─────────────────────────────────────────────────────────
"Ugali + Maharage Special" Menu 600 TSH
Ugali standalone Dish 300 TSH
Maharage standalone Dish 400 TSH
Custom: Ugali + Maharage Sum of Dishes 700 TSH
3. Order Flow & Sales Tracking
3.1 Order Entity Structure
Order
├── id: UUID
├── orderNumber: String (auto-generated)
├── orderType: MENU_SCHEDULE | CUSTOM_BUILD | STANDALONE
├── subtotal: BigDecimal
├── discountType: PERCENTAGE | FIXED_AMOUNT | PROMO_CODE | MANAGER_OVERRIDE
├── discountValue: BigDecimal
├── discountAmount: BigDecimal
├── total: BigDecimal
├── paymentMethod: CASH | MOBILE_MONEY
├── status: PENDING | COMPLETED | CANCELLED
├── createdBy: Staff
├── createdAt: LocalDateTime
└── items: List<OrderItem>
OrderItem
├── id: UUID
├── dish: Dish
├── menuSchedule: MenuSchedule (nullable)
├── quantity: Integer
├── sourceType: MENU_SCHEDULE | CUSTOM_BUILD | STANDALONE
├── priceType: ALLOCATED | FULL_PRICE
├── originalPrice: BigDecimal
├── allocatedRevenue: BigDecimal
├── discountAllocation: BigDecimal
├── netRevenue: BigDecimal
├── prepCost: BigDecimal
└── profit: BigDecimal
3.2 Three Sales Flows
Flow 1: Menu Schedule Order
Customer orders a pre-defined combo.
Customer: "I want the Lunch Special"
Order Created:
- orderType: MENU_SCHEDULE
- Menu: "Ugali + Maharage Special" (600 TSH)
OrderItems Created:
1. Ugali
- sourceType: MENU_SCHEDULE
- menuScheduleId: "lunch-special"
- priceType: ALLOCATED
- allocatedRevenue: 257.14 TSH (proportional)
- prepCost: 100 TSH
- profit: 157.14 TSH
2. Maharage
- sourceType: MENU_SCHEDULE
- menuScheduleId: "lunch-special"
- priceType: ALLOCATED
- allocatedRevenue: 342.86 TSH (proportional)
- prepCost: 200 TSH
- profit: 142.86 TSH
Inventory Impact:
- Ugali: -1
- Maharage: -1
Flow 2: Standalone Order
Customer orders a single dish.
Customer: "Just Chai please"
Order Created:
- orderType: STANDALONE
OrderItem Created:
1. Chai
- sourceType: STANDALONE
- menuScheduleId: null
- priceType: FULL_PRICE
- allocatedRevenue: 100 TSH (full price)
- prepCost: 20 TSH
- profit: 80 TSH
Inventory Impact:
- Chai: -1
Flow 3: Custom Build Order
Counter staff builds a custom combination.
Staff picks: Ugali + Maharage + Nyama
Order Created:
- orderType: CUSTOM_BUILD
- Total: 300 + 400 + 600 = 1,300 TSH
OrderItems Created:
1. Ugali
- sourceType: CUSTOM_BUILD
- priceType: FULL_PRICE
- allocatedRevenue: 300 TSH
- prepCost: 100 TSH
- profit: 200 TSH
2. Maharage
- sourceType: CUSTOM_BUILD
- priceType: FULL_PRICE
- allocatedRevenue: 400 TSH
- prepCost: 200 TSH
- profit: 200 TSH
3. Nyama
- sourceType: CUSTOM_BUILD
- priceType: FULL_PRICE
- allocatedRevenue: 600 TSH
- prepCost: 300 TSH
- profit: 300 TSH
Inventory Impact:
- Ugali: -1
- Maharage: -1
- Nyama: -1
3.3 Revenue Allocation (Proportional)
Allocation Formula
Component Allocation = Menu Price × (Component Standalone Price / Total Standalone Prices)
Allocation Example
Menu: "Ugali + Maharage Special"
Selling Price: 600 TSH
Components:
- Ugali standalone: 300 TSH
- Maharage standalone: 400 TSH
Total standalone: 700 TSH
Allocation:
- Ugali: 600 × (300/700) = 600 × 0.4286 = 257.14 TSH
- Maharage: 600 × (400/700) = 600 × 0.5714 = 342.86 TSH
Total: 600 TSH ✓
Why Proportional?
Restaurant owners need to see profit/loss per item. Proportional allocation ensures:
- Each item gets same percentage discount as the combo offers
- Fair distribution based on relative value
- Accurate item-level profitability reporting
4. Discount System
4.1 Discount Structure
Design Decision: Order-level discounts only (not item-level).
Discount Types
| Type | Description | Example |
|---|---|---|
PERCENTAGE |
Percentage off total | 10% off |
FIXED_AMOUNT |
Fixed amount off | 200 TSH off |
PROMO_CODE |
Promotional code | "LUNCH10" |
MANAGER_OVERRIDE |
Manual discount with reason | Customer complaint |
STAFF_MEAL |
100% discount for staff | Employee meal |
ROUNDING |
Cash rounding adjustment | Round to 50/100 |
4.2 Discount Application
Discounts are distributed proportionally to all items.
Example
Order:
- Ugali + Maharage Special: 600 TSH
- Wali + Nyama: 800 TSH
- Chai: 100 TSH
Subtotal: 1,500 TSH
Discount: 10% = 150 TSH
Distribution (same % to each):
- Ugali + Maharage: 600 - 60 = 540 TSH (10% off)
- Wali + Nyama: 800 - 80 = 720 TSH (10% off)
- Chai: 100 - 10 = 90 TSH (10% off)
Total: 1,350 TSH ✓
4.3 Counter App Discount Flow
┌─────────────────────────────────┐
│ Current Order │
├─────────────────────────────────┤
│ Ugali + Maharage Special 600 │
│ Chai 100 │
│ │
│ Subtotal: 700 │
│ │
│ [💰 Apply Discount] │
│ [✅ Complete Order] │
└─────────────────────────────────┘
↓ Tap Apply Discount
┌─────────────────────────────────┐
│ Apply Discount │
├─────────────────────────────────┤
│ Type: │
│ ○ Percentage (%) │
│ ○ Fixed Amount (TSH) │
│ ○ Promo Code │
│ │
│ Value: [10] % │
│ │
│ Reason: [Customer complaint___] │
│ │
│ Preview: │
│ Subtotal: 700 │
│ Discount: -70 │
│ ═══════════════════════ │
│ Total: 630 ✓ │
│ │
│ [Cancel] [Apply] │
└─────────────────────────────────┘
4.4 Cash Rounding (Tanzania Specific)
Tanzania uses cash denominations (50/100 TSH coins). System handles rounding.
Rounding Options
Calculated Total: 315 TSH
Options:
1. Round to nearest 50: 300 TSH (customer saves 15)
2. Round to nearest 100: 300 TSH (customer saves 15)
3. Staff adjustment: Apply -15 discount
4. Credit to wallet: 15 TSH for next order
Mobile Money
No rounding needed - exact amounts supported.
5. Inventory Management
5.1 Component-Level Tracking
Core Principle: All inventory is tracked at the dish (component) level, never at menu level.
How It Works
Sale: "Ugali + Maharage Special"
Inventory Update:
- Ugali: -1 portion
- Maharage: -1 portion
NOT:
- "Ugali + Maharage Special": -1 ← WRONG! No menu-level inventory
5.2 Stock Adjustment System
Three adjustment types with live calculation preview.
Action 1: Prep New Batch
Adds inventory when kitchen prepares food.
┌─────────────────────────────────┐
│ Prep New Batch - Beans │
├─────────────────────────────────┤
│ Quantity prepared: [50] │
│ │
│ ┌─────────────────────────────┐ │
│ │ Calculation Preview: │ │
│ ├─────────────────────────────┤ │
│ │ Current stock: 15 │ │
│ │ Adding: +50 │ │
│ │ ═══════════════════════ │ │
│ │ New stock: 65 ✓ │ │
│ └─────────────────────────────┘ │
│ │
│ Prep cost (optional): [2000] │
│ Prepared by: Chef John (auto) │
│ Time: 8:00 AM (auto) │
│ │
│ [Cancel] [Confirm Prep] │
└─────────────────────────────────┘
Records:
- Quantity prepared
- Prep cost (optional)
- Who prepared
- Timestamp
Action 2: Dump/Waste
Removes inventory with waste tracking.
┌─────────────────────────────────┐
│ Dump/Waste - Ugali │
├─────────────────────────────────┤
│ Quantity to dump: [10] │
│ │
│ ┌─────────────────────────────┐ │
│ │ Calculation Preview: │ │
│ ├─────────────────────────────┤ │
│ │ Current stock: 65 │ │
│ │ Removing: -10 │ │
│ │ ═══════════════════════ │ │
│ │ New stock: 55 ✓ │ │
│ │ Waste value: 400 💸 │ │
│ └─────────────────────────────┘ │
│ │
│ Reason: │
│ ○ Spoiled/Expired │
│ ● Poor quality │
│ ○ Overcooked │
│ ○ Dropped/Accident │
│ ○ End of day dump │
│ ○ Other: [___________] │
│ │
│ Dumped by: Chef Mary (auto) │
│ Time: 2:30 PM (auto) │
│ │
│ [Cancel] [Confirm Dump] │
└─────────────────────────────────┘
Waste Reasons:
- Spoiled/Expired
- Poor quality
- Overcooked
- Dropped/Accident
- End of day dump
- Other (free text)
Action 3: Manual Adjust
General corrections for edge cases.
┌─────────────────────────────────┐
│ Manual Adjust - Rice │
├─────────────────────────────────┤
│ Adjustment type: │
│ ● Add inventory │
│ ○ Remove inventory │
│ │
│ Quantity: [5] │
│ │
│ ┌─────────────────────────────┐ │
│ │ Calculation Preview: │ │
│ ├─────────────────────────────┤ │
│ │ Current stock: 55 │ │
│ │ Adding: +5 │ │
│ │ ═══════════════════════ │ │
│ │ New stock: 60 ✓ │ │
│ └─────────────────────────────┘ │
│ │
│ Reason: │
│ ● Recount correction │
│ ○ Found missing stock │
│ ○ System error │
│ ○ Transfer from storage │
│ ○ Other: [___________] │
│ │
│ [Cancel] [Confirm Adjustment] │
└─────────────────────────────────┘
Adjustment Reasons:
- Recount correction
- Found missing stock
- System error
- Transfer from storage
- Other (free text)
5.3 Error Prevention
Cannot Remove More Than Available
Quantity to dump: [100]
┌─────────────────────────────────┐
│ Calculation Preview: │
├─────────────────────────────────┤
│ Current stock: 60 │
│ Removing: -100 │
│ ═══════════════════════ │
│ New stock: -40 ❌ │
│ │
│ ⚠️ Cannot remove more than │
│ available! │
│ Max: 60 portions │
└─────────────────────────────────┘
[Confirm] ← DISABLED
Large Adjustment Warning
If dumping > 15 portions OR value > 500 TSH:
┌─────────────────────────────────┐
│ ⚠️ Confirm Large Waste │
├─────────────────────────────────┤
│ Dumping: 50 portions │
│ Value: 2,000 TSH │
│ Reason: End of day dump │
│ │
│ This is a significant loss. │
│ Please confirm. │
│ │
│ [Cancel] [Yes, Dump] │
└─────────────────────────────────┘
5.4 Permission Recommendations
| Action | Kitchen Staff | Manager |
|---|---|---|
| Prep New Batch | ✓ | ✓ |
| Dump/Waste | ✓ | ✓ |
| Manual Adjust | ✗ | ✓ |
6. Counter App Interface
6.1 Main Screen Layout
┌─────────────────────────────────────────────────┐
│ JikoXpress Pro - Counter │
├─────────────────────────────────────────────────┤
│ │
│ Filter by Category: │
│ [All] [Main Food] [Drinks] [Snacks] [Desserts] │
│ │
├─────────────────────────────────────────────────┤
│ │
│ MEAL COMBOS (Lunch - Active) │
│ ┌─────────────────────────────────────────────┐ │
│ │ Ugali + Maharage 600 TSH │ │
│ │ Wali + Nyama 800 TSH │ │
│ │ Rice + Beans 550 TSH │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ DRINKS & EXTRAS │
│ ┌─────────────────────────────────────────────┐ │
│ │ Chai 100 TSH │ │
│ │ Soda 150 TSH │ │
│ │ Juice 200 TSH │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ [🔨 Build Custom Plate] │
│ │
└─────────────────────────────────────────────────┘
6.2 Build Custom Flow
┌─────────────────────────────────────────────────┐
│ Build Your Plate │
├─────────────────────────────────────────────────┤
│ │
│ Available Items: │
│ □ Ugali 300 TSH │
│ □ Maharage 400 TSH │
│ □ Nyama 600 TSH │
│ □ Wali 250 TSH │
│ □ Beans 300 TSH │
│ □ Chai 100 TSH │
│ │
│ ───────────────────────────────── │
│ │
│ Selected (3): │
│ ✓ Ugali 300 TSH │
│ ✓ Maharage 400 TSH │
│ ✓ Nyama 600 TSH │
│ │
│ ═══════════════════════════════════ │
│ Total: 1,300 TSH │
│ │
│ [Cancel] [Add to Cart] │
│ │
└─────────────────────────────────────────────────┘
6.3 Cart & Checkout
┌─────────────────────────────────────────────────┐
│ Current Order │
├─────────────────────────────────────────────────┤
│ │
│ 1. Ugali + Maharage Special × 1 600 │
│ 2. Chai × 1 100 │
│ 3. [Custom] Ugali + Nyama × 1 900 │
│ │
│ ───────────────────────────────── │
│ Subtotal: 1,600 │
│ Discount (10%): -160 │
│ ═══════════════════════════════════ │
│ Total: 1,440 │
│ │
│ [💰 Apply Discount] │
│ │
│ Payment Method: │
│ [💵 Cash] [📱 Mobile Money] │
│ │
│ [✅ Complete Order] │
│ │
└─────────────────────────────────────────────────┘
7. Customer App Flow
7.1 Time-Based Menu Display
Customer app shows only menus currently visible based on time.
8:00 AM Customer View:
┌─────────────────────────────────────────────────┐
│ 🌅 Breakfast Menu │
├─────────────────────────────────────────────────┤
│ │
│ COMBO DEALS │
│ ┌─────────────────────────────────────────────┐ │
│ │ 🍳 Mandazi + Chai 200 TSH │ │
│ │ 💰 Save 20! │ │
│ ├─────────────────────────────────────────────┤ │
│ │ 🍚 Ugali + Maharage 350 TSH │ │
│ │ 💰 Save 50! │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ INDIVIDUAL ITEMS │
│ ┌─────────────────────────────────────────────┐ │
│ │ Mandazi 120 TSH │ │
│ │ Chai 100 TSH │ │
│ │ Ugali 200 TSH │ │
│ └─────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────┘
7.2 Standalone Item Solution
Problem: Customer wants just Mandazi, but only "Mandazi + Chai" combo exists.
Solution: Create both combo AND individual menu schedules.
Breakfast Menus (6:00 - 10:00):
1. "Mandazi + Chai" (combo) = 200 TSH
2. "Mandazi" (individual) = 120 TSH
3. "Chai" (individual) = 100 TSH
Customer can choose:
- Combo (save 20 TSH)
- Just Mandazi
- Just Chai
8. Reports & Analytics
8.1 Daily Sales Report
═══════════════════════════════════════════════════════
DAILY SALES REPORT - January 15, 2025
═══════════════════════════════════════════════════════
SUMMARY:
───────────────────────────────────────────────────────
Total Orders: 45
Gross Sales: 50,000 TSH
Discounts Given: -3,500 TSH (7%)
Net Sales: 46,500 TSH
Total Food Cost: 18,600 TSH
Gross Profit: 27,900 TSH
Profit Margin: 60%
DISCOUNT BREAKDOWN:
───────────────────────────────────────────────────────
Manager Override: 2,000 TSH
Promo Codes: 1,000 TSH
Staff Meals: 500 TSH
PAYMENT METHODS:
───────────────────────────────────────────────────────
Cash: 30,000 TSH (64%)
Mobile Money: 16,500 TSH (36%)
8.2 Item Sales Report
═══════════════════════════════════════════════════════
ITEM SALES REPORT - January 15, 2025
═══════════════════════════════════════════════════════
Item Qty Revenue Cost Profit Margin
───────────────────────────────────────────────────────────────
Ugali 45 11,571 4,500 7,071 61.1%
Maharage 52 13,943 10,400 3,543 25.4%
Wali 35 8,750 3,500 5,250 60.0%
Nyama 28 15,736 8,400 7,336 46.6%
Chai 30 3,000 600 2,400 80.0%
───────────────────────────────────────────────────────────────
TOTAL 190 53,000 27,400 25,600 48.3%
TOP PERFORMERS (by profit):
1. Nyama: 7,336 TSH (28 sold)
2. Ugali: 7,071 TSH (45 sold) ⭐ High volume
3. Wali: 5,250 TSH (35 sold)
ATTENTION NEEDED:
1. Maharage: 25.4% margin ⚠️
- High volume but lowest margin
- Consider: raise prices or reduce prep cost
8.3 Item Deep Dive Report
═══════════════════════════════════════════════════════
UGALI - DETAILED P&L REPORT
═══════════════════════════════════════════════════════
Quantity Sold: 45 portions
REVENUE BREAKDOWN:
───────────────────────────────────────────────────────
From Menu "Ugali + Maharage Special":
25 orders × 257.14 allocated = 6,428.50
From Menu "Ugali + Nyama Special":
15 orders × 240.00 allocated = 3,600.00
From Standalone:
5 orders × 300.00 full price = 1,500.00
From Custom Builds:
(various allocations) = 42.50
───────────────────────────────────────────────────────
Total Revenue: 11,571.00
Total Cost: 4,500.00 (45 × 100)
═══════════════════════════════════════════════════════
Gross Profit: 7,071.00
Profit Margin: 61.1%
Average Revenue per Portion: 257.13
Cost per Portion: 100.00
Average Profit per Portion: 157.13
8.4 Waste Report
═══════════════════════════════════════════════════════
WASTE REPORT - January 15, 2025
═══════════════════════════════════════════════════════
BY COMPONENT:
───────────────────────────────────────────────────────
Beans: 5 portions (200 TSH cost)
• Spoiled: 3 portions
• Poor quality: 2 portions
Ugali: 12 portions (1,200 TSH cost)
• End of day: 12 portions
Rice: 3 portions (150 TSH cost)
• Dropped: 3 portions
───────────────────────────────────────────────────────
TOTAL WASTE: 20 portions
TOTAL COST: 1,550 TSH
% OF FOOD COST: 2.8%
WASTE BY REASON:
───────────────────────────────────────────────────────
End of day dump: 12 portions (60%)
Spoiled: 3 portions (15%)
Poor quality: 2 portions (10%)
Dropped: 3 portions (15%)
8.5 Prep Report
═══════════════════════════════════════════════════════
PREP REPORT - January 15, 2025
═══════════════════════════════════════════════════════
TIME STAFF ITEM QTY COST
───────────────────────────────────────────────────────
08:00 Chef John Beans 50 2,000
08:30 Chef John Ugali 30 1,500
09:00 Chef Mary Rice 40 1,600
12:00 Chef John Beans 25 1,000
14:30 Chef Mary Ugali 20 1,000
───────────────────────────────────────────────────────
TOTAL PREP COST: 7,100
BY CHEF:
Chef John: 105 portions 4,500 TSH
Chef Mary: 60 portions 2,600 TSH
8.6 Menu Engineering Matrix
═══════════════════════════════════════════════════════
MENU ENGINEERING MATRIX
═══════════════════════════════════════════════════════
│ High Profit │ Low Profit
──────────────┼──────────────────────┼─────────────────
High Volume │ ⭐ STARS │ 🐴 WORKHORSES
│ Nyama, Ugali │ Maharage
│ → Promote heavily │ → Fix pricing
──────────────┼──────────────────────┼─────────────────
Low Volume │ 🔮 PUZZLES │ 🐕 DOGS
│ Wali │ (none currently)
│ → Test promotions │ → Consider removing
──────────────┴──────────────────────┴─────────────────
RECOMMENDATIONS:
───────────────────────────────────────────────────────
⭐ Nyama: Keep promoting - high margin, growing volume
⭐ Ugali: Maintain quality - consistent performer
🐴 Maharage: Increase price to 450 or reduce prep cost
🔮 Wali: Run "Wali Specials" to boost volume
8.7 Audit Trail
═══════════════════════════════════════════════════════
ADJUSTMENT AUDIT - January 15, 2025
═══════════════════════════════════════════════════════
TIME STAFF ACTION ITEM QTY REASON
───────────────────────────────────────────────────────
08:00 Chef John PREP Beans +50 Morning prep
08:30 Chef John PREP Ugali +30 Morning prep
14:30 Chef Mary DUMP Ugali -3 Poor quality
16:00 Chef Mary DUMP Beans -2 Spoiled
20:00 Manager ADJUST Beans -2 Recount
20:30 Chef John DUMP Ugali -12 End of day
───────────────────────────────────────────────────────
LARGE ADJUSTMENTS (>15 portions or >500 TSH):
• 20:30 - Ugali dump: 12 portions (1,200 TSH)
Approved by: Manager
Reason: End of day - remaining portions
9. Image Management
9.1 Strategy
| Entity | Image Requirement |
|---|---|
| Dish | REQUIRED - all dishes must have image |
| Menu Schedule | OPTIONAL - custom hero image |
| Fallback | Use component images if no menu image |
9.2 Image Sizes
Original: 1200 × 1200 (storage)
Large: 800 × 800 (desktop detail view)
Medium: 600 × 600 (mobile, listings)
Thumbnail: 200 × 200 (cart, small displays)
9.3 Image Requirements
Format: JPEG or PNG (WebP preferred)
Max Size: 5MB
Min Size: 400 × 400
Quality: 80-85% compression
10. Data Models Summary
10.1 Complete Entity Diagram
┌─────────────────┐
│ Dish │
├─────────────────┤
│ id │
│ name │
│ prepCost │
│ sellingPrice │
│ currentInventory│
│ canSellStandalone│
│ imageUrl │
│ active │
└────────┬────────┘
│
│ components
▼
┌─────────────────┐
│ MenuSchedule │
├─────────────────┤
│ id │
│ name │
│ category │
│ session │
│ scheduleType │
│ menuType │
│ sellingPrice │
│ visibleFrom │
│ visibleUntil │
│ activeDays │
│ active │
└────────┬────────┘
│
│ menuSchedule
▼
┌─────────────────┐ ┌─────────────────┐
│ OrderItem │◄───────│ Order │
├─────────────────┤ ├─────────────────┤
│ id │ │ id │
│ dish │ │ orderNumber │
│ menuSchedule │ │ orderType │
│ quantity │ │ subtotal │
│ sourceType │ │ discountType │
│ priceType │ │ discountAmount │
│ allocatedRevenue│ │ total │
│ prepCost │ │ paymentMethod │
│ profit │ │ status │
└─────────────────┘ │ createdBy │
│ createdAt │
└─────────────────┘
┌─────────────────┐
│ StockAdjustment │
├─────────────────┤
│ id │
│ dish │
│ adjustmentType │
│ quantity │
│ reason │
│ reasonCategory │
│ costImpact │
│ adjustedBy │
│ adjustedAt │
│ previousStock │
│ newStock │
└─────────────────┘
10.2 Enums
enum MenuCategory {
MAIN_FOOD,
DRINKS,
SNACKS,
DESSERTS
}
enum FoodSession {
BREAKFAST,
LUNCH,
DINNER,
ALL_DAY
}
enum ScheduleType {
ONE_TIME,
DAILY,
WEEKLY,
PERMANENT
}
enum MenuType {
COMBO,
INDIVIDUAL_ITEM
}
enum OrderType {
MENU_SCHEDULE,
CUSTOM_BUILD,
STANDALONE
}
enum SourceType {
MENU_SCHEDULE,
CUSTOM_BUILD,
STANDALONE
}
enum PriceType {
ALLOCATED,
FULL_PRICE
}
enum AdjustmentType {
PREP,
DUMP,
MANUAL_ADD,
MANUAL_REMOVE
}
enum WasteReason {
SPOILED_EXPIRED,
POOR_QUALITY,
OVERCOOKED,
DROPPED_ACCIDENT,
END_OF_DAY,
OTHER
}
enum AdjustmentReason {
RECOUNT_CORRECTION,
FOUND_MISSING,
SYSTEM_ERROR,
TRANSFER_FROM_STORAGE,
OTHER
}
enum DiscountType {
PERCENTAGE,
FIXED_AMOUNT,
PROMO_CODE,
MANAGER_OVERRIDE,
STAFF_MEAL,
ROUNDING
}
enum PaymentMethod {
CASH,
MOBILE_MONEY
}
enum OrderStatus {
PENDING,
COMPLETED,
CANCELLED
}
11. Key System Benefits
For Restaurant Owners
✅ Real-time inventory - always know what's available
✅ Item-level profitability - see profit per dish
✅ Waste tracking - understand where money is lost
✅ Staff accountability - track who does what
✅ Menu optimization - identify stars and dogs
For Kitchen Staff
✅ Simple prep tracking - one tap to log
✅ Easy waste logging - categorized reasons
✅ Live inventory - no surprise stockouts
✅ Clear audit trail - protect from blame
For Counter Staff
✅ Fast order entry - tap menus or build custom
✅ Flexible discounts - handle any situation
✅ Clear totals - live calculation preview
✅ Multiple payment - cash and mobile money
For System
✅ Component-level truth - single source for inventory
✅ Proportional allocation - fair revenue distribution
✅ Complete audit - every action logged
✅ Scalable - handles growth from 10 to 10,000 orders
12. Implementation Checklist
Phase 1: Core Setup
- Dish entity with inventory
- Menu Schedule entity
- Category and Session enums
- Basic CRUD operations
Phase 2: Orders
- Order entity
- OrderItem with source tracking
- Revenue allocation service
- Discount application
Phase 3: Inventory
- Stock adjustment system
- Prep tracking
- Waste management
- Audit trail
Phase 4: Counter App
Phase 5: Reports
- Daily sales summary
- Item profitability
- Waste reports
- Prep reports
- Menu engineering
Phase 6: Customer App
Document Version: 1.0
Last Updated: December 2024
Author: JikoXpress Development Team