from flask import Flask, render_template, request, redirect, session, url_for, send_file from datetime import datetime from supabase_client import supabase from dotenv import load_dotenv import os import io from weasyprint import HTML load_dotenv() app = Flask(__name__) app.secret_key = os.urandom(24) def calcular_total(dados): area = float(dados.get('area', 0)) quartos = int(dados.get('quartos', 0)) banheiros = int(dados.get('banheiros', 0)) padrao = dados.get('padrao', 'simples') fator = {'simples': 1000, 'medio': 1500, 'luxo': 2000}.get(padrao, 1000) total = (area * fator) + (quartos * 5000) + (banheiros * 7000) return total # --------- Autenticação --------- @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': email = request.form['email'] senha = request.form['senha'] result = supabase.auth.sign_in_with_password({'email': email, 'password': senha}) if result.user: session['user_id'] = result.user.id return redirect('/dashboard') else: return render_template('login.html', erro="Login inválido") return render_template('login.html') @app.route('/logout') def logout(): session.clear() return redirect('/login') def login_required(f): def wrapper(*args, **kwargs): if 'user_id' not in session: return redirect('/login') return f(*args, **kwargs) wrapper.__name__ = f.__name__ return wrapper # --------- Dashboard --------- @app.route('/dashboard') @login_required def dashboard(): user_id = session['user_id'] orcamentos = supabase.table('orcamentos').select('*').eq('user_id', user_id).execute().data return render_template('dashboard.html', orcamentos=orcamentos) # --------- Criar Orçamento --------- @app.route('/orcamento/novo', methods=['GET', 'POST']) @login_required def novo_orcamento(): if request.method == 'POST': dados = request.form total = calcular_total(dados) supabase.table('orcamentos').insert({ 'user_id': session['user_id'], 'cliente': dados['cliente'], 'endereco': dados['endereco'], 'area': float(dados['area']), 'quartos': int(dados['quartos']), 'banheiros': int(dados['banheiros']), 'padrao': dados['padrao'], 'total': total, 'data': datetime.now().isoformat() }).execute() return redirect('/dashboard') return render_template('form_orcamento.html') # --------- Visualizar --------- @app.route('/orcamento/') @login_required def visualizar_orcamento(orc_id): user_id = session['user_id'] orc = supabase.table('orcamentos').select('*').eq('id', orc_id).eq('user_id', user_id).single().execute().data if not orc: return "Orçamento não encontrado", 404 return render_template('visualizar_orcamento.html', orc=orc) # --------- Editar --------- @app.route('/orcamento//editar', methods=['GET', 'POST']) @login_required def editar_orcamento(orc_id): user_id = session['user_id'] orc = supabase.table('orcamentos').select('*').eq('id', orc_id).eq('user_id', user_id).single().execute().data if not orc: return "Orçamento não encontrado", 404 if request.method == 'POST': dados = request.form total = calcular_total(dados) supabase.table('orcamentos').update({ 'cliente': dados['cliente'], 'endereco': dados['endereco'], 'area': float(dados['area']), 'quartos': int(dados['quartos']), 'banheiros': int(dados['banheiros']), 'padrao': dados['padrao'], 'total': total }).eq('id', orc_id).execute() return redirect('/dashboard') return render_template('form_orcamento.html', orc=orc) # --------- Excluir --------- @app.route('/orcamento//excluir') @login_required def excluir_orcamento(orc_id): user_id = session['user_id'] supabase.table('orcamentos').delete().eq('id', orc_id).eq('user_id', user_id).execute() return redirect('/dashboard') # --------- Geração PDF --------- @app.route('/orcamento//pdf') @login_required def gerar_pdf(orc_id): user_id = session['user_id'] orc = supabase.table('orcamentos').select('*').eq('id', orc_id).eq('user_id', user_id).single().execute().data if not orc: return "Orçamento não encontrado", 404 html = render_template('contrato_pdf.html', orc=orc) pdf = HTML(string=html).write_pdf() return send_file(io.BytesIO(pdf), download_name="contrato.pdf", as_attachment=True) # --------- Run Hugging Face --------- if __name__ == '__main__': app.run(host="0.0.0.0", port=int(os.environ.get('PORT', 7860)))