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

# Account

> Aktionen für Kundenkonten: Konten und Adressen anlegen, Anmeldedaten und Passwörter ändern sowie B2B-Mitarbeiterkonten und Berechtigungen verwalten.

In diesem Abschnitt werden die verfügbaren Aktionen im Bereich Kundenkonto beschrieben. Mithilfe dieser Aktionen können Sie Kundenkonten anlegen und verwalten, Anmeldedaten und Passwörter ändern sowie Adressen pflegen. Im B2B-Bereich ist zudem die Verwaltung von Mitarbeiterkonten und Berechtigungsgruppen möglich.

## Grundkonzept

**Abgrenzung der Möglichkeiten im Kundenkonto:**

* Daten lesen (Adressen, Profil, Login-Status) - erfolgt nicht über Aktionen, sondern über das Modul [\$wsAccount](/frontend/referenz/module/wsAccount).
* **Strukturelle Einstellungen** - (Adressfelder, Kundendatenfelder, B2B-Konfiguration) werden in der [Konfiguration](/konfiguration) festgelegt.
* Diese Seite beschreibt ausschließlich die Aktionen, die Konto-, Adress- und Berechtigungsdaten

### Grundlagen: Aufbau einer Aktion

Jede Aktion wird mit `$wsActions.create("<Name>")` erzeugt und in ein Formular eingebunden. Pflichtfelder jedes Formulars sind `wsact` (ID der Aktion) und `wscsrf` (CSRF-Token). Details siehe [Aktionen - Übersicht](/frontend/referenz/aktionen).

### Adressen: Typen, Standard und Sichtbarkeit

Adressen haben einen Typ (`bill` = Rechnungsadresse, `delivery` = Lieferadresse). Die erste Adresse eines Typs wird automatisch zur Hauptadresse dieses Typs. Über `SetMainAddress`, `SetDefaultBillAddress` und `SetDefaultDeliveryAddress` lassen sich Standardadressen festlegen, die im Checkout vorausgewählt werden.

Im B2B-Kontext besitzt jede Adresse zusätzlich eine Sichtbarkeit: privat (nur für ein Mitarbeiterkonto) oder firmenweit freigegeben. Welcher Wert beim Anlegen vorausgewählt ist, steuert `defaultAddressVisibility` (siehe `UpdateSubAccount`). Wem eine Adresse gehört, steuert das Feld `addressOwnerMemberId` (siehe `AddressCreate`).

### B2B: Mitarbeiterkonten & Berechtigungsgruppen

Diese Funktionen stehen ausschließlich für Firmenkonten im B2B-Bereich zur Verfügung; alle zugehörigen Aktionen erfordern Admin-Rechte. Eine Berechtigungsgruppe bündelt Rechte und Einschränkungen (z. B. erlaubte Zahlungsarten, Budgetgrenzen, gesperrte Seiten). Der typische Ablauf:

1. Gruppe anlegen → `CreatePrivilegeGroup`
2. Rechte/Einschränkungen der Gruppe setzen → `UpdatePrivileges`
3. Gruppe einem Mitarbeiterkonto zuweisen → `UpdateSubAccount` (`privilegeGroupId`)

Mitarbeiterkonten selbst werden über `SubAccountCreate`, `UpdateSubAccount` und `SubAccountDelete` verwaltet. Die in der Gruppe gesetzten Budgetgrenzen werden im Frontend am Mitarbeiterkonto schreibgeschützt über [\$wsAccount.paymentLimit](/frontend/referenz/module/wsAccount) und `$wsAccount.paymentLimitPerOrder` gelesen.

***

## Aktionen im Überblick

**Konto**

| **Aktion**             | **Beschreibung**                                                |
| ---------------------- | --------------------------------------------------------------- |
| `AccountRegister`      | Erstellt ein neues Kundenkonto.                                 |
| `AccountActivate`      | Aktiviert ein bestehendes Kundenkonto über eine E-Mail-Adresse. |
| `AccountActivateOptIn` | Aktiviert ein bestehendes Kundenkonto per Opt-In-Token.         |
| `EmailVerify`          | Verifiziert eine E-Mail-Adresse per Double-Opt-In.              |
| `AccountDelete`        | Löscht den Account des eingeloggten Benutzers.                  |
| `AccountDeleteOptIn`   | Bestätigt die Löschung eines Kundenkontos per Opt-In-Token.     |

**Anmeldung & Passwort**

| **Aktion**              | **Beschreibung**                                                    |
| ----------------------- | ------------------------------------------------------------------- |
| `Login`                 | Meldet einen Benutzer an.                                           |
| `Logout`                | Meldet einen eingeloggten Benutzer ab.                              |
| `UnlockLogin`           | Entsperrt einen gesperrten Login-Zugang.                            |
| `PasswordForgotten`     | Sendet eine Passwort-vergessen-E-Mail.                              |
| `ResetPassword`         | Setzt das Passwort eines Benutzerkontos neu.                        |
| `CheckPasswordStrength` | Prüft die Stärke eines eingegebenen Passworts in Echtzeit per AJAX. |

**Konto- & Kontaktdaten**

| **Aktion**                 | **Beschreibung**                                            |
| -------------------------- | ----------------------------------------------------------- |
| `EmailUpdate`              | Ändert die hinterlegte E-Mail-Adresse eines Benutzerkontos. |
| `EmailUpdateOptIn`         | Bestätigt die Änderung der E-Mail-Adresse per Opt-In-Token. |
| `accountDisplayNameUpdate` | Ändert den Anzeigenamen eines Kundenkontos.                 |
| `AccountSetCustomerData`   | Setzt oder aktualisiert benutzerdefinierte Kundendaten.     |

**Adressen**

| **Aktion**                     | **Beschreibung**                                               |
| ------------------------------ | -------------------------------------------------------------- |
| `AddressCreate`                | Erstellt eine neue Adresse für den eingeloggten Benutzer.      |
| `AddressUpdate`                | Bearbeitet eine bestehende Adresse des eingeloggten Benutzers. |
| `AddressDelete`                | Löscht eine Adresse des eingeloggten Benutzers.                |
| `SetMainAddress`               | Legt eine Adresse als Hauptadresse fest.                       |
| `SetDefaultBillAddress`        | Legt eine Adresse als Standard-Rechnungsadresse fest.          |
| `SetDefaultDeliveryAddress`    | Legt eine Adresse als Standard-Lieferadresse fest.             |
| `RemoveDefaultBillAddress`     | Entfernt die gesetzte Standard-Rechnungsadresse.               |
| `RemoveDefaultDeliveryAddress` | Entfernt die gesetzte Standard-Lieferadresse.                  |

**Kreditkarten**

| **Aktion**         | **Beschreibung**                                          |
| ------------------ | --------------------------------------------------------- |
| `CreditCardDelete` | Löscht eine gespeicherte Kreditkarte aus dem Kundenkonto. |

**Gastkonto**

| **Aktion**            | **Beschreibung**                                                                           |
| --------------------- | ------------------------------------------------------------------------------------------ |
| `GuestRegister`       | Erstellt aus einem Gast-Checkout ein vollwertiges Kundenkonto (E-Mail aus Checkout-Daten). |
| `SaveGuestDataToUser` | Erstellt aus einem Gast-Checkout ein vollwertiges Kundenkonto.                             |

**B2B – Mitarbeiterkonten** (Admin-Rechte erforderlich)

| **Aktion**         | **Beschreibung**                                                                                 |
| ------------------ | ------------------------------------------------------------------------------------------------ |
| `SubAccountCreate` | Legt ein neues Mitarbeiterkonto an und sendet eine E-Mail mit dem Link zum Setzen des Passworts. |
| `UpdateSubAccount` | Aktualisiert die Einstellungen eines Mitarbeiterkontos.                                          |
| `SubAccountDelete` | Löscht ein bestehendes Mitarbeiterkonto.                                                         |
| `AcceptInvitation` | Nimmt eine Einladung zu einem Firmenkonto per Double-Opt-In an.                                  |

**B2B – Berechtigungsgruppen** (Admin-Rechte erforderlich)

| **Aktion**             | **Beschreibung**                                                             |
| ---------------------- | ---------------------------------------------------------------------------- |
| `CreatePrivilegeGroup` | Legt eine neue Berechtigungsgruppe an.                                       |
| `UpdatePrivileges`     | Erstellt oder aktualisiert eine Berechtigungsgruppe mit definierten Rechten. |
| `DeletePrivilegeGroup` | Löscht eine bestehende Berechtigungsgruppe.                                  |

***

## Konto-Lebenszyklus

### AccountRegister

Mit dieser Aktion wird ein neues Kundenkonto angelegt. Der Benutzer gibt dabei seine E-Mail-Adresse sowie ein Passwort an.

**Anwendungsbeispiel**\
Nutzbar auf einer Registrierungsseite, auf der neue Kunden ein Konto erstellen können, um z.B. ihre Bestellhistorie einzusehen oder Adressen zu verwalten.

**Parameter**

