File size: 5,638 Bytes
201dcc1
 
 
cf9d036
a18fe7e
9ff0c52
201dcc1
25ef9d4
 
201dcc1
25ef9d4
 
 
9ff0c52
25ef9d4
9ff0c52
25ef9d4
9ff0c52
25ef9d4
9ff0c52
 
 
 
25ef9d4
9ff0c52
25ef9d4
 
9ff0c52
25ef9d4
 
 
9ff0c52
 
 
 
caaf712
25ef9d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
caaf712
10eb027
 
 
201dcc1
10eb027
 
 
 
25ef9d4
10eb027
 
 
 
5b1e7be
10eb027
25ef9d4
 
 
10eb027
25ef9d4
4094352
25ef9d4
 
10eb027
25ef9d4
 
 
 
10eb027
25ef9d4
201dcc1
25ef9d4
 
 
 
4094352
10eb027
 
 
 
4d05d75
10eb027
caaf712
4094352
a18fe7e
201dcc1
 
 
25ef9d4
201dcc1
25ef9d4
cf9d036
25ef9d4
201dcc1
 
 
 
 
25ef9d4
201dcc1
25ef9d4
 
 
 
201dcc1
4d05d75
201dcc1
 
a18fe7e
201dcc1
 
25ef9d4
4d05d75
25ef9d4
 
 
 
 
 
 
 
a18fe7e
 
4d05d75
a18fe7e
4d05d75
25ef9d4
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
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)