File size: 6,078 Bytes
598343f
00c07d1
 
598343f
 
 
 
8b23ace
598343f
 
 
 
8b23ace
598343f
 
 
c6854f4
 
598343f
8b23ace
598343f
8b23ace
598343f
 
 
 
cba1684
598343f
8b23ace
598343f
b2ea4ec
 
 
 
c6854f4
b2ea4ec
 
c6854f4
598343f
 
 
 
 
cb94e87
 
598343f
 
 
 
 
31ef7c3
598343f
8b23ace
400b909
 
 
9a1c576
 
418e77b
 
9a1c576
8b23ace
598343f
e3b35b0
598343f
5f132f9
598343f
 
8b23ace
598343f
 
 
18cff6e
598343f
 
1cc5547
18cff6e
1cc5547
3d7a722
1cc5547
3d7a722
18cff6e
 
 
3d7a722
1cc5547
 
 
8b23ace
1cc5547
 
 
946c118
399ad9e
 
1cc5547
 
 
 
8b23ace
 
 
3c5c182
1cc5547
 
 
 
 
 
 
 
 
 
8b23ace
 
1cc5547
 
 
 
 
 
14e4292
1fa93e1
9a1c576
14e4292
1cc5547
 
400b909
1cc5547
e3b35b0
14e4292
1cc5547
733f5b0
1cc5547
 
14e4292
1cc5547
 
 
 
 
 
14e4292
1cc5547
 
 
400b909
14e4292
400b909
14e4292
 
 
 
 
 
 
 
400b909
 
 
 
 
e3b35b0
400b909
 
1cc5547
 
8b23ace
3d7a722
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
import pandas as pd
from gradio_calendar import Calendar
import datetime
import plotly.express as px
import plotly.io as pio
import gradio as gr

# Benutzer und Kampagnen-Daten
users = {"PM": "Promo123"}
campaigns = []
sessions = {}

# Login-Funktion
def login(username, password):
    if users.get(username) == password:
        sessions["user"] = username
        return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True), f"Willkommen {username}"
    return gr.update(), gr.update(), gr.update(), "❌ Login fehlgeschlagen"

# Kampagnenvorschlag generieren
def suggest_campaign(product, goal, channel):
    return f"""💡 Idee:
Produkt: {product}
Ziel: {goal}
Kanal: {channel}
🚀 Vorschlag:
Eine kreative {channel}-Kampagne für {product}, z. B. mit exklusiven Angeboten oder Rabattaktionen."""

# Kampagne hinzufügen
def add_campaign(name, goal, product, channel, start, end, budget, responsible):
    try:
        if isinstance(start, str):
            start = datetime.datetime.strptime(start, "%Y-%m-%d")
        if isinstance(end, str):
            end = datetime.datetime.strptime(end, "%Y-%m-%d")
    except Exception as e:
        return pd.DataFrame(campaigns), f"❌ Ungültiges Datum: {e}"

    campaigns.append({
        "Name": name,
        "Ziel": goal,
        "Produkt": product,
        "Kanal": channel,
        "Start": start.strftime("%Y-%m-%d"),
        "Ende": end.strftime("%Y-%m-%d"),
        "Budget (CHF)": budget,
        "Verantwortlich": responsible
    })
    df = pd.DataFrame(campaigns)
    total = df["Budget (CHF)"].sum()
    return df, f"💰 Gesamtbudget: CHF {total:.2f}"

# Kampagne löschen
def delete_campaign_by_name(name):
    global campaigns
    campaigns = [c for c in campaigns if c["Name"] != name]
    df = pd.DataFrame(campaigns)
    total = df["Budget (CHF)"].sum() if not df.empty else 0
    names = [c["Name"] for c in campaigns]
    return df, f"💰 Gesamtbudget: CHF {total:.2f}", gr.update(choices=names, value=None)

# CSV-Export
def export_csv():
    df = pd.DataFrame(campaigns)
    path = "kampagnen.csv"
    df.to_csv(path, index=False, sep=";", encoding="utf-8-sig")
    return path

