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)