> ## 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.

# Alternative Produktdaten

> Wie Sie in WEBSALE V8s bestimmten Käufergruppen abweichende Preise und Produktdaten zeigen, über Preis-Regeln oder über importierte Produktdaten-Dateien.

Mit alternativen Produktdaten gewähren Sie bestimmten Käufergruppen abweichende Preise oder Produktkonditionen. Ausgelöst wird das entweder über das Kundenkonto oder über einen Marketing-Link.

Der Unterschied zum testweisen Anreichern von Produktdaten, dem ProductDataFieldInjection, liegt in der Quelle. Alternative Produktdaten kommen aus der Warenwirtschaft. Damit sind nicht nur Preisanpassungen möglich, sondern komplett abweichende Produktdaten.

## Funktionsweise

Drei Fragen entscheiden über den Ablauf und die nötigen Einstellungen. Klären Sie diese, bevor Sie mit der Konfiguration beginnen.

### Woher kommen die Daten?

Es gibt zwei Quellen, und daraus ergeben sich die beiden Integrationswege weiter unten.

| Quelle | Eignung |
| - | - |
| Preis-Regeln in der Konfiguration | prozentualer Rabatt oder Zuschlag auf alle Produkte |
| Import alternativer Produktdaten-Dateien | beliebige Felder und Werte für bestimmte Produkte |

### Wann ein Eintrag aktiv ist

Beim Aufruf des Shops prüft WEBSALE V8s, ob für den Käufer oder die Session mindestens ein Eintrag aktiv ist. Aktiv ist ein Eintrag, wenn seine Kriterien erfüllt sind. Dazu zählen:

* ein Gültigkeitszeitraum von und bis
* der Aufruf im Testmodus oder im Produktivbetrieb
* der Subshop
* eine Aktivierung im Kundenkonto des Käufers
* eine Aktivierung über einen URL-Parameter

Preisbeeinflussende Elemente wie Kundenrabatte und prozentuale Gutscheine lassen sich ausschließen. Dafür überschreiben Sie in den alternativen Produktdaten die entsprechenden Standardfelder, beispielsweise die Rabattierfähigkeit.

### Mehrere aktive Einträge

Es können mehrere Einträge gleichzeitig aktiv sein. Über den Parameter `Priority` legen Sie ihre Gewichtung fest. Die Standarddaten des Produkts werden dann einmalig mit den am höchsten gewichteten alternativen Daten angereichert oder ersetzt.

Existieren für diesen Eintrag keine alternativen Daten, greift der Eintrag mit der nächstniedrigeren Priorität, für den welche vorliegen.

> [!WARNING]
>
> Alternative Produktdaten haben drei Grenzen, die Sie vor der Planung kennen sollten:
>
> Sie lassen sich nicht an die Datenfeeds des DataflowManagers übergeben.
>
> Sie sind in aggregierten Funktionen nicht nutzbar, also nicht in Suche, Sortierung und Filterung. Ein alternativer Preis wirkt sich damit beispielsweise nicht auf eine Preissortierung aus.
>
> Sie lassen sich nur für Produkte mit abhängigen Varianten verwenden, beziehungsweise für voll aufgelöste abhängige Variantenkombinationen.

## Voraussetzungen

Für beide Wege gilt:

* Sie nutzen den Artikelimport Pro.
* Das Feature muss von WEBSALE für Ihren Shop freigeschaltet werden. Sprechen Sie dazu Ihren WEBSALE-Ansprechpartner an.

Die Konfiguration erfolgt in beiden Fällen in der Datei `product_alternatives.cfg` im Verzeichnis `/konfiguration/`. Legen Sie sie an, falls sie noch nicht vorhanden ist.

## Weg 1: Preis-Regeln anwenden

