| import gradio as gr |
| from datetime import date |
|
|
|
|
| |
| |
| |
|
|
| def adicionar_transacao(tipo, descricao, categoria, valor, data, transacoes): |
| if not descricao: |
| return transacoes, atualizar_resumo(transacoes), "Digite uma descrição." |
|
|
| if not valor or valor <= 0: |
| return transacoes, atualizar_resumo(transacoes), "Digite um valor maior que zero." |
|
|
| nova_transacao = { |
| "tipo": tipo, |
| "descricao": descricao, |
| "categoria": categoria, |
| "valor": valor, |
| "data": data |
| } |
|
|
| transacoes.append(nova_transacao) |
|
|
| return ( |
| transacoes, |
| atualizar_resumo(transacoes), |
| f"✅ {tipo} adicionada com sucesso!" |
| ) |
|
|
|
|
| def atualizar_resumo(transacoes): |
| receitas = sum( |
| t["valor"] for t in transacoes |
| if t["tipo"] == "Receita" |
| ) |
|
|
| despesas = sum( |
| t["valor"] for t in transacoes |
| if t["tipo"] == "Despesa" |
| ) |
|
|
| saldo = receitas - despesas |
|
|
| texto = f""" |
| ## 💰 Resumo financeiro |
| |
| **Receitas:** R$ {receitas:,.2f} |
| |
| **Despesas:** R$ {despesas:,.2f} |
| |
| **Saldo:** R$ {saldo:,.2f} |
| |
| **Quantidade de lançamentos:** {len(transacoes)} |
| """ |
|
|
| return texto |
|
|
|
|
| def mostrar_transacoes(transacoes): |
| if not transacoes: |
| return "Nenhuma transação cadastrada." |
|
|
| texto = "## 📋 Transações\n\n" |
|
|
| for i, t in enumerate(reversed(transacoes), 1): |
| sinal = "+" if t["tipo"] == "Receita" else "-" |
|
|
| texto += ( |
| f"**{i}. {t['descricao']}** \n" |
| f"📅 {t['data']} | 🏷️ {t['categoria']} \n" |
| f"{sinal} R$ {t['valor']:,.2f} \n\n" |
| ) |
|
|
| return texto |
|
|
|
|
| def adicionar_e_atualizar( |
| tipo, |
| descricao, |
| categoria, |
| valor, |
| data, |
| transacoes |
| ): |
| novas_transacoes, resumo, mensagem = adicionar_transacao( |
| tipo, |
| descricao, |
| categoria, |
| valor, |
| data, |
| transacoes |
| ) |
|
|
| lista = mostrar_transacoes(novas_transacoes) |
|
|
| return ( |
| novas_transacoes, |
| resumo, |
| lista, |
| mensagem, |
| "", |
| None |
| ) |
|
|
|
|
| def limpar_transacoes(): |
| transacoes = [] |
|
|
| return ( |
| transacoes, |
| atualizar_resumo(transacoes), |
| mostrar_transacoes(transacoes), |
| "🗑️ Todas as transações foram apagadas." |
| ) |
|
|
|
|
| |
| |
| |
|
|
| with gr.Blocks( |
| title="Meu Controle Financeiro" |
| ) as app: |
|
|
| transacoes = gr.State([]) |
|
|
| gr.Markdown( |
| """ |
| # 💰 Meu Controle Financeiro |
| |
| Controle suas **receitas, despesas e saldo** de forma simples. |
| """ |
| ) |
|
|
| with gr.Row(): |
|
|
| with gr.Column(): |
|
|
| gr.Markdown("## ➕ Nova transação") |
|
|
| tipo = gr.Radio( |
| ["Receita", "Despesa"], |
| value="Despesa", |
| label="Tipo" |
| ) |
|
|
| descricao = gr.Textbox( |
| label="Descrição", |
| placeholder="Ex: Supermercado" |
| ) |
|
|
| categoria = gr.Dropdown( |
| [ |
| "Alimentação", |
| "Transporte", |
| "Moradia", |
| "Contas", |
| "Lazer", |
| "Saúde", |
| "Educação", |
| "Salário", |
| "Investimentos", |
| "Outros" |
| ], |
| value="Outros", |
| label="Categoria" |
| ) |
|
|
| valor = gr.Number( |
| label="Valor (R$)", |
| minimum=0 |
| ) |
|
|
| data = gr.Textbox( |
| label="Data", |
| value=str(date.today()) |
| ) |
|
|
| adicionar = gr.Button( |
| "➕ Adicionar", |
| variant="primary" |
| ) |
|
|
| mensagem = gr.Markdown() |
|
|
| with gr.Column(): |
|
|
| resumo = gr.Markdown( |
| atualizar_resumo([]) |
| ) |
|
|
| gr.Markdown("---") |
|
|
| lista = gr.Markdown( |
| "Nenhuma transação cadastrada." |
| ) |
|
|
| apagar = gr.Button( |
| "🗑️ Apagar todas as transações" |
| ) |
|
|
| adicionar.click( |
| adicionar_e_atualizar, |
| inputs=[ |
| tipo, |
| descricao, |
| categoria, |
| valor, |
| data, |
| transacoes |
| ], |
| outputs=[ |
| transacoes, |
| resumo, |
| lista, |
| mensagem, |
| descricao, |
| valor |
| ] |
| ) |
|
|
| apagar.click( |
| limpar_transacoes, |
| outputs=[ |
| transacoes, |
| resumo, |
| lista, |
| mensagem |
| ] |
| ) |
|
|
|
|
| if __name__ == "__main__": |
| app.launch() |