Spaces:
Sleeping
Sleeping
# Install necessary libraries in Hugging Face Space | |
!pip install gradio fpdf pandas | |
import gradio as gr | |
import pandas as pd | |
from fpdf import FPDF | |
from datetime import datetime | |
import tempfile # Use this for temporary file handling | |
import os | |
# Initialize an empty DataFrame to store all invoice records | |
invoice_data = pd.DataFrame(columns=["Company Name", "Name", "Invoice No", "Date", "Amount"]) | |
# Function to add new invoice entry and display records by company name | |
def add_invoice(company_name, name, invoice_no, date, amount): | |
global invoice_data | |
try: | |
# Add the new record to the DataFrame | |
new_row = { | |
"Company Name": company_name, | |
"Name": name, | |
"Invoice No": invoice_no, | |
"Date": date, | |
"Amount": float(amount) | |
} | |
invoice_data = pd.concat([invoice_data, pd.DataFrame([new_row])], ignore_index=True) | |
# Filter records by company name | |
filtered_data = invoice_data[invoice_data["Company Name"] == company_name] | |
# Calculate the total amount for that company | |
total_amount = filtered_data["Amount"].sum() | |
return filtered_data, f"Total Amount for {company_name}: {total_amount}" | |
except Exception as e: | |
print(f"Error during adding invoice: {e}") | |
return pd.DataFrame(), "Error during adding invoice" | |
# Function to generate and save the filtered invoice data to a PDF | |
def generate_invoice_pdf(company_name): | |
global invoice_data | |
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"Invoice Report for {company_name}", 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(50, 10, txt="Company Name", border=1, align="C") | |
pdf.cell(40, 10, txt="Name", border=1, align="C") | |
pdf.cell(40, 10, txt="Invoice No", border=1, align="C") | |
pdf.cell(30, 10, txt="Date", border=1, align="C") | |
pdf.cell(30, 10, txt="Amount", border=1, ln=True, align="C") | |
# Filter records by company name | |
filtered_data = invoice_data[invoice_data["Company Name"] == company_name] | |
print(f"Processing {len(filtered_data)} records for {company_name}...") | |
for _, row in filtered_data.iterrows(): | |
pdf.cell(50, 10, txt=str(row['Company Name']), border=1, align="C") | |
pdf.cell(40, 10, txt=str(row['Name']), border=1, align="C") | |
pdf.cell(40, 10, txt=str(row['Invoice No']), border=1, align="C") | |
pdf.cell(30, 10, txt=str(row['Date']), border=1, align="C") | |
pdf.cell(30, 10, txt=str(row['Amount']), border=1, ln=True, align="C") | |
# Total amount | |
total_amount = filtered_data["Amount"].sum() | |
pdf.cell(160, 10, txt="Total Amount", border=1, align="R") | |
pdf.cell(30, 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 "Error: PDF generation failed." | |
# Gradio interface | |
with gr.Blocks() as app: | |
# Section for adding new invoices with Company Name and Name fields | |
with gr.Row(): | |
company_name = gr.Textbox(label="Company Name") | |
name = gr.Textbox(label="Name") | |
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 displaying records and total amount | |
with gr.Row(): | |
invoice_records = gr.DataFrame(label="Invoice Records") | |
total_amount = 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_link = gr.HTML() # To manually display the download link | |
# Define button functionalities | |
add_button.click(add_invoice, [company_name, name, invoice_no, date, amount], [invoice_records, total_amount]) | |
def show_pdf_link(company_name): | |
pdf_path = generate_invoice_pdf(company_name) | |
if pdf_path != "Error: PDF generation failed.": | |
return f'<a href="{pdf_path}" target="_blank">Download PDF</a>' | |
else: | |
return "Error generating PDF." | |
generate_pdf_button.click(show_pdf_link, [company_name], pdf_link) | |
# Launch the app | |
app.launch(share=True) | |