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

# Warenkorb und Bestellprozess

> Wie sich der Warenkorb verhält, welche Rabatte und Zuschläge greifen, welche Zusatzleistungen und Eingabefelder der Käufer bekommt und wie AGB-Zustimmung, Direktbestellung, Angebote und besondere Produktarten konfiguriert werden.

Zwischen dem Klick auf "In den Warenkorb" und dem Absenden der Bestellung liegen zwei Arten von Einstellungen. Die einen bestimmen, wie der Warenkorb selbst aussieht und was er anzeigt. Die anderen bestimmen, was am Ende abgerechnet wird, also Rabatte, Zuschläge, Mindestbestellwerte und kostenpflichtige Zusatzleistungen.

Diese Seite beginnt beim Warenkorb, geht dann zu den Bestellkonditionen und den Zusatzleistungen und endet bei den Besonderheiten einzelner Produktarten und Bestellwege.

Referenz: Shopkonfiguration shop.config, Übersicht aller Abschnitte

## `BasketEntries`

Bestimmt die Eigenschaften des Warenkorbs und die Texte, die in den Bestelldaten erscheinen.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<BasketEntries>
   Quantity-Txt       = Menge
   Sum-Txt            = Preis
   SubtotalSum-Txt    = Zwischensumme
   TotalDiscount-Txt  = Rabatt
   TotalSum-Txt       = Gesamtsumme
   MaxPositions-Value = 50
   ShowUserDiscount   = global
</BasketEntries>
```

### Texte in den Bestelldaten

| Parameter | Bezeichnet |
| - | - |
| `Quantity-Txt` | die Menge |
| `Sum-Txt` | den Preis eines Produkts |
| `SubtotalSum-Txt` | die Zwischensumme ohne Versandkosten und Ähnliches |
| `TotalDiscount-Txt` | den Rabatt |
| `TotalSum-Txt` | die Gesamtsumme |
| `GiftPackage-Txt` | die Geschenkverpackung |
| `CommissionInfo-Txt` | die Kommissionierungsinfo beim Zusammenstellen von Teilmengen |
| `WishListOrderInfo-Txt` | ein Wunschlistenprodukt. Erlaubt die Tags `WISH-OwnerFirstName` und `WISH-OwnerLastName` |

### Begrenzungen und Eingabefilter

| Parameter | Zweck | Werte |
| - | - | - |
| `MaxPositions-Value` | Anzahl der Bestellpositionen je Bestellung | Zahl. Standard: ohne Begrenzung |
| `IgnoreBonusProductForMaxBasketPositions-Allow` | Prämienprodukte bei dieser Zählung ignorieren | `yes`, `no`. Standard: `no` |
| `CommissionInfo-MaxInputLen` | maximale Zeichenzahl der Kommissionierungsinfo | bis 255. Standard: 255 |
| `CommissionInfo-RemoveSigns` | Zeichen, die aus der Kommissionierungsinfo entfernt werden | Zeichenfolge |
| `AdditionalInput-RemoveSigns` | Zeichen, die aus den freien Warenkorbfeldern auf Positionsebene entfernt werden | Zeichenfolge |

`MaxPositions-Value` begrenzt die Anzahl der Positionen, nicht die Menge je Position. Von einer Position lassen sich weiterhin beliebig viele Stück bestellen.

### Anzeige der Rabatte

| Parameter | Betrifft |
| - | - |
| `ShowUserDiscount` | den kundenindividuellen Rabatt |
| `ShowOrderDiscount` | den Auftragswertrabatt |
| `ShowPaymentDiscount` | den Rabatt der Zahlungsart |
| `ShowProductGroupDiscount` | den Produktgruppenrabatt |

Alle vier kennen dieselben beiden Werte. `global` zieht den Rabatt erst am Ende vom Warenkorb ab. `entry` zeigt jeden Preis und jede Position bereits reduziert an. Standard ist `global`.

### Nummerierung der Bestellpositionen

| Parameter | Zweck | Werte |
| - | - | - |
| `OrderData-CustomizedPositionNumberMode` | ob und für welche Produkte zusätzlich nummeriert wird | `none`, `allproducts`, `mainproducts`. Standard: `none` |
| `OrderData-CustomizedPositionNumberFormat` | Zählart und Stellenzahl | kommaseparierte Liste. Standard: `int,0` |

`allproducts` zählt alle sichtbaren Produkte, `mainproducts` lässt Set-Unterprodukte aus. Produkte mit gesetztem Produktdatenflag `HideForBasket` gelten als nicht sichtbar und werden nie mitgezählt.

Im Format steht an erster Stelle die Zählart und an zweiter die Anzahl der festen Stellen.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
# dreistellig durchzählen: 001, 002, 003
OrderData-CustomizedPositionNumberFormat = int,3
# Bestellnummer voranstellen: 12345-001
OrderData-CustomizedPositionNumberFormat = ordernumber-int,3
```

Diese eindeutige, aufsteigende Nummerierung erleichtert es, bei Kundenrückfragen auf eine einzelne Position zu verweisen.

### Weitere Einstellungen

