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), ""
|