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


class Kurs extends Datamodul
{
  
  public const WEBFLAG_KEINE = 0x01;
  
  public const WEBFLAG_NORMAL = 0x02;
  
  public const WEBFLAG_ELTERNKIND = 0x04;
  
  public const WEBFLAG_FIRMA = 0x08;
  
  public const WEBFLAG_MEHRFACH = 0x10;
  
  public const WEBFLAG_PAAR = 0x20;

  public $nrab;
  public $nr_anzeige;
  public $nr_anzeigeab;
  
  public $anm_ende = '';
  public $beginn_dat;
  
  public $ende_dat;
  
  public $wochentage;
  
  public $knr_org;
  public $uetag;
  public $pausetag;
  public $minutentag;
  public $fachb;
  public $fachbereich;
  public $fachb_bvv;
  public $fachb_land;
  public $ort;
  public $dauer;
  public $dauer_select;
  public $aussenst;
  public $semester;
  public $invisibleAusfall = '';
  public $invisibleSemester = '';

  
  public $ausfall;
  public $kurzbez;
  public $dauerdetai;
  public $beginn;
  public $ende;
  public $beginn_ende;
  public $gebuehr;
  public $geb_erm;
  public $kinderbetr;
  public $kinder_geb;
  public $kinder_min = -1;
  public $kinder_max = -1;
  public $kinderanzahl = -1;
  public $kinder_wart = -1;
  public $kinder_frei = -1;
  public $geb_kind;
  public $geb_zuskind;
  
  public $abschluss;
  public $stundenanz;
  public $progheft;
  public $progh_sort;
  public $titel;
  public $material;
  public $teil_min = -1;
  public $teil_max = -1;
  public $teil_akt = -1;
  public $teil_frei = -1;
  public $dozentenbewerbung;
  public $abwktage;
  public $abg_bemerk;
  public $abg_datum;
  public $info;
  public $webinfo;
  public $nur_webinfo;
  public $websuchbegriffe;
  public $individtermine;
  public $anmeldungen = -1;
  public $anmeldungenAktuellVonMax = -1; 
  public $intnotiz;
  public $warnung;
  public $vorspann;
  public $nachspann;
  public $anmeldungeng = -1;
  public $anmeldungeng_web = -1;  

  
  public $hpm;

  public $webflags;
  public $zusatztexte;
  public $gebuehrtabelle = -1;
  public $geb_schw1;
  public $geb_schw2;
  public $tn_schw_1;
  public $tn_schw_2;
  public $qualifikationen;
  
  public $erm_schw2;

  
  
  
  public $hauptdozent;
  
  public $dozenten_liste;
  
  public $dozenten_kommasepariert;


  
  public $kursauswahl0; 
  public $kursauswahl1;
  public $kursauswahl2;
  public $kursauswahl3;
  public $kursauswahl4;
  public $kursauswahl5;
  public $kursauswahl6;
  public $kursauswahl7;
  public $kursauswahl8;
  public $kursauswahl9;
  public $kursauswahl10;
  public $kursauswahl11;
  public $kursauswahl12;
  public $kursauswahl13;
  public $kursauswahl14;
  public $kursauswahl15;
  public $kursauswahl16;

  
  
  public $kursauswahl17;
  public $kursauswahl18;
  public $kursauswahl19;
  public $kursauswahl20;
  public $kursauswahl21;
  public $kursauswahl22;
  public $kursauswahl23;
  public $kursauswahl24;
  public $kursauswahl25;
  public $kursauswahl26;
  public $kursauswahl27;
  public $kursauswahl28;
  public $kursauswahl29;
  public $kursauswahl30;
  public $kursauswahl31;
  public $kursauswahl32;
  public $kursauswahl33;
  public $kursauswahl34;
  public $kursauswahl35;
  public $kursauswahl36;
  public $kursauswahl37;
  public $kursauswahl38;
  public $kursauswahl39;
  public $kursauswahl40;

  
  public $anm_art;
  
  public $emailstatus;

  
  public $sonderkategorie;
  
  public $wochentage_suche;
  
  public $veranart_suche;
  
  public $veranart_suche_negativ;
  
  public $kart_key;
  
  public $zeitraum_suche;
  
  public $zeitraum_suche2;
  
  public $kurs_zielg;
  
  public $kzielg_key;
  
  public $altervon;
  
  public $alterbis;
  
  public $sofortzahl;
  
  public $folgekurs;
  public $vorg_kurs;
  
  public $verlauf;
  
  public $neuerkurs;

  
  public $keinkursbeginn;
  public $termindarstweb;
  public $gebuehrergaenztext;
  public $keinewebanmeld;
  
  
  public $vertrtage;


  
  public $vertrag;

  
  public $zeugnis;
  public $zeugnishtml;

  
  public $punkte;

  
  public $teil_wart = -1;
  public $punktesystem;
  public $anrechen;

  
  public $suche_nurNichtVolleKurse = false;
  public $suche_kennzeichen = false;
  public $suche_kennzeichenAnd = false;
  public $suche_anyKennzeichen = false;
  public $suche_noKennzeichen = false;
  public $suche_exceptKennzeichen = array();
  public $suche_ortUmkreisPlz = false;
  public $suche_ortUmkreisRadius = 0;
  public $suche_ortPlz = array();
  public $suche_dozinfo = false;
  public $suche_bezirk = '';
  public $suche_highlight = false;
  public $suche_barrierefrei = false;

  
  public $bamf = false;

  
  public $phase;
  
  public $berufsgruppe4kurs_html;
  public $berufsgruppe4kurs_komma;
  public $nw_nr_alt;
  public $min_pro_ue;
  public $anm_ende_manu;
  
  public $stichwortFindetDoz = false;
  
  public $dozstdreal = 0;

  
  public $verweil;

  
  public $sprache;

  public $notensystem;
  public $elearningKursID;

  
  public $bis_max;

  public $mandant;

  
  public $teinzel = -1;
  
  public $teinzel_m;
  
  public $teinzel_w;
  
  public $teinzel_u;
  
  public $kinder_ev = -1;
  
  public $keinzel_m;
  
  public $keinzel_w;
  
  public $keinzel_u;
  
  public $tn_nichtnrw;

  
  public $zuseintext;
  
  public $zuseinn;
  
  public $ausg_text;
  
  public $ausg_betr;

  
  public $ausstell;

  
  public $typ = '';

  
  public $kurse2;

  
  public $kursinfohtml;
  public $kursinforvf;

  public $webinfohtml;
  public $webinforvf;

  public $nur_webinfohtml;

  
  public $ksttraeger;

  
  public $bearbeiter;

  public $kurs_art;
  public $kurs_ziel;
  public $ferienkal;
  public $koop;
  public $abw_anrechen;
  public $abrechnung;
  public $koop_dvv;
  public $tag_woche;
  public $tag_abend;
  public $pruef_dvv;
  public $uebernacht;
  public $ein_mehrw;
  public $ausst_tage;
  public $zielgr_dvv;
  public $auftrag;

  public $internetvon;
  public $internetbis;

  
  public $ksk;

  public $veranstaltertxt;

  public $nichtbarrierefrei;

  public $gebiet;

  public $xfer_datum;

  
  public $fibukto_1;
  
  public $fibukto_2;
  
  public $fibukto_3;
  
  public $fibukost_1;
  
  public $fibukost_2;
  
  public $fibukost_3;


  
  private $cachePlanenderMitarbeiter;

  
  private $cacheVerwaltenderMitarbeiter;

  
  private $cacheVerantwortenderMitarbeiter;

  public function __construct()
  {
    parent::__construct();

    $this->zusatztexte = new Kurszusatztexte();
    $this->kurse2 = new Kurs2();
    $this->hauptdozent = new Dozent();
  }