| Parameter | Zweck | Werte |
| - | - | - |
| `DecimalSymbol` | Dezimaltrennzeichen für Mengenangaben, auch in den Bestelldaten | Zeichen. Standard: Komma |
| `OrderData-SingleTotal2Precision` | Nachkommastellen für den Parameter `SingleTotal2` in den Bestelldaten | 2 bis 9 |
| `PalettVolume` | Fassungsvolumen einer einzelnen Palette | Zahl, beispielsweise `1.19` |
| `JoinInsert` | Form, in der ein Werbemittelkennzeichen erscheint | Text mit den Tags `PR-Number` und `PR-Insert` |
| `SplitDeliveryText-Allow` | bei Lieferstatus rot getrennte Lieferbarkeitstexte anzeigen | `yes`, `no`. Standard: `no` |

Da Mengenangaben in der Regel ganzzahlig sind, wird `DecimalSymbol` selten gebraucht. Er betrifft beispielsweise das Tag `BASKET-PR-Quantity`.

> [!WARNING]
>
> Zwei Parameter dieses Abschnitts werden nicht mehr unterstützt und sollten nicht mehr verwendet werden.
>
> `CombineBulkDiscount` fasste Staffelpreise eines Produkts über mehrere Varianten hinweg zusammen. Verwenden Sie stattdessen den Produktgruppenrabatt.
>
> `DeliveryTextInOrder-Allow` steuerte die Anzeige des Versandkostentextes in den Bestelldaten.

## `AdditionalProductFieldsInBasket`

Legt fest, welche freien Produktdatenfelder im Warenkorb verfügbar sind. Das ist die Voraussetzung für mehrere andere Funktionen, unter anderem für produktabhängige Zahlungsarten, produktabhängige Versandarten und produktabhängige Gutscheine.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AdditionalProductFieldsInBasket>
   +Field = material
   +Field = DeliveryTime
</AdditionalProductFieldsInBasket>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `+Field` | technischer Feldname, wie er im WSPManager beziehungsweise in der `prod.cfg` steht | Feldname. Maximal zwanzig Parameter |
| `UseTemplateExtension` | zweiten Wert je Feld als Templatenamen auswerten | `yes`, `no`. Standard: `no` |

> [!NOTE]
>
> Steht er auf `yes`, wird der Wert jedes `+Field` am **ersten Leerzeichen** geteilt. Davor steht der Feldname, dahinter der Name eines Templates.
>
> ```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
> <AdditionalProductFieldsInBasket>
>    UseTemplateExtension = yes
>    +Field               = material incl_material.htm
> </AdditionalProductFieldsInBasket>
> ```
>
> Bei `UseTemplateExtension = no` würde derselbe Eintrag als Feldname `material incl_material.htm` gelesen und liefe ins Leere.

Ist das Maximum von zwanzig Feldern erreicht, werden weitere Einträge stillschweigend verworfen. Das gilt auch, wenn der Abschnitt mehrfach in der Konfiguration steht.

## `BasketProductOptions`

Definiert freie Felder auf Split-Positionsebene, also Eingaben, die der Käufer je Warenkorbposition oder je Lieferadresse einer Position machen kann, samt optionaler Kosten.

Der Abschnitt ist tief verschachtelt. Eine `+BasketProductOption` beschreibt ein Feldset. `Requirements` legt fest, wann dieses Feldset überhaupt erscheint. `Inputs` enthält die Felder. `Costs` enthält die Kosten, die aus den Eingaben entstehen.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<BasketProductOptions>
   BasketProductOptionsVATType = dynamic
   <+BasketProductOption>
      BasketProductOptionID = gravur
      LevelOfUsage          = BasketPosition
      <Requirements>
         <+RequirementGroup>
            <+Requirement>
               Proof = ProductNumber
               Type  = prefix
               Value = GRAV-
            </+Requirement>
         </+RequirementGroup>
      </Requirements>
      <Inputs>
         <+Input>
            Type = Input
            ID   = gravurtext
            Name = Ihr Gravurtext
         </+Input>
      </Inputs>
      <Costs>
         <+Cost>
            ID    = gravurkosten
            Name  = Gravur
            Type  = multiplyWithQuantity
            Value = 4.95
            <+ConditionGroup>
               <+Condition>
                  Proof = BasketProductOptionInputID
                  Type  = filled
                  Value = gravurtext
               </+Condition>
            </+ConditionGroup>
         </+Cost>
      </Costs>
   </+BasketProductOption>
