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


class ConstantOperations
{
  
  public static function getStatusangemeldetArraySimple()
  {
    return array('A', 'T', 'P', ' ', '');
  }

  
  public static function getAnmeldeStatusAsContantString($pStatus): string
  {
    switch ($pStatus) {
      case ANMELDUNGONLINE_OK: return 'ANMELDUNGONLINE_OK';
      case ANMELDUNGONLINE_OFFLINE: return 'ANMELDUNGONLINE_OFFLINE';
      case ANMELDUNGONLINE_KURSVOLL: return 'ANMELDUNGONLINE_KURSVOLL';
      case ANMELDUNGONLINE_AUSFALL: return 'ANMELDUNGONLINE_AUSFALL';
      case ANMELDUNGONLINE_KNRUNGUELTIG: return 'ANMELDUNGONLINE_KNRUNGUELTIG';
      case ANMELDUNGONLINE_KURSENDE: return 'ANMELDUNGONLINE_KURSENDE';
      case ANMELDUNGONLINE_ANMELDESCHLUSS: return 'ANMELDUNGONLINE_ANMELDESCHLUSS';
      case ANMELDUNGONLINE_ABSCHLUSS: return 'ANMELDUNGONLINE_ABSCHLUSS';
      case ANMELDUNGONLINE_ANMELDEBEGINN: return 'ANMELDUNGONLINE_ANMELDEBEGINN';
      case ANMELDUNGONLINE_TECHNISCHEPROBLEME: return 'ANMELDUNGONLINE_TECHNISCHEPROBLEME';
      default: return '';
    }
  }

  public static function getAnmeldestatusText($status)
  {
    switch ($status) {
      case ANMELDUNGONLINE_OK:
      case ANMELDUNGONLINE_OFFLINE:
        return 'Kurs OK';
      case ANMELDUNGONLINE_KURSVOLL: return 'Kurs bereits ausgebucht';
      case ANMELDUNGONLINE_AUSFALL: return 'Kurs ausgefallen';
      case ANMELDUNGONLINE_KNRUNGUELTIG: return 'Kursnummer ungültig';
      case ANMELDUNGONLINE_KURSENDE: return 'Kurs - Ende erreicht';
      case ANMELDUNGONLINE_ANMELDEBEGINN: return 'Kurs - Anmeldebeginn nicht erreicht';
      case ANMELDUNGONLINE_ANMELDESCHLUSS: return 'Kurs - Anmeldeschluss erreicht';
      case ANMELDUNGONLINE_ABSCHLUSS: return 'Kurs abgeschlossen';
      case ANMELDUNGONLINE_TECHNISCHEPROBLEME: return 'Technische Probleme';
      default:
        return '';
    }
  }

