Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| from fpdf import FPDF | |
| from datetime import datetime | |
| import tempfile | |
| 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] | |
| # Return filtered ledger and the sum of amounts for this head | |
| total_amount = filtered_ledger["Amount"].sum() | |
| # Return only the relevant rows and total to speed up processing | |
| return filtered_ledger.to_dict('records'), f"Total for {head}: {total_amount}" | |
| except Exception as 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.to_dict('records'), f"Total for {head}: {total_amount}" | |
| except Exception as 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: | |
| # Filter records by head | |
| filtered_ledger = ledger[ledger["Head"] == head] | |
| if filtered_ledger.empty: | |
| return None | |
| # Use a temporary directory to save the file | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file: | |
| pdf_file_path = tmp_file.name | |
| # 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") | |
| # Add table rows | |
| 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 = 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 the PDF | |
| pdf.output(pdf_file_path) | |
| # Return the path of the generated PDF | |
| return pdf_file_path | |
| except Exception as e: | |
| return None | |
| # Gradio interface | |
| with gr.Blocks() as app: | |
| 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") | |
| 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) | |
| 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]) | |
| search_button.click(search_by_head, [search_head], [ledger_records, total_display]) | |
| generate_pdf_button.click(generate_ledger_pdf, [search_head], [pdf_output]) | |
| # Launch the app | |
| app.launch(share=True) | |