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


class ToolTn extends ToolBase
{
  protected $_dbwBelegung;
  protected $_user;

  
  protected $_debugStorno;
  private $_isRefresh;

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

    
    $dbwbelegung = new DBWorkBelegung();
    $dbwbelegung->newSearch();
    $dbwbelegung->fromobject->kurs->semester = $this->toolSettings->semlist;
    $dbwbelegung->dbwkurse->justNoAusfall = $this->toolSettings->keineAusgefallenenKurse;
    $dbwbelegung->toobject->kurs->semester = '';
    $dbwbelegung->setOrderBySettings($this->toolSettings);
    

    $searchAPI = new KurssuchAPIwSearch(false);
    $searchAPI->getSearchParamsFromReqToSession('tool' . $this->toolId);


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

    
    $dbwbelegung->fromobject->status = $this->toolSettings->tnstatus;

    $dbwbelegung->dbwkurse->beruecksichtigeKurstagRaumanzeige = $this->toolSettings->versteckeKurstageWieImRaumanzeigeprogramm;

    $this->_dbwBelegung = $dbwbelegung;
    $this->_user = SessionOperations::getCurrentWebToolsUser();

    $this->_debugStorno = false;
    if (DBWorkBASysSettings::isBlak()) {
      $this->_debugStorno = true;
    }
  }

  
  protected function fillIcsSettingsInSession()
  {
    SessionOperations::setVarValueWTIntern(
      'icsSetting_versteckeKurstageWieImRaumanzeigeprogramm',
      $this->toolSettings->versteckeKurstageWieImRaumanzeigeprogramm
    );
  }

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

  
  public function init($pPageId)
  {
    
    $this->checkBrowserReload();

    switch ($pPageId) {
      default:
      case 293: 
        $page = $this->_handleKursuebersicht($pPageId);
        break;
      case 300: 
        $page = $this->_handleAlleTermine();

        break;
         
      case 304: 

        $dbwKursTage = new DBWorkKurseTage();

        $vonDatum = DateTimeOperations::getValidDateString(GetOperations::getVarValue('von', ''));
        $bisDatum = DateTimeOperations::getValidDateString(GetOperations::getVarValue('bis', ''));

        
        $termiplanFormat = GetOperations::getVarValue('terminplanformat', '');
        
        $terminBereich = GetOperations::getVarValue('terminbereich', '');

        
        
        if (GetOperations::isDefined('nr')) {
          $selectedBelegungsIds = GetOperations::getVarValue('nr');
          $belIdAry = explode(':', $selectedBelegungsIds);

          
          $this->_dbwBelegung->fromobject->status = '-ATP';
          $kursNrAry = $this->_dbwBelegung->getKursNrFromBelegungNrAry($belIdAry);

          if (count($kursNrAry) == 0) {
            $data = array();
          } else {
            
            
            $dbwKursTage->newSearch();
            $dbwKursTage->fromobject->datum = $vonDatum;
            $dbwKursTage->toobject->datum = $bisDatum;
            $data = $dbwKursTage->getKurstageByTnLimitOnlyDifferent($this->_user->tnr, null, 0, true, $kursNrAry);
          }
        } elseif (GetOperations::isDefined('ktnr')) {
          $ktnr = GetOperations::getVarValue('ktnr');
          $ktNrAry = explode(':', $ktnr);

          $kursTageAlle = $dbwKursTage->getKurseTageByIds($ktNrAry);
          if (SessionOperations::isAdmin()) {
            $data = $kursTageAlle;
          } else {
            $data = $this->_filterKurstageAngemeldeteKurse($kursTageAlle, SessionOperations::getCurrentWebToolsTeilnehmer()->id);
          }
        }


        $sprachsettings = new SprachSettingsObject();
        $page = new PageTnMeineKurseTerminplan(
          'meine ' . $sprachsettings->Kurs['Plural']['Nominativ'],
          $pPageId,
          $this,
          $data,
          $vonDatum,
          $bisDatum,
          $termiplanFormat,
          $this->_user->tnr,
          $terminBereich
        );
        break;
      case 316:
        
        $belid = GetOperations::getVarValue('belid');
        $page = new PageTnMeineKurseStammBlatt('TNKursstammblatt', $pPageId, $this, $belid);
        break;
      case 335: 
        $page = $this->_handleKursdetails();
        break;
      case 358: 
        $dbwbelegung = new DBWorkBelegung();
        $belid = GetOperations::getVarValue('belid');
        $data = $dbwbelegung->getBelegung($belid);
        $page = $this->_handleStorno($data, $pPageId);
        break;
    }
    if ($page == null) {
      throw new Exception('ungültige PageId');
    }
    $this->currentPage = $page;
  }

  
  private function _filterKurstageAngemeldeteKurse($pKurstage, $pTnr)
  {
    $kursNrAlle = ArrayOperations::mapAttribut($pKurstage, 'knr');

    $this->_dbwBelegung->fromobject->status = '-ATP';
    $belegungenAngemeldet = $this->_dbwBelegung->getBelegungenbyKurseAndTeilnehmer($kursNrAlle, $pTnr);

    $kursNrAngemeldet = ArrayOperations::mapAttribut($belegungenAngemeldet, 'knr');

    return array_filter($pKurstage, function($pKurstag) use ($kursNrAngemeldet) {
      return in_array($pKurstag->knr, $kursNrAngemeldet);
    });
  }

  
  private function _handleKursuebersicht($pPageId = 293)
  {
    
    return $this->_handleKursuebersichtStandard($pPageId);
  }

  
  private function _handleKursuebersichtStandard($pPageId = 293)
  {
    $this->updateAndGetSelectedIds();

    
    $alleIds = $this->getAlleIdsBelegungen($this->_dbwBelegung);
    $data = $this->getData($this->_dbwBelegung, $alleIds, $this->toolSettings->kurseproseite);
    $anzahlAllerBelegungenDesTeilnehmers = count($alleIds);

    $pageLinks = array();

    $userid = $this->_user->getIdentifier();
    
    
    $pageLinks['termineall'] = \SecurityOperations::privilegAllowed($userid, $this->getToolId(), $pPageId . '.0.1');
    
    $pageLinks['terminplan'] = \SecurityOperations::privilegAllowed($userid, $this->getToolId(), $pPageId . '.0.2');
    
    $pageLinks['termineics'] = \SecurityOperations::privilegAllowed($userid, $this->getToolId(), $pPageId . '.0.3');
    
    $pageLinks['filter'] = \SecurityOperations::privilegAllowed($userid, $this->getToolId(), $pPageId . '.0.4');
    
    $pageLinks['print'] = \SecurityOperations::privilegAllowed($userid, $this->getToolId(), $pPageId . '.0.5');

    
    
    if (\SecurityOperations::privilegAllowed($userid, $this->getToolId(), $pPageId . '.0.6') == 2
       && $this->rechteOR(array('335.1.1', '335.1.2', '335.1.3', '335.1.4' . '335.1.5',
                             '335.1.6', '335.1.7'))) {
      $pageLinks['details'] = $this->getUrlParamsForFile(array('toolsection_id' => 335));
    }

    
    if (\SecurityOperations::privilegAllowed($userid, $this->getToolId(), $pPageId . '.0.7') == 2) {
      $pageLinks['punkteBest'] = true;
    }

    $pageLinks['self'] = $this->getUrlParamsForFile(array('toolsection_id' => $pPageId));


    $sprachSettings = SettingsFactory::getSettings('SprachSettingsObject');

    
    if (DBWorkBASysSettings::isBlak()) {
      foreach ($data as $key => $belegung) {
        if ($belegung->kurs->kursauswahl2 == 'W') {
          $data[$key]->kurs->gebuehr = BLAK_NOT_SHOW_WSS;
          $data[$key]->kurs->geb_erm = BLAK_NOT_SHOW_WSS;
          $data[$key]->entgelt = BLAK_NOT_SHOW_WSS;
          $data[$key]->bet_offen = BLAK_NOT_SHOW_WSS;
          $data[$key]->bezahlt = BLAK_NOT_SHOW_WSS;
        }
      }
    }

    $page = $this->_getPage($pPageId, $data, $sprachSettings, $anzahlAllerBelegungenDesTeilnehmers);
    $page->setLinks($pageLinks);

    return $page;
  }

  
  protected function _getPage($pPageId, $pData, $pSprachSettings, $anzahlAllerBelegungenDesTeilnehmers)
  {
    return new PageTnMeineKurseUebersicht(
      'meine ' . $pSprachSettings->Kurs['Plural']['Nominativ'],
      $pPageId,
      $this,
      $pData,
      'meine aktuell gebuchten ' . $pSprachSettings->Kurs['Plural']['Nominativ'],
      $anzahlAllerBelegungenDesTeilnehmers,
      $this->toolSettings->kurseproseite
    );
  }

  public function getAjaxResponse()
  {
    switch (RequestOperations::getVarValue('action')) {
      case 'get_belegung':
        return $this->_handleAjaxGetPage4BearbeitbareInfos();

      case 'uploadedfile':

        return $this->_handleAjaxUpload4BGLU();
    }
  }

  private function _handleAjaxGetPage4BearbeitbareInfos()
  {
    $dbwbelegung = new DBWorkBelegung();
    $belid = PostOperations::getVarValue('dataId');
    $data = $dbwbelegung->getBelegung($belid);

    $sightId = 439;
    $sightBuilder = new SightBuilder($this->getToolId(), $sightId, $data, false, true);
    $sightBuilder->weitereKlasseFuerSightDiv = 'Infotool';
    $page = new TabPageSightBuilderUebersichtFlexibel('Weitere Infos', '', $sightBuilder, array());

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

  
  private function _handleKursdetails($pPageId = 335)
  {
    
    $alleIds = $this->getAlleIdsBelegungen($this->_dbwBelegung);
    $data = $this->getData($this->_dbwBelegung, $alleIds, 1, GetOperations::getVarValue('belid'));
    $data = $data[0]; 
    $belid = $data->id;
    $kursNr = $data->knr;
    $anzahlAllerBelegungenDesTeilnehmers = count($alleIds);

    $dbwKurseBase = new DBWorkKurseBase();
    $dozenten = $dbwKurseBase->getDozentenForKurse(array($kursNr));

    $sprachsettings = new SprachSettingsObject();

    $pageTitle = 'meine ' . $sprachsettings->Kurs['Plural']['Nominativ'];

    $title = '';
    if (count($dozenten[$kursNr]) > 1) {
      $title .= 'Information an ' . $sprachsettings->Dozent['Plural_mit_Artikel']['Nominativ'];
    } elseif (count($dozenten[$kursNr]) == 1) {
      $title = 'Information an ' . $sprachsettings->Dozent['Singular_mit_Artikel']['Akkusativ'];
    }

    
    if (GetOperations::getVarValue('showFormular', '') == 'info') {
      $pageLinks = array();
      $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();
      $pageLinks['action'] = $this->getUrlParamsForFile(array('toolsection_id' => $pPageId, 'belid' => $belid, 'sendInfo' => 'doz'));
      if (count($dozenten[$kursNr]) == 0) {
        $page = new PageKeinKontakt($pageTitle, $pPageId, $this, $title);
      } else {
        $betreff = $data->kurs->getVarValue('titel_zeile1') . ' - ' . $this->_user->vorname . ' ' . $this->_user->name;
        $page = new PageKontaktKursAnDozenten($pageTitle, $pPageId, $this, $title, $betreff, 'Ihre Nachricht:', $data->kurs, $dozenten[$kursNr]);
      }
      $page->setLinks($pageLinks);
    } elseif (GetOperations::getVarValue('showFormular', '') == 'feedback') {
      $pageLinks = array();
      $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();
      $pageLinks['action'] = $this->getUrlParamsForFile(array('toolsection_id' => $pPageId, 'belid' => $belid, 'sendInfo' => 'vhs'));
      $ueberschrift = 'Feedback zu ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'] . ' ' . $data->kurs->id . ': ' . $data->kurs->getVarValue('titel_zeile1');
      $betreff = $data->kurs->getVarValue('titel_zeile1') . ' - ' . $this->_user->vorname . ' ' . $this->_user->name;
      $page = new PageKontakt($pageTitle, $pPageId, $this, $ueberschrift, $betreff);
      $page->setLinks($pageLinks);
    }
    
    elseif (GetOperations::getVarValue('showFormular', '') == 'kursortsms') {
      
      
      $tab = GetOperations::getVarValue('tab', '');
      
      $page = SmsUserAPI::getSMSPage4Kursort($data, $this, $pageTitle, $pPageId, $this->toolSettings->showSmsBetreff, $tab, false);
    }
    
    elseif (GetOperations::getVarValue('sendInfo', '') == 'kursortsms') {
      $tab = GetOperations::getVarValue('tab', '');
      
      $page = SmsUserAPI::getSMSPage4Kursort($data, $this, $pageTitle, $pPageId, $this->toolSettings->showSmsBetreff, $tab, true);
    }

    
    elseif (GetOperations::getVarValue('sendInfo', '') != '') {
      $pageLinks = array();
      $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();
      $versendet = array();
      $nichtVersendet = array();

      if (GetOperations::getVarValue('sendInfo', '') == 'doz') {
        
        $teilnehmer = SessionOperations::getCurrentWebToolsTeilnehmer();
        $senderEmailData = ToolsAPI::getSenderEmailAddressAndName($teilnehmer, 'Andere');

        
        foreach (PostOperations::getVarValue('doz') as $value) {
          $dbwDozent = new DBWorkDozenten();
          $doz = $dbwDozent->getDozent($value);
          $mailAddress = $doz->getVarValueEx('email', 'kommunikation');
          $email = new smtpMail();
          $email->SetVar2Value('from', $senderEmailData['email']);
          $email->SetVar2Value('sendername', $senderEmailData['name']);
          $email->SetVar2Value('reply', $senderEmailData['reply']);
          $email->SetVar2Value('replyname', $senderEmailData['replyname']);
          $email->SetVar2Value('to', $mailAddress);
          $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_TEXT);
          $email->SetVar2Value('doNotSplitHTMLBody', true);
          $email->subject = PostOperations::getVarValue('betreff');
          $email->body = PostOperations::getVarValue('info');
          if ($email->sendMail()) {
            $versendet[] = $doz;
          } else {
            $nichtVersendet[] = $doz;
          }
        }
        $ueberschrift = $title . ' - ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Nominativ'] . ' ' . $data->knr . ': ' . $data->kurs->getVarValue('titel_zeile1');
        $page = new PageNachrichtErfolgreichGesendetPerson($pageTitle, $pPageId, $this, $ueberschrift, $versendet, $nichtVersendet);
        $page->setLinks($pageLinks);
      } 
      elseif (GetOperations::getVarValue('sendInfo', '') == 'vhs') {
        
        
        $teilnehmer = SessionOperations::getCurrentWebToolsTeilnehmer();
        $senderEmailData = ToolsAPI::getSenderEmailAddressAndName($teilnehmer);

        $mailAddress = EmailOperations::getToolEmailAddressForVhs($this->toolSettings->vhsEmailTool20Section335);
        $email = new smtpMailTools();
        $email->SetVar2Value('from', $senderEmailData['email']);
        $email->SetVar2Value('sendername', $senderEmailData['name']);
        $email->SetVar2Value('reply', $senderEmailData['reply']);
        $email->SetVar2Value('replyname', $senderEmailData['replyname']);
        $email->SetVar2Value('to', $mailAddress);
        $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_TEXT);
        $email->SetVar2Value('doNotSplitHTMLBody', true);
        $email->subject = PostOperations::getVarValue('betreff');
        $email->body = PostOperations::getVarValue('info');
        $email->setFooter('Feedback zu einem Kurs', $this->_user, $data->kurs);

        if ($email->sendMail()) {
          $versendet[] = $this->allgSettings->vhsname;
        } else {
          $nichtVersendet[] = $this->allgSettings->vhsname;
        }
        $ueberschrift = 'Feedback zu ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'] . ' ' . $data->knr . ': ' . $data->kurs->getVarValue('titel_zeile1');
        $page = new PageNachrichtErfolgreichGesendetFeedback($pageTitle, $pPageId, $this, $ueberschrift, $versendet, $nichtVersendet);
        $page->setLinks($pageLinks);
      } 
    } 
    
    elseif (GetOperations::isDefined('showForum')) {
      $pageLinks = array();
      
      $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();
      $page = new PageTnForum($this, $pPageId);
      $page->setLinks($pageLinks);
    }
    
    else {
      
      if (!is_numeric($belid) || $belid < 1) {
        
        $page = new PageWTDefault($pageTitle, $pPageId, $this);
        $page->setContent('<h2>Ungültige Parameter, bitte manipulieren Sie die URL nicht!</h2>');
      } else {
        
        

        
        if ($this->_user->tnr != $data->tnr) {
          
          $page = new PageWTDefault($pageTitle, $pPageId, $this);
          $page->setContent('<h2>Sie sind nicht berechtigt sich diese Informationen anzusehen!</h2>');
        } else {
          if (GetOperations::getVarValue('showAbmeldung', '--') != '--') {
            
            $page = $this->_getPage4Storno($pPageId, $data);
          } else {
            $page = $this->_showStandardKursdetails($data, $anzahlAllerBelegungenDesTeilnehmers);
          }
        }
      }
    }

    return $page;
  }

  
  private function _showStandardKursdetails($pData, $anzahlAllerBelegungenDesTeilnehmers)
  {
    $detailSightId = 335; 
    $reiterSeite1 = 294;
    $reiterKursdetailsSightId = 295;
    $reiterTermineSightId = 297;
    $reiterDownloadsSightId = 303;
    $reiterJournalSightId = 298;
    $printSightId = 316;

    

    $reiterSeite = new ReiterSeite($detailSightId, $this->toolSettings->reiterBeschriftung);

    $data = $pData;
    
    $seite1data = $data;

    
    if (DBWorkBASysSettings::isBlak()) {
      if ($data->kurs->kursauswahl2 == 'W') {
        $data->kurs->gebuehr = BLAK_NOT_SHOW_WSS;
        $data->kurs->geb_erm = BLAK_NOT_SHOW_WSS;
        $data->entgelt = BLAK_NOT_SHOW_WSS;
        $data->bet_offen = BLAK_NOT_SHOW_WSS;
        $data->bezahlt = BLAK_NOT_SHOW_WSS;

        
        $seite1data = unserialize(serialize($data)); 
        $seite1data->kurs->ziel = BLAK_NOT_SHOW_WSS;
        $seite1data->kurs->webinfo = BLAK_NOT_SHOW_WSS;
        $seite1data->ziel = BLAK_NOT_SHOW_WSS;
        $seite1data->kurs->aussenst = BLAK_NOT_SHOW_WSS;
        $seite1data->kurs->fachb = BLAK_NOT_SHOW_WSS;
        $seite1data->kurs->abschluss = BLAK_NOT_SHOW_WSS;
      }
    }


    $sprachsettings = new SprachSettingsObject();
    $tabPage = new TabCollectionKursdetails(
      'meine ' . $sprachsettings->Kurs['Plural']['Nominativ'],
      $detailSightId,
      $this,
      'meine Anmeldung zu ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'] . ' ' . $data->knr . ': ' . $data->kurs->getVarValue('titel_zeile1'),
      $data,
      $data->kurs->id,
      '',
      $anzahlAllerBelegungenDesTeilnehmers,
      1
    );
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $reiterSeite->getRecht('Belegungsdetails'))) {
      $tabPage->addTabPage(new TabPageSightBuilderUebersicht($reiterSeite->getLabel('Belegungsdetails'), $seite1data, $this->getToolId(), $reiterSeite1, 'ersteSeite'));
    }
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $reiterSeite->getRecht('Kursdetails'))) {
      $tabPage->addTabPage(new TabPageSightBuilderUebersicht($reiterSeite->getLabel('Kursdetails'), $data, $this->getToolId(), $reiterKursdetailsSightId));
    }
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $reiterSeite->getRecht('Inhalt'))) {
      $tabPage->addTabPage(new TabKursDetailsInhalt($reiterSeite->getLabel('Inhalt'), $data->kurs, $this->toolSettings->benutzteinfo));
    }
    

    
    $addUrlPart = 'belid=' . $data->id;
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $reiterSeite->getRecht('Termine'))) {
      $termineTab = new TabKursDetailsTermine($reiterSeite->getLabel('Termine'), $data->kurs, $reiterTermineSightId, $addUrlPart, '', true);
      $termineTab->setLinks(array(
          'versteckeKurstageWieImRaumanzeigeprogramm' => $this->toolSettings->versteckeKurstageWieImRaumanzeigeprogramm,
          'termineDruck' => \SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $reiterTermineSightId . '.0.1') == 2
          ));
      $tabPage->addTabPage($termineTab);
    }
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $reiterSeite->getRecht('Downloads'))) {
      $tabPage->addTabPage(new TabKursDetailsDownloadsTN($reiterSeite->getLabel('Downloads'), $data->knr, $this->getToolId(), $reiterDownloadsSightId, $this->getUser()->tnr));
    }
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $reiterSeite->getRecht('Fotos'))) {
      $tabPage->addTabPage(new TabKursDetailsFotos($reiterSeite->getLabel('Fotos'), $data->knr));
    }
    
    
    if (!DBWorkBASysSettings::isBlak() || $data->kurs->kursauswahl2 != 'W') {
      if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $reiterSeite->getRecht('Journal'))) {
        $tabPage->addTabPage(new TabKursDetailsJournal($reiterSeite->getLabel('Journal'), $data, $reiterJournalSightId));
      }
    }

    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $reiterSeite->getRecht('BelegungsdetailsBearbeitbar'))) {
      $sightId = 439;
      
      $cloneData = clone $data;
      $origData = clone $data;
      $sightBuilder = new SightBuilderUebersicht($this->getToolId(), $sightId, $cloneData);

      if (PostOperations::isDefined('save_belegung')) {
        $statusMessage = $this->_saveBearbeitbareInfos($sightBuilder, $origData);
        
        
        $cloneData = $this->_dbwBelegung->getBelegung($cloneData->id);
        $sightBuilder->setData($cloneData);

        $tabPage->addStatusMessage($statusMessage);
      }

      $page = $this->_getPage4BearbeitbareInfos($cloneData, $reiterSeite->getLabel('BelegungsdetailsBearbeitbar'), $sightBuilder, $sightId);
      $tabPage->addTabPage($page);
    }

    
    
    
    
    $page = $tabPage;
    $pageLinks = array();
    $pageLinks['self'] = $this->getUrlParamsForFile(array('toolsection_id' => $detailSightId));
    
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $detailSightId . '.0.1')) {
      if ($pData->status == 'S' || $pData->status == 'Z') {
        
      } elseif ($pData->firma == 0) { 
        $pageLinks['abmelden'] = $this->getUrlParamsForFile(array('toolsection_id' => $detailSightId, 'belid' => $pData->id, 'showAbmeldung' => 1));
      } else {
        $dbwTn = new DBWorkTeilnehmer();
        $firma = $dbwTn->getTeilnehm($pData->firma);
        if (!$firma->isEmpty()) {
          $firmaPart = "die Firma $firma->name.";
        } else {
          $firmaPart = 'eine Firma.';
        }
        $pageLinks['abmelden'] = "javascript:showMessage('Sie wurden angemeldet über " . CleanOperations::cleanStringForJs($firmaPart) . BR_WT
          . "Eine Abmeldung ist nur darüber möglich.', 'Abmeldung nicht möglich');";
      }
    }
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $detailSightId . '.0.2')) {
      $pageLinks['forum'] = $this->getUrlParamsForFile(array('toolsection_id' => $detailSightId, 'belid' => $data->id, 'showForum' => 1));
    }
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $detailSightId . '.0.3')) {
      $pageLinks['feedback'] = $this->getUrlParamsForFile(array('toolsection_id' => $detailSightId, 'belid' => $data->id, 'showFormular' => 'feedback'));
    }
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $detailSightId . '.0.4')) {
      $pageLinks['infoAnDoz'] = $this->getUrlParamsForFile(array('toolsection_id' => $detailSightId, 'belid' => $data->id, 'showFormular' => 'info'));
    }

    
    if (DBWorkBASysSettings::isBlak() && $data->kurs->isBGLU()) {
      $pageLinks['BLAK_nachweis_button'] = true;
    }

    $pageLinks['bescheinigung'] = '';
    $pageLinks['rechnung'] = '';
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $detailSightId . '.0.5')) {
      $pageLinks['druck_small'] = $this->getUrlParamsForFile(array('toolsection_id' => $printSightId, 'belid' => $data->id, 'nr' => $data->knr));
    }
    
    $pageLinks = $this->_getPunkteBestLink($pageLinks, $data, $detailSightId);

    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $detailSightId . '.0.7')) {
      if (isset($data->kurs->folgekurs) && $data->kurs->folgekurs != '') {
        $knrsAusToolTnAnmeld = ToolTnAnmeldung::getKursnummern();
        if (in_array($data->kurs->folgekurs, $knrsAusToolTnAnmeld)) {
          
          
          $dbwKurse = new DBWorkKurseWTINetAktiv();
          $folgeKurs = $dbwKurse->getKurs($data->kurs->folgekurs);
          $objsettings = ToolSettingsAPI::getToolSettings(\ToolsAPI::TOOL_TN);
          $vorTageAusblenden = $objsettings->weitermeldenAusblendenVorBegFolgekurs;
          $vorTageEinblenden = $objsettings->weitermeldenEinblendenVorBegFolgekurs;
          $anzTageVorBeginn = DateTimeOperations::getAnzTage(DateTimeOperations::getDateNow(), $folgeKurs->beginn_dat) - 1;

          
          if (!isset($vorTageAusblenden) || $vorTageAusblenden == '') {
            $vorTageAusblenden = 0;
          }

          $setzeLink = false;
          
          if (!isset($vorTageEinblenden) || $vorTageEinblenden == '') {
            if ($anzTageVorBeginn > $vorTageAusblenden) {
              $setzeLink = true;
            }
          } else { 
            if ($anzTageVorBeginn <= $vorTageEinblenden && $anzTageVorBeginn > $vorTageAusblenden) {
              $setzeLink = true;
            }
          }

          if ($setzeLink) {
            $pageLinks['weitermelden'] = 'usertools.php?' . $this->getUrlParams(array('tool_id' => \ToolsAPI::TOOL_ANMELDUNGBUCHEN_TN, 'toolsection_id' => '337',
                                                                                     'fromOtherTool' => 1, 'knr' => $data->kurs->folgekurs));
          }
        }
      }
    }

    $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();

    
    $bltForAry = $this->_dbwBelegung->getBelegungenbyTeilnehmerNRLimit($this->_user->id, $data, 1, true);
    $bltBackAry = $this->_dbwBelegung->getBelegungenbyTeilnehmerNRLimit($this->_user->id, $data, 1, false);

    if (count($bltBackAry) == 1) {
      $pageLinks['blaettern_zurueck']
          = $this->getUrlParamsForFile(array('toolsection_id' => $detailSightId, 'belid' => $bltBackAry[0]->id));
    }
    if (count($bltForAry) == 1) {
      $pageLinks['blaettern_vor']
          = $this->getUrlParamsForFile(array('toolsection_id' => $detailSightId, 'belid' => $bltForAry[0]->id));
    }

    $page->setLinks($pageLinks);

    return $page;
  }

  
  protected function _checkWeitereStornoHindernisse($pGruende, $pData)
  {
    return $pGruende;
  }

  
  private function _getPage4BearbeitbareInfos($pData, $pReiterTitel, $pSightBuilder, $pSightId)
  {
    $buttons = array();
    if (\SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), $pSightId . '.0.1')) {
      $buttons[] = PageButtonsAPI::getBearbeitenButton4TabSightBuilder('get_belegung', $pData->id, 'save_belegung');
    }

    return new TabPageSightBuilderUebersichtFlexibel($pReiterTitel, '', $pSightBuilder, $buttons);
  }

  
  private function _saveBearbeitbareInfos($pSightBuilder, $pOrigData)
  {
    $pSightBuilder->saveData();
    $belegung = $pSightBuilder->getData();

    $changedFields = $pSightBuilder->getFieldNamesOfChangedFields($pOrigData);
    
    if (count($changedFields) === 0) {
      return HTMLOperations::getInfoBox('<div class="infobox_text">Die geänderten Informationen sind identisch mit den zuvor gespeicherten Werten.</div>', 'Hinweis', 'in_background');
    } else {
      $success = BelegungAPI::updateBelegung($belegung, $pOrigData);
      if ($success) {
        $this->_sendInfoAnTnUndEinrichtung4BearbeitbareInfos($belegung, $pOrigData, $pSightBuilder, $changedFields);

        return HTMLOperations::getSuccessBox('<div class="infobox_text">Ihre Änderungen wurden erfolgreich gespeichert.' . '</div>', 'Achtung', 'in_background');
      } else {
        return HTMLOperations::getAlertBox('<div class="infobox_text">Beim Übertragen der Änderungen ist ein Fehler aufgetreten. Die Änderungen wurden daher nicht übernommen.' . BR_WT . BR_WT
                                           . 'Bitte versuchen Sie es erneut, oder wenden Sie sich an die Einrichtung.' . '</div>', 'Achtung', 'in_background');
      }
    }
  }

  
  private function _sendInfoAnTnUndEinrichtung4BearbeitbareInfos($pBelegung, $pOrigBelegung, $pSightBuilder, $pChangedFields)
  {
    $changes = '';
    foreach ($pChangedFields as $fieldname) {
      $label = $pSightBuilder->getFieldTitleByFieldName($fieldname);
      $value = $pBelegung->getVarValue($fieldname);
      $oldValue = $pOrigBelegung->getVarValue($fieldname);

      if ($value == 'W') {
        $value = 'Ja';
      } elseif ($value == 'F') {
        $value = 'Nein';
      } elseif (trim($value) == '') {
        $value = '(leer)';
      }
      if ($oldValue == 'W') {
        $oldValue = 'Ja';
      } elseif ($oldValue == 'F') {
        $oldValue = 'Nein';
      } elseif (trim($oldValue) == '') {
        $oldValue = '(leer)';
      }

      
      $changes .= rtrim($label, ': ') . ":\n"
                  . "neu:\n" . ($value != 'W' ? $value : 'Ja')
                  . "\nalt:\n" . ($oldValue != 'W' ? $oldValue : 'Ja') . "\n\n";
    }

    if ($this->toolSettings->belegInfo_InformiereEinrichtungPerTelefonTodoListe) {
      $this->_bearbeitbareInfos_benachrichtigeEinrichtungPerTelefonTodoListe($changes, $pBelegung);
    }
    if ($this->toolSettings->belegInfo_InformiereTnPerEMail) {
      $this->_bearbeitbareInfos_benachrichtigeTeilnehmerperEMail($changes, $pBelegung);
    }
  }

  
  private function _bearbeitbareInfos_benachrichtigeTeilnehmerperEMail($pBodyPartChangedFields, $pBelegung)
  {
    $vhsBezeichnung = $this->allgSettings->vhsname;
    $kindPart = '';
    if (DBWorkBASysSettings::isBerlinOskar() && trim($pBelegung->erstesKind_Vorname_Name_ohneKomma) != '') {
      
      $kindPart = ' für das Kind ' . $pBelegung->erstesKind_Vorname_Name_ohneKomma;
    }
    $subject = 'Änderung Ihrer Daten' . $kindPart
               . ' zum Kurs ' . $pBelegung->kurs->kurzbez . ' (' . $pBelegung->knr . ')';

    $message = $pBelegung->getVarValueEx('ansprache_default', 'Teilnehmer') . "\n\n";

    $message .= 'folgende Angaben' . (trim($kindPart) == '' ? ' zu Ihnen' : $kindPart) . ' haben wir im Kurs '
                . $pBelegung->kurs->kurzbez . ' (' . $pBelegung->knr . ') für Sie geändert:' . "\n\n";
    $message .= $pBodyPartChangedFields;
    $message .= 'Mit freundlichen Grüßen' . "\n\n";
    $message .= 'Ihre ' . $vhsBezeichnung;

    $senderEmailData = ToolsAPI::getSenderEmailAddressAndName($pBelegung->teilnehmer);
    $from = $senderEmailData['email'];
    $fromName = $senderEmailData['name'];

    $to = $this->_user->email;

    $email = new smtpMail();
    $email->SetVar2Value('from', $from);
    $email->SetVar2Value('sendername', $fromName);
    $email->SetVar2Value('reply', $senderEmailData['reply']);
    $email->SetVar2Value('replyname', $senderEmailData['replyname']);
    $email->SetVar2Value('to', $to);
    $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_TEXT);
    $email->SetVar2Value('doNotSplitHTMLBody', true);
    $email->subject = $subject;
    $email->body = $message;

    return $email->sendMail();
  }

  
  private function _bearbeitbareInfos_benachrichtigeEinrichtungPerTelefonTodoListe($pBodyPartChangedFields, $pBelegung)
  {
    
    $kindPart = '';
    if (DBWorkBASysSettings::isBerlinOskar() && trim($pBelegung->erstesKind_Vorname_Name_ohneKomma) != '') {
      
      $kindPart = ' zum Kind ' . $pBelegung->erstesKind_Vorname_Name_ohneKomma;
    }
    $subject = 'Änderung von Daten' . $kindPart
               . ' zum Kurs ' . $pBelegung->kurs->kurzbez . ' (' . $pBelegung->knr . ')';

    $todo = new TelefonToDoListe();
    $todo->bisdatum = DateTimeOperations::getDateNow();
    $todo->bisuhrzeit = DateTimeOperations::getTimeNow();
    $todo->text = $subject;
    $todo->bemerkung = 'Der Teilnehmer ' . $pBelegung->getVarValueEx('titel_name_vorname', 'Teilnehmer')
                       . ' hat folgende Belegungsdaten' . $kindPart . ' zum Kurs ' . $pBelegung->kurs->kurzbez
                       . ' (' . $pBelegung->knr . ') aus KuferTools heraus geändert: ' . "\n\n" . $pBodyPartChangedFields;
    $todo->referenztyp = 'T';
    $todo->referenznr = $pBelegung->tnr;
    $todo->referenztext = StringOperations::substr('TN: ' . $pBelegung->teilnehmer->namevorname . ' ' . $pBelegung->teilnehmer->ort, 0, 250);
    $todo->telefonnr = $pBelegung->getVarValueEx('tel', 'kommunikation');
    $todo->knr = $pBelegung->knr;

    if (SessionOperations::isDmzBetrieb()) {
      try {
        TelefonToDoListeAPI::sendTodos(array($todo));
      } catch (Exception $ex) {
        Logger::logg('Fehler beim Abgleich mit DMZ: ' . $ex->getMessage(), 100);

        return false;
      }
    } elseif (!SessionOperations::isReplikat()) { 
      
      $todo->eintragungsdatum = $todo->bearbdatum = DateTimeOperations::getDateNow();
      $todo->eintragender = $todo->bearbeiter = SessionOperations::getCurrentWebToolsUserKennung();
      $todo->prioritaet = 0;
      $todo->status = 0;
      $todo->gelesen = false;
      $todo->terminid = $todo->ansprechid = $todo->benutzerid = 0;

      
      $todo->bemerkung = str_replace("\n", "\r\n", $todo->bemerkung);

      $dbwHlGrundsys = new DBWorkHLGrundSys();
      $todo->mitarbeiter = $dbwHlGrundsys->getSetting('TelWebUser')->wert;

      $dbwTodo = new DBWorkTelefonToDoListe();
      $dbwTodo->insertTelefonToDoListe($todo, false);
    }

    return true;
  }

  
  protected function _getStornoHinderungsGruende($pData)
  {
    
    $gruende = array_merge(
      $this->getStornoHinderungsGruendStornoBzgl($pData),
      $this->getStornoHinderungsGruendKinder($pData),
      $this->getStornoHinderungsGruendMehrfachAnmeldung($pData)
    );

    
    if ($pData->status !== 'W') {
      $gruende = array_merge(
        $gruende,
        $this->_checkWeitereStornoHindernisse(array(), $pData),
        $this->getStornoHinderungsGruendKursBeginnDatum($pData),
        $this->getStornoHinderungsGruendStatus($pData),
        $this->getStornoHinderungsGruendAnmeldeschluss($pData),
        $this->getStornoHinderungsGruendMindestteilnehmerzahl($pData)
      );
    }

    return $gruende;
  }

  protected function getStornoHinderungsGruendStornoBzgl($pData)
  {
    $gruende = array();
    $dbwZahlung = new DBWorkZahlung();
    if (!$dbwZahlung->isStornoBzglZahlungOkForBelegung($pData->id)) {
      $gruende[] = 'Aufgrund bereits erfolgter Zahlungen/Rechnungen ist eine Stornierung nicht möglich.';
    }

    return $gruende;
  }

  protected function getStornoHinderungsGruendMehrfachAnmeldung($pData)
  {
    $gruende = array();
    $sprachsettings = new SprachSettingsObject();
    
    if ($this->_dbwBelegung->isTeilEinerMehrfachAnmeldung($pData->id)) {
      $gruende[] = $sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ'] . ' gehört zu einer Mehrfach- oder Firmenanmeldung';
    }

    return $gruende;
  }

  protected function getStornoHinderungsGruendKinder($pData)
  {
    if (System::isKuferSql5()) {
      $dbwBelegung = DBWorkBelegung::getDefaultInstance(1, true, true);
      $kinder = $dbwBelegung->getKindBelgungenByTnrAndKnr($pData->tnr, $pData->knr);
    } else {
      $dbwKinder = DBWorkKinder::getDefaultInstance();
      $kinder = $dbwKinder->getKinderbyBelegung($pData->id);
    }

    $gruende = array();
    if (count($kinder) > 0) {
      $gruende[] = 'Zu dieser Anmeldung gehören Kinderanmeldungen';
    }

    return $gruende;
  }

  protected function getStornoHinderungsGruendMindestteilnehmerzahl($pData)
  {
    $gruende = array();
    if ($pData->kurs->getVarValue('teil_min') == $pData->kurs->getVarValue('anmeldungen')) {
      $gruende[] = 'Durch eine Abmeldung würde die Mindestteilnehmerzahl unterschritten (minimal ' . $pData->kurs->getVarValue('teil_min')
              . ' - derzeit ' . $pData->kurs->getVarValue('anmeldungen') . ')';
    }

    return $gruende;
  }

  
  protected function getStornoHinderungsGruendAnmeldeschluss($pData)
  {
    $gruende = array();
    if ($pData->kurs->anm_ende != '') {
      $anmende = DateTimeOperations::getTimestampByDatestring($pData->kurs->anm_ende);
      $akttime = gmmktime(0, 0, 0); 
      if ($anmende < $akttime) {
        
        $kursbeginndat = $pData->kurs->beginn_dat;
        if ($kursbeginndat !== '') { 
          $kursbeginn = DateTimeOperations::getTimestampByDatestring($kursbeginndat);
          if ($kursbeginn < $akttime) {
            $gruende[] = 'Der Anmeldeschluss ist bereits erreicht (' . $pData->kurs->anm_ende . ')';
          }
        }
      }
    }

    return $gruende;
  }

  
  protected function getStornoHinderungsGruendKursBeginnDatum($pData)
  {
    $gruende = array();
    $sprachsettings = new SprachSettingsObject();

    if ($pData->kurs->beginn_dat != '') {
      if (DateTimeOperations::isDatebeforeNow($pData->kurs->beginn_dat)) {
        $gruende[] = $sprachsettings->Kurs['Singular_mit_Artikel']['Nominativ'] . ' hat bereits am ' . $pData->kurs->beginn_dat . ' begonnen';
      }
    }

    return $gruende;
  }

  
  protected function getStornoHinderungsGruendStatus($pData)
  {
    $gruende = array();
    $sprachsettings = new SprachSettingsObject();
    $erlaubteStatus = array('A', ' ', '', 'W');
    if (!in_array($pData->status, $erlaubteStatus)) {
      $gruende[] = $sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ'] . ' ist nicht mit Status angemeldet in ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'];
    }

    return $gruende;
  }

  
  protected function logStorno($pData, $pHinderungsGruende, $pStornoGrund, $pZusatzHinweis = '')
  {
    if ($this->_debugStorno) {
      $stornoMessage = 'Teilnehmer ' . $pData->teilnehmer->namevorname . ' (' . $pData->tnr . ') ';
      $stornoMessage .= 'möchte sich vom Kurs ' . $pData->kurs->kurzbez . ' (' . $pData->knr . ') abmelden.' . "\n";
      $stornoMessage .= 'Grund: ' . $pStornoGrund . "\n";

      $gruendeCount = count($pHinderungsGruende);
      if ($gruendeCount != 0) {
        $stornoMessage .= 'Folgende Gründe sprechen gegen ein automatisches Stornieren:' . "\n";
        foreach ($pHinderungsGruende as $grund) {
          $stornoMessage .= $grund . "\n";
        }
      } else {
        $stornoMessage .= 'Es sprechen keine Gründe gegen ein SimpleStorno.' . "\n";
      }
      $stornoMessage .= $pZusatzHinweis;
      Logger::Logg($stornoMessage, 100);
    }
  }

  
  protected function _handleStornoDmz($pData, $pPageId)
  {
    $stornogrund = PostOperations::getVarValue('stornogrund');

    $sprachsettings = new SprachSettingsObject();
    try {
      $this->logStorno($pData, array(), $stornogrund, 'Die Stornierung erfolgt per DMZ.' . "\n");

      $belApi = new BelegungAPI();

      
      
      
      $result = $belApi->storniereBelegungDMZ($pData->id, 'S', $stornogrund, 1, $this->_debugStorno); 

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

      
      $wlEintrag = null;
      if (isset($warteListenSuccessAry[0])) {
        $wlEintrag = $warteListenSuccessAry[0];
      }
      
      $wlInfo = null;
      if ($this->sollWartelisteBenachrichtigtWerden($pData)) {
        $wlInfo = $this->_benachrichtigeWarteliste($pData, '', $wlEintrag, true);
      }
      
      $this->_sendSimpleStornoMail($pPageId, $pData, $wlInfo);
      $page = new PageWTDefault('meine ' . $sprachsettings->Kurs['Plural']['Nominativ'], 335, $this);

      if (DBWorkBASysSettings::isBlak()) {
        $page = $this->_setBLAKStornoPage($page, $pData);
      } else {
        $page->setContentHeader('Die Stornierung wurde durchgeführt.');
        $page->setContent('<p class="singledetailcontent">Sie wurden erfolgreich von ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'] . ' "' . $pData->kurs->getVarValue('kurzbez_titel') . '" abgemeldet.'
              . BR_WT . BR_WT . '<a href="' . $this->getUrlParamsForFile(array('toolsection_id' => 335, 'belid' => $pData->id)) . '" title="zu den ' . $sprachsettings->KursZusammengesetzt['Singular']['Nominativ'] . 'details">Zurück</a></p>');
      }

      
      $this->_dbwBelegung->doStorno($pData->id, 'S', $stornogrund);
    } catch (Exception $e) {
      
      $page = $this->_getPage4AbmeldeFailure($pData, $stornogrund, false);
      Logger::logg('Fehler der Stornierung über DMZ: ' . $e->getMessage(), 200);
    }

    return $page;
  }

  
  protected function _handleStornoDirekt($pData, $pPageId)
  {
    $stornogrund = PostOperations::getVarValue('stornogrund');

    $sprachsettings = new SprachSettingsObject();
    $this->logStorno($pData, array(), $stornogrund, 'Die Stornierung erfolgt im Direktbetrieb.' . "\n");

    $page = new PageWTDefault('meine ' . $sprachsettings->Kurs['Plural']['Nominativ'], 335, $this);
    try {
      $this->_dbwBelegung->doStorno($pData->id, 'S', $stornogrund, $this->tool0Settings->direktMaKuerzel);

      $wlInfo = null;
      if ($this->sollWartelisteBenachrichtigtWerden($pData)) {
        $wlInfo = $this->_benachrichtigeWarteliste($pData, $this->tool0Settings->direktMaKuerzel);
      }
      $this->_sendSimpleStornoMail($pPageId, $pData, $wlInfo);
      $page->setContentHeader('Die Stornierung wurde durchgeführt.');
      $page->setContent('<p class="singledetailcontent">Sie wurden erfolgreich von ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'] . ' "' . $pData->kurs->getVarValue('kurzbez_titel') . '" abgemeldet.</p>');
    } catch (Exception $e) {
      
      $page = $this->_getPage4AbmeldeFailure($pData, $stornogrund, false);
    }

    return $page;
  }

  
  public function sollWartelisteBenachrichtigtWerden($pData)
  {
    $kursIstNichtUeberbucht = $pData->kurs->getTeilMax() >= $pData->kurs->getVarValue('teil_akt');
    $kursIstNichtBeendet = !DateTimeOperations::isDatebeforeNow($pData->kurs->ende_dat);
    $esWirdEinPlatzFrei = $pData->status !== 'W';

    return $kursIstNichtUeberbucht && $kursIstNichtBeendet && $esWirdEinPlatzFrei;
  }

  
  protected function _handleStornoPerMail($pData, $pGruende, $pPageId)
  {
    $stornogrund = PostOperations::getVarValue('stornogrund');

    $sprachsettings = new SprachSettingsObject();
    $this->logStorno($pData, $pGruende, $stornogrund, 'Die Stornierung wird per E-Mail versendet.' . "\n");

    $mailAnMaAry = array();
    $mailAnMaAry['VerwMa'] = $this->toolSettings->stornoBenachrichtigungsMailAnVerwMa;
    
    
    
    $mailAdressAry = ToolsAPI::getEmailAdressForKursMA($pData->kurs, $this->toolId, $pPageId, $mailAnMaAry);
    $email = \ArrayOperations::firstValue($mailAdressAry);

    if ($email != '') {
      $betreff = 'Abmeldung von ' . $pData->teilnehmer->namevorname . ' von ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'] . ' ' . $pData->knr . ' (' . $pData->kurs->getVarValue('kurzbez_titel') . ')';
      $body = $pData->teilnehmer->vorname . ' ' . $pData->teilnehmer->name . ' (interne ' . $sprachsettings->Teilnehmer['Singular']['Nominativ'] . '-Nr. ' . $pData->teilnehmer->id . ')'
        . ' möchte sich von ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'] . ' "' . $pData->kurs->getVarValue('kurzbez_titel') . '" (Kurs-Nr. ' . $pData->knr . ') abmelden.' . "\n\n";
      if ($stornogrund != '') {
        $body .= 'Dabei wurde von ' . $sprachsettings->Teilnehmer['Singular_mit_Artikel']['Dativ'] . ' folgender Grund angegeben: ' . "\n" . $stornogrund . "\n\n";
      }
      $gruendeCount = count($pGruende);
      if ($gruendeCount > 0) {
        $body .= ' Eine automatische Abmeldung konnte ';
        $body .= 'aus folgende' . ($gruendeCount == 1 ? 'm Grund' : 'n Gründen');
        $body .= ' nicht durchgeführt werden:' . "\n\n";
        foreach ($pGruende as $grund) {
          $body .= "- $grund\n";
        }
      }
      $body .= "\n\n" . 'Diese E-Mail wurde am ' . DateTimeOperations::getDateNow() . ' um ' . DateTimeOperations::getTimeNow() . ' aus den ' . KUFERTOOLS . ' versandt.';

      
      $teilnehmer = SessionOperations::getCurrentWebToolsTeilnehmer();
      $senderEmailData = ToolsAPI::getSenderEmailAddressAndName($teilnehmer);

      $mailAdress = $email;
      $mailVersandt = smtpMailTools::sendStandardTextMailWithFooter(
        $mailAdress,
        $betreff,
        $body,
        'Stornierung eines Kurses',
        SessionOperations::getCurrentWebToolsUser(),
        $pData->kurs,
        $senderEmailData['email'],
        $senderEmailData['name'],
        $senderEmailData['reply'],
        $senderEmailData['replyname']
      );
    } else {
      $mailVersandt = false;
    }
    $page = new PageWTDefault('meine ' . $sprachsettings->Kurs['Plural']['Nominativ'], 335, $this);

    if ($mailVersandt) {
      if (DBWorkBASysSettings::isBlak()) {
        $page = $this->_setBLAKStornoPage($page, $pData);
      } else {
        $page->setContentHeader('Eine Nachricht mit Ihrem Abmeldewunsch wurde an die Einrichtung versendet.');
        $page->setContent(
          '<p class="singledetailcontent">Ihre Bitte um Stornierung ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Genitiv'] . ' "'
          . $pData->kurs->getVarValue('kurzbez_titel') . '" haben wir erhalten. Sie bekommen in Kürze eine Bestätigung.'
          . $this->_getKomplizierteAbmeldungTextEnde()
          . BR_WT . BR_WT . '<a href="' . ToolsAPI::getHistoryEntry(2) . '" title="Zurück">Zurück</a></p>'
        );
      }
    } else {
      
      $page = $this->_getPage4AbmeldeFailure($pData, $stornogrund);
    }

    return $page;
  }

  
  protected function _handleStorno($pData, $pPageId)
  {
    $gruende = $this->_getStornoHinderungsGruende($pData);

    if (count($gruende) == 0
        && (!SessionOperations::isReplikat() || SessionOperations::isDmzBetrieb())) {
      if (SessionOperations::isDmzBetrieb()) {
        return $this->_handleStornoDmz($pData, $pPageId);
      } else {
        return $this->_handleStornoDirekt($pData, $pPageId);
      }
    } else {
      return $this->_handleStornoPerMail($pData, $gruende, $pPageId);
    }
  }

  

  
  protected function _setBLAKStornoPage($pPage, $pData)
  {
    $sprachsettings = new SprachSettingsObject();
    $content = BR_WT . 'Lieber Fortbildungsteilnehmer,' . BR_WT . BR_WT;
    $content .= 'Ihre Stornierung des Kurses ' . $pData->kurs->kurzbez . ' haben wir erhalten.' . BR_WT;
    $content .= 'Schade, dass Sie an diesem Kurs nicht teilnehmen k&ouml;nnen. ' . BR_WT;
    $content .= 'Sollten in Ihrem Fall Stornogeb&uuml;hren anfallen, wird das '
                . 'von Ihnen angegebene Konto mit der f&auml;lligen Geb&uuml;hr belastet. '
                . '&Uuml;ber die Teilnahmebedingungen und die anfallenden Stornogeb&uuml;hren '
                . 'k&ouml;nnen Sie sich auf der '
                . '<a href="http://www.blak.de/d/items/teilnahmebedingungen.html" target="_blank">
                                             Website der BLAK</a> informieren.' . BR_WT . BR_WT;
    $content .= 'Gerne stehen wir Ihnen bei R&uuml;ckfragen jederzeit zur Verf&uuml;gung' . BR_WT . BR_WT;
    $content .= 'Ihre Abteilung Fortbildung der BLAK' . BR_WT;
    $content .= 'Telefon 089/ 92 62 63 / 64' . BR_WT;
    $content .= 'E-Mail: <a href="mailto:fortbildung@blak.aponet.de">fortbildung@blak.aponet.de</a>';
    $content .= BR_WT . BR_WT . '<a href="' . $this->getUrlParamsForFile(array('toolsection_id' => 335, 'belid' => $pData->id)) . '" title="zu den ' . $sprachsettings->KursZusammengesetzt['Singular']['Nominativ'] . 'details">Zurück</a></p>';

    $pPage->setContentHeader('Ihre Stornierung wurde an BLAK versendet.');
    $pPage->setContent($content);

    return $pPage;
  }

  
  protected function _getKomplizierteAbmeldungTextEnde()
  {
    return BR_WT . 'Bitte beachten Sie, dass der Kurs im Intranet weiterhin wie bisher angezeigt wird, bis Ihre Stornierung bearbeitet wurde.';
  }

  
  protected function _getStornoPage4Tool($pPageId, $pData)
  {
    return new PageTnMeineKurseAbmeldung($this, $pPageId, $pData);
  }

  
  protected function _getPage4Storno($pPageId, $pData)
  {
    $page = $this->_getStornoPage4Tool($pPageId, $pData);
    $pageLinks = array();
    $pageId4Storno = 358;
    $pageLinks['stornoaction'] = $this->getUrlParamsForFile(array('toolsection_id' => $pageId4Storno, 'belid' => $pData->id));
    $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();
    $pageLinks['showFeld4StornoGrund'] = !$this->toolSettings->stornoHideEingabeFeldStornoGrund;
    $page->setLinks($pageLinks);

    return $page;
  }

  
  protected function _getPage4AbmeldeFailure($pData, $pStornogrund = '', $pMailVersandGescheitert = true)
  {
    $pageId = 335;
    $pageId4Storno = 358;
    $page = $this->_getStornoPage4Tool($pageId, $pData);
    if ($pMailVersandGescheitert) {
      $page->mailVersandGescheitert = true;
    } else { 
      $page->stornoGescheitert = true;
    }
    
    $page->stornoGrund = $pStornogrund;
    $pageLinks = array();
    
    $pageLinks['stornoaction'] = $this->getUrlParamsForFile(array('toolsection_id' => $pageId4Storno, 'belid' => $pData->id));

    
    $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();
    $page->setLinks($pageLinks);

    return $page;
  }

  
  protected function _getEmailAdrEinrichtungForStorno($pBelegung)
  {
    
    if (!$this->toolSettings->stornoBenachrichtigungsMailAnVerwMa) {
      return $this->allgSettings->vhsemail;
    } else {
      $maKennung = $pBelegung->kurs->getVarValue('verwaltung_ma');
      if ($maKennung != '') {
        $dbwMa = new DBWorkBASysUser();
        $ma = $dbwMa->getBASysUserByKennung($maKennung);
        if ($ma->email != '') {
          return $ma->email;
        }
      }
      
      return $this->allgSettings->vhsemail;
    }
  }

  
  protected function _sendSimpleStornoMail($pPageId, $pBelegung, $pWarteListeBenachrichtigt)
  {
    $sprachsettings = new SprachSettingsObject();
    if ($this->toolSettings->stornoImmerBenachrichtigungsMail) {
      $text = ucfirst($sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ']) . ' ' . $pBelegung->teilnehmer->name_vorname . " ($pBelegung->tnr) hat " . $sprachsettings->Kurs['Singular_mit_Artikel']['Akkusativ'] . ' "' . $pBelegung->kurs->getVarValue('kurzbez_titel')
              . "\" ($pBelegung->knr) storniert.\n";

      if ($pWarteListeBenachrichtigt != null) {
        $text .= $sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ'] . " $pWarteListeBenachrichtigt->namevorname ($pWarteListeBenachrichtigt->tnr) von der Warteliste ";
        if ($pWarteListeBenachrichtigt->benachrichtigt) {
          $text .= ' wurde per E-Mail benachrichtigt';
        } else {
          $text .= ' konnte nicht benachrichtigt werden';
        }

        
        if ($pWarteListeBenachrichtigt->sendereplikathinweis) {
          $text .= '; auf dem Replikat ist dies nach der nächsten Übertragung ersichtlich.';
        } else {
          $text .= '.';
        }
        $text .= "\n";
      } elseif ($pBelegung->status != 'W') {
        $text .= 'Warteliste war leer oder der Kurs überbucht.' . "\n";
      } else {
        $text .= ucfirst($sprachsettings->Teilnehmer['Singular_mit_Artikel']['Nominativ'] . ' war auf der Warteliste.' . "\n");
      }
      $text .= "\n" . 'Diese Nachricht wurde automatisch von den KuferTools generiert.';

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

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

      smtpMail::sendStandardTextMail($emailAdress, 'Kurs Storno', $text);
    }
  }

  
  protected function _benachrichtigeWarteliste($pBelegung, $pBearbeiterkuerzel = '', $pWartelistenEntry = null, $pIsDMZ = false)
  {
    $sprachsettings = new SprachSettingsObject();
    $bearbeiterKuerzel = $pBearbeiterkuerzel != '' ? $pBearbeiterkuerzel : 'WT';
    $dbwBel = new DBWorkBelegung();
    if ($pIsDMZ) {
      
      $wlLaenge = 0;
      if (!is_null($pWartelistenEntry) && is_array($pWartelistenEntry)) {
        $wlLaenge = 1;
      }
    } else { 
      $wlLaenge = $dbwBel->getCountTNinWartelisteByKurs($pBelegung->knr);
    }
    if ($wlLaenge == 0) {
      return null;
    }

    
    $wartelistenBelId = '';
    if ($pIsDMZ) {
      if (is_array($pWartelistenEntry)) {
        $wartelistenBelId = $pWartelistenEntry['belid'];
      }
    }

    $dbwTeilnehm = new DBWorkTeilnehmer();
    
    if ($wartelistenBelId != '' && $pIsDMZ) {
      
      
      $wlBelegung = $dbwBel->getBelegung($wartelistenBelId);
    } else {
      
      $wlBelegung = $dbwBel->getFirstWartelistenBelegung($pBelegung->knr);
    }
    

    
    
    
    
    
    if ($pIsDMZ && ($wlBelegung->tnr != $pWartelistenEntry['tnr'] || $wlBelegung->status != $pWartelistenEntry['status_1']
            || $wlBelegung->knr != $pBelegung->knr)) {
      if ($pWartelistenEntry['firma'] > 0) { 
        $tnr = $pWartelistenEntry['firma'];
      } else {
        $tnr = $pWartelistenEntry['tnr'];
      }
      
      $changeWLStatusAllowed = false;
      $sendeReplikatHinweis = true;
    }
    
    else {
      if ($wlBelegung->firma > 0) { 
        $tnr = $wlBelegung->firma;
      } else {
        $tnr = $wlBelegung->tnr;
      }
      
      $changeWLStatusAllowed = true;
      $sendeReplikatHinweis = false;
    } 

    
    $result = new WartelistenBenachrichtigungTeilnehmer();
    $teilnehm = $dbwTeilnehm->getTeilnehm($tnr);
    

    
    
    $result->sendereplikathinweis = $sendeReplikatHinweis;
    
    if (!is_null($teilnehm->id) && $teilnehm->id >= 0) {
      $result->namevorname = $teilnehm->namevorname;
      $result->tnr = $teilnehm->id;
      $email = $teilnehm->getVarValueEx('email', 'kommunikation');
    } else {
      
      
      $result->namevorname = $pWartelistenEntry['name'] . ', ' . $pWartelistenEntry['vorname'];
      $result->tnr = $pWartelistenEntry['tnr'];
      $email = $pWartelistenEntry['email'];

      
      
      
      $teilnehm->ansprache = $pWartelistenEntry['ansprache'];
      $teilnehm->anrede = $pWartelistenEntry['anrede'];
      $teilnehm->titel = $pWartelistenEntry['titel'];
      $teilnehm->geschlecht = $pWartelistenEntry['geschlecht'];
      $teilnehm->name = $pWartelistenEntry['name'];
    }
    
    $ansprache = $teilnehm->getVarValue('ansprache_default');
    if ($email != '') {
      $text = '';
      if ($this->toolSettings->stornoWartelistenBenachrichtigungText != '') {
        $text = $this->toolSettings->stornoWartelistenBenachrichtigungText;
      } else {
        
        $text .= '{%t_ansprache%}';
        $text .= "\n\n";
        $text .= 'In ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'] . ' "{%k_kurzbez_titel%} ({%k_id%})" {%platz%} frei geworden.' . "\n";
        $text .= 'Bitte geben Sie uns umgehend Bescheid, ob weiterhin Interesse besteht.';
        $text .= "\n\nMit freundlichen Grüßen\n";
        $text .= 'Ihre {%vhsname%}';
      }
      $platz = 'ist ein Platz';

      $mitarbeiter = $this->getMitarbeiter($pBelegung->kurs->hpm, $pBelegung->kurs->getVarValue('verwaltung_ma'));

      $vars = array('{%t_ansprache%}' => $ansprache, '{%k_kurzbez_titel%}' => $pBelegung->kurs->getVarValue('kurzbez_titel'),
        '{%k_titel%}' => $pBelegung->kurs->titel, '{%k_kurzbez%}' => $pBelegung->kurs->kurzbez, '{%k_titel_zeile1%}' => $pBelegung->kurs->getVarValue('titel_zeile1'),
        '{%k_titel_untertitel%}' => $pBelegung->kurs->getVarValue('titel_untertitel'), '{%k_id%}' => $pBelegung->kurs->id, '{%k_nrab%}' => $pBelegung->kurs->nrab,
        '{%k_beginn_dat%}' => $pBelegung->kurs->beginn_dat, '{%k_ende_dat%}' => $pBelegung->kurs->ende_dat, '{%k_ort%}' => $pBelegung->kurs->ort,
        '{%platz%}' => $platz, '{%vhsname%}' => $this->allgSettings->vhsname, '{%k_hpm_email%}' => $mitarbeiter->email,
        '{%k_hpm_nachname%}' => $mitarbeiter->name, '{%k_hpm_vorname%}' => $mitarbeiter->vorname, '{%k_hpm_tel%}' => $this->getTelMitarbeiter($mitarbeiter));
      foreach ($vars as $toSearch => $replacement) {
        $text = str_replace($toSearch, $replacement, $text);
      }

      $result->benachrichtigt = smtpMail::sendStandardTextMail($email, 'Ein Platz wurde frei', $text);

      
      
      
      if ($result->benachrichtigt) {
        
        
        
        if ($this->_allowStatusChange($wlBelegung->id, $changeWLStatusAllowed)) {
          
          $dbwBel->changeWarteListenStatus($wlBelegung, $bearbeiterKuerzel);
        }
      }
    }

    return $result;
  }

  
  protected function getMitarbeiter($pMaKennungPlanend, $pMaKennungVerwaltend)
  {
    $dbwBasysUser = new DBWorkBASysUser();
    $maPlanend = $dbwBasysUser->getBASysUserByKennung($pMaKennungPlanend);
    if (trim($maPlanend->email) != '') {
      $mitarbeiter = $maPlanend;
    } else {
      $maVerwaltend = $dbwBasysUser->getBASysUserByKennung($pMaKennungVerwaltend);
      $mitarbeiter = $maVerwaltend;
    }

    return $mitarbeiter;
  }

  
  protected function getTelMitarbeiter($pMitarbeiter)
  {
    if (trim($pMitarbeiter->tel) != '') {
      $result = $pMitarbeiter->tel;
    } elseif (trim($pMitarbeiter->tel2) != '') {
      $result = $pMitarbeiter->tel2;
    } else {
      $result = $pMitarbeiter->tel3;
    }

    return $result;
  }

  
  private function _allowStatusChange($pBelegId, $pChangeAllowed)
  {
    return (!is_null($pBelegId) && ($pBelegId >= 0) && $pChangeAllowed);
  }

  
  protected function _handleAlleTermine($pPageId = 300)
  {
    ToolsAPI::updateAndGetSelectedIds($this->getToolId());

    $dbwKursTage = new DBWorkKurseTageWT();

    $vonDatum = DateTimeOperations::getValidDateString(GetOperations::getVarValue('von', ''));
    $bisDatum = DateTimeOperations::getValidDateString(GetOperations::getVarValue('bis', ''));
    $dbwKursTage->newSearch();
    $dbwKursTage->fromobject->datum = $vonDatum;
    $dbwKursTage->toobject->datum = $bisDatum;
    $dbwKursTage->fromobject->kurs = $this->_dbwBelegung->fromobject->kurs;
    $dbwKursTage->toobject->kurs = $this->_dbwBelegung->toobject->kurs;

    $dbwKursTage->orderby = 'datum';
    $dbwKursTage->setOrderAktuellesSemester($this->toolSettings);

    if ($this->toolSettings->versteckeKurstageWieImRaumanzeigeprogramm) {
      $dbwKursTage->fromobject->ranzprognoanz = true;
    }

    
    
    $belIdAryKursUebersicht = $this->_dbwBelegung->getBelegungsIdsbyTeilnehmerNR($this->_user->tnr);

    
    if ($this->toolSettings->tnStatusTermine === '') {
      $this->_dbwBelegung->fromobject->status = '-ATP';
    } else {
      $this->_dbwBelegung->fromobject->status = str_replace('A', '-A', $this->toolSettings->tnStatusTermine);
    }

    $belIdAry = $this->_dbwBelegung->getBelegungsIdsbyTeilnehmerNR($this->_user->tnr);
    $kursNrAry = $this->_dbwBelegung->getKursNrFromBelegungNrAry($belIdAry);

    if (count($kursNrAry) == 0) {
      $alleIds = array();
      $data = array();
    } else {
      
      $alleIds = $dbwKursTage->getKurstageIdsByTNOnlyDifferent($this->_user->tnr, $kursNrAry);
      $data = $this->getData($dbwKursTage, $alleIds, $this->toolSettings->kurstageproseite);
    }

    $this->setTotalData($alleIds);
    $termineGesamt = count($alleIds);

    $pageLinks = array();

    
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $pPageId . '.0.1')) {
      $count = count($data);
      if ($count == 0) {
        $pageLinks['terminenachoutlook'] = 'ics.php?usertype=TN&amp;von=' . $vonDatum . '&amp;bis=' . $bisDatum;
      } else {
        
        $kursNrAry = $dbwKursTage->getKurstageNrByTn($this->_user->tnr);
        
        $joinedKnrAry = implode(':', $kursNrAry);
        $count = count($data);
        $pageLinks['terminenachoutlook'] = 'ics.php?usertype=TN&amp;von=' . $data[0]->datum . '&amp;bis=' . $data[$count - 1]->datum . '&amp;terminnr=' . $joinedKnrAry;
      }
    }

    $pageLinks['terminplan'] = \SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $pPageId . '.0.5');

    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $pPageId . '.0.2')) {
      $pageLinks['filter'] = true;
    }
    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $pPageId . '.0.3')) {
      $pageLinks['print'] = true;
    }

    $pageLinks['self'] = 'usertools.php?tool_id=20&amp;toolsection_id=300';

    
    if (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $pPageId . '.0.4')
       && $this->rechteOR(array('335.1.1', '335.1.2', '335.1.3', '335.1.4', '335.1.5', '335.1.6',
                             '335.1.7'))) {
      $pageLinks['kursdetails'] = 'usertools.php?tool_id=20&amp;toolsection_id=335';
    }

    $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();
    $sprachsettings = new SprachSettingsObject();
    $page = new PageTnAlleTermine('meine ' . $sprachsettings->Kurs['Plural']['Nominativ'], $pPageId, $this, $data, $vonDatum, $bisDatum, $termineGesamt, $this->toolSettings->kurstageproseite, $belIdAryKursUebersicht);
    $page->setLinks($pageLinks);

    return $page;
  }

  
  protected function isKostenloserKurs($pBelegung)
  {
    $gebuehr = MathOperations::stringToFloat($pBelegung->kurs->gebuehr);

    return empty($gebuehr);
  }

  
  protected function _getPunkteBestLink($pPageLinks, $pData, $pDetailSightId)
  {
    return $pPageLinks;
  }

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

  
  private function _handleAjaxUpload4BGLU()
  {
    
    $alleIds = $this->getAlleIdsBelegungen($this->_dbwBelegung);
    $data = $this->getData($this->_dbwBelegung, $alleIds, 1, GetOperations::getVarValue('belid'));
    $data = $data[0]; 

    $nachweisArt = RequestOperations::getVarValue('nachweisart');
    try {
      $dateinameMitPfadFormatAry = $this->getAttachementOfTn();
      $emailDMZAry = array('DMZ' => '', 'EMail' => '');

      if (!empty($dateinameMitPfadFormatAry)) {
        $dateinameMitPfadFormat = $dateinameMitPfadFormatAry->name;
        $dateiname = basename($dateinameMitPfadFormat, '"\\"');
        $datDocAry = $this->getNachweisDatDocAry($data, $dateiname, $nachweisArt);

        $dateiAnDmzSenden = DatDocAPI::sendDokumente2DMZ($datDocAry, $dateinameMitPfadFormat);
        $emailDMZAry['DMZ'] = $dateiAnDmzSenden;

        if ($emailDMZAry['DMZ'] === 'nichtAktiviert') {
          Logger::logg('Tool Teilnehmer: Fehlermeldung für das Senden der Datei an DMZ: Die Datei wurde nicht hochgeladen.');
        }

        if ($emailDMZAry['DMZ'] !== 'nichtAktiviert') {
          $emailVersenden = $this->emailInhaltMitAnhangNachUploadedFile($data->kurs, $dateinameMitPfadFormat, $nachweisArt);
          $emailDMZAry['EMail'] = $emailVersenden;
        } else {
          Logger::logg('Tool Teilnehmer: Fehlermeldung für das Senden der E-Mail an Einrichtung: Die E-Mail wurde nicht versendet.');
        }
      } else {
        Logger::logg('Fehlermeldung für das Hochladen der Datei: Die Datei wurde nicht hochgeladen.');
      }
    } catch (Exception $ex) {
      Logger::logg('Tool Teilnehmer Upload von Dateien Fehler: ' . $ex->getMessage(), 100);
    }

    return JsonOperations::encodeBase64($emailDMZAry);
  }

  
  private function emailInhaltMitAnhangNachUploadedFile($pKurs, $pDateinameMitPfadFormat, $pNachweisart)
  {
    $dateiBezeichnung = DatDocAPI::getNachweisartBGLUKurs($pNachweisart);
    $teilnehmer = SessionOperations::getCurrentWebToolsTeilnehmer();
    $senderEmailData = ToolsAPI::getSenderEmailAddressAndName($teilnehmer);
    $emailTeilnehmer = $senderEmailData['email'];
    $mailAddressEinrichtung = EmailOperations::getToolEmailAddressForVhs($this->toolSettings->vhsEmailTool20Section335_bgluKurs);
    $subject = 'KuferTools: Teilnehmer ' . $teilnehmer->getVarValue('name_vorname_ohne_komma') . ' hat ein Dokument zum Kurs ' . $pKurs->id . ' hochgeladen';
    if ($teilnehmer->geschlecht == 'W') {
      $tnBezeichnung = 'Die Teilnehmerin';
      $tnBezeichnung2 = 'bei der Teilnehmerin';
    } else {
      $tnBezeichnung = 'Der Teilnehmer';
      $tnBezeichnung2 = 'beim Teilnehmer';
    }


    $emailTextHtml = '<div>' . $tnBezeichnung . ' ' . $teilnehmer->getVarValue('name_vorname_ohne_komma') . ' hat ein Dokument zum Kurs "' . $pKurs->kurzbez . '" (' . $pKurs->id . ') hochgeladen.</div>';
    $emailTextHtml .= '<div>Sie finden das Dokument "' . $dateiBezeichnung . '" im Anhang dieser E-Mail. Außerdem wurde das Dokument in KuferSQL ' . $tnBezeichnung2 . ' hinterlegt, und kann im Teilnehmerstamm unter "Dokumente" eingesehen werden.</div>';

    try {
      $emailSenden = new smtpMailTools();
      $emailSenden->SetVar2Value('from', $emailTeilnehmer);
      $emailSenden->SetVar2Value('to', $mailAddressEinrichtung);
      $emailSenden->SetVar2Value('subject', $subject);
      $emailSenden->SetVar2Value('contenttype', SMTP_CONTENTTYPE_HTML);
      $emailSenden->SetVar2Value('body', $emailTextHtml);
      
      $emailSenden->addAttachment($pDateinameMitPfadFormat);
      $emailSenden->setFooter('Dokument hochladen', SessionOperations::getCurrentWebToolsUser(), $pKurs);
      
      return $emailSenden->sendMail();
    } catch (Exception $ex) {
      Logger::logg('Fehler beim Senden der E-Mail mit einem Dokument im Anhang: ' . $ex->getMessage(), 100);

      return false;
    }
  }

  
  public function getAttachementOfTn()
  {
    $tool0settings = ToolSettingsAPI::getToolSettings(0);
    
    $uploadPath = UploadUserAPI::getUploadPath4User($tool0settings->uploadpath, $this->_user);

    
    $userBasedUploadStrategy = new UserBasedUploadFileStrategy();

    $doUploadAttachment = UploadOperations::doUpload(
      'uploadfile',
      $uploadPath,
      1,
      $tool0settings->uploadmaxsize,
      $userBasedUploadStrategy,
      '',
      true
    );

    if (empty($doUploadAttachment)) {
      throw new Exception('Es wurde keine Datei hochgeladen.');
    }
    if ($doUploadAttachment[0]->errorMsg !== '') {
      throw new Exception($doUploadAttachment[0]->errorMsg);
    }

    return $doUploadAttachment[0];
  }

  
  private function getNachweisDatDocAry($pData, $pDateinameMitPfadFormat, $pNachweisart)
  {
    
    $datDoc = new Dat_doc();
    $datDoc->knr = $pData->knr; 
    $datDoc->datum = DateTimeOperations::getDateNow();
    $datDoc->lfdnr = ''; 
    $datDoc->nr = $pData->tnr; 
    $datDoc->typ = $pData->teilnehmer->typ; 

    $tool0settings = ToolSettingsAPI::getToolSettings(0);
    $datDoc->pfaddok = UploadUserAPI::getUploadPath4User($tool0settings->uploadpath, $this->_user);
    $datDoc->pfadvorlage = $datDoc->pfaddok;
    $datDoc->datnamdok = basename($pDateinameMitPfadFormat, '"\\"');
    $datDoc->datnamvorlage = $datDoc->datnamdok;
    $datDoc->name = $datDoc->datnamdok; 
    $datDoc->versandtam = DateTimeOperations::getDateTimeNow();
    $datDoc->versandtvom = $pData->teilnehmer->name;
    $datDoc->beschreibung = DatDocAPI::getNachweisartBGLUKurs($pNachweisart);
    $datDoc->nachweis = 'W';
    $datDocAry = array();
    $datDocAry[] = $datDoc;

    return $datDocAry;
  }

  protected function getJsDeclarationsHook()
  {
    return JsOperations::getDeclarationJson('KuferTools.NachweisartMap', DatDocAPI::getNachweisartMap());
  }
}