  public static function getDefaultDateErmEnde()
  {
    $sett = BASysSettingsAPI::getBASysSettings();
    if ($sett->ermEndeBeiNeuenTn == '0') {
      return $sett->semende;
    } else {
      return '01.01.2000';
    }
  }

  
  public static function getStatusangemeldetArraySimpleBeiPlatzreservierung()
  {
    return array_merge(ConstantOperations::getStatusangemeldetArraySimple(), array('W'));
  }

  
  public static function isMSSQLBelegungssatzDirektAnmeldungGewuenscht($pBelegungsStatus)
  {
    return in_array($pBelegungsStatus, ConstantOperations::getStatusangemeldetArraySimpleBeiPlatzreservierung());
  }

  
  public static function getStatusangemeldetArray()
  {
    return array("'A'", "'T'", "'P'", "' '", "''");
  }

  
  public static function getStatusangemeldetMitFirmaArray()
  {
    return array("'A'", "'T'", "'P'", "' '", "''", "'F'");
  }

  
  public static function define_once($name, $value)
  {
    if (!defined($name)) {
      define($name, $value);

      return true;
    } else {
      return constant($name) == $value;
    }
  }

  
  public static function getStatusangemeldetSQLStr()
  {
    return implode(',', self::getStatusangemeldetArray());
  }

  
  public static function getStatusangemeldetMitFirmaSQLStr()
  {
    return implode(',', self::getStatusangemeldetMitFirmaArray());
  }

  
  public static function isTrueInDB($pValue)
  {
    if ($pValue === 'J' || $pValue === 'W' || $pValue === '1' || $pValue === 'X') {
      return true;
    } else {
      return false;
    }
  }

  
  public static function getFotoTypArray()
  {
    
    
    return array('K' => 'kurs', 'D' => 'doz', 'S' => 'as', 'R' => 'raum', 'G' => 'geb', 'T' => 'tn', 'B' => 'ben', 'X' => 'allg', 'Q' => 'artikel', 'A' => 'adr');
  }

  
  public static function getVarnamenMapping()
  {
    static $map = array(
        'geschlecht_mw' => 'geschlecht',
        'geschlecht_mwd' => 'geschlecht',
        'geschlecht_mwf' => 'geschlecht',
        'geschlecht_mwdf' => 'geschlecht',
        'geschlecht_eng' => 'geschlecht',
        'geschlecht_mw_eng' => 'geschlecht',
        'geschlecht_mwd_eng' => 'geschlecht',
        'geschlecht_mwf_eng' => 'geschlecht',
        'geschlecht_mwdf_eng' => 'geschlecht',
        'geschlecht_mw_eng_readonly' => 'geschlecht',
        'geschlecht_mwd_eng_readonly' => 'geschlecht',
        'geschlecht_mwf_eng_readonly' => 'geschlecht',
        'geschlecht_mwdf_eng_readonly' => 'geschlecht',
        'geschlecht_def' => 'geschlecht',
        'geschlecht_mw_def' => 'geschlecht',
        'geschlecht_mwd_def' => 'geschlecht',
        'geschlecht_mwf_def' => 'geschlecht',
        'geschlecht_mwdf_def' => 'geschlecht',
        'geschlecht_mw_def_readonly' => 'geschlecht',
        'geschlecht_mwd_def_readonly' => 'geschlecht',
        'geschlecht_mwf_def_readonly' => 'geschlecht',
        'geschlecht_mwdf_def_readonly' => 'geschlecht',
        'geschlecht_mw_eng_def' => 'geschlecht',
        'geschlecht_mwd_eng_def' => 'geschlecht',
        'geschlecht_mwf_eng_def' => 'geschlecht',
        'geschlecht_mwdf_eng_def' => 'geschlecht',
        'geschlecht_mw_eng_def_readonly' => 'geschlecht',
        'geschlecht_mwd_eng_def_readonly' => 'geschlecht',
        'geschlecht_mwf_eng_def_readonly' => 'geschlecht',
        'geschlecht_mwdf_eng_def_readonly' => 'geschlecht',
        'geschlecht_mw_readonly' => 'geschlecht',
        'geschlecht_mwd_readonly' => 'geschlecht',
        'geschlecht_mwf_readonly' => 'geschlecht',
        'geschlecht_mwdf_readonly' => 'geschlecht',

        'geschlecht_mw_radio' => 'geschlecht',
        'geschlecht_mwi_radio' => 'geschlecht',
        'geschlecht_mwf_radio' => 'geschlecht',
        'geschlecht_mwif_radio' => 'geschlecht',
        'geschlecht_mwd_radio' => 'geschlecht',
        'geschlecht_mwdf_radio' => 'geschlecht',
        'geschlecht_anrede_def' => 'geschlecht',
        'geschlecht_anrede_mw' => 'geschlecht',
        'geschlecht_mw_anrede' => 'geschlecht',
        'geschlecht_mw_anrede_def' => 'geschlecht',
        'geschlecht_wm_anrede_radio' => 'geschlecht',
        'abw_geschlecht_mw_anrede_def' => 'abw_geschlecht',
        'abw_geschlecht_mw_anrede' => 'abw_geschlecht',
        'abw_geschlecht_mwf_anrede_def' => 'abw_geschlecht',
        'abw_geschlecht_mwf_anrede' => 'abw_geschlecht',
        'beruf_oesterreich' => 'beruf',
        'beruf_hinterlegung' => 'beruf',
        'beruf_hinterlegung_def' => 'beruf',
        'ermgrund' => 'erm_grund',
        'geburtsdatum' => 'gebdat',
        'geburtsjahr' => 'gebjahr',
        'kontonummer' => 'konto',
        'bankleitzahl' => 'blz',
        'bankbezeichnung' => 'bankbez',
        'nation_hinterlegung' => 'nation',
        'nation_hinterlegung_def' => 'nation',
        'zahlart_lastoderue' => 'zahlart',
        'sw_essen1_select' => 'sw_essen1',
        'sw_essen2_select' => 'sw_essen2',
        'sw_essen3_select' => 'sw_essen3',
        'sw_essen4_select' => 'sw_essen4',
        'sw_essen5_select' => 'sw_essen5',
        'sw_zimmer1_select' => 'sw_zimmer1',
        'sw_zimmer2_select' => 'sw_zimmer2',
        'sw_zimmer3_select' => 'sw_zimmer3',
        'sw_zimmer4_select' => 'sw_zimmer4',
        'sw_zimmer5_select' => 'sw_zimmer5',
        'zimmerauswahl' => 'zimmerart',
        'bundesland_hinterlegung' => 'bundesland',
        'bundesland_hinterlegung_def' => 'bundesland',
        'staatsang_hinterlegung' => 'staatsang',
        'staatsang_hinterlegung_def' => 'staatsang',
        'nation_aus_staatsang' => 'nation',
        'nation_aus_staatsang_def' => 'nation',
        'nurplz_ajax' => 'nurplz',
        'nurstrasse_ajax' => 'nurstrasse',
        'abw_nurplz_ajax' => 'abw_nurplz',
        'abw_geschlecht_mw' => 'abw_geschlecht',
        'abw_geschlecht_mw_radio' => 'abw_geschlecht',
        'name_titel_select' => 'name_titel',
        'kommprio_radio' => 'kommprio',
        'kommprio_radio_inline' => 'kommprio',
        'anmquelle_select' => 'anmquelle',
        'anmquelle_select_def' => 'anmquelle',
        'sozposition_select' => 'sozposition',
        'fp_teilnahme_uhrzeit' => 'fp_teilnahme_text',
        'fp_heimweg_jn' => 'fp_heimweg_text',
        'alterskl_profil' => 'alterskl'
        );
    for ($i = 0; $i < 16; $i++) {
      $map['input_krit' . $i] = 'krit' . $i;
    }
    for ($i = 1; $i <= 6; $i++) {
      $map['cb_plain_krit' . $i] = 'krit' . $i;
    }

    return $map;
  }

