Spaces:
Sleeping
Sleeping
import gspread | |
from google.oauth2 import service_account | |
import gradio as gr | |
import pandas as pd | |
from fpdf import FPDF | |
from datetime import datetime | |
import os | |
from pathlib import Path | |
# Caminho para o arquivo JSON de credenciais | |
SERVICE_ACCOUNT_FILE = "credenciais.json" | |
# Escopos da API do Google Sheets | |
SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly"] | |
# Carregar credenciais | |
gcredentials = service_account.Credentials.from_service_account_file( | |
SERVICE_ACCOUNT_FILE, scopes=SCOPES | |
) | |
# Autenticar com gspread | |
gc = gspread.authorize(gcredentials) | |
# ID da planilha | |
SPREADSHEET_ID = "1AnSQ1qHdf6vy0rC0_mgKo2gCzH1EhVumgcagPS2TRAI" | |
# Função para buscar imóveis | |
def consultar_imoveis(bairro, valor_maximo, metragem_minima, estagio): | |
try: | |
sheet = gc.open_by_key(SPREADSHEET_ID).sheet1 | |
dados = sheet.get_all_records() | |
bairro_informado = bairro.strip().lower() | |
valor_maximo = float(valor_maximo) | |
metragem_minima = float(metragem_minima) | |
estagio = estagio.strip().lower() | |
resultado = [] | |
for imovel in dados: | |
imovel_bairro = imovel.get("bairro", "").strip().lower() | |
imovel_valor = float(imovel.get("valor", 0)) | |
imovel_metragem = float(imovel.get("metragem", 0)) | |
imovel_estagio = imovel.get("estagio", "").strip().lower() | |
if bairro_informado in imovel_bairro and \ | |
imovel_valor <= valor_maximo and \ | |
imovel_metragem >= metragem_minima and \ | |
(estagio == "todos" or imovel_estagio == estagio): | |
resultado.append(imovel) | |
if not resultado: | |
return pd.DataFrame([{"Mensagem": "Nenhum imóvel encontrado para os critérios informados."}]) | |
df = pd.DataFrame(resultado) | |
colunas_longas = ["Região", "lazer", "diferenciais"] | |
for col in colunas_longas: | |
if col in df.columns: | |
df[col] = df[col].apply(lambda x: str(x).replace(". ", ".\n").replace(", ", ",\n")) | |
return df | |
except Exception as e: | |
return pd.DataFrame([{"Erro": str(e)}]) | |
# Função para gerar PDF com nome personalizado e melhor formatação | |
from collections import defaultdict | |
def gerar_pdf_com_nome(dados, bairro_usuario): | |
try: | |
if not isinstance(dados, pd.DataFrame) or dados.empty: | |
return None | |
pdf = FPDF() | |
pdf.add_page() | |
pdf.set_font("Arial", size=10) | |
agrupados = defaultdict(list) | |
for _, row in dados.iterrows(): | |
id_imovel = row.get("ID", row.get("id", _)) | |
agrupados[id_imovel].append(row) | |
for id_, imoveis in agrupados.items(): | |
primeiro = imoveis[0] | |
pdf.multi_cell(0, 8, f"ID: {id_}") | |
pdf.multi_cell(0, 8, f"Bairro: {primeiro.get('bairro', '')}") | |
pdf.multi_cell(0, 8, f"Valor: {primeiro.get('valor', '')}") | |
for imovel in imoveis: | |
pdf.multi_cell(0, 8, f"Metragem: {imovel.get('metragem', '')} m²") | |
pdf.ln(2) | |
if "Região" in primeiro: | |
pdf.multi_cell(0, 8, f"Região: {primeiro['Região']}") | |
if "lazer" in primeiro: | |
pdf.multi_cell(0, 8, f"Lazer: {primeiro['lazer']}") | |
if "diferenciais" in primeiro: | |
pdf.multi_cell(0, 8, f"Diferenciais: {primeiro['diferenciais']}") | |
if "estagio" in primeiro: | |
pdf.multi_cell(0, 8, f"Estágio: {primeiro['estagio']}") | |
pdf.ln(5) | |
bairro_slug = bairro_usuario.strip().lower().replace(" ", "_") | |
data_str = datetime.now().strftime("%Y-%m-%d") | |
output_dir = Path("/mnt/data") | |
output_dir.mkdir(parents=True, exist_ok=True) | |
output_path = output_dir / f"imoveis_{bairro_slug}_{data_str}.pdf" | |
pdf.output(str(output_path)) | |
return str(output_path) if output_path.exists() else None | |
except Exception as e: | |
print("Erro ao gerar PDF:", e) | |
return None | |
# Interface Gradio | |
estagios_opcoes = ["Todos", "na planta", "em construção", "pronto para morar"] | |
with gr.Blocks(css=""" | |
.gr-box { background-color: #f9f9f9; padding: 20px; border-radius: 12px; box-shadow: 0px 2px 5px rgba(0,0,0,0.1); } | |
label { font-weight: bold; } | |
.gr-button { margin-top: 10px; } | |
""") as demo: | |
with gr.Row(): | |
with gr.Column(): | |
bairro = gr.Textbox(label="Bairro") | |
valor = gr.Number(label="Valor Máximo") | |
metragem = gr.Number(label="Metragem Mínima") | |
estagio_dropdown = gr.Dropdown(choices=estagios_opcoes, value="Todos", label="Estágio da Obra") | |
with gr.Row(): | |
buscar_btn = gr.Button("Buscar", elem_classes="gr-button") | |
limpar_btn = gr.Button("Limpar", elem_classes="gr-button") | |
exportar_btn = gr.Button("Gerar PDF", elem_classes="gr-button") | |
resultado = gr.Dataframe(headers=None, interactive=False) | |
pdf_output = gr.File(label="Download PDF") | |
def limpar_campos(): | |
return "", 0, 0, "Todos", pd.DataFrame() | |
buscar_btn.click(fn=consultar_imoveis, | |
inputs=[bairro, valor, metragem, estagio_dropdown], | |
outputs=resultado) | |
limpar_btn.click(fn=limpar_campos, inputs=[], outputs=[bairro, valor, metragem, estagio_dropdown, resultado]) | |
def gerar_e_verificar_pdf(dados, bairro): | |
caminho = gerar_pdf_com_nome(dados, bairro) | |
if caminho: | |
return gr.File.update(value=caminho, visible=True) | |
return gr.File.update(value=None, visible=False) | |
exportar_btn.click( | |
fn=gerar_e_verificar_pdf, | |
inputs=[resultado, bairro], | |
outputs=pdf_output | |
) | |
if __name__ == "__main__": | |
demo.launch(server_port=7860) | |