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


class ToolMitarbeiter extends ToolBase
{
  
  private $_user;
  private $_dbwkurse;
  
  
  protected $_isRefresh;

  public function __construct()
  {
    parent::__construct();
    $this->toolTitle = 'Übersicht Ihrer Kurse';

    
    $dbwkurse = new DBWorkKurseWT();
    
    $dbwkurse->newSearch();

    $dbwkurse->fromobject->semester = $this->toolSettings->semlist;
    $dbwkurse->toobject->semester = '';
    $dbwkurse->justNoAusfall = $this->toolSettings->keineAusgefallenenKurse;

    $dbwkurse->setOrderBySettings($this->toolSettings);

    
    $searchAPI = new KurssuchAPIwSearch(false);
    if (GetOperations::getVarValue('toolsection_id') == 26) {
      $searchAPI->getSearchParamsFromReqToSession('tool' . $this->toolId);
    }

    $dbwkurse->fromobject = $searchAPI->getFromObjectBySession($dbwkurse->fromobject, 'tool' . $this->toolId);
    $dbwkurse->toobject = $searchAPI->getToObjectBySession($dbwkurse->toobject, 'tool' . $this->toolId);

    $this->_user = SessionOperations::getCurrentWebToolsUser();
    $this->_dbwkurse = $dbwkurse;
    
  }

  

  
  protected function doByBrowserRefresh()
  {
    $this->_isRefresh = true;
    $_POST = array();
    $_SERVER['REQUEST_METHOD'] = 'GET';
  }

  
  public function init($pPageId)
  {
    
    $this->checkBrowserReload();
    $page = null;
    
    switch ($pPageId) {
      default:
      case 26: 
        $page = $this->_handleKursuebersicht($pPageId);
       break;
      case 377: 
    $msg = '';
        $knr = $this->getKnr4Kursdetails();
        if (PostOperations::isDefined('wt_kt_sammelids') && Xsrf::checkAndUseXsrfFromGet('wt_ma_termin_sammel', $knr) == Xsrf::KEY_OK) {
          $kurstagApi = new KurstagAPI();
          $msg = $kurstagApi->doSammelaenderung4Termine();
          
          
          if ((strripos($msg, 'hinweisbox_alertbox', 0) === false)) {
            $msg .= $this->_handlePasstKursZuKurstage();
          }
        }
        
        elseif (PostOperations::isDefined('kursupdate') && PostOperations::getVarValue('kursupdate') == 1) {
          $detailsSightId = 432;  
          
          $msg .= $this->_handleKursBearbeiten($detailsSightId);
        }
        
        elseif (PostOperations::isDefined('belegungUpdate') && PostOperations::getVarValue('belegungUpdate') == 1) {
          $detailsSightId = 458;  
          
          $msg .= $this->_handleBelegungBearbeiten($detailsSightId);
        }
        
        elseif (PostOperations::isDefined('nachlassUpdate') && PostOperations::getVarValue('nachlassUpdate') == 1) {
          
          
          $msg .= $this->_handleNachlassBearbeiten();
        } elseif (PostOperations::isDefined('belIdsToStorno')) {
          $belegungIdsStr = PostOperations::getVarValue('belIdsToStorno');
          $belegungIds = explode(';', $belegungIdsStr);
          $dbwBelegung = new DBWorkBelegung(1, true);
          $belegungen = $dbwBelegung->getBelegungenByIds($belegungIds);
          $msg .= $this->_handleStorno($belegungen);
        }

    $page = $this->_handleKursdetails($pPageId, $msg);
        break;

      case 378: 
          $ktid = GetOperations::getVarValue('ktid');
          if ($ktid !== '') {
            $page = $this->_handleTerminBearbeiten($pPageId, $ktid);
          } else {
            
            $page = $this->_handleTerminHinzufuegen($pPageId);
          }
        break;
      case 380: 
        $knr = GetOperations::getVarValue('nr');
        $page = PageHandlerAPI::handleKursAnw($this, $pPageId, $knr, $pPageId . '.0.2', $pPageId . '.0.3', true, null, $this->toolSettings->anwFilterVonDatum);
        break;
    }
    if ($page == null) {
      throw new Exception('ungültige PageId');
    }

    $this->currentPage = $page;
  }

  

  
  private function _handlePasstKursZuKurstage()
  {
    $knr = GetOperations::getVarValue('nr');
    $rechte = $this->_getRechte4KursBearbeiten();

    return PasstKursZuKurstageAPI::getScriptTagZumAnpassenDerKursdaten($knr, $this->toolId, $rechte);
  }

  
  private function _getRechte4KursBearbeiten()
  {
    $toolsectionKursBearbeiten = 432;

    return array(
      'kurs_bearbeiten' => array('377.0.8'),
      'beginn' => array($toolsectionKursBearbeiten . '.16'),
      'ende' => array($toolsectionKursBearbeiten . '.17'),
      'beginn_dat' => array($toolsectionKursBearbeiten . '.3'),
      'ende_dat' => array($toolsectionKursBearbeiten . '.4'),
      'stundenanz' => array($toolsectionKursBearbeiten . '.38'),
      'dauer' => array($toolsectionKursBearbeiten . '.10')
    );
  }

  
  public static function getKursnummern4Ma($pDBWorkKurse = null)
  {
    $toolSettings = ToolSettingsAPI::getToolSettings(\ToolsAPI::TOOL_KURSPLANUNG_MA);
    $user = SessionOperations::getCurrentWebToolsUser();
    
    $dbwKurseMin = new DBWorkKurseWTMin();
    $dbwKurseMin->newSearch();
    if (!is_null($pDBWorkKurse)) {
      $dbwKurseMin->fromobject = $pDBWorkKurse->fromobject;
      $dbwKurseMin->toobject = $pDBWorkKurse->toobject;
    }

    
    
    $dbwKurseMin->fromobject->semester = $toolSettings->semlist;
    $dbwKurseMin->justNoAusfall = $toolSettings->keineAusgefallenenKurse;
    $dbwKurseMin->setOrderBySettings($toolSettings);

    self::_changeSortierung($dbwKurseMin);

    
    
    if ($toolSettings->sameAussenst) {
      
      $dbwben = new DBWorkBASysUser();
      $ben = $dbwben->getBASysUser($user->ben);
      if ($ben && !($user->isAdmin())) {
        $dbwKurseMin->setDBObject4Ast($ben->aussenstelle);
      }
    }

    if ($toolSettings->useBereichsRechte) {
      $alleKursnummernDesMitarbeiters = $dbwKurseMin->getKursebyBereichsrechte($user->getIdentifier());
    } else {
      $alleKursnummernDesMitarbeiters = $dbwKurseMin->getKursebyBenutzerNR($user->getIdentifier());
    }

    return $alleKursnummernDesMitarbeiters;
  }

  
  private function _handleKursuebersicht($pPageId)
  {
    
    $this->updateAndGetSelectedIds();
    $pageLinks = array();

    $alleKursnummernDesMitarbeiters = self::getKursnummern4Ma($this->_dbwkurse);

    
    
    $this->setTotalData($alleKursnummernDesMitarbeiters);

    $kursanzahl = count($alleKursnummernDesMitarbeiters);
    $kursnummernDerSeite = ToolsAPI::getDataForCurrentPage($alleKursnummernDesMitarbeiters, $this->toolSettings->kurseproseite);
    
    
    self::_changeSortierung($this->_dbwkurse);
    $data = $this->_dbwkurse->getKurse($kursnummernDerSeite);

    
    
    $vonDate = $this->_dbwkurse->fromobject->beginn_dat;
    
    $bisDate = $this->_dbwkurse->toobject->beginn_dat;
    if ($vonDate == '' || $bisDate == '') {
      $dbwSemester = new DBWorkHLSemester();
      $zeitraum = $dbwSemester->getZeitraum($this->toolSettings->semlist);
      if ($vonDate == '') {
        $vonDate = $zeitraum['von'];
      }
      if ($bisDate == '') {
        $bisDate = $zeitraum['bis'];
      }
    }
    $userid = $this->_user->getIdentifier();
    
    
    $pageLinks['kursdetails'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.1') == 2
                                 && $this->rechteOR(array('377.1.1', '377.1.2', '377.1.3', '377.1.4', '377.1.5', '377.1.6', '377.1.7')));

    
    
    $pageLinks['teilnehmer'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.2')
                                && $this->rechteOR(array('243.0.2', '243.0.4', '243.0.6', '243.0.8', '243.0.10')));

    
    $pageLinks['print'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.3') == 2);

    
    $hasButton4Checkbox = $pageLinks['teilnehmer'];
    
    $pageLinks['markieren'] = $hasButton4Checkbox;
    $pageLinks['checkboxen'] = $hasButton4Checkbox;

    
    $pageLinks['filter'] = 2;

    
    $pageLinks['sortieren'] = 2;

    $pageLinks['self'] = $this->getUrlParamsForFile(array('toolsection_id' => 1));
    
    $page = new PageMaKurseUebersicht($this, $data, $vonDate, $bisDate, $kursanzahl, $this->toolSettings->kurseproseite, $pPageId);
    $page->setLinks($pageLinks);

    return $page;
  }

  

  
  private static function _changeSortierung($pDbwKurse)
  {

    
    
    
    

    $i = '';
    for ($x = 0; $x < 2; $x++) {
      if (RequestOperations::isDefined('sortValue' . $i)) {
        $sortValue = RequestOperations::getVarValue('sortValue' . $i);
        
        $pDbwKurse->{"orderbyasc$i"} = false;
        if ($sortValue == 'beginnauf' || $sortValue == 'kursauf' || $sortValue == 'beginnzeitauf' || $sortValue == 'ortauf'
            || $sortValue == 'aussenstelleauf') {
          $pDbwKurse->{"orderbyasc$i"} = true;
        }

        
        switch ($sortValue) {
          case 'beginnauf':
          case 'beginnab':
            $pDbwKurse->{"orderby$i"} = 'beginn_dat';
            break;
          case 'kursauf':
          case 'kursab':
            $pDbwKurse->{"orderby$i"} = 'nr';
            break;
          case 'beginnzeitauf':
          case 'beginnzeitab':
            $pDbwKurse->{"orderby$i"} = 'beginn';
            break;
          case 'ortauf':
          case 'ortab':
            $pDbwKurse->{"orderby$i"} = 'ort';
            break;
          case 'aussenstelleauf':
          case 'aussenstelleab':
            $pDbwKurse->{"orderby$i"} = 'aussenst';
            break;
        } 
      } 
      $i = 2;
    }
    
  }

  

  
  public function getAjaxResponse()
  {
    $result = '';
    
    if (RequestOperations::isDefined('action')) {
      switch (RequestOperations::getVarValue('action')) {
        case 'sammelFormular':
          $section4SammelAenderung = 377;
          $section4KTBearb = 378;
 
          $ktageIds = explode(';', PostOperations::getVarValue('items'));
          $dbw = new DBWorkKurseTage();
          $ktag = $dbw->getKurstag($ktageIds[0]);
          $felder = array(
            'datum' => array($section4KTBearb . '.117', $section4KTBearb . '.118'),
            'ausfall' => array($section4KTBearb . '.123'),
            'kursort' => array($section4KTBearb . '.116'),
            'bemerkung' => array($section4KTBearb . '.124'),
            'beginn' => array($section4KTBearb . '.119'),
            'ue' => array($section4KTBearb . '.328'),
            'ende' => array($section4KTBearb . '.120'),
            'minuten' => array($section4KTBearb . '.121'),
            'pause' => array($section4KTBearb . '.122')
           );

          $xsrf = new Xsrf();
          $xsrfKey = $xsrf->generateKey4Action('wt_ma_termin_sammel', $ktag->knr);
          $result = KurstagAPI::getSammelAenderungFormular(
            $ktag,
            $ktageIds,
            $felder,
            $this->toolId,
            $this->getUrlParamsForFile(array('toolsection_id' => $section4SammelAenderung,
              
             
             
              'currentIndex' => RequestOperations::getVarValue('currentIndex'),
              'history' => RequestOperations::getVarValue('history'),
              'xsrf' => $xsrfKey,
              'nr' => RequestOperations::getVarValue('knr')))
          );

       
       
       
       
          break;
        
        case 'updateKurs':
          $result = $this->_handleAjaxChangeKurs();
          break;
       
        case 'updateBelegung':
          $result = $this->_handleAjaxChangeBelegung();
          break;

        
        case 'addDozentDT':
          $result = $this->_handleAjaxAddDozentDT();
          break;
        
   
   
   
        case 'changeDozHon':
          $result = $this->_handleAjaxChangeDozHon();
          break;
        case 'changeDozContract':
          $result .= $this->_handleAjaxChangeDozCon();
          break;
        
        case 'newDozent':
          $result = $this->_handleAjaxNewDozent();
          break;
        
        case 'einstell4List':
          $toolsection = RequestOperations::getVarValue('toolsection_id');
          $result = $this->_handleAjaxListSettings($toolsection);
          break;
        
        case 'weitermeldenTN':
          $result = $this->_handleAjaxUmOrWeitermeldenTN('weitermeldenTN');
          break;
        case 'ummeldenTN':
          $result = $this->_handleAjaxUmOrWeitermeldenTN('ummeldenTN');
          break;
        case 'kurs_anpassen':
          $result = $this->_handleAjaxKursAnpassen();
          break;
      } 

      return $result;
    } 

    
    $kurse4download = RequestOperations::getVarValue('kurse4download');
    if ($kurse4download != '') {
      return DokuUploadUserAPI::getKursdata4AjaxForm($this);
    }

    
    if (RequestOperations::isDefined('changeTnInfo')) {

      
      $belid = RequestOperations::getVarValue('belid', -1);

      $dbwBelegung = new DBWorkBelegung(1, true);
      $dbwBelegung->newSearch();
      $dbwBelegung->fromobject->kurs = $this->_dbwkurse->fromobject;
      $dbwBelegung->toobject->kurs = $this->_dbwkurse->toobject;
      $belegung = $dbwBelegung->getBelegung($belid);

      $success = true;
      $message = 'Die &Auml;nderung wurde erfolgreich &uuml;bernommen.';

      $dbwdoz = new DBWorkDozenten(1, true);

      
      if ($belegung->knr == $this->_getKnr4Kursdetails() && $dbwdoz->hasDozentKurs(SessionOperations::getCurrentWebToolsUser()->dnr, $belegung->knr)) {
        $newValue = RequestOperations::getVarValue('newValue');

        
        $varname = '';
        switch (RequestOperations::getVarValue('tnFieldToChange')) {
          case 'bemerkung':
            $belegung->bemerkung = $newValue;
            $varname = 'bemerkung';
            break;
          case 'bemerk_ext':
            $belegung->bemerk_ext = $newValue;
            $varname = 'bemerk_ext';
            break;
          case 'info':
            $belegung->info = $newValue;
            $varname = 'info';
            break;
          default: 
            $success = false;
            $message = 'Das zu &Auml;ndernde Feld konnte nicht gefunden werden.';
            break;
        }

        try {
          if (SessionOperations::isReplikat()) {
            $status5 = true;
            if ($this->allgSettings->dmzEnabled) { 

              $belegungNode = new XMLNode('belegung');
              $belegungNode->addChild(new XMLNode('id', $belegung->id));
              
              $attribut = '';
              if (trim($newValue) == '') {
                $attribut = 'leer="true"';
                $newValue = '-';
              }
              $belegungNode->addChild(new XMLNode($varname, $newValue, $attribut));
              $xmlNode = new XMLNode('belegungen');
              $xmlNode->addChild($belegungNode);
              $abgleichApi = new AbgleichAPI();
              $abgleichApi->sendeNachricht(
                AbgleichAPI::ABGLEICH_BELEGUNG_OLD,
                new Nutzlast($xmlNode)
              );
            } else { 
              $status5 = false;
            }
          }
          $dbwBelegung->updateBelegung($belegung, $status5);
        } catch (AbgleichApiException $aae) {
          $success = false;
          $message = 'Beim Abgleich der &Auml;nderungen ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut, oder wenden Sie sich an die Einrichtung.';
        } catch (Exception $e) {
          $success = false;
          $message = 'Beim &Uuml;bernehmen der &Auml;nderungen ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut, oder wenden Sie sich an die Einrichtung.';
        }
      } else {
        $success = false;
        $message = 'Die angegebene Belegung konnte nicht im Kurs gefunden werden.';
      }

      return JsonOperations::encode4Ajax(array(
                                               'message' => $message, 
                                               'success' => $success 
                                               ));
    } 

    
    $ziel = RequestOperations::getVarValue('zielListe', '##');
    if ($ziel != '##') {
      $result = $this->_handleAjaxDrucklisten($ziel);
    } 

    return $result;
  }

  

  
  private function _handleAjaxKursAnpassen()
  {
    $dataBase64Json = RequestOperations::getVarValue('data');
    $data = JsonOperations::getFromStringBase64($dataBase64Json);

    $knr = RequestOperations::getVarValue('knr');
    $knrMa = $this->getKursnummern4Ma();

    $success = false;
    if (in_array($knr, $knrMa)) {
      $kurs = $this->_dbwkurse->getKurs($knr);
      $success = PasstKursZuKurstageAPI::updateKurs($data, $kurs);
    }

    return JsonOperations::encodeBase64($success);
  }

  
  private function _handleAjaxChangeKurs()
  {
    
    $pageId4Details = 432;
    
    $dbwKurse = new DBWorkKurseWT();

    $knr = PostOperations::getVarValue('knr', -1);
    $data = $dbwKurse->getKurs($knr);
    
    
    $xsrf = new Xsrf();
    $xsrfKey = $xsrf->generateKey4Action('wt_ma_kurs_bearbeiten', $knr);
    $page = new TabPageSightBuilder('Kursdetails bearbeiten', $data, $this->getToolId(), $pageId4Details, true, 'Infotool', $xsrfKey);

    return JsonOperations::encode4Ajax($page->getAjaxObject4Tab());
  }

  

  
  private function _handleAjaxChangeBelegung()
  {
    
    $pageId4Belegung = 458;

    $dbwBelegung = new DBWorkBelegung();
    $belid = PostOperations::getVarValue('belid', -1);
    $data = $dbwBelegung->getBelegung($belid);


    
    
    $xsrf = new Xsrf();
    $xsrfKey = $xsrf->generateKey4Action('wt_ma_change_belegung', $belid);
    $page = new TabPageSightBuilder('Belegungsdaten bearbeiten', $data, $this->getToolId(), $pageId4Belegung, true, 'Infotool', $xsrfKey);

    return JsonOperations::encode4Ajax($page->getAjaxObject4Tab());
  }

  

  
  private function _handleAjaxDrucklisten($pZielListe)
  {
    $sight4tnListen = 243;
    $moeglicheListen = array('tnListen' => $sight4tnListen);
    $ziel = $moeglicheListen[$pZielListe];
    
    
    
    $selnrstr = RequestOperations::getVarValue('nr');
    if ($selnrstr == '') {
      $selnrstr = implode(':', $this->updateAndGetSelectedIds());
    }

    return $this->_getAjaxDrucklistDialog($ziel, $selnrstr);
  }

  

  
  private function _handleAjaxListSettings($pToolSection)
  {
    
    $selnrstr = RequestOperations::getVarValue('nr');

    return $this->_getAjaxDrucklistDialog($pToolSection, $selnrstr);
  }

  
  private function _getAjaxDrucklistDialog($pToolSection, $pSelnrstr)
  {
    $moeglListenNamen = array(243 => 'Teilnehmerlisten');
    $listName = $moeglListenNamen[$pToolSection];

    if ($pToolSection == 243) {
      $url4Selnr = '&nr=' . $pSelnrstr;
    } 
    else {
      $url4Selnr = '&selnr=' . $pSelnrstr;
    }
    
    if (empty($pSelnrstr)) {
      $selnrStr = implode(':', $this->getTotalData());
      $url4Selnr .= $selnrStr;
      
      if (empty($selnrStr)) {
        return DruckListen::ausgabeNoDruckliste($listName, false);
      }
    }
    $action = '&action=einstell4List';
    $drucklistpar = 'usertools.php?tool_id=' . $this->getToolId() . "&toolsection_id=$pToolSection" . $action . $url4Selnr;

    $mayOverrideHL = \SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), $pToolSection . '.0.1') > 1;
    switch ($pToolSection) {
      case 243: 
      
        $tnlisten = new TNListen4MehrereKurse($drucklistpar, $this->getToolId(), $pToolSection, false, $mayOverrideHL);
        $tnlisten->selektierteIds = !empty($pSelnrstr) ? $pSelnrstr : $selnrStr;
        $result = $tnlisten->getContent(true);
      } 