  private static function getPathForPreview($pOriginalPath)
  {
    if (SessionOperations::isPreviewMode()) {
      $previewdir = $pOriginalPath . 'preview' . DIRECTORY_SEPARATOR;
      if (file_exists($previewdir)) {
        $pOriginalPath = $previewdir;
      }
    }

    return $pOriginalPath;
  }

  
  private static function getPathForMode($pOriginalPath)
  {
    $mode = KUFERWEB_MODUS_NORMAL;
    if (defined('ISWEBADMIN') && ISWEBADMIN) {
      
      $mode = SessionOperations::getAdminMode();
    } elseif (!SessionOperations::isKuferTools()) {
      $mode = SessionOperations::getKuferWEBMode();
    }

    if ($mode == KUFERWEB_MODUS_NORMAL) {
      return $pOriginalPath;
    }

    $sfc = new SightsFolderControll();
    $folder = $sfc->loadSightsFolderFromSettings()->getFolderByMode($mode);

    if (!$folder || trim($folder->foldername) == '') {
      return $pOriginalPath;
    }
    $dirMode = $pOriginalPath . $folder->foldername . DIRECTORY_SEPARATOR;

    if (file_exists($dirMode)) {
      return $dirMode;
    }

    return $pOriginalPath;
  }

  
  public static function getPathForLog()
  {
    if (LOG_DIR == '') {
      $path = '..' . DIRECTORY_SEPARATOR . 'log';
    } else {
      $path = LOG_DIR;
    }

    return static::getAbsolutePathRelativeToWebbasys($path);
  }

  

  private static function getAbsolutePathRelativeToWebbasys($path)
  {
    $logPath = new Path($path);
    $webbasysPath = new Path(BASEDIR . 'webbasys' . DIRECTORY_SEPARATOR);

    $absolutePath = $logPath->getAbsoluteTo($webbasysPath);

    return $absolutePath->toString() . DIRECTORY_SEPARATOR;
  }

  public static function getPathForKwCache()
  {
    if (!defined('KW_CACHE_DIR') || KW_CACHE_DIR == '') {
      $path = '..' . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR . 'cache';
    } else {
      $path = KW_CACHE_DIR;
    }

    return static::getAbsolutePathRelativeToWebbasys($path);
  }

  
  public static function getPathForCoreSettings()
  {
    return self::createPath('webtools' . DIRECTORY_SEPARATOR . 'config', WEBTOOLS_SETTINGS_PATH, 1001);
  }

  public static function getPathForSightsOrig()
  {
    return self::createPath('layout' . DIRECTORY_SEPARATOR . 'sichten', SIGHTS_PATH, 1003, true);
  }

  public static function getPathForLayoutOrig()
  {
    return self::createPath('layout', 'layout', 1004, true);
  }

  public static function createPath(string $defaultPath, string $deprecatedPath, int $errorCode, bool $prependWebbasysAfterCheck = false)
  {
    if (\Kufer\Web\Classes\KwResourceLocator::fileExists()) {
      if ($defaultPath !== $deprecatedPath) {
        
        
        if ($defaultPath !== str_replace('/', '\\', $deprecatedPath) && $defaultPath !== str_replace('\\', '/', $deprecatedPath)) {
          die('Konfigurationsfehler - bitte wenden Sie sich an die Hotline - Fehlercode: ' . $errorCode);
        }
      }
      if ($prependWebbasysAfterCheck) {
        $defaultPath = 'webbasys' . DIRECTORY_SEPARATOR . $defaultPath;
      }

      $fallback = \StringOperations::makeKuferWebPathAbsolute($defaultPath) . DIRECTORY_SEPARATOR;

      return \Kufer\Web\Classes\KwResourceLocator::getInstance()->locate($defaultPath, $fallback);
    } else {
      $path = $deprecatedPath == '' ? $defaultPath : $deprecatedPath;

      if ($prependWebbasysAfterCheck) {
        $path = 'webbasys' . DIRECTORY_SEPARATOR . $path;
      }

      return \StringOperations::makeKuferWebPathAbsolute($path) . DIRECTORY_SEPARATOR;
    }
  }

  public static function getPathForKuferToolsUserOrig()
  {
    return BASEDIR . 'kufertools' . DIRECTORY_SEPARATOR . 'settings' . DIRECTORY_SEPARATOR . 'user' . DIRECTORY_SEPARATOR;
  }

  
  public static function getPathForSightsModus()
  {
    $sfc = new SightsFolderControll();
    $folderAry = $sfc->loadSightsFolderFromSettings()->getAllFolder();
    $dir = array();
    foreach ($folderAry as $folder) {
      if (trim($folder->foldername) != '') {
        $dir[] = static::getPathForSightsOrig() . $folder->foldername . DIRECTORY_SEPARATOR;
      }
    }

    return $dir;
  }

  
  public static function getPathForSettingsOrig()
  {
    return self::createPath('layout' . DIRECTORY_SEPARATOR . 'settings', SETTINGS_PATH, 1003, true);
  }

  
  public static function getPathForAllgeinstellCfg()
  {
    $dir = ConstantOperations::getPathForCoreSettings();

    return ConstantOperations::getPathForPreview($dir);
  }

