# Beispielkatalog & Startseite (Dev-Instanz)

Erzeugt die Beispieldaten für den Design-Entwurf. Die Daten liegen in der Datenbank, nicht im Theme.

1. `node scrape.js` – liest ~70 Produkte aus dem alten Riccardo-Shop (riccardo-zigarette.de) in `catalog.json`
   und die Bilder nach `img/` (benötigt Playwright; `img/` ist nicht versioniert).
2. `php import.php` – legt Navigation, Eigenschaften, Hersteller und Produkte an, deaktiviert die Shopware-Demodaten.
3. `php fixdata.php && php fixunit.php` – Lieferzeit, Grundpreis (ml), HighTense als Variantenprodukt.
4. `php home.php` – legt/aktualisiert die Einkaufswelt „Riccardo Startseite“.
6. `php customfields.php` – registriert die rz_*-Zusatzfelder (Sortenfarbe, -gruppe und Noten sind für Warenkorb/Checkout freigegeben).
5. `php enrich-pdp.php` – Produktseite: Geschmacksnoten/-profil (aus den Beschreibungen abgeleitet), Technikdaten (aus den Produktnamen), Cross-Selling und 4 als „Demo“ gekennzeichnete Bewertungen.

Die Skripte nutzen die Admin-API mit dem Benutzer aus `/root/.shopware-dev/credentials`. IDs sind deterministisch,
alle Skripte können gefahrlos erneut ausgeführt werden.
7. `php categories-text.php` – kurze Einleitungstexte der Hauptkategorien (Platzhalter).

`enrich-pdp.php` setzt außerdem die Geschmacksnoten als Such-Schlüsselwörter (`customSearchKeywords`);
danach `bin/console dal:refresh:index --only=product.indexer` ausführen.
8. `php import-extra.php <bildordner>` – 21 weitere Artikel aus dem alten Shop (Akkus/Ladegeräte, Accessoires, reduzierte Pods; Daten in `catalog2.json`).
9. `php deals.php` – 10 Beispiel-Deals + Beispiel-Einkaufspreise; `php test-deals.php` prüft die Deal-Logik.
- `stores.php` – 25 Filialen aus dem alten Shop (`stores-old-shop.json`) inkl. Fotos und Öffnungszeiten (Plugin RiccardoStores)
- `pages.php` – Service- und Pflichtseiten als Landingpages (`/impressum`, `/agb`, `/datenschutz`, `/widerruf`,
  `/rueckgabe-und-widerruf`, `/versand-und-zahlung`, `/batterieentsorgung`, `/hilfe`, `/ueber-uns`, `/karriere`,
  `/kontakt`, `/magazin`) und verknüpft sie als Shopseiten (AGB, Widerruf, Datenschutz, Impressum, Versand, Kontakt).
  Die Inhalte liegen als HTML in `pages/`; rechtliche Texte stammen aus dem alten Shop und brauchen eine juristische Prüfung.
- `compliance.php` – Beispielprofile für Pflichtangaben (CLP/GPSR) je Kategorie und Zusammensetzung
  der Liquids in den Zusatzfeldern. Die CLP-Angaben sind Beispiele und fachlich zu prüfen.
- `remove-demo.php` – löscht alle Beispielartikel (Artikelnummern `RZ-*`) samt Varianten.
  Bestellungen bleiben erhalten (die Positionen behalten ihre Kopie), Kategorien, Hersteller,
  Eigenschaften und Medien bleiben stehen. Deals und Cross-Selling verschwinden mit den Artikeln.
- `magazine-import.php` – Magazinbeiträge, Themen und Titelbilder aus dem WordPress des alten
  Shops übernehmen (Plugin RiccardoMagazine). Deaktiviert die Platzhalter-Landingpage `/magazin`.

## Produkte mit mehreren Bildern (Galerie testen)

```bash
node scrape-gallery.js     # holt Galeriebilder von den Detailseiten des alten Shops -> gallery.json
php import-gallery.php     # lädt die Bilder hoch und hängt sie an die vorhandenen Produkte
```

`scrape-gallery.js` filtert über die Artikelnummer im Bildnamen – auf den Detailseiten
des alten Shops stehen sonst auch Cross-Selling-Bilder. Das Bild mit `-00` (Packshot)
wird zum Titelbild. `import-gallery.php` findet die Produkte über dieselbe Id wie
`import.php` (`uuid('prod-' . url)`) und ergänzt sie, legt also keine Dubletten an.
Ergebnis: RZ-10001 bis RZ-10004 haben 6 bis 8 Bilder.

## Widerrufsbutton (gesetzliche Pflicht)

```bash
php revocation.php
```

Legt die Landingpage `/vertrag-widerrufen` an (Einleitung + Shopwares Widerrufsformular,
CMS-Elementtyp `form` mit `type = revocationRequest`), verknüpft sie in den
Grundeinstellungen (`core.basicInformation.revocationRequestPage`) und schaltet
`core.basicInformation.showRevocationButton` ein. Das Theme zeigt den Button im Footer nur,
wenn diese Einstellung steht.

