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

# $wsCheckout - Checkout

> Daten des Bestellvorgangs im Frontend lesen: Auswahl der Zahl- und Versandart, Adressen, Summen, Validierung und Fehler des aktuellen Checkouts.

Mit dem `$wsCheckout`-Modul lesen Sie alle Daten des Bestellvorgangs im Frontend aus. Darunter die gewählte Zahlungs- und Versandart, Rechnungs- und Lieferadresse, die Bestellsummen sowie den Validierungs- und Fehlerstatus.

Auf dieser Seite geht es um das Lesen der Checkout-Daten. Alles, was den Checkout **verändert** (Adresse wählen, Zahlungsart setzen, Bestellung auslösen), ist unter [Aktionen → Checkout](/frontend/referenz/aktionen/checkout) beschrieben.

***

## Grundkonzept

Der Checkout sammelt die Auswahl des Kunden (Zahlung, Versand, Adressen, Freifelder) und prüft fortlaufend, ob die Bestellung ausführbar ist. Über `$wsCheckout` lesen Sie diese Auswahl und den Prüfstatus, um den Bestellablauf zu gestalten und dem Kunden gezielt Rückmeldung zu geben.

### Validierung

Für das Prüf-Feedback gibt es drei Ebenen, die unterschiedlich genau sind. Wählen Sie die Ebene nach dem, was Sie anzeigen wollen:

* **Gesamtstatus** - `isValid` gibt an, ob die Bestellung insgesamt ausführbar ist. Nutzen Sie es beispielsweise, um den „Kaufen"-Button freizugeben oder zu sperren.
* **Feldzustand** - `fieldStates` liefert pro Feld einen Zustand (`untouched`, `empty`, `invalid`, `incompatible`, `valid`). Nutzen Sie es beispielsweise, um ein Feld optisch zu markieren.
* **Konkrete Fehler** - `problems` liefert je Bereich eine Liste von Fehlern mit Fehler-Code und dem Namen des fehlgeschlagenen Checks. Nutzen Sie es beispielsweise, um dem Kunden zu sagen, wie der Fehler konkret zu lösen ist.

### Sofort-Fehler und Fehler nach einer Aktion

Der Checkout kennt zwei Quellen für Fehler-Feedback:

* `$wsCheckout.problems.*` - wird angezeigt, sobald ein Feld angewählt bzw. verlassen wurde, sofern `show*BeforeSubmit` in der [Konfiguration](/konfiguration/checkout-bestellablauf#7-checkout-fielderrorvisibility-fehleranzeige) auf `true` steht. Nach dem ersten Kaufversuch werden die Fehler unabhängig von dieser Einstellung angezeigt.
* `actionResponse`-Fehler - stammen aus der Server-Antwort nach einer Aktion. Für die meisten Sektionen werden sie ungefiltert ausgegeben. Ausnahme: Bei Kundendatenfeldern und der [Draft-Adresse](/frontend/referenz/aktionen/checkout#checkoutsetdraftaddress) gibt es kein `problems.*`, dort werden die `actionResponse`-Fehler über `show*BeforeSubmit` gefiltert.

### Auswahl-IDs und Draft-Adressen

Die `selected*`-Variablen enthalten die ID der jeweils gewählten Option (z. B. die Adress-ID, die Sie an [`$wsAccount.loadAddress()`](/frontend/referenz/module/wsAccount#wsaccount-loadaddress) übergeben).

Legt der Kunde im Bestellablauf eine neue Adresse an, die noch nicht im Kundenkonto gespeichert ist (Draft-Adresse), wird sie unter einer **festen System-ID** geführt: `draftBillAddressId` bzw. `draftShippingAddressId`. Diese IDs sind **immer** vorhanden - auch wenn kein Entwurf existiert. Ob tatsächlich ein Entwurf vorliegt (und welche Daten er enthält), lesen Sie über die Maps [`draftBillAddress` / `draftShippingAddress`](#wscheckout-draftbilladdress-draftshippingaddress), die nur dann ausgegeben werden.

***

## Modulübersicht

**Beispiel / Ausschnitt über** `$wsCheckout`

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

**JSON-Ausgabe** (gekürzt)

```json theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{
  "accountType": "...",
  "customerData": { },
  "draftBillAddressId": "...",
  "draftShippingAddressId": "...",
  "fieldStates": { },
  "freeFields": [...],
  "guestMail": "...",
  "ineffectiveVoucherErrors": [...],
  "isExpressCheckoutLocked": false,
  "isOrderBlockedByIneffectiveVoucher": false,
  "isPPCApplePayExpressCheckout": false,
  "isPPCExpressCheckout": false,
  "isPPCGooglePayExpressCheckout": false,
  "isValid": false,
  "paymentBlocked": false,
  "paymentCaptchaRequired": false,
  "paymentMethodAutoReset": false,
  "problems": {
    "billAddress": [...],
    "clearing": [...],
    "general": [...],
    "payment": [...],
    "shippingAddress": [...],
    "shippingMethod": [...]
  },
  "selectedBillAddress": "...",
  "selectedPayment": "...",
  "selectedPseudoCC": "...",
  "selectedShippingAddress": "...",
  "selectedShippingMethod": "...",
  "selectedStoreId": 0,
  "shippingMethodAutoReset": false,
  "sum": { },
  "useAlternativeShippingAddress": false,
  "verificationStatus": 0,
  "verificationStatusOptions": [...],
  "voucherAppliesPerItem": false,
  "getAmountInSmallestUnit": "ƒ()",
  "getShippingCost": "ƒ()",
  "getShippingMethodDisabledErrors": "ƒ()",
  "isFinished": "ƒ()",
  "isPending": "ƒ()",
  "isValidBillAddress": "ƒ()",
  "isValidPayment": "ƒ()",
  "isValidShippingAddress": "ƒ()",
  "isValidShippingMethod": "ƒ()",
  "itemVoucherDiscount": "ƒ()"
}
```

Anmerkung: `"ƒ()"` kennzeichnet eine Funktion. Konditionale Variablen wie `orderId`, `orderCreatedAt`, `restUntilFreeDelivery`, `freeShippingMethod`, `draftBillAddress` und `draftShippingAddress` erscheinen nur, wenn sie gesetzt sind.

**Variablen in der Übersicht**

| **Variable**                                             | **Rückgabe-Typ** | **Beschreibung**                                                                                                                                                                                                                                                                                                         |
| -------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `accountType`                                            | string           | Kontotyp: `"guest"`, `"new"` oder `"registered"`. Leer (`""`), solange noch kein Kontotyp gewählt wurde.                                                                                                                                                                                                                 |
| `customerData`                                           | map              | Kundendaten-Felder, gruppiert und nach Zielgruppe aufgeteilt (u. a. `groupedFields`, `newCustomerFieldGroups`, `existingCustomerFieldGroups`; Struktur siehe unten).                                                                                                                                                     |
| `freeFields`                                             | array            | Freie Checkout-Felder (Struktur siehe unten).                                                                                                                                                                                                                                                                            |
| `guestMail`                                              | string           | E-Mail eines Gastkontos.                                                                                                                                                                                                                                                                                                 |
| `selectedPayment`                                        | string           | ID der gewählten Zahlungsart.                                                                                                                                                                                                                                                                                            |
| `selectedShippingMethod`                                 | string           | ID der gewählten Versandart.                                                                                                                                                                                                                                                                                             |
| `selectedBillAddress`                                    | string           | ID der gewählten Rechnungsadresse.                                                                                                                                                                                                                                                                                       |
| `selectedShippingAddress`                                | string           | ID der gewählten Lieferadresse.                                                                                                                                                                                                                                                                                          |
| `draftBillAddressId`                                     | string           | Feste System-ID, unter der eine Draft-Rechnungsadresse geführt wird. Immer vorhanden.                                                                                                                                                                                                                                    |
| `draftShippingAddressId`                                 | string           | Feste System-ID, unter der eine Draft-Lieferadresse geführt wird. Immer vorhanden.                                                                                                                                                                                                                                       |
| `draftBillAddress`                                       | map              | Daten der Draft-Rechnungsadresse. Nur vorhanden, wenn ein Entwurf existiert.                                                                                                                                                                                                                                             |
| `draftShippingAddress`                                   | map              | Daten der Draft-Lieferadresse. Nur vorhanden, wenn ein Entwurf existiert.                                                                                                                                                                                                                                                |
| `selectedPseudoCC`                                       | string           | Pseudo-Kreditkarten-Token.                                                                                                                                                                                                                                                                                               |
| `selectedStoreId`                                        | int              | ID der gewählten Filiale (z. B. Click & Collect).                                                                                                                                                                                                                                                                        |
| `useAlternativeShippingAddress`                          | bool             | Ob eine abweichende Lieferadresse aktiv ist.                                                                                                                                                                                                                                                                             |
| `orderId`                                                | string           | ID der Bestellung. Nur vorhanden, sobald in der Session eine Bestellung existiert.                                                                                                                                                                                                                                       |
| `orderCreatedAt`                                         | string           | Erstellzeitpunkt der Bestellung (ISO 8601). Nur vorhanden, sobald eine Bestellung existiert.                                                                                                                                                                                                                             |
| `shippingMethodAutoReset`<br />(**zukünftiges Feature**) | bool             | Gibt aus, ob die Versandart automatisch neu gesetzt wurde, weil die zuvor gewählte Versandart durch eine Änderung des Bestellkontexts (z.B. Wechsel des Lieferlandes) ungültig geworden ist. <br />Ob automatisch neu gewählt wird, steuert [`prevSelectionInvalidAutoSelect`](/konfiguration/checkout-bestellablauf).   |
| `paymentMethodAutoReset`<br />(**zukünftiges Feature**)  | bool             | Gibt aus, ob die Zahlungsart automatisch neu gesetzt wurde, weil die zuvor gewählte Zahlungsart durch eine Änderung des Bestellkontexts (z.B. Wechsel des Lieferlandes) ungültig geworden ist. <br />Ob automatisch neu gewählt wird, steuert [`prevSelectionInvalidAutoSelect`](/konfiguration/checkout-bestellablauf). |
| `isValid`                                                | bool             | Prüft, ob die Bestellung insgesamt ausführbar ist.                                                                                                                                                                                                                                                                       |
| `isExpressCheckoutLocked`                                | bool             | Prüft, ob der Express-Checkout gesperrt ist (z. B. nach PayPal-Zahlung).                                                                                                                                                                                                                                                 |
| `isPPCExpressCheckout`                                   | bool             | Prüft, ob der PayPal-Commerce-Platform-Express-Checkout aktiv ist.                                                                                                                                                                                                                                                       |
| `isPPCApplePayExpressCheckout`                           | bool             | Prüft, ob Apple Pay Express Checkout aktiv ist.                                                                                                                                                                                                                                                                          |
| `isPPCGooglePayExpressCheckout`                          | bool             | Prüft, ob Google Pay Express Checkout aktiv ist.                                                                                                                                                                                                                                                                         |
| `problems`                                               | map              | Konkrete Fehler je Bereich (Struktur siehe unten).                                                                                                                                                                                                                                                                       |
| `fieldStates`                                            | map              | Zustand je Checkout-Feld (Werte siehe unten).                                                                                                                                                                                                                                                                            |
| `sum`                                                    | map              | Preisinformationen zum Checkout (Struktur siehe unten).                                                                                                                                                                                                                                                                  |
| `verificationStatus`                                     | int              | Verifizierungsstatus der Bestellung.                                                                                                                                                                                                                                                                                     |
| `verificationStatusOptions`                              | array            | Verfügbare Verifizierungsstatus-Optionen.                                                                                                                                                                                                                                                                                |
| `voucherAppliesPerItem`                                  | bool             | Prüft, ob Gutscheine pro Artikel angewendet werden.                                                                                                                                                                                                                                                                      |
| `restUntilFreeDelivery`                                  | float            | Verbleibender Betrag bis zur Grenze für kostenlosen Versand (`0`, wenn erreicht). Nur vorhanden, wenn für den Warenkorb eine Gratisversand-Grenze ermittelbar ist.                                                                                                                                                       |
| `freeShippingMethod`                                     | string           | ID der Standard-Gratisversandart. Nur vorhanden, wenn `restUntilFreeDelivery` ausgegeben wird, noch keine Versandart gewählt ist und eine Standard-Gratisversandart konfiguriert wurde.                                                                                                                                  |
| `isOrderBlockedByIneffectiveVoucher`                     | bool             | Prüft, ob die Bestellung durch einen wirkungslosen Gutschein blockiert ist.                                                                                                                                                                                                                                              |
| `ineffectiveVoucherErrors`                               | array            | Fehler zu eingelösten Gutscheinen, die im aktuellen Warenkorb keine Wirkung entfalten. Leer, wenn alle Gutscheine greifen.                                                                                                                                                                                               |
| `paymentBlocked`                                         | bool             | Prüft, ob die Zahlung blockiert ist (Schutz vor wiederholten Zahlungsversuchen, IP- oder Session-basiert).                                                                                                                                                                                                               |
| `paymentCaptchaRequired`                                 | bool             | Prüft, ob für die Zahlung ein Captcha erforderlich ist (Schutz vor wiederholten Zahlungsversuchen).                                                                                                                                                                                                                      |

**Methoden in der Übersicht**

| **Methode**                         | **Rückgabe-Typ** | **Beschreibung**                                                     |
| ----------------------------------- | ---------------- | -------------------------------------------------------------------- |
| `isValidPayment()`                  | bool             | Prüft, ob eine Zahlungsart verfügbar ist.                            |
| `isValidShippingMethod()`           | bool             | Prüft, ob eine Versandart verfügbar ist.                             |
| `isValidBillAddress()`              | bool             | Prüft, ob eine Adresse als Rechnungsadresse gültig ist.              |
| `isValidShippingAddress()`          | bool             | Prüft, ob eine Adresse als Lieferadresse gültig ist.                 |
| `isPending()`                       | bool             | Prüft, ob ein Zahlungsvorgang aussteht.                              |
| `isFinished()`                      | bool             | Prüft, ob eine Bestellung abgeschlossen wurde.                       |
| `getAmountInSmallestUnit()`         | int              | Wandelt einen Betrag in die kleinste Währungseinheit (z. B. Cent).   |
| `getShippingMethodDisabledErrors()` | array            | Gibt zurück, warum eine Versandart deaktiviert ist.                  |
| `getShippingCost()`                 | float            | Versandkosten einer Versandart, bezogen auf den aktuellen Warenkorb. |
| `itemVoucherDiscount()`             | float            | Berechnet den Gutscheinrabatt für einen Artikel.                     |

***

## Templates

Der Checkout ist frei gestaltbar und kann eine oder mehrere Shopseiten umfassen. Die Reihenfolge der Elemente ist beliebig.

***

## Variablen

### \$wsCheckout.accountType

Gibt den Kontotyp aus: `"guest"` (Gast), `"new"` (neues Konto) oder `"registered"` (angemeldet). Solange der Kunde noch keinen Kontotyp gewählt hat, ist der Wert leer (`""`). Werten Sie ihn aus, um beispielsweise einem Gast die Konto-Erstellung anzubieten.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.accountType == "guest" }}
  <!-- Gastbestellung -->
{{ /if }}
```

### \$wsCheckout.guestMail

Gibt die E-Mail-Adresse eines Gastkontos aus. Nur bei einer Gastbestellung gefüllt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
E-Mail: {{= $wsCheckout.guestMail }}
```

### \$wsCheckout.selectedPayment / selectedShippingMethod

Geben die ID der gewählten Zahlungs- bzw. Versandart aus. Werten Sie sie aus, um die getroffene Auswahl anzuzeigen oder zu prüfen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.selectedPayment == "stripe" }}
  <!-- Stripe ist ausgewählt -->
{{ /if }}
```

### \$wsCheckout.selectedBillAddress / selectedShippingAddress

Geben die ID der gewählten Rechnungs- bzw. Lieferadresse aus. Diese ID übergeben Sie z. B. an [`$wsAccount.loadAddress()`](/frontend/referenz/module/wsAccount#wsaccount-loadaddress), um die vollständige Adresse zu laden.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $billAddress = $wsAccount.loadAddress($wsCheckout.selectedBillAddress) }}
{{= $billAddress.firstName }} {{= $billAddress.lastName }}
```

### \$wsCheckout.draftBillAddressId / draftShippingAddressId

Geben die **feste System-ID** aus, unter der eine im Bestellablauf neu angelegte, noch nicht im Kundenkonto gespeicherte Adresse (Draft-Adresse) geführt wird - z. B. um sie in der Adressauswahl als gewählte Adresse zu erkennen.

Beide IDs sind **immer** vorhanden, unabhängig davon, ob ein Entwurf existiert. Ob tatsächlich ein Entwurf vorliegt, prüfen Sie über die Maps [`draftBillAddress` / `draftShippingAddress`](#wscheckout-draftbilladdress-draftshippingaddress).

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.selectedBillAddress == $wsCheckout.draftBillAddressId }}
  <!-- Die neu angelegte (noch ungespeicherte) Rechnungsadresse ist gewählt -->
{{ /if }}
```

### \$wsCheckout.draftBillAddress / draftShippingAddress

Geben die Daten der Draft-Rechnungs- bzw. Draft-Lieferadresse als Map aus. **Nur vorhanden, wenn ein Entwurf existiert** - damit eignen sie sich auch als Existenz-Prüfung.

Die Keys entsprechen den Adressfeldnamen (Standardfelder wie `firstName`, `lastName`, `street`, `zip`, `city`, `country` sowie [zusätzliche Adressfelder](/konfiguration/accounts-benutzerkonten#accounts-customaddressfield-weitere-adressdatenfelder)). Ausgegeben werden nur Felder mit nicht-leerem Wert.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.draftBillAddress }}
  Neue Rechnungsadresse:
  {{= $wsCheckout.draftBillAddress.firstName }} {{= $wsCheckout.draftBillAddress.lastName }},
  {{= $wsCheckout.draftBillAddress.street }}, {{= $wsCheckout.draftBillAddress.zip }} {{= $wsCheckout.draftBillAddress.city }}
{{ /if }}
```

