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

# Preise, Steuern und Währung

> Wie die Mehrwertsteuer ermittelt wird, wie Preise formatiert und in alternativen Währungen angezeigt werden und wie Gutscheine, Bonuspunkte, Zuschüsse, Aktionspreise und klimaneutrale Produktion in die Summenbildung eingreifen.

Der Endbetrag einer Bestellung entsteht aus mehreren Schichten. Zuunterst liegt die Frage, ob die Preise Netto- oder Bruttopreise sind und welcher Mehrwertsteuersatz für welches Produkt und welches Lieferland gilt. Darüber liegt die Darstellung, also Nachkommastellen, Trennzeichen und Währung. Ganz oben liegen die Beträge, die etwas abziehen oder hinzufügen, von Gutscheinen über Bonuspunkte bis zur klimaneutralen Produktion.

Diese Seite folgt denselben Schichten. Erst die Mehrwertsteuer, dann die Währung und die Preisformatierung, dann die Abschläge und Zuschläge.

Referenz: Shopkonfiguration shop.config, Übersicht aller Abschnitte

## `VAT`

Legt fest, wie die Mehrwertsteuer behandelt wird. Das ist der zentrale Abschnitt für alle Steuerfragen im Shop.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<VAT>
   ProductPrices                                = gross
   Name-Txt                                     = Mehrwertsteuer
   NameGross-Txt                                = enthaltene Mehrwertsteuer
   NameNet-Txt                                  = zuzüglich Mehrwertsteuer
   WithoutVAT-Txt                               = Mehrwertsteuerfreie Bestellung
   Discount-Txt                                 = abzüglich deutscher MwSt.
   DefaultVATRate                               = 1
   TaxCountries                                 = DEU,AUT,BEL
   TaxIDCountries                               = BEL,BGR,DNK
   VATRateDefinition-Mode                       = ByDelivCountry-Managed
   VATRateDefinition-ByDelivCountry-StandardISO = DEU