</BasketProductOptions>
```

### Grundeinstellung

| Parameter | Zweck | Werte |
| - | - | - |
| `BasketProductOptionsVATType` | Ermittlung des Mehrwertsteuersatzes | `dynamic`, `static`. Standard: `dynamic` |
| `BasketProductOptionsVATIndex` | Mehrwertsteuerindex, nur bei `static` | 1 bis 10. Standard: 1 |

### `+BasketProductOption`

| Parameter | Zweck | Werte |
| - | - | - |
| `BasketProductOptionID` | eindeutiger Bezeichner | alphanumerisch |
| `LevelOfUsage` | Art der Verwendung | `UseOnce`, `BasketPosition`, `BasketPositionAddress` |
| `Test` | Testmodus aktivieren | `yes`, `no`. Standard: `no` |

`UseOnce` fragt die Felder einmalig je Bestellung ab. `BasketPosition` je Warenkorbposition. `BasketPositionAddress` je Lieferadresse einer Position bei Split-Order.

### `Requirements`

Entscheidet, ob das Feldset erscheint. Die `+RequirementGroup`-Abschnitte sind **oder**-verknüpft, die `+Requirement`-Abschnitte darin **und**-verknüpft.

| Parameter | Zweck | Werte |
| - | - | - |
| `Proof` | was geprüft wird | siehe unten |
| `Type` | Art der Prüfung | `filled`, `empty`, `value`, `notvalue`, `inlist`, `notinlist`, `prefix`, `notprefix`, `greaterthan`, `lessthan` |
| `Value` | geprüfter Wert, nur bei `ProductNumber` und `AdditionalProductFieldsInBasket` | maximal 4096 Zeichen |
| `Identifier` | technischer Feldname, nur bei `AdditionalProductFieldsInBasket` | alphanumerisch |

| `Proof` | geprüft wird |
| - | - |
| `ProductNumber` | die Produktnummer. Standard |
| `AdditionalProductFieldsInBasket` | ein freies Produktfeld, benannt über `Identifier` |
| `AddressSplitUsed` | ob die Position auf mehrere Lieferadressen aufgeteilt ist |
| `AddressSplitNotUsed` | ob sie nicht aufgeteilt ist |
| `BasketSubTotalSum` | die Zwischensumme des Warenkorbs |
| `BasketPRSum` | die Summe der Position |

> [!WARNING]
>
> Bei `LevelOfUsage = UseOnce` ist als `Proof` ausschließlich `BasketSubTotalSum` zulässig. Die anderen Werte beziehen sich auf eine einzelne Position und ergeben für ein einmaliges Feld keinen Sinn.

### `Inputs`

| Parameter | Zweck | Werte |
| - | - | - |
| `ID` | eindeutiger Bezeichner des Felds | alphanumerisch |
| `Name` | technischer Name des Felds | alphanumerisch |
| `Type` | Art des Felds | `Input`, `Checkbox`. Standard: `Input` |
| `+UseGenericInputCheck` | Verknüpfung mit einer Eingabeprüfung | ID aus `GenericInputChecks` |

Referenz: [Abschnitt GenericInputChecks](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/adressen-und-eingabepruefung.md#genericinputchecks)

### `Costs`

| Parameter | Zweck | Werte |
| - | - | - |
| `ID` | eindeutiger Bezeichner | alphanumerisch |
| `Name` | technischer Name | alphanumerisch |
| `Type` | Art der Kostenberechnung | `singleFixCost`, `percentualSum`, `multiplyWithQuantity`. Standard: `singleFixCost` |
| `Value` | Wert zur Berechnung | beispielsweise `4.95` |

`singleFixCost` berechnet den Wert einmalig je Position. `percentualSum` berechnet ihn prozentual auf den Warenwert der Position oder des Warenkorbs. `multiplyWithQuantity` multipliziert ihn mit der Menge der Position.

Die `+ConditionGroup`-Abschnitte sind **oder**-verknüpft, die `+Condition`-Abschnitte darin **und**-verknüpft.

| Parameter | Zweck | Werte |
| - | - | - |
| `Proof` | was geprüft wird | `ProductNumber`, `AdditionalProductFieldsInBasket`, `BasketProductOptionInputID`, `AddressSplitUsed`, `Quantity`, `Weight` |
| `Type` | Art der Prüfung | siehe unten |
| `Value` | geprüfter Wert. Bei `BasketProductOptionInputID` die ID des Eingabefelds | alphanumerisch |
| `SetBehavior` | Behandlung von Set-Produkten | `asUnit`, `Single`. Standard: `Single` |
| `BasketBehavior` | wie viele Produkte die Bedingung erfüllen müssen | `match-all`, `match-once`. Standard: `match-all` |

Zulässige Werte für `Type`: `filled`, `empty`, `value`, `notvalue`, `inlist`, `notinlist`, `prefix`, `notprefix`, `greaterthan`, `lessthan`, `inbetween`, `includedinlist`, `notincludedinlist`, `matchsimplewildcard` und `notmatchsimplewildcard`. Bei `inbetween` lautet das Format von `Value` `start-end`.

Korrekt ist `match-once`. Derselbe Tippfehler steht auch im Abschnitt zu den Zahlungsarten.

> [!WARNING]
>
> Die Kosten werden berechnet, sobald die Bedingungen erfüllt sind, auch wenn der Käufer das Eingabefeld leer lässt oder die Checkbox nicht anhakt.
>
> Die Ausnahme ist eine Bedingung, die das Eingabefeld selbst prüft, also `Proof = BasketProductOptionInputID` zusammen mit `Type = filled`. Dann entstehen bei leerem Feld keine Kosten.

## `OrderConditions`

Der zentrale Abschnitt für Rabatte, Mindestbestellwert und Mindermengenzuschlag.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<OrderConditions>
   MinimumOrder-Value   = 10.00
   SurchargeLimit-Value = 25.00
   Surcharge-Value      = 4.90
   Surcharge-Txt        = Mindermengenzuschlag
   Discount-List        = (100:3)(500:5)(1000:7)
   Discount-Txt         = abzüglich gewährter Rabatte
</OrderConditions>
```

### Mindestbestellwert und Mindermengenzuschlag

