from flask import Blueprint, render_template, redirect, url_for, request, jsonify, flash from flask_login import login_required from services.pagamento_service import PagamentoService from services.militante_service import MilitanteService from services.tipo_pagamento_service import TipoPagamentoService from functions.decorators import require_permission from utils.date_utils import validar_data, converter_data pagamento_bp = Blueprint('pagamento', __name__, url_prefix='/pagamentos') @pagamento_bp.route("/") @login_required @require_permission('gerenciar_pagamentos') def listar(): """Lista todos os pagamentos""" pagamentos = PagamentoService.listar_pagamentos() militantes = MilitanteService.listar_militantes() tipos_pagamento = TipoPagamentoService.listar_tipos_pagamento() return render_template("listar_pagamentos.html", pagamentos=pagamentos, militantes=militantes, tipos_pagamento=tipos_pagamento) @pagamento_bp.route("/novo", methods=["GET", "POST"]) @login_required @require_permission('gerenciar_pagamentos') def novo(): """Cria um novo pagamento""" if request.method == "POST": militante_id = request.form.get("militante_id") tipo_pagamento_id = request.form.get("tipo_pagamento_id") valor = float(request.form.get("valor")) data_pagamento = converter_data(request.form.get("data_pagamento")) if not validar_data(data_pagamento): flash('Data de pagamento inválida ou futura', 'danger') return redirect(url_for('pagamento.novo')) if PagamentoService.criar_pagamento(militante_id, tipo_pagamento_id, valor, data_pagamento): flash('Pagamento cadastrado com sucesso!', 'success') return redirect(url_for('pagamento.listar')) else: flash('Erro ao cadastrar pagamento', 'danger') return redirect(url_for('pagamento.novo')) # GET militantes = MilitanteService.listar_militantes() tipos_pagamento = TipoPagamentoService.listar_tipos_pagamento() return render_template("novo_pagamento.html", militantes=militantes, tipos_pagamento=tipos_pagamento) @pagamento_bp.route("/adicionar", methods=["POST"]) @login_required @require_permission('gerenciar_pagamentos') def adicionar(): """Adiciona um novo pagamento (via AJAX)""" militante_id = request.form.get("militante_id") tipo_pagamento = request.form.get("tipo_pagamento") valor = float(request.form.get("valor")) data_pagamento = converter_data(request.form.get("data_pagamento")) if PagamentoService.criar_pagamento_simples(militante_id, tipo_pagamento, valor, data_pagamento): return jsonify({ 'status': 'success', 'message': 'Pagamento adicionado com sucesso!' }) else: return jsonify({ 'status': 'error', 'message': 'Erro ao adicionar pagamento' }), 400 @pagamento_bp.route('/editar/', methods=['GET', 'POST']) @login_required @require_permission('gerenciar_pagamentos') def editar(id): """Edita um pagamento existente""" pagamento = PagamentoService.buscar_pagamento(id) if not pagamento: flash('Pagamento não encontrado', 'danger') return redirect(url_for('pagamento.listar')) if request.method == 'POST': militante_id = int(request.form['militante_id']) tipo_pagamento_id = int(request.form['tipo_pagamento_id']) valor = float(request.form['valor']) data_pagamento = converter_data(request.form['data_pagamento']) if PagamentoService.atualizar_pagamento(id, militante_id, tipo_pagamento_id, valor, data_pagamento): flash('Pagamento atualizado com sucesso!', 'success') return redirect(url_for('pagamento.listar')) else: flash('Erro ao atualizar pagamento', 'danger') return redirect(url_for('pagamento.editar', id=id)) militantes = MilitanteService.listar_militantes() tipos_pagamento = TipoPagamentoService.listar_tipos_pagamento() return render_template('editar_pagamento.html', pagamento=pagamento, militantes=militantes, tipos_pagamento=tipos_pagamento) @pagamento_bp.route('/excluir/', methods=['POST']) @login_required @require_permission('gerenciar_pagamentos') def excluir(id): """Exclui um pagamento existente""" if PagamentoService.excluir_pagamento(id): flash('Pagamento excluído com sucesso!', 'success') else: flash('Erro ao excluir pagamento', 'danger') return redirect(url_for('pagamento.listar'))