    return $result;
  }

  

  
  private function _handleAjaxChangeDozCon()
  {
    $dozhonId = RequestOperations::getVarValue('dozhonorar');
    
    
    $dbwDozhon = new DBWorkDozentenHonorar();
    $dozentenHonorar = $dbwDozhon->getHonorar($dozhonId);

    $xsrf = new Xsrf();
    $xsrfKey = $xsrf->generateKey4Action('wt_ma_change_dozvertrag', $dozhonId);

    
    
    $hondataObj = array(
            'dozhonid' => $dozentenHonorar->id, 'knr' => $dozentenHonorar->knr, 'dnr' => $dozentenHonorar->dnr,
            'doznamevorname' => $dozentenHonorar->dozent->namevorname,
            'typ' => $dozentenHonorar->typ,
            'vertragstage' => $dozentenHonorar->vertragstage,
            'vertrdruck' => $dozentenHonorar->vertrdruck,
            'internes_hon' => $dozentenHonorar->internes_hon,
            'druckdatum' => $dozentenHonorar->druckdatum,
            'vertragstext' => $dozentenHonorar->vertragstext,
            'info' => $dozentenHonorar->info,
            'bearbeiter' => $dozentenHonorar->bearbeiter,
            'xsrf' => $xsrfKey
          );

    return JsonOperations::encode4Ajax($hondataObj);
  }

  
  private function _handleAjaxChangeDozHon()
  {
    
    $dozhonId = RequestOperations::getVarValue('dozhonorar');
    
    
    $dbwDozhon = new DBWorkDozentenHonorar();

    
    $dozentenHonorar = $dbwDozhon->getHonorar($dozhonId);
    $honfaktor = $dozentenHonorar->getVarValue('honfaktorMitKomma');
    $hongesamt = $dozentenHonorar->getVarValue('honGesamtMitKomma');
    $fahrtfaktor = $dozentenHonorar->fahrtfaktor;
    $fahrtgesamt = $dozentenHonorar->getVarValue('fahrtGesamtMitKomma');

    $fahrtentfernung = MathOperations::StringToFloat($dozentenHonorar->fahrtentfernung);
    $fahrtdoppelt = MathOperations::StringToFloat($dozentenHonorar->fahrtdoppelt);
    $fahrtkmsatz = MathOperations::StringToFloat($dozentenHonorar->fahrtkmsatz);

    
    

    
    

    if (($dozentenHonorar->fahrtkostenstatus == 'N' || $dozentenHonorar->fahrtkostenstatus == '')
        && ($fahrtfaktor + $fahrtentfernung + $fahrtkmsatz + $fahrtdoppelt > 0)) {
      $fkstatuschecked = 'FKnachkm';
    } elseif ($dozentenHonorar->fahrtkostenstatus == 'N') {
      $fkstatuschecked = 'keineFK';
    } elseif ($dozentenHonorar->fahrtkostenstatus == 'G') {
      $fkstatuschecked = 'FKnachkm';
    } elseif ($dozentenHonorar->fahrtkostenstatus == 'P') {  
      $fkstatuschecked = 'FKpauschal';
    } else { 
      $fkstatuschecked = 'keineFK';
    }

    $xsrf = new Xsrf();
    $xsrfKey = $xsrf->generateKey4Action('wt_ma_change_dozhon', $dozhonId);

    
    
    $hondataObj = array(
            'dozhonid' => $dozentenHonorar->id, 'knr' => $dozentenHonorar->knr, 'dnr' => $dozentenHonorar->dnr,
            'honfaktor' => $honfaktor, 'honsatz' => $dozentenHonorar->honsatz,
            'hongesamt' => $hongesamt, 'fahrtgesamt' => $fahrtgesamt, 'fahrtfaktor' => $fahrtfaktor,
            'fahrtkmsatz' => $dozentenHonorar->fahrtkmsatz,
            'fahrtentfernung' => $dozentenHonorar->fahrtentfernung, 'fahrtdoppelt' => $dozentenHonorar->fahrtdoppelt,
            'spesengrund' => $dozentenHonorar->spesengrund, 'spesen' => $dozentenHonorar->spesen,
            'spesenprotn' => $dozentenHonorar->spesenprotn, 'vertragstext' => $dozentenHonorar->vertragstext,
            'fahrtkostenstatus' => $dozentenHonorar->fahrtkostenstatus, 'keinhonorar' => $dozentenHonorar->keinhonorar,
            'doznamevorname' => $dozentenHonorar->dozent->namevorname, 'fkstatuschecked' => $fkstatuschecked,
            'xsrf' => $xsrfKey
          );

    return JsonOperations::encode4Ajax($hondataObj);
    
  }

  

  
  private function _handleAjaxAddDozentDT()
  {
    $dbwDoz = new DBWorkDozenten();
    $dbwDozHon = new DBWorkDozentenHonorar();

    
    
    
    $aColumns = array('id', 'name', 'vorname', 'strasse', 'ort', 'nurplz', 'tel_anzeige', 'email_anzeige');

    
    
    $iSortCol_0 = GetOperations::getVarValue('iSortCol_0');
    if ($iSortCol_0 != '') {
      $iSortingCols = intval(GetOperations::getVarValue('iSortingCols'));
      
      for ($i = 0; $i < $iSortingCols; $i++) {
        $iSortCol = intval(GetOperations::getVarValue('iSortCol_' . $i));

        
        
        if (GetOperations::getVarValue('bSortable_' . $iSortCol) == 'true') {
          

          $dbwDoz->orderby = $aColumns[$iSortCol];
          $dbwDoz->orderbyasc = GetOperations::getVarValue('sSortDir_' . $i) === 'asc';
        }
      } 
    } 


    
    
    
    $dbwDoz->newSearch();
    for ($i = 0; $i < count($aColumns); $i++) {
      $searchValue = GetOperations::getVarValue('sSearch_' . $i);
      if ($searchValue != '') {
        switch ($aColumns[$i]) {
          default:
          case 'id':
            $dbwDoz->fromobject->id = $searchValue;
            $dbwDoz->toobject->id = '';
            break;
          case 'name':
            $dbwDoz->fromobject->name = $searchValue;
            $dbwDoz->toobject->name = '';
            break;
          case 'vorname':
            $dbwDoz->fromobject->vorname = $searchValue;
            $dbwDoz->toobject->vorname = '';
            break;
          case 'strasse':
            $dbwDoz->fromobject->strasse = $searchValue;
            $dbwDoz->toobject->strasse = '';
            break;
          case 'ort': 
            $dbwDoz->fromobject->ort = $searchValue;
            $dbwDoz->toobject->ort = '';
            break;
          
          case 'nurplz':
            
            
            
            
            break;
        } 
      } 
    } 

    $dozenten = $dbwDoz->getDozenten();

    $dozObjAry = array();
    $knr = GetOperations::getVarValue('nr');

    
    
    $vorhandeneDozHonorare = $dbwDozHon->getHonorarebyKNR($knr);
    $vorhDozNr = array();
    foreach ($vorhandeneDozHonorare as $vorhDozHon) {
      $vorhDozNr[] = $vorhDozHon->dnr;
    }

    
    if (is_array($dozenten)) {
      foreach ($dozenten as $dozent) {
        
        if (!in_array($dozent->id, $vorhDozNr)) {
          
          $dozObj = array('id' => $dozent->id, 'name' => $dozent->name, 'vorname' => $dozent->vorname, 'strasse' => $dozent->strasse,
                    'ort' => $dozent->ort, 'tel_anzeige' => $dozent->tel_anzeige, 'email_anzeige' => $dozent->email_anzeige,
                    'nurplz' => $dozent->nurplz);
          $dozObjAry[] = $dozObj;
        }
      } 
    } 

   
    $iTotal = count($dozObjAry);
    
   $iFilteredTotal = count($dozObjAry); 


    
    
    $sEcho = intval(GetOperations::getVarValue('sEcho'));

    
    $output = array(
      'sEcho' => $sEcho,           
      'iTotalRecords' => $iTotal,
      'iTotalDisplayRecords' => $iFilteredTotal,
      'aaData' => $dozObjAry        
    );

    
    return JsonOperations::encode($output);
    
    
  }

  

  
  private function _handleAjaxNewDozent()
  {
    
   $pageId4Details = 379; 
    
    $data = null;
    
    
    $xsrf = new Xsrf();
    $xsrfKey = $xsrf->generateKey4Action('wt_neuer_dozent');
    $page = new TabPageSightBuilder('Details zum neuen Dozenten', $data, $this->getToolId(), $pageId4Details, true, '', $xsrfKey);

    return JsonOperations::encode4Ajax($page->getAjaxObject4Tab());
  }

  

  
  private function _handleAjaxUmOrWeitermeldenTN($pAction)
  {

    
    $folgeKursNr = PostOperations::getVarValue('folgekurs');
    $knr = $this->getKnr4Kursdetails();
    $xsrf = new Xsrf();
    if ($pAction === 'ummeldenTN') {
      $folgeKursNr = PostOperations::getVarValue('ummeldekurs');
      $xsrfKey = $xsrf->generateKey4Action('wt_ma_ummelden', $knr . '_' . $folgeKursNr);
    } else {
      $xsrfKey = $xsrf->generateKey4Action('wt_ma_weitermelden', $knr . '_' . $folgeKursNr);
    }
    $belegIds = PostOperations::getVarValue('belegIds');


    
    
    $dbwTeiln = new DBWorkTeilnehmer();
    
    
    $dbwBelegung = DBWorkBelegung::getDefaultInstance();

    $alterKursHatAboGebuehren = false;
    if (APIGebuehren::hasKursFortlaufendeGebuehren($knr)) {
      $alterKursHatAboGebuehren = true;
    }
    $neuerKursHatAboGebuehren = false;
    if (APIGebuehren::hasKursFortlaufendeGebuehren($folgeKursNr)) {
      $neuerKursHatAboGebuehren = true;
    }
    $kurseInfosAry = array('alterKursHatAboGebuehren' => $alterKursHatAboGebuehren, 'neuerKursHatAboGebuehren' => $neuerKursHatAboGebuehren);

    $tnObjAry = array();
    
    foreach ($belegIds as $belId) {
      
      $teilnehmer = $dbwTeiln->getTeilnehmByBelegung($belId);
      
      $isInFolgeKurs = false;
      $belegungen4TN = $dbwBelegung->getBelegungenbyKursTeilnehmerNR($folgeKursNr, $teilnehmer->id);
      if (count($belegungen4TN) > 0) {
        
        foreach ($belegungen4TN as $beleg4TN) {
          
          
          $belstatus = $beleg4TN->status;
          if ($belstatus == '' || $belstatus == ' ' || $belstatus == 'A' || $belstatus == 'T' || $belstatus == 'P' || $belstatus == 'U') {
            $isInFolgeKurs = true;
            break;
          }
        } 
      }  

       
      if ($pAction === 'weitermeldenTN') {
        
        $newsLetter = false;
        
        $newsLetterAllow = $teilnehmer->newsl_erlaubt;
        
         if ($teilnehmer->newsl_erlaubt === 'J') { 
           $newsLetter = true;
         }
      } 

      
      $gebuehr = APIGebuehren::getGebuehren($teilnehmer->id, $folgeKursNr);
      
      
      $tnObj = array('id' => $teilnehmer->id, 'name' => $teilnehmer->name, 'vorname' => $teilnehmer->vorname, 'strasse' => $teilnehmer->strasse,
       'ort' => $teilnehmer->ort, 'isInFolgeKurs' => $isInFolgeKurs, 'gebuehr' => $gebuehr, 'vonBelegId' => $belId, 'eintritt' => '');
      
      if ($pAction === 'weitermeldenTN') {
        $newLetterAry = array('newsLetter' => $newsLetter, 'newsLetterAllow' => $newsLetterAllow);
        $tnObj = array_merge($tnObj, $newLetterAry);
      } elseif ($pAction === 'ummeldenTN') {
        $tnObj['austritt'] = '';
      }

      $tnObjAry[] = $tnObj;
    } 
    
    $resultAry = array(
        'teilnehmer' => $tnObjAry,
        'kurseInfos' => $kurseInfosAry,
        'xsrf' => $xsrfKey
    );

    return JsonOperations::encode4Ajax($resultAry);
    
  }

  

  
  private function _handleTerminBearbeiten($pPageId, $pKtid)
  {
    
    $dbwKursTage = new DBWorkKurseTage(1, true, true);
    $kursTag = $dbwKursTage->getKurstag($pKtid);

    $pageLinks['druck'] = '';
    if (\SecurityOperations::privilegAllowed($this->getUser()->getIdentifier(), \ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.1') === 2) {
      $pageLinks['druck'] = 'javascript:window.print();';
    }

    $pageLinks['kurs_rechte'] = $this->_getRechte4KursBearbeiten();

    $page = new PageMaKurstagBearbeiten($this, $kursTag, $pPageId, true);
    $page->setLinks($pageLinks);

    return $page;
  }

  
  private function _handleTerminHinzufuegen($pPageId)
  {
    
    
    $dbwKursTage = new DBWorkKurseTage(1, true, true);
    $kursTag = $dbwKursTage->getNewObject();

    
    
    $knr = $this->getKnr4Kursdetails();

    
    $kursTag->knr = $knr;
    $kursdata = $this->_dbwkurse->getKurs($knr);
    $kursTag->kurs = $kursdata;

    
    
    $dbwDoz = new DBWorkDozenten();
    $hauptdozent = $dbwDoz->getHauptDozent($knr);
    $kursTag->dnr = $hauptdozent->id;
    $kursTag->ort = '';

    
    
    
    $pageLinks['druck'] = 'javascript:window.print();';

    $pageLinks['kurs_rechte'] = $this->_getRechte4KursBearbeiten();

    $page = new PageMaKurstagBearbeiten($this, $kursTag, $pPageId);
    $page->setLinks($pageLinks);

    return $page;
  }

  
  private function _handleKursBearbeiten($pSightId)
  {
    
    $statusMessage = '';
    $dbwKurse = new DBWorkKurseWT(1, true);
    $knr = $this->getKnr4Kursdetails();
    $kurs = $dbwKurse->getKurs($knr, true);

    
    
    if (RequestOperations::getMethod() == 'post') {
      if (Xsrf::KEY_OK == Xsrf::checkAndUseXsrfFromGet('wt_ma_kurs_bearbeiten', $knr)) {
        $builder = new SightBuilder($this->getToolId(), $pSightId, $kurs);
        
        $builder->saveData();
        $validationOK = $builder->checkValidation();

        if ($validationOK) {
          
          $saveResult = KursplanungAPI::saveKurs($builder);
          $statusMessage .= $saveResult['statusMessage'];
        }
      } else {
        $statusMessage = HTMLOperations::getAlertBox('Der Kurs konnte aus technischen Gründen nicht geändert werden.', 'Fehler beim Bearbeiten des Kurses');
      }
    } 
    
    return $statusMessage;
  }

  

  
  private function _handleBelegungBearbeiten($pSightId)
  {
    
    $statusMessage = '';
    $dbwBelegung = new DBWorkBelegung(1, true);
    $belid = PostOperations::getVarValue('belid', -1);
    $belegung = $dbwBelegung->getBelegung($belid);
    
    
    if (RequestOperations::getMethod() == 'post') {
      if (Xsrf::KEY_OK == Xsrf::checkAndUseXsrfFromGet('wt_ma_change_belegung', $belid)) {
        $builder = new SightBuilder($this->getToolId(), $pSightId, $belegung);
        
        $builder->saveData();
        $validationOK = $builder->checkValidation();

        if ($validationOK) {
          $statusMessage = BelegungAPI::saveBelegung($builder);
        }
      } else {
        $statusMessage = HTMLOperations::getAlertBox('Die Belegung konnte aus technischen Gründen nicht geändert werden.', 'Fehler beim Bearbeiten der Belegung');
      }
    } 
    
    return $statusMessage;
  }

  

  
  private function _handleNachlassBearbeiten()
  {
    $allgSettings = AllgSettingsAPI::getAllgSettings();
    
    
    if (SessionOperations::isReplikat() && !$allgSettings->dmzEnabled) {
      return HTMLOperations::getAlertBox('<div class="alertbox_text">' . ' Ein Speichern der Daten zum Nachlass ist im reinen Replikatbetrieb nicht möglich.</div>', 'Fehler', 'in_background');
    }

    if (Xsrf::KEY_OK != Xsrf::checkAndUseXsrfFromGet('wt_nachlass', $this->getKnr4Kursdetails())) {
      return HTMLOperations::getAlertBox('Der Nachlass konnte aus technischen Gründen nicht geändert werden.', 'Fehler beim Ändern des Nachlasses');
    }

    $belId = PostOperations::getVarValue('belid', '');

    $dbwBelegung = new DBWorkBelegung(1, true);
    $belegung = $dbwBelegung->getBelegung($belId);
    $nachlassBetrag = MathOperations::stringToFloat(RequestOperations::getVarValue('nachlassBetrag'));
    $nachlassGrund = RequestOperations::getVarValue('nachlassGrund');
    $origBelegung = $belegung->copy();

    $dbwZahlung = new DBWorkZahlung();
    $zahlungen = $dbwZahlung->getZahlungJournalByBelegId($belId);

    
    if (count($zahlungen) == 0) {
      return HTMLOperations::getAlertBox('<div class="alertbox_text">' . CleanOperations::cleanStringForHtml($allgSettings->failSubmitMsgNachlass) . '</div>', 'Fehler', 'in_background');
    }

    
    $nachlassBetragNegativ = $nachlassBetrag * -1;
    $zahlungenNachlass = ZahlungAPI::getNachlassZahlungen($zahlungen, $nachlassBetragNegativ, $nachlassGrund, 'Nachlass', false);

    $anzFields2Change = 0;
    
    
    if ($nachlassBetrag != 0) {
      $belegung->entgelt = MathOperations::floatToString(MathOperations::stringToFloat($belegung->entgelt) - $nachlassBetrag);
      $belegung->bet_offen = MathOperations::floatToString(MathOperations::stringToFloat($belegung->bet_offen) - $nachlassBetrag);
      
      if ($this->toolSettings->writeNachlassGrund2IntBemerkung) {
        $trenner = !empty($belegung->bemerkung) ? '; ' : '';
        $belegung->bemerkung .= $trenner . $nachlassGrund;
      }

      
      

      $correctFields = array('entgelt', 'bet_offen');
      $anzFields2Change = count($correctFields);
    } 

    $success = '';
    
    if ($anzFields2Change > 0) {
      
      
      
      $success = BelegungAPI::updateBelegung($belegung, $origBelegung);
      
      if ($success) {
        
        $success = ZahlungAPI::insertZahlungen($zahlungenNachlass);
        
        if (!$success) {
          BelegungAPI::updateBelegung($origBelegung, $belegung);
        }
      } 
    }

    if ($success) {
      return HTMLOperations::getSuccessBox('<div class="successbox_text">' . CleanOperations::cleanStringForHtml($allgSettings->successMsgNachlass) . '</div>' . "\n", 'Übermittlung erfolgreich', 'in_background');
    } else {
      return HTMLOperations::getAlertBox('<div class="alertbox_text">' . CleanOperations::cleanStringForHtml($allgSettings->failSubmitMsgNachlass) . '</div>', 'Fehler', 'in_background');
    }
  }

  

  
  private function _handleKursdetails($pPageId = 377, $pStatusMessage = '')
  {

    
    $fromOtherTab = SessionOperations::getVarValueWTIntern($this->toolId . '_fromTab');

    
    
    
    
    if (GetOperations::isDefined('fromOtherTool')) {
      $knr = GetOperations::getVarValue('nr');
      $this->setTotalData(array($knr));
    }
    $knr = $this->getKnr4Kursdetails();

    $data = $this->_dbwkurse->getKurs($knr);
    $pageTitle = 'Kurse';

    
    
    if (GetOperations::getVarValue('showFormular', '') == 'sammelsms' || GetOperations::getVarValue('showFormular', '') == 'dozsammelsms'
       || GetOperations::getVarValue('sendInfo', '') == 'teilnehmersms' || GetOperations::getVarValue('sendInfo', '') == 'dozentsms') {
      return SmsUserAPI::getSMSPage($data, $this, $pageTitle, $pPageId, $knr);
    }

    
    
    if (GetOperations::getVarValue('showFormular', '') == 'nachricht') {
      return KontaktUserAPI::buildKontaktForm($data, $this, $pageTitle, $pPageId, $knr, 'teilnehmer');
    }

    if (GetOperations::getVarValue('showFormular', '') == 'sammelmaildoz') {
      return KontaktUserAPI::buildKontaktForm($data, $this, $pageTitle, $pPageId, $knr, 'dozent');
    }

    
    elseif (GetOperations::getVarValue('showFormular', '') == 'feedback') {
      return FeedbackUserAPI::buildFeedbackForm($data, $this, $pageTitle, $pPageId, $knr);
    }

    
    elseif (GetOperations::getVarValue('showFormular', '') == 'bescheinigung') {
      $belegungIDs = GetOperations::getVarValue('belids');

      return BescheinigungUserAPI::getBescheinigung($data, $this, $pageTitle, $pPageId, $knr, $belegungIDs);
    }
    
    elseif (GetOperations::getVarValue('showFormular', '') == 'kursortsms') {
      
      
      $tab = GetOperations::getVarValue('tab', '');

      return SmsUserAPI::getSMSPage4Kursort(
        $data,
        $this,
        $pageTitle,
        $pPageId,
        $this->tool0Settings->showSmsBetreff,
        $tab,
        false,
        RequestOperations::getVarValue('currentIndex')
      );
    }

    
    elseif (($getSendInfo = GetOperations::getVarValue('sendInfo', '')) != '') {
      
      if ($getSendInfo == 'teilnehmer' || $getSendInfo == 'dozent') {
        return KontaktUserAPI::postKontaktForm($data, $this, $pageTitle, $pPageId, $getSendInfo);
      }
      
      elseif ($getSendInfo == 'vhs') {
        return FeedbackUserAPI::postFeedback($data, $this, $pageTitle, $pPageId);
      }
      
      elseif ($getSendInfo == 'kursortsms') {
        $tab = GetOperations::getVarValue('tab', '');

        return SmsUserAPI::getSMSPage4Kursort(
          $data,
          $this,
          $pageTitle,
          $pPageId,
          $this->tool0Settings->showSmsBetreff,
          $tab,
          true,
          RequestOperations::getVarValue('currentIndex')
        );
      }
    } 

    
    if ($this->_user->ben <= 0 && !$this->_user->isAdmin()) {
      $page = new PageWTDefault($pageTitle, $pPageId, $this);
      $page->setContent('<h2>Sie sind nicht berechtigt sich diese Informationen anzusehen!</h2>');
    } else {
      
      
      if (PostOperations::getVarValue('upload', '') == 1 && PostOperations::isDefined('dokInfo_1')) {
        if (Xsrf::KEY_OK == Xsrf::checkAndUseXsrfFromGet('wt_upload')) {
          
          $processResult = DokuUploadUserAPI::performDokuUpload($_FILES, $this->getToolId());
          
          
          
          $statusMessage = '<div id="statusMessage">' . $processResult['message'] . '</div>';
          $uploadMeldung = $processResult['message'];
          $uploadResult = $processResult['process'];
        } else {
          $statusMessage = HTMLOperations::getAlertBox('Die Dokumente konnten aus technischen Gründen nicht hochgeladen werden.', 'Fehler beim Hochladen der Dokumente');
          $uploadMeldung = '';
          $uploadResult = UPLOAD_NOT_OK;
        }
      }  

      
      elseif (PostOperations::getVarValue('releaseDoku', '') == 1 && PostOperations::isDefined('kurse4release')) {
        if (Xsrf::KEY_OK == Xsrf::checkAndUseXsrfFromGet('wt_dokument_release', PostOperations::getVarValue('dokumentid'))) {
          
          $selectedKursnrAry = explode(':', PostOperations::getVarValue('kurse4release', ''));
          
          $processResult = DokuUploadUserAPI::performDokuRelease($this, $selectedKursnrAry);
          
          
          $statusMessage = '<div id="statusMessage">' . $processResult['message'] . '</div>';
          $uploadMeldung = $processResult['message'];
          $uploadResult = $processResult['process'];
        } else {
          $statusMessage = HTMLOperations::getAlertBox('Das Dokument konnten aus technischen Gründen nicht freigegeben werden.', 'Fehler beim Freigeben des Dokuments');
          $uploadMeldung = '';
          $uploadResult = UPLOAD_NOT_OK;
        }
        
      }
      
      elseif (PostOperations::getVarValue('deleteDoku', '') == 1) {
        $dokumentid = PostOperations::getVarValue('dokumentid');
        if (Xsrf::KEY_OK == Xsrf::checkAndUseXsrfFromGet('wt_dokument_delete', $dokumentid)) {
          $delInfo = $this->_handleDokumenteDelete();
          $uploadMeldung = '';
          
          $statusMessage = $delInfo['statusMessage'];
          $uploadResult = NO_UPLOAD;
        } else {
          $statusMessage = HTMLOperations::getAlertBox('Das Dokument konnte aus technischen Gründen nicht gelöscht werden.', 'Fehler beim Löschen des Dokuments');
          $uploadMeldung = '';
          $uploadResult = UPLOAD_NOT_OK;
        }
      }
      
      elseif (PostOperations::getVarValue('changeDoku', '') == 1) {
        $changeInfo = $this->_handleDokumentBearbeiten();
        $uploadMeldung = '';
        
        $statusMessage = $changeInfo['statusMessage'];
        $uploadResult = NO_UPLOAD;
      }
      
      elseif (PostOperations::getVarValue('deleteTermine', '') == 1) {
        $delInfo = $this->_handleTermineDelete();
        $uploadMeldung = '';
        
        $statusMessage = $delInfo['statusMessage'];

        
        
        if ((strripos($statusMessage, 'hinweisbox_alertbox', 0) === false)) {
          $statusMessage .= $this->_handlePasstKursZuKurstage();
        }

        $uploadResult = NO_UPLOAD;
      }
      
      elseif (PostOperations::getVarValue('dozHonorar', '') == 1) {
        $dozHonInfo = $this->_handleDozHonData();
        $uploadMeldung = '';
        
        $statusMessage = $dozHonInfo['statusMessage'];
        $uploadResult = NO_UPLOAD;
      }
      
      elseif (PostOperations::getVarValue('dozVertrag', '') == 1) {
        $dozContractInfo = $this->_handleDozContractData();
        $uploadMeldung = '';
        
        $statusMessage = $dozContractInfo['statusMessage'];
        $uploadResult = NO_UPLOAD;
      }
      
      elseif (PostOperations::getVarValue('addDozent', '') == 1) {
        $xsrfOk = Xsrf::KEY_OK == Xsrf::checkAndUseXsrfFromGet('wt_add_doz', $data->id);
        if ($xsrfOk) {
          $dozId = PostOperations::getVarValue('dozId', '');
          
          $dozInfo = $this->_handleDozAdd2Kurs($dozId);
          
          $statusMessage = $dozInfo['statusMessage'];
        } else {
          $statusMessage = HTMLOperations::getAlertBox(
            'Aus technischen Gründen konnte der Dozent nicht hinzugefügt werden.',
            'Fehler beim Hinzufügen des Dozenten'
          );
        }
        $uploadMeldung = '';
        $uploadResult = NO_UPLOAD;
      }
      
      elseif (PostOperations::getVarValue('deleteDozent', '') == 1) {
        $xsrfOk = Xsrf::KEY_OK == Xsrf::checkAndUseXsrfFromGet('wt_delete_doz', $data->id);
        if ($xsrfOk) {
          $delInfo = $this->_handleDozDeleteFromKurs($data);
          
          $statusMessage = $delInfo['statusMessage'];
        } else {
          $statusMessage = HTMLOperations::getAlertBox(
            'Aus technischen Gründen konnte der Dozent nicht gelöscht werden.',
            'Fehler beim Löschen des Dozenten'
          );
        }
        $uploadMeldung = '';
        $uploadResult = NO_UPLOAD;
      }
      
      elseif (PostOperations::getVarValue('newDozent', '') == 1) {
        $detailsSightId = 379;
        $statusMessage = $this->_handleNewDoz2Kurs($detailsSightId);
        $uploadMeldung = '';
        $uploadResult = NO_UPLOAD;
      }
      
      elseif (PostOperations::getVarValue('weitermeldenTN_nohistory', '') == 1) {
        
        $statusMessage = $this->_handleWeitermeldenTN($data->id, 242);
        $uploadMeldung = '';
        $uploadResult = NO_UPLOAD;
      }
      
      
      
      elseif (PostOperations::getVarValue('ummeldenTN_nohistory', '') == 1) {
        

        $statusMessage = $this->_handleUmmeldenTN($data->id, 242);
        $uploadMeldung = '';
        $uploadResult = NO_UPLOAD;
      }

      
      else {
        $uploadMeldung = '';
        
        $statusMessage = $pStatusMessage;
        $uploadResult = NO_UPLOAD;
        
      }
      $page = $this->_showKursdetails($data, $pPageId, $uploadResult, $uploadMeldung, $statusMessage, $fromOtherTab);
    } 

    return $page;
  }

  

  
  private function _handleStorno($pBelegungAry)
  {
    if (Xsrf::KEY_OK != Xsrf::checkAndUseXsrfFromGet('wt_storno', $this->getKnr4Kursdetails())) {
      return HTMLOperations::getAlertBox('Die Teilnehmer konnte aus technischen Gründen nicht Storniert werden.', 'Fehler beim Stornieren der Teilnehmer');
    }

    $sprachsettings = new SprachSettingsObject();

    $successBelgungenDirektOrDMZ = array();
    $successBelgungenEmail = array();
    $errorBelegungen = array();

    foreach ($pBelegungAry as $pBelegung) {
      $stornoGrund = PostOperations::getVarValue('storno_grund_' . $pBelegung->id, '');
      if (APIGebuehren::hasKursFortlaufendeGebuehren($pBelegung->knr)) {
        $austritt = PostOperations::getVarValue('austritt_' . $pBelegung->id, '');
        $success = StornoAPI::handleStornoKursMitAboGebuehr($pBelegung, $stornoGrund, $austritt);
      } else {
        $mailAddress = EmailOperations::getToolEmailAddressForVhs($this->toolSettings->vhsEmailTool8Section242);
        $success = StornoAPI::handleStorno($mailAddress, $pBelegung, $sprachsettings, 'S', $stornoGrund, $this->toolSettings);
      }

      if ($success === StornoAPI::SEND_SUCCESSFUL_PER_DIREKT || $success === StornoAPI::SEND_SUCCESSFUL_PER_DMZ) {
        $successBelgungenDirektOrDMZ[] = $pBelegung;
      } elseif ($success === StornoAPI::SEND_SUCCESSFUL_PER_EMAIL) {
        $successBelgungenEmail[] = $pBelegung;
      } else { 
        $errorBelegungen[] = $pBelegung;
      }
    }
    $msg = '';
    if (count($successBelgungenDirektOrDMZ) > 0) {
      $msg .= $this->_getSuccessMessage4Storno($successBelgungenDirektOrDMZ);
    }
    if (count($successBelgungenEmail) > 0) {
      $msg .= $this->_getEMailInfoMessage4Storno($successBelgungenEmail, $sprachsettings);
    }
    if (count($errorBelegungen) > 0) {
      $msg .= $this->_getErrorMessage4Storno($errorBelegungen);
    }

    return $msg;
  }

  
  private function _getSuccessMessage4Storno($pBelegungAry)
  {
    $teilnehmerList = '';
    foreach ($pBelegungAry as $belegung) {
      $teilnehmerList .= '<div>' . CleanOperations::cleanStringForHtml($belegung->teilnehmer->namevorname) . '</div>';
    }
    $meldung = 'Für folgende Teilnehmer wurde erfolgreich eine Stornierung durchgeführt:';

    return HTMLOperations::getSuccessBox('<div class="successbox_text"><div>' . $meldung . '</div>' . BR_WT . $teilnehmerList . '</div>', 'Erfolgreich storniert', 'in_background');
  }

  
  private function _getEMailInfoMessage4Storno($pBelegungAry, $pSprachsettings)
  {
    $teilnehmerList = '';
    
    foreach ($pBelegungAry as $belegung) {
      $teilnehmerList .= '<div>' . $belegung->teilnehmer->namevorname . '</div>';
      $hinderungsGruendeAry = StornoAPI::getHinderungsGruende($belegung);
      if (count($hinderungsGruendeAry) > 0) {
        $teilnehmerList .= '<ul>';
        foreach ($hinderungsGruendeAry as $grund) {
          $teilnehmerList .= '<li> - ' . StornoAPI::getText4HinderungsKonstanten($grund, $belegung, $pSprachsettings) . '</li>';
        }
        $teilnehmerList .= '</ul>';
      }
      $teilnehmerList .= BR_WT;
    }
    $teilnehmerList .= '<div>Eine E-Mail mit den gewünschten Abmeldungen wurde an die Einrichtung versendet.</div>';

    $meldung = 'Für folgende Teilnehmer wurde eine E-Mail mit der Stornoanfrage an die Einrichtung versendet:';

    return HTMLOperations::getInfoBox('<div class="infobox_text"><div>' . $meldung . '</div>'
                                       . BR_WT . $teilnehmerList . '</div>', 'Stornierung per E-Mail versendet', 'in_background');
  }

  
  private function _getErrorMessage4Storno($pBelegungAry)
  {
    $teilnehmerList = '';
    foreach ($pBelegungAry as $belegung) {
      $teilnehmerList .= '<div>' . CleanOperations::cleanStringForHtml($belegung->teilnehmer->namevorname) . '</div>';
    }
    $meldung = 'Folgende Teilnehmer wurden nicht storniert, da ein Fehler aufgetreten ist. Bitte versuchen Sie es erneut, oder wenden Sie sich an die Einrichtung:';

    return HTMLOperations::getAlertBox('<div class="alertbox_text"><div>' . $meldung . '</div>' . BR_WT . $teilnehmerList . '</div>', 'Fehler beim Versenden der Stornierung', 'in_background');
  }

  
  protected function _handleWeitermeldenTN($pKnr, $pPageId)
  {
    $allgSettings = AllgSettingsAPI::getAllgSettings();
    
    
    
    $kursNr = PostOperations::getVarValue('knr');  

    $xsrfOk = Xsrf::checkAndUseXsrfFromGet('wt_ma_weitermelden', $pKnr . '_' . $kursNr) == Xsrf::KEY_OK;

    if ($this->isRefreshed() || !$xsrfOk) {
      
      
      return '';
    }

    $teilnehmerObjAry = array();

    $weiterMeldeText = 'Für folgende Teilnehmer wurde eine Weitermeldung an den Folgekurs ' . $kursNr . ' erfolgreich durchgeführt: ' . BR;
    $fehlerMeldeText = 'Für folgenden Teilnehmer konnte die Weitermeldung an den Folgekurs ' . $kursNr . ' wegen eines Fehlers NICHT durchgeführt werden: ' . BR;

    
    if (PostOperations::getVarValue('teilnehmerObjAry') != '') {
      
      $teilnehmerObjAry = JsonOperations::getFromStringBase64(PostOperations::getVarValue('teilnehmerObjAry'));
    }

    $tnAry4WeiterMelden = array();
    $tnAryFault4WeiterMelden = array();

    $anmeldeStaticSight = new AnmeldeStaticSight();
    $dbwTeiln = new DBWorkTeilnehmer();
    

    $tnUpdFaultStatusMessage = '';
    $tnAry4FaultStatus = array();
    $tnUpd4EntryOK = true; 

    
    foreach ($teilnehmerObjAry as $tnObj) {
      
      SessionOperations::setVarValueIntern('w_eintritt', $tnObj->eintritt);
      
      
      $tnUpdateInfoObj = $this->updateSomeEntry4Teilnehmer($dbwTeiln, $tnObj, $allgSettings);

      $tnAry4FaultStatus[] = $tnUpdateInfoObj['tnName4Status'];

      $tnUpd4EntryOK = $tnUpd4EntryOK & $tnUpdateInfoObj['tnUpdOK'];

      
      
      $tmpSession = $_SESSION;
      $anmeldevorgangAr = $anmeldeStaticSight->doAnmeldung($tnObj->id, $kursNr);
      $success = $anmeldevorgangAr[0];
      $_SESSION = $tmpSession;

      if ($success) {
        
        
        $tnAry4WeiterMelden[] = array('id' => $tnObj->id, 'name_vorname' => $tnObj->name . ', ' . $tnObj->vorname, 'zahlung' => false);
        $weiterMeldeText .= ' Name: ' . CleanOperations::cleanStringForHtml($tnObj->name) . ' , ' . CleanOperations::cleanStringForHtml($tnObj->vorname) . BR;
      } else { 
        $tnAryFault4WeiterMelden[] = array('id' => $tnObj->id, 'name_vorname' => $tnObj->name . ', ' . $tnObj->vorname, 'zahlung' => false);
        $fehlerMeldeText .= ' Name: ' . CleanOperations::cleanStringForHtml($tnObj->name) . ' , ' . CleanOperations::cleanStringForHtml($tnObj->vorname) . BR;
      }
    } 

    $tnNames4FaultStatus = '';
    
    if (!$tnUpd4EntryOK) {
      foreach ($tnAry4FaultStatus as $tnObjName) {
        $tnNames4FaultStatus .= '<div>' . CleanOperations::cleanStringForHtml($tnObjName) . '</div>';
      }

      $tnUpdFaultStatusMessage .= '<div class="warningbox_text" style="color:#FF0000;">' . CleanOperations::cleanStringForHtml($allgSettings->failMsgChangeTeilnNewsletter) . $tnNames4FaultStatus . '</div>';
    }

    $weiterMeldeTextDiv = '';
    $weitermeldeCount = count($tnAry4WeiterMelden);
    $fehlermeldeCount = count($tnAryFault4WeiterMelden);

    
    
    if ($weitermeldeCount > 0) {
      $weiterMeldeTextDiv = '<div class="successbox_text weitermelden">' . $weiterMeldeText . '</div>';
      
      if ($this->toolSettings->meldeImmerBenachrichtigungsMail) {
        $this->_sendSimpleMeldeMail($pPageId, $tnAry4WeiterMelden, $pKnr, $kursNr, false, true);
      }
    }

    
    if ($fehlermeldeCount > 0) {
      $fehlerMeldeTextDiv = '<div class="alertbox_text fehlermelden">' . $fehlerMeldeText . '</div>';
      $statusMessage = HTMLOperations::getWarningBox($weiterMeldeTextDiv . $fehlerMeldeTextDiv, 'Fehler beim Weitermelden', 'in_background');
    } else {
      $statusMessage = HTMLOperations::getSuccessBox($weiterMeldeTextDiv . $tnUpdFaultStatusMessage, 'Weitermelden erfolgreich', 'in_background');
    }

    
    
    
    return $statusMessage;
  }

  

  
  private function updateSomeEntry4Teilnehmer($pDbwTeiln, $pTnObj, $pAllgSettings)
  {
    $entryUpd4TeilnOK = true;
    
    
    $teilnehmer = $pDbwTeiln->getTeilnehm($pTnObj->id, true);
    $origTeilnehmer = clone $teilnehmer;

    
    
    
    $changedFields = array();
    if ($teilnehmer->newsl_erlaubt != $pTnObj->newsLetterAllow) {
      $changedFields = array('newsl_erlaubt');
      
      $teilnehmer->newsl_erlaubt = $pTnObj->newsLetterAllow;
    }

    try {
      if (SessionOperations::isReplikat() && $pAllgSettings->dmzEnabled) {
        
        $teilnehmerTuple = new Tuple($teilnehmer, $changedFields, $origTeilnehmer);
        TeilnehmerAPI::correctTeilnehmer($teilnehmerTuple, 'update');
        
        
        
        $pDbwTeiln->updateTeilnehmer($teilnehmer, true);
      } 
      else {
        
        $pDbwTeiln->updateTeilnehmer($teilnehmer, false);
      }

      
    } 
    catch (Exception $e) {
      $entryUpd4TeilnOK = false;
      Logger::logg('Teilnehmerupdate - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n" . ' [' . $e->getTraceAsString() . ']', 200);
    }

    return array('tnUpdOK' => $entryUpd4TeilnOK, 'tnName4Status' => $pTnObj->name . ', ' . $pTnObj->vorname);
  }

  

  
  protected function _handleUmmeldenTN($pKnr, $pPageId)
  {
    
    
    
    $statusMessage = '';

    
    $kursNr = PostOperations::getVarValue('knr');

    $xsrfOk = Xsrf::checkAndUseXsrfFromGet('wt_ma_ummelden', $pKnr . '_' . $kursNr) == Xsrf::KEY_OK;
    if ($this->isRefreshed() || !$xsrfOk) {
      
      
      return $statusMessage;
    }

    $teilnehmerObjAry = array();

    $successText = 'Für folgende Teilnehmer wurde eine Ummeldung nach Kurs ' . CleanOperations::cleanStringForHtml($kursNr) . ' erfolgreich durchgeführt: ' . BR;
    $errorText = 'Für folgende Teilnehmer konnte die Ummeldung nach Kurs ' . CleanOperations::cleanStringForHtml($kursNr) . ' wegen eines Fehlers nicht durchgeführt werden: ' . BR;

    try {
      
      if (PostOperations::isDefined('teilnehmerObjAry') && PostOperations::getVarValue('teilnehmerObjAry') != '') {
        
        $teilnehmerObjAry = JsonOperations::getFromStringBase64(PostOperations::getVarValue('teilnehmerObjAry'));
      }

      $hasKursAboGebuehren = APIGebuehren::hasKursFortlaufendeGebuehren($pKnr);

      $tnUmmeldenSuccessCount = 0;
      $tnUmmeldenErrorCount = 0;
      
      if (!SessionOperations::isReplikat() || SessionOperations::isDmzBetrieb()) {
        $infoText = 'Die folgenden Teilnehmer werden aus folgenden Gründen nicht automatisch nach Kurs ' . CleanOperations::cleanStringForHtml($kursNr) . ' umgemeldet: ' . BR;
        
        if (!SessionOperations::isReplikat()) {
          $ummeldeAry = $this->_getUmmeldenTeilnehmerDirekt($teilnehmerObjAry, $kursNr);
        } else {
          $ummeldeAry = $this->_getUmmeldenTeilnehmerDMZ($teilnehmerObjAry, $kursNr);
        }
        
        $tnUmmeldenSuccessAry = $ummeldeAry['tnUmmeldenSuccessAry'];
        $tnUmmeldenErrorAry = $ummeldeAry['tnUmmeldenErrorAry'];
        
        
        $tnMitHindernisGruendeAry = $ummeldeAry['tnMitHindernisGruendeAry'];
        $tnUmmeldenSuccessCount = count($tnUmmeldenSuccessAry);
        $tnUmmeldenErrorCount = count($tnUmmeldenErrorAry);
        $tnMitHindernisGruendeCount = count($tnMitHindernisGruendeAry);

        foreach ($tnUmmeldenSuccessAry as $tnUmmeldenSuccessObj) {
          $successText .= CleanOperations::cleanStringForHtml($tnUmmeldenSuccessObj['name_vorname']) . BR;
        }

        foreach ($tnUmmeldenErrorAry as $tnUmmeldenErrorObj) {
          $errorText .= CleanOperations::cleanStringForHtml($tnUmmeldenErrorObj['name_vorname']) . BR;
        }

        
        if ($tnMitHindernisGruendeCount > 0) {
          $infoText .= $ummeldeAry['grundInfo']; 
          if (!$hasKursAboGebuehren) {
            $infoText .= 'Es wurde eine E-Mail mit den gewünschten Ummeldungen an die Einrichtung versendet.';
          } else {
            $infoText .= 'Führen Sie bitte die Abmeldung vom alten Kurs und Anmeldung zum neuen Kurs separat durch.';
          }
        }
      } 

      else { 
        $infoText = 'Für folgende Teilnehmer wurde ein Ummeldewunsch nach Kurs ' . CleanOperations::cleanStringForHtml($kursNr) . ' per E-Mail an die Einrichtung versendet: ' . BR;
        
        $tnUmmeldenSuccessAry = array();
        
        foreach ($teilnehmerObjAry as $tnObj) {
          $teilnehmerEmailObj = array('id' => $tnObj->id, 'name_vorname' => $tnObj->name . ', ' . $tnObj->vorname, 'zahlung' => false);
          $tnMitHindernisGruendeAry[] = $teilnehmerEmailObj;
          $infoText .= CleanOperations::cleanStringForHtml($teilnehmerEmailObj['name_vorname']) . BR;
        } 
        $tnMitHindernisGruendeCount = count($tnMitHindernisGruendeAry);
        Logger::logg('Teilnehmer ummelden: Nur Replikatbetrieb (ohne DMZ); keine automatische Ummeldung möglich', 200);
      } 

      
      
      
      if ($tnUmmeldenSuccessCount > 0 && (!SessionOperations::isReplikat() || SessionOperations::isDmzBetrieb())) {
        
        if ($this->toolSettings->meldeImmerBenachrichtigungsMail) {
          $this->_sendSimpleMeldeMail($pPageId, $tnUmmeldenSuccessAry, $pKnr, $kursNr, true, true);
        }
      }

      
      
      
      if ($tnMitHindernisGruendeCount > 0) {
        if (!$hasKursAboGebuehren) {
          
          $this->_sendSimpleMeldeMail($pPageId, $tnMitHindernisGruendeAry, $pKnr, $kursNr, true, false);
        }
        
        
      }

      if ($tnUmmeldenErrorCount > 0) {
        $errorTextDiv = '<div class="alertbox_text fehlermelden">' . $errorText . '</div>';
        $statusMessage .= HTMLOperations::getWarningBox($errorTextDiv, 'Fehler beim Ummelden', 'in_background');
      }
      if ($tnMitHindernisGruendeCount > 0) {
        $infoTextDiv = '<div class="alertbox_text melden">' . $infoText . '</div>';
        $statusMessage .= HTMLOperations::getInfoBox($infoTextDiv, 'Ummeldewunsch per E-Mail versandt', 'in_background');
      }
      if ($tnUmmeldenSuccessCount > 0) {
        $successTextDiv = '<div class="successbox_text melden">' . $successText . '</div>';
        $statusMessage .= HTMLOperations::getSuccessBox($successTextDiv, 'Ummelden erfolgreich', 'in_background');
      }
    } 
    catch (Exception $e) {
      Logger::logg('Ummelden von Belegungen - folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);
      $errorText = 'Das Ummelden der Belegungen war aufgrund technischer Probleme nicht möglich.';
      $errorTextDiv = '<div class="alertbox_text fehlermelden">' . $errorText . '</div>';
      $statusMessage .= HTMLOperations::getWarningBox($errorTextDiv, 'Fehler beim Ummelden', 'in_background');
    }

    return $statusMessage;
  }

  

  
  private function _getUmmeldenTeilnehmerDirekt($pTeilnehmerObjAry, $pKursNr)
  {
    $ummeldeAry = array('tnUmmeldenSuccessAry' => array(), 'tnUmmeldenErrorAry' => array(), 'tnMitHindernisGruendeAry' => array(), 'grundInfo' => '');
    $tnUmmeldenSuccessAry = array();
    $tnUmmeldenErrorAry = array();
    $tnMitHindernisGruendeAry = array();
    $grundInfo = '';
    $dbwBelegung = DBWorkBelegung::getDefaultInstance();
    $anmeldeStaticSight = new AnmeldeStaticSight();

    foreach ($pTeilnehmerObjAry as $tnObj) {
      
      SessionOperations::setVarValueIntern('w_eintritt', $tnObj->eintritt);
      
      
      $belegung = $dbwBelegung->getBelegung($tnObj->vonBelegId);
      
      $gruendeAry = $this->_getHindernisGruende4Ummelden($belegung, $dbwBelegung, $pKursNr);
      $gruende = $gruendeAry['gruende'];
      $zahlungErfolgt = $gruendeAry['zahlungErfolgt'];
      
      if (count($gruende) == 0) {
        
        
        

        
        
        $tmpSession = $_SESSION;
        $bemerkung = 'KuferTools umgemeldet aus ' . $belegung->knr;
        $anmeldevorgangAr = $anmeldeStaticSight->doAnmeldung($tnObj->id, $pKursNr, null, $bemerkung);
        $success = $anmeldevorgangAr[0];
        $_SESSION = $tmpSession;

        
        if ($success) {
          
          
          $dbwBelegung->doUmmeldeStorno($belegung->id, $tnObj->austritt, $pKursNr);
          
          
          $tnUmmeldenSuccessAry[] = array('id' => $tnObj->id, 'name_vorname' => $tnObj->name . ', ' . $tnObj->vorname, 'zahlung' => false);
        } else { 
          $tnUmmeldenErrorAry[] = array('id' => $tnObj->id, 'name_vorname' => $tnObj->name . ', ' . $tnObj->vorname, 'zahlung' => false);
        }
      } 
      else {
        
        
        
        
        $tnMitHindernisGruendeAry[] = array('id' => $tnObj->id, 'name_vorname' => $tnObj->name . ', ' . $tnObj->vorname, 'zahlung' => $zahlungErfolgt);
        $grundInfo .= $tnObj->name . ', ' . $tnObj->vorname . BR;

        foreach ($gruende as $grund) {
          
          $grundInfo .= $grund . BR;
        }
        $grundInfo .= BR;
      } 
    } 

    $ummeldeAry['tnUmmeldenSuccessAry'] = $tnUmmeldenSuccessAry;
    $ummeldeAry['tnUmmeldenErrorAry'] = $tnUmmeldenErrorAry;
    $ummeldeAry['tnMitHindernisGruendeAry'] = $tnMitHindernisGruendeAry;
    $ummeldeAry['grundInfo'] = $grundInfo;

    return $ummeldeAry;
  }

  

  
  private function _getUmmeldenTeilnehmerDMZ($pTeilnehmerObjAry, $pKursNr)
  {
    $ummeldeAry = array('tnUmmeldenSuccessAry' => array(), 'tnUmmeldenErrorAry' => array(), 'tnMitHindernisGruendeAry' => array(), 'grundInfo' => '');
    $tnUmmeldenSuccessAry = array();
    $tnUmmeldenErrorAry = array();
    $tnMitHindernisGruendeAry = array();
    $grundInfo = '';
    $belDmzAry = array();
    $dbwBelegung = DBWorkBelegung::getDefaultInstance();
    foreach ($pTeilnehmerObjAry as $tnObj) {
      
      
      $belegung = $dbwBelegung->getBelegung($tnObj->vonBelegId);
      
      $gruendeAry = $this->_validateBelegungWithDmz($belegung);
      $gruende = $gruendeAry['gruende'];
      $zahlungErfolgt = $gruendeAry['zahlungErfolgt'];
      
      if (count($gruende) == 0) {
        
        
        

        $belDmzEntry = array('id' => $belegung->id, 'tnr' => $belegung->tnr, 'knr' => $belegung->knr,
            'name_vorname' => $tnObj->name . ', ' . $tnObj->vorname, 'eintritt' => $tnObj->eintritt, 'austritt' => $tnObj->austritt);
        $belDmzAry[] = $belDmzEntry;
      }  
      else {
        
        
        
        
        $tnMitHindernisGruendeAry[] = array('id' => $tnObj->id, 'name_vorname' => $tnObj->name . ', ' . $tnObj->vorname, 'zahlung' => $zahlungErfolgt);
        $grundInfo .= $tnObj->name . ', ' . $tnObj->vorname . BR;
        foreach ($gruende as $grund) {
          $grundInfo .= $grund . BR;
        }
        $grundInfo .= BR;
      } 
    }

    
    
    
    $successAry = array();
    if (count($belDmzAry) > 0) {
      
      
      
      
      $ummeldenHelper = new Kufer\KuferTools\Utils\Ummelden\UmmeldenDMZHelper();
      $abgleichResult = $ummeldenHelper->ummeldenDMZ($belDmzAry, $pKursNr);
      $successAry = json_decode($abgleichResult->reason, true);
    }

    
    foreach ($belDmzAry as $belDmzEntry) {
      
      $belId = $belDmzEntry['id'];
      

      $index = $this->_getEntry($successAry, $belId);
      
      if (($index >= 0) && $successAry[$index]['Success']) {
        

        
        
        $tnUmmeldenSuccessAry[] = array('id' => $belDmzEntry['tnr'], 'name_vorname' => $belDmzEntry['name_vorname'], 'zahlung' => false);
      } else {
        
        $tnUmmeldenErrorAry[] = array('id' => $belDmzEntry['tnr'], 'name_vorname' => $belDmzEntry['name_vorname'], 'zahlung' => false);
      }
    } 

    $ummeldeAry['tnUmmeldenSuccessAry'] = $tnUmmeldenSuccessAry;
    $ummeldeAry['tnUmmeldenErrorAry'] = $tnUmmeldenErrorAry;
    $ummeldeAry['tnMitHindernisGruendeAry'] = $tnMitHindernisGruendeAry;
    $ummeldeAry['grundInfo'] = $grundInfo;

    return $ummeldeAry;
  }

  

  
  private function _getEntry($pAry, $pBelid)
  {
    
    $index = -1;
    $count = count($pAry);
    for ($i = 0; $i < $count; $i++) {
      if ($pAry[$i]['Belid'] == $pBelid) {
        $index = $i;
        break;
      }
    }  

    return $index;
  }

  

  
  private function _getHindernisGruende4Ummelden($pBelegung, $pDbwBelegung, $pKursNr)
  {
    $sprachsettings = new SprachSettingsObject();
    $gruende = array();
    $zahlungErfolgt = false;

    
    $dbwKurse = DBWorkKurse::getDefaultInstance();
    $zielKurs = $dbwKurse->getKurs($pKursNr);

    $hasKursAboGebuehren = APIGebuehren::hasKursFortlaufendeGebuehren($pBelegung->kurs->id);

    
    if ($pDbwBelegung->isTeilEinerMehrfachAnmeldung($pBelegung->id)) {
      $gruende[] = ucfirst($sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ']) . ' ist Teil einer Firmen- bzw. Mehrfachanmeldung.';

      return array('gruende' => $gruende, 'zahlungErfolgt' => false);
    }

    if ($pDbwBelegung->IsElternKindanmeldung($pBelegung)) {
      $gruende[] = ucfirst($sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ']) . ' ist mit Kinder angemeldet.';

      return array('gruende' => $gruende, 'zahlungErfolgt' => false);
    }

    if (!$hasKursAboGebuehren) {
      
      
      
      if ($pBelegung->kurs->abschluss == 'J') {
        $gruende[] = ucfirst($sprachsettings->Kurs['Singular_mit_Artikel']['Nominativ']) . ' ' . $pBelegung->kurs->id
                . ' ist bereits abgeschlossen';

        return array('gruende' => $gruende, 'zahlungErfolgt' => false);
      }

      
      if ($zielKurs->abschluss == 'J') {
        $gruende[] = ucfirst($sprachsettings->Kurs['Singular_mit_Artikel']['Nominativ']) . ' ' . $zielKurs->id
                . ' ist bereits abgeschlossen';

        return array('gruende' => $gruende, 'zahlungErfolgt' => false);
      }
      
      
      $dbwZahlung = DBWorkZahlung::getDefaultInstance();
      
      
      if (!$dbwZahlung->isStornoBzglZahlungOkForBelegung($pBelegung->id)) {
        $gruende[] = 'Aufgrund bereits erfolgter Zahlungen/Rechnungen ist eine Ummeldung nicht möglich.';
        $zahlungErfolgt = true;
      }
      
      if (!in_array($pBelegung->status, array('A', 'T', 'P', ' ', ''))) {
        $gruende[] = ucfirst($sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ']) . ' ist nicht mit Status angemeldet in ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'];
      }
    }

    
    return array('gruende' => $gruende, 'zahlungErfolgt' => $zahlungErfolgt);
  }

  

  
  protected function _sendSimpleMeldeMail($pPageId, $pTeilnehmerAry, $pVonKnr, $pNachKnr, $pIsUmmeldung, $pSucces4Melden = false)
  {
    $sprachsettings = new SprachSettingsObject();
    $dbwkurse = new DBWorkKurse();
    $fromKurs = $dbwkurse->getKurs($pVonKnr);
    $toKurs = $dbwkurse->getKurs($pNachKnr);

    $meldungsBez = 'Weitermeldung';
    $mailSubject = 'Kurs Weitermelden';
    $vonPart = ' von ' . $sprachsettings->Kurs['Singular']['Dativ'] . ' ' . $pVonKnr;
    if ($pIsUmmeldung) {
      $meldungsBez = 'Ummeldung';
      $mailSubject = 'Kurs Ummelden';
      $vonPart = ' von ' . $sprachsettings->Kurs['Singular']['Dativ'] . ' "' . $fromKurs->getVarValue('kurzbez_titel') . "\" ($pVonKnr)";
    }
    $ansprache4Teilnehmer = $sprachsettings->Teilnehmer['Singular']['Akkusativ'];
    if (count($pTeilnehmerAry) > 1) {
      $ansprache4Teilnehmer = $sprachsettings->Teilnehmer['Plural']['Akkusativ'];
    }
    
    
    $text = 'Für folgende ' . $ansprache4Teilnehmer . ' ist eine ' . $meldungsBez . $vonPart . ' nach '
             . $sprachsettings->Kurs['Singular']['Dativ'] . ' "' . $toKurs->getVarValue('kurzbez_titel') . "\" ($pNachKnr)" . ' durchzuführen:' . "\n";
    if ($pSucces4Melden) {
      $text = 'Für folgende ' . $ansprache4Teilnehmer . ' wurde eine ' . $meldungsBez . $vonPart . ' nach '
              . $sprachsettings->Kurs['Singular']['Dativ'] . ' "' . $toKurs->getVarValue('kurzbez_titel') . "\" ($pNachKnr)" . ' erfolgreich durchgeführt:' . "\n";
    }
    foreach ($pTeilnehmerAry as $teilnehmer) {
      $text .= ' ' . $teilnehmer['name_vorname'] . '(' . $teilnehmer['id'] . ')';
      if ($teilnehmer['zahlung'] == true) {
        $text .= "\t" . "\t" . "\t" . 'Zahlung liegt vor';
      }
      $text .= "\n";  
    }

    $text .= "\n" . 'Diese Nachricht wurde automatisch von den KuferTools generiert.';

    $mailAnMaAry = array();
    $mailAnMaAry['VerwMa'] = $this->toolSettings->meldeBenachrichtigungsMailAnVerwMa;
    
    

    
    $mailAdressAry = ToolsAPI::getEmailAdressForKursMA($toKurs, $this->toolId, $pPageId, $mailAnMaAry);
    $emailAdress = \ArrayOperations::firstValue($mailAdressAry);
    

    smtpMail::sendStandardTextMail($emailAdress, $mailSubject, $text);
  }

  

  
  private function _validateBelegungWithDmz($pBelegung)
  {
    $gruende = array();
    try {
      $sprachsettings = new SprachSettingsObject();
      $abgleichApi = new AbgleichAPI();

      
      $infoNode = new XMLNode('Belegungstatus');
      $infoNode->addChild(new XMLNode('belid', $pBelegung->id));
      $result = $abgleichApi->sendeNachricht(
        AbgleichAPI::ABGLEICH_GETBELEGUNGSTATUS,
        new Nutzlast($infoNode)
      );

      
      
      
      $responseObj = json_decode($result->reason, true);

      if ($responseObj['Belid'] == -1) {
        $gruende[] = 'Belegungssatz ist auf dem Ernstbestand nicht (mehr) vorhanden.';
        $logMsg = 'Belegungssatz ist auf dem Ernstbestand nicht (mehr) vorhanden. (' . CleanOperations::cleanInt($pBelegung->id) . ')';
        Logger::logg($logMsg, 199);

        return array('gruende' => $gruende, 'zahlungErfolgt' => false);
      }

      if ($responseObj['Belid'] != $pBelegung->id) {
        
        
        $gruende[] = 'Technische Probleme: Plausibilitätsproblem beim Abgleich';
        $logMsg = 'Validierung der zu buchenden Anmeldung über DMZ: Die vom Server gelieferte BelegungsId stimmt nicht'
                     . ' mit der ursprünglichen BelegungsId überein';
        Logger::logg($logMsg . ' (belid ernst: ' . $responseObj['Belid'] . ' != ' . $pBelegung->id . ' replikat)', 199);

        return array('gruende' => $gruende, 'zahlungErfolgt' => false);
      }

      
      if ($responseObj['Knr'] != $pBelegung->knr || $responseObj['Tnr'] != $pBelegung->tnr) {
        $gruende[] = 'Technische Probleme: Plausibilitätsproblem beim Abgleich';
        $logMsg = 'Validierung der zu buchenden Anmeldung über DMZ: Die von Server gelieferte Kurs- oder Teilnehmernummer'
                  . ' stimmt nicht mit der ursprünglichen Kurs-/Teilnehmernummer überein';
        Logger::logg($logMsg . ' (knr ernst: ' . $responseObj['Knr'] . '; knr mysql: ' . $pBelegung->knr . '; tnr ernst: ' . $responseObj['Tnr'] . '; tnr mysql: ' . $pBelegung->tnr, 199);

        return array('gruende' => $gruende, 'zahlungErfolgt' => false);
      }

      if ($responseObj['IsTeilVonFirmenanmeldung'] || $responseObj['IsTeilVonMehrfachanmeldung']) {
        $gruende[] = ucfirst($sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ']) . ' ist Teil einer Firmen- bzw. Mehrfachanmeldung';

        return array('gruende' => $gruende, 'zahlungErfolgt' => false);
      }

      if ($responseObj['IsElternKindanmeldung']) {
        $gruende[] = ucfirst($sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ']) . ' ist mit Kinder angemeldet.';

        return array('gruende' => $gruende, 'zahlungErfolgt' => false);
      }

      $hasKursAboGebuehren = APIGebuehren::hasKursFortlaufendeGebuehren($pBelegung->kurs->id);

      if (!$hasKursAboGebuehren) {
        
        
        
        
        if ($responseObj['Abschluss'] == 'J') {
          $gruende[] = ucfirst($sprachsettings->Kurs['Singular_mit_Artikel']['Nominativ']) . ' ist bereits abgeschlossen';

          return array('gruende' => $gruende, 'zahlungErfolgt' => false);
        }

        

        
        if ($responseObj['SummeIst'] > 0 || $responseObj['SummeSollZahlungenMitZahlnummerGroesserNull'] > 0) {
          
          
          $gruende[] = 'Aufgrund bereits erfolgter Zahlungen/Rechnungen ist eine Ummeldung nicht möglich.';
        }

        
        if (!in_array($responseObj['Status1'], array('A', ' ', ''))) {
          $gruende[] = ucfirst($sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ']) . ' ist nicht mit Status angemeldet in ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'];
        }
      }

      
      
      
      
      
      
      


      
      
      
      
      
      

      
      
      
      

      return array('gruende' => $gruende, 'zahlungErfolgt' => false);
    } catch (Exception $e) {
      Logger::logg('Validierung der zu buchenden Anmeldung über DMZ - Folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);
      $gruende[] = 'Technische Probleme: Fehler bei der Datenübertragung für die Plausibilitätsprüfung.';
      
      
      return array('gruende' => $gruende, 'zahlungErfolgt' => false);
    }
  }

  

  
  private function _handleDokumentBearbeiten()
  {

    
    
    
    $changeInformationen = array('data' => null, 'statusMessage' => '');
    
    $dokuID = PostOperations::getVarValue('dokumentid', '');

    $dbwDok = new DBWorkDokumenteWeb();

    
    $dokument = $dbwDok->getDokument($dokuID);
    $originalDokument = $dokument->copy();
    $anzFields2Change = 0;
    $i = 1;
    if (PostOperations::isDefined('dokInfo_' . $i) && PostOperations::getVarValue('dokInfo_' . $i) != '') {
      $loadedDokuRaw = PostOperations::getVarValue('dokInfo_' . $i);
      $loadedJsonDoku = JsonOperations::getFromString(urldecode($loadedDokuRaw));

      
      
      $correctFields = $dokument->getChangedDatafromJSON($loadedJsonDoku);
      
      $anzFields2Change = count($correctFields) - 1;
    } 

    $allgSettings = AllgSettingsAPI::getAllgSettings();
    $apiStatus = '';

    if (Xsrf::KEY_OK != Xsrf::checkAndUseXsrfFromGet('wt_dokument_bearbeiten', $loadedJsonDoku->id)) {
      
      $changeInformationen['statusMessage'] = HTMLOperations::getAlertBox('Das Dokument konnte aus technischen Gründen nicht geändert werden', 'Fehler beim Ändern des Dokuments');

      return $changeInformationen;
    }

    
    if ($anzFields2Change > 0) {
      
      try {
        
        if (SessionOperations::isReplikat()) {
          $dokuAPI = new DokumenteAPI();

          $dokumentePaarAry = array();
          $dokumentePaarAry[0] = new Tuple($dokument, $correctFields, $originalDokument);
          
          $apiStatus = $dokuAPI->correctDokumente($dokumentePaarAry, 'update');
        }

        
        
        $dmzBetrieb = SessionOperations::isReplikat() && $allgSettings->dmzEnabled;

        $dbwDok->updateDokument($dokument, $dmzBetrieb);

        $successMessage = 'Das ausgewählte Dokument ' . CleanOperations::cleanStringForHtml($dokument->bezeichnung) . ' wurde erfolgreich bearbeitet.';
        
        if ($apiStatus === 'nichtAktiviert') {
          $successMessage = 'Das ausgewählte Dokument ' . CleanOperations::cleanStringForHtml($dokument->bezeichnung) . ' wurde am Replikat erfolgreich bearbeitet.';

          throw new Exception('Die DMZ ist nicht aktiviert. Datenabgleich beachten.');
        }
        $changeInformationen['statusMessage'] = HTMLOperations::getSuccessBox('<div class="successbox_text">' . $successMessage . '</div>', 'Bearbeitung erfolgreich', 'in_background');
      }
      catch (Exception $e) {
        Logger::logg('Dokumente Update - folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);
        
       
        if ($apiStatus !== 'nichtAktiviert') { 
          $changeInformationen['statusMessage'] = HTMLOperations::getAlertBox('<div class="alertbox_text">' . CleanOperations::cleanStringForHtml($allgSettings->failSubmitMsgDokumente) . '</div>', 'Fehler', 'in_background');
        } else {
          $changeInformationen['statusMessage'] = HTMLOperations::getSuccessBox('<div class="successbox_text">' . $successMessage . '</div>', 'Bearbeitung erfolgreich', 'in_background');
        }
      } 
    } 
    else {
      $changeInformationen['statusMessage'] = HTMLOperations::getInfoBox('<div class="infobox_text">Die Daten des ausgewählten Dokuments '
      . $dokument->bezeichnung . ' wurden nicht verändert.</div>', 'Hinweis', 'in_background');
    }

    return $changeInformationen;
  }

  

  
  private function _handleDokumenteDelete()
  {
    $deleteInformationen = array('data' => null, 'statusMessage' => '');
    $zuLoeschendeDokuIDs = array();
    
    if (PostOperations::isDefined('dokumentid') && PostOperations::getVarValue('dokumentid', '') != '') {
      
      $dokuId = PostOperations::getVarValue('dokumentid', '');
      $zuLoeschendeDokuIDs[] = $dokuId;
    }
    
    
    elseif (PostOperations::isDefined('dokumentids') && PostOperations::getVarValue('dokumentids', '') != '') {
      $zuLoeschendeDokuIDs = explode(';', PostOperations::getVarValue('dokumentids', ''));
    }
    $anzSelektierterDokus = count($zuLoeschendeDokuIDs);


    
    $dbwDok = new DBWorkDokumenteWeb();
    $loeschbareDokuIDs = $dbwDok->getDokuIds2Process($zuLoeschendeDokuIDs);
    $anzahlLoeschbareDokus = count($loeschbareDokuIDs);

    
    if ($anzahlLoeschbareDokus == 0) {
      if ($anzSelektierterDokus >= 2) {
        $deleteInformationen['statusMessage'] = HTMLOperations::getInfoBox('<div class="infobox_text">Die ausgewählten Dokumente können nicht mehr gelöscht werden,
                                                 weil sie nicht mehr existieren.</div>', 'Hinweis', 'in_background');
      } else { 
        $deleteInformationen['statusMessage'] = HTMLOperations::getInfoBox('<div class="infobox_text">Das ausgewählte Dokument kann nicht mehr gelöscht werden,
                                                 weil es nicht mehr existiert.</div>', 'Hinweis', 'in_background');
      }

      return $deleteInformationen;
    }

    
    if ($anzahlLoeschbareDokus >= 2) {
      $successMessage = 'Die ausgewählten Dokumente wurden erfolgreich gelöscht';
    } else { 
      $successMessage = 'Das Dokument wurde erfolgreich gelöscht';
    }


    
    $allgSettings = AllgSettingsAPI::getAllgSettings();
    $apiStatus = '';
    
    try {
      

      
      if (SessionOperations::isReplikat()) {
        $dokuAPI = new DokumenteAPI();
        $correctFields = array();
        $correctFields[] = 'knr';
        $dokumentePaarAry = array();
        foreach ($loeschbareDokuIDs as $dokuID) {
          $dokument = $dbwDok->getDokument($dokuID);
          $dokumentePaarAry[] = new Tuple($dokument, $correctFields, $dokument);
        }
        
        $apiStatus = $dokuAPI->correctDokumente($dokumentePaarAry, 'delete');
      }

      
      
      $dmzBetrieb = SessionOperations::isReplikat() && $allgSettings->dmzEnabled;
      foreach ($loeschbareDokuIDs as $dokuID) {
        $dbwDok->deleteDokument($dokuID, $dmzBetrieb);
      }

      
      if ($apiStatus === 'nichtAktiviert') {
        if ($anzahlLoeschbareDokus >= 2) { 
          $successMessage = 'Die ausgewählten Dokumente wurden erfolgreich vom Replikat gelöscht';
        } else { 
          $successMessage = 'Das Dokument wurde erfolgreich vom Replikat gelöscht';
        }

        throw new Exception('Die DMZ ist nicht aktiviert. Datenabgleich beachten');
      }
      $deleteInformationen['statusMessage'] = HTMLOperations::getSuccessBox('<div class="successbox_text">' . $successMessage . '</div>', 'Löschen erfolgreich', 'in_background');
    } 
    catch (Exception $e) {
      
      Logger::logg('Dokumente Delete - folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);
      
      
      if ($apiStatus !== 'nichtAktiviert') { 
        $deleteInformationen['statusMessage'] = HTMLOperations::getAlertBox('<div class="alertbox_text">' . CleanOperations::cleanStringForHtml($allgSettings->failSubmitMsgDokumente) . '</div>', 'Fehler', 'in_background');
      } else {
        $deleteInformationen['statusMessage'] = HTMLOperations::getSuccessBox('<div class="successbox_text">' . $successMessage . '</div>', 'Löschen erfolgreich', 'in_background');
      }
    }

    return $deleteInformationen;
  }

  

  
  private function _handleTermineDelete()
  {
    $deleteInformationen = array('data' => null, 'statusMessage' => '');
    $zuLoeschendeTerminIDs = array();
    if (PostOperations::isDefined('items') && PostOperations::getVarValue('items', '') != '') {
      $zuLoeschendeTerminIDs = explode(';', PostOperations::getVarValue('items', ''));
    }

    $dbwKT = new DBWorkKurseTage();
    
    $loeschbareTermineIDs = $dbwKT->getKurstageCountFromIDs($zuLoeschendeTerminIDs);
    $anzahlLoeschbareTermine = count($loeschbareTermineIDs);
    
    if ($anzahlLoeschbareTermine == 0) {
      $deleteInformationen['statusMessage'] = HTMLOperations::getAlertBox('<div class="alertbox_text">Die ausgewählten Termine können nicht mehr gelöscht werden,
                                               weil sie nicht mehr existieren.</div>', 'Achtung', 'in_background');

      return $deleteInformationen;
    }

    if (Xsrf::KEY_OK != Xsrf::checkAndUseXsrfFromGet('wt_termine_loeschen')) {
      $deleteInformationen['statusMessage'] = HTMLOperations::getAlertBox('<div class="alertbox_text">Die ausgewählten Termine konnten aus technischen Gründen nicht gelöscht werden.</div>', 'Fehler beim Löschen der Termine', 'in_background');

      return $deleteInformationen;
    }

    
    $deleteInformationen['statusMessage'] = HTMLOperations::getSuccessBox('<div class="successbox_text">Die ausgewählten Termine wurden erfolgreich gelöscht</div>', 'Löschen erfolgreich', 'in_background');
    

    $allgsettings = AllgSettingsAPI::getAllgSettings();
    $apiStatus = '';
    
    try {
      
      if (SessionOperations::isReplikat()) {
        
        $korrekturAPI = new KurskorrekturAPI();
        $correctFields = array();
        $correctFields[] = 'knr';
        $kurstagPaarAry = array();
        foreach ($loeschbareTermineIDs as $terminID) {
          $kurstag = $dbwKT->getKurstag($terminID);
          $kurstagPaarAry[] = new Tuple($kurstag, $correctFields, $kurstag);
        }
        
        $apiStatus = $korrekturAPI->correctKurstage($kurstagPaarAry, 'delete');
      }
      
      if ($apiStatus === 'nichtAktiviert') {
        throw new Exception('Die DMZ ist nicht aktiviert');
      }

      
      foreach ($loeschbareTermineIDs as $terminID) {
        $dbwKT->deleteKurstag($terminID);
      }
    } 

    catch (Exception $e) {
      Logger::logg('Löschen von Kurstagen - folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);
      $deleteInformationen['statusMessage'] = HTMLOperations::getAlertBox('<div class="alertbox_text">' . CleanOperations::cleanStringForHtml($allgsettings->failSubmitMsgKursplanung) . '</div>', 'Fehler', 'in_background');
    }

    return $deleteInformationen;
  }

  

  
  private function _handleNewDoz2Kurs($pSightId)
  {
    $statusMessage = '';
    $dbwDoz = new DBWorkDozenten();
    $dozent = $dbwDoz->getNewObject();
    
    $dozId = -1;
    
    if (RequestOperations::getMethod() == 'post') {
      if (Xsrf::KEY_OK != Xsrf::checkAndUseXsrfFromGet('wt_neuer_dozent')) {
        return HTMLOperations::getAlertBox('Der Dozent konnte aus technischen Gründen nicht angelegt werden.', 'Fehler beim Anlegen des Dozenten');
      }


      $builder = new SightBuilder($this->getToolId(), $pSightId, $dozent);
      
      $builder->saveData();
      $validationOK = $builder->checkValidation();

      if ($validationOK) {
        
        $saveResult = DozentenAPI::saveDozent($builder, false);

        $statusMessage .= $saveResult['statusMessage'];
        $dozId = $saveResult['dozId'];
      }
      
      if ($dozId != -1) {
        
        $dozInfo = $this->_handleDozAdd2Kurs($dozId, true);
        
        
        
        $statusMessage = $dozInfo['statusMessage'];
      }
    } 
    
    return $statusMessage;
  }

  

  
  private function _handleDozHonData($pMessageName = 'Honorar', $pXsrfAction = 'wt_ma_change_dozhon')
  {
    $dozHonInfo = array('data' => null, 'statusMessage' => '');
    
    
    
    $dozHonId = PostOperations::getVarValue('dozhonid');
    $allgSettings = AllgSettingsAPI::getAllgSettings();
    $sprachSettings = SettingsFactory::getSettings('SprachSettingsObject');
    try {
      $dbwDozhon = new DBWorkDozentenHonorar();
      
      $dozentenHonorar = $dbwDozhon->getHonorar($dozHonId);
      $originalDozHon = $dozentenHonorar->copy();
      $anzFields2Change = 0;
      if (PostOperations::isDefined('dozHonObj') && PostOperations::getVarValue('dozHonObj') != '') {
        if (Xsrf::checkAndUseXsrfFromGet($pXsrfAction, $dozHonId)) {
          $loadedDozHonRaw = PostOperations::getVarValue('dozHonObj');
          $loadedJsonDozHon = JsonOperations::getFromString(urldecode($loadedDozHonRaw));

          
          
          $correctFields = $dozentenHonorar->getChangedDatafromJSON($loadedJsonDozHon);
          
          
          $anzFields2Change = count($correctFields) - 2;
        }
      } 

      $apiStatus = '';
      
      if ($anzFields2Change > 0) {

        
        
        if (SessionOperations::isReplikat()) {
          $dozhonTuple = new Tuple($dozentenHonorar, $correctFields, $originalDozHon);
          
          $apiStatus = DozentenAPI::correctDozentenHonorar($dozhonTuple, 'update');
        }

        
        if ($apiStatus === 'nichtAktiviert') {
          throw new Exception('Die DMZ ist nicht aktiviert');
        }
        $dozHonInfo['statusMessage'] .= HTMLOperations::getSuccessBox('<div class="successbox_text">Die ' . CleanOperations::cleanStringForHtml($pMessageName) . 'daten '
                                         . CleanOperations::cleanStringForHtml($sprachSettings->Dozent['Singular_mit_Artikel']['Genitiv']) . ' ' . CleanOperations::cleanStringForHtml($dozentenHonorar->dozent->namevorname)
                                         . ' wurden erfolgreich bearbeitet.</div>', 'Bearbeitung erfolgreich', 'in_background');

        
        $dmzBetrieb = SessionOperations::isReplikat() && $allgSettings->dmzEnabled;
        $dbwDozhon->updateHonorar($dozentenHonorar, $dmzBetrieb);
      } 
      else {
        $dozHonInfo['statusMessage'] .= HTMLOperations::getInfoBox('<div class="infobox_text">Für ' . CleanOperations::cleanStringForHtml($sprachSettings->Dozent['Singular_mit_Artikel']['Akkusativ'])
                                        . ' ' . CleanOperations::cleanStringForHtml($dozentenHonorar->dozent->namevorname) . ' wurden keine ' . CleanOperations::cleanStringForHtml($pMessageName) . 'daten verändert.</div>', 'Hinweis', 'in_background');
      }
    } 
    catch (Exception $e) {
      Logger::logg('Update der Dozentenhonorardaten - folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);
      $dozHonInfo['statusMessage'] = HTMLOperations::getAlertBox('<div class="alertbox_text">' . CleanOperations::cleanStringForHtml($allgSettings->failSubmitMsgDozHonorar) . '</div>', 'Fehler', 'in_background');
    }

    return $dozHonInfo;
  }

  

  
  private function _handleDozContractData()
  {
    return $this->_handleDozHonData('Vertrags', 'wt_ma_change_dozvertrag');
  }

  
  private function _handleDozDeleteFromKurs($pData)
  {
    $deleteInformationen = array('data' => null, 'statusMessage' => '');
    $zuLoeschendeDozKursIDs = array();
    if (PostOperations::isDefined('items') && PostOperations::getVarValue('items', '') != '') {
      $zuLoeschendeDozKursIDs = explode(';', PostOperations::getVarValue('items', ''));
    }

    $dbwDozhon = new DBWorkDozentenHonorar();
    
    $loeschbareDozKursIDs = $dbwDozhon->getHondatenCountFromIDs($zuLoeschendeDozKursIDs);
    $anzahlLoeschbareDozKurse = count($loeschbareDozKursIDs);
    

    $sprachSettings = SettingsFactory::getSettings('SprachSettingsObject');
    
    if ($anzahlLoeschbareDozKurse == 0) {
      $deleteInformationen['statusMessage'] = HTMLOperations::getInfoBox('<div class="infobox_text">Die ausgewählten ' . CleanOperations::cleanStringForHtml($sprachSettings->Dozent['Plural']['Nominativ'])
                                              . ' können nicht mehr aus dem Kurs entfernt werden, weil sie bereits entfernt wurden.</div>', 'Hinweis', 'in_background');

      return $deleteInformationen;
    }
    $messageText = 'Die ausgewählten ' . CleanOperations::cleanStringForHtml($sprachSettings->Dozent['Plural']['Nominativ']) . ' wurden erfolgreich aus dem Kurs entfernt.';
    
    $sprachDozStringSingArt = ucfirst($sprachSettings->Dozent['Singular_mit_Artikel']['Nominativ']);
    
    if ($anzahlLoeschbareDozKurse == 1) {
      $messageText = $sprachDozStringSingArt . ' wurde erfolgreich aus dem Kurs entfernt.';
    }
    

    $deleteInformationen['statusMessage'] = HTMLOperations::getSuccessBox('<div class="successbox_text">' . $messageText . '</div>', 'Dozent erfolgreich entfernt', 'in_background');
    $allgSettings = AllgSettingsAPI::getAllgSettings();
    $apiStatus = '';
    
    try {
      $dmzBetrieb = SessionOperations::isDMZBetrieb();
      
      if ($dmzBetrieb) {
        
        $correctFields = array();
        $correctFields[] = 'knr';
        $correctFields[] = 'dnr';

        $dozhonTupleAry = array();
        foreach ($loeschbareDozKursIDs as $dozHonId) {
          $dozentenHonorar = $dbwDozhon->getHonorar($dozHonId);
          if ($dozentenHonorar->knr !== $pData->id) {
            throw new Exception('Die Kursnummer des ausgewählten Honorardatensatz stimmt nicht mit dem aktuellen Kurs überein.');
          }
          $dozhonTupleAry[] = new Tuple($dozentenHonorar, $correctFields, $dozentenHonorar);
        }
        
        $apiStatus = DozentenAPI::correctDozentenHonorare($dozhonTupleAry, 'delete');
      }
      
      
      if ($apiStatus === 'nichtAktiviert') {
        throw new Exception('Die DMZ ist nicht aktiviert');
      }

      
      foreach ($loeschbareDozKursIDs as $dozHonId) {
        $dbwDozhon->deleteHonorar($dozHonId, $dmzBetrieb);
      }
    } 

    catch (Exception $e) {
      Logger::logg('Entfernen von Dozenten aus dem Kurs - folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);
      $deleteInformationen['statusMessage'] = HTMLOperations::getAlertBox('<div class="alertbox_text">' . CleanOperations::cleanStringForHtml($allgSettings->failMsgDozHonDelete) . '</div>', 'Fehler', 'in_background');
    }

    return $deleteInformationen;
  }

  

  
  private function _handleDozAdd2Kurs($pDozId, $pIsNewDoz = false)
  {
    $dozInfo = array('data' => null, 'statusMessage' => '', 'dozhonId' => -1);

    
    
    
    

    $knr = PostOperations::getVarValue('nr');
    $sprachSettings = SettingsFactory::getSettings('SprachSettingsObject');
    $allgSettings = AllgSettingsAPI::getAllgSettings();
    
    $sprachDozString = CleanOperations::cleanStringForHtml(ucfirst($sprachSettings->Dozent['Singular_mit_Artikel']['Nominativ']));
    
    $dozhonId = -1;
    $dbwDozHon = new DBWorkDozentenHonorar();
    try {
      $dbwDoz = new DBWorkDozenten();
      
      
      $dozent = $dbwDoz->getDozent($pDozId, $pIsNewDoz);

      $apiStatus = '';
      
      $dmzBetrieb = SessionOperations::isReplikat() && $allgSettings->dmzEnabled;

      
      
      
      $anzahlDozKurse = $dbwDozHon->getHonorardatenCount($knr, $pDozId);
      
      if ($anzahlDozKurse == 0) {
        
        $correctFields = array('knr', 'dnr', 'typ');
        $dozentenHonorar = new DozentenHonorare();
        
        $dozentenHonorar->dnr = $pDozId;
        $dozentenHonorar->knr = $knr;
        
        $dozentenHonorar->typ = 'D';
        
        $dozentenHonorar->honsatz = $dozent->stundensatz;
        $dozentenHonorar->fahrtentfernung = $dozent->fahrentfernung;
        
        
        $dozentenHonorar->druckdatum = DEFAULTDATE;
        $dozhonId = $dbwDozHon->insertHonorar($dozentenHonorar, $dmzBetrieb);
        $dozentenHonorar->id = $dozhonId;

        
        if (SessionOperations::isReplikat() && $allgSettings->dmzEnabled) {
          $dozhonPaar = new Tuple($dozentenHonorar, $correctFields, $dozentenHonorar);
          
          $apiStatus = DozentenAPI::correctDozentenHonorar($dozhonPaar, 'insert');
          
        }
        
        
        
        if ($apiStatus === 'nichtAktiviert') {
          throw new Exception('Die DMZ ist nicht aktiviert');
        }
        $statusMsgInhalt = $sprachDozString . ' ' . CleanOperations::cleanStringForHtml($dozent->namevorname) . ' wurde ';
        if ($pIsNewDoz) {
          $statusMsgInhalt .= 'neu angelegt und ';
        }
        $statusMsgInhalt .= 'dem Kurs erfolgreich hinzugefügt.';
        $dozInfo['statusMessage'] .= HTMLOperations::getSuccessBox('<div class="successbox_text">' . $statusMsgInhalt . '</div>', 'Hinzufügung erfolgreich', 'in_background');
      
      } 
      else {
        
        
        $dozInfo['statusMessage'] .= HTMLOperations::getAlertBox('<div class="alertbox_text">' . $sprachDozString . ' ' . CleanOperations::cleanStringForHtml($dozent->namevorname)
                                                               . ' ist bereits im Kurs vorhanden.</div>', 'Achtung', 'in_background');
      }
    } catch (Exception $e) {
      
      if ($dozhonId !== -1) {
        $dbwDozHon->deleteHonorar($dozhonId);
        
        $dozhonId = -1;
      }
      Logger::logg('Hinzufügen eines Dozenten zum Kurs - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n"
                   . '[' . $e->getTraceAsString() . ']', 200);
      $statusMsgInhalt = $allgSettings->failMsgDozentAdd;
      if ($pIsNewDoz) {
        $statusMsgInhalt = $allgSettings->failMsgDozentNewAdd;
      }

      $dozInfo['statusMessage'] = HTMLOperations::getAlertBox('<div class="alertbox_text">' . CleanOperations::cleanStringForHtml($statusMsgInhalt) . '</div>', 'Fehler', 'in_background');
    }
    
    $dozInfo['dozhonId'] = $dozhonId;

    return $dozInfo;
  }

  

  
  private function _showKursdetails($pData, $pPageId = 377, $pUploadResult = NO_UPLOAD, $pUploadMeldung = '', $pStatusMessage = '', $pFromOtherTab = '')
  {
    
    
    $displayRestriction = false;

    
    $detailSightId = 27;
    $data = $pData;
    $searchkurs = ((GetOperations::getVarValue('searchkurs', false)) ? '&amp;searchkurs=1' : '');
    $userid = $this->getUser()->getIdentifier();

    
    $reiterSeite = new ReiterSeite($pPageId, $this->toolSettings->reiterBeschriftung);
    $sprachsettings = SettingsFactory::getSettings('SprachSettingsObject'); 

    
    
    
    $allKnrs = $this->getTotalData('##');
    $anzahlAllerKurse = 0;
    $anzahlKurseProSeite = 1;
    if ($allKnrs != '##') {
      $anzahlAllerKurse = count($allKnrs);
    }

    $tndrucklistid = 243; 
    $tabPage = new TabCollectionKursdetails(
      $sprachsettings->Kurs['Plural']['Nominativ'],
      $pPageId,
      $this,
      $sprachsettings->Kurs['Singular']['Nominativ'] . ' ' . $data->id . ': ' . $data->getVarValue('titel_zeile1'),
      $data,
      $data->id,
      $tndrucklistid,
      $anzahlAllerKurse,
      $anzahlKurseProSeite,
      $pStatusMessage,
      $displayRestriction
    );

    $pageLinks = array();
    

    
    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $reiterSeite->getRecht('Kursdetails'))) {
      $tabPage->addTabPage(new TabPageSightBuilderUebersicht($reiterSeite->getLabel('Kursdetails'), $data, $this->getToolId(), $detailSightId));
      
    }
    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $reiterSeite->getRecht('Inhalt'))) {
      $tabPage->addTabPage(new TabKursDetailsInhalt($reiterSeite->getLabel('Inhalt'), $data, $this->toolSettings->benutzteinfo));
    }

    
    $tabPage = $this->_getTerminReiter4Tab($tabPage, $data, $pPageId, $reiterSeite->getLabel('Termine'), $reiterSeite->getRecht('Termine'));

    
    $tabPage = $this->_getTeilnehmerReiter4Tab(
      $tabPage,
      $data,
      $pPageId,
      $reiterSeite->getLabel('Teilnehmer'),
      $reiterSeite->getRecht('Teilnehmer')
    );
    
    $tabPage = $this->_getHonorarReiter4Tab($tabPage, $data, $pPageId, $reiterSeite->getLabel('Honorar'), $reiterSeite->getRecht('Honorar'));

    
    $tabPage = $this->_getDozentenReiter4Tab($tabPage, $data, $pPageId, $reiterSeite->getLabel('Dozenten'), $reiterSeite->getRecht('Dozenten'));

    
    $tabPage = $this->_getDownloadsReiter4Tab(
      $tabPage,
      $data,
      $pPageId,
      $reiterSeite->getLabel('Downloads'),
      $reiterSeite->getRecht('Downloads'),
      $pUploadResult,
      $pUploadMeldung
    );

    
    
    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $reiterSeite->getRecht('Fotos'))) {
      $tabPage->addTabPage(new TabKursDetailsFotos($reiterSeite->getLabel('Fotos'), $data->id));
    }

    

    $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();
    if ($pFromOtherTab != '') {
      $pageLinks['back'] .= '#' . $pFromOtherTab;
    }

    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.1')) {
      
      $pageLinks['anmeldenDoz'] = 'javascript: showMessage(\'Hier kann ein Mitarbeiter der Schulungseinrichtung '
      . $sprachsettings->Teilnehmer['Singular_mit_Artikel']['Akkusativ'] . ' zu diesem ' . $sprachsettings->Kurs['Singular']['Dativ']
      . ' anmelden. Diese Funktion ist aktuell im Rechtesystem nicht freigeschaltet.\', \'Anmeldung\');';  
    }

    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.2')) {
      $pageLinks['forum'] = 'javascript: showMessage(\'Hier könnte der Link zu Ihrem Forum stehen - vgl. Teilnehmer.\', \'Ihr Forum\');';
    }

    
    $pageLinks['tnlisten'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.3')
                                && $this->rechteOR(array('243.0.2', '243.0.4', '243.0.6', '243.0.8', '243.0.10'))) == 2;

    
    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.4')) {
      $pageLinks['druck_smallJs'] = 'javascript:window.print();';
    }

    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.5')) {
      $pageLinks['anwesenheiten4kurs'] = $this->getUrlParamsForFile(array('toolsection_id' => 380, 'nr' => $data->id)) . $searchkurs;
    }

    
    if (\SecurityOperations::privilegAllowedCurrentUser(\ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.6')) {
      $pageLinks['feedback'] = $this->getUrlParamsForFile(array('toolsection_id' => $pPageId, 'nr' => $data->id, 'showFormular' => 'feedback')) . $searchkurs;
    }

    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pPageId . '.0.8') == 2) {
      $pageLinks['kursbearbeiten'] = true;
      
      
    
    
    
    
    }

    $tabPage->setLinks($pageLinks);

    return $tabPage;
  }

  

  
  private function _getHonorarReiter4Tab($pTabPage, $pData, $pPageId, $pReiterLabel, $pReiterRecht)
  {
    $allgSettings = AllgSettingsAPI::getAllgSettings();
    
    
    $allowButtons4DBAccess = true;
    if (SessionOperations::isReplikat()) {
      $allowButtons4DBAccess = $allgSettings->dmzEnabled;
    }

    $data = $pData;
    $searchkurs = ((GetOperations::getVarValue('searchkurs', false)) ? '&amp;searchkurs=1' : '');
    $userid = $this->getUser()->getIdentifier();
    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pReiterRecht)) {
      $sight4HonorarTab = 29;
      $dozentenTab = new TabKursDozenten(
        $pReiterLabel,
        $data->id,
        $sight4HonorarTab,
        array(\ToolsAPI::TOOL_DOZENTENINFO_MA, 397),
        $this->toolSettings->sortdoz,
        $this->toolSettings->sortdozasc
      );
      $pageLinksDozenten = array();

      

      
      $pageLinksDozenten['dozadd'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4HonorarTab . '.0.2') == 2
                                      && $allowButtons4DBAccess);


      
      
      $pageLinksDozenten['doznew'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4HonorarTab . '.0.6') == 2
                                      && $allowButtons4DBAccess);


      

      
      
      
      

      
      $pageLinksDozenten['dozhonorar'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4HonorarTab . '.0.4') == 2
                                          && $allowButtons4DBAccess);
      
      $pageLinksDozenten['dozvertrag'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4HonorarTab . '.0.7') == 2
                                          && $allowButtons4DBAccess);
      
      $pageLinksDozenten['dozdelete'] = '';
      if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4HonorarTab . '.0.5') == 2 && $allowButtons4DBAccess) {
        $xsrf = new Xsrf();
        $xsrfKey = $xsrf->generateKey4Action('wt_ma_delete_doz', $data->id);
        $pageLinksDozenten['dozdelete'] = $this->getUrlParamsForFile(array('toolsection_id' => $pPageId,
          
            'dir' => RequestOperations::getVarValue('dir'),
            'blid' => RequestOperations::getVarValue('blid'),
            'xsrf' => $xsrfKey,
            'nr' => $data->id)) . $searchkurs;
      }

      $dozentenTab->setLinks($pageLinksDozenten);
      $pTabPage->addTabPage($dozentenTab);
    }

    return $pTabPage;
  }

  

  

  
  private function _getDozentenReiter4Tab($pTabPage, $pData, $pPageId, $pReiterLabel, $pReiterRecht)
  {
    $data = $pData;
    $searchkurs = ((GetOperations::getVarValue('searchkurs', false)) ? '&amp;searchkurs=1' : '');
    $userid = $this->getUser()->getIdentifier();

    
    
    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pReiterRecht)) {
      $sight4DozentenTab = 245;

      
      
      $addUrlPart = 'showFormular=sammelmaildoz&amp;nr=' . $pData->id . '&amp;currentIndex=' . RequestOperations::getVarValue('currentIndex');
      

      $dozentenTab = new TabKursDozenten(
        $pReiterLabel,
        $data->id,
        $sight4DozentenTab,
        array(\ToolsAPI::TOOL_DOZENTENINFO_MA, 397),
        $this->toolSettings->sortdoz,
        $this->toolSettings->sortdozasc,
        $addUrlPart
      );
      $pageLinksDozenten = array();
      
      $pageLinksDozenten['emailallowed'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4DozentenTab . '.0.1') == 2);

      $pageLinksDozenten['email'] = $this->getUrlParamsForFile(array('nr' => $data->id, 'tool_id' => \ToolsAPI::TOOL_KURSPLANUNG_MA,
                                          'toolsection_id' => $pPageId, 'showFormular' => 'sammelmaildoz')) . $searchkurs;

      $pageLinksDozenten['dozsammelsms'] = $this->getUrlParamsForFile(array('nr' => $pData->id, 'tool_id' => \ToolsAPI::TOOL_KURSPLANUNG_MA,
                                            'toolsection_id' => $pPageId, 'showFormular' => 'dozsammelsms')) . $searchkurs;

      $pageLinksDozenten['dozsammelsmsallowed'] = (\SecurityOperations::privilegAllowed($userid, $this->getToolId(), $sight4DozentenTab . '.0.5') == 2);

      $dozentenTab->setLinks($pageLinksDozenten);
      $pTabPage->addTabPage($dozentenTab);
    }

    return $pTabPage;
  }

  
  private function _getTerminReiter4Tab($pTabPage, $pData, $pPageId, $pReiterLabel, $pReiterRecht)
  {
    $allgSettings = AllgSettingsAPI::getAllgSettings();
    
    
    $allowButtons4DBAccess = true;
    if (SessionOperations::isReplikat()) {
      $allowButtons4DBAccess = $allgSettings->dmzEnabled;
    }
    $searchkurs = ((GetOperations::getVarValue('searchkurs', false)) ? '&amp;searchkurs=1' : '');
    $userid = $this->getUser()->getIdentifier();
    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pReiterRecht)) {
      
      
      $sight4Termine = 28;
      
      $addUrlPart = 'nr=' . $pData->id . '&amp;currentIndex=' . RequestOperations::getVarValue('currentIndex');
      

      $termineTab = new TabKursDetailsTermine($pReiterLabel, $pData, $sight4Termine, $addUrlPart, $this->toolSettings->ktstatus);
      $termineTab->ktStatusHighlight = $this->toolSettings->ktstatus;
      $termineTab->ktStatusHighlightColor = $this->toolSettings->colorktstatus;

      $pageLinksTermine = array();
      
      
      $pageLinksTermine['termineBearbeiten'] = '';
      $termineBearbeitenAllowed = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4Termine . '.0.1') === 2);
      if ($termineBearbeitenAllowed) {
        $pageLinksTermine['termineBearbeiten'] = $this->getUrlParamsForFile(array('toolsection_id' => $pPageId,
            
            'dir' => RequestOperations::getVarValue('dir'),
            'blid' => RequestOperations::getVarValue('blid'))) . $searchkurs;
        
      }

      
      $termineHinzufuegenAllowed = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4Termine . '.0.2') === 2);
      $pageLinksTermine['termineHinzufuegen'] = '';
      
      if ($termineHinzufuegenAllowed) {
        $sight4NewTermine = 378;
        
        $pageLinksTermine['termineHinzufuegen'] = $this->getUrlParamsForFile(array('toolsection_id' => $sight4NewTermine,
        
            'dir' => RequestOperations::getVarValue('dir'),
            'blid' => RequestOperations::getVarValue('blid'),
            'nr' => $pData->id)) . $searchkurs;  
      }

      
      $pageLinksTermine['termineLoeschen'] = '';
      
      if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4Termine . '.0.3') === 2 && $allowButtons4DBAccess) {
        
        
        $pageLinksTermine['termineLoeschen'] = $this->getUrlParamsForFile(array('toolsection_id' => $pPageId,
          
            'dir' => RequestOperations::getVarValue('dir'),
            'blid' => RequestOperations::getVarValue('blid'),
            'nr' => $pData->id)) . $searchkurs;
      }

      
      
      
      
      
      
      

      $termineTab->setLinks($pageLinksTermine);
      $pTabPage->addTabPage($termineTab);
    }

    return $pTabPage;
  }

  

  
  private function _getTeilnehmerReiter4Tab($pTabPage, $pData, $pPageId, $pReiterLabel, $pReiterRecht)
  {
    $dbwtools = new DBWorkTools();
    $searchkurs = ((GetOperations::getVarValue('searchkurs', false)) ? '&amp;searchkurs=1' : '');
    $userid = $this->getUser()->getIdentifier();
    
    $sight4TN = 242;
    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pReiterRecht)) {
      

      $dbwBelegung = new DBWorkBelegung(1, true);
      $dbwBelegung->newSearch();
      $dbwBelegung->fromobject->status = $this->toolSettings->tnstatus;
      $dbwBelegung->setPersonenOrderBySettings($this->toolSettings, 'tn');
      $belegungAry = $dbwBelegung->getBelegungenByKursNR($pData->id);

      
      
      $addUrlPart = 'showFormular=nachricht&amp;nr=' . $pData->id . '&amp;currentIndex=' . RequestOperations::getVarValue('currentIndex');
      

      $tnStatusHighLightAry = array($this->toolSettings->tnstatus, $this->toolSettings->colortnstatus);
      $teilnehmerTab = new TabKursTeilnehmer($pReiterLabel, $belegungAry, $pData, $sight4TN, $tnStatusHighLightAry, $addUrlPart, array(\ToolsAPI::TOOL_TEILNEHMERINFO_MA, 411));

      $pageLinksTeilnehmer = array();

      $pageLinksTeilnehmer['bescheinigung'] = $this->getUrlParamsForFile(array('nr' => $pData->id, 'tool_id' => \ToolsAPI::TOOL_KURSPLANUNG_MA,
                                              'toolsection_id' => $pPageId, 'showFormular' => 'bescheinigung')) . $searchkurs;

      $pageLinksTeilnehmer['emailallowed'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4TN . '.0.1') == 2);
      $pageLinksTeilnehmer['bescheinigungallowed'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4TN . '.0.2') == 2);


      
      $pageLinksTeilnehmer['nachricht'] = $this->getUrlParamsForFile(array('nr' => $pData->id, 'tool_id' => \ToolsAPI::TOOL_KURSPLANUNG_MA,
                                          'toolsection_id' => $pPageId, 'showFormular' => 'nachricht')) . $searchkurs;

      $pageLinksTeilnehmer['nachrichtallowed'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4TN . '.0.3') == 2);

      $pageLinksTeilnehmer['sammelsms'] = $this->getUrlParamsForFile(array('nr' => $pData->id, 'tool_id' => \ToolsAPI::TOOL_KURSPLANUNG_MA,
                                            'toolsection_id' => $pPageId, 'showFormular' => 'sammelsms')) . $searchkurs;

      $pageLinksTeilnehmer['sammelsmsallowed'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4TN . '.0.4') === 2);

      $pageLinksTeilnehmer['stornoallowed'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4TN . '.0.8') === 2);

      
      if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4TN . '.0.7') === 2 && $dbwtools->isToolAllowed($userid, \ToolsAPI::TOOL_ANMELDUNGBUCHEN_MA)) {
        
        
        $pageLinksTeilnehmer['anmelden'] = $this->getUrlParamsForFile(array('tool_id' => 6, 'toolsection_id' => 434, 'einstieg' => 1,
                                                                          'knr' => $pData->id, 'link2AnmeldfromTool' => \ToolsAPI::TOOL_KURSPLANUNG_MA));
      }

      
      
      $dbwWorkKurseWt = new DBWorkKurseWT(1, true); 
      if ($this->toolSettings->useBereichsRechte) {
        $alleKursnummernDesMitarbeiters = $dbwWorkKurseWt->getKursIdsByBereichsrechte($userid);
      } else {
        $alleKursnummernDesMitarbeiters = $dbwWorkKurseWt->getKurseNr4BenutzerNr($userid);
      }

      
      
      if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4TN . '.0.5') === 2 && $dbwtools->isToolAllowed($userid, \ToolsAPI::TOOL_ANMELDUNGBUCHEN_MA)) {
        $einstellungKursauswahlBeimWeitermelden = $this->toolSettings->weitermeldenKursAuswaehlen;
        if ($einstellungKursauswahlBeimWeitermelden
           || ($pData->folgekurs != '' && in_array($pData->folgekurs, $alleKursnummernDesMitarbeiters))) {
          $pageLinksTeilnehmer['weitermelden_kursauswahl'] = $einstellungKursauswahlBeimWeitermelden;
          $pageLinksTeilnehmer['weitermeldenallowed'] = true;
        }
      }

      
      $pageLinksTeilnehmer['ummeldenallowed'] = ((\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4TN . '.0.6') === 2)
                           && $dbwtools->isToolAllowed($userid, \ToolsAPI::TOOL_ANMELDUNGBUCHEN_MA));


      
      $pageLinksTeilnehmer['belegungbearbeitenallowed'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4TN . '.0.9') === 2);

      
      
      $pageLinksTeilnehmer['nachlassallowed'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4TN . '.0.10') === 2
              && (!SessionOperations::isReplikat() || SessionOperations::isDmzBetrieb()));

      $teilnehmerTab->setLinks($pageLinksTeilnehmer);
      $pTabPage->addTabPage($teilnehmerTab);
    }

    return $pTabPage;
  }

  

  
  private function _getDownloadsReiter4Tab($pTabPage, $pData, $pPageId, $pReiterLabel, $pReiterRecht, $pUploadResult, $pUploadMeldung)
  {
    $allgSettings = AllgSettingsAPI::getAllgSettings();
    
    
    $allowButtons4DBAccess = true;
    if (SessionOperations::isReplikat()) {
      $allowButtons4DBAccess = $allgSettings->dmzEnabled;
    }
    $userid = $this->getUser()->getIdentifier();
    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $pReiterRecht)) {
      $sight4downloads = 375;

      
      
      
      $downloadTab = new TabKursDetailsDownloads4Mitarbeiter(
        $pReiterLabel,
        $pData->id,
        $this->getToolId(),
        $sight4downloads,
        false,
        $pUploadResult,
        $pUploadMeldung
      );
      $pageLinksDownloads = array();
      
      
      
      
      
      $uploadAllowed = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4downloads . '.0.1') === 2);
      $pageLinksDownloads['upload'] = '';
      if ($uploadAllowed) {
        $pageLinksDownloads['upload'] = '#';
      }

      
      $releaseDokuAllowed = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4downloads . '.0.2') === 2);
      $pageLinksDownloads['releaseDoku'] = '';
      if ($releaseDokuAllowed) {
        $pageLinksDownloads['releaseDoku'] = '#';
      }

      
      $changeDokuAllowed = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4downloads . '.0.3') === 2);
      $pageLinksDownloads['changeDoku'] = '';
      if ($changeDokuAllowed) {
        $pageLinksDownloads['changeDoku'] = '#';
      }

      
      
      
      $deleteDokuAllowed = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_KURSPLANUNG_MA, $sight4downloads . '.0.4') === 2 && $allowButtons4DBAccess);
      $pageLinksDownloads['deleteDoku'] = '';
      if ($deleteDokuAllowed) {
        $pageLinksDownloads['deleteDoku'] = '#';
      }

      $downloadTab->setLinks($pageLinksDownloads);
      $pTabPage->addTabPage($downloadTab);
    }

    return $pTabPage;
  }

  

  public function getToolId()
  {
    return \ToolsAPI::TOOL_KURSPLANUNG_MA;
  }
}  