class ToolTnBlak extends ToolTn
{
  public function getJS()
  {
    $result = parent::getJS();
    $result[] = 'js/TNTool/punkte.js';

    return $result;
  }

  
  protected function _getPage($pPageId, $pData, $pSprachSettings, $anzahlAllerBelegungenDesTeilnehmers)
  {
    $page = new PageTnMeineKurseUebersichtBLAK(
      'meine ' . $pSprachSettings->Kurs['Plural']['Nominativ'],
      $pPageId,
      $this,
      $pData,
      'meine Anmeldungen',
      $anzahlAllerBelegungenDesTeilnehmers,
      $this->toolSettings->kurseproseite
    );
    try {
      $teilnehm = \SessionOperations::getCurrentWebToolsTeilnehmer();
    } catch (\Exception $ex) {
      $teilnehm = false;
    }
    if ($teilnehm !== false) {
      
      
      $wtMeldungVorhanden = !DateTimeOperations::isDateTimeEmptyOrDefault($teilnehm->wtmeldungam);
      if (!$wtMeldungVorhanden
          || DateTimeOperations::isDateBefore(DateTimeOperations::computeDate($teilnehm->wtmeldungam, '+2 year'), DateTimeOperations::getDateNow())) {
        if (!DateTimeOperations::isDateTimeEmptyOrDefault($teilnehm->zertifikat_druck_dat)) {
          
          $datumZumVergleich = DateTimeOperations::computeDate($teilnehm->zertifikat_druck_dat, '-2 months');
          $datumZumVergleich = DateTimeOperations::computeDate($datumZumVergleich, '+3 years');
          if (DateTimeOperations::isDateBefore($datumZumVergleich, DateTimeOperations::getDateNow())) {
            $dbwKennz = new DBWorkKennz();
            $kennz = $dbwKennz->getKennzShort4Teilnehmer($teilnehm->id);
            $blakKennz = ConstantOperations::getBlakBerufsgruppenKennz();
            $beruf = 11;
            foreach ($kennz as $kennzeichen) {
              if (in_array($kennzeichen, $blakKennz)) {
                $beruf = $kennzeichen;
                break;
              }
            }
            $varName = "blak{$beruf}meldungZertAblauf";
            $page->reminderNotification = $this->toolSettings->{$varName};

            $teilnehm->wtmeldungam = DateTimeOperations::getDateNow();

            $nichtInsProtokoll = $this->_setWtMeldungDMZ($teilnehm);

            $dbWorkTn = new DBWorkTeilnehmer();
            
            
            $dbWorkTn->updateTeilnehmer($teilnehm, $nichtInsProtokoll);
          }
        } else {
          $dbWorkTn = new DBWorkTeilnehmer();
          
          $punkteZahl = $dbWorkTn->getTeilnehmerPunkte4KurseBlak(
            $teilnehm->id,
            DateTimeOperations::computeDate(DateTimeOperations::getDateNow(), '-3 years'),
            true
          );

          $dbwKennz = new DBWorkKennz();
          $kennz = $dbwKennz->getKennzShort4Teilnehmer($teilnehm->id);
          $blakKennz = ConstantOperations::getBlakBerufsgruppenKennz();
          $zuErreichendePunkte = 150;
          $beruf = 11;
          foreach ($kennz as $kennzeichen) {
            if (in_array($kennzeichen, $blakKennz)) {
              $zuErreichendePunkte = ConstantOperations::getBlakPunkteschwelle($kennzeichen);
              $beruf = $kennzeichen;
              break;
            }
          }
          
          $minSchwelle = 0.01 * (float)$this->toolSettings->blakUntereSchwelle;
          $maxSchwelle = 0.01 * (float)$this->toolSettings->blakObereSchwelle;
          if ($minSchwelle * $zuErreichendePunkte <= $punkteZahl && $punkteZahl <= $maxSchwelle * $zuErreichendePunkte) {
            $varName = "blak{$beruf}meldungOhneZertPunkte";
            $page->reminderNotification = $this->toolSettings->{$varName};


            $teilnehm->wtmeldungam = DateTimeOperations::getDateNow();
            $nichtInsProtokoll = $this->_setWtMeldungDMZ($teilnehm);
            $dbWorkTn = new DBWorkTeilnehmer();
            
            
            $dbWorkTn->updateTeilnehmer($teilnehm, $nichtInsProtokoll);
          }
        }
      }
    }

    return $page;
  }