Eine Draft-Adresse wird über die Aktion [CheckoutSetDraftAddress](/frontend/referenz/aktionen/checkout#checkoutsetdraftaddress) angelegt.

### \$wsCheckout.useAlternativeShippingAddress

Gibt aus, ob eine von der Rechnungsadresse abweichende Lieferadresse verwendet wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.useAlternativeShippingAddress }}
  <!-- Abweichende Lieferadresse -->
{{ /if }}
```

### \$wsCheckout.selectedStoreId

Gibt die ID der gewählten Filiale aus (z. B. für Click & Collect). `0`, wenn keine Filiale gewählt ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.selectedStoreId > 0 }}
  <!-- Filiale ausgewählt -->
{{ /if }}
```

### \$wsCheckout.selectedPseudoCC

Gibt den Pseudo-Kreditkarten-Token der gewählten Zahlung aus.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
Token: {{= $wsCheckout.selectedPseudoCC }}
```

### \$wsCheckout.orderId / orderCreatedAt

Geben die ID und den Erstellzeitpunkt (ISO 8601) der Bestellung aus. Beide Variablen sind **nur vorhanden, sobald in der aktuellen Session eine Bestellung existiert** - z. B. auf der Bestellbestätigungsseite.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.orderId }}
  Ihre Bestellnummer: {{= $wsCheckout.orderId }} (erstellt: {{= $wsCheckout.orderCreatedAt }})
{{ /if }}
```

### \$wsCheckout.customerData

Gibt die konfigurierten Kundendaten-Felder aus - gruppiert und nach Zielgruppe aufgeteilt. Welche Felder enthalten sind, hängt vom Login-Status ab: Bei eingeloggten Kunden die Kontofelder, sonst die in der Bestellung gespeicherten Felder.

#### Struktur von `$wsCheckout.customerData`

