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)