| **Name**         | **Beschreibung**                                                     |
| ---------------- | -------------------------------------------------------------------- |
| `email`          | Identifier des Benutzer-Accounts (standardmäßig die E-Mail-Adresse). |
| `password`       | Passwort des Benutzer-Accounts.                                      |
| `passwordRepeat` | Erneute Eingabe des Passworts - muss mit `password` übereinstimmen.  |

**Fehlercodes**

| **Code**               | **Beschreibung**                                                |
| ---------------------- | --------------------------------------------------------------- |
| `missingId`            | Parameter `id` ist leer.                                        |
| `missingPassword`      | Parameter `password` ist leer.                                  |
| `passwordMismatch`     | Parameter `password` und `passwordRepeat` sind nicht identisch. |
| `emailCheckFailed`     | Parameter `id` enthält eine ungültige E-Mail-Adresse.           |
| `passwordCheckFailed`  | Passwort erfüllt nicht die erforderlichen Richtlinien.          |
| `accountAlreadyExists` | Es existiert bereits ein Account mit der angegebenen `id`.      |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie die Aktion erstellt und in ein Formular eingebunden wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionAccountRegister = $wsActions.create("AccountRegister") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $cActionAccountRegister.id }}">
    <input type="hidden" name="wscsrf" value="{{= $cActionAccountRegister.csrf }}">

    <input type="email" name="email">
    <input type="password" name="password">
    <input type="password" name="passwordRepeat">

    <button type="submit">Registrieren</button>
</form>
```

***

### AccountActivate

Mit dieser Aktion wird ein bestehendes Kundenkonto aktiviert. Die Aktion wird typischerweise über ein Formular ausgelöst.

**Anwendungsbeispiel**\
Nutzbar auf der Bestätigungsseite, auf der der Kunde seine E-Mail-Adresse eingibt, um sein Konto zu aktivieren.

**Parameter**

| **Name** | **Beschreibung**                                                     |
| -------- | -------------------------------------------------------------------- |
| `id`     | Identifier des Benutzer-Accounts (standardmäßig die E-Mail-Adresse). |

**Fehlercodes**

| **Fehlercode**         | **Beschreibung**                                                   |
| ---------------------- | ------------------------------------------------------------------ |
| `missingId`            | Parameter `id` ist leer.                                           |
| `emailCheckFailed`     | Parameter `id`enthält eine ungültige E-Mail-Adresse.               |
| `accountAlreadyExists` | Es existiert bereits ein aktiver Account mit der angegebenen `id`. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isAccountVerified](/frontend/referenz/module/wsAccount#%24wsaccount-isaccountverified)

**Beispiel** das zeigt, wie die Aktion erstellt und in ein Formular eingebunden wird, über das der Kunde seinen Account mit seiner E-Mail-Adresse aktiviert.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionAccountActivate = $wsActions.create("AccountActivate") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $cActionAccountActivate.id }}">
    <input type="hidden" name="wscsrf" value="{{= $cActionAccountActivate.csrf }}">
    <input type="email" name="id">
    <button type="submit">Account aktivieren</button>
</form>
```

***

### AccountActivateOptIn

Mit dieser Aktion wird ein bestehendes Kundenkonto per Opt-In-Token aktiviert. Der Token wird dabei über einen Link in einer Bestätigungs-E-Mail an den Benutzer übermittelt.

**Anwendungsbeispiel**\
Nutzbar auf der Bestätigungsseite, auf die der Kunde nach Klick auf den Opt-In-Link in der Registrierungs-E-Mail weitergeleitet wird.

**Fehlercodes**

| **Fehlercode** | **Beschreibung**                               |
| -------------- | ---------------------------------------------- |
| `unauthorized` | Es wurde kein gültiger Opt-In-Token übergeben. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isAccountVerified](/frontend/referenz/module/wsAccount#%24wsaccount-isaccountverified)

**Beispiel** das zeigt, wie nach erfolgreicher Ausführung der Aktion eine Bestätigungsmeldung angezeigt wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsActions.current.name == "AccountActivateOptIn" and $wsActions.current.success }}
    <div class="alert alert-info">Account wurde aktiviert.</div>
{{ /if }}
```

***

### EmailVerify

Mit dieser Aktion wird eine E-Mail-Adresse per Double-Opt-In verifiziert. Nach der Registrierung erhält der Kunde eine Bestätigungs-E-Mail; durch Klick auf den enthaltenen Link wird diese Aktion auf der Shop-Seite ausgeführt.

**Anwendungsbeispiel**\
Nutzbar auf der Bestätigungsseite, auf die der Kunde nach Klick auf den Verifizierungslink in der Registrierungs-E-Mail weitergeleitet wird.

**Fehlercodes**

| **Fehlercode**     | **Beschreibung**                             |
| ------------------ | -------------------------------------------- |
| `actionNotAllowed` | Kein gültiger Double-Opt-In-Token vorhanden. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie nach erfolgreichem Klick auf den Bestätigungslink eine Erfolgsmeldung ausgegeben wird und bei einem ungültigen Token ein entsprechender Hinweis erscheint.

```text theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsActions.current.name == "EmailVerify" }}
    {{ if $wsActions.current.success }}
        <div>E-Mail-Adresse wurde verifiziert.</div>
    {{ else }}
        <div>E-Mail-Adresse konnte nicht verifiziert werden.</div>
    {{ /if }}
{{ /if }}
```

***

### AccountDelete

Mit dieser Aktion wird der Account des aktuell eingeloggten Benutzers unwiderruflich gelöscht.

**Anwendungsbeispiel**\
Nutzbar auf einer Account-Verwaltungsseite, auf der eingeloggte Kunden ihr Konto auf Wunsch selbst löschen können.

**Fehlercodes**

| **Code**        | **Beschreibung**                   |
| --------------- | ---------------------------------- |
| **notLoggedIn** | Der Benutzer ist nicht eingeloggt. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie die Aktion erstellt wird und über einen Bestätigungs-Button ausgelöst wird.

```text theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionAccountDelete = $wsActions.create("AccountDelete") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $cActionAccountDelete.id }}">
    <input type="hidden" name="wscsrf" value="{{= $cActionAccountDelete.csrf }}">

    <button type="submit">Account Löschen</button>
</form>
```

***

### AccountDeleteOptIn

Mit dieser Aktion wird die Löschung eines Kundenkontos per Opt-In-Token bestätigt. Der Token wird über einen Link in einer Bestätigungs-E-Mail an den Benutzer übermittelt.

**Anwendungsbeispiel**\
Nutzbar auf der Bestätigungsseite, auf die der Kunde nach Klick auf den Opt-In-Link in der Löschungs-E-Mail weitergeleitet wird.

**Fehlercodes**

| **Fehlercode** | **Beschreibung**                               |
| -------------- | ---------------------------------------------- |
| `unauthorized` | Es wurde kein gültiger Opt-In-Token übergeben. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie nach erfolgreicher Ausführung der Aktion eine Bestätigungsmeldung angezeigt wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsActions.current.name == "AccountDeleteOptIn" and $wsActions.current.success }}
    <div class="alert alert-info">Account wurde gelöscht.</div>
{{ /if }}
```

***

## Anmeldung & Passwort

### Login

Mit dieser Aktion wird ein Benutzer mit seinen Zugangsdaten angemeldet.

**Anwendungsbeispiel**\
Nutzbar auf der Login-Seite, auf der Kunden sich mit E-Mail-Adresse und Passwort in ihr Konto einloggen können.

**Parameter**

| **Name**   | **Beschreibung**                                                     |
| ---------- | -------------------------------------------------------------------- |
| `id`       | Identifier des Benutzer-Accounts (standardmäßig die E-Mail-Adresse). |
| `password` | Passwort des Benutzer-Accounts.                                      |

**Fehlercodes**

| **Code**             | **Beschreibung**                                                   |
| -------------------- | ------------------------------------------------------------------ |
| `missingId`          | Parameter `id` ist leer.                                           |
| `missingPassword`    | Parameter `password` ist leer.                                     |
| `emailCheckFailed`   | Parameter `id` enthält eine ungültige E-Mail-Adresse.              |
| `loginBlocked`       | Zu viele ungültige Loginversuche.                                  |
| `invalidCredentials` | Ungültiger Loginversuch - `id` oder `password` sind nicht korrekt. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das ein Login-Formular mit E-Mail und Passwort sowie einer allgemeinen Fehlerausgabe bei ungültigen Angaben erstellt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionLogin = $wsActions.create("Login") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $cActionLogin.id }}">
    <input type="hidden" name="wscsrf" value="{{= $cActionLogin.csrf }}">

    {{ if $cActionLogin.error }}
        <div class="alert alert-danger">Fehler aufgetreten</div>
    {{ /if }}

    <input type="email" name="id" value="{{= $cActionLogin.params.id|ifNull('') }}">
    <input type="password" name="password">

    <button type="submit">Einloggen</button>
</form>
```

***

### Logout

Mit dieser Aktion wird ein eingeloggter Benutzer abgemeldet.

**Anwendungsbeispiel**\
Nutzbar als Logout-Button im Header oder auf der Account-Übersichtsseite.

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie die Aktion über einen einfachen Link ausgelöst wird, der den Benutzer nach dem Logout auf eine definierte Seite weiterleitet.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<a href="{{= $wsActions.url('Logout'
, $wsViews.viewUrl('account/overview.htm'), {}) }}">Ausloggen</a>
```