| **Key**                       | **Typ** | **Beschreibung**                                                                                                                                                                                                       |
| ----------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `groupedFields`               | array   | Feldgruppen mit ihren Feldern (Struktur siehe Gruppen-Objekt). Immer vorhanden.                                                                                                                                        |
| `newCustomerFieldGroups`      | array   | Feldgruppen mit den Feldern für die [Neukundenregistrierung](/konfiguration/customer-kundendaten#customer-customerdatafieldsettings-feldkonfiguration). Immer vorhanden.                                               |
| `existingCustomerFieldGroups` | array   | Feldgruppen mit den Feldern für die Bestandskundenregistrierung. Immer vorhanden.                                                                                                                                      |
| `ungroupedFields`             | array   | Felder ohne Gruppenzuordnung. Nur vorhanden, wenn `showUngroupedFields` in [`customer.customerDataFieldSettings`](/konfiguration/customer-kundendaten#customer-customerdatafieldsettings-feldkonfiguration) aktiv ist. |
| `newCustomerFields`           | array   | Felder der Neukundenregistrierung als flache Liste. Nur vorhanden, wenn `showUngroupedFields` aktiv ist.                                                                                                               |
| `existingCustomerFields`      | array   | Felder der Bestandskundenregistrierung als flache Liste. Nur vorhanden, wenn `showUngroupedFields` aktiv ist.                                                                                                          |

#### Gruppen-Objekt

Die Gruppen entsprechen der Konfiguration unter [`customer.customerDataGroup`](/konfiguration/customer-kundendaten#customer-customerdatagroup-gruppierung).

| **Eigenschaft** | **Typ** | **Beschreibung**                                                                                 |
| --------------- | ------- | ------------------------------------------------------------------------------------------------ |
| `name`          | string  | Technischer Name der Gruppe.                                                                     |
| `label`         | string  | Anzeigename der Gruppe.                                                                          |
| `hidden`        | bool    | Ob die Gruppe ausgeblendet werden soll (u. a. `true`, wenn sie keine sichtbaren Felder enthält). |
| `fields`        | array   | Die Felder der Gruppe (Struktur siehe Feld-Objekt).                                              |

#### Feld-Objekt

| **Eigenschaft** | **Typ**     | **Beschreibung**                                                              |
| --------------- | ----------- | ----------------------------------------------------------------------------- |
| `name`          | string      | Technischer Name des Feldes.                                                  |
| `label`         | string      | Anzeigename des Feldes.                                                       |
| `type`          | string      | Feldtyp (z. B. `text`, `number`, `date`, `checkbox`, `select`).               |
| `association`   | string      | Speicherort gemäß `storageStrategy` (Konto, Bestellung oder beides).          |
| `hidden`        | bool        | Ob das Feld ausgeblendet werden soll.                                         |
| `readonly`      | bool        | Ob das Feld schreibgeschützt ist.                                             |
| `touched`       | bool        | Ob das Feld vom Kunden bereits bearbeitet wurde.                              |
| `required`      | bool        | Ob das Feld ein Pflichtfeld ist.                                              |
| `value`         | string/bool | Aktueller Wert (bool bei `checkbox`, sonst string).                           |
| `externalId`    | string      | Externe Kennung des Feldes. Nur vorhanden, wenn konfiguriert.                 |
| `unit`          | map         | Einheiten-Informationen. Nur bei `number`-Feldern mit konfigurierter Einheit. |
| `options`       | array       | Auswahloptionen (`{value, label}`). Nur bei `select`-Feldern.                 |

**Beispiel,** das alle sichtbaren Feldgruppen mit ihren Feldern ausgibt:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $group in $wsCheckout.customerData.groupedFields }}
  {{ if not $group.hidden }}
    <fieldset>
      <legend>{{= $group.label }}</legend>
      {{ foreach $field in $group.fields }}
        {{ if not $field.hidden }}
          <label>{{= $field.label }}{{ if $field.required }} *{{ /if }}</label>
        {{ /if }}
      {{ /foreach }}
    </fieldset>
  {{ /if }}
{{ /foreach }}
```

### \$wsCheckout.freeFields

Gibt die freien Checkout-Felder aus (z. B. AGB-Checkbox, Kommentarfeld). Iterieren Sie über die Felder und werten Sie sie über ihre `id` aus.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $field in $wsCheckout.freeFields }}
  {{= $field.name }} ({{= $field.type }}, Pflicht: {{= $field.required }})
{{ /foreach }}
```

#### Eigenschaften eines freien Feldes

| **Eigenschaft** | **Rückgabe-Typ** | **Beschreibung**                                                                                     |
| --------------- | ---------------- | ---------------------------------------------------------------------------------------------------- |
| `id`            | string           | ID des Feldes (z. B. `"agb"`, `"comment"`).                                                          |
| `name`          | string           | Anzeigename des Feldes (z. B. `"AGB"`).                                                              |
| `type`          | string           | Feldtyp (`"checkbox"`, `"text"`).                                                                    |
| `required`      | bool             | Ob das Feld ein Pflichtfeld ist.                                                                     |
| `default`       | bool/string      | Standardwert (bool bei Checkbox, string bei Textfeld).                                               |
| `checked`       | bool             | Ob die Checkbox angehakt ist (nur bei `type == "checkbox"`).                                         |
| `text`          | string           | Aktuell eingegebener Text (nur bei `type == "text"` und nur vorhanden, wenn ein Wert gesetzt wurde). |

### \$wsCheckout.isValid

Gibt aus, ob die Bestellung insgesamt ausführbar ist. Dies ist der Gesamtstatus über alle Felder – nutzen Sie ihn, um den „Kaufen"-Button frei- oder zu sperren.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isValid }}
  <!-- Bestellung kann ausgeführt werden -->
{{ /if }}
```

### \$wsCheckout.isExpressCheckoutLocked

Gibt aus, ob der Express-Checkout gesperrt ist – z. B. nachdem der Kunde über PayPal bezahlt hat und zur Bestätigung in den Shop zurückgeleitet wird. Werten Sie es aus, um in diesem Zustand das Bearbeiten des Warenkorbs zu unterbinden.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isExpressCheckoutLocked }}
  Die Bearbeitung Ihres Warenkorbs ist derzeit nicht möglich.
{{ /if }}
```

### \$wsCheckout.isPPCExpressCheckout / isPPCApplePayExpressCheckout / isPPCGooglePayExpressCheckout

Geben aus, ob der jeweilige Express-Checkout der PayPal Commerce Platform aktiv ist. Nutzen Sie sie, um den passenden Express-Checkout-Ablauf darzustellen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isPPCExpressCheckout }}
  <!-- PayPal Express Checkout aktiv -->
{{ /if }}
```

### \$wsCheckout.paymentCaptchaRequired / paymentBlocked

Schutz vor wiederholten Zahlungsversuchen (IP- oder Session-basiert): `paymentCaptchaRequired` gibt aus, ob vor dem nächsten Zahlungsversuch ein Captcha gelöst werden muss. `paymentBlocked` gibt aus, ob weitere Zahlungsversuche aktuell blockiert sind.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.paymentBlocked }}
  Zu viele fehlgeschlagene Zahlungsversuche. Bitte versuchen Sie es später erneut.
{{ elseif $wsCheckout.paymentCaptchaRequired }}
  <!-- Captcha anzeigen -->
{{ /if }}
```

