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

# BestPrice-Order-Modul

> Virtuelle Einkaufsgemeinschaften für B2B-Shops: Mehrere Käufer bestellen dasselbe Produkt vor, die Mengen werden zusammengezählt, und alle bekommen den besten Staffelpreis.

Ein Staffelpreis, der erst ab 50.000 Stück gilt, nützt einem Käufer nichts, der 10.000 braucht. Fünf solcher Käufer zusammen kämen auf die Menge, nur wissen sie nichts voneinander.

Das BestPrice-Order-Modul schließt diese Lücke. Es bündelt die Bestellungen mehrerer Käufer zu einer virtuellen Einkaufsgemeinschaft. Jeder bestellt für sich, wird für sich beliefert und bekommt seine eigene Rechnung, aber die Mengen zählen gemeinsam für die Staffel.

Die einzelnen Bestellungen werden zunächst als verbindliche Vorbestellung gespeichert. Erst nach Ende des Aktionszeitraums, wenn die Gesamtmenge und damit der Preis feststeht, werden sie zu echten Bestellungen. Jeder Käufer bekommt den zuletzt erreichten und damit günstigsten Preis, auch wenn er als Erster bestellt hat.

Auf Wunsch lassen sich Kampagnen über mehrere Subshops hinweg zusammenzählen.

## Was der Käufer sieht

**In der Produktübersicht** können Sie Produkte mit laufender Aktion grafisch hervorheben, beispielsweise mit einer Kennzeichnung "Aktion".