***

### UnlockLogin

Mit dieser Aktion wird ein Login-Zugang entsperrt, der aufgrund zu vieler fehlgeschlagener Anmeldeversuche gesperrt wurde. Die Aktion kann sowohl von einem eingeloggten Benutzer als auch über einen Opt-In-Token ausgeführt werden.

**Anwendungsbeispiel**\
Nutzbar, wenn ein Kunde nach mehreren Fehleingaben aus seinem Konto ausgesperrt wurde und einen Entsperrlink per E-Mail erhalten hat.

**Fehlercodes**

| **Code**       | **Beschreibung**                                                                      |
| -------------- | ------------------------------------------------------------------------------------- |
| `unauthorized` | Der Benutzer ist nicht eingeloggt oder es wurde kein gültiger Opt-In-Token übergeben. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)
* [\$wsAccount.isAccountVerified](/frontend/referenz/module/wsAccount#%24wsaccount-isaccountverified)

**Beispiel** das zeigt, wie nach erfolgreicher Ausführung der Aktion eine Bestätigungsmeldung angezeigt wird. Die Aktion selbst wird typischerweise über einen Opt-In-Link in einer E-Mail ausgelöst und benötigt kein Formular.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsActions.current.name == "UnlockLogin" and $wsActions.current.success }}
    <div class="alert alert-info">Account wurde entsperrt</div>
{{ /if }}
```

***

### PasswordForgotten

Mit dieser Aktion wird eine Passwort-vergessen-E-Mail an die angegebene E-Mail-Adresse gesendet. Die E-Mail enthält einen Opt-In-Link, der die Ausführung der Aktion `ResetPassword` erlaubt.

**Anwendungsbeispiel**\
Nutzbar auf einer “Passwort vergessen”-Seite, auf der Kunden ihre E-Mail-Adresse eingeben, um einen Wiederherstellungslink zu erhalten.

**Parameter**

| **Name** | **Beschreibung**                                                         |
| -------- | ------------------------------------------------------------------------ |
| `email`  | E-Mail-Adresse des Benutzerkontos, an die der Opt-In-Link gesendet wird. |

**Fehlercodes**

| **Fehlercode**           | **Beschreibung**                                                   |
| ------------------------ | ------------------------------------------------------------------ |
| `missingEmail`           | Parameter `email` ist leer.                                        |
| `emailCheckFailed`       | Parameter `email` enthält keine gültige E-Mail-Adresse.            |
| `passwordRecoveryFailed` | Es existiert kein Benutzerkonto zu der angegebenen E-Mail-Adresse. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)

**Beispiel,** das ein Formular erstellt, über das der Kunde seine E-Mail-Adresse eingibt und nach erfolgreicher Ausführung eine Bestätigung erhält.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionPasswordForgotten = $wsActions.create("PasswordForgotten") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $cActionPasswordForgotten.id }}">
    <input type="hidden" name="wscsrf" value="{{= $cActionPasswordForgotten.csrf }}">

    {{ if $cActionPasswordForgotten.success }}
        <div>Passwort erfolgreich zurückgesetzt</div>
    {{ /if }}

    <input type="email" name="email">
    <button type="submit">Neues Passwort anfordern</button>
</form>
```

***

### ResetPassword

Mit dieser Aktion wird das Passwort eines Benutzerkontos neu gesetzt. Nach erfolgreicher Ausführung wird der Benutzer automatisch ausgeloggt. Standardmäßig gilt die Aktion für den eingeloggten Benutzer - wird ein Opt-In-Token mitgesendet, gilt sie für den mit dem Token verknüpften Benutzer.

**Anwendungsbeispiel**\
Nutzbar auf der Seite, auf die der Kunde über den Passwort-vergessen-Link weitergeleitet wird, um dort ein neues Passwort zu vergeben.

**Parameter**

| **Name**            | **Beschreibung**                                                                                  |
| ------------------- | ------------------------------------------------------------------------------------------------- |
| `newPassword`       | Das neue Passwort, das für das Benutzerkonto gesetzt werden soll.                                 |
| `newPasswordRepeat` | Wiederholung des neuen Passworts zur Vermeidung von Tippfehlern.                                  |
| `passwordAuth`      | Bisheriges Passwort des Benutzerkontos. Nicht erforderlich, wenn ein Opt-In-Token verwendet wird. |

**Fehlercodes**

| **Fehlercode**        | **Beschreibung**                                                           |
| --------------------- | -------------------------------------------------------------------------- |
| `notLoggedIn`         | Weder ein Opt-In-Token noch eine eingeloggte Session ist vorhanden.        |
| `missingPassword`     | Parameter `newPassword` ist leer.                                          |
| `passwordMismatch`    | Parameter `newPassword`und `newPasswordRepeat`sind nicht identisch.        |
| `missingPasswordAuth` | Parameter `passwordAuth` ist leer. Tritt nur ohne Opt-In-Token auf.        |
| `failedPasswordAuth`  | Parameter `passwordAuth` stimmt nicht mit dem bisherigen Passwort überein. |
| `passwordCheckFailed` | `newPassword` entspricht nicht den Passwortregeln.                         |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)
* [\$wsAccount.isPasswordResetRequired](/frontend/referenz/module/wsAccount#%24wsaccount-ispasswordresetrequired)

**Beispiel** das zeigt, wie nach erfolgreichem Reset eine Bestätigung ausgegeben wird, bei einem gültigen Opt-In-Token das Formular zur Passwortvergabe erscheint und bei einem ungültigen Token ein Hinweis auf den abgelaufenen Link angezeigt wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsOptIn.current.valid }}
    {{ var $cActionResetPassword = $wsActions.create("ResetPassword") }}
    <form action="{{= $wsViews.current.url() }}" method="post">
        <input type="hidden" name="wsact" value="{{= $cActionResetPassword.id }}">
        <input type="hidden" name="wscsrf" value="{{= $cActionResetPassword.csrf }}">

        <input type="password" name="newPassword">
        <input type="password" name="newPasswordRepeat">

        <button type="submit">Passwort zurücksetzen.</button>
    </form>
{{ else }}
    <div>Der Link ist abgelaufen.</div>
{{ /if }}
```

***

### CheckPasswordStrength

Mit dieser Aktion wird die Stärke eines eingegebenen Passworts in Echtzeit geprüft. Die Aktion wird per AJAX im Hintergrund ausgeführt und gibt ein JSON-Objekt mit dem Bewertungsergebnis zurück.

**Anwendungsbeispiel**\
Nutzbar auf Seiten mit Passwort-Eingabefeldern, z.B. auf der Registrierungsseite, um dem Kunden direktes Feedback zur Passwortstärke zu geben.

**Parameter**

| **Name**   | **Beschreibung**          |
| ---------- | ------------------------- |
| `password` | Das zu prüfende Passwort. |

**Rückgabewerte**

| **Wert** | **Beschreibung**                        |
| -------- | --------------------------------------- |
| `value`  | Erreichte Punktzahl der Passwortstärke. |
| `max`    | Maximale Punktzahl der Passwortstärke.  |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)

**Beispiel** das zeigt, wie die Passwortstärke bei Eingabe in Echtzeit geprüft und dem Benutzer visuell als schwach, mittel oder stark angezeigt wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionCheckPasswordStrength = $wsActions.create("CheckPasswordStrength") }}
<form id="wsFormCheckPasswordStrength" action="{{= $wsViews.current.url() }}" method="post" style="display:none;" data-ws-ajax-form>
    <input type="hidden" name="wsact" value="{{= $cActionCheckPasswordStrength.id }}">
    <input type="hidden" name="wscsrf" value="{{= $cActionCheckPasswordStrength.csrf }}">
    <input type="hidden" name="password" id="wsCheckPassword" value="">
</form>
```

***

## Konto- & Kontaktdaten

### EmailUpdate

Mit dieser Aktion wird die hinterlegte E-Mail-Adresse eines Benutzerkontos geändert.

**Anwendungsbeispiel**\
Nutzbar auf der Account-Verwaltungsseite, auf der eingeloggte Kunden ihre E-Mail-Adresse aktualisieren können.

**Parameter**

| **Name** | **Beschreibung**                                                       |
| -------- | ---------------------------------------------------------------------- |
| `email`  | Neue E-Mail-Adresse, die für das Benutzerkonto hinterlegt werden soll. |

**Fehlercodes**

| **Fehlercode**         | **Beschreibung**                                                    |
| ---------------------- | ------------------------------------------------------------------- |
| `missingEmail`         | Parameter `email` fehlt.                                            |
| `emailCheckFailed`     | Parameter `email` enthält keine gültige E-Mail-Adresse.             |
| `accountAlreadyExists` | Es existiert bereits ein anderer Account mit dieser E-Mail-Adresse. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.email](/frontend/referenz/module/wsAccount#%24wsaccount-email)

**Beispiel** das ein Formular zur Eingabe einer neuen E-Mail-Adresse bereitstellt und nach erfolgreicher Ausführung eine Bestätigung ausgibt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionEmailUpdate = $wsActions.create("EmailUpdate") }}

