File size: 6,503 Bytes
de01ad6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c99fc58
3e0537a
26e101f
3e0537a
 
26e101f
3e0537a
 
26e101f
3e0537a
 
26e101f
3e0537a
de01ad6
 
 
 
 
78977a5
de01ad6
 
 
 
 
 
 
 
78977a5
de01ad6
 
78977a5
514ef0e
 
 
 
 
 
 
 
 
 
78977a5
514ef0e
 
 
 
78977a5
 
514ef0e
 
78977a5
514ef0e
78977a5
514ef0e
de01ad6
 
78977a5
 
 
 
 
 
 
 
 
 
 
de01ad6
78977a5
 
de01ad6
 
514ef0e
de01ad6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26e101f
 
 
 
de01ad6
 
 
 
 
 
 
 
 
 
 
 
78977a5
 
 
 
 
 
 
 
 
de01ad6
78977a5
 
 
 
 
 
de01ad6
 
 
 
 
 
 
 
 
 
78977a5
514ef0e
de01ad6
 
 
c99fc58
26e101f
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
import os
import pandas as pd
import gradio as gr
from helper import assign_main_accounts, generate_schedule, save_processed_files

UPLOAD_FOLDER = "uploads"
PROCESSED_FOLDER = "processed"
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(PROCESSED_FOLDER, exist_ok=True)

USERNAME = "admin"
PASSWORD = "password123"


# Helper Functions
def login(username, password):
    if username == USERNAME and password == PASSWORD:
        return "Login Successful!", True
    else:
        return "Invalid credentials. Try again.", False


def upload_files(creators_file, overnight_file, day_file, prime_file):
    try:
        # Save each file using its binary data
        with open(os.path.join(UPLOAD_FOLDER, "creators_file.xlsx"), "wb") as f:
            f.write(creators_file)

        with open(os.path.join(UPLOAD_FOLDER, "overnight_file.xlsx"), "wb") as f:
            f.write(overnight_file)

        with open(os.path.join(UPLOAD_FOLDER, "day_file.xlsx"), "wb") as f:
            f.write(day_file)

        with open(os.path.join(UPLOAD_FOLDER, "prime_file.xlsx"), "wb") as f:
            f.write(prime_file)

        return "Files uploaded successfully!"
    except Exception as e:
        return f"Error uploading files: {e}"


def generate_main_accounts(updated_data=None):
    creators_file = os.path.join(UPLOAD_FOLDER, "creators_file.xlsx")
    chatter_files = [
        os.path.join(UPLOAD_FOLDER, "overnight_file.xlsx"),
        os.path.join(UPLOAD_FOLDER, "day_file.xlsx"),
        os.path.join(UPLOAD_FOLDER, "prime_file.xlsx"),
    ]

    if not all(os.path.exists(path) for path in [creators_file] + chatter_files):
        return "Missing required files. Please upload all necessary files.", None

    try:
        if updated_data is not None:
            # Ensure updated_data is in the correct format
            if isinstance(updated_data, pd.DataFrame):
                updated_data = updated_data.to_dict(orient="records")
            
            # Validate updated data structure
            for record in updated_data:
                if not isinstance(record, dict):
                    raise ValueError(f"Invalid record in updated data: {record}")

            # Group updated data by shift
            assignments = {
                shift.lower(): [
                    {key: record[key] for key in record if key != "Shift"}  # Remove the Shift column
                    for record in updated_data if record["Shift"] == shift.capitalize()
                ]
                for shift in ["overnight", "day", "prime"]
            }

            # Save updated assignments
            save_processed_files(assignments, PROCESSED_FOLDER)
            return "Assignments updated successfully!", pd.DataFrame(updated_data)

        # Generate new assignments if no updated data is provided
        main_assignments = assign_main_accounts(creators_file, chatter_files)
        save_processed_files(main_assignments, PROCESSED_FOLDER)

        # Combine all shifts into a single DataFrame for preview
        preview_data = []
        for shift, data in main_assignments.items():
            if shift != "creator_names":  # Skip creator names
                for record in data:
                    record["Shift"] = shift.capitalize()
                    preview_data.append(record)

        preview_df = pd.DataFrame(preview_data)
        return "Main accounts generated successfully!", preview_df
    except Exception as e:
        return f"Error during main account generation: {e}", None




def generate_full_schedule():
    chatter_files = [
        os.path.join(PROCESSED_FOLDER, "Updated_overnight_file.xlsx"),
        os.path.join(PROCESSED_FOLDER, "Updated_day_file.xlsx"),
        os.path.join(PROCESSED_FOLDER, "Updated_prime_file.xlsx"),
    ]
    creators_file = os.path.join(PROCESSED_FOLDER, "creators_file.xlsx")

    if not all(os.path.exists(path) for path in chatter_files + [creators_file]):
        return "Files are missing. Please generate main accounts first."

    try:
        full_schedules = generate_schedule(chatter_files, creators_file)
        return full_schedules
    except Exception as e:
        return f"Error generating full schedule: {e}"


# Gradio Interface
def app():
    with gr.Blocks() as interface:
        with gr.Tab("Login"):
            username = gr.Textbox(label="Username")
            password = gr.Textbox(label="Password", type="password")
            login_btn = gr.Button("Login")
            login_status = gr.Textbox(label="Login Status", interactive=False)

            login_btn.click(login, inputs=[username, password], outputs=[login_status])

        with gr.Tab("Upload Files"):
            creators_file = gr.File(label="Creators File", type="binary")
            overnight_file = gr.File(label="Overnight File", type="binary")
            day_file = gr.File(label="Day File", type="binary")
            prime_file = gr.File(label="Prime File", type="binary")
            upload_btn = gr.Button("Upload Files")
            upload_status = gr.Textbox(label="Upload Status", interactive=False)

            upload_btn.click(
                upload_files,
                inputs=[creators_file, overnight_file, day_file, prime_file],
                outputs=[upload_status],
            )

        with gr.Tab("Generate Main Accounts"):
            generate_main_btn = gr.Button("Generate Main Accounts")
            generate_main_status = gr.Textbox(label="Status", interactive=False)
            preview_table = gr.DataFrame(label="Main Account Assignments Preview", interactive=True)
            update_btn = gr.Button("Update Assignments")

            # Generate assignments and preview
            generate_main_btn.click(
                generate_main_accounts,
                inputs=[],
                outputs=[generate_main_status, preview_table],
            )

            # Update assignments based on supervisor input
            update_btn.click(
                generate_main_accounts,
                inputs=[preview_table],
                outputs=[generate_main_status, preview_table],
            )

        with gr.Tab("Generate Full Schedule"):
            generate_full_btn = gr.Button("Generate Full Schedule")
            full_schedule_output = gr.Textbox(label="Full Schedule", interactive=False)

            generate_full_btn.click(generate_full_schedule, outputs=[full_schedule_output])

    return interface




# Launch Gradio App
if __name__ == "__main__":
    app().launch()