Calculator / app.py
MuhammadSajid's picture
Update app.py
e409a7e verified
import gradio as gr
import pandas as pd
import requests
# Function to fetch exchange rates and convert
def currency_exchange(amount_usd, amount_try):
try:
# Fetch exchange rates (USD -> PKR, TRY -> PKR)
url = "https://api.exchangerate.host/latest?base=USD&symbols=PKR,TRY"
response = requests.get(url)
data = response.json()
usd_to_pkr = data["rates"]["PKR"]
usd_to_try = data["rates"]["TRY"]
# Now get TRY -> PKR rate via USD as intermediary
try_to_pkr = usd_to_pkr / usd_to_try
converted_usd = round(amount_usd * usd_to_pkr, 2)
converted_try = round(amount_try * try_to_pkr, 2)
return usd_to_pkr, try_to_pkr, converted_usd, converted_try
except Exception as e:
return f"Error: {e}", None, None, None
# Salary Distributor Function with Tree Structure Output
def salary_distributor_tree(gross, categories_input):
try:
lines = categories_input.strip().split("\n")
categories = []
for line in lines:
parts = line.split(",")
if len(parts) != 3:
continue
name, mode, value = parts
value = float(value)
amount = (gross * value / 100) if mode.strip() == "%" else value
categories.append({
"name": name.strip(),
"mode": mode.strip(),
"value": value,
"amount": round(amount, 2)
})
total_allocated = sum(c["amount"] for c in categories)
remaining = round(gross - total_allocated, 2)
# Create a tree-like representation
tree_lines = [f"Gross Salary: {gross}"]
for cat in categories:
tree_lines.append(f" β”œβ”€ {cat['name']} ({cat['mode']} {cat['value']}): {cat['amount']}")
tree_lines.append(f" └─ Remaining: {remaining}")
tree_str = "\n".join(tree_lines)
df = pd.DataFrame(categories)
return tree_str, df, round(total_allocated, 2), remaining
except Exception as e:
return f"Error: {e}", pd.DataFrame(), 0, 0
with gr.Blocks() as demo:
gr.Markdown("## Salary Distributor Calculator (Tree View) + Currency Exchange")
with gr.Tab("Salary Distributor"):
with gr.Row():
gross_salary = gr.Number(label="Gross Salary", value=1000)
categories_input = gr.Textbox(
label="Categories (name, mode, value)",
value="Taxes,%,20\nSavings,%,10\nRent,fixed,300\nBills,%,5",
lines=6
)
output_tree = gr.Textbox(label="Salary Distribution Tree", lines=10)
output_table = gr.Dataframe(headers=["Category", "Mode", "Value", "Amount"], datatype=["str", "str", "number", "number"])
total_output = gr.Number(label="Total Allocated")
remaining_output = gr.Number(label="Remaining")
run_btn = gr.Button("Calculate")
run_btn.click(fn=salary_distributor_tree, inputs=[gross_salary, categories_input], outputs=[output_tree, output_table, total_output, remaining_output])
with gr.Tab("Currency Exchange"):
with gr.Row():
amount_usd = gr.Number(label="Amount in USD", value=1)
amount_try = gr.Number(label="Amount in TRY", value=1)
usd_to_pkr_rate = gr.Number(label="USD to PKR Rate")
try_to_pkr_rate = gr.Number(label="TRY to PKR Rate")
converted_usd = gr.Number(label="Converted USD to PKR")
converted_try = gr.Number(label="Converted TRY to PKR")
convert_btn = gr.Button("Convert")
convert_btn.click(fn=currency_exchange, inputs=[amount_usd, amount_try], outputs=[usd_to_pkr_rate, try_to_pkr_rate, converted_usd, converted_try])
demo.launch()