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/', 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/', 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'))