Spaces:
Sleeping
Sleeping
File size: 5,018 Bytes
88ff990 4e6e288 88ff990 1ec30a9 88ff990 de7d48b 4e6e288 1f48402 4e6e288 1ec30a9 de7d48b 1ec30a9 16ba360 6259813 1ec30a9 4e6e288 de7d48b 268f142 de7d48b 1ec30a9 de7d48b 16ba360 de7d48b 16ba360 1ec30a9 16ba360 1ec30a9 16ba360 1ec30a9 6259813 de7d48b 50acac4 6259813 |
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 |
import pandas as pd
import gspread
import gradio as gr
from oauth2client.service_account import ServiceAccountCredentials
from datetime import datetime
import time
# ------------------ AUTH ------------------
VALID_USERS = {
"[email protected]": "Pass.123",
"[email protected]": "Pass.123",
"[email protected]": "Pass.123"
}
# ------------------ GOOGLE SHEET SETUP ------------------
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name("credentials.json", scope)
client = gspread.authorize(creds)
sheet_file = client.open("userAccess")
# ------------------ RETRY LOGIC ------------------
def load_tab(sheet_name, retries=3, delay=5):
for attempt in range(retries):
try:
df = pd.DataFrame(sheet_file.worksheet(sheet_name).get_all_records())
return df
except gspread.exceptions.APIError as e:
if attempt < retries - 1:
time.sleep(delay)
else:
return pd.DataFrame([[f"β οΈ API Error: {str(e)}"]], columns=["Error"])
# ------------------ HELPERS ------------------
def get_combined_orders(date_str):
df_field = load_tab("Field Sales")
df_ts = load_tab("TeleSales")
combined = []
if not df_field.empty:
df_field['Date'] = pd.to_datetime(df_field['Date'], errors='coerce')
df_field['DateStr'] = df_field['Date'].dt.date.astype(str)
df_field = df_field[df_field['DateStr'] == date_str.strip()]
df_field['Order Value'] = pd.to_numeric(df_field['Order Value'], errors='coerce').fillna(0)
df_field_orders = df_field.groupby("Rep").agg({
"Order Received": lambda x: (x == "Yes").sum(),
"Order Value": "sum"
}).reset_index().rename(columns={
"Order Received": "Orders Received",
"Order Value": "Total Order Value"
})
df_field_orders["Source"] = "Field Sales"
combined.append(df_field_orders)
if not df_ts.empty:
df_ts['Date'] = pd.to_datetime(df_ts['Date'], errors='coerce')
df_ts['DateStr'] = df_ts['Date'].dt.date.astype(str)
df_ts = df_ts[df_ts['DateStr'] == date_str.strip()]
df_ts['Order Value'] = pd.to_numeric(df_ts['Order Value'], errors='coerce').fillna(0)
df_ts_orders = df_ts.groupby("Rep").agg({
"Order Received": lambda x: (x == "Yes").sum(),
"Order Value": "sum"
}).reset_index().rename(columns={
"Order Received": "Orders Received",
"Order Value": "Total Order Value"
})
df_ts_orders["Source"] = "TeleSales"
combined.append(df_ts_orders)
if combined:
return pd.concat(combined, ignore_index=True)
else:
return pd.DataFrame([["No orders on this date"]], columns=["Message"])
# Define other helper functions similarly using load_tab...
# ------------------ GRADIO APP ------------------
with gr.Blocks() as app:
with gr.Row():
with gr.Column(visible=True) as login_ui:
gr.Markdown("## π Login Required")
email = gr.Textbox(label="Email")
password = gr.Textbox(label="Password", type="password")
login_btn = gr.Button("Login")
login_msg = gr.Markdown("")
with gr.Column(visible=False) as main_ui:
gr.Markdown("## ποΈ CarMat Dashboard")
df_initial = load_tab("Field Sales")
unique_dates = sorted(df_initial["Date"].astype(str).unique(), reverse=True) if not df_initial.empty else []
# --- Tabs ---
with gr.Tab("π Summary"):
gr.Markdown("Summary content coming soon...")
with gr.Tab("π Field Sales"):
field_df = gr.Dataframe(value=load_tab("Field Sales"), label="π Field Sales Records", interactive=False)
gr.Button("π Refresh").click(fn=lambda: load_tab("Field Sales"), outputs=field_df)
with gr.Tab("π TeleSales"):
ts_table = gr.Dataframe(value=load_tab("TeleSales"), label="π TeleSales Summary")
gr.Button("π Refresh").click(fn=lambda: load_tab("TeleSales"), outputs=ts_table)
with gr.Tab("π¦ Orders Summary"):
order_date = gr.Dropdown(label="Select Date", choices=unique_dates, interactive=True)
order_table = gr.Dataframe(label="π§Ύ Combined Order Summary")
order_date.change(fn=get_combined_orders, inputs=order_date, outputs=order_table)
# Continue similarly for other tabs...
def do_login(user, pw):
if VALID_USERS.get(user) == pw:
return gr.update(visible=False), gr.update(visible=True), ""
else:
return gr.update(visible=True), gr.update(visible=False), "β Invalid login."
login_btn.click(fn=do_login, inputs=[email, password], outputs=[login_ui, main_ui, login_msg])
app.launch()
|