Artikelsuche findet die Marke - und Loeschen fragt erst nach dem Bestand

Die Suche verglich bisher einen einzigen Textschnipsel gegen den Namen. Wer
"Vogel Jack and Jones" eintippte, bekam nichts: Dieser Ausdruck steht in
keinem Artikelnamen, und die Marke wurde ueberhaupt nie durchsucht. Jetzt
wird der Suchtext in Woerter zerlegt, jedes muss in Name oder Marke
vorkommen, die Reihenfolge ist egal.

Gefiltert wird in Python und nicht per ILIKE, weil normalisieren() Umlaute
aufloest ("Muehle" findet "Mühle") - auf der Spalte faende ein ILIKE den
gespeicherten Wert nicht wieder. Dieselbe Form nutzt recipes.zuordnung_ziele
schon laenger. Alle Artikellisten haengen an dieser einen Route, die
Verbesserung wirkt also auch bei Gegenstaenden und beim Ein-/Auslagern.

Die Artikelzeile in der App zeigt nun die Marke, sonst waere ein Treffer
darauf nicht zu erklaeren.

Dazu die zweite Haelfte: delete_product hatte keinerlei Schutz und riss
Chargen, Einzelstuecke, Barcodes, Bilder und den ganzen Bewegungsverlauf per
Kaskade mit. Jetzt lehnt der Server mit 409 ab, solange Einzelstuecke oder
Chargen dranhaengen. Bewegungen allein halten bewusst nicht auf - sonst waere
jeder je benutzte Artikel fuer immer unloeschbar. Der Bestaetigungstext im
Web versprach den Verlust des Bestands und stimmte damit nicht mehr.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-15 20:06:07 +02:00
co-authored by Claude Opus 5
parent 94f8ed4db9
commit 264d3886f3
5 changed files with 233 additions and 5 deletions
+3 -1
View File
@@ -574,7 +574,9 @@ export default function ProductForm() {
async function remove() {
const ok = await confirm({
title: "Produkt löschen?",
message: "Der gesamte Bestand dieses Produkts geht dabei verloren.",
// Bestand haelt der Server inzwischen auf (409). Was hier wirklich
// verloren geht, ist alles Uebrige am Artikel.
message: "Barcodes, Bild und der Bewegungsverlauf gehen dabei verloren.",
confirmLabel: "Löschen",
danger: true,
});