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

# $wsInventory - Lagerbestand

> Lagerbestand, Verfügbarkeit und Reservierungszeiten von Produkten und Varianten im Warenkorb im Frontend lesen und Statusanzeigen im Shop ausgeben.

Mit dem `$wsInventory`-Modul lesen Sie Lagerbestände und Verfügbarkeiten von Produkten sowie die Reservierungszeit eines Warenkorb-Eintrags. Typische Anwendungsfälle sind Ampel-Anzeigen (grün/gelb/rot), Verfügbarkeitshinweise auf Produktseiten und der ablaufende Reservierungs-Timer im Warenkorb.

Auf dieser Seite geht es um das Lesen und Anzeigen von Bestandsdaten. Eine Reservierung kann über die Aktion `InventoryReserve` ([\$wsActions](/frontend/referenz/module/wsactions)) verlängert werden. Die [Storefront-API Lagerbestand](/schnittstellen/storefront-api/storefront-api-lagerbestand) behandelt serverseitige Bestandsdaten.

***

## Grundkonzept

`$wsInventory` liefert zwei verschiedene Datenpunkte:

* [`load(productId)`](#wsinventory-load) – die Bestandsdaten eines Produkts (Verfügbarkeit, Stückzahl, Ampelstatus).
* [`loadReservation(basketItemId)`](#wsinventory-loadreservation) – die verbleibende Reservierungszeit eines Warenkorb-Eintrags.

### Zuerst auf aktive Lagerverwaltung prüfen

Die Bestandsdaten sind nur aussagekräftig, wenn für das Produkt die Lagerverwaltung aktiv ist. Prüfen Sie deshalb immer zuerst `active`, bevor Sie Stückzahl, Ampel oder Lieferstatus anzeigen, ansonsten zeigen Sie Werte an, die für dieses Produkt gar nicht gepflegt werden.

### Ampel-Logik

`state` fasst die Verfügbarkeit als Ampel zusammen: `green` (ausreichend vorrätig), `yellow` (wenige Stück) und `red` (ausverkauft oder sehr knapp). Damit zeigen Sie dem Kunden auf einen Blick, wie es um die Lieferbarkeit steht, ohne selbst Schwellen zu berechnen.

### Reservierungs-Lebenszyklus

Wird ein Produkt in den Warenkorb gelegt, ist es für eine bestimmte Zeit reserviert. `loadReservation()` liefert die verbleibende Zeit in Sekunden (`duration`). Läuft sie ab (`duration <= 0`), kann der Kunde über die Aktion `InventoryReserve` erneut reservieren.

***

## Modulübersicht

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

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

**JSON-Ausgabe**

```json theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{
  "load": "ƒ()",
  "loadReservation": "ƒ()"
}
```

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

**Methoden in der Übersicht**

| **Methode**         | **Rückgabe-Typ** | **Beschreibung**                                      |
| ------------------- | ---------------- | ----------------------------------------------------- |
| `load()`            | map              | Lädt die Lagerbestandsdaten eines Produkts.           |
| `loadReservation()` | map              | Lädt die Reservierungsdaten eines Warenkorb-Eintrags. |

***

## Templates

Bestands- und Verfügbarkeitsinformationen werden typischerweise dort geladen, wo Produkte erscheinen: Startseite, Kategorieliste, Suchergebnisse, Produktdetailseite und Warenkorb.

***

## Variablen

Für `$wsInventory` stehen keine eigenen Variablen zur Verfügung. Die Daten werden über die Methoden geladen.

***

## Methoden

### \$wsInventory.load()

Lädt die Lagerbestandsdaten eines Produkts.

**Signatur**\
`$wsInventory.load(productId)`

**Rückgabe**\
`map` – Lagerbestandsdaten (siehe Tabelle).

**Parameter**

| **Name**    | **Typ** | **Pflicht** | **Beschreibung** |
| ----------- | ------- | ----------- | ---------------- |
| `productId` | string  | ja          | ID des Produkts. |

**Rückgabewerte**

| **Eigenschaft**    | **Typ** | **Beschreibung**                                                                                        |
| ------------------ | ------- | ------------------------------------------------------------------------------------------------------- |
| `active`           | bool    | `true`, wenn die Lagerverwaltung für dieses Produkt aktiv ist.                                          |
| `amount`           | int     | Verfügbare Stückzahl (kann `null` sein, wenn der Bestand nicht gezählt wird).                           |
| `amountInStock`    | int     | Am Lager befindliche Menge (häufig `null`; im Test nur bei ausverkauften Produkten als `0` beobachtet). |
| `amountNotInStock` | int     | Nicht am Lager befindliche Menge (häufig `null`).                                                       |
| `state`            | string  | Ampelstatus: `green`, `yellow` oder `red`.                                                              |
| `soldOut`          | bool    | `true`, wenn das Produkt ausverkauft ist.                                                               |
| `deliveryText`     | string  | Lieferstatus-Text (z. B. „Nur noch wenige Stück auf Lager").                                            |
| `messageLimit`     | int     | Stückzahl, ab der `deliveryText` angezeigt wird.                                                        |
| `splitDelivery`    | bool    | `true`, wenn auch bei Teillieferung bestellt werden kann.                                               |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $inventory = $wsInventory.load($product.id) }}
{{ if $inventory.active }}
  {{= $inventory.deliveryText }} – verfügbar: {{= $inventory.amount }} Stück
{{ /if }}
```

### \$wsInventory.loadReservation()

Lädt die Reservierungsdaten eines Warenkorb-Eintrags.

**Signatur**\
`$wsInventory.loadReservation(basketItemId)`

**Rückgabe**\
`map` – Reservierungsdaten.

**Parameter**

| **Name**       | **Typ** | **Pflicht** | **Beschreibung**                                                                                                  |
| -------------- | ------- | ----------- | ----------------------------------------------------------------------------------------------------------------- |
| `basketItemId` | string  | ja          | ID des Warenkorb-Eintrags (Eintrags-Hash, siehe [\$wsBasket](/frontend/referenz/module/wsbasket#wsbasket-items)). |

**Rückgabewerte**

| **Eigenschaft** | **Typ** | **Beschreibung**                                                          |
| --------------- | ------- | ------------------------------------------------------------------------- |
| `duration`      | int     | Verbleibende Reservierungszeit in Sekunden (`<= 0` bedeutet abgelaufen).  |
| `reservedUntil` | string  | Zeitpunkt des Ablaufs (ISO 8601, UTC; einen `date`-Filter gibt es nicht). |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $reservation = $wsInventory.loadReservation($basketItem.id) }}
{{ if $reservation }}
  {{ if $reservation.duration > 0 }}
    Reserviert für {{= $reservation.duration }} Sekunden.
  {{ else }}
    Reservierung abgelaufen.
  {{ /if }}
{{ /if }}
```

***

## Aktionen

`$wsInventory` selbst stellt keine Aktionen bereit. Eine abgelaufene Reservierung wird über die [\$wsActions](/frontend/referenz/module/wsactions)-Aktion `InventoryReserve` erneuert (siehe [Beispiel](#reservierung-verlängern)).

***

## Beispiele

### Verfügbarkeit als Ampel anzeigen

Prüft zuerst `active` und zeigt dann den Ampelstatus farbig an.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $inventory = $wsInventory.load($product.id) }}
{{ if $inventory.active }}
  {{ switch $inventory.state }}
    {{ case "green" }}
      <span style="color: green;">Verfügbar</span>
    {{ case "yellow" }}
      <span style="color: orange;">Nur noch wenige Stück</span>
    {{ case "red" }}
      <span style="color: red;">Nicht lieferbar</span>
  {{ /switch }}
{{ /if }}
```

**Ergebnis** \
Bei aktiver Lagerverwaltung erscheint je nach `state` ein grüner, gelber oder roter Hinweis.

### Reservierungszeit als Countdown anzeigen

Rechnet die Sekunden aus `duration` in Minuten und Sekunden um.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $reservation and $reservation.duration > 0 }}
  {{ var $sec = $reservation.duration % 60 }}
  {{ var $min = ($reservation.duration - $sec) / 60 }}
  Das Produkt ist noch
  {{ if $min > 0 }}<strong>{{= $min }} Minuten</strong> und {{ /if }}
  <strong>{{= $sec }} Sekunden</strong> für Sie reserviert.
{{ else }}
  Ihre Reservierung ist abgelaufen.
{{ /if }}
```

**Ergebnis** \
Solange die Reservierung läuft, sieht der Kunde die verbleibende Zeit. Danach den Ablauf-Hinweis.

### Reservierung verlängern

Ist die Reservierung abgelaufen, bietet dieses Beispiel über die Aktion `InventoryReserve` eine Neureservierung an.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $reservation = $wsInventory.loadReservation($basketItem.id) }}
{{ if $reservation }}
  {{ var $reserve = $wsActions.create("InventoryReserve", tag=$basketItem.id) }}

  {{ if $reservation.duration > 0 }}
    Das Produkt ist für Sie reserviert.
  {{ else }}
    Ihre Reservierung ist abgelaufen.
    <form method="post" action="{{= $wsViews.viewUrl('basket.htm') }}">
      <input type="hidden" name="wscsrf" value="{{= $reserve.csrf }}">
      <input type="hidden" name="wsact" value="{{= $reserve.id }}">
      <input type="hidden" name="wstarget" value="{{= $wsViews.viewUrl('basket.htm') }}">
      <input type="hidden" name="basketItemId" value="{{= $basketItem.id }}">
      <button type="submit">Neu reservieren</button>
    </form>
  {{ /if }}

  {{ if $reserve.success }}
    <p>Die Menge wurde erfolgreich neu reserviert.</p>
  {{ /if }}
  {{ if $reserve.error }}
    <p>Die Reservierung konnte nicht verlängert werden.</p>
  {{ /if }}
{{ /if }}
```

**Ergebnis** \
Bei abgelaufener Reservierung erscheint ein „Neu reservieren"-Button. Nach erfolgreicher Aktion die Bestätigung.

***

## Weiterführende Links

* [\$wsActions](/frontend/referenz/module/wsactions) – stellt die Aktion `InventoryReserve` zum Verlängern einer Reservierung bereit.
* [\$wsBasket](/frontend/referenz/module/wsbasket) – liefert die Warenkorb-Einträge, deren ID `loadReservation()` erwartet.
* [\$wsStores](/frontend/referenz/module/wsstores) – Filialfinder, relevant für die StorageID bei Click & Collect.
* [Storefront-API Lagerbestand](/schnittstellen/storefront-api/storefront-api-lagerbestand) – serverseitiger Zugriff auf Bestandsdaten.