![Bestprice1](https://mintcdn.com/websaleag-44ee7ea6/3oj9a6fdwupCK3vQ/images/bestprice1.jpg?fit=max\&auto=format\&n=3oj9a6fdwupCK3vQ\&q=85\&s=49efe42b6fe8f7978836d590dc5d0e82)

**In der Produktansicht** sieht der Käufer, wie lange die Aktion läuft, wann ausgeliefert wird, welcher Preis gerade gilt und welche Menge bisher zusammengekommen ist. Steigt die Menge über die nächste Staffelstufe, sinkt der angezeigte Preis automatisch.

![Bestprice2](https://mintcdn.com/websaleag-44ee7ea6/3oj9a6fdwupCK3vQ/images/bestprice2.jpg?fit=max\&auto=format\&n=3oj9a6fdwupCK3vQ\&q=85\&s=e7c3e9bdaa2b09aa63a0566c70eb3046)

**Im Kundenkonto** sieht er alle laufenden Aktionen, an denen er beteiligt ist: Zeitpunkt seiner Vorbestellung, Restlaufzeit, Produktdaten und den Preis, der ihm mindestens sicher ist.

![Bestprice3](https://mintcdn.com/websaleag-44ee7ea6/3oj9a6fdwupCK3vQ/images/bestprice3.jpg?fit=max\&auto=format\&n=3oj9a6fdwupCK3vQ\&q=85\&s=63692a095f09d3882c733fc4ef01d349)

**Nach Aktionsende** bekommt er eine Bestellbestätigung mit dem endgültigen Preis.

## Der Ablauf einer Vorbestellung

![Bestprice4 Jpg](https://mintcdn.com/websaleag-44ee7ea6/3oj9a6fdwupCK3vQ/images/bestprice4.jpg.png?fit=max\&auto=format\&n=3oj9a6fdwupCK3vQ\&q=85\&s=28302e7fc17e947d282297df41b9fbba)

Eine BestPrice-Order läuft **nicht** durch den normalen Bestellprozess des Shops. Nach dem Klick auf "Bestellen" erscheint eine Zwischenseite mit:

* den Daten des BestPrice-Produkts
* der hinterlegten Rechnungsadresse
* der hinterlegten optionalen Lieferadresse
* der Zahlungsart Rechnung

Dort wählt der Käufer, ob an die Rechnungs- oder an die Lieferadresse geliefert werden soll. Zusätzlich lassen sich auf dieser Seite seine übrigen Reservierungen aus laufenden Kampagnen anzeigen, sodass er sieht, was insgesamt auf ihn zukommt.

Erst der Klick auf "verbindlich bestellen" schließt die Vorbestellung ab.

Jede Vorbestellung läuft über die Zahlungsart Rechnung. Der zu zahlende Betrag steht im Moment der Bestellung noch nicht fest, und Online-Bezahlverfahren brauchen einen Betrag. Deshalb ist diese Zahlungsart hier keine Einstellungssache, sondern eine Folge der Konstruktion.

> [!WARNING]
>
> Vorbestellungen sind verbindlich und lassen sich weder ändern noch stornieren. Das ist keine Bequemlichkeitsentscheidung: Jede Vorbestellung beeinflusst den Preis aller anderen Teilnehmer. Nehmen Sie diese Verbindlichkeit ausdrücklich in Ihre AGB auf, bevor Sie die erste Kampagne starten.

Hat ein Käufer mehrere BestPrice-Produkte vorbestellt, werden sie nur dann zu einer Bestellung zusammengefasst, wenn Rechnungs- und Lieferadresse **zum Zeitpunkt der Vorbestellung** identisch waren. Sonst entstehen mehrere Bestellungen.

## Schritt 1: Freischaltung

Das Modul muss für Ihren Shop freigeschaltet werden. Wenden Sie sich dafür an Ihren Ansprechpartner bei der WEBSALE AG.

Klären Sie bei der Gelegenheit gleich zwei Fragen mit:

* Sollen Bestellungen über alle Subshops hinweg zusammengezählt werden?
* Sollen täglich wiederkehrende Kampagnen möglich sein?

## Schritt 2: Die Produkte kennzeichnen

Kennzeichnen Sie die BestPrice-Produkte in den Produktdaten und legen Sie dort die festen Aktionszeiträume und die Staffelpreise fest.

## Schritt 3: Die Shopkonfiguration ergänzen

Das Modul bringt vier eigene Abschnitte in der `shop.config` mit.

| Abschnitt | Wofür |
| - | - |
| `<BestPrice>` | die Templates und die Codes für Zahlungs- und Versandart |
| `<BestPrice-PreorderMail>` | Absender und Betreff der Bestätigung an den Käufer |
| `<BestPrice-OrderErrorMail>` | Absender, Betreff und Empfänger der Fehlermeldung an Sie |
| `<BestPrice-Txt>` | die Informations- und Fehlermeldungen im Shop |

### Die Grundeinstellungen

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<BestPrice>
   Template           = incl_bestprice.htm
   TemplateShowOrders = incl_bestprice_show_orders.htm
   PreorderMail       = mail_bestprice_preorder.htm
   OrderErrorMail     = mail_bestprice_error.htm
   PaymentCode        = 6
   DeliveryCode       =
</BestPrice>
```

| Parameter | Bedeutung |
| - | - |
| `Template` | das Template der Bestellfunktion auf der Produktseite |
| `TemplateShowOrders` | das Template der Reservierungsübersicht |
| `PreorderMail` | das Template der Bestätigungsmail an den Käufer |
| `OrderErrorMail` | das Template der Fehlermail an Sie |
| `PaymentCode` | der numerische Code der zu verwendenden Zahlungsart |
| `DeliveryCode` | der Code der zu verwendenden Versandart |

`PaymentCode = 6` ist der Code für die Zahlungsart Rechnung. Er passt damit zu dem, was die Konstruktion ohnehin verlangt.

Die vier Template-Parameter enthalten nur die Dateinamen. Absender, Betreff und Empfänger der beiden Mails stehen in den eigenen Abschnitten weiter unten. Diese Trennung ist der häufigste Stolperstein bei der Einrichtung.

Referenz: [Abschnitt BestPrice](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/preise-steuern-und-waehrung.md#bestprice)

### Die Bestätigung an den Käufer

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<BestPrice-PreorderMail>
   Allow         = yes
   Subject-Txt   = Ihre Reservierung war erfolgreich
   SenderName    = Mein Shop, Produktreservierung
   SenderAddress = shop@mein-shop.de
</BestPrice-PreorderMail>
```

Referenz: [Abschnitt BestPrice-PreorderMail](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/preise-steuern-und-waehrung.md#bestprice-preordermail)

### Die Fehlermeldung an Sie

Diese Mail geht an Sie, wenn beim Erzeugen der finalen Bestellungen nach Aktionsende etwas schiefgeht.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<BestPrice-OrderErrorMail>
   Allow           = yes
   Subject-Txt     = Fehler bei der Generierung von BestPrice-Bestellungen
   SenderName      = BestPrice-Order-Modul
   SenderAddress   = error@mein-shop.de
   ReceiverAddress = admin@mein-shop.de
</BestPrice-OrderErrorMail>
```

> [!WARNING]
>
> Lassen Sie diese Mail eingeschaltet und tragen Sie eine Adresse ein, die auch gelesen wird. Der Fehlerfall tritt nach Aktionsende auf, also genau dann, wenn aus verbindlichen Vorbestellungen echte Bestellungen werden sollen. Wenn das scheitert und niemand es merkt, warten Käufer auf Ware, die nie bestellt wurde.

Referenz: [Abschnitt BestPrice-OrderErrorMail](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/preise-steuern-und-waehrung.md#bestprice-ordererrormail)

### Die Meldungen im Shop

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<BestPrice-Txt>
   ErrorNoAmount             = Bitte wählen Sie die gewünschte Stückzahl.
   ErrorNoAddress            = Für dieses Kundenkonto ist noch keine Adresse hinterlegt. Bitte tragen Sie Ihre Adresse im Kundenkonto ein.
   ErrorNotLoggedIn          = Sie sind nicht angemeldet. Bitte melden Sie sich an.
   ErrorCampaignNotActivated = Die Kampagne ist noch nicht aktiv.
   ErrorCampaignFinished     = Die Kampagne ist bereits beendet.
   ErrorNotConfirmed         = Bitte akzeptieren Sie die AGB.
   ErrorNoDoubleOrder        = Die Reservierung wurde bereits abgeschickt. Wenn Sie das Produkt erneut reservieren möchten, wählen Sie es noch einmal aus und führen Sie die Reservierung erneut aus.
   InfoPreordered            = Vielen Dank für Ihre Reservierung
</BestPrice-Txt>
```

Referenz: [Abschnitt BestPrice-Txt](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/preise-steuern-und-waehrung.md#bestprice-txt)

## Schritt 4: Die Produktdetailansicht

### Das Modul aufrufen

Auf der Produktdetailseite `ws_product.htm` entscheidet das Produktfeld `PR-StarBestPriceTable`, ob es sich um ein BestPrice-Produkt handelt. Ist es gesetzt, rufen Sie das Modul auf, statt das gewohnte Warenkorbformular auszugeben.

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

   {PR-StarBestPriceTable}
      <!-- BestPrice-Produkt: das Modul uebernimmt -->
      ~WS-DisablePriceAndNumberFormat~
      ~DC-FPBPParam1_set(?$EXTDATA-ALL$&m=$WS-MallID$&s=$WS-ShopID$&ss=$WS-SubShopID$&pi=$PR-ProdIndex$&bpn=$PR-Name$&pn=$PR-Number$)~
      ~DC-FPBPParam2_set(&bpt=$PR-StarBestPriceTable$&bpp=$PR-StarBestPricePeriod$&basicpr=$PR-Price$&wl=$A-WarrantyList$)~
      ~WS-EnablePriceAndNumberFormat~
      ~WS-ExternInclude($URL-Homepage$/cgi/wsbestprice/wsbestprice.cgi$DC-FPBPParam1$$DC-FPBPParam2$)~
   {/PR-StarBestPriceTable}

   {!PR-StarBestPriceTable}
      <!-- gewoehnliches Produkt: Produktdaten und Warenkorbformular -->
   {/!PR-StarBestPriceTable}

{/PR-Data}
```

> [!WARNING]
>
> Die Klammer `~WS-DisablePriceAndNumberFormat~` und `~WS-EnablePriceAndNumberFormat~` um die beiden Parameterzeilen ist notwendig. Preis und Staffeltabelle müssen unformatiert an das Modul übergeben werden. Mit Tausenderpunkt und Währungssymbol kann das Modul nicht rechnen.

Die Parameter werden auf zwei Variablen verteilt, weil die Zeichenkette sonst zu lang wird. Beim Aufruf werden beide hintereinander an die Adresse gehängt.

Referenz: [DC-FPX\_set()](https://dokumentation.websale.de/v8s/referenz/tags/dc/parameter.md#die-tags-im-uberblick) · [WS-DisablePriceAndNumberFormat](https://dokumentation.websale.de/v8s/referenz/tags/ws/shop-seite-und-technik.md#die-tags-im-uberblick) · [WS-EnablePriceAndNumberFormat](https://dokumentation.websale.de/v8s/referenz/tags/ws/shop-seite-und-technik.md#die-tags-im-uberblick) · [WS-ExternInclude()](https://dokumentation.websale.de/v8s/referenz/tags/ws/merkzettel-vergleich-upload-und-externe-dienste.md) · PR-"technischer Name"

### Das Template der Bestellfunktion anlegen

Legen Sie eine Datei unter dem Namen an, den Sie bei `Template` eingetragen haben, im Beispiel `incl_bestprice.htm`.

Unter Materialien liegt ein fertiges Beispiel-Template. Sie brauchen es nur an Ihr Shop-Design anzupassen.

Materialien: [Materialien BestPrice-Order-Modul](https://dokumentation.websale.de/v8s/materialien/materialien-bestprice-order-modul.md) · Referenz: [E-BP-Tags](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md)

## Schritt 5: Die Reservierungsübersicht

Der Käufer soll seine Vormerkungen im Kundenkonto einsehen können. Dafür brauchen Sie zwei Templates und einen Link.

### Das Haupt-Template

Legen Sie eine Datei an, beispielsweise `tpl_bestprice_show_orders.htm`. Sie enthält nur den Aufruf des Moduls mit der Aktion `show_orders`.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FPBPParam_set(?$EXTDATA-ALL$&wsbp_act=show_orders&m=$WS-MallID$&s=$WS-ShopID$&ss=$WS-SubShopID$)~
~WS-ExternInclude($URL-Homepage$/cgi/wsbestprice/wsbestprice.cgi$DC-FPBPParam$)~
```

### Das Modul-Template

Legen Sie eine zweite Datei unter dem Namen an, den Sie bei `TemplateShowOrders` eingetragen haben, im Beispiel `incl_bestprice_show_orders.htm`. Sie bestimmt, wie die Liste aussieht.

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

<table>
   <tr>
      <td>Bestelldatum</td>
      <td>Produkt</td>
      <td>Anzahl</td>
      <td>Aktuelle Preisentwicklung</td>
      <td>Bestellbar bis</td>
   </tr>

   {@E-BP_Orders}

      {NO_PARSING}{PR-AdvData({/NO_PARSING}~E-BP_ProdIndex~{NO_PARSING})}{/NO_PARSING}
      <tr>
         <td>~E-BP_OrderDate~</td>
         <td>~PR-Name~</td>
         <td>~E-BP_Amount~</td>
         <td>
            ~E-BP_TotalAmount~ /
            {E-BP_CurrentPrice}~E-BP_CurrentPrice~{/E-BP_CurrentPrice}
            {!E-BP_CurrentPrice}~PR-OrgPrice~ ~WS-CurrencySymbol~{/!E-BP_CurrentPrice}
         </td>
         <td>~E-BP_End~</td>
      </tr>
      {NO_PARSING}{/PR-AdvData({/NO_PARSING}~E-BP_ProdIndex~{NO_PARSING})}{/NO_PARSING}

   {/@E-BP_Orders}
</table>

{/WS-Include}
```

| Tag | Liefert |
| - | - |
| `E-BP_Orders` | die Schleife über alle Reservierungen des Käufers |
| `E-BP_ProdIndex` | den Produktindex der jeweiligen Reservierung |
| `E-BP_OrderDate` | das Datum der Vorbestellung |
| `E-BP_Amount` | die vom Käufer reservierte Menge |
| `E-BP_TotalAmount` | die Gesamtmenge aller Teilnehmer |
| `E-BP_CurrentPrice` | den aktuell erreichten Preis |
| `E-BP_End` | das Ende der Aktion |

Die `NO_PARSING`-Konstruktion baut das Tag `PR-AdvData` zur Laufzeit zusammen. Die geschweiften Klammern und der Tagname werden vor dem Parser geschützt, nur der Produktindex in der Mitte wird aufgelöst. Dadurch stehen innerhalb der Zeile die gewohnten Produkt-Tags wie `~PR-Name~` zur Verfügung, obwohl der Index erst aus der Schleife kommt.

Die Ausweichzeile mit `{!E-BP_CurrentPrice}` fängt den Fall ab, dass noch kein Preis erreicht ist. Dann wird der Originalpreis des Produkts angezeigt. Ohne diese Zeile bliebe die Spalte in den ersten Stunden einer Kampagne leer.

Referenz: [E-BP\_Orders](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md#die-tags-im-uberblick) · [E-BP\_ProdIndex](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md#die-kampagne-und-ihr-produkt) · [E-BP\_OrderDate](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md#die-tags-im-uberblick) · [E-BP\_Amount](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md#die-kampagne-und-ihr-produkt) · [E-BP\_TotalAmount](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md#die-kampagne-und-ihr-produkt) · [E-BP\_CurrentPrice](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md#die-tags-im-uberblick) · [E-BP\_End](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md#die-tags-im-uberblick)

### Der Link im Kundenkonto

Auf der Kundenkontoübersicht `ws_user_account.htm`:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<a href="~WS-SSLLoadTpl(tpl_bestprice_show_orders.htm,Vorgemerkte Bestellungen)~">
   Zu den vorgemerkten Bestellungen
</a>
```

> [!WARNING]
>
> Der Dateiname im Link muss der des Haupt-Templates aus dem ersten Unterschritt sein, nicht der des Modul-Templates. Das sind zwei verschiedene Dateien, und nur die erste ist eine aufrufbare Seite.

## Schritt 6: Die Bestätigungsmail

Nach einer Reservierung bekommt der Käufer eine Mail mit den vorläufigen Bestelldaten. Legen Sie die Datei unter dem Namen an, den Sie bei `PreorderMail` eingetragen haben.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<body>
   <p>
      Danke, dass Sie bei unserer BestPrice-Aktion bestellt haben. Den aktuellen
      Preis können Sie in Ihrem Kundenkonto verfolgen. Sobald die Aktion endet,
      bekommen Sie eine weitere Bestätigung mit dem endgültigen Preis.
   </p>

   <p>
      Folgendes Produkt haben Sie reserviert:<br>
      Bezeichnung: ~E-BP_Name~<br>
      Bestellmenge: ~E-BP_Amount~
   </p>
</body>
```

Weisen Sie in dieser Mail auf die Verbindlichkeit der Reservierung hin. Sie ist der einzige Beleg, den der Käufer in der Hand hat, und der Zeitpunkt, an dem er die Bedingungen noch einmal lesen wird.

Referenz: [E-BP\_Name](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md#die-kampagne-und-ihr-produkt) · [E-BP\_Amount](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md#die-kampagne-und-ihr-produkt)

## Schritt 7: Die Fehlermail

Legen Sie die Datei unter dem Namen an, den Sie bei `OrderErrorMail` eingetragen haben. Sie geht an die Adresse aus `ReceiverAddress`.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<body>
   <p>
      Bei der Verarbeitung des BestPrice-Order-Moduls ist ein Fehler aufgetreten.
      Bitte wenden Sie sich an Ihren Ansprechpartner bei der WEBSALE AG.
   </p>
</body>
```

## Verwandte Themen

* Wegweiser: [Produktpreise, Staffelpreise](https://dokumentation.websale.de/v8s/produkte/produktpreise.md)
* Wegweiser: [Rabatte festlegen](https://dokumentation.websale.de/v8s/weitere-funktionen-im-bestellprozess-kontext/rabatte-festlegen.md)
* Wegweiser: [Kundenkonto](https://dokumentation.websale.de/v8s/zahlungsarten-anlegen/kundenkonto.md)


## Related topics

- [Preise, Steuern und Währung](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/preise-steuern-und-waehrung.md)
- [Materialien BestPrice-Order-Modul](https://dokumentation.websale.de/v8s/materialien/materialien-bestprice-order-modul.md)
- [E-BP- (BestPrice-Order)](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md)
- [E-Mails](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/e-mails.md)
- [Spezielle Themen](https://dokumentation.websale.de/v8s/schnittstellen/produkte-und-kategorien/ws-sftp-produkte-pro/spezielle-themen.md)


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