  public function getDmzVarnameMappingForReceivingData(): array
  {
    return array(
      'Nr' => 'id',
      'Typ' => 'typ', 
      'Kurzbez' => 'kurzbez',
      'BeginnDat' => 'beginn_dat',
      'EndeDat' => 'ende_dat',
      'AnmEnde' => 'anm_ende',
      'AnmEndeManu' => 'anm_ende_manu',
      'FachbBvv' => 'fachb_bvv',
      'FachbLand' => 'fachb_land',
      'GebOrg' => 'geb_org',
      'GebOrgEr' => 'geb_org_er',
      'GebErm' => 'geb_erm',
      'GebFrei1' => 'geb_frei_1',
      'GebFrei2' => 'geb_frei_2',
      'GebFrei3' => 'geb_frei_3',
      'GebFrei4' => 'geb_frei_4',
      'GebFrei5' => 'geb_frei_5',
      'GebFrei6' => 'geb_frei_6',
      'GebText1' => 'geb_text_1',
      'GebText2' => 'geb_text_2',
      'GebText3' => 'geb_text_3',
      'GebText4' => 'geb_text_4',
      'GebText5' => 'geb_text_5',
      'GebText6' => 'geb_text_6',
      'GebSchw1' => 'geb_schw1',
      'GebSchw1e' => 'geb_schw1e',
      'GebSchw2' => 'geb_schw2',
      'GebArt' => 'geb_art',
      'GebRateoa' => 'geb_rateoa',
      'GebRest' => 'geb_rest',
      'GebRestdt' => 'geb_restdt',
      'TnSchw1' => 'tn_schw_1',
      'TnSchw2' => 'tn_schw_2',

      'TeilMax' => 'teil_max',
      'TeilMin' => 'teil_min',
      'TeilAkt' => 'teil_akt',
      'TeilWart' => 'teil_wart',

      'KursArt' => 'kurs_art',
      'KursZiel' => 'kurs_ziel',
      'KursZielg' => 'kurs_zielg',
      'KartKey' => 'kart_key',
      'KzielKey' => 'kziel_key',
      'KzielgKey' => 'kzielg_key',
      'KoopKey' => 'koop_key',
      'AfgTeiln' => 'afg_teiln',
      'BerBogen' => 'ber_bogen',
      'SpesenGrd' => 'spesen_grd',
      'AusgText' => 'ausg_text',
      'AusgBetr' => 'ausg_betr',
      'Fibukto1' => 'fibukto_1',
      'Fibukto2' => 'fibukto_2',
      'Fibukto3' => 'fibukto_3',
      'OrtKey' => 'ort_key',
      'PruefDvv' => 'pruef_dvv',
      'KoopDvv' => 'koop_dvv',
      'VzielDvv' => 'vziel_dvv',
      'AusstTage' => 'ausst_tage',
      'TagWoche' => 'tag_woche',
      'TagAbend' => 'tag_abend',
      'EinMehrw' => 'ein_mehrw',
      'ProgSeite' => 'prog_seite',
      'Paragr11' => 'paragr_11',
      'FormKey' => 'form_key',
      'BldMass' => 'bld_mass',
      'PauschBet' => 'pausch_bet',
      'PauschPro' => 'pausch_pro',
      'FolgeAus' => 'folge_aus',
      'FolgeEin' => 'folge_ein',
      'NwNrAlt' => 'nw_nr_alt',
      'GebErm2' => 'geb_erm_2',
      'GebErm3' => 'geb_erm_3',
      'GebErm4' => 'geb_erm_4',
      'HonOrg1' => 'hon_org_1',
      'HonOrg2' => 'hon_org_2',
      'HonOrg3' => 'hon_org_3',
      'BisMax' => 'bis_max',
      'AnmArt' => 'anm_art',
      'Fibukost1' => 'fibukost_1',
      'Fibukost2' => 'fibukost_2',
      'Fibukost3' => 'fibukost_3',
      'Auswkrit1' => 'auswkrit_1',
      'Auswkrit2' => 'auswkrit_2',
      'Auswkrit3' => 'auswkrit_3',
      'Auswkrit4' => 'auswkrit_4',
      'Auswkrit5' => 'auswkrit_5',
      'AbgDatum' => 'abg_datum',
      'FolgekInt' => 'folgek_int',
      'KinderGeb' => 'kinder_geb',
      'StornoGeb' => 'storno_geb',
      'VorgKurs' => 'vorg_kurs',
      'KnrOrg' => 'knr_org',
      'DozOrg' => 'doz_org',
      'XferDatum' => 'xfer_datum',
      'AokFoerd' => 'aok_foerd',
      'RateErm' => 'rate_erm',
      'ZielgrDvv' => 'zielgr_dvv',
      'AbwAnrechen' => 'abw_anrechen',
      'Satz1ProUe' => 'satz1_pro_ue',
      'Satz2ProUe' => 'satz2_pro_ue',
      'Satz3ProUe' => 'satz3_pro_ue',
      'GebuehrSatz2' => 'gebuehr_satz2',
      'GebuehrSatz3' => 'gebuehr_satz3',
      'GebErmSatz2' => 'geb_erm_satz2',
      'GebErmSatz3' => 'geb_erm_satz3',
      'TeilMinSatz2' => 'teil_min_satz2',
      'TeilMinSatz3' => 'teil_min_satz3',
      'GebSchw2e' => 'geb_schw2e',
      'AbgBemerk' => 'abg_bemerk',

      'KinderAkt' => 'kinder_akt',
      'KinderWart' => 'kinder_wart',
      'KinderMax' => 'kinder_max',
      'KinderMin' => 'kinder_min',

      'GebKind' => 'geb_kind',
      'GebZuskind' => 'geb_zuskind',

      'GebSperre' => 'geb_sperre',
      'EzPlan' => 'ez_plan',
      'EzIst' => 'ez_ist',
      'DzPlan' => 'dz_plan',
      'DzIst' => 'dz_ist',
      'EssenPlan' => 'essen_plan',
      'EssenIst' => 'essen_ist',
      'SonderE1' => 'sonder_e1',
      'SonderE2' => 'sonder_e2',
      'SonderE3' => 'sonder_e3',
      'AnzSonderE1' => 'anz_sonder_e1',
      'AnzSonderE2' => 'anz_sonder_e2',
      'AnzSonderE3' => 'anz_sonder_e3',
      'KinderEv' => 'kinder_ev',
      'TeinzelM' => 'teinzel_m',
      'TeinzelW' => 'teinzel_w',
      'TeinzelU' => 'teinzel_u',
      'KeinzelM' => 'keinzel_m',
      'KeinzelW' => 'keinzel_w',
      'KeinzelU' => 'keinzel_u',
      'PruefTn' => 'pruef_tn',
      'ZiMehrfach' => 'zi_mehrfach',
      'EssenJn' => 'essen_jn',
      'FaPauschal' => 'fa_pauschal',
      'UenMwst' => 'uen_mwst',
      'UenKonto' => 'uen_konto',
      'UenKst' => 'uen_kst',
      'ProghSort' => 'progh_sort',
      'FachbMusik' => 'fachb_musik',
      'UartMusik' => 'uart_musik',
      'VorschlagKnr' => 'vorschlag_knr',
      'MasterKnr' => 'master_knr',
      'AnrechenVdm' => 'anrechen_vdm',
      'ZusaetzlichVdm' => 'zusaetzlich_vdm',
      'EzGebuehr' => 'ez_gebuehr',
      'DzGebuehr' => 'dz_gebuehr',
      'BamfTyp' => 'bamf_typ',
      'DeGebuehr' => 'de_gebuehr',
      'EssenKto' => 'essen_kto',
      'EssenKst' => 'essen_kst',
      'TeilSoll' => 'teil_soll',
      'MfKursart' => 'mf_kursart',
      'VartHessenFbs' => 'vart_hessen_fbs',
      'UenFaell' => 'uen_faell',
      'InfoKennz' => 'info_kennz',
      'InfoGesperrt' => 'info_gesperrt',
      'MfKnr' => 'mf_knr',
      'MfWostd' => 'mf_wostd',
      'MfZeit' => 'mf_zeit',
      'MfDattest' => 'mf_dattest',
      'BelegAns' => 'beleg_ans',
      'AltEhVon' => 'alt_eh_von',
      'AltEhBis' => 'alt_eh_bis',
      'ErmSchw2' => 'erm_schw2',
      'TnNichtnrw' => 'tn_nichtnrw',
      'UeFibu' => 'ue_fibu',
      'ProghQrcode' => 'progh_qrcode',
      'ProghMaterial' => 'progh_material',
      'MfKursende' => 'mf_kursende',
      'MfKeinektageferien' => 'mf_keinektageferien',
      'MfAnzahltnniederschw' => 'mf_anzahltnniederschw',
      'VkzText' => 'vkz_text',
      'Titel' => 'titel',
      'Beginn' => 'beginn',
      'Ende' => 'ende',
      'Info' => 'info',
      'Webinfo' => 'webinfo',
      'Vorspann' => 'vorspann',
      'Nachspann' => 'nachspann',
      'Keinewebanmeld' => 'keinewebanmeld',
      'Individtermine' => 'individtermine',
      'Material' => 'material',
      'Ort' => 'ort',
      'Dauer' => 'dauer',
      'Stundenanz' => 'stundenanz',
      'Ausfall' => 'ausfall',
      'Webflags' => 'webflags',
      'Emailstatus' => 'emailstatus',
      'Gebuehr' => 'gebuehr',
      'TEinzel' => 'teinzel'
    );
  }

