File size: 11,030 Bytes
211d39c
375539f
16defa4
 
3f862cb
4e07a43
16defa4
 
 
 
4e07a43
 
621242c
ebdfd29
4e07a43
a399ecf
4e07a43
621242c
6283128
a399ecf
4e07a43
a399ecf
6283128
3f862cb
 
16defa4
4e07a43
6283128
3f862cb
6283128
 
 
 
 
 
3f862cb
a399ecf
3f862cb
 
16defa4
6283128
621242c
6283128
 
 
a399ecf
6283128
3f862cb
621242c
a399ecf
 
3f862cb
a399ecf
 
 
 
 
 
6283128
621242c
b28006b
ebdfd29
1fdaee2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3f862cb
16defa4
 
 
 
 
1fdaee2
16defa4
 
3f862cb
 
1fdaee2
 
 
 
 
 
3f862cb
 
 
0f2f884
 
3f862cb
 
1fdaee2
 
 
 
 
 
3f862cb
 
 
 
 
 
0f2f884
 
 
b28006b
3f862cb
 
 
 
 
 
 
1fdaee2
 
 
 
 
 
3f862cb
 
 
 
 
 
b28006b
3f862cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6283128
 
 
 
a399ecf
6283128
 
 
 
 
701d127
16defa4
b28006b
6283128
4e07a43
b28006b
 
 
 
 
 
 
 
 
16defa4
b28006b
 
 
 
 
16defa4
b28006b
 
701d127
b28006b
 
 
 
 
 
 
16defa4
b28006b
 
 
 
 
16defa4
b28006b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16defa4
b28006b
 
701d127
b28006b
 
 
 
 
 
a399ecf
b28006b
7e251aa
b28006b
 
 
 
 
 
 
 
ebdfd29
b28006b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0140872
 
 
b28006b
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
from flask import Blueprint, render_template, request, session, jsonify, redirect, url_for
import os
import base64
import logging
from salesforce import get_salesforce_connection

# Configure logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

menu_blueprint = Blueprint('menu', __name__)

# Initialize Salesforce connection
sf = get_salesforce_connection()

# Constants for video handling
STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static')
PLACEHOLDER_VIDEO = 'placeholder.mp4'
PLACEHOLDER_PATH = os.path.join(STATIC_DIR, PLACEHOLDER_VIDEO)
SECTION_ORDER = ["Best Sellers", "Starters", "Biryanis", "Curries", "Breads", "Customized dish", "Apetizer", "Desserts", "Soft Drinks"]

# Create placeholder video at startup if it doesn't exist
if not os.path.exists(PLACEHOLDER_PATH):
    with open(PLACEHOLDER_PATH, 'wb') as f:
        f.close()
    logger.info(f"Created placeholder video at {PLACEHOLDER_PATH}")

def get_valid_video_path(item_name, video_url=None):
    """Get valid video path for item with placeholder fallback."""
    if video_url:
        if video_url.startswith(('http://', 'https://')):
            return video_url
        elif video_url.startswith('/'):
            return video_url
        elif video_url.startswith('069'):
            return f"https://biryanihub-dev-ed.develop.my.salesforce.com/sfc/servlet.shepherd/version/download/{video_url}"
    if not os.path.exists(PLACEHOLDER_PATH):
        with open(PLACEHOLDER_PATH, 'wb') as f:
            f.close()
        logger.info(f"Created missing placeholder video at {PLACEHOLDER_PATH}")
    return f"/static/{PLACEHOLDER_VIDEO}"

