from flask import Flask, request, render_template, redirect, url_for, flash from functions.database import ( Base, Militante, CotaMensal, TipoPagamento, Pagamento, MaterialVendido, TipoMaterial, VendaJornalAvulso, engine, AssinaturaAnual, RelatorioCotasMensais, RelatorioVendasMateriais, engine, ) from sqlalchemy import create_engine, and_ from sqlalchemy.orm import sessionmaker from datetime import datetime from flask_bootstrap import Bootstrap5 from routes.cota import cota_bp from functions.validations import validar_cpf Session = sessionmaker(bind=engine) session = Session() app = Flask(__name__) app.secret_key = 'sua_chave_secreta_aqui' bootstrap = Bootstrap5(app) def session_run(model): session.add(model) try: session.commit() except Exception as e: print(e) session.rollback() # Rota para criar um novo militante @app.route("/militantes/novo", methods=["GET", "POST"]) def novo_militante(): if request.method == "POST": cpf = request.form["cpf"] if not validar_cpf(cpf): flash('CPF inválido. Por favor, verifique o número informado.', 'error') return render_template("novo_militante.html", dados_anteriores=request.form) novo_militante = Militante( nome=request.form["nome"], cpf=cpf, email=request.form["email"], telefone=request.form["telefone"], endereco=request.form["endereco"], filiado=bool(request.form.get("filiado", False)) ) session_run(novo_militante) flash('Militante cadastrado com sucesso!', 'success') return redirect(url_for("listar_militantes")) return render_template("novo_militante.html") # Rota para listar militantes @app.route("/militantes") def listar_militantes(): militantes = session.query(Militante).all() return render_template("listar_militantes.html", militantes=militantes) # Rota para criar uma nova cota mensal @app.route("/cotas/novo", methods=["GET", "POST"]) def nova_cota(): if request.method == "POST": cotas_mensais = CotaMensal( militante_id=request.form["militante_id"], valor_antigo=request.form["valor_antigo"], valor_novo=request.form["valor_novo"], data_alteracao=datetime.strptime(request.form["data_alteracao"], "%Y-%m-%d") ) session_run(cotas_mensais) return redirect(url_for("listar_cotas")) return render_template("nova_cota.html") # Rota para listar cotas mensais @app.route("/cotas") def listar_cotas(): cotas = session.query(CotaMensal).all() return render_template("listar_cotas.html", cotas=cotas) # Rota para criar um novo pagamento @app.route("/pagamentos/novo", methods=["GET", "POST"]) def novo_pagamento(): if request.method == "POST": pagamentos = Pagamento( militante_id=request.form["militante_id"], tipo_pagamento_id=request.form["tipo_pagamento_id"], valor=request.form["valor"], data_pagamento=datetime.strptime(request.form["data_pagamento"], "%Y-%m-%d") ) session_run(pagamentos) return redirect(url_for("listar_pagamentos")) return render_template("novo_pagamento.html") # Rota para listar pagamentos @app.route("/pagamentos") def listar_pagamentos(): pagamentos = session.query(Pagamento).all() return render_template("listar_pagamentos.html", pagamentos=pagamentos) # Rota para criar um novo material vendido @app.route("/materiais/novo", methods=["GET", "POST"]) def novo_material(): if request.method == "POST": materiais_vendidos = MaterialVendido( militante_id=request.form["militante_id"], tipo_material_id=request.form["tipo_material_id"], descricao=request.form["descricao"], valor=request.form["valor"], data_venda=datetime.strptime(request.form["data_venda"], "%Y-%m-%d"), ) session_run(materiais_vendidos) return redirect(url_for("listar_materiais")) return render_template("novo_material.html") # Rota para listar materiais vendidos @app.route("/materiais") def listar_materiais(): materiais = session.query(MaterialVendido).all() return render_template("listar_materiais.html", materiais=materiais) # Rota para criar uma nova venda de jornais avulsos @app.route("/jornais/novo", methods=["GET", "POST"]) def nova_venda_jornal(): if request.method == "POST": vendas_jornais_avulsos = VendaJornalAvulso( militante_id=request.form["militante_id"], quantidade=request.form["quantidade"], valor_total=request.form["valor_total"], data_venda=datetime.strptime(request.form["data_venda"], "%Y-%m-%d"), ) session_run(vendas_jornais_avulsos) return redirect(url_for("listar_vendas_jornal")) return render_template("nova_venda_jornal.html") # Rota para listar vendas de jornais avulsos @app.route("/jornais") def listar_vendas_jornal(): vendas = session.query(VendaJornalAvulso).all() return render_template("listar_vendas_jornal.html", vendas=vendas) # Rota para criar uma nova assinatura anual @app.route("/assinaturas/novo", methods=["GET", "POST"]) def nova_assinatura(): if request.method == "POST": assinaturas_anuais = AssinaturaAnual( militante_id=request.form["militante_id"], tipo_material_id=request.form["tipo_material_id"], quantidade=request.form["quantidade"], valor_total=request.form["valor_total"], data_inicio=datetime.strptime(request.form["data_inicio"], "%Y-%m-%d"), data_fim=datetime.strptime(request.form["data_fim"], "%Y-%m-%d") ) session_run(assinaturas_anuais) return redirect(url_for("listar_assinaturas")) return render_template("nova_assinatura.html") # Rota para listar assinaturas anuais @app.route("/assinaturas") def listar_assinaturas(): assinaturas = session.query(AssinaturaAnual).all() return render_template("listar_assinaturas.html", assinaturas=assinaturas) # Rota para criar um novo relatório de cotas mensais @app.route("/relatorios/cotas/novo", methods=["GET", "POST"]) def novo_relatorio_cotas(): if request.method == "POST": relatorio_cotas_mensais = RelatorioCotasMensais( setor_id=request.form["setor_id"], comite_id=request.form["comite_id"], total_cotas=request.form["total_cotas"], data_relatorio=datetime.strptime(request.form["data_relatorio"], "%Y-%m-%d") ) session_run(relatorio_cotas_mensais) return redirect(url_for("listar_relatorios_cotas")) return render_template("novo_relatorio_cotas.html") # Rota para listar relatórios de cotas mensais @app.route("/relatorios/cotas") def listar_relatorios_cotas(): relatorios = session.query(RelatorioCotasMensais).all() return render_template("listar_relatorios_cotas.html", relatorios=relatorios) # Rota para criar um novo relatório de vendas de materiais @app.route("/relatorios/vendas/novo", methods=["GET", "POST"]) def novo_relatorio_vendas(): if request.method == "POST": relatorio_vendas_materiais = RelatorioVendasMateriais( setor_id=request.form["setor_id"], comite_id=request.form["comite_id"], total_vendas=request.form["total_vendas"], data_relatorio=datetime.strptime(request.form["data_relatorio"], "%Y-%m-%d") ) session_run(relatorio_vendas_materiais) return redirect(url_for("listar_relatorios_vendas")) return render_template("novo_relatorio_vendas.html") # Rota para listar relatórios de vendas de materiais @app.route("/relatorios/vendas") def listar_relatorios_vendas(): relatorios = session.query(RelatorioVendasMateriais).all() return render_template("listar_relatorios_vendas.html", relatorios=relatorios) @app.route("/") def home(): """Página inicial do sistema""" links = [] for rule in app.url_map.iter_rules(): if "GET" in rule.methods and has_no_empty_params(rule): url = url_for(rule.endpoint, **(rule.defaults or {})) # Substituindo 'home' por 'início' no menu endpoint_name = 'Início' if rule.endpoint == 'home' else rule.endpoint links.append((url, endpoint_name)) return render_template('home.html', links=links) def has_no_empty_params(rule): defaults = rule.defaults if rule.defaults is not None else () arguments = rule.arguments if rule.arguments is not None else () return len(defaults) >= len(arguments) @app.route("/militantes/editar/", methods=["GET", "POST"]) def editar_militante(id): militante = session.query(Militante).get(id) if not militante: flash('Militante não encontrado.', 'error') return redirect(url_for('listar_militantes')) if request.method == "POST": cpf = request.form["cpf"] if cpf != militante.cpf and not validar_cpf(cpf): # Só valida se o CPF foi alterado flash('CPF inválido. Por favor, verifique o número informado.', 'error') return render_template("editar_militante.html", militante=militante) try: militante.nome = request.form["nome"] militante.cpf = cpf militante.email = request.form["email"] militante.telefone = request.form["telefone"] militante.endereco = request.form["endereco"] militante.filiado = bool(request.form.get("filiado", False)) session.commit() flash('Militante atualizado com sucesso!', 'success') return redirect(url_for('listar_militantes')) except Exception as e: session.rollback() flash('Erro ao atualizar militante. Verifique se o CPF ou email já não estão cadastrados.', 'error') return render_template("editar_militante.html", militante=militante) return render_template("editar_militante.html", militante=militante) def create_app(): app = Flask(__name__) # ... existing code ... app.register_blueprint(cota_bp) # ... existing code ... return app # Iniciar o servidor Flask if __name__ == "__main__": app.run(debug=True)