Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -157,6 +157,57 @@ with gr.Blocks() as app:
|
|
| 157 |
date_picker.change(fn=get_reps, inputs=date_picker, outputs=rep_picker)
|
| 158 |
btn.click(fn=show_map, inputs=[date_picker, rep_picker], outputs=[table, map_plot])
|
| 159 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 160 |
def do_login(user, pw):
|
| 161 |
if VALID_USERS.get(user) == pw:
|
| 162 |
return gr.update(visible=False), gr.update(visible=True), ""
|
|
|
|
| 157 |
date_picker.change(fn=get_reps, inputs=date_picker, outputs=rep_picker)
|
| 158 |
btn.click(fn=show_map, inputs=[date_picker, rep_picker], outputs=[table, map_plot])
|
| 159 |
|
| 160 |
+
with gr.Tab("๐ Reports"):
|
| 161 |
+
with gr.Row():
|
| 162 |
+
report_type = gr.Radio(choices=["Daily", "Weekly", "Monthly"], label="Report Type", value="Daily")
|
| 163 |
+
report_date = gr.Date(label="Select Date")
|
| 164 |
+
download_btn = gr.Button("๐ฅ Download CSV")
|
| 165 |
+
|
| 166 |
+
report_table = gr.Dataframe(label="๐ Report Summary")
|
| 167 |
+
report_info = gr.Markdown()
|
| 168 |
+
download_file = gr.File(label="๐ Download Link")
|
| 169 |
+
|
| 170 |
+
def generate_report(report_type, report_date):
|
| 171 |
+
df = refresh_data()
|
| 172 |
+
date_obj = pd.to_datetime(report_date)
|
| 173 |
+
|
| 174 |
+
if report_type == "Daily":
|
| 175 |
+
mask = df['Date'] == str(date_obj.date())
|
| 176 |
+
elif report_type == "Weekly":
|
| 177 |
+
start = date_obj - pd.Timedelta(days=date_obj.weekday())
|
| 178 |
+
end = start + pd.Timedelta(days=6)
|
| 179 |
+
mask = (pd.to_datetime(df['Date']) >= start.date()) & (pd.to_datetime(df['Date']) <= end.date())
|
| 180 |
+
elif report_type == "Monthly":
|
| 181 |
+
mask = pd.to_datetime(df['Date']).dt.to_period("M") == date_obj.to_period("M")
|
| 182 |
+
|
| 183 |
+
filtered = df[mask]
|
| 184 |
+
|
| 185 |
+
if filtered.empty:
|
| 186 |
+
return pd.DataFrame(), "โ ๏ธ No data found for that range.", None
|
| 187 |
+
|
| 188 |
+
summary = filtered[[
|
| 189 |
+
'Date', 'Rep Name', 'Dealership', 'Time',
|
| 190 |
+
'Interaction Type', 'Product', 'Time Diff (min)'
|
| 191 |
+
]].sort_values(by=["Rep Name", "Date"])
|
| 192 |
+
|
| 193 |
+
insights = f"""
|
| 194 |
+
### ๐ Insights:
|
| 195 |
+
- **Total Visits:** {len(filtered)}
|
| 196 |
+
- **Unique Reps:** {filtered['Rep Name'].nunique()}
|
| 197 |
+
- **Most Active Rep:** {filtered['Rep Name'].value_counts().idxmax()}
|
| 198 |
+
- **Most Visited Dealership:** {filtered['Dealership'].value_counts().idxmax()}
|
| 199 |
+
- **Avg Time Between Visits:** {round(filtered['Time Diff (min)'].mean(), 2)} min
|
| 200 |
+
"""
|
| 201 |
+
|
| 202 |
+
filename = f"Bid4Cars_Report_{report_type}_{report_date}.csv".replace(" ", "_")
|
| 203 |
+
summary.to_csv(filename, index=False)
|
| 204 |
+
|
| 205 |
+
return summary, insights, filename
|
| 206 |
+
|
| 207 |
+
report_date.change(fn=generate_report, inputs=[report_type, report_date], outputs=[report_table, report_info, download_file])
|
| 208 |
+
report_type.change(fn=generate_report, inputs=[report_type, report_date], outputs=[report_table, report_info, download_file])
|
| 209 |
+
download_btn.click(fn=generate_report, inputs=[report_type, report_date], outputs=[report_table, report_info, download_file])
|
| 210 |
+
|
| 211 |
def do_login(user, pw):
|
| 212 |
if VALID_USERS.get(user) == pw:
|
| 213 |
return gr.update(visible=False), gr.update(visible=True), ""
|