Spaces:
Sleeping
Sleeping
File size: 5,639 Bytes
1c89f5b ba7ae20 201dcc1 ba7ae20 cf9d036 ba7ae20 201dcc1 ba7ae20 25ef9d4 201dcc1 ba7ae20 25ef9d4 ba7ae20 25ef9d4 ba7ae20 25ef9d4 ba7ae20 25ef9d4 ba7ae20 5ee9992 ba7ae20 5ee9992 ba7ae20 5ee9992 ba7ae20 5ee9992 ba7ae20 201dcc1 ba7ae20 201dcc1 25ef9d4 cf9d036 25ef9d4 201dcc1 ba7ae20 201dcc1 25ef9d4 ba7ae20 201dcc1 a18fe7e 201dcc1 ba7ae20 25ef9d4 ba7ae20 201dcc1 ba7ae20 201dcc1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
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)
|