</VAT>
```

### Netto oder Brutto

| Parameter | Zweck | Werte |
| - | - | - |
| `ProductPrices` | ob die hinterlegten Preise Netto- oder Bruttopreise sind | `net`, `gross`. Standard: `gross` |

Ein im Kundenkonto hinterlegter Preistyp **überschreibt** diese Einstellung für den angemeldeten Käufer. Ein Shop kann dadurch für Geschäftskunden ein Nettoshop und für Privatkunden ein Bruttoshop sein.

### Texte in den Bestelldaten

| Parameter | Erscheint |
| - | - |
| `Name-Txt` | als allgemeine Bezeichnung der Mehrwertsteuer |
| `NameGross-Txt` | statt `Name-Txt`, wenn der Shop ein Bruttoshop ist |
| `NameNet-Txt` | statt `Name-Txt`, wenn der Shop ein Nettoshop ist |
| `Discount-Txt` | wenn bei Bruttopreisen die Mehrwertsteuer abgezogen wird |
| `WithoutVAT-Txt` | wenn für die Bestellung keine Mehrwertsteuer berechnet wurde |

> [!WARNING]
>
> Es muss mindestens einer der drei Namenstexte gefüllt sein. Sind `NameGross-Txt` und `NameNet-Txt` leer, muss zwingend `Name-Txt` gefüllt sein. Andernfalls findet **gar keine Mehrwertsteuerberechnung** statt.

### Mehrwertsteuerindex für Kosten

Produkte tragen keinen festen Steuersatz, sondern einen Index zwischen 1 und 10. Für alles, was kein Produkt ist, legt dieser Abschnitt fest, welcher Index gilt und ob er fest steht oder sich aus dem Warenkorb ergibt.

| Parameter | Betrifft | Werte |
| - | - | - |
| `DefaultVATRate` | sonstige Kosten, beispielsweise Zahlungskosten | 1 bis 10. Standard: 1 |
| `DeliveryVATRate` | Versandkosten, nur bei `DeliveryVATType = static` | 1 bis 10. Standard: 1 |
| `DeliveryVATType` | Ermittlung für Versandkosten | `dynamic`, `static`. Standard: `dynamic` |
| `PaymentCostVATType` | Ermittlung für Zahlungskosten | `dynamic`, `static`. Standard: `static` |
| `SurchargeVATType` | Ermittlung für Zuschläge | `dynamic`, `static`. Standard: `static` |
| `SampleCopyVATRate` | Belegexemplare, nur bei `SampleCopyVATType = static` | 1 bis 10. Standard: 1 |
| `SampleCopyVATType` | Ermittlung für Belegexemplare | `dynamic`, `static`. Standard: `static` |
| `MultiDeliveryAddressUsageVATRate` | Versandkosten bei Split-Order, nur bei `static` | 1 bis 10. Standard: 1 |
| `MultiDeliveryAddressUsageVATType` | Ermittlung für Versandkosten bei Split-Order | `dynamic`, `static`. Standard: `static` |

`static` bedeutet, dass der angegebene Index verwendet wird. `dynamic` bedeutet, dass der Mehrwertsteuersatz mit der höchsten Summe im Warenkorb den Satz bestimmt.

> [!WARNING]
>
> Bei `dynamic` darf der zugehörige Index-Parameter **keinen Wert** enthalten.

> [!NOTE]
>
> Zwei Eigenheiten der Auswertung sind dabei zu beachten.
>
> Fehlt `DefaultVATRate` vollständig, verwendet der Kernel den Wert aus `DeliveryVATRate` als Standardindex. Ein leerer `DefaultVATRate` ergibt dagegen 1.
>
> Ein Index über dem Maximum wird stillschweigend auf das Maximum gesetzt, der Wert 0 wird zu 1. Eine Fehlermeldung erscheint nicht.

Für Geschenkverpackungen, Bonuspunkte, Gutscheine, Zuschüsse und die klimaneutrale Produktion gelten eigene `VATType`-Parameter in deren jeweiligen Abschnitten.

### Länderabhängige Steuerpflicht

| Parameter | Zweck | Werte |
| - | - | - |
| `TaxCountries` | Länder, die mehrwertsteuerpflichtig sind | kommaseparierte 3-stellige ISO-Codes |
| `TaxIDCountries` | Länder, in denen Firmenkunden mit gültiger USt-IdNr. von der Steuer befreit sind | kommaseparierte 3-stellige ISO-Codes |
| `TaxFreeIgnoreBillAddr` | nur das Lieferland zur Ermittlung heranziehen | `yes`, `no`. Standard: `no` |

In der Regel sind das jeweils alle Länder des EU-Gemeinschaftsgebiets.

> [!WARNING]
>
> Fehlt `TaxCountries` oder ist er leer, erfolgt **keine** länderabhängige Steuererhebung. Die Mehrwertsteuer wird dann für alle Länder erhoben.
>
> Fehlt `TaxIDCountries` oder ist er leer, erfolgt **keine** Steuerbefreiung über die USt-IdNr.

Der frühere Parametername `Countries` wird weiterhin als Rückfallebene gelesen, wenn `TaxCountries` fehlt oder leer ist.

#### Steuerbefreiung über die Lieferadresse

Normalerweise entscheidet die USt-IdNr. der Rechnungsadresse über die Befreiung. Die folgenden beiden Parameter verlagern das auf die Lieferadresse.

| Parameter | Zweck | Werte |
| - | - | - |
| `TaxFree4TaxID-DeliveryDependent` | Befreiung von der USt-IdNr. der Lieferadresse abhängig machen | `yes`, `no`, `test`. Standard: `no` |
| `TaxFree4TaxID-DelivAddrTaxIDField` | Suffix-Feld, in dem die USt-IdNr. der Lieferadresse gepflegt wird | beispielsweise `Suffix45` |

Der Wert `test` greift nur im allgemeinen Testmodus des Shops. Im Produktivbetrieb wird dann die USt-IdNr. der Rechnungsadresse verwendet.

### Herkunft der Steuersätze

| Parameter | Zweck | Werte |
| - | - | - |
| `VATRateDefinition-Mode` | woher die Steuersätze kommen | `Standard`, `ByDelivCountry-Managed`, `ByDelivCountry-Individual`. Standard: `Standard` |
| `VATRateDefinition-TestMode` | abweichendes Verfahren im allgemeinen Testmodus | dieselben Werte. Standard: wie `VATRateDefinition-Mode` |
| `VATRateDefinition-ByDelivCountry-StandardISO` | Standard-Lieferland, solange noch keines bekannt ist | 3-stelliger ISO-Code |
| `VATRateDefinition-ByDelivCountry-ISOForVATDiscount` | ISO-Code des Firmensitzes für den Steuerabzug bei Auslandslieferung | 3-stelliger ISO-Code |
| `VATRateDefinition-ByDelivCountry-DefinitionFile` | individuelle Steuersatz-Datei | Dateiname, beispielsweise `vatrates.config` |
| `VATRateDefinition-ByDelivCountry-TestDefinitionFile` | individuelle Steuersatz-Datei für den Testmodus | Dateiname |

`Standard` liest die Steuersätze aus den `VATRates`-Abschnitten dieser `shop.config`. `ByDelivCountry-Managed` nimmt sie aus der globalen WEBSALE-Mehrwertsteuersatz-Datei. `ByDelivCountry-Individual` nimmt sie aus einer eigenen Datei, die dann in `VATRateDefinition-ByDelivCountry-DefinitionFile` stehen muss.

> [!NOTE]
>
> `VATRateDefinition-TestMode` greift nur, wenn der Shop tatsächlich im Testmodus läuft. In diesem Fall wird zusätzlich die Datei aus `VATRateDefinition-ByDelivCountry-TestDefinitionFile` statt der produktiven Datei verwendet.
>
> Ist `VATRateDefinition-ByDelivCountry-ISOForVATDiscount` leer, verwendet der Kernel den Wert aus `VATRateDefinition-ByDelivCountry-StandardISO`.

### Nicht dokumentierte Parameter

Der Kernel liest in diesem Abschnitt vier weitere Parameter.

| Parameter | Zweck | Werte |
| - | - | - |
| `VATDetermination-Mode` | alternatives Verfahren der Steuerermittlung | `PerPosition-ConsiderCountryOfProduction`, `TaxCase` |
| `VATDetermination-TestMode` | dasselbe, nur im allgemeinen Testmodus wirksam | dieselben Werte |
| `TaxCase-DefaultCountryOfProduction` | Standard-Produktionsland für die Steuerfallermittlung | 3-stelliger ISO-Code |
| `RegisteredCountry-List` | Länder, in denen der Händler steuerlich registriert ist | kommaseparierte ISO-Codes |
| `AllowedTaxIDCountry-List` | Länder, aus denen USt-IdNr. akzeptiert werden | kommaseparierte ISO-Codes |

> [!WARNING]
>
> Diese Parameter greifen in die Steuerberechnung ein. Setzen Sie sie nur nach Abstimmung mit der WEBSALE AG. Der Freigabestatus ist noch zu klären.

## `VATRates`

Ordnet jedem Mehrwertsteuerindex einen konkreten Satz zu. Produkte tragen nur den Index, nicht den Satz. Ändert sich die gesetzliche Mehrwertsteuer, passen Sie damit nur diesen einen Abschnitt an statt jedes einzelne Produkt.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<VATRates>
   1 = 19
   2 = 7
   3 = 7.7
</VATRates>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `1` bis `10` | Mehrwertsteuersatz zu diesem Index, ohne Prozentzeichen | Ganzzahl oder Dezimalzahl mit Punkt, beispielsweise `19` oder `7.7` |

Diese Methode ist veraltet, wird aber weiterhin unterstützt. WEBSALE empfiehlt stattdessen die globale WEBSALE-Mehrwertsteuersatz-Datei oder eine individuelle Datei, beides über `VATRateDefinition-Mode` im Abschnitt `VAT`.

> [!WARNING]
>
> Die `VATRates`-Abschnitte werden **nur** gelesen, wenn `VATRateDefinition-Mode` auf `Standard` steht. In den beiden anderen Modi bleiben sie wirkungslos.

Zusätzlich zu `VATRates` dürfen Sie entweder länderabhängige **oder** datumsabhängige Abschnitte verwenden, nie beides und keine Kombination daraus. Für eine zeitgesteuerte Umstellung in bestimmten Ländern verwenden Sie die [Kampagnensteuerung](https://dokumentation.websale.de/v8s/marketing-funktionen/kampagnensteuerung.md).

### Länderabhängige Steuersätze

Für jedes Lieferland lässt sich ein eigener Abschnitt anlegen, dessen Name auf den 3-stelligen ISO-Code endet.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<VATRates-AUT>
   1 = 20
   2 = 10
</VATRates-AUT>

<VATRates-CHE>
   1 = 7.7
   2 = 2.5
</VATRates-CHE>
```