@menu_blueprint.route("/menu", methods=["GET", "POST"])
def menu():
    selected_category = request.args.get("category", "All")
    user_email = session.get('user_email')

    # Handle user authentication
    if not user_email:
        user_email = request.args.get("email")
        user_name = request.args.get("name")
        if user_email and user_name:
            session['user_email'] = user_email
            session['user_name'] = user_name
        else:
            return redirect(url_for("login"))
    else:
        user_name = session.get('user_name')

    first_letter = user_name[0].upper() if user_name else "A"
    user_image = session.get('user_image')

    try:
        describe_result = sf.Customer_Login__c.describe()
        fields = [field['name'] for field in describe_result['fields']]
        avatar_field_exists = 'Avatar__c' in fields
    except Exception as e:
        logger.error(f"Error describing Customer_Login__c object: {str(e)}")
        avatar_field_exists = False

    query_fields = ["Id", "Referral__c", "Reward_Points__c"]
    if avatar_field_exists:
        query_fields.append("Avatar__c")
    user_query = f"SELECT {', '.join(query_fields)} FROM Customer_Login__c WHERE Email__c = '{user_email}'"

    try:
        user_result = sf.query(user_query)
        if not user_result.get('records'):
            logger.warning(f"No user found with email: {user_email}")
            return redirect(url_for('login'))
    except Exception as e:
        logger.error(f"Error querying user data: {str(e)}")
        return jsonify({"success": False, "error": "Failed to fetch user data from Salesforce"}), 500

    user_record = user_result['records'][0]
    user_id = user_record['Id']
    referral_code = user_record.get('Referral__c', 'N/A')
    reward_points = user_record.get('Reward_Points__c', 0)

    if not user_image and avatar_field_exists and user_record.get('Avatar__c'):
        session['user_image'] = user_record['Avatar__c']
        user_image = session['user_image']

    cart_query = f"SELECT COUNT() FROM Cart_Item__c WHERE Customer_Email__c = '{user_email}'"
    try:
        cart_count_result = sf.query(cart_query)
        cart_item_count = cart_count_result.get('totalSize', 0)
    except Exception as e:
        logger.error(f"Error fetching cart item count: {str(e)}")
        cart_item_count = 0

    menu_query = """
        SELECT Name, Price__c, Description__c, Image1__c, Image2__c, 
               Veg_NonVeg__c, Section__c, Total_Ordered__c, Video1__c,
               IngredientsInfo__c, NutritionalInfo__c, Allergens__c
        FROM Menu_Item__c
    """
    try:
        menu_result = sf.query_all(menu_query)
        food_items = menu_result.get('records', [])
    except Exception as e:
        logger.error(f"Error fetching menu items: {str(e)}")
        food_items = []

    for item in food_items:
        item['Total_Ordered__c'] = item.get('Total_Ordered__c', 0) or 0
        item['Video1__c'] = get_valid_video_path(item['Name'], item.get('Video1__c'))
        item['Section__c'] = item.get('Section__c', "Others")
        item['Description__c'] = item.get('Description__c', "No description available")
        item['IngredientsInfo__c'] = item.get('IngredientsInfo__c', "Not specified")
        item['NutritionalInfo__c'] = item.get('NutritionalInfo__c', "Not available")
        item['Allergens__c'] = item.get('Allergens__c', "None listed")
        item['is_menu_item'] = True

    custom_dish_query = """
        SELECT Name, Price__c, Description__c, Image1__c, Image2__c, 
               Veg_NonVeg__c, Section__c, Total_Ordered__c
        FROM Custom_Dish__c
        WHERE CreatedDate >= LAST_N_DAYS:7
    """
    try:
        custom_dish_result = sf.query_all(custom_dish_query)
        custom_dishes = custom_dish_result.get('records', [])
    except Exception as e:
        logger.error(f"Error fetching custom dishes: {str(e)}")
        custom_dishes = []

    for item in custom_dishes:
        item['Total_Ordered__c'] = item.get('Total_Ordered__c', 0) or 0
        item['Video1__c'] = get_valid_video_path(item['Name'])
        item['Section__c'] = item.get('Section__c', "Customized dish")
        item['Description__c'] = item.get('Description__c', "No description available")
        item['is_menu_item'] = False

    all_items = food_items + custom_dishes
    ordered_menu = {section: [] for section in SECTION_ORDER}

    best_sellers = sorted(all_items, key=lambda x: x['Total_Ordered__c'], reverse=True)
    if selected_category == "Veg":
        best_sellers = [item for item in best_sellers if item.get("Veg_NonVeg__c") in ["Veg", "both"]]
    elif selected_category == "Non veg":
        best_sellers = [item for item in best_sellers if item.get("Veg_NonVeg__c") in ["Non veg", "both"]]
    ordered_menu["Best Sellers"] = best_sellers[:4]

    added_item_names = set()
    for item in all_items:
        section = item['Section__c']
        if section not in ordered_menu:
            ordered_menu[section] = []

        if item['Name'] in added_item_names:
            continue

        veg_nonveg = item.get("Veg_NonVeg__c", "both")
        if selected_category == "Veg" and veg_nonveg not in ["Veg", "both"]:
            continue
        if selected_category == "Non veg" and veg_nonveg not in ["Non veg", "both"]:
            continue

        ordered_menu[section].append(item)
        added_item_names.add(item['Name'])

    ordered_menu = {section: items for section, items in ordered_menu.items() if items}
    categories = ["All", "Veg", "Non veg"]

    return render_template(
        "menu.html",
        ordered_menu=ordered_menu,
        categories=categories,
        selected_category=selected_category,
        referral_code=referral_code,
        reward_points=reward_points,
        user_name=user_name,
        first_letter=first_letter,
        cart_item_count=cart_item_count,
        user_image=user_image,
        user_id=user_id
    )

