""" routes/admin_reports.py — Shift detail, unchecked, and summary reports. """ import logging import io import csv from datetime import date, timedelta from flask import Blueprint, render_template, request, send_file, Response from models import ( get_shift_report, get_unchecked_report, get_summary_report, get_report_filter_options, ) from utils.decorators import admin_required logger = logging.getLogger("routes.admin_reports") admin_reports_bp = Blueprint("admin_reports", __name__, url_prefix="/admin/reports") def _today(): return date.today() @admin_reports_bp.route("/") @admin_required def reports(): tab = request.args.get("tab", "detail") date_from = request.args.get("date_from") or str(_today() - timedelta(days=30)) date_to = request.args.get("date_to") or str(_today()) user_id = request.args.get("user_id") website_id = request.args.get("website_id") target_date = request.args.get("target_date") or str(_today()) users, websites = get_report_filter_options() rows = [] try: if tab == "detail": rows = get_shift_report( date_from=date_from, date_to=date_to, user_id=int(user_id) if user_id else None, website_id=int(website_id) if website_id else None, ) elif tab == "unchecked": rows = get_unchecked_report( target_date=target_date, user_id=int(user_id) if user_id else None, ) elif tab == "summary": rows = get_summary_report(date_from=date_from, date_to=date_to) except Exception as e: logger.error(f"Report query error: {e}") return render_template("admin/reports.html", tab=tab, rows=rows, users=users, websites=websites, date_from=date_from, date_to=date_to, target_date=target_date, user_id=user_id, website_id=website_id) @admin_reports_bp.route("/export/csv") @admin_required def export_csv(): tab = request.args.get("tab", "detail") date_from = request.args.get("date_from") or str(_today() - timedelta(days=30)) date_to = request.args.get("date_to") or str(_today()) user_id = request.args.get("user_id") website_id = request.args.get("website_id") target_date = request.args.get("target_date") or str(_today()) try: if tab == "detail": rows = get_shift_report( date_from=date_from, date_to=date_to, user_id=int(user_id) if user_id else None, website_id=int(website_id) if website_id else None, ) elif tab == "unchecked": rows = get_unchecked_report( target_date=target_date, user_id=int(user_id) if user_id else None, ) else: rows = get_summary_report(date_from=date_from, date_to=date_to) except Exception as e: logger.error(f"CSV export error: {e}") rows = [] output = io.StringIO() writer = csv.DictWriter(output, fieldnames=rows[0].keys() if rows else [], extrasaction="ignore") writer.writeheader() for row in rows: writer.writerow({k: str(v) if v is not None else "" for k, v in row.items()}) output.seek(0) return Response( output.getvalue(), mimetype="text/csv", headers={"Content-Disposition": f"attachment; filename=report_{tab}_{date_to}.csv"}, )