Wählt der Käufer ein Lieferland aus, sucht der Shop zuerst nach dem passenden länderabhängigen Abschnitt. Wird er gefunden, gelten dessen Werte. Wird er nicht gefunden, gelten die Werte aus `VATRates`.

> [!NOTE]
>
> Der Abschnitt `VATRates` ohne Zusatz ist **immer** erforderlich. Länder ohne abweichende Sätze brauchen keinen eigenen Abschnitt.
>
> Welches Lieferland gilt, hängt vom Bestellweg ab. Im normalen Bestellprozess ist es das vom Käufer gewählte Lieferland. Bei PayPal Express Checkout, Klarna Express Checkout und PayPal Checkout liefert der jeweilige Dienst das Lieferland.

### Datumsabhängige Steuersätze

Für einen Stichtag lässt sich ein Abschnitt anlegen, dessen Name auf das Datum im Format `JJJJMMTT` endet. Die Zahl steht für den **letzten** Tag, an dem diese Sätze gelten.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<VATRates>             # gilt ab dem 01.01.2027
   1 = 19
   2 = 7
</VATRates>
<VATRates20261231>     # gilt vom 01.07.2026 bis 31.12.2026
   1 = 16
   2 = 5
</VATRates20261231>
<VATRates20260630>     # gilt bis zum 30.06.2026
   1 = 19
   2 = 7
