feat: Build complete POC for Butler model (client, matrix, daemon)
This commit is contained in:
82
connector-superoffice/normalize_persona.py
Normal file
82
connector-superoffice/normalize_persona.py
Normal file
@@ -0,0 +1,82 @@
|
||||
import re
|
||||
|
||||
def normalize_persona(title: str) -> str:
|
||||
"""
|
||||
Normalisiert rohe Jobtitel auf die 4 RoboPlanet-Personas.
|
||||
Rückgabe: Persona-ID (z.B. 'PERSONA_A_OPS') oder 'MANUAL_CHECK'.
|
||||
"""
|
||||
if not title:
|
||||
return "MANUAL_CHECK"
|
||||
|
||||
t = title.lower()
|
||||
|
||||
# 1. HARD EXCLUDES (Kosten sparen / Irrelevanz)
|
||||
blacklist = [
|
||||
"praktikant", "intern", "student", "assistenz", "assistant",
|
||||
"werkstudent", "azubi", "auszubildende", "secretary", "sekretär"
|
||||
]
|
||||
if any(x in t for x in blacklist):
|
||||
return "IGNORE"
|
||||
|
||||
# 2. HIERARCHISCHE LOGIK (Specialist > Generalist)
|
||||
|
||||
# Persona D: Visionary (Innovations-Treiber)
|
||||
# Trigger: ESG, Digitalisierung, Transformation
|
||||
keywords_d = [
|
||||
"sustainability", "esg", "umwelt", "digital", "innovation",
|
||||
"transformation", "csr", "strategy", "strategie", "future"
|
||||
]
|
||||
if any(x in t for x in keywords_d):
|
||||
return "PERSONA_D_VISIONARY"
|
||||
|
||||
# Persona B: FM / Infra (Infrastruktur-Verantwortlicher)
|
||||
# Trigger: Facility, Technik, Immobilien, Bau
|
||||
keywords_b = [
|
||||
"facility", "fm", "objekt", "immobilie", "technisch", "technik",
|
||||
"instandhaltung", "real estate", "maintenance", "haushandwerker",
|
||||
"building", "property", "bau", "infrastructure"
|
||||
]
|
||||
if any(x in t for x in keywords_b):
|
||||
return "PERSONA_B_FM"
|
||||
|
||||
# Persona A: Ops (Operativer Entscheider - Q1 Fokus!)
|
||||
# Trigger: Logistik, Lager, Supply Chain, Produktion, Operations
|
||||
keywords_a = [
|
||||
"logistik", "lager", "supply", "operat", "versand", "warehouse",
|
||||
"fuhrpark", "site manager", "verkehr", "dispatch", "fertigung",
|
||||
"produktion", "production", "plant", "werk", "standortleiter",
|
||||
"branch manager", "niederlassungsleiter"
|
||||
]
|
||||
if any(x in t for x in keywords_a):
|
||||
return "PERSONA_A_OPS"
|
||||
|
||||
# Persona C: Economic / Boss (Wirtschaftlicher Entscheider)
|
||||
# Trigger: C-Level, GF, Finance (wenn keine spezifischere Rolle greift)
|
||||
keywords_c = [
|
||||
"gf", "geschäftsführer", "ceo", "cfo", "finance", "finanz",
|
||||
"vorstand", "prokurist", "owner", "inhaber", "founder", "gründer",
|
||||
"managing director", "general manager"
|
||||
]
|
||||
if any(x in t for x in keywords_c):
|
||||
return "PERSONA_C_ECON"
|
||||
|
||||
# Fallback
|
||||
return "MANUAL_CHECK"
|
||||
|
||||
# Test-Cases (nur bei direkter Ausführung)
|
||||
if __name__ == "__main__":
|
||||
test_titles = [
|
||||
"Head of Supply Chain Management",
|
||||
"Technischer Leiter Facility",
|
||||
"Geschäftsführer",
|
||||
"Director Sustainability",
|
||||
"Praktikant Marketing",
|
||||
"Teamleiter Fuhrpark",
|
||||
"Hausmeister",
|
||||
"Kaufmännischer Leiter"
|
||||
]
|
||||
|
||||
print(f"{'TITLE':<40} | {'PERSONA'}")
|
||||
print("-" * 60)
|
||||
for title in test_titles:
|
||||
print(f"{title:<40} | {normalize_persona(title)}")
|
||||
Reference in New Issue
Block a user