
package de.ivu.elect.business.security;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

import de.ivu.elect.business.security.entity.UseCaseMandantArt;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.security.Permission;


import static de.ivu.elect.business.security.Customer.BASE;
import static de.ivu.elect.business.security.Customer.COMMON;
import static de.ivu.elect.business.security.Customer.CORE;
import static de.ivu.elect.business.security.Customer.DASHBOARD;
import static de.ivu.elect.business.security.Customer.DASHBOARD_NEWS;
import static de.ivu.elect.business.security.Customer.DD_WUS;
import static de.ivu.elect.business.security.Customer.DESTATIS_COMMON;
import static de.ivu.elect.business.security.Customer.DESTATIS_WAS;
import static de.ivu.elect.business.security.Customer.DESTATIS_WUS;
import static de.ivu.elect.business.security.Customer.DESTATIS_WUS_EXTERN;
import static de.ivu.elect.business.security.Customer.KOM_BB_WAS;
import static de.ivu.elect.business.security.Customer.KOM_BE_WAS;
import static de.ivu.elect.business.security.Customer.KOM_RP_WAS;
import static de.ivu.elect.business.security.Customer.KOM_WAS;
import static de.ivu.elect.business.security.Customer.MAIL_SUPPORT;
import static de.ivu.elect.business.security.Customer.MANDANT_EXCHANGE;
import static de.ivu.elect.business.security.Customer.MINIMAL;
import static de.ivu.elect.business.security.Customer.MUC_BASE;
import static de.ivu.elect.business.security.Customer.MUC_WAS;
import static de.ivu.elect.business.security.Customer.MUC_WOS;
import static de.ivu.elect.business.security.Customer.MUC_WUS;
import static de.ivu.elect.business.security.Customer.MUC_WVZ;
import static de.ivu.elect.business.security.Customer.NL_WAS;
import static de.ivu.elect.business.security.Customer.NL_WUS;
import static de.ivu.elect.business.security.Customer.PERSONENREGISTER;
import static de.ivu.elect.business.security.Customer.PRAESENTATION_WAS;
import static de.ivu.elect.business.security.Customer.PRAESENTATION_WUS;
import static de.ivu.elect.business.security.Customer.REPLIKATION_SUPPORT;
import static de.ivu.elect.business.security.Customer.SKRIPT_CONSOLE_SUPPORT;
import static de.ivu.elect.business.security.Customer.SL_COMMON;
import static de.ivu.elect.business.security.Customer.SL_WAS;
import static de.ivu.elect.business.security.Customer.STIMMENUEBERGABE_SUPPORT;
import static de.ivu.elect.business.security.Customer.TAG_SUPPORT;
import static de.ivu.elect.business.security.Customer.TEST;
import static de.ivu.elect.business.security.Customer.TFA_SUPPORT;
import static de.ivu.elect.business.security.Customer.WAS;
import static de.ivu.elect.business.security.Customer.WAS_STIMMZETTEL_EINZELERFASSUNG;
import static de.ivu.elect.business.security.Customer.WES;
import static de.ivu.elect.business.security.Customer.WES_UNTERSTUETZUNG;
import static de.ivu.elect.business.security.Customer.WOS;
import static de.ivu.elect.business.security.Customer.WUS;
import static de.ivu.elect.business.security.Customer.WUS_INTERFACES_WVP;
import static de.ivu.elect.business.security.Customer.WVZ;
import static de.ivu.elect.business.security.UseCasePermissionModus.PRODUKTION;
import static de.ivu.elect.business.security.UseCasePermissionModus.TEST_MODUS;
import static de.ivu.elect.business.security.entity.UseCaseMandantArt.ALL;
import static de.ivu.elect.business.security.entity.UseCaseMandantArt.CUSTOMER;
import static de.ivu.elect.business.security.entity.UseCaseMandantArt.CUSTOMER_MANDANTEN_AKTIVIERT;
import static de.ivu.elect.business.security.entity.UseCaseMandantArt.OHNE_MANDANT;
import static de.ivu.elect.business.security.entity.UseCaseMandantArt.SYSTEM;
import static de.ivu.elect.business.security.entity.UseCaseMandantArt.SYSTEM_MANDANTEN_AKTIVIERT;

/**
 * Hier stehen alle Rechte fuer fachliche Prozesse und Use-Cases beschreiben
 * <p/>
 * Allein diese Sektion sollte erweitert werden. Fuer die Definition, welche fachlichen Rechte, welche anderen 'technischen' Rechte beinhalten steht die Klasse ElectCommonPermissionMapper zur
 * Verfuegung.
 * <p/>
 * Lokalisierung erfolgt in der Datei messages_elect.properties.
 */
public enum UseCasePermission implements Permission {

  DEAKTIVIERT(ALL, TEST),

  ANWENDUNG_BENUTZEN(ALL, MINIMAL),

  TFA_LOGIN_NICHT_NOTWENDIG(ALL, TFA_SUPPORT),
  TFA_SECRET_VERWALTEN(ALL, TFA_SUPPORT),

  MANDANT_EDIT(SYSTEM_MANDANTEN_AKTIVIERT, BASE),
  MANDANT_SEARCH(SYSTEM_MANDANTEN_AKTIVIERT, BASE),
  MANDANT_CREATE(SYSTEM_MANDANTEN_AKTIVIERT, BASE),
  MANDANT_DELETE(SYSTEM_MANDANTEN_AKTIVIERT, BASE),
  MANDANT_RESET(SYSTEM_MANDANTEN_AKTIVIERT, BASE),
  MANDANT_PASSWORD_RESET(SYSTEM_MANDANTEN_AKTIVIERT, BASE),
  MANDANT_BACKUP_ERSTELLEN(SYSTEM_MANDANTEN_AKTIVIERT, MANDANT_EXCHANGE),

  DASHBOARD_ANZEIGEN(CUSTOMER, DASHBOARD),
  DASHBOARD_NEWS_ANZEIGEN(CUSTOMER, DASHBOARD_NEWS),

  ONLINE_HILFE_ANZEIGEN(ALL, BASE),

  SKRIPT_AUSFUEHREN(SYSTEM, TEST_MODUS, SKRIPT_CONSOLE_SUPPORT),

  DATEI_STATUSUEBERSICHT_ANZEIGEN(SYSTEM, BASE),
  DATEIEN_BEREINIGEN(SYSTEM, BASE),
  PAPIERKORB_LEEREN(SYSTEM, BASE),

  LOESCH_PROTOKOLL_SEARCH(CUSTOMER, BASE),

  HINTERGRUNDDIENSTE_STATUSUEBERSICHT_ANZEIGEN(SYSTEM, BASE),
  HINTERGRUNDDIENSTE_AUSLOESEN(SYSTEM, BASE),
  HINTERGRUNDDIENSTE_AKTIVIEREN(SYSTEM, BASE),
  HINTERGRUNDDIENSTE_DEAKTIVIEREN(SYSTEM, BASE),
  TIMER_STATUSUEBERSICHT_ANZEIGEN(SYSTEM, BASE),

  GEBIETSART_CREATE(CUSTOMER, WUS, WVZ, WOS),
  GEBIETSART_EDIT(CUSTOMER, BASE),
  GEBIETSART_DELETE(CUSTOMER, BASE),
  GEBIETSART_SEARCH(CUSTOMER, BASE),

  GEBIETSGRUPPIERUNG_CREATE(CUSTOMER, COMMON),
  GEBIETSGRUPPIERUNG_EDIT(CUSTOMER, COMMON),
  GEBIETSGRUPPIERUNG_DELETE(CUSTOMER, COMMON),
  GEBIETSGRUPPIERUNG_SEARCH(CUSTOMER, COMMON),

  GEBIETSGRUPPIERUNG_IMPORTIEREN(CUSTOMER, COMMON),
  GEBIETSGRUPPIERUNG_EXPORTIEREN(CUSTOMER, COMMON),

  BENUTZER_SUCHPARAMETER_CREATE(ALL, BASE),
  BENUTZER_SUCHPARAMETER_EDIT(ALL, BASE),
  BENUTZER_SUCHPARAMETER_SEARCH(ALL, BASE),
  BENUTZER_SUCHPARAMETER_DELETE(ALL, BASE),

  BENUTZER_EINSATZORT_CREATE(CUSTOMER, BASE),
  BENUTZER_EINSATZORT_EDIT(CUSTOMER, BASE),
  BENUTZER_EINSATZORT_SEARCH(CUSTOMER, BASE),
  BENUTZER_EINSATZORT_DELETE(CUSTOMER, BASE),
  BENUTZER_EINSATZORT_IMPORTIEREN(CUSTOMER, BASE),
  BENUTZER_EINSATZORT_EXPORTIEREN(CUSTOMER, BASE),

  UI_TABLE_COLUMN_EDIT(ALL, BASE),

  KONFIGURATION_IMPORTIEREN(ALL, BASE),
  KONFIGURATION_EXPORTIEREN(ALL, BASE),

  TABELLEN_EXPORTIEREN(ALL, BASE, WES /* ELECTKOM-717 */),
  STATUS_UEBERSICHTEN_EXPORTIEREN(ALL, BASE),

  PROTOKOLL_EINTRAG_SEARCH(ALL, BASE),
  PROTOKOLL_EINTRAG_BENUTZERKENNUNG_SEHEN(ALL, BASE),

  SYSTEM_LOG_SEARCH(ALL, BASE),
  SYSTEM_LOG_DELETE(ALL, BASE),
  SYSTEM_LOG_EDIT(ALL, BASE),

  NACHRICHT_CREATE(ALL, BASE),
  NACHRICHT_EDIT(ALL, BASE),
  NACHRICHT_DELETE(ALL, BASE),
  NACHRICHT_SEARCH(ALL, BASE),

  MEMORY_MONITOR_SEARCH(ALL, BASE),
  MEMORY_MONITOR_EDIT(SYSTEM, BASE),
  MEMORY_GC(SYSTEM, BASE),
  MEMORY_HEAP_DUMP(SYSTEM, BASE),

  // ELECT-7910
  //  @Deprecated // Benutzerparameter
  //  BENUTZER_EINSTELLUNGEN_EDIT(ALL),
  //  @Deprecated // Benutzerparameter
  //  BENUTZER_EINSTELLUNGEN_DELETE(ALL),
  BENUTZER_PARAMETER_EDIT(ALL, BASE),
  BENUTZER_PARAMETER_SEARCH(ALL, BASE),
  BENUTZER_PARAMETER_DELETE(ALL),

  THREAD_DUMP_SEARCH(SYSTEM, BASE),

  HIBERNATE_STATISTIK_SEARCH(SYSTEM, BASE),
  HIBERNATE_CACHE_RESET(ALL, BASE),

  PERFORMANCE_STATISTIK_SEARCH(SYSTEM, BASE),

  IMPORTIERTE_DATEIEN_LOESCHEN(ALL, BASE),

  BENUTZER_IMPORTIEREN(ALL, BASE),
  BENUTZER_EXPORTIEREN(ALL, BASE),
  BENUTZER_GEBIETSSPEZIFISCH_IMPORTIEREN(CUSTOMER, DESTATIS_WUS_EXTERN),

  ROLLE_IMPORTIEREN(ALL, BASE),
  ROLLE_EXPORTIEREN(ALL, BASE),

  WAHL_KONFIGURATION_EXPORTIEREN(CUSTOMER, WOS, WUS),
  WAHL_KONFIGURATION_IMPORTIEREN(CUSTOMER, WOS, WUS),

  WAHLTERMIN_ZUR_BEARBEITUNG_AUSWAEHLEN(CUSTOMER, WOS, WVZ),
  WAHLTERMIN_UEBERSICHT_ANZEIGEN(CUSTOMER, WVZ),

  WAHLTERMIN_SPERREN(CUSTOMER, WOS, WVZ),
  WAHLTERMIN_ARCHIVIEREN(CUSTOMER, WOS, WVZ),
  WAHLTERMIN_ENTSPERREN(CUSTOMER, WOS, WVZ),