  protected function getStornoHinderungsGruendKursBeginnDatum($pData)
  {
    $gruend = array();
    if (!$this->isKostenloserKurs($pData)) {
      return parent::getStornoHinderungsGruendKursBeginnDatum($pData);
    }

    return $gruend;
  }

  protected function getStornoHinderungsGruendAnmeldeschluss($pData)
  {
    $gruend = array();
    if (!$this->isKostenloserKurs($pData)) {
      return parent::getStornoHinderungsGruendAnmeldeschluss($pData);
    }

    return $gruend;
  }

  
  private function _setWtMeldungDMZ($pTeilnehm)
  {
    $allgsettings = AllgSettingsAPI::getAllgSettings();
    
    if (SessionOperations::isReplikat() && $allgsettings->dmzEnabled) {
      try {
        WtMeldungAPI::sendTnMeldung(array($pTeilnehm));
      } catch (Exception $e) {
        
        Logger::logg($e->getMessage(), 100);
      }

      return true;
    }

    return false;
  }

  
  protected function _getPunkteBestLink($pPageLinks, $pData, $pDetailSightId)
  {
    if (BelegungOperations::isPunkteBestaetigenAllowed($pData)
      && SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), $pDetailSightId . '.0.6')) {
      $pPageLinks['punkteBest'] = $this->getUrlParamsForFile(array('toolsection_id' => $pDetailSightId, 'belid' => $pData->id));

      return $pPageLinks;
    }

    return parent::_getPunkteBestLink($pPageLinks, $pData, $pDetailSightId);
  }

  
  protected function _getStornoPage4Tool($pPageId, $pData)
  {
    return new PageTnMeineKurseAbmeldungBLAK($this, $pPageId, $pData);
  }

  
  protected function _checkWeitereStornoHindernisse($pGruende, $pData)
  {
    return ConstantOperations::getBlakStornoHindernisse($pGruende, $pData);
  }

  
  protected function _getKomplizierteAbmeldungTextEnde()
  {
    return ' Ob mit der Stornierung für Sie Kosten entstehen, werden wir klären und Ihnen mit der Stornobestätigung mitteilen.'
     . BR_WT . BR_WT . 'Falls in Ihrem Fall zutreffend, wird Ihr Konto nach dem Fortbildungstermin mit der fälligen Stornogebühr belastet werden. '
     . 'Über unsere Stornobedingungen und die anfallenden Stornogebühren können Sie sich <a href="' . $this->allgSettings->vhsagb
     . '" target="_blank" title="zu den AGB">hier</a> informieren.';
  }
}

class WartelistenBenachrichtigungTeilnehmer
{
  public $namevorname;
  public $tnr;

  
  public $benachrichtigt;
  
  public $sendereplikathinweis;
}