</VATRates20260630>
```

> [!WARNING]
>
> Die Reihenfolge entscheidet, ähnlich wie beim Überschreiben einer CSS-Klasse.
>
> Der Abschnitt `VATRates` ohne Datum muss **immer zuerst** stehen und die Sätze enthalten, die nach allen Stichtagen wieder gelten.
>
> Danach folgen die datierten Abschnitte, der späteste Stichtag zuerst.

## `Currency-Txt`

Legt die Basiswährung des Shops fest. Das ist die Währung, in der die Produktpreise hinterlegt sind.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Currency-Txt>
   Name-!                = EUR
   Symbol                = &euro;
   PaymetricCurrencyCode =
</Currency-Txt>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `Name-!` | Basiswährung im 3-stelligen ISO-Code | beispielsweise `EUR`, `CHF`, `USD`. Standard: `EUR` |
| `Symbol` | HTML-Codierung des Währungssymbols | beispielsweise `&euro;`, `&pound;`, `&yen;` |
| `PaymetricCurrencyCode` | Währungscode für Paymetric | numerisch nach ISO 4217 |

## `AlternativeCurrency`

Zeigt Preise zusätzlich in anderen Währungen an. Die Umrechnungskurse hält die WEBSALE AG aktuell, sofern Sie keine eigene Datei hinterlegen.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AlternativeCurrency>
   Allow                     = yes
   GeoIP-Allow               = no
   SelectBoxMode             = Txt
   SelectBoxOnchange         = submit();
   NoAlternativeCurrency-Txt = Keine alternative Währung anzeigen
   <+Entry>
      ISO    = USD
      Txt    = US-Dollar
      Symbol = $
   </+Entry>
   <+Entry>
      ISO    = GBP
      Txt    = Britische Pfund
      Symbol = &pound;
   </+Entry>
</AlternativeCurrency>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `Allow` | alternative Währungsanzeige aktivieren | `yes`, `no` |
| `GeoIP-Allow` | alternative Währung bei Shopstart automatisch über GeoIP bestimmen | `yes`, `no` |
| `SelectBoxMode` | welches Feld in der automatisch erzeugten Auswahlliste erscheint | `Txt`, `Symbol`, `ISO` |
| `SelectBoxOnchange` | wird der Auswahlliste als Attribut `onchange` übergeben | JavaScript |
| `NoAlternativeCurrency-Txt` | Text für den Eintrag "keine Währung anzeigen" | Text |
| `CurrencyConversionFile` | eigene Datei mit Umrechnungskursen, relativ zum Konfigurationsverzeichnis | Dateiname |

Die Werte von `SelectBoxMode` entsprechen den Parameternamen der `+Entry`-Abschnitte.

Je angebotener Währung ein Unterabschnitt `+Entry`.

| Parameter | Zweck | Werte |
| - | - | - |
| `ISO` | 3-stelliger ISO-Code der Währung | beispielsweise `USD` |
| `Txt` | optionaler Anzeigetext | Text. Standard: der ISO-Code |
| `Symbol` | optionales Währungssymbol | Text. Standard: der ISO-Code |

## `PriceFormat`

Legt fest, wie Preise dargestellt werden. Alle Einstellungen sind optional.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<PriceFormat>
   DecimalPlaces      = 2
   DecimalSeparator   = ,
   ThousandSeparator  = .
   ZeroIntegralPart   =
   ZeroFractionalPart = --
   JoinCurrency       = ~WS-Price~ ~WS-Currency~
   JoinCurrencySymbol = ~WS-Price~ ~WS-CurrencySymbol~
</PriceFormat>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `DecimalPlaces` | Anzahl der angezeigten Nachkommastellen | 0 bis 2. Standard: 2 |
| `DecimalSeparator` | Dezimaltrennzeichen | beliebiges Zeichen. Standard: Punkt |
| `ThousandSeparator` | Tausendertrennzeichen | beliebiges Zeichen. Standard: keines |
| `ZeroIntegralPart` | Darstellung einer 0 vor dem Komma | `hide` oder ein Ersatzzeichen |
| `ZeroFractionalPart` | Darstellung einer 00 nach dem Komma | `hide` oder ein Ersatzzeichen |
| `JoinCurrency` | Stellung von Preis und ISO-Währungscode zueinander | Standard: `~WS-Price~ ~WS-Currency~` |
| `JoinCurrencySymbol` | Stellung von Preis und Währungssymbol zueinander | Standard: `~WS-Price~ ~WS-CurrencySymbol~` |

`ZeroIntegralPart` wirkt nur auf das Tag `PR-IPart()`, `ZeroFractionalPart` nur auf `PR-FPart()`. Mit `ZeroIntegralPart = -` wird aus 0,95 die Ausgabe `-,95`. Mit `ZeroFractionalPart = --` wird aus 2,00 die Ausgabe `2,--`.

Die beiden Join-Parameter wirken nur auf Elemente, die WEBSALE V8s automatisch erzeugt, beispielsweise das Bestelldatenformat. Haben Sie die Währung in Templates von Hand positioniert, müssen Sie diese Templates zusätzlich anpassen.

> [!WARNING]
>
> Der Shop übergibt Preise an technische Systeme unformatiert, aber nur an Systeme, die er kennt. In Templates eingebundene externe Systeme, beispielsweise per Zählpixel oder JavaScript, erhalten die Tags `BASKET-ValueOfGoods`, `BASKET-OrderTotal` und `BASKET-SubTotalNet` in Ihrer eingestellten Formatierung.
>
> Klären Sie vorab, ob diese Systeme Ihre Dezimal- und Tausendertrennzeichen korrekt einlesen. Falls nicht, müssen Sie im Shop bei den Standards bleiben, also Punkt als Dezimaltrennzeichen und kein Tausendertrennzeichen.

## `Voucher-Txt`

Aktiviert das Einlösen von Gutscheinen und hält die zugehörigen Texte.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Voucher-Txt>
   Name                                          = Gutschein
   VoucherInputLocation                          = Basket
   NewCustomerDefinition                         = NoCustomerNumber
   MultiVoucher-Allow                            = no
   VATType                                       = static
   UsedVoucherNumber                             = (verwendete Gutscheinnummer: ~VoucherNumber~)
   Remainder2                                    = Verfügbarer Restbetrag für Ihre nächste Bestellung:
   VoucherNotApplicable                          = Der Gutschein ist mit diesen Produkten nicht verwendbar.
</Voucher-Txt>
```

