File size: 4,106 Bytes
a4c390f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import pandas as pd
import os
import shutil
import zipfile
import tempfile
import matplotlib.pyplot as plt
from matplotlib.patches import FancyBboxPatch, Circle, Rectangle
import gradio as gr

def plot_mobile_bank_slip_from_excel(excel_file):
    # Load data from the Excel file
    df = pd.read_excel(excel_file)

    # Create a temporary directory to store images
    temp_dir = tempfile.mkdtemp()
    
    # Iterate over each record and generate the image
    for index, row in df.iterrows():
        status = row['Status']
        reference_no = row['reference_no']
        total_amount = row['total_amount']
        payee_name = row['payee_name']
        to_account_no = row['to_account_no']

        # Create a figure and axis
        fig, ax = plt.subplots(figsize=(6, 10))

        # Draw sections with curved corners
        successful_patch = FancyBboxPatch((0, 0.85), 1, 0.1, boxstyle="round,pad=0.1", ec="none", fc='green' if status == "Successful" else 'yellow' if status == "Pending" else 'Red', alpha=0.5)    
        transaction_patch = FancyBboxPatch((0, 0.4), 1, 0.1, boxstyle="round,pad=0.1", ec="none", fc='lightblue', alpha=0.5)
        ax.add_patch(successful_patch)
        ax.add_patch(transaction_patch)

        # Draw title
        ax.text(0.5, 0.9, "Transaction Status", color='navy', fontsize=24, ha='center')

        # Draw payment status
        ax.text(0.5, 0.85, f" {status}", color='black', fontsize=16, ha='center')

        # Draw transaction ID
        ax.text(0.5, 0.8, f"Reference no: {reference_no}", color='black', fontsize=12, ha='center')

        # Draw total amount
        ax.text(0.5, 0.71, "Total Amount Transferred", color='black', fontsize=12, ha='center')
        ax.text(0.5, 0.67, f"₹{total_amount}", color='black', fontsize=20, ha='center')

        # Extract first letter from first name and last name
        first_name, last_name = payee_name.split() if payee_name else ("?", "?")
        first_initial, last_initial = first_name[0].upper(), last_name[0].upper()

        # Draw circular profile with initials
        profile_circle = Circle((0.5, 0.6), 0.04, color='#05cdf5')
        ax.add_patch(profile_circle)
        ax.text(0.5, 0.6, f"{first_initial}{last_initial}", color='black', fontsize=12, ha='center', va='center')

        # Draw payee details and values
        details = {"Payee": payee_name, "To Account No": to_account_no}
        max_len = max(len(detail) for detail in details.keys())
        for i, (detail, value) in enumerate(details.items()):
            ax.text(0.1, 0.45 - i * 0.06, f"{detail.ljust(max_len)}", color='black', fontsize=14, ha='left')
            ax.text(0.9, 0.45 - i * 0.06, f"{value}", color='black', fontsize=14, ha='right')

        # Draw buttons with symbols
        button_width = 0.50
        button_height = 0.05
        button_x_share = 0.2 - button_width / 2
        button_x_download = 0.75 - button_width / 2
        ax.add_patch(Rectangle((button_x_share, 0.15 - button_height / 2), button_width, button_height, edgecolor='none', facecolor='#f4a460'))
        ax.add_patch(Rectangle((button_x_download, 0.15 - button_height / 2), button_width, button_height, edgecolor='none', facecolor='#34c3eb'))
        ax.text(0.225, 0.15, "Share Receipt", color='white', fontsize=14, ha='center', va='center')
        ax.text(0.75, 0.15, "Download Receipt", color='white', fontsize=14, ha='center', va='center')

        # Set axis limits and remove ticks
        ax.set_xlim(0, 1)
        ax.set_ylim(0, 1)
        ax.axis('off')

        # Save the image
        image_filename = f"{temp_dir}/transaction_{index + 1}.png"
        plt.savefig(image_filename, bbox_inches='tight', pad_inches=0.1)
        plt.close()

    # Create a zip file containing the images
    shutil.make_archive(temp_dir, 'zip', temp_dir)
    zip_file_path = f"{temp_dir}.zip"
    
    return zip_file_path

# Create the Gradio interface
inputs = gr.File(label="Upload Excel File")
outputs = gr.File(label="Download Output Images")
gr.Interface(fn=plot_mobile_bank_slip_from_excel, inputs=inputs, outputs=outputs).launch()