### \$wsCheckout.isOrderBlockedByIneffectiveVoucher

Gibt aus, ob die Bestellung blockiert ist, weil ein eingelöster Gutschein im aktuellen Warenkorb keine Wirkung entfalten kann. Nutzen Sie es, um den Bestellbutton zu sperren.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isOrderBlockedByIneffectiveVoucher }}
  Ein eingelöster Gutschein kann auf diesen Warenkorb nicht angewendet werden.
{{ /if }}
```

Das Flag meldet nur den Zustand. Um dem Kunden den konkreten Grund und den betroffenen Gutschein zu nennen, werten Sie zusätzlich [`ineffectiveVoucherErrors`](#wscheckout-ineffectivevouchererrors) aus. Ob die Bestellung überhaupt blockiert wird, steuert `disableOrderOnIneffectiveVoucher` in der [Checkout-Konfiguration](/konfiguration/checkout-bestellablauf#wirkungslose-gutscheine-blockieren).

### \$wsCheckout.ineffectiveVoucherErrors

Gibt eine Liste der Fehler zu eingelösten Gutscheinen aus, die im aktuellen Warenkorb keine Wirkung entfalten. Jeder Eintrag nennt den Grund und, soweit zuordenbar, den betroffenen Gutschein. Damit ersetzen Sie einen allgemeinen Hinweis durch eine konkrete Aussage. Greifen alle Gutscheine, ist die Liste leer.

Anders als bei [`problems`](#wscheckout-problems) enthalten diese Fehler bereits einen fertigen Text. Der Shop übersetzt dazu den Textbaustein, der im Konfigurationsknoten [`checkout.voucherErrors`](/konfiguration/checkout-bestellablauf#checkout-vouchererrors-fehlertexte-zu-wirkungslosen-gutscheinen) zum jeweiligen Fehlerfall hinterlegt ist.

#### Eigenschaften eines Fehlers

| **Eigenschaft** | **Rückgabe-Typ** | **Beschreibung**                                                                                                                                         |
| --------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `code`          | string           | Art des Fehlers (Werte siehe Tabelle unten).                                                                                                             |
| `subCode`       | string           | Feinere Unterteilung des Fehlers. Aktuell immer leer (`""`).                                                                                             |
| `field`         | string           | Betroffenes Eingabefeld. Aktuell immer leer (`""`), weil in diesem Zusammenhang kein Eingabefeld beteiligt ist.                                          |
| `text`          | string           | Übersetzter Fehlertext aus `checkout.voucherErrors`.                                                                                                     |
| `details`       | map              | Zusatzangaben zum Fehler. Enthält den Key `voucherId` mit der ID des betroffenen Gutscheins, sofern der Fehler einem einzelnen Gutschein zuzuordnen ist. |

<Info>
  `subCode` und `field` sind vorhanden, damit alle Fehlerobjekte im Frontend denselben Aufbau haben. Sie werden hier derzeit nicht gefüllt, können aber später Werte erhalten. Werten Sie sie deshalb nur aus, wenn sie tatsächlich gefüllt sind.
</Info>

#### Bedeutung der Fehler-Codes

| **Code**                    | **Bedeutung**                                                                                                                                                                 |
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `"noValidProducts"`         | Der Gutschein ist auf keine Position im Warenkorb anwendbar, beispielsweise weil er nur für bestimmte Produkte oder Kategorien gilt oder weil keine Position rabattfähig ist. |
| `"minOrderValueNotReached"` | Der Mindestbestellwert für den Gutschein ist unterschritten.                                                                                                                  |

Die Liste kann künftig weitere Codes enthalten. Sehen Sie im Template deshalb einen Fallback für unbekannte Codes vor, beispielsweise die Ausgabe von `text`.

<Warning>
  `details.voucherId` ist **nicht** in jedem Fehler enthalten. Steht `minOrderValueCalculation` auf `sum` und wird erst die Summe aller Mindestbestellwerte nicht erreicht, gehört der Fehler zu keinem einzelnen Gutschein und kommt ohne ID. Prüfen Sie den Key deshalb immer, bevor Sie ihn ausgeben. Welcher Fehler wann entsteht, steht unter [Wann welcher Fehler entsteht](/konfiguration/checkout-bestellablauf#wann-welcher-fehler-entsteht).
</Warning>

**Beispiel,** das je Gutschein den konkreten Grund ausgibt:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isOrderBlockedByIneffectiveVoucher }}
  <div role="alert">
    <strong>Gutscheine können nicht eingelöst werden:</strong>
    <ul>
      {{ foreach $cError in $wsCheckout.ineffectiveVoucherErrors }}
        <li>
          {{ if $cError.details.voucherId }}
            Gutschein <strong>{{= $cError.details.voucherId }}</strong>:
          {{ /if }}
          {{= $cError.text | ifNull($cError.code) }}
        </li>
      {{ /foreach }}
    </ul>
  </div>
{{ /if }}
```

**Ergebnis** <br />Pro wirkungslosem Gutschein erscheint eine Zeile mit Gutschein-ID und Grund. Der Fehler aus der Summenprüfung erscheint als Zeile ohne ID.

### \$wsCheckout.verificationStatus / verificationStatusOptions

`verificationStatus` gibt den Verifizierungsstatus der Bestellung als Zahl aus. `verificationStatusOptions` listet den möglichen Status auf.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $option in $wsCheckout.verificationStatusOptions }}
  {{= $option.id }}: {{= $option.name }}
{{ /foreach }}
```

### \$wsCheckout.voucherAppliesPerItem

Gibt aus, ob ein Gutschein pro Artikel (statt auf den Gesamtbetrag) angewendet wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.voucherAppliesPerItem }}
  <!-- Gutschein wird pro Artikel berechnet -->
{{ /if }}
```

### \$wsCheckout.restUntilFreeDelivery / freeShippingMethod

`restUntilFreeDelivery` gibt den verbleibenden Betrag bis zur Grenze für kostenlosen Versand aus (`0`, wenn die Grenze erreicht ist). Die Variable ist **nur vorhanden, wenn für den Warenkorb eine Gratisversand-Grenze ermittelbar ist**. Nutzen Sie sie für einen Hinweis „Noch X bis zum kostenlosen Versand".