| Parameter | Zweck | Werte |
| - | - | - |
| `MinimumOrder-Value` | Mindestbestellwert, ab dem bestellt werden kann | Zahl mit Punkt als Dezimaltrennzeichen |
| `SurchargeLimit-Value` | Grenze, bis zu der ein Mindermengenzuschlag erhoben wird | Zahl |
| `Surcharge-Value` | Betrag des Mindermengenzuschlags | Zahl |
| `Surcharge-Txt` | im Warenkorb angezeigter Text zum Zuschlag | Text |
| `SurchargeCalculation-Mode` | Bemessungsgrundlage des Zuschlags | `subtotal`, `totalsumofproducts`. Standard: `subtotal` |
| `MinimumOrder-ConsiderVoucherDiscount-Allow` | prozentualen Gutscheinrabatt in die Prüfung einbeziehen | `yes`, `no`. Standard: `yes` |
| `MinimumOrder-PrimeShoppingHasAbsolutePriority` | bei Prime-Kunden alle Mindestbestellwerte aufheben | `yes`, `no`. Standard: `no` |
| `NegativeTotalSum-Allow` | Bestellung bei negativer Gesamtsumme zulassen | `yes`, `no`. Standard: `yes` |

`SurchargeCalculation-Mode = subtotal` nimmt den gesamten Warenwert. `totalsumofproducts` nimmt nur die Produkte, die nicht über das Produktdatenfeld `IgnoreForSurcharge` ausgenommen wurden.

Ein Beispiel zu `MinimumOrder-ConsiderVoucherDiscount-Allow`. Der Mindestbestellwert beträgt 10 Euro, im Warenkorb liegt ein Produkt für 12 Euro, dazu ein Gutschein über 20 Prozent.

| Einstellung | geprüfter Warenwert | Ergebnis |
| - | - | - |
| `yes` | 9,60 | Bestellung nicht möglich |
| `no` | 12,00 | Bestellung möglich |

`MinimumOrder-PrimeShoppingHasAbsolutePriority = yes` hebt für Prime-Kunden mit der Option "kein Mindestbestellwert" auch die Mindestbestellwerte von Gutscheinen und Bonuspunkten auf.

### Auftragswertrabatt

