<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, D-84453 Mühldorf
 */

namespace Kufer\Web\KuferTools\Utils\WssField;

use Kufer\Web\KuferTools\Basis\UseCaseBuilder\ToolSection;

class WssFactory
{
  public function getWss(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $datamodulColumn): IWssField
  {
    static $cache = array();
    
    $key = $toolSection->getToolId() . '_' . $toolSection->getToolSectionId()
        . '_' . ($toolSettings->isEmpty() ? '0' : '1')
      . '_' . $datamodulColumn->datamodul . '_' . $datamodulColumn->fieldname;
    if (!isset($cache[$key])) {
      $cache[$key] = $this->getWss4Datamodul($toolSection, $toolSettings, $datamodulColumn);
    } else {
      
      
      $cache[$key]->setDatamodulColumn($datamodulColumn);
    }

    return $cache[$key];
  }

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

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

  private function getWss4Kurstag(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ausfall': return new Kurstag\WssFieldKurstagAusfall($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kurstag_abgeschlossen': return new Kurstag\WssFieldKurstagAbgeschlossen($toolSection, $toolSettings, $pDatamodulColumn);
      case 'status_farbe': return new Kurstag\WssFieldKurstagStatusFarbe($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ort': return new Kurstag\WssFieldKurstagOrt($toolSection, $toolSettings, $pDatamodulColumn);
      case 'medien': return new Kurstag\WssFieldKurstagMedien($toolSection, $toolSettings, $pDatamodulColumn);
      case 'medien_zus': return new Kurstag\WssFieldKurstagMedienZus($toolSection, $toolSettings, $pDatamodulColumn);
      case 'qualiid': return new Kurstag\WssFieldKurstagNotwendigeQualifikationen($toolSection, $toolSettings, $pDatamodulColumn);
      case 'klassenbuchueok': return new Kurstag\WssFieldKurstagUeGehalten($toolSection, $toolSettings, $pDatamodulColumn);
      case 'klassenbuchueok_symbole': return new Kurstag\WssFieldKurstagUeGehaltenSymbole($toolSection, $toolSettings, $pDatamodulColumn);
      case 'dnr': return new Kurstag\WssFieldKurstagDozent($toolSection, $toolSettings, $pDatamodulColumn);
      case 'bemerkungen': return new Kurstag\WssFieldKurstagBemerkung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'rechnung_status': return new Kurstag\WssFieldKurstagRechnungStatus($toolSection, $toolSettings, $pDatamodulColumn);
      case 'bewirtung': return new Kurstag\WssFieldKurstagBewirtung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'link_zum_klassenbuch': return new Kurstag\WssFieldKurstagLinkZumKlassenbuch($toolSection, $toolSettings, $pDatamodulColumn);
      case 'stufe': return new Kurstag\WssFieldKurstagStufe($toolSection, $toolSettings, $pDatamodulColumn);
      case 'unit': return new Kurstag\WssFieldKurstagUnit($toolSection, $toolSettings, $pDatamodulColumn);
      case 'level': return new Kurstag\WssFieldKurstagLevel($toolSection, $toolSettings, $pDatamodulColumn);
      case 'keypoint': return new Kurstag\WssFieldKurstagKeypoint($toolSection, $toolSettings, $pDatamodulColumn);
      case 'hausarbeit': return new Kurstag\WssFieldKurstagHausarbeit($toolSection, $toolSettings, $pDatamodulColumn);
      case 'progresscheck': return new WssFieldCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
      case 'datum': return new Kurstag\WssFieldKurstagDatum($toolSection, $toolSettings, $pDatamodulColumn);
      case 'rechnung_status_gesamt': return new Kurstag\WssFieldKurstagTaggenauGesamt($toolSection, $toolSettings, $pDatamodulColumn);
      case 'rechnung_status_honorar': return new Kurstag\WssFieldKurstagTaggenauHonorar($toolSection, $toolSettings, $pDatamodulColumn);
      case 'rechnung_status_fahrkosten': return new Kurstag\WssFieldKurstagTaggenauFahrkosten($toolSection, $toolSettings, $pDatamodulColumn);
      case 'bestuhlung': return new Kurstag\WssFieldKurstagBestuhlung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'bericht_abgeben': return new Kurstag\WssFieldKurstagBerichtAbgeben($toolSection, $toolSettings, $pDatamodulColumn);
      case 'datum_komplettkurz': return new Basis\WssFieldDatumKomplettKurz(
        $toolSection,
        $toolSettings,
        $pDatamodulColumn,
        'datum'
      );
      case 'datum_komplettkurz_jahrkurz': return new Basis\WssFieldDatumKomplettKurzJahrKurz(
        $toolSection,
        $toolSettings,
        $pDatamodulColumn,
        'datum'
      );
      case 'wotagkurz': return new Basis\WssFieldWoTagKurz(
        $toolSection,
        $toolSettings,
        $pDatamodulColumn,
        'datum'
      );
      case 'aufzeichnungslink': return new Kurstag\WssFieldKurstagAufzeichnungslink($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4Kursplanung(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    if (\DBWorkBASysSettings::isSalzburgBildungswerk() && $pDatamodulColumn->fieldname == 'freidef1') {
      $pDatamodulColumn->istext = \Kufer\Web\KuferTools\Basis\Presenter\WssPresenterFormular::TYPE_SELECT;

      return new WssFieldSelect($toolSection, $toolSettings, $pDatamodulColumn);
    }

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

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

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

  private function getWss4Kurs(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    if (\StringOperations::startsWith($pDatamodulColumn->fieldname, 'kursauswahl')) {
      return new Kurs\WssFieldKursKursauswahl($toolSection, $toolSettings, $pDatamodulColumn);
    }

    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'id': return new Kurs\WssFieldKursNummer($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kurzbez': return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 80);
      case 'nrab': return new Kurs\WssFieldKursNummerAb($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ort': return new Basis\WssFieldTextWithMaxLengthDecorator(
        new Kurs\WssFieldKursOrt($toolSection, $toolSettings, $pDatamodulColumn),
        66
      );
      case 'aussenst': return new Basis\WssFieldTextWithMaxLengthDecorator(
        new Kurs\WssFieldKursAussenstelle($toolSection, $toolSettings, $pDatamodulColumn),
        60
      );
      case 'teil_wart': return new Kurs\WssFieldKursWarteliste($toolSection, $toolSettings, $pDatamodulColumn);
      case 'gebuehrtabelle': return new Kurs\WssFieldKursGebuehrenTabelle($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kursort_google_maps': return new Kurs\WssFieldKursOrtGoogleMaps($toolSection, $toolSettings, $pDatamodulColumn);
      case 'route_zum_kursort_google_maps': return new Kurs\WssFieldKursRouteGoogleMaps($toolSection, $toolSettings, $pDatamodulColumn);
      case 'alternativkursBuchbar': return new Kurs\WssFieldKursAlternativkursBuchbar($toolSection, $toolSettings, $pDatamodulColumn);
      case 'berufsgruppe4kurs_komma': return new Kurs\WssFieldKursBerufsgruppenKomma($toolSection, $toolSettings, $pDatamodulColumn);
      case 'berufsgruppe4kurs_html': return new Kurs\WssFieldKursBerufsgruppenHtml($toolSection, $toolSettings, $pDatamodulColumn);
      case 'anmeldungen': return new Kurs\WssFieldKursAnmeldungen($toolSection, $toolSettings, $pDatamodulColumn);
      case 'anmeldungeng': return new Kurs\WssFieldKursGrafikAnmeldungen($toolSection, $toolSettings, $pDatamodulColumn);
      case 'status_farbe': return new Kurs\WssFieldKursStatusFarbe($toolSection, $toolSettings, $pDatamodulColumn);
      case 'alternativKurse': return new Kurs\WssFieldKursAlternativkurse($toolSection, $toolSettings, $pDatamodulColumn);
      case 'dozenten_liste': return new Kurs\WssFieldKursDozentenListe($toolSection, $toolSettings, $pDatamodulColumn);
      case 'webinfo': return new Kurs\WssFieldKursWebinfo($toolSection, $toolSettings, $pDatamodulColumn);
      case 'nur_webinfo': return new Kurs\WssFieldKursNurWebinfo($toolSection, $toolSettings, $pDatamodulColumn);
      case 'rechnung_status': return new Kurs\WssFieldKursRechnungStatus($toolSection, $toolSettings, $pDatamodulColumn);
      case 'info': return new Kurs\WssFieldKursInfo($toolSection, $toolSettings, $pDatamodulColumn);
      case 'dozenten_kommasepariert': return new Kurs\WssFieldKursDozentenKommaSep($toolSection, $toolSettings, $pDatamodulColumn);
      case 'gebuehr': return new Kurs\WssFielKursGebuehrExternerKursBlak($toolSection, $toolSettings, $pDatamodulColumn);
      case 'geb_erm': return new Kurs\WssFielKursGebuehrExternerKursBlak($toolSection, $toolSettings, $pDatamodulColumn);
      case 'dauer': return new Kurs\WssFieldKursDauer($toolSection, $toolSettings, $pDatamodulColumn);
      case 'dauer_select': return new Kurs\WssFieldKursDauerAuswahlfeld($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kursstatus': return new Kurs\WssFieldKursKursstatus($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kursstatus_mit_farbe': return new Kurs\WssFieldKursKursstatusMitFarbe($toolSection, $toolSettings, $pDatamodulColumn);
      case 'beginn': return new Kurs\WssFieldKursBeginn($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ende': return new Kurs\WssFieldKursEnde($toolSection, $toolSettings, $pDatamodulColumn);
      case 'list_ma_veranstalter': return new Kurs\WssFieldKursVeranstalterMitarbeiter($toolSection, $toolSettings, $pDatamodulColumn);
      case 'anzahl_ma_veranstalter': return new Kurs\WssFieldKursVeranstalterMitarbeiterAnzahl($toolSection, $toolSettings, $pDatamodulColumn);
      case 'oberkurs': return new Kurs\WssFieldKursOberkurs($toolSection, $toolSettings, $pDatamodulColumn);
      case 'veranstalter': return new Kurs\WssFieldKursVeranstalter($toolSection, $toolSettings, $pDatamodulColumn);
      case 'veranstaltungsleiter': return new Kurs\WssFieldKursVeranstaltungsLeiter($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kursort_kurz': return new Kurs\WssFieldKursKursortKurzbezeichnung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ausfall': return new WssFieldCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
      case 'abschlussBool': return new WssFieldCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
      case 'teinzel': return new Kurs\WssFieldKursEinzelveranstaltung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'teinzel_m': return new Kurs\WssFieldKursEinzelveranstaltung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'teinzel_w': return new Kurs\WssFieldKursEinzelveranstaltung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'teinzel_u': return new Kurs\WssFieldKursEinzelveranstaltung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kinder_ev': return new Kurs\WssFieldKursEinzelveranstaltung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'keinzel_m': return new Kurs\WssFieldKursEinzelveranstaltung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'keinzel_w': return new Kurs\WssFieldKursEinzelveranstaltung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'keinzel_u': return new Kurs\WssFieldKursEinzelveranstaltung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'arykennzeichen': return new Kurs\WssFieldKursKennzeichen($toolSection, $toolSettings, $pDatamodulColumn);
      case 'vertrag_status': return new Kurs\WssFieldKursVertragStatus($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kart_key': return new WssFieldSelect($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kzielg_key': return new Kurs\WssFieldKursZielgruppeKurs($toolSection, $toolSettings, $pDatamodulColumn);
      case 'sprache': return new Kurs\WssFieldKursSprache($toolSection, $toolSettings, $pDatamodulColumn);
      case 'anm_ende': return new Kurs\WssFieldKursAnmeldeende($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ausbildungen_ausbildungsschablone': return new Kurs\WssFieldKursAusbildungenAusbildungsschablone($toolSection, $toolSettings, $pDatamodulColumn);
      case 'gebuehr_des_teilnehmers': return new Kurs\WssFieldKursGebuehrTeilnehmer($toolSection, $toolSettings, $pDatamodulColumn);
      case 'gebuehr_der_firma': return new Kurs\WssFieldKursGebuehrFirma($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ausstellung_kooperationspartner': return new Kurs\WssFieldKursKooperationspartnerAusstellung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ausstellung_person': return new Kurs\WssFieldKursKursAusstellungAnsprechpartner($toolSection, $toolSettings, $pDatamodulColumn);
      case 'naechster_kurstag': return new Kurs\WssFieldKursNaechsterKurstag($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kinderbetr': return new WssFieldCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
      case 'zeugnis': return new Kurs\WssFieldKursZeugnis($toolSection, $toolSettings, $pDatamodulColumn);
      case 'beginn_ende_komplett': return new Kurs\WssFieldKursZeitraum($toolSection, $toolSettings, $pDatamodulColumn);
      case 'beginn_dat_komplettkurz': return new Basis\WssFieldDatumKomplettKurz(
        $toolSection,
        $toolSettings,
        $pDatamodulColumn,
        'beginn_dat'
      );
      case 'beginn_dat_komplettkurz_jahrkurz': return new Basis\WssFieldDatumKomplettKurzJahrKurz(
        $toolSection,
        $toolSettings,
        $pDatamodulColumn,
        'beginn_dat'
      );
      case 'ende_dat_komplettkurz': return new Basis\WssFieldDatumKomplettKurz(
        $toolSection,
        $toolSettings,
        $pDatamodulColumn,
        'ende_dat'
      );
      case 'ende_dat_komplettkurz_jahrkurz': return new Basis\WssFieldDatumKomplettKurzJahrKurz(
        $toolSection,
        $toolSettings,
        $pDatamodulColumn,
        'ende_dat'
      );
    }
  }

  private function getWss4Kurs2(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
        
        
        
      case 'webinar_link': return new Kurs\WssFieldKurs2WebinarLink($toolSection, $toolSettings, $pDatamodulColumn, '_blank');
      case 'webinar': return new Kurs\WssFieldKursOnlineArt($toolSection, $toolSettings, $pDatamodulColumn);
      case 'webinar_softwareid': return new Kurs\WssFieldKursOnlineSoftware($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4Teilnehmer(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    if (\StringOperations::stripos($pDatamodulColumn->fieldname, 'krit') !== false) {
      return new Teilnehmer\WssFieldTeilnehmerKrit($toolSection, $toolSettings, $pDatamodulColumn);
    }

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

  private function getWss4Belegung(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    if (\StringOperations::stripos($pDatamodulColumn->fieldname, 'historiekrit') !== false) {
      return new Belegung\WssFieldBelegungHistorieKrit($toolSection, $toolSettings, $pDatamodulColumn);
    }

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

      case 'entgelt': return new Belegung\WssFieldBelegungFeldAusblendenExternerKursBlak($toolSection, $toolSettings, $pDatamodulColumn);
      case 'bet_offen': return new Belegung\WssFieldBelegungFeldAusblendenExternerKursBlak($toolSection, $toolSettings, $pDatamodulColumn);
      case 'bezahlt': return new Belegung\WssFieldBelegungFeldAusblendenExternerKursBlak($toolSection, $toolSettings, $pDatamodulColumn);

      case 'gebuehr': return new Belegung\WssFieldBelegungFeldAusblendenExternerKursBlak($toolSection, $toolSettings, $pDatamodulColumn);
      case 'geb_erm': return new Belegung\WssFieldBelegungFeldAusblendenExternerKursBlak($toolSection, $toolSettings, $pDatamodulColumn);
      case 'aussenst': return new Belegung\WssFieldBelegungFeldAusblendenExternerKursBlak($toolSection, $toolSettings, $pDatamodulColumn);
      case 'tn_namevorname_hauptteilnehmer': return new Teilnehmer\WssFieldTeilnehmerTnInfoLinkHinzufuegen($toolSection, $toolSettings, $pDatamodulColumn);

      case 'konto_inh': return new Belegung\WssFieldBelegungKontoInhaber($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kinder_alle': return new Belegung\WssFieldBelegungKinder($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4Kursort(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'barrierefrei': return new Kursort\WssFieldKursortBarrierefrei($toolSection, $toolSettings, $pDatamodulColumn);
      case 'hausmeister1': return new Kursort\WssFieldKursortHausmeister1($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ausstattung_bez': return new Kursort\WssFieldKursortAusstattungBez($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ausstattung_bezbem': return new Kursort\WssFieldKursortAusstattungBezBem($toolSection, $toolSettings, $pDatamodulColumn);
      case 'smsgrafik': return new Kursort\WssFieldKursortSmsGrafik($toolSection, $toolSettings, $pDatamodulColumn);
      case 'email': return new Basis\WssFieldBasisEMailLink($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4Gebaeude(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'barrierefrei': return new Gebaeude\WssFieldGebaeudeBarrierefrei($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4DokumenteWeb(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'darstellungWeb': return new DokumenteWeb\WssFieldDokumenteWebDarstellung($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kosten': return new DokumenteWeb\WssFieldDokumenteWebKosten($toolSection, $toolSettings, $pDatamodulColumn);
      case 'downloadlinkkomplett': return new DokumenteWeb\WssFieldDownloadLinkKomplett($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4Foto(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'pfoto': return new Foto\WssFieldFotoPfoto($toolSection, $toolSettings, $pDatamodulColumn);
      case 'pfoto_inArbeit': return new Foto\WssFieldFotoPfotoInArbeit($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4Kommunikation(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'emailgrafik': return new Kommunikation\WssFieldKommunikationEmailgrafik($toolSection, $toolSettings, $pDatamodulColumn);
      case 'emailgrafik_formular':
      case 'email_formular': return new Kommunikation\WssFieldKommunikationEmailFormular($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4Dozent(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    if (\StringOperations::stripos($pDatamodulColumn->fieldname, 'krit') !== false) {
      return new Dozent\WssFieldDozentKrit($toolSection, $toolSettings, $pDatamodulColumn);
    }

    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'inaktiv': return new WssFieldCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
      case 'dse_unterschrieben_weg':
        return new Person\WssFieldPersonDseUnterschriebenWeg($toolSection, $toolSettings, $pDatamodulColumn);
      case 'dse_widerrufen_weg': return new Person\WssFieldPersonDseWiderrufenWeg($toolSection, $toolSettings, $pDatamodulColumn);
      case 'dse_status_symbol': return new Person\WssFieldPersonDseStatusSymbol($toolSection, $toolSettings, $pDatamodulColumn);
      case 'dse_checkbox': return new Person\WssFieldPersonDseCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
      case 'freieCheckbox': return new Dozent\WssFieldDozentFreieCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
      case 'foto_1': return new Dozent\WssFieldDozentFoto($toolSection, $toolSettings, $pDatamodulColumn, 1);
      case 'foto_2': return new Dozent\WssFieldDozentFoto($toolSection, $toolSettings, $pDatamodulColumn, 2);
      case 'foto_3': return new Dozent\WssFieldDozentFoto($toolSection, $toolSettings, $pDatamodulColumn, 3);
      case 'foto_4': return new Dozent\WssFieldDozentFoto($toolSection, $toolSettings, $pDatamodulColumn, 4);
      case 'foto_5': return new Dozent\WssFieldDozentFoto($toolSection, $toolSettings, $pDatamodulColumn, 5);
      case 'foto_6': return new Dozent\WssFieldDozentFoto($toolSection, $toolSettings, $pDatamodulColumn, 6);
      case (preg_match('/copyright_[1-6]/', $pDatamodulColumn->fieldname) === 1):
        return new Dozent\WssFieldDozentCopyright($toolSection, $toolSettings, $pDatamodulColumn);
      case 'fachbereichliste': return new Dozent\WssFieldDozentFachBereichListe($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kennzeichen': return new Dozent\WssFieldDozentKennzeichen($toolSection, $toolSettings, $pDatamodulColumn);
      case 'branchen': return new Dozent\WssFieldDozentBranchen($toolSection, $toolSettings, $pDatamodulColumn);
      case 'einsatzbezirke': return new Dozent\WssFieldDozentEinsatzbezirke($toolSection, $toolSettings, $pDatamodulColumn);
      case 'qualifikationenliste': return new Dozent\WssFieldDozentQualifikationen($toolSection, $toolSettings, $pDatamodulColumn);
      case 'einsatzbezirkeauswahl': return new Dozent\WssFieldDozentEinsatzbezirkeAuswahl($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ausbildungenauswahl': return new Dozent\WssFieldDozentAusbildungAuswahl($toolSection, $toolSettings, $pDatamodulColumn);
      case 'qualifikationenauswahl': return new Dozent\WssFieldDozentQualifikationenAuswahl($toolSection, $toolSettings, $pDatamodulColumn);
      case 'alle_tel_ohne_mobil': return new Allgemein\WssFieldAllgemeinKommunikationen($toolSection, $toolSettings, $pDatamodulColumn, 'D', array('T'));
      case 'alle_tel_mit_mobil': return new Allgemein\WssFieldAllgemeinKommunikationen($toolSection, $toolSettings, $pDatamodulColumn, 'D', array('T', 'M'));
      case 'alle_fax': return new Allgemein\WssFieldAllgemeinKommunikationen($toolSection, $toolSettings, $pDatamodulColumn, 'D', array('F'));
      case 'alle_email': return new Allgemein\WssFieldAllgemeinKommunikationen($toolSection, $toolSettings, $pDatamodulColumn, 'D', array('E'));
      case 'alle_mobil': return new Allgemein\WssFieldAllgemeinKommunikationen($toolSection, $toolSettings, $pDatamodulColumn, 'D', array('M'));
      case 'name':
      case 'vorname':
        return new Basis\WssFieldTextWithMaxLengthDecorator(new Dozent\WssFieldDozentDozInfoLinkHinzufuegen($toolSection, $toolSettings, $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 Dozent\WssFieldDozentDozInfoLinkHinzufuegen($toolSection, $toolSettings, $pDatamodulColumn);
      case 'name_titel_auswahl': return new Person\WssFieldPersonAnredetitelAuswahl($toolSection, $toolSettings, $pDatamodulColumn);
      case 'ort':
      case 'strasse':
      case 'zusatz':
      case 'zusatz2':
      case 'zusatz3':
        return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 100);
      case 'nation': return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 25);
      case 'taetigkeitsbez':
      case 'kuenstlername': return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 60);
      case 'homepage': return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 90);
      case 'kskanspruch_nehmen':
        return new Dozent\WssFieldDozentKskInAnspruchNehmen($toolSection, $toolSettings, $pDatamodulColumn);
      case 'kskanspruch_betrag':
        return new Dozent\WssFieldDozentKskAnspruchBetrag($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4DozWebDataCheck(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'taetigkeitsbez':
      case 'kuenstlername': return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 60);
      case 'homepage': return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 90);
    }
  }

  private function getWss4DozentHonorare(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case'spesenprotn': return new WssFieldCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4StammBv(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'bearbeiten': return new StammBv\WssFieldStammBvBearbeiten($toolSection, $toolSettings, $pDatamodulColumn);
      case 'loeschen': return new StammBv\WssFieldStammBvLoeschen($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4VisitenkartenWeb(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'fachgebiete': return new Visitenkarten\WssFieldVisitenkartenWebFachgebiet($toolSection, $toolSettings, $pDatamodulColumn);
      case 'nation': return new Visitenkarten\WssFieldVisitenkartenWebNation($toolSection, $toolSettings, $pDatamodulColumn);
      case 'aktiv': return new WssFieldCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4DatDoc(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'versandtam_datum_lang': return new DatDoc\WssFieldDatDocVersandtAmDatumLang($toolSection, $toolSettings, $pDatamodulColumn);
      case 'inhalt_anzeigen': return new DatDoc\WssFieldDatDocInhaltAnzeigen($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4PlanenderMitarbeiter(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'name_vorname_email': return new KursPlanenderMa\WssFieldKursPlanenderMitarbeiterNameVornameEMail($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4VerwaltenderMitarbeiter(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'name_vorname_email': return new KursVerwaltenderMa\WssFieldKursVerwaltenderMitarbeiterNameVornameEMail($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4VerantwortenderMitarbeiter(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'name_vorname_email': return new KursVerantwortenderMa\WssFieldKursVerantwortenderMitarbeiterNameVornameEMail($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4Adresse(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'name_titel_auswahl': return new Person\WssFieldPersonAnredetitelAuswahl($toolSection, $toolSettings, $pDatamodulColumn);
      case 'name': return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 70);
      case 'vorname': return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 35);
      case 'ort':
      case 'strasse':
        return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 100);
      case 'nation': return new Basis\WssFieldTextWithMaxLength($toolSection, $toolSettings, $pDatamodulColumn, 25);
    }
  }

  private function getWss4Wunschtermin(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'datbis_komplettkurz':
        return new Basis\WssFieldDatumKomplettKurz($toolSection, $toolSettings, $pDatamodulColumn, 'datbis');
      case 'datvon_komplettkurz':
        return new Basis\WssFieldDatumKomplettKurz($toolSection, $toolSettings, $pDatamodulColumn, 'datvon');
      case 'wotag': return new Wunschtermin\WssFieldWunschterminWochentage($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4DozUrlaub(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'datum_komplettkurz':
        return new Basis\WssFieldDatumKomplettKurz($toolSection, $toolSettings, $pDatamodulColumn, 'datum');
      case 'vormittags_oder_nachmittags':
      case 'ganzer_tag':
        return new WssFieldCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
      case 'grund':
        return new \Kufer\Web\KuferTools\Utils\WssField\DozUrlaub\WssFieldDozUrlaubGrund($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

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

  private function getWss4DozBewerbung(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $pDatamodulColumn): IWssField
  {
    switch ($pDatamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $pDatamodulColumn);
      case 'macht_aufbau':
      case 'macht_abbau':
      case 'doziert':
        return new WssFieldCheckbox($toolSection, $toolSettings, $pDatamodulColumn);
    }
  }

  private function getWss4KursAusstellung(ToolSection $toolSection, \ToolSettings $toolSettings, \Column $datamodulColumn): IWssField
  {
    switch ($datamodulColumn->fieldname) {
      default: return new WssField($toolSection, $toolSettings, $datamodulColumn);
      case 'oeffnungszeiten':
        return new KursAusstellung\WssFieldKursAusstellungOeffnungszeiten($toolSection, $toolSettings, $datamodulColumn);
      case 'lagerraumvorhanden':
        return new WssFieldCheckbox($toolSection, $toolSettings, $datamodulColumn);
    }
  }
}