  public static function getPathForSights()
  {
    $dir = ConstantOperations::getPathForSightsOrig();
    $dir = ConstantOperations::getPathForMode($dir);
    
    return ConstantOperations::getPathForPreview($dir);
  }

  public static function getPathForSettings()
  {
    $dir = ConstantOperations::getPathForSettingsOrig();
    $dir = ConstantOperations::getPathForMode($dir);

    return ConstantOperations::getPathForPreview($dir);
  }

  public static function getPathForKuferWebResources()
  {
    return BASEDIR . 'webbasys' . DIRECTORY_SEPARATOR . 'resources' . DIRECTORY_SEPARATOR;
  }

  
  public static function getPathForKuferWebResource($pFileName)
  {
    $filenameUser = static::getPathForKuferWebResources() . 'user' . DIRECTORY_SEPARATOR . $pFileName;
    if (file_exists($filenameUser)) {
      return $filenameUser;
    } else {
      return static::getPathForKuferWebResources() . 'system' . DIRECTORY_SEPARATOR . $pFileName;
    }
  }

  public static function getKurstagStatus($pStatus)
  {
    $arr = ConstantOperations::getKurstagStati();

    return isset($arr[$pStatus]) ? $arr[$pStatus] : '';
  }

  
  public static function getKurstagStati()
  {
    return array('' => '',
                'X' => 'durchgef&uuml;hrt',
                'A' => 'Ausfall',
                'Z' => 'Zusatztag',
                'V' => 'Vorbesprechung',
                'N' => 'Nachbesprechung',
                'E' => 'Elternabend',
                'P' => 'Pr&uuml;fung',
                'I' => 'Informationsabend',
                '1K' => 'erster Kurstag',
                'S' => 'Sperre');
  }

  
  public static function getKurstagStatusKuerzel()
  {
    $kuerzel = array_keys(self::getKurstagStatus4EinschraenkungAufKTStatus());
    $kuerzel[] = '';

    return array_diff($kuerzel, array('-'));
  }

  
  public static function getKurstagStatusKuerzelHasTeilnahme(): array
  {
    
    return array_diff(static::getKurstagStatusKuerzel(), array('A', 'S'));
  }

  
  public static function getKurstagStatus4EinschraenkungAufKTStatus()
  {
    return array('-' => 'Normal',
                       'A' => 'Ausfall (A)',
                       'Z' => 'Zusatztag (Z)',
                       'X' => 'durchgeführt (X)',
                       'P' => 'Prüfung (P)',
                       'V' => 'Vorbesprechung (V)',
                       'N' => 'Nachbesprechung (N)',
                       'E' => 'Elternabend (E)',
                       'I' => 'Informationsveranstaltung (I)',
                       'K' => 'Exkursion (K)',
                       'D' => 'nicht für Deputatsberechnung (D)');
  }

  
  public static function getTerminStatusText($pStatus)
  {
    
    switch ($pStatus) {
      case 'A':
        return 'Ausfall';
      default:
        return '';
    }
  }

  

  
  public static function getVersandTypText($pVersandTyp)
  {
    if ($pVersandTyp == '1') {
      return 'Pauschal';
    } else {
      return 'Standard';
    }
  }

  
  public static function getVersandTypPauschal()
  {
    return 'I';
  }

  
  public static function getBelegungStatus($pStatus)
  {
    $arr = ConstantOperations::getAlleBelegungStatus();

    return isset($arr[$pStatus]) ? $arr[$pStatus] : '';
  }

  public static function getAlleBelegungStatus()
  {
    $dbworkKennz = new DBWorkHLStatusKZ();
    $status = $dbworkKennz->getAll();
    $return = array();
    foreach ($status as $obj) {
      $return[$obj->kennz] = $obj->text;
    }

    return $return;
  }

  
  public static function getBelegungsStatusStorniert(): array
  {
    return array('S', 'Z');
  }

  public static function getFirstToolSections()
  {
    return array(1 => 1, 2 => 6, 3 => 9, 4 => 12, 5 => 15, 6 => 434, 7 => 23,
           8 => 26, 9 => 30, 10 => 98, 11 => 41, 12 => 54, 13 => 89, 14 => 94,
           16 => 266, 17 => 269, 
           18 => 291, 
           19 => 292, 20 => 293, 21 => 305, 22 => 314, 23 => 315,
           24 => 322, 25 => 330, 26 => 344, 27 => 348, 28 => 346, 29 => 353, 30 => 357, 31 => 362, 32 => 371, 33 => 55, 34 => 415, 35 => 448,
           36 => 453, 37 => 457, 38 => 487, 39 => 494, 40 => 495, 42 => 526, 43 => 531, 44 => 533, 45 => 550, 46 => 555, 47 => 558, 48 => 563, 49 => 568, 50 => 569, 51 => 622, 52 => 616, 53 => 634, 54 => 639, 55 => 652, 56 => 680, 57 => 681, 58 => 686, 59 => 693, 61 => 721, 62 => 744, 63 => 752, 64 => 754, 65 => 756, 66 => 769, 67 => 359);
    
    
    
  }

  
  public static function filterBadMergenhteimBerufsgruppenKennz($kennzeichenAry)
  {
    
    return array_values(array_filter($kennzeichenAry, function($kennzeichen) {
      return $kennzeichen->kennz > 3;
    }));
  }

  
  public static function getBlakBerufsgruppenKennz()
  {
    return array_keys(ConstantOperations::getBlakBerufsgruppenUndPunkteSchwellen());
  }

  
  public static function getBlakBerufsgruppenUndPunkteSchwellen()
  {
    return array(11 => 150, 12 => 100, 13 => 70, 14 => 999);
  }

  
  public static function getBlakBerufsgruppenSchwelleKurse1bis7($pBerufsgruppe)
  {
    $punkteschwellen = array(11 => 120, 12 => 80, 13 => 40, 14 => 999);
    if (!isset($punkteschwellen[$pBerufsgruppe])) {
      return 120;
    } else {
      return $punkteschwellen[$pBerufsgruppe];
    }
  }

