from flask import session, render_template from datetime import datetime from sqlalchemy.sql import func from models.entities.militante import Militante from models.entities.cota_mensal import CotaMensal from models.entities.material_vendido import MaterialVendido from models.entities.assinatura_anual import AssinaturaAnual from models.entities.pagamento import Pagamento from models.entities.tipo_pagamento import TipoPagamento from models.entities.usuario import Usuario from services.database_service import DatabaseService class HomeController: """Controlador para página inicial e dashboard""" @staticmethod def dashboard(): """Gera dados para o dashboard principal""" db = DatabaseService.get_db_connection() try: # Buscar nome do usuário usuario = db.query(Usuario).get(session.get('user_id')) nome_usuario = usuario.username if usuario else "Usuário" # Formatar data atual em português data_atual = datetime.now().strftime("%d de %B de %Y") # Buscar dados para o dashboard total_militantes = db.query(Militante).count() total_cotas = db.query(func.sum(CotaMensal.valor_novo)).scalar() or 0 total_materiais = db.query(MaterialVendido).count() total_assinaturas = db.query(AssinaturaAnual).count() # Buscar últimos militantes cadastrados ultimos_militantes = db.query(Militante)\ .order_by(Militante.id.desc())\ .limit(5)\ .all() # Buscar últimos pagamentos ultimos_pagamentos = db.query(Pagamento)\ .join(Militante)\ .order_by(Pagamento.data_pagamento.desc())\ .limit(5)\ .all() # Buscar tipos de pagamento tipos_pagamento = db.query(TipoPagamento).all() return { 'nome_usuario': nome_usuario, 'data_atual': data_atual, 'total_militantes': total_militantes, 'total_cotas': "{:.2f}".format(total_cotas), 'total_materiais': total_materiais, 'total_assinaturas': total_assinaturas, 'ultimos_militantes': ultimos_militantes, 'ultimos_pagamentos': ultimos_pagamentos, 'tipos_pagamento': tipos_pagamento } except Exception as e: print(f"Erro ao carregar dashboard: {e}") import traceback traceback.print_exc() return { 'nome_usuario': "Usuário", 'data_atual': datetime.now().strftime("%d/%m/%Y"), 'total_militantes': 0, 'total_cotas': "0.00", 'total_materiais': 0, 'total_assinaturas': 0, 'ultimos_militantes': [], 'ultimos_pagamentos': [], 'tipos_pagamento': [] } finally: db.close()