{{ if $cActionEmailUpdate.success }}
    <div>E-Mail-Adresse erfolgreich aktualisiert.</div>
{{ else }}
    <form action="{{= $wsViews.current.url() }}" method="post">
        <input type="hidden" name="wsact" value="{{= $cActionEmailUpdate.id }}">
        <input type="hidden" name="wscsrf" value="{{= $cActionEmailUpdate.csrf }}">

        <input type="email" name="email">

        <button type="submit">E-Mail-Adresse ändern.</button>
    </form>
{{ /if }}
```

***

### EmailUpdateOptIn

Mit dieser Aktion wird die Änderung der E-Mail-Adresse per Opt-In-Token bestätigt. Der Token wird über einen Link in einer Bestätigungs-E-Mail an die neue E-Mail-Adresse übermittelt.

**Anwendungsbeispiel**\
Nutzbar auf der Bestätigungsseite, auf die der Kunde nach Klick auf den Opt-In-Link in der Bestätigungs-E-Mail weitergeleitet wird.

**Fehlercodes**

| **Fehlercode** | **Beschreibung**                               |
| -------------- | ---------------------------------------------- |
| `unauthorized` | Es wurde kein gültiger Opt-In-Token übergeben. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)

**Beispiel** das zeigt, wie bei einem gültigen Opt-In-Token ein Bestätigungsformular angezeigt wird, nach erfolgreicher Ausführung eine Erfolgsmeldung erscheint und bei einem abgelaufenen Token ein entsprechender Hinweis ausgegeben wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionEmailUpdateOptIn = $wsActions.create("EmailUpdateOptIn") }}

{{ if $wsActions.current.success and $wsActions.current.name == "EmailUpdateOptIn" }}
    <div class="alert alert-success">E-Mail-Adresse wurde erfolgreich geändert.</div>
{{ elseif $wsOptIn.current.valid }}
    <form method="post" action="{{= $wsViews.current.url() }}">
        <input type="hidden" name="wscsrf" value="{{= $cActionEmailUpdateOptIn.csrf }}">
        <input type="hidden" name="wsact" value="{{= $cActionEmailUpdateOptIn.id }}">
        <button type="submit">E-Mail-Adresse bestätigen.</button>
    </form>
{{ else }}
    <div class="alert alert-danger">Der Token ist abgelaufen.</div>
{{ /if }}
```

***

### accountDisplayNameUpdate

Mit dieser Aktion wird der Anzeigename eines Kundenkontos geändert.

**Anwendungsbeispiel**\
Nutzbar auf der Account-Verwaltungsseite, auf der eingeloggte Kunden ihren Anzeigenamen aktualisieren können.

**Parameter**

| **Name**      | **Beschreibung**                                                        |
| ------------- | ----------------------------------------------------------------------- |
| `displayName` | Der neue Anzeigename, der für das Benutzerkonto hinterlegt werden soll. |

**Fehlercodes**

| **Code**             | **Beschreibung**                   |
| -------------------- | ---------------------------------- |
| `notLoggedIn`        | Der Benutzer ist nicht eingeloggt. |
| `missingDisplayName` | Parameter `displayName` fehlt.     |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie die Aktion erstellt und in ein Formular eingebunden wird, über das der Kunde seinen Anzeigenamen aktualisieren kann.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionAccountDisplayNameUpdate = $wsActions.create("accountDisplayNameUpdate") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $cActionAccountDisplayNameUpdate.id }}">
    <input type="hidden" name="wscsrf" value="{{= $cActionAccountDisplayNameUpdate.csrf }}">
    <input type="text" name="displayName">
    <button type="submit">Anzeigename speichern</button>
</form>
```

***

### AccountSetCustomerData

Mit dieser Aktion werden benutzerdefinierte Kundendaten für das eingeloggte Benutzerkonto gesetzt oder aktualisiert.

**Anwendungsbeispiel**\
Nutzbar auf der Account-Verwaltungsseite, auf der eingeloggte Kunden ihre persönlichen Daten wie z.B. Geburtsdatum oder Telefonnummer hinterlegen können.

**Parameter**

| **Name**                   | **Beschreibung**                      |
| -------------------------- | ------------------------------------- |
| `customerData.(fieldname)` | Die einzelnen Felder der Kundendaten. |

**Fehlercodes**

| **Fehlercode**      | **Beschreibung**                             |
| ------------------- | -------------------------------------------- |
| `notLoggedIn`       | Der Benutzer ist nicht eingeloggt.           |
| `emptyCustomerData` | Es wurden keine Kundendatenfelder übergeben. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie die Aktion erstellt und in ein Formular eingebunden wird, über das der Kunde seine persönlichen Daten aktualisieren kann.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionAccountSetCustomerData = $wsActions.create("AccountSetCustomerData") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $cActionAccountSetCustomerData.id }}">
    <input type="hidden" name="wscsrf" value="{{= $cActionAccountSetCustomerData.csrf }}">
    <input type="text" name="customerData.phone">
    <input type="text" name="customerData.birthDate">
    <button type="submit">Kundendaten speichern</button>
</form>
```

***

## Adressen

### AddressCreate

Mit dieser Aktion wird eine neue Adresse für den eingeloggten Benutzer erstellt.

**Anwendungsbeispiel**\
Nutzbar auf der Adressverwaltungsseite, auf der Kunden neue Liefer- oder Rechnungsadressen anlegen können.

**Parameter**

| **Name**                       | **Beschreibung**                                                                                                                                                                                                                          |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address.(fieldname)`          | Die einzelnen Felder der Adresse, z.B. `address.firstName`, `address.street`etc.                                                                                                                                                          |
| `type`                         | Art der Adresse:  - `“bill”` - Rechnungsadresse - `“delivery”` - Lieferadresse     Handelt es sich für das betreffende Kundenkonto um die erste Adresse seiner Art, wird sie automatisch als Hauptadresse für den jeweiligen Typ gesetzt. |
| `address.addressOwnerMemberId` | *(B2B)* ID des Mitarbeiters, dem die Adresse gehört. Wird das Feld nicht übergeben oder auf `0` gesetzt, ist die Adresse eine firmenweite Adresse, die jeder Mitarbeiter sehen und nutzen kann.                                           |

**Fehlercodes**

| **Fehlercode**       | **Beschreibung**                                                                                                                                                                                                                   |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `notLoggedIn`        | Der Benutzer ist nicht eingeloggt und kein Opt-In-Token vorhanden.                                                                                                                                                                 |
| `emptyAddress`       | Es wurden keine Adressfelder übergeben.                                                                                                                                                                                            |
| `addressCheckFailed` | Fehler in den Adressdaten. Wird über Sub-Codes konkretisiert:  - `minlen` = zu wenig Zeichen - `maxlen` = zu viele Zeichen - `numeric` = ungültige Zeichen - `country` = Land nicht konfiguriert - `zip` = Postleitzahl fehlerhaft |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.addresses](/frontend/referenz/module/wsAccount#%24wsaccount-addresses)

**Beispiel** das zeigt, wie eine neue Adresse über ein Formular mit einzelnen Adressfeldern angelegt wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionAddressCreate = $wsActions.create("AddressCreate") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionAddressCreate.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionAddressCreate.csrf }}">
    <input type="hidden" name="type" value="delivery">
    <input type="text" name="address.firstName">
    <input type="text" name="address.lastName">
    <input type="text" name="address.street">
    <input type="text" name="address.zip">
    <input type="text" name="address.city">
    <button type="submit">Lieferadresse speichern.</button>
</form>
```

**Beispiel (B2B)** das zeigt, wie eine Lieferadresse angelegt wird, die nur einem bestimmten Mitarbeiter gehört.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionAddressCreate = $wsActions.create("AddressCreate") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionAddressCreate.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionAddressCreate.csrf }}">
    <input type="hidden" name="type" value="delivery">
    <input type="hidden" name="address.addressOwnerMemberId" value="{{= $myMember.id }}">
    <input type="text" name="address.firstName">
    <input type="text" name="address.lastName">
    <input type="text" name="address.street">
    <input type="text" name="address.zip">
    <input type="text" name="address.city">
    <button type="submit">Lieferadresse für Mitarbeiter speichern.</button>
