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 "Keine Kampagnen zum Anzeigen" 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"Fehler: {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)