| Parameter | Zweck | Werte |
| - | - | - |
| `Discount-List` | gestaffelter Rabatt nach Gesamtwarenwert | Staffel, siehe unten |
| `Discount-Txt` | Text in den Bestelldaten, wenn ein Rabatt gewährt wurde | Text |
| `Discount-AllowForCustomers` | ob der Rabatt nur für angemeldete Kunden gilt | `loggedIn`, `all`. Standard: `all` |
| `AppDiscount-List` | gestaffelter Rabatt, der nur für Bestellungen in der App gilt | Staffel, maximal 10 Einträge |
| `AppDiscount-AllowForCustomers` | dasselbe für den App-Rabatt | `loggedIn`, `all`. Standard: `all` |

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
# ab 100 EUR: 3 Prozent, ab 500 EUR: 5 Prozent, ab 1000 EUR: 7 Prozent
Discount-List = (100:3)(500:5)(1000:7)
```

Ist `AppDiscount-List` gefüllt, ersetzt diese Staffel bei App-Bestellungen die Staffel aus `Discount-List`.

### Zusammenspiel der Rabatte

Diese Parameter entscheiden, auf welcher Grundlage welcher Rabatt gerechnet wird. Sie wirken sich auf die Gesamthöhe aller Abzüge aus, deshalb lohnt es sich, sie bewusst zu setzen.

| Parameter | Zweck | Werte |
| - | - | - |
| `ConsiderProductDiscountFactorForOrderDiscount-Allow` | nicht rabattierfähige Produkte in die Rabattgrenze einbeziehen | `yes`, `no`. Standard: `yes` |
| `ConsiderProductGroupDiscountForOrderDiscount-Allow` | Produktgruppenrabatt bei der Grundlage des Auftragswertrabatts berücksichtigen | `yes`, `no`. Standard: `no` |
| `ConsiderProductGroupDiscountForOtherDiscounts-Allow` | Produktgruppenrabatt sofort vom Produktpreis abziehen statt am Ende vom Gesamtpreis | `yes`, `no`. Standard: `yes` |
| `ConsiderNetProductPriceForDiscountBaseWhenTaxFreeApplies` | prozentuale Rabatte auf Positionsebene vom Nettobetrag rechnen | `yes`, `no`. Standard: `no` |
| `UseOnlyHighestDiscount-Allow` | bei mehreren verfügbaren Rabatten nur den höchsten gewähren | `yes`, `no`. Standard: `no` |

`ConsiderNetProductPriceForDiscountBaseWhenTaxFreeApplies` greift nur unter drei Voraussetzungen. Der Shop muss mit Bruttopreisen arbeiten, die Steuerberechnung muss im Standardverfahren laufen, und dem Käufer muss die Mehrwertsteuer abgezogen werden. Das ist typischerweise bei Drittlandbestellungen der Fall.

`UseOnlyHighestDiscount-Allow` vergleicht kundenspezifischen Rabatt, globalen Rabatt, Warenwertrabatt und Produktgruppenrabatt und gewährt nur den höchsten davon.

### Nicht dokumentierte Parameter zum Rabattverhalten

Der Kernel liest in diesem Abschnitt sieben weitere Parameter.

| Parameter | Zweck | Werte |
| - | - | - |
| `Discount-Value` | globaler Kundenrabatt in Prozent | Zahl |
| `SetChilds-DiscountRateDetermination` | wie der globale Kundenrabatt Set-Produkte behandelt | `UseSetChildData`, `UseSetParentData`, `UseSetParentDataExceptForDiscountFactor`. Standard: `UseSetChildData` |
| `ConsiderAllGroupDiscountIDsForGroupDiscountBase` | als Grundlage alle Positionen mit beliebiger DiscountID nehmen statt nur die mit derselben | `yes`, `no`. Standard: `no` |
| `ConsiderNegativeBonusProductPriceForOrderDiscountBase` | negative Prämienproduktpreise in die Grundlage des Auftragswertrabatts einbeziehen | `yes`, `no`. Standard: `yes` |
| `MixedGroupDiscountAndBulkDiscount-Behavior` | Verhalten, wenn Gruppen- und Staffelrabatt zusammentreffen | `grantBoth`, `grantOnlyBulkDiscount`. Standard: `grantBoth` |
| `UseOnlyHighestDiscount-ConsiderVoucher` | Gutschein in den Vergleich des höchsten Rabatts einbeziehen | `yes`, `no`. Standard: `no` |
| `CommunityDiscount-List` | eigene Rabattstaffel für Community-Mitglieder | Staffel wie `Discount-List` |

> [!WARNING]
>
> Diese Parameter greifen in die Preisberechnung ein. Setzen Sie sie nur nach Abstimmung mit der WEBSALE AG. Der Freigabestatus ist noch zu klären.
>
> `CommunityDiscount-List` wirkt nur bei aktiver Community-Anbindung. Ist der Käufer als Community-Mitglied angemeldet, wird diese Staffel verwendet und `Discount-List` nur als Rückfallebene, falls sie leer ist.

### Auftragsnummern und Folgebestellungen

| Parameter | Zweck | Werte |
| - | - | - |
| `ConvertOrderNumber-Allow` | shopeigene Auftragsnummer in eine zufällige Reihenfolge konvertieren | `yes`, `no`. Standard: `no` |
| `ConvertOrderNumber-Type` | Art der Konvertierung | `alpha`, `DoubleNumbers`. Standard: `alpha` |
| `SubSequentOrder-TimeLimitInHours` | Zeitraum, innerhalb dessen eine erneute Bestellung als Folgebestellung gilt | Ganzzahl |
| `SubSequentOrder-ConsiderOrdersFromOtherSubShops-List` | aus welchen Subshops Bestellungen dafür zählen | Subshop-IDs, leer oder `*` |

Bleibt die Subshop-Liste leer, zählen nur Bestellungen aus dem Subshop, in dem der Käufer gerade einkauft. Ein Stern zählt die Bestellungen aus allen Subshops.

### Weitere Einstellungen

| Parameter | Zweck | Werte |
| - | - | - |
| `AddProdToBasketOnlyInLoggedInState-Allow` | nur angemeldete Käufer dürfen Produkte in den Warenkorb legen | `yes`, `no`. Standard: `no` |
| `NewCustomerDefinition-Payments` | wer bei den Zahlungsarten als Neukunde gilt | `NoCustomerNumber`, `NoERPLastOrderDate`. Standard: `NoCustomerNumber` |
| `TaxFreeForAll-Allow` | bei steuerbefreiten Käufern auch Liefer- und Zustellkosten ohne Steuer berechnen | `yes`, `no`. Standard: `no` |
| `TotalSumSwissRounding-Allow` | Schweizer Rundungslogik auf die Endsumme anwenden | `yes`, `no`. Standard: `no` |
| `RoundedSubTotals-Allow` | gerundete Zwischensummen für Summen und Preise verwenden | `yes`, `no`. Standard: `no` |
| `RoundedSubTotalsPrecision` | auf wie viele Stellen Zwischensummen gerundet werden | Zahl. Standard: 2 |
| `ReferenceText-Txt`, `ReferenceText2-Txt` | Namen der Felder für optionale Referenztexte zur Bestellung | Text |
| `ReferenceText-RemoveSigns`, `ReferenceText2-RemoveSigns` | Zeichen, die aus den Referenztexten entfernt werden | Zeichenfolge |
| `ProdTextInput-RemoveSigns` | Zeichen, die aus jedem Eingabefeld bei einem Produkt entfernt werden | Zeichenfolge |

`AddProdToBasketOnlyInLoggedInState-Allow` ist vor allem für halbgeschlossene B2B-Shops gedacht.

Die Schweizer Rundungslogik multipliziert die Endsumme mit 20, rundet kaufmännisch auf null Stellen und teilt wieder durch 20. Sie wirkt ausschließlich auf die Endsumme. Preise, Zwischensummen, Rabatte und Steuerbeträge bleiben unberührt.

Bei allen `RemoveSigns`-Parametern werden die genannten Zeichen entfernt, ohne dass der Käufer eine Hinweis- oder Fehlermeldung sieht.

## `OrderOptions1` bis `OrderOptions5`

Definiert kostenpflichtige Zusatzleistungen, die auf der Zahlungs- und Versandartenseite angeboten werden. Es sind bis zu fünf Abschnitte möglich, jeder mit bis zu 50 `+Entry`-Unterabschnitten.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<OrderOptions1>
   Allow                         = yes
   Required                      = no
   VATType                       = static
   VATRate-Value                 = 1
   SubTotalDependentCost-Base    = Standard
   WriteCostFreeSelectionsInOrder = no
   <+Entry>
      Name-Txt       = keine Transportversicherung
      Cost-Value     = 0
      CostType-Value = 1
   </+Entry>
   <+Entry>
      Name-Txt       = Transportversicherung ohne Selbstbeteiligung
      Cost-Value     = 1.5
      CostType-Value = 2
   </+Entry>
</OrderOptions1>
```

