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

# Adressen und Eingabeprüfungen

> Welche Adressfelder der Shop abfragt, wie lang die Eingaben sein dürfen, wie Felder sich gegenseitig ein- und ausblenden oder umbenennen, und wie die Eingaben geprüft werden.

Die Adressabfrage ist der Teil des Shops, in dem am meisten schiefgehen kann. Ein Feld, das nicht angezeigt wird, kann auch nicht ausgefüllt werden. Ein Feld, das geprüft wird, obwohl es gar nicht sichtbar ist, blockiert die Bestellung. Und ein Feld, das die Warenwirtschaft nur 35 Zeichen lang annimmt, verursacht Ärger erst nach dem Kauf.

Die Abschnitte auf dieser Seite bauen deshalb aufeinander auf. Zuerst legen Sie fest, welche Felder es überhaupt gibt. Dann, wie lang die Eingaben sein dürfen und welche Auswahllisten dahinterstehen. Danach, wann ein Feld sichtbar ist oder anders heißt. Zum Schluss, wie die Eingabe geprüft wird.

Referenz: Shopkonfiguration shop.config, Übersicht aller Abschnitte

## AddressFields-Txt

Legt fest, welche Daten bei der **Rechnungsadresse** abgefragt werden. Ein Feld gilt als aktiviert, sobald hinter dem Gleichheitszeichen ein Wert steht. Dieser Wert ist zugleich die Bezeichnung, die im Template ausgegeben werden kann.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AddressFields-Txt>
   Salutation = Anrede
   FirstName  = Vorname
   LastName   = Name
   Street1    = Straße
   Street2    = Hausnummer
   Zip        = PLZ
   City       = Ort
   Country    = Land
   E-Mail     = E-Mail-Adresse
   Company    =
</AddressFields-Txt>
```

Im Beispiel ist `Company` **nicht** aktiviert, weil hinter dem Gleichheitszeichen nichts steht. Das Feld lässt sich im Template nicht platzieren.

### Name und Anrede

| Parameter | Feld |
| - | - |
| `Salutation` | Auswahlliste für die Anrede, gefüllt aus der Anreden-Konfiguration |
| `SalutationCode` | Anredecode, gefüllt aus salutation.dat |
| `Title` | Auswahlliste für den Titel, gefüllt aus title.dat |
| `FirstName` | Vorname |
| `LastName` | Nachname |
| `Company` | Firmenbezeichnung |
| `Number` | Kundennummer |
| `DateOfBirth` | Geburtsdatum. Das Shopsystem erzeugt daraus automatisch drei Auswahllisten für Tag, Monat und Jahr |

### Anschrift

| Parameter | Feld |
| - | - |
| `Street1` | Straße |
| `Street2` | Hausnummer |
| `Zip` | Postleitzahl |
| `City` | Ort |
| `Department` | Abteilung |
| `PostOfficeBox` | Postfach |
| `PostOfficeBoxZip` | Postleitzahl des Postfachs |
| `State` | Bundesland oder Staat |
| `Country` | Auswahlliste für das Land, gefüllt aus country.dat |

### Erreichbarkeit

| Parameter | Feld |
| - | - |
| `Phone` | Telefon |
| `BusinessPhone` | Telefon geschäftlich |
| `MobilePhone` | Mobiltelefon |
| `Fax` | Telefax |
| `BusinessFax` | Telefax geschäftlich |
| `E-Mail` | E-Mail-Adresse |
| `E-Mail2` | zweite E-Mail-Adresse, beispielsweise für den Rechnungsversand |

### Weitere Felder

| Parameter | Feld |
| - | - |
| `TaxID` | Umsatzsteuer-Identifikationsnummer |
| `Suffix1` bis `Suffix50` | frei verwendbare Felder. Sie lassen sich auch als Auswahllisten einsetzen |
| `IdentityCard1` bis `IdentityCard5` | Personalausweisnummer |
| `PassportNumber1` | Reisepassnummer |
| `UserDefList-1` bis `UserDefList-3` | frei definierbare Auswahllisten. Veraltet |

> [!WARNING]
>
> `UserDefList-1` bis `UserDefList-3` sind veraltet und werden nicht mehr unterstützt. Verwenden Sie stattdessen die Suffixfelder mit `A-Suffix`-Auswahllisten. Die Auswahl in einer UserDef-Liste wird zwar in die Bestelldaten übergeben, aber nicht in den Kundendaten gespeichert.

Ein Feld nur zu aktivieren genügt nicht, es muss auch im Template platziert werden. Umgekehrt gilt: Ein Feld, das hier keinen Wert hat, lässt sich im Template nicht verwenden, und auch Sichtbarkeitsregeln oder Eingabeprüfungen greifen darauf nicht.

Felder, die der Käufer nicht ändern darf, legen Sie nicht hier fest, sondern im Abschnitt `AddressFields-ReadOnly`.

Wegweiser: [Rechnungsadresse abfragen, Prüfungen von Adressdaten festlegen, USt-IdNr. abfragen, prüfen und auswerten](https://dokumentation.websale.de/v8s/adressdaten/rechnungsadresse-abfragen.md)

## DeliveryAddressFields-Txt

Dasselbe für die **abweichende Lieferadresse**. Die Felder entsprechen denen der Rechnungsadresse, mit drei Ausnahmen.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<DeliveryAddressFields-Txt>
   Salutation = Anrede
   Company    = Firma / Institution
   FirstName  = Vorname
   LastName   = Name
   Street1    = Straße, Nr.
   Zip        = PLZ
   City       = Ort
   Country    = Land
</DeliveryAddressFields-Txt>
```