class PageNachrichtErfolgreichGesendetStorno extends PageBaseWT
{
  private $_versendet;
  private $_nichtVersendet;
  private $_ueberschrift;
  private $_data;

  public function __construct($pPageTitle, $pPageId, $pTool, $pData, $pUeberschrift, $pVersendet, $pNichtVersendet)
  {
    parent::__construct($pPageTitle, $pPageId, $pTool);
    $this->_versendet = $pVersendet;
    $this->_nichtVersendet = $pNichtVersendet;
    $this->_ueberschrift = $pUeberschrift;
    $this->_data = $pData;
  }

  public function getContentHeader()
  {
    $sprachsettings = new SprachSettingsObject();
    
    return $this->_ueberschrift . ' für Termine - ' . $sprachsettings->Kurs['Singular']['Nominativ'] . ' ' . $this->_data->id . ': ' . $this->_data->getVarValue('titel_zeile1');
  }

  public function getContent()
  {
    $result = '<div id="infoVersendet">';

    if (isset($this->_nichtVersendet) && count($this->_nichtVersendet) != 0) {
      $result .= HTMLOperations::getAlertBox('Die E-Mail konnte aus technischen Gründen leider nicht versendet werden.', 'Fehler');
    }
    if (isset($this->_versendet) && count($this->_versendet) != 0) {
      $result .= HTMLOperations::getSuccessBox('Die E-Mail wurde erfolgreich versendet.', 'Erfolg');
    }

    $result .= '</div>';
    $result .= HTMLOperations::CreateBackButton($this->links['back']);

    return $result;
  }
}