</form>
```

***

### AddressUpdate

Mit dieser Aktion wird eine bestehende Adresse des eingeloggten Benutzers bearbeitet.

**Anwendungsbeispiel**\
Nutzbar auf der Adressverwaltungsseite, wenn ein Kunde eine seiner gespeicherten Adressen aktualisieren möchte.

**Parameter**

| **Name**              | **Beschreibung**                                                               |
| --------------------- | ------------------------------------------------------------------------------ |
| `addressId`           | Die ID der Adresse, die bearbeitet werden soll.                                |
| `address.(fieldname)` | Die einzelnen Felder der Adresse, die aktualisiert werden sollen.              |
| `type`                | Art der Adresse:  - `“bill”` - Rechnungsadresse - `“delivery”` - Lieferadresse |

**Fehlercodes**

| **Fehlercode**     | **Beschreibung**                                                                               |
| ------------------ | ---------------------------------------------------------------------------------------------- |
| `notLoggedIn`      | Der Benutzer ist nicht eingeloggt und es ist kein Opt-In-Token vorhanden.                      |
| `emptyAddress`     | Es wurden keine Adressfelder übergeben.                                                        |
| `invalidAddressId` | Ungültige `addressId` - die Adresse existiert nicht oder gehört nicht zu diesem Benutzerkonto. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.addresses](/frontend/referenz/module/wsAccount#%24wsaccount-addresses)
* [\$wsAccount.loadAddress](/frontend/referenz/module/wsAccount#%24wsaccount-loadaddress)

**Beispiel** das zeigt, wie eine bestehende Adresse anhand ihrer ID bearbeitet wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionAddressUpdate = $wsActions.create("AddressUpdate") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionAddressUpdate.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionAddressUpdate.csrf }}">
    <input type="hidden" name="addressId" value="{{= $myAddress.id }}">
    <input type="hidden" name="type" value="delivery">
    <input type="text" name="address.firstName" value="{{= $myAddress.firstName }}">
    <input type="text" name="address.lastName" value="{{= $myAddress.lastName }}">
    <input type="text" name="address.street" value="{{= $myAddress.street }}">
    <input type="text" name="address.zip" value="{{= $myAddress.zip }}">
    <input type="text" name="address.city" value="{{= $myAddress.city }}">
    <button type="submit">Lieferadresse aktualisieren.</button>
</form>
```

***

### AddressDelete

Mit dieser Aktion wird eine Adresse des eingeloggten Benutzers gelöscht.

**Anwendungsbeispiel**\
Nutzbar auf der Adressverwaltungsseite, wenn ein Kunde eine nicht mehr benötigte Adresse entfernen möchte.

**Parameter**

| **Name**    | **Beschreibung**                              |
| ----------- | --------------------------------------------- |
| `addressId` | Die ID der Adresse, die gelöscht werden soll. |

**Fehlercodes**

| **Fehlercode**     | **Beschreibung**                                                                               |
| ------------------ | ---------------------------------------------------------------------------------------------- |
| `notLoggedIn`      | Der Benutzer ist nicht eingeloggt und es ist kein Opt-In-Token vorhanden.                      |
| `invalidAddressId` | Ungültige `addressId` - die Adresse existiert nicht oder gehört nicht zu diesem Benutzerkonto. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.addresses](/frontend/referenz/module/wsAccount#%24wsaccount-addresses)

**Beispiel** das zeigt, wie eine Adresse über ihre ID gelöscht wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
 {{ var $cActionAddressDelete = $wsActions.create("AddressDelete") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $cActionAddressDelete.id }}">
    <input type="hidden" name="wscsrf" value="{{= $cActionAddressDelete.csrf }}">
    <input type="hidden" name="addressId" value="{{= $cAddress.id }}">

    <button type="submit">Adresse löschen.</button>
</form>
```

***

### SetMainAddress

Mit dieser Aktion wird eine gespeicherte Adresse als Hauptadresse festgelegt. Die Hauptadresse wird im Checkout automatisch vorausgewählt.

**Anwendungsbeispiel**\
Nutzbar auf der Adressverwaltungsseite, damit Kunden ihre bevorzugte Adresse als Standard für zukünftige Bestellungen hinterlegen können.

**Parameter**

| **Name**    | **Beschreibung**                                              |
| ----------- | ------------------------------------------------------------- |
| `addressId` | Die ID der Adresse, die als Hauptadresse gesetzt werden soll. |

**Fehlercodes**

| **Fehlercode**     | **Beschreibung**                                                                        |
| ------------------ | --------------------------------------------------------------------------------------- |
| `notLoggedIn`      | Der Benutzer ist nicht eingeloggt.                                                      |
| `missingAddressId` | Parameter `addressId` fehlt.                                                            |
| `invalidAddressId` | Ungültige `addressId` - die Adresse existiert nicht oder gehört zu einem anderen Konto. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.addresses](/frontend/referenz/module/wsAccount#%24wsaccount-addresses)

**Beispiel** das zeigt, wie eine Adresse per Button als Hauptadresse gesetzt wird, sofern sie es nicht bereits ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionSetMainAddress = $wsActions.create("SetMainAddress") }}

{{ foreach $cAddress in $wsAccount.addresses }}
    {{ if $cAddress.id != $wsAccount.mainAddress.id }}
        <form action="{{= $wsViews.current.url() }}" method="post">
            <input type="hidden" name="wsact" value="{{= $cActionSetMainAddress.id }}">
            <input type="hidden" name="wscsrf" value="{{= $cActionSetMainAddress.csrf }}">
            <input type="hidden" name="addressId" value="{{= $cAddress.id }}">

            <button type="submit">Als Hauptadress festlegen.</button>
        </form>
    {{ /if }}
{{ /foreach }}
```

***

### SetDefaultBillAddress

Mit dieser Aktion wird eine gespeicherte Adresse als Standard-Rechnungsadresse festgelegt. Die Standard-Rechnungsadresse wird im Checkout automatisch als Rechnungsadresse vorausgewählt.

**Anwendungsbeispiel**\
Nutzbar auf der Adressverwaltungsseite, damit Kunden eine bevorzugte Rechnungsadresse als Standard für zukünftige Bestellungen hinterlegen können.

**Parameter**

| **Name**    | **Beschreibung**                                                           |
| ----------- | -------------------------------------------------------------------------- |
| `addressId` | Die ID der Adresse, die als Standard-Rechnungsadresse gesetzt werden soll. |

**Fehlercodes**

| **Fehlercode**     | **Beschreibung**                                                                        |
| ------------------ | --------------------------------------------------------------------------------------- |
| `notLoggedIn`      | Der Benutzer ist nicht eingeloggt.                                                      |
| `missingAddressId` | Parameter `addressId` fehlt.                                                            |
| `invalidAddressId` | Ungültige `addressId` - die Adresse existiert nicht oder gehört zu einem anderen Konto. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.addresses](/frontend/referenz/module/wsAccount#%24wsaccount-addresses)
* [\$wsAccount.defaultBillAddress](/frontend/referenz/module/wsAccount#%24wsaccount-defaultbilladdress)

**Beispiel** das zeigt, wie eine Adresse per Button als Standard-Rechnungsadresse gesetzt wird, sofern sie es nicht bereits ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionSetDefaultBillAddress = $wsActions.create("SetDefaultBillAddress") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionSetDefaultBillAddress.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionSetDefaultBillAddress.csrf }}">
    <input type="hidden" name="addressId" value="{{= $myAddress.id }}">
    <button type="submit">Als Standard-Rechnungsadresse festlegen.</button>
</form>
```

***

### SetDefaultDeliveryAddress

Mit dieser Aktion wird eine gespeicherte Adresse als Standard-Lieferadresse festgelegt. Die Standard-Lieferadresse wird im Checkout automatisch als Lieferadresse vorausgewählt.

**Anwendungsbeispiel**\
Nutzbar auf der Adressverwaltungsseite, damit Kunden eine bevorzugte Lieferadresse als Standard für zukünftige Bestellungen hinterlegen können.

**Parameter**

| **Name**    | **Beschreibung**                                                        |
| ----------- | ----------------------------------------------------------------------- |
| `addressId` | Die ID der Adresse, die als Standard-Lieferadresse gesetzt werden soll. |

**Fehlercodes**

| **Fehlercode**     | **Beschreibung**                                                                        |
| ------------------ | --------------------------------------------------------------------------------------- |
| `notLoggedIn`      | Der Benutzer ist nicht eingeloggt.                                                      |
| `missingAddressId` | Parameter `addressId` fehlt.                                                            |
| `invalidAddressId` | Ungültige `addressId` - die Adresse existiert nicht oder gehört zu einem anderen Konto. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.addresses](/frontend/referenz/module/wsAccount#%24wsaccount-addresses)
* [\$wsAccount.defaultDeliveryAddress](/frontend/referenz/module/wsAccount#\$wsaccount-defaultdeliveryaddress)

**Beispiel** das zeigt, wie eine Adresse per Button als Standard-Lieferadresse gesetzt wird, sofern sie es nicht bereits ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionSetDefaultDeliveryAddress = $wsActions.create("SetDefaultDeliveryAddress") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionSetDefaultDeliveryAddress.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionSetDefaultDeliveryAddress.csrf }}">
    <input type="hidden" name="addressId" value="{{= $myAddress.id }}">
    <button type="submit">Als Standard-Lieferadresse festlegen.</button>
</form>
```

***

### RemoveDefaultBillAddress

Mit dieser Aktion wird die gesetzte Standard-Rechnungsadresse des eingeloggten Benutzers entfernt.

**Anwendungsbeispiel**\
Nutzbar auf der Adressverwaltungsseite, wenn ein Kunde die Standard-Rechnungsadresse zurücksetzen möchte, sodass im Checkout keine Adresse mehr vorausgewählt ist.

