diff --git a/app.py b/app.py index f226c59..4c9c296 100644 --- a/app.py +++ b/app.py @@ -525,22 +525,13 @@ def novo_pagamento(): @app.route("/pagamentos") @require_login def listar_pagamentos(): - user = current_user - - # Filtrar pagamentos baseado na instância do usuário - if user.has_permission(Permission.REGISTER_CC_PAYMENT): - pagamentos = db_session.query(Pagamento).all() - elif user.has_permission(Permission.REGISTER_CR_PAYMENT): - pagamentos = db_session.query(Pagamento).filter(Pagamento.instancia_id.in_(user.get_cr_instances())).all() - elif user.has_permission(Permission.REGISTER_SECTOR_PAYMENT): - pagamentos = db_session.query(Pagamento).filter(Pagamento.instancia_id.in_(user.get_sector_instances())).all() - elif user.has_permission(Permission.REGISTER_CELL_PAYMENT): - pagamentos = db_session.query(Pagamento).filter(Pagamento.instancia_id.in_(user.get_cell_instances())).all() - else: - flash('Você não tem permissão para visualizar pagamentos.', 'error') - return redirect(url_for('home')) - - return render_template("listar_pagamentos.html", pagamentos=pagamentos) + try: + pagamentos = db_session.query(Pagamento).order_by(Pagamento.data_pagamento.desc()).all() + return render_template("listar_pagamentos.html", pagamentos=pagamentos) + except Exception as e: + print(f"Erro ao listar pagamentos: {str(e)}") + flash("Erro ao carregar lista de pagamentos. Por favor, tente novamente.", "danger") + return render_template("listar_pagamentos.html", pagamentos=[]) # Rota para criar um novo material vendido @app.route("/materiais/novo", methods=["GET", "POST"]) @@ -573,9 +564,13 @@ def novo_material(): @require_login @require_permission(Permission.VIEW_CELL_REPORTS) def listar_materiais(): - """Lista todos os materiais""" - materiais = db_session.query(MaterialVendido).all() - return render_template("listar_materiais.html", materiais=materiais) + try: + materiais = db_session.query(MaterialVendido).order_by(MaterialVendido.data_venda.desc()).all() + return render_template("listar_materiais.html", materiais=materiais) + except Exception as e: + print(f"Erro ao listar materiais: {str(e)}") + flash("Erro ao carregar lista de materiais. Por favor, tente novamente.", "danger") + return render_template("listar_materiais.html", materiais=[]) # Rota para criar uma nova venda de jornais avulsos @app.route("/jornais/novo", methods=["GET", "POST"]) @@ -607,9 +602,13 @@ def nova_venda_jornal(): @require_login @require_permission(Permission.VIEW_CELL_REPORTS) def listar_vendas_jornal(): - """Lista todas as vendas de jornal""" - vendas = db_session.query(VendaJornalAvulso).all() - return render_template("listar_vendas_jornal.html", vendas=vendas) + try: + vendas = db_session.query(VendaJornalAvulso).order_by(VendaJornalAvulso.data_venda.desc()).all() + return render_template("listar_vendas_jornal.html", vendas=vendas) + except Exception as e: + print(f"Erro ao listar vendas de jornais: {str(e)}") + flash("Erro ao carregar lista de vendas de jornais. Por favor, tente novamente.", "danger") + return render_template("listar_vendas_jornal.html", vendas=[]) # Rota para criar uma nova assinatura anual @app.route("/assinaturas/novo", methods=["GET", "POST"]) @@ -643,9 +642,13 @@ def nova_assinatura(): @require_login @require_permission(Permission.VIEW_CELL_REPORTS) def listar_assinaturas(): - """Lista todas as assinaturas""" - assinaturas = db_session.query(AssinaturaAnual).all() - return render_template("listar_assinaturas.html", assinaturas=assinaturas) + try: + assinaturas = db_session.query(AssinaturaAnual).order_by(AssinaturaAnual.data_inicio.desc()).all() + return render_template("listar_assinaturas.html", assinaturas=assinaturas) + except Exception as e: + print(f"Erro ao listar assinaturas: {str(e)}") + flash("Erro ao carregar lista de assinaturas. Por favor, tente novamente.", "danger") + return render_template("listar_assinaturas.html", assinaturas=[]) # Rota para criar um novo relatório de cotas mensais @app.route("/relatorios/cotas/novo", methods=["GET", "POST"]) @@ -677,8 +680,13 @@ def novo_relatorio_cotas(): @require_login @require_permission(Permission.VIEW_CELL_REPORTS) def listar_relatorios_cotas(): - relatorios = db_session.query(RelatorioCotasMensais).all() - return render_template("listar_relatorios_cotas.html", relatorios=relatorios) + try: + relatorios = db_session.query(RelatorioCotasMensais).order_by(RelatorioCotasMensais.data_relatorio.desc()).all() + return render_template("listar_relatorios_cotas.html", relatorios=relatorios) + except Exception as e: + print(f"Erro ao listar relatórios de cotas: {str(e)}") + flash("Erro ao carregar lista de relatórios de cotas. Por favor, tente novamente.", "danger") + return render_template("listar_relatorios_cotas.html", relatorios=[]) # Rota para criar um novo relatório de vendas de materiais @app.route("/relatorios/vendas/novo", methods=["GET", "POST"]) @@ -710,8 +718,13 @@ def novo_relatorio_vendas(): @require_login @require_permission(Permission.VIEW_CELL_REPORTS) def listar_relatorios_vendas(): - relatorios = db_session.query(RelatorioVendasMateriais).all() - return render_template("listar_relatorios_vendas.html", relatorios=relatorios) + try: + relatorios = db_session.query(RelatorioVendasMateriais).order_by(RelatorioVendasMateriais.data_relatorio.desc()).all() + return render_template("listar_relatorios_vendas.html", relatorios=relatorios) + except Exception as e: + print(f"Erro ao listar relatórios de vendas: {str(e)}") + flash("Erro ao carregar lista de relatórios de vendas. Por favor, tente novamente.", "danger") + return render_template("listar_relatorios_vendas.html", relatorios=[]) @app.route('/militantes//editar', methods=['GET', 'POST']) @require_login diff --git a/seed_data.py b/seed_data.py new file mode 100644 index 0000000..ed3f247 --- /dev/null +++ b/seed_data.py @@ -0,0 +1,192 @@ +from datetime import datetime, timedelta +from functions.database import ( + Base, Militante, CotaMensal, TipoPagamento, Pagamento, + MaterialVendido, TipoMaterial, VendaJornalAvulso, AssinaturaAnual, + RelatorioCotasMensais, RelatorioVendasMateriais, engine, get_db_connection +) +import random +from faker import Faker + +fake = Faker('pt_BR') +db_session = get_db_connection() + +def criar_tipos_pagamento(): + """Cria tipos de pagamento padrão""" + tipos = [ + "Dinheiro", + "PIX", + "Cartão de Crédito", + "Cartão de Débito", + "Transferência Bancária" + ] + for tipo in tipos: + if not db_session.query(TipoPagamento).filter_by(descricao=tipo).first(): + db_session.add(TipoPagamento(descricao=tipo)) + db_session.commit() + +def criar_tipos_material(): + """Cria tipos de material padrão""" + tipos = [ + "Jornal", + "Revista", + "Livro", + "Panfleto", + "Cartilha" + ] + for tipo in tipos: + if not db_session.query(TipoMaterial).filter_by(descricao=tipo).first(): + db_session.add(TipoMaterial(descricao=tipo)) + db_session.commit() + +def criar_militantes(quantidade=50): + """Cria militantes fictícios""" + militantes = [] + for _ in range(quantidade): + militante = Militante( + nome=fake.name(), + cpf=fake.cpf(), + email=fake.email(), + telefone=fake.phone_number(), + endereco=fake.address(), + filiado=random.choice([True, False]) + ) + db_session.add(militante) + militantes.append(militante) + db_session.commit() + return militantes + +def criar_cotas(militantes, quantidade_por_militante=3): + """Cria cotas mensais fictícias""" + for militante in militantes: + for i in range(quantidade_por_militante): + data_base = datetime.now() - timedelta(days=30 * i) + valor = random.uniform(50, 200) + cota = CotaMensal( + militante_id=militante.id, + valor_antigo=valor, + valor_novo=valor * 1.1, + data_alteracao=data_base, + data_vencimento=data_base + timedelta(days=30), + pago=random.choice([True, False]) + ) + db_session.add(cota) + db_session.commit() + +def criar_pagamentos(militantes): + """Cria pagamentos fictícios""" + tipos_pagamento = db_session.query(TipoPagamento).all() + for militante in militantes: + for _ in range(random.randint(1, 5)): + pagamento = Pagamento( + militante_id=militante.id, + tipo_pagamento_id=random.choice(tipos_pagamento).id, + valor=random.uniform(50, 500), + data_pagamento=fake.date_time_between(start_date='-1y', end_date='now') + ) + db_session.add(pagamento) + db_session.commit() + +def criar_materiais_vendidos(militantes): + """Cria materiais vendidos fictícios""" + tipos_material = db_session.query(TipoMaterial).all() + for militante in militantes: + for _ in range(random.randint(1, 3)): + material = MaterialVendido( + militante_id=militante.id, + tipo_material_id=random.choice(tipos_material).id, + descricao=fake.sentence(), + valor=random.uniform(20, 100), + data_venda=fake.date_time_between(start_date='-1y', end_date='now') + ) + db_session.add(material) + db_session.commit() + +def criar_vendas_jornal(militantes): + """Cria vendas de jornal avulso fictícias""" + for militante in militantes: + for _ in range(random.randint(1, 4)): + venda = VendaJornalAvulso( + militante_id=militante.id, + quantidade=random.randint(1, 10), + valor_total=random.uniform(10, 100), + data_venda=fake.date_time_between(start_date='-1y', end_date='now') + ) + db_session.add(venda) + db_session.commit() + +def criar_assinaturas(militantes): + """Cria assinaturas anuais fictícias""" + tipos_material = db_session.query(TipoMaterial).all() + for militante in militantes: + if random.random() < 0.3: # 30% de chance de ter assinatura + data_inicio = fake.date_time_between(start_date='-1y', end_date='now') + assinatura = AssinaturaAnual( + militante_id=militante.id, + tipo_material_id=random.choice(tipos_material).id, + quantidade=random.randint(1, 3), + valor_total=random.uniform(100, 500), + data_inicio=data_inicio, + data_fim=data_inicio + timedelta(days=365) + ) + db_session.add(assinatura) + db_session.commit() + +def criar_relatorios(): + """Cria relatórios fictícios""" + for _ in range(12): # Um relatório por mês do último ano + data = fake.date_time_between(start_date='-1y', end_date='now') + + relatorio_cotas = RelatorioCotasMensais( + setor_id=random.randint(1, 5), + comite_id=random.randint(1, 3), + total_cotas=random.uniform(1000, 5000), + data_relatorio=data + ) + + relatorio_vendas = RelatorioVendasMateriais( + setor_id=random.randint(1, 5), + comite_id=random.randint(1, 3), + total_vendas=random.uniform(500, 3000), + data_relatorio=data + ) + + db_session.add(relatorio_cotas) + db_session.add(relatorio_vendas) + + db_session.commit() + +def seed_database(): + """Função principal para popular o banco de dados com dados fictícios""" + print("Iniciando população do banco de dados com dados fictícios...") + + print("Criando tipos de pagamento...") + criar_tipos_pagamento() + + print("Criando tipos de material...") + criar_tipos_material() + + print("Criando militantes...") + militantes = criar_militantes(50) + + print("Criando cotas mensais...") + criar_cotas(militantes) + + print("Criando pagamentos...") + criar_pagamentos(militantes) + + print("Criando materiais vendidos...") + criar_materiais_vendidos(militantes) + + print("Criando vendas de jornal...") + criar_vendas_jornal(militantes) + + print("Criando assinaturas...") + criar_assinaturas(militantes) + + print("Criando relatórios...") + criar_relatorios() + + print("Banco de dados populado com sucesso!") + +if __name__ == "__main__": + seed_database() \ No newline at end of file