From 23f13a7a811aca7034a26fe717294e1525c38a6d Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 23 Feb 2026 10:08:43 +0000 Subject: [PATCH] [2ff88f42] Add update_verticals_phase2.py for Notion Pains & Gains update --- .../update_verticals_phase2.py | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 company-explorer/backend/scripts/notion_maintenance/update_verticals_phase2.py diff --git a/company-explorer/backend/scripts/notion_maintenance/update_verticals_phase2.py b/company-explorer/backend/scripts/notion_maintenance/update_verticals_phase2.py new file mode 100644 index 00000000..9afb4c76 --- /dev/null +++ b/company-explorer/backend/scripts/notion_maintenance/update_verticals_phase2.py @@ -0,0 +1,162 @@ +import os +import requests +import json +from dotenv import load_dotenv + +# Load environment variables +load_dotenv() + +NOTION_API_KEY = os.getenv("NOTION_API_KEY") +NOTION_DB_VERTICALS = "2ec88f4285448014ab38ea664b4c2b81" + +if not NOTION_API_KEY: + print("Error: NOTION_API_KEY not found.") + exit(1) + +headers = { + "Authorization": f"Bearer {NOTION_API_KEY}", + "Notion-Version": "2022-06-28", + "Content-Type": "application/json" +} + +# The approved changes from ANALYSIS_AND_PROPOSAL.md for Phase 2 +UPDATES = { + "Energy - Solar/Wind": { + "Pains": """[Primary Product: Security] +- Kupfer-Diebstahl: Professionelle Banden plündern abgelegene Parks in Minuten; der Schaden durch Betriebsunterbrechung übersteigt den Materialwert oft weit. +- Interventionszeit: Bis der Wachdienst eintrifft ("Blaulicht-Fahrt"), sind die Täter längst verschwunden. +- Kostenfalle Falschalarm: Wildtiere oder wetterbedingte Störungen lösen teure, unnötige Polizeieinsätze aus.""", + "Gains": """[Primary Product: Security] +- Sofort-Verifikation: KI-gestützte Erkennung unterscheidet zuverlässig zwischen Tier und Mensch und liefert Live-Bilder in Sekunden. +- Präventive Abschreckung: Autonome Patrouillen signalisieren "Hier wird bewacht" und verhindern den Versuch. +- Lückenlose Beweissicherung: Gerichtsfeste Dokumentation von Vorfällen für Versicherung und Strafverfolgung.""" + }, + "Infrastructure - Public": { + "Pains": """[Primary Product: Cleaning Indoor] +- Zeitdruck (Turnaround): Zwischen Messe-Ende und Öffnung am nächsten Tag liegen nur wenige Stunden für eine Komplettreinigung. +- Kostenspirale: Nacht- und Wochenendzuschläge für manuelles Personal belasten das Budget massiv. +- Personalverfügbarkeit: Für Spitzenlasten (Messezeiten) ist kurzfristig kaum ausreichendes Personal zu finden. + +[Secondary Product: Cleaning Outdoor] +- Erster Eindruck: Vermüllte Vorplätze und Zufahrten schaden dem Image der Veranstaltung schon bei Ankunft.""", + "Gains": """[Primary Product: Cleaning Indoor] +- Planbare Kapazität: Roboter reinigen autonom die Kilometer langen Gänge ("Gang-Reinigung"), Personal fokussiert sich auf Stände und Details. +- Kosteneffizienz: Fixe Kosten statt variabler Zuschläge für Nachtarbeit. + +[Secondary Product: Cleaning Outdoor] +- Repräsentative Außenwirkung: Sauberer Empfangsbereich ohne permanenten Personaleinsatz.""" + }, + "Infrastructure - Transport": { + "Pains": """[Primary Product: Cleaning Indoor] +- Sicherheits-Checks: Jede externe Reinigungskraft im Sicherheitsbereich erfordert aufwändige Überprüfungen (ZÜP) und Begleitung. +- Passagier-Störung: Laute, manuelle Reinigungsmaschinen behindern Laufwege und Durchsagen im 24/7-Betrieb. +- Hochfrequenz-Verschmutzung: Kaffee-Flecken und Nässe (Winter) müssen sofort beseitigt werden, um Rutschunfälle zu vermeiden. + +[Secondary Product: Cleaning Outdoor] +- Müll-Aufkommen: Raucherbereiche und Taxi-Spuren verkommen schnell durch Zigarettenstummel und Kleinmüll.""", + "Gains": """[Primary Product: Cleaning Indoor] +- "Approved Staff": Roboter verbleibt im Sicherheitsbereich – kein täglicher Check-in/Check-out nötig. +- Silent Cleaning: Leise, autonome Navigation zwischen Passagieren stört den Betriebsablauf nicht. + +[Secondary Product: Cleaning Outdoor] +- Sauberer Transfer: Gepflegte Außenanlagen als Visitenkarte der Mobilitätsdrehscheibe.""" + }, + "Retail - Shopping Center": { + "Pains": """[Primary Product: Cleaning Indoor] +- Food-Court-Chaos: Zu Stoßzeiten kommen Reinigungskräfte mit dem Wischen von verschütteten Getränken und Essensresten kaum nach. +- Rutschfallen: Nasse Eingänge (Regen) und verschmutzte Zonen sind Haftungsrisiken für den Betreiber. +- Image-Faktor: Ein "grauer" oder fleckiger Boden senkt die Aufenthaltsqualität und damit die Verweildauer der Kunden. + +[Secondary Product: Cleaning Outdoor] +- Parkplatz-Pflege: Müll auf Parkplätzen und in Parkhäusern ist der erste negative Touchpoint für Besucher.""", + "Gains": """[Primary Product: Cleaning Indoor] +- Reaktionsschnelligkeit: Roboter sind permanent präsent und beseitigen Malheure sofort, bevor sie antrocknen. +- Hochglanz-Optik: Konstante Pflege poliert den Steinboden und sorgt für ein hochwertiges Ambiente. + +[Secondary Product: Cleaning Outdoor] +- Willkommens-Kultur: Sauberer Außenbereich lädt zum Betreten ein.""" + }, + "Leisure - Wet & Spa": { + "Pains": """[Primary Product: Cleaning Indoor] +- Rutsch-Unfälle: Staunässe auf Fliesen ist die Unfallursache Nummer 1 in Bädern – hohes Haftungsrisiko. +- Hygiene-Sensibilität: Im Barfußbereich (Umkleiden/Gänge) erwarten Gäste klinische Sauberkeit; Haare und Fussel sind "Ekel-Faktor". +- Personal-Konflikt: Fachangestellte für Bäderbetriebe sollen die Beckenaufsicht führen (Sicherheit), nicht wischen.""", + "Gains": """[Primary Product: Cleaning Indoor] +- Permanente Sicherheit: Roboter trocknen Laufwege kontinuierlich und minimieren das Rutschrisiko aktiv. +- Entlastung der Aufsicht: Bademeister können sich zu 100% auf die Sicherheit der Badegäste konzentrieren. +- Hygiene-Standard: Dokumentierte Desinfektion und Reinigung sichert Top-Bewertungen.""" + }, + "Corporate - Campus": { + "Pains": """[Primary Product: Cleaning Indoor] +- Repräsentativität: Empfangshallen und Atrien sind das Aushängeschild – sichtbarer Staub oder Schlieren wirken unprofessionell. +- Kostendruck Facility: Enorme Flächen (Flure/Verbindungsgänge) erzeugen hohe laufende Reinigungskosten. + +[Secondary Product: Cleaning Outdoor] +- Campus-Pflege: Weitläufige Außenanlagen manuell sauber zu halten, bindet unverhältnismäßig viele Ressourcen.""", + "Gains": """[Primary Product: Cleaning Indoor] +- Innovations-Statement: Einsatz von Robotik unterstreicht den technologischen Führungsanspruch des Unternehmens gegenüber Besuchern und Bewerbern. +- Konstante Qualität: Einheitliches Sauberkeitsniveau in allen Gebäudeteilen, unabhängig von Tagesform oder Krankenstand. + +[Secondary Product: Cleaning Outdoor] +- Gepflegtes Erscheinungsbild: Automatisierte Kehrleistung sorgt für repräsentative Wege und Plätze.""" + }, + "Reinigungsdienstleister": { + "Pains": """[Primary Product: Cleaning Indoor] +- Personal-Mangel & Fluktuation: Hohe "No-Show"-Quoten und ständige Neurekrutierung binden Objektleiter massiv und gefährden die Vertragserfüllung. +- Margen-Verfall: Steigende Tariflöhne bei gleichzeitigem Preisdruck der Auftraggeber lassen kaum noch Gewinn zu. +- Qualitäts-Schwankungen: Wechselndes, ungelernte Personal liefert oft unzureichende Ergebnisse, was zu Reklamationen und Kürzungen führt.""", + "Gains": """[Primary Product: Cleaning Indoor] +- Kalkulations-Sicherheit: Roboter bieten fixe Kosten statt unkalkulierbarer Krankheits- und Ausfallrisiken. +- Wettbewerbsvorteil: Mit Robotik-Konzepten punkten Dienstleister bei Ausschreibungen als Innovationsführer. +- Entlastung Objektleitung: Weniger Personal-Management bedeutet mehr Zeit für Kundenpflege und Qualitätskontrolle.""" + } +} + +def get_page_id(vertical_name): + # Try to find the page with a filter on "Vertical" property + url = f"https://api.notion.com/v1/databases/{NOTION_DB_VERTICALS}/query" + payload = { + "filter": { + "property": "Vertical", + "title": { + "equals": vertical_name + } + } + } + response = requests.post(url, headers=headers, json=payload) + if response.status_code == 200: + results = response.json().get("results", []) + if results: + return results[0]["id"] + return None + +def update_page(page_id, pains, gains): + url = f"https://api.notion.com/v1/pages/{page_id}" + payload = { + "properties": { + "Pains": { + "rich_text": [{"text": {"content": pains}}] + }, + "Gains": { + "rich_text": [{"text": {"content": gains}}] + } + } + } + response = requests.patch(url, headers=headers, json=payload) + if response.status_code == 200: + print(f"✅ Updated {page_id}") + else: + print(f"❌ Failed to update {page_id}: {response.text}") + +def main(): + print("Starting update Phase 2...") + for vertical, content in UPDATES.items(): + print(f"Processing '{vertical}'...") + page_id = get_page_id(vertical) + if page_id: + update_page(page_id, content["Pains"], content["Gains"]) + else: + print(f"⚠️ Vertical '{vertical}' not found in Notion.") + +if __name__ == "__main__": + main()