Im folgenden Beispiel werden die Produktpreise um 20 Prozent reduziert, sobald beim Käufer im Adressdatenfeld `Suffix5` der Rechnungsadresse der Wert `aktiv` steht. Die Regel gilt vom 21.03.2022 um 12 Uhr bis zum 01.01.2025 um 0 Uhr.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<+Entry>
   ID                                  = thirdPAentry
   Type                                = PriceRule
   UsePriceShadowingVariables          = yes
   ValidFrom                           = 20220321-12
   ValidUntil                          = 20250101
   ValidInSubShops-List                = Deutsch
   Test                                = yes
   PriceRule                           = discount
   PriceRuleParameter1                 = 20
   Priority                            = 3
   <Conditions>
      <+ConditionSet>
         <+Condition>
            Type                       = ActivateWithUserAccountSuffixField
            Name                       = Suffix5
            Value                      = aktiv
         </+Condition>
      </+ConditionSet>
   </Conditions>
</+Entry>
```

Der Zeitraum folgt dem Format `JJJJMMTT-HH`, die Stunde ist optional. `Test = yes` bedeutet, dass der Eintrag zunächst nur im Testmodus greift, siehe den Abschnitt zum Testen weiter unten.

Referenz: [Konfiguration product\_alternatives.cfg](https://dokumentation.websale.de/v8s/referenz/konfigurationen/konfiguration-product-alternatives-cfg.md)

## Weg 2: Alternative Produktdaten-Dateien nutzen

Hier liefert die Warenwirtschaft eine zweite Produktdaten-Datei, die die erste ganz oder teilweise ersetzt.

### Datei anlegen

Der Dateiname besteht aus dem Namen der ursprünglichen Produktdaten-Datei und einem frei wählbaren technischen Suffix. Erlaubt sind alphanumerische Zeichen sowie Bindestrich, Unterstrich und Punkt.

Liegen die ursprünglichen Produktdaten in `1234.prg`, heißt die alternative Datei beispielsweise `1234.prg-apd`.

> [!WARNING]
>
> Die alternative Datei muss **alle** Produktdaten enthalten, nicht nur die abweichenden Felder.
>
> Hat ein Produkt Basisdaten, alternative Daten für eine Marketing-Kampagne und alternative Daten für bestimmte Kunden, lassen sich diese nicht einzeln aktualisieren. Wird das Produkt aktualisiert, müssen immer alle Dateien geliefert werden, die alternativen wie die regulären.

### Konfiguration ergänzen

Im folgenden Beispiel werden im selben Zeitraum alternative Produktdaten verwendet, sobald der Shop mit dem URL-Parameter `pafirsttest=aktiv` aufgerufen wird, also beispielsweise über `https://www.xyz.de/?pafirsttest=aktiv`.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<+Entry>
   ID                                  = secondPAentry
   Type                                = AlternativeProductDataFields-Replacement
   AlternativeProductDataFileExtension = -apd
   UsePriceShadowingVariables          = yes
   ValidFrom                           = 20220321-12
   ValidUntil                          = 20250101
   ValidInSubShops-List                = Deutsch
   Test                                = yes
   Priority                            = 3
   <Conditions>
      <+ConditionSet>
         <+Condition>
            Type                       = ActivateWithURLParameter
            Name                       = pafirsttest
            Value                      = aktiv
         </+Condition>
      </+ConditionSet>
   </Conditions>
</+Entry>
```

Der Suffix aus dem Dateinamen steht dabei in `AlternativeProductDataFileExtension`. Beide Angaben müssen zusammenpassen, sonst findet der Shop die Datei nicht.

## Ursprüngliche Preise anzeigen

Dieser Schritt ist optional, für die Preisdarstellung aber meist entscheidend.

Überschreibt die Funktion ein Datenfeld, in diesem Fall den Preis, kann der Designer im Template nicht erkennen, dass der reguläre Preis ein anderer war. Dafür gibt es die Shadow-Tags. Mit ihnen zeigen Sie den ursprünglichen Preis zusätzlich an, beispielsweise als Streichpreis.

Produktdetailansicht `ws_product.htm`:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{PR-UseAlternativeProductData}
   {APD-UsePriceShadow}
      {PR-PriceShadow}Ursprünglicher Preis: ~PR-PriceShadow~ ~WS-Currency~{/PR-PriceShadow}
      {PR-SetPriceShadow}Ursprünglicher Set-Preis: ~PR-SetPriceShadow~ ~WS-Currency~{/PR-SetPriceShadow}
   {/APD-UsePriceShadow}
{/PR-UseAlternativeProductData}
```

