# Stammdaten aufräumen Führt doppelte Zutaten, Einheiten und Schlagworte zusammen und findet Karteileichen. ## Bitte einmal lesen, bevor du es benutzt Tandoors `merge` hängt alle Verweise der Quelle auf das Ziel um und **löscht die Quelle**. Das ist nicht umkehrbar. Im Tandoor-Quelltext steht dazu: ```python # TODO these checks could be improved to merge existing properties and # conversion in a smart way. For now it will just loose them to prevent # duplicates if isinstance(source, Food): source.properties.all().delete() ``` Die Nährwerte des Quelleintrags gehen also verloren. Dieses Werkzeug rettet sie deshalb vorher: Werte, die nur die Quelle hat, werden zuerst ans Ziel geschrieben. Abschaltbar über das Häkchen bzw. `--ohne-rettung`. ## Was vorgeschlagen wird — und was nicht **Sichere Dubletten** (vorausgewählt) bei praktisch sicheren Fällen: * gleicher Name (`Zwiebel` / `zwiebel`, `Olivenöl` / `Olivenoel`) * Singular/Plural (`Zwiebel` / `Zwiebeln`, `Tomate` / `Tomaten`) **Ähnlich** — anhakbar, aber nie vorausgewählt und mit Pflicht zur Richtungswahl: * echte Wort-Teilmengen (`Mehl` / `Mehl Type 550`, `Olivenöl` / `Olivenöl nativ extra`) — jedes Wort der kürzeren Seite kommt als ganzes Wort in der längeren vor Der Unterschied ist Absicht. `Rote Zwiebel` sieht `Zwiebel` sehr ähnlich, ist aber etwas anderes — deshalb entscheidet hier der Mensch, ob und in welche Richtung zusammengeführt wird, statt dass etwas vorausgewählt ist. **Bekannte Lücke:** unregelmäßige Plurale mit Umlaut (`Ei` / `Eier`, `Apfel` / `Äpfel`) erkennt die Heuristik nicht. Die tauchen in keiner der beiden Listen auf. **Löschen** wird grundsätzlich nicht vorausgewählt — manches hebt man absichtlich auf. ## Welcher Eintrag bleibt Ziel ist der Eintrag, der am meisten zu verlieren hätte, in dieser Reihenfolge: die meisten Rezepte → die meisten Nährwerte → gepflegter Plural → Supermarkt-Kategorie → kürzerer Name. ## Ablauf 1. **Prüfen** — schreibt eine Plandatei. Verändert nichts. 2. Plan durchsehen, Häkchen setzen. 3. **Trockenübung** — zeigt Zeile für Zeile, was passieren würde. 4. **Ausführen** — erst dann wird es ernst. Vor jedem Schritt wird der Zustand der betroffenen Einträge gesichert. Zusammengeführt wird vor dem Löschen: eine Zusammenführung kann einen Eintrag erst unbenutzt machen. ## Ohne Suite export TANDOOR_URL=https://kitchen.example.de export TANDOOR_TOKEN=... python3 plugins/tandoor-cleanup/tool/cleanup.py pruefen python3 plugins/tandoor-cleanup/tool/cleanup.py pruefen --arten food python3 plugins/tandoor-cleanup/tool/cleanup.py ausfuehren \ --plan data/tandoor-cleanup/plaene/.json # Trockenübung python3 plugins/tandoor-cleanup/tool/cleanup.py ausfuehren \ --plan data/tandoor-cleanup/plaene/.json --apply # ernst ## Dateien data/tandoor-cleanup/plaene/.json Plan data/tandoor-cleanup/laeufe// Sicherungen + ausgeführter Plan ## Bessere Ähnlich-Erkennung (Wort-Teilmenge statt Zeichenkette) Früher galt schon eine bloße Zeichenketten-Enthaltung als „Teilwort“. Das erzeugte Fehlpaare wie `Mango` ~ `Mangold`, `Buchweizen` ~ `Buchweizenmehl` oder `getrocknete Tomate` ~ `getrocknete Tomaten in Öl`. Jetzt zählt nur eine echte **Wort-Teilmenge**: jedes Wort der kürzeren Seite muss als *ganzes* Wort in der längeren vorkommen. Dadurch verschwinden diese Fehlpaare, während echte Untertypen (`Mehl` / `Mehl Type 550`) erhalten bleiben. ## Plurale pflegen (Zutaten und Einheiten) Eigener Abschnitt „Plurale“ je Art — für **Zutaten und Einheiten**. Er zeigt alle Einträge mit ihrem aktuellen Plural in einem editierbaren Feld; fehlende stehen oben und sind hervorgehoben. Ein Filterfeld macht große Listen bedienbar. Bearbeiten hakt die Zeile automatisch an. Geschrieben wird nur, was sich gegenüber dem Ist-Stand geändert hat — Unverändertes wird übersprungen. Setzen und Ändern sind nicht destruktiv und **voll rückspielbar**. ## KI-Vorauswahl für ähnliche Paare (ChatGPT) Das Finden der Paare bleibt die Heuristik. Ist beim Prüfen „Ähnliche Paare per KI vorfiltern“ aktiv (Vorgabe an, sobald ein `OPENAI_API_KEY` hinterlegt ist), ordnet ChatGPT jedes gefundene Paar in drei Töpfe: * **gleich** – zweifelsfrei dasselbe (Schreibvarianten, fehlendes Leerzeichen, Groß/Klein, Singular/Plural). Wird **angehakt** und die Richtung vorgewählt (der allgemeinere bzw. korrekt geschriebene Name bleibt). * **unklar** – könnte dasselbe sein. Wird angezeigt, aber nicht vorgewählt — du entscheidest. * **verschieden** – zweifelsfrei verschiedene Sorten/Produkte (Weizenmehl 550 vs. 1050, Frischkäse vs. körniger Frischkäse). Standardmäßig **ausgeblendet**. Ein Filter über der Liste schaltet zwischen **„Nur KI-Treffer“** (gleich + unklar) und **„Alle“** (auch die verschiedenen) um. So sind die eindeutigen Fälle mit einem Blick abgehakt, die strittigen bleiben sichtbar, und der Lärm ist weg. Nichts wird ausgeführt — du prüfst und startest selbst; Zusammenführen bleibt gesichert und rückspielbar. Kommandozeile: `pruefen --ki-filter`. Fällt die KI aus, bleiben alle Paare unverändert stehen. ## Plurale per KI (ChatGPT) Getrennt davon schlägt ChatGPT auf Wunsch die **Plurale** von Zutaten und Einheiten vor — auch die Umlaut-Fälle (`Apfel` → `Äpfel`), die die Heuristik nicht kann (`vorbelegen --plan `, Knopf „Plurale vorschlagen“). Standardmäßig nur dort, wo noch kein Plural gepflegt ist; `--alle-plurale` nimmt auch bestehende. Einträge, die durch eine angehakte Zusammenführung ohnehin verschwinden, werden übersprungen. Auch das ist nur ein Vorschlag und voll rückspielbar. Verbindung prüfen: `probe` bzw. „OpenAI testen“. ## Hinweis: Einheiten-Plurale und Tandoor-Serverfehler Manche Tandoor-Versionen stürzen beim Ändern einer **Einheit** über einen schlichten Teil-PATCH mit „HTTP 500“ ab (Zutaten sind nicht betroffen). Das Werkzeug setzt Einheiten-Plurale deshalb robust: zuerst per vollständigem PUT (anderer Code-Pfad, alle vorhandenen Felder bleiben erhalten), danach mit mitgesendetem Namen, zuletzt der schlichte Weg. Lehnt der Server alle Wege ab, werden die restlichen Einheiten-Plurale übersprungen (mit klarer Meldung) statt sie einzeln durchzuprobieren — dann bitte in der Tandoor-Oberfläche setzen. Zutaten-Plurale laufen davon unberührt weiter.