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

# Materialien BestPrice-Order-Modul

> Vollständiges Beispiel-Template für die Bestellfunktion des BestPrice-Order-Moduls, mit den Parametern des Preisstaffel-Diagramms und allen E-BP-Tags.

Beim BestPrice-Order-Modul sinkt der Preis eines Produkts, je mehr Kunden es vorbestellen. Diese Seite enthält ein vollständiges Beispiel-Template für den Bestellvorgang und beschreibt die Parameter des Preisstaffel-Diagramms.

Passen Sie das Template an Ihr Shop-Design an. Alle Beschriftungen darin sind Beispieltexte.

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

## Voraussetzungen im Template

Das Diagramm ist ein eigenes JavaScript-Modul, das zwei Dinge im Template braucht: ein `canvas`-Element und zwei `script`-Blöcke.

### Das canvas-Element

Das Plugin ist im Framework Solid.js geschrieben und zeichnet das Diagramm in ein `canvas`-Element. Dieses Element müssen Sie im Template vorsehen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<div id="canvasContainer" style="height: 250px">
  <canvas id="bulk"></canvas>
</div>
```

Höhe und Breite des `canvas`-Elements berechnet das Modul selbst und überschreibt dabei die Werte im Markup. Die Berechnung richtet sich nach dem Style des umgebenden Elements. Geben Sie dem Container deshalb eine Höhe, sonst bleibt das Diagramm unsichtbar.

### Die beiden script-Blöcke

Der erste Block lädt das Modul, der zweite konfiguriert und startet es.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<script src="/$WS/ws_sysdata/js/ws-best_price_modul_1.0.0.js"></script>
```