  public static function getBlakBerufsgruppenNamen($pKennzeichen, $pWithAdditionalBerufsgruppen = false)
  {
    $allowedKennzeichen = array(11, 12, 13, 14);
    $berufsGruppen = array(11 => 'Apotheker/in', 12 => 'PTA', 13 => 'PKA', 14 => 'PhiP');

    if ($pWithAdditionalBerufsgruppen) {
      $allowedKennzeichen = array_merge($allowedKennzeichen, array(16, 17));
      $berufsGruppen[16] = 'Sonstige Qualifikation';
      $berufsGruppen[17] = 'PTA';
    }

    if (!in_array($pKennzeichen, $allowedKennzeichen)) {
      $pKennzeichen = 11;
    }

    return $berufsGruppen[$pKennzeichen];
  }

  
  public static function getBlakPunkteschwelle($pBerufsgruppe)
  {
    $mapping = ConstantOperations::getBlakBerufsgruppenUndPunkteSchwellen();
    if (isset($mapping[$pBerufsgruppe])) {
      return $mapping[$pBerufsgruppe];
    } else {
      throw new Exception('Ungültiges Argument in ConstantOperations::getBlakPunkteschwelle');
    }
  }

  
  public static function getBlakStornoHindernisse($pGruende, $pBelegung)
  {
    
    
    $kurskosten = MathOperations::stringToFloat($pBelegung->kurs->gebuehr);







    $apotag = new Kufer\KuferTools\Teilnehmer\BayerischerApothekertag\Utils\Apothekertag();
    if ($apotag->isBATKurs($pBelegung->knr) || StringOperations::strtolower($pBelegung->knr) == StringOperations::strtolower($apotag->getKnrFromZahlKurs())) {
      $pGruende[] = 'Kurs ist Teil des Bayerischen Apothekertags';
    }

    $tageDifferenz = DateTimeOperations::getDaysFromTo(DateTimeOperations::getDateNow(), $pBelegung->kurs->beginn_dat) - 1;
    
    if ($tageDifferenz < 0) {
      return $pGruende;
    }

    
    if ($kurskosten >= 75 && $tageDifferenz < 29) {
      $grund = 'Kurs kostet mindestens 75 (' . MathOperations::floatToString($kurskosten) . ') ' . StringOperations::html_entity_decode(CURRENCY, ENT_NOQUOTES) . ' und beginnt in ' . $tageDifferenz . ' also weniger als ';

      if ($tageDifferenz > 13) {
        $grund .= '29 Tagen => ' . MathOperations::floatToString($kurskosten * 0.3) . ' ' . StringOperations::html_entity_decode(CURRENCY, ENT_NOQUOTES) . ' Stornogebühren';
      } elseif ($tageDifferenz > 4) {
        $grund .= '14 Tagen => ' . MathOperations::floatToString($kurskosten * 0.5) . ' ' . StringOperations::html_entity_decode(CURRENCY, ENT_NOQUOTES) . ' Stornogebühren';
      } else {
        $grund .= '5 Tagen => ' . MathOperations::floatToString($kurskosten) . ' ' . StringOperations::html_entity_decode(CURRENCY, ENT_NOQUOTES) . ' Stornogebühren';
      }
      $pGruende[] = $grund;
    }
    
    elseif ($kurskosten >= 0.01 && $tageDifferenz < 14) {
      $grund = 'Kurs kostet weniger als 75 (' . MathOperations::floatToString($kurskosten) . ') ' . StringOperations::html_entity_decode(CURRENCY, ENT_NOQUOTES) . ' und beginnt in ' . $tageDifferenz . ' also weniger als ';
      if ($tageDifferenz > 4) {
        $grund .= '14 Tagen => ' . MathOperations::floatToString($kurskosten * 0.5) . ' ' . StringOperations::html_entity_decode(CURRENCY, ENT_NOQUOTES) . ' Stornogebühren';
      } else {
        $grund .= '5 Tagen => ' . MathOperations::floatToString($kurskosten) . ' ' . StringOperations::html_entity_decode(CURRENCY, ENT_NOQUOTES) . ' Stornogebühren';
      }
      $pGruende[] = $grund;
    }

    return $pGruende;
  }

  
  public static function getBfiFeedbackUrl($pKurs = '', $pFach = '')
  {
    $currentDate = DateTimeOperations::getDateNow();
    $dateLength = StringOperations::strlen($currentDate);
    $quer = 0;
    for ($i = 0; $i < $dateLength; $i++) {
      if (is_numeric($currentDate[$i])) {
        $quer += intval($currentDate[$i]);
      }
    }
    $loginParam = StringOperations::lpad($quer, 8, '0');
    $doz = \SessionOperations::getCurrentWebToolsDozent();
    
    
    
    $loginParam .= urlencode(StringOperations::utf8_encode(StringOperations::substr(StringOperations::rpad($doz->name, 3, '0'), 0, 3)));
    $loginParam .= $doz->id * $quer;
    $result = ' https://online.bfi-sbg.at/evaluierung/trainer/login.aspx?d=' . $loginParam;
    if ($pKurs !== '') {
      $result .= "&k=$pKurs";
    }
    if ($pFach !== '') {
      $result .= "&f=$pFach";
    }

    return $result;
  }

  
  public static function getHTTPSPath4Url($pAktion)
  {
    
    $settingsTool0 = ToolSettingsAPI::getToolSettings(0);

    if ($pAktion == LOGIN) {
      if (!$settingsTool0->SSLLogin) {
        return '';
      }
    } else { 
      
      if (!$settingsTool0->SSLAnmeldung) {
        return '';
      }
    }
    $http = 'https';

    
    
    $server = $_SERVER['SERVER_NAME'];
    
    if ((SessionOperations::isKuferTools() || SessionOperations::isWizards()) && $settingsTool0->SSLserverNameTools != '') {
      $server = $settingsTool0->SSLserverNameTools;
    } elseif ($settingsTool0->SSLserverName != '') {
      $server = $settingsTool0->SSLserverName;
    }

    $pathinfo = pathinfo($_SERVER['SCRIPT_NAME']);

    $path = $pathinfo['dirname'];
    $tocheck = '-------------------'; 
    
    
    if (StringOperations::strpos($server, '/')) {
      $tocheck = StringOperations::substr($server, StringOperations::strpos($server, '/') + 1);
    }
    if (StringOperations::strpos($path, $tocheck) === 1) {  
      $path = StringOperations::substr($path, StringOperations::strlen($tocheck) + 1);
    }
    if ($path === '/' || $path === '\\') {
      $path = '';
    }
    
    return str_replace('\\', '', $http . '://' . $server . $path . '/');
  }

  
  public static function getAnsprache($pDatamodul)
  {
    $result = trim($pDatamodul->getVarValue('ansprache'));
    if ($result === '') {
      $titel = trim($pDatamodul->getVarValue('name_titel')) != '' ? trim($pDatamodul->getVarValue('name_titel')) . ' ' : '';
      $beginn = static::getAnsprachenBeginnByGeschlecht($pDatamodul->geschlecht);
      if ($pDatamodul->geschlecht === 'F') {
        $result = $beginn . $pDatamodul->getVarValue('name');
      } else {
        $result = $beginn . $titel . $pDatamodul->getVarValue('name');
      }
    }

    return $result;
  }

  
  public static function getAnsprachenBeginnByGeschlecht($pGeschlecht)
  {
    if ($pGeschlecht === 'W') {
      return 'Sehr geehrte Frau ';
    } elseif ($pGeschlecht === 'M') {
      return 'Sehr geehrter Herr ';
    } elseif ($pGeschlecht == 'F') {
      return 'Sehr geehrte Mitarbeiter der Firma ';
    } else {
      return 'Sehr geehrte/r Frau/Herr ';
    }
  }

  
  public static function getAnrede($pDatamodul, $pDativ = false)
  {
    if (trim($pDatamodul->getVarValue('anrede')) == '') {
      return static::getAnredeByGeschlecht($pDatamodul->getVarValue('geschlecht'), $pDativ);
    } else {
      return $pDatamodul->getVarValue('anrede');
    }
  }

  
  public static function getAnredeByGeschlecht($pAnrede, $pDativ = false)
  {
    if ($pAnrede === 'W') {
      return 'Frau';
    } elseif ($pAnrede === 'M') {
      if ($pDativ) {
        return 'Herrn';
      }

      return 'Herr';
    } elseif ($pAnrede === 'F') {
      return 'Firma';
    } else {
      return '';
    }
  }

  
  public static function getKursartBeschreibungByWebinar($pWebinar)
  {
    switch ($pWebinar) {
      default:
      case '':
      case 'F':
      case 'P':
        return 'Präsenzkurs';
      case 'W':
      case 'O':
        return 'Online-Kurs';
      case 'H':
        return 'Hybrid-Kurs';
      case 'B':
        return 'Blended Learning';
      case 'S':
        return 'Selbstlernangebot';
      case 'x':
        return 'Ausstellung';
      case 'A':
        return 'Anfrage';
    }
  }

  
  public static function getKursartInfoByWebinar($pWebinar)
  {
    switch ($pWebinar) {
      default:
      case '':
      case 'F':
      case 'P':
        return 'reine Vor-Ort-Veranstaltung';
      case 'W':
      case 'O':
        return 'reiner Online-Kurs';
      case 'H':
        return 'Ein Teil der Teilnehmer nimmt vor Ort, der andere online teil.';
      case 'B':
        return 'Ein Teil der Termine wird vor Ort, der andere Teil online durchgeführt.';
      case 'S':
        return 'termingebundenes Selbstlernangebot';
      case 'x':
        return 'Ausstellung';
      case 'A':
        return 'Anfrage';
    }
  }

  
  public static function getKursartTypen(): array
  {
    return array('P', '', 'F', 'O', 'W', 'H', 'B', 'S', 'X', 'A');
  }

  
  public static function getLand($pBASysSettings)
  {
    $ersteZweiZeichen = StringOperations::substr($pBASysSettings->bundesland, 0, 2);

    switch ($ersteZweiZeichen) {
      case 'I-':
        return 'I';
      case 'CH':
        return 'CH';
      case 'A-':
        return 'A';
      default:
        return 'D';
    }
  }

  
  public static function getEncoding()
  {
    if (ENCODING == 'UTF_8') {
      return ENCODING;
    }

    return CP1252;
  }

  
  public static function getEncoding4Charset()
  {
    $encoding = self::getEncoding();
    if ($encoding == 'UTF_8') {
      return 'utf-8';
    }

    return $encoding;
  }

  
  public static function getMaxFileSize4Upload($pFileUploadMaxFileSize)
  {
    $size = ConstantOperations::getMaxPostSize(array($pFileUploadMaxFileSize));
    if ($size === -1) {
      return 1000000; 
    }

    return $size;
  }

  
  public static function getMaxPostSize($additionalChecks = array())
  {
    $postsize = MathOperations::getInteger(ini_get('post_max_size'));
    $uploadsize = MathOperations::getInteger(ini_get('upload_max_filesize'));
    $memorylimit = MathOperations::getInteger(ini_get('memory_limit'));

    
    $toCheck = $additionalChecks;

    
    if ($postsize !== 0) {
      $toCheck[] = $postsize;
    }
    if ($uploadsize !== 0 && MathOperations::getInteger(ini_get('max_file_uploads')) !== 0) {
      $toCheck[] = $uploadsize * MathOperations::getInteger(ini_get('max_file_uploads'));
    }
    if ($memorylimit !== -1) {
      $toCheck[] = $memorylimit;
    }
    if (count($toCheck) == 0) {
      return -1;
    }

    return min($toCheck);
  }

  
  public static function getWegForDseUnterschriebenWeg()
  {
    return 'I';
  }

  
  public static function getLaenderAry()
  {
    return array('Afghanistan', 'Ägypten', 'Aland', 'Albanien', 'Algerien', 'Amerikanisch-Samoa', 'Amerikanische Jungferninseln', 'Andorra',
        'Angola', 'Anguilla', 'Antarktis', 'Antigua und Barbuda', 'Äquatorialguinea', 'Argentinien', 'Armenien', 'Aruba', 'Ascension', 'Aserbaidschan',
        'Äthiopien', 'Australien', 'Bahamas', 'Bahrain', 'Bangladesch', 'Barbados', 'Belgien', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivien',
        'Bosnien und Herzegowina', 'Botswana', 'Bouvetinsel', 'Brasilien', 'Brunei', 'Bulgarien', 'Burkina Faso', 'Burundi', 'Chile', 'China',
        'Cookinseln', 'Costa Rica', 'Cote d`Ivoire', 'Dänemark', 'Deutschland', 'Diego Garcia', 'Dominica', 'Dominikanische Republik', 'Dschibuti',
        'Ecuador', 'El Salvador', 'Eritrea', 'Estland', 'Europäische Union', 'Falklandinseln', 'Färöer', 'Fidschi', 'Finnland', 'Frankreich',
        'Französisch-Guayana', 'Französisch-Polynesien', 'Gabun', 'Gambia', 'Georgien', 'Ghana', 'Gibraltar', 'Grenada', 'Griechenland', 'Grönland',
        'Großbritannien', 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana', 'Haiti', 'Heard und McDonaldinseln',
        'Honduras', 'Hongkong', 'Indien', 'Indonesien', 'Irak', 'Iran', 'Irland', 'Island', 'Israel', 'Italien', 'Jamaika', 'Japan', 'Jemen', 'Jersey',
        'Jordanien', 'Kaimaninseln', 'Kambodscha', 'Kamerun', 'Kanada', 'Kanarische Inseln', 'Kap Verde', 'Kasachstan', 'Katar', 'Kenia', 'Kirgisistan',
        'Kiribati', 'Kokosinseln', 'Kolumbien', 'Komoren', 'Kongo', 'Kroatien', 'Kuba', 'Kuwait', 'Laos', 'Lesotho', 'Lettland', 'Libanon', 'Liberia',
        'Libyen', 'Liechtenstein', 'Litauen', 'Luxemburg', 'Macao', 'Madagaskar', 'Malawi', 'Malaysia', 'Malediven', 'Mali', 'Malta', 'Marokko',
        'Marshallinseln', 'Martinique', 'Mauretanien', 'Mauritius', 'Mayotte', 'Mazedonien', 'Mexiko', 'Mikronesien', 'Moldawien', 'Monaco', 'Mongolei',
        'Montserrat', 'Mosambik', 'Myanmar', 'Namibia', 'Nauru', 'Nepal', 'Neukaledonien', 'Neuseeland', 'Neutrale Zone', 'Nicaragua', 'Niederlande',
        'Niederländische Antillen', 'Niger', 'Nigeria', 'Niue', 'Nordkorea', 'Nördliche Marianen', 'Norfolkinsel', 'Norwegen', 'Oman', 'Österreich',
        'Pakistan', 'Palästina', 'Palau', 'Panama', 'Papua-Neuguinea', 'Paraguay', 'Peru', 'Philippinen', 'Pitcairninseln', 'Polen', 'Portugal',
        'Puerto Rico', 'Réunion', 'Ruanda', 'Rumänien', 'Russische Föderation', 'Salomonen', 'Sambia', 'Samoa', 'San Marino', 'São Tomé und Príncipe',
        'Saudi-Arabien', 'Schweden', 'Schweiz', 'Senegal', 'Serbien und Montenegro', 'Seychellen', 'Sierra Leone', 'Simbabwe', 'Singapur', 'Slowakei',
        'Slowenien', 'Somalia', 'Spanien', 'Sri Lanka', 'St. Helena', 'St. Kitts und Nevis', 'St. Lucia', 'St. Pierre und Miquelon',
        'St. Vincent/Grenadinen (GB)', 'Südafrika, Republik', 'Sudan', 'Südkorea', 'Suriname', 'Svalbard und Jan Mayen', 'Swasiland', 'Syrien',
        'Tadschikistan', 'Taiwan', 'Tansania', 'Thailand', 'Timor-Leste', 'Togo', 'Tokelau', 'Tonga', 'Trinidad und Tobago', 'Tristan da Cunha',
        'Tschad', 'Tschechische Republik', 'Tunesien', 'Türkei', 'Turkmenistan', 'Turks- und Caicosinseln', 'Tuvalu', 'Uganda', 'Ukraine', 'Ungarn',
        'Uruguay', 'Usbekistan', 'Vanuatu', 'Vatikanstadt', 'Venezuela', 'Vereinigte Arabische Emirate', 'Vereinigte Staaten von Amerika', 'Vietnam',
        'Wallis und Futuna', 'Weihnachtsinsel', 'Weißrussland', 'Westsahara', 'Zentralafrikanische Republik', 'Zypern');
  }

