124 lines
4.7 KiB
Python
124 lines
4.7 KiB
Python
|
|
from flask import Blueprint, render_template, redirect, url_for, request, jsonify, flash
|
||
|
|
from flask_login import login_required
|
||
|
|
|
||
|
|
from models.entities.cota_mensal import CotaMensal
|
||
|
|
from services.cota_service import CotaService
|
||
|
|
from services.militante_service import MilitanteService
|
||
|
|
from functions.decorators import require_permission
|
||
|
|
from utils.date_utils import validar_data, converter_data
|
||
|
|
|
||
|
|
cota_bp = Blueprint('cota', __name__, url_prefix='/cotas')
|
||
|
|
|
||
|
|
@cota_bp.route("/")
|
||
|
|
@login_required
|
||
|
|
@require_permission('gerenciar_cotas')
|
||
|
|
def listar():
|
||
|
|
"""Lista todas as cotas mensais"""
|
||
|
|
cotas = CotaService.listar_cotas()
|
||
|
|
# Calcular status de cada cota
|
||
|
|
for cota in cotas:
|
||
|
|
if cota.pago:
|
||
|
|
cota.status = "paga"
|
||
|
|
elif cota.data_vencimento < datetime.now().date():
|
||
|
|
cota.status = "atrasada"
|
||
|
|
else:
|
||
|
|
cota.status = "pendente"
|
||
|
|
|
||
|
|
militantes = MilitanteService.listar_militantes()
|
||
|
|
return render_template("listar_cotas.html", cotas=cotas, militantes=militantes)
|
||
|
|
|
||
|
|
@cota_bp.route("/novo", methods=["GET", "POST"])
|
||
|
|
@login_required
|
||
|
|
@require_permission('gerenciar_cotas')
|
||
|
|
def nova():
|
||
|
|
"""Cria uma nova cota"""
|
||
|
|
if request.method == "POST":
|
||
|
|
militante_id = request.form.get("militante_id")
|
||
|
|
valor_antigo = float(request.form.get("valor_antigo"))
|
||
|
|
valor_novo = float(request.form.get("valor_novo"))
|
||
|
|
data_alteracao = converter_data(request.form.get("data_alteracao"))
|
||
|
|
data_vencimento = converter_data(request.form.get("data_vencimento"))
|
||
|
|
|
||
|
|
# Validar datas
|
||
|
|
if not validar_data(data_alteracao) or not validar_data(data_vencimento):
|
||
|
|
flash('Datas inválidas', 'danger')
|
||
|
|
return redirect(url_for('cota.nova'))
|
||
|
|
|
||
|
|
result = CotaService.criar_cota(militante_id, valor_antigo, valor_novo,
|
||
|
|
data_alteracao, data_vencimento)
|
||
|
|
|
||
|
|
if result:
|
||
|
|
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
|
||
|
|
return jsonify({
|
||
|
|
'status': 'success',
|
||
|
|
'message': 'Cota cadastrada com sucesso!'
|
||
|
|
})
|
||
|
|
|
||
|
|
flash('Cota cadastrada com sucesso!', 'success')
|
||
|
|
return redirect(url_for('cota.listar'))
|
||
|
|
else:
|
||
|
|
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
|
||
|
|
return jsonify({
|
||
|
|
'status': 'error',
|
||
|
|
'message': 'Erro ao cadastrar cota. Verifique os dados e tente novamente.'
|
||
|
|
}), 400
|
||
|
|
|
||
|
|
flash('Erro ao cadastrar cota', 'danger')
|
||
|
|
return redirect(url_for('cota.nova'))
|
||
|
|
|
||
|
|
# GET
|
||
|
|
militantes = MilitanteService.listar_militantes()
|
||
|
|
return render_template("nova_cota.html", militantes=militantes)
|
||
|
|
|
||
|
|
@cota_bp.route('/editar/<int:id>', methods=['GET', 'POST'])
|
||
|
|
@login_required
|
||
|
|
@require_permission('gerenciar_cotas')
|
||
|
|
def editar(id):
|
||
|
|
"""Edita uma cota existente"""
|
||
|
|
cota = CotaService.buscar_cota(id)
|
||
|
|
if not cota:
|
||
|
|
flash('Cota não encontrada', 'danger')
|
||
|
|
return redirect(url_for('cota.listar'))
|
||
|
|
|
||
|
|
if request.method == 'POST':
|
||
|
|
militante_id = int(request.form['militante_id'])
|
||
|
|
valor_antigo = float(request.form['valor_antigo'])
|
||
|
|
valor_novo = float(request.form['valor_novo'])
|
||
|
|
data_alteracao = converter_data(request.form['data_alteracao'])
|
||
|
|
data_vencimento = converter_data(request.form['data_vencimento'])
|
||
|
|
pago = request.form.get('pago', '').lower() == 'true'
|
||
|
|
|
||
|
|
if CotaService.atualizar_cota(id, militante_id, valor_antigo, valor_novo,
|
||
|
|
data_alteracao, data_vencimento, pago):
|
||
|
|
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
|
||
|
|
return jsonify({
|
||
|
|
'status': 'success',
|
||
|
|
'message': 'Cota atualizada com sucesso!'
|
||
|
|
})
|
||
|
|
|
||
|
|
flash('Cota atualizada com sucesso!', 'success')
|
||
|
|
return redirect(url_for('cota.listar'))
|
||
|
|
else:
|
||
|
|
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
|
||
|
|
return jsonify({
|
||
|
|
'status': 'error',
|
||
|
|
'message': 'Erro ao atualizar cota'
|
||
|
|
}), 400
|
||
|
|
|
||
|
|
flash('Erro ao atualizar cota', 'danger')
|
||
|
|
return redirect(url_for('cota.editar', id=id))
|
||
|
|
|
||
|
|
return render_template('editar_cota.html', cota=cota)
|
||
|
|
|
||
|
|
@cota_bp.route('/excluir/<int:id>', methods=['POST'])
|
||
|
|
@login_required
|
||
|
|
@require_permission('gerenciar_cotas')
|
||
|
|
def excluir(id):
|
||
|
|
"""Exclui uma cota existente"""
|
||
|
|
if CotaService.excluir_cota(id):
|
||
|
|
flash('Cota excluída com sucesso!', 'success')
|
||
|
|
else:
|
||
|
|
flash('Erro ao excluir cota', 'danger')
|
||
|
|
|
||
|
|
return redirect(url_for('cota.listar'))
|