### Hauptabschnitt

| Parameter | Zweck | Werte |
| - | - | - |
| `Allow` | Zusatzleistung aktivieren | `yes`, `no` |
| `Required` | der Käufer muss eine Auswahl treffen | `yes`, `no` |
| `DeliveryCountry-List` | Lieferländer, für die die Option gilt | 3-stellige ISO-Codes, kommasepariert |
| `VATType` | Ermittlung des Mehrwertsteuersatzes | `dynamic`, `static`. Standard: `static` |
| `VATRate-Value` | Mehrwertsteuerindex, nur bei `static` | 1 bis 10. Standard: 1 |
| `SubTotalDependentCost-Base` | DEEE-Kosten aus der Grundlage prozentualer Kosten herausnehmen | `Standard`, `ExcludeDEEECosts`. Standard: `Standard` |
| `WriteCostFreeSelectionsInOrder` | kostenfreie Zusatzleistungen in den Bestelldaten anzeigen | `yes`, `no`. Standard: `no` |

Ist `DeliveryCountry-List` gesetzt, wird die Option für alle anderen Länder nicht angeboten.

### `+Entry`

| Parameter | Zweck | Werte |
| - | - | - |
| `Name-Txt` | Name der Zusatzleistung, erscheint bei der Auswahl und in der Bestellung | Text |
| `Cost-Value` | Kosten, je nach `CostType-Value` fix oder prozentual | Zahl |
| `CostType-Value` | Art der Kosten | `1` für fix, `2` für prozentual zum Warenwert |

Ein kostenfreier Eintrag erscheint nur dann in der Bestellung, wenn `WriteCostFreeSelectionsInOrder` auf `yes` steht.

> [!WARNING]
>
> Der Parameter `Display-Txt` wird nicht mehr benötigt. Die Anzeige der Kosten erfolgt heute direkt auf der Warenkorbseite über das Tag `BASKET-OrderOptionCost`.

## `OrderSpecialInput`

Regelt die optionalen Zusatzinformationen zu einer Bestellung.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<OrderSpecialInput>
   RemoveSigns = "*|~%${};<>§·@
</OrderSpecialInput>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `RemoveSigns` | Zeichen, die aus den eingegebenen Zusatzinformationen entfernt werden | Zeichenfolge |

> [!WARNING]
>
> Der Parameter `Txt` ist veraltet und hat keine Wirkung mehr.

Die entfernten Zeichen verschwinden ohne Hinweis- oder Fehlermeldung an den Käufer.

## `AcceptTermsAndConditions`

Legt fest, wo die AGB angezeigt werden, ob der Käufer ihnen ausdrücklich zustimmen muss und ob die Checkbox vorbelegt ist. Zusätzlich lässt sich hier eine zweite Checkbox für die Weitergabe der E-Mail-Adresse an den Versanddienstleister konfigurieren.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AcceptTermsAndConditions>
   Allow                                          = yes
   UserMustAcceptTermsAndConditions               = yes
   CheckboxPlacedOnTemplate                       = PlaceOrder
   CheckboxDefault                                = unchecked
   eMailSharingWithShippingProvider-CheckboxAllow = no
   RequiredForNewSubscriptions                    = no
