
package de.ivu.elect.business.konfiguration.entity;

import de.ivu.elect.business.benutzerverwaltung.entity.BenutzereinsatzortAuswahl;
import de.ivu.elect.business.exchange.control.WebServiceStatusAbfrageArt;
import de.ivu.elect.business.gruppe.entity.GruppeSchluesselNormalisierungstyp;
import de.ivu.elect.business.konfiguration.control.FileExistsValidator;
import de.ivu.elect.business.personenregister.control.PersonenregisterSourceFilter;
import de.ivu.elect.business.personenregister.control.PersonenregisterSuchbereichTypFilter;
import de.ivu.elect.business.personenregister.entity.*;
import de.ivu.elect.business.replikation.entity.*;
import de.ivu.elect.business.security.Customer;
import de.ivu.elect.business.security.control.LoginServiceNameFilter;
import de.ivu.elect.business.security.entity.*;
import de.ivu.elect.business.system.entity.BeanScope;
import de.ivu.elect.business.system.entity.SystemStatus;
import de.ivu.elect.business.wahl.entity.WahlkonfigurationAnpassbarArt;
import de.ivu.elect.business.wahlhelfer.entity.WahlhelferKontodatenUmgang;

import javax.faces.validator.LongRangeValidator;
import javax.faces.validator.RequiredValidator;
import javax.faces.validator.Validator;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

import static de.ivu.elect.business.konfiguration.entity.CustomParameterKategorie.PERSONENREGISTER;
import static de.ivu.elect.business.konfiguration.entity.CustomParameterKategorie.WES;
import static de.ivu.elect.business.konfiguration.entity.CustomParameterKategorie.*;
import static de.ivu.elect.business.konfiguration.entity.CustomParameterWertTyp.*;
import static de.ivu.elect.business.konfiguration.entity.KonfigurationNotify.*;
import static de.ivu.elect.business.konfiguration.entity.MandantKonfigurationArt.CUSTOMER;
import static de.ivu.elect.business.konfiguration.entity.MandantKonfigurationArt.CUSTOMER_SYSTEM;
import static de.ivu.elect.business.security.Customer.*;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;

/**
 * Enums für Mandantparameter
 * <p>
 * Systemparameter nach ElectKonfigurationWerte
 */
public enum MandantKonfigurationWerte implements ElectSystemMandantKonfigurationWerte {

  SYSTEM_STATUS(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, SYSTEM, VOID, SystemStatus.class, MINIMAL), // Nicht auf ELECT-Konfigurations
  // -Seite anzeigen

  SYSTEM_MESSAGE(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, SYSTEM, STRING, MINIMAL),

  HTTP_SESSION_TIMEOUT_IN_MINUTEN(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, HTTP, LONG, asList(new RequiredValidator(),
      new LongRangeValidator(MandantKonfigurationWerte.MAX_SESSION_TIMEOUT_IN_MINUTES, MandantKonfigurationWerte.MIN_SESSION_TIMEOUT_IN_MINUTES)), MINIMAL),

  MAIL_SERVICE_ENABLED(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, MAIL, BOOLEAN, MAIL_SUPPORT),
  MAIL_FROM_NAME(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, MAIL, STRING, MAIL_SUPPORT),
  MAIL_FROM_ADDRESS(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, MAIL, STRING, MAIL_SUPPORT),
  MAIL_REPLY_TO(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, MAIL, STRING, MAIL_SUPPORT),

  USECASE_ALLOWLIST_DEAKTIVIERT(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, AUTHENTIFIZIERUNG, BOOLEAN, BASE),
  ADMIN_ROLLE_DARF_ALLES(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, AUTHENTIFIZIERUNG, BOOLEAN, BASE),
  ADMIN_ROLLE_IGNORIERT_PRODUKTIONSMODUS(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, AUTHENTIFIZIERUNG, BOOLEAN, BASE),
  STANDARD_ROLLEN_ANPASSBAR(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, AUTHENTIFIZIERUNG, ENUM, StandardRollenAnpassbarArt.class, MINIMAL),

  LOGIN_SERVICE_NAME(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, ENUM, LoginServiceName.class, LoginServiceNameFilter.class, MINIMAL),
  LOGIN_SERVICE_PASSWORT_FORMAT_PATTERN(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, STRING, BASE),
  LOGIN_SERVICE_PASSWORT_FORMAT_BESCHREIBUNG(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, AUTHENTIFIZIERUNG, STRING, BASE),
  LOGIN_SERVICE_PASSWORD_STORE_TYPE(CUSTOMER_SYSTEM, NICHT_BENACHRICHTIGEN, AUTHENTIFIZIERUNG, ENUM, PasswordStoreType.class, BASE),

