2025-02-20 10:39:31 -03:00
|
|
|
from flask import Flask, request, render_template, redirect, url_for, flash
|
2025-01-08 00:19:49 -03:00
|
|
|
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
|
2025-02-19 14:27:14 -03:00
|
|
|
from flask_bootstrap import Bootstrap5
|
2025-02-20 10:39:31 -03:00
|
|
|
from routes.cota import cota_bp
|
|
|
|
|
from functions.validations import validar_cpf
|
2025-01-08 00:19:49 -03:00
|
|
|
|
|
|
|
|
Session = sessionmaker(bind=engine)
|
|
|
|
|
session = Session()
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
app = Flask(__name__)
|
2025-02-20 10:39:31 -03:00
|
|
|
app.secret_key = 'sua_chave_secreta_aqui'
|
2025-02-19 14:27:14 -03:00
|
|
|
bootstrap = Bootstrap5(app)
|
2024-11-26 10:57:25 -03:00
|
|
|
|
2025-01-08 00:19:49 -03:00
|
|
|
|
|
|
|
|
def session_run(model):
|
|
|
|
|
session.add(model)
|
|
|
|
|
try:
|
|
|
|
|
session.commit()
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
session.rollback()
|
|
|
|
|
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
# Rota para criar um novo militante
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/militantes/novo", methods=["GET", "POST"])
|
2024-11-26 10:57:25 -03:00
|
|
|
def novo_militante():
|
2025-01-08 00:19:49 -03:00
|
|
|
if request.method == "POST":
|
2025-02-20 10:39:31 -03:00
|
|
|
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)
|
|
|
|
|
|
2025-01-08 00:19:49 -03:00
|
|
|
novo_militante = Militante(
|
|
|
|
|
nome=request.form["nome"],
|
2025-02-20 10:39:31 -03:00
|
|
|
cpf=cpf,
|
2025-01-08 00:19:49 -03:00
|
|
|
email=request.form["email"],
|
|
|
|
|
telefone=request.form["telefone"],
|
|
|
|
|
endereco=request.form["endereco"],
|
2025-02-20 10:39:31 -03:00
|
|
|
filiado=bool(request.form.get("filiado", False))
|
2025-01-08 00:19:49 -03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
session_run(novo_militante)
|
2025-02-20 10:39:31 -03:00
|
|
|
flash('Militante cadastrado com sucesso!', 'success')
|
2025-01-08 00:19:49 -03:00
|
|
|
return redirect(url_for("listar_militantes"))
|
|
|
|
|
|
|
|
|
|
return render_template("novo_militante.html")
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
# Rota para listar militantes
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/militantes")
|
2024-11-26 10:57:25 -03:00
|
|
|
def listar_militantes():
|
2025-01-08 00:19:49 -03:00
|
|
|
militantes = session.query(Militante).all()
|
|
|
|
|
return render_template("listar_militantes.html", militantes=militantes)
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
# Rota para criar uma nova cota mensal
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/cotas/novo", methods=["GET", "POST"])
|
2024-11-26 10:57:25 -03:00
|
|
|
def nova_cota():
|
2025-01-08 00:19:49 -03:00
|
|
|
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")
|
|
|
|
|
)
|
2024-11-26 10:57:25 -03:00
|
|
|
|
2025-01-08 00:19:49 -03:00
|
|
|
session_run(cotas_mensais)
|
|
|
|
|
return redirect(url_for("listar_cotas"))
|
|
|
|
|
|
|
|
|
|
return render_template("nova_cota.html")
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Rota para listar cotas mensais
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/cotas")
|
2024-11-26 10:57:25 -03:00
|
|
|
def listar_cotas():
|
2025-01-08 00:19:49 -03:00
|
|
|
cotas = session.query(CotaMensal).all()
|
|
|
|
|
return render_template("listar_cotas.html", cotas=cotas)
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
# Rota para criar um novo pagamento
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/pagamentos/novo", methods=["GET", "POST"])
|
2024-11-26 10:57:25 -03:00
|
|
|
def novo_pagamento():
|
2025-01-08 00:19:49 -03:00
|
|
|
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"))
|
2024-11-26 10:57:25 -03:00
|
|
|
|
2025-01-08 00:19:49 -03:00
|
|
|
return render_template("novo_pagamento.html")
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Rota para listar pagamentos
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/pagamentos")
|
2024-11-26 10:57:25 -03:00
|
|
|
def listar_pagamentos():
|
2025-01-08 00:19:49 -03:00
|
|
|
pagamentos = session.query(Pagamento).all()
|
|
|
|
|
return render_template("listar_pagamentos.html", pagamentos=pagamentos)
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
# Rota para criar um novo material vendido
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/materiais/novo", methods=["GET", "POST"])
|
2024-11-26 10:57:25 -03:00
|
|
|
def novo_material():
|
2025-01-08 00:19:49 -03:00
|
|
|
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")
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
# Rota para listar materiais vendidos
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/materiais")
|
2024-11-26 10:57:25 -03:00
|
|
|
def listar_materiais():
|
2025-01-08 00:19:49 -03:00
|
|
|
materiais = session.query(MaterialVendido).all()
|
|
|
|
|
return render_template("listar_materiais.html", materiais=materiais)
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
# Rota para criar uma nova venda de jornais avulsos
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/jornais/novo", methods=["GET", "POST"])
|
2024-11-26 10:57:25 -03:00
|
|
|
def nova_venda_jornal():
|
2025-01-08 00:19:49 -03:00
|
|
|
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"),
|
|
|
|
|
)
|
|
|
|
|
|
2025-02-20 10:39:31 -03:00
|
|
|
session_run(vendas_jornais_avulsos)
|
2025-01-08 00:19:49 -03:00
|
|
|
return redirect(url_for("listar_vendas_jornal"))
|
2024-11-26 10:57:25 -03:00
|
|
|
|
2025-01-08 00:19:49 -03:00
|
|
|
return render_template("nova_venda_jornal.html")
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Rota para listar vendas de jornais avulsos
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/jornais")
|
2024-11-26 10:57:25 -03:00
|
|
|
def listar_vendas_jornal():
|
2025-01-08 00:19:49 -03:00
|
|
|
vendas = session.query(VendaJornalAvulso).all()
|
|
|
|
|
return render_template("listar_vendas_jornal.html", vendas=vendas)
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
# Rota para criar uma nova assinatura anual
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/assinaturas/novo", methods=["GET", "POST"])
|
2024-11-26 10:57:25 -03:00
|
|
|
def nova_assinatura():
|
2025-01-08 00:19:49 -03:00
|
|
|
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")
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
# Rota para listar assinaturas anuais
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/assinaturas")
|
2024-11-26 10:57:25 -03:00
|
|
|
def listar_assinaturas():
|
2025-01-08 00:19:49 -03:00
|
|
|
assinaturas = session.query(AssinaturaAnual).all()
|
|
|
|
|
return render_template("listar_assinaturas.html", assinaturas=assinaturas)
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
# Rota para criar um novo relatório de cotas mensais
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/relatorios/cotas/novo", methods=["GET", "POST"])
|
2024-11-26 10:57:25 -03:00
|
|
|
def novo_relatorio_cotas():
|
2025-01-08 00:19:49 -03:00
|
|
|
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"))
|
2024-11-26 10:57:25 -03:00
|
|
|
|
2025-01-08 00:19:49 -03:00
|
|
|
return render_template("novo_relatorio_cotas.html")
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Rota para listar relatórios de cotas mensais
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/relatorios/cotas")
|
2024-11-26 10:57:25 -03:00
|
|
|
def listar_relatorios_cotas():
|
2025-01-08 00:19:49 -03:00
|
|
|
relatorios = session.query(RelatorioCotasMensais).all()
|
|
|
|
|
return render_template("listar_relatorios_cotas.html", relatorios=relatorios)
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
# Rota para criar um novo relatório de vendas de materiais
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/relatorios/vendas/novo", methods=["GET", "POST"])
|
2024-11-26 10:57:25 -03:00
|
|
|
def novo_relatorio_vendas():
|
2025-01-08 00:19:49 -03:00
|
|
|
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"))
|
2024-11-26 10:57:25 -03:00
|
|
|
|
2025-01-08 00:19:49 -03:00
|
|
|
return render_template("novo_relatorio_vendas.html")
|
2024-11-26 10:57:25 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Rota para listar relatórios de vendas de materiais
|
2025-01-08 00:19:49 -03:00
|
|
|
@app.route("/relatorios/vendas")
|
2024-11-26 10:57:25 -03:00
|
|
|
def listar_relatorios_vendas():
|
2025-01-08 00:19:49 -03:00
|
|
|
relatorios = session.query(RelatorioVendasMateriais).all()
|
|
|
|
|
return render_template("listar_relatorios_vendas.html", relatorios=relatorios)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/")
|
|
|
|
|
def home():
|
2025-02-20 10:39:31 -03:00
|
|
|
"""Página inicial do sistema"""
|
2025-01-08 00:19:49 -03:00
|
|
|
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 {}))
|
2025-02-20 10:39:31 -03:00
|
|
|
# Substituindo 'home' por 'início' no menu
|
|
|
|
|
endpoint_name = 'Início' if rule.endpoint == 'home' else rule.endpoint
|
|
|
|
|
links.append((url, endpoint_name))
|
2025-02-19 14:27:14 -03:00
|
|
|
|
|
|
|
|
return render_template('home.html', links=links)
|
2025-01-08 00:19:49 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
|
2025-02-20 10:39:31 -03:00
|
|
|
@app.route("/militantes/editar/<int:id>", 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
|
|
|
|
|
|
|
|
|
|
|
2024-11-26 10:57:25 -03:00
|
|
|
# Iniciar o servidor Flask
|
2025-01-08 00:19:49 -03:00
|
|
|
if __name__ == "__main__":
|
|
|
|
|
app.run(debug=True)
|