### Grundeinstellung

| Parameter | Zweck | Werte |
| - | - | - |
| `Name` | Bezeichnung zur Kennzeichnung | Text, beispielsweise `Gutschein` |
| `VoucherInputLocation` | auf welchen Templates die Gutscheineingabe erscheint | siehe unten |
| `NewCustomerDefinition` | wer als Neukunde für einen Neukundengutschein gilt | `NoOrder`, `NoCustomerNumber`. Standard: `NoCustomerNumber` |
| `ExternalVouchers-Allow` | Import extern erzeugter Gutscheindaten erlauben | `yes`, `no`. Standard: `no` |
| `VATType` | Ermittlung des Mehrwertsteuersatzes für Gutscheine | `dynamic`, `static`. Standard: `static` |

`NewCustomerDefinition = NoOrder` lässt den Gutschein zu, solange der Käufer noch keine Bestellung abgeschlossen hat, auch wenn bereits eine Kundennummer existiert. `NoCustomerNumber` verlangt, dass noch keine Kundennummer vorhanden ist.

`VoucherInputLocation` ist eine **kommaseparierte Liste**, kein Einzelwert. Zulässig sind `Basket`, `PlaceOrder` und `PayDeliv`. Der Wert `PlaceOrderAndBasket` existiert weiterhin aus Kompatibilitätsgründen und entspricht `Basket,PlaceOrder`. Passt kein Eintrag, wird `Basket` gesetzt.

### Mehrere Gutscheine

| Parameter | Zweck | Werte |
| - | - | - |
| `MultiVoucher-Allow` | mehrere Gutscheine gleichzeitig einlösen | `yes`, `no`, `test`. Standard: `no` |
| `MultiVoucher-MinOrderBehavior` | Berechnung des Mindestbestellwerts bei mehreren Gutscheinen | `UseSum`, `UseMax`. Standard: `UseSum` |
| `UseRoundedPercentalMultiVoucherDiscount` | bei mehreren prozentualen Gutscheinen gerundete Zwischenergebnisse verwenden | `yes`, `no`. Standard: `no` |

Bei zwei Gutscheinen mit Mindestbestellwerten von 20 und 30 Euro verlangt `UseSum` einen Warenkorb über 50 Euro, `UseMax` nur über 30 Euro.

`UseRoundedPercentalMultiVoucherDiscount = yes` rundet jeden Gutschein einzeln und addiert danach. Mit `no` wird erst addiert und dann gerundet.

Der Wert `test` greift nur im allgemeinen Testmodus des Shops. Ein Wechsel von `yes` auf `no` wirkt außerdem erst, wenn in der laufenden Sitzung noch kein zweiter Gutschein eingegeben wurde.

### META-Gutscheine

Ein META-Gutschein ist ein Sammelcode, der mehrere einzelne Gutscheincodes zusammenfasst. Gibt der Käufer den META-Code ein, werden alle zugehörigen Sub-Gutscheine eingelöst. Es kann immer nur ein META-Gutschein gleichzeitig eingelöst sein.

| Parameter | Zweck | Werte |
| - | - | - |
| `MetaVoucherErrorMode` | Verhalten, wenn ein Sub-Gutschein ungültig ist | `reject-all`, `accept-valid`. Standard: `reject-all` |
| `MetaVoucherShowAsBlock` | beim Entfernen eines Sub-Gutscheins alle zugehörigen entfernen | `yes`, `no`. Standard: `yes` |

### Anwendbarkeit auf den Warenkorb

| Parameter | Zweck | Werte |
| - | - | - |
| `PreventOrdersWithVoucherNotApplicable` | Bestellabschluss unterbinden, wenn der Gutschein nicht anwendbar ist | `yes`, `no`. Standard: `no` |
| `ShowPercentalVoucherDiscountForPosition-Allow` | prozentualen Gutschein auf Positionsebene berechnen | `yes`, `no`. Standard: `no` |
| `SpecialSetting1-Allow` | Werbegutschein auf die Zusatzkosten anrechnen, wenn kein werbegutscheinfähiges Produkt im Warenkorb liegt | `yes`, `no`. Standard: `no` |
| `UnresolvedVoucherProducts-Allow` | Basisprodukt mit Varianten als Gutscheinprodukt zulassen | `yes`, `no`. Standard: `no` |
| `AllowToRedeemVoucherWithoutMatchingCatProdFilter` | Einlösen auch ohne passenden Kategorie- oder Produktfilter erlauben | `yes`, `no`. Standard: `no` |

