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

# OFFER- (Kundenspezifische Angebote)

> Angebote anzeigen, die einem einzelnen Kunden gemacht wurden: die Angebote durchlaufen, Kopfdaten und Summen ausgeben und die Angebotsprodukte mit ihren Sonderpreisen und Rabatten auflisten.

Ein kundenspezifisches Angebot ist eine Preisliste, die nur für einen einzelnen Kunden gilt: bestimmte Produkte zu bestimmten Mengen und Preisen, befristet bis zu einem Gültigkeitsdatum. Die Angebote werden in den Shop importiert und dem Kunden über seine Kundennummer zugeordnet. Sieht er sie im Shop an, kauft er zu diesen Preisen.

Dafür gibt es zwei Tag-Familien. `OFFER-` liefert die Kopfdaten eines Angebots, also Nummer, Datum, Kosten und Summen. `OPR-` liefert die Produkte darin, also Name, Menge, Angebotspreis und Rabatt. Zusammengehalten wird beides von zwei ineinandergeschachtelten Schleifen.

Wegweiser: [Kundenspezifische Angebote](https://dokumentation.websale.de/v8s/marketing-funktionen/kundenspezifische-angebote.md) · Referenz: Abschnitt Offers

## Der Aufbau einer Angebotsseite

Das Shopsystem legt die Angebote eines Kunden und die Produkte eines Angebots in zwei getrennten Listen ab. Die äußere Schleife `{@WS-OffersList}` läuft über die Angebote und lädt dabei jedes Mal die Produkte des gerade erreichten Angebots nach. Erst danach steht die innere Schleife `{@OPR-Data}` auf gefüllten Daten.

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

      <h2>Angebot ~OFFER-ID~ vom ~OFFER-Date~</h2>
      <p>gültig bis ~OFFER-ExpireDate~</p>

      {CAT-AdvData($Offers,99)}
         <table>
            {@OPR-Data}
               <tr>
                  <td>~OPR-Number~</td>
                  <td>~OPR-Name~</td>
                  <td>~OPR-Quantity~ ~OPR-Unit~</td>
                  <td>~OPR-Price~</td>
               </tr>
            {/@OPR-Data}
         </table>
      {/CAT-AdvData($Offers,99)}

      <p>Gesamtsumme: ~OFFER-TotalSumGross~</p>

   {/@WS-OffersList}
{/WS-OffersList}

{!WS-OffersList}
   <p>Für Sie liegen derzeit keine Angebote vor.</p>
{/!WS-OffersList}
```

> [!WARNING]
>
> Die Reihenfolge ist zwingend. Außerhalb von `{@WS-OffersList}` ist kein Angebot ausgewählt, und alle `OFFER-`Tags gelten dann als ungültiges Tag. Die `OPR-`Tags wiederum brauchen zusätzlich die Klammerung `{CAT-AdvData($Offers,99)}`, weil erst sie die Produktliste des Angebots bereitstellt.

Die äußere Schleife berechnet bei jedem Durchlauf die Summen des Angebots neu. Die Tags `OFFER-TotalSumNet`, `OFFER-TotalSumGross` und `OFFER-TotalSumVAT` sind deshalb nur innerhalb der Schleife verlässlich.

Die Zahl im Argument von `CAT-AdvData` begrenzt sonst die Anzahl der gelisteten Produkte. Für `$Offers` wertet das Shopsystem sie nicht aus, die Schleife läuft immer über alle Produkte des Angebots. Schreiben Sie die Zahl trotzdem hin, damit die Schreibweise zu allen anderen `CAT-AdvData`-Bereichen passt.

`WS-OffersList` ist bei WS- (Allgemeine Tags) beschrieben, `CAT-AdvData` bei CAT- (Kategorien und Produktlisten).

## Die Kopfdaten eines Angebots

| Tag | Liefert |
| - | - |
| `OFFER-ID` | die Angebotsnummer |
| `OFFER-Date` | das Angebotsdatum |
| `OFFER-ExpireDate` | das Gültigkeitsdatum |
| `OFFER-Descr` | die Beschreibung des Angebots |

Alle vier arbeiten auch als Klammerung und greifen, wenn ein Wert vorliegt. Das lohnt sich bei `OFFER-Descr` und `OFFER-ExpireDate`, denn beide Felder sind im Import nicht verpflichtend.

## Zahlungsart, Versandart und Summen

Zu jedem Angebot gehören eine Zahlungsart, eine Versandart und die daraus folgenden Kosten. Es gibt sie jeweils in drei Varianten: netto, brutto und als Mehrwertsteueranteil.

| Tag | Liefert |
| - | - |
| `OFFER-PaymentCostNet` | die Nettokosten der Zahlungsart |
| `OFFER-PaymentCostGross` | die Bruttokosten der Zahlungsart |
| `OFFER-PaymentCostVAT` | den Mehrwertsteueranteil der Zahlungsart |
| `OFFER-DeliveryCostNet` | die Nettokosten der Versandart |
| `OFFER-DeliveryCostGross` | die Bruttokosten der Versandart |
| `OFFER-DeliveryCostVAT` | den Mehrwertsteueranteil der Versandart |
| `OFFER-TotalSumNet` | die Nettogesamtsumme des Angebots |
| `OFFER-TotalSumGross` | die Bruttogesamtsumme des Angebots |
| `OFFER-TotalSumVAT` | den Mehrwertsteueranteil der Gesamtsumme |

Dazu kommen die Namen der beiden Arten und drei ältere Tags ohne Aufteilung.

| Tag | Liefert |
| - | - |
| `OFFER-PaymentName` | den Namen der Zahlungsart |
| `OFFER-DeliveryName` | den Namen der Versandart |
| `OFFER-PaymentCost` | die Kosten der Zahlungsart |
| `OFFER-DeliveryCost` | die Kosten der Versandart |
| `OFFER-TotalSum` | die Gesamtsumme des Angebots |

`OFFER-PaymentName` und `OFFER-DeliveryName` sind der einzige Weg, dem Kunden überhaupt zu zeigen, welche Zahlungs- und Versandart für sein Angebot hinterlegt sind. Die drei Kostentags ohne Suffix stammen aus der Zeit vor der Aufteilung in netto und brutto. Verwenden Sie in neuen Templates die Varianten mit `Net`, `Gross` und `VAT`, weil dort eindeutig ist, was ausgegeben wird.

Alle Beträge werden im Zahlenformat des Shops ausgegeben, also mit dem konfigurierten Dezimaltrennzeichen und der konfigurierten Tausendertrennung. Eine Währungsangabe hängt das Shopsystem nicht an, die setzen Sie selbst mit `WS-Currency` oder `WS-CurrencySymbol`.

## Die Produkte eines Angebots

`OPR-Data` ist ausschließlich ein Schleifen-Tag. Als Einzel-Tag oder Klammerung gibt es nichts aus. Die Prüfung, ob überhaupt Produkte vorliegen, übernimmt die Klammerung `{CAT-AdvData($Offers,99)}` darüber, die sich bei einem leeren Angebot von selbst ausblendet.

| Tag | Liefert |
| - | - |
| `OPR-Name` | den Produktnamen |
| `OPR-Number` | die Produktnummer |
| `OPR-Insert` | den Zusatztext des Produkts |
| `OPR-Quantity` | die Bestellmenge |
| `OPR-Unit` | die Einheit |
| `OPR-Image` | die Adresse des Produktbildes |
| `OPR-Variations` | die fest zugewiesenen Varianten |

`OPR-Image` liefert eine fertige Adresse auf das Produktbild, nicht nur den Dateinamen. Liegt kein Bild vor, bleibt die Ausgabe leer und die Klammerung greift nicht, sodass Sie die Bildspalte sauber weglassen können.

> [!WARNING]
>
> `OPR-Quantity` gibt die Menge ohne Nachkommastellen aus. Bei Produkten, die in Bruchteilen bestellt werden, beispielsweise Meterware, sehen Sie im Template die abgeschnittene Zahl. Gerechnet wird intern mit dem vollen Wert.

### Varianten anzeigen

`OPR-Variations` hat zwei Aufgaben. Als Einzel-Tag gibt es die fest zugewiesenen Varianten des Angebotsprodukts aus, also beispielsweise Größe und Farbe. Als Klammerung greift es, wenn Varianten oder Texteingabefelder vorliegen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{OPR-Variations}
   <p class="varianten">~OPR-Variations~</p>
{/OPR-Variations}
```

### Die Preise

| Tag | Liefert |
| - | - |
| `OPR-Price` | den Angebotspreis, wie er im Angebot hinterlegt ist |
| `OPR-NetPrice` | den Nettoangebotspreis |
| `OPR-GrossPrice` | den Bruttoangebotspreis |
| `OPR-VAT` | den Mehrwertsteueranteil des Angebotspreises |

> [!WARNING]
>
> Alle vier Preise beziehen sich auf die **Bestellmenge**, nicht auf das einzelne Stück. Bei einer Menge von 10 steht in `OPR-GrossPrice` der Preis für alle zehn. Wollen Sie einen Stückpreis zeigen, müssen Sie ihn selbst ausweisen oder im Angebot eine Menge von 1 hinterlegen.

### Der Rabatt

| Tag | Liefert |
| - | - |
| `OPR-DiscountRate` | den Rabatt in Prozent |
| `OPR-Discount` | den Rabatt als Betrag |

Im Angebot geben Sie nur einen der beiden Werte an. Den jeweils anderen rechnet das Shopsystem aus. Geben Sie den Prozentsatz an, ergibt sich der Betrag, geben Sie den Betrag an, ergibt sich der Prozentsatz.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{OPR-DiscountRate}
   <span class="rabatt">~OPR-DiscountRate~ % gespart</span>
{/OPR-DiscountRate}
```

Beide Tags geben bei einem Wert von null eine leere Zeichenkette aus. Die Klammerung greift dann nicht, und der Rabatthinweis verschwindet von selbst. Sie brauchen also keine eigene Prüfung auf "kein Rabatt".

## Ein Angebot auswählen

Hat ein Kunde mehrere Angebote, gibt es zwei Wege, sie ihm zu zeigen.

Der erste ist eine Auswahlliste. Dafür setzen Sie `WS-OffersList` als Einzel-Tag. Das Shopsystem baut daraus eine fertige Selectbox mit allen Angeboten des Kunden, und der Kunde sieht immer nur das gewählte.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<form action="~FORM-Offers~" method="post">
   ~WS-OffersList~
</form>
```

Der zweite Weg ist die Schleife von oben, die alle Angebote untereinander auf eine Seite setzt. Dann braucht jedes Angebot ein eigenes Formular, und darin muss stehen, um welches Angebot es geht. Das erledigt `WS-PrintHiddenOfferInput`.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{@WS-OffersList}
   <form action="~FORM-Offers~" method="post">
      ~WS-PrintHiddenOfferInput~
      ...
   </form>
{/@WS-OffersList}
```

`WS-PrintHiddenOfferInput` erzeugt ein vollständiges verstecktes Eingabefeld mit dem Index des aktuellen Schleifendurchlaufs. Sie schreiben also kein `input`-Element darum herum. Setzen Sie es nur innerhalb der Schleife, denn außerhalb steht der Index auf null.

`WS-OffersCount` gibt die Anzahl der Angebote aus und eignet sich für eine Überschrift über der Liste.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<p>Für Sie liegen ~WS-OffersCount~ Angebote vor.</p>
```

## Meldungen

`MSG-Offers_Notify` gibt Hinweistexte rund um die Angebote aus, beispielsweise wenn ein Angebot abgelaufen ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{MSG-Offers_Notify}
   <p class="hinweis">~MSG-Offers_Notify~</p>
{/MSG-Offers_Notify}
```

Referenz: [MSG- (Meldungen)](https://dokumentation.websale.de/v8s/referenz/tags/msg-meldungen.md)

## Die Tags im Überblick

| Tag | Einzel-Tag | Bereichs-Tag | negatives Bereichs-Tag | Schleifen-Tag |
| - | - | - | - | - |
| `OFFER-ID` | ja | ja | ja | – |
| `OFFER-Date` | ja | ja | ja | – |
| `OFFER-ExpireDate` | ja | ja | ja | – |
| `OFFER-Descr` | ja | ja | ja | – |
| `OFFER-PaymentName` | ja | ja | ja | – |
| `OFFER-PaymentCost` | ja | ja | ja | – |
| `OFFER-PaymentCostNet` | ja | ja | ja | – |
| `OFFER-PaymentCostGross` | ja | ja | ja | – |
| `OFFER-PaymentCostVAT` | ja | ja | ja | – |
| `OFFER-DeliveryName` | ja | ja | ja | – |
| `OFFER-DeliveryCost` | ja | ja | ja | – |
| `OFFER-DeliveryCostNet` | ja | ja | ja | – |
| `OFFER-DeliveryCostGross` | ja | ja | ja | – |
| `OFFER-DeliveryCostVAT` | ja | ja | ja | – |
| `OFFER-TotalSum` | ja | ja | ja | – |
| `OFFER-TotalSumNet` | ja | ja | ja | – |
| `OFFER-TotalSumGross` | ja | ja | ja | – |
| `OFFER-TotalSumVAT` | ja | ja | ja | – |
| `OPR-Data` | – | – | – | ja |
| `OPR-Name` | ja | ja | ja | – |
| `OPR-Number` | ja | ja | ja | – |
| `OPR-Insert` | ja | ja | ja | – |
| `OPR-Quantity` | ja | ja | ja | – |
| `OPR-Unit` | ja | ja | ja | – |
| `OPR-Image` | ja | ja | ja | – |
| `OPR-Variations` | ja | ja | ja | – |
| `OPR-Price` | ja | ja | ja | – |
| `OPR-NetPrice` | ja | ja | ja | – |
| `OPR-GrossPrice` | ja | ja | ja | – |
| `OPR-VAT` | ja | ja | ja | – |
| `OPR-DiscountRate` | ja | ja | ja | – |
| `OPR-Discount` | ja | ja | ja | – |

Alle `OFFER-`Tags gelten nur innerhalb der Schleife `{@WS-OffersList}`, alle `OPR-`Tags zusätzlich nur innerhalb von `{@OPR-Data}`. Die Tag-Namen wertet das Shopsystem ohne Rücksicht auf Groß- und Kleinschreibung aus.

## Verwandte Themen

* Wegweiser: [Kundenspezifische Angebote](https://dokumentation.websale.de/v8s/marketing-funktionen/kundenspezifische-angebote.md)
* Referenz: [Abschnitt Offers](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/warenkorb-und-bestellprozess.md#offers)
* Referenz: [WS- (Allgemeine Tags)](https://dokumentation.websale.de/v8s/referenz/tags/ws/shop-seite-und-technik.md)
* Referenz: [CAT- (Kategorien und Produktlisten)](https://dokumentation.websale.de/v8s/referenz/tags/cat/kategoriedaten.md)


## Related topics

- [Kundenspezifische Angebote](https://dokumentation.websale.de/v8s/marketing-funktionen/kundenspezifische-angebote.md)
- [Warenkorb und Bestellprozess](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/warenkorb-und-bestellprozess.md)
- [CustomOfferAPI](https://dokumentation.websale.de/v8s/schnittstellen/produkte-und-kategorien/custom-offer-api.md)
- [Navigation und Kategoriebaum](https://dokumentation.websale.de/v8s/referenz/tags/cat/navigation-und-kategoriebaum.md)
- [Shopkonfiguration global.config](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-global-config.md)


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