`freeShippingMethod` enthält zusätzlich die ID der konfigurierten Standard-Gratisversandart - aber nur, solange der Kunde noch keine Versandart gewählt hat und eine Standard-Gratisversandart konfiguriert ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.restUntilFreeDelivery > 0 }}
  Nur noch {{= $wsCheckout.restUntilFreeDelivery | currency }} bis zum kostenlosen Versand!
{{ /if }}
```

### \$wsCheckout.fieldStates

Gibt eine Map mit dem Zustand jedes Checkout-Feldes aus (`payment`, `shippingMethod`, `billAddress`, `shippingAddress`). Damit markieren Sie einzelne Felder gezielt – z. B. ein noch nicht ausgefülltes Feld neutral, ein fehlerhaftes rot.

| **Wert**         | **Beschreibung**                                                  |
| ---------------- | ----------------------------------------------------------------- |
| `"untouched"`    | Das Feld wurde noch nicht bearbeitet oder ausgewählt.             |
| `"empty"`        | Das Feld wurde befüllt, der Wert wurde aber wieder entfernt.      |
| `"invalid"`      | Ein Wert ist vorhanden, hat die Validierung aber nicht bestanden. |
| `"incompatible"` | Der Wert ist gültig, im aktuellen Kontext aber nicht zulässig.    |
| `"valid"`        | Das Feld ist korrekt ausgefüllt und hat alle Prüfungen bestanden. |

<Info>
  Die Zustände bauen aufeinander auf. Geprüft wird der Reihe nach: angewählt (`untouched`) → Wert vorhanden (`empty`) → gültig (`invalid`) → im Kontext zulässig (`incompatible`). Erst wenn alle Prüfungen bestanden sind, gilt das Feld als `valid`. Der erste zutreffende Zustand wird ausgegeben.
</Info>

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.fieldStates.payment == "valid" }}
  <!-- Zahlungsart korrekt ausgewählt -->
{{ /if }}
```

### \$wsCheckout.problems

Gibt eine Map mit konkreten Fehlern je Bereich aus. Die Map enthält genau sechs Bereiche: `payment`, `shippingMethod`, `billAddress`, `shippingAddress`, `clearing` und `general`. Jeder Bereich ist eine Liste von Fehlern; sie ist gefüllt, wenn dort ein Problem vorliegt.

#### Eigenschaften eines Fehlers

Jeder Fehler ist ein Objekt mit genau zwei Eigenschaften:

| **Eigenschaft** | **Rückgabe-Typ** | **Beschreibung**                                                                                                                                                                                               |
| --------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `code`          | string           | Fehler-Code (siehe Tabelle unten).                                                                                                                                                                             |
| `check`         | string           | Name des fehlgeschlagenen Validierungsservices (z. B. `"voucherDeny"`). Bei `code == "missing"` ist `check` `null`. Im Bereich `clearing` enthält `check` stattdessen die Fehlermeldung des Zahlungsproviders. |

<Warning>
  Einen sprechenden Fehlertext (`text`) oder das betroffene Feld (`field`) enthalten die Fehler-Objekte **nicht**. Formulieren Sie die Kundenmeldung im Template anhand von `code` und ggf. `check` (siehe Beispiel unten).
</Warning>

#### Bedeutung der Fehler-Codes

| **Code**              | **Bedeutung**                                                                                                                        | **Beispiel**                                                                        |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------- |
| `"missing"`           | Kein Wert ausgewählt oder eingetragen.                                                                                               | Keine Zahlungsart gewählt.                                                          |
| `"checkFailed"`       | Ein Wert ist vorhanden, hat die Validierung aber nicht bestanden.                                                                    | Ungültige Adresse; in `general`: unzulässiger Kontotyp (`check` = `"accountType"`). |
| `"checkIncompatible"` | Der Wert ist gültig, im aktuellen Kontext aber nicht zulässig.                                                                       | Zahlungsart für das Lieferland gesperrt.                                            |
| `"clearingFailed"`    | Die Zahlungsabwicklung beim Provider ist fehlgeschlagen. Nur im Bereich `clearing`; `check` enthält die Fehlermeldung des Providers. | Zahlung von Computop abgelehnt.                                                     |

**Beispiel,** das die Fehler der Zahlungsart kundenfreundlich ausgibt:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $prob in $wsCheckout.problems.payment }}
  {{ if $prob.code == "missing" }}
    Bitte wählen Sie eine Zahlungsart aus.
  {{ elseif $prob.code == "checkFailed" }}
    Die gewählte Zahlungsart ist ungültig ({{= $prob.check }}).
  {{ elseif $prob.code == "checkIncompatible" }}
    Die gewählte Zahlungsart ist für Ihre Auswahl nicht verfügbar ({{= $prob.check }}).
  {{ /if }}
{{ /foreach }}
```

<Info>
  Um auf einen einzelnen Fehler zuzugreifen, verwenden Sie den Index, z. B. `$wsCheckout.problems.payment[0].code`. Fehler zu freien Checkout-Feldern liefert `$wsCheckout.problems` nicht - diese werten Sie über die `actionResponse`-Fehler der jeweiligen Aktion aus (z. B. [CheckoutSetFreeFields](/frontend/referenz/aktionen/checkout)).
</Info>

### \$wsCheckout.sum

Gibt eine Map mit den Preisinformationen zum Checkout aus. Für die Anzeige als Geldbetrag verwenden Sie den `currency`-Filter – er enthält bereits das Währungssymbol.

#### Eigenschaften von `$wsCheckout.sum`

| **Eigenschaft**     | **Rückgabe-Typ** | **Beschreibung**                                               |
| ------------------- | ---------------- | -------------------------------------------------------------- |
| `total`             | float            | Gesamtbetrag der Bestellung (inkl. Versand, Rabatte, Steuern). |
| `totalNet`          | float            | Nettobetrag.                                                   |
| `totalGross`        | float            | Bruttobetrag.                                                  |
| `totalTax`          | float            | Gesamte Mehrwertsteuer.                                        |
| `totalPreDeduction` | float            | Gesamtbetrag vor dem Steuerabzug.                              |
| `totalVoucher`      | float            | Wert der eingelösten Gutscheine.                               |
| `totalWeight`       | float            | Gesamtgewicht der Bestellung.                                  |
| `shippingCost`      | float            | Versandkosten.                                                 |
| `paymentCost`       | float            | Kosten der Zahlungsart.                                        |
| `surchargeCost`     | float            | Zusatzkosten / Aufschläge.                                     |
| `currency`          | string           | Währungscode (z. B. `"EUR"`).                                  |
| `totalTaxDeduction` | float            | Betrag der abgezogenen Steuer (bei Steuerbefreiung).           |
| `isTaxExempt`       | bool             | Ob die Bestellung steuerbefreit ist.                           |
| `usedExemptionRule` | string           | Aktive Steuerprüfregel (z. B. `"shippingOnly"`).               |
| `billingCountry`    | string           | Länderkennung der Rechnungsadresse.                            |
| `shippingCountry`   | string           | Länderkennung der Lieferadresse.                               |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
Gesamtbetrag: {{= $wsCheckout.sum.total | currency }}
Versandkosten: {{= $wsCheckout.sum.shippingCost | currency }}
```

***

## Methoden

