163 lines
8.4 KiB
Python
163 lines
8.4 KiB
Python
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()
|