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

# Geschenkprodukte

> Wie Sie in WEBSALE V8s Geschenke als Bestellanreiz anbieten, entweder zur Auswahl durch den Käufer oder automatisch ab einem Mindestbestellwert.

Geschenke sind ein Bestellanreiz: Der Käufer bekommt ab einem bestimmten Warenwert etwas dazu. WEBSALE V8s kennt dafür zwei Wege, die sich darin unterscheiden, wer das Geschenk aussucht.

| Weg | Der Käufer | Aufwand |
| - | - | - |
| Geschenkauswahl anbieten | wählt selbst aus einem Sortiment, im Rahmen eines Budgets | freie Felder, Konfiguration und Templates |
| Geschenke automatisch in den Warenkorb legen | bekommt feste Geschenke ab festen Schwellen | nur Pflege im WSPManager |

Die Auswahl ist für Käufer attraktiver, die automatische Variante ist in wenigen Minuten eingerichtet.

## Geschenkauswahl anbieten

### Funktionsprinzip

Jedes Geschenkprodukt bekommt einen nominellen Warenwert zugewiesen. Dieser Wert ist kein Preis, das Geschenk kostet nichts. Er dient als Verrechnungsgröße gegen den Warenwert im Warenkorb.

```text theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
verfügbarer Betrag = unrabattierter Warenwert im Warenkorb − Summe der Warenwerte aller gewählten Geschenke
```

Aus dieser einen Rechnung ergeben sich beide Anzeigen im Shop. Ist das Ergebnis positiv, steht dieser Betrag noch für Geschenke zur Verfügung. Ist es negativ, fehlt genau dieser Betrag im Warenkorb.

| Tag | Zeigt | Klammerung trifft zu |
| - | - | - |
| `WS-GiftProductRest` | verfügbarer Restbetrag | wenn noch Budget übrig ist |
| `WS-GiftProductMissingSubTotal` | fehlender Warenwert | wenn das Budget überschritten ist |

Beide Tags geben dieselbe Größe wieder, nur mit umgekehrtem Vorzeichen. Es kann deshalb immer nur eines von beiden einen Wert über null liefern. Genau darauf beruht das Muster aus positiver und negierter Klammerung in den folgenden Beispielen.

### Regeln der Funktion

* Maßgeblich ist der unrabattierte Warenwert. Rabatte auf den Warenkorb vergrößern das Geschenkbudget also nicht.
* Gewählte Geschenke werden nicht im Cookie-Warenkorb gespeichert. Nach Ablauf der Sitzung sind sie weg, während die übrigen Produkte bleiben.
* Gewählte Geschenke erscheinen in den Bestelldaten.
* Löscht der Käufer nachträglich Produkte aus dem Warenkorb, werden die Geschenke nicht automatisch entfernt. Stattdessen lässt sich die Bestellung nicht abschließen, solange die Geschenke das Budget überschreiten. Deshalb braucht die Warenkorbseite eine entsprechende Meldung, siehe unten.

### Schritt 1: Freie Felder definieren

Legen Sie im WSPManager unter **Subshop-Einstellungen > Erweitert > Freie Felder** zwei technische Felder an.

| Technischer Feldname | Typ | Werte | Bedeutung |
| - | - | - | - |
| `GiftProduct` | Text einzeilig mit Auswahlliste | `Y` und `N` | kennzeichnet das Produkt als Geschenkprodukt |
| `GiftProductSubTotal` | Text einzeilig | Betrag in Shop-Basiswährung | nomineller Warenwert des Geschenks |

### Schritt 2: Geschenkprodukte festlegen

Legen Sie eine Kategorie "Geschenkprodukte" an, wahlweise sichtbar oder versteckt. Nehmen Sie neue Produkte auf oder übertragen Sie bestehende hinein.

Setzen Sie bei jedem Geschenkprodukt `GiftProduct` auf `Y` und tragen Sie unter `GiftProductSubTotal` den nominellen Warenwert ein.

> [!WARNING]
>
> Bei Produkten aus bestehenden Kategorien muss der ursprüngliche Preis auf null gesetzt werden. Ein Geschenk mit Preis wäre sonst doppelt berechnet, einmal als Kaufpreis und einmal gegen das Geschenkbudget.

### Schritt 3: Shopkonfiguration erweitern

Zwei Texte in der `shop.config` machen die Funktion für den Käufer verständlich.

Die Fehlermeldung erscheint, wenn der Warenwert für das gewählte Geschenk nicht ausreicht. Ergänzen Sie sie im Abschnitt `<[NotifyMessages-Txt](/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/texte-und-meldungen#notifymessages-txt)>`.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<NotifyMessages-Txt>
   ...
   GiftProductSubTotalUnderValue = Für dieses Gratis-Geschenk fehlt ein Warenwert von ~WS-GiftProductMissingSubTotal~ ~WS-CurrencySymbol~ in Ihrem Warenkorb.
   ...
