diff --git a/app.py b/app.py index c6e24b0..54a38f3 100644 --- a/app.py +++ b/app.py @@ -447,6 +447,7 @@ def listar_cotas(): @app.route("/pagamentos/novo", methods=["GET", "POST"]) @require_login def novo_pagamento(): + """Rota para criar um novo pagamento""" user = current_user # Verificar se o usuário tem permissão para registrar pagamentos em alguma instância @@ -458,24 +459,46 @@ def novo_pagamento(): return redirect(url_for('home')) 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") - ) - - db_session.add(pagamentos) try: - db_session.commit() - return redirect(url_for("listar_pagamentos")) - except Exception as e: - print(e) - db_session.rollback() - flash('Erro ao cadastrar pagamento. Verifique se os dados fornecidos são válidos.', 'error') - return render_template("novo_pagamento.html") + militante_id = request.form.get("militante_id") + tipo_pagamento_id = request.form.get("tipo_pagamento_id") + valor = request.form.get("valor") + data_pagamento = request.form.get("data_pagamento") - return render_template("novo_pagamento.html") + # Validações + if not all([militante_id, tipo_pagamento_id, valor, data_pagamento]): + flash("Todos os campos são obrigatórios.", "danger") + return redirect(url_for("novo_pagamento")) + + # Criar novo pagamento + pagamento = Pagamento( + militante_id=militante_id, + tipo_pagamento_id=tipo_pagamento_id, + valor=float(valor), + data_pagamento=datetime.strptime(data_pagamento, "%Y-%m-%d") + ) + + db_session.add(pagamento) + db_session.commit() + + flash("Pagamento registrado com sucesso!", "success") + return redirect(url_for("listar_pagamentos")) + + except Exception as e: + db_session.rollback() + app.logger.error(f"Erro ao registrar pagamento: {str(e)}") + flash("Erro ao registrar pagamento. Por favor, tente novamente.", "danger") + return redirect(url_for("novo_pagamento")) + + # GET - Renderizar formulário + militantes = db_session.query(Militante).order_by(Militante.nome).all() + tipos_pagamento = db_session.query(TipoPagamento).order_by(TipoPagamento.descricao).all() + hoje = datetime.now().strftime("%Y-%m-%d") + + return render_template("novo_pagamento.html", + militantes=militantes, + tipos_pagamento=tipos_pagamento, + hoje=hoje) # Rota para listar pagamentos @app.route("/pagamentos") diff --git a/static/css/style.css b/static/css/style.css index ddd8790..53ec5d1 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -72,14 +72,109 @@ body { .card { border: none; - border-radius: 10px; - box-shadow: 0 2px 10px rgba(0,0,0,0.05); - transition: transform 0.3s ease; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(0,0,0,0.05); + transition: all 0.3s ease; + overflow: hidden; } .card:hover { transform: translateY(-5px); - box-shadow: 0 4px 15px rgba(0,0,0,0.1); + box-shadow: 0 8px 24px rgba(0,0,0,0.1); +} + +.card .card-body { + padding: 1.5rem; +} + +/* Cards de estatísticas */ +.card.bg-primary { + background: linear-gradient(135deg, #0d6efd, #0a58ca) !important; +} + +.card.bg-success { + background: linear-gradient(135deg, #198754, #146c43) !important; +} + +.card.bg-info { + background: linear-gradient(135deg, #0dcaf0, #0aa2c0) !important; +} + +.card.bg-warning { + background: linear-gradient(135deg, #ffc107, #cc9a06) !important; +} + +.card .fs-1 { + opacity: 0.8; + transition: all 0.3s ease; +} + +.card:hover .fs-1 { + opacity: 1; + transform: scale(1.1); +} + +.card h2 { + font-size: 2.5rem; + font-weight: 600; + margin: 0.5rem 0; +} + +.card h6 { + font-size: 0.9rem; + font-weight: 400; + opacity: 0.9; +} + +.card a { + font-size: 0.9rem; + opacity: 0.9; + transition: all 0.3s ease; +} + +.card a:hover { + opacity: 1; + transform: translateX(5px); +} + +/* Cards de listagem */ +.card .card-header { + background: linear-gradient(to right, var(--secondary-dark), var(--secondary-color)); + color: var(--text-light); + padding: 1rem 1.5rem; + border: none; +} + +.card .card-header h5 { + font-size: 1.1rem; + font-weight: 500; +} + +.list-group-item { + padding: 1rem 1.5rem; + border-left: none; + border-right: none; + transition: all 0.3s ease; +} + +.list-group-item:hover { + background-color: rgba(0,0,0,0.02); + transform: translateX(5px); +} + +.list-group-item h6 { + font-size: 1rem; + font-weight: 500; + margin: 0; +} + +.list-group-item small { + font-size: 0.85rem; +} + +.badge { + padding: 0.5em 0.8em; + font-weight: 500; } .btn-primary { diff --git a/templates/novo_pagamento.html b/templates/novo_pagamento.html index 01c97f0..cd97ba4 100644 --- a/templates/novo_pagamento.html +++ b/templates/novo_pagamento.html @@ -6,80 +6,89 @@