  TWO_FACTOR_AUTHENTICATION_STATUS(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, ENUM, TwoFactorAuthenticationStatus.class, TFA_SUPPORT),
  TWO_FACTOR_AUTHENTICATION_TAN(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, ENUM, TwoFactorAuthenticationTyp.class, TFA_SUPPORT),
  TWO_FACTOR_AUTHENTICATION_TOTP(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, ENUM, TwoFactorAuthenticationTyp.class, TFA_SUPPORT),
  TWO_FACTOR_AUTHENTICATION_TOTP_ANZAHL_ZEITSCHLITZE_SPIELRAUM(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, LONG,
      singletonList(new LongRangeValidator(10L, 0L)), TFA_SUPPORT),
  TWO_FACTOR_AUTHENTICATION_TOTP_SYSTEM_NAME(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, STRING, TFA_SUPPORT),
  TWO_FACTOR_AUTHENTICATION_SECRET_LAENGE(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, LONG, singletonList(new LongRangeValidator(1000L, 0L)),
      TFA_SUPPORT),

  ACTIVE_DIRECTORY_SERVER_URL(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, STRING, ACTIVE_DIRECTORY_SUPPORT),
  ACTIVE_DIRECTORY_DOMAIN(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, STRING, ACTIVE_DIRECTORY_SUPPORT),
  ACTIVE_DIRECTORY_SSL_ZERTIFIKATE_PRUEFEN(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, BOOLEAN, ACTIVE_DIRECTORY_SUPPORT),
  ACTIVE_DIRECTORY_GRUPPEN_PATTERN(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, STRING, ACTIVE_DIRECTORY_SUPPORT),
  ACTIVE_DIRECTORY_GRUPPEN_MEMBER_OF_ATTRIBUT(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, STRING, ACTIVE_DIRECTORY_SUPPORT),
  ACTIVE_DIRECTORY_GRUPPEN_BENUTZERKENNUNG_ATTRIBUT(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, STRING, ACTIVE_DIRECTORY_SUPPORT),
  ACTIVE_DIRECTORY_GRUPPEN_USER_BASE(CUSTOMER_SYSTEM, BENACHRICHTIGEN, AUTHENTIFIZIERUNG, STRING, ACTIVE_DIRECTORY_SUPPORT),

  BENUTZEREINSATZORT_AUSWAHL(CUSTOMER, NICHT_BENACHRICHTIGEN, AUTHENTIFIZIERUNG, ENUM, BenutzereinsatzortAuswahl.class, MUC_WVZ),
  STIMMEINGABE_DATEIEXPORT_AKTIVIERT(CUSTOMER, NICHT_BENACHRICHTIGEN, STIMMEINGABE, BOOLEAN, WAS),
  STIMMEINGABE_ABLAGEVERZEICHNIS(CUSTOMER, BENACHRICHTIGEN, STIMMEINGABE, VERZEICHNIS_BESCHREIBBAR, WAS),
  STIMMEINGABE_ABLAGE_CONTEXT(CUSTOMER, BENACHRICHTIGEN, STIMMEINGABE, ENUM, BeanScope.class, WAS),

