From bea6710d38fa8331aa0f9805f6b5037042a0526e Mon Sep 17 00:00:00 2001 From: Amritanshu Date: Thu, 3 Sep 2026 18:39:00 +0530 Subject: [PATCH] Menu schema v3: variants as separate products, POS-ready fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - variants split into their own menu_items whenever price differs (name + variant fields; 164 products, 24 variant groups) - price back to number (whole rupees); no more '449/549' strings - diet select (veg/nonveg/mixed) instead of nullable bool — PocketBase serializes empty bools as false, which misfiled mixed dishes - new fields for POS: sku (unique GB-CAT-NNN), available (86 toggle), tax_category (default food-5-gst) - migration 1788500100_menu_items_v3 replaces menu_items; resync via scripts/update-menu.mjs - cards render 'Dish – Variant', badges from diet, hide unavailable --- README.md | 25 +- app/src/components/menu-browser.tsx | 37 +- app/src/data/menu-data.mjs | 1084 +++++++++++++-------- app/src/lib/pb.ts | 4 +- app/src/lib/types.ts | 24 +- pb/migrations/1788500100_menu_items_v3.js | 80 ++ 6 files changed, 839 insertions(+), 415 deletions(-) create mode 100644 pb/migrations/1788500100_menu_items_v3.js diff --git a/README.md b/README.md index 4c354a0..877353c 100644 --- a/README.md +++ b/README.md @@ -165,10 +165,27 @@ node scripts/update-menu.mjs ``` The script **replaces** all `menu_categories` / `menu_items` records (deletes old, inserts -new) and touches nothing else. Item prices are text, so ranges like `449/549` work; -`group` (`veg` / `nonveg`) drives the dietary badge; `image` is an optional URL. Admin edits -to menu records are overwritten by the next sync — treat this file as the menu's source of -truth. +new) and touches nothing else. + +### `menu_items` schema (POS-oriented) + +- `uid` — stable slug identity +- `category` — slug → `menu_categories` +- `name` / `variant` — variants are **separate products** whenever their price differs + ("Penne Arrabiata" + variant "Veg" ₹589 / "Chicken" ₹639); the POS can group by `name` +- `description` +- `price` — number, whole rupees (449 = ₹449) +- `diet` — select: `veg` / `nonveg` / `mixed` (a bool can't be null in PocketBase, so mixed + items like Caesar Salad use `mixed`; the site renders no badge for it) +- `pairing` — optional beer pairing +- `tag` — badge chip; also carries same-price choice lists (e.g. "Malai / Angara") +- `image` — optional URL +- `sku` — unique POS code, `GB--` (e.g. GB-MNC-014) +- `available` — false hides the item from the site (86'd) without deleting it +- `tax_category` — default `food-5-gst`; adjust per item for POS GST mapping + +Admin edits to menu records are overwritten by the next sync — treat `menu-data.mjs` as the +menu's source of truth. ## Container environment diff --git a/app/src/components/menu-browser.tsx b/app/src/components/menu-browser.tsx index 58e052f..0267034 100644 --- a/app/src/components/menu-browser.tsx +++ b/app/src/components/menu-browser.tsx @@ -24,7 +24,9 @@ export function MenuBrowser({ }) { const [active, setActive] = React.useState('all') - const visible = items.filter((item) => active === 'all' || item.category === active) + const visible = items.filter( + (item) => item.available !== false && (active === 'all' || item.category === active), + ) return ( <> @@ -71,30 +73,27 @@ function MenuCard({ item }: { item: MenuItem }) { className="relative h-64 w-full bg-cover bg-center" style={{ backgroundImage: `url('${item.image}')` }} > - {item.group ? ( -
- -
- ) : null} + ) : (
{icon} - {item.group ? ( -
- -
- ) : null} +
+ +
)}
-

{item.name}

- {item.price ? ( - ₹{item.price} - ) : null} +

+ {item.name} + {item.variant ? ( + – {item.variant} + ) : null} +

+ ₹{item.price}
{item.description ? (

{item.description}

@@ -130,9 +129,13 @@ function MenuCard({ item }: { item: MenuItem }) { ) } +function ItemBadges({ item }: { item: MenuItem }) { + if (item.diet !== 'veg' && item.diet !== 'nonveg') return null + return +} + /** FSSAI-style dietary mark: green square for veg, red for non-veg. */ -function DietBadge({ group }: { group: string }) { - const isVeg = group === 'veg' +function DietBadge({ isVeg }: { isVeg: boolean }) { const border = isVeg ? 'border-green-500' : 'border-red-500' const dot = isVeg ? 'bg-green-500' : 'bg-red-500' return ( diff --git a/app/src/data/menu-data.mjs b/app/src/data/menu-data.mjs index a647128..b34fc91 100644 --- a/app/src/data/menu-data.mjs +++ b/app/src/data/menu-data.mjs @@ -6,8 +6,15 @@ * edit this file, commit, then run scripts/update-menu.mjs to refresh the * live PocketBase data. * - * group: 'veg' | 'nonveg' | '' (mixed / not applicable) - * price: text so ranges like "449/549" work + * Schema notes (v3, POS-friendly): + * - Variants are separate products whenever their price differs + * ("Penne Arrabiata" + variant "Veg" 589 / "Chicken" 639). + * - Same-price choice lists (flavours, sauces) stay on one item in `tag`. + * - price: number, whole rupees (449 = ₹449). + * - diet: 'veg' | 'nonveg' | 'mixed' (PB bools can't be null, so a select is used). + * - sku: stable GB-- code for POS mapping. + * - tax_category: default "food-5-gst" — adjust per item if the POS needs it. + * - available: false hides an item (86'd) without deleting it. */ export const MENU_CATEGORIES = [ @@ -24,10 +31,28 @@ export const MENU_CATEGORIES = [ { uid: 'cat-pizzas', slug: 'pizzas', name: 'Pizzas', sort: 11 }, ] +const CAT_CODES = { + 'brew-bites': 'BRB', + 'sharing-plates': 'SHP', + salads: 'SAL', + platters: 'PLT', + 'international-appetizers': 'INT', + 'indian-appetizers': 'IND', + 'main-course': 'MNC', + curries: 'CUR', + 'biryanis-rice-breads': 'BRR', + desserts: 'DES', + pizzas: 'PIZ', +} + let sortCounter = 0 -function item(category, name, price, description, { group = '', tag = '' } = {}) { +const skuCounters = {} + +function item(category, name, price, { variant = '', desc = '', diet = 'mixed', tag = '', pairing = '' } = {}) { sortCounter += 1 - const slug = name + skuCounters[category] = (skuCounters[category] ?? 0) + 1 + const slugSource = variant ? `${name} ${variant}` : name + const slug = slugSource .toLowerCase() .replace(/[^a-z0-9]+/g, '-') .replace(/^-|-$/g, '') @@ -35,413 +60,704 @@ function item(category, name, price, description, { group = '', tag = '' } = {}) uid: `menu-${category}-${slug}`, category, name, - description, + variant, + description: desc, price, - pairing: '', + diet, + pairing, tag, image: '', - group, + sku: `GB-${CAT_CODES[category]}-${String(skuCounters[category]).padStart(3, '0')}`, + available: true, + tax_category: 'food-5-gst', sort: sortCounter, } } export const MENU_ITEMS = [ // ---------------------------------------------------------------- Brew Bites - item('brew-bites', 'Chana Chaat', '399', - 'Cooked white chickpeas tossed with onion, tomato, herbs, sweet & spicy chutney & aromatic spices', - { group: 'veg' }), - item('brew-bites', 'French Fries', '389', - 'Fries tossed in your flavour', - { group: 'veg', tag: 'Classic / Gunpowder / Peri-Peri' }), - item('brew-bites', 'Garlic Bread', '239/399', - 'House bake', - { group: 'veg', tag: 'Plain / With Cheese' }), - item('brew-bites', 'Onion Rings', '419', - 'Deep fried onion rings + thousand island', - { group: 'veg' }), - item('brew-bites', 'Peanut Papad Masala', '389', - 'Roasted peanuts tossed with onion, tomato, lemon, fresh coriander & aromatic spices', - { group: 'veg' }), - item('brew-bites', 'Steamed / Spicy Edamame', '389', - 'Edamame in the pod steamed & salted / tempered with garlic & chili', - { group: 'veg', tag: 'Steamed / Spicy' }), - item('brew-bites', 'Cranberry Sev Puri', '', - 'Crispy papdi, spiced potato, chana, sweet-sour cranberry chutney, sweet curd & nylon sev', - { group: 'veg', tag: 'Coming Soon' }), - item('brew-bites', 'Chicken & Cheese Bites', '459', - 'Chicken minced and cheese mix, fried to perfection + chipotle dip', - { group: 'nonveg' }), + item('brew-bites', 'Chana Chaat', 399, { + diet: 'veg', + desc: 'Cooked white chickpeas tossed with onion, tomato, herbs, sweet & spicy chutney & aromatic spices', + }), + item('brew-bites', 'French Fries', 389, { + diet: 'veg', + tag: 'Classic / Gunpowder / Peri-Peri', + }), + item('brew-bites', 'Garlic Bread', 239, { variant: 'Plain', diet: 'veg', desc: 'House bake' }), + item('brew-bites', 'Garlic Bread', 399, { variant: 'With Cheese', diet: 'veg', desc: 'House bake' }), + item('brew-bites', 'Onion Rings', 419, { diet: 'veg', desc: 'Deep fried onion rings + thousand island' }), + item('brew-bites', 'Peanut Papad Masala', 389, { + diet: 'veg', + desc: 'Roasted peanuts tossed with onion, tomato, lemon, fresh coriander & aromatic spices', + }), + item('brew-bites', 'Edamame', 389, { + diet: 'veg', + tag: 'Steamed / Spicy', + desc: 'Edamame in the pod steamed & salted / tempered with garlic & chili', + }), + item('brew-bites', 'Chicken & Cheese Bites', 459, { + diet: 'nonveg', + desc: 'Chicken minced and cheese mix, fried to perfection + chipotle dip', + }), // ------------------------------------------------------------ Sharing Plates - item('sharing-plates', 'Hummus Pita Platter', '449/549', - 'Classic, roasted bell pepper & black beans-cumin hummus, pita, sesame naan & za’atar crostini + arabic pickle', - { tag: 'Veg / Chicken' }), - item('sharing-plates', 'Ultimate Nachos', '599/699', - 'Corn tortilla, beans sauce, pico-de-gallo, cheese sauce, tomato salsa & sour cream', - { tag: 'Veg / Chicken' }), + item('sharing-plates', 'Hummus Pita Platter', 449, { + variant: 'Veg', + diet: 'veg', + desc: 'Classic, roasted bell pepper & black beans-cumin hummus, pita, sesame naan & za’atar crostini + arabic pickle', + }), + item('sharing-plates', 'Hummus Pita Platter', 549, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Classic, roasted bell pepper & black beans-cumin hummus, pita, sesame naan & za’atar crostini + arabic pickle', + }), + item('sharing-plates', 'Ultimate Nachos', 599, { + variant: 'Veg', + diet: 'veg', + desc: 'Corn tortilla, beans sauce, pico-de-gallo, cheese sauce, tomato salsa & sour cream', + }), + item('sharing-plates', 'Ultimate Nachos', 699, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Corn tortilla, beans sauce, pico-de-gallo, cheese sauce, tomato salsa & sour cream', + }), // ------------------------------------------------------------------- Salads - item('salads', 'Avocado & Egg Salad', '509', - 'Mixed greens, green beans, cherry tomato, olives, pumpkin seeds + malta vinaigrette', - { group: 'nonveg' }), - item('salads', 'Crispy Lotus Stem & Chickpea Salad', '429', - 'Lettuce, bell peppers, corns, chickpeas, crispy lotus stem + citrus vinaigrette', - { group: 'veg' }), - item('salads', 'Caesar Salad', '449', - 'Iceberg, romaine, parmesan shavings, croutons + veg caesar dressing', - { tag: 'Veg / Chicken' }), - item('salads', 'Chicken Tikka Niçoise Salad', '499', - 'Mixed greens, pulled chicken tikka, boiled egg, potato cubes, green beans, olives + lemon vinaigrette', - { group: 'nonveg' }), - item('salads', 'Quinoa Health Freak Salad', '499/529', - 'Quinoa, lettuce, cucumber, cherry tomato, olives, broccoli + apple cider dressing', - { tag: 'Veg / Chicken' }), - item('salads', 'Roasted Beetroot & Walnut Salad', '449', - 'Mixed lettuce, roasted beet, broccoli, orange segments, cherry tomatoes & feta + balsamic dressing', - { group: 'veg' }), - item('salads', 'Warm Vegetable Salad', '469', - 'Warm exotic vegetables tossed with mustard dressing, topped with pumpkin seeds & roasted almond', - { group: 'veg' }), + item('salads', 'Avocado & Egg Salad', 509, { + diet: 'nonveg', + desc: 'Mixed greens, green beans, cherry tomato, olives, pumpkin seeds + malta vinaigrette', + }), + item('salads', 'Crispy Lotus Stem & Chickpea Salad', 429, { + diet: 'veg', + desc: 'Lettuce, bell peppers, corns, chickpeas, crispy lotus stem + citrus vinaigrette', + }), + item('salads', 'Caesar Salad', 449, { + tag: 'Veg / Chicken', + desc: 'Iceberg, romaine, parmesan shavings, croutons + veg caesar dressing', + }), + item('salads', 'Chicken Tikka Niçoise Salad', 499, { + diet: 'nonveg', + desc: 'Mixed greens, pulled chicken tikka, boiled egg, potato cubes, green beans, olives + lemon vinaigrette', + }), + item('salads', 'Quinoa Health Freak Salad', 499, { + variant: 'Veg', + diet: 'veg', + desc: 'Quinoa, lettuce, cucumber, cherry tomato, olives, broccoli + apple cider dressing', + }), + item('salads', 'Quinoa Health Freak Salad', 529, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Quinoa, lettuce, cucumber, cherry tomato, olives, broccoli + apple cider dressing', + }), + item('salads', 'Roasted Beetroot & Walnut Salad', 449, { + diet: 'veg', + desc: 'Mixed lettuce, roasted beet, broccoli, orange segments, cherry tomatoes & feta + balsamic dressing', + }), + item('salads', 'Warm Vegetable Salad', 469, { + diet: 'veg', + desc: 'Warm exotic vegetables tossed with mustard dressing, topped with pumpkin seeds & roasted almond', + }), // ----------------------------------------------------------------- Platters - item('platters', 'Chelo Kebab Platter', '1069', - 'Basil chicken seekh, za’atar mutton seekh, chicken shish taouk, sumac chicken breast, saffron rice + tzatziki', - { group: 'nonveg' }), - item('platters', 'Chicken Tikka Platter', '1159', - 'Herb-pepper, malai, parmesan chicken, angara, lehsuni', - { group: 'nonveg' }), - item('platters', 'Mezze Platter Veg', '899', - 'Pan seared cottage cheese, falafel, spinach-ricotta roll, tabbouleh, pita bread, arabic pickle + hummus, labneh, chilli dip', - { group: 'veg' }), - item('platters', 'Mezze Platter Non-Veg', '1159', - 'Cajun fish, peri-peri chicken, lamb roll, chicken kafta, arabic pickle, pita bread + hummus, labneh, chilli dip', - { group: 'nonveg' }), - item('platters', 'Tandoori Veg Platter', '999', - 'Achari paneer tikka, hari mirch paneer tikka, tandoori khumb, roasted pineapple, tandoori soya chaap, quinoa veg seekh, sprouted moong kebab', - { group: 'veg' }), - item('platters', 'Seafood Fritters Platter', '1299', - 'Batter fried prawns, ajwain fish fry, fish fingers, mixed seafood fritters + tartar sauce, mint mayo', - { group: 'nonveg' }), - item('platters', 'Tandoori Meat Platter', '1299', - 'Tandoori prawns, tandoori fish tikka, mutton seekh, tandoori chicken, angara chicken tikka, parmesan chicken tikka, chicken seekh', - { group: 'nonveg' }), - item('platters', 'Sizzler', '699/799', - 'Choose your starch (fried rice / noodles) & your sauce (schezwan / sweet n sour); served with soya sesame vegetables, grilled pineapple slice & fries', - { tag: 'Cottage Cheese / Manchurian / Chicken' }), + item('platters', 'Chelo Kebab Platter', 1069, { + diet: 'nonveg', + desc: 'Basil chicken seekh, za’atar mutton seekh, chicken shish taouk, sumac chicken breast, saffron rice + tzatziki', + }), + item('platters', 'Chicken Tikka Platter', 1159, { + diet: 'nonveg', + desc: 'Herb-pepper, malai, parmesan chicken, angara, lehsuni', + }), + item('platters', 'Mezze Platter', 899, { + variant: 'Veg', + diet: 'veg', + desc: 'Pan seared cottage cheese, falafel, spinach-ricotta roll, tabbouleh, pita bread, arabic pickle + hummus, labneh, chilli dip', + }), + item('platters', 'Mezze Platter', 1159, { + variant: 'Non-Veg', + diet: 'nonveg', + desc: 'Cajun fish, peri-peri chicken, lamb roll, chicken kafta, arabic pickle, pita bread + hummus, labneh, chilli dip', + }), + item('platters', 'Tandoori Veg Platter', 999, { + diet: 'veg', + desc: 'Achari paneer tikka, hari mirch paneer tikka, tandoori khumb, roasted pineapple, tandoori soya chaap, quinoa veg seekh, sprouted moong kebab', + }), + item('platters', 'Seafood Fritters Platter', 1299, { + diet: 'nonveg', + desc: 'Batter fried prawns, ajwain fish fry, fish fingers, mixed seafood fritters + tartar sauce, mint mayo', + }), + item('platters', 'Tandoori Meat Platter', 1299, { + diet: 'nonveg', + desc: 'Tandoori prawns, tandoori fish tikka, mutton seekh, tandoori chicken, angara chicken tikka, parmesan chicken tikka, chicken seekh', + }), + item('platters', 'Sizzler', 699, { + variant: 'Cottage Cheese', + diet: 'veg', + desc: 'Choose your starch (fried rice / noodles) & your sauce (schezwan / sweet n sour); served with soya sesame vegetables, grilled pineapple slice & fries', + }), + item('platters', 'Sizzler', 699, { + variant: 'Manchurian', + diet: 'veg', + desc: 'Choose your starch (fried rice / noodles) & your sauce (schezwan / sweet n sour); served with soya sesame vegetables, grilled pineapple slice & fries', + }), + item('platters', 'Sizzler', 799, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Choose your starch (fried rice / noodles) & your sauce (schezwan / sweet n sour); served with soya sesame vegetables, grilled pineapple slice & fries', + }), // ------------------------------------------------- International Appetizers - item('international-appetizers', 'Apple & Avocado Salsa', '439', - 'Granny smith apple, khakhra crisp and melba toast', - { group: 'veg' }), - item('international-appetizers', 'Mushroom Pepper Fry', '549', - 'Mushroom cooked with black pepper fry masala + Malabari parotta', - { group: 'veg' }), - item('international-appetizers', 'Corn Salt N Pepper', '519', - 'Crispy fried corn, onions, spring onions', - { group: 'veg' }), - item('international-appetizers', 'Chilli Paneer / Chilli Mushroom', '549', - 'Crispy fried cubes, onion, capsicum, bell peppers + chilli paste', - { group: 'veg', tag: 'Paneer / Mushroom' }), - item('international-appetizers', 'Cottage Cheese Quesadilla', '579', - 'Flour tortilla, mix cheese, beans + tomato salsa, sour cream', - { group: 'veg' }), - item('international-appetizers', 'Falafel', '439', - 'Arabic pickle, chickpea patties + hummus & pita', - { group: 'veg' }), - item('international-appetizers', 'Honey Chilly Cauliflower / Potato', '449', - 'Crispy fried cauliflower/potato, sesame seeds, honey chili sauce', - { group: 'veg', tag: 'Cauliflower / Potato' }), - item('international-appetizers', 'Korean Fried Paneer', '549', - 'Crispy fried paneer tossed in umami Korean sauce', - { group: 'veg' }), - item('international-appetizers', 'Peri-Peri Quinoa Popcorn', '449', - 'Paneer cubes, quinoa crusted + peri peri dust and roasted garlic aioli', - { group: 'veg' }), - item('international-appetizers', 'Exotic Vegetables', '439', - 'Stir fry vegetables with garlic and butter', - { group: 'veg' }), - item('international-appetizers', 'Thai Chilli Crispy Lotus Stems', '479', - 'Crispy fried lotus stems in chilli sauce, spring onion & roasted sesame seeds', - { group: 'veg' }), - item('international-appetizers', 'Veg Manchurian', '449', - 'Fried vegetable balls in sweet & sour, hot manchurian sauce', - { group: 'veg' }), - item('international-appetizers', 'Veg Cigar Roll', '449', - 'Crispy fried cigar rolls stuffed with cheese & fresh vegetables, pickled salad & spicy remoulade', - { group: 'veg' }), - item('international-appetizers', 'Boneless Chicken Wings', '629', - 'Juicy crispy boneless chicken breast + classic hot sauce, ranch dip', - { group: 'nonveg' }), - item('international-appetizers', 'BBQ Pork Ribs', '899', - 'Tender slow cooked BBQ pork ribs served with crispy french fries', - { group: 'nonveg' }), - item('international-appetizers', 'Chicken Quesadilla', '719', - 'Flour tortillas filled with chicken & cheese, mexican rice + pico de gallo, sour cream', - { group: 'nonveg' }), - item('international-appetizers', 'Chilli Chicken', '639', - 'Crispy fried boneless chicken, onion, bell peppers + chilli paste', - { group: 'nonveg' }), - item('international-appetizers', 'Chicken Wings', '599', - 'Crispy fried to perfection', - { group: 'nonveg', tag: 'BBQ / Hot Sauce / Peri-Peri / Grandma Style' }), - item('international-appetizers', 'Chilly Garlic Prawns', '889', - 'Spicy prawns tossed in hot garlic sauce', - { group: 'nonveg' }), - item('international-appetizers', 'Fish and Chips', '799/949', - 'Crispy battered fish served with golden fries + egg tartar sauce, ponzu dip', - { group: 'nonveg', tag: 'Basa / Sole' }), - item('international-appetizers', 'Korean Fried Chicken', '639', - 'Crispy fried chicken tossed in umami Korean sauce', - { group: 'nonveg' }), - item('international-appetizers', 'Moroccan Grilled Chicken', '659', - 'Arabic spice, hung curd, served with grilled veggies + creamy labneh', - { group: 'nonveg' }), - item('international-appetizers', 'Kaffir Lime-Coconut Fish Fillet', '799/949', - 'Thai flavour infused fish with spicy coconut curry', - { group: 'nonveg', tag: 'Basa / Sole' }), - item('international-appetizers', 'Schezwan Chicken Lollipop', '599', - 'Crispy oriental style chicken wings tossed in fiery schezwan sauce', - { group: 'nonveg' }), - item('international-appetizers', 'Spicy Chicken Strips', '599', - 'Spicy strips + sweet chilli sauce', - { group: 'nonveg' }), + item('international-appetizers', 'Apple & Avocado Salsa', 439, { + diet: 'veg', + desc: 'Granny smith apple, khakhra crisp and melba toast', + }), + item('international-appetizers', 'Mushroom Pepper Fry', 549, { + diet: 'veg', + desc: 'Mushroom cooked with black pepper fry masala + Malabari parotta', + }), + item('international-appetizers', 'Corn Salt N Pepper', 519, { + diet: 'veg', + desc: 'Crispy fried corn, onions, spring onions', + }), + item('international-appetizers', 'Chilli Paneer / Chilli Mushroom', 549, { + diet: 'veg', + tag: 'Paneer / Mushroom', + desc: 'Crispy fried cubes, onion, capsicum, bell peppers + chilli paste', + }), + item('international-appetizers', 'Cottage Cheese Quesadilla', 579, { + diet: 'veg', + desc: 'Flour tortilla, mix cheese, beans + tomato salsa, sour cream', + }), + item('international-appetizers', 'Falafel', 439, { + diet: 'veg', + desc: 'Arabic pickle, chickpea patties + hummus & pita', + }), + item('international-appetizers', 'Honey Chilly Cauliflower / Potato', 449, { + diet: 'veg', + tag: 'Cauliflower / Potato', + desc: 'Crispy fried cauliflower/potato, sesame seeds, honey chili sauce', + }), + item('international-appetizers', 'Korean Fried Paneer', 549, { + diet: 'veg', + desc: 'Crispy fried paneer tossed in umami Korean sauce', + }), + item('international-appetizers', 'Peri-Peri Quinoa Popcorn', 449, { + diet: 'veg', + desc: 'Paneer cubes, quinoa crusted + peri peri dust and roasted garlic aioli', + }), + item('international-appetizers', 'Exotic Vegetables', 439, { + diet: 'veg', + desc: 'Stir fry vegetables with garlic and butter', + }), + item('international-appetizers', 'Thai Chilli Crispy Lotus Stems', 479, { + diet: 'veg', + desc: 'Crispy fried lotus stems in chilli sauce, spring onion & roasted sesame seeds', + }), + item('international-appetizers', 'Veg Manchurian', 449, { + diet: 'veg', + desc: 'Fried vegetable balls in sweet & sour, hot manchurian sauce', + }), + item('international-appetizers', 'Veg Cigar Roll', 449, { + diet: 'veg', + desc: 'Crispy fried cigar rolls stuffed with cheese & fresh vegetables, pickled salad & spicy remoulade', + }), + item('international-appetizers', 'Boneless Chicken Wings', 629, { + diet: 'nonveg', + desc: 'Juicy crispy boneless chicken breast + classic hot sauce, ranch dip', + }), + item('international-appetizers', 'BBQ Pork Ribs', 899, { + diet: 'nonveg', + desc: 'Tender slow cooked BBQ pork ribs served with crispy french fries', + }), + item('international-appetizers', 'Chicken Quesadilla', 719, { + diet: 'nonveg', + desc: 'Flour tortillas filled with chicken & cheese, mexican rice + pico de gallo, sour cream', + }), + item('international-appetizers', 'Chilli Chicken', 639, { + diet: 'nonveg', + desc: 'Crispy fried boneless chicken, onion, bell peppers + chilli paste', + }), + item('international-appetizers', 'Chicken Wings', 599, { + diet: 'nonveg', + tag: 'BBQ / Hot Sauce / Peri-Peri / Grandma Style', + desc: 'Crispy fried to perfection', + }), + item('international-appetizers', 'Chilly Garlic Prawns', 889, { + diet: 'nonveg', + desc: 'Spicy prawns tossed in hot garlic sauce', + }), + item('international-appetizers', 'Fish and Chips', 799, { + variant: 'Basa', + diet: 'nonveg', + desc: 'Crispy battered fish served with golden fries + egg tartar sauce, ponzu dip', + }), + item('international-appetizers', 'Fish and Chips', 949, { + variant: 'Sole', + diet: 'nonveg', + desc: 'Crispy battered fish served with golden fries + egg tartar sauce, ponzu dip', + }), + item('international-appetizers', 'Korean Fried Chicken', 639, { + diet: 'nonveg', + desc: 'Crispy fried chicken tossed in umami Korean sauce', + }), + item('international-appetizers', 'Moroccan Grilled Chicken', 659, { + diet: 'nonveg', + desc: 'Arabic spice, hung curd, served with grilled veggies + creamy labneh', + }), + item('international-appetizers', 'Kaffir Lime-Coconut Fish Fillet', 799, { + variant: 'Basa', + diet: 'nonveg', + desc: 'Thai flavour infused fish with spicy coconut curry', + }), + item('international-appetizers', 'Kaffir Lime-Coconut Fish Fillet', 949, { + variant: 'Sole', + diet: 'nonveg', + desc: 'Thai flavour infused fish with spicy coconut curry', + }), + item('international-appetizers', 'Schezwan Chicken Lollipop', 599, { + diet: 'nonveg', + desc: 'Crispy oriental style chicken wings tossed in fiery schezwan sauce', + }), + item('international-appetizers', 'Spicy Chicken Strips', 599, { + diet: 'nonveg', + desc: 'Spicy strips + sweet chilli sauce', + }), // -------------------------------------------------------- Indian Appetizers - item('indian-appetizers', 'Quinoa Seekh Kebab', '429', - 'Minced vegetables, paneer & quinoa seekh kebab + mint sauce', - { group: 'veg' }), - item('indian-appetizers', 'Sprouted Moong Kebab', '429', - 'Green sprouted moong, fresh coriander, spices & shallow fry + mint sauce', - { group: 'veg' }), - item('indian-appetizers', 'Dahi Kebab', '449', - 'Hung curd, onion, bell pepper, coriander seeds, seasoning', - { group: 'veg' }), - item('indian-appetizers', 'Prune Stuffed Paneer Tikka', '559', - 'Khata meeta prunes stuffed paneer, marinated with tandoori masala + mint sauce', - { group: 'veg' }), - item('indian-appetizers', 'Molten Beetroot & Peanut Kebab', '449', - 'Crumb fried beetroot kebab stuffed with cheese + scallion cream', - { group: 'veg' }), - item('indian-appetizers', 'Paneer Tikka', '549', - 'Paneer marinated with spices, cooked in tandoor, served hot + mint sauce', - { group: 'veg', tag: 'Malai / Hari Mirch / Angara' }), - item('indian-appetizers', 'Sweet Potato & Goat Cheese Tikki', '449', - 'Cranberry-sesame chutney, red chilli-green apple salsa', - { group: 'veg' }), - item('indian-appetizers', 'Roasted Pineapple', '449', - 'Roasted in clay oven with Indian spices + mint sauce', - { group: 'veg' }), - item('indian-appetizers', 'Tandoori Khumb', '529', - 'Spicy mushrooms + mint sauce', - { group: 'veg' }), - item('indian-appetizers', 'Tandoori Soya Chaap', '459', - 'Soya chaap cooked in clay oven + mint sauce', - { group: 'veg', tag: 'Malai / Angara' }), - item('indian-appetizers', 'Maharashtrian Thecha Paneer', '549', - 'Green chili thecha tossed paneer cubes + Malabari paratha', - { group: 'veg' }), - item('indian-appetizers', 'Amritsari Fish Fry', '729/869', - 'Gram flour batter fried fish + mint chutney', - { group: 'nonveg', tag: 'Basa / Sole' }), - item('indian-appetizers', 'Chicken Tikka', '639', - 'Marinated chicken, cooked in tandoor — choose your flavour', - { group: 'nonveg', tag: 'Malai / Parmesan / Lehsuni / Angara / Herb-Pepper' }), - item('indian-appetizers', 'Chicken Seekh', '549', - 'Marinated minced chicken, Indian herbs, spices + mint sauce', - { group: 'nonveg' }), - item('indian-appetizers', 'Fish Tikka', '729/869', - 'Marinated fish cooked in clay oven + mint sauce', - { group: 'nonveg', tag: 'Basa / Sole • Angara / Kasundi' }), - item('indian-appetizers', 'Grilled Tawa Fish', '729/869', - 'Fish marinated in Indian spices, pan grilled to perfection + mint sauce', - { group: 'nonveg', tag: 'Basa / Sole' }), - item('indian-appetizers', 'Mutton Chapli Kebab (1/4 kg)', '759', - 'Minced mutton, chapli masala, cooked to perfection + rogan josh jus', - { group: 'nonveg' }), - item('indian-appetizers', 'Mutton Seekh Kebab', '729', - 'Marinated minced lamb seasoned with Indian herbs & spices', - { group: 'nonveg' }), - item('indian-appetizers', 'Tandoori Chicken', '559/889', - 'Chicken on the bone in cultured yogurt and spices', - { group: 'nonveg' }), - item('indian-appetizers', 'Tandoori Wings', '579', - 'Chicken wings in cultured yogurt and spices', - { group: 'nonveg' }), - item('indian-appetizers', 'Prawns Masala', '949', - 'Spicy onion, tomato masala with curry leaves & mustard, served with uttapam', - { group: 'nonveg' }), - item('indian-appetizers', 'Tawa Masala', '549/779', - 'Punjabi style meat on bone, tawa masala & ground spices', - { group: 'nonveg', tag: 'Chicken / Mutton' }), - item('indian-appetizers', 'Nimbu Hari Mirch ki Tangari', '579', - 'Chicken drumstick, spicy hari mirch nimbu marinated, cooked to perfection + mint sauce', - { group: 'nonveg' }), + item('indian-appetizers', 'Quinoa Seekh Kebab', 429, { + diet: 'veg', + desc: 'Minced vegetables, paneer & quinoa seekh kebab + mint sauce', + }), + item('indian-appetizers', 'Sprouted Moong Kebab', 429, { + diet: 'veg', + desc: 'Green sprouted moong, fresh coriander, spices & shallow fry + mint sauce', + }), + item('indian-appetizers', 'Dahi Kebab', 449, { + diet: 'veg', + desc: 'Hung curd, onion, bell pepper, coriander seeds, seasoning', + }), + item('indian-appetizers', 'Prune Stuffed Paneer Tikka', 559, { + diet: 'veg', + desc: 'Khata meeta prunes stuffed paneer, marinated with tandoori masala + mint sauce', + }), + item('indian-appetizers', 'Molten Beetroot & Peanut Kebab', 449, { + diet: 'veg', + desc: 'Crumb fried beetroot kebab stuffed with cheese + scallion cream', + }), + item('indian-appetizers', 'Paneer Tikka', 549, { + diet: 'veg', + tag: 'Malai / Hari Mirch / Angara', + desc: 'Paneer marinated with spices, cooked in tandoor, served hot + mint sauce', + }), + item('indian-appetizers', 'Sweet Potato & Goat Cheese Tikki', 449, { + diet: 'veg', + desc: 'Cranberry-sesame chutney, red chilli-green apple salsa', + }), + item('indian-appetizers', 'Roasted Pineapple', 449, { + diet: 'veg', + desc: 'Roasted in clay oven with Indian spices + mint sauce', + }), + item('indian-appetizers', 'Tandoori Khumb', 529, { + diet: 'veg', + desc: 'Spicy mushrooms + mint sauce', + }), + item('indian-appetizers', 'Tandoori Soya Chaap', 459, { + diet: 'veg', + tag: 'Malai / Angara', + desc: 'Soya chaap cooked in clay oven + mint sauce', + }), + item('indian-appetizers', 'Maharashtrian Thecha Paneer', 549, { + diet: 'veg', + desc: 'Green chili thecha tossed paneer cubes + Malabari paratha', + }), + item('indian-appetizers', 'Amritsari Fish Fry', 729, { + variant: 'Basa', + diet: 'nonveg', + desc: 'Gram flour batter fried fish + mint chutney', + }), + item('indian-appetizers', 'Amritsari Fish Fry', 869, { + variant: 'Sole', + diet: 'nonveg', + desc: 'Gram flour batter fried fish + mint chutney', + }), + item('indian-appetizers', 'Chicken Tikka', 639, { + diet: 'nonveg', + tag: 'Malai / Parmesan / Lehsuni / Angara / Herb-Pepper', + desc: 'Marinated chicken, cooked in tandoor — choose your flavour', + }), + item('indian-appetizers', 'Chicken Seekh', 549, { + diet: 'nonveg', + desc: 'Marinated minced chicken, Indian herbs, spices + mint sauce', + }), + item('indian-appetizers', 'Fish Tikka', 729, { + variant: 'Basa', + diet: 'nonveg', + tag: 'Angara / Kasundi', + desc: 'Marinated fish cooked in clay oven + mint sauce', + }), + item('indian-appetizers', 'Fish Tikka', 869, { + variant: 'Sole', + diet: 'nonveg', + tag: 'Angara / Kasundi', + desc: 'Marinated fish cooked in clay oven + mint sauce', + }), + item('indian-appetizers', 'Grilled Tawa Fish', 729, { + variant: 'Basa', + diet: 'nonveg', + desc: 'Fish marinated in Indian spices, pan grilled to perfection + mint sauce', + }), + item('indian-appetizers', 'Grilled Tawa Fish', 869, { + variant: 'Sole', + diet: 'nonveg', + desc: 'Fish marinated in Indian spices, pan grilled to perfection + mint sauce', + }), + item('indian-appetizers', 'Mutton Chapli Kebab', 759, { + diet: 'nonveg', + desc: 'Minced mutton, chapli masala, cooked to perfection + rogan josh jus', + }), + item('indian-appetizers', 'Mutton Seekh Kebab', 729, { + diet: 'nonveg', + desc: 'Marinated minced lamb seasoned with Indian herbs & spices', + }), + item('indian-appetizers', 'Tandoori Chicken', 559, { + variant: 'Half', + diet: 'nonveg', + desc: 'Chicken on the bone in cultured yogurt and spices', + }), + item('indian-appetizers', 'Tandoori Chicken', 889, { + variant: 'Full', + diet: 'nonveg', + desc: 'Chicken on the bone in cultured yogurt and spices', + }), + item('indian-appetizers', 'Tandoori Wings', 579, { + diet: 'nonveg', + desc: 'Chicken wings in cultured yogurt and spices', + }), + item('indian-appetizers', 'Prawns Masala', 949, { + diet: 'nonveg', + desc: 'Spicy onion, tomato masala with curry leaves & mustard, served with uttapam', + }), + item('indian-appetizers', 'Tawa Masala', 549, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Punjabi style chicken on bone, tawa masala & ground spices', + }), + item('indian-appetizers', 'Tawa Masala', 779, { + variant: 'Mutton', + diet: 'nonveg', + desc: 'Punjabi style mutton on bone, tawa masala & ground spices', + }), + item('indian-appetizers', 'Nimbu Hari Mirch ki Tangari', 579, { + diet: 'nonveg', + desc: 'Chicken drumstick, spicy hari mirch nimbu marinated, cooked to perfection + mint sauce', + }), // -------------------------------------------------------------- Main Course - item('main-course', 'Cottage Cheese Steak', '629', - 'Herb quinoa, creamy spinach-corn, sautéed vegetables + roasted pepper coulis', - { group: 'veg' }), - item('main-course', 'Cajun Grilled Fish', '769/899', - 'Quinoa, sautéed vegetables, guacamole', - { group: 'nonveg', tag: 'Basa / Sole' }), - item('main-course', 'Roasted Garlic & Basil Chicken Thigh', '699', - 'Garlic & basil chicken thigh, brown onion pilaf, butter broccoli & spicy pepper coulis', - { group: 'nonveg' }), - item('main-course', 'Grilled Chicken Breast', '699', - 'Mash potato, sautéed vegetables', - { group: 'nonveg', tag: 'Classic Chicken Jus / Hot Peri Peri' }), - item('main-course', 'Penne Arrabiata', '589/639', - 'Pasta with exotic vegetables, basil, chilli flakes, chunky tomatoes + garlic bread', - { tag: 'Veg / Chicken' }), - item('main-course', 'Penne Alfredo', '599/649', - 'With exotic vegetables, creamy cheesy sauce + garlic bread', - { tag: 'Veg / Chicken' }), - item('main-course', 'Penne Salsa Rosa', '599/649', - 'Penne in mix sauce, exotic vegetables + garlic bread', - { tag: 'Veg / Chicken' }), - item('main-course', 'Pan Seared Salmon', '1259', - 'Creamy mashed potato, grilled vegetables + lemon caper sauce', - { group: 'nonveg' }), - item('main-course', 'Spaghetti Aglio e Olio', '549/599', - 'Olive oil, garlic, olives, chili flakes + garlic bread', - { tag: 'Veg / Chicken' }), - item('main-course', 'Chow Mein', '399/429/479', - 'Wok tossed noodles with soy, vinegar & chili sauce', - { tag: 'Veg / Egg / Chicken' }), - item('main-course', 'Fried Rice', '399/429/479', - 'Wok tossed rice with soy, vinegar & chili sauce', - { tag: 'Veg / Egg / Chicken' }), - item('main-course', 'Green / Red Thai Curry', '579/629/659', - 'Veggies cooked in creamy coconut gravy, curry paste + steamed rice', - { tag: 'Veg / Chicken / Prawns' }), - item('main-course', 'Chili Garlic Noodles', '429', - 'Noodles tossed with authentic chili-garlic sauce, spring onion and soya', - { group: 'veg' }), + item('main-course', 'Cottage Cheese Steak', 629, { + diet: 'veg', + desc: 'Herb quinoa, creamy spinach-corn, sautéed vegetables + roasted pepper coulis', + }), + item('main-course', 'Cajun Grilled Fish', 769, { + variant: 'Basa', + diet: 'nonveg', + desc: 'Quinoa, sautéed vegetables, guacamole', + }), + item('main-course', 'Cajun Grilled Fish', 899, { + variant: 'Sole', + diet: 'nonveg', + desc: 'Quinoa, sautéed vegetables, guacamole', + }), + item('main-course', 'Roasted Garlic & Basil Chicken Thigh', 699, { + diet: 'nonveg', + desc: 'Garlic & basil chicken thigh, brown onion pilaf, butter broccoli & spicy pepper coulis', + }), + item('main-course', 'Grilled Chicken Breast', 699, { + diet: 'nonveg', + tag: 'Classic Chicken Jus / Hot Peri Peri', + desc: 'Mash potato, sautéed vegetables', + }), + item('main-course', 'Penne Arrabiata', 589, { + variant: 'Veg', + diet: 'veg', + desc: 'Pasta with exotic vegetables, basil, chilli flakes, chunky tomatoes + garlic bread', + }), + item('main-course', 'Penne Arrabiata', 639, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Pasta with exotic vegetables, basil, chilli flakes, chunky tomatoes + garlic bread', + }), + item('main-course', 'Penne Alfredo', 599, { + variant: 'Veg', + diet: 'veg', + desc: 'With exotic vegetables, creamy cheesy sauce + garlic bread', + }), + item('main-course', 'Penne Alfredo', 649, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'With exotic vegetables, creamy cheesy sauce + garlic bread', + }), + item('main-course', 'Penne Salsa Rosa', 599, { + variant: 'Veg', + diet: 'veg', + desc: 'Penne in mix sauce, exotic vegetables + garlic bread', + }), + item('main-course', 'Penne Salsa Rosa', 649, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Penne in mix sauce, exotic vegetables + garlic bread', + }), + item('main-course', 'Pan Seared Salmon', 1259, { + diet: 'nonveg', + desc: 'Creamy mashed potato, grilled vegetables + lemon caper sauce', + }), + item('main-course', 'Spaghetti Aglio e Olio', 549, { + variant: 'Veg', + diet: 'veg', + desc: 'Olive oil, garlic, olives, chili flakes + garlic bread', + }), + item('main-course', 'Spaghetti Aglio e Olio', 599, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Olive oil, garlic, olives, chili flakes + garlic bread', + }), + item('main-course', 'Chow Mein', 399, { + variant: 'Veg', + diet: 'veg', + desc: 'Wok tossed noodles with soy, vinegar & chili sauce', + }), + item('main-course', 'Chow Mein', 429, { + variant: 'Egg', + diet: 'nonveg', + desc: 'Wok tossed noodles with soy, vinegar & chili sauce', + }), + item('main-course', 'Chow Mein', 479, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Wok tossed noodles with soy, vinegar & chili sauce', + }), + item('main-course', 'Fried Rice', 399, { + variant: 'Veg', + diet: 'veg', + desc: 'Wok tossed rice with soy, vinegar & chili sauce', + }), + item('main-course', 'Fried Rice', 429, { + variant: 'Egg', + diet: 'nonveg', + desc: 'Wok tossed rice with soy, vinegar & chili sauce', + }), + item('main-course', 'Fried Rice', 479, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Wok tossed rice with soy, vinegar & chili sauce', + }), + item('main-course', 'Thai Curry', 579, { + variant: 'Veg', + diet: 'veg', + tag: 'Green / Red', + desc: 'Veggies cooked in creamy coconut gravy, curry paste + steamed rice', + }), + item('main-course', 'Thai Curry', 629, { + variant: 'Chicken', + diet: 'nonveg', + tag: 'Green / Red', + desc: 'Veggies cooked in creamy coconut gravy, curry paste + steamed rice', + }), + item('main-course', 'Thai Curry', 659, { + variant: 'Prawns', + diet: 'nonveg', + tag: 'Green / Red', + desc: 'Veggies cooked in creamy coconut gravy, curry paste + steamed rice', + }), + item('main-course', 'Chili Garlic Noodles', 429, { + diet: 'veg', + desc: 'Noodles tossed with authentic chili-garlic sauce, spring onion and soya', + }), // ------------------------------------------------------------------ Curries - item('curries', 'Dal Tadka / Palak Dal / Lasooni Dal', '399', - 'Mix of moong & masoor dal, as you wish', - { group: 'veg', tag: 'Tadka / Palak / Lasooni' }), - item('curries', 'Dal Makhani', '479', - 'Overnight slow cooked black urad dal, tempered with kasoori methi, cream & butter', - { group: 'veg' }), - item('curries', 'Kasoori Subz Milani', '519', - 'Melange of seasonal vegetables tossed in onion masala, dried fenugreek', - { group: 'veg' }), - item('curries', 'Kadhai / Makhani Paneer', '599', - 'Cottage cheese, capsicum, onion & kadhai masala / creamy tomato gravy', - { group: 'veg', tag: 'Kadhai / Makhani' }), - item('curries', 'Methi Palak Paneer', '569', - 'Cubes of cottage cheese, spinach & fenugreek', - { group: 'veg' }), - item('curries', 'Paneer Lababdar', '619', - 'Cubes of cottage cheese, bell pepper, onions & capsicum', - { group: 'veg' }), - item('curries', 'Mushroom Hara Pyaz', '579', - 'Mushroom & hara pyaz tossed in chopped masala', - { group: 'veg' }), - item('curries', 'Punjabi Chana Masala', '459', - 'White chickpeas with fragrant herbs & spices', - { group: 'veg' }), - item('curries', 'Butter Chicken', '779', - 'Chicken on bone + creamy tomato gravy', - { group: 'nonveg' }), - item('curries', 'Egg Curry', '519', - 'Hard boiled eggs in Indian gravy', - { group: 'nonveg' }), - item('curries', 'Punjabi Fish Curry', '759/859/899', - 'Choice of protein cooked in spicy tangy, onion tomato curry', - { group: 'nonveg', tag: 'Basa / Sole / Prawns' }), - item('curries', 'Home Style Chicken Curry', '659', - 'Chicken on bone + home style gravy', - { group: 'nonveg' }), - item('curries', 'Kadhai Chicken', '779', - 'Chicken on bone + kadhai masala', - { group: 'nonveg' }), - item('curries', 'Mutton Rogan Josh', '829', - 'Tender mutton on the bone, Kashmiri style', - { group: 'nonveg' }), - item('curries', 'Kulcha with Curry', '299/499/599', - 'Fresh kulcha served with your choice of curry', - { tag: 'Paneer / Chicken / Mutton' }), + item('curries', 'Dal Tadka / Palak Dal / Lasooni Dal', 399, { + diet: 'veg', + desc: 'Mix of moong & masoor dal, as you wish', + }), + item('curries', 'Dal Makhani', 479, { + diet: 'veg', + desc: 'Overnight slow cooked black urad dal, tempered with kasoori methi, cream & butter', + }), + item('curries', 'Kasoori Subz Milani', 519, { + diet: 'veg', + desc: 'Melange of seasonal vegetables tossed in onion masala, dried fenugreek', + }), + item('curries', 'Kadhai / Makhani Paneer', 599, { + diet: 'veg', + tag: 'Kadhai / Makhani', + desc: 'Cottage cheese, capsicum, onion & kadhai masala / creamy tomato gravy', + }), + item('curries', 'Methi Palak Paneer', 569, { + diet: 'veg', + desc: 'Cubes of cottage cheese, spinach & fenugreek', + }), + item('curries', 'Paneer Lababdar', 619, { + diet: 'veg', + desc: 'Cubes of cottage cheese, bell pepper, onions & capsicum', + }), + item('curries', 'Mushroom Hara Pyaz', 579, { + diet: 'veg', + desc: 'Mushroom & hara pyaz tossed in chopped masala', + }), + item('curries', 'Punjabi Chana Masala', 459, { + diet: 'veg', + desc: 'White chickpeas with fragrant herbs & spices', + }), + item('curries', 'Butter Chicken', 779, { + diet: 'nonveg', + desc: 'Chicken on bone + creamy tomato gravy', + }), + item('curries', 'Egg Curry', 519, { + diet: 'nonveg', + desc: 'Hard boiled eggs in Indian gravy', + }), + item('curries', 'Punjabi Fish Curry', 759, { + variant: 'Basa', + diet: 'nonveg', + desc: 'Choice of protein cooked in spicy tangy, onion tomato curry', + }), + item('curries', 'Punjabi Fish Curry', 859, { + variant: 'Sole', + diet: 'nonveg', + desc: 'Choice of protein cooked in spicy tangy, onion tomato curry', + }), + item('curries', 'Punjabi Fish Curry', 899, { + variant: 'Prawns', + diet: 'nonveg', + desc: 'Choice of protein cooked in spicy tangy, onion tomato curry', + }), + item('curries', 'Home Style Chicken Curry', 659, { + diet: 'nonveg', + desc: 'Chicken on bone + home style gravy', + }), + item('curries', 'Kadhai Chicken', 779, { + diet: 'nonveg', + desc: 'Chicken on bone + kadhai masala', + }), + item('curries', 'Mutton Rogan Josh', 829, { + diet: 'nonveg', + desc: 'Tender mutton on the bone, Kashmiri style', + }), + item('curries', 'Kulcha with Curry', 299, { + variant: 'Paneer', + diet: 'veg', + desc: 'Fresh kulcha served with your choice of curry', + }), + item('curries', 'Kulcha with Curry', 499, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Fresh kulcha served with your choice of curry', + }), + item('curries', 'Kulcha with Curry', 599, { + variant: 'Mutton', + diet: 'nonveg', + desc: 'Fresh kulcha served with your choice of curry', + }), // --------------------------------------------------- Biryanis, Rice & Breads - item('biryanis-rice-breads', 'Chicken Biryani', '779', - 'Aromatic basmati rice cooked in saffron & spices + mix raita', - { group: 'nonveg' }), - item('biryanis-rice-breads', 'Egg Biryani', '639', - 'Aromatic basmati rice cooked in saffron & spices + mix raita', - { group: 'nonveg' }), - item('biryanis-rice-breads', 'Mutton Biryani', '889', - 'Aromatic basmati rice cooked in saffron & spices + mix raita', - { group: 'nonveg' }), - item('biryanis-rice-breads', 'Vegetable Biryani', '599', - 'Aromatic basmati rice cooked in saffron & spices + mix raita', - { group: 'veg' }), - item('biryanis-rice-breads', 'Jeera Rice', '269', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Steamed Rice', '239', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Dhungari Burani Raita', '199', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Masala Boondi Raita', '189', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Onion, Tomato, Cucumber Raita', '189', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Pudina Raita', '189', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Butter Roti', '79', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Butter Naan', '99', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Garlic / Coriander Naan', '109', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Kachi Haldi Naan', '109', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Laccha / Pudina Parantha', '99', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Missi Roti', '99', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Onion Kulcha', '109', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Paneer Kulcha', '179', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Tandoori Naan', '89', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Tandoori Roti', '69', '', { group: 'veg' }), - item('biryanis-rice-breads', 'Khamiri Roti', '79', '', { group: 'veg' }), + item('biryanis-rice-breads', 'Biryani', 779, { + variant: 'Chicken', + diet: 'nonveg', + desc: 'Aromatic basmati rice cooked in saffron & spices + mix raita', + }), + item('biryanis-rice-breads', 'Biryani', 639, { + variant: 'Egg', + diet: 'nonveg', + desc: 'Aromatic basmati rice cooked in saffron & spices + mix raita', + }), + item('biryanis-rice-breads', 'Biryani', 889, { + variant: 'Mutton', + diet: 'nonveg', + desc: 'Aromatic basmati rice cooked in saffron & spices + mix raita', + }), + item('biryanis-rice-breads', 'Biryani', 599, { + variant: 'Vegetable', + diet: 'veg', + desc: 'Aromatic basmati rice cooked in saffron & spices + mix raita', + }), + item('biryanis-rice-breads', 'Jeera Rice', 269, { diet: 'veg' }), + item('biryanis-rice-breads', 'Steamed Rice', 239, { diet: 'veg' }), + item('biryanis-rice-breads', 'Dhungari Burani Raita', 199, { diet: 'veg' }), + item('biryanis-rice-breads', 'Masala Boondi Raita', 189, { diet: 'veg' }), + item('biryanis-rice-breads', 'Onion, Tomato, Cucumber Raita', 189, { diet: 'veg' }), + item('biryanis-rice-breads', 'Pudina Raita', 189, { diet: 'veg' }), + item('biryanis-rice-breads', 'Butter Roti', 79, { diet: 'veg' }), + item('biryanis-rice-breads', 'Butter Naan', 99, { diet: 'veg' }), + item('biryanis-rice-breads', 'Garlic / Coriander Naan', 109, { diet: 'veg' }), + item('biryanis-rice-breads', 'Kachi Haldi Naan', 109, { diet: 'veg' }), + item('biryanis-rice-breads', 'Laccha / Pudina Parantha', 99, { diet: 'veg' }), + item('biryanis-rice-breads', 'Missi Roti', 99, { diet: 'veg' }), + item('biryanis-rice-breads', 'Onion Kulcha', 109, { diet: 'veg' }), + item('biryanis-rice-breads', 'Paneer Kulcha', 179, { diet: 'veg' }), + item('biryanis-rice-breads', 'Tandoori Naan', 89, { diet: 'veg' }), + item('biryanis-rice-breads', 'Tandoori Roti', 69, { diet: 'veg' }), + item('biryanis-rice-breads', 'Khamiri Roti', 79, { diet: 'veg' }), // ----------------------------------------------------------------- Desserts - item('desserts', 'Baked Cheesecake', '419', - 'Fresh berries compote', - { group: 'veg' }), - item('desserts', 'Churros', '299', - 'Chocolate sauce, caramel sauce & whipped cream', - { group: 'veg' }), - item('desserts', 'Dark Chocolate Brownie with Ice Cream', '339', - 'Brownie topped with vanilla ice cream + chocolate sauce', - { group: 'veg' }), + item('desserts', 'Baked Cheesecake', 419, { + diet: 'veg', + desc: 'Fresh berries compote', + }), + item('desserts', 'Churros', 299, { + diet: 'veg', + desc: 'Chocolate sauce, caramel sauce & whipped cream', + }), + item('desserts', 'Dark Chocolate Brownie with Ice Cream', 339, { + diet: 'veg', + desc: 'Brownie topped with vanilla ice cream + chocolate sauce', + }), // ------------------------------------------------------------------- Pizzas - item('pizzas', 'Burnt Garlic Mushroom Pizza', '589', - 'Sautéed mushrooms, burnt garlic, onions', - { group: 'veg' }), - item('pizzas', 'Garden Fresh Pizza', '579', - 'American corn, onion, tomato, capsicum & jalapeno', - { group: 'veg' }), - item('pizzas', 'Exotic Pizza', '599', - 'Broccoli, zucchini, bell pepper, olives & baby corn', - { group: 'veg' }), - item('pizzas', 'Margherita Pizza', '559', - 'Mozzarella cheese & fresh basil', - { group: 'veg' }), - item('pizzas', 'Paneer Tikka Pizza', '599', - 'Paneer tikka, onion, tomato, capsicum', - { group: 'veg' }), - item('pizzas', 'Sundried-Tomato & Olives Pizza', '589', - 'Homemade sundried tomato, caper & fresh basil', - { group: 'veg' }), - item('pizzas', 'BBQ Pulled Chicken Pizza', '719', - 'Slow cooked pulled chicken, BBQ sauce & jalapeno', - { group: 'nonveg' }), - item('pizzas', 'Chicken Overload Pizza', '729', - 'Chicken tikka, BBQ chicken, herb chicken, onion', - { group: 'nonveg' }), - item('pizzas', 'Chicken Tikka Pizza', '719', - 'Chicken tikka, onion, tomato & capsicum', - { group: 'nonveg' }), - item('pizzas', 'Meat Lover Pizza', '729', - 'Mutton seekh, tikka chicken & chicken salami', - { group: 'nonveg' }), - item('pizzas', 'Pepperoni Pizza', '769', - 'Pork pepperoni, jalapeno, olives & fresh basil', - { group: 'nonveg' }), - item('pizzas', 'Peri-Peri Chicken Pizza', '729', - 'Peri peri marinated chicken, olives & pickled onion', - { group: 'nonveg' }), + item('pizzas', 'Burnt Garlic Mushroom Pizza', 589, { + diet: 'veg', + desc: 'Sautéed mushrooms, burnt garlic, onions', + }), + item('pizzas', 'Garden Fresh Pizza', 579, { + diet: 'veg', + desc: 'American corn, onion, tomato, capsicum & jalapeno', + }), + item('pizzas', 'Exotic Pizza', 599, { + diet: 'veg', + desc: 'Broccoli, zucchini, bell pepper, olives & baby corn', + }), + item('pizzas', 'Margherita Pizza', 559, { + diet: 'veg', + desc: 'Mozzarella cheese & fresh basil', + }), + item('pizzas', 'Paneer Tikka Pizza', 599, { + diet: 'veg', + desc: 'Paneer tikka, onion, tomato, capsicum', + }), + item('pizzas', 'Sundried-Tomato & Olives Pizza', 589, { + diet: 'veg', + desc: 'Homemade sundried tomato, caper & fresh basil', + }), + item('pizzas', 'BBQ Pulled Chicken Pizza', 719, { + diet: 'nonveg', + desc: 'Slow cooked pulled chicken, BBQ sauce & jalapeno', + }), + item('pizzas', 'Chicken Overload Pizza', 729, { + diet: 'nonveg', + desc: 'Chicken tikka, BBQ chicken, herb chicken, onion', + }), + item('pizzas', 'Chicken Tikka Pizza', 719, { + diet: 'nonveg', + desc: 'Chicken tikka, onion, tomato & capsicum', + }), + item('pizzas', 'Meat Lover Pizza', 729, { + diet: 'nonveg', + desc: 'Mutton seekh, tikka chicken & chicken salami', + }), + item('pizzas', 'Pepperoni Pizza', 769, { + diet: 'nonveg', + desc: 'Pork pepperoni, jalapeno, olives & fresh basil', + }), + item('pizzas', 'Peri-Peri Chicken Pizza', 729, { + diet: 'nonveg', + desc: 'Peri peri marinated chicken, olives & pickled onion', + }), ] diff --git a/app/src/lib/pb.ts b/app/src/lib/pb.ts index ad5d2c4..23565de 100644 --- a/app/src/lib/pb.ts +++ b/app/src/lib/pb.ts @@ -71,12 +71,12 @@ export async function fetchTestimonials(): Promise { export async function fetchMenuCategories(): Promise { return orFallback( await pbList('menu_categories'), - MENU_CATEGORIES as MenuCategory[], + MENU_CATEGORIES as unknown as MenuCategory[], ) } export async function fetchMenuItems(): Promise { - return orFallback(await pbList('menu_items'), MENU_ITEMS as MenuItem[]) + return orFallback(await pbList('menu_items'), MENU_ITEMS as unknown as MenuItem[]) } export async function fetchPairings(): Promise { diff --git a/app/src/lib/types.ts b/app/src/lib/types.ts index 46e392e..8a39427 100644 --- a/app/src/lib/types.ts +++ b/app/src/lib/types.ts @@ -68,15 +68,23 @@ export interface MenuCategory { export interface MenuItem { uid: string category: string + /** Base dish name; the variant is a separate product. */ name: string - description: string - /** Text so price ranges like "449/549" (Veg/Chicken) work. */ - price: string - pairing: string - tag: string - image: string - /** 'veg' | 'nonveg' | '' — drives the dietary badge on the menu card. */ - group: string + /** "Veg", "Chicken", "Basa", "Half"… — same dish, different product. */ + variant?: string + description?: string + /** Whole rupees (449 = ₹449). */ + price: number + /** Dietary status; 'mixed' items (e.g. Caesar Salad) get no badge. */ + diet?: 'veg' | 'nonveg' | 'mixed' + pairing?: string + tag?: string + image?: string + /** Stable POS code, e.g. GB-MNC-014. */ + sku?: string + /** false hides the item from the menu (86'd) without deleting it. */ + available?: boolean + tax_category?: string sort: number } diff --git a/pb/migrations/1788500100_menu_items_v3.js b/pb/migrations/1788500100_menu_items_v3.js new file mode 100644 index 0000000..a30a5f2 --- /dev/null +++ b/pb/migrations/1788500100_menu_items_v3.js @@ -0,0 +1,80 @@ +/// +migrate( + (app) => { + // v3 menu_items: POS-friendly schema. Variants are separate products with + // a numeric rupee price; is_veg replaces the text group; adds sku, + // available and tax_category. The old collection only held the previous + // menu sync, so it is replaced wholesale (records are re-synced by + // scripts/update-menu.mjs). + try { + const oldCollection = app.findCollectionByNameOrId('menu_items') + app.delete(oldCollection) + } catch (e) { + // collection may not exist on a fresh database — nothing to migrate + } + + const collection = new Collection({ + name: 'menu_items', + type: 'base', + listRule: '', + viewRule: '', + createRule: null, + updateRule: null, + deleteRule: null, + fields: [ + { name: 'uid', type: 'text', required: true }, + { name: 'category', type: 'text', required: true }, + { name: 'name', type: 'text', required: true }, + { name: 'variant', type: 'text' }, + { name: 'description', type: 'text' }, + { name: 'price', type: 'number', required: true }, + { name: 'diet', type: 'select', maxSelect: 1, values: ['veg', 'nonveg', 'mixed'] }, + { name: 'pairing', type: 'text' }, + { name: 'tag', type: 'text' }, + { name: 'image', type: 'text' }, + { name: 'sku', type: 'text' }, + { name: 'available', type: 'bool' }, + { name: 'tax_category', type: 'text' }, + { name: 'sort', type: 'number' }, + ], + indexes: [ + 'CREATE UNIQUE INDEX idx_menu_items_uid ON menu_items (uid)', + 'CREATE UNIQUE INDEX idx_menu_items_sku ON menu_items (sku) WHERE sku != \'\'', + ], + }) + return app.save(collection) + }, + (app) => { + // Revert to the v2 schema. + try { + const newCollection = app.findCollectionByNameOrId('menu_items') + app.delete(newCollection) + } catch (e) { + // nothing to revert + } + + const collection = new Collection({ + name: 'menu_items', + type: 'base', + listRule: '', + viewRule: '', + createRule: null, + updateRule: null, + deleteRule: null, + fields: [ + { name: 'uid', type: 'text', required: true }, + { name: 'category', type: 'text', required: true }, + { name: 'name', type: 'text', required: true }, + { name: 'description', type: 'text' }, + { name: 'price', type: 'text' }, + { name: 'pairing', type: 'text' }, + { name: 'tag', type: 'text' }, + { name: 'image', type: 'text' }, + { name: 'group', type: 'text' }, + { name: 'sort', type: 'number' }, + ], + indexes: ['CREATE UNIQUE INDEX idx_menu_items_uid ON menu_items (uid)'], + }) + return app.save(collection) + } +)