  public function getVarValue($pvarname)
  {
    switch ($pvarname) {
      default: return parent::getVarValue($pvarname);
      case 'webinfo':
        $webinfo = parent::getVarValue('webinfo');
        if (trim($webinfo) == '') {
          $webinfo = parent::getVarValue('info');
        }

        return $webinfo;
      case 'nur_webinfo':
        return parent::getVarValue('webinfo');

        return ($this->nur_webinfo ?? '') !== '' ? $this->nur_webinfo : parent::getVarValue('webinfo');
      case 'nur_webinfohtml':
        return ($this->nur_webinfohtml ?? '') !== '' ? $this->nur_webinfohtml : parent::getVarValue('webinfohtml');
      case 'dauer_select':
        return parent::getVarValue('dauer');
      case 'dauer_int':
        return intval($this->dauer);
      case 'zielgruppe':
      case 'voraussetzungen':
      case 'ziel':
      case 'methode':
      case 'anmelde':
      case 'kostenfreitxt':
      case 'zielgruppe_bf':
      case 'ziel_bf':
      case 'zeugnis_bf':
      case 'nachspann_bf':
      case 'vorspann_bf':
      case 'kurzbez_bf':
      case 'titel_bf':
      case 'zusatztext6':
      case 'zusatztext7':
      case 'zusatztext8':
      case 'zusatztext9':
      case 'zusatztext10':
      case 'stornogrund':
      case 'verwaltung_ma':
      case 'meta_keywords':
      case 'meta_description':
      case 'knr_extern':
      case 'infoberatungstext':
      case 'anm_beginn':
      case 'ita_gemeinde':
      case 'anm_begtxt':
      case 'anm_endtxt':
      case 'gebuehr_name':
      case 'teinzel_frei':
      case 'monataltvon':
      case 'monataltbis':
      case 'zusatz1html':
      case 'zusatz2html':
      case 'zusatz3html':
      case 'zusatz4html':
      case 'zusatz5html':
      case 'zusatz6html':
      case 'zusatz7html':
      case 'zusatz8html':
      case 'zusatz9html':
      case 'zusatz10html':
        return $this->zusatztexte->getVarValue($pvarname);

        
        
        
        
      case 'min_pro_ue':
        return $this->zusatztexte->getVarValue('ue_abw');
      case 'status_farbe': 
        return '';
      case 'individtermine_ausgewertet':
        return StringOperations::progHeftKursFillIndividTermine($this);
      case 'is_webinar': 
        return $this->isWebinar();
      case 'is_lernzielkontrolle':
        return $this->isLernzielkontrolle();
      case 'is_elearning_kurs':
        return $this->isElearningKurs();
      case 'webinar':
        
        $dbeintrag = $this->kurse2->getVarValue($pvarname);
        if ($dbeintrag == '' || $dbeintrag == 'F' || $dbeintrag == 'P') {
          return 'P';
        } elseif ($dbeintrag == 'W' || $dbeintrag == 'O') {
          return 'O';
        }

        return $dbeintrag;
      case 'limit_kurstag_verschiebungen_prozent':
        return $this->kurse2->getVarValue('limit_kurstag_verschiebungen') / 100;
      case 'dozenten_liste':
        if (!isset($this->dozenten_liste)) {
          $this->setDozentenListe();
        }

        return $this->dozenten_liste;
      case 'dozenten_kommasepariert_titelvornamenachname':
        $this->setDozentenKommasepariert(true);
        
      case 'dozenten_kommasepariert':
        if (!isset($this->dozenten_kommasepariert)) {
          $this->setDozentenKommasepariert();
        }

        return $this->dozenten_kommasepariert;
      case 'hauptdozent':
        if (!isset($this->hauptdozent)) {
          $dbwDozenten = DBWorkDozenten::getDefaultInstance(1, false, true);
          $this->hauptdozent = $dbwDozenten->getHauptDozent($this->id, true);
        }

        return $this->hauptdozent;
      case 'gebuehrtabelle':
        if ($this->gebuehrtabelle === -1 && $this->id !== null) {
          $dbwKursgebuehr = DBWorkKursgebuehr::getDefaultInstance();
          $gebuehren = $dbwKursgebuehr->getGebuehrenbyKNR($this->id);
          $this->gebuehrtabelle = $this->getGebuehrenTabelle($gebuehren);
        }

        return $this->gebuehrtabelle;
      case 'geb_kind':
        if (System::isKuferSql5()) {
          if (is_null($this->id)) {
            return '';
          }

          $berechner = GebuehrenElementRechner::createInstance(true);
          $berechner->ladeGebuehren($this->id);

          return MathOperations::floatToString($berechner->getKindGebuehrSumme(1, ''));
        } else {
          return parent::getVarValue($pvarname);
        }
        
      case 'geb_zuskind':
        if (System::isKuferSql5()) {
          if (is_null($this->id)) {
            return '';
          }

          $berechner = GebuehrenElementRechner::createInstance(true);
          $berechner->ladeGebuehren($this->id);

          return MathOperations::floatToString($berechner->getKindGebuehrSumme(2, ''));
        } else {
          return parent::getVarValue($pvarname);
        }
        
      case 'priobeleg':
      case 'vhscloud_weitergabe':
      case 'webinarkey':
      case 'webinar_link':
      case 'webinar_rufnummer':
      case 'webinar_tncode':
      case 'webinar_meetingid':
      case 'webinar_passwort':
      case 'webinar_softwareid':
      case 'webinar_modcode':
      case 'kirchenbezirk':
      case 'kirchengemeinde':
      case 'zahlung_info':
      case 'limit_kurstag_verschiebungen':
      case 'tnki_min':
      case 'tnki_max':
      case 'zustieg_datum':
      case StringOperations::startsWith($pvarname, 'tnonline_'):
      case StringOperations::startsWith($pvarname, 'kionline_'):
      case 'tnkionline_max':
      case 'webkursanmeldung':
      case 'onlineinfotext':
      case 'onlineinfohtml':
      case 'verantwortung_ma':
      case 'honabrechnung_tools_check':
      case 'kurs_ermbar': 
        return $this->kurse2->getVarValue($pvarname);
      case 'beginn':
      case 'ende':
        $ausgelesen = parent::getVarValue($pvarname);

        return ((strpos($ausgelesen, ':') > 0) ? StringOperations::lpad($ausgelesen, 5, '0') : $ausgelesen);
      case 'abschlussBool':
        
        return $this->abschluss == 'J';
      case 'beginn_ende_komplett':
        return $this->getBeginnEndeKomplett();
      case 'ende_dat_komplettlang_ungleichbeg':
        if ($this->ende_dat != $this->beginn_dat) {
          return $this->getVarValue('ende_dat_komplettlang');
        } else {
          return '';
        }
        
      case 'beginn_dat_jahrkurz':
        return (!empty($this->beginn_dat)) ? DateTimeOperations::getShortForm4DateStr($this->beginn_dat) : '';
      case 'ende_dat_jahrkurz':
        return (!empty($this->ende_dat)) ? DateTimeOperations::getShortForm4DateStr($this->ende_dat) : '';

      case 'beginn_dat_wotagkurz':
        return (!empty($this->beginn_dat)) ? DateTimeOperations::getWeekDayShort($this->beginn_dat) : '';
      case 'ende_dat_wotagkurz':
        return (!empty($this->ende_dat)) ? DateTimeOperations::getWeekDayShort($this->ende_dat) : '';

      case 'beginn_dat_wotaglang':
        return (!empty($this->beginn_dat)) ? DateTimeOperations::getWeekDay($this->beginn_dat) : '';
      case 'ende_dat_wotaglang':
        return (!empty($this->ende_dat)) ? DateTimeOperations::getWeekDay($this->ende_dat) : '';

      case 'beginn_dat_komplettlang':
        return (!empty($this->beginn_dat)) ? $this->getVarValue('beginn_dat_wotaglang') . ', ' . $this->beginn_dat : '';
      case 'ende_dat_komplettlang':
        return (!empty($this->ende_dat)) ? $this->getVarValue('ende_dat_wotaglang') . ', ' . $this->ende_dat : '';

      case 'beginn_dat_komplettkurz':
        return (!empty($this->beginn_dat)) ? $this->getVarValue('beginn_dat_wotagkurz') . ', ' . $this->beginn_dat : '';
      case 'beginn_dat_komplettkurz_mit_beginn':
        return ((!empty($this->beginn_dat)) ? $this->getVarValue('beginn_dat_komplettkurz') . (!empty($this->beginn) ? ', ' : '') : '') . $this->beginn;
      case 'ende_dat_komplettkurz':
        return (!empty($this->ende_dat)) ? $this->getVarValue('ende_dat_wotagkurz') . ', ' . $this->ende_dat : '';
      case 'ende_dat_komplettkurz_mit_ende':
        return ((!empty($this->beginn_dat)) ? $this->getVarValue('ende_dat_komplettkurz') . (!empty($this->ende) ? ', ' : '') : '') . $this->ende;
      case 'beginn_dat_komplettkurz_jahrkurz':
        return (!empty($this->beginn_dat)) ? $this->getVarValue('beginn_dat_wotagkurz') . ', ' . $this->getVarValue('beginn_dat_jahrkurz') : '';
      case 'ende_dat_komplettkurz_jahrkurz':
        return (!empty($this->ende_dat)) ? $this->getVarValue('ende_dat_wotagkurz') . ', ' . $this->getVarValue('ende_dat_jahrkurz') : '';

      case 'beginn_dat_kurz':
        return \DateTimeOperations::getShortForm4DateStr($this->beginn_dat);
      case 'ende_dat_kurz':
        return \DateTimeOperations::getShortForm4DateStr($this->ende_dat);
      case 'titel_zeile1':
        return rtrim(explode("\n", $this->getVarValue('kurzbez_titel'), 2)[0] ?? '', "\r");
      case 'titel_untertitel':
        return explode("\n", $this->getVarValue('kurzbez_titel'), 2)[1] ?? '';
      case 'kurzbez_titel_br':
        return StringOperations::convertLinebreaks2HTML($this->getVarValue('kurzbez_titel'));
      case 'kurzbez_titel':
        if (trim($this->titel ?? '') != '') {
          return $this->titel;
        } else {
          return $this->kurzbez;
        }
    }
  }