| Feld der Rechnungsadresse | In der Lieferadresse |
| - | - |
| `Number` | nicht vorhanden |
| `E-Mail2` | nicht vorhanden |
| `TaxID` | nicht vorhanden |
| `IdentityCard1` bis `5`, `PassportNumber1` | nicht vorhanden |
| `UserDefList-1` bis `3` | nicht vorhanden |

Alle übrigen Felder einschließlich `Suffix1` bis `Suffix50` gibt es in beiden Adressen.

Wegweiser: [Abweichende Lieferadresse abfragen, Prüfungen von Adressdaten festlegen](https://dokumentation.websale.de/v8s/adressdaten/abweichende-lieferadresse-abfragen.md)

## AddressMaxInputLen

Begrenzt die Eingabelänge je Feld. Das ist vor allem dann wichtig, wenn die Bestelldaten in eine Warenwirtschaft laufen, die ihrerseits Längengrenzen hat.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AddressMaxInputLen>
   Company          = 45
   FirstName        = 45
   LastName         = 45
   Street1          = 45
   Street2          = 45
   Zip              = 12
   City             = 45
   PostOfficeBoxZip = 12
   IdentityCard1    = 11
   IdentityCard2    = 7
   IdentityCard3    = 8
   IdentityCard4    = 1
   PassportNumber1  = 27
</AddressMaxInputLen>
```

Die Parameternamen sind dieselben technischen Feldnamen wie in `AddressFields-Txt`. Die Vorgabe liegt bei 45 Zeichen, bei Postleitzahlen bei 12.

> [!WARNING]
>
> Die maximale Eingabelänge darf höchstens 256 Zeichen betragen.

`IdentityCard4` steht im Standard auf 1, weil dort nur die Prüfziffer erwartet wird. Soll bei neuen Personalausweisen zusätzlich die vierstellige Versionsnummer eingegeben werden, setzen Sie den Wert auf 5.

Wegweiser: [Grundeinstellungen für Rechnungs- und Lieferadresse festlegen](https://dokumentation.websale.de/v8s/adressdaten/einstellungen-fuer-rechnungs-und-lieferadressen-festlegen.md)

## A-Suffix1 bis A-Suffix50

Macht aus einem Suffixfeld der Rechnungsadresse eine Auswahlliste. Damit stellen Sie dem Käufer Fragen, die er aus vorgegebenen Antworten beantwortet.

Jeder Abschnitt gehört zu genau einem Suffixfeld: `A-Suffix1` füllt die Liste für `Suffix1`, `A-Suffix2` die für `Suffix2` und so weiter.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<A-Suffix1>
   <+Entry>
      Name  = Privatkunde
      Value = private
   </+Entry>
   <+Entry>
      Name  = Geschäftskunde
      Value = business
   </+Entry>
</A-Suffix1>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `+Entry` | Ein Eintrag der Auswahlliste. Bis zu 500 Einträge je Liste. | |
| `Name` | Beschreibung des Eintrags. Erscheint in der Anzeige und im lesbaren Format der Bestellung. | beliebiger Text |
| `Value` | Optional. Kennung des Eintrags. Wird im technischen Format der Bestellung verwendet und in den Kundendaten gespeichert. | beliebige Zeichenkette |

Trennen Sie `Name` und `Value` bewusst. `Name` ist der Text, den der Käufer liest, und er darf sich ändern. `Value` ist der Wert, mit dem Ihre Warenwirtschaft arbeitet, und er sollte stabil bleiben. Ohne `Value` wandert der Anzeigetext in die technischen Bestelldaten, und jede Textänderung schlägt dort durch.

> [!WARNING]
>
> Bei Verwendung von Paymorrow und einer Auswahlliste für die Rechtsform: Paymorrow akzeptiert keine Werte, die ausschließlich aus Ziffern bestehen. `01` geht also nicht. Die zulässigen Werte erfahren Sie von Paymorrow.

Wegweiser: [Auswahllisten der Adressdaten, Paymorrow](https://dokumentation.websale.de/v8s/adressdaten/auswahllisten-der-adressdaten.md)

## D-Suffix1 bis D-Suffix50

Dasselbe für die Suffixfelder der **Lieferadresse**. Aufbau und Parameter sind identisch.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<D-Suffix1>
   <+Entry>
      Name  = Postalische Lieferadresse
      Value = postal
   </+Entry>
   <+Entry>
      Name  = DHL-Packstation
      Value = packstation
   </+Entry>
</D-Suffix1>
```

Die Listen der Rechnungs- und der Lieferadresse sind voneinander unabhängig. `A-Suffix1` und `D-Suffix1` können völlig verschiedene Einträge haben, auch wenn beide das Feld `Suffix1` füllen.

Wegweiser: [Auswahllisten der Adressdaten](https://dokumentation.websale.de/v8s/adressdaten/auswahllisten-der-adressdaten.md)

## AddressFields-Standards und DeliveryAddressFields-Standards

Legt fest, mit welchem Eintrag eine Auswahlliste vorbelegt ist, wenn der Käufer die Seite zum ersten Mal sieht.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AddressFields-Standards>
   Suffix1 = Privatkunde
</AddressFields-Standards>

<DeliveryAddressFields-Standards>
   Suffix1 = Postalische Lieferadresse
</DeliveryAddressFields-Standards>
```

Links steht der technische Feldname, rechts der Eintrag, mit dem die Liste starten soll.

> [!WARNING]
>
> Rechts steht der **Name** des Eintrags, nicht sein `Value`. Haben Sie in `A-Suffix1` einen Eintrag mit `Name = Privatkunde` und `Value = private`, dann gehört hier `Privatkunde` hin. Ändern Sie später den Anzeigetext der Liste, müssen Sie die Vorbelegung mitändern, sonst greift sie ins Leere.

Wegweiser: [Auswahl zwischen postalischer Lieferadresse und Packstation](https://dokumentation.websale.de/v8s/adressdaten/auswahl-zwischen-postalischer-lieferadresse-und-packstation.md)

## AddressFields-ReadOnly

Legt fest, welche Felder der Käufer sehen, aber nicht ändern darf. Typischer Fall ist die Kundennummer, die aus der Warenwirtschaft kommt.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AddressFields-ReadOnly>
   <+Fields>
      AddressField = Number
      AddressType  = bill
   </+Fields>
   <+Fields>
      AddressField = Suffix1,Suffix2,Suffix3
      AddressType  = both
   </+Fields>
</AddressFields-ReadOnly>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `AddressField` | Kommaseparierte Liste technischer Feldnamen. Pflichtangabe. | technische Feldnamen |
| `AddressType` | Für welche Adresse die Sperre gilt. | `both`, `bill`, `delivery`. Standard `both` |

Richtig sind `AddressField` und `AddressType`, wie in den Beispielen derselben Seite.

Wegweiser: [Vom Käufer nicht änderbare Kundendaten festlegen](https://dokumentation.websale.de/v8s/adressdaten/vom-kaeufer-nicht-aenderbare-kundendaten-festlegen.md)

## AddressFields-Actions

Benennt die Felder, bei deren Eingabe das Template neu geladen werden muss, weil sich dadurch andere Felder ändern.

Ohne diesen Abschnitt greifen die Regeln aus `AddressFields-InputVisibility` und `AddressFields-AlternativeText` erst beim nächsten Seitenwechsel, nicht unmittelbar nach der Eingabe.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AddressFields-Actions>
   <+FieldAction>
      AddressField = Company
      AddressType  = bill
   </+FieldAction>
</AddressFields-Actions>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `AddressField` | Kommaseparierte Liste technischer Feldnamen, die eine Aktion auslösen. | technische Feldnamen |
| `AddressType` | Für welche Adresse das gilt. | `both`, `bill`, `delivery`. Standard `both` |

Im Beispiel soll das Feld `TaxID` eingeblendet werden, sobald `Company` gefüllt ist. Dafür muss **`Company`** hier eingetragen werden, denn dieses Feld löst die Aktion aus. `TaxID` gehört nicht in diesen Abschnitt.

> [!WARNING]
>
> Die häufigste Fehlbedienung ist, hier das Feld einzutragen, das ein- oder ausgeblendet werden soll. Eingetragen gehört das Feld, auf dessen Eingabe reagiert wird.

Das Shopsystem ergänzt diese Liste selbst um alle Felder, die in einer Bedingung von `AddressFields-AlternativeText`, `AddressFields-InputVisibility` oder in einer Mindestlängenprüfung vorkommen. Vieles greift also auch ohne eigenen Eintrag. Verlassen Sie sich darauf nicht, sondern tragen Sie die auslösenden Felder ein.

Wegweiser: [Auswahl zwischen Privat- und Geschäftsadresse](https://dokumentation.websale.de/v8s/adressdaten/auswahl-zwischen-privat-und-geschaeftsadresse.md)

## AddressFields-AlternativeText

Benennt ein Feld abhängig von der Eingabe in einem anderen Feld um. Der klassische Fall: Aus "Straße" wird "Packstation Nr.", sobald der Käufer als Lieferart die Packstation wählt.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AddressFields-AlternativeText>
   <+Alternative>
      AddressField = Street1
      AddressType  = delivery
      Text         = Packstation Nr.
      <+Condition>
         Field = Suffix1
         Type  = value
         Value = DHL-Packstation
      </+Condition>
   </+Alternative>
</AddressFields-AlternativeText>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `AddressField` | Kommaseparierte Liste der Felder, die umbenannt werden. | technische Feldnamen |
| `AddressType` | Für welche Adresse das gilt. | `both`, `bill`, `delivery`. Standard `both` |
| `Text` | Die neue Bezeichnung. | beliebiger Text |
| `+Condition` | Bedingung, unter der die Umbenennung greift. Mehrere Bedingungen sind UND-verknüpft. | |

Die Parameter innerhalb von `+Condition` sind dieselben wie bei `AddressFields-InputVisibility` und stehen im Abschnitt [Bedingungen](#bedingungen-in-condition) weiter unten.

Mehrere `+Condition`-Blöcke innerhalb eines `+Alternative` sind **UND**-verknüpft. Für eine ODER-Verknüpfung legen Sie mehrere `+Alternative`-Blöcke mit demselben `AddressField` und demselben `Text` an.

Wegweiser: [Auswahl zwischen Privat- und Geschäftsadresse](https://dokumentation.websale.de/v8s/adressdaten/auswahl-zwischen-privat-und-geschaeftsadresse.md)

## AddressFields-InputVisibility

Blendet ein Feld abhängig von der Eingabe in einem anderen Feld ein oder aus. Das meistgenutzte Beispiel ist die Umsatzsteuer-Identifikationsnummer, die nur Firmenkunden sehen sollen.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AddressFields-InputVisibility>
   <+FieldVisibility>
      AddressField  = TaxID
      AddressType   = bill
      Visible       = yes
      ResetIfHidden = yes
      <+Condition>
         Field = Company
         Type  = filled
      </+Condition>
   </+FieldVisibility>
</AddressFields-InputVisibility>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `AddressField` | Kommaseparierte Liste der betroffenen Felder. Pflichtangabe. | technische Feldnamen |
| `AddressType` | Für welche Adresse das gilt. | `both`, `bill`, `delivery`. Standard `both` |
| `Visible` | Ob das Feld bei erfüllter Bedingung sichtbar ist oder eben nicht. | `yes`, `no`. Standard `no` |
| `ResetIfHidden` | Löscht die Eingabe, sobald das Feld ausgeblendet wird. | `yes`, `no`. Standard `yes` |
| `+Condition` | Bedingung. Mehrere sind UND-verknüpft. | |
| `BasketConditions` | Unterabschnitt mit Bedingungen, die sich auf den Warenkorb beziehen statt auf Adressfelder. | |

> [!WARNING]
>
> Ein Feld gilt als **ausgeblendet**, wenn eine der beiden folgenden Kombinationen zutrifft:
>
> * `Visible = no` und die Bedingungen sind **erfüllt**
> * `Visible = yes` und die Bedingungen sind **nicht erfüllt**
>
> Die zweite Kombination ist die, die in der Praxis überrascht. Eine Regel mit `Visible = yes` blendet das Feld also nicht nur ein, sie blendet es zugleich in allen anderen Fällen aus.
>
> Mit `ResetIfHidden = yes`, dem Standard, verliert der Käufer seine Eingabe, sobald das Feld ausgeblendet wird. Beim Zurücksetzen eines Felds leert das Shopsystem zusätzlich das jeweils zugehörige Gegenstück: bei `Salutation` auch `SalutationCode`, bei `Title` auch den Titelcode, bei `Country` auch den Ländercode, und jeweils umgekehrt.

Die Regel wirkt nur auf Felder, die in `AddressFields-Txt` beziehungsweise `DeliveryAddressFields-Txt` aktiviert sind. Eine Sichtbarkeitsregel für ein Feld ohne Bezeichnung läuft ins Leere, ohne dass eine Meldung erscheint. Ebenso wird ein `+FieldVisibility`-Block ohne `AddressField` stillschweigend übersprungen.

Damit machen Sie die Sichtbarkeit eines Adressfelds vom Inhalt des Warenkorbs abhängig statt von einer anderen Adresseingabe.

### Vier typische Fälle

**Umsatzsteuer nur bei gefüllter Firma**

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<+FieldVisibility>
   AddressField  = TaxID
   AddressType   = bill
   Visible       = yes
   ResetIfHidden = yes
   <+Condition>
      Field = Company
      Type  = filled
   </+Condition>
</+FieldVisibility>
```

**Umsatzsteuer nur bei gefüllter Firma und Anrede "Firma"**

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<+FieldVisibility>
   AddressField  = TaxID
   AddressType   = bill
   Visible       = yes
   ResetIfHidden = yes
   <+Condition>
      Field = Company
      Type  = filled
   </+Condition>
   <+Condition>
      Field = Salutation
      Type  = value
      Value = Firma
   </+Condition>
</+FieldVisibility>
```

**Umsatzsteuer ausblenden, wenn Firma leer ist und das Land nicht Großbritannien**

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<+FieldVisibility>
   AddressField  = TaxID
   AddressType   = bill
   Visible       = no
   ResetIfHidden = yes
   <+Condition>
      Field = Company
      Type  = empty
   </+Condition>
   <+Condition>
      Field = Country
      Type  = notvalue
      Value = United Kingdom
   </+Condition>
</+FieldVisibility>
```

**Registernummer nicht bei bestimmten Rechtsformen**

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<+FieldVisibility>
   AddressField  = Suffix27
   AddressType   = bill
   Visible       = no
   ResetIfHidden = yes
   <+Condition>
      Field = Suffix25
      Type  = inlist
      Value = Einzelfirma,Freiberufler,GbR,Sonstige Personengesellschaft
   </+Condition>
</+FieldVisibility>
```

Wegweiser: [Auswahl zwischen postalischer Lieferadresse und Packstation, Auswahl zwischen Privat- und Geschäftsadresse](https://dokumentation.websale.de/v8s/adressdaten/auswahl-zwischen-postalischer-lieferadresse-und-packstation.md)

## Bedingungen in +Condition

Die Unterabschnitte `+Condition` haben in `AddressFields-AlternativeText`, `AddressFields-InputVisibility` und `InputCheck` denselben Aufbau.

| Parameter | Zweck | Werte |
| - | - | - |
| `Field` | Technischer Feldname des geprüften Felds. | technischer Feldname |
| `Type` | Art der Prüfung, siehe Tabelle unten. | Standard `filled` |
| `Value` | Vergleichswert oder Liste, je nach `Type`. | |
| `BasketBehavior` | Ob ein Produkt im Warenkorb die Bedingung erfüllen muss oder alle. | `match-all`, `match-once`. Standard `match-all` |

| `Type` | Die Bedingung trifft zu, wenn |
| - | - |
| `filled` | das Feld gefüllt ist |
| `empty` | das Feld leer ist |
| `value` | der Wert des Felds `Value` entspricht |
| `notvalue` | der Wert des Felds `Value` nicht entspricht |
| `inlist` | der Wert des Felds in der Liste `Value` steht |
| `notinlist` | der Wert des Felds nicht in der Liste `Value` steht |
| `prefix` | der Wert des Felds mit `Value` beginnt |
| `notprefix` | der Wert des Felds nicht mit `Value` beginnt |
| `includedinlist` | der Wert aus `Value` in der Werteliste des Produktdatenfelds steht |
| `notincludedinlist` | der Wert aus `Value` nicht in dieser Werteliste steht |
| `matchsimplewildcard` | der Wert des Felds auf `Value` mit Platzhaltern passt |
| `notmatchsimplewildcard` | er nicht darauf passt |

Bei den beiden Wildcard-Typen steht `?` für genau ein Zeichen an beliebiger Stelle und `*` für beliebig viele Zeichen, allerdings nur am Ende.

## InputCheck

Legt fest, wie die Eingaben in den Adressfeldern geprüft werden. Der Abschnitt ist dreiteilig: die Fehlermeldungen, eine Standardbehandlung und beliebig viele Prüfregeln.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<InputCheck>
   <ErrorMessages>
      Default    = Bitte überprüfen Sie Ihre Eingabe in ~FieldName~ und versuchen Sie es erneut.
      emptyerror = Bitte füllen Sie das Feld ~FieldName~ aus.
   </ErrorMessages>

   <InputCheckDefaults>
      RemoveSigns = "$"
   </InputCheckDefaults>

   <+InputCheck>
      AddressField   = FirstName,LastName,Street1
      AddressType    = bill
      Type           = minlen
      Len            = 1
      ErrorMessageID = emptyerror
   </+InputCheck>
</InputCheck>
```

> [!WARNING]
>
> Der Parameter heißt `AddressType`, mit zwei d und großem T. Das ist kein anderer Groß- und Kleinschreibungsfall, sondern ein anderer Name, und das Shopsystem findet ihn nicht. Eine Prüfung mit `Adresstype = bill` gilt deshalb für **beide** Adressen statt nur für die Rechnungsadresse. Dasselbe gilt für `Adressfield` in der Parametertabelle der Altdokumentation, richtig ist `AddressField`.

### ErrorMessages

Jede Fehlermeldung bekommt eine frei vergebene Kennung. Diese Kennung weisen Sie einer Prüfregel über `ErrorMessageID` zu.

Der Eintrag `Default` ist die Meldung, die greift, wenn eine Regel keine Kennung hat oder die angegebene Kennung nicht existiert. Im Meldungstext wird das lokale Tag `FieldName` durch die Bezeichnung des betroffenen Felds ersetzt.

Der Abschnitt muss genau einmal vorhanden sein. Legen Sie `Default` immer an, denn eine nicht gefundene Kennung fällt stillschweigend darauf zurück, und ohne `Default` bleibt die Meldung leer.

### InputCheckDefaults

| Parameter | Zweck | Werte |
| - | - | - |
| `RemoveSigns` | Zeichen, die vor jeder Prüfung aus der Eingabe entfernt werden. | Zeichenkette, optional in Anführungszeichen |

Die Standardbehandlung greift nur für Felder, für die mindestens eine Prüfregel existiert. Soll ein Feld nur die Standardbehandlung bekommen, ohne inhaltlich geprüft zu werden, legen Sie dafür eine Regel mit `Type = nocheck` an.

### Die Prüfregeln

| Parameter | Zweck | Werte |
| - | - | - |
| `AddressField` | Kommaseparierte Liste der Felder. `*` gilt für alle Felder. Pflichtangabe. | Feldnamen oder `*` |
| `AddressType` | Für welche Adresse die Regel gilt. | `both`, `bill`, `delivery`, `inquiryCommonInput`. Standard `both` |
| `Type` | Art der Prüfung. Pflichtangabe. | siehe Tabelle unten |
| `ErrorMessageID` | Kennung der Fehlermeldung. | Kennung. Standard `Default` |
| `RemoveSigns` | Zeichen, die für diese Prüfung aus der Eingabe entfernt werden. | Zeichenkette |
| `Condition-UserType` | Beschränkt die Regel auf bestimmte Kundentypen. | kommaseparierte Liste von Kundentypen |
| `InquiryOnly` | Beschränkt die Regel auf Anfrageformulare. | `yes`, `no`. Standard `no` |
| `+Condition` | Bedingung, unter der die Prüfung überhaupt stattfindet. Mehrere sind UND-verknüpft. | |

Mit `Condition-UserType` hängen Sie eine Prüfung an die Kundenart, beispielsweise strengere Pflichtfelder für Geschäftskunden.

> [!WARNING]
>
> Ein `+InputCheck`-Block ohne `AddressField` und ein Block mit einem unbekannten `Type` werden **stillschweigend übersprungen**. Es gibt weder eine Fehlermeldung noch einen Logeintrag. Prüfen Sie eine neue Regel deshalb immer im Shop und verlassen Sie sich nicht darauf, dass eine fehlerfreie Konfigurationsdatei auch eine wirksame Regel enthält.

Es sind bis zu 500 `+InputCheck`-Blöcke möglich. Das Shopsystem bricht bei der ersten nicht bestandenen Prüfung eines Felds ab, der Käufer bekommt also immer nur einen Fehler je Feld zu sehen.

### Werte für Type

| Wert | Prüft |
| - | - |
| `num` | nur Ziffern von 0 bis 9 |
| `alpha` | nur Buchstaben a bis z und A bis Z |
| `alphanum` | nur Buchstaben und Ziffern |
| `phone` | eine Telefonnummer. Ein führendes `+` wird zu `00`, alle Zeichen außer Ziffern entfallen. Aus `+49-(0)911/2013 63 221-0` wird `004909112013632210` |
| `date` | ein gültiges Datum, Schaltjahre eingeschlossen. Braucht `DateFormat`, `Delimiter` und `FormatLeadingZero` |
| `email` | eine gültige E-Mail-Adresse |
| `zip` | eine gültige Postleitzahl, länderabhängig |
| `taxid` | eine gültige Umsatzsteuer-Identifikationsnummer, länderabhängig |
| `regex` | einen regulären Ausdruck |
| `legalsigns` | nur die in `Signs` genannten Zeichen |
| `illegalsigns` | keines der in `Signs` genannten Zeichen |
| `minlen` | mindestens die in `Len` angegebene Länge |
| `maxlen` | höchstens die in `Len` angegebene Länge |
| `idcheck` | eine gültige Personalausweisnummer |
| `agecheck` | eine Personalausweisnummer eines Volljährigen |
| `passportcheck` | eine gültige Reisepassnummer |
| `agecheckpassport` | eine Reisepassnummer eines Volljährigen |
| `nocheck` | nichts. Die Zeichen aus `RemoveSigns` werden trotzdem entfernt |

Die Prüfungen `zip` und `taxid` richten sich nach dem Land der jeweiligen Adresse. Ist kein Land gewählt, prüft das Shopsystem gegen Deutschland.

### Zusatzparameter je Prüfungsart

| Parameter | Nötig bei | Zweck |
| - | - | - |
| `Len` | `minlen`, `maxlen` | die geprüfte Länge |
| `Signs` | `legalsigns`, `illegalsigns` | die betroffenen Zeichen |
| `RegEx` | `regex` | der reguläre Ausdruck |
| `DateFormat` | `date` | Reihenfolge als dreistellige Zeichenkette aus `D`, `M` und `Y`. Standard `DMY` |
| `Delimiter` | `date` | Trennzeichen zwischen Tag, Monat und Jahr. Standard `.` |
| `FormatLeadingZero` | `date` | Wandelt `02.4.1996` in `02.04.1996` um statt in `2.4.1996`. Standard `no` |

Bei `Signs` stehen zwei Abkürzungen zur Verfügung: `$ALPHA` für alle Buchstaben des ASCII-Zeichensatzes und `$NUM` für alle Ziffern.

> [!WARNING]
>
> `$ALPHA` enthält **keine** Umlaute und keinen Bindestrich. Eine Prüfung mit `Signs = "$ALPHA"` auf einem Namensfeld weist deshalb jeden Müller und jede Meier-Schmidt ab. Lassen Sie die benötigten Zeichen ausdrücklich zu, beispielsweise mit `"$ALPHAß- äÄüÜöÖ"`.

In `RemoveSigns` und `Signs` lassen sich Zeichen außerhalb von ISO-8859-1 über ihren Hexwert angeben, geschrieben als `0x` gefolgt von zwei Zeichen. Der Aufzählungspunkt wird damit zu `0x95`.

### Ein vollständiges Beispiel

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<InputCheck>
   <ErrorMessages>
      Default      = ~FieldName~: Ungültige Eingabe
      emptyerror   = Bitte füllen Sie das Feld ~FieldName~ aus.
      toolongerror = Ihre Eingabe im Feld ~FieldName~ ist zu lang. Bitte kürzen Sie sie.
      street2error = ~FieldName~: Bitte geben Sie eine korrekte Hausnummer an
   </ErrorMessages>

   <InputCheckDefaults>
      RemoveSigns = "$"
   </InputCheckDefaults>

   <+InputCheck>
      AddressField   = Street2
      Type           = minlen
      Len            = 1
      ErrorMessageID = emptyerror
   </+InputCheck>

   <+InputCheck>
      AddressField   = Street2
      Type           = maxlen
      Len            = 10
      ErrorMessageID = toolongerror
   </+InputCheck>

   <+InputCheck>
      AddressField   = Street2
      Type           = legalsigns
      Signs          = "$ALPHA$NUM"
      RemoveSigns    = " "
      ErrorMessageID = street2error
   </+InputCheck>

   <+InputCheck>
      AddressField   = TaxID
      AddressType    = bill
      Type           = minlen
      Len            = 1
      ErrorMessageID = emptyerror
      <+Condition>
         Field = Company
         Type  = filled
      </+Condition>
   </+InputCheck>
</InputCheck>
```

Ein Feld bekommt mehrere Regeln, indem Sie mehrere `+InputCheck`-Blöcke dafür anlegen. Im Beispiel wird `Street2` dreimal geprüft: auf Vorhandensein, auf Länge und auf zulässige Zeichen, jeweils mit eigener Meldung.

Wegweiser: [Prüfungen von Adressdaten festlegen](https://dokumentation.websale.de/v8s/adressdaten/pruefungen-von-adressdaten-festlegen.md)

## GenericInputChecks

Dasselbe Prinzip wie `InputCheck`, aber für die freien Felder auf Split-Positionsebene statt für Adressfelder. Jede Prüfung bekommt eine Kennung, über die sie in `BasketProductOptions` zugewiesen wird.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<GenericInputChecks>
   <GenericInputCheckDefaults>
      RemoveSigns = "$§%"
   </GenericInputCheckDefaults>

   <+GenericInputCheck>
      ID           = kommission
      Type         = maxlen
      Len          = 20
      ErrorMessage = Die Kommission darf höchstens 20 Zeichen lang sein.
   </+GenericInputCheck>
</GenericInputChecks>
```

| Parameter | Zweck | Werte |
| - | - | - |
| `ID` | Frei vergebene Kennung für die Zuordnung in `BasketProductOptions` über `+UseGenericInputCheck`. | alphanumerische Zeichen |
| `Type` | Art der Prüfung. | `alpha`, `alphanum`, `num`, `regex`, `legalsigns`, `illegalsigns`, `minlen`, `maxlen`, `nocheck`, `inlist`, `notinlist` |
| `ErrorMessage` | Fehlermeldung für diese Prüfung. | Text |
| `RemoveSigns` | Zeichen, die vor der Prüfung entfernt werden. | Zeichenkette in Anführungszeichen |
| `Len` | Länge, nur bei `minlen` und `maxlen`. | Zahl |
| `List` | Werteliste, nur bei `inlist` und `notinlist`. | kommaseparierte Liste |
| `RegEx` | Regulärer Ausdruck, nur bei `regex`. | |
| `Signs` | Zeichen, nur bei `legalsigns` und `illegalsigns`. | |

Anders als bei `InputCheck` steht die Fehlermeldung direkt in der Prüfung und nicht in einem eigenen Meldungsabschnitt. Es gibt hier also keine Kennungen für Meldungen und keinen Rückfall auf eine Standardmeldung.

Richtig ist `notinlist`.

Wegweiser: [Freie Felder auf Split-Positionsebene](https://dokumentation.websale.de/v8s/referenz/tags/bpo.md). Referenz: Abschnitt [BasketProductOptions](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/warenkorb-und-bestellprozess.md#basketproductoptions)

## DeliveryAddressSelection

Hält die Texte für die Auswahlliste der Lieferadresse im Bestellprozess.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<DeliveryAddressSelection>
   NoDeliveryAddress             = Keine abweichende Lieferadresse verwenden
   WishlistDeliveryAddressPrefix = Wunschlistenadresse verwenden: Lieferung an
   DeliveryAddressPrefix         = Gespeicherte Lieferadresse:
   Separator                     = -----------
</DeliveryAddressSelection>
```

| Parameter | Erscheint |
| - | - |
| `NoDeliveryAddress` | als Eintrag für "keine abweichende Lieferadresse" |
| `WishlistDeliveryAddressPrefix` | vor einer Wunschlistenadresse, sofern vorhanden |
| `DeliveryAddressPrefix` | vor einer gespeicherten Lieferadresse, sofern vorhanden |
| `Separator` | als Trennzeile zwischen den ersten beiden Einträgen und den gespeicherten Adressen |

`Separator` erscheint nur, wenn der Parameter gefüllt ist. Ohne ihn stehen alle Einträge ohne optische Trennung untereinander.

Referenz: [Tags für multiple Adressen](https://dokumentation.websale.de/v8s/referenz/tags/multiple-adressen.md)


## Related topics

- [Grundlagen und Technik](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik.md)
- [Bestellprozess, Adressen und Prüfungen](https://dokumentation.websale.de/v8s/referenz/tags/ws/bestellprozess-adressen-und-pruefungen.md)
- [Sektionen: Kopfdaten und Adressen](https://dokumentation.websale.de/v8s/schnittstellen/bestellungen/ws-bestelldaten/sektionen-kopf-und-adressen.md)
- [Styles für Kunde und Adressen](https://dokumentation.websale.de/v8s/referenz/styles/kunde-und-adressen.md)
- [API-Referenz Kundendaten](https://dokumentation.websale.de/schnittstellen/admin-interface-api/api-referenz-kundendaten.md)


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