# Riccardo Sortierung (RiccardoSortierung)

Kategorien sortieren immer in dieser Reihenfolge:

1. **Im Angebot** zuerst
2. **Lieferbar** vor nicht lieferbar
3. danach die Sortierung, die der Kunde gewählt hat (Name, Preis, Topseller …)

## „Im Angebot“

Zusatzfeld `rz_on_sale` (1/0) an jedem Artikel, gepflegt vom `OnSaleService`:

- Streichpreis über dem Preis, den der Kunde tatsächlich zahlt. Wie bei Shopware schlägt ein
  Regel-/Staffelpreis für Menge 1 den Grundpreis.
- oder ein aktiver Deal (Plugin Riccardo Deals, Zeitraum und aktiv).

Der Wert gilt je Variante (die reduzierte Farbe/Stärke), der Vaterartikel bekommt 1, sobald eine
Variante im Angebot ist. OpenSearch zeigt dadurch in der Kachel die reduzierte Variante. Neu berechnet alle 15 Minuten
(geplante Aufgabe) oder von Hand:

```bash
bin/console riccardo:sortierung:angebote            # neu berechnen und schreiben
bin/console riccardo:sortierung:angebote --dry-run  # nur zählen
```

Geschrieben wird über die DAL mit Indexierung über die Warteschlange, damit OpenSearch nachzieht
(Worker muss laufen).

## Technik

Listing-Prozessor mit Priorität -100 (nach Shopwares Sortier-Prozessor): setzt
`customFields.rz_on_sale DESC` und `available DESC` vor die vorhandenen Sortierungen.
Suche standardmäßig ausgenommen (Relevanz bleibt), in der Konfiguration zuschaltbar.

## OpenSearch

Das Feld wird über `ElasticsearchCustomFieldsMappingEvent` im Produktindex angemeldet
(`SearchMappingSubscriber`). Nach der Installation oder nach Änderungen daran:

```bash
bin/console cache:pool:clear cache.object   # Liste der Zusatzfelder liegt dort
bin/console es:index                        # neuer Index, Alias wechselt am Ende
```

Erst wenn das Feld im Index steht, die Sortierung einschalten – sonst liefert OpenSearch
„No mapping found … in order to sort on“ und die Kategorie bricht ab.
Werte in der Konsole immer mit `--json` setzen (`system:config:set --json … true`), sonst wird
„false“ als Text gespeichert und gilt als wahr.