</AcceptTermsAndConditions>
```

### AGB-Zustimmung

| Parameter | Zweck | Werte |
| - | - | - |
| `Allow` | Funktion aktivieren | `yes`, `no`. Standard: `no` |
| `UserMustAcceptTermsAndConditions` | ausdrückliche Zustimmung ist für die Bestellung notwendig | `yes`, `no`. Standard: `yes` |
| `CheckboxPlacedOnTemplate` | auf welcher Seite AGB und Checkbox erscheinen | `CombinedAddress`, `PayDeliv`, `PlaceOrder`. Standard: `PlaceOrder` |
| `CheckboxDefault` | Vorbelegung der Checkbox | `checked`, `unchecked`. Standard: `unchecked` |
| `RequiredForNewSubscriptions` | Zustimmung auch beim Abschluss eines Abonnements verlangen | `yes`, `no`. Standard: `no` |

`CombinedAddress` ist die Seite zur Auswahl der Rechnungs- und Lieferadresse, `PayDeliv` die Seite zur Auswahl der Zahlungs- und Versandarten, `PlaceOrder` die Bestellübersichtsseite.

> [!WARNING]
>
> Die Checkbox darf **nicht** mit dem Tag `WS-CheckConditions` umgesetzt werden. Das ist ein abgelöstes Tag einer früheren Integrationsmethode. Verwenden Sie stattdessen `WS-AcceptTermsAndConditions_input` und `WS-AcceptTermsAndConditions_checked`.

### Checkbox zur Datenweitergabe

| Parameter | Zweck | Werte |
| - | - | - |
| `eMailSharingWithShippingProvider-CheckboxAllow` | zusätzliche Checkbox aktivieren | `yes`, `no`, `test`. Standard: `no` |
| `eMailSharingWithShippingProvider-CheckboxDefault` | Vorbelegung dieser Checkbox | `checked`, `unchecked`. Standard: `unchecked` |
| `eMailSharingWithShippingProvider-UseSeparateInput` | eigenes Eingabefeld statt der E-Mail der Rechnungsadresse | `yes`, `no`. Standard: `no` |

Die Vorbelegung `unchecked` ist die datenschutzkonforme Einstellung.

## `DirectOrder`

Legt die Optionen für die Direktbestellung fest, also die Bestellung über eine Eingabetabelle mit Produktnummern.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<DirectOrder>
   DefaultInputLines-Value = 10
   ExtendInputLines-Value  = 5
   NumberSearchFields      = Number,AltNumber1
   Notify1-Txt             = Bitte geben Sie eine Menge an.
   Notify2-Txt             = Bitte geben Sie eine Produktnummer an.
   Notify3-Txt             = Die Produktnummer ~PR-Number~ wurde nicht gefunden.
</DirectOrder>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `DefaultInputLines-Value` | Anzahl der Eingabezeilen beim Aufruf der Seite | Ganzzahl |
| `ExtendInputLines-Value` | Anzahl der Zeilen, die ein Klick auf "Tabelle erweitern" hinzufügt | Ganzzahl |
| `NumberSearchFields` | in welchen Produktfeldern gesucht wird | `Number`, `AltNumber1` bis `AltNumber5`, kommasepariert. Standard: `Number` |
| `ShowBaseProductsAtDirectOrderInput-Allow` | bei einer Variantennummer das Basisprodukt statt der Variante anzeigen | `yes`, `no`. Standard: `no` |

> [!WARNING]
>
> `DefaultInputLines-Value` und `ExtendInputLines-Value` zusammen dürfen 100 Zeilen nicht überschreiten.

Bei `ShowBaseProductsAtDirectOrderInput-Allow = no` sieht der Käufer direkt die eingegebene Variantenkombination. Bei `yes` sieht er das Basisprodukt und wählt die Kombination selbst über die Auswahlliste.

### Hinweistexte

| Parameter | Meldung |
| - | - |
| `Notify1-Txt` | Die Eingabe einer Menge fehlt |
| `Notify2-Txt` | Die Eingabe einer Produktnummer fehlt |
| `Notify3-Txt` | Die Produktnummer wurde nicht gefunden. Erlaubt das Tag `PR-Number` |
| `Notify4-Txt` | Mehrere Ausführungen möglich |
| `Notify5-Txt` | Das Produkt hat eine Mindestbestellmenge. Erlaubt `PR-MinQuantity` und `PR-Unit` |
| `Notify6-Txt` | Das Produkt hat eine maximale Bestellmenge. Erlaubt `PR-MaxQuantity` und `PR-Unit` |
| `Notify7-Txt` | Das Produkt ist ausverkauft |
| `Notify8-Txt` | Die alternative Produktnummer wurde nicht gefunden |

## `Offers`

Hält die Texte für kundenspezifische Angebote.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Offers>
   OfferID-Txt = Angebotsnummer
   Offer-Txt   = Angebot
   From-Txt    = vom
</Offers>
```

| Parameter | Bezeichnet |
| - | - |
| `OfferID-Txt` | die eindeutige Kennzeichnung des Angebots |
| `Offer-Txt` | die Angebotsbeschreibung beziehungsweise den Titel |
| `From-Txt` | das Datum des Angebots |

> [!WARNING]
>
> Läuft eine Bestellung über ein kundenspezifisches Angebot, werden alle Versandarten bis auf die erste deaktiviert und die erste mit Name und Kosten aus dem Angebot überschrieben. Dasselbe gilt für die Zahlungskosten.

## `W2P`

Hält die Meldungen und Texte für das Web-to-Print-Modul.

| Parameter | Zweck |
| - | - |
| `NotificationAddress` | E-Mail-Adresse für Fehlerbenachrichtigungen |
| `SaveW2PToCookieBasket-Allow` | ob Gestaltungen im Cookiewarenkorb gespeichert werden. `yes`, `no`. Standard: `no` |
| `W2PCost-Txt` | Beschreibung der Gesamtkosten in den Bestelldaten |
| `W2PVAT-Txt` | Beschreibung der Mehrwertsteuer auf die Gesamtkosten |
| `W2PItemCost-Txt` | Beschreibung der Kosten bei einem einzelnen Produkt |
| `W2PItemVAT-Txt` | Beschreibung der Mehrwertsteuer bei einem einzelnen Produkt |
| `W2PCreated-Txt` | Meldung bei erfolgreicher Erstellung einer Gestaltung |
| `W2PChanged-Txt` | Meldung bei erfolgreicher Änderung |
| `W2PCanceled-Txt` | Meldung bei Abbruch auf Kundenwunsch |
| `W2PDeleted-Txt` | Meldung beim Löschen einer Gestaltung |
| `W2PError-Txt` | Meldung bei einem Fehler |

