> ## 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 Feld eine Liste von Fehlern mit Code und Text. 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. Greift also schon, bevor der Kunde auf „Kaufen" klickt.
* `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 Konto gespeichert ist, steht deren temporäre ID in `draftBillAddressId` bzw. `draftShippingAddressId`.

***

## 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 Feld eine Liste von Fehlern mit Code und Text. 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. Greift also schon, bevor der Kunde auf „Kaufen" klickt.
* `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 Konto gespeichert ist, steht deren temporäre ID in `draftBillAddressId` bzw. `draftShippingAddressId`.

***

## 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": { },
  "freeFields": [...],
  "guestMail": "...",
  "isExpressCheckoutLocked": false,
  "isPPCExpressCheckout": false,
  "isValid": false,
  "problems": {
    "billAddress": [...],
    "clearing": [...],
    "freeFields": [...],
    "general": [...],
    "payment": [...],
    "shippingAddress": [...],
    "shippingMethod": [...]
  },
  "selectedBillAddress": "...",
  "selectedPayment": "...",
  "selectedShippingAddress": "...",
  "selectedShippingMethod": "...",
  "selectedStoreId": 0,
  "sum": { },
  "useAlternativeShippingAddress": false,
  "shippingMethodAutoReset": false,
  "paymentMethodAutoReset": false,
  "verificationStatus": 0,
  "verificationStatusOptions": [...],
  "voucherAppliesPerItem": false,
  "fieldStates": { },
  "getAmountInSmallestUnit": "ƒ()",
  "getShippingMethodDisabledErrors": "ƒ()",
  "isFinished": "ƒ()",
  "isPending": "ƒ()",
  "isValidBillAddress": "ƒ()",
  "isValidPayment": "ƒ()",
  "isValidShippingAddress": "ƒ()",
  "isValidShippingMethod": "ƒ()",
  "itemVoucherDiscount": "ƒ()"
}
```

Anmerkung: `"ƒ()"` kennzeichnet eine Funktion.

**Variablen in der Übersicht**

| **Variable**                                             | **Rückgabe-Typ** | **Beschreibung**                                                                                                                                                                                                                                                                                                         |
| -------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `accountType`                                            | string           | Kontotyp: `"guest"`, `"new"` oder `"registered"`.                                                                                                                                                                                                                                                                        |
| `customerData`                                           | map              | Kundendaten-Felder, u. a. mit `fieldGroups`.                                                                                                                                                                                                                                                                             |
| `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           | ID einer temporären, noch nicht gespeicherten Rechnungsadresse.                                                                                                                                                                                                                                                          |
| `draftShippingAddressId`                                 | string           | ID einer temporären, noch nicht gespeicherten Lieferadresse.                                                                                                                                                                                                                                                             |
| `selectedPseudoCC`                                       | string           | Pseudo-Kreditkarten-Token.                                                                                                                                                                                                                                                                                               |
| `selectedStoreId`                                        | int              | ID der gewählten Filiale (z. B. Click & Collect).                                                                                                                                                                                                                                                                        |
| `useAlternativeShippingAddress`                          | bool             | Ob eine abweichende Lieferadresse aktiv ist.                                                                                                                                                                                                                                                                             |
| `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).                                                                                                                                                                                                                                        |
| `isOrderBlockedByIneffectiveVoucher`                     | bool             | Prüft, ob die Bestellung durch einen wirkungslosen Gutschein blockiert ist.                                                                                                                                                                                                                                              |
| `paymentBlocked`                                         | bool             | Prüft, ob die Zahlung blockiert ist.                                                                                                                                                                                                                                                                                     |
| `paymentCaptchaRequired`                                 | bool             | Prüft, ob für die Zahlung ein Captcha erforderlich ist.                                                                                                                                                                                                                                                                  |
| `draftBillAddress`                                       | map              | Daten der temporären (noch nicht gespeicherten) Rechnungsadresse.                                                                                                                                                                                                                                                        |

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

| **Variable**                         | **Rückgabe-Typ** | **Beschreibung**                                                                  |
| ------------------------------------ | ---------------- | --------------------------------------------------------------------------------- |
| `accountType`                        | string           | Kontotyp: `"guest"`, `"new"` oder `"registered"`.                                 |
| `customerData`                       | map              | Kundendaten-Felder, u. a. mit `fieldGroups`.                                      |
| `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           | ID einer temporären, noch nicht gespeicherten Rechnungsadresse.                   |
| `draftShippingAddressId`             | string           | ID einer temporären, noch nicht gespeicherten Lieferadresse.                      |
| `selectedPseudoCC`                   | string           | Pseudo-Kreditkarten-Token.                                                        |
| `selectedStoreId`                    | int              | ID der gewählten Filiale (z. B. Click & Collect).                                 |
| `useAlternativeShippingAddress`      | bool             | Prüft, ob eine abweichende Lieferadresse aktiv ist.                               |
| `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). |
| `isOrderBlockedByIneffectiveVoucher` | bool             | Prüft, ob die Bestellung durch einen wirkungslosen Gutschein blockiert ist.       |
| `paymentBlocked`                     | bool             | Prüft, ob die Zahlung blockiert ist.                                              |
| `paymentCaptchaRequired`             | bool             | Prüft, ob für die Zahlung ein Captcha erforderlich ist.                           |
| `draftBillAddress`                   | map              | Daten der temporären (noch nicht gespeicherten) Rechnungsadresse.                 |

**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). 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 ID einer temporären Adresse aus, die der Kunde im Bestellablauf neu angelegt hat und die noch nicht im Kundenkonto gespeichert ist. Sie existiert nur in der aktuellen Session.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
Temporäre Rechnungsadresse: {{= $wsCheckout.draftBillAddressId }}
```

