invoice / app.py
atifsial123's picture
Update app.py
10eb027 verified
raw
history blame
5.08 kB
# 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)