File size: 5,075 Bytes
10eb027
 
 
201dcc1
 
 
cf9d036
10eb027
9ff0c52
201dcc1
caaf712
cf9d036
201dcc1
caaf712
cf9d036
201dcc1
9ff0c52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
caaf712
 
9ff0c52
caaf712
 
10eb027
 
 
201dcc1
10eb027
 
 
 
 
 
 
 
 
5b1e7be
10eb027
 
 
 
 
 
4094352
10eb027
 
 
 
 
 
 
 
 
 
201dcc1
10eb027
 
 
 
4094352
10eb027
 
 
 
4d05d75
10eb027
caaf712
4094352
 
201dcc1
 
 
cf9d036
201dcc1
cf9d036
 
201dcc1
 
 
 
 
 
 
 
 
 
4d05d75
201dcc1
 
4d05d75
201dcc1
 
cf9d036
4d05d75
 
9ff0c52
4d05d75
 
 
 
 
 
201dcc1
 
 
04dac16
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
# 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)