# Riccardo Katalogpflege

Filter-first-Sortiment: wenige Kategorien, viele Filter. Die Wawi liefert nur die Artikelhülle
(siehe RiccardoJtlGuard), alle Filterwerte werden in Shopware gepflegt. Dieses Plugin

1. legt die **Filter-Eigenschaften** an (`PropertySchema`, feste Kennungen – die Wawi kennt und
   ändert sie nicht),
2. **belegt sie vor** – aus Artikelname, technischen Daten der Beschreibung, Kategorie und den
   Variantennamen (`AttributeExtractor`),
3. belegt **neue Artikel der Wawi automatisch** im Hintergrund vor (Message Queue).

**Nie überschreiben:** Eine Gruppe wird nur befüllt, wenn der Artikel dort noch keinen Wert hat;
der Hersteller nur, wenn keiner gesetzt ist. Was in der Administration gepflegt ist, bleibt.

## Pflegestatus

Schalter **„Von Shopware optimiert“** (Zusatzfeld `rz_optimized`, Set „Riccardo Pflegestatus“) am
Artikel: an, sobald Name, Texte, Geschmack/Farben und Filterwerte überarbeitet sind. Die dynamische
Produktgruppe **„Pflege: noch roh (nicht optimiert)“** ist die Arbeitsliste (Kataloge › Dynamische
Produktgruppen › Vorschau). Optimierte Artikel überschreibt auch ein Text-Import der Wawi nicht.

## Aromen und Liquids überarbeiten

    bin/console riccardo:catalog:rewrite-flavors --dry-run --report=/tmp/aromen.csv
    bin/console riccardo:catalog:rewrite-flavors            # noch nicht optimierte
    bin/console riccardo:catalog:rewrite-flavors --all      # alle, erneut

Gebaut werden Artikelname, Beschreibung, Meta-Texte, Geschmacksnoten (`rz_notes`),
Geschmacksprofil (`rz_profile`) und Sortenfarbe (`rz_tint`).

- **Name:** `Marke [Serie] Sorte – Longfill-Aroma 10 ml`. Der Wawi-Name wird in
  `rz_source_name` gesichert, der Originaltext in `rz_source_text`; **gebaut wird immer aus diesen
  Quellen**, damit ein zweiter Lauf nicht seine eigene Ausgabe zerlegt.
- **Text:** Einleitung aus den erkannten Noten, dann der bereinigte Herstellertext, dann
  „Kurz gesagt“, Anwendung und Sicherheitshinweis. Nichts wird erfunden.
- **Standardbausteine** (Schritt 1–3, Shake-and-Vape, Gesundheitshinweise …) werden nicht gepflegt,
  sondern gezählt: Was in zehn oder mehr Artikeln wortgleich steht, fliegt raus.
- **Doppelte Namen** bekommen „(Art. Nummer)“ angehängt – sonst kollidieren die SEO-Adressen.
- **Varianten** erben Name und Text vom Hauptartikel (die Wawi-Variantennamen wie
  „… - 10 ml - 2,5 mg/ml“ sollen nicht im Shop stehen).
- Ohne Noten und ohne Herstellertext bleibt der Artikel „roh“ – dann fehlt die
  Geschmacksbeschreibung und jemand muss sie schreiben.

Liegt der Wawi-Name nicht mehr vor (weder gesichert noch im Originaltext), lässt der Befehl den
Namen unangetastet und meldet die Anzahl. Zum Zurückholen: im JTL-Schreibschutz
„Namen einmalig aus der Wawi übernehmen“ einschalten, Wawi abgleichen lassen, Befehl erneut laufen
lassen, Schalter aus.

## Befehle

    bin/console riccardo:catalog:install-properties        # Gruppen/Werte, Pflegestatus, Arbeitsliste
    bin/console riccardo:catalog:prefill --dry-run --report=/tmp/vorbelegung.csv
    bin/console riccardo:catalog:prefill                    # speichern
    bin/console riccardo:catalog:prefill --product=10003567 # einzelne Artikel

Der CSV-Bericht zeigt je Artikel den erkannten Typ und pro Gruppe den Wert (oder „gepflegt“).

## Filtergruppen

Produkttyp · Erfahrung · Zugverhalten · Nikotinart · Nikotingehalt · Mischverhältnis · Inhalt ·
Akku · Akkukapazität · Max. Leistung · Liquidkapazität · Befüllung · Auslösung · Ausstattung ·
Verdampferdurchmesser · Widerstand · Geräteserie · Drip-Tip-Anschluss · Dauerentladestrom ·
Ladeschächte · Packungsgröße · Farbfamilie – dazu die bestehende Gruppe **Geschmack** (Berater).

Zahlen sind in Stufen gefasst (Shopware filtert Eigenschaften als Liste, nicht per Schieberegler).
Shopware zeigt je Kategorie nur Filter, zu denen es dort Artikel gibt.

Die Variantengruppen der Wawi (Farbe, Nikotinstärke, Ohm, Kapazität …) bleiben für die
Variantenauswahl, sind aber aus dem Filter genommen – ihre Werte sind uneinheitlich
(„5 mg/ml - 3er Pack“). Die Farbfamilie wird aus ihnen abgeleitet.

## Nicht automatisch

- **Geräteserie** („passt zu“) – bewusst leer, weil sie sich nicht zuverlässig aus Namen ableiten
  lässt. Pflegen, damit Coils/Pods zum Gerät filterbar werden.
- **Geschmack** bei Namen ohne erkennbare Sorte („Red Dragon Pinkman“) – im Bericht leer.
- Werte, die nirgends im Text stehen (z. B. Zugverhalten ohne technische Daten).

## Neue Regeln

`AttributeExtractor` ist reine Logik. Neue Muster dort ergänzen, mit `--dry-run --report` gegen
den Bestand prüfen, dann speichern. Lieber nichts setzen als etwas Falsches.

## Geräteserie und Cross-Selling

    php dev/daten/jtl-artikel-holen.php /tmp/skus.txt /tmp/jtl-artikel.jsonl   # liefert auch die Beschreibungen
    bin/console riccardo:catalog:match-series --file=/tmp/jtl-artikel.jsonl --dry-run --show
    bin/console riccardo:catalog:match-series --file=/tmp/jtl-artikel.jsonl
    bin/console riccardo:catalog:build-cross-selling

`match-series` füllt die Eigenschaft **Geräteserie**. Quellen:

- Marke + Modell von Geräten, Sets, Akkuträgern und Verdampfern
- Wawi-Kategorien des Zubehörs („… → Zubehör → Voopoo → Voopoo Drag S3 Pod“) – nur bei Zellen,
  Ladegeräten, Kabeln und Kleinteilen, bei Verdampfern und Coils ist diese Zuordnung zu unsauber
- „für …“ aus dem Artikelnamen („Coil für Crown 5 Tank“)
- Coil-Familien („Voopoo PnP“, „Eleaf GTL“, „Uwell UN2“); Geräte bekommen die Familie, wenn sie in
  ihrer Wawi-Beschreibung vorkommt

Serien mit nur einem Artikel werden verworfen – sie verknüpfen nichts und wären nur Rauschen im
Filter. `build-cross-selling` erzeugt daraus je Serie zwei dynamische Gruppen und blendet sie ein:
auf Geräten „Passendes Zubehör“, auf Zubehör „Passende Geräte“.

**Vorsicht bei der Formulierung:** Die Serie ist eine Zugehörigkeit, keine geprüfte Kompatibilität.
In den Texten steht deshalb „Serie“, nicht „Passt garantiert“.
