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

import static org.apache.commons.lang3.StringUtils.isBlank;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.thoughtworks.xstream.annotations.XStreamOmitField;

import de.ivu.elect.jee.entity.customdata.DefaultCustomData;
import de.ivu.elect.jee.protokollierung.AttributTyp;

public class NlWahlCustomData extends DefaultCustomData implements NlWahlartCustomData {

  private static final Logger LOG = LoggerFactory.getLogger(NlWahlCustomData.class);

  private static final long serialVersionUID = 1L;

  private String ergebnisCustomData;

  @XStreamOmitField
  private transient Object ergebnisCustomDataParsed;

  private String wahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer;

  private String wahlbehoerdeDokumentErstelltAnschriftOrt;

  private String wahlbehoerdeDokumentErstelltAnschriftPlz;

  private Date wahlbehoerdeDokumentErstelltAm;

  private Date wahlausschusssitzungZuvorBeginn;

  private String wahlausschusssitzungAnschriftStrasseHausnummer;

  private String wahlausschusssitzungAnschriftOrt;

  private String wahlausschusssitzungAnschriftPlz;

  private Date wahlausschusssitzungBeginn;

  private Date wahlausschusssitzungEnde;

  private String wahlausschusssitzungFehlerVermutet;

  private String wahlausschusssitzungEinwaende;

  private String wahlausschusssitzungBemerkungen;

  private String wahlausschusssitzungUnterzeichner1Name;

  private String wahlausschusssitzungUnterzeichner1Rolle;

  private String wahlausschusssitzungUnterzeichner2Name;

  private String wahlausschusssitzungUnterzeichner2Rolle;

  private Date fristZuletztGesetztBeginn;

  private Date fristZuletztGesetztEnde;

  private Date wahlvorschlagEinreichungAbgabefrist;

  private String wahlvorschlagEinreichungAnschriftOrt;

  private String wahlvorschlagEinreichungUnterzeichner1Name;

  private Date wahlvorschlagVeroeffentlichungBeginn;

  private String wahlvorschlagVeroeffentlichungAnschriftOrt;

  private String wahlvorschlagVeroeffentlichungUnterzeichner1Name;

  private String einwohnerzahlVeroeffentlichungId;

  private Date einwohnerzahlVeroeffentlichungDatum;

  private boolean zentraleErfassung; // ELECT-9953

  private NlWahlPhase nlWahlPhase = NlWahlPhase.INITIAL;

  private String eml110Filename;

  private Date eml110Date;

  private String eml110hashCode;

  private String eml230Filename;

  private Date eml230Date;

  private String eml230hashCode;

  private String abWatershap; // ELECT-13397

  private String electionDomain; // ELECT-13642

  private String electionDomainId; // ELECT-13642

  private boolean backupRestoreEnabled;

  private Map<Long, String> dateiPkHashcode;

  private Date privateKeyGenerationDate;

  private boolean publicKeyExported; // ELECTVAPP-1143
  
  private boolean hsbcSystem = false; // ELECT-15285

  private boolean hsbbSystem = false; // ELECT-16695

  private boolean nbsbSystem = false; // ELECT-16523

  private boolean nbsbcSystem = false; // ELECT-16523

  public NlWahlCustomData() {
    super();
  }

  public String getErgebnisCustomData() {
    return ergebnisCustomData;
  }

  public <T> T getErgebnisCustomDataParsed(Function<String, T> factory) {
    if (ergebnisCustomDataParsed == null) {
      ergebnisCustomDataParsed = factory.apply(ergebnisCustomData);
    }

    return (T) ergebnisCustomDataParsed;
  }

  public void setErgebnisCustomData(String ergebnisCustomData) {
    this.notifyEntity("entity.einzahl.WAHL.ERGEBNIS_CUSTOM_DATA", AttributTyp.STRING, this.ergebnisCustomData, this.ergebnisCustomData = ergebnisCustomData);

    this.ergebnisCustomDataParsed = null;
  }

  public String getWahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer() {
    return wahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer;
  }