  PERSONENREGISTER_SOURCE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, PersonenregisterSource.class, PersonenregisterSourceFilter.class,
      Customer.PERSONENREGISTER),
  PERSONENREGISTER_CACHE_SIZE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, LONG, singletonList(new LongRangeValidator(500_000, 0L)), Customer.PERSONENREGISTER),

  PERSONENREGISTER_KEYSTORE_LOCATION(CUSTOMER_SYSTEM, BENACHRICHTIGEN, PERSONENREGISTER, STRING,
      singletonList(new FileExistsValidator(FileExistsValidator.Mode.ALLOW_EMPTY)), /* ELECT-14792 */ customer -> customer.contains(MUC_BASE),
      Customer.PERSONENREGISTER),
  PERSONENREGISTER_KEYSTORE_PASSWORD(CUSTOMER_SYSTEM, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, /* ELECT-14792 */
      customer -> customer.contains(MUC_BASE), Customer.PERSONENREGISTER),
  PERSONENREGISTER_KEYSTORE_TYPE(CUSTOMER_SYSTEM, BENACHRICHTIGEN, PERSONENREGISTER, STRING, /* ELECT-14792 */ customer -> customer.contains(MUC_BASE),
      Customer.PERSONENREGISTER),

  MESO_WAHLBEHOERDE_NAME_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_MESO),
  MESO_WAHLBEHOERDE_UUID_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, /* ELECT-10981 */ DD_COMMON), // ELECT-10981, NUR VOIS-Export und NUR DD

  MESO_SERVICE_URL_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_MESO),
  MESO_SERVICE_STATUS_ABFRAGE_ART(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, WebServiceStatusAbfrageArt.class, COMMON_INTERFACES_MESO),
  MESO_SERVICE_BENUTZER_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_MESO),
  MESO_SERVICE_PASSWORT_DD(CUSTOMER, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, COMMON_INTERFACES_MESO),
  MESO_SERVICE_MANDANT_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, INTEGER, COMMON_INTERFACES_MESO),
  MESO_SERVICE_MANDANT_UUID_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, /* ELECT-10981 */ DD_COMMON), // ELECT-10981, NUR VOIS-Export und NUR DD
  MESO_SERVICE_VERSION(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, MesoVersion.class, COMMON_INTERFACES_MESO),
  MESO_SERVICE_SUCHSTRATEGIE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, PersonenregisterSuchstrategie.class, COMMON_INTERFACES_MESO),
  MESO_SERVICE_PROXY_HOST(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_MESO),
  MESO_SERVICE_PROXY_PORT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_MESO),
  MESO_SERVICE_PROXY_USERNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_MESO),
  MESO_SERVICE_PROXY_PASSWORD(CUSTOMER, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, COMMON_INTERFACES_MESO),
  MESO_SERVICE_LOG_LEVEL(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, ElectLogLevel.class, COMMON_INTERFACES_MESO),
  MESO_SERVICE_LOGGING_ENABLED(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, COMMON_INTERFACES_MESO),

  MESO_WAHLEN_SERVICE_URL_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_MESO),
  MESO_WAHLEN_SERVICE_STATUS_ABFRAGE_ART(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, WebServiceStatusAbfrageArt.class, COMMON_INTERFACES_MESO),
  MESO_WAHLEN_SERVICE_MANDANT_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, INTEGER, COMMON_INTERFACES_MESO),
  // ELECT-10981, noch NICHT verwendet MESO_WAHLEN_SERVICE_MANDANT_UUID_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, /* ELECT-10981 */ DD_COMMON),
  MESO_WAHLEN_SERVICE_BENUTZER_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_MESO),
  MESO_WAHLEN_SERVICE_PASSWORT_DD(CUSTOMER, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, COMMON_INTERFACES_MESO),
  MESO_WAHLEN_SERVICE_WAHLGEBIETSNUMMER_DD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, LONG, COMMON_INTERFACES_MESO),
  MESO_WAHLEN_SERVICE_VERSION(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, MesoWahlenVersion.class, COMMON_INTERFACES_MESO),

  // OK_KOMM_OK_EWO_KEYSTORE_LOCATION(CUSTOMER_SYSTEM, BENACHRICHTIGEN, PERSONENREGISTER, STRING, singletonList(new FileExistsValidator(FileExistsValidator.Mode.ALLOW_EMPTY)), COMMON_INTERFACES_OK_KOMM_XOEV),
  // OK_KOMM_OK_EWO_KEYSTORE_PASSWORD(CUSTOMER_SYSTEM, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, COMMON_INTERFACES_OK_KOMM_XOEV),
  // OK_KOMM_OK_EWO_KEYSTORE_TYPE(CUSTOMER_SYSTEM, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_OK_EWO_SERVICE_URL(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_OK_EWO_SERVICE_STATUS_ABFRAGE_ART(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, WebServiceStatusAbfrageArt.class,
      COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_OK_EWO_LOGGING_ENABLED(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_OK_EWO_PROXY_HOST(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_OK_EWO_PROXY_PORT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_OK_EWO_PROXY_USERNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_OK_EWO_PROXY_PASSWORD(CUSTOMER, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, COMMON_INTERFACES_OK_KOMM_XOEV),

  OK_KOMM_XOEV_SERVICE_URL(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_SERVICE_STATUS_ABFRAGE_ART(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, WebServiceStatusAbfrageArt.class, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_LESER_BEHOERDENKENNUNG(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_LESER_BEHOERDENNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_AUTOR_BEHOERDENKENNUNG(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_AUTOR_BEHOERDENNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_AUTOR_ANSCHRIFT_ORT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_AUTOR_ANSCHRIFT_PLZ(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_AUTOR_ANSCHRIFT_STRASSE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_AUTOR_ANSCHRIFT_HAUSNUMMER(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_AUTOR_EMAIL(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_AUTOR_TELEFONNUMMER(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_IS_SICHERHEITSBEHOERDE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_SUCHSTRATEGIE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, PersonenregisterSuchstrategie.class, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_SUCHBEREICH_TYP(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, PersonenregisterSuchbereichTyp.class,
      PersonenregisterSuchbereichTypFilter.class, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_SUCHBEREICH(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_PROXY_HOST(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_PROXY_PORT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_PROXY_USERNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_PROXY_PASSWORD(CUSTOMER, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_XMELD_VERSION(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, XmeldVersion.class, COMMON_INTERFACES_OK_KOMM_XOEV),
  OK_KOMM_XOEV_XMELD_LOGGING_ENABLED(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, COMMON_INTERFACES_OK_KOMM_XOEV),

  XTA_SERVICE_URL_MANAGEMENT_PORT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_SERVICE_URL_SEND_PORT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_SERVICE_STATUS_ABFRAGE_ART(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, WebServiceStatusAbfrageArt.class, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_LESER_BEHOERDENKENNUNG(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_LESER_BEHOERDENNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_AUTOR_BEHOERDENKENNUNG(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_AUTOR_BEHOERDENNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_AUTOR_ANSCHRIFT_ORT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_AUTOR_ANSCHRIFT_PLZ(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_AUTOR_ANSCHRIFT_STRASSE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_AUTOR_ANSCHRIFT_HAUSNUMMER(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_AUTOR_EMAIL(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_AUTOR_TELEFONNUMMER(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_IS_SICHERHEITSBEHOERDE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_SUCHSTRATEGIE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, PersonenregisterSuchstrategie.class, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_SUCHBEREICH_TYP(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, PersonenregisterSuchbereichTyp.class, PersonenregisterSuchbereichTypFilter.class,
      COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_SUCHBEREICH(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_PROXY_HOST(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_PROXY_PORT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_PROXY_USERNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_XTA_XMELD),
  XTA_PROXY_PASSWORD(CUSTOMER, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_VERSION(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, XmeldVersion.class, COMMON_INTERFACES_XTA_XMELD),
  XTA_XMELD_LOGGING_ENABLED(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, COMMON_INTERFACES_XTA_XMELD),

  DVDV_PERSONENREGISTER_WSDL(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, singletonList(new FileExistsValidator(FileExistsValidator.Mode.ALLOW_EMPTY)),
      COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_WSDL_STATUS_ABFRAGE_ART(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, WebServiceStatusAbfrageArt.class,
      COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_EMPFAENGER_BEHOERDENSCHLUESSEL(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_LESER_TYP(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, XmeldBehoerdeTyp.class, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_LESER_BEHOERDENKENNUNG(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_LESER_BEHOERDENNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_AUTOR_TYP(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, XmeldBehoerdeTyp.class, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_AUTOR_BEHOERDENKENNUNG(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_AUTOR_BEHOERDENNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_AUTOR_ANSCHRIFT_ORT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_AUTOR_ANSCHRIFT_PLZ(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_AUTOR_ANSCHRIFT_STRASSE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_AUTOR_ANSCHRIFT_HAUSNUMMER(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_AUTOR_EMAIL(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_AUTOR_TELEFONNUMMER(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_IS_SICHERHEITSBEHOERDE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  // DVDV_PERSONENREGISTER_SUCHE_PER_ORDNUNGSMERKMAL_ERLAUBT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  // DVDV_PERSONENREGISTER_SUCHE_PER_PERSONENDATEN_ERLAUBT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_SUCHSTRATEGIE(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, PersonenregisterSuchstrategie.class,
      COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_SUCHBEREICH_TYP(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, PersonenregisterSuchbereichTyp.class,
      COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_SUCHBEREICH(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  // TODO ELECT-15513
  // DVDV_PERSONENREGISTER_PROXY_HOST(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  // DVDV_PERSONENREGISTER_PROXY_PORT(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  // DVDV_PERSONENREGISTER_PROXY_USERNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  // DVDV_PERSONENREGISTER_PROXY_PASSWORD(CUSTOMER, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_XMELD_VERSION(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, XmeldVersion.class, COMMON_INTERFACES_DVDV_PERSONENREGISTER),
  DVDV_PERSONENREGISTER_XMELD_LOGGING_ENABLED(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, COMMON_INTERFACES_DVDV_PERSONENREGISTER),

  WAHLHELFER_ROLLE_CUSTOM_1_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_1_KURZNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_1_MAENNLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_1_WEIBLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_1_DIVERS(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_1_UNBEKANNT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_2_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_2_KURZNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_2_MAENNLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_2_WEIBLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_2_DIVERS(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_2_UNBEKANNT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_3_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_3_KURZNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_3_MAENNLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_3_WEIBLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_3_DIVERS(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_3_UNBEKANNT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_4_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_4_KURZNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_4_MAENNLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_4_WEIBLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_4_DIVERS(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_4_UNBEKANNT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_5_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_5_KURZNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_5_MAENNLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_5_WEIBLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_5_DIVERS(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_5_UNBEKANNT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_6_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_6_KURZNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_6_MAENNLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_6_WEIBLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_6_DIVERS(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_6_UNBEKANNT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_7_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_7_KURZNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_7_MAENNLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_7_WEIBLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_7_DIVERS(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_7_UNBEKANNT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_8_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_8_KURZNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_8_MAENNLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_8_WEIBLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_8_DIVERS(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_8_UNBEKANNT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_9_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_9_KURZNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_9_MAENNLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_9_WEIBLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_9_DIVERS(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_9_UNBEKANNT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),

  WAHLHELFER_ROLLE_CUSTOM_10_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_10_KURZNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_10_MAENNLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_10_WEIBLICH(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_10_DIVERS(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),
  WAHLHELFER_ROLLE_CUSTOM_10_UNBEKANNT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_ROLLEN, STRING, WOS),

  WAHLHELFER_SCHICHT_CUSTOM_1_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_1_KENNUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_1_SERIENBRIEFTEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_2_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_2_KENNUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_2_SERIENBRIEFTEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_3_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_3_KENNUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_3_SERIENBRIEFTEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_4_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_4_KENNUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_4_SERIENBRIEFTEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_5_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_5_KENNUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_5_SERIENBRIEFTEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_6_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_6_KENNUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_6_SERIENBRIEFTEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_7_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_7_KENNUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_7_SERIENBRIEFTEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_8_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_8_KENNUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_8_SERIENBRIEFTEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_9_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_9_KENNUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),
  WAHLHELFER_SCHICHT_CUSTOM_9_SERIENBRIEFTEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_SCHICHTEN, STRING, WOS),

  WAHLHELFER_UMGANG_KONTODATEN_NACH_WAHLHELFER_DATENBANK(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_DATENBANK, ENUM, WahlhelferKontodatenUmgang.class, WOS),
  WAHLHELFER_UMGANG_KONTODATEN_VON_WAHLHELFER_DATENBANK(CUSTOMER, NICHT_BENACHRICHTIGEN, WAHLHELFER_DATENBANK, ENUM, WahlhelferKontodatenUmgang.class, WOS),

  @Deprecated // MUC als Suffix, nicht als Präfix (wegen Sortierung an der Oberfläche...)
  MUC_EWO_SERVICE_URL(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, MUC_BASE), // Zum Testen lokal: http://localhost:8080/ewo-ws-mock/EwoWebService
  EWO_SERVICE_STATUS_ABFRAGE_ART(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, WebServiceStatusAbfrageArt.class, MUC_COMMON),
  EWO_SERVICE_LOGGING_ENABLED_MUC(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, MUC_COMMON),
  /**
   * @deprecated TODO ELECT-13582, Boolean durch Enum (Auswahl der Authentifizierung-Methode, bspw. "Basic Authentifizierung", "SOAP-Header mit Benutzer/Passwort") ersetzen...
   */
  @Deprecated
  EWO_SERVICE_WSS_ENABLED(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, MUC_COMMON),
  EWO_SERVICE_WSS_USERNAME(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, MUC_COMMON),
  EWO_SERVICE_WSS_PASSWORD(CUSTOMER, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, MUC_COMMON),

  NL_GBAV_SERVICE_URL(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, NL_WUS),
  NL_GBAV_SERVICE_STATUS_ABFRAGE_ART(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, ENUM, WebServiceStatusAbfrageArt.class, NL_WUS),
  NL_GBAV_BENUTZER_ID(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, NL_WUS),
  NL_GBAV_BENUTZER(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, NL_WUS),
  NL_GBAV_PROFIEL_NAAM(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, NL_WUS), // ELECTVAPP-1225
  //  NL_GBAV_ROOT_CERTIFICATE_PFAD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, NL_WUS),
  //  NL_GBAV_PRIVATE_CERTIFICATE_PFAD(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, STRING, NL_WUS),
  //  NL_GBAV_PRIVATE_CERTIFICATE_PASSWORD(CUSTOMER, BENACHRICHTIGEN_OHNE_WERTE, PERSONENREGISTER, STRING_SECRET, NL_WUS),
  NL_GBAV_SERVICE_LOGGING_ENABLED(CUSTOMER, BENACHRICHTIGEN, PERSONENREGISTER, BOOLEAN, NL_WUS),

  INTERNET_PLATZHALTER_LOGO_URL(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),
  INTERNET_PLATZHALTER_LOGO_ALTERNATIV_TEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),
  INTERNET_PLATZHALTER_LOGO_LINK_URL(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),
  INTERNET_PLATZHALTER_LOGO_LINK_LABEL(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),

  INTERNET_PLATZHALTER_ADDITIONAL_LINK_ALTERNATIV_TEXT(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),
  INTERNET_PLATZHALTER_ADDITIONAL_LINK_URL(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),
  INTERNET_PLATZHALTER_ADDITIONAL_LINK_LABEL(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),
  INTERNET_PLATZHALTER_COPYRIGHT(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),

  INTERNET_PLATZHALTER_MENU_LINKS(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),
  INTERNET_PLATZHALTER_ADDITIONAL_LINKS(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),
  INTERNET_PLATZHALTER_FOOTER_LINKS(CUSTOMER, NICHT_BENACHRICHTIGEN, PRAESENTATIONPLATZHALTER, STRING, DESTATIS_WAS::equals, WAS),

  /*
   * ELECT-10924, Reihenfolge der DOKUMENT_PLATZHALTER_*-Werte gibt Reihenfolge in der Anzeige vor!
   */

  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_WAHLLEITER_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_GEBIETSNAME(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),

  DOKUMENT_PLATZHALTER_BUNDESLAND_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_LANDKREIS_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_GEMEINDE_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_GEMEINDE_NUMMER(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),

  DOKUMENT_PLATZHALTER_WAHLKREIS_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLKREIS_NUMMER(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  // ELECTKOM-2010, https://de.wikipedia.org/wiki/Stimmkreis_(Bayern) -> MUC, KOM-BY
  DOKUMENT_PLATZHALTER_STIMMKREIS_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, MUC_BASE, KOM_BY_ALL_WAS, KOM_BY_ALL_WOS),
  DOKUMENT_PLATZHALTER_STIMMKREIS_NUMMER(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, MUC_BASE, KOM_BY_ALL_WAS, KOM_BY_ALL_WOS),
  // ELECTKOM-2010, https://de.wikipedia.org/wiki/Wahlbereich -> KOM-MV, KOM-NI, KOM-RP, SL (da Bundesland-System immer im Gebietsbaum modelliert!!!) (, KOM-HB, KOM-HE)
  DOKUMENT_PLATZHALTER_WAHLBEREICH_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, KOM_MV_WAS, KOM_MV_WOS, KOM_NI_WAS, KOM_NI_WOS,
      KOM_RP_WAS, KOM_RP_WOS),
  DOKUMENT_PLATZHALTER_WAHLBEREICH_NUMMER(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, KOM_MV_WAS, KOM_MV_WOS, KOM_NI_WAS, KOM_NI_WOS,
      KOM_RP_WAS, KOM_RP_WOS),

  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_STRASSE(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_HAUSNUMMER(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_PLZ(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_ORT(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_POSTFACH(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),

  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_STRASSE(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_HAUSNUMMER(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_PLZ(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_ORT(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),

  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_NAME(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_TELEFON(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_TELEFAX(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_EMAIL(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, DESTATIS_WAS::equals, COMMON),

  DOKUMENT_PLATZHALTER_STIMMZETTEL_KANDIDATUR_NAMEN_FORMAT(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, KOM_WAS),
  DOKUMENT_PLATZHALTER_STIMMZETTEL_KANDIDATUR_INFOTEXT_FORMAT(CUSTOMER, NICHT_BENACHRICHTIGEN, DOKUMENTPLATZHALTER, STRING, KOM_WAS),

  WES_STIMMZETTEL_UPLOAD_SECRET(CUSTOMER, NICHT_BENACHRICHTIGEN, WES, STRING_SECRET, WES_UNTERSTUETZUNG),

  WAHL_AUF_MANDANT_AUFTEILEN_GEBIETSRECHTE_UEBERNEHMEN(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, BOOLEAN, CORE),

  WVP_MODUS(CUSTOMER, NICHT_BENACHRICHTIGEN, WVP, ENUM, WvpModus.class, WVP_ANBINDUNG),
  WVP_WAHLKONFIGURATIONEN_AUTOMATISCH_AKTUALISIEREN(CUSTOMER, NICHT_BENACHRICHTIGEN, WVP, BOOLEAN, WVP_ANBINDUNG),
  WVP_IMPRESSUM(CUSTOMER, NICHT_BENACHRICHTIGEN, WVP, STRING, WVP_ANBINDUNG_MIT_IMPRESSUM_DATENSCHUTZ_URLS),
  WVP_DATENSCHUTZERKLAERUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, WVP, STRING, WVP_ANBINDUNG_MIT_IMPRESSUM_DATENSCHUTZ_URLS),

  WAHLKONFIGURATION_ANPASSBAR(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, c -> c.containsAny(asList(MUC_BASE, DD_COMMON, DESTATIS_COMMON)),
      WahlkonfigurationAnpassbarArt.class, MINIMAL),

  GOV_EXPRESS_MODUS(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, GovExpressModus.class, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_AUTOMATISCHER_ABRUF(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, BOOLEAN, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_AUTOMATISCHES_VERSENDEN(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, GovExpressAutomatischesVersenden.class, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_AUTOMATISCHE_VERARBEITUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, GovExpressAutomatischeVerarbeitung.class, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_STIMMEINGABE_VALIDIERUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, GovExpressStimmeingabeValidierung.class, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_STIMMEINGABE_ABSENDER_PRUEFUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, GovExpressStimmeingabeAbsenderpruefung.class, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_STIMMEINGABE_EINGANGSSEQUENZNUMMERN_PRUEFEN(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, BOOLEAN, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_URL(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, STRING, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_KENNUNG_PREFIX(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, STRING, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_KENNUNG(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, STRING, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_SSL_ZERTIFIKAT_KEYSTORE_PASSWORD(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, STRING_SECRET, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_SIGNATUR_ZERTIFIKAT_KEYSTORE_PASSWORD(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, STRING_SECRET, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_SIGNATUR_ZERTIFIKAT_SCHLUESSEL_PASSWORD(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, STRING_SECRET, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_SIGNATUR_ZERTIFIKAT_SCHLUESSEL_ALIAS(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, STRING, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_SEQUENCE(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, LONG, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_DATEIUMGANG_SENDEN(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, GovExpressDateiumgang.class, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_DATEIUMGANG_EMPFANGEN(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, GovExpressDateiumgang.class, GOV_EXPRESS_ANBINDUNG),

  GOV_EXPRESS_STIMMEINGABEN_SENDEN(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, GovExpressStimmenuebertragung.class, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_STIMMEINGABEN_EMPFANGEN(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, GovExpressStimmenuebertragung.class, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_ABRUF_INTERVALL_IN_SEKUNDEN(CUSTOMER, NICHT_BENACHRICHTIGEN, SONSTIGES, LONG, asList(new RequiredValidator(),
      new LongRangeValidator(MandantKonfigurationWerte.MAX_GOV_EXPRESS_ABRUF_INTERVALL_IN_SEKUNDEN, MandantKonfigurationWerte.MIN_GOV_EXPRESS_ABRUF_INTERVALL_IN_SEKUNDEN)), GOV_EXPRESS_ANBINDUNG),

  GRUPPE_SCHLUESSEL_NORMALISIEREN(CUSTOMER_SYSTEM /*ELECT-12247*/, NICHT_BENACHRICHTIGEN, SONSTIGES, ENUM, GruppeSchluesselNormalisierungstyp.class, WUS, WAS);

  private static final long MIN_SESSION_TIMEOUT_IN_MINUTES = 5;

  private static final long MAX_SESSION_TIMEOUT_IN_MINUTES = 24 * 60;

  private static final long MIN_GOV_EXPRESS_ABRUF_INTERVALL_IN_SEKUNDEN = 10;

  private static final long MAX_GOV_EXPRESS_ABRUF_INTERVALL_IN_SEKUNDEN = 60 * 60 * 24;

  private final MandantKonfigurationArt art;

  private final List<Customer> customers;

  private final Predicate<Customer> customersExcludedFilter;

  private final CustomParameterKategorie kategorie;

  private final int kategoriePosition;

  private final CustomParameterWertTyp wertTyp;

  private final List<Validator> wertValidators;

  private final Supplier<List<String>> wertStringValues;

  private final KonfigurationNotify notify;

  private final Supplier<Function<String, String>> wertStringValueToLabelFct;

  private final Class<? extends Enum<?>> wertEnumClass;

  private final Class<? extends CustomParameterFilter<Konfiguration, ? extends Enum<?>>> filter;

  MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Customer... customers) {
    this(art, notify, kategorie, wertTyp, emptyList(), customers);
  }

  <E extends Enum<?>> MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<E> wertEnumClass,
                                                Class<? extends CustomParameterFilter<Konfiguration, E>> filter, Customer... customers) {
    this(art, notify, kategorie, wertTyp, wertEnumClass, filter, Collections::emptyList, Function::identity, emptyList(), c -> false, customers);
  }

  MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, List<Validator> wertValidators,
                            Customer... customers) {
    this(art, notify, kategorie, wertTyp, wertValidators, c -> false, customers);
  }

  MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Predicate<Customer> customersExcludedFilter,
                            Customer... customers) {
    this(art, notify, kategorie, wertTyp, emptyList(), customersExcludedFilter, customers);
  }

  MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, List<Validator> wertValidators,
                            Predicate<Customer> customersExcludedFilter, Customer... customers) {
    this(art, notify, kategorie, wertTyp, null, null, wertValidators, customersExcludedFilter, customers);
  }

  MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<? extends Enum<?>> wertEnumClass,
                            Customer... customers) {
    this(art, notify, kategorie, wertTyp, c -> false, wertEnumClass, customers);
  }

  <E extends Enum<?>> MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp,
                                                Predicate<Customer> customersExcludedFilter, Class<E> wertEnumClass, Customer... customers) {
    this(art, notify, kategorie, wertTyp, wertEnumClass, null, emptyList(), customersExcludedFilter, customers);
  }

  <E extends Enum<?>> MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<E> wertEnumClass,
                                                Class<? extends CustomParameterFilter<Konfiguration, E>> filter, List<Validator> wertValidators, Customer... customers) {
    this(art, notify, kategorie, wertTyp, wertEnumClass, filter, wertValidators, c -> false, customers);
  }

  <E extends Enum<?>> MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<E> wertEnumClass,
                                                List<Validator> wertValidators, Customer... customers) {
    this(art, notify, kategorie, wertTyp, wertEnumClass, null, wertValidators, c -> false, customers);
  }

  <E extends Enum<?>> MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<E> wertEnumClass,
                                                Class<? extends CustomParameterFilter<Konfiguration, E>> filter, List<Validator> wertValidators, Predicate<Customer> customersExcludedFilter, Customer... customers) {
    this(art, notify, kategorie, wertTyp, wertEnumClass, filter, Collections::emptyList, Function::identity, wertValidators, customersExcludedFilter,
        customers);
  }

  <E extends Enum<?>> MandantKonfigurationWerte(MandantKonfigurationArt art, KonfigurationNotify notify, CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<E> wertEnumClass,
                                                Class<? extends CustomParameterFilter<Konfiguration, E>> filter, Supplier<List<String>> wertStringValues, Supplier<Function<String, String>> wertStringValueToLabelFct,
                                                List<Validator> wertValidators, Predicate<Customer> customersExcludedFilter, Customer... customers) {
    this.art = art;

    this.customers = asList(customers);
    this.customersExcludedFilter = customersExcludedFilter;

    this.kategorie = kategorie;
    this.kategoriePosition = ordinal();

    this.wertTyp = wertTyp;
    this.wertValidators = wertValidators;

    this.wertStringValues = wertStringValues;
    this.wertStringValueToLabelFct = wertStringValueToLabelFct;

    this.wertEnumClass = wertEnumClass;
    this.filter = filter;
    this.notify = notify;
  }

  @Override
  public Supplier<List<String>> getWertStringValues() {
    return wertStringValues;
  }

  @Override
  public Supplier<Function<String, String>> getWertStringValueToLabelFct() {
    return wertStringValueToLabelFct;
  }

  @Override
  public List<Customer> getCustomers() {
    return customers;
  }

  @Override
  public CustomParameterKategorie getKategorie() {
    return kategorie;
  }

  @Override
  public int getKategoriePosition() {
    return kategoriePosition;
  }

  @Override
  public String getKey() {
    return name();
  }

  @Override
  public CustomParameterWertTyp getWertTyp() {
    return wertTyp;
  }

  @Override
  public Class<? extends Enum<?>> getWertEnumClass() {
    return wertEnumClass;
  }

  @Override
  public Class<? extends CustomParameterFilter<Konfiguration, ? extends Enum<?>>> getFilter() {
    return filter;
  }

  @Override
  public List<Validator> getWertValidators() {
    return wertValidators;
  }

  @Override
  public boolean isCustomerExcluded(Customer customer) {
    return customersExcludedFilter.test(customer);
  }

  @Override
  public KonfigurationMandantArt getKonfigurationMandantArt() {
    return art.getKonfigurationMandantArt();
  }

  @Override
  public KonfigurationNotify getKonfigurationNotify() {
    return notify;
  }
}
