Zum Inhalt springen
OrtmannConsulting
Zurück zur Übersicht

Vertrieb & Kundenservice, Bauchemie

Artikellisten für Kunden — ohne zweiten, kundensicheren Index

Kunden stellen sich eigene Artikellisten zusammen und exportieren sie mit den Produktdaten, die sie für ihre Systeme brauchen. Bestände, Preise und interne Kennzahlen liegen im selben Index — die Trennung erzwingt eine serverseitige Positivliste.

Jahr
2026
Leistungen
Automatisierung
Bereich
Bauchemie
Rolle
Intern, angestellt

Umgesetzt in angestellter Rolle für einen internen Fachbereich, nicht als externes Beratungsmandat. Das Unternehmen wird nicht genannt.

81Spalten im größten Export-Layout
10Unterstützte Sprachen
3Zusammengeführte Quellsysteme

Ausgangslage

Der Auslöser ist im Projektordner nicht dokumentiert. Keine README im Wurzelverzeichnis, keine Anforderungsbeschreibung, und neun von zehn Commit-Nachrichten lauten „update“, „add new features“ oder „fix bug“.

Belegt ist zweierlei. Im Ordner liegt eine kundenspezifische Artikelliste als CSV — 1.366 Zeilen, rund 70 Spalten: Artikelnummer, EANs je Verpackungseinheit, Mindestbestellmengen, Gewichte, Maße, Ursprungsland, Gefahrgut- und CLP-Einstufung, Marketingtexte, Datenblatt-Dateinamen. Und Code-Kommentare bezeichnen später ergänzte Felder ausdrücklich als „Datenblatt-Lückenfelder“ — also als Felder, die in genau einer solchen Liste gefehlt hatten.

Dass solche Listen zuvor manuell aus ERP- und PIM-Daten in Excel zusammengetragen wurden, ist naheliegend, aber nicht belegt. Belegt ist nur, dass die Feldauswahl der Anwendung nachträglich an dieser Liste ausgerichtet wurde.

Ansatz

Eine Flask-Anwendung, die drei Datenquellen zusammenführt.

Der Katalog kommt aus zwei Suchindizes: ERP-Stammdaten (ein Dokument je Artikel und Land, in der Anwendung zu einer Zeile je Artikel zusammengefasst) und Produktinhalte mit mehrsprachigen Texten und Dokumentlinks, verbunden über die Artikelnummer. Filter laufen als Facetten über denselben Index und kaskadieren dadurch. Die Artikellisten liegen in einer eigenen relationalen Datenbank. Die Kaufhistorie wird bei Bedarf gegen das Data Warehouse abgefragt: gelieferte Auftragspositionen, je Artikel aggregiert.

Zusammengehalten wird alles von der Kundenzuordnung. Sie steckt in einer einzigen Funktion, und jede Listen- oder Historienabfrage bekommt die Kundennummer von dort — nie aus dem Request. Zwei Modi sind vorgesehen: intern (Mitarbeitende wählen einen Kunden) und extern (Identität aus dem Anmeldetoken). Der Wechsel ist eine Änderung an dieser einen Funktion, nicht an den 19 Routen.

Der Punkt, an dem es anders hätte laufen können

Der kundenseitige Katalog liest denselben Index, der intern auch Bestände, Lagerwerte, Bestellungen, Lieferanten und Topkunden enthält.

Ein separater, kundensicherer Index wurde bewusst nicht gebaut. Stattdessen wird die Trennung serverseitig erzwungen: eine explizite Positivliste erlaubter Felder, und die Suchmaschine gibt nur ausgewählte Felder zurück. Was dort nicht steht, erreicht den Client nicht.

Das spart einen zweiten Index samt Beladung — verlagert die Verantwortung aber in eine Liste, die bei jedem neuen Feld gepflegt werden muss. Der Code sagt das selbst und markiert eine Ausnahme als „für die interne Phase in Ordnung, vor externer Freigabe prüfen“.

Wie ernst das Prinzip genommen wird, zeigt der letzte Commit: Zurückgezogene Dokumente gingen im internen Modus bis dahin mit, damit Mitarbeitende sie über einen Umschalter prüfen konnten. Der Commit entfernt den Umschalter samt Oberflächen-Code und filtert immer serverseitig — die Prüfansicht wurde zugunsten eines Codepfads aufgegeben, in dem die URL eines zurückgezogenen Sicherheitsdatenblatts das Backend nicht verlassen kann.

Ergebnis

Rund 3.250 Zeilen Python in elf Modulen plus etwa 1.900 Zeilen Oberfläche, 19 Routen, drei angebundene Systeme über drei Suchindizes und zwei Datenbanken, drei Export-Layouts mit 74, 75 und 81 Spalten, zehn Sprachen. Knapp acht Wochen Kalenderzeit, eine Person.

Bewusst nicht enthalten: keine Bestellung, keine Preise, keine Bestände. Listen sind Listen — kein Abschluss, kein Rückschreibeweg ins ERP. Weitergearbeitet wird außerhalb des Systems.

Ehrlich zum Stand: Der externe Kundenlogin ist noch nicht scharf. Standard ist der interne Modus, die Zuordnung für Phase 2 im Code als offen vermerkt; bis dahin wählen Mitarbeitende den Kunden manuell. „Gekauft“ ist außerdem ein Näherungswert — gelieferte Auftragspositionen statt Rechnungen, im Code als bestmögliches verfügbares Signal benannt.

Eingesetzte Technik

  • Python / Flask
  • Azure AI Search
  • Azure SQL
  • Databricks SQL
  • Azure Functions

Weitere Projekte

Konzern-Kundenservice, Bauchemie

2026
11Länder auf einer Plattform

Ein Contact Center für elf Länder — eine Plattform statt elf Inseln

Kundenservice in elf Ländern über Sprache und SMS, mit Daten aus SAP, Salesforce und dem Produktsystem direkt im Arbeitsplatz der Agenten. Länderunterschiede sind Konfiguration, keine eigene Installation.

  • Twilio Flex
  • Twilio TaskRouter
  • Twilio Studio
  • SAP

Konzern-Compliance, Bauchemie

2026
10.872Erzeugte Dokumente

10.872 EU-Konformitätserklärungen statt Copy-Paste

Für die neue EU-Verpackungsverordnung waren Konformitätserklärungen in 12 Sprachen für rund 900 Verpackungsmaterialien nötig. Statt sie einzeln zu füllen, erzeugt und verteilt eine Pipeline sie in einem Lauf.

  • Python
  • docxtpl / Jinja2
  • Microsoft Word COM
  • Microsoft Graph API

Vertrieb & Innendienst, Bauchemie

2026
1 + 3Orchestrator und Fachagenten

Ein Orchestrator, drei Fachagenten für Produktauskünfte

Statt eines Agenten mit drei Wissensquellen leitet ein übergeordneter Agent an drei spezialisierte weiter — je einer für ERP-Artikeldaten, Produktinhalte und SharePoint-Dokumente.

  • Microsoft Copilot Studio
  • Azure AI Search
  • Azure Functions
  • SharePoint

Ähnlicher Prozess bei Ihnen?

30 Minuten, kostenlos, ohne Verkaufsgespräch. Sie beschreiben, was Zeit kostet — ich sage Ihnen ehrlich, ob sich Automatisierung lohnt.