import bcrypt import gradio as gr from simple_salesforce import Salesforce from flask import Flask, request, jsonify import logging # Set up logging for debugging logging.basicConfig(level=logging.DEBUG) # Salesforce Connection sf = Salesforce(username='diggavalli98@gmail.com', password='Sati@1020', security_token='sSSjyhInIsUohKpG8sHzty2q') # Flask app to handle order submission app = Flask(__name__) # --- Utility Functions --- # Function to Hash Password def hash_password(password): logging.debug(f"Hashing password: {password}") return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8') # Function to Verify Password def verify_password(plain_password, hashed_password): logging.debug(f"Verifying password: {plain_password} against {hashed_password}") return bcrypt.checkpw(plain_password.encode('utf-8'), hashed_password.encode('utf-8')) # --- Salesforce Integration --- # Signup function def signup(name, email, phone, password): try: email = email.strip() logging.debug(f"Signup attempt for email: {email}") query = f"SELECT Id FROM Customer_Login__c WHERE Email__c = '{email}'" result = sf.query(query) logging.debug(f"Salesforce query result for signup: {result}") if len(result['records']) > 0: logging.warning(f"Email already exists: {email}") return "Email already exists! Please use a different email." hashed_password = hash_password(password) sf.Customer_Login__c.create({ 'Name': name.strip(), 'Email__c': email, 'Phone_Number__c': phone.strip(), 'Password__c': hashed_password }) logging.info(f"Signup successful for email: {email}") return "Signup successful! You can now login." except Exception as e: logging.error(f"Error during signup: {str(e)}") return f"Error during signup: {str(e)}" # Login function def login(email, password): try: email = email.strip() logging.debug(f"Login attempt for email: {email}") query = f"SELECT Name, Password__c FROM Customer_Login__c WHERE Email__c = '{email}'" result = sf.query(query) logging.debug(f"Salesforce query result for login: {result}") if len(result['records']) == 0: logging.warning(f"Invalid login attempt for email: {email}") return "Invalid email or password.", None user = result['records'][0] stored_password = user['Password__c'] if verify_password(password.strip(), stored_password): logging.info(f"Login successful for email: {email}") return "Login successful!", user['Name'] else: logging.warning(f"Invalid password for email: {email}") return "Invalid email or password.", None except Exception as e: logging.error(f"Error during login: {str(e)}") return f"Error during login: {str(e)}", None # --- Menu and Add-ons Functions --- # Function to load menu data from Salesforce def load_menu_from_salesforce(): try: query = "SELECT Name, Price__c, Description__c, Image1__c, Image2__c, Veg_NonVeg__c, Section__c FROM Menu_Item__c" logging.debug(f"Loading menu from Salesforce with query: {query}") result = sf.query(query) logging.debug(f"Salesforce menu result: {result}") return result['records'] except Exception as e: logging.error(f"Error loading menu from Salesforce: {str(e)}") return [] # Function to load add-ons data from Salesforce def load_add_ons_from_salesforce(): try: query = "SELECT Name, Price__c FROM Add_Ons__c" logging.debug(f"Loading add-ons from Salesforce with query: {query}") result = sf.query(query) logging.debug(f"Salesforce add-ons result: {result}") return result['records'] except Exception as e: logging.error(f"Error loading add-ons from Salesforce: {str(e)}") return [] # Function to filter menu items based on preference def filter_menu(preference): menu_data = load_menu_from_salesforce() filtered_data = {} logging.debug(f"Filtering menu with preference: {preference}") for item in menu_data: if "Section__c" not in item or "Veg_NonVeg__c" not in item: continue if item["Section__c"] not in filtered_data: filtered_data[item["Section__c"]] = [] if preference == "All" or (preference == "Veg" and item["Veg_NonVeg__c"] in ["Veg", "Both"]) or (preference == "Non-Veg" and item["Veg_NonVeg__c"] in ["Non veg", "Both"]): filtered_data[item["Section__c"].strip()].append(item) html_content = '
' for section, items in filtered_data.items(): html_content += f"

{section}

" html_content += '
' for item in items: html_content += f"""

{item['Name']}

${item['Price__c']}

{item['Description__c']}