> [!WARNING]
>
> Der Parameter heißt im Kernel `SpecialSetting1-Allow`, also **Setting im Singular**. Unter dem falschen Namen bleibt der Parameter wirkungslos, ohne dass eine Meldung erscheint.

Bei `UnresolvedVoucherProducts-Allow = yes` kann ein Basisprodukt ohne vorausgewählte Variante als Gutscheinprodukt hinterlegt werden. Der Käufer wählt die Variante dann im Warenkorb.

### Texte

| Parameter | Erscheint |
| - | - |
| `Remainder2` | als Hinweis auf den verfügbaren Restbetrag für die nächste Bestellung |
| `UsedVoucherNumber` | im lesbaren Bestellformat nach dem verwendeten Gutscheinbetrag. Das lokale Tag `VoucherNumber` wird durch die Nummer ersetzt |
| `VoucherNotApplicable` | auf der Warenkorbseite, wenn ein Werbegutschein auf einen Warenkorb ohne werbegutscheinfähige Produkte angewendet wird |

## `BonusPoints`

Konfiguriert das händlereigene Bonuspunktesystem.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<BonusPoints>
   Allow                    = yes
   AmountPerPoint           = 0.5
   MinInputPoints           = 0
   MinOrderValue            = 50.00
   VATType                  = static
   CashedPoints-Txt         = abzüglich ~WS-CashedBonusPoints~ Bonuspunkte
   OrderPoints-Txt          = Bonuspunkte der Bestellung
   PointsAccountBalance-Txt = Kontostand Bonuspunkte
</BonusPoints>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `Allow` | Bonuspunktesystem aktivieren | `yes`, `no`. Standard: `no` |
| `AmountPerPoint` | Wert eines Punkts in der Shopwährung | Zahl, beispielsweise `0.5` |
| `MinInputPoints` | Mindestpunktezahl, ab der eingelöst werden kann | Zahl |
| `MinOrderValue` | optionaler Mindestbestellwert fürs Einlösen | Zahl, beispielsweise `50.00` |
| `VATType` | Ermittlung des Mehrwertsteuersatzes für Bonuspunkte | `dynamic`, `static`. Standard: `static` |
| `PriceTypeNet-UseBonusPointsOnTotalNetSum` | in Nettoshops die Punkte von der Netto-Gesamtsumme abziehen | `yes`, `no`. Standard: `no` |

Ein `AmountPerPoint` von 0 oder ein fehlender Wert ergibt stillschweigend 1.

### Texte in den Bestelldaten

| Parameter | Erscheint |
| - | - |
| `CashedPoints-Txt` | bei eingelösten Bonuspunkten für eine Gutschrift |
| `OrderPoints-Txt` | bei den mit dieser Bestellung erworbenen Punkten |
| `PointsAccountBalance-Txt` | beim Kontostand |
| `BonusProductPointsPosition-Txt` | bei den Prämienpunkten einer Position |
| `BonusProductPointsTotal-Txt` | bei der Summe der verbrauchten Punkte aller Prämienprodukte |
| `NotEnoughPoints-Txt` | wenn der Käufer ein Prämienprodukt ohne ausreichendes Guthaben bestellen möchte |

> [!WARNING]
>
> `PriceTypeNet-UseBonusPointsOnTotalNetSum` reduziert zusätzlich die Bemessungsgrundlage der Mehrwertsteuer um die eingelöste Summe. Zwei Einschränkungen sind zu beachten.
>
> Produkte lassen sich dann nicht mehr vom Einlösen ausnehmen, die entsprechende Produkteigenschaft wird ignoriert.
>
> Liegen Produkte mit verschiedenen Steuersätzen im Warenkorb und ist die eingelöste Summe kleiner als die Netto-Gesamtsumme, wird die Bemessungsgrundlage vom ersten Steuerindex an aufsteigend reduziert.

## `CustomerSubvention`

Erlaubt es, jedem Kunden einen Zuschuss zu gewähren.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<CustomerSubvention>
   Allow         = yes
   Name-Txt      = Zuschuss
   Remainder-Txt = Verfügbarer Zuschuss für die nächste Bestellung
   VATType       = static
</CustomerSubvention>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `Allow` | Zuschüsse im Shop gewähren | `yes`, `no`. Standard: `no` |
| `Name-Txt` | Text für die Bestelldaten | Text |
| `Remainder-Txt` | Text für den noch verfügbaren Zuschuss der nächsten Bestellung | Text |
| `VATType` | Ermittlung des Mehrwertsteuersatzes für Zuschüsse | `dynamic`, `static`. Standard: `static` |

## `BuyXPayY`

