from flask import Blueprint, request, render_template, redirect, url_for, flash, jsonify from functions.database import get_db_session, Pagamento, Militante, TipoPagamento from functions.decorators import require_login from utils.date_utils import validar_data, converter_data from datetime import datetime from flask_login import current_user pagamento_bp = Blueprint('pagamento', __name__) @pagamento_bp.route("/pagamentos/novo", methods=["GET", "POST"]) @require_login def novo(): """Cria um novo pagamento""" if request.method == "POST": db = get_db_session() try: 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')) pagamento = Pagamento( militante_id=militante_id, tipo_pagamento_id=tipo_pagamento_id, valor=valor, data_pagamento=data_pagamento ) db.add(pagamento) db.commit() flash('Pagamento cadastrado com sucesso!', 'success') return redirect(url_for('pagamento.listar')) except Exception as e: db.rollback() flash('Erro ao cadastrar pagamento', 'danger') return redirect(url_for('pagamento.novo')) finally: db.close() # GET - Renderizar formulário db = get_db_session() try: militantes = db.query(Militante).order_by(Militante.nome).all() tipos_pagamento = db.query(TipoPagamento).order_by(TipoPagamento.descricao).all() return render_template("novo_pagamento.html", militantes=militantes, tipos_pagamento=tipos_pagamento) finally: db.close() @pagamento_bp.route("/pagamentos") @require_login def listar(): """Lista todos os pagamentos com controle de permissões no nível de dados""" db = get_db_session() try: # SEMPRE renderizar o template, mas filtrar os dados baseado nas permissões pagamentos = [] # Verificar permissões para filtrar dados if current_user.is_admin: # Admin vê todos pagamentos = db.query(Pagamento).join(Militante).order_by(Pagamento.data_pagamento.desc()).all() elif hasattr(current_user, 'has_permission'): # Outros usuários veem baseado nas suas permissões # Por enquanto, deixar vazio até implementar a lógica específica pagamentos = [] # Buscar dados auxiliares para o template militantes = db.query(Militante).order_by(Militante.nome).all() # SEMPRE renderizar o template, independente das permissões return render_template("listar_pagamentos.html", pagamentos=pagamentos, militantes=militantes) except Exception as e: print(f"Erro no controller de pagamentos: {e}") # Em caso de erro, renderizar com dados vazios return render_template("listar_pagamentos.html", pagamentos=[], militantes=[]) finally: db.close() @pagamento_bp.route("/pagamentos/adicionar", methods=["POST"]) @require_login def adicionar(): """Adiciona um novo pagamento""" if request.method == "POST": db = get_db_session() try: 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")) pagamento = Pagamento( militante_id=militante_id, tipo_pagamento=tipo_pagamento, valor=valor, data_pagamento=data_pagamento ) db.add(pagamento) db.commit() flash('Pagamento adicionado com sucesso!', 'success') except Exception as e: db.rollback() flash(f'Erro ao adicionar pagamento: {str(e)}', 'danger') finally: db.close() return redirect(url_for('pagamento.listar')) @pagamento_bp.route('/celulas//pagamentos') @require_login def list_pagamentos_celula(celula_id): """Lista pagamentos de uma célula específica""" db = get_db_session() try: pagamentos = db.query(Pagamento).filter_by(celula_id=celula_id).all() return render_template('pagamentos/list.html', pagamentos=pagamentos) finally: db.close() @pagamento_bp.route('/setores//pagamentos') @require_login def list_pagamentos_setor(setor_id): """Lista pagamentos de um setor específico""" db = get_db_session() try: pagamentos = db.query(Pagamento).join(Usuario).filter(Usuario.setor_id == setor_id).all() return render_template('pagamentos/list.html', pagamentos=pagamentos) finally: db.close() @pagamento_bp.route('/crs//pagamentos') @require_login def list_pagamentos_cr(cr_id): """Lista pagamentos de um CR específico""" db = get_db_session() try: pagamentos = db.query(Pagamento).join(Usuario).filter(Usuario.cr_id == cr_id).all() return render_template('pagamentos/list.html', pagamentos=pagamentos) finally: db.close() @pagamento_bp.route('/celulas//pagamentos/novo', methods=['GET', 'POST']) @require_login def novo_pagamento_celula(celula_id): """Cria novo pagamento para uma célula""" if request.method == 'POST': db = get_db_session() try: pagamento = Pagamento( valor=request.form['valor'], data=request.form['data'], militante_id=request.form['militante_id'], celula_id=celula_id ) db.add(pagamento) db.commit() flash('Pagamento registrado com sucesso!', 'success') return redirect(url_for('pagamento.list_pagamentos_celula', celula_id=celula_id)) finally: db.close() return render_template('pagamentos/form.html') @pagamento_bp.route('/setores//pagamentos/novo', methods=['GET', 'POST']) @require_login def novo_pagamento_setor(setor_id): """Cria novo pagamento para um setor""" if request.method == 'POST': db = get_db_session() try: pagamento = Pagamento( valor=request.form['valor'], data=request.form['data'], militante_id=request.form['militante_id'], setor_id=setor_id ) db.add(pagamento) db.commit() flash('Pagamento registrado com sucesso!', 'success') return redirect(url_for('pagamento.list_pagamentos_setor', setor_id=setor_id)) finally: db.close() return render_template('pagamentos/form.html') @pagamento_bp.route('/crs//pagamentos/novo', methods=['GET', 'POST']) @require_login def novo_pagamento_cr(cr_id): """Cria novo pagamento para um CR""" if request.method == 'POST': db = get_db_session() try: pagamento = Pagamento( valor=request.form['valor'], data=request.form['data'], militante_id=request.form['militante_id'], cr_id=cr_id ) db.add(pagamento) db.commit() flash('Pagamento registrado com sucesso!', 'success') return redirect(url_for('pagamento.list_pagamentos_cr', cr_id=cr_id)) finally: db.close() return render_template('pagamentos/form.html')