  private function getBeginnEndeKomplett()
  {
    if ($this->beginn_dat == '') {
      return '';
    } else {
      if ($this->beginn != '' && $this->ende != '') {
        if ($this->getVarValue('beginn_dat_komplettkurz_jahrkurz') == $this->getVarValue('ende_dat_komplettkurz_jahrkurz')) {
          return $this->getVarValue('beginn_dat_komplettkurz_jahrkurz') . ', ' . $this->beginn . ' Uhr bis ' . $this->ende . ' Uhr';
        } else {
          if ($this->getVarValue('ende_dat_komplettkurz_jahrkurz') != '') {
            return $this->getVarValue('beginn_dat_komplettkurz_jahrkurz') . ', ' . $this->beginn . ' Uhr bis ' . $this->getVarValue('ende_dat_komplettkurz_jahrkurz') . ', ' . $this->ende . ' Uhr';
          } else {
            return $this->getVarValue('beginn_dat_komplettkurz_jahrkurz') . ', ' . $this->beginn . ' Uhr bis ' . $this->ende . ' Uhr';
          }
        }
      } else {
        if ($this->getVarValue('beginn_dat_komplettkurz_jahrkurz') == $this->getVarValue('ende_dat_komplettkurz_jahrkurz')) {
          return $this->getVarValue('beginn_dat_komplettkurz_jahrkurz');
        } else {
          if ($this->getVarValue('ende_dat_komplettkurz_jahrkurz') != '') {
            return $this->getVarValue('beginn_dat_komplettkurz_jahrkurz') . ' bis ' . $this->getVarValue('ende_dat_komplettkurz_jahrkurz');
          } else {
            return $this->getVarValue('beginn_dat_komplettkurz_jahrkurz');
          }
        }
      }
    }

    return ''; 
  }

  
  public function getDatamodulByName($datamodulname)
  {
    switch ($datamodulname) {
      default:
        return parent::getDatamodulByName($datamodulname);
      case 'maplanend':
        return $this->getPlanendenMitarbeiter();
      case 'maverwaltend':
        return $this->getVerwaltendenMitarbeiter();
      case 'maverantwortend':
        return $this->getVerantwortendenMitarbeiter();
      case 'kursausstellung':
        return $this->getKursAusstellung();
    }
  }

  
  private $cache_kursaustellung;

  public function getKursAusstellung(bool $refreshCache = false)
  {
    if (empty($this->id)) {
      return new \Kufer\Web\Classes\Datamodul\KursAusstellung();
    }

    if (is_null($this->cache_kursaustellung) || $refreshCache) {
      $dbwKursAustellung = \Kufer\Web\Classes\Db\DBWorkKursAusstellung::getDefaultInstance();
      $this->cache_kursaustellung = $dbwKursAustellung->findOneByFilter(\Kufer\Web\Classes\Dbfilter\KursAusstellungenSQLFilter::create()->equalsKursId($this->id)) ?? new \Kufer\Web\Classes\Datamodul\KursAusstellung();
    }

    return $this->cache_kursaustellung;
  }