# Gantt-Diagramm generieren
def generate_gantt():
    if not campaigns:
        return "<i>Keine Kampagnen zum Anzeigen</i>"
    
    df = pd.DataFrame(campaigns)
    df["Start"] = pd.to_datetime(df["Start"])
    df["Ende"] = pd.to_datetime(df["Ende"])
    
    try:
        fig = px.timeline(df, x_start="Start", x_end="Ende", y="Name", color="Verantwortlich", title="📊 Kampagnenübersicht")
        fig.update_yaxes(autorange="reversed")
        fig.update_layout(height=400, margin=dict(l=20, r=20, t=30, b=20))
        
        # Diagramm als HTML exportieren
        html = pio.to_html(fig, full_html=False, include_plotlyjs='cdn')
        return html
    except Exception as e:
        return f"<b>Fehler:</b> {e}"

# Gradio-App
with gr.Blocks() as app:
    # Startseite
    with gr.Column(visible=True) as start_page:
        gr.Image("LA_black.png", label="", show_label=False, interactive=False)
        gr.Markdown("# 👋 Willkommen beim Promo-Planer")
        start_btn = gr.Button("➡️ Starten")

    # Login-Seite
    with gr.Column(visible=False) as login_page:
        gr.Markdown("## 🔐 Login")
        user = gr.Textbox(label="Benutzer")
        pw = gr.Textbox(label="Passwort", type="password")
        login_btn = gr.Button("Login")
        login_status = gr.Textbox(interactive=False, visible=False)

    # Kampagnenplaner-Seite
    with gr.Column(visible=False) as planner_page:
        gr.Markdown("## 📣 Kampagnenplanung")
        with gr.Row():
            name = gr.Textbox(label="Kampagnenname")
            goal = gr.Dropdown(["Verkaufsförderung", "Werbung", "Event"], label="Ziel")
            product = gr.Textbox(label="Produkt")
        with gr.Row():
            channel = gr.Dropdown(["Tisch", "Instagram", "E-Mail", "Plakat"], label="Kanal")
            start = Calendar(type="date", label="Startdatum")
            end = Calendar(type="date", label="Enddatum")
        with gr.Row():
            budget = gr.Number(label="Budget (CHF)")
            responsible = gr.Dropdown(["Markthalle", "Marketing", "PM", "PED"], label="Verantwortlich")
        suggest_btn = gr.Button("💡 KI-Vorschlag")
        idea = gr.Textbox(label="Kampagnenidee")
        submit_btn = gr.Button("✅ Speichern")

        delete_name = gr.Dropdown(label="Kampagne zum Löschen", choices=[], interactive=True)
        delete_btn = gr.Button("🗑️ Kampagne löschen")

        output_table = gr.Dataframe()
        budget_total = gr.Textbox(label="Budget Gesamt", interactive=False)

        export_btn = gr.Button("📤 Export CSV")
        csv_file = gr.File(label="📄 Herunterladen", interactive=False)

        gr.Markdown("### 📈 Gantt-Visualisierung")
        gantt_html = gr.HTML()
        update_chart = gr.Button("🔄 Visualisierung aktualisieren")

    # Seitenwechsel
    def go_to_login():
        return gr.update(visible=False), gr.update(visible=True)

    def go_to_start():
        return gr.update(visible=True), gr.update(visible=False)

    # Button-Logik
    start_btn.click(go_to_login, outputs=[start_page, login_page])
    login_btn.click(login, [user, pw], outputs=[start_page, login_page, planner_page, login_status])
    suggest_btn.click(suggest_campaign, [product, goal, channel], idea)

    # Speichern + Dropdown aktualisieren
    submit_btn.click(
        add_campaign,
        [name, goal, product, channel, start, end, budget, responsible],
        [output_table, budget_total]
    ).then(
        lambda: gr.update(choices=[c["Name"] for c in campaigns], value=None),
        None,
        delete_name
    )

    # Kampagne löschen
    delete_btn.click(delete_campaign_by_name, [delete_name], [output_table, budget_total, delete_name])

    # CSV Export
    export_btn.click(export_csv, outputs=csv_file)

    # Gantt aktualisieren
    update_chart.click(generate_gantt, outputs=gantt_html)

# App starten
app.launch(share=True)