Definiert eine Aktion nach dem Muster "Nimm 3, zahl 2". WEBSALE V8s unterstützt derzeit nur eine Aktion, der Unterabschnitt `+Entry` darf deshalb nur einmal vorkommen.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<BuyXPayY>
   <+Entry>
      Allow      = yes
      ID         = nimm3zahl2
      BuyX       = 3
      PayY       = 2
      Descr      = Nimm 3, zahl 2
      ValidFrom  = 01.11.2026
      ValidUntil = 31.12.2026
   </+Entry>
</BuyXPayY>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `Allow` | Aktion aktivieren | `yes`, `no`. Standard: `no` |
| `ID` | eindeutige Kennung, wird dem Produkt zugewiesen | alphanumerisch |
| `BuyX` | Mindestanzahl der Produkte, die gekauft werden | Zahl |
| `PayY` | Anzahl der Produkte, die bezahlt werden | Zahl |
| `Descr` | Kurzbeschreibung für die Anzeige im Template | Text, maximal 256 Zeichen |
| `ValidFrom` | Anfangsdatum. Ohne Angabe startet die Aktion sofort | `TT.MM.JJJJ` |
| `ValidUntil` | Enddatum. Ohne Angabe läuft die Aktion unbegrenzt | `TT.MM.JJJJ` |

> [!WARNING]
>
> `BuyX` muss größer sein als `PayY`, und `PayY` muss größer als 0 sein. Ist eine der beiden Bedingungen verletzt, wird der gesamte Eintrag stillschweigend verworfen.
>
> Dasselbe gilt für einen Eintrag ohne `Allow = yes` oder ohne `ID`.
>
> Die beiden Datumsangaben werden nur ausgewertet, wenn sie **exakt zehn Zeichen** lang sind. Eine Schreibweise wie `1.11.2026` wird ignoriert, die Aktion gilt dann ohne diese Grenze.
>
> Gemeint ist `BuyX`.

## `ClimateNeutral`

Konfiguriert die Dienstleistung klimaneutrale Produktion über ClimatePartner.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<ClimateNeutral>
   CO2Factor                 = 0.0017242
   MinCO2CompensationAmount  = 0.001
   VATType                   = static
   VATRate-Value             = 1
   CertificateRetrieval-Mode = PerOrder
   CostAddition-List         = (0:2)(40:5%)(500:0)
   NotificationAddress       = admin@mein-shop.de
   LanguageCode              = de
</ClimateNeutral>
```

### Berechnung

| Parameter | Zweck | Werte |
| - | - | - |
| `CO2Factor` | **Pflichtparameter**. Faktor zur Berechnung der Emissionsmenge aus dem Gewicht aller klimaneutralen Produkte im Warenkorb | Zahl, beispielsweise `0.0017242` |
| `MinCO2CompensationAmount` | Mindestemissionsmenge, ab der die klimaneutrale Produktion angeboten wird | Zahl, beispielsweise `0.001` |
| `ClimatePartnerMinCost-Value` | Mindestkosten für die klimaneutrale Produktion | Zahl, beispielsweise `0.01` |
| `CostAddition-List` | optionaler Aufschlag auf die Zertifikatskosten | Staffel, siehe unten |

Den Wert für `CO2Factor` erhalten Sie von ClimatePartner.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
# ab 0 EUR Zertifikatskosten: 2,00 EUR Aufschlag
# ab 40 EUR Zertifikatskosten: 5 Prozent Aufschlag
# ab 500 EUR Zertifikatskosten: kein Aufschlag
CostAddition-List = (0:2)(40:5%)(500:0)
```

Die Staffel bemisst sich an den **Zertifikatskosten** des externen Anbieters, nicht am Warenwert. Zertifikatskosten plus Aufschlag ergeben die Gesamtkosten. Alle Beträge sind Nettopreise. Es werden bis zu 50 Staffelungen unterstützt.

Hier ist durchgehend von Zertifikatskosten die Rede.

### Mehrwertsteuer

| Parameter | Zweck | Werte |
| - | - | - |
| `VATType` | Ermittlung des Mehrwertsteuersatzes | `dynamic`, `static`. Standard: `static` |
| `VATRate-Value` | Mehrwertsteuerindex, nur bei `VATType = static` | 1 bis 10 |

> [!WARNING]
>
> Lässt sich die Mehrwertsteuer nicht gültig berechnen, wird die klimaneutrale Produktion gar nicht angeboten.

### Zertifikat

| Parameter | Zweck | Werte |
| - | - | - |
| `CertificateClient` | Name, auf den das Klimaschutzzertifikat ausgestellt wird | Tags der Rechnungsadresse |
| `CertificateOrderDescr` | Projektbezeichnung auf dem Zertifikat | Text mit lokalen Tags |
| `CertificateRetrieval-Mode` | Zertifikat je Bestellung oder je Warenkorbposition | `PerOrder`, `PerBasketPosition`. Standard: `PerOrder` |
| `CertificateRetrieval-TestMode` | dasselbe im Testmodus des Shops | `PerOrder`, `PerBasketPosition`. Standard: `PerOrder` |
| `ClimateNeutral-Txt` | optionale Beschreibung für die Bestelldaten und die Bestellhistorie | Text |
| `LanguageCode` | Sprachcode für Anfragen an ClimatePartner | 2-stellig, beispielsweise `de` |
| `NotificationAddress` | Empfänger der Fehlermeldung, wenn die Zertifikatsbestellung scheitert | E-Mail-Adresse |