  public function getVarValueEx($name, $datamodulname)
  {
    $datamodulnamelc = \StringOperations::strtolower($datamodulname);
    if ($datamodulnamelc == 'basysbenutzer') {
      return $this->zusatztexte->getVarValueEx($name, $datamodulname);
    }
    if ($datamodulnamelc == 'kursort' && $name == 'schule_ort') {
      $dbwKursorte = DBWorkKursorte::getDefaultInstance();
      $kursort = $dbwKursorte->getKursortbymktext($this->ort);
      $schule = trim($kursort->schule);
      $mktext = trim($kursort->mktext);
      $ohneKomma = false;
      if ($schule == '' || $mktext == '') {
        $ohneKomma = true;
      }

      return $kursort->schule . ($ohneKomma ? '' : ', ') . $kursort->mktext;
    }
    if ($datamodulnamelc == 'kursort') {
      $dbwKursorte = new DBWorkKursorte(1, true);
      $kursort = $dbwKursorte->getKursortbymktext($this->ort);

      return $kursort->getVarValue($name);
    }

    return Datamodul::getVarValueEx($name, $datamodulname);
  }

  
  public function setValue2Var($var, $val)
  {
    switch ($var) {
      case 'nur_webinfo':
        $this->webinfo = $val;
        $this->nur_webinfo = $val;
        break;
      case 'dauer_select': $this->dauer = $val;
        break;
      case 'beginn_dat_jahrkurz':
        if ($val != '') {
          $this->beginn_dat = $this->_getLongJahreszahl($val, $this->getVarValue('beginn_dat_komplettlang'));
        }
        break;
      case 'ende_dat_jahrkurz':
        if ($val != '') {
          $this->ende_dat = $this->_getLongJahreszahl($val, $this->getVarValue('ende_dat_komplettlang'));
        }
        break;
      case 'tnki_max':
      case 'webinar':
        $this->kurse2->setValue2Var($var, $val);
        break;
      default: parent::setValue2Var($var, $val);
    }
  }

  public function _getLongJahreszahl($pDat, $pJahreszahlDat)
  {
    $jahrhundert = StringOperations::substr($pJahreszahlDat, -4, 2);
    
    if ($jahrhundert != '19' && $jahrhundert != '20' && $jahrhundert != '21') {
      $jahrhundert = '20';
    }
    $datAry = explode('.', $pDat);
    $datAry[2] = $jahrhundert . $datAry[2];

    return implode('.', $datAry);
  }

  public function getTyp($pFieldName)
  {
    switch ($pFieldName) {
      default:
        return \DatamodulVarType::TYPE_STRING;
      case 'anm_ende':
        return \DatamodulVarType::TYPE_DATETIME;
      case 'beginn_dat':
      case 'ende_dat':
      case 'internetvon':
      case 'internetbis':
      case 'abg_datum':
      case 'xfer_datum':
        return \DatamodulVarType::TYPE_DATE;
      case 'ausfall':
        return \DatamodulVarType::TYPE_BOOL_JN;
      case 'bis_max':
      case 'ksk':
      case 'anm_ende_manu':
      case 'nichtbarrierefrei':
      case 'bamf':
      case 'kinderbetr':
        return \DatamodulVarType::TYPE_BOOL_WF;
      case 'teil_min':
      case 'teil_max':
      case 'teil_frei':
      case 'teil_akt':
      case 'kinder_min':
      case 'kinder_max':
      case 'dozentenbewerbung':
      case 'progheft':
      case 'webflags':
      case 'tn_schw_1':
      case 'tn_schw_2':
      case 'teil_wart':
      case 'ferienkal':
      case 'koop_dvv':
      case 'pruef_dvv':
      case 'uebernacht':
      case 'ausst_tage':
      case 'zielgr_dvv':
      case 'phase':
      case 'punktesystem':
      case 'sprache':
      case 'mandant':
      case 'teinzel':
      case 'teinzel_m':
      case 'teinzel_w':
      case 'teinzel_u':
      case 'kinder_ev':
      case 'keinzel_m':
      case 'keinzel_w':
      case 'keinzel_u':
      case 'tn_nichtnrw':
      case 'minutentag':
      case 'pausetag':
        return \DatamodulVarType::TYPE_INT;
      case 'gebuehr':
      case 'geb_erm':
      case 'kinder_geb':
      case 'geb_kind':
      case 'geb_zuskind':
      case 'stundenanz':
      case 'geb_schw1':
      case 'geb_schw2':
      case 'erm_schw2':
      case 'sofortzahl':
      case 'dozstdreal':
      case 'zuseinn':
      case 'ausg_betr':
      case 'uetag':
        return \DatamodulVarType::TYPE_FLOAT;
      case 'punkte':
      case 'altervon':
      case 'alterbis':
      case 'geb_frei_1':
      case 'geb_frei_2':
      case 'geb_frei_3':
        return \DatamodulVarType::TYPE_FLOAT_DOT;
      case 'webinforvf':
      case 'kursinforvf':
      case 'zeugnisstream':
        return \DatamodulVarType::TYPE_BINARY_NO_BASE64;
    }
  }

  public function getDMZValue($fieldname)
  {
    switch ($fieldname) {
      case 'progh_sort':
        return $this->getVarValue($fieldname);
      case 'nur_webinfohtml':
        return base64_encode(mb_convert_encoding($this->nur_webinfohtml ?? $this->webinfohtml, UTF_8, \CodingOperations::getInternalEncoding()));
      case 'kursinfohtml':
        return base64_encode(mb_convert_encoding($this->kursinfohtml, UTF_8, \CodingOperations::getInternalEncoding()));
      case 'zeugnishtml':
        return base64_encode(mb_convert_encoding($this->zeugnishtml, UTF_8, \CodingOperations::getInternalEncoding()));
      default:
        return parent::getDMZValue($fieldname);
    }
  }

  
  protected function _referenzVariablen()
  {
    return array(
        'hauptdozent',
        'zusatztexte',
        'kurse2');
  }

  
  public function getDbTyp(): string
  {
    return 'K';
  }

  
  public function isBGLU(): bool
  {
    return $this->isBGLUEx($this->id);
  }

  public static function isBGLUEx($knr): bool
  {
    return StringOperations::substr($knr, 5, 2) == 49;
  }

  
  public function isFSP(): bool
  {
    return $this->isFspEx($this->id);
  }

  public static function isFSPEx(string $knr): bool
  {
    return false; 
  }

  
  public function isKursVoll(): bool
  {
    return $this->getVarValue('teil_frei') <= 0;
  }

  
  public function isKursBeendet(): bool
  {
    if ($this->ende_dat != '') {
      if (DateTimeOperations::isDatebeforeNow($this->ende_dat)) {
        return true;
      }
    }

    return false;
  }

  
  private function isWebinar(): bool
  {
    if (DBWorkBASysSettings::isBlak()) {
      $pos = 9;

      return StringOperations::isCharAtPosInString('W', $pos, $this->id);
    } else {
      return false;
    }
  }

  
  private function isLernzielkontrolle(): bool
  {
    $result = false;
    if (DBWorkBASysSettings::isBlak()) {
      $result = StringOperations::isCharAtPosInString('L', 9, $this->id);
    }

    return $result;
  }

  
  private function isElearningKurs(): bool
  {
    $result = false;
    if (DBWorkBASysSettings::isBlak()) {
      $result = StringOperations::isCharAtPosInString('E', 9, $this->id);
    }

    return $result;
  }

  public function isMitveranstalterKurs(): bool
  {
    return DBWorkBASysSettings::isInnsbruckStadt()
      && strtolower($this->getVarValue('aussenst')) === 'mitveranstalter';
  }

  public function isEinzelveranstaltung(): bool
  {
    return $this->typ === 'E';
  }

  public function getTeilMax()
  {
    return $this->teil_max;
  }

  public function getKinderMax()
  {
    return $this->kinder_max;
  }

  private function setDozentenListe()
  {
    if (is_null($this->id)) {
      return;
    }
    $dbwKurseBase = DBWorkKurseBase::getDefaultInstance();
    $dozentenMapKnr = $dbwKurseBase->getDozentenForKurse(array($this->id));
    $dozenten = $dozentenMapKnr[$this->id];

    $this->dozenten_liste = '';
    foreach ($dozenten as $dozent) {
      $this->dozenten_liste .= '<div style="margin-top:5px;">' . CleanOperations::cleanStringForHtml($dozent->name_titel . ' ' . $dozent->name . ' ' . $dozent->vorname) . '</div>';
    }
  }