Bei `SaveW2PToCookieBasket-Allow = yes` werden `TicketID`, `DocID`, `ThumbnailURL` und `OverwriteReturnURLs` mit in den Cookiewarenkorb aufgenommen und beim Einlesen wieder gesetzt.

## `AreaProduct`

Legt die Einstellungen für Flächenprodukte fest, also Produkte, deren Preis sich aus Länge und Breite ergibt.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AreaProduct>
   InputPrecision                 = 1
   CalculatedAreaDisplayPrecision = 2
   CalculatedAreaConversionFactor = 10000
   DisplayNameLength              = Länge
   DisplayNameWidth               = Breite
   DisplayNameCalculatedArea      = Fläche
   DisplayLengthWidthUnit         = cm
   DisplayCalculatedAreaUnit      = qm
</AreaProduct>
```

### Berechnung

| Parameter | Zweck | Werte |
| - | - | - |
| `InputPrecision` | Nachkommastellen für die Eingabe von Länge und Breite | Zahl |
| `CalculatedAreaDisplayPrecision` | Nachkommastellen für die Anzeige der berechneten Fläche | Zahl |
| `CalculatedAreaConversionFactor` | Umrechnungsfaktor der Flächenformel | Zahl. Standard: 1 |
| `UseDynamicWeightBasedOnCalculatedArea` | Produktgewicht aus der eingegebenen Fläche berechnen | `yes`, `no`. Standard: `no` |

Die Fläche ergibt sich aus Länge mal Breite geteilt durch den Umrechnungsfaktor. Geben Käufer die Maße in Zentimetern ein und ist der Flächenpreis in Quadratmetern hinterlegt, lautet der Faktor 10000.

Bei `UseDynamicWeightBasedOnCalculatedArea = yes` ergibt sich das Gesamtgewicht aus dem Produktdatenfeld `Weight` mal der eingegebenen Fläche. Bei `no` gilt das Gewicht aus den Produktdaten unverändert.

### Anzeige

| Parameter | Bezeichnet |
| - | - |
| `DisplayNameLength` | die Länge beziehungsweise Höhe |
| `DisplayNameWidth` | die Breite beziehungsweise Dicke |
| `DisplayNameCalculatedArea` | die berechnete Fläche |
| `DisplayLengthWidthUnit` | die Einheit von Länge und Breite, beispielsweise `cm` |
| `DisplayCalculatedAreaUnit` | die Einheit der berechneten Fläche, beispielsweise `qm` |
| `MessageAreaOutOfRange` | die Meldung bei ungültigen oder außerhalb der Grenzen liegenden Eingaben |

Die beiden Einheiten sind reine Anzeigewerte und gehen nicht in die Berechnung ein. Dafür ist allein `CalculatedAreaConversionFactor` zuständig.

## `AgeRestrictedProductList`

Hält die Texte für die Auswahl der Altersstufen beim Filtern von Produkten mit Altersbeschränkung.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AgeRestrictedProductList>
   Default-Txt = beliebig
   Age3-Txt    = ab 3 Jahre
   Age6-Txt    = ab 6 Jahre
   Age12-Txt   = ab 12 Jahre
   Age16-Txt   = ab 16 Jahre
   Age18-Txt   = ab 18 Jahre
</AgeRestrictedProductList>
```

| Parameter | Zweck |
| - | - |
| `Default-Txt` | Text für den Eintrag ohne Altersbeschränkung |
| `Age1-Txt` bis `Age99-Txt` | Text für die jeweilige Altersstufe |

Die Zahl im Parameternamen ist zugleich die Altersstufe. Für einen Eintrag "ab 15 Jahre" schreiben Sie `Age15-Txt = ab 15 Jahre`.

Welche Versandart bei Produkten mit Altersbeschränkung angeboten wird, steuern Sie über den Abschnitt `EigenhaendigPlus`.

Referenz: [Abschnitt EigenhaendigPlus](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/versand-und-lieferung.md#eigenhaendigplus)

## `Subscription`

Konfiguriert das Abo-Modul, also Lieferintervalle, Wiederholversuche und die vier Benachrichtigungs-E-Mails. Der Abschnitt ist vollständig auf der Wegweiser-Seite zum Abo-Modul beschrieben und hier deshalb nur verlinkt.

Wegweiser: [Abo-Modul](https://dokumentation.websale.de/v8s/marketing-funktionen/abo-modul.md)


## Related topics

- [Bestellprozess, Adressen und Prüfungen](https://dokumentation.websale.de/v8s/referenz/tags/ws/bestellprozess-adressen-und-pruefungen.md)
- [Speicherbarer Warenkorb](https://dokumentation.websale.de/v8s/warenkorb/speicherbarer-warenkorb.md)
- [Schaltflächen im Bestellprozess](https://dokumentation.websale.de/v8s/referenz/tags/bt/bestellprozess.md)
- [Mindestbestellwert und Mindermengenzuschlag](https://dokumentation.websale.de/v8s/weitere-funktionen-im-bestellprozess-kontext/mindestbestellwert-und-mindermengenzuschlag.md)
- [Schaltflächen auf Produkt- und Warenkorbseite](https://dokumentation.websale.de/v8s/referenz/tags/bt/produkt-und-warenkorb.md)


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