Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pandas as pd | |
from fpdf import FPDF | |
from datetime import datetime | |
import tempfile # Use for temporary file handling | |
import os | |
# Initialize an empty DataFrame to store all records of invoices (acting as our ledger) | |
ledger = pd.DataFrame(columns=["Head", "Company Name", "SP/Station", "Invoice No", "Date", "Amount"]) | |
# Function to add a new invoice under a specific head | |
def add_invoice(head, company_name, sp_station, invoice_no, date, amount): | |
global ledger | |
try: | |
# Add the new record to the ledger | |
new_row = { | |
"Head": head, | |
"Company Name": company_name, | |
"SP/Station": sp_station, | |
"Invoice No": invoice_no, | |
"Date": date, | |
"Amount": float(amount) | |
} | |
ledger = pd.concat([ledger, pd.DataFrame([new_row])], ignore_index=True) | |
# Filter the ledger for the selected head | |
filtered_ledger = ledger[ledger["Head"] == head] | |
# Calculate the total for the selected head | |
total_amount = filtered_ledger["Amount"].sum() | |
return filtered_ledger, f"Total for {head}: {total_amount}" | |
except Exception as e: | |
print(f"Error during adding invoice: {e}") | |
return pd.DataFrame(), "Error during adding invoice" | |
# Function to search and display all previous records by head | |
def search_by_head(head): | |
global ledger | |
try: | |
# Filter the ledger for the selected head | |
filtered_ledger = ledger[ledger["Head"] == head] | |
# Calculate the total for the selected head | |
total_amount = filtered_ledger["Amount"].sum() | |
return filtered_ledger, f"Total for {head}: {total_amount}" | |
except Exception as e: | |
print(f"Error during search by head: {e}") | |
return pd.DataFrame(), "Error during search by head" | |
# Function to generate a PDF report for a specific head | |
def generate_ledger_pdf(head): | |
global ledger | |
try: | |
# Use a temporary directory to save the file | |
with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file: | |
pdf_file_path = tmp_file.name # Get the temporary file path | |
# Create a PDF | |
pdf = FPDF() | |
pdf.add_page() | |
pdf.set_font("Arial", 'B', 16) | |
pdf.cell(200, 10, txt=f"Ledger Report for {head}", ln=True, align="C") | |
pdf.set_font("Arial", size=12) | |
current_date = datetime.now().strftime("%d/%m/%Y") | |
pdf.cell(200, 10, txt=f"Report Date: {current_date}", ln=True, align="C") | |
pdf.ln(10) | |
# Table headers | |
pdf.cell(40, 10, txt="Company Name", border=1, align="C") | |
pdf.cell(40, 10, txt="SP/Station", border=1, align="C") | |
pdf.cell(30, 10, txt="Invoice No", border=1, align="C") | |
pdf.cell(30, 10, txt="Date", border=1, align="C") | |
pdf.cell(50, 10, txt="Amount", border=1, ln=True, align="C") | |
# Filter records by head | |
filtered_ledger = ledger[ledger["Head"] == head] | |
for _, row in filtered_ledger.iterrows(): | |
pdf.cell(40, 10, txt=str(row['Company Name']), border=1, align="C") | |
pdf.cell(40, 10, txt=str(row['SP/Station']), border=1, align="C") | |
pdf.cell(30, 10, txt=str(row['Invoice No']), border=1, align="C") | |
pdf.cell(30, 10, txt=str(row['Date']), border=1, align="C") | |
pdf.cell(50, 10, txt=str(row['Amount']), border=1, ln=True, align="C") | |
# Total amount for the head | |
total_amount = filtered_ledger["Amount"].sum() | |
pdf.cell(140, 10, txt="Total Amount", border=1, align="R") | |
pdf.cell(50, 10, txt=str(total_amount), border=1, ln=True, align="C") | |
# Save PDF file | |
pdf.output(pdf_file_path) | |
# Return the file path for download | |
return pdf_file_path | |
except Exception as e: | |
print(f"Error during PDF generation: {e}") | |
return None | |
# Gradio interface | |
with gr.Blocks() as app: | |
# Section for adding new invoices with Head and Company Name fields | |
with gr.Row(): | |
head = gr.Textbox(label="Head") | |
company_name = gr.Textbox(label="Company Name") | |
sp_station = gr.Textbox(label="SP/Station") | |
invoice_no = gr.Textbox(label="Invoice No") | |
date = gr.Textbox(label="Date") | |
amount = gr.Number(label="Amount") | |
add_button = gr.Button("Add Invoice") | |
# Section for searching and displaying ledger by head | |
with gr.Row(): | |
search_head = gr.Textbox(label="Search by Head") | |
search_button = gr.Button("Search Ledger") | |
ledger_records = gr.DataFrame(label="Ledger Records") | |
total_display = gr.Textbox(label="Total Amount", interactive=False) | |
# Section for generating and displaying PDF link | |
with gr.Row(): | |
generate_pdf_button = gr.Button("Generate PDF") | |
pdf_output = gr.File(label="Download PDF") | |
# Define button functionalities | |
add_button.click(add_invoice, [head, company_name, sp_station, invoice_no, date, amount], [ledger_records, total_display]) | |
def search_ledger(head): | |
filtered_ledger, total = search_by_head(head) | |
return filtered_ledger, total | |
search_button.click(search_ledger, [search_head], [ledger_records, total_display]) | |
def generate_pdf(head): | |
pdf_path = generate_ledger_pdf(head) | |
if pdf_path: | |
return pdf_path | |
else: | |
return None | |
generate_pdf_button.click(generate_pdf, [search_head], [pdf_output]) | |
# Launch the app | |
app.launch(share=True) | |