### \$wsCheckout.isValidPayment()

Prüft, ob die Zahlungsart mit der angegebenen ID verfügbar ist. Dabei werden alle Validierungsregeln ausgeführt, die in der Konfiguration der Zahlungsart unter `validations` hinterlegt sind (siehe [`paymentValidation.*` - Zahlungsarten-Validierung](/konfiguration/validierungs-und-prufservices#paymentvalidation-%2A-zahlungsarten-validierung)) - z.B. Länderregeln, Bestellwertgrenzen oder der Ausschluss bei Gutscheinprodukten im Warenkorb (`paymentValidation.voucherDeny`). Zusätzlich wird geprüft, ob die Zahlungsart aktiv und für das Kundenkonto zugelassen ist.

Schlägt mindestens eine Regel fehl, gibt die Methode `false` zurück. Auf diese Weise wirken die konfigurierten Validierungsregeln im Frontend: Das Template blendet die Zahlungsart aus oder deaktiviert sie.

**Signatur**<br />`$wsCheckout.isValidPayment(paymentId)`

**Rückgabe**<br />`true / false` - Zahlungsart verfügbar / nicht verfügbar.

**Parameter**

| **Name**    | **Typ** | **Pflicht** | **Beschreibung**                             |
| ----------- | ------- | ----------- | -------------------------------------------- |
| `paymentId` | string  | ja          | ID der Zahlungsart, die geprüft werden soll. |

**Beispiel,** das prüft, ob die Zahlungsart verfügbar ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isValidPayment("stripe") }}
  // Stripe ist verfügbar
{{ /if }}
```

**Beispiel,** das alle Zahlungsarten als Auswahl anbietet und nicht verfügbare Zahlungsarten deaktiviert.  Zahlungsarten, deren Validierung fehlschlägt (z.B. wegen `paymentValidation.voucherDeny` bei einem Gutscheinprodukt im Warenkorb), sind sichtbar, aber nicht wählbar.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $cPayment in $wsConfig.payments }}
  <input type="radio" name="paymentId" value="{{= $cPayment.id }}"
    {{ if $wsCheckout.selectedPayment == $cPayment.id }} checked{{ /if }}
    {{ if not $wsCheckout.isValidPayment($cPayment.id) }} disabled{{ /if }}>
  <label>{{= $cPayment.name }}</label>
{{ /foreach }}
```

Warum die aktuell ausgewählte Zahlungsart ungültig ist, lässt sich über [`$wsCheckout.problems.payment`](#wscheckout-problems) auswerten; das Feld `check` enthält dort den Namen des fehlgeschlagenen Validierungsservices.

### \$wsCheckout.isValidShippingMethod()

Prüft, ob die Versandart mit der angegebenen ID verfügbar ist. Dabei werden alle Validierungsregeln ausgeführt, die in der Konfiguration der Versandart unter `validations` hinterlegt sind (siehe [`shippingMethodValidation.*` - Versandarten-Validierung](/konfiguration/validierungs-und-prufservices#shippingmethodvalidation-%2A-versandarten-validierung)) - z.B. Länderregeln, Warenwertgrenzen oder Produkttyp-Beschränkungen.

Schlägt mindestens eine Regel fehl, gibt die Methode `false` zurück. Das Template blendet die Versandart dann aus oder deaktiviert sie (gleiches Muster wie bei [`isValidPayment()`](#wscheckout-isvalidpayment)). Die Gründe für eine deaktivierte Versandart lassen sich über [`getShippingMethodDisabledErrors()`](#wscheckout-getshippingmethoddisablederrors) ausgeben.

**Signatur**<br />`$wsCheckout.isValidShippingMethod(shippingMethodId)`

**Rückgabe**<br />`true / false` - Versandart verfügbar / nicht verfügbar.

**Parameter**

| **Name**           | **Typ** | **Pflicht** | **Beschreibung**                            |
| ------------------ | ------- | ----------- | ------------------------------------------- |
| `shippingMethodId` | string  | ja          | ID der Versandart, die geprüft werden soll. |

**Beispiel,** das prüft, ob die angegebene Versandart verfügbar ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isValidShippingMethod("dhl_standard") }}
  // DHL Standard ist verfügbar
{{ /if }}
```

### \$wsCheckout.isValidBillAddress() / isValidShippingAddress()

Prüfen, ob die Adresse mit der angegebenen ID als Rechnungs- bzw. Lieferadresse gültig ist.

**Signatur**<br />`$wsCheckout.isValidBillAddress(addressId)` · `$wsCheckout.isValidShippingAddress(addressId)`

**Rückgabe**<br />`bool` – gültig / nicht gültig.

| **Name**    | **Typ** | **Pflicht** | **Beschreibung**             |
| ----------- | ------- | ----------- | ---------------------------- |
| `addressId` | string  | ja          | ID der zu prüfenden Adresse. |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isValidBillAddress($wsCheckout.selectedBillAddress) }}
  <!-- Rechnungsadresse ist gültig -->
{{ /if }}
```

### \$wsCheckout.isPending() / isFinished()

`isPending()` prüft, ob ein Zahlungsvorgang noch aussteht, `isFinished()`, ob die Bestellung abgeschlossen wurde. Nutzen Sie sie, um den Status einer laufenden oder abgeschlossenen Bestellung zu erkennen.

**Signatur**<br />`$wsCheckout.isPending()` · `$wsCheckout.isFinished()`

**Rückgabe**<br />`bool`.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isPending() }}
  <!-- Zahlungsvorgang läuft noch -->
{{ /if }}
```

### \$wsCheckout.getAmountInSmallestUnit()

Gibt einen Betrag in der kleinsten Währungseinheit zurück (z. B. Cent statt Euro). Nützlich für Zahlungs-APIs, die Beträge in Cent erwarten.

**Signatur**<br />`$wsCheckout.getAmountInSmallestUnit(amount)`

**Rückgabe**<br />`int` – Betrag in kleinster Einheit.

| **Name** | **Typ** | **Pflicht** | **Beschreibung**            |
| -------- | ------- | ----------- | --------------------------- |
| `amount` | float   | ja          | Betrag in der Hauptwährung. |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cents = $wsCheckout.getAmountInSmallestUnit($wsCheckout.sum.total) }}
```

### \$wsCheckout.getShippingMethodDisabledErrors()

Gibt zurück, warum eine Versandart deaktiviert ist. Nutzen Sie es, um dem Kunden zu erklären, weshalb eine Versandart nicht wählbar ist.

**Signatur**<br />`$wsCheckout.getShippingMethodDisabledErrors(shippingMethodId)`

**Rückgabe**<br />`array` – Liste mit Fehlermeldungen.

| **Name**           | **Typ** | **Pflicht** | **Beschreibung**                |
| ------------------ | ------- | ----------- | ------------------------------- |
| `shippingMethodId` | string  | ja          | ID der zu prüfenden Versandart. |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $error in $wsCheckout.getShippingMethodDisabledErrors("express") }}
  {{= $error }}
{{ /foreach }}
```

### \$wsCheckout.getShippingCost()

Gibt die Versandkosten einer bestimmten Versandart zurück. Auch dann, wenn diese nicht ausgewählt ist. Der Wert bezieht sich auf den aktuellen Warenkorb. Nutzen Sie es beispielsweise, um die Versandkosten verschiedener Optionen vorab anzuzeigen.

**Signatur**<br />`$wsCheckout.getShippingCost(shippingMethodId)`

**Rückgabe**<br />`float` – Versandkosten der angegebenen Versandart.

| **Name**           | **Typ** | **Pflicht** | **Beschreibung**                                  |
| ------------------ | ------- | ----------- | ------------------------------------------------- |
| `shippingMethodId` | string  | ja          | ID der Versandart, deren Kosten ermittelt werden. |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
Versandkosten: {{= $wsCheckout.getShippingCost("dhl_standard") | currency }}
```