  private function setDozentenKommasepariert($vornameVorNachname = false)
  {
    if (is_null($this->id)) {
      return;
    }
    $dbwKurseBase = DBWorkKurseBase::getDefaultInstance();
    $dozentenMapKnr = $dbwKurseBase->getDozentenForKurse(array($this->id));
    $dozenten = $dozentenMapKnr[$this->id];

    $resultAry = array();
    foreach ($dozenten as $dozent) {
      $resultAry[] = $vornameVorNachname ? $dozent->getVarValue('titel_vorname_name') : $dozent->getVarValue('titel_name_vorname');
    }

    $this->dozenten_kommasepariert = implode(', ', $resultAry);
  }

  public function getTnKiMin()
  {
    return $this->kurse2->tnki_min;
  }

  public function getTnKiMax()
  {
    return $this->kurse2->tnki_max;
  }

  
  private function getGebuehrenTabelle($pGebuehren)
  {
    
    if ((!is_null($pGebuehren) && count($pGebuehren) > 0) || $this->geb_kind != 0 || $this->geb_zuskind != 0) {
      if ($pGebuehren === null) {
        $anzGebuehren = 0;
        $anzAboGebuehren = 0;
      } else {
        $gebuehren = array_filter($pGebuehren, function($gebuehr) { return $gebuehr->fortlaufend == ''; });
        $aboGebuehren = array_filter($pGebuehren, function($gebuehr) { return $gebuehr->fortlaufend != ''; });
        $anzGebuehren = count($gebuehren);
        $anzAboGebuehren = count($aboGebuehren);
      }

      $result = '<table cellspacing="0" cellpadding="0" class="kursgebuehren_tabelle">';
      $result .= '<tbody>';
      if ($anzGebuehren > 0) {
        foreach ($gebuehren as $gebuehr) {
          $result .= '<tr>';
          $result .= '<th>' . CleanOperations::cleanStringForHtml($gebuehr->text) . '&nbsp;&nbsp;&nbsp;</th>';
          $result .= '<td>' . CleanOperations::cleanStringForHtml($gebuehr->betrag) . ' ' . CleanOperations::cleanStringForHtml(CURRENCY) . '</td>';
          $result .= '</tr>';
        }
        if ($anzGebuehren > 1) {
          $result .= '<tr class="kursgebuehren_tabelle_summe">';
          $result .= '<th>Summe&nbsp;</th>';
          $result .= '<td class="bold">' . CleanOperations::cleanStringForHtml($this->gebuehr) . ' ' . CleanOperations::cleanStringForHtml(CURRENCY) . '</td>';
          $result .= '</tr>';
        }
      }
      if ($anzAboGebuehren > 0) {
        foreach ($aboGebuehren as $aboGebuehr) {
          $faelligkeit = GebFortAPI::getGebuehrFaelligkeit($aboGebuehr->fortlaufend);
          $result .= '<tr>';
          $result .= '<th>' . CleanOperations::cleanStringForHtml($aboGebuehr->text) . '&nbsp;&nbsp;&nbsp;</th>';
          $result .= '<td>' . CleanOperations::cleanStringForHtml($aboGebuehr->betrag) . ' ' . CleanOperations::cleanStringForHtml(CURRENCY) . ' ' . CleanOperations::cleanStringForHtml($faelligkeit) . '</td>';
          $result .= '</tr>';
        }
      }
      if ($anzGebuehren === 0 && $anzAboGebuehren === 0) {
        $result .= '<tr>';
        $result .= '<th>Kursgeb&uuml;hr</th>';
        $result .= '<td class="bold">' . CleanOperations::cleanStringForHtml($this->gebuehr) . ' ' . CleanOperations::cleanStringForHtml(CURRENCY) . '</td>';
        $result .= '</tr>';
      }
      if ($this->geb_kind != 0) {
        $result .= '<tr>';
        $result .= '<th>zzgl. Geb&uuml;hr für ein  Kind&nbsp;</th>';
        $result .= '<td>' . CleanOperations::cleanStringForHtml($this->geb_kind) . ' ' . CleanOperations::cleanStringForHtml(CURRENCY) . '</td>';
        $result .= '</tr>';
      }
      if ($this->geb_zuskind != 0) {
        $result .= '<tr>';
        $result .= '<th>zzgl. Geb&uuml;hr je weiteres Kind&nbsp;</th>';
        $result .= '<td>' . CleanOperations::cleanStringForHtml($this->geb_zuskind) . ' ' . CleanOperations::cleanStringForHtml(CURRENCY) . '</td>';
        $result .= '</tr>';
      }
      $result .= '</tbody>';
      $result .= '</table>';
    } else {
      
      
      $result = '';
    }

    return $result;
  }

  
  public function getKnrOrgAsArray()
  {
    $knrOrgArray = \StringOperations::str_split(StringOperations::rpad($this->knr_org, 10, ' '));

    $knrOrgBoolArray = array_map(function($item) {return $item === 'X';}, $knrOrgArray);

    return array(
      \DateTimeOperations::MONDAY => $knrOrgBoolArray[0],
      \DateTimeOperations::TUESDAY => $knrOrgBoolArray[1],
      \DateTimeOperations::WEDNESDAY => $knrOrgBoolArray[2],
      \DateTimeOperations::THURSDAY => $knrOrgBoolArray[3],
      \DateTimeOperations::FRIDAY => $knrOrgBoolArray[4],
      \DateTimeOperations::SATURDAY => $knrOrgBoolArray[5],
      \DateTimeOperations::SUNDAY => $knrOrgBoolArray[6],
      'alle14tage' => $knrOrgBoolArray[7],
      'monatlich' => $knrOrgBoolArray[8],
      'mehrmalsAmTag' => $knrOrgBoolArray[9]
    );
  }

  
  public function isKursAm($pWochentag)
  {
    $wochentag = StringOperations::strtolower($pWochentag);
    $result = $this->getKnrOrgAsArray();

    return $result[$wochentag];
  }

  
  public function isKursWoechentlich()
  {
    return !$this->isKursAm('monatlich') && !$this->isKursAm('alle14tage');
  }

  
  public function isKursAlle14Tage()
  {
    return $this->isKursAm('alle14tage');
  }

  
  public function isKursMonatlich()
  {
    return $this->isKursAm('monatlich');
  }

  
  public function stundendauer()
  {
    if ($this->zusatztexte->ue_abw_orig == 0 && $this->zusatztexte->webanz_abwue == 0) {
      return $this->stundenanz;
    } elseif ($this->zusatztexte->ue_abw_orig == 0 && $this->zusatztexte->webanz_abwue != 0) {
      return $this->stundenanz / $this->zusatztexte->webanz_abwue * $this->zusatztexte->g_ustd;
    } elseif ($this->zusatztexte->ue_abw_orig != 0 && $this->zusatztexte->webanz_abwue == 0) {
      $basysSettings = BASysSettingsAPI::getBASysSettings();

      return ($this->stundenanz * $this->zusatztexte->ue_abw_orig / $basysSettings->ustdmin);
    } elseif ($this->zusatztexte->ue_abw_orig != 0 && $this->zusatztexte->webanz_abwue != 0) {
      return $this->stundenanz / $this->zusatztexte->webanz_abwue * $this->zusatztexte->ue_abw_orig;
    }
  }

  
  public static function isAnmeldeEndeOk($anmEnde, $vergleichsdatum = '')
  {
    
    
    

    if (\DateTimeOperations::isDateTimeEmptyOrDefault($anmEnde)) {
      return true;
    }

    
    if (\StringOperations::strlen($anmEnde) < 16 || \StringOperations::substr($anmEnde, 11, 16) == DEFAULTTIME) {
      $anmEnde = \StringOperations::substr($anmEnde, 0, 10) . ' 23:59';
    }

    if ($vergleichsdatum == '') {
      $vergleichsdatum = \DateTimeOperations::getDateTimeNow();
    }

    if ($vergleichsdatum == $anmEnde) {
      return true;
    }

    return \DateTimeOperations::isDateTimeBefore($vergleichsdatum, $anmEnde);
  }

  
  public function getAnmEnde(int $offset, bool $checkZustieg): string
  {
    $anmEnde = $this->anm_ende;

    if ($offset != 0 && $this->beginn_dat != ''
        && ($this->anm_ende_manu === false || $this->anm_ende == '')) {
      $beginnDat = \DateTimeObj::createFromString($this->beginn_dat);
      $beginnDatMitOffset = \DateTimeObj::createFromString($this->beginn_dat)->addDays($offset);
      $endeDat = \DateTimeObj::createFromString($this->ende_dat);
      if ($endeDat->compare($beginnDat) >= 0 && $beginnDatMitOffset->compare($endeDat) === 1) {
        $anmEnde = $endeDat->getDateTime(false);
      } else {
        $anmEnde = $beginnDatMitOffset->getDateTime(false);
      }
    }

    if (!$checkZustieg || $this->kurse2->zustieg_datum == '') {
      return $anmEnde;
    }

    $anmEndeDt = \DateTimeObj::createFromString($anmEnde);
    $zustiegDt = \DateTimeObj::createFromString($this->kurse2->zustieg_datum);

    
    
    if ($zustiegDt->isDefaultDate() || (!$anmEndeDt->isDefaultDate() && $anmEndeDt->isAfterDateTime($zustiegDt))) {
      return $anmEndeDt->getDateTime(false);
    } else {
      return $zustiegDt->getDateTime(false);
    }
  }

