<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */

namespace Kufer\KuferTools\Utils\WssField;

use Kufer\KuferTools\Utils\WssField\Teilnehmer\WssFieldTeilnehmerDienststelle;
use Kufer\Web\KuferTools\Utils\WssField\Allgemein\WssFieldAllgemeinDateTime;
use Kufer\Web\KuferTools\Utils\WssField\Basis\WssFieldBasisEMailLink;
use Kufer\Web\KuferTools\Utils\WssField\Basis\WssFieldTextWithMaxLength;
use Kufer\Web\KuferTools\Utils\WssField\Basis\WssFieldTextWithMaxLengthDecorator;
use Kufer\Web\KuferTools\Utils\WssField\Belegung\WssFieldBelegungKinder;
use Kufer\Web\KuferTools\Utils\WssField\Belegung\WssFieldBelegungStatusLang;
use Kufer\Web\KuferTools\Utils\WssField\IWssField;
use Kufer\Web\KuferTools\Utils\WssField\SammelVertraege;
use Kufer\Web\KuferTools\Utils\WssField\Teilnehmer\WssFieldTeilnehmerAusbildungAusbildungsschablone;
use Kufer\Web\KuferTools\Utils\WssField\Wunschtermin;

class WssFactory
{
  
  public function getWss($datamodulColumn)
  {
    static $cache = array();
    
    $key = $datamodulColumn->datamodul . '_' . $datamodulColumn->fieldname;
    if (!isset($cache[$key])) {
      $cache[$key] = $this->getWss4Datamodul($datamodulColumn);
    } else {
      
      
      $cache[$key]->setDatamodulColumn($datamodulColumn);
    }

    return $cache[$key];
  }

  
  private function getWss4Datamodul($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      case 'geschlecht':
      case 'geschlecht_anrede': return new WssFieldAllgemeinGeschlecht($pDatamodulColumn);
      case 'iban': return new WssFieldAllgemeinIban($pDatamodulColumn);
      case 'iban_button_bankdaten_fuellen': return new WssFieldAllgemeinIbanAndereBankdatenFuellen($pDatamodulColumn);
      case 'bic': return new WssFieldTextWithMaxLength($pDatamodulColumn, 11);
      case 'bankbezAnhandIban':
      case 'bankbezLangAnhandIban': return new WssFieldAllgemeinBankbezAnhandIban($pDatamodulColumn);
      case 'konto': return new WssFieldAllgemeinKontonummer($pDatamodulColumn);
      case 'agb_bestaetigen': return new WssFieldMitarbeiterAGB($pDatamodulColumn);
      case 'tel_anzeige':
      case 'tel2_anzeige':
      case 'mobil_anzeige':
      case 'fax_anzeige':
      case 'fax2_anzeige':
        return new WssFieldTextWithMaxLength($pDatamodulColumn, 50);
      case 'email_anzeige':
        return new WssFieldTextWithMaxLength($pDatamodulColumn, 100);
    }

