> ## Documentation Index
> Fetch the complete documentation index at: https://dokumentation.websale.de/llms.txt
> Use this file to discover all available pages before exploring further.

# Konfiguration product_alternatives.cfg

> Alle Parameter der product_alternatives.cfg: Einträge, Typen, Gültigkeitszeiträume, Preis-Regeln und Bedingungen, dazu die Regel, welcher Eintrag bei mehreren Treffern gewinnt.

Die Konfiguration `product_alternatives.cfg` steuert die alternativen Produktdaten. Damit zeigt der Shop bestimmten Käufern abweichende Preise oder abweichende Produktdaten, ohne dass sich am regulären Datenstand etwas ändert.

Die Datei besteht aus einer Liste von Einträgen. Jeder Eintrag beschreibt drei Dinge: wie die Abweichung zustande kommt, für wen sie gilt und wann sie gilt. Greift mehr als ein Eintrag, entscheidet die Priorität.

Die alternativen Produktdaten müssen für Ihren Shop freigeschaltet sein. Ohne diese Freischaltung liest der Shop die Datei gar nicht erst. Sprechen Sie dazu Ihren WEBSALE-Ansprechpartner an.

Wegweiser: [Alternative Produktdaten](https://dokumentation.websale.de/v8s/produkte/alternative-produktdaten.md) · Referenz: [Alternative Produktdaten, Tags](https://dokumentation.websale.de/v8s/produkte/alternative-produktdaten.md) · Grundlagen: [Grundlagen zu Konfigurationen](https://dokumentation.websale.de/v8s/grundlagen-konfiguration/konfiguration-grundlagen.md)

## Wo die Datei liegt

Die Datei liegt direkt im Konfigurationsverzeichnis des Shops:

```text theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
konfiguration/product_alternatives.cfg
```

Sie gilt damit für alle Subshops und alle Sprachen gemeinsam. Genau deshalb gibt es den Parameter `ValidInSubShops-List`, mit dem Sie einen einzelnen Eintrag auf bestimmte Subshops begrenzen.

Zeilen, die mit `#` beginnen, wertet der Shop als Kommentar.

## Grundaufbau

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<+Entry>
   ID                                  =
   Type                                =
   PriceRuleUseFileExtension           =
   AlternativeProductDataFileExtension =
   UsePriceShadowingVariables          =
   ValidFrom                           =
   ValidUntil                          =
   ValidInSubShops-List                =
   Test                                =
   PriceRule                           =
   PriceRuleParameter1                 =
   Priority                            =
   <Conditions>
      <+ConditionSet>
         <+Condition>
            Type                       =
            Name                       =
            Value                      =
         </+Condition>
      </+ConditionSet>
   </Conditions>
</+Entry>
```

Der Abschnitt `+Entry` darf beliebig oft vorkommen.

## Identität und Betriebsart

| Parameter | Zweck | Werte |
| - | - | - |
| `ID` | eindeutige Kennung des Eintrags. Sie landet in den Bestelldaten und macht nachvollziehbar, welche alternativen Produktdaten bei einer Bestellung gegriffen haben | freier Text, beispielsweise `secondPAentry` |
| `Type` | die Betriebsart des Eintrags | `PriceRule`, `AlternativeProductDataFields-Replacement`, `AlternativeProductDataFields-Complementary` |

Die drei Betriebsarten unterscheiden sich darin, woher die abweichenden Daten kommen:

| Wert von `Type` | Wirkung |
| - | - |
| `PriceRule` | der Shop rechnet den Preis nach einer Formel um |
| `AlternativeProductDataFields-Replacement` | eine zweite Produktdatendatei **ersetzt** die regulären Felder |
| `AlternativeProductDataFields-Complementary` | eine zweite Produktdatendatei **ergänzt** die regulären Felder |

> [!WARNING]
>
> Ein anderer Wert als diese drei macht den Eintrag wirkungslos. Der Shop meldet das nicht als Fehler, der Eintrag greift einfach nie. Achten Sie besonders auf die Bindestriche in den beiden langen Werten.

## Die alternative Produktdatendatei

Bei allen drei Betriebsarten liegen die abweichenden Daten in einer zweiten Datei neben der regulären Produktdatendatei. Sie tragen hier nur die zusätzlichen Zeichen des Dateinamens ein.

Liegen die ursprünglichen Produktdaten in `1234.prd` und die alternativen in `1234.prd-apd`, dann lautet der Eintrag `-apd`.

| Parameter | Zweck | Werte |
| - | - | - |
| `PriceRuleUseFileExtension` | optional, nur bei `Type = PriceRule`. Die Preisformel wird dann auf diese Preisliste angewendet statt auf die regulären Produktdaten | beispielsweise `-apd` |
| `AlternativeProductDataFileExtension` | nur bei den beiden `AlternativeProductDataFields`-Betriebsarten. Die Datei mit den ersetzenden oder ergänzenden Feldern | beispielsweise `-apd` |

Der Shop liest den jeweils anderen der beiden Parameter gar nicht erst ein. Ein `AlternativeProductDataFileExtension` in einem `PriceRule`-Eintrag bleibt also folgenlos, und umgekehrt genauso.

## Streichpreise

| Parameter | Zweck | Werte |
| - | - | - |
| `UsePriceShadowingVariables` | ob die Tags für den ursprünglichen Preis gefüllt werden, also `PR-PriceShadow`, `PR-SetPriceShadow`, `BASKET-PR-PriceShadow` und `BASKET-PR-SetPriceShadow` | `yes`, `no`. Standard: `no` |

> [!WARNING]
>
> Bei `Type = AlternativeProductDataFields-Replacement` stehen die Streichpreis-Tags nicht zur Verfügung. Der ursprüngliche Preis ist in diesem Fall vollständig ersetzt und damit nicht mehr bekannt.

## Gültigkeit

| Parameter | Zweck | Werte |
| - | - | - |
| `ValidFrom` | optional. Zeitpunkt, ab dem der Eintrag aktiv ist | `YYYYMMDD[-HH[:MM[:SS]]]`, beispielsweise `20210101` |
| `ValidUntil` | optional. Zeitpunkt, bis zu dem der Eintrag aktiv ist | `YYYYMMDD[-HH[:MM[:SS]]]`, beispielsweise `20251224-12:00:00` |
| `ValidInSubShops-List` | optional. Kommaseparierte Liste der Subshops, in denen der Eintrag gilt. Ohne Angabe gilt er in allen Subshops | beispielsweise `Deutsch` |
| `Test` | ob der Eintrag nur im Testmodus des Shops greift | `yes`, `no`. Standard: `no` |

> [!WARNING]
>
> Ein Zeitstempel in einem anderen Format macht den Eintrag ungültig. Der Shop fällt dabei nicht auf "immer gültig" zurück, sondern überspringt den Eintrag vollständig.
>
> Prüfen Sie deshalb die Schreibweise sorgfältig. Erlaubt sind `20251224`, `20251224-12`, `20251224-12:00` und `20251224-12:00:00`.

## Preis-Regel

Diese Parameter gelten nur bei `Type = PriceRule`.

| Parameter | Zweck | Werte |
| - | - | - |
| `PriceRule` | ob ein Rabatt oder ein Aufschlag berechnet wird | `discount` für Rabatt, `surcharge` für Aufschlag |
| `PriceRuleParameter1` | der Prozentsatz, der als Rabatt oder Aufschlag angewendet wird | beispielsweise `5` |

Der Shop rechnet dann `Preis minus Preis mal Prozentsatz durch 100` beziehungsweise `Preis plus Preis mal Prozentsatz durch 100`.

> [!NOTE]
>
> Ohne einen Prozentsatz in `PriceRuleParameter1` bleibt der Preis unverändert, auch wenn `PriceRule` gesetzt ist. Dasselbe gilt für einen Prozentsatz von `0` oder kleiner.
>
> In der Datei tauchen außerdem die Parameter `PriceRuleParameter2` und `PriceRuleParameter3` auf. Der Shop liest sie ein, wertet sie bei der Preisberechnung aber derzeit nicht aus. Sie sind für künftige Rechenregeln vorgesehen.

## Bedingungen

Im Unterabschnitt `Conditions` legen Sie fest, für wen der Eintrag gilt.

Die Verknüpfung ergibt sich aus der Verschachtelung:

* Mehrere `+ConditionSet` sind **oder**-verknüpft. Es genügt, wenn ein Set zutrifft.
* Mehrere `+Condition` innerhalb eines Sets sind **und**-verknüpft. Hier müssen alle zutreffen.

| Parameter | Zweck | Werte |
| - | - | - |
| `Type` | ob auf einen URL-Parameter oder auf ein Suffixfeld der Rechnungsadresse geprüft wird | `ActivateWithURLParameter`, `ActivateWithUserAccountSuffixField` |
| `Name` | Name des zu prüfenden URL-Parameters oder Suffixfeldes | beispielsweise `Suffix5` |
| `Value` | Wert, auf den geprüft wird | beispielsweise `aktiv` |

> [!WARNING]
>
> Wählen Sie bei URL-Parametern eine Kombination aus Name und Wert, die sich nicht erraten lässt. Wer den Link kennt, bekommt die abweichenden Preise.
>
> Wählen Sie den Namen außerdem eindeutig genug, damit er nicht mit funktionalen Aufrufparametern des Shops kollidiert.

Werden während einer Sitzung mehrere gültige URL-Parameter verwendet, merkt sich der Shop die zuletzt gefundene gültige Kombination aus Name und Wert.

## Welcher Eintrag gewinnt

Der Shop prüft bei jedem Aufruf alle Einträge der Datei der Reihe nach und behält den Gewinner für die Dauer des Aufrufs. Ein Eintrag kommt nur in die Auswahl, wenn er den Testmodus, den Gültigkeitszeitraum und die Subshop-Beschränkung besteht **und** seine Bedingungen zutreffen.

Bleiben danach mehrere Einträge übrig, entscheidet `Priority`.

| Parameter | Zweck | Werte |
| - | - | - |
| `Priority` | Rangfolge bei mehreren gültigen Einträgen | Ganzzahl |

> [!WARNING]
>
> **Der kleinere Zahlenwert gewinnt.** Ein Eintrag mit `Priority = 1` setzt sich gegen einen mit `Priority = 3` durch.
>
> Daraus folgt eine Falle: Ein Eintrag ohne `Priority` zählt als `0` und schlägt damit jeden Eintrag mit einer gesetzten Priorität. Vergeben Sie die Priorität deshalb entweder bei allen Einträgen oder bei keinem.
>
> Bei gleichem Zahlenwert gewinnt der Eintrag, der in der Datei weiter oben steht.
>
> Es gewinnt genau ein Eintrag, und dabei bleibt es. Existiert für ein Produkt keine passende alternative Produktdatendatei, bekommt dieses Produkt seine regulären Daten. Der Shop weicht **nicht** auf den Eintrag mit der nächsten Priorität aus.

## Wenn ein Eintrag nicht greift

Die folgenden Ursachen führen alle dazu, dass ein augenscheinlich korrekter Eintrag wirkungslos bleibt. Keine davon erzeugt eine sichtbare Fehlermeldung.

**Die Funktion ist für den Shop nicht freigeschaltet.** Dann liest der Shop die Datei nicht ein, unabhängig von ihrem Inhalt.

**Die Datei fehlt oder liegt am falschen Ort.** Der Shop erwartet sie direkt unter `konfiguration/`, nicht in einem Subshop-Unterverzeichnis.

**Der Wert von `Type` ist nicht einer der drei erlaubten.** Ein Tippfehler in `AlternativeProductDataFields-Complementary` reicht.

**Der Zeitstempel ist falsch formatiert.** Das macht den Eintrag ungültig, nicht zeitlich unbegrenzt gültig.

**Ein anderer Eintrag hat die kleinere `Priority`.** Siehe oben.

**Die alternative Produktdatendatei existiert nicht.** Der Shop prüft je Produkt, ob die Datei mit der konfigurierten Endung tatsächlich im Produktdatenverzeichnis liegt. Fehlt sie, bleibt es für dieses Produkt bei den regulären Daten.

Für die Fehlersuche im Shop selbst gibt es die Tags mit dem Präfix `APD-`. Damit geben Sie im Testmodus aus, welcher Eintrag gerade gewonnen hat, mit welcher Betriebsart, Dateiendung und Gültigkeit.

Referenz: Alternative Produktdaten, Tags


## Related topics

- [Alternative Produktdaten](https://dokumentation.websale.de/v8s/produkte/alternative-produktdaten.md)
- [Alternative Produktdaten: Tags](https://dokumentation.websale.de/v8s/referenz/tags/alternative-produktdaten-tags.md)
- [Konfiguration wsautoexpdelcost.cfg](https://dokumentation.websale.de/v8s/referenz/konfigurationen/konfiguration-wsautoexpdelcost-cfg.md)
- [Importdatei prod.cfg](https://dokumentation.websale.de/v8s/referenz/konfigurationen/importdatei-prod-cfg.md)
- [Bildkonverter-Konfiguration wsimageconvert.cfg](https://dokumentation.websale.de/v8s/referenz/konfigurationen/bildkonverter-konfiguration-wsimageconvert-cfg.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.