Ablauf: Button „Vertrag widerrufen" (Footer, auf jeder Seite) → Formular → „Widerruf
bestätigen" → Bestätigung im Shop plus Mail an Kunden (mit Datum und Uhrzeit) und an den Shop.
Die Mails kommen aus dem Plugin RiccardoMail (`revocation_request.customer` / `.merchant`).

## Kategorietexte (kurze Einleitung oben, SEO-Text unten)

```bash
php category-texts.php
```

Legt das Zusatzfeld `rz_intro` für Kategorien an (kurze Einleitung, erscheint im Kopf unter
der Überschrift) und schreibt in `description` den langen Text, den das Theme **am Ende der
Seite** unter den Produkten ausgibt (`.rz-cat-seo`). Ersetzt das alte `categories-text.php`.
Texte sind fachlich gehalten (PG/VG, Ohm, TPD-Grenzen) und redaktionell zu prüfen.

## Katalog leeren (vor einem Test-Import)

```bash
php remove-catalog.php
```

Löscht **alle** Artikel und die Kategorien unter den Navigations-Wurzeln der
Verkaufskanäle. Die Wurzeln selbst bleiben (an ihnen hängen die Verkaufskanäle), ebenso
Hersteller, Eigenschaften, Medien, Pflichtangaben-Profile, Bestellungen und Kunden.
Über Fremdschlüssel mitgelöscht: Deals und Pflichtangaben-Zuordnungen an Kategorien.

**Vorher sichern.** Wie das geht und wie man zurückkommt, steht in
`/var/backups/shopware-dev/WIEDERHERSTELLEN-*.md`.

## Umzug auf den Einstiegspunkt „Riccardo Online" (18.09.2026)

```bash
php migrate-to-riccardo-online.php
```

Zieht alles, was an der alten Wurzel „Riccardo Navigation" hing, auf „Riccardo Online" um:
Startseiten-Layout, Footer-Einstiegspunkt (die Spalte „Sortiment" kommt seitdem aus dem
Kategoriebaum), Pflichtangaben-Zuordnungen, Kategorien des Starterset-Konfigurators,
Links der persönlichen Angebote und alte Kategorie-Links in den Inhaltsblöcken.
Danach `php category-texts.php` für Einleitung und SEO-Text der neuen Kategorien.

Farben der Hauptkategorien (Kategorie-Kopf, mobiles Menü) hängen am **Kategorienamen bzw.
der Kategorie-URL**, nicht mehr an der Position: E-Zigaretten Sand, POD Systeme Blau,
Liquids Koralle, Aromen & Basen Gelb, Zubehör Lila, „Angebote" (falls vorhanden) Rot.

## migrate-to-jtl-tree.php (18.09.2026)

Die JTL-Wawi hat einen eigenen Kategoriebaum unter einer neuen Wurzel „Riccardo Online“ angelegt –
das ist der Baum, mit dem gearbeitet wird. Das Skript stellt alles darauf um:
Startseiten-Layout und Footer der Wurzel, Entfernen der alten leeren Wurzel, Pflichtangaben-Profile,
Starterset-Schritte (jetzt mehrere Kategorien je Schritt möglich), alte Links in Inhaltsblöcken
(`/Aromen-Basen/…` → `/Aromen/` bzw. `/Basen-Nikotinshots/…`). Danach `category-texts.php` laufen
lassen. Mehrfach ausführbar. Seit RiccardoJtlGuard kann die Wawi den Baum nicht mehr umbauen.

## angebote.php, home-slider.php, deals.php (19.09.2026)

Nach dem Wawi-Import zeigen diese drei Skripte echte Artikel:

- `angebote.php` – Kategorie „Angebote“ an die dynamische Gruppe „Artikel mit Streichpreis“
  hängen. Grundlage ist die Eigenschaft **Aktion: Reduziert**, die
  `bin/console riccardo:catalog:mark-deals` setzt (Shopware kann in Produktgruppen und Filtern
  nicht auf den Streichpreis filtern). Nach jedem Preisabgleich der Wawi erneut laufen lassen.
- `home-slider.php` – die Startseiten-Slider „Beliebte Liquids“ und „Geräte im Angebot“ auf
  dynamische Gruppen umstellen (vorher feste Artikel-IDs aus dem Testkatalog).
- `deals.php` – Beispiel-Deals für RiccardoDeals; die Artikel werden selbst gesucht (günstigster
  Coil, Drip Tip, Shot, Pod-System, Akkuzelle, Ladegerät, Ersatzglas).

**Achtung bei Produktgruppen-Filtern:** Mehrfachwerte gehören mit `|` getrennt in das Feld
`value`, nicht in `parameters` – sonst ist der Filter leer und die Gruppe enthält alles.
