Spaces:
Sleeping
Sleeping
Update combined_summary.py
Browse files- combined_summary.py +127 -42
combined_summary.py
CHANGED
@@ -1,9 +1,7 @@
|
|
1 |
from flask import Blueprint, render_template, session, redirect, url_for
|
2 |
from salesforce import get_salesforce_connection
|
3 |
-
from flask import Blueprint, render_template, request, session, jsonify, redirect, url_for
|
4 |
-
import os
|
5 |
-
import re
|
6 |
from datetime import datetime
|
|
|
7 |
|
8 |
combined_summary_blueprint = Blueprint('combined_summary', __name__)
|
9 |
|
@@ -16,6 +14,15 @@ def escape_soql(value):
|
|
16 |
return value.replace("'", "\\'")
|
17 |
return value
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
@combined_summary_blueprint.route('/combined_summary')
|
20 |
def combined_summary():
|
21 |
email = session.get('user_email')
|
@@ -27,14 +34,29 @@ def combined_summary():
|
|
27 |
# Sanitize email for SOQL query
|
28 |
safe_email = escape_soql(email)
|
29 |
|
30 |
-
# ====== FETCH
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
|
37 |
-
|
|
|
38 |
|
39 |
# Determine tier
|
40 |
tiers = {
|
@@ -61,7 +83,9 @@ def combined_summary():
|
|
61 |
# ====== FETCH ORDER SUMMARY ======
|
62 |
order_query = f"""
|
63 |
SELECT Id, Customer_Name__c, Customer_Email__c, Total_Amount__c, Order_Details__c,
|
64 |
-
Order_Status__c, Discount__c, Total_Bill__c
|
|
|
|
|
65 |
FROM Order__c
|
66 |
WHERE Customer_Email__c = '{safe_email}'
|
67 |
ORDER BY CreatedDate DESC
|
@@ -75,7 +99,18 @@ def combined_summary():
|
|
75 |
order = order_result["records"][0]
|
76 |
order_details = order.get("Order_Details__c", "")
|
77 |
order_items = []
|
78 |
-
sector_names = set()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
79 |
|
80 |
for line in order_details.split('\n'):
|
81 |
item_parts = line.split('|')
|
@@ -99,9 +134,22 @@ def combined_summary():
|
|
99 |
|
100 |
if menu_result.get("records"):
|
101 |
menu_item = menu_result["records"][0]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
|
103 |
-
|
104 |
-
if menu_item.get('Ingredient_1__r') is not None:
|
105 |
ingredients.append({
|
106 |
"name": menu_item['Ingredient_1__r'].get('Ingredient_Name__c', ''),
|
107 |
"image": menu_item['Ingredient_1__r'].get('Ingredient_Image__c', ''),
|
@@ -109,8 +157,7 @@ def combined_summary():
|
|
109 |
"fun_facts": menu_item['Ingredient_1__r'].get('Fun_Facts__c', '')
|
110 |
})
|
111 |
|
112 |
-
|
113 |
-
if menu_item.get('Ingredient_2__r') is not None:
|
114 |
ingredients.append({
|
115 |
"name": menu_item['Ingredient_2__r'].get('Ingredient_Name__c', ''),
|
116 |
"image": menu_item['Ingredient_2__r'].get('Ingredient_Image__c', ''),
|
@@ -118,20 +165,35 @@ def combined_summary():
|
|
118 |
"fun_facts": menu_item['Ingredient_2__r'].get('Fun_Facts__c', '')
|
119 |
})
|
120 |
|
121 |
-
# Process the Sector__c field from Menu_Item__c
|
122 |
if menu_item.get('Sector__c'):
|
123 |
-
sector_names.update(menu_item['Sector__c'].split(','))
|
124 |
|
125 |
-
# Only add the item if ingredients are present
|
126 |
order_items.append({
|
127 |
"name": item_name,
|
128 |
-
"price":
|
|
|
129 |
"image_url": menu_item.get("Image1__c", ''),
|
130 |
"ingredients": ingredients,
|
131 |
-
"category": "Food" if ingredients else "Soft Drink"
|
132 |
})
|
133 |
|
134 |
-
# Fetch
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
sector_details = {}
|
136 |
for sector_name in sector_names:
|
137 |
safe_sector_name = escape_soql(sector_name.strip())
|
@@ -148,26 +210,49 @@ def combined_summary():
|
|
148 |
"description": sector_record.get('Description__c', '')
|
149 |
}
|
150 |
|
151 |
-
#
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
171 |
|
172 |
except Exception as e:
|
173 |
print(f"Error in combined_summary: {str(e)}")
|
|
|
1 |
from flask import Blueprint, render_template, session, redirect, url_for
|
2 |
from salesforce import get_salesforce_connection
|
|
|
|
|
|
|
3 |
from datetime import datetime
|
4 |
+
from num2words import num2words
|
5 |
|
6 |
combined_summary_blueprint = Blueprint('combined_summary', __name__)
|
7 |
|
|
|
14 |
return value.replace("'", "\\'")
|
15 |
return value
|
16 |
|
17 |
+
def number_to_words(number):
|
18 |
+
"""Convert a number to words for invoice amount in words."""
|
19 |
+
integer_part = int(number)
|
20 |
+
decimal_part = int((number - integer_part) * 100)
|
21 |
+
words = num2words(integer_part, lang='en_IN').replace(',', '').title() + " Rupees"
|
22 |
+
if decimal_part > 0:
|
23 |
+
words += " And " + num2words(decimal_part, lang='en_IN').replace(',', '').title() + " Paisa Only"
|
24 |
+
return words
|
25 |
+
|
26 |
@combined_summary_blueprint.route('/combined_summary')
|
27 |
def combined_summary():
|
28 |
email = session.get('user_email')
|
|
|
34 |
# Sanitize email for SOQL query
|
35 |
safe_email = escape_soql(email)
|
36 |
|
37 |
+
# ====== FETCH CUSTOMER DETAILS ======
|
38 |
+
customer_query = f"""
|
39 |
+
SELECT Id, Name, Email__c, Phone_Number__c, Referral__c, Reward_Points__c
|
40 |
+
FROM Customer_Login__c
|
41 |
+
WHERE Email__c = '{safe_email}'
|
42 |
+
LIMIT 1
|
43 |
+
"""
|
44 |
+
customer_result = sf.query_all(customer_query)
|
45 |
+
if not customer_result.get("records"):
|
46 |
+
print(f"No customer found for email: {email}")
|
47 |
+
return "Customer not found", 404
|
48 |
+
|
49 |
+
customer = customer_result["records"][0]
|
50 |
+
customer_data = {
|
51 |
+
"name": customer.get("Name", "SATHVIK GANTA"),
|
52 |
+
"email": customer.get("Email__c", "[email protected]"),
|
53 |
+
"phone": customer.get("Phone_Number__c", "9876543210"),
|
54 |
+
"referral_code": customer.get("Referral__c", ""),
|
55 |
+
"reward_points": customer.get("Reward_Points__c", 0)
|
56 |
+
}
|
57 |
|
58 |
+
# ====== FETCH REWARDS ======
|
59 |
+
user_points = customer_data["reward_points"]
|
60 |
|
61 |
# Determine tier
|
62 |
tiers = {
|
|
|
83 |
# ====== FETCH ORDER SUMMARY ======
|
84 |
order_query = f"""
|
85 |
SELECT Id, Customer_Name__c, Customer_Email__c, Total_Amount__c, Order_Details__c,
|
86 |
+
Order_Status__c, Discount__c, Total_Bill__c, CreatedDate,
|
87 |
+
Delivery_Address__c, Place_of_Supply__c, CGST_Rate__c, SGST_Rate__c,
|
88 |
+
Payment_Mode__c, Reverse_Charge__c
|
89 |
FROM Order__c
|
90 |
WHERE Customer_Email__c = '{safe_email}'
|
91 |
ORDER BY CreatedDate DESC
|
|
|
99 |
order = order_result["records"][0]
|
100 |
order_details = order.get("Order_Details__c", "")
|
101 |
order_items = []
|
102 |
+
sector_names = set()
|
103 |
+
|
104 |
+
# Calculate totals
|
105 |
+
total_gross_value = 0
|
106 |
+
total_discount = order.get("Discount__c", 0)
|
107 |
+
total_net_value = 0
|
108 |
+
total_cgst = 0
|
109 |
+
total_sgst = 0
|
110 |
+
total_amount = 0
|
111 |
+
|
112 |
+
cgst_rate = order.get("CGST_Rate__c", 2.5) / 100 # e.g., 2.5% as 0.025
|
113 |
+
sgst_rate = order.get("SGST_Rate__c", 2.5) / 100
|
114 |
|
115 |
for line in order_details.split('\n'):
|
116 |
item_parts = line.split('|')
|
|
|
134 |
|
135 |
if menu_result.get("records"):
|
136 |
menu_item = menu_result["records"][0]
|
137 |
+
price = menu_item.get("Price__c", 0)
|
138 |
+
discount = 0 # Adjust if discount is per item
|
139 |
+
net_value = price - discount
|
140 |
+
cgst = net_value * cgst_rate
|
141 |
+
sgst = net_value * sgst_rate
|
142 |
+
item_total = net_value + cgst + sgst
|
143 |
+
|
144 |
+
# Update totals
|
145 |
+
total_gross_value += price
|
146 |
+
total_discount += discount
|
147 |
+
total_net_value += net_value
|
148 |
+
total_cgst += cgst
|
149 |
+
total_sgst += sgst
|
150 |
+
total_amount += item_total
|
151 |
|
152 |
+
if menu_item.get('Ingredient_1__r'):
|
|
|
153 |
ingredients.append({
|
154 |
"name": menu_item['Ingredient_1__r'].get('Ingredient_Name__c', ''),
|
155 |
"image": menu_item['Ingredient_1__r'].get('Ingredient_Image__c', ''),
|
|
|
157 |
"fun_facts": menu_item['Ingredient_1__r'].get('Fun_Facts__c', '')
|
158 |
})
|
159 |
|
160 |
+
if menu_item.get('Ingredient_2__r'):
|
|
|
161 |
ingredients.append({
|
162 |
"name": menu_item['Ingredient_2__r'].get('Ingredient_Name__c', ''),
|
163 |
"image": menu_item['Ingredient_2__r'].get('Ingredient_Image__c', ''),
|
|
|
165 |
"fun_facts": menu_item['Ingredient_2__r'].get('Fun_Facts__c', '')
|
166 |
})
|
167 |
|
|
|
168 |
if menu_item.get('Sector__c'):
|
169 |
+
sector_names.update(menu_item['Sector__c'].split(','))
|
170 |
|
|
|
171 |
order_items.append({
|
172 |
"name": item_name,
|
173 |
+
"price": price,
|
174 |
+
"discount": discount,
|
175 |
"image_url": menu_item.get("Image1__c", ''),
|
176 |
"ingredients": ingredients,
|
177 |
+
"category": "Food" if ingredients else "Soft Drink"
|
178 |
})
|
179 |
|
180 |
+
# Fetch restaurant details
|
181 |
+
restaurant_query = f"""
|
182 |
+
SELECT Legal_Name__c, Name, Address__c, GSTIN__c, FSSAI__c
|
183 |
+
FROM Restaurant__c
|
184 |
+
WHERE Name = 'Pista House'
|
185 |
+
LIMIT 1
|
186 |
+
"""
|
187 |
+
restaurant_result = sf.query_all(restaurant_query)
|
188 |
+
restaurant = restaurant_result["records"][0] if restaurant_result.get("records") else {
|
189 |
+
"legal_name": "DOUBLE TREE BY KVP HOSPITALITY LLP",
|
190 |
+
"name": "Pista House",
|
191 |
+
"address": "52 To 57, 69 & 70, 5-5-162 & 5-5-163, 5-5-164 & 5-5-165, Plot 1, Vanasthali Hills, Saheb Nagar, LB Nagar Circle 4, Vanasthalipuram, Hyderabad",
|
192 |
+
"gstin": "36AATFD1209K1Z9",
|
193 |
+
"fssai": "13622012000022"
|
194 |
+
}
|
195 |
+
|
196 |
+
# Fetch sector details
|
197 |
sector_details = {}
|
198 |
for sector_name in sector_names:
|
199 |
safe_sector_name = escape_soql(sector_name.strip())
|
|
|
210 |
"description": sector_record.get('Description__c', '')
|
211 |
}
|
212 |
|
213 |
+
# Format order data
|
214 |
+
order_data = {
|
215 |
+
"id": order.get("Id", "247JD92F00043965"),
|
216 |
+
"created_date": order.get("CreatedDate", "2024-12-12").split("T")[0],
|
217 |
+
"delivery_address": order.get("Delivery_Address__c", "Plot no -80, Road no-4, Sharadha Nagar, Vanasthalipuram, 500070"),
|
218 |
+
"place_of_supply": order.get("Place_of_Supply__c", "Telangana(36)"),
|
219 |
+
"cgst_rate": f"{order.get('CGST_Rate__c', 2.5)}%",
|
220 |
+
"sgst_rate": f"{order.get('SGST_Rate__c', 2.5)}%",
|
221 |
+
"cgst_rate_float": order.get("CGST_Rate__c", 2.5) / 100,
|
222 |
+
"sgst_rate_float": order.get("SGST_Rate__c", 2.5) / 100,
|
223 |
+
"payment_mode": order.get("Payment_Mode__c", "Digital"),
|
224 |
+
"reverse_charge": order.get("Reverse_Charge__c", "No")
|
225 |
+
}
|
226 |
+
|
227 |
+
# Convert total amount to words
|
228 |
+
total_amount_in_words = number_to_words(total_amount)
|
229 |
+
|
230 |
+
# Prepare template data
|
231 |
+
template_data = {
|
232 |
+
"order_id": order_data["id"],
|
233 |
+
"order_items": order_items,
|
234 |
+
"customer": customer_data,
|
235 |
+
"restaurant": restaurant,
|
236 |
+
"order": order_data,
|
237 |
+
"sector_details": sector_details,
|
238 |
+
"current_tier": current_tier,
|
239 |
+
"next_tier": next_tier,
|
240 |
+
"user_points": user_points,
|
241 |
+
"progress_percentage": progress_percentage,
|
242 |
+
"start_point": start_point,
|
243 |
+
"end_point": end_point,
|
244 |
+
"points_needed_for_next_tier": points_needed_for_next_tier,
|
245 |
+
"validity_year": datetime.now().year,
|
246 |
+
"total_gross_value": total_gross_value,
|
247 |
+
"total_discount": total_discount,
|
248 |
+
"total_net_value": total_net_value,
|
249 |
+
"total_cgst": total_cgst,
|
250 |
+
"total_sgst": total_sgst,
|
251 |
+
"total_amount": total_amount,
|
252 |
+
"total_amount_in_words": total_amount_in_words
|
253 |
+
}
|
254 |
+
|
255 |
+
return render_template("combined_summary.html", **template_data)
|
256 |
|
257 |
except Exception as e:
|
258 |
print(f"Error in combined_summary: {str(e)}")
|