In `CertificateClient` können Sie alle Tags der Rechnungsadresse verwenden, beispielsweise so:

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
CertificateClient = {A-Company}~A-Company~{/A-Company}{!A-Company}~A-Salutation~ ~A-FirstName~ ~A-LastName~{/!A-Company}
```

In `CertificateOrderDescr` steht das lokale Tag `OrderNumber` zur Verfügung. Bei `CertificateRetrieval-Mode = PerBasketPosition` zusätzlich `ProductNumber` und `ProductName`.

> [!WARNING]
>
> Scheitert die Bestellung des Zertifikats bei ClimatePartner, ist die Bestellung im Shop bereits abgeschlossen und das Zertifikat bezahlt. Eine manuelle Nachbearbeitung bei ClimatePartner ist dann erforderlich. Hinterlegen Sie deshalb unbedingt eine `NotificationAddress`.

### Darstellung der Emissionsmenge

| Parameter | Zweck | Werte |
| - | - | - |
| `DecimalPlaces` | Nachkommastellen für die Anzeige in kg CO2 | Zahl. Standard: 2 |
| `DecimalSeparator` | Dezimaltrennzeichen für diese Anzeige | einzelnes Zeichen. Standard: Komma |
| `ThousandSeparator` | Tausendertrennzeichen für diese Anzeige | einzelnes Zeichen. Standard: Punkt |

## BestPrice-Order-Modul

Das BestPrice-Order-Modul verteilt sich auf vier Abschnitte. Einer für die Templates, einer für die Meldungen und zwei für E-Mails.

### `BestPrice`

```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
   PaymentCode        = 6
</BestPrice>
```

| Parameter | Zweck |
| - | - |
| `Template` | Template des Moduls |
| `TemplateShowOrders` | Template der Reservierungsübersicht |
| `PreorderMail` | E-Mail-Template für die Bestätigung der Vorbestellung |
| `PaymentCode` | Code der Zahlungsart Rechnung |

> [!WARNING]
>
> `PaymentCode` ist fest auf `6` zu setzen und darf nicht geändert werden.

### `BestPrice-Txt`

Die Meldungen des Moduls.

| Parameter | Erscheint, wenn |
| - | - |
| `ErrorNoAmount` | keine Stückzahl gewählt wurde |
| `ErrorNoAddress` | für das Konto noch keine Adresse eingegeben wurde |
| `ErrorNotLoggedIn` | der Käufer nicht angemeldet ist |
| `ErrorCampaignNotActivated` | die Kampagne noch nicht aktiv ist |
| `ErrorCampaignFinished` | die Kampagne bereits beendet ist |
| `ErrorNotConfirmed` | die AGB noch nicht akzeptiert wurden |
| `ErrorNoDoubleOrder` | eine Reservierung mehrfach abgeschickt wird |
| `InfoPreordered` | die Reservierung erfolgreich war |

### `BestPrice-PreorderMail`

Bestätigungs-E-Mail an den Käufer.

| Parameter | Zweck | Werte |
| - | - | - |
| `Allow` | Bestätigungs-E-Mail aktivieren | `yes`, `no`. Standard: `no` |
| `Subject-Txt` | Betreff | Text |
| `SenderName` | Name des Absenders | Text |
| `SenderAddress` | E-Mail-Adresse des Absenders | E-Mail-Adresse |

Es handelt sich um die Absenderadresse. Der Empfänger ist der Käufer und ergibt sich aus der Bestellung.

### `BestPrice-OrderErrorMail`

E-Mail an den Shopadministrator, wenn die finale Bestellgenerierung scheitert.

| Parameter | Zweck | Werte |
| - | - | - |
| `Allow` | Benachrichtigung aktivieren | `yes`, `no`. Standard: `no` |
| `Subject-Txt` | Betreff | Text |
| `SenderName` | Name des Absenders | Text |
| `SenderAddress` | E-Mail-Adresse des Absenders | E-Mail-Adresse |
| `ReceiverAddress` | E-Mail-Adresse des Empfängers | E-Mail-Adresse |


## Related topics

- [Konfiguration currency.dat](https://dokumentation.websale.de/v8s/referenz/konfigurationen/konfiguration-currency-dat.md)
- [Fragebogen Kaufmännische Einstellungen](https://dokumentation.websale.de/v8s/materialien/fragebogen-kaufmaennische-einstellungen.md)
- [Grundlagen und Technik](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik.md)
- [Warenkorb, Preise, Währung und Bonus](https://dokumentation.websale.de/v8s/referenz/tags/ws/warenkorb-preise-waehrung-und-bonus.md)
- [Preise und Kosten](https://dokumentation.websale.de/v8s/preise/preise-und-kosten.md)


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