  public function isAnmEndeErreicht(\DateTimeObj $currentDt, int $anmEndeOffset, bool $checkZustieg): bool
  {
    $anmEnde = $this->getAnmEnde($anmEndeOffset, $checkZustieg);
    $anmEndeDt = \DateTimeObj::createFromString($anmEnde);
    if (!$anmEndeDt->isDefaultDate() && $anmEndeDt->getTime(false) == '00:00') {
      $anmEndeDt->addSeconds(86399);
    }

    return $anmEndeDt->compare(\DateTimeObj::getDefault()) != 0 && $anmEndeDt->compare($currentDt) === -1;
  }

  public function isKursBeginnErreicht(\DateTimeObj $currentDt): bool
  {
    $beginnDt = \DateTimeObj::createFromString($this->beginn_dat);

    return $beginnDt->compare(\DateTimeObj::getDefault()) == 0 || $beginnDt->compare($currentDt) === -1;
  }

  
  public function isKursBeginnUhrzeitErreicht(\DateTimeObj $currentDt): bool
  {
    if (!\DateTimeOperations::isValidTimeString(trim($this->beginn))) {
      return $this->isKursBeginnErreicht($currentDt);
    }

    $beginnDt = $this->beginn_dat == '' ? \DateTimeObj::getDefault() : \DateTimeObj::createFromString($this->beginn_dat . ' ' . $this->beginn);

    return $beginnDt->compare(\DateTimeObj::getDefault()) == 0 || $beginnDt->compare($currentDt) === -1;
  }

  
  public function isAnmeldebeginnErreicht(\DateTimeObj $currentDt): bool
  {
    $anmBeginnDt = $this->zusatztexte->anm_beginn == '' ? \DateTimeObj::getDefault() : \DateTimeObj::createFromString($this->zusatztexte->anm_beginn);

    return $anmBeginnDt->compare(\DateTimeObj::getDefault()) == 0 || $anmBeginnDt->compare($currentDt) === -1;
  }

  
  public function getVerwaltendenMitarbeiter(): \BASysBenutzer
  {
    if (\is_null($this->cacheVerwaltenderMitarbeiter)) {
      $kennung = $this->getVarValue('verwaltung_ma');
      $dbwBasysUser = new \DBWorkBASysUser(1, true);
      if ($kennung === '') { 
        $this->cacheVerwaltenderMitarbeiter = $dbwBasysUser->getNewObject();
      } else {
        $this->cacheVerwaltenderMitarbeiter = $dbwBasysUser->getBASysUserByKennung($kennung);
      }
    }

    return $this->cacheVerwaltenderMitarbeiter;
  }

  
  public function getPlanendenMitarbeiter(): \BASysBenutzer
  {
    if (\is_null($this->cachePlanenderMitarbeiter)) {
      $kennung = $this->hpm;
      $dbwBasysUser = new \DBWorkBASysUser(1, true);
      if ($kennung === '') { 
        $this->cachePlanenderMitarbeiter = $dbwBasysUser->getNewObject();
      } else {
        $this->cachePlanenderMitarbeiter = $dbwBasysUser->getBASysUserByKennung($kennung);
      }
    }

    return $this->cachePlanenderMitarbeiter;
  }

  
  public function getVerantwortendenMitarbeiter(): \BASysBenutzer
  {
    if (\is_null($this->cacheVerantwortenderMitarbeiter)) {
      $kennung = $this->getVarValue('verantwortung_ma');
      $dbwBasysUser = new \DBWorkBASysUser(1, true);
      if ($kennung === '') { 
        $this->cacheVerantwortenderMitarbeiter = $dbwBasysUser->getNewObject();
      } else {
        $this->cacheVerantwortenderMitarbeiter = $dbwBasysUser->getBASysUserByKennung($kennung);
      }
    }

    return $this->cacheVerantwortenderMitarbeiter;
  }

  public function updateTeilnehmerzahlenFelder(\TeilnehmerZahlenProvider $tnZahlenFromDb): void
  {
    $rechner = TeilnehmerzahlenFactory::getTnZahlenForKursart($this->typ, $tnZahlenFromDb);
    $this->teil_akt = $rechner->getAnzahlTeilnehmerAngemeldet();
    $this->teil_min = $rechner->getAnzahlTeilnehmerMinimal();
    $this->teil_max = $rechner->getAnzahlTeilnehmerMaximal();
    $this->teil_frei = $rechner->getAnzahlTeilnehmerplaetzeFrei();
    $this->teil_wart = $rechner->getAnzahlTeilnehmerWarteliste();

    $this->kinderanzahl = $rechner->getAnzahlKinderAngemeldet();
    $this->kinder_min = $rechner->getAnzahlKinderMinimal();
    $this->kinder_max = $rechner->getAnzahlKinderMaximal();
    $this->kinder_frei = $rechner->getAnzahlKinderplaetzeFrei();
    $this->kinder_wart = $rechner->getAnzahlKinderWarteliste();

    $this->kurse2->tnki_max = $rechner->getAnzahlTeilnehmerUndKinderMaximal();
    $this->kurse2->tnki_min = $rechner->getAnzahlTeilnehmerUndKinderMinimal();

    if ($this->kurse2->webinar == 'H') { 
      $this->kurse2->tnonline_akt = $rechner->getAnzahlTeilnehmerAngemeldetOnline();
      $this->kurse2->tnonline_max = $rechner->getAnzahlTeilnehmerMaximalOnline();
      $this->kurse2->tnonline_frei = $rechner->getAnzahlTeilnehmerplaetzeFreiOnline();
      $this->kurse2->tnonline_wart = $rechner->getAnzahlTeilnehmerWartelisteOnline();

      $this->kurse2->kionline_akt = $rechner->getAnzahlKinderAngemeldetOnline();
      $this->kurse2->kionline_max = $rechner->getAnzahlKinderMaximalOnline();
      $this->kurse2->kionline_frei = $rechner->getAnzahlKinderplaetzeFreiOnline();
      $this->kurse2->kionline_wart = $rechner->getAnzahlKinderWartelisteOnline();

      $this->kurse2->tnkionline_max = $rechner->getAnzahlTeilnehmerUndKinderMaximalOnline();
    }
  }

  
  public function istPlatzFuer(int $anzahlNeueTeilnehmer, int $anzahlNeueKinder): bool
  {
    if ($this->isKinderkurs() && System::isKuferSql5()) {
      $anzahlNeueTeilnehmer = 0;
    }
    if ($this->emailstatus != 'W' || empty($this->emailstatus)) {
      if ($this->teil_max > 0 && (max($this->teil_akt, 0) + $anzahlNeueTeilnehmer) > $this->teil_max) {
        return false;
      }
      if ($this->kinder_max > 0 && (max($this->kinderanzahl, 0) + $anzahlNeueKinder) > $this->kinder_max) {
        return false;
      }
      if ($this->kurse2->tnki_max > 0
        && (max($this->getAnzahlRelevantFuerTnkiMax(), 0) + $anzahlNeueTeilnehmer + $anzahlNeueKinder) > $this->kurse2->tnki_max) {
        return false;
      }
      if ($this->teil_max == 0 && $this->kinder_max == 0 && $this->kurse2->tnki_max == 0) {
        return false;
      }
    }

    return true;
  }