**Fehlercodes**

| **Fehlercode** | **Beschreibung**                   |
| -------------- | ---------------------------------- |
| `notLoggedIn`  | Der Benutzer ist nicht eingeloggt. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.addresses](/frontend/referenz/module/wsAccount#%24wsaccount-addresses)
* [\$wsAccount.defaultBillAddress](/frontend/referenz/module/wsAccount#%24wsaccount-defaultbilladdress)

**Beispiel** das zeigt, wie die Standard-Rechnungsadresse über einen Button entfernt wird, sofern eine gesetzt ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionRemoveDefaultBillAddress = $wsActions.create("RemoveDefaultBillAddress") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionRemoveDefaultBillAddress.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionRemoveDefaultBillAddress.csrf }}">
    <button type="submit">Standard-Rechnungsadresse entfernen.</button>
</form>
```

***

### RemoveDefaultDeliveryAddress

Mit dieser Aktion wird die gesetzte Standard-Lieferadresse des eingeloggten Benutzers entfernt.

**Anwendungsbeispiel**\
Nutzbar auf der Adressverwaltungsseite, wenn ein Kunde die Standard-Lieferadresse zurücksetzen möchte, sodass im Checkout keine Adresse mehr vorausgewählt ist.

**Fehlercodes**

| **Fehlercode** | **Beschreibung**                   |
| -------------- | ---------------------------------- |
| `notLoggedIn`  | Der Benutzer ist nicht eingeloggt. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.addresses](/frontend/referenz/module/wsAccount#%24wsaccount-addresses)
* [\$wsAccount.defaultDeliveryAddress](/frontend/referenz/module/wsAccount#\$wsaccount-defaultdeliveryaddress)

**Beispiel** das zeigt, wie die Standard-Lieferadresse über einen Button entfernt wird, sofern eine gesetzt ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
 {{ var $myActionRemoveDefaultDeliveryAddress = $wsActions.create("RemoveDefaultDeliveryAddress") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionRemoveDefaultDeliveryAddress.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionRemoveDefaultDeliveryAddress.csrf }}">
    <button type="submit">Standard-Lieferadresse entfernen.</button>
</form>
```

***

## Kreditkarten

### CreditCardDelete

Mit dieser Aktion wird eine gespeicherte Kreditkarte aus dem Kundenkonto gelöscht.

**Anwendungsbeispiel**\
Nutzbar auf der Kreditkartenverwaltungsseite, auf der eingeloggte Kunden ihre gespeicherten Kreditkarten einsehen und entfernen können.

**Parameter**

| **Name**     | **Beschreibung**                                  |
| ------------ | ------------------------------------------------- |
| `pseudoCCId` | Die ID der Kreditkarte, die gelöscht werden soll. |

**Fehlercodes**

| **Fehlercode**      | **Beschreibung**                                                                                    |
| ------------------- | --------------------------------------------------------------------------------------------------- |
| `notLoggedIn`       | Der Benutzer ist nicht eingeloggt.                                                                  |
| `invalidPseudoCCId` | Ungültige `pseudoCCId` - die Kreditkarte existiert nicht oder gehört nicht zu diesem Benutzerkonto. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.pseudoCreditCards](/frontend/referenz/module/wsAccount#%24wsaccount-pseudocreditcards)

**Beispiel** das zeigt, wie alle gespeicherten Kreditkarten aufgelistet werden und jede einzelne über einen Button gelöscht werden kann.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cCreditCards = $wsAccount.pseudoCreditCards }}
{{ foreach $cCreditCard in $wsAccount.pseudoCreditCards }}
    {{ var $cActionCreditCardDelete = $wsActions.create("CreditCardDelete") }}
    <form method="POST" action="{{= $wsViews.current.url() }}">
        <input type="hidden" name="wscsrf" value="{{= $cActionCreditCardDelete.csrf }}">
        <input type="hidden" name="wsact" value="{{= $cActionCreditCardDelete.id }}">
        <input type="hidden" name="pseudoCCId" value="{{= $cCreditCard.id }}">
        <button type="submit">Kreditkarte löschen.</button>
    </form>
{{ /foreach }}
```

***

## Gast → Konto

### GuestRegister

Mit dieser Aktion wird aus einem Gast-Checkout ein vollwertiges Kundenkonto erstellt. Der Gast gibt dabei ein Passwort an, die E-Mail-Adresse wird automatisch aus den Checkout-Daten übernommen.

**Anwendungsbeispiel**\
Nutzbar auf der Bestellbestätigungsseite nach einem Gast-Checkout, auf der nicht eingeloggte Kunden die Möglichkeit erhalten, sich direkt ein Konto anzulegen.

**Parameter**

| **Name**         | **Beschreibung**                                                                    |
| ---------------- | ----------------------------------------------------------------------------------- |
| `guestMail`      | E-Mail-Adresse des Gast-Kontos, wird automatisch aus den Checkout-Daten übernommen. |
| `password`       | Neues Passwort für das Kundenkonto.                                                 |
| `passwordRepeat` | Wiederholung des Passworts.                                                         |

**Fehlercodes**

| **Fehlercode**        | **Beschreibung**                                                                                                                                       |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `passwordCheckFailed` | Passwort erfüllt nicht die erforderlichen Richtlinien. Wird über Sub-Codes konkretisiert:  - `minlen` = zu wenig Zeichen - `maxlen` = zu viele Zeichen |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)
* [\$wsAccount.email](/frontend/referenz/module/wsAccount#%24wsaccount-email)

**Beispiel** das zeigt, wie nicht eingeloggten Kunden nach einem Gast-Checkout die Möglichkeit geboten wird, ein Kundenkonto anzulegen, inklusive Erfolgsausgabe.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if not $wsAccount.isLoggedIn }}
    {{ var $cGuestRegister = $wsActions.create("GuestRegister") }}

    {{ if $cGuestRegister.success }}
        <div class="alert alert-success">Es wurde ein Konto angelegt.</div>
    {{ /if }}

    {{ if not $cGuestRegister.success }}
        <form action="{{= $wsViews.current.url() }}" method="post">
            <input type="hidden" name="wscsrf" value="{{= $cGuestRegister.csrf }}">
            <input type="hidden" name="wsact" value="{{= $cGuestRegister.id }}">
            <input type="email" name="guestMail" value="{{= $wsCheckout.guestMail }}" readonly>
            <input type="password" name="password">
            <input type="password" name="passwordRepeat">
            <button type="submit">Kundenkonto anlegen.</button>
        </form>
    {{ /if }}
{{ /if }}
```

***

### SaveGuestDataToUser

Mit dieser Aktion wird aus den Daten eines Gast-Checkouts ein vollwertiges Kundenkonto erstellt. Der Gast gibt dabei ein Passwort an und erhält damit Zugang zu einem dauerhaften Konto.

**Anwendungsbeispiel**\
Nutzbar auf der Bestellbestätigungsseite nach einem Gast-Checkout, um dem Kunden die Möglichkeit zu geben, sich direkt ein Konto anzulegen, ohne erneut alle Daten eingeben zu müssen.

**Parameter**

| **Name**         | **Beschreibung**                    |
| ---------------- | ----------------------------------- |
| `id`             | E-Mail-Adress des Gast-Kontos.      |
| `password`       | Neues Passwort für das Kundenkonto. |
| `passwordRepeat` | Wiederholung des Passworts.         |

**Fehlercodes**