  WAHL_FUER_ERFASSER_FESTLEGEN(CUSTOMER, DESTATIS_WUS),
  WAHL_ZUR_BEARBEITUNG_AUSWAEHLEN(CUSTOMER, COMMON),
  WAHL_SPERREN(CUSTOMER, COMMON),
  WAHL_ARCHIVIEREN(CUSTOMER, COMMON),
  WAHL_ENTSPERREN(CUSTOMER, COMMON),
  WAHL_OEFFNEN_SCHLIESSEN(CUSTOMER, WAS),
  WAHL_UEBERSICHT_ANZEIGEN(CUSTOMER, WVZ),
  WAHL_EXPORTIEREN(CUSTOMER, CORE), // ELECTMUC-2221 mit der Zusammenlegung von WUS und WAS für KOM jetzt auch in WAS verfügbar
  WAHL_IMPORTIEREN(CUSTOMER, CORE),
  WAHL_FUER_WES_EXPORTIEREN(CUSTOMER, WES_UNTERSTUETZUNG),

  WAHL_EXPORTIEREN_GEBIET_AUFTEILEN(CUSTOMER, KOM_WAS),
  WAHL_FUER_SUBSYSTEME_KONFIGURIEREN(CUSTOMER_MANDANTEN_AKTIVIERT, CORE),
  WAHL_FUER_SUBSYSTEME_LOESCHEN(CUSTOMER_MANDANTEN_AKTIVIERT, TEST_MODUS, CORE),

  WAHL_PARAMETER_EDIT(CUSTOMER, BASE),
  WAHL_PARAMETER_EDIT_SECRETS_CLEAR_TEXT(CUSTOMER, BASE),
  WAHL_PARAMETER_DELETE(CUSTOMER, TEST),
  WAHL_PARAMETER_SEARCH(CUSTOMER, BASE),
  WAHL_PARAMETER_EXPORTIEREN(CUSTOMER, BASE),
  WAHL_PARAMETER_IMPORTIEREN(CUSTOMER, BASE),