  public void setWahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer(String wahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLBEHOERDE_DOKUMENT_ERSTELLT_ANSCHRIFT_STRASSE_HAUSNUMMER", AttributTyp.STRING, this.wahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer,
        this.wahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer = wahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer);
  }

  public String getWahlbehoerdeDokumentErstelltAnschriftOrt() {
    return wahlbehoerdeDokumentErstelltAnschriftOrt;
  }

  public void setWahlbehoerdeDokumentErstelltAnschriftOrt(String wahlbehoerdeDokumentErstelltAnschriftOrt) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLBEHOERDE_DOKUMENT_ERSTELLT_ANSCHRIFT_ORT", AttributTyp.STRING, this.wahlbehoerdeDokumentErstelltAnschriftOrt,
        this.wahlbehoerdeDokumentErstelltAnschriftOrt = wahlbehoerdeDokumentErstelltAnschriftOrt);
  }

  public String getWahlbehoerdeDokumentErstelltAnschriftPlz() {
    return wahlbehoerdeDokumentErstelltAnschriftPlz;
  }

  public void setWahlbehoerdeDokumentErstelltAnschriftPlz(String wahlbehoerdeDokumentErstelltAnschriftPlz) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLBEHOERDE_DOKUMENT_ERSTELLT_ANSCHRIFT_PLZ", AttributTyp.STRING, this.wahlbehoerdeDokumentErstelltAnschriftPlz,
        this.wahlbehoerdeDokumentErstelltAnschriftPlz = wahlbehoerdeDokumentErstelltAnschriftPlz);
  }

  public Date getWahlbehoerdeDokumentErstelltAm() {
    return wahlbehoerdeDokumentErstelltAm;
  }

  public void setWahlbehoerdeDokumentErstelltAm(Date wahlbehoerdeDokumentErstelltAm) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLBEHOERDE_DOKUMENT_ERSTELLT_AM", AttributTyp.TIMESTAMP, this.wahlbehoerdeDokumentErstelltAm,
        this.wahlbehoerdeDokumentErstelltAm = wahlbehoerdeDokumentErstelltAm);
  }

  public Date getWahlausschusssitzungZuvorBeginn() {
    return wahlausschusssitzungZuvorBeginn;
  }

  public void setWahlausschusssitzungZuvorBeginn(Date wahlausschusssitzungZuvorBeginn) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ZUVOR_BEGINN", AttributTyp.TIMESTAMP, this.wahlausschusssitzungZuvorBeginn,
        this.wahlausschusssitzungZuvorBeginn = wahlausschusssitzungZuvorBeginn);
  }

  public String getWahlausschusssitzungAnschriftStrasseHausnummer() {
    return wahlausschusssitzungAnschriftStrasseHausnummer;
  }

  public void setWahlausschusssitzungAnschriftStrasseHausnummer(String wahlausschusssitzungAnschriftStrasseHausnummer) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ANSCHRIFT_STRASSE_HAUSNUMMER", AttributTyp.STRING, this.wahlausschusssitzungAnschriftStrasseHausnummer,
        this.wahlausschusssitzungAnschriftStrasseHausnummer = wahlausschusssitzungAnschriftStrasseHausnummer);
  }

  public String getWahlausschusssitzungAnschriftOrt() {
    return wahlausschusssitzungAnschriftOrt;
  }

  public void setWahlausschusssitzungAnschriftOrt(String wahlausschusssitzungAnschriftOrt) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ANSCHRIFT_ORT", AttributTyp.STRING, this.wahlausschusssitzungAnschriftOrt,
        this.wahlausschusssitzungAnschriftOrt = wahlausschusssitzungAnschriftOrt);
  }

  public String getWahlausschusssitzungAnschriftPlz() {
    return wahlausschusssitzungAnschriftPlz;
  }

  public void setWahlausschusssitzungAnschriftPlz(String wahlausschusssitzungAnschriftPlz) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ANSCHRIFT_PLZ", AttributTyp.STRING, this.wahlausschusssitzungAnschriftPlz,
        this.wahlausschusssitzungAnschriftPlz = wahlausschusssitzungAnschriftPlz);
  }

  public Date getWahlausschusssitzungBeginn() {
    return wahlausschusssitzungBeginn;
  }

  public void setWahlausschusssitzungBeginn(Date wahlausschusssitzungBeginn) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_BEGINN", AttributTyp.TIMESTAMP, this.wahlausschusssitzungBeginn, this.wahlausschusssitzungBeginn = wahlausschusssitzungBeginn);
  }

  public Date getWahlausschusssitzungEnde() {
    return wahlausschusssitzungEnde;
  }

  public void setWahlausschusssitzungEnde(Date wahlausschusssitzungEnde) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ENDE", AttributTyp.TIMESTAMP, this.wahlausschusssitzungEnde, this.wahlausschusssitzungEnde = wahlausschusssitzungEnde);
  }

  public String getWahlausschusssitzungFehlerVermutet() {
    return wahlausschusssitzungFehlerVermutet;
  }

  public void setWahlausschusssitzungFehlerVermutet(String wahlausschusssitzungFehlerVermutet) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_FEHLER_VERMUTET", AttributTyp.STRING, this.wahlausschusssitzungFehlerVermutet,
        this.wahlausschusssitzungFehlerVermutet = wahlausschusssitzungFehlerVermutet);
  }

  public String getWahlausschusssitzungEinwaende() {
    return wahlausschusssitzungEinwaende;
  }

  public void setWahlausschusssitzungEinwaende(String wahlausschusssitzungEinwaende) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_EINWAENDE", AttributTyp.STRING, this.wahlausschusssitzungEinwaende, this.wahlausschusssitzungEinwaende = wahlausschusssitzungEinwaende);
  }

  public String getWahlausschusssitzungBemerkungen() {
    return wahlausschusssitzungBemerkungen;
  }

  public void setWahlausschusssitzungBemerkungen(String wahlausschusssitzungBemerkungen) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_EINWAENDE_BEMERKUNGEN", AttributTyp.STRING, this.wahlausschusssitzungBemerkungen,
        this.wahlausschusssitzungBemerkungen = wahlausschusssitzungBemerkungen);
  }

  public String getWahlausschusssitzungUnterzeichner1Name() {
    return wahlausschusssitzungUnterzeichner1Name;
  }

  public void setWahlausschusssitzungUnterzeichner1Name(String wahlausschusssitzungUnterzeichner1Name) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_1_NAME", AttributTyp.STRING, this.wahlausschusssitzungUnterzeichner1Name,
        this.wahlausschusssitzungUnterzeichner1Name = wahlausschusssitzungUnterzeichner1Name);
  }

  public String getWahlausschusssitzungUnterzeichner1Rolle() {
    return wahlausschusssitzungUnterzeichner1Rolle;
  }

  public void setWahlausschusssitzungUnterzeichner1Rolle(String wahlausschusssitzungUnterzeichner1Rolle) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_1_ROLLE", AttributTyp.STRING, this.wahlausschusssitzungUnterzeichner1Rolle,
        this.wahlausschusssitzungUnterzeichner1Rolle = wahlausschusssitzungUnterzeichner1Rolle);
  }

  public String getWahlausschusssitzungUnterzeichner2Name() {
    return wahlausschusssitzungUnterzeichner2Name;
  }

  public void setWahlausschusssitzungUnterzeichner2Name(String wahlausschusssitzungUnterzeichner2Name) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_2_NAME", AttributTyp.STRING, this.wahlausschusssitzungUnterzeichner2Name,
        this.wahlausschusssitzungUnterzeichner2Name = wahlausschusssitzungUnterzeichner2Name);
  }

  public String getWahlausschusssitzungUnterzeichner2Rolle() {
    return wahlausschusssitzungUnterzeichner2Rolle;
  }

  public void setWahlausschusssitzungUnterzeichner2Rolle(String wahlausschusssitzungUnterzeichner2Rolle) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_2_ROLLE", AttributTyp.STRING, this.wahlausschusssitzungUnterzeichner2Rolle,
        this.wahlausschusssitzungUnterzeichner2Rolle = wahlausschusssitzungUnterzeichner2Rolle);
  }

  public Date getFristZuletztGesetztBeginn() {
    return fristZuletztGesetztBeginn;
  }

  public void setFristZuletztGesetztBeginn(Date fristZuletztGesetztBeginn) {
    this.notifyEntity("entity.einzahl.WAHL.FRIST_ZULETZT_GESETZT_BEGINN", AttributTyp.TIMESTAMP, this.fristZuletztGesetztBeginn, this.fristZuletztGesetztBeginn = fristZuletztGesetztBeginn);
  }

  public Date getFristZuletztGesetztEnde() {
    return fristZuletztGesetztEnde;
  }

  public void setFristZuletztGesetztEnde(Date fristZuletztGesetztEnde) {
    this.notifyEntity("entity.einzahl.WAHL.FRIST_ZULETZT_GESETZT_ENDE", AttributTyp.TIMESTAMP, this.fristZuletztGesetztEnde, this.fristZuletztGesetztEnde = fristZuletztGesetztEnde);
  }

  public Date getWahlvorschlagEinreichungAbgabefrist() {
    return wahlvorschlagEinreichungAbgabefrist;
  }

  public void setWahlvorschlagEinreichungAbgabefrist(Date wahlvorschlagEinreichungAbgabefrist) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLVORSCHLAG_EINREICHUNG_ABGABEFRIST", AttributTyp.TIMESTAMP, this.wahlvorschlagEinreichungAbgabefrist,
        this.wahlvorschlagEinreichungAbgabefrist = wahlvorschlagEinreichungAbgabefrist);
  }

  public String getWahlvorschlagEinreichungAnschriftOrt() {
    return wahlvorschlagEinreichungAnschriftOrt;
  }

  public void setWahlvorschlagEinreichungAnschriftOrt(String wahlvorschlagEinreichungAnschriftOrt) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLVORSCHLAG_EINREICHUNG_ANSCHRIFT_ORT", AttributTyp.STRING, this.wahlvorschlagEinreichungAnschriftOrt,
        this.wahlvorschlagEinreichungAnschriftOrt = wahlvorschlagEinreichungAnschriftOrt);
  }

  public String getWahlvorschlagEinreichungUnterzeichner1Name() {
    return wahlvorschlagEinreichungUnterzeichner1Name;
  }

  public void setWahlvorschlagEinreichungUnterzeichner1Name(String wahlvorschlagEinreichungUnterzeichner1Name) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLVORSCHLAG_EINREICHUNG_UNTERZEICHNER_1_NAME", AttributTyp.STRING, this.wahlvorschlagEinreichungUnterzeichner1Name,
        this.wahlvorschlagEinreichungUnterzeichner1Name = wahlvorschlagEinreichungUnterzeichner1Name);
  }

  public Date getWahlvorschlagVeroeffentlichungBeginn() {
    return wahlvorschlagVeroeffentlichungBeginn;
  }

  public void setWahlvorschlagVeroeffentlichungBeginn(Date wahlvorschlagVeroeffentlichungBeginn) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLVORSCHLAG_VEROEFFENTLICHUNG_BEGINN", AttributTyp.TIMESTAMP, this.wahlvorschlagVeroeffentlichungBeginn,
        this.wahlvorschlagVeroeffentlichungBeginn = wahlvorschlagVeroeffentlichungBeginn);
  }

  public String getWahlvorschlagVeroeffentlichungAnschriftOrt() {
    return wahlvorschlagVeroeffentlichungAnschriftOrt;
  }

  public void setWahlvorschlagVeroeffentlichungAnschriftOrt(String wahlvorschlagVeroeffentlichungAnschriftOrt) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLVORSCHLAG_VEROEFFENTLICHUNG_ANSCHRIFT_ORT", AttributTyp.STRING, this.wahlvorschlagVeroeffentlichungAnschriftOrt,
        this.wahlvorschlagVeroeffentlichungAnschriftOrt = wahlvorschlagVeroeffentlichungAnschriftOrt);
  }

  public String getWahlvorschlagVeroeffentlichungUnterzeichner1Name() {
    return wahlvorschlagVeroeffentlichungUnterzeichner1Name;
  }

  public void setWahlvorschlagVeroeffentlichungUnterzeichner1Name(String wahlvorschlagVeroeffentlichungUnterzeichner1Name) {
    this.notifyEntity("entity.einzahl.WAHL.WAHLVORSCHLAG_VEROEFFENTLICHUNG_UNTERZEICHNER_1_NAME", AttributTyp.STRING, this.wahlvorschlagVeroeffentlichungUnterzeichner1Name,
        this.wahlvorschlagVeroeffentlichungUnterzeichner1Name = wahlvorschlagVeroeffentlichungUnterzeichner1Name);
  }

  public String getEinwohnerzahlVeroeffentlichungId() {
    return einwohnerzahlVeroeffentlichungId;
  }

  public void setEinwohnerzahlVeroeffentlichungId(String einwohnerzahlVeroeffentlichungId) {
    this.notifyEntity("entity.einzahl.WAHL.EINWOHNERZAHL_VEROEFFENTLICHUNG_ID", AttributTyp.STRING, this.einwohnerzahlVeroeffentlichungId,
        this.einwohnerzahlVeroeffentlichungId = einwohnerzahlVeroeffentlichungId);
  }

  public Date getEinwohnerzahlVeroeffentlichungDatum() {
    return einwohnerzahlVeroeffentlichungDatum;
  }

  public void setEinwohnerzahlVeroeffentlichungDatum(Date einwohnerzahlVeroeffentlichungDatum) {
    this.notifyEntity("entity.einzahl.WAHL.EINWOHNERZAHL_VEROEFFENTLICHUNG_DATUM", AttributTyp.TIMESTAMP, this.einwohnerzahlVeroeffentlichungDatum,
        this.einwohnerzahlVeroeffentlichungDatum = einwohnerzahlVeroeffentlichungDatum);
  }

  /**
   * Beim Erfassen der ausgezählten Stimmen wird zwischen ZENTRAL (== Erfassung in einem Hauptwahlbüro, in das alle Wahlurnen der Wahllokale gebracht werden) und DEZENTRAL (== Erfassung in den
   * einzelnen Wahllokalen) unterschieden.
   */
  public boolean isZentraleErfassung() {
    return zentraleErfassung;
  }

  public void setZentraleErfassung(boolean zentraleErfassung) {
    this.notifyEntity("entity.einzahl.WAHL.ZENTRALE_ERFASSUNG", AttributTyp.BOOLEAN, this.zentraleErfassung, this.zentraleErfassung = zentraleErfassung);
  }

  public boolean isPublicKeyExported() {
    return publicKeyExported;
  }

  public void setPublicKeyExported(boolean publicKeyExported) {
    this.notifyEntity("entity.einzahl.WAHL.PUBLIC_KEY_EXPORTED", AttributTyp.BOOLEAN, this.publicKeyExported, this.publicKeyExported = publicKeyExported);
  }

  /* nicht persistent, nur beim Anlegen der Wahl relevant */
  private transient NlWahlCreateData nlWahlCreateData;

  public NlWahlCreateData getNlWahlCreateData() {
    if (nlWahlCreateData == null) {
      nlWahlCreateData = new NlWahlCreateData();
    }

    return nlWahlCreateData;
  }

  public NlWahlPhase getNlWahlPhase() {
    if (nlWahlPhase == null) {
      return NlWahlPhase.INITIAL;
    }

    return nlWahlPhase;
  }

  public void setNlWahlPhase(NlWahlPhase nlWahlPhase) {
    this.notifyEntity("entity.einzahl.WAHL.WAHL_PHASE", AttributTyp.ENUM, this.nlWahlPhase, this.nlWahlPhase = nlWahlPhase);
  }

  public String getEml110Filename() {
    return eml110Filename;
  }

  public void setEml110Filename(String eml110Filename) {
    this.notifyEntity("entity.einzahl.WAHL.Eml110FILENAME", AttributTyp.STRING, this.eml110Filename, this.eml110Filename = eml110Filename);
  }

  public Date getEml110Date() {
    return eml110Date;
  }

  public void setEml110Date(Date eml110Date) {
    this.notifyEntity("entity.einzahl.WAHL.Eml110FILE_DATE", AttributTyp.DATE, this.eml110Date, this.eml110Date = eml110Date);
  }

  public String getEml110HashCode() {
    return eml110hashCode;
  }

  public void setEml110HashCode(String eml110hashCode) {
    this.notifyEntity("entity.einzahl.WAHL.Eml110FILE_HASHCODE", AttributTyp.LONG, this.eml110hashCode, this.eml110hashCode = eml110hashCode);
  }

  public String getEml230Filename() {
    return eml230Filename;
  }

  public void setEml230Filename(String eml230Filename) {
    this.notifyEntity("entity.einzahl.WAHL.Eml230FILENAME", AttributTyp.STRING, this.eml230Filename, this.eml230Filename = eml230Filename);
  }

  public Date getEml230Date() {
    return eml230Date;
  }

  public void setEml230Date(Date eml230Date) {
    this.notifyEntity("entity.einzahl.WAHL.Eml230FILE_DATE", AttributTyp.DATE, this.eml230Date, this.eml230Date = eml230Date);
  }

  public String getEml230HashCode() {
    return eml230hashCode;
  }

  public void setEml230HashCode(String eml230hashCode) {
  }

  public Date getPrivateKeyGenerationDate() {
    return privateKeyGenerationDate;
  }

  public void setPrivateKeyGenerationDate(Date privateKeyGenerationDate) {
    this.notifyEntity("entity.einzahl.WAHL.PRIVATE_KEY_GENERATION_DATE", AttributTyp.DATE, this.privateKeyGenerationDate, this.privateKeyGenerationDate = privateKeyGenerationDate);
  }

  public String getElectionDomain() {
    return electionDomain;
  }

  public void setElectionDomain(String electionDomain) {
    this.notifyEntity("entity.einzahl.WAHL.ELECTION_DOMAIN", AttributTyp.STRING, this.electionDomain, this.electionDomain = electionDomain);
  }

  public String getElectionDomainId() {
    return electionDomainId;
  }

  public void setElectionDomainId(String electionDomainId) {
    this.notifyEntity("entity.einzahl.WAHL.ELECTION_DOMAIN_ID", AttributTyp.STRING, this.electionDomainId, this.electionDomainId = electionDomainId);
  }

  public String getAbWatershap() {
    return abWatershap;
  }

  public void setAbWatershap(String abWatershap) {
    this.notifyEntity("entity.einzahl.WAHL.AB_WATERSHAP", AttributTyp.STRING, this.abWatershap, this.abWatershap = abWatershap);
  }

  public void addDateiHash(Long id, String sha256hex) {
    if (dateiPkHashcode == null) {
      dateiPkHashcode = new HashMap<>();
    }

    LOG.info("Hashcode: " + id + ", " + sha256hex);

    dateiPkHashcode.put(id, sha256hex);

    this.notifyEntity();
  }

  public boolean checkDateiHash(Long id, Supplier<String> sha256Hex) {
    if (dateiPkHashcode == null) {
      return false;
    }

    String vergleich = dateiPkHashcode.get(id);

    if (isBlank(vergleich)) {
      return false;
    }

    try {
      return vergleich.equals(sha256Hex.get());
    } catch (Exception e) {
      LOG.warn("Fehler beim Berechnen des Hashs: " + e.getMessage() + ", " + id, e);

      return false;
    }
  }

  public boolean isBackupRestoreEnabled() {
    return backupRestoreEnabled;
  }

  public void setBackupRestoreEnabled(boolean backupRestoreEnabled) {
    this.notifyEntity("entity.einzahl.WAHL.BACKUP_RESTORE_ENABLED", AttributTyp.BOOLEAN, this.backupRestoreEnabled, this.backupRestoreEnabled = backupRestoreEnabled);
  }
  
  @Override
  public boolean isHsbcSystem() {
    return hsbcSystem;
  }

  public void setHsbcSystem(boolean hsbcSystem) {
    this.notifyEntity("entity.einzahl.WAHL.HSBC", AttributTyp.BOOLEAN, this.hsbcSystem, this.hsbcSystem = hsbcSystem);
  }

  @Override
  public boolean isHsbbSystem() {
    return hsbbSystem;
  }

  public void setHsbbSystem(boolean hsbbSystem) {
    this.notifyEntity("entity.einzahl.WAHL.HSBB", AttributTyp.BOOLEAN, this.hsbbSystem, this.hsbbSystem = hsbbSystem);
  }

  @Override
  public boolean isNbsbSystem() {
    return nbsbSystem;
  }

  public void setNbsbSystem(boolean nbsbSystem) {
    this.notifyEntity("entity.einzahl.WAHL.NBSB", AttributTyp.BOOLEAN, this.nbsbSystem, this.nbsbSystem = nbsbSystem);
  }

  @Override
  public boolean isNbsbcSystem() {
    return nbsbcSystem;
  }

  public void setNbsbcSystem(boolean nbsbcSystem) {
    this.notifyEntity("entity.einzahl.WAHL.NBSBC", AttributTyp.BOOLEAN, this.nbsbcSystem, this.nbsbcSystem = nbsbcSystem);
  }
}