""" html_content += '
' html_content += '
' if not any(filtered_data.values()): logging.debug("No items match the filter.") return "

No items match your filter.

" logging.debug("Filter applied successfully.") return html_content # --- Modal and Cart Logic --- # Create Modal Window HTML def create_modal_window(): add_ons = load_add_ons_from_salesforce() add_ons_html = "" for add_on in add_ons: add_ons_html += f"""
""" modal_html = f""" """ return modal_html # --- Order Submission Logic --- # Function to create an order in Salesforce def create_order_in_salesforce(customer_id, cart_items, total_cost): try: logging.debug(f"Creating order in Salesforce for customer ID: {customer_id}") cart_summary = '' add_ons_summary = '' instructions_summary = '' for item in cart_items: cart_summary += f"Item: {item['name']}, Quantity: {item['quantity']}, Price: {item['total_cost']}\n" add_ons_summary += ', '.join([addon['name'] for addon in item['add_ons']]) # List of add-ons instructions_summary += item.get('instructions', '') # Special instructions for the item # Create the order record in Salesforce order = sf.Order__c.create({ 'Customer_Name__c': customer_id, 'Customer_Email__c': 'customer_email', # Replace with actual email of the customer 'Order_Items__c': cart_summary, # Cart items summary 'Add_Ons__c': add_ons_summary, # Add-ons summary 'Instructions__c': instructions_summary, # Special instructions for the order 'Total_Price__c': total_cost, 'Order_Status__c': 'Pending', # Default order status 'Order_Date_Time__c': '2025-01-20T10:00:00Z' # Current timestamp or system timestamp }) logging.info(f"Order placed successfully with order ID: {order['id']}") return f"Order placed successfully! Order ID: {order['id']}" except Exception as e: logging.error(f"Error during order creation: {str(e)}") return f"Error during order creation: {str(e)}" # Route to handle order submission @app.route('/create-order', methods=['POST']) def create_order(): try: data = request.get_json() # Get the JSON data from the request cart_summary = data['cartSummary'] # Extract the cart summary total_cost = data['totalCost'] # Extract the total cost customer_id = data['customerId'] # Extract the customer ID # Debug log to check if data is correct logging.debug(f"Order Details: {cart_summary}, {total_cost}, {customer_id}") # Call the function to create the order in Salesforce result = create_order_in_salesforce(customer_id, cart_summary, total_cost) return jsonify({'message': result}) # Return a response with the order result except Exception as e: logging.error(f"Error in create_order route: {str(e)}") return jsonify({'message': f"Error during order creation: {str(e)}"}), 500 # --- Gradio Interface --- # JavaScript for Modal and Cart def modal_js(): modal_script = """ """ return modal_script # --- Gradio Interface --- with gr.Blocks() as app: with gr.Row(): gr.HTML("

Welcome to Biryani Hub

") with gr.Row(visible=True) as login_page: with gr.Column(): login_email = gr.Textbox(label="Email") login_password = gr.Textbox(label="Password", type="password") login_button = gr.Button("Login") signup_button = gr.Button("Go to Signup") login_output = gr.Textbox(label="Status") with gr.Row(visible=False) as signup_page: with gr.Column(): signup_name = gr.Textbox(label="Name") signup_email = gr.Textbox(label="Email") signup_phone = gr.Textbox(label="Phone") signup_password = gr.Textbox(label="Password", type="password") submit_signup = gr.Button("Signup") login_redirect = gr.Button("Go to Login") signup_output = gr.Textbox(label="Status") with gr.Row(visible=False) as menu_page: with gr.Column(): preference = gr.Radio(choices=["All", "Veg", "Non-Veg"], label="Filter Preference", value="All") menu_output = gr.HTML() gr.HTML("
View Cart
") gr.HTML(create_modal_window()) gr.HTML(modal_js()) login_button.click( lambda email, password: (gr.update(visible=False), gr.update(visible=True), gr.update(value=filter_menu("All")), "Login successful!") if login(email, password)[0] == "Login successful!" else (gr.update(), gr.update(), gr.update(), "Invalid email or password."), [login_email, login_password], [login_page, menu_page, menu_output, login_output] ) submit_signup.click( lambda name, email, phone, password: signup(name, email, phone, password), inputs=[signup_name, signup_email, signup_phone, signup_password], outputs=signup_output ) signup_button.click( lambda: (gr.update(visible=False), gr.update(visible=True)), inputs=[], outputs=[login_page, signup_page] ) login_redirect.click( lambda: (gr.update(visible=True), gr.update(visible=False)), inputs=[], outputs=[login_page, signup_page] ) preference.change(lambda pref: filter_menu(pref), [preference], menu_output) app.launch()