    switch ($pDatamodulColumn->datamodul) {
      default: return new WssField($pDatamodulColumn);
      case 'kurstag': return $this->getWss4Kurstag($pDatamodulColumn);
      case 'kursplanung': return $this->getWss4Kursplanung($pDatamodulColumn);
      case 'kurs': return $this->getWss4Kurs($pDatamodulColumn);
      case 'kurs2': return $this->getWss4Kurs2($pDatamodulColumn);
      case 'teilnehmer': return $this->getWss4Teilnehmer($pDatamodulColumn);
      case 'belegung': return $this->getWss4Belegung($pDatamodulColumn);
      case 'kursort': return $this->getWss4Kursort($pDatamodulColumn);
      case 'gebaeude': return $this->getWss4Gebaeude($pDatamodulColumn);
      case 'dokumentWeb': return $this->getWss4DokumenteWeb($pDatamodulColumn);
      case 'foto': return $this->getWss4Foto($pDatamodulColumn);
      case 'kommunikation': return $this->getWss4Kommunikation($pDatamodulColumn);
      case 'dozent': return $this->getWss4Dozent($pDatamodulColumn);
      case 'stammbv': return $this->getWss4StammBv($pDatamodulColumn);
      case 'visitenkartenWeb': return $this->getWss4VisitenkartenWeb($pDatamodulColumn);
      case 'dozentenhonorare': return $this->getWss4DozentHonorare($pDatamodulColumn);
      case 'datdoc':
      case 'dat_doc': return $this->getWss4DatDoc($pDatamodulColumn);
      case 'maplanend': return $this->getWss4PlanenderMitarbeiter($pDatamodulColumn);
      case 'maverwaltend': return $this->getWss4VerwaltenderMitarbeiter($pDatamodulColumn);
      case 'adresse': return $this->getWss4Adresse($pDatamodulColumn);
      case 'dozwebdatacheck': return $this->getWss4DozWebDataCheck($pDatamodulColumn);
      case 'wunschtermin': return $this->getWss4Wunschtermin($pDatamodulColumn);
      case 'dozurlaub': return $this->getWss4DozUrlaub($pDatamodulColumn);
      case 'sammelvertraege': return $this->getWss4SammelVertraege($pDatamodulColumn);
    }
  }

  
  private function getWss4Kurstag($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'ausfall': return new WssFieldKurstagAusfall($pDatamodulColumn);
      case 'kurstag_abgeschlossen': return new WssFieldKurstagAbgeschlossen($pDatamodulColumn);
      case 'status_farbe': return new WssFieldKurstagStatusFarbe($pDatamodulColumn);
      case 'ort': return new WssFieldKurstagOrt($pDatamodulColumn);
      case 'medien': return new WssFieldKurstagMedien($pDatamodulColumn);
      case 'medien_zus': return new WssFieldKurstagMedienZus($pDatamodulColumn);
      case 'qualiid': return new WssFieldKurstagNotwendigeQualifikationen($pDatamodulColumn);
      case 'klassenbuchueok': return new WssFieldKurstagUeGehalten($pDatamodulColumn);
      case 'klassenbuchueok_symbole': return new WssFieldKurstagUeGehaltenSymbole($pDatamodulColumn);
      case 'dnr': return new WssFieldKurstagDozent($pDatamodulColumn);
      case 'bemerkungen': return new WssFieldKurstagBemerkung($pDatamodulColumn);
      case 'rechnung_status': return new WssFieldKurstagRechnungStatus($pDatamodulColumn);
      case 'bewirtung': return new WssFieldKurstagBewirtung($pDatamodulColumn);
      case 'link_zum_klassenbuch': return new WssFieldKurstagLinkZumKlassenbuch($pDatamodulColumn);
      case 'stufe': return new WssFieldKurstagStufe($pDatamodulColumn);
      case 'unit': return new WssFieldKurstagUnit($pDatamodulColumn);
      case 'level': return new WssFieldKurstagLevel($pDatamodulColumn);
      case 'keypoint': return new WssFieldKurstagKeypoint($pDatamodulColumn);
      case 'hausarbeit': return new WssFieldKurstagHausarbeit($pDatamodulColumn);
      case 'progresscheck': return new WssFieldCheckbox($pDatamodulColumn);
      case 'datum': return new WssFieldKurstagDatum($pDatamodulColumn);
    }
  }

  
  private function getWss4Kursplanung($pDatamodulColumn)
  {
    if (\StringOperations::stripos($pDatamodulColumn->fieldname, 'freidef') !== false) {
      return new WssFieldKursplanungFreidef($pDatamodulColumn);
    }

    if (\StringOperations::stripos($pDatamodulColumn->fieldname, 'werbemittel') !== false) {
      return new WssFieldWerbemittel($pDatamodulColumn);
    }

    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'kursort': return new WssFieldKursplanungKursort($pDatamodulColumn);
      case 'aussenstelle': return new WssFieldKursplanungAussenstelle($pDatamodulColumn);
      case 'verlauf': return new WssFieldKursplanungVerlauf($pDatamodulColumn);
      case 'kopiertVon': return new WssFieldKursplanungKopiertVon($pDatamodulColumn);
      case 'bis_semende': return new WssFieldCheckbox($pDatamodulColumn);
      case 'ma_planend_id': return new WssFieldKursplanungMitarbeiterPlanend($pDatamodulColumn);
      case 'fachb': return new WssFieldKursplanungFachbereich($pDatamodulColumn);
      case 'knr': return new WssFieldKnr($pDatamodulColumn);
      case 'dauer': return new WssFieldKursplanungDauer($pDatamodulColumn);
      case 'dozNr': return new WssFieldKursplanungDoznr($pDatamodulColumn);
      case 'kurstyp': return new WssFieldKursplanungKurstyp($pDatamodulColumn);
      case 'kurstage_anlegen': return new WssFieldCheckbox($pDatamodulColumn);
      case 'kooperationspartner': return new  WssFieldKursplanungKooperationspartner($pDatamodulColumn);
      case 'dozauswahl': return new WssFieldKursplanungDozentenauswahl($pDatamodulColumn);
      case 'dokumente': return new  WssFieldKursplanungDokumente($pDatamodulColumn);
      case 'beginn': return new WssFieldKursplanungBeginn($pDatamodulColumn);
      case 'ende': return new WssFieldKursplanungEnde($pDatamodulColumn);
        
        
      case 'in_bearbeitung': return new WssFieldKursplanungStatus($pDatamodulColumn);
      case 'termin_vorbericht': return new WssFieldCheckbox($pDatamodulColumn);
      case 'termin_nachbericht': return new WssFieldCheckbox($pDatamodulColumn);
      case 'termin_tel_kontakt': return new WssFieldCheckbox($pDatamodulColumn);
      case 'kart_key': return new WssFieldSelect($pDatamodulColumn);
      case 'kursort_kurz': return new WssFieldKursplanungKursortKurzbezeichnung($pDatamodulColumn);
      case 'kursort_mit_neu': return new WssFieldKursplanungKursortMitNeueingbe($pDatamodulColumn);
      case 'internetaktiv': return new WssFieldCheckbox($pDatamodulColumn);
      case 'presse_weitergabe': return new WssFieldCheckbox($pDatamodulColumn);
      case 'salzbnachr_weitergabe': return new WssFieldCheckbox($pDatamodulColumn);
      case 'eduard_weitergabe': return new WssFieldCheckbox($pDatamodulColumn);
      case 'agb_bestaetigt_am': return new WssFieldAgbBestaetigtAm($pDatamodulColumn);
      case 'pauschal_honorar': return new WssFieldCheckbox($pDatamodulColumn);
      case 'pauschale_fahrtkosten': return new WssFieldCheckbox($pDatamodulColumn);
      case 'kzielg_key': return new WssFieldKursplanungZielgruppeKurs($pDatamodulColumn);
      case 'honorar_sbw': return new WssFieldKursplanungHonorarSbw($pDatamodulColumn);
      case 'ksk': return new WssFieldCheckbox($pDatamodulColumn);
      case 'knr_org': return new \Kufer\Web\KuferTools\Utils\WssField\Kursplanung\WssFieldKursplanungWochentage($pDatamodulColumn);
    }
  }

  
  private function getWss4Kurs($pDatamodulColumn)
  {
    if (\StringOperations::startsWith($pDatamodulColumn->fieldname, 'kursauswahl')) {
      return new WssFieldKursKursauswahl($pDatamodulColumn);
    }

    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'id': return new WssFieldKursNummer($pDatamodulColumn);
      case 'nrab': return new WssFieldKursNummerAb($pDatamodulColumn);
      case 'ort': return new WssFieldKursOrt($pDatamodulColumn);
      case 'aussenst': return new WssFieldKursAussenstelle($pDatamodulColumn);
      case 'teil_wart': return new WssFieldKursWarteliste($pDatamodulColumn);
      case 'gebuehrtabelle': return new WssFieldKursGebuehrenTabelle($pDatamodulColumn);
      case 'kursort_google_maps': return new WssFieldKursOrtGoogleMaps($pDatamodulColumn);
      case 'route_zum_kursort_google_maps': return new WssFieldKursRouteGoogleMaps($pDatamodulColumn);
      case 'alternativkursBuchbar': return new WssFieldKursAlternativkursBuchbar($pDatamodulColumn);
      case 'berufsgruppe4kurs_komma': return new WssFieldKursBerufsgruppenKomma($pDatamodulColumn);
      case 'berufsgruppe4kurs_html': return new WssFieldKursBerufsgruppenHtml($pDatamodulColumn);
      case 'anmeldungen': return new \Kufer\Web\KuferTools\Utils\WssField\Kurs\WssFieldKursAnmeldungen($pDatamodulColumn);
      case 'anmeldungeng': return new WssFieldKursGrafikAnmeldungen($pDatamodulColumn);
      case 'status_farbe': return new WssFieldKursStatusFarbe($pDatamodulColumn);
      case 'alternativKurse': return new WssFieldKursAlternativkurse($pDatamodulColumn);
      case 'dozenten_liste': return new WssFieldKursDozentenListe($pDatamodulColumn);
      case 'webinfo': return new WssFieldKursWebinfo($pDatamodulColumn);
      case 'nur_webinfo': return new WssFieldKursNurWebinfo($pDatamodulColumn);
      case 'rechnung_status': return new WssFieldKursRechnungStatus($pDatamodulColumn);
      case 'info': return new WssFieldKursInfo($pDatamodulColumn);
      case 'dozenten_kommasepariert': return new WssFieldKursDozentenKommaSep($pDatamodulColumn);
      case 'gebuehr': return new WssFielKursGebuehrExternerKursBlak($pDatamodulColumn);
      case 'geb_erm': return new WssFielKursGebuehrExternerKursBlak($pDatamodulColumn);
      case 'dauer': return new WssFieldKursDauer($pDatamodulColumn);
      case 'dauer_select': return new WssFieldKursDauerAuswahlfeld($pDatamodulColumn);
      case 'kursstatus': return new WssFieldKursKursstatus($pDatamodulColumn);
      case 'kursstatus_mit_farbe': return new WssFieldKursKursstatusMitFarbe($pDatamodulColumn);
      case 'beginn': return new WssFieldKursBeginn($pDatamodulColumn);
      case 'ende': return new WssFieldKursEnde($pDatamodulColumn);
      case 'list_ma_veranstalter': return new WssFieldKursVeranstalterMitarbeiter($pDatamodulColumn);
      case 'anzahl_ma_veranstalter': return new WssFieldKursVeranstalterMitarbeiterAnzahl($pDatamodulColumn);
      case 'oberkurs': return new WssFieldOberkurs($pDatamodulColumn);
      case 'veranstalter': return new WssFieldKursVeranstalter($pDatamodulColumn);
      case 'veranstaltungsleiter': return new WssFieldKursVeranstaltungsLeiter($pDatamodulColumn);
      case 'kursort_kurz': return new WssFieldKursKursortKurzbezeichnung($pDatamodulColumn);
      case 'ausfall': return new WssFieldCheckbox($pDatamodulColumn);
      case 'abschlussBool': return new WssFieldCheckbox($pDatamodulColumn);
      case 'teinzel': return new WssFieldKursEinzelveranstaltung($pDatamodulColumn);
      case 'teinzel_m': return new WssFieldKursEinzelveranstaltung($pDatamodulColumn);
      case 'teinzel_w': return new WssFieldKursEinzelveranstaltung($pDatamodulColumn);
      case 'teinzel_u': return new WssFieldKursEinzelveranstaltung($pDatamodulColumn);
      case 'kinder_ev': return new WssFieldKursEinzelveranstaltung($pDatamodulColumn);
      case 'keinzel_m': return new WssFieldKursEinzelveranstaltung($pDatamodulColumn);
      case 'keinzel_w': return new WssFieldKursEinzelveranstaltung($pDatamodulColumn);
      case 'keinzel_u': return new WssFieldKursEinzelveranstaltung($pDatamodulColumn);
      case 'arykennzeichen': return new WssFieldKursKennzeichen($pDatamodulColumn);
      case 'vertrag_status': return new WssFieldKursVertragStatus($pDatamodulColumn);
      case 'kart_key': return new WssFieldSelect($pDatamodulColumn);
      case 'kzielg_key': return new \Kufer\Web\KuferTools\Utils\WssField\Kurs\WssFieldKursZielgruppeKurs($pDatamodulColumn);
      case 'sprache': return new \Kufer\Web\KuferTools\Utils\WssField\Kurs\WssFieldKursSprache($pDatamodulColumn);
      case 'anm_ende': return new WssFieldKursAnmeldeende($pDatamodulColumn);
      case 'ausbildungen_ausbildungsschablone': return new \Kufer\Web\KuferTools\Utils\WssField\Kurs\WssFieldKursAusbildungenAusbildungsschablone($pDatamodulColumn);
      case 'gebuehr_des_teilnehmers': return new \Kufer\Web\KuferTools\Utils\WssField\Kurs\WssFieldKursGebuehrTeilnehmer($pDatamodulColumn);
      case 'gebuehr_der_firma': return new \Kufer\Web\KuferTools\Utils\WssField\Kurs\WssFieldKursGebuehrFirma($pDatamodulColumn);
    }
  }

  
  private function getWss4Kurs2($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
        
        
        
      case 'webinar_link': return new WssFieldKurs2WebinarLink($pDatamodulColumn, '_blank');
      case 'webinar': return new WssFieldKursOnlineArt($pDatamodulColumn);
      case 'webinar_softwareid': return new WssFieldKursOnlineSoftware($pDatamodulColumn);
    }
  }

  
  private function getWss4Teilnehmer($pDatamodulColumn)
  {
    if (\StringOperations::stripos($pDatamodulColumn->fieldname, 'krit') !== false) {
      return new WssFieldTeilnehmerKrit($pDatamodulColumn);
    }

    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'beruf': return new WssFieldTeilnehmerBeruf($pDatamodulColumn);
      case 'kz_text': return new WssFieldTeilnehmerSperrvermerk($pDatamodulColumn);
      case 'berufsgruppe_komma': return new WssFieldTeilnehmerBerufsgruppenKomma($pDatamodulColumn);
      case 'berufsgruppe_html': return new WssFieldTeilnehmerBerufsgruppenHtml($pDatamodulColumn);
      case 'kennzeichen': return new WssFieldTeilnehmerKennzeichen($pDatamodulColumn);
      case 'erm_grund_und_proz': return new WssFieldTeilnehmerErmaessigungProzent($pDatamodulColumn);
      case 'gebdat': return new WssFieldTeilnehmerGebdat($pDatamodulColumn);
      case 'vorname': return new WssFieldTextWithMaxLengthDecorator(new WssFieldTeilnehmerVorname($pDatamodulColumn), 35);
      case 'dse_unterschrieben_weg': return new WssFieldPersonDseUnterschriebenWeg($pDatamodulColumn);
      case 'dse_widerrufen_weg': return new WssFieldPersonDseWiderrufenWeg($pDatamodulColumn);
      case 'dse_status_symbol': return new WssFieldPersonDseStatusSymbol($pDatamodulColumn);
      case 'newsl_erlaubt_bool': return new WssFieldTeilnehmerNewslErlaubtCheckbox($pDatamodulColumn);
      case 'newsl_interessensgebiete': return new WssFieldTeilnehmerNewslInteressensgebiete($pDatamodulColumn);
      case 'newsl_erlaubt': return new WssFieldTeilnehmerNewslErlaubt($pDatamodulColumn);
      case 'newsl_anlbearb': return new WssFieldTeilnehmerNewslAnlBearb($pDatamodulColumn);
      case 'newsl_erlart': return new WssFieldTeilnehmerNewslErlArt($pDatamodulColumn);
      case 'geburtsort': return new WssFieldTeilnehmerGeburtsort($pDatamodulColumn);
      case 'foto_1': return new WssFieldTeilnehmerFoto($pDatamodulColumn, 1);
      case 'foto_2': return new WssFieldTeilnehmerFoto($pDatamodulColumn, 2);
      case 'foto_3': return new WssFieldTeilnehmerFoto($pDatamodulColumn, 3);
      case 'foto_4': return new WssFieldTeilnehmerFoto($pDatamodulColumn, 4);
      case 'foto_5': return new WssFieldTeilnehmerFoto($pDatamodulColumn, 5);
      case 'foto_6': return new WssFieldTeilnehmerFoto($pDatamodulColumn, 6);
      case 'name':
        return new WssFieldTextWithMaxLengthDecorator(new WssFieldTeilnehmerTnInfoLinkHinzufuegen($pDatamodulColumn), 35);
      case 'namevorname':
      case 'name_vorname':
      case 'vorname_name':
      case 'name_vorname_nr':
      case 'titel_name_vorname':
      case 'titel_vorname_name':
      case 'vorname_name_ohne_komma':
      case 'name_vorname_ohne_komma': return new WssFieldTeilnehmerTnInfoLinkHinzufuegen($pDatamodulColumn);
      case 'ausbilder': return new WssFieldTeilnehmerAusbilder($pDatamodulColumn);
      case 'ausbilder_email':
      case 'ausbilder_email2':
      case 'ausbilder_tel':
      case 'ausbilder_tel2':
      case 'ausbilder_mobil':
      case 'ausbilder_mobil2':
      case 'ausbilder_fax':
        return new WssFieldTeilnehmerAusbilderKommunikation($pDatamodulColumn);
      case 'firma_aus_beziehung':
        return new WssFieldTeilnehmerFirma($pDatamodulColumn);
      case 'name_titel_auswahl': return new WssFieldPersonAnredetitelAuswahl($pDatamodulColumn);
      case 'ausbildung_ausbildungsschablone': return new WssFieldTeilnehmerAusbildungAusbildungsschablone($pDatamodulColumn);
      case 'ort':
      case 'strasse':
      case 'zusatz':
      case 'zusatz2':
      case 'zusatz3':
        return new WssFieldTextWithMaxLength($pDatamodulColumn, 100);
      case 'nation': return new WssFieldTextWithMaxLength($pDatamodulColumn, 25);
      case 'dienstst': return new WssFieldTeilnehmerDienststelle($pDatamodulColumn);
      case 'schul_nr_schule': return new \Kufer\Web\KuferTools\Utils\WssField\Teilnehmer\WssFieldTeilnehmerSchulNrSchule($pDatamodulColumn);
      case 'staatsang': return new \Kufer\Web\KuferTools\Utils\WssField\Teilnehmer\WssFieldTeilnehmerStaatsangehoerigkeit($pDatamodulColumn);
    }
  }

  
  private function getWss4Belegung($pDatamodulColumn)
  {
    if (\StringOperations::stripos($pDatamodulColumn->fieldname, 'historiekrit') !== false) {
      return new WssFieldBelegungHistorieKrit($pDatamodulColumn);
    }

    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'anmeldeart': return new WssFieldBelegungAnmeldeart($pDatamodulColumn);
      case 'liste_ma_firma': return new WssFieldBelegungFirmenMitarbeiter($pDatamodulColumn);
      case 'pkt_ok_stat': return new WssFieldBelegungPunkteOk($pDatamodulColumn);
      case 'status_farbe': return new WssFieldBelegungStatusFarbe($pDatamodulColumn);
      case 'elearning_link': return new WssFieldBelegungElearningLink($pDatamodulColumn);
      case 'punkte': return new WssFieldBelegungPunkte($pDatamodulColumn);
      case 'zahlart': return new WssFieldBelegungZahlart($pDatamodulColumn);
      case 'interaktiv_liste_ma_firma': return new WssFieldBelegungInteraktivFirmenMitarbeiter($pDatamodulColumn);
      case 'storno_grund': return new WssFieldBelegungStornogrund($pDatamodulColumn);
      case 'austritt_storno': return new WssFieldBelegungAustritt($pDatamodulColumn);
      case 'storno_status': return new WssFieldBelegungStornoStatus($pDatamodulColumn);
      case 'webinarlink': return new WssFieldBelegungWebinarLink($pDatamodulColumn);
      case 'status': return new WssFieldBelegungStatus($pDatamodulColumn);
      case 'status_lang': return new WssFieldBelegungStatusLang($pDatamodulColumn);

      case 'entgelt': return new WssFieldBelegungFeldAusblendenExternerKursBlak($pDatamodulColumn);
      case 'bet_offen': return new WssFieldBelegungFeldAusblendenExternerKursBlak($pDatamodulColumn);
      case 'bezahlt': return new WssFieldBelegungFeldAusblendenExternerKursBlak($pDatamodulColumn);

      case 'gebuehr': return new WssFieldBelegungFeldAusblendenExternerKursBlak($pDatamodulColumn);
      case 'geb_erm': return new WssFieldBelegungFeldAusblendenExternerKursBlak($pDatamodulColumn);
      case 'aussenst': return new WssFieldBelegungFeldAusblendenExternerKursBlak($pDatamodulColumn);
      case 'tn_namevorname_hauptteilnehmer': return new WssFieldTeilnehmerTnInfoLinkHinzufuegen($pDatamodulColumn);

      case 'konto_inh': return new WssFieldBelegungKontoInhaber($pDatamodulColumn);
      case 'kinder_alle': return new WssFieldBelegungKinder($pDatamodulColumn);
    }
  }

  
  private function getWss4Kursort($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'barrierefrei': return new WssFieldKursortBarrierefrei($pDatamodulColumn);
      case 'hausmeister1': return new WssFieldKursortHausmeister1($pDatamodulColumn);
      case 'ausstattung_bez': return new WssFieldKursortAusstattungBez($pDatamodulColumn);
      case 'ausstattung_bezbem': return new WssFieldKursortAusstattungBezBem($pDatamodulColumn);
      case 'smsgrafik': return new WssFieldKursortSmsGrafik($pDatamodulColumn);
      case 'email': return new WssFieldBasisEMailLink($pDatamodulColumn);
    }
  }

  
  private function getWss4Gebaeude($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'barrierefrei': return new WssFieldGebaeudeBarrierefrei($pDatamodulColumn);
    }
  }

  
  
  
  private function getWss4DokumenteWeb($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'darstellungWeb': return new WssFieldDokumenteWebDarstellung($pDatamodulColumn);
      case 'kosten': return new WssFieldDokumenteWebKosten($pDatamodulColumn);
      case 'downloadlinkkomplett': return new WssFieldDownloadLinkKomplett($pDatamodulColumn);
    }
  }

  
  private function getWss4Foto($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'pfoto': return new WssFieldFotoPfoto($pDatamodulColumn);
      case 'pfoto_inArbeit': return new WssFieldFotoPfotoInArbeit($pDatamodulColumn);
    }
  }

  
  private function getWss4Kommunikation($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'emailgrafik': return new WssFieldKommunikationEmailgrafik($pDatamodulColumn);
      case 'emailgrafik_formular':
      case 'email_formular': return new WssFieldKommunikationEmailFormular($pDatamodulColumn);
    }
  }

  
  private function getWss4Dozent($pDatamodulColumn)
  {
    if (\StringOperations::stripos($pDatamodulColumn->fieldname, 'krit') !== false) {
      return new WssFieldDozentKrit($pDatamodulColumn);
    }

    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'inaktiv': return new WssFieldCheckbox($pDatamodulColumn);
      case 'dse_unterschrieben_weg':
        return new WssFieldPersonDseUnterschriebenWeg($pDatamodulColumn);
      case 'dse_widerrufen_weg': return new WssFieldPersonDseWiderrufenWeg($pDatamodulColumn);
      case 'dse_status_symbol': return new WssFieldPersonDseStatusSymbol($pDatamodulColumn);
      case 'dse_checkbox': return new WssFieldPersonDseCheckbox($pDatamodulColumn);
      case 'freieCheckbox': return new WssFieldDozentFreieCheckbox($pDatamodulColumn);
      case 'foto_1': return new WssFieldDozentFoto($pDatamodulColumn, 1);
      case 'foto_2': return new WssFieldDozentFoto($pDatamodulColumn, 2);
      case 'foto_3': return new WssFieldDozentFoto($pDatamodulColumn, 3);
      case 'foto_4': return new WssFieldDozentFoto($pDatamodulColumn, 4);
      case 'foto_5': return new WssFieldDozentFoto($pDatamodulColumn, 5);
      case 'foto_6': return new WssFieldDozentFoto($pDatamodulColumn, 6);
      case (preg_match('/copyright_[1-6]/', $pDatamodulColumn->fieldname) === 1):
        return new WssFieldDozentCopyright($pDatamodulColumn);
      case 'fachbereichliste': return new WssFieldDozentFachBereichListe($pDatamodulColumn);
      case 'kennzeichen': return new WssFieldDozentKennzeichen($pDatamodulColumn);
      case 'branchen': return new WssFieldDozentBranchen($pDatamodulColumn);
      case 'einsatzbezirke': return new WssFieldDozentEinsatzbezirke($pDatamodulColumn);
      case 'qualifikationenliste': return new WssFieldDozentQualifikationen($pDatamodulColumn);
      case 'einsatzbezirkeauswahl': return new WssFieldDozentEinsatzbezirkeAuswahl($pDatamodulColumn);
      case 'ausbildungenauswahl': return new WssFieldDozentAusbildungAuswahl($pDatamodulColumn);
      case 'qualifikationenauswahl': return new WssFieldDozentQualifikationenAuswahl($pDatamodulColumn);

      case 'alle_tel_ohne_mobil': return new WssFieldAllgemeinKommunikationen($pDatamodulColumn, 'D', array('T'));
      case 'alle_tel_mit_mobil': return new WssFieldAllgemeinKommunikationen($pDatamodulColumn, 'D', array('T', 'M'));
      case 'alle_fax': return new WssFieldAllgemeinKommunikationen($pDatamodulColumn, 'D', array('F'));
      case 'alle_email': return new WssFieldAllgemeinKommunikationen($pDatamodulColumn, 'D', array('E'));
      case 'alle_mobil': return new WssFieldAllgemeinKommunikationen($pDatamodulColumn, 'D', array('M'));

      case 'name':
      case 'vorname':
        return new WssFieldTextWithMaxLengthDecorator(new WssFieldDozentDozInfoLinkHinzufuegen($pDatamodulColumn), 35);
      case 'namevorname':
      case 'name_vorname':
      case 'vorname_name':
      case 'titel_name_vorname':
      case 'titel_vorname_name':
      case 'vorname_name_ohne_komma':
      case 'name_vorname_ohne_komma': return new WssFieldDozentDozInfoLinkHinzufuegen($pDatamodulColumn);
      case 'name_titel_auswahl': return new WssFieldPersonAnredetitelAuswahl($pDatamodulColumn);
      case 'ort':
      case 'strasse':
      case 'zusatz':
      case 'zusatz2':
      case 'zusatz3':
        return new WssFieldTextWithMaxLength($pDatamodulColumn, 100);
      case 'nation': return new WssFieldTextWithMaxLength($pDatamodulColumn, 25);
      case 'taetigkeitsbez':
      case 'kuenstlername': return new WssFieldTextWithMaxLength($pDatamodulColumn, 60);
      case 'homepage': return new WssFieldTextWithMaxLength($pDatamodulColumn, 90);
    }
  }

  
  private function getWss4DozWebDataCheck($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'taetigkeitsbez':
      case 'kuenstlername': return new WssFieldTextWithMaxLength($pDatamodulColumn, 60);
      case 'homepage': return new WssFieldTextWithMaxLength($pDatamodulColumn, 90);
    }
  }

  
  private function getWss4DozentHonorare($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case'spesenprotn': return new WssFieldCheckbox($pDatamodulColumn);
    }
  }

  
  private function getWss4StammBv($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'bearbeiten': return new WssFieldStammBvBearbeiten($pDatamodulColumn);
      case 'loeschen': return new WssFieldStammBvLoeschen($pDatamodulColumn);
    }
  }

  
  private function getWss4VisitenkartenWeb($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'fachgebiete': return new WssFieldVisitenkartenWebFachgebiet($pDatamodulColumn);
      case 'nation': return new WssFieldVisitenkartenWebNation($pDatamodulColumn);
      case 'aktiv': return new WssFieldCheckbox($pDatamodulColumn);
    }
  }

  
  private function getWss4DatDoc($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'versandtam_datum_lang': return new WssFieldDatDocVersandtAmDatumLang($pDatamodulColumn);
      case 'inhalt_anzeigen': return new WssFieldDatDocInhaltAnzeigen($pDatamodulColumn);
    }
  }

  
  private function getWss4PlanenderMitarbeiter($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'name_vorname_email': return new WssFieldKursPlanenderMitarbeiterNameVornameEMail($pDatamodulColumn);
    }
  }

  
  private function getWss4VerwaltenderMitarbeiter($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'name_vorname_email': return new WssFieldKursVerwaltenderMitarbeiterNameVornameEMail($pDatamodulColumn);
    }
  }

  
  private function getWss4Adresse($pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'name_titel_auswahl': return new WssFieldPersonAnredetitelAuswahl($pDatamodulColumn);
      case 'name': return new WssFieldTextWithMaxLength($pDatamodulColumn, 70);
      case 'vorname': return new WssFieldTextWithMaxLength($pDatamodulColumn, 35);
      case 'ort':
      case 'strasse':
        return new WssFieldTextWithMaxLength($pDatamodulColumn, 100);
      case 'nation': return new WssFieldTextWithMaxLength($pDatamodulColumn, 25);
    }
  }

  
  private function getWss4Wunschtermin(\Column $pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'wotag': return new Wunschtermin\WssFieldWunschterminWochentage($pDatamodulColumn);
    }
  }

  private function getWss4DozUrlaub(\Column $pDatamodulColumn)
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'vormittags_oder_nachmittags':
      case 'ganzer_tag':
        return new WssFieldCheckbox($pDatamodulColumn);
      case 'grund':
        return new \Kufer\Web\KuferTools\Utils\WssField\DozUrlaub\WssFieldDozUrlaubGrund($pDatamodulColumn);
    }
  }

  private function getWss4SammelVertraege(\Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($pDatamodulColumn);
      case 'kurse': return new SammelVertraege\WssFieldSammelVertraegeKurse($pDatamodulColumn);
      case 'erfasstam': return new WssFieldAllgemeinDateTime($pDatamodulColumn);
      case 'abgelehnt': return new SammelVertraege\WssFieldSammelVertraegeAbgelehnteKurse($pDatamodulColumn);
      case 'angenommen':
      case 'akzeptiert': return new SammelVertraege\WssFieldSammelVertraegeAkzeptierteKurse($pDatamodulColumn);
    }
  }
}