from flask import Blueprint, render_template from flask_login import login_required, current_user from app import db # ADD THIS LINE from app.models.inspection import Inspection, InspectionTemplate from app.models.facility import Facility from app.models.issue import Issue from app.models.user import User from sqlalchemy import func from datetime import datetime, timedelta from app.utils.time_utils import now_eastern bp = Blueprint('dashboard', __name__) @bp.route('/') @bp.route('/dashboard') @login_required def index(): # Get today's date range today_start = now_eastern().replace(hour=0, minute=0, second=0, microsecond=0) today_end = today_start + timedelta(days=1) # Statistics for today if current_user.role == 'inspector': today_inspections = Inspection.query.filter( Inspection.inspector_id == current_user.id, Inspection.inspection_date >= today_start, Inspection.inspection_date < today_end ).count() completed_today = Inspection.query.filter( Inspection.inspector_id == current_user.id, Inspection.status == 'completed', Inspection.inspection_date >= today_start, Inspection.inspection_date < today_end ).count() open_issues = Issue.query.join(Inspection).filter( Inspection.inspector_id == current_user.id, Issue.status.in_(['open', 'in_progress']) ).count() else: today_inspections = Inspection.query.filter( Inspection.inspection_date >= today_start, Inspection.inspection_date < today_end ).count() completed_today = Inspection.query.filter( Inspection.status == 'completed', Inspection.inspection_date >= today_start, Inspection.inspection_date < today_end ).count() open_issues = Issue.query.filter( Issue.status.in_(['open', 'in_progress']) ).count() # Calculate average score (last 30 days) thirty_days_ago = now_eastern() - timedelta(days=30) avg_score_query = Inspection.query.filter( Inspection.status == 'completed', Inspection.overall_score.isnot(None), Inspection.inspection_date >= thirty_days_ago ) if current_user.role == 'inspector': avg_score_query = avg_score_query.filter(Inspection.inspector_id == current_user.id) avg_score = db.session.query(func.avg(Inspection.overall_score)).filter( Inspection.status == 'completed', Inspection.overall_score.isnot(None), Inspection.inspection_date >= thirty_days_ago, *([Inspection.inspector_id == current_user.id] if current_user.role == 'inspector' else []) ).scalar() # Recent inspections recent_inspections_query = Inspection.query.order_by(Inspection.inspection_date.desc()) if current_user.role == 'inspector': recent_inspections_query = recent_inspections_query.filter(Inspection.inspector_id == current_user.id) recent_inspections = recent_inspections_query.limit(5).all() # System statistics (admin/supervisor only) total_facilities = Facility.query.filter_by(active=True).count() if current_user.role in ['admin', 'supervisor'] else 0 total_templates = InspectionTemplate.query.count() if current_user.role in ['admin', 'supervisor'] else 0 total_users = User.query.count() if current_user.role == 'admin' else 0 return render_template('dashboard.html', today_inspections=today_inspections, completed_today=completed_today, open_issues=open_issues, avg_score=round(avg_score, 2) if avg_score else None, recent_inspections=recent_inspections, total_facilities=total_facilities, total_templates=total_templates, total_users=total_users )