| **Fehlercode**        | **Beschreibung**                                                |
| --------------------- | --------------------------------------------------------------- |
| `nonGuestAccount`     | Der Benutzer ist bereits in einem Kundenkonto eingeloggt.       |
| `missingId`           | Parameter `id` fehlt.                                           |
| `missingPassword`     | Parameter `password` fehlt.                                     |
| `passwordMismatch`    | Parameter `password` und `passwordRepeat` sind nicht identisch. |
| `passwordCheckFailed` | Passwortregel-Prüfung ist fehlgeschlagen.                       |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.addresses](/frontend/referenz/module/wsAccount#%24wsaccount-addresses)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie ein Gast-Kunde nach dem Checkout ein dauerhaftes Konto anlegen kann, indem er nur ein Passwort vergeben muss.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $cActionSaveGuestDataToUser = $wsActions.create("SaveGuestDataToUser") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $cActionSaveGuestDataToUser.id }}">
    <input type="hidden" name="wscsrf" value="{{= $cActionSaveGuestDataToUser.csrf }}">
    <input type="hidden" name="id" value="{{= $wsAccount.email }}">

    <input type="password" name="password">
    <input type="password" name="passwordRepeat">

    <button type="submit">Kundenkonto erstellen.</button>
</form>
```

***

## B2B – Mitarbeiterkonten

Alle Aktionen in diesem Abschnitt erfordern Admin-Rechte und stehen nur für Firmenkonten im B2B-Bereich zur Verfügung. Eine Einführung in das Zusammenspiel von Mitarbeiterkonten und Berechtigungsgruppen findet sich im Abschnitt [Konzepte](#konzepte).

### SubAccountCreate

Mit dieser Aktion wird ein neues Mitarbeiterkonto angelegt. An die angegebene E-Mail-Adresse wird automatisch eine [E-Mail](https://dokumentation.websale.de/konfiguration/b2b-business-to-business-b2b#b2b-userinvitation-benutzereinladung) mit einem Link zum Setzen des Passworts gesendet. Für diese Aktion sind Admin-Rechte erforderlich.

**Anwendungsbeispiel**\
Nutzbar auf der Account-Verwaltungsseite, auf der Administratoren neue Mitarbeiterkonten anlegen können.

**Parameter**

| **Name** | **Beschreibung**                                                                                                    |
| -------- | ------------------------------------------------------------------------------------------------------------------- |
| `email`  | E-Mail-Adresse des neuen Mitarbeiterkontos. <br />An diese Adresse wird der Link zum Setzen des Passworts gesendet. |

**Fehlercodes**

| **Fehlercode**         | **Beschreibung**                                                     |
| ---------------------- | -------------------------------------------------------------------- |
| `notLoggedIn`          | Der Benutzer ist nicht eingeloggt.                                   |
| `unauthorized`         | Der Benutzer verfügt nicht über Admin-Rechte.                        |
| `missingId`            | Parameter `email` ist leer.                                          |
| `emailCheckFailed`     | Parameter `email`enthält eine ungültige E-Mail-Adresse.              |
| `accountAlreadyExists` | Es existiert bereits ein Account mit der angegebenen E-Mail-Adresse. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie die Aktion erstellt und in ein Formular eingebunden wird, über das ein neues Mitarbeiterkonto angelegt werden kann.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionSubAccountCreate = $wsActions.create("SubAccountCreate") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionSubAccountCreate.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionSubAccountCreate.csrf }}">
    <input type="email" name="email">
    <button type="submit">Mitarbeiterkonto anlegen</button>
</form>
```

***

### UpdateSubAccount

Mit dieser Aktion werden die Einstellungen des bestehenden Mitarbeiterkontos aktualisiert. Eine Deaktivierung des eigenen Kontos oder das Entziehen der Admin-Rechte ist nicht möglich. Für diese Aktion sind Admin-Rechte erforderlich.

**Anwendungsbeispiel**\
Nutzbar auf der Mitarbeiterverwaltungsseite, auf der Administratoren Rollen und weitere Einstellungen von Mitarbeiterkonten anpassen können.

**Parameter**

| Name                       | Beschreibung                                                                                                                                                                                                                                                                 |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `memberId`                 | Die ID des Mitarbeiterkontos, das aktualisiert werden soll.                                                                                                                                                                                                                  |
| `displayName`              | Anzeigename des Mitarbeiterkontos.                                                                                                                                                                                                                                           |
| `active`                   | Gibt an, ob sich das Mitarbeiterkonto anmelden darf (`true` / `false`).<br />Das eigene Konto kann nicht deaktiviert werden.                                                                                                                                                 |
| `admin`                    | Gibt an, ob das Konto Admin-Rechte besitzt (`true` / `false`).<br />Dem eigenen Konto können keine Admin-Rechte entzogen werden.                                                                                                                                             |
| `privilegeGroupId`         | ID der Berechtigungsgruppe, die dem Mitarbeiterkonto zugewiesen wird.                                                                                                                                                                                                        |
| `defaultAddressVisibility` | Legt fest, welche Sichtbarkeit beim Anlegen neuer Adressen standardmäßig vorausgewählt ist.<br />Mögliche Werte:<br />- `private` (nur für dieses Konto sichtbar)<br />- `shared` (firmenweit freigegeben)                                                                   |
| `allowedSubshops`          | Legt fest, auf welche Subshops das Mitarbeiterkonto Zugriff hat. <br />Die [Subshop-IDs](https://dokumentation.websale.de/frontend/referenz/module/wssubshop#\$wssubshop-subshops) werden als Schlüssel eines JSON-Objekts übergeben, z.B. `{"shop1": true, "shop2": true}.` |

**Fehlercodes**

| Fehlercode                 | Beschreibung                                                                                     |
| -------------------------- | ------------------------------------------------------------------------------------------------ |
| notLoggedIn                | Der Benutzer ist nicht eingeloggt.                                                               |
| unauthorized               | Der Benutzer verfügt nicht über Admin-Rechte.                                                    |
| missingMemberId            | Parameter `memberId` fehlt.                                                                      |
| invalidMemberId            | Ungültige `memberId` - das Mitarbeiterkonto existiert nicht oder gehört nicht zu diesem Account. |
| selfDeactivationNotAllowed | Das eigene Konto kann nicht deaktiviert werden.                                                  |
| selfAdminRemovalNotallowed | Dem eigenen Konto können keine Admin-Rechte entzogen werden.                                     |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](https://dokumentation.websale.de/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](https://dokumentation.websale.de/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)
* [\$wsSubshop.subshops](https://dokumentation.websale.de/frontend/referenz/module/wssubshop#\$wssubshop-subshops)

**Beispiel** das zeigt, wie die Einstellungen eines Mitarbeiterkontos über ein Formular aktualisiert werden.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionUpdateSubAccount = $wsActions.create("UpdateSubAccount") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionUpdateSubAccount.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionUpdateSubAccount.csrf }}">
    <input type="hidden" name="memberId" value="{{= $myMember.id }}">
    <input type="text" name="displayName" value="{{= $myMember.displayName }}">
    <input type="hidden" name="privilegeGroupId" value="{{= $myMember.privilegeGroupId }}">
    <input type="hidden" name="defaultAddressVisibility" value="private">
    <input type="hidden" name="allowedSubshops" value='{"shop1": true, "shop2": true}'>
    <label>
        <input type="checkbox" name="active" value="true" {{ if $myMember.active }}checked{{ /if }}>
        Aktiv
    </label>
    <label>
        <input type="checkbox" name="admin" value="true" {{ if $myMember.admin }}checked{{ /if }}>
        Admin
    </label>
    <button type="submit">Mitarbeiterkonto speichern.</button>
</form>
```

***

### SubAccountDelete

Mit dieser Aktion wird ein bestehendes Mitarbeiterkonto gelöscht. Das eigene Konto sowie Konten mit Admin-Rechten können nicht gelöscht werden. Für diese Aktion sind Admin-Rechte erforderlich.

**Anwendungsbeispiel**\
Nutzbar auf der Mitarbeiterverwaltungsseite, auf der Administratoren nicht mehr benötigte Mitarbeiterkonten entfernen können.

**Parameter**

| Name       | Beschreibung                                            |
| ---------- | ------------------------------------------------------- |
| `memberId` | Die ID des Mitarbeiterkontos, das gelöscht werden soll. |

**Fehlercodes**

| Fehlercode           | Beschreibung                                                                                         |
| -------------------- | ---------------------------------------------------------------------------------------------------- |
| `notLoggedIn`        | Der Benutzer ist nicht eingeloggt.                                                                   |
| `unauthorized`       | Der Benutzer verfügt nicht über Admin-Rechte.                                                        |
| `missingMemberId`    | Parameter `memberId `fehlt.                                                                          |
| `invalidMemberId`    | Ungültige `memberId `- das Mitarbeiterkonto existiert nicht oder gehört nicht zu diesem Account.     |
| `deletionNotAllowed` | Das Konto darf nicht gelöscht werden, weil es sich um das eigene Konto oder ein Admin-Konto handelt. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](https://dokumentation.websale.de/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](https://dokumentation.websale.de/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie ein Mitarbeiterkonto über seine ID gelöscht wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionSubAccountDelete = $wsActions.create("SubAccountDelete") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionSubAccountDelete.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionSubAccountDelete.csrf }}">
    <input type="hidden" name="memberId" value="{{= $myMember.id }}">
    <button type="submit">Mitarbeiterkonto löschen.</button>
</form>
```

***

### AcceptInvitation

Mit dieser Aktion nimmt ein B2B-Firmenkunde eine Einladung per Double-Opt-In-Verfahren an. Der Token ist in einem Link enthalten, den der Kunde per E-Mail erhält. Nach erfolgreicher Verifizierung hat das Konto vollen Zugriff auf den Shop.

**Anwendungsbeispiel**\
Nutzbar auf der Bestätigungsseite, auf die der eingeladene Kunde nach Klick auf den Einladungslink in der E-Mail weitergeleitet wird.

**Fehlercodes**

| **Fehlercode**     | **Beschreibung**                                                     |
| ------------------ | -------------------------------------------------------------------- |
| `unauthorized`     | Es wurde kein gültiger Opt-In-Token übergeben.                       |
| `invalidAccountId` | Der Double-Opt-In-Token konnte keinem Kundenkonto zugeordnet werden. |
| `actionNotAllowed` | Der Double-Opt-In-Token ist ungültig oder passt nicht zum Konto.     |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](/frontend/referenz/module/wsAccount)
* [\$wsAccount.isAccountVerified](/frontend/referenz/module/wsAccount#%24wsaccount-isaccountverified)

**Beispiel** das zeigt, wie nach erfolgreicher Annahme der Einladung eine Bestätigungsmeldung angezeigt wird.

```text theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsActions.current.name == "AcceptInvitation" and $wsActions.current.success }}
    <div class="alert alert-info">Einladung wurde angenommen.</div>
{{ /if }}
```

***

## B2B – Berechtigungsgruppen

Alle Aktionen in diesem Abschnitt erfordern Admin-Rechte und stehen nur für Firmenkonten im B2B-Bereich zur Verfügung. Zum Zusammenspiel mit Mitarbeiterkonten siehe Abschnitt [Konzepte](#konzepte).

### CreatePrivilegeGroup

Mit dieser Aktion wird eine neue Berechtigungsgruppe erstellt. Für diese Aktion sind Admin-Rechte erforderlich.

**Anwendungsbeispiel**\
Nutzbar auf der Berechtigungsverwaltungsseite, auf der Administratoren neue Gruppen mit definierten Rechten für Mitarbeiterkonten erstellen können.

**Parameter**

| Name   | Beschreibung                        |
| ------ | ----------------------------------- |
| `name` | Name der neuen Berechtigungsgruppe. |

**Fehlercodes**

| Fehlercode     | Beschreibung                                  |
| -------------- | --------------------------------------------- |
| `notLoggedIn`  | Der Benutzer ist nicht eingeloggt.            |
| `unauthorized` | Der Benutzer verfügt nicht über Admin-Rechte. |
| `missingName`  | Parameter `name` fehlt oder ist leer.         |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](https://dokumentation.websale.de/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](https://dokumentation.websale.de/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie eine neue Berechtigungsgruppe über ein Formular angelegt wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionCreatePrivilegeGroup = $wsActions.create("CreatePrivilegeGroup") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionCreatePrivilegeGroup.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionCreatePrivilegeGroup.csrf }}">
    <input type="text" name="name">
    <button type="submit">Berechtigungsgruppe anlegen.</button>
</form>
```

***

### UpdatePrivileges

Mit dieser Aktion wird eine Berechtigungsgruppe aktualisiert. Für diese Aktion sind Admin-Rechte erforderlich.

**Anwendungsbeispiel**\
Nutzbar auf der Berechtigungsverwaltungsseite, auf der Administratoren Rechte und Einschränkungen für Berechtigungsgruppen definieren können.

**Parameter**

| Name            | Beschreibung                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `privilegeId`   | Die ID der Berechtigungsgruppe, die aktualisiert werden soll.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `createMissing` | Gibt an, ob die Gruppe automatisch erstellt werden soll, falls sie nicht existiert.<br />Mögliche Werte:<br />- `yes`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `type`          | Art der Berechtigungsgruppe: <br />- `global` (shopweit)<br />- `account` (kontobezogen)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `privileges`    | JSON-Objekt mit den Berechtigungsfeldern. <br />Mögliche Felder:<br />- `allowedPaymentMethods` (JSON-Objekt mit erlaubten Zahlungsarten: Zahlarten-ID als Schlüssel, `"1"` als Wert schaltet die Zahlart frei, alle anderen Werte werden ignoriert)<br />- `paymentLimitPerOrder` (maximaler Bestellwert pro Bestellung)<br />- `paymentLimit` (globale Budgetgrenze über alle Bestellungen seit Limitsetzung)<br />- `blockedTemplates` (gesperrte Templates / Seiten der Gruppe) <br />- `blockedUrls` (gesperrte URLs der Gruppe)<br />- `editableFields` (bearbeitbare Felder der Gruppe)<br />- `groupName` (nur relevant bei `type = global`) |

Die beiden Budgetgrenzen wirken zusammen: `paymentLimitPerOrder` begrenzt jede einzelne Bestellung, `paymentLimit` die kumulierte Ausgabensumme. Beide Werte werden im Frontend schreibgeschützt direkt am Account gelesen, über [\$wsAccount.paymentLimit](/frontend/referenz/module/wsAccount) bzw. `$wsAccount.paymentLimitPerOrder`.

Über `allowedPaymentMethods` können nur Zahlarten freigeschaltet werden, die auch für das Firmenkonto selbst verfügbar sind: Zahlarten, die für das Konto gesperrt sind (`blockedPaymentMethods`) oder in der Shop-Konfiguration mit `availableByDefault: false` angelegt und nicht gezielt für das Konto freigeschaltet wurden (`enabledPaymentMethods`), können keiner Berechtigungsgruppe zugewiesen werden (siehe [Konfiguration Zahlungsmethoden](/konfiguration/payment-zahlungsmethoden)).

**Fehlercodes**

| Fehlercode                         | Beschreibung                                                                                                                 |
| ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `notLoggedIn`                      | Der Benutzer ist nicht eingeloggt.                                                                                           |
| `unauthorized`                     | Der Benutzer verfügt nicht über Admin-Rechte.                                                                                |
| `missingPrivilegeId`               | Parameter `privilegeId` fehlt.                                                                                               |
| `invalidPrivilegeId`               | Ungültige `privilegeId` - die Gruppe existiert nicht und `createMissing` ist nicht gesetzt.                                  |
| `invalidType`                      | Parameter `type` enthält einen ungültigen Wert.                                                                              |
| `paymentMethodNotAllowedByAccount` | Eine Zahlart in `allowedPaymentMethods` ist für das Firmenkonto selbst nicht verfügbar (gesperrt oder nicht freigeschaltet). |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](https://dokumentation.websale.de/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](https://dokumentation.websale.de/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)
* [\$wsAccount.paymentLimit](/frontend/referenz/module/wsAccount)

**Beispiel** das zeigt, wie die Berechtigungen einer Gruppe inklusive globaler und bestellbezogener Budgetgrenze aktualisiert werden.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionUpdatePrivileges = $wsActions.create("UpdatePrivileges") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionUpdatePrivileges.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionUpdatePrivileges.csrf }}">
    <input type="hidden" name="privilegeId" value="{{= $myPrivilegeGroup.id }}">
    <input type="hidden" name="createMissing" value="yes">
    <input type="hidden" name="type" value="global">
    <input type="hidden" name="privileges" value='{"groupName": "Einkauf", "allowedPaymentMethods": {"invoice": "1", "prepayment": "1"}, "paymentLimitPerOrder": 500, "paymentLimit": 5000}'>
    <button type="submit">Berechtigungen speichern.</button>
</form>
```

***

### DeletePrivilegeGroup

Mit dieser Aktion wird eine bestehende Berechtigungsgruppe gelöscht. Eine Gruppe kann jedoch nicht gelöscht werden, solange ihr noch Mitarbeiterkonten zugewiesen sind. Für diese Aktion sind Admin-Rechte erforderlich.

**Anwendungsbeispiel**\
Nutzbar auf der Berechtigungsverwaltungsseite, wenn eine nicht mehr benötigte Berechtigungsgruppe entfernt werden soll.

**Parameter**

| Name | Beschreibung                                              |
| ---- | --------------------------------------------------------- |
| `id` | Die ID der Berechtigungsgruppe, die gelöscht werden soll. |

**Fehlercodes**

| Fehlercode        | Beschreibung                                                                                       |
| ----------------- | -------------------------------------------------------------------------------------------------- |
| `notLoggedIn`     | Der Benutzer ist nicht eingeloggt.                                                                 |
| `unauthorized`    | Der Benutzer verfügt nicht über Admin-Rechte.                                                      |
| `missingId`       | Parameter `id` fehlt.                                                                              |
| `invalidId`       | Ungültige `id` - die Berechtigungsgruppe existiert nicht.                                          |
| `groupHasMembers` | Die Berechtigungsgruppe kann nicht gelöscht werden, da ihr noch Mitarbeiterkonten zugewiesen sind. |

**Zugehörige Module, Variablen & Methoden**

* [\$wsAccount](https://dokumentation.websale.de/frontend/referenz/module/wsAccount)
* [\$wsAccount.isLoggedIn](https://dokumentation.websale.de/frontend/referenz/module/wsAccount#%24wsaccount-isloggedin)

**Beispiel** das zeigt, wie eine Berechtigungsgruppe über ihre ID gelöscht wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ var $myActionDeletePrivilegeGroup = $wsActions.create("DeletePrivilegeGroup") }}
<form action="{{= $wsViews.current.url() }}" method="post">
    <input type="hidden" name="wsact" value="{{= $myActionDeletePrivilegeGroup.id }}">
    <input type="hidden" name="wscsrf" value="{{= $myActionDeletePrivilegeGroup.csrf }}">
    <input type="hidden" name="id" value="{{= $myPrivilegeGroup.id }}">
    <button type="submit">Berechtigungsgruppe löschen.</button>
</form>
```


## Related topics

- [accounts - Benutzerkonten](/konfiguration/accounts-benutzerkonten.md)
- [$wsAccount - Account & Adressdaten](/frontend/referenz/module/wsAccount.md)
- [Konfigurations-Deeplinks](/admin-interface/konfigurations-deeplinks.md)
- [Bestellablauf](/frontend/funktionsubersicht/bestellablauf.md)
- [app - WEBSALE APP](/konfiguration/app-websale-app.md)