  WAHL_DOKUMENT_PLATZHALTER_PARAMETER_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),

  GEBIETSARTEIGENSCHAFT_SEARCH(CUSTOMER, CORE), // Nur für WUS/WAS relevant
  GEBIETSARTEIGENSCHAFT_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE), // Nur für WUS/WAS relevant
  GEBIETSARTEIGENSCHAFT_DELETE(CUSTOMER), // NICHT RELEVANT

  VERANSTALTUNG_CREATE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  VERANSTALTUNG_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  VERANSTALTUNG_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  VERANSTALTUNG_DELETE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  VERANSTALTUNG_DOKUMENT_ERZEUGEN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  VERANSTALTUNG_IMPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, MUC_WOS/*ELECT-11894 Nur dort gibt es eine CSV Datei die importiert werden muss*/),
  TEILNAHME_IMPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),

  TEILNAHME_CREATE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  TEILNAHME_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  TEILNAHME_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  TEILNAHME_DELETE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),

  STATISTIK_LAUF_CREATE(CUSTOMER, WVZ), // erstmal nur im WVZ verwendet
  STATISTIK_LAUF_EDIT(CUSTOMER, WVZ), // erstmal nur im WVZ verwendet
  STATISTIK_LAUF_DELETE(CUSTOMER, WVZ), // erstmal nur im WVZ verwendet
  STATISTIK_LAUF_SEARCH(CUSTOMER, WVZ), // erstmal nur im WVZ verwendet
  STATISTIK_LAUF_EXPORTIEREN(CUSTOMER, WVZ), // erstmal nur im WVZ verwendet
  STATISTIK_LAUF_IMPORTIEREN(CUSTOMER, WVZ), // erstmal nur im WVZ verwendet

  STATISTIK_KENNZEICHEN_SEARCH(CUSTOMER, WVZ), // erstmal nur im WVZ verwendet

  STATISTIK_WAHLBERECHTIGTE_NACH_STIMMZETTELGEBIET(CUSTOMER, WVZ),
  STATISTIK_WAHLBERECHTIGTE_UND_WAHLSCHEINE_NACH_STADTBEZIRKEN(CUSTOMER, WVZ),
  STATISTIK_WAHLBERECHTIGTE_NACH_STAATSANGEHOERIGKEIT(CUSTOMER, WVZ),
  STATISTIK_WAHLBERECHTIGTE_JE_ALTERSGRUPPE_NACH_STADTBEZIRKEN(CUSTOMER, WVZ),
  STATISTIK_WAHLBERECHTIGTE_NACH_KENNZEICHEN_UND_AUSWAHLBEZIRK(CUSTOMER, WVZ),
  STATISTIK_WAHLBERECHTIGTE_AUSLANDSDEUTSCHE_NACH_KENNZEICHEN(CUSTOMER, WVZ),
  STATISTIK_ANZAHL_WAHLSCHEINE_NACH_DATUM_UND_AUSSTELLUNGSORT(CUSTOMER, WVZ),
  STATISTIK_ANZAHL_WAHLSCHEINE_NACH_DATUM_UND_AUSSTELLUNGSORT_KUMULIERT(CUSTOMER, WVZ),

  AUSZAHLUNG_CREATE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  AUSZAHLUNG_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  AUSZAHLUNG_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  AUSZAHLUNG_DELETE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  KONTODATEN_EXPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON), // = AUSZAHLUNG_EXPORTIEREN

  ENTSCHAEDIGUNGSART_CREATE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  ENTSCHAEDIGUNGSART_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  ENTSCHAEDIGUNGSART_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  ENTSCHAEDIGUNGSART_DELETE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),

  ENTSCHAEDIGUNGSART_IMPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  ENTSCHAEDIGUNGSART_EXPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),

  ENTSCHAEDIGUNG_CREATE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  ENTSCHAEDIGUNG_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  ENTSCHAEDIGUNG_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),
  ENTSCHAEDIGUNG_DELETE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),

  //  /**
  //   * @see UseCasePermission#ENTSCHAEDIGUNGSART_EDIT
  //   * @deprecated ELECTMUC-1268
  //   */
  //  @Deprecated
  //  ENTSCHAEDIGUNGSSATZ_EDIT(CUSTOMER),

  WAHL_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, WAS),

  GEBIET_IMPORTIEREN(CUSTOMER, BASE),
  GEBIET_STIMMBEZIRKE_IMPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_WUS)/* ELECT-3800 */, WUS, NL_WAS /* Stimmbezirke werden in NL im WAS angelegt */),
  GEBIET_EXPORTIEREN(CUSTOMER, WOS, WUS, WVZ, NL_WAS /* Stimmbezirke */),
  GEBIET_GEOMETRIE_IMPORTIEREN(CUSTOMER, CORE), // ELECT-3767 ELECT-4073 TODO MAL nach Core/Common verschieben, zur Zeit ohne sinnvolle Funktion, deaktiviert
  GEBIET_GEOMETRIE_EXPORTIEREN(CUSTOMER, CORE), // ELECT-3767 ELECT-4073 TODO MAL nach Core/Common verschieben, zur Zeit ohne sinnvolle Funktion, deaktiviert

  GEBIET_GEOMETRIE_IMPORTIEREN_GENERIC_GROOVY(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  GEBIET_GEOMETRIE_ANZEIGEN(CUSTOMER, CORE),
  GEBIET_GEOMETRIE_BEARBEITEN(CUSTOMER, TEST), // DEAKTIVIERT, GOOGLE-MAPS nicht kostenlos...

  GRUPPE_IMPORTIEREN(ALL /*ELECT-11963*/, WUS),
  GRUPPE_EXPORTIEREN(ALL /*ELECT-11963*/, WUS),

  STIMMZETTEL_EXPORTIEREN(CUSTOMER, WUS),
  STIMMZETTEL_WES_IMPORTIEREN(CUSTOMER, WES_UNTERSTUETZUNG),
  STIMMZETTEL_WES_IMPORTIEREN_OHNE_GUELTIGE_SIGNATUR(CUSTOMER, WES_UNTERSTUETZUNG),

  GRUPPE_IM_GEBIET_STATUS(CUSTOMER, WUS),
  GRUPPE_IM_GEBIET_ANZEIGEN(CUSTOMER, WUS),
  GRUPPE_IM_GEBIET_STATUS_BEARBEITEN(CUSTOMER, WUS),
  GRUPPE_IM_GEBIET_POSITIONEN_BEARBEITEN(CUSTOMER, WUS),
  GRUPPE_IM_GEBIET_POSITIONEN_ZURUECKSETZEN(CUSTOMER, WUS),

  //  @Deprecated // WASDE-1184 mit Reihenfolgen bestätigen zusammengelegt
  //  GRUPPE_IM_GEBIET_REIHENFOLGEN_BERECHNEN(CUSTOMER),
  GRUPPE_IM_GEBIET_EXPORTIEREN(CUSTOMER, WUS),
  GRUPPE_IM_GEBIET_IMPORTIEREN(CUSTOMER, WUS),

  GEWAEHLTE_IMPORTIEREN(CUSTOMER, DESTATIS_WUS),

  STIMMEN_IMPORTIEREN(CUSTOMER, WUS),
  STIMMEN_EXPORTIEREN(CUSTOMER, WUS),

  SITZE_IMPORTIEREN(CUSTOMER, WUS),
  SITZE_EXPORTIEREN(CUSTOMER, WUS),

  WVP_BENUTZER_ANZEIGEN(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_EDIT(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_CREATE(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_BULK_CREATE(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_DELETE(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_BULK_DELETE(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_SEARCH(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_ZUGRIFFSCODE_UMGEHEN(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_KONTO_CREATE(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_KONTO_DELETE(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_KONTO_BULK_DELETE(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_KONTO_RESTORE(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_KONTO_BULK_RESTORE(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_KONTO_PASSWORD_RESET(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_KONTO_FIXIEREN(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_KONTO_BULK_FIXIEREN(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_DATEN_IMPORTIEREN(CUSTOMER, WUS_INTERFACES_WVP),
  WVP_BENUTZER_DATEN_AUS_DATEI_IMPORTIEREN(CUSTOMER, NL_WUS),
  WVP_BENUTZER_DATEN_DIFF(CUSTOMER, WUS_INTERFACES_WVP),

  WVP_ADMINISTRIEREN(CUSTOMER, WUS_INTERFACES_WVP),

  WVP_WARNUNG_SEARCH(CUSTOMER, WUS_INTERFACES_WVP),

  ANGEMELDETE_BENUTZER_SEHEN(ALL, BASE),

  TESTDATEN_EXPORTIEREN(CUSTOMER, DESTATIS_WUS),

  DUBLETTEN_SEARCH(CUSTOMER, WUS), // TODO ELECT-852: die Dubletten-Permissions vereinheitlichen
  DUBLETTEN_SEARCH_STARTEN(CUSTOMER, WUS),
  DUBLETTEN_EDIT(CUSTOMER, COMMON), // TODO ELECT-852: in "Dubletten Auflösen" umbenennen

  /* sämtliche CRUD-Mappings */
  KONFIGURATION_EDIT(ALL, BASE),
  KONFIGURATION_EDIT_SECRETS_CLEAR_TEXT(ALL, BASE),
  KONFIGURATION_CREATE_VERZEICHNIS(ALL, BASE),
  KONFIGURATION_DELETE(ALL, TEST),
  KONFIGURATION_SEARCH(ALL, BASE),

  BENUTZER_EDIT(ALL, BASE),
  BENUTZER_CREATE(ALL, BASE),
  BENUTZER_DELETE(ALL, BASE),
  BENUTZER_SEARCH(ALL, BASE),
  BENUTZER_SEARCH_ALL(ALL, BASE), // ELECT-12577

  ROLLE_EDIT(ALL, BASE),
  ROLLE_CREATE(ALL, BASE),
  ROLLE_DELETE(ALL, BASE),
  ROLLE_SEARCH(ALL, BASE),
  ROLLE_SEARCH_ALL(ALL, BASE), // ELECT-12577

  EMAIL_LAYOUT_EDIT(SYSTEM, MAIL_SUPPORT),
  EMAIL_LAYOUT_CREATE(SYSTEM, MAIL_SUPPORT),
  EMAIL_LAYOUT_DELETE(SYSTEM, MAIL_SUPPORT),
  EMAIL_LAYOUT_SEARCH(SYSTEM, MAIL_SUPPORT),
  EMAIL_VORLAGE_EDIT(CUSTOMER, MAIL_SUPPORT),
  EMAIL_VORLAGE_CREATE(CUSTOMER, MAIL_SUPPORT),
  EMAIL_VORLAGE_DELETE(CUSTOMER, MAIL_SUPPORT),
  EMAIL_VORLAGE_SEARCH(CUSTOMER, MAIL_SUPPORT),
  EMAIL_VORLAGE_IMPORTIEREN(CUSTOMER, MAIL_SUPPORT),
  EMAIL_VORLAGE_EXPORTIEREN(CUSTOMER, MAIL_SUPPORT),
  EMAIL_VORGANG_EDIT(CUSTOMER, MAIL_SUPPORT),
  EMAIL_VORGANG_CREATE(CUSTOMER, MAIL_SUPPORT),
  EMAIL_VORGANG_DELETE(CUSTOMER, MAIL_SUPPORT),
  EMAIL_VORGANG_SEARCH(CUSTOMER, MAIL_SUPPORT),
  EMAIL_VORGANG_MASSENMAIL_CREATE(CUSTOMER, MAIL_SUPPORT),
  /**
   * @see UseCasePermission#EMAIL_VORGANG_EDIT
   * @deprecated
   */
  @Deprecated
  EMAIL_EDIT(CUSTOMER),
  //  /**
  //   * @see UseCasePermission#EMAIL_VORGANG_CREATE
  //   * @deprecated
  //   */
  //  @Deprecated
  //  EMAIL_CREATE(CUSTOMER),
  /**
   * @see UseCasePermission#EMAIL_VORGANG_DELETE
   * @deprecated
   */
  @Deprecated
  EMAIL_DELETE(CUSTOMER),
  /**
   * @see UseCasePermission#EMAIL_VORGANG_SEARCH
   * @deprecated
   */
  @Deprecated
  EMAIL_SEARCH(CUSTOMER),

  RECHTE_FUER_TESTMODUS_EDIT(ALL, BASE),
  SYSTEM_INFO_ANZEIGEN(SYSTEM, BASE),
  SYSTEM_UEBERSICHT_ANZEIGEN(SYSTEM, BASE),
  SYSTEM_STATUS_SEARCH(ALL, BASE),
  SYSTEM_STATUS_EDIT(ALL, BASE),

  REPLIKATION_STATUS_SEARCH(OHNE_MANDANT, REPLIKATION_SUPPORT),
  REPLIKATION_STATUS_EDIT(OHNE_MANDANT, REPLIKATION_SUPPORT),
  REPLIKATION_STATUS_RESET(OHNE_MANDANT, TEST_MODUS, REPLIKATION_SUPPORT),

  STAAT_EDIT(SYSTEM, BASE),
  STAAT_CREATE(SYSTEM, BASE),
  STAAT_DELETE(SYSTEM, BASE),
  STAAT_SEARCH(SYSTEM, BASE),

  STAATEN_IMPORTIEREN(SYSTEM, BASE),
  STAATEN_EXPORTIEREN(SYSTEM, BASE),

  STAATEN_GRUPPE_EDIT(CUSTOMER, BASE),
  STAATEN_GRUPPE_CREATE(CUSTOMER, BASE),
  STAATEN_GRUPPE_DELETE(CUSTOMER, BASE),
  STAATEN_GRUPPE_SEARCH(CUSTOMER, BASE),

  STAATEN_GRUPPE_IMPORTIEREN(CUSTOMER, BASE),
  STAATEN_GRUPPE_EXPORTIEREN(CUSTOMER, BASE),

  GEODATA_ORT_EDIT(SYSTEM, COMMON),
  GEODATA_ORT_CREATE(SYSTEM, COMMON),
  GEODATA_ORT_DELETE(SYSTEM, COMMON),
  GEODATA_ORT_SEARCH(SYSTEM, COMMON),

  GEODATA_ORT_IMPORTIEREN(SYSTEM, COMMON),
  GEODATA_ORT_EXPORTIEREN(SYSTEM, COMMON),

  /* ELECT-6785 */
  BERUF_EDIT(SYSTEM, WOS, WUS),
  BERUF_CREATE(SYSTEM, WOS, WUS),
  BERUF_DELETE(SYSTEM, WOS, WUS),
  BERUF_SEARCH(SYSTEM, WOS, WUS),

  BERUF_IMPORTIEREN(SYSTEM, COMMON),
  BERUF_EXPORTIEREN(SYSTEM, COMMON),

  WERTELISTEN_EDIT(CUSTOMER, WOS, WUS),
  WERTELISTEN_CREATE(CUSTOMER, WOS, WUS),
  WERTELISTEN_DELETE(CUSTOMER, WOS, WUS),
  WERTELISTEN_SEARCH(CUSTOMER, WOS, WUS),

  WERTELISTEN_IMPORTIEREN(CUSTOMER, WOS, WUS),
  WERTELISTEN_EXPORTIEREN(CUSTOMER, WOS, WUS),

  DOKUMENT_VORLAGE_CREATE(CUSTOMER, BASE),
  DOKUMENT_VORLAGE_SEARCH(CUSTOMER, BASE),
  DOKUMENT_VORLAGE_DELETE(CUSTOMER, BASE),
  DOKUMENT_VORLAGE_EDIT(CUSTOMER, BASE),
  DOKUMENT_VORLAGE_DIREKT_HOCHLADEN(CUSTOMER, BASE),

  WAHLTERMIN_EDIT(CUSTOMER, WOS, WVZ),
  WAHLTERMIN_CREATE(CUSTOMER, WOS, WVZ),
  WAHLTERMIN_DELETE(CUSTOMER, WOS, WVZ),
  WAHLTERMIN_SEARCH(CUSTOMER, WOS, WVZ),
  WAHLTERMIN_EXPORTIEREN(CUSTOMER, WOS),
  WAHLTERMIN_IMPORTIEREN(CUSTOMER, WOS),
  WAHLTERMIN_DOKUMENT_ERZEUGEN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, COMMON),

  WAHLTERMIN_STICHWAHL_CREATE(CUSTOMER, WOS, WVZ),
  WAHLTERMIN_COPY_CREATE(CUSTOMER, WVZ),
  WAHLTERMIN_DATEN_UEBERNEHMEN(CUSTOMER, WOS),

  WAHL_EDIT(CUSTOMER, CORE, WVZ), // Wahlen nur für WVZ, WAS und WUS interessant
  WAHL_CREATE(CUSTOMER, WUS, WVZ), // Wahlen nur für WVZ und WUS interessant
  WAHL_DELETE(CUSTOMER, TEST_MODUS /* ELECT-5919 */, CORE, WVZ), // Wahlen nur für WVZ, WAS und WUS interessant
  WAHL_SEARCH(CUSTOMER, CORE, WVZ), // Wahlen nur für WVZ, WAS und WUS interessant
  WAHL_RESET(CUSTOMER, TEST_MODUS /* ELECT-5919 */, WAS),
  WAHL_STIMMENUEBERGABE_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, STIMMENUEBERGABE_SUPPORT),

  WAHLART_SEARCH(CUSTOMER, CORE, WVZ), // Wahlen nur für WVZ, WAS und WUS interessant
  WAHLART_EDIT(CUSTOMER, CORE, WVZ), // Wahlen nur für WVZ, WAS und WUS interessant
  WAHLART_CREATE(CUSTOMER, WUS, WVZ), // nur im WVZ und WUS frei konfigurierbar
  WAHLART_DELETE(CUSTOMER, WUS, WVZ), // nur im WVZ und WUS frei konfigurierbar

  WAHL_ERGEBNISEINGANGSART_WECHSELN(CUSTOMER, WAS),
  WAHL_ERGEBNISEINGANGSART_WECHSELN_MIT_UEBERNAHME_VORHANDENER_ERGEBNISEINGAENGE(CUSTOMER, WAS),

  GEBIET_EDIT(CUSTOMER, BASE),
  GEBIET_CREATE(CUSTOMER, WUS, WOS, WVZ, NL_WAS/* Stimmbezirke in NL im WAS anlegbar */),
  GEBIET_DELETE(CUSTOMER, WUS, WOS, WVZ, NL_WAS/* Stimmbezirke in NL im WAS löschbar */),
  GEBIET_SEARCH(CUSTOMER, BASE),
  GEBIET_SORTIEREN(CUSTOMER, BASE),
  GEBIET_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, BASE),
  GEBIET_BEVOELKERUNGSZAHLEN_EDIT(CUSTOMER, DESTATIS_COMMON),
  GEBIET_UEBERNEHMEN(CUSTOMER, WUS), // prizipiell auch für WOS und WVZ möglich, Anpassung an Übernahme Code notwendig
  GEBIET_PRUEFKENNZEICHEN_GENERIEREN(CUSTOMER, WAS),
  GEBIET_EXTERNE_ID_UEBERSCHREIBEN(CUSTOMER, BASE), // ELECTKOM-776

  GEBIET_ALLE_EINSEHEN(CUSTOMER, BASE),
  GEBIET_ALLE_BEARBEITEN(CUSTOMER, BASE),

  WAHL_ALLE_EINSEHEN(CUSTOMER, BASE),

  GRUPPE_EDIT(ALL /*ELECT-11963*/, c -> c.equals(DESTATIS_WAS), CORE), // Gruppen können nur im WAS und WUS bearbeitet werden, aber nicht DESTATIS WAS ELECT-5665
  GRUPPE_LOGO_EDIT(ALL /*ELECT-11963*/, c -> c.equals(DESTATIS_WAS), CORE), // Gruppen können nur im WAS und WUS bearbeitet werden, aber nicht DESTATIS WAS ELECT-5665
  POLITISCHE_GRUPPE_CREATE(ALL /*ELECT-11963*/, WUS), // Gruppen können nur im WAS und WUS bearbeitet werden.
  GRUPPE_DELETE(ALL /*ELECT-11963*/, WUS), // Gruppen können nur im WAS und WUS bearbeitet werden.
  GRUPPE_SEARCH(ALL /*ELECT-11963*/, CORE), // Gruppen können nur im WAS und WUS bearbeitet werden.
  GRUPPE_UEBERNEHMEN(CUSTOMER, WUS),

  ERGEBNIS_EDIT(CUSTOMER, CORE),
  ERGEBNIS_CREATE(CUSTOMER, CORE),
  ERGEBNIS_DELETE(CUSTOMER, CORE),
  ERGEBNIS_SEARCH(CUSTOMER, CORE),
  ERGEBNIS_BERECHNUNG_AUSLOESEN(CUSTOMER, WAS),

  ERGEBNIS_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, WAS),

  ERGEBNIS_KONFLIKT_EDIT(CUSTOMER, WAS),
  ERGEBNIS_KONFLIKT_CREATE(CUSTOMER, WAS),
  ERGEBNIS_KONFLIKT_DELETE(CUSTOMER, WAS),
  ERGEBNIS_KONFLIKT_SEARCH(CUSTOMER, WAS),

  ERGEBNIS_LOG_EINTRAG_SEARCH(CUSTOMER, WAS),
  BESONDERHEIT_SEARCH(CUSTOMER, WAS),

  /**
   * @deprecated ELECT-10051
   */
  @Deprecated
  ERGEBNIS_SITZVERTEILUNG_ANZEIGEN(CUSTOMER, WAS),

  ERGEBNIS_KUMULIERTE_STIMMEN_ANZEIGEN(CUSTOMER, WAS),
  ERGEBNIS_GEWINNER_UNTERLEGENER_ANZEIGEN(CUSTOMER, WAS),
  ERGEBNIS_GRUPPEN_NACH_GEBIETEN_ANZEIGEN(CUSTOMER, WAS),

  ERGEBNIS_EXPORTIEREN(CUSTOMER, WAS),

  ERGEBNIS_EXPORTUEBERSICHT_ANZEIGEN(CUSTOMER, DESTATIS_WAS),

  ERGEBNIS_EXPORTUEBERSICHT_LWL_ANZEIGEN(CUSTOMER, DESTATIS_WAS),
  ERGEBNIS_KORREKTUR_LWL_EXPORT_HOCHLADEN(CUSTOMER, DESTATIS_WAS),

  PRAESENTATION_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, PRAESENTATION_WAS),
  PRAESENTATION_KONFIGURIEREN(CUSTOMER, PRAESENTATION_WAS),
  PRAESENTATION_EXPORTIEREN(CUSTOMER, PRAESENTATION_WAS),
  PRAESENTATION_OEFFNEN(CUSTOMER, PRAESENTATION_WAS),
  PRAESENTATION_INTERNE_BETRACHTEN(CUSTOMER, PRAESENTATION_WAS),
  PRAESENTATION_PLATZHALTER_EDIT(CUSTOMER, PRAESENTATION_WAS),

  STIMMEN_SEARCH(CUSTOMER, WUS),
  STIMMEINGABE_ANZEIGEN(CUSTOMER, WAS), // ELECT-9738
  STIMMEINGABE_CREATE(CUSTOMER, WAS),
  STIMMEINGABE_CREATE_OHNE_PRUEFKENNZEICHEN(CUSTOMER, TEST_MODUS, WAS),
  STIMMEINGABE_CREATE_NACH_GUELTIGEM_ERGEBNISEINGANG(CUSTOMER, WAS),
  STIMMEINGABE_CREATE_EINGANGSHERKUNFT_IGNORIEREN(CUSTOMER, WAS),
  STIMMEINGABE_ERGEBNISEINGANGSART_WECHSELN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, WAS),
  STIMMEINGABE_ERGEBNISEINGANG_WIEDERHERSTELLEN(CUSTOMER, WAS),
  STIMMEINGABE_ENDGUELTIG_OHNE_VORLAEUFIG_ERFASSEN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, WAS),
  STIMMEINGABE_FORTSCHRITT_GEBIETSBAUM_ANZEIGEN(CUSTOMER, WAS),

  //  @Deprecated // STIMMEINGABE_TESTWERTE_FUELLEN verwenden
  //  STIMMEINGABE_FIKTIVE_WERTE_FUELLEN(CUSTOMER), // Fiktive Werte für Produktivbetrieb

  STIMMEINGABE_TESTWERTE_FUELLEN(CUSTOMER, WAS), // Fiktive Werte zu Testzwecken
  STIMMEINGABE_FEHLER_BESTAETIGEN(CUSTOMER, WAS),
  STIMMEINGABE_FEHLER_BESTAETIGEN_FUER_AUSGEWAEHLTE_GEBIETE(CUSTOMER, WAS),
  STIMMEINGABE_EXPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_WAS), WAS),
  STIMMEINGABE_IMPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-4143 */, WAS),
  STIMMEINGABE_IMPORTIEREN_CUSTOM(CUSTOMER, DESTATIS_WAS, NL_WAS), // ELECT-4143, ELECT-11885
  STIMMEINGABE_IMPORT_STATUS_SEARCH(CUSTOMER, WAS),
  STIMMEINGABE_DELETE(CUSTOMER, WAS),
  STIMMEINGABE_DELETE_FUER_AUSGEWAEHLTE_GEBIETE(CUSTOMER, TEST_MODUS /* ELECT-5919 */, WAS),
  STIMMEINGABE_DELETE_VORSTUFEN(CUSTOMER, NL_WAS),
  STIMMEINGABE_AUS_VORSTUFE_UEBERNEHMEN(CUSTOMER, NL_WAS),

  STIMMEINGABE_AUFFAELIGKEIT_SEARCH(CUSTOMER, WAS),
  STIMMEINGABE_HOCHGERECHNET_SEARCH(CUSTOMER, WAS),

  STIMMEINGABE_TABELLE_AUSDRUCKEN(CUSTOMER, WAS), // ELECT-6382

  STIMMZETTEL_CREATE(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),
  STIMMZETTEL_EDIT(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),
  STIMMZETTEL_EDIT_NUMMER(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),
  STIMMZETTEL_SEARCH(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),
  STIMMZETTEL_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),
  STIMMZETTEL_ERGEBNISEINGANG_ANLEGEN(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),
  STIMMZETTEL_DELETE(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),
  STIMMZETTEL_BULK_DELETE(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),

  STIMMZETTEL_KOPFDATUM_EDIT(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),
  STIMMZETTEL_KOPFDATUM_SEARCH(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),
  STIMMZETTEL_KOPFDATUM_DELETE(CUSTOMER, WAS_STIMMZETTEL_EINZELERFASSUNG),

  //  @Deprecated // TODO
  //  STIMMZETTEL_KOPFDATUM_BULK_DELETE(CUSTOMER),

  WAHLLOKALSYSTEM_STATUS_EDIT(CUSTOMER, MUC_WAS),
  WAHLLOKALSYSTEM_STATUS_SEARCH(CUSTOMER, MUC_WAS),
  WAHLLOKALSYSTEM_STATUS_DELETE(CUSTOMER),

  //  /**
  //   * siehe UseCasePermission#STIMMEINGABE_PLAUSI_*
  //   *
  //   * @deprecated Seit WASDE-1340 obsolet...
  //   */
  //  @Deprecated
  //  STIMMEINGABE_PLAUSI_DEFINITION_SEARCH(CUSTOMER, WAS), // WASDE-1339

  // WASDE-1340
  STIMMEINGABE_PLAUSI_CREATE(CUSTOMER, WAS),
  STIMMEINGABE_PLAUSI_EDIT(CUSTOMER, WAS),
  STIMMEINGABE_PLAUSI_SEARCH(CUSTOMER, WAS),
  STIMMEINGABE_PLAUSI_EXPORTIEREN(CUSTOMER, WAS),
  STIMMEINGABE_PLAUSI_IMPORTIEREN(CUSTOMER, WAS),
  STIMMEINGABE_PLAUSI_DELETE(CUSTOMER, WAS),
  STIMMEINGABE_PLAUSI_MUSS_FEHLER_DEAKTIVIEREN(CUSTOMER, WAS),

  //  /**
  //   * @deprecated Recht ERGEBNISEINGANG_STATUS ist notwendig, wenn das Recht zur Stimmeinagbe vorhanden ist... daher nicht mehr verwenden.
  //   */
  //  @Deprecated
  //  ERGEBNISEINGANG_STATUS(CUSTOMER),
  ERGEBNISEINGANG_SEARCH(CUSTOMER, WAS),

  GEBIET_WAHLBETEILIGUNG_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS) || c.equals(SL_WAS), WAS),

  WAHLBETEILIGUNG_AUSWERTUNG_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS) || c.equals(SL_WAS), WAS),
  WAHLBETEILIGUNG_AUSWERTUNG_CREATE(CUSTOMER, c -> c.equals(DESTATIS_WAS) || c.equals(SL_WAS), WAS),
  WAHLBETEILIGUNG_AUSWERTUNG_WAHLLOKALSYSTEM_CREATE(CUSTOMER, c -> c.equals(DESTATIS_COMMON) || c.equals(SL_COMMON), WAS),
  WAHLBETEILIGUNG_AUSWERTUNG_DELETE(CUSTOMER, c -> c.equals(DESTATIS_WAS) || c.equals(SL_WAS), WAS),
  WAHLBETEILIGUNG_AUSWERTUNG_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS) || c.equals(SL_WAS), WAS),
  WAHLBETEILIGUNG_AUSWERTUNG_EXPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_WAS) || c.equals(SL_WAS), WAS),
  WAHLBETEILIGUNG_AUSWERTUNG_IMPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_WAS) || c.equals(SL_WAS), WAS),

  WAHLBETEILIGUNG_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS) || c.equals(SL_WAS), WAS),

  WAHLBETEILIGUNG_VERLAUF_EDIT(CUSTOMER, c -> c.equals(DESTATIS_COMMON) || c.equals(SL_COMMON), CORE),
  WAHLBETEILIGUNG_VERLAUF_CREATE(CUSTOMER, c -> c.equals(DESTATIS_COMMON) || c.equals(SL_COMMON), CORE),
  WAHLBETEILIGUNG_VERLAUF_AUS_AUSWERTUNG_CREATE(CUSTOMER, c -> c.equals(DESTATIS_COMMON) || c.equals(SL_COMMON), WAS),
  WAHLBETEILIGUNG_VERLAUF_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_COMMON) || c.equals(SL_COMMON), CORE),
  WAHLBETEILIGUNG_VERLAUF_DELETE(CUSTOMER, c -> c.equals(DESTATIS_COMMON) || c.equals(SL_COMMON), CORE),
  WAHLBETEILIGUNG_VERLAUF_EXPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_COMMON) || c.equals(SL_COMMON), CORE),
  WAHLBETEILIGUNG_VERLAUF_IMPORTIEREN(CUSTOMER, c -> c.equals(DESTATIS_COMMON) || c.equals(SL_COMMON), CORE),

  WAHLBETEILIGUNG_VERLAUF_GEBIET_EDIT(CUSTOMER, c -> c.equals(DESTATIS_COMMON) || c.equals(SL_COMMON), CORE),
  WAHLBETEILIGUNG_VERLAUF_GEBIET_CREATE(CUSTOMER),
  WAHLBETEILIGUNG_VERLAUF_GEBIET_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_COMMON) || c.equals(SL_COMMON), CORE),
  WAHLBETEILIGUNG_VERLAUF_GEBIET_DELETE(CUSTOMER),

  //  /**
  //   * @deprecated Nicht mehr notwendig, da alles mit GEBIET_WAHLBETEILIGUNG_EDIT und Gebietspermissions abgewicket wird.
  //   */
  //  @Deprecated
  //  WAHLBETEILIGUNG_AUSWERTUNG_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER),

  NIEDERSCHRIFT_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, MUC_WAS /* ELECT-8940 */),
  NIEDERSCHRIFT_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, MUC_WAS /* ELECT-8940 */),
  NIEDERSCHRIFT_KORREKTUR_CREATE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, WAS),
  NIEDERSCHRIFT_KORREKTUR_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, WAS),
  NIEDERSCHRIFT_KORREKTUR_DELETE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, WAS),
  NIEDERSCHRIFT_KORREKTUR_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, WAS),
  NIEDERSCHRIFT_STATUS_AENDERUNG_CREATE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, MUC_WAS/* ELECT-8940 */),
  NIEDERSCHRIFT_STATUS_AENDERUNG_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, MUC_WAS/* ELECT-8940 */),

  EXTERNER_ABGLEICH_SEARCH(CUSTOMER, WUS),
  EXTERNER_ABGLEICH_SEARCH_WAHLVORSCHLAEGE(CUSTOMER, WUS),
  EXTERNER_ABGLEICH_EDIT(CUSTOMER, WUS),
  EXTERNER_ABGLEICH_START(CUSTOMER, WUS),

  SITZE_SEARCH(CUSTOMER, CORE),

  LISTE_EDIT(CUSTOMER, WUS),
  LISTE_CREATE(CUSTOMER, WUS),
  LISTE_DELETE(CUSTOMER, WUS),
  LISTE_SEARCH(CUSTOMER, CORE),

  LISTENVERBINDUNG_CREATE(CUSTOMER, WUS),
  LISTENVERBINDUNG_EDIT(CUSTOMER, WUS),
  LISTENVERBINDUNG_DELETE(CUSTOMER, WUS),
  LISTENVERBINDUNG_SEARCH(CUSTOMER, WUS),

  REFERENDUM_VORLAGE_EDIT(CUSTOMER, WUS),
  REFERENDUM_VORLAGE_CREATE(CUSTOMER, WUS),
  REFERENDUM_VORLAGE_DELETE(CUSTOMER, WUS),
  REFERENDUM_VORLAGE_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),

  REFERENDUM_OPTION_EDIT(CUSTOMER, WUS),
  REFERENDUM_OPTION_CREATE(CUSTOMER, WUS),
  REFERENDUM_OPTION_DELETE(CUSTOMER, WUS),
  REFERENDUM_OPTION_SEARCH(CUSTOMER, WUS),

  WAHLVORSCHLAG_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, WUS),
  WAHLVORSCHLAG_IMPORTIEREN(CUSTOMER, WUS, NL_WAS/* bei Nl im WAS möglich eml230 */),
  WAHLVORSCHLAG_EXPORTIEREN(CUSTOMER, WUS),
  WAHLVORSCHLAG_STATUS(CUSTOMER, DESTATIS_WUS),

  WAHLVORSCHLAG_GRUPPE_WECHSELN(CUSTOMER, WUS),

  /**
   * @deprecated über Ergebnisexport
   */
  @Deprecated
  DOKUMENT_ERZEUGEN_KANDIDATUR_GEWAEHLT_BENACHRICHTIGEN(CUSTOMER, MUC_WAS),

  KANDIDATUR_GEWAEHLT_SEARCH(CUSTOMER, WAS),
  KANDIDATUR_GEWAEHLT_EXPORTIEREN(CUSTOMER, WAS),

  DIREKTKANDIDATUR_EDIT(CUSTOMER, WUS),
  DIREKTKANDIDATUR_PRAESENTATION_PROPERTIES_EDIT(CUSTOMER, DESTATIS_WUS),
  DIREKTKANDIDATUR_CREATE(CUSTOMER, WUS),
  DIREKTKANDIDATUR_DELETE(CUSTOMER, WUS),
  DIREKTKANDIDATUR_SEARCH(CUSTOMER, CORE),

  LISTENKANDIDATUR_EDIT(CUSTOMER, WUS),
  LISTENKANDIDATUR_REIHENFOLGE_EDIT(CUSTOMER, WUS),
  LISTENKANDIDATUR_PRAESENTATION_PROPERTIES_EDIT(CUSTOMER, DESTATIS_WUS),
  LISTENKANDIDATUR_CREATE(CUSTOMER, WUS),
  LISTENKANDIDATUR_DELETE(CUSTOMER, WUS),
  LISTENKANDIDATUR_SEARCH(CUSTOMER, CORE),

  ERSATZKANDIDATUR_EDIT(CUSTOMER, WUS),
  ERSATZKANDIDATUR_PRAESENTATION_PROPERTIES_EDIT(CUSTOMER, DESTATIS_WUS),
  ERSATZKANDIDATUR_CREATE(CUSTOMER, WUS),
  ERSATZKANDIDATUR_DELETE(CUSTOMER, WUS),

  WAEHLER_BENANNTE_KANDIDATUR_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, WAS),
  WAEHLER_BENANNTE_KANDIDATUR_CREATE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, WAS),
  WAEHLER_BENANNTE_KANDIDATUR_DELETE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, WAS),

  KANDIDATUR_EXPORTIEREN(CUSTOMER, CORE),
  KANDIDATUR_SEARCH(CUSTOMER, CORE),
  KANDIDATUR_EDIT(CUSTOMER, CORE),
  KANDIDATUR_DELETE(CUSTOMER, CORE),
  KANDIDATUR_KONFLIKT_SEARCH(CUSTOMER, WUS),
  KANDIDATUR_KONFLIKT_EDIT(CUSTOMER, WUS),
  KANDIDATUR_KONFLIKT_SICHTPRUEFUNG_EDIT(CUSTOMER, DESTATIS_WUS),

  WAHLVORSCHLAGS_PERSON_EDIT(CUSTOMER, WUS),
  WAHLVORSCHLAGS_PERSON_CREATE(CUSTOMER, WUS),
  WAHLVORSCHLAGS_PERSON_DELETE(CUSTOMER, WUS),
  WAHLVORSCHLAGS_PERSON_SEARCH(CUSTOMER, WUS),
  WAHLVORSCHLAGS_PERSON_SEARCH_ALL(CUSTOMER, WUS), // ELECT-10614
  WAHLVORSCHLAGS_PERSON_KONFLIKT_SEARCH(CUSTOMER, WUS),
  WAHLVORSCHLAGS_PERSON_KONFLIKT_EDIT(CUSTOMER, WUS),
  WAHLVORSCHLAGS_PERSON_EXPORTIEREN(CUSTOMER, WUS),
  WAHLVORSCHLAGS_PERSON_IMPORTIEREN(CUSTOMER, WUS),

  // NOTE ELECT-6199, UNTERSTUETZER* nur für Standard und MUC!
  UNTERSTUETZER_EDIT(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_CREATE(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_CREATE_DOKUMENT_UNTERSTUETZER_UNTERSCHRIFT_OPTIONAL(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_CREATE_DOKUMENT_UNTERSTUETZER_UNTERSCHRIFT_REQUIRED(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_CREATE_UNTERSTUETZERLISTE(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_DELETE(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_SEARCH(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_STATUSUEBERSICHT_EXPORTIEREN(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_KONFLIKT_SEARCH(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_KONFLIKT_EDIT(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_IMPORT(CUSTOMER, MUC_WUS),
  UNTERSTUETZER_QS(CUSTOMER, MUC_WUS),
  EXTERNER_ABGLEICH_SEARCH_UNTERSTUETZER(CUSTOMER, MUC_WUS),
  DOKUMENT_ERZEUGEN_UNTERSTUETZER_UNTERSCHRIFT(CUSTOMER, MUC_WUS),

  // ELECTDD-6
  UNTERSTUETZER_ANZAHL_IMPORT(CUSTOMER, DD_WUS),

  // NOTE ELECT-6199, EINTRAGUNGSLISTE* (für Unterstützer) nur für Standard und MUC!
  EINTRAGUNGSLISTE_CREATE(CUSTOMER, MUC_WUS),
  EINTRAGUNGSLISTE_EDIT(CUSTOMER, MUC_WUS),
  EINTRAGUNGSLISTE_DELETE(CUSTOMER, MUC_WUS),
  EINTRAGUNGSLISTE_SEARCH(CUSTOMER, MUC_WUS),

  // FREMDKANDIDATUR* im Moment nur für München relevant
  FREMDKANDIDATUR_CREATE(CUSTOMER, MUC_WUS),
  FREMDKANDIDATUR_EDIT(CUSTOMER, MUC_WUS),
  FREMDKANDIDATUR_DELETE(CUSTOMER, MUC_WUS),
  FREMDKANDIDATUR_SEARCH(CUSTOMER, MUC_WUS),
  FREMDKANDIDATUR_KONFLIKT_SEARCH(CUSTOMER, MUC_WUS),
  FREMDKANDIDATUR_KONFLIKT_EDIT(CUSTOMER, MUC_WUS),
  DOKUMENT_ERZEUGEN_FREMDKANDIDATUR_BESCHEINIGUNG(CUSTOMER, MUC_WUS),

  PRUEFKRITERIUM_CREATE(CUSTOMER, WUS),
  PRUEFKRITERIUM_EDIT(CUSTOMER, WUS),
  PRUEFKRITERIUM_DELETE(CUSTOMER, WUS),
  PRUEFKRITERIUM_SEARCH(CUSTOMER, WUS),
  PRUEFKRITERIUM_IMPORT(CUSTOMER, WUS),
  PRUEFKRITERIUM_EXPORT(CUSTOMER, WUS),

  WAHLRECHTSPRUEFUNG_SEARCH(CUSTOMER, WUS),
  WAHLRECHTSPRUEFUNG_EDIT(CUSTOMER, WUS),
  WAHLRECHTSPRUEFUNG_CREATE(CUSTOMER, WUS),
  WAHLRECHTSPRUEFUNG_DELETE(CUSTOMER, WUS),

  WAHLVORSCHLAG_QS(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLVORSCHLAG_QS_ZULASSUNG_ABLEHNEN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLVORSCHLAG_QS_ZULASSUNG_ZURUECKSETZEN(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLVORSCHLAG_QS_ZULASSUNG_AENDERN_NACHTRAEGLICH_AMTSANNAHME_VERWEIGERT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLVORSCHLAG_QS_ZULASSUNG_AENDERN_NACHTRAEGLICH_AMTSANNAHME_UNZULAESSIG(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLVORSCHLAG_QS_ZULASSUNG_AENDERN_NACHTRAEGLICH_KEINE_ZULASSUNGSFAEHIGKEIT_BEIM_ZULASSUNGSAUSSCHUSS(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLVORSCHLAG_QS_ZULASSUNG_AENDERN_NACHTRAEGLICH_KEINE_ZULASSUNGSFAEHIGKEIT_NACH_ZULASSUNGSAUSSCHUSS(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLVORSCHLAG_QS_FUER_ALLE_ZULASSUNGSVORSCHLAG_SETZEN(CUSTOMER, WUS),

  WAHLAUSSCHUSSMITGLIED_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLAUSSCHUSSMITGLIED_CREATE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLAUSSCHUSSMITGLIED_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLAUSSCHUSSMITGLIED_DELETE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLAUSSCHUSSMITGLIED_KONFLIKT_SEARCH(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),
  WAHLAUSSCHUSSMITGLIED_KONFLIKT_EDIT(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),

  WAHLAUSSCHUSS_UEBERNEHMEN(CUSTOMER, WAS),

  INTERNET_SEITE_CREATE(CUSTOMER, PRAESENTATION_WUS, PRAESENTATION_WAS),
  INTERNET_SEITE_EDIT(CUSTOMER, PRAESENTATION_WUS, PRAESENTATION_WAS),
  INTERNET_SEITE_SEARCH(CUSTOMER, PRAESENTATION_WUS, PRAESENTATION_WAS),
  INTERNET_SEITE_DELETE(CUSTOMER, PRAESENTATION_WUS, PRAESENTATION_WAS),

  INTERNET_WIDGET_CREATE(CUSTOMER, PRAESENTATION_WUS, PRAESENTATION_WAS),
  INTERNET_WIDGET_EDIT(CUSTOMER, PRAESENTATION_WUS, PRAESENTATION_WAS),
  INTERNET_WIDGET_SEARCH(CUSTOMER, PRAESENTATION_WUS, PRAESENTATION_WAS),
  INTERNET_WIDGET_DELETE(CUSTOMER, PRAESENTATION_WUS, PRAESENTATION_WAS),

  INTERNET_KONFIGURATION_EXPORTIEREN(CUSTOMER, PRAESENTATION_WUS, PRAESENTATION_WAS),
  INTERNET_KONFIGURATION_IMPORTIEREN(CUSTOMER, PRAESENTATION_WUS, PRAESENTATION_WAS),

  /* WOS */
  BRIEFWAHLBEZIRK_CREATE(CUSTOMER, WOS),
  BRIEFWAHLBEZIRK_SEARCH(CUSTOMER, WOS),

  STIMMBEZIRK_CREATE(CUSTOMER, WOS, WAS),

  WAHLHELFER_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, WOS),
  WAHLHELFER_SEARCH(CUSTOMER, WOS),
  WAHLHELFER_ANMELDE_STATISTIK_SEARCH(CUSTOMER, WOS),
  WAHLHELFER_SEARCH_KOMPLEX(CUSTOMER, WOS), // ELECTMUC-2066, bspw. für Rolle Admin...
  WAHLHELFER_CREATE(CUSTOMER, WOS),
  WAHLHELFER_EDIT(CUSTOMER, WOS),
  WAHLHELFER_ANZEIGEN(CUSTOMER, WOS), // ELECTMUC-2066, bspw. für Rolle Auskunftberechtigter
  WAHLHELFER_DELETE(CUSTOMER, WOS),
  WAHLHELFER_DELETE_INCLUDE_WAHLHELFERDATENBANK_AND_ZUKUENFTIGE_WAHLERMINE(CUSTOMER, WOS), // ELECTKOM-318
  WAHLHELFER_EINSATZSTATUS_EDIT(CUSTOMER, WOS),
  WAHLHELFER_KONTODATEN_EINSEHEN(CUSTOMER, WOS), // ELECTMUC-1431
  WAHLHELFER_IMPORT(CUSTOMER, WOS),
  WAHLHELFER_AUTOMATISCH_ZUORDNEN(CUSTOMER, WOS),
  WAHLHELFER_ZUORDNEN(CUSTOMER, WOS),
  WAHLHELFER_SCHICHT_ZUORDNEN(CUSTOMER, WOS),
  WAHLHELFER_EXPORTIEREN(CUSTOMER, WOS),
  WAHLHELFER_KONFLIKT_SEARCH(CUSTOMER, WOS),
  WAHLHELFER_KONFLIKT_EDIT(CUSTOMER, WOS),
  WAHLHELFER_KONFLIKT_KONTODATENAENDERUNG_BEARBEITER_BESTAETIGUNG_ERFORDERLICH_EDIT(CUSTOMER, MUC_WOS),

  // ELECTMUC-2057, Wahlhelfereinsatzbereitschaft
  WAHLHELFER_EINSATZBEREITSCHAFT_ANFRAGEN(CUSTOMER, WOS), // ELECT-8226
  WAHLHELFER_EINSATZBEREITSCHAFT_BESTAETIGEN(CUSTOMER, WOS),
  WAHLHELFER_ENTSCHULDIGEN(CUSTOMER, WOS), // ELECTMUC-1432, a.k.a. WAHLHELFER_EINSATZBEREITSCHAFT_ENTSCHULDIGEN
  WAHLHELFER_EINSATZSTATUS_ENTSCHULDIGT_ODER_UNENTSCHULDIGT_ABWESEND_SETZEN(CUSTOMER, WOS),
  WAHLHELFER_ABWESENHEITSGRUND_EINSEHEN(CUSTOMER, WOS), // ELECTMUC-1124

  WAHLHELFEREINSATZ_EXPORTIEREN(CUSTOMER, WOS),

  ORGANISATIONSEINHEIT_EDIT(CUSTOMER, WOS),
  ORGANISATIONSEINHEIT_CREATE(CUSTOMER, WOS),
  ORGANISATIONSEINHEIT_DELETE(CUSTOMER, WOS),
  ORGANISATIONSEINHEIT_SEARCH(CUSTOMER, WOS),
  ORGANISATIONSEINHEIT_EXPORT(CUSTOMER, WOS),
  ORGANISATIONSEINHEIT_IMPORT(CUSTOMER, WOS),

  DOKUMENT_ERZEUGEN_WAHLHELFER_BENACHRICHTIGEN(CUSTOMER, WOS),
  DOKUMENT_ERZEUGEN_WAHLHELFER_BENACHRICHTIGEN_BENACHRICHTIGT_SETZEN(CUSTOMER, WOS),
  DOKUMENT_ERZEUGEN_BRIEFWAHLTISCH_BESETZUNG(CUSTOMER, WOS),
  DOKUMENT_ERZEUGEN_WAHLLOKAL_BESETZUNG(CUSTOMER, WOS),
  DOKUMENT_ERZEUGEN_WAHLHELFEREINSATZORT_UEBERSICHT(CUSTOMER, WOS),
  DOKUMENT_ERZEUGEN_STANDORT_UEBERSICHT(CUSTOMER, WOS),
  DOKUMENT_ERZEUGEN_STANDORT_MIETVERTRAG(CUSTOMER, WOS), // = DOKUMENT_ERZEUGEN_STANDORT_VERMIETER_ENTSCHAEDIGUNG
  DOKUMENT_ERZEUGEN_STANDORT_HAUSMEISTERQUITTUNG(CUSTOMER, WOS), // = DOKUMENT_ERZEUGEN_STANDORT_ANSPRECHPARTNER_ENTSCHAEDIGUNG

  //  /**
  //   * @see UseCasePermission#DOKUMENT_ERZEUGEN_WAHLVORSCHLAEGE_ALS_LISTE
  //   * @deprecated
  //   */
  //  @Deprecated
  //  DOKUMENT_ERZEUGEN_BEKANNTMACHUNG_WAHLVORSCHLAEGE(CUSTOMER),

  DOKUMENT_ERZEUGEN_WAHLVORSCHLAG(CUSTOMER, WUS),
  DOKUMENT_ERZEUGEN_WAHLVORSCHLAEGE_ALS_LISTE(CUSTOMER, WUS),
  DOKUMENT_ERZEUGEN_KANDIDATUREN_ALS_LISTE(CUSTOMER, WUS),
  DOKUMENT_ERZEUGEN_WAHLBEWERBER(CUSTOMER, WUS),
  DOKUMENT_ERZEUGEN_GRUPPE_MITWAHLVORSCHLAEGEN_ALS_LISTE(CUSTOMER, WUS),

  DOKUMENT_ERZEUGEN_NIEDERSCHRIFT(CUSTOMER, c -> c.equals(DESTATIS_WUS) /* ELECT-5945 */, CORE),
  DOKUMENT_ERZEUGEN_BEKANNTMACHUNG_ERGEBNIS(CUSTOMER, WAS),
  DOKUMENT_ERZEUGEN_NIEDERSCHRIFT_WAHLAUSSCHUSS(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, WAS),
  DOKUMENT_ERZEUGEN_WAHLAUSSCHUSS_ALS_LISTE(CUSTOMER, c -> c.equals(DESTATIS_WAS)/* ELECT-5902 */, CORE),

  DOKUMENT_ERZEUGEN_WAHLVORSCHLAG_EMPFANGSQUITTUNG(CUSTOMER, WUS),
  DOKUMENT_ERZEUGEN_GESAMT_ERGEBNIS(CUSTOMER, WAS),
  DOKUMENT_ERZEUGEN_GESAMT_ERGEBNIS_VERGLEICH(CUSTOMER, WAS), // ELECTKOM-1588
  DOKUMENT_ERZEUGEN_WAHLBUCH(CUSTOMER, DESTATIS_WAS, KOM_BB_WAS, KOM_BE_WAS), // ELECT-4432, ELECT-11412

  DOKUMENT_ERZEUGEN_BULK_EXPORT_ERGEBNISDOKUMENTE(CUSTOMER, KOM_WAS), // ELECT-8589

  PERSONENDATEN_DATEI_EXPORT_SEARCH(CUSTOMER, BASE), // ELECTMUC-1742

  TAG_SEARCH(CUSTOMER, TAG_SUPPORT),
  TAG_CREATE(CUSTOMER, TAG_SUPPORT),
  TAG_EDIT(CUSTOMER, TAG_SUPPORT),
  TAG_DELETE(CUSTOMER, TAG_SUPPORT),

  GLOBALER_WAHLHELFERBEDARF_EDIT(CUSTOMER, WOS),
  INDIVIDUELLER_WAHLHELFERBEDARF_EDIT(CUSTOMER, WOS),

  EINSATZTAG_EDIT(CUSTOMER, WOS),
  EINSATZTAG_CREATE(CUSTOMER, WOS),
  EINSATZTAG_DELETE(CUSTOMER, WOS),
  EINSATZTAG_SEARCH(CUSTOMER, WOS),

  WAHLLOKAL_EDIT(CUSTOMER, WOS),
  WAHLLOKAL_CREATE(CUSTOMER, WOS),
  WAHLLOKAL_DELETE(CUSTOMER, WOS),
  WAHLLOKAL_SEARCH(CUSTOMER, WOS),
  WAHLLOKAL_STATUS(CUSTOMER, WOS),
  WAHLLOKAL_IMPORT(CUSTOMER, WOS),
  WAHLLOKAL_EXPORT(CUSTOMER, WOS),

  WAHLHELFERDATENBANK_EDIT(CUSTOMER, WOS),
  WAHLHELFERDATENBANK_WAHLHELFER_UEBERNEHMEN(CUSTOMER, WOS),
  WAHLHELFERDATENBANK_WAHLHELFER_AUS_WAHLHELFERDATENBANK_ANLEGEN(CUSTOMER, WOS),
  WAHLHELFERDATENBANK_WAHLHELFER_DELETE_INCLUDE_ZUKUENFTIGE_WAHLERMINE(CUSTOMER, WOS), // ELECTKOM-318

  WAHLHELFEREINSATZ_BULK_CREATE(CUSTOMER, WOS),

  WAHLHELFEREINSATZ_HISTORIE_CREATE(CUSTOMER, WOS),
  WAHLHELFEREINSATZ_HISTORIE_SEARCH(CUSTOMER, WOS),
  WAHLHELFEREINSATZ_HISTORIE_DELETE(CUSTOMER, WOS),
  WAHLHELFEREINSATZ_HISTORIE_EDIT(CUSTOMER, WOS),

  SCHULUNG_HISTORIE_SEARCH(CUSTOMER, WOS),
  SCHULUNG_HISTORIE_CREATE(CUSTOMER, WOS),
  SCHULUNG_HISTORIE_EDIT(CUSTOMER, WOS),
  SCHULUNG_HISTORIE_DELETE(CUSTOMER, WOS),

  WAHLLOKAL_WAHLHELFER_EINTEILEN(CUSTOMER, WOS),
  WAHLLOKAL_ANWESENHEIT_ERFASSEN(CUSTOMER, WOS),

  AUSSTATTUNG_CREATE(CUSTOMER, WOS),
  AUSSTATTUNG_EDIT(CUSTOMER, WOS),
  AUSSTATTUNG_SEARCH(CUSTOMER, WOS),
  AUSSTATTUNG_DELETE(CUSTOMER, WOS),

  AUSSTATTUNG_VOR_ORT_CREATE(CUSTOMER, WOS),
  AUSSTATTUNG_VOR_ORT_EDIT(CUSTOMER, WOS),
  AUSSTATTUNG_VOR_ORT_SEARCH(CUSTOMER, WOS),
  AUSSTATTUNG_VOR_ORT_DELETE(CUSTOMER, WOS),

  RESERVEPOOL_EDIT(CUSTOMER, WOS),
  RESERVEPOOL_CREATE(CUSTOMER, WOS),
  RESERVEPOOL_DELETE(CUSTOMER, WOS),
  RESERVEPOOL_SEARCH(CUSTOMER, WOS),

  RESERVEPOOL_WAHLHELFER_EINTEILEN(CUSTOMER, WOS),
  RESERVEPOOL_ANWESENHEIT_ERFASSEN(CUSTOMER, WOS),

  BRIEFWAHLTISCH_EDIT(CUSTOMER, WOS),
  BRIEFWAHLTISCH_CREATE(CUSTOMER, WOS),
  BRIEFWAHLTISCH_DELETE(CUSTOMER, WOS),
  BRIEFWAHLTISCH_SEARCH(CUSTOMER, WOS),
  BRIEFWAHLTISCH_STATUS(CUSTOMER, WOS),
  BRIEFWAHLTISCH_IMPORT(CUSTOMER, WOS),
  BRIEFWAHLTISCH_EXPORT(CUSTOMER, WOS),

  BRIEFWAHLTISCH_ZU_BRIEFWAHLBEZIRK_ZUORDNEN(CUSTOMER, WOS),
  BRIEFWAHLTISCHE_ZU_BRIEFWAHLBEZIRKEN_AUTOMATISCH_ZUORDNEN(CUSTOMER, WOS),
  BRIEFWAHLTISCH_WAHLHELFER_EINTEILEN(CUSTOMER, WOS),
  BRIEFWAHLTISCH_ANWESENHEIT_ERFASSEN(CUSTOMER, WOS),

  STANDORT_EDIT(CUSTOMER, WOS),
  STANDORT_CREATE(CUSTOMER, WOS),
  STANDORT_DELETE(CUSTOMER, WOS),
  STANDORT_SEARCH(CUSTOMER, WOS),
  STANDORT_STATUS(CUSTOMER, WOS),
  STANDORT_VERFUEGBARKEIT_PRUEFEN(CUSTOMER, MUC_WOS),
  STANDORT_VERFUEGBARKEIT_QUALITAET_SICHERN(CUSTOMER, MUC_WOS),
  STANDORT_IMPORT(CUSTOMER, WOS),
  STANDORT_EXPORT(CUSTOMER, WOS),

  SPERRLISTE_IMPORTIEREN(CUSTOMER, WOS),
  SPERRLISTE_EXPORTIEREN(CUSTOMER, WUS),

  //  @Deprecated
  //  ERGEBNIS_PRAESENTATION_CREATE(CUSTOMER),
  //  @Deprecated
  //  ERGEBNIS_PRAESENTATION_EDIT(CUSTOMER),
  //  @Deprecated
  //  ERGEBNIS_PRAESENTATION_SEARCH(CUSTOMER),
  //  @Deprecated
  //  ERGEBNIS_PRAESENTATION_DELETE(CUSTOMER),
  //  @Deprecated
  //  ERGEBNIS_PRAESENTATION_EXPORTIEREN(CUSTOMER),
  //  @Deprecated
  //  ERGEBNIS_PRAESENTATION_IMPORTIEREN(CUSTOMER),

  //  @Deprecated
  //  PRAESENTATIONSSCHRITT_CREATE(CUSTOMER),
  //  @Deprecated
  //  PRAESENTATIONSSCHRITT_SEARCH(CUSTOMER),
  //  @Deprecated
  //  PRAESENTATIONSSCHRITT_EDIT(CUSTOMER),
  //  @Deprecated
  //  PRAESENTATIONSSCHRITT_DELETE(CUSTOMER),

  LOKALISIERUNG_EDIT(SYSTEM, BASE),
  LOKALISIERUNG_SEARCH(ALL, BASE),
  LOKALISIERUNG_CREATE(SYSTEM), // Nicht an der Oberfläche vom Nutzer ausführbar
  LOKALISIERUNG_DELETE(SYSTEM), // Nicht an der Oberfläche vom Nutzer ausführbar
  LOKALISIERUNG_EXPORTIEREN(SYSTEM, BASE),
  LOKALISIERUNG_IMPORTIEREN(SYSTEM, BASE),
  LOKALISIERUNG_DEBUG(SYSTEM, TEST_MODUS), // Deaktiviert ELECTMUC-2003
  LOKALISIERUNG_WECHSELN(ALL, BASE),

  GEBIET_ERGEBNISEINGABESTATUS_SETZEN_EINGABE_MOEGLICH(CUSTOMER, WAS),
  GEBIET_ERGEBNISEINGABESTATUS_SETZEN_GESPERRT(CUSTOMER, WAS),
  GEBIET_ERGEBNISEINGABESTATUS_SETZEN_ABGESCHLOSSEN(CUSTOMER, WAS),
  GEBIET_ERGEBNISEINGABESTATUS_SETZEN_FREIGEGEBEN(CUSTOMER, WAS),
  GEBIET_ERGEBNISEINGABESTATUS_SETZEN_FREIGEGEBEN_ZURUECKNEHMEN(CUSTOMER, WAS), // ELECT-8619
  GEBIET_ERGEBNISEINGABESTATUS_SETZEN_AUSBLEIBEND(CUSTOMER, WAS),

  // WASDE-1048
  GEBIET_ERGEBNISEINGABESTATUS_ALLE_UNTERGEBIETE_SETZEN_FREIGEGEBEN(CUSTOMER, TEST_MODUS /* ELECT-5919 */, DESTATIS_WAS),
  GEBIET_ERGEBNISEINGABESTATUS_ALLE_UNTERGEBIETE_SETZEN_EINGABE_MOEGLICH(CUSTOMER, TEST_MODUS /* ELECT-5919 */, DESTATIS_WAS),

  D_HONDT_QUOTIENT_SEARCH(CUSTOMER, WAS),

  INTERFACES_STATUS_TEST(ALL, BASE),
  INTERFACES_STATUS_TEST_EMAIL(ALL, MAIL_SUPPORT),

  F_DATEIEN_LOESCHEN(CUSTOMER, DESTATIS_WAS), // ELECT-4117

  INTERFACES_NAT_SEC_TEST(ALL, MUC_BASE),
  INTERFACES_MELDEDATENAENDERUNGEN_TEST(CUSTOMER, MUC_BASE), // ELECTMUC-1366

  // ELECTVAPP-602
  INTERFACES_LWL_WAHLEN_WEB_SERVICE_SUCHE(CUSTOMER, KOM_RP_WAS),
  INTERFACES_LWL_WAHLEN_WEB_SERVICE_SUCHE_TEST(SYSTEM, KOM_RP_WAS),
  INTERFACES_LWL_WAHLEN_WEB_SERVICE_GEBIETSSTRUKTUR(CUSTOMER, KOM_RP_WAS),
  INTERFACES_LWL_WAHLEN_WEB_SERVICE_WAHLVORSCHLAEGE_TEST(SYSTEM, KOM_RP_WAS),
  INTERFACES_LWL_WAHLEN_WEB_SERVICE_MELDE(CUSTOMER, KOM_RP_WAS),
  INTERFACES_LWL_WAHLEN_WEB_SERVICE_MELDE_TEST(CUSTOMER, KOM_RP_WAS),

  INTERFACES_PERSONENREGISTER_TEST(ALL, WUS, WOS, WVZ),
  INTERFACES_PERSONENREGISTER_SUCHE_TEST(CUSTOMER, WVZ), // ELECT-4712
  INTERFACES_PERSONENREGISTER_SUCHE(CUSTOMER, WVZ),
  PERSONENREGISTER_PERSON_MIT_SPERRMERKMAL_LESEN(CUSTOMER, WUS, WOS, WVZ), // Cf. ELECT-2489 ELECT-4628
  PERSONENREGISTER_ATTRIBUT_UEBERSCHREIBEN(CUSTOMER, WUS, WOS), // Cf. ELECTMUC-459

  ANZAHL_WAHLBERECHTIGTE_SEARCH(CUSTOMER, WAS),
  ANZAHL_WAHLBERECHTIGTE_EDIT(CUSTOMER, WAS),
  ANZAHL_WAHLBERECHTIGTE_IMPORTIEREN(CUSTOMER, WAS),
  ANZAHL_WAHLBERECHTIGTE_ZURUECKSETZEN(CUSTOMER, TEST_MODUS, WAS),

  /* Diese Use-Cases sind technisch notwendig, bilden aber keine Fachlichkeit ab */
  OHNE(ALL, BASE), //"Standard Permission, entspricht 'keiner'"
  UNSINN(ALL, TEST), //"Nur DUMMY für Tests"

  //  @Deprecated
  //  DATEI_IMPORT_EDIT(ALL), // "NICHT VERWENDEN, KEIN ANWENDUNGSFALL, nur notwendig, da AbstractDateiImportSearchView mit Takatuka erstellt wird"
  //  @Deprecated
  //  DATEI_IMPORT_DELETE(ALL), // "NICHT VERWENDEN, KEIN ANWENDUNGSFALL, nur notwendig, da AbstractDateiImportSearchView mit Takatuka erstellt wird"
  DATEI_IMPORT_SEARCH(ALL), // "NICHT VERWENDEN, KEIN ANWENDUNGSFALL, nur notwendig, da AbstractDateiImportSearchView mit Takatuka erstellt wird"
  DATEI_EXPORT_SEARCH(ALL), // "NICHT VERWENDEN, KEIN ANWENDUNGSFALL, nur notwendig, da AbstractDateiImportSearchView mit Takatuka erstellt wird"

  GRUPPE_IM_GEBIET_CREATE(ALL), // "NICHT VERWENDEN, KEIN ANWENDUNGSFALL, nur notwendig, um Gruppen der Art 'REFERENDUM_VORLAGE' direkt auf einem ausgewählten Gebiet anlegen/bearbeiten zu können"
  GRUPPE_IM_GEBIET_EDIT(ALL), // "NICHT VERWENDEN, KEIN ANWENDUNGSFALL, nur notwendig, um Gruppen der Art 'REFERENDUM_VORLAGE' direkt auf einem ausgewählten Gebiet anlegen/bearbeiten zu können"
  GRUPPE_IM_GEBIET_DELETE(ALL), // "NICHT VERWENDEN, KEIN ANWENDUNGSFALL, nur notwendig, um Gruppen der Art 'REFERENDUM_VORLAGE' direkt auf einem ausgewählten Gebiet anlegen/bearbeiten zu können"
  GRUPPE_IM_GEBIET_SEARCH(ALL), // "NICHT VERWENDEN, KEIN ANWENDUNGSFALL, nur notwendig, da AbstractDateiImportSearchView mit Takatuka erstellt wird"

  /* WVZ */
  ANSCHRIFTEN_EINTRAG_SEARCH(CUSTOMER, WVZ),
  ANSCHRIFTEN_EINTRAG_EDIT(CUSTOMER, WVZ),
  ANSCHRIFTEN_EINTRAG_DELETE(CUSTOMER, WVZ),
  ANSCHRIFTEN_EINTRAG_CREATE(CUSTOMER, WVZ),
  ANSCHRIFTEN_EINTRAG_IMPORTIEREN(CUSTOMER, WVZ),

  MELDEDATEN_EINTRAG_EDIT(CUSTOMER, WVZ), // meint "anzeigen"
  MELDEDATEN_EINTRAG_OHNE_PERSONEN_REGISTER_EDIT(CUSTOMER, WVZ), // => bearbeiten
  MELDEDATEN_EINTRAG_SEARCH(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_DELETE(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_DELETE_ALL(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_CREATE(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_IMPORTIEREN(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_IMPORTIEREN_ECHTDATEN(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_PRUEFEN(CUSTOMER, WVZ),

  MELDEDATEN_EINTRAG_WOHNUNG_SEARCH(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_WOHNHAFT_AM_PRUEFERGEBNIS_SEARCH(CUSTOMER, WVZ),

  MELDEDATEN_EINTRAG_PAKET_CREATE(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_PAKET_SEARCH(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_PAKET_DELETE(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_PAKET_EDIT(CUSTOMER, TEST),
  MELDEDATEN_EINTRAG_PAKET_IN_BEARBEITUNG_ZURUECKSETZEN(CUSTOMER, WVZ),

  MELDEDATEN_EINTRAG_FEHLER_CREATE(CUSTOMER), // Werden vom System erstellt
  MELDEDATEN_EINTRAG_FEHLER_SEARCH(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_FEHLER_EDIT(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_FEHLER_DELETE(CUSTOMER, WVZ),

  MELDEDATEN_AENDERUNG_SEARCH(CUSTOMER, WVZ),
  MELDEDATEN_AENDERUNG_EDIT(CUSTOMER, WVZ),
  MELDEDATEN_AENDERUNG_ERNEUT_ABRUFEN(CUSTOMER, WVZ),
  MELDEDATEN_AENDERUNG_LAUF_SEARCH(CUSTOMER, WVZ),
  MELDEDATEN_AENDERUNG_LAUF_EDIT(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_AUS_PERSONENREGISTER_AKTUALISIEREN(CUSTOMER, WVZ),
  MELDEDATEN_EINTRAG_MANUELL_IN_WVZ_AUFNEHMEN(CUSTOMER, WVZ),

  MELDEDATEN_PERSONENDATEN_ZU_ORDNUNGSMERKMAL_ANZEIGEN(CUSTOMER, WVZ),
  MELDEDATEN_ANSCHRIFT_ZU_ORDNUNGSMERKMAL_ANZEIGEN(CUSTOMER, WVZ),

  WAEHLERVERZEICHNIS_EDIT(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_SEARCH(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_DELETE(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_FUELLEN(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_SORTIEREN(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_EXPORTIEREN(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_UNIONS_BUERGER_EXPORTIEREN(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, WVZ),

  WAEHLERVERZEICHNIS_EINTRAG_SEARCH(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_EINTRAG_SEARCH_KOMPLEX(CUSTOMER, WVZ), // ELECTMUC-2069, bspw. für Rolle Admin...
  WAEHLERVERZEICHNIS_EINTRAG_SEARCH_ALL(CUSTOMER, WVZ), // Suche über alle Wahllokale
  WAEHLERVERZEICHNIS_EINTRAG_CREATE(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_EINTRAG_EDIT(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_EINTRAG_PERSONENDATEN_AENDERN(CUSTOMER, WVZ), // entspricht der Bearbeiten-Maske ELECTMUC-1190
  WAEHLERVERZEICHNIS_EINTRAG_ANZEIGEN(CUSTOMER, WVZ), // ELECTMUC-2069, bspw. für Rolle Auskunftberechtigter
  WAEHLERVERZEICHNIS_EINTRAG_DELETE(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_EINTRAG_DOK_CREATE(CUSTOMER, WVZ), // Erstellung der Entität WählerverzeichnisEintragDokument
  WAEHLERVERZEICHNIS_EINTRAG_DOK_EDIT(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_EINTRAG_DOK_DELETE(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_EINTRAG_DOK_SEARCH(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_EINTRAG_DOK_AUSDRUCKEN(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_EINTRAG_DOK_STATUSUEBERSICHT(CUSTOMER, WVZ),
  DOKUMENT_ERZEUGEN_WAHLBENACHRICHTIGUNG(CUSTOMER, WVZ),
  DOKUMENT_ERZEUGEN_WAHLBENACHRICHTIGUNG_JEDERZEIT(CUSTOMER, WVZ), // ELECTMUC-2015
  DOKUMENT_ERZEUGEN_UNGUELTIGE_WAHLSCHEINE(CUSTOMER, WVZ),
  DOKUMENT_ERZEUGEN_WAHLBENACHRICHTIGUNG_ALS_LISTE(CUSTOMER, WVZ),
  DOKUMENT_ERZEUGEN_WAEHLERVERZEICHNIS_EINTRAG(CUSTOMER, WVZ), // Erstellung von physischen Dokumenten zu Wählerverzeichniseinträgen
  WAHLBENACHRICHTIGUNG_EXPORTIEREN(CUSTOMER, WVZ),
  WAHLBENACHRICHTIGUNG_IMPORTIEREN(CUSTOMER, WVZ),
  WAHLBENACHRICHTIGUNG_STATUS_UNZUSTELLBAR_SETZEN(CUSTOMER, WVZ),

  WAHLBERECHTIGUNG_MANUELL_SETZEN(CUSTOMER, WVZ),

  WAEHLERVERZEICHNIS_AENDERUNG_STATUSUEBERSICHT(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_AENDERUNG_SEARCH(CUSTOMER, WVZ),
  WAEHLERVERZEICHNIS_AENDERUNG_SEARCH_ALL(CUSTOMER, WVZ), // Suche über alle Abgleiche ELECTMUC-1893
  WAEHLERVERZEICHNIS_AENDERUNG_EDIT(CUSTOMER, WVZ),
  WVZ_AENDERUNG_HISTORIE_SEARCH(CUSTOMER, WVZ),
  WVZ_AENDERUNG_HISTORIE_SEARCH_ALL(CUSTOMER, WVZ), // Suche über alle Änderungen ELECTMUC-1893

  WAHLRECHTSKRITERIUM_EDIT(CUSTOMER, WVZ),
  WAHLRECHTSKRITERIUM_SEARCH(CUSTOMER, WVZ),
  WAHLRECHTSKRITERIUM_DELETE(CUSTOMER, WVZ),
  WAHLRECHTSKRITERIUM_CREATE(CUSTOMER, WVZ),
  WAHLRECHTSKRITERIUM_IMPORTIEREN(CUSTOMER, WVZ),
  WAHLRECHTSKRITERIUM_EXPORTIEREN(CUSTOMER, WVZ),

  WAHLSTATISTIK_KENNZEICHEN_EDIT(CUSTOMER, WVZ),
  WAHLSTATISTIK_KENNZEICHEN_SEARCH(CUSTOMER, WVZ),
  WAHLSTATISTIK_KENNZEICHEN_DELETE(CUSTOMER, WVZ),
  WAHLSTATISTIK_KENNZEICHEN_CREATE(CUSTOMER, WVZ),
  WAHLSTATISTIK_KENNZEICHEN_IMPORTIEREN(CUSTOMER, WVZ),
  WAHLSTATISTIK_KENNZEICHEN_EXPORTIEREN(CUSTOMER, WVZ),

  WAHLSCHEINE_ERSTELLEN(CUSTOMER, WVZ), // MASSENOPERATION ELECTMUC-1816

  WAHLSCHEIN_CREATE(CUSTOMER, WVZ),
  WAHLSCHEIN_ANZEIGEN(CUSTOMER, WVZ),
  WAHLSCHEIN_GUELTIGKEIT_SETZEN(CUSTOMER, WVZ),
  WAHLSCHEIN_EDIT(CUSTOMER, WVZ),
  WAHLSCHEIN_SEARCH(CUSTOMER, WVZ),
  WAHLSCHEIN_DELETE(CUSTOMER, WVZ),
  WAHLSCHEIN_EXPORTIEREN(CUSTOMER, WVZ),
  WAHLSCHEIN_IMPORTIEREN(CUSTOMER, WVZ),
  WAHLSCHEIN_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, WVZ),
  DOKUMENT_ERZEUGEN_WAHLSCHEIN(CUSTOMER, WVZ),
  DOKUMENT_ERZEUGEN_WAHLSCHEINE_ALS_LISTE(CUSTOMER, WVZ),
  WAHLSCHEIN_BRIEFWAHLBEZIRK_STATUS_SEARCH(CUSTOMER, WVZ),

  WAHLSCHEIN_STATUS_SETZEN_UNZUSTELLBAR(CUSTOMER, WVZ),
  WAHLSCHEIN_STATUS_SETZEN_STORNIERT(CUSTOMER, WVZ),
  WAHLSCHEIN_STATUS_SETZEN_SICHERGESTELLT(CUSTOMER, WVZ),
  WAHLSCHEIN_STATUS_SETZEN_PERSOENLICH_AUSGEHAENDIGT(CUSTOMER, WVZ),
  WAHLSCHEIN_STATUS_SETZEN_MANUELL_VERSANDT(CUSTOMER, WVZ),

  WAHLSCHEINANTRAG_CREATE(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_EDIT(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_SEARCH(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_DELETE(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_IMPORTIEREN(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_EXPORTIEREN(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_ABWEICHENDE_VERSAND_ADRESSE_PRUEFEN(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_EINGESCANNTEN_ANTRAG_PRUEFEN(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_PERSON_ZUORDNEN(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_WAHLSCHEIN_KANN_NICHT_AUSGESTETLLT_WERDEN_GRUENDE_SEARCH(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_ABLEHNEN(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_DOKUMENT_OEFFNEN(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_AUSLANDSDEUTSCHE_IN_WVZ_UEBERNEHMEN(CUSTOMER, WVZ),
  WAHLSCHEINANTRAG_BRIEFWAHLBEZIRK_STATUS_SEARCH(CUSTOMER, WVZ),

  STIMMZETTELGEBIET_SEARCH(CUSTOMER, WVZ),
  STIMMZETTELGEBIET_EDIT(CUSTOMER, WVZ),
  STIMMZETTELGEBIET_CREATE(CUSTOMER, WVZ),
  STIMMZETTELGEBIET_DELETE(CUSTOMER, WVZ),
  STIMMZETTELGEBIET_IMPORTIEREN(CUSTOMER, WVZ),
  STIMMZETTELGEBIET_EXPORTIEREN(CUSTOMER, WVZ),

  WAHLAMT_CREATE(CUSTOMER, WVZ),
  WAHLAMT_EDIT(CUSTOMER), // Entspricht Gebiet Edit
  WAHLAMT_SEARCH(CUSTOMER), // Entspricht Gebiet Search
  WAHLAMT_DELETE(CUSTOMER), // Entspricht Gebiet Delete

  WVZ_WAHLLOKAL_EDIT(CUSTOMER), // Entspricht Gebiet Edit
  WVZ_WAHLLOKAL_SEARCH(CUSTOMER), // Entspricht Gebiet Search
  WVZ_WAHLLOKAL_CREATE(CUSTOMER, WVZ),
  WVZ_WAHLLOKAL_DELETE(CUSTOMER), // Entspricht Gebiet Delete

  WAHL_PHASE_EDIT(CUSTOMER, WVZ),
  WAHL_PHASE_SEARCH(CUSTOMER, WVZ),
  WAHL_PHASE_CREATE(CUSTOMER, WVZ),
  WAHL_PHASE_DELETE(CUSTOMER, WVZ),
  WAHL_PHASE_IMPORTIEREN(CUSTOMER, WVZ),
  WAHL_PHASE_EXPORTIEREN(CUSTOMER, WVZ),

  WVZ_EINTRAGUNGSLISTE_EDIT(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_SEARCH(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_CREATE(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_DELETE(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_SEARCH_ALLE_EINSATZORTE(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_STATUSUEBERSICHT_ANZEIGEN(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_STATISTIK_SEARCH(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_VERGLEICH_DOKUMENT_EXPORT(CUSTOMER, MUC_WVZ),

  WVZ_EINTRAGUNGSLISTE_EINTRAG_EDIT(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_EINTRAG_SEARCH(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_EINTRAG_CREATE(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_EINTRAG_CREATE_EINTRAGUNGSSCHEIN(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_EINTRAG_UNGUELTIG(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_EINTRAG_DELETE(CUSTOMER, WVZ),
  WVZ_EINTRAGUNGSLISTE_EINTRAG_STORNIEREN(CUSTOMER, WVZ),

  EINTRAGUNGSSCHEIN_EXTERN_EDIT(CUSTOMER),
  EINTRAGUNGSSCHEIN_EXTERN_SEARCH(CUSTOMER, WVZ),
  EINTRAGUNGSSCHEIN_EXTERN_CREATE(CUSTOMER),
  EINTRAGUNGSSCHEIN_EXTERN_DELETE(CUSTOMER),

  /**
   * @deprecated NICHT VERWENDEN, D_HONDT_QUOTIENT_SEARCH nutzen.
   */
  @Deprecated
  D_H_QU_POLITISCHE_GRUPPE_SEARCH(CUSTOMER), //
  /**
   * @deprecated NICHT VERWENDEN, D_HONDT_QUOTIENT_SEARCH nutzen.
   */
  @Deprecated
  D_H_QU_LISTEN_IN_GRUPPE_SEARCH(CUSTOMER),
  /**
   * @deprecated NICHT VERWENDEN, D_HONDT_QUOTIENT_SEARCH nutzen.
   */
  @Deprecated
  D_H_QU_LISTEN_IM_GEBIET_SEARCH(CUSTOMER),

  CUSTOMER_1(CUSTOMER, BASE),
  CUSTOMER_2(CUSTOMER, BASE),
  CUSTOMER_3(CUSTOMER, BASE),
  CUSTOMER_4(CUSTOMER, BASE),
  CUSTOMER_5(CUSTOMER, BASE),
  CUSTOMER_6(CUSTOMER, NL_WUS), //ELECT-11184
  CUSTOMER_7(CUSTOMER, NL_WAS), //ELECTVAPP-890
  CUSTOMER_8(CUSTOMER, NL_WUS), //ELECT-11428

  PERSONENREGISTER_ZERTIFIKAT_HOCHLADEN(ALL, PERSONENREGISTER)
  ;

  private final Customer[] customers;

  private final Predicate<Customer> excludeCustomer;

  private final UseCasePermissionModus initialerModus;

  private final UseCaseMandantArt mandantArt;

  UseCasePermission(UseCaseMandantArt mandantArt, UseCasePermissionModus initialerModus, Customer... customers) {
    this(mandantArt, initialerModus, c -> false, customers);
  }

  UseCasePermission(UseCaseMandantArt mandantArt, Customer... customers) {
    this(mandantArt, c -> false, customers);
  }

  UseCasePermission(UseCaseMandantArt mandantArt, Predicate<Customer> excludeCustomer, Customer... customers) {
    this(mandantArt, PRODUKTION, excludeCustomer, customers);
  }

  UseCasePermission(UseCaseMandantArt mandantArt, UseCasePermissionModus initialerModus, Predicate<Customer> excludeCustomer, Customer... customers) {
    this.mandantArt = mandantArt;
    this.initialerModus = initialerModus;
    this.excludeCustomer = excludeCustomer;
    this.customers = customers;
  }

  public UseCasePermissionModus getInitialerModus() {
    return initialerModus;
  }

  public boolean hasCustomer(Customer wantedCustomer) {
    return getCustomerList().contains(wantedCustomer);
  }

  private List<Customer> getCustomerList() {
    return new ArrayList<>(Arrays.asList(customers));
  }

  public boolean isCustomerExcluded(Customer customer) {
    boolean test = excludeCustomer.test(customer);
    if (test) {
      return true;
    }
    return customer.getParents().stream().anyMatch(this::isCustomerExcluded);
  }

  public String getMessageKey() {
    return getClass().getSimpleName() + "." + name();
  }

  public UseCaseMandantArt getMandantArt() {
    return mandantArt;
  }

  @Override
  public String lokalisiere(Messages messages) {
    try {
      return messages.lokalisiere(this);
    } catch (Exception e) {
      return name();
    }
  }

}