invoice / app.py
atifsial123's picture
Update app.py
1c89f5b verified
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)