### \$wsCheckout.itemVoucherDiscount()

Berechnet den Gutscheinrabatt für einen einzelnen Warenkorb-Artikel. Übergeben Sie die ID eines [Warenkorb-Eintrags](/frontend/referenz/module/wsbasket#wsbasket-items).

**Signatur**<br />`$wsCheckout.itemVoucherDiscount(itemId)`

**Rückgabe**<br />`float` – Rabattbetrag für den Artikel.

| **Name** | **Typ** | **Pflicht** | **Beschreibung**           |
| -------- | ------- | ----------- | -------------------------- |
| `itemId` | string  | ja          | ID des Warenkorb-Eintrags. |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
Rabatt: {{= $wsCheckout.itemVoucherDiscount($item.id) | currency }}
```

***

## Aktionen

Aktionen, die den Checkout verändern (Adresse wählen, Zahlungsart setzen, Bestellung auslösen), sind separat dokumentiert: [Aktionen → Checkout](/frontend/referenz/aktionen/checkout).

***

## Beispiele

### Bestellbarkeit prüfen und Fehler anzeigen

Dieses Beispiel kombiniert die Validierungsebenen: <br />Ist die Bestellung gültig, wird der „Kaufen"-Bereich angezeigt, sonst werden die konkreten Probleme aufgelistet - anhand von `code` und `check`, da die Fehler-Objekte keinen fertigen Text enthalten.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isValid }}
  <!-- Kaufen-Button anzeigen -->
{{ else }}
  {{ foreach $prob in $wsCheckout.problems.payment }}
    {{ if $prob.code == "missing" }}
      Bitte wählen Sie eine Zahlungsart aus.
    {{ else }}
      Die gewählte Zahlungsart ist nicht verfügbar ({{= $prob.check }}).
    {{ /if }}
  {{ /foreach }}
  {{ foreach $prob in $wsCheckout.problems.shippingMethod }}
    {{ if $prob.code == "missing" }}
      Bitte wählen Sie eine Versandart aus.
    {{ else }}
      Die gewählte Versandart ist nicht verfügbar ({{= $prob.check }}).
    {{ /if }}
  {{ /foreach }}
  {{ foreach $prob in $wsCheckout.problems.billAddress }}
    Bitte prüfen Sie Ihre Rechnungsadresse ({{= $prob.code }}).
  {{ /foreach }}
{{ /if }}
```

**Ergebnis** <br />Bei gültiger Bestellung erscheint der Kaufen-Bereich, sonst die offenen Punkte je Bereich.

### Summenübersicht

Eine vollständige Summenanzeige. Der `currency`-Filter enthält das Währungssymbol bereits.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
Zwischensumme: {{= $wsCheckout.sum.totalNet | currency }}
Versandkosten: {{= $wsCheckout.sum.shippingCost | currency }}
Mehrwertsteuer: {{= $wsCheckout.sum.totalTax | currency }}
{{ if $wsCheckout.sum.totalVoucher > 0 }}
  Gutschein: {{= $wsCheckout.sum.totalVoucher | currency }}
{{ /if }}
Gesamtbetrag: {{= $wsCheckout.sum.total | currency }}
```

**Ergebnis** <br />Eine aufgeschlüsselte Summenübersicht mit korrekt formatierten Geldbeträgen.

### AGB-Zustimmung prüfen

Prüft, ob das Freifeld `agb` angehakt ist, bevor die Bestellung erlaubt wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $field in $wsCheckout.freeFields }}
  {{ if $field.id == "agb" and not $field.checked }}
    Bitte akzeptieren Sie die AGB.
  {{ /if }}
{{ /foreach }}
```

**Ergebnis** <br />Ist die AGB-Checkbox nicht angehakt, erscheint der Hinweis.

### Gewählte Zahlungsart prüfen

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCheckout.isValidPayment($wsCheckout.selectedPayment) }}
  Gewählte Zahlungsart: {{= $wsCheckout.selectedPayment }}
{{ /if }}
```

**Ergebnis** <br />Die gewählte Zahlungsart wird angezeigt, sofern sie gültig ist.

***

## Weiterführende Links

* [Aktionen → Checkout](/frontend/referenz/aktionen/checkout) – den Checkout verändern (Auswahl setzen, Bestellung auslösen), weil `$wsCheckout` selbst nur liest.
* [\$wsBasket](/frontend/referenz/module/wsbasket) – der Warenkorb, auf dem der Checkout aufbaut; liefert die Artikel für `itemVoucherDiscount()`.
* [\$wsAccount](/frontend/referenz/module/wsAccount) – lädt über `loadAddress()` die vollständige Adresse zur `selectedBillAddress`/`selectedShippingAddress`.
* [Checkout-Konfiguration](/konfiguration/checkout-bestellablauf#7-checkout-fielderrorvisibility-fehleranzeige) – steuert mit `show*BeforeSubmit`, wann Fehler angezeigt werden.
* [Fehlertexte zu wirkungslosen Gutscheinen](/konfiguration/checkout-bestellablauf#checkout-vouchererrors-fehlertexte-zu-wirkungslosen-gutscheinen) – pflegt die Texte, die `ineffectiveVoucherErrors` ausgibt.
* [\$wsVoucher](/frontend/referenz/module/wsvoucher) – die eingelösten Gutscheine selbst, passend zu den IDs aus `ineffectiveVoucherErrors`.


## Related topics

- [$wsPayPalCheckout - PayPal](/frontend/referenz/module/wspaypalcheckout.md)
- [Checkout](/frontend/referenz/aktionen/checkout.md)
- [checkout - Bestellablauf](/konfiguration/checkout-bestellablauf.md)
- [$wsAccount - Account & Adressdaten](/frontend/referenz/module/wsAccount.md)
- [$wsShipTrack - Sendungsverfolgung](/frontend/referenz/module/wsshiptrack.md)
