EP-007: POS & F&B Management
Business Objective
Food & Beverage is the second-largest revenue generator for Indian hotels (25-40% of total revenue). A modern POS system must handle the complexity of multi-outlet operations (restaurant, bar, room service, pool bar, banquet), Indian tax compliance (GST with 5%/12%/18%/28% slabs depending on hotel star rating and item category), KOT-driven kitchen workflows, bill splitting for group diners, and room charge posting for in-house guests. The system must support high-throughput scenarios (200+ covers during breakfast rush, banquet service for 500 guests) while maintaining real-time inventory tracking and shift-level cash reconciliation. Integration with the Kitchen Display System (KDS) eliminates paper KOTs, reduces order errors, and improves table turnaround time -- critical metrics for Indian hotel restaurants operating at 85%+ occupancy during peak season.
Audience
- Primary: F&B Staff (order takers, cashiers), Kitchen Staff (chefs, line cooks), F&B Manager
- Secondary: Front Desk (room charge postings), Accounts (revenue reconciliation, GST filing), General Manager
- Tertiary: Guests (bill accuracy, dietary requirement compliance)
Scope
In Scope
- Outlet management with 8 types: RESTAURANT, BAR, COFFEE_SHOP, ROOM_SERVICE, POOL_BAR, BANQUET, MINIBAR, SPA_CAFE
- Table management with floor plan coordinates and status tracking (AVAILABLE, OCCUPIED, RESERVED, BLOCKED)
- Menu management: categories, items, modifiers (e.g., "extra cheese", "no onion"), allergen tags, dietary tags (VEG, NON_VEG, VEGAN, JAIN, HALAL)
- Order workflow: CREATE -> KOT_SENT -> PREPARING -> SERVED -> BILLED -> PAID -> CLOSED
- Order types: DINE_IN, TAKEAWAY, DELIVERY, ROOM_SERVICE
- KOT generation routed by kitchen station (HOT_KITCHEN, COLD_KITCHEN, TANDOOR, BAR, PASTRY, PANTRY)
- Void with manager authorization and reason code
- Discounts: percentage-based and flat amount, with approval workflow for above-threshold discounts
- Bill splitting: by item, by equal amount, by guest count
- Room charge posting to in-house guest folio
- Gratuity / service charge (configurable percentage, auto-applied or optional)
- Shift management: open shift, close shift, safe drop (mid-shift cash deposit), reconciliation
- Recipe and inventory management with auto-deduction on order fulfillment
- Happy hour pricing with time-based auto-activation
- KDS integration via Socket.io for real-time order display
- GST compliance: correct slab application per item category, HSN codes, tax invoice generation
- Reporting: outlet-wise revenue, item-wise sales, server performance, void/discount analysis
Out of Scope
- Online food ordering / delivery app integration (Swiggy, Zomato) -- separate integration epic
- Loyalty points earning on F&B spend -- handled in CRM/Loyalty epic
- Central kitchen / commissary management for hotel chains
- Nutritional information calculation and calorie tracking
Current Implementation Status
- Backend (pos-service): Fully built NestJS microservice with controllers for outlets, tables, menus, categories, items, modifiers, orders, KOTs, bills, payments, shifts, voids, discounts, tips, and reports. Prisma models cover all entities. Order state machine with validated transitions. KOT auto-routes by item's kitchen station. GST calculation with configurable slabs per item. Split bill logic (by item and by amount). Void requires manager role JWT. Shift open/close with expected vs actual cash comparison.
- Dashboard (02-hmp-web-dashboard): POS module with full-screen POS terminal (menu grid left, order panel right, category tabs), table floor plan view (draggable tables on canvas), order creation with modifier selection, split bill dialog, void dialog with reason, gratuity toggle, kitchen page showing active KOTs, shift management page, and revenue reports.
- KDS (Electron App): Standalone Electron application for kitchen display. Connects via Socket.io. Shows KOTs grouped by station with timer (color changes: green < 10 min, yellow 10-20 min, red > 20 min). Bump button to mark items prepared. Audio alert on new KOT.
- F&B Mobile App: React Native app for table-side ordering, order status tracking, and bill presentation.
- API Gateway: Proxy routes for
/api/v1/pos/*endpoints.
Gap Analysis
- Recipe/Inventory Auto-Deduction: Recipe master exists (links menu items to raw ingredients with quantities) but the auto-deduction on order fulfillment is not implemented. Inventory is deducted manually by the storekeeper. Impact: inventory counts drift, food cost percentage is inaccurate, no real-time stock-out warnings.
- Happy Hour Pricing: Happy hour price field exists on menu items but activation is manual (manager toggles on/off). No time-based scheduling (e.g., auto-activate 4-7 PM daily). No day-of-week configuration. Impact: staff forget to enable/disable, incorrect pricing.
- Bill Splitting by Item: Works functionally but UI needs improvement. Drag-and-drop items between split bills is clunky. No visual grouping of who-ordered-what. Guest count split works well.
- Room Charge Posting -- Folio Validation: Room charges post to the folio but no validation checks if the guest's folio has a credit limit or if the room is still occupied. Risk of posting charges to checked-out rooms.
- Thermal Printer Integration: Bill and KOT formatting for 80mm and 58mm thermal printers is coded but not tested with physical hardware. ESC/POS command generation exists. No USB/network printer discovery.
- Combo/Package Pricing: No support for combo meals (e.g., "Thali Set" priced lower than sum of individual items) with component-level KOT routing. Items must be ordered individually.
- Table Reservation for Restaurant: Table status tracks RESERVED but no time-slot reservation system for the restaurant. Walk-in only.
User Stories
| Story ID | Title | Priority | Points | Status | Sprint |
|---|---|---|---|---|---|
| US-007-001 | Outlet Management (CRUD + Configuration) | P0 | 3 | Built | 7 |
| US-007-002 | Table Management with Floor Plan | P0 | 5 | Built | 7 |
| US-007-003 | Menu Category & Item Management | P0 | 5 | Built | 7 |
| US-007-004 | Menu Modifiers & Dietary Tags | P1 | 3 | Built | 7 |
| US-007-005 | Create Dine-In Order | P0 | 5 | Built | 7 |
| US-007-006 | KOT Generation & Kitchen Station Routing | P0 | 5 | Built | 8 |
| US-007-007 | KDS Display & Bump Workflow | P0 | 8 | Built | 8 |
| US-007-008 | Room Service Order | P0 | 5 | Built | 8 |
| US-007-009 | Order Void with Manager Authorization | P0 | 3 | Built | 8 |
| US-007-010 | Discount Application (% and Flat) | P1 | 3 | Built | 8 |
| US-007-011 | Bill Generation with GST | P0 | 5 | Built | 8 |
| US-007-012 | Bill Splitting (By Item) | P1 | 5 | Partial | 9 |
| US-007-013 | Bill Splitting (By Amount / Guest Count) | P1 | 3 | Built | 9 |
| US-007-014 | Room Charge Posting | P0 | 5 | Partial | 9 |
| US-007-015 | Gratuity & Service Charge | P1 | 3 | Built | 9 |
| US-007-016 | Payment Processing (Cash / Card / UPI) | P0 | 5 | Built | 9 |
| US-007-017 | Shift Open / Close / Reconciliation | P0 | 5 | Built | 9 |
| US-007-018 | Safe Drop (Mid-Shift Cash Deposit) | P1 | 3 | Built | 9 |
| US-007-019 | Recipe & Inventory Auto-Deduction | P1 | 8 | Not Started | 12 |
| US-007-020 | Happy Hour Time-Based Pricing | P2 | 5 | Partial | 12 |
| US-007-021 | Thermal Printer Integration (Bill + KOT) | P1 | 5 | Partial | 12 |
| US-007-022 | Takeaway & Delivery Orders | P1 | 3 | Built | 8 |
| US-007-023 | F&B Revenue Reports | P1 | 5 | Built | 10 |
| US-007-024 | Combo / Package Meal Pricing | P2 | 5 | Not Started | 13 |
Dependencies
- EP-001 (Auth & Access): RBAC roles FNB, MANAGER gate POS operations; MANAGER required for void/discount approval
- EP-002 (Property): Room data for room service orders; outlet is linked to property
- EP-003 (Reservation): Guest folio for room charge posting; guest profile for preferences
- EP-005 (Front Desk): Room occupancy status for validating room charge posting
- EP-006 (Housekeeping): Minibar consumption posting (shared inventory concern)
- Notification Service: KDS alerts, order ready notifications
- Printer Hardware: Thermal receipt printers (Epson TM-T82, TVS RP3150) for bill/KOT printing
Acceptance Criteria (Epic Level)
- Staff can take dine-in, takeaway, delivery, and room service orders across all outlet types
- KOTs are auto-routed to the correct kitchen station and displayed on KDS within 2 seconds
- Bills calculate GST correctly per item slab (5%/12%/18%/28%) with proper HSN codes
- Manager can void items/orders with mandatory reason code and audit trail
- Bills can be split by item, by equal amount, or by guest count
- Room charges post to in-house guest folio with balance validation
- Shift close reconciles expected vs actual cash with variance tracking
- Recipe-based inventory auto-deducts raw materials on order fulfillment
- Happy hour pricing activates/deactivates automatically by time schedule
- All POS data is tenant-scoped and outlet-scoped within a property
KPIs / Success Metrics
- Average order-to-serve time: target < 20 minutes (dine-in), < 30 minutes (room service)
- KOT bump time (kitchen prep): target < 15 minutes for 90% of items
- Bill accuracy rate: target > 99.5%
- Void rate: target < 2% of total orders
- Discount as percentage of revenue: target < 5%
- Shift cash variance: target < Rs 500 per shift
- Food cost percentage: target 28-32% (tracked via recipe auto-deduction)
- Table turnover rate: target > 2.5 turns per meal period
- Room service order capture rate: target > 80% of occupied rooms
Detailed User Stories
US-007-001: Outlet Management (CRUD + Configuration)
As an F&B Manager, I want to create and configure outlets (restaurants, bars, room service, etc.) with operating hours and tax settings, So that each outlet operates independently with its own menu, pricing, and GST configuration.
Priority: P0 | Points: 3 | Sprint: 7 | Status: Built
Implementation Status
GET/POST/PATCH/DELETE /api/v1/pos/outlets manages outlets with name, type (8 enum values), operatingHours (open/close per day), defaultGstRate, serviceChargePercent, isActive flag, and propertyId. Dashboard has an Outlets settings page under POS module. Each outlet has its own menu catalog, table layout, and shift configuration.
Acceptance Criteria
Scenario: Create a new restaurant outlet
Given I am the F&B Manager at "Leela Palace Bangalore"
When I create outlet "Citrus - All Day Dining" with type RESTAURANT
And set operating hours: Breakfast 7-10:30 AM, Lunch 12:30-3 PM, Dinner 7-11 PM
And configure GST rate as 5% (for hotels with room tariff < Rs 7,500)
And enable service charge at 10%
Then the outlet is created and available for menu setup
And the outlet appears in the POS terminal's outlet selector
Scenario: Configure outlet-specific GST based on hotel star rating
Given "The Oberoi Grand Kolkata" has room tariff above Rs 7,500
When I configure the restaurant outlet
Then GST rate is set to 18% (as per GST council rules for premium hotels)
And bar outlet GST is set to 18% for food and 28% for liquor
And each menu item can override the outlet default GST rate if needed
Scenario: Deactivate an outlet for renovation
Given "Pool Bar" is closing for 2 weeks for renovation
When I set the outlet status to inactive
Then the outlet disappears from the POS terminal outlet selector
And existing unpaid orders show a warning "Outlet deactivated - settle pending bills"
And no new orders can be created for this outlet
US-007-002: Table Management with Floor Plan
As an F&B Manager, I want to design the restaurant floor plan with table positions, capacity, and sections, So that staff can see table availability at a glance and manage seating efficiently.
Priority: P0 | Points: 5 | Sprint: 7 | Status: Built
Implementation Status
Tables stored with outletId, tableNumber, capacity (seats), section (e.g., "Indoor", "Terrace", "Private Dining"), xPosition, yPosition (canvas coordinates), shape (ROUND, SQUARE, RECTANGLE). Dashboard renders a floor plan canvas with draggable table icons. Table status updates in real-time: AVAILABLE (green), OCCUPIED (red), RESERVED (blue), BLOCKED (grey). Clicking a table opens the order panel for that table.
Acceptance Criteria
Scenario: Design floor plan with tables
Given I am setting up the floor plan for "Citrus Restaurant" with 60 seats
When I drag and place 15 tables on the canvas
And configure: 8x 4-seaters (Indoor), 4x 2-seaters (Window), 2x 8-seaters (Private), 1x 12-seater (Long Table)
Then the floor plan saves with all table positions and configurations
And staff see the visual layout when opening POS for this outlet
Scenario: Real-time table status on floor plan
Given the restaurant has 15 tables during dinner service
And 9 tables are OCCUPIED, 2 are RESERVED for 8:00 PM, 4 are AVAILABLE
When a server views the floor plan
Then occupied tables show red with guest count and elapsed time
And reserved tables show blue with reservation name and time
And available tables show green and are clickable to start a new order
Scenario: Merge tables for a large party
Given a party of 10 guests arrives and needs Tables 5 and 6 combined
When I merge Tables 5 and 6 into a combined seating
Then the order is created under "Table 5+6" with combined capacity
And both tables show as OCCUPIED on the floor plan
And the bill generates as a single bill for the merged table
US-007-003: Menu Category & Item Management
As an F&B Manager, I want to manage menu categories and items with pricing, images, and availability per outlet, So that the POS terminal shows the current menu accurately and pricing is always correct.
Priority: P0 | Points: 5 | Sprint: 7 | Status: Built
Implementation Status
Categories: GET/POST/PATCH/DELETE /api/v1/pos/categories with name, sortOrder, outletId, isActive. Items: GET/POST/PATCH/DELETE /api/v1/pos/items with name, categoryId, price, gstRate, hsnCode, description, imageUrl, isVeg flag, isAvailable, kitchenStation, preparationTime. Dashboard has menu management page with category tabs, item cards with drag-to-reorder, and bulk price update.
Acceptance Criteria
Scenario: Create menu item with GST and dietary info
Given I am adding items to the "Main Course" category for "Citrus Restaurant"
When I create "Paneer Butter Masala" with price Rs 495 (inclusive of GST)
And set GST rate 5%, HSN code 9963, kitchen station HOT_KITCHEN
And mark as VEG with allergen tags [DAIRY, GLUTEN]
And set preparation time as 18 minutes
Then the item is available on the POS terminal under Main Course
And the item card shows a green VEG indicator dot
And the price displays as Rs 495 with tax breakup on the bill (Base: Rs 471.43 + GST: Rs 23.57)
Scenario: Mark item as unavailable (86'd)
Given "Lobster Thermidor" has run out during dinner service
When the kitchen marks the item as unavailable (86'd)
Then the item appears greyed out on the POS terminal
And servers see a strikethrough with "86'd" label
And attempts to add it to an order show "Item currently unavailable"
And the item auto-resets to available at next shift open (configurable)
Scenario: Bulk update prices for seasonal menu change
Given 25 items in the "Breakfast Buffet" category need price revision
When I upload a CSV with itemId and newPrice columns
Then all 25 items are updated with new prices
And the effective date can be set to a future date
And the old prices are preserved in audit history
US-007-004: Menu Modifiers & Dietary Tags
As an F&B Server, I want to add modifiers to menu items (extra cheese, no onion, spice level) and see dietary tags, So that kitchen receives precise preparation instructions and guests with dietary restrictions are served safely.
Priority: P1 | Points: 3 | Sprint: 7 | Status: Built
Implementation Status
Modifier groups (e.g., "Spice Level", "Extras", "Cooking Preference") with modifier options (e.g., "Mild", "Medium", "Hot", "Extra Hot"). Each modifier option can have an additional price. Modifiers are linked to items or categories. Dietary tags: VEG, NON_VEG, VEGAN, JAIN, HALAL, GLUTEN_FREE. Allergens: DAIRY, NUTS, SHELLFISH, GLUTEN, SOY, EGG. KOT prints modifiers prominently.
Acceptance Criteria
Scenario: Add modifiers to an order item
Given a guest orders "Dal Makhani" which has modifier group "Spice Level"
When the server selects "Extra Hot" and adds modifier "Extra Butter" (+Rs 30)
Then the KOT for HOT_KITCHEN shows "Dal Makhani - EXTRA HOT, +Extra Butter"
And the order line item price is Rs 395 + Rs 30 = Rs 425
And the modifier detail appears on the printed bill
Scenario: Warn about allergens for Jain guest
Given a guest has informed they follow a Jain diet (no root vegetables, no onion, no garlic)
When the server selects dietary filter "JAIN" on the POS terminal
Then menu items incompatible with Jain diet are flagged with a warning icon
And "Paneer Butter Masala" shows warning "Contains: Onion, Garlic"
And "Paneer Tikka" shows green checkmark (Jain-compatible version available with modifier "Jain Prep")
Scenario: Kitchen sees modifiers prominently on KDS
Given an order with 3 items, each with modifiers, is sent to kitchen
When the KOT appears on the KDS screen
Then modifiers display in bold red text below each item name
And allergen alerts show with a warning triangle icon
And "NO ONION" type modifiers display larger than additive modifiers
US-007-005: Create Dine-In Order
As an F&B Server, I want to create an order for a table by selecting items from the menu grid, So that the kitchen receives the order promptly and the table's bill is tracked accurately.
Priority: P0 | Points: 5 | Sprint: 7 | Status: Built
Implementation Status
POS terminal full-screen layout: left panel shows menu categories (tabs) with item grid, right panel shows current order with line items, quantity controls, modifier badges, and running total. Server selects table from floor plan, then adds items. Order saved in DRAFT until KOT is sent. Multiple KOTs can be sent for the same table (courses). Guest count recorded for per-cover revenue tracking.
Acceptance Criteria
Scenario: Create a new dine-in order for a table
Given Table 7 is AVAILABLE and a party of 4 is seated
When I select Table 7 on the floor plan and click "New Order"
And I add: 2x Paneer Tikka, 1x Dal Makhani, 3x Butter Naan, 4x Lassi
And I record guest count as 4
Then the order is created in DRAFT status with total Rs 1,830
And Table 7 status changes to OCCUPIED
And the order panel shows all items with quantities and subtotal
Scenario: Send KOT for first course
Given I have a draft order for Table 7 with 6 items
When I click "Send KOT"
Then items are grouped by kitchen station: HOT_KITCHEN (Paneer Tikka, Dal Makhani, Butter Naan), COLD_KITCHEN (Lassi)
And 2 KOTs are generated and sent via Socket.io to respective KDS screens
And order status changes from DRAFT to KOT_SENT
And a Kafka event "pos.order.kot_sent" is published
Scenario: Add items to an existing order (second course)
Given Table 7 has an active order with first course served
When I add 2x Gulab Jamun, 1x Kulfi to the existing order
And send a new KOT
Then only the new items appear on the KOT (not previously sent items)
And the KOT is numbered sequentially (KOT #2 for Table 7)
And the running total updates to include the desserts
US-007-006: KOT Generation & Kitchen Station Routing
As a kitchen chef, I want KOTs to automatically route to my station (tandoor, cold kitchen, bar) showing only my items, So that I can focus on my section's orders without sifting through irrelevant items.
Priority: P0 | Points: 5 | Sprint: 8 | Status: Built
Implementation Status
Each menu item has a kitchenStation field (HOT_KITCHEN, COLD_KITCHEN, TANDOOR, BAR, PASTRY, PANTRY). When KOT is generated, items are grouped by station and separate KOT documents are created per station. KOT includes: KOT number, table number, server name, timestamp, items with quantity and modifiers, course number. Socket.io emits to station-specific channels. Printed KOT uses ESC/POS formatting.
Acceptance Criteria
Scenario: Route KOT items to correct kitchen stations
Given an order for Table 12 has: 2x Tandoori Chicken (TANDOOR), 1x Caesar Salad (COLD_KITCHEN), 2x Whiskey Sour (BAR), 1x Biryani (HOT_KITCHEN)
When the server sends the KOT
Then 4 separate KOTs are generated, one per station
And the TANDOOR KDS shows only "2x Tandoori Chicken"
And the BAR KDS shows only "2x Whiskey Sour"
And each KOT header shows "Table 12 | KOT #1 | Server: Rajesh | 8:15 PM"
Scenario: KOT timing alert on KDS
Given a KOT was sent to HOT_KITCHEN 12 minutes ago
And the items have not been bumped (still preparing)
When the timer crosses 10 minutes
Then the KOT card background changes from green to yellow
And at 20 minutes it changes to red with an audio beep
And the F&B Manager's dashboard shows "1 delayed KOT" alert
Scenario: Reprint KOT for kitchen
Given KOT #3 for Table 8 was printed but the paper got soiled
When the server requests a KOT reprint
Then the reprinted KOT shows "** REPRINT **" header clearly
And the original KOT timestamp is preserved
And the reprint is logged in the order audit trail
US-007-007: KDS Display & Bump Workflow
As a kitchen chef, I want to see incoming orders on a display screen and bump completed items, So that I can manage my preparation queue and signal when dishes are ready for pickup.
Priority: P0 | Points: 8 | Sprint: 8 | Status: Built
Implementation Status
Electron KDS app connects to backend via Socket.io on ws://backend:3010/pos-kds. Displays KOT cards in a grid (3-4 columns depending on screen size). Each card shows table, items, modifiers, timer. Bump button marks item as PREPARED. When all items on a KOT are bumped, KOT moves to "completed" lane. Audio notification on new KOT. Station filter: chef sees only their station's KOTs. Summary mode shows aggregated item counts across all active KOTs (e.g., "7x Butter Chicken pending").
Acceptance Criteria
Scenario: New KOT appears on KDS with audio alert
Given the HOT_KITCHEN KDS is displaying 5 active KOTs
When a new order for Table 14 arrives with 3 hot kitchen items
Then a new KOT card appears at the rightmost position
And an audio chime plays to alert the chef
And the card shows a green background (just arrived, timer at 0:00)
And the item count badge on the header updates from 12 to 15
Scenario: Bump completed items
Given KOT #4 for Table 9 shows "2x Paneer Tikka, 1x Butter Chicken"
And the Paneer Tikka is plated and ready
When the chef taps "Bump" next to "2x Paneer Tikka"
Then the item shows a strikethrough with green checkmark
And when all 3 items are bumped, the entire KOT card moves to the "Done" column
And a Socket.io event notifies the server's mobile app "Table 9 food ready for pickup"
Scenario: View aggregated item count (summary mode)
Given there are 8 active KOTs with a total of 22 items across them
When the head chef switches to Summary View
Then items are aggregated: "Butter Chicken x5, Paneer Tikka x4, Biryani x3, Naan x10"
And items sorted by quantity (highest first) for efficient batch cooking
And clicking an item shows which tables ordered it
US-007-008: Room Service Order
As an F&B Server, I want to create a room service order for an in-house guest, So that the order is prepared, delivered to the room, and charged to the guest's folio.
Priority: P0 | Points: 5 | Sprint: 8 | Status: Built
Implementation Status
Room service outlet type has a different UI flow -- instead of selecting a table, the server enters a room number. System validates room is occupied and fetches guest name. Order follows standard KOT workflow. On billing, charges are posted to the room folio with a tray charge (configurable). Room service orders have a delivery timer separate from preparation timer.
Acceptance Criteria
Scenario: Create room service order for occupied room
Given Room 708 is occupied by guest "Dr. Anand Mehta"
When I select the Room Service outlet and enter Room 708
Then the system confirms "Room 708 - Dr. Anand Mehta (Checked in)"
And I can add items from the room service menu (which may differ from restaurant menu)
And a tray charge of Rs 150 is auto-added (configurable per property)
Scenario: Room service delivery workflow
Given a room service order for Room 708 is prepared (KOT bumped)
When the runner picks up the tray and marks "Out for Delivery"
Then a timer starts for delivery SLA (target: 5 minutes from pickup)
And the guest can be notified via SMS/app "Your order is on the way"
And upon delivery, the runner marks "Delivered" and the timer stops
Scenario: Prevent order for unoccupied room
Given Room 312 is vacant (no active check-in)
When a server attempts to create a room service order for Room 312
Then the system shows error "Room 312 is not currently occupied. Cannot create room service order."
And suggests "Did you mean Room 312? Currently occupied by Ms. Rao" if a similarly numbered room is occupied
US-007-009: Order Void with Manager Authorization
As an F&B Manager, I want void requests to require my authorization with a mandatory reason, So that voiding is controlled, abuse is prevented, and all voids are auditable.
Priority: P0 | Points: 3 | Sprint: 8 | Status: Built
Implementation Status
POST /api/v1/pos/orders/:id/void requires managerAuthToken (separate auth), voidReason (enum: GUEST_CANCELLED, WRONG_ORDER, QUALITY_ISSUE, KITCHEN_DELAY, DUPLICATE, OTHER), and optional notes. Server initiates void request, manager approves on their device by entering credentials. Void is logged with serverId, managerId, timestamp, reason. Voided items are excluded from revenue but tracked in void reports.
Acceptance Criteria
Scenario: Server requests void, manager approves
Given Table 5 order has "1x Lobster Thermidor (Rs 2,200)" that the guest wants to cancel
When server Rajesh initiates a void for the item with reason "GUEST_CANCELLED"
Then a notification is sent to the on-duty F&B Manager
And the manager enters their credentials on the POS terminal to authorize
And the item is voided (removed from bill, KOT cancelled if not yet prepared)
And the void is logged: "Rajesh requested, Manager Anita approved, reason: Guest Cancelled"
Scenario: Void after KOT already prepared
Given Table 3 has "1x Biryani" that was already prepared and served
And the guest complains about quality
When the manager approves a void with reason "QUALITY_ISSUE"
Then the item is removed from the guest bill
But the inventory deduction is NOT reversed (food was prepared)
And the void report shows this as a "post-preparation void" (food cost loss)
Scenario: Void analysis report
Given 15 voids occurred during today's dinner shift
When the F&B Manager opens the Void Report
Then the report shows: total voids (15), total value (Rs 8,450), top reason "Guest Cancelled" (8 times)
And a server breakdown: "Rajesh: 5 voids, Priya: 3 voids, Amit: 7 voids"
And high-void servers are flagged for review
US-007-010: Discount Application (% and Flat)
As an F&B Server, I want to apply a discount to an order (percentage or flat amount) with manager approval for large discounts, So that promotional offers, loyalty gestures, and management goodwill can be applied to bills.
Priority: P1 | Points: 3 | Sprint: 8 | Status: Built
Implementation Status
Discounts can be applied at item level or bill level. Types: PERCENTAGE (e.g., 15% off) or FLAT (e.g., Rs 500 off). Configurable threshold: discounts above a certain percentage (e.g., 20%) or amount (e.g., Rs 1,000) require manager authorization. Pre-configured discount reasons: LOYALTY_GUEST, BIRTHDAY, MANAGER_GOODWILL, PROMOTIONAL, STAFF_MEAL, COMPLIMENTARY. Discount applied before GST calculation (discount on base price).
Acceptance Criteria
Scenario: Apply percentage discount within threshold
Given Table 10 bill total is Rs 4,500
And the server threshold for self-approved discounts is 10%
When the server applies a 10% discount with reason "LOYALTY_GUEST"
Then a discount of Rs 450 is applied to the bill
And GST is recalculated on the reduced amount (Rs 4,050)
And no manager approval is needed (within threshold)
And the bill shows: Subtotal Rs 4,500, Discount -Rs 450 (10%), GST Rs 202.50, Total Rs 4,252.50
Scenario: Large discount requires manager approval
Given Table 2 bill total is Rs 12,000
When the server tries to apply a 25% discount (Rs 3,000 -- above 20% threshold)
Then the system prompts "Discount above 20% requires Manager approval"
And the manager must enter their credentials to authorize
And upon approval, the discount is applied with manager's name logged
Scenario: Complimentary (100% discount) for VIP guest
Given a VVIP guest (Owner's guest) dines at the restaurant
When the manager applies a 100% COMPLIMENTARY discount
Then the bill shows Rs 0 payable with full itemization
And GST is waived (complimentary supply rules)
And the void/discount report captures this under "Complimentary" category
And the food cost is still tracked for the kitchen
US-007-011: Bill Generation with GST
As an F&B Cashier, I want to generate an accurate bill with proper GST breakup (CGST + SGST or IGST), HSN codes, and the hotel's GSTIN, So that the hotel is compliant with Indian GST regulations and guests can claim input tax credit.
Priority: P0 | Points: 5 | Sprint: 8 | Status: Built
Implementation Status
Bill generation calculates GST per item based on item-level gstRate. Supports split into CGST + SGST (intra-state) or IGST (inter-state, based on guest billing address). Bill includes: hotel GSTIN, bill number (sequential per outlet per day), date/time, itemized list with HSN, tax breakup table (5%, 12%, 18%, 28% slabs grouped), service charge line, total. Bill formatted for 80mm thermal print and PDF export.
Acceptance Criteria
Scenario: Generate GST-compliant bill for dine-in order
Given Table 7 order has: 2x Paneer Tikka @Rs 395 (5% GST, HSN 9963), 2x Beer @Rs 350 (28% GST, HSN 2203)
When the server requests bill generation
Then the bill shows:
| Item | Qty | Rate | Amount | GST% | HSN |
| Paneer Tikka | 2 | 376.19 | 752.38 | 5% | 9963 |
| Beer | 2 | 273.44 | 546.88 | 28% | 2203 |
And tax breakup: CGST @2.5% = Rs 18.81, SGST @2.5% = Rs 18.81 (on food)
And CGST @14% = Rs 76.56, SGST @14% = Rs 76.56 (on liquor)
And Service Charge @10% = Rs 129.93
And Grand Total = Rs 1,619.93
Scenario: Bill with hotel GSTIN and sequential numbering
Given the outlet "Citrus Restaurant" at "Leela Palace Bangalore" (GSTIN: 29AABCT1234F1ZH)
When a bill is generated
Then the bill header shows the hotel name, address, and GSTIN
And the bill number follows format: CIT/2026-27/001234 (outlet code/fiscal year/sequential)
And the bill is stored for the mandatory 6-year GST record retention period
Scenario: Inter-state GST for corporate guest
Given a guest from Maharashtra is dining at a hotel in Karnataka
And they request a tax invoice with their company GSTIN
When the bill is generated with guest GSTIN (27AABCT5678F1ZX)
Then IGST is applied instead of CGST+SGST
And the bill shows: IGST @5% on food, IGST @28% on liquor
And the bill qualifies as a tax invoice for input credit claim
US-007-012: Bill Splitting (By Item)
As an F&B Server, I want to split a table's bill by assigning specific items to different guests, So that each guest receives and pays their own bill for only what they ordered.
Priority: P1 | Points: 5 | Sprint: 9 | Status: Partial
Implementation Status
Bill split by item is functional: server can create multiple split bills and move items between them. Each split bill calculates its own GST and service charge. Gap: The UI for drag-and-drop items between split bills is not intuitive -- requires multiple clicks. No visual grouping showing which guest has which items during the ordering phase. No "who ordered what" tracking at order time (items assigned to guest 1/2/3 during ordering).
Acceptance Criteria
Scenario: Split bill by dragging items to guest bills
Given Table 5 has 4 guests with a combined bill of Rs 6,800
When the server opens "Split Bill" and creates 4 guest tabs
And drags "2x Butter Chicken" to Guest 1 and "1x Paneer Tikka" to Guest 2
Then each guest tab shows their items with individual GST calculation
And the sum of all split bills equals the original total (Rs 6,800)
And each split bill can be paid with a different payment method
Scenario: Handle shared items during split
Given Table 5 ordered "1x Veg Biryani (Rs 450)" that 2 guests shared
When the server splits the Biryani between Guest 1 and Guest 3
Then each guest's split bill shows "Veg Biryani (1/2)" at Rs 225
And GST is calculated on each half-portion amount correctly
Scenario: Assign items to guests during ordering
Given a new order for Table 8 with 3 guests
When the server adds items, they can tag each item with "Guest 1", "Guest 2", or "Guest 3"
Then at bill time, the "Split by Item" option auto-populates each guest's items
And the server only needs to review and confirm the split (no manual dragging)
US-007-013: Bill Splitting (By Amount / Guest Count)
As an F&B Server, I want to split the bill equally by guest count or by specific amounts, So that groups who want to share the total equally can settle quickly.
Priority: P1 | Points: 3 | Sprint: 9 | Status: Built
Implementation Status
Equal split divides the total (including GST and service charge) by guest count, generating N identical split bills. Custom amount split allows specifying arbitrary amounts per guest (must sum to total). Each split bill generates its own receipt. Payment can differ per split (Guest 1 pays cash, Guest 2 pays UPI, etc.).
Acceptance Criteria
Scenario: Split bill equally among 4 guests
Given Table 3 total bill is Rs 4,800 (including GST and service charge)
And 4 guests want to split equally
When the server selects "Split Equally" with 4 guests
Then 4 split bills are generated at Rs 1,200 each
And each bill shows "Split 1 of 4" with full itemization and "Your Share: Rs 1,200"
And Guest 1 pays by card, Guest 2 pays UPI, Guest 3 and 4 pay cash
Scenario: Split by custom amounts
Given Table 9 total is Rs 3,500
And Guest 1 wants to pay Rs 2,000 and Guest 2 pays Rs 1,500
When the server enters custom amounts Rs 2,000 and Rs 1,500
Then the system validates the sum equals Rs 3,500
And generates 2 separate bills with the specified amounts
Scenario: Rounding handling in equal split
Given Table 6 total is Rs 1,000 split among 3 guests
When the server splits equally
Then Guest 1 and 2 get Rs 333.33 each, Guest 3 gets Rs 333.34
And the total across all splits equals exactly Rs 1,000.00
And no rounding discrepancy exists
US-007-014: Room Charge Posting
As an F&B Server, I want to post a restaurant or bar bill to a guest's room folio, So that in-house guests can dine without cash and settle all charges at checkout.
Priority: P0 | Points: 5 | Sprint: 9 | Status: Partial
Implementation Status
Room charge posting sends the bill amount to the folio service via internal API call. Server enters room number, guest verifies by signing. Gap: No validation that the guest folio has sufficient credit limit (for guests with a credit limit set by the hotel). No check that the room is still occupied at the time of posting (edge case: guest checked out but server posts late). No guest identity verification beyond room number (anyone can claim to be from Room 708).
Acceptance Criteria
Scenario: Post restaurant bill to guest room
Given guest "Ms. Nair" is checked into Room 405
And her restaurant bill at "Citrus" is Rs 2,850
When the server selects payment method "Room Charge" and enters Room 405
Then the system verifies Room 405 is occupied by "Ms. Nair"
And the server confirms the guest name with the diner
And Rs 2,850 is posted to Room 405 folio under "F&B - Citrus Restaurant"
And the folio shows the charge with bill number, outlet, date/time, and itemization
Scenario: Block room charge when folio exceeds credit limit
Given Room 602 has a credit limit of Rs 20,000
And current folio balance is Rs 18,500
When the server attempts to post a bar bill of Rs 3,200 (total would be Rs 21,700)
Then the system warns "Room 602 folio would exceed credit limit (Rs 21,700 / Rs 20,000)"
And the server must collect alternative payment or contact front desk for limit increase
Scenario: Prevent charge posting to checked-out room
Given Room 312 was checked out at 11:00 AM
And a server attempts to post a lunch bill to Room 312 at 1:00 PM
Then the system rejects with "Room 312 is vacant. Guest checked out at 11:00 AM."
And suggests alternative payment methods
And the server can search for the guest by name if they moved to a different room
US-007-015: Gratuity & Service Charge
As an F&B Manager, I want to configure service charge and gratuity rules per outlet, So that service charges are correctly applied and guests can add voluntary gratuity.
Priority: P1 | Points: 3 | Sprint: 9 | Status: Built
Implementation Status
Outlet-level configuration for service charge (percentage, auto-apply or optional). Service charge is calculated on pre-GST subtotal and is itself subject to GST. Gratuity is optional and entered by guest at payment time. Indian regulation note: service charge is voluntary as per CCPA 2022 guidelines -- system allows guest opt-out. Both service charge and gratuity are tracked separately for staff tip pool distribution.
Acceptance Criteria
Scenario: Auto-apply service charge with guest opt-out option
Given "Citrus Restaurant" has 10% service charge auto-applied
And the bill subtotal (pre-GST) is Rs 3,000
When the bill is generated
Then service charge of Rs 300 is added (10% of Rs 3,000)
And GST @18% on service charge = Rs 54
And the bill footer notes "Service charge is voluntary. You may request removal."
And the server can remove service charge if guest requests (per CCPA 2022 guidelines)
Scenario: Guest adds voluntary gratuity
Given a bill total is Rs 5,200 (after service charge and GST)
When the guest wants to add Rs 500 as additional tip
Then the payment total becomes Rs 5,700
And the gratuity is recorded separately (not part of revenue, goes to staff tip pool)
And the receipt shows "Tip: Rs 500" as a separate line
Scenario: Configure different service charge per outlet
Given "The Lounge Bar" should have 12.5% service charge
And "Pool Bar" should have 0% service charge (casual setting)
When the manager configures each outlet separately
Then bills from The Lounge auto-include 12.5% service charge
And Pool Bar bills have no service charge line
US-007-016: Payment Processing (Cash / Card / UPI)
As an F&B Cashier, I want to process payments via cash, credit/debit card, and UPI, So that guests can pay using their preferred method and the hotel captures all revenue.
Priority: P0 | Points: 5 | Sprint: 9 | Status: Built
Implementation Status
Payment methods: CASH, CREDIT_CARD, DEBIT_CARD, UPI, ROOM_CHARGE, COMPLIMENTARY. For cash: system calculates change due. For card: records last 4 digits and approval code (actual payment terminal integration is via external device, not in-app). For UPI: records UPI transaction ID. Mixed payments supported (e.g., Rs 2,000 cash + Rs 1,500 card). Payment triggers order status to PAID and table release.
Acceptance Criteria
Scenario: Cash payment with change calculation
Given the bill total is Rs 3,750
When the guest pays Rs 4,000 cash
Then the system calculates change due: Rs 250
And the receipt shows "Paid: Rs 4,000 (Cash), Change: Rs 250"
And the cash drawer amount in the shift increases by Rs 3,750
Scenario: Mixed payment (cash + UPI)
Given the bill total is Rs 5,200
When the guest pays Rs 3,000 cash and Rs 2,200 via UPI (transaction ID: 425789631245)
Then the system records both payment lines
And the receipt shows both payment methods with amounts
And the shift cash reflects +Rs 3,000 and digital payments reflect +Rs 2,200
Scenario: Payment completes the order lifecycle
Given Table 7 order is in BILLED status
When full payment is received and processed
Then the order status changes to PAID then CLOSED
And Table 7 status changes to AVAILABLE
And the revenue is recorded under the outlet and shift
And a Kafka event "pos.order.paid" is published for analytics
US-007-017: Shift Open / Close / Reconciliation
As an F&B Cashier, I want to open and close my shift with opening cash count and closing reconciliation, So that cash accountability is maintained and discrepancies are identified per shift.
Priority: P0 | Points: 5 | Sprint: 9 | Status: Built
Implementation Status
Shift lifecycle: OPEN (cashier counts opening cash) -> ACTIVE (orders processed) -> CLOSED (closing count, reconciliation). Shift record stores: openingCash, closingCash, expectedCash (calculated from cash payments - cash change), variance, digitalPaymentsTotal, safeDrop amounts, orders count, revenue total. Manager must approve shift close if variance exceeds threshold.
Acceptance Criteria
Scenario: Open a shift with cash count
Given it is 7:00 AM and the breakfast shift starts at "Citrus Restaurant"
When cashier "Priya" opens a new shift
And counts the opening cash float as Rs 5,000 (denominations: 10x500, 5x100, rest coins)
Then the shift opens with opening balance Rs 5,000
And all subsequent orders at this terminal are linked to Priya's shift
And the POS terminal is ready to take orders
Scenario: Close shift with reconciliation
Given Priya's shift processed 45 orders with Rs 67,500 total revenue
And Rs 23,000 in cash payments, Rs 44,500 in digital payments
And 1 safe drop of Rs 10,000 was made at 12:00 PM
When Priya closes the shift and counts closing cash as Rs 17,800
Then expected cash = Rs 5,000 (opening) + Rs 23,000 (cash in) - Rs 10,000 (safe drop) = Rs 18,000
And variance = Rs 18,000 - Rs 17,800 = -Rs 200 (short)
And the variance is flagged for manager review (threshold is Rs 500 -- within limit, auto-approved)
And shift summary shows orders, revenue, payment breakup, and variance
Scenario: Manager approval for large variance
Given cashier "Amit" closes his shift with a variance of -Rs 1,200 (short by Rs 1,200)
When the system detects variance above Rs 500 threshold
Then the shift close requires F&B Manager approval
And the manager reviews the shift details and can add a note "Investigated - Rs 1,000 wrong change given to Table 15"
And the variance is logged in the monthly cash variance report
US-007-018: Safe Drop (Mid-Shift Cash Deposit)
As an F&B Cashier, I want to make a safe drop (deposit excess cash to the safe during my shift), So that I do not hold too much cash in the register and the hotel's cash handling policy is met.
Priority: P1 | Points: 3 | Sprint: 9 | Status: Built
Implementation Status
POST /api/v1/pos/shifts/:id/safe-drop records the amount, denomination breakdown, timestamp, and optional witness (manager name). Multiple safe drops per shift allowed. Safe drop amounts are subtracted from expected closing cash. Manager must verify the deposit in the safe matches the recorded amount.
Acceptance Criteria
Scenario: Make a safe drop during busy shift
Given the current shift register has accumulated Rs 25,000 in cash
And hotel policy requires safe drop when cash exceeds Rs 15,000
When the cashier initiates a safe drop of Rs 15,000
And counts denominations (10x1000, 10x500)
And the F&B Manager witnesses and signs off
Then Rs 15,000 is recorded as safe drop with timestamp and manager name
And the expected register balance adjusts accordingly
And the safe drop receipt is printed for the cashier's records
Scenario: Multiple safe drops in a shift
Given 2 safe drops have already been made (Rs 10,000 at 11 AM, Rs 12,000 at 3 PM)
When a third safe drop of Rs 8,000 is made at 7 PM
Then the shift record shows 3 safe drops totaling Rs 30,000
And the closing reconciliation accounts for all 3 deposits
And the shift summary lists each safe drop with time and amount
US-007-019: Recipe & Inventory Auto-Deduction
As an F&B Manager, I want raw material inventory to automatically deduct when menu items are ordered, So that I have real-time stock visibility, can detect stock-outs before service, and calculate accurate food cost percentages.
Priority: P1 | Points: 8 | Sprint: 12 | Status: Not Started
Implementation Status
Recipe master exists in the database: each menu item can be linked to ingredients with quantities (e.g., "Butter Chicken" needs 300g chicken, 50g butter, 100ml cream, etc.). Inventory items track current stock with unit of measure. Gap: The auto-deduction logic is not implemented. When an order is placed, no inventory transaction occurs. Storekeeper manually deducts stock based on kitchen requisition slips. Real-time stock levels are inaccurate. No stock-out warning at order time.
Acceptance Criteria
Scenario: Auto-deduct ingredients when order is placed
Given "Butter Chicken" recipe requires: 300g Chicken Breast (stock: 5kg), 50g Butter (stock: 2kg), 100ml Cream (stock: 3L)
When a server orders 2x Butter Chicken for Table 12
Then inventory auto-deducts: 600g Chicken, 100g Butter, 200ml Cream
And updated stock: Chicken 4.4kg, Butter 1.9kg, Cream 2.8L
And an inventory transaction log records the deduction linked to Order #1234
Scenario: Stock-out warning at order time
Given "Lobster Thermidor" requires 250g Lobster and current stock is 200g (enough for 0 portions)
When a server tries to add Lobster Thermidor to an order
Then the POS shows warning "Lobster Thermidor - Insufficient stock (0 portions available)"
And the server can override with manager approval (for cases where physical stock differs)
And the item should have been auto-86'd when stock fell below 1 portion
Scenario: Calculate real-time food cost percentage
Given the restaurant served 120 covers today with Rs 1,85,000 food revenue
And auto-deduction shows Rs 52,000 worth of raw materials consumed (at cost price)
When the F&B Manager views the daily food cost report
Then food cost percentage shows 28.1% (Rs 52,000 / Rs 1,85,000)
And a comparison with target (30%) shows the kitchen is operating efficiently
And item-level food cost shows "Biryani" at 35% (above target, needs recipe review)
US-007-020: Happy Hour Time-Based Pricing
As an F&B Manager, I want happy hour pricing to activate and deactivate automatically based on a time schedule, So that drink prices change without manual intervention and staff cannot forget to enable or disable promotions.
Priority: P2 | Points: 5 | Sprint: 12 | Status: Partial
Implementation Status
Menu items have a happyHourPrice field that stores the discounted price. Currently, the manager must manually toggle happy hour ON/OFF for an outlet. Gap: No time-based schedule (e.g., 4:00 PM - 7:00 PM). No day-of-week configuration (e.g., happy hour only on weekdays). No automatic activation/deactivation. The toggle is forgotten 30% of the time per F&B Manager feedback.
Acceptance Criteria
Scenario: Configure time-based happy hour schedule
Given "The Lounge Bar" wants happy hour pricing on weekdays 4-7 PM
When the F&B Manager configures:
| Days | Start | End | Discount |
| Mon-Fri | 4:00 PM | 7:00 PM | Happy Hour Price |
Then the schedule is saved for the outlet
And a cron job or scheduled task activates happy hour at 4:00 PM on weekdays
And deactivates at 7:00 PM automatically
Scenario: Automatic price switch at happy hour start
Given it is 3:59 PM on a Wednesday at "The Lounge Bar"
And "Kingfisher Premium" regular price is Rs 350
And happy hour price is Rs 200
When the clock hits 4:00 PM
Then the POS terminal automatically shows Rs 200 for Kingfisher Premium
And a banner "HAPPY HOUR" appears on the POS screen
And orders placed between 4-7 PM use the happy hour price
And at 7:01 PM, the price reverts to Rs 350 without any manual action
Scenario: Happy hour not applied on weekends
Given happy hour is configured for Mon-Fri only
And it is Saturday at 5:00 PM (within happy hour time window)
When a server rings up "Kingfisher Premium"
Then the regular price Rs 350 is used (not happy hour Rs 200)
And no "HAPPY HOUR" banner appears on the POS
US-007-021: Thermal Printer Integration (Bill + KOT)
As a System Administrator, I want POS bills and KOTs to print on thermal printers (80mm receipt and 58mm KOT), So that guests receive physical receipts and kitchen gets printed KOTs as backup to KDS.
Priority: P1 | Points: 5 | Sprint: 12 | Status: Partial
Implementation Status
ESC/POS command generation is implemented for bill and KOT formatting. Supports 80mm (receipt) and 58mm (KOT) widths. Bill format includes hotel logo (bitmap), itemized lines, GST breakup, QR code for UPI payment. KOT format includes station header, items in large font, modifiers in bold. Gap: No USB or network printer discovery. No WebSocket bridge for browser-to-printer communication. Printing tested only in emulator (not physical Epson TM-T82 or TVS RP3150). No print queue management or offline spooling.
Acceptance Criteria
Scenario: Print bill on 80mm thermal printer
Given a bill is generated for Table 7 at "Citrus Restaurant"
And an Epson TM-T82 printer is connected via USB to the POS terminal
When the cashier clicks "Print Bill"
Then the printer produces a formatted receipt with:
| Hotel name and logo (bitmap) |
| GSTIN and address |
| Bill number and date/time |
| Itemized list with quantities and amounts |
| GST breakup table (CGST + SGST) |
| Service charge line |
| Grand total in large font |
| UPI QR code for digital payment |
| "Thank you, visit again!" footer |
Scenario: Print KOT to kitchen station printer
Given a KOT is generated for HOT_KITCHEN station
And a 58mm thermal printer is network-connected at the hot kitchen
When the KOT is sent
Then the printer produces a KOT slip with:
| "** HOT KITCHEN **" header in large bold |
| Table number and KOT number |
| Items in large font with quantities |
| Modifiers in bold red (e.g., "NO ONION", "EXTRA SPICY") |
| Server name and time |
And the auto-cutter fires to separate the KOT
Scenario: Handle printer offline gracefully
Given the receipt printer at the cashier station is offline (paper jam)
When the cashier attempts to print a bill
Then the system shows "Printer offline. Bill saved -- retry when printer is ready."
And the bill is queued in the print spooler
And a digital copy of the bill is available for email/WhatsApp to guest
And when the printer comes back online, queued bills can be printed in batch
US-007-022: Takeaway & Delivery Orders
As an F&B Server, I want to create takeaway and delivery orders without assigning a table, So that the hotel captures revenue from guests who want food packed or delivered.
Priority: P1 | Points: 3 | Sprint: 8 | Status: Built
Implementation Status
Order types TAKEAWAY and DELIVERY skip table assignment. Guest name and phone number recorded. Delivery orders additionally capture delivery address (for in-campus delivery to rooms, pool, garden). Packaging charges auto-added (configurable per item or flat fee). Token number generated for takeaway pickup. KOT workflow is identical (items routed to kitchen stations).
Acceptance Criteria
Scenario: Create takeaway order with packaging charge
Given a guest calls "Citrus Restaurant" for a takeaway order
When the server creates a TAKEAWAY order with guest name "Rahul", phone "9876543210"
And adds: 2x Paneer Tikka, 1x Dal Makhani, 4x Butter Naan
Then a packaging charge of Rs 50 is auto-added (configurable)
And a token number T-042 is generated for pickup reference
And the KOT is sent to the kitchen with "** TAKEAWAY **" header
And estimated ready time is calculated from item prep times (max 18 min)
Scenario: Delivery to hotel garden
Given a guest at the pool wants food delivered to the garden area
When the server creates a DELIVERY order with delivery location "Garden - Table near fountain"
Then the order includes a delivery charge (Rs 0 for in-hotel delivery)
And a runner is assigned for delivery after kitchen preparation
And the guest receives an SMS when the food is ready for delivery
US-007-023: F&B Revenue Reports
As an F&B Manager, I want to view detailed revenue reports by outlet, date range, item category, and server, So that I can analyze performance, identify top-selling items, and make data-driven menu decisions.
Priority: P1 | Points: 5 | Sprint: 10 | Status: Built
Implementation Status
Report endpoints: outlet-wise revenue, category-wise sales, item-wise sales (with quantity and revenue), server performance (covers served, revenue generated, average check), payment method breakup, hourly revenue distribution, void/discount analysis. Dashboard renders reports with charts (bar, pie, line) and data tables. Date range filter, outlet filter, shift filter. Export to Excel and PDF.
Acceptance Criteria
Scenario: Daily revenue report by outlet
Given today's operations across 4 outlets are complete
When the F&B Manager opens the Daily Revenue Report
Then the report shows:
| Outlet | Orders | Revenue | Avg Check | Covers |
| Citrus Restaurant | 85 | Rs 2,45,000 | Rs 2,882 | 210 |
| The Lounge Bar | 42 | Rs 1,12,000 | Rs 2,667 | 95 |
| Room Service | 28 | Rs 78,000 | Rs 2,786 | 28 |
| Pool Bar | 35 | Rs 45,000 | Rs 1,286 | 65 |
And a comparison column shows vs. same day last week (+/- %)
Scenario: Top 10 selling items for the month
Given the manager selects February 2026 and "Citrus Restaurant"
When the Item Sales Report loads
Then items are ranked by quantity sold
And the top 3 are: Butter Chicken (340 qty, Rs 1,87,000), Biryani (280 qty, Rs 1,54,000), Dal Makhani (265 qty, Rs 1,04,675)
And each item shows food cost % and profit margin (when recipe data is available)
Scenario: Export report for owner review
Given the General Manager wants the monthly F&B performance for a board meeting
When I export the February 2026 F&B Summary Report to PDF
Then the PDF includes: revenue by outlet, daily trend chart, top items, void analysis, food cost summary
And the file is formatted with the hotel branding and date of generation
US-007-024: Combo / Package Meal Pricing
As an F&B Manager, I want to create combo meals (e.g., "Lunch Thali") priced lower than individual items combined, So that we can offer value deals, increase average check size, and simplify ordering for guests.
Priority: P2 | Points: 5 | Sprint: 13 | Status: Not Started
Implementation Status
Not implemented. Currently, each item must be ordered individually. No concept of a "combo" that bundles multiple items at a package price. No component-level KOT routing for combos (e.g., a thali combo's rice goes to HOT_KITCHEN and lassi goes to COLD_KITCHEN). Menu items are flat -- no parent-child relationship for combo components.
Acceptance Criteria
Scenario: Create a combo meal with component items
Given I want to create "Executive Lunch Thali" at Rs 550
And it includes: 1x Dal, 1x Sabzi, 2x Roti, 1x Rice, 1x Raita, 1x Sweet
And individual items would total Rs 750 if ordered separately
When I configure the combo in menu management
Then "Executive Lunch Thali" appears as a single menu item at Rs 550
And the POS shows component items for kitchen routing
And KOTs are generated per station: HOT_KITCHEN (Dal, Sabzi, Roti, Rice), COLD_KITCHEN (Raita, Sweet)
Scenario: Modify combo component
Given a guest orders "Executive Lunch Thali" but wants to swap Sabzi for Paneer (+Rs 50)
When the server selects the combo and chooses "Customize"
Then modifiable components are shown with swap options and price adjustments
And the combo price adjusts to Rs 600 (Rs 550 + Rs 50 upgrade)
And the KOT reflects the substitution
Scenario: GST calculation on combo items
Given a combo includes food items (5% GST) and a beverage (18% GST)
When the bill is generated
Then GST is calculated proportionally based on component values
And the tax invoice shows correct HSN codes for each component
And total GST is accurate for filing purposes