Update app.py
Browse files
app.py
CHANGED
|
@@ -36,7 +36,6 @@ user_name = None # Will be set once the user provides their name
|
|
| 36 |
def get_menu_items(category):
|
| 37 |
category_filter = ''
|
| 38 |
|
| 39 |
-
# Determine the category filter (Veg, Non-Veg, or All)
|
| 40 |
if category == 'Veg':
|
| 41 |
category_filter = 'Veg'
|
| 42 |
elif category == 'Non-Veg':
|
|
@@ -44,33 +43,28 @@ def get_menu_items(category):
|
|
| 44 |
elif category == 'All':
|
| 45 |
category_filter = '' # No filter for 'All'
|
| 46 |
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
"""
|
| 56 |
-
|
| 57 |
-
# Execute the query
|
| 58 |
result = sf.query_all(query)
|
| 59 |
return result['records']
|
| 60 |
|
| 61 |
-
# Function to save
|
| 62 |
def save_order_to_salesforce(cart, user_email, total_amount):
|
| 63 |
-
# Prepare the order object
|
| 64 |
order_items = ", ".join([f"{item['Name']} x {item['Quantity']}" for item in cart])
|
| 65 |
order = {
|
| 66 |
'Customer_Email__c': user_email,
|
| 67 |
'Order_Date_Time__c': datetime.now(),
|
| 68 |
'Order_Items__c': order_items,
|
| 69 |
'Total_Amount__c': total_amount,
|
| 70 |
-
'Status__c': 'Pending'
|
| 71 |
}
|
| 72 |
|
| 73 |
-
# Insert order record into Salesforce
|
| 74 |
order_record = sf.Order__c.create(order)
|
| 75 |
return order_record
|
| 76 |
|
|
@@ -122,7 +116,7 @@ html_code = """
|
|
| 122 |
greetUser();
|
| 123 |
}
|
| 124 |
});
|
| 125 |
-
|
| 126 |
function greetUser() {
|
| 127 |
const utterance = new SpeechSynthesisUtterance("Hi, welcome to Biryani Hub! Can I know your name so I can greet you personally?");
|
| 128 |
speechSynthesis.speak(utterance);
|
|
@@ -131,7 +125,7 @@ html_code = """
|
|
| 131 |
startListening();
|
| 132 |
};
|
| 133 |
}
|
| 134 |
-
|
| 135 |
async function startListening() {
|
| 136 |
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
| 137 |
const mediaRecorder = new MediaRecorder(stream, { mimeType: "audio/webm;codecs=opus" });
|
|
@@ -151,7 +145,7 @@ html_code = """
|
|
| 151 |
speechSynthesis.speak(utterance);
|
| 152 |
utterance.onend = () => {
|
| 153 |
if (!data.response.includes("Goodbye") && !data.response.includes("final order")) {
|
| 154 |
-
startListening();
|
| 155 |
} else {
|
| 156 |
status.textContent = "Conversation ended.";
|
| 157 |
isListening = false;
|
|
@@ -196,11 +190,11 @@ def process_audio():
|
|
| 196 |
|
| 197 |
recognizer = sr.Recognizer()
|
| 198 |
with sr.AudioFile(converted_file.name) as source:
|
| 199 |
-
recognizer.adjust_for_ambient_noise(source, duration=1)
|
| 200 |
-
audio_data = recognizer.record(source, duration=10)
|
| 201 |
try:
|
| 202 |
command = recognizer.recognize_google(audio_data)
|
| 203 |
-
logging.info(f"Recognized command: {command}")
|
| 204 |
response = process_command(command)
|
| 205 |
except sr.UnknownValueError:
|
| 206 |
response = "Sorry, I couldn't understand your command. Could you please repeat?"
|
|
@@ -224,12 +218,10 @@ def process_command(command):
|
|
| 224 |
logging.info(f"Processing command: {command}")
|
| 225 |
|
| 226 |
try:
|
| 227 |
-
# Step 1: Handle user name input (personalize the greeting)
|
| 228 |
if user_name is None and "my name is" in command:
|
| 229 |
user_name = command.replace("my name is", "").strip()
|
| 230 |
return jsonify({"response": f"Hello {user_name}! Nice to meet you. Please choose your preference: Veg, Non-Veg, or All."})
|
| 231 |
|
| 232 |
-
# Step 2: Handle preference (Veg/Non-Veg/All)
|
| 233 |
if awaiting_preference:
|
| 234 |
if "veg" in command:
|
| 235 |
current_category = 'Veg'
|
|
@@ -241,12 +233,11 @@ def process_command(command):
|
|
| 241 |
return jsonify({"response": "I didn't catch your preference. Please choose Veg, Non-Veg, or All."})
|
| 242 |
|
| 243 |
awaiting_preference = False
|
| 244 |
-
awaiting_item_selection = True
|
| 245 |
return jsonify({"response": f"Great! You've selected {current_category}. What would you like to order?"})
|
| 246 |
|
| 247 |
-
# Step 3: Handle item selection
|
| 248 |
if awaiting_item_selection:
|
| 249 |
-
menu_items = get_menu_items(current_category)
|
| 250 |
selected_item = next((item for item in menu_items if item['Name'].lower() in command), None)
|
| 251 |
|
| 252 |
if selected_item:
|
|
@@ -257,7 +248,6 @@ def process_command(command):
|
|
| 257 |
|
| 258 |
return jsonify({"response": "I didn't catch that. Please say the name of the item you want to order."})
|
| 259 |
|
| 260 |
-
# Step 4: Handle quantity selection
|
| 261 |
if awaiting_quantity:
|
| 262 |
try:
|
| 263 |
quantity = int(command)
|
|
@@ -270,7 +260,6 @@ def process_command(command):
|
|
| 270 |
except ValueError:
|
| 271 |
return jsonify({"response": "Please provide a valid number for quantity."})
|
| 272 |
|
| 273 |
-
# Step 5: Handle email input
|
| 274 |
if "my email is" in command:
|
| 275 |
email_part = command.replace("my email is", "").strip()
|
| 276 |
email_command = email_part.replace(' at ', '@').replace(' dot ', '.').replace(' ', '')
|
|
@@ -285,7 +274,6 @@ def process_command(command):
|
|
| 285 |
else:
|
| 286 |
return jsonify({"response": "Sorry, that doesn't look like a valid email. Can you please provide it again?"})
|
| 287 |
|
| 288 |
-
# Step 6: Handle order finalization commands
|
| 289 |
if "final order" in command or "confirm my order" in command or "place the order" in command or "confirm order" in command:
|
| 290 |
return place_order()
|
| 291 |
|
|
@@ -293,21 +281,16 @@ def process_command(command):
|
|
| 293 |
|
| 294 |
except Exception as e:
|
| 295 |
logging.error(f"An error occurred while processing the command: {str(e)}")
|
| 296 |
-
logging.error(f"Stack Trace: {traceback.format_exc()}")
|
| 297 |
return jsonify({"response": "Sorry, there was an error processing your request."}), 500
|
| 298 |
|
| 299 |
-
# Function to place the order
|
| 300 |
def place_order():
|
| 301 |
global cart, user_email, user_name
|
| 302 |
|
| 303 |
try:
|
| 304 |
-
# Calculate the total amount for the order
|
| 305 |
total_amount = sum([item['Price__c'] * item['Quantity'] for item in cart])
|
| 306 |
-
|
| 307 |
-
# Step 1: Save the main order record to Salesforce
|
| 308 |
order_record = save_order_to_salesforce(cart, user_email, total_amount)
|
| 309 |
-
|
| 310 |
-
# Step 2: Query Salesforce for the order just placed using the user's email and name
|
| 311 |
order_query = f"""
|
| 312 |
SELECT Id, Name, Customer_Email__c
|
| 313 |
FROM Order__c
|
|
@@ -315,27 +298,22 @@ def place_order():
|
|
| 315 |
ORDER BY CreatedDate DESC LIMIT 1
|
| 316 |
"""
|
| 317 |
order_result = sf.query_all(order_query)
|
| 318 |
-
|
| 319 |
-
# Ensure the order was created successfully
|
| 320 |
if not order_result['records']:
|
| 321 |
return jsonify({"response": "Failed to retrieve the placed order. Please try again."})
|
| 322 |
-
|
| 323 |
order_id = order_result['records'][0]['Id']
|
| 324 |
-
|
| 325 |
-
# Step 3: Add the food items as related records to the Order__c
|
| 326 |
for item in cart:
|
| 327 |
order_item = {
|
| 328 |
-
'Order__c': order_id,
|
| 329 |
-
'Item_Name__c': item['Name'],
|
| 330 |
-
'Quantity__c': item['Quantity'],
|
| 331 |
-
'Price__c': item['Price__c'],
|
| 332 |
}
|
| 333 |
-
sf.Order_Item__c.create(order_item)
|
| 334 |
|
| 335 |
-
# Step 4: Clear the cart after placing the order
|
| 336 |
cart = [] # Clear the cart
|
| 337 |
-
|
| 338 |
-
# Return the success message
|
| 339 |
return jsonify({"response": f"Order placed successfully! Total amount: ₹{total_amount}"})
|
| 340 |
|
| 341 |
except Exception as e:
|
|
@@ -343,4 +321,4 @@ def place_order():
|
|
| 343 |
|
| 344 |
|
| 345 |
if __name__ == "__main__":
|
| 346 |
-
app.run(host="0.0.0.0", port=7860)
|
|
|
|
| 36 |
def get_menu_items(category):
|
| 37 |
category_filter = ''
|
| 38 |
|
|
|
|
| 39 |
if category == 'Veg':
|
| 40 |
category_filter = 'Veg'
|
| 41 |
elif category == 'Non-Veg':
|
|
|
|
| 43 |
elif category == 'All':
|
| 44 |
category_filter = '' # No filter for 'All'
|
| 45 |
|
| 46 |
+
query = f"""
|
| 47 |
+
SELECT Id, Name, Price__c, Image1__c, Veg_NonVeg__c, Section__c
|
| 48 |
+
FROM Menu_Item__c
|
| 49 |
+
WHERE Veg_NonVeg__c = '{category_filter}' OR Veg_NonVeg__c = 'both'
|
| 50 |
+
""" if category_filter else """
|
| 51 |
+
SELECT Id, Name, Price__c, Image1__c, Veg_NonVeg__c, Section__c
|
| 52 |
+
FROM Menu_Item__c
|
| 53 |
+
"""
|
|
|
|
|
|
|
|
|
|
| 54 |
result = sf.query_all(query)
|
| 55 |
return result['records']
|
| 56 |
|
| 57 |
+
# Function to save order to Salesforce
|
| 58 |
def save_order_to_salesforce(cart, user_email, total_amount):
|
|
|
|
| 59 |
order_items = ", ".join([f"{item['Name']} x {item['Quantity']}" for item in cart])
|
| 60 |
order = {
|
| 61 |
'Customer_Email__c': user_email,
|
| 62 |
'Order_Date_Time__c': datetime.now(),
|
| 63 |
'Order_Items__c': order_items,
|
| 64 |
'Total_Amount__c': total_amount,
|
| 65 |
+
'Status__c': 'Pending'
|
| 66 |
}
|
| 67 |
|
|
|
|
| 68 |
order_record = sf.Order__c.create(order)
|
| 69 |
return order_record
|
| 70 |
|
|
|
|
| 116 |
greetUser();
|
| 117 |
}
|
| 118 |
});
|
| 119 |
+
|
| 120 |
function greetUser() {
|
| 121 |
const utterance = new SpeechSynthesisUtterance("Hi, welcome to Biryani Hub! Can I know your name so I can greet you personally?");
|
| 122 |
speechSynthesis.speak(utterance);
|
|
|
|
| 125 |
startListening();
|
| 126 |
};
|
| 127 |
}
|
| 128 |
+
|
| 129 |
async function startListening() {
|
| 130 |
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
| 131 |
const mediaRecorder = new MediaRecorder(stream, { mimeType: "audio/webm;codecs=opus" });
|
|
|
|
| 145 |
speechSynthesis.speak(utterance);
|
| 146 |
utterance.onend = () => {
|
| 147 |
if (!data.response.includes("Goodbye") && !data.response.includes("final order")) {
|
| 148 |
+
startListening();
|
| 149 |
} else {
|
| 150 |
status.textContent = "Conversation ended.";
|
| 151 |
isListening = false;
|
|
|
|
| 190 |
|
| 191 |
recognizer = sr.Recognizer()
|
| 192 |
with sr.AudioFile(converted_file.name) as source:
|
| 193 |
+
recognizer.adjust_for_ambient_noise(source, duration=1)
|
| 194 |
+
audio_data = recognizer.record(source, duration=10)
|
| 195 |
try:
|
| 196 |
command = recognizer.recognize_google(audio_data)
|
| 197 |
+
logging.info(f"Recognized command: {command}")
|
| 198 |
response = process_command(command)
|
| 199 |
except sr.UnknownValueError:
|
| 200 |
response = "Sorry, I couldn't understand your command. Could you please repeat?"
|
|
|
|
| 218 |
logging.info(f"Processing command: {command}")
|
| 219 |
|
| 220 |
try:
|
|
|
|
| 221 |
if user_name is None and "my name is" in command:
|
| 222 |
user_name = command.replace("my name is", "").strip()
|
| 223 |
return jsonify({"response": f"Hello {user_name}! Nice to meet you. Please choose your preference: Veg, Non-Veg, or All."})
|
| 224 |
|
|
|
|
| 225 |
if awaiting_preference:
|
| 226 |
if "veg" in command:
|
| 227 |
current_category = 'Veg'
|
|
|
|
| 233 |
return jsonify({"response": "I didn't catch your preference. Please choose Veg, Non-Veg, or All."})
|
| 234 |
|
| 235 |
awaiting_preference = False
|
| 236 |
+
awaiting_item_selection = True
|
| 237 |
return jsonify({"response": f"Great! You've selected {current_category}. What would you like to order?"})
|
| 238 |
|
|
|
|
| 239 |
if awaiting_item_selection:
|
| 240 |
+
menu_items = get_menu_items(current_category)
|
| 241 |
selected_item = next((item for item in menu_items if item['Name'].lower() in command), None)
|
| 242 |
|
| 243 |
if selected_item:
|
|
|
|
| 248 |
|
| 249 |
return jsonify({"response": "I didn't catch that. Please say the name of the item you want to order."})
|
| 250 |
|
|
|
|
| 251 |
if awaiting_quantity:
|
| 252 |
try:
|
| 253 |
quantity = int(command)
|
|
|
|
| 260 |
except ValueError:
|
| 261 |
return jsonify({"response": "Please provide a valid number for quantity."})
|
| 262 |
|
|
|
|
| 263 |
if "my email is" in command:
|
| 264 |
email_part = command.replace("my email is", "").strip()
|
| 265 |
email_command = email_part.replace(' at ', '@').replace(' dot ', '.').replace(' ', '')
|
|
|
|
| 274 |
else:
|
| 275 |
return jsonify({"response": "Sorry, that doesn't look like a valid email. Can you please provide it again?"})
|
| 276 |
|
|
|
|
| 277 |
if "final order" in command or "confirm my order" in command or "place the order" in command or "confirm order" in command:
|
| 278 |
return place_order()
|
| 279 |
|
|
|
|
| 281 |
|
| 282 |
except Exception as e:
|
| 283 |
logging.error(f"An error occurred while processing the command: {str(e)}")
|
| 284 |
+
logging.error(f"Stack Trace: {traceback.format_exc()}")
|
| 285 |
return jsonify({"response": "Sorry, there was an error processing your request."}), 500
|
| 286 |
|
|
|
|
| 287 |
def place_order():
|
| 288 |
global cart, user_email, user_name
|
| 289 |
|
| 290 |
try:
|
|
|
|
| 291 |
total_amount = sum([item['Price__c'] * item['Quantity'] for item in cart])
|
|
|
|
|
|
|
| 292 |
order_record = save_order_to_salesforce(cart, user_email, total_amount)
|
| 293 |
+
|
|
|
|
| 294 |
order_query = f"""
|
| 295 |
SELECT Id, Name, Customer_Email__c
|
| 296 |
FROM Order__c
|
|
|
|
| 298 |
ORDER BY CreatedDate DESC LIMIT 1
|
| 299 |
"""
|
| 300 |
order_result = sf.query_all(order_query)
|
| 301 |
+
|
|
|
|
| 302 |
if not order_result['records']:
|
| 303 |
return jsonify({"response": "Failed to retrieve the placed order. Please try again."})
|
| 304 |
+
|
| 305 |
order_id = order_result['records'][0]['Id']
|
| 306 |
+
|
|
|
|
| 307 |
for item in cart:
|
| 308 |
order_item = {
|
| 309 |
+
'Order__c': order_id,
|
| 310 |
+
'Item_Name__c': item['Name'],
|
| 311 |
+
'Quantity__c': item['Quantity'],
|
| 312 |
+
'Price__c': item['Price__c'],
|
| 313 |
}
|
| 314 |
+
sf.Order_Item__c.create(order_item)
|
| 315 |
|
|
|
|
| 316 |
cart = [] # Clear the cart
|
|
|
|
|
|
|
| 317 |
return jsonify({"response": f"Order placed successfully! Total amount: ₹{total_amount}"})
|
| 318 |
|
| 319 |
except Exception as e:
|
|
|
|
| 321 |
|
| 322 |
|
| 323 |
if __name__ == "__main__":
|
| 324 |
+
app.run(host="0.0.0.0", port=7860)
|