Referenz: [WEBSALE JavaScript-Bibliothek](https://dokumentation.websale.de/v8s/materialien/websale-javascript-bibliothek.md)

## Das Beispiel-Template

Das Template deckt alle drei Schritte des Bestellvorgangs ab und zeigt zusätzlich eine Zusammenfassung aller Reservierungen des Kunden.

> [accordion] Beispiel-Template für den Bestellvorgang
>
> ```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
> <html>
> <head>
>   <!--Head Elements-->
> </head>
>
> <body>
>
> {WS-Include}
>
> <script src="/$WS/ws_sysdata/js/ws-best_price_modul_1.0.0.js"></script>
> <script type="text/javascript">
>
> function ws_AJAXloadProductStart(){}
> function ws_AJAXloadProductError(){}
> function ws_AJAXloadProductResponseSuccess(){}
> function ws_AJAXloadProductResponseError(){}
> function reloadinfos(value) {
> 	~WS-DisableAmpersandLinkEncoding~
> 	ws_AJAXloadTemplate("~PR-Link($PR-ProdIndex$)~&amount=" +value, '~WS-Charset~', ws_AJAXloadProductStart, ws_AJAXloadProductError, 'ws_AJAXloadProductResponseSuccess()', 'ws_AJAXloadProductResponseError()');
> 	~WS-EnableAmpersandLinkEncoding~
> 	return true;
> }
> </script>
>
> <h2>Bestpricemodul</h2>
>
> <div>Startet: ~E-BP_Begin~</div>
> <div>Endet: ~E-BP_End~</div>
> <div  style="margin-top: 50px">
>
> <!-- Prüfung auf diverse Situationen -->
> {E-BP_LOGGED-IN}<div>Ich bin gerade angemeldet</div>{/E-BP_LOGGED-IN}
> {!E-BP_LOGGED-IN}<div>Ich bin gerade <strong>NICHT</strong> angemeldet</div>{/!E-BP_LOGGED-IN}
> {E-BP_HAS-ADDRESS}<div>Ich habe eine Rechnungsadresse</div>{/E-BP_HAS-ADDRESS}
> {E-BP_HAS-DELIVERY-ADDRESS}<div>Ich habe eine Lieferadresse</div>{/E-BP_HAS-DELIVERY-ADDRESS}
> {E-BP_ACTIVE}<div>Diese Kampagne ist aktiv</div>{/E-BP_ACTIVE}
> {E-BP_BEFORE-BEGIN}<div>Diese Kampagne ist noch nicht aktiv</div>{/E-BP_BEFORE-BEGIN}
> {E-BP_FINISHED}<div>Diese Kampagne ist schon beendet</div>{/E-BP_FINISHED}
>
> {E-BP_Error}<div style="color:red">~E-BP_Error~</div>{/E-BP_Error}
>
> </div>
>
> <!-- Anzeige des Diagramms -->
> <div id="canvasContainer"  style="height: 250px">
> <canvas id="bulk"></canvas>
> </div>
>
> <script>
>     function runCanvas() {
>       var canvasElement = document.getElementById('bulk');
>       var newCanvas = newBulkBestPrice(canvasElement,{
>          barType:'horizontal',
>          progressWidth:20,
>          progressLineWidth:2,
>          progressLineColor:'black',
>          progressFillColor:'#6dfa36',
>          fontType:'normal 7pt Helvetica',
>          dataBar: [
>              ~DC-Counter1_reset~
>              {@E-BP_PriceList}
>
>              ~DC-Counter1_inc~
>              {!DC-Counter1(1)},
>              {/!DC-Counter1(1)}
>              {
>                 text:'~E-BP_PriceList-Price~ €',
>                 countStand: ~E-BP_PriceList-Amount~
>              }
>              {/@E-BP_PriceList}
>
>          ],
>          totalMount: ~E-BP_TotalAmount~
>       });
>     }
>     // run on page load
>     runCanvas();
>     // run on resize of the window
>     window.addEventListener('resize',runCanvas);
> </script>
>
> <!-- Schritt 1: Auswahl der Variante und Menge -->
> {E-BP_CAMPAIGN}
> <h3>Kampagne - ~E-BP_BasicPrice_format~</h3>
> <form action="~FORM-Template(ws_product.htm)~" method="Post" name="product">
> <div>Aktueller Preis: {E-BP_CurrentPrice}~E-BP_CurrentPrice_Format~{/E-BP_CurrentPrice}{!E-BP_CurrentPrice}~PR-OrgPrice~ ~WS-CurrencySymbol~ {/!E-BP_CurrentPrice}</div>
> <div>Aktuell schon bestellte Produkte: ~E-BP_TotalAmount_Format~</div>
>
> <!-- Anzeige der Preisstaffel -->
> <div  style="margin-top: 50px">
> <div>Preisstaffel:</div>
> <div style="padding-left: 50px">
> 	{@E-BP_PriceList}
> 	<div>~E-BP_PriceList-Amount~ Stück: ~E-BP_PriceList-Price_Format~ ~WS-CurrencySymbol~</div>
> 	{/@E-BP_PriceList}
> </div>
> </div>
>
> <input type="hidden" name="wsbp_act" value="show_summary">
> <input type="hidden" name="pi" value="~PR-ProdIndex~">
> <div  style="margin-top: 50px">
>
> <input type="text" name="amount" value="{E-BP_Amount}~E-BP_Amount~{/E-BP_Amount}" onblur="reloadinfos(this.value)"/>
>
> {E-BP_ACTIVE}
> <input type="submit" value="Bestellen">
> {/E-BP_ACTIVE}
> </div>
>
> </form>
> {/E-BP_CAMPAIGN}
>
> <!-- Schritt 2: Auswahl der Lieferadresse und Bestätigung der Bestellung-->
> {E-BP_SUMMARY}
> <h3>Zusammenfassung</h3>
> <form action="~FORM-Template(ws_product.htm)~" method="Post" name="product">
> <!-- Wichtige Hiddenfelder -->
> <!-- Aktion  -->
> <input type="hidden" name="wsbp_act" value="preorder">
> <!-- Produktindex -->
> <input type="hidden" name="pi" value="~PR-ProdIndex~">
> <!-- Anzahl, die Bestellt werden soll -->
> <input type="hidden" name="amount" value="~E-BP_Amount~" />
> <!-- Eine OrderID um Doppelbestellungen zu vermeiden -->
> <input type="hidden" name="orderid" value="~E-BP_OrderId~">
>
> <!-- Anzeige der Rechnungsadresse -->
>
> <div style="margin-top: 50px">
> <div>
> <input type="radio" name="use_delivery_address" value="no" {!E-BP_HAS-DELIVERY-ADDRESS}checked{/!E-BP_HAS-DELIVERY-ADDRESS}> Liefere an Rechnungsadresse:
>
> </div>
> <!-- Anzeige von Informationen der Rechnungsadresse -->
> {E-BP_BillingAddress}
> <div>
> 	Vorname:
> 	~E-BP_Address-Firstname~
> </div>
> <div>
> 	Nachname :
> 	~E-BP_Address-Lastname~
> </div>
> {/E-BP_BillingAddress}
> </div>
>
> <!-- Anzeige von Informationen der Lieferadresse -->
> {E-BP_HAS-DELIVERY-ADDRESS}
> <div>
> <div>
> <input type="radio" name="use_delivery_address" value="yes" checked> Liefere an Lieferadresse:
>
> </div>
> {E-BP_DeliveryAddress}
> <div>
> 	Vorname:
> 	~E-BP_Address-Firstname~
> </div>
> <div>
> 	Nachname :
> 	~E-BP_Address-Lastname~
> </div>
> {/E-BP_DeliveryAddress}
> </div>
> {/E-BP_HAS-DELIVERY-ADDRESS}
>
> <div  style="margin-top: 50px">
> <div>
> Gewählte Menge: ~E-BP_Amount~
> </div>
>
> <!-- Pflicht: ohne das Feld confirm führt das Modul die Bestellung nicht aus -->
> <input type="hidden" name="confirm" value="yes">
> <input type="submit" value="Bestellen">
> </div>
>
> </form>
>
> {/E-BP_SUMMARY}
>
> <!-- Schritt 3: Bestellbestätigung -->
> {E-BP_CONFIRM}
> <h3>Bestätigung</h3>
>
> <p>Danke für die Bestellung!</p>
> <div>Aktueller Preis: {E-BP_CurrentPrice}~E-BP_CurrentPrice_format~{/E-BP_CurrentPrice}{!E-BP_CurrentPrice}~PR-OrgPrice~ ~WS-CurrencySymbol~ {/!E-BP_CurrentPrice}</div>
> <div>Aktuell schon bestellte Produkte: ~E-BP_TotalAmount~</div>
> <div>Ihre Bestellmenge: ~E-BP_Amount~</div>
> <p style="background-color:#00FF00">
> 	Sobald die Kampagne abgelaufen ist bekommen Sie eine E-Mail bezüglich der finalen Bestellung.
> 	Sie können auch in ihrem Kundenkonto alle laufenden Kampagnen, zu denen Sie Vorbestellungen getätigt haben, noch einmal ansehen.
> </p>
>
> {/E-BP_CONFIRM}
>
> <!-- Zusammenfassung aller Reservierungen von aktiven Kampagnen des Kunden -->
> <div id="zusammenfassung_bestprice">
> {ST-Ajax}<WS-Ajax-zusammenfassung_bestprice>{/ST-Ajax}
> <table style="border-spacing: 10px;border-collapse: separate;margin-top: 50px;">
> <tr>
> 	<td>Listenpreis</td>
> 	<td>Bestellpreis</td>
> 	<td>Ersparnis</td>
> 	<td>Gesamtersparnis</td>
> </tr>
> <tr>
> 	<td>~E-BP_BasicPrice_format~</td>
> 	<td>~E-BP_CurrentPrice_format~</td>
> 	<td>~E-BP_CurrentSaving_format~</td>
> 	<td>~E-BP_TotalSaving_format~</td>
> </tr>
> <tr>
> 	<td> </td>
> 	<td> </td>
> 	<td>Preis:</td>
> 	<td>~E-BP_TotalPrice_format~</td>
> </tr>
> </table>
>
> <div style="margin-top: 50px;">
>
> <div style="font-weight:bold">Reservierungen</div>
>
> <table style="border-spacing: 10px;border-collapse: separate;">
> <tr style="font-weight: bold">
> 	<td>Produkt</td>
> 	<td>Menge</td>
> 	<td>Aktueller Stückpreis</td>
> 	<td>Aktueller Gesamtpreis</td>
> 	<td>Aktuelle Ersparnis (pro Stück)</td>
> 	<td>Aktuelle Gesamtersparnis</td>
> </tr>
>
> {@E-BP_Orders}
>
> {NO_PARSING}{PR-AdvData({/NO_PARSING}~E-BP_ProdIndex~{NO_PARSING})}{/NO_PARSING}
> <tr>
> 	<td>~E-BP_Name~</td>
> 	<td>~E-BP_Amount~</td>
> 	<td>
> 		{E-BP_CurrentPrice}~E-BP_CurrentPrice_format~{/E-BP_CurrentPrice}{!E-BP_CurrentPrice}~PR-OrgPrice~{/!E-BP_CurrentPrice}~WS-CurrencySymbol~
> 	</td>
> 	<td>~E-BP_TotalPrice_format~ ~WS-CurrencySymbol~</td>
> 	<td>~E-BP_CurrentSaving_format~ ~WS-CurrencySymbol~ </td>
> 	<td>~E-BP_TotalSaving_format~ ~WS-CurrencySymbol~</td>
> </tr>
> {NO_PARSING}{/PR-AdvData({/NO_PARSING}~E-BP_ProdIndex~{NO_PARSING})}{/NO_PARSING}
> {/@E-BP_Orders}
> </table>
>
> <div style="padding: 10px; padding-bottom: 0px; border-top: 1px solid black">
> 	Gesamtpreis aller Reservierungen: ~E-BP_CompletePrice_format~ ~WS-CurrencySymbol~</div>
> <div style="padding: 10px">
> 	Gesamtersparnis aller Reservierungen: ~E-BP_CompleteSaving_format~ ~WS-CurrencySymbol~
> </div>
>
> <div style="padding: 10px; padding-bottom: 0px; border-top: 1px solid black">
> 	Gesamtpreis aller Reservierungen + aktueller Reserviervorgang: ~E-BP_NewCompletePrice_format~ ~WS-CurrencySymbol~
> </div>
> <div style="padding: 10px">
> 	Gesamtersparnis aller Reservierungen + aktueller Reserviervorgang: ~E-BP_NewCompleteSaving_format~ ~WS-CurrencySymbol~
> </div>
>
> </div>
>
> {ST-Ajax}</WS-Ajax-zusammenfassung_bestprice>{/ST-Ajax}
> </div>
>
> {/WS-Include}
> </body>
> </html>
> ```

## Die drei Schritte des Bestellvorgangs

Das Modul kennt drei Seitenzustände. Welcher gerade gilt, fragen Sie mit den drei gleichnamigen Abschnitts-Tags ab. Weitergeschaltet wird über das Formularfeld `wsbp_act`.

| Schritt | Abschnitts-Tag | `wsbp_act` im Formular | Aufgabe |
| - | - | - | - |
| 1 | `E-BP_CAMPAIGN` | `show_summary` | Menge wählen |
| 2 | `E-BP_SUMMARY` | `preorder` | Lieferadresse wählen und bestätigen |
| 3 | `E-BP_CONFIRM` | wird nicht gesendet | Bestätigung anzeigen |

Die Formularfelder, die das Modul auswertet:

| Feld | Bedeutung |
| - | - |
| `wsbp_act` | die gewünschte Aktion, siehe Tabelle oben |
| `pi` | der Produktindex des Kampagnenprodukts |
| `amount` | die vorbestellte Menge |
| `orderid` | eine Kennung aus `~E-BP_OrderId~`, die Doppelbestellungen verhindert |
| `use_delivery_address` | `yes` liefert an die Lieferadresse, `no` an die Rechnungsadresse |
| `confirm` | muss in Schritt 2 mitgesendet werden, sonst führt das Modul die Bestellung nicht aus |

> [!NOTE]
>
> An der Mengeneingabe im ersten Schritt hängt ein `onblur` an, das über `ws_AJAXloadTemplate` die Seite neu lädt. Erst dadurch aktualisieren sich Diagramm und Staffelpreis, während der Kunde die Menge ändert.
>
> Die beiden Tags `~WS-DisableAmpersandLinkEncoding~` und `~WS-EnableAmpersandLinkEncoding~` schalten die kaufmännische Und-Kodierung im Link ab und wieder an. Ohne sie wird das `&` im nachgehängten `amount`-Parameter zu `&amp;` und der Aufruf schlägt fehl.

## Konfiguration des Preisstaffel-Diagramms

Die Parameter übergeben Sie als Objekt an `newBulkBestPrice`. Parameter mit Sternchen sind notwendig, alle anderen optional.

| Name | Typ | Gehört zu | Beschreibung |
| - | - | - | - |
| `barType` | `horizontal` oder `vertical` | root | Ausrichtung des Diagramm-Balkens. Standard: `vertical` |
| `progressWidth` | Zahl | root | Breite des Diagramm-Balkens |
| `progressLineWidth` | Zahl | root | Linienbreite des Diagramm-Balkens. Standard: 1 |
| `progressLineColor` | Farbe als Name, Hex oder RGB | root | Linienfarbe des Diagramm-Balkens. Standard: `black` |
| `progressFillColor` | Farbe als Name, Hex oder RGB | root | Hintergrundfarbe des Diagramm-Balkens. Standard: `#007bff` |
| `fontType` | Typ, Größe und Schriftart | root | Standard: `normal 7pt Helvetica` |
| `totalMount`\* | Zahl | root | aktuelle Anzahl der bereits bestellten Produkte |
| `dataBar`\* | Array | root | ein oder mehrere Objekte, siehe unten |
| `text`\* | Zeichenkette | `dataBar[Obj]` | der Text im Diagramm |
| `countStand` | Zahl | `dataBar[Obj]` | Position und Anzeige der Menge mit dem zugehörigen Preis |

> [!WARNING]
>
> JavaScript unterscheidet bei Objektschlüsseln Groß- und Kleinschreibung, deshalb sind die Namen hier an das funktionierende Beispiel angeglichen.
>
> Der Name `totalMount` ist ein Schreibfehler des Moduls. Er muss trotzdem genau so geschrieben werden.

Im `text`-Feld ist nur die HTML-Entity für das Euro-Zeichen ersetzbar. Für jedes andere Währungssymbol verwenden Sie den Unicode-Wert, im Beispiel `€`.

### Der Zähler im dataBar-Array

Das Array braucht zwischen den Einträgen Kommas, aber keines vor dem ersten. Das Beispiel löst das mit einem Zähler:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-Counter1_reset~
{@E-BP_PriceList}
   ~DC-Counter1_inc~
   {!DC-Counter1(1)},{/!DC-Counter1(1)}
   {
      text:'~E-BP_PriceList-Price~ €',
      countStand: ~E-BP_PriceList-Amount~
   }
{/@E-BP_PriceList}
```

`DC-Counter1_inc` zählt bei jedem Durchlauf hoch, und die negative Klammerung `{!DC-Counter1(1)}` setzt das Komma überall außer im ersten Durchlauf. Dasselbe Muster können Sie für jede andere JSON-Struktur im Template verwenden.

### Der NO\_PARSING-Block in der Reservierungsliste

In der Reservierungsliste steht ein Konstrukt, das auf den ersten Blick verwirrt:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{NO_PARSING}{PR-AdvData({/NO_PARSING}~E-BP_ProdIndex~{NO_PARSING})}{/NO_PARSING}
```

`PR-AdvData` erwartet einen Produktindex als Parameter, der hier erst zur Laufzeit aus `~E-BP_ProdIndex~` kommt. Ohne `NO_PARSING` würde der Parser das halbfertige Tag sofort auswerten und scheitern. Die `NO_PARSING`-Klammern schützen die beiden Hälften, sodass erst der zusammengesetzte Ausdruck geparst wird.

## Weitere E-BP-Tags

Das Beispiel nutzt nur einen Teil der verfügbaren Tags. Die folgenden kommen darin nicht vor.

| Tag | Verwendung |
| - | - |
| `E-BP_Info` | Abschnitt und Einzel-Tag für Hinweismeldungen, aufgebaut wie `E-BP_Error` |
| `E-BP_OrderDate` | Zeitpunkt der Vorbestellung, mit optionalem Formatparameter |
| `E-BP_ProdNumber` | die Produktnummer des Kampagnenprodukts |
| `E-BP_CampaignID` | die interne Kennung der Kampagne |
| `E-BP_Warranty(…)` | Abschnitt, der prüft, ob eine der übergebenen Garantien vorliegt |

Außerdem nehmen `~E-BP_Begin~` und `~E-BP_End~` einen Formatparameter entgegen, beispielsweise `~E-BP_Begin(%d.%m.%Y)~`. Ohne Parameter geben sie das Standardformat aus.

### Die Adressfelder

Das Beispiel zeigt innerhalb von `E-BP_BillingAddress` und `E-BP_DeliveryAddress` nur Vor- und Nachnamen. Verfügbar ist die vollständige Adresse.

| Tag | Feld |
| - | - |
| `E-BP_Address-Company` | Firma |
| `E-BP_Address-Salutation` | Anrede |
| `E-BP_Address-SalutationCode` | Anrede als Code |
| `E-BP_Address-Title` | Titel |
| `E-BP_Address-TitleCode` | Titel als Code |
| `E-BP_Address-FirstName` | Vorname |
| `E-BP_Address-LastName` | Nachname |
| `E-BP_Address-Street1` | Straße |
| `E-BP_Address-Street2` | zweite Straßenzeile |
| `E-BP_Address-Zip` | Postleitzahl |
| `E-BP_Address-City` | Ort |
| `E-BP_Address-State` | Bundesland |
| `E-BP_Address-Country` | Land |
| `E-BP_Address-CountryISO` | Land als ISO-Code |
| `E-BP_Address-PostOfficeBox` | Postfach |
| `E-BP_Address-PostCenter` | Postfiliale |
| `E-BP_Address-Department` | Abteilung |
| `E-BP_Address-Phone` | Telefon |
| `E-BP_Address-BusinessPhone` | Telefon geschäftlich |
| `E-BP_Address-MobilePhone` | Mobiltelefon |
| `E-BP_Address-Fax` | Telefax |
| `E-BP_Address-BusinessFax` | Telefax geschäftlich |
| `E-BP_Address-e-mail` | E-Mail-Adresse |
| `E-BP_Address-DateOfBirth` | Geburtsdatum |
| `E-BP_Address-TaxID` | Umsatzsteuer-Identifikationsnummer |
| `E-BP_Address-Suffix1` bis `E-BP_Address-Suffix10` | die zehn Zusatzfelder |

## Häufige Fehlerquellen beim Nachbauen

Drei Punkte fallen beim Nachbauen auf.

> [!WARNING]
>
> **`E-BP_CompletePrice` funktioniert nicht als Abschnitt.** Die Abschnittsprüfung ist im Modul unter dem verschriebenen Namen `complteprice` hinterlegt. Als Einzel-Tag arbeiten `~E-BP_CompletePrice~` und `~E-BP_CompletePrice_format~` normal, nur die Klammerung `{E-BP_CompletePrice}…{/E-BP_CompletePrice}` greift nicht. Prüfen Sie stattdessen auf `{E-BP_Orders}`, ob überhaupt Reservierungen vorliegen.

> [!NOTE]
>
> `E-BP_NewCompletePrice` und `E-BP_NewCompleteSaving` gibt es nur als Einzel-Tag, nicht als Abschnitt. Sie liefern die Summe aus allen bisherigen Reservierungen und dem gerade laufenden Vorgang.
>
> `E-BP_BillingAddress` und `E-BP_DeliveryAddress` sind reine Umschalter auf den jeweiligen Adressdatensatz. Sie sind immer wahr, und eine negative Klammerung `{!E-BP_BillingAddress}` bewirkt nichts. Ob überhaupt eine Adresse vorliegt, fragen Sie mit `E-BP_HAS-ADDRESS` beziehungsweise `E-BP_HAS-DELIVERY-ADDRESS` ab.

Die Schreibweise der Tags ist dem Modul gleichgültig. `~E-BP_CurrentPrice_Format~` und `~E-BP_CurrentPrice_format~` sind dasselbe Tag, weshalb die uneinheitliche Schreibweise im Beispiel ohne Folgen bleibt.

## Die Zustände einer Kampagne

Drei Abschnitts-Tags fragen den Status der Kampagne ab. Sie schließen einander aus.

| Tag | Trifft zu, wenn |
| - | - |
| `E-BP_BEFORE-BEGIN` | die Kampagne angelegt, aber noch nicht gestartet ist |
| `E-BP_ACTIVE` | die Kampagne läuft. Nur dann nimmt das Modul Vorbestellungen an |
| `E-BP_FINISHED` | die Kampagne beendet oder bereits in Bestellungen überführt ist |

Im Beispiel umschließt `E-BP_ACTIVE` die Bestellschaltfläche. Behalten Sie das bei, sonst sieht der Kunde nach dem Ende der Kampagne eine Schaltfläche, die ins Leere läuft.


## Related topics

- [BestPrice-Order-Modul](https://dokumentation.websale.de/v8s/interaktive-funktionen/bestprice-order-modul.md)
- [E-BP- (BestPrice-Order)](https://dokumentation.websale.de/v8s/referenz/tags/e-bp.md)
- [Preise, Steuern und Währung](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/preise-steuern-und-waehrung.md)
- [E-Mails](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/e-mails.md)
- [Übersicht Bestelldaten](https://dokumentation.websale.de/v8s/materialien/uebersicht-bestelldaten.md)


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