Warenkorbseite `ws_basket.htm`:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{BASKET-PR-UseAlternativeProductData}
   {APD-UsePriceShadow}
      {BASKET-PR-PriceShadow}Ursprünglicher Preis: ~BASKET-PR-PriceShadow~ ~WS-Currency~{/BASKET-PR-PriceShadow}
      {BASKET-PR-SetPriceShadow}Ursprünglicher Set-Preis: ~BASKET-PR-SetPriceShadow~ ~WS-Currency~{/BASKET-PR-SetPriceShadow}
   {/APD-UsePriceShadow}
{/BASKET-PR-UseAlternativeProductData}
```

Beide Beispiele setzen voraus, dass im Eintrag `UsePriceShadowingVariables = yes` gesetzt ist. Die Klammerung [`APD-UsePriceShadow`](https://dokumentation.websale.de/v8s/referenz/tags/alternative-produktdaten-tags) prüft genau das.

## Informationen zum aktiven Eintrag ausgeben

Ebenfalls optional, für die Fehlersuche aber sehr nützlich. Auf einem beliebigen Template geben Sie damit aus, welcher Eintrag gerade greift und mit welchen Einstellungen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{ST-AlternativeProductData}
   ID:               {APD-ID}~APD-ID~{/APD-ID}
   Type:             {APD-TypeProductRule}ProductRule{/APD-TypeProductRule}
                     {APD-TypeAPDataFieldsReplacement}APDataFieldsReplacement{/APD-TypeAPDataFieldsReplacement}
                     {APD-TypeAPDataFieldsComplementary}APDataFieldsComplementary{/APD-TypeAPDataFieldsComplementary}
   FileExtension:    {APD-FileExtension}~APD-FileExtension~{/APD-FileExtension}
   UsePriceShadow:   {APD-UsePriceShadow}yes{/APD-UsePriceShadow}
                     {!APD-UsePriceShadow}no{/!APD-UsePriceShadow}
   ValidFrom:        {APD-ValidFrom}~APD-ValidFrom~{/APD-ValidFrom}
   ValidUntil:       {APD-ValidUntil}~APD-ValidUntil~{/APD-ValidUntil}
   ValidSubshopList: {APD-ValidSubshopList}~APD-ValidSubshopList~{/APD-ValidSubshopList}
   Test:             {APD-Test}yes{/APD-Test}
                     {!APD-Test}no{/!APD-Test}
   Priority:         ~APD-Priority~
{/ST-AlternativeProductData}
```

Die Zeile `FileExtension` ist nur beim Weg über die Produktdaten-Dateien gefüllt.

## Testen und live schalten

Solange `Test = yes` gesetzt ist, greift der Eintrag nur im Testmodus. Rufen Sie den Shop entsprechend auf und prüfen Sie, ob die alternativen Daten wie erwartet angewendet werden.

```text theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
https://www.xyz.de/?test=on
```

Nach dem Test beenden Sie den Testmodus.

```text theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
https://www.xyz.de/?test=off
```

Verläuft der Test erfolgreich, stellen Sie im Eintrag `Test` auf `no`. Damit greift er im Produktivbetrieb.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<+Entry>
   ...
   Test      = no
   ...
</+Entry>
```

Wegweiser: [Testmodi des Shops ein- und ausschalten](https://dokumentation.websale.de/v8s/domains/testmodi-des-shops-ein-ausschalten.md)


## Related topics

- [Alternative Produktdaten: Tags](https://dokumentation.websale.de/v8s/referenz/tags/alternative-produktdaten-tags.md)
- [Konfiguration product_alternatives.cfg](https://dokumentation.websale.de/v8s/referenz/konfigurationen/konfiguration-product-alternatives-cfg.md)
- [PR- (Grundlagen und Produktdaten)](https://dokumentation.websale.de/v8s/referenz/tags/pr/grundlagen-und-produktdaten.md)
- [Anreichern von Produktdaten](https://dokumentation.websale.de/v8s/produkte/anreichern-von-produktdaten.md)
- [ST- (Seitenzustand und Navigation)](https://dokumentation.websale.de/v8s/referenz/tags/st/seitenzustand-und-navigation.md)


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