### \$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.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 ID einer temporären Adresse aus, die der Kunde im Bestellablauf neu angelegt hat und die noch nicht im Kundenkonto gespeichert ist. Sie existiert nur in der aktuellen Session.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
Temporäre Rechnungsadresse: {{= $wsCheckout.draftBillAddressId }}
```

### \$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.customerData

Gibt die Kundendaten-Felder als nach Gruppen strukturiertes Objekt aus. Lassen Sie sich die konkrete Struktur Ihres Shops zuerst ausgeben, da sie von den konfigurierten Feldern abhängt:

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

### \$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 (`false` bei Checkbox, `""` bei Textfeld).      |
| `checked`       | bool             | Ob die Checkbox angehakt ist (nur bei `type == "checkbox"`). |

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

> 🔧 **Shop-geprüft 12.06.2026:** Existiert (float, beobachtet `0.0`).

Gibt den verbleibenden Betrag bis zur Grenze für kostenlosen Versand aus (`0`, wenn die Grenze erreicht ist). Nutzen Sie es für einen Hinweis „Noch X bis zum kostenlosen Versand".

```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 (`payment`, `shippingMethod`, `billAddress`, `shippingAddress`, `freeFields`, `clearing`, `general`). Jeder Bereich ist eine Liste von Fehlern; sie ist gefüllt, wenn dort ein Problem vorliegt.

#### Eigenschaften eines Fehlers

| **Eigenschaft** | **Rückgabe-Typ** | **Beschreibung**                                                      |
| --------------- | ---------------- | --------------------------------------------------------------------- |
| `code`          | string           | Fehler-Code: `"missing"`, `"checkFailed"` oder `"checkIncompatible"`. |
| `check`         | string           | Service-Name/Grund des Checks (z. B. `"productTypeDenied"`).          |
| `text`          | string           | Sprechender Fehlertext aus der Konfiguration (nur wenn konfiguriert). |
| `field`         | string           | Betroffenes Feld (nur bei feldbezogenen Fehlern wie `billAddress`).   |

#### 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 Postleitzahl.                  |
| `"checkIncompatible"` | Der Wert ist gültig, im aktuellen Kontext aber nicht zulässig.    | Zahlungsart für das Lieferland gesperrt. |

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.
  {{ else }}
    {{= $prob.text }}
  {{ /if }}
{{ /foreach }}
```

<Info>
  `clearing` (Zahlungsabwicklung) und `general` (allgemeine Probleme) enthalten keine `field`-Angabe. Um auf einen einzelnen Fehler zuzugreifen, verwenden Sie den Index, z. B. `$wsCheckout.problems.payment[0].text`.
</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() / isValidShippingMethod()

Prüfen, ob die Zahlungsart bzw. Versandart mit der angegebenen ID verfügbar ist. Nutzen Sie sie, um nur verfügbare Optionen anzubieten.

**Signatur**\
`$wsCheckout.isValidPayment(paymentId)` · `$wsCheckout.isValidShippingMethod(shippingMethodId)`

**Rückgabe**\
`bool` – verfügbar / nicht verfügbar.

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

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

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

**Signatur**\
`$wsCheckout.isValidBillAddress(addressId)` · `$wsCheckout.isValidShippingAddress(addressId)`

**Rückgabe**\
`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**\
`$wsCheckout.isPending()` · `$wsCheckout.isFinished()`

**Rückgabe**\
`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**\
`$wsCheckout.getAmountInSmallestUnit(amount)`

**Rückgabe**\
`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**\
`$wsCheckout.getShippingMethodDisabledErrors(shippingMethodId)`

**Rückgabe**\
`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.itemVoucherDiscount()

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

**Signatur**\
`$wsCheckout.itemVoucherDiscount(itemId)`

**Rückgabe**\
`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 }}
```

### \$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**\
`$wsCheckout.getShippingCost(shippingMethodId)`

**Rückgabe**\
`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 }}
```

***

## 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: \
Ist die Bestellung gültig, wird der „Kaufen"-Bereich angezeigt, sonst werden die konkreten Probleme aufgelistet.

```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 }}
    {{= $prob.text }}
  {{ /foreach }}
  {{ foreach $prob in $wsCheckout.problems.shippingMethod }}
    {{= $prob.text }}
  {{ /foreach }}
  {{ foreach $prob in $wsCheckout.problems.billAddress }}
    {{= $prob.field }}: {{= $prob.text }}
  {{ /foreach }}
{{ /if }}
```

**Ergebnis** \
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** \
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** \
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** \
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.