</NotifyMessages-Txt>
```

Die Standardmeldung nach dem Hinzufügen eines Produkts ist der beste Ort, um auf das Geschenkangebot hinzuweisen. Erweitern Sie im Abschnitt `<[StandardMessages-Txt](/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/texte-und-meldungen#standardmessages-txt)>` den Parameter `BasketMakeOrder` um einen Link auf die Geschenkkategorie und den verfügbaren Betrag.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<StandardMessages-Txt>
   ...
   BasketMakeOrder = Sie können jetzt bestellen oder weitere Produkte auswählen. Für <a href="~CAT-Link(1234)~">Gratis-Geschenke</a> steht Ihnen noch ein Betrag von ~WS-GiftProductRest~ ~WS-CurrencySymbol~ zur Verfügung.
   ...
</StandardMessages-Txt>
```

Ersetzen Sie `1234` durch den Kategorieindex Ihrer Geschenkkategorie.

### Schritt 4: Templates erweitern

Die Anpassungen betreffen Kategorieansicht, Produktdetailansicht und Warenkorb. Damit sich der Restbetrag nach jedem Hinzufügen aktualisiert, ohne dass die Seite neu aufgebaut wird, arbeitet die Funktion mit AJAX.

#### Kategorieansicht: Geschenke bestellbar machen

Erweitern Sie die Schleife `{@PR-Data}` auf `ws_category.htm`. Die Klammerung `PR-GiftProduct` trennt Geschenkprodukte von normalen Produkten, sodass beide Sorten in derselben Liste stehen können.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
...
{@PR-Data}
~DC-Int1_inc~
   <form action="~FORM-Product~" method="post" name="product" id="productform_~DC-Int1~">

      {!PR-GiftProduct}
         <!-- Darstellung und Bestellfunktion normaler Produkte -->
      {/!PR-GiftProduct}

      {PR-GiftProduct}
         ~PR-Name~<br>
         Sie benötigen mindestens einen Warenwert von ~PR-GiftProductSubTotal~ ~WS-CurrencySymbol~, um dieses Produkt bestellen zu können.<br>

         {PR-GiftProductMaxQuantity}
            Maximale Bestellmenge: ~PR-GiftProductMaxQuantity~<br>
         {/PR-GiftProductMaxQuantity}

         {!PR-GiftProductMaxQuantity}
            Der aktuelle Warenwert reicht nicht aus, um dieses Geschenk zu bestellen.
         {/!PR-GiftProductMaxQuantity}

         {ST-DepVar_OK}
            {PR-GiftProductMaxQuantity}
               <label for="~PR-Quantity_input~">Menge</label>
               <input type="text" name="~PR-Quantity_input~" value="~PR-Quantity~">
               <input type="submit" value="Geschenk in den Warenkorb legen" name="~BT-ProductAddToBasket_Ajax_targetCat~" onclick="return ws_AJAXaddToBasket('productform_~DC-Int1~', '~BT-ProductAddToBasket_Ajax_targetCat~', '~WS-Charset~')">
            {/PR-GiftProductMaxQuantity}
         {/ST-DepVar_OK}

         {!ST-DepVar_OK}
            {PR-GiftProductMaxQuantity}
               Dieses Geschenk ist in mehreren Ausführungen verfügbar. <a href="~PR-Link~">Jetzt Ausführung wählen.</a>
            {/PR-GiftProductMaxQuantity}
         {/!ST-DepVar_OK}
      {/PR-GiftProduct}

   </form>
{/@PR-Data}
...
```

Drei Dinge tragen dieses Beispiel:

* `PR-GiftProductMaxQuantity` liefert, wie viele Stück dieses Geschenks das verbleibende Budget noch hergibt. Bei null trifft die Klammerung nicht zu, deshalb verschwindet das Mengenfeld und an seiner Stelle erscheint der Hinweis.
* `ST-DepVar_OK` unterscheidet, ob die Variantenauswahl vollständig ist. Geschenke mit abhängigen Varianten lassen sich aus der Liste heraus nicht bestellen, der Käufer kommt über den Produktlink zur Auswahl.
* `DC-Int1` zählt die Durchläufe hoch und erzeugt so je Produkt ein eindeutig benanntes Formular. Ohne diese eindeutigen IDs spräche die AJAX-Funktion immer dasselbe Formular an.

Liegt Ihr `<form>` außerhalb der Schleife `{@PR-Data}`, müssen Sie die Formular-IDs und den Aufruf von `ws_AJAXaddToBasket()` entsprechend anpassen.

#### Kategorieansicht: Austauschbereich für AJAX festlegen

Damit sich die Angaben zum Budget nach dem Hinzufügen aktualisieren, markieren Sie den Bereich, den die Systembibliothek austauschen soll. Welcher Bereich das ist, hängt vom Aufbau Ihres Templates ab. Im Beispiel ist es der Container `column_middle`.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
...
<div id="column_middle">
   {ST-Ajax}<WS-Ajax-column_middle>{/ST-Ajax}

   {@PR-Data}
      <form action="~FORM-Product~" method="post" name="product" id="productform_~DC-Int1~">
      ...
      </form>
   {/@PR-Data}

   {ST-Ajax}</WS-Ajax-column_middle>{/ST-Ajax}
</div>
...
```

Wegweiser: [Produkt per AJAX in den Warenkorb legen](https://dokumentation.websale.de/v8s/warenkorb/produkt-per-ajax-in-den-warenkorb-legen.md)

#### Kategorieansicht: Erfolgsmeldung ausgeben

`ST-Basket_Success` trifft zu, wenn ein Produkt erfolgreich in den Warenkorb gelegt wurde. Die Meldung fällt unterschiedlich aus, je nachdem ob noch Budget übrig ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
...
{ST-Basket_Success}

   {ST-Ajax}
      <WS-Ajax-WK-Info>
         <div class="stayWK_basket_box">
            Ihr Geschenk wurde erfolgreich in den Warenkorb gelegt.

            {WS-GiftProductRest}
               Sie können jetzt bestellen oder weitere Geschenke auswählen. Hierfür steht Ihnen noch ein Betrag von ~WS-GiftProductRest~ ~WS-CurrencySymbol~ zur Verfügung.
            {/WS-GiftProductRest}

            {!WS-GiftProductRest}
               Sie können jetzt bestellen oder weiter in unserem Shop einkaufen. Für Geschenke steht Ihnen aktuell kein Betrag mehr zur Verfügung.
            {/!WS-GiftProductRest}

            <a href="~WS-BasketLink~" class="button float_right">Zum Warenkorb</a>
         </div>
      </WS-Ajax-WK-Info>
   {/ST-Ajax}

   {!ST-Ajax}
      Ihr Geschenk wurde erfolgreich in den Warenkorb gelegt.
   {/!ST-Ajax}

{/ST-Basket_Success}
...
```

Die Aufteilung in `ST-Ajax` und `!ST-Ajax` sorgt dafür, dass beim AJAX-Aufruf der Austauschbereich geliefert wird und beim normalen Seitenaufruf nur der Text.

#### Kategorieansicht: Restbetrag anzeigen

Vor der Schleife `{@PR-Data}` weisen Sie das verbleibende Budget aus.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{WS-GiftProductRest}
   Sie haben noch ~WS-GiftProductRest~ ~WS-CurrencySymbol~ für Geschenke zur Verfügung.
{/WS-GiftProductRest}
```

#### Produktdetailansicht

Auf `ws_product.htm` ergänzen Sie innerhalb von `{PR-Data}` dieselben Angaben in ausführlicher Form.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{PR-Data}
...
{PR-GiftProduct}
   Für die Bestellung dieses Geschenks benötigen Sie einen Warenkorbwert von ~PR-GiftProductSubTotal~ ~WS-CurrencySymbol~.<br>

   {PR-GiftProductMaxQuantity}
      Ihre aktuell maximale Bestellmenge für dieses Geschenk ist: ~PR-GiftProductMaxQuantity~<br>
   {/PR-GiftProductMaxQuantity}

   {!PR-GiftProductMaxQuantity}
      Der aktuelle Warenkorbwert reicht nicht aus, um dieses Geschenk bestellen zu können.
   {/!PR-GiftProductMaxQuantity}
{/PR-GiftProduct}
...
{/PR-Data}
```

#### Warenkorb: Überschreitung melden

Diese Meldung ist nicht optional. Ohne sie erlebt der Käufer, dass sich seine Bestellung nicht abschließen lässt, ohne zu erfahren warum. Setzen Sie den Bereich auf `ws_basket.htm` vor `{BASKET-PR-Data}`.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
...
{!ST-BasketGiftProducts_OK}
   <div class="box_error">
      Sie haben zu viele Geschenke in den Warenkorb gelegt.<br>
      Für diese Geschenk-Bestellung fehlt Ihnen ein Warenwert von ~WS-GiftProductMissingSubTotal~ ~WS-CurrencySymbol~.
   </div>
{/!ST-BasketGiftProducts_OK}

{BASKET-PR-Data}
   ...
{/BASKET-PR-Data}
...
```

#### Warenkorb: Geschenke kennzeichnen

Innerhalb der Schleife `{@BASKET-PR-Data}` weisen Sie jede Geschenkposition als solche aus.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
...
{@BASKET-PR-Data}
   ...
   {BASKET-PR-GiftProduct}
      Dies ist ein Gratis-Geschenk.<br>
      Benötigter Warenwert je Stück: ~BASKET-PR-GiftProductSubTotalNeeded~ ~WS-CurrencySymbol~<br>
      Benötigter Warenwert gesamt: ~BASKET-PR-GiftProductTotalSubTotalNeeded~ ~WS-CurrencySymbol~
   {/BASKET-PR-GiftProduct}
   ...
{/@BASKET-PR-Data}
...
```

## Geschenke automatisch in den Warenkorb legen

Hier entscheidet nicht der Käufer, sondern eine feste Schwelle. Überschreitet der Warenwert sie, legt der Shop das Geschenk selbst dazu.

### Pflege im WSPManager

Wählen Sie in der Baumstruktur den gewünschten Subshop, dann **Kategorien ohne Menü > Warenkorb**. Klicken Sie auf der Registerkarte **Produkte** mit der rechten Maustaste, wählen Sie **Produkte zuweisen** und markieren Sie die gewünschten Produkte. Übernehmen Sie sie mit der Pfeil-Schaltfläche in die Liste "Zugewiesene Produkte" und bestätigen Sie mit **OK**.

Auswählbar sind nur Produkte mit dem Preis `0.00`.

Tragen Sie anschließend je Produkt in der Spalte **Mindestbestellwert** den Warenwert ein, ab dem das Geschenk hinzugefügt wird.

### Pflege über ein Warenwirtschaftssystem

Nutzen Sie ein angeschlossenes System, erfolgt Auswahl und Kennzeichnung dort. Jedes vorgesehene Produkt kommt in die Gruppe "Warenkorb" und bekommt einen Mindestbestellwert zugewiesen.

### Wie sich die Schwellen addieren

Die Schwellen schließen einander nicht aus. Jedes Geschenk, dessen Schwelle erreicht ist, kommt hinzu.

| Warenwert | Geschenke im Warenkorb |
| - | - |
| ab 100 EUR | Produkt A |
| ab 300 EUR | Produkt A und B |
| ab 500 EUR | Produkt A, B und C |

## Tags im Überblick

### Produktansichten

| Tag | Bedeutung |
| - | - |
| `PR-GiftProduct` | Klammerung, trifft zu, wenn das Produkt ein Geschenkprodukt ist |
| `PR-GiftProductSubTotal` | nomineller Warenwert des Geschenks |
| `PR-GiftProductMaxQuantity` | bestellbare Stückzahl aus dem verbleibenden Budget, auch als Klammerung |
| `BT-ProductAddToBasket_Ajax_targetCat` | Bestell-Button mit Rücksprung auf die Kategorieansicht |
| `BT-ProductAddToBasket_Ajax_targetProd` | Bestell-Button mit Rücksprung auf die Produktdetailansicht |

### Budget

| Tag | Bedeutung |
| - | - |
| `WS-GiftProductRest` | verfügbarer Restbetrag, auch als Klammerung |
| `WS-GiftProductMissingSubTotal` | fehlender Warenwert, auch als Klammerung |

### Warenkorb

| Tag | Bedeutung |
| - | - |
| `ST-BasketGiftProducts_OK` | Klammerung, trifft zu, wenn der Warenwert für die Geschenke im Warenkorb reicht |
| `BASKET-PR-GiftProduct` | Klammerung, trifft zu, wenn die Position ein Geschenkprodukt ist |
| `BASKET-PR-GiftProductSubTotalNeeded` | benötigter Warenwert je Stück |
| `BASKET-PR-GiftProductTotalSubTotalNeeded` | benötigter Warenwert für die gesamte Menge dieser Position |
| `ST-Basket_Success` | Klammerung, trifft zu, wenn ein Produkt erfolgreich hinzugefügt wurde |

## Verwandte Themen

* Wegweiser: [Gewählte Kategorie anzeigen](https://dokumentation.websale.de/v8s/kategorien/kategorie-anzeigen.md)
* Wegweiser: [Produkt per AJAX in den Warenkorb legen](https://dokumentation.websale.de/v8s/warenkorb/produkt-per-ajax-in-den-warenkorb-legen.md)


## Related topics

- [Besondere Produktarten im Warenkorb](https://dokumentation.websale.de/v8s/referenz/tags/basket/besondere-produktarten-im-warenkorb.md)
- [Warenkorb, Preise, Währung und Bonus](https://dokumentation.websale.de/v8s/referenz/tags/ws/warenkorb-preise-waehrung-und-bonus.md)
- [Schaltflächen auf Produkt- und Warenkorbseite](https://dokumentation.websale.de/v8s/referenz/tags/bt/produkt-und-warenkorb.md)
- [Geräteübergreifender Warenkorb](https://dokumentation.websale.de/v8s/warenkorb/geraeteuebergreifender-warenkorb.md)


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