  public static function getKuferwebGeschlecht($gender)
  {
    switch ($gender) {
      case 'male': return 'M';
      case 'female': return 'W';
      default: return '';
    }
  }

  public static function isGebuehrFuerWeitereTnErmaessigbar()
  {
    return !(SPLITMEHRFACHANMELDUNG == WB_SPLITMEHRFACHANMELDUNG_IMMER || SPLITMEHRFACHANMELDUNG == WB_SPLITMEHRFACHANMELDUNG_FALLS_ERMAESSIGT);
  }

  public static function unsetWebflag($inFlag, $webflagToUnset)
  {
    
    
    $negativeMask = 63 & ~$webflagToUnset;

    return $inFlag & $negativeMask;
  }

  public static function getProxyServerAndPort()
  {
    $serverAndPort = CURL_PROXYSERVER;
    $server = $port = '';
    $serverPortTrenner = strrpos($serverAndPort, ':');
    
    if ($serverPortTrenner !== false) {
      $server = StringOperations::substr($serverAndPort, 0, $serverPortTrenner);
      $port = StringOperations::substr($serverAndPort, $serverPortTrenner + 1);
    } else {
      $server = $serverAndPort;
    }

    return array($server, $port);
  }

  public static function getUserConstantsPath():string
  {
    return \Kufer\Web\Classes\KwResourceLocator::getInstance()->locate(
      LEGACY_USERCONSTANTS_PATH,
      BASEDIR . LEGACY_USERCONSTANTS_PATH
    );
  }

  
  public static function getKEBStoff(): array
  {
    return array(
        KEBStoff::create('01', 'Gesellschaft, Politik, Wirtschaft, Recht'),
        KEBStoff::create('02', 'Psychologie, Pädagogik, Lebens-und Erziehungsfragen'),
        KEBStoff::create('27', 'Familienbildung mit Kindern'),
        KEBStoff::create('28', 'EKP'),
        KEBStoff::create('03', 'Philosophie, Religion, Weltanschauung, Theologie'),
        KEBStoff::create('04', 'Integration, Migration'),
        KEBStoff::create('05', 'Kunst, Kultur, Handwerk, musikalische Bildung'),
        KEBStoff::create('06', 'Medien, Film, Funk, Presse,Fernsehen, Internet'),
        KEBStoff::create('07', 'Technik, Naturwissenschaften, Informationstechnologie'),
        KEBStoff::create('08', 'Natur, Umwelt, Landwirtschaft'),
        KEBStoff::create('09', 'Sprachen'),
        KEBStoff::create('10', 'Länder- und Völkerkunde, internationale Begegnungen'),
        KEBStoff::create('11', 'Gesundheitsbildung, Hauswirtschaft, Ernährung'),
        KEBStoff::create('12', 'Grundbildung'),
        KEBStoff::create('13', 'Vorbereitung Schulabschlüsse'),
        KEBStoff::create('14', 'Mitarbeiterfortbildung'),
        KEBStoff::create('15', 'Arbeitswelt')
      );
  }
}