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


class Kurs extends Datamodul
{
  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 $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 $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;

  
  private $cachePlanederMitarbeiter;

  
  private $cacheVerwaltendenMitarbeiter;

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

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

  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':
        $ue_abw = $this->zusatztexte->getVarValue('ue_abw');
        if ($ue_abw > 0) {
          return $ue_abw;
        } else {
          return 0;
        }
        
      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) {
          $dbwKursgebuehr = DBWorkKursgebuehr::getDefaultInstance();
          $gebuehren = $dbwKursgebuehr->getGebuehrenbyKNR($this->id);
          $this->gebuehrtabelle = $this->getGebuehrenTabelle($gebuehren);
        }

        return $this->gebuehrtabelle;
      case 'geb_kind':
        if (System::isKuferSql5()) {
          $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()) {
          $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':
        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':
        if (StringOperations::strpos($this->getVarValue('kurzbez_titel'), "\n") === false) { 
          return $this->getVarValue('kurzbez_titel');
        } else { 
          return str_replace("\r", '', StringOperations::substr($this->getVarValue('kurzbez_titel'), 0, StringOperations::strpos($this->getVarValue('kurzbez_titel'), "\n")));
        }
        
      case 'titel_untertitel':
        if (StringOperations::strpos($this->getVarValue('kurzbez_titel'), "\n") === false) { 
          return '';
        } else { 
          return StringOperations::substr($this->getVarValue('kurzbez_titel'), StringOperations::strpos($this->getVarValue('kurzbez_titel'), "\n") + 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();
    }
  }

  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':
        return \DatamodulVarType::TYPE_DATE;
      case 'ausfall':
        return \DatamodulVarType::TYPE_BOOL_JN;
      case 'bis_max':
      case 'ksk':
      case 'anm_ende_manu':
        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':
        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()));
      default:
        return parent::getDMZValue($fieldname);
    }
  }

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

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

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

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

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

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

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

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

    return false;
  }

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

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

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

    return $result;
  }

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

    return $result;
  }

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

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

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

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

  private function setDozentenListe()
  {
    $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)
  {
    $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->cacheVerwaltendenMitarbeiter)) {
      $kennung = $this->getVarValue('verwaltung_ma');
      $dbwBasysUser = new \DBWorkBASysUser(1, true);
      if ($kennung === '') { 
        $this->cacheVerwaltendenMitarbeiter = $dbwBasysUser->getNewObject();
      } else {
        $this->cacheVerwaltendenMitarbeiter = $dbwBasysUser->getBASysUserByKennung($kennung);
      }
    }

    return $this->cacheVerwaltendenMitarbeiter;
  }

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

    return $this->cachePlanederMitarbeiter;
  }

  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;
  }
}