  public function getAnzahlRelevantFuerTnkiMax()
  {
    if ($this->isKinderkurs() && System::isKuferSql5()) {
      return $this->kinderanzahl;
    } else {
      return $this->teil_akt + $this->kinderanzahl;
    }
  }

  
  public function istPlatzFuerOnlineteilnahme(int $anzahlNeueTeilnehmer, int $anzahlNeueKinder): bool
  {
    if ($this->isKinderkurs() && System::isKuferSql5()) {
      $anzahlNeueTeilnehmer = 0;
    }
    if ($this->emailstatus != 'W' || empty($this->emailstatus)) {
      if ($this->kurse2->tnonline_max > 0
        && (max($this->kurse2->tnonline_akt, 0) + $anzahlNeueTeilnehmer) > $this->kurse2->tnonline_max) {
        return false;
      }
      if ($this->kurse2->kionline_max > 0
        && (max($this->kurse2->kionline_akt, 0) + $anzahlNeueKinder) > $this->kurse2->kionline_max) {
        return false;
      }
      if ($this->kurse2->tnkionline_max > 0
        && (max($this->getAnzahlRelevantFuerTnkiOnlineMax(), 0) + $anzahlNeueTeilnehmer + $anzahlNeueKinder) > $this->kurse2->tnkionline_max) {
        return false;
      }
      if ($this->kurse2->tnonline_max == 0 && $this->kurse2->kionline_max == 0 && $this->kurse2->tnkionline_max == 0) {
        return false;
      }
    }

    return true;
  }

  public function getAnzahlRelevantFuerTnkiOnlineMax()
  {
    if ($this->isKinderkurs() && System::isKuferSql5()) {
      return $this->kionline_akt;
    } else {
      return $this->tnonline_akt + $this->kionline_akt;
    }
  }

  public function isHybridkurs(): bool
  {
    return $this->kurse2->webinar == 'H';
  }

  public function isOnlinekurs(): bool
  {
    return $this->getVarValue('webinar') === 'O';
  }

  public function isKinderkurs(): bool
  {
    return $this->typ === 'K';
  }

  public function isAusfall(): bool
  {
    return $this->ausfall == 'J';
  }

  public function isAbgeschlossen(): bool
  {
    return $this->abschluss == 'J';
  }

  public function getKurse2(): \Kurs2
  {
    return $this->kurse2;
  }

  public function getFotoTyp(): ?string
  {
    return \Foto::TYP_KURSE;
  }

  public function getBeginnUhrzeit(): string
  {
    return $this->getFieldUhrzeit('beginn');
  }

  public function getEndeUhrzeit(): string
  {
    return $this->getFieldUhrzeit('ende');
  }

  public function getBeginnDatumDateTime(): ?DateTime
  {
    return $this->getDatumFieldDateTime('beginn_dat');
  }

  public function getEndeDatumDateTime(): ?DateTime
  {
    return $this->getDatumFieldDateTime('ende_dat');
  }

  
  private function getFieldUhrzeit(string $field): string
  {
    $uhrz = '';
    if ($this->{$field} != '') {
      $uhrzeit = ($this->{$field} != '' && $this->getVarValue($field) != null) ? $this->getVarValue($field) : '';
      $dateuhr = DateTime::createFromFormat('H:i', $uhrzeit);
      $uhrz = $dateuhr->format('H:i');
    }

    return $uhrz;
  }

  
  private function getDatumFieldDateTime(string $field): ?DateTime
  {
    $dt = null;
    if ($this->{$field} != '') {
      $datum = ($this->{$field} != '' && $this->getVarValue($field) != null) ? $this->getVarValue($field) : '';
      $dt = DateTime::createFromFormat('d.m.Y', $datum);
    }

    return $dt;
  }

  
  public function isKursMitBerichtOffenbach(): bool
  {
    
    
    $buchstabeInKursnummer = StringOperations::substr($this->id, 4, 1);

    return in_array($buchstabeInKursnummer, array('T', 'K', 'S', '4'));
  }

  public function isKursErmbarFuerHotel(): bool
  {
    return $this->kurse2->kurs_ermbar; 
  }

  
  public function getGebuehr(bool $ermaessigt = false, bool $hotelErmbarBeruecksichtigen = false)
  {
    if ($ermaessigt && (!$hotelErmbarBeruecksichtigen || $this->isKursErmbarFuerHotel())) {
      return $this->geb_erm;
    } else {
      return $this->gebuehr;
    }
  }

  public function getKostenstelleHonorare(): ?\Kufer\Web\Classes\Datamodul\HLKostenstelle
  {
    if (empty($this->fibukost_1)) {
      return null;
    }

    return \Kufer\Web\Classes\Db\DBWorkHLKostenstelle::getDefaultInstance()
      ->findOneByFilter(
        \Kufer\Web\Classes\Dbfilter\HLKostenstellenSQLFilter::create()
        ->equalsNumber($this->fibukost_1)
      );
  }

  public function getKostenstelleFahrtkosten(): ?\Kufer\Web\Classes\Datamodul\HLKostenstelle
  {
    if (empty($this->fibukost_2)) {
      return null;
    }

    return \Kufer\Web\Classes\Db\DBWorkHLKostenstelle::getDefaultInstance()
      ->findOneByFilter(
        \Kufer\Web\Classes\Dbfilter\HLKostenstellenSQLFilter::create()
          ->equalsNumber($this->fibukost_2)
      );
  }

  public function getKostenstelleSpesen(): ?\Kufer\Web\Classes\Datamodul\HLKostenstelle
  {
    if (empty($this->fibukost_3)) {
      return null;
    }

    return \Kufer\Web\Classes\Db\DBWorkHLKostenstelle::getDefaultInstance()
      ->findOneByFilter(
        \Kufer\Web\Classes\Dbfilter\HLKostenstellenSQLFilter::create()
          ->equalsNumber($this->fibukost_3)
      );
  }

  public function getFirstKursGebuehr(bool $refreshCache = false): ?\Kursgebuehr
  {
    if (empty($this->id)) {
      return null;
    }

    $kursgebuehren = \DBWorkKursgebuehr::getDefaultInstance()->getGebuehrenbyKNR($this->id, $refreshCache);
    if (empty($kursgebuehren)) {
      return null;
    }

    return \ArrayOperations::firstValue($kursgebuehren);
  }
}