@menu_blueprint.route('/search', methods=['GET'])
def search():
    user_email = session.get('user_email')
    if not user_email:
        return redirect(url_for("login"))

    user_name = session.get('user_name')
    first_letter = user_name[0].upper() if user_name else "A"
    user_image = session.get('user_image')

    # Get cart item count
    cart_query = f"SELECT COUNT() FROM Cart_Item__c WHERE Customer_Email__c = '{user_email}'"
    try:
        cart_count_result = sf.query(cart_query)
        cart_item_count = cart_count_result.get('totalSize', 0)
    except Exception as e:
        logger.error(f"Error fetching cart item count: {str(e)}")
        cart_item_count = 0

    # Fetch all menu items for search functionality
    menu_query = """
        SELECT Name, Price__c, Description__c, Image1__c, Image2__c, 
               Veg_NonVeg__c, Section__c, Total_Ordered__c, Video1__c,
               IngredientsInfo__c, NutritionalInfo__c, Allergens__c
        FROM Menu_Item__c
    """
    try:
        menu_result = sf.query_all(menu_query)
        food_items = menu_result.get('records', [])
    except Exception as e:
        logger.error(f"Error fetching menu items: {str(e)}")
        food_items = []

    for item in food_items:
        item['Total_Ordered__c'] = item.get('Total_Ordered__c', 0) or 0
        item['Video1__c'] = get_valid_video_path(item['Name'], item.get('Video1__c'))
        item['Section__c'] = item.get('Section__c', "Others")
        item['Description__c'] = item.get('Description__c', "No description available")
        item['IngredientsInfo__c'] = item.get('IngredientsInfo__c', "Not specified")
        item['NutritionalInfo__c'] = item.get('NutritionalInfo__c', "Not available")
        item['Allergens__c'] = item.get('Allergens__c', "None listed")
        item['is_menu_item'] = True

    custom_dish_query = """
        SELECT Name, Price__c, Description__c, Image1__c, Image2__c, 
               Veg_NonVeg__c, Section__c, Total_Ordered__c
        FROM Custom_Dish__c
        WHERE CreatedDate >= LAST_N_DAYS:7
    """
    try:
        custom_dish_result = sf.query_all(custom_dish_query)
        custom_dishes = custom_dish_result.get('records', [])
    except Exception as e:
        logger.error(f"Error fetching custom dishes: {str(e)}")
        custom_dishes = []

    for item in custom_dishes:
        item['Total_Ordered__c'] = item.get('Total_Ordered__c', 0) or 0
        item['Video1__c'] = get_valid_video_path(item['Name'])
        item['Section__c'] = item.get('Section__c', "Customized dish")
        item['Description__c'] = item.get('Description__c', "No description available")
        item['is_menu_item'] = False

    all_items = food_items + custom_dishes

    return render_template(
        "search.html",
        all_items=all_items,
        user_name=user_name,
        first_letter=first_letter,
        cart_item_count=cart_item_count,
        user_image=user_image
    )

# Existing routes remain unchanged...

@menu_blueprint.route('/upload_avatar', methods=['POST'])
def upload_avatar():
    # ... (unchanged)
    pass

@menu_blueprint.route('/delete_avatar', methods=['POST'])
def delete_avatar():
    # ... (unchanged)
    pass

@menu_blueprint.route('/api/addons', methods=['GET'])
def get_addons():
    # ... (unchanged)
    pass

@menu_blueprint.route('/cart/add', methods=['POST'])
def add_to_cart():
    # ... (unchanged)
    pass