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


class ToolTeilnehmerInfo extends ToolBase
{
  private $_user;
  private $_dbwtn;

  private $_teilnehmerProSeite;

  
  public function __construct()
  {
    parent::__construct();
    $this->toolTitle = 'Teilnehmerübersicht';
    $this->_user = SessionOperations::getCurrentWebToolsUser();
    $this->_dbwtn = new DBWorkTeilnehmer(1, true);

    
    $this->_teilnehmerProSeite = $this->toolSettings->teilnehmerproseite > 0 ? $this->toolSettings->teilnehmerproseite : 6;
  }

  
  protected function doByBrowserRefresh()
  {
    $_POST = array();
    $_SERVER['REQUEST_METHOD'] = 'GET';
  }

  
  public function init($pPageId)
  {
    
    $this->checkBrowserReload();
    
    switch ($pPageId) {
      default:
      case 41:
        $statusMessage = '';
        if (PostOperations::isDefined('tninsert') && PostOperations::getVarValue('tninsert') == 1) {
          if (Xsrf::KEY_OK == Xsrf::checkAndUseXsrfFromGet('wt_ma_tnneu')) {
            
            $result = $this->_handleTeilnehmerInsert();
            $statusMessage = $result['statusMessage'];
            $tnId = $result['tnId'];
            if ($tnId != -1) {
              $dbwTn = $this->_getDefaultDBWorkTeilnehmer();
              
              $this->setDBWorkTnObjectFromRequest($dbwTn);
              $alleTeilnehmerNummern = ToolTeilnehmerInfo::getTeilnehmerNummern($dbwTn);
              $this->setTotalData($alleTeilnehmerNummern);
              $keys = array_keys($this->getTotalData(), $tnId);
              GetOperations::fakeCall(array('tool_id' => \ToolsAPI::TOOL_TEILNEHMERINFO_MA, 'toolsection_id' => 411, 'tnr' => $tnId,
                  'currentIndex' => ($keys[0] + 1)));
              $page = $this->_handleTeilnehmerdetails(411, $statusMessage);
              break;
            }
          } else {
            $statusMessage = HTMLOperations::getAlertBox('Der Teilnehmer konnte aus technischen Gründen nicht angelegt werden.', 'Fehler beim Anlegen des Teilnehmers');
          }
        }
        $page = $this->_handleTeilnehmerUebersicht($pPageId, $statusMessage);
        break;
      

      case 411:
        $statusMessage = '';
        
        if (PostOperations::isDefined('teilnupdate') && PostOperations::getVarValue('teilnupdate') == 1) {
          if (Xsrf::KEY_OK == Xsrf::checkAndUseXsrfFromGet('wt_ma_tnbearbeiten', $this->getNr4Userdetails('teilnehmer'))) {
            $detailsSightId = 42;
            
            $statusMessage .= $this->_handleTeilnehmerUpdate($detailsSightId);
          } else {
            $statusMessage = HTMLOperations::getAlertBox('Der Teilnehmer konnte aus technischen Gründen nicht bearbeitet werden.', 'Fehler beim Bearbeiten des Teilnehmers');
          }
        } elseif (PostOperations::isDefined('belIdsToStorno')) {
          if (Xsrf::KEY_OK == Xsrf::checkAndUseXsrfFromGet('wt_ma_tnstorno', $this->getNr4Userdetails('teilnehmer'))) {
            $belegungIdsStr = PostOperations::getVarValue('belIdsToStorno');
            $belegungIds = explode(';', $belegungIdsStr);
            $dbwBelegung = new DBWorkBelegung(1, true);
            $belegungen = $dbwBelegung->getBelegungenByIds($belegungIds);
            $statusMessage .= $this->_handleStorno($belegungen);
          } else {
            $statusMessage = HTMLOperations::getAlertBox('Die Kurse konnten aus technischen Gründen nicht storniert werden.', 'Fehler beim Stornieren der Kurse');
          }
        } else {
          $tnr = $this->getNr4Userdetails('teilnehmer');
          $statusMessage .= $this->_handleAktualisiereStammBv($tnr);
        }
        $page = $this->_handleTeilnehmerdetails($pPageId, $statusMessage);
        break;
    }
    if ($page == null) {
      throw new Exception('ungültige PageId');
    }

    $this->currentPage = $page;
  }

  

  
  private function setDBWorkTnObjectFromRequest($pDBWorkTn = null)
  {
    $searchAPI = new TeilnehmersuchAPI();
    
    
    
    $searchAPI->getSearchParamsFromReqToSession('tool' . $this->toolId, 'searchteilnehmer');

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

  
  public static function getTeilnehmerNummern($pDBWorkTn = null)
  {
    $settings = ToolSettingsAPI::getToolSettings(\ToolsAPI::TOOL_TEILNEHMERINFO_MA);

    if (is_null($pDBWorkTn)) {
      $dbwTn = new DBWorkTeilnehmer();
      $dbwTn->newSearch();
    } else {
      $dbwTn = $pDBWorkTn;
    }

    $dbwTn->setPersonenOrderBySettings($settings, 'tn');

    
    if ($settings->useBereichsRechte) {
      $userId = SessionOperations::getUserIdentifier();
      $alleTeilnehmerNummern = $dbwTn->getTeilnehmerIdsbyFilter($userId);
    } else {
      $alleTeilnehmerNummern = $dbwTn->getTeilnehmerIdsbyFilter();
    }

    return $alleTeilnehmerNummern;
  }

  
  private function _handleTeilnehmerUebersicht($pPageId, $pStatusMessage = '')
  {
    
    
    $this->updateAndGetSelectedIds();

    $pageLinks = array();

    $dbwTn = $this->_getDefaultDBWorkTeilnehmer();
    
    $this->setDBWorkTnObjectFromRequest($dbwTn);
    $alleTeilnehmerNummern = ToolTeilnehmerInfo::getTeilnehmerNummern($dbwTn);

    
    $this->setTotalData($alleTeilnehmerNummern);
    $tnAnzahl = count($alleTeilnehmerNummern);
    $tnNummernDerSeite = ToolsAPI::getDataForCurrentPage($alleTeilnehmerNummern, $this->_teilnehmerProSeite);

    $userid = $this->_user->getIdentifier();
    
    $data = $dbwTn->getTeilnehmByIdArray($tnNummernDerSeite);
    
    
    
    $pageLinks['teilnehmerDetails'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_TEILNEHMERINFO_MA, $pPageId . '.0.1') == 2
                                     && $this->rechteOR(array('411.1.1', '411.1.2', '411.1.3')));

    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_TEILNEHMERINFO_MA, $pPageId . '.0.2') == 2) {
      $pageLinks['newTeilnehmer'] = true;
    }

    
    $pageLinks['print'] = (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_TEILNEHMERINFO_MA, $pPageId . '.0.3') == 2);
    $pageLinks['markieren'] = false;
    $pageLinks['checkboxen'] = false;
    
    $pageLinks['filter'] = true;
    $pageLinks['print'] = true;
    $pageLinks['self'] = $this->getUrlParamsForFile(array('toolsection_id' => 41));
    

    
    $tnSuchForm = $this->getSearchForm();
    $page = new PageMaTeilnehmerUebersicht($this, $data, $tnAnzahl, $this->_teilnehmerProSeite, $pPageId, $pStatusMessage, $tnSuchForm);
    $page->setLinks($pageLinks);

    return $page;
  }

  

  
  private function _handleStorno($pBelegungAry)
  {
    $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->vhsEmailTool11Section43);
        $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)
  {
    $kursList = '';
    foreach ($pBelegungAry as $belegung) {
      $kursList .= '<div>' . CleanOperations::cleanStringForHtml($belegung->kurs->kurzbez) . ' (' . CleanOperations::cleanStringForHtml($belegung->kurs->id) . ')</div>';
    }
    $meldung = 'Zu folgenden Kursen wurde erfolgreich eine Stornierung durchgeführt:';

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

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

    $meldung = 'Zu folgenden Kursen wurde eine E-Mail mit der Stornoanfrage an die Einrichtung versendet:';

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

  
  private function _getErrorMessage4Storno($pBelegungAry)
  {
    $kursList = '';
    foreach ($pBelegungAry as $belegung) {
      $kursList .= '<div>' . CleanOperations::cleanStringForHtml($belegung->kurs->kurzbez) . ' (' . CleanOperations::cleanStringForHtml($belegung->kurs->id) . ')</div>';
    }
    $meldung = 'Folgende Kurse 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 . $kursList . '</div>', 'Fehler beim Versenden der Stornierung', 'in_background');
  }

  
  public function getAjaxResponse()
  {
    $result = '';
    
    if (RequestOperations::isDefined('action')) {
      switch (RequestOperations::getVarValue('action')) {
        
        case 'newTeilnehmer':
          $pageId4Details = 42; 

          $dbwTn = new DBWorkTeilnehmer();
          $data = $dbwTn->getNewObject();
          $searchAPI = new TeilnehmersuchAPI();

          $fromObject = $searchAPI->getFromObjectBySession(null, 'tool' . $this->getToolId());
          
          $data->name = $fromObject->name;
          $data->vorname = $fromObject->vorname;
          $data->gebdat = ''; 

          
          
          $xsrf = new Xsrf();
          $xsrfKey = $xsrf->generateKey4Action('wt_ma_tnneu'); 
          $page = new TabPageSightBuilder('Details zum neuen Teilnehmer', $data, $this->getToolId(), $pageId4Details, true, 'Infotool', $xsrfKey);

          $resultObj = $page->getAjaxObject4Tab();

          if (SessionOperations::isReplikat() && !SessionOperations::isDmzBetrieb()) {
            $message = HTMLOperations::getInfoBox(
              'Der Teilnehmer wird zunächst nur temporär erzeugt. 
                                                    Der neue Teilnehmer wird nur dann in das Hauptsystem zurückgespielt, 
                                                    wenn anschließend der Teilnehmer zu einem Kurs angemeldet wird.' . BR_WT . '
                                                    Achtung, es werden nicht alle Felder in KuferSQL übernommen.',
              'Temporärer Teilnehmer'
            );
            $resultObj->page = '<div>' . $message . $resultObj->page . '</div>';
          }

          $result = JsonOperations::encode4Ajax($resultObj);
          break;
          
        case 'updateTeilnehmer':
          $pageId4Details = 42; 
          
          $dbwTn = new DBWorkTeilnehmer();

          $tnr = PostOperations::getVarValue('tnr', -1);
          $data = $dbwTn->getTeilnehm($tnr);

          $xsrf = new Xsrf();
          $xsrfKey = $xsrf->generateKey4Action('wt_ma_tnbearbeiten', $tnr);
           
           
          $page = new TabPageSightBuilder('Teilnehmerdetails bearbeiten', $data, $this->getToolId(), $pageId4Details, true, 'Infotool', $xsrfKey);
          $resultObj = $page->getAjaxObject4Tab();

          if (SessionOperations::isReplikat() && !SessionOperations::isDmzBetrieb()) {
            $dbwWebReplikatSettings = new DBWorkWebReplikatSettings();
            $highestTnr = $dbwWebReplikatSettings->getHighestTNNr();

            if ($tnr > $highestTnr->value) {
              $message = HTMLOperations::getInfoBox(
                'Der Teilnehmer ist nur temporär angelegt. 
                                                      Die geänderten Daten werden nur dann in das Hauptsystem zurückgespielt, 
                                                      wenn anschließend der Teilnehmer zu einem Kurs angemeldet wird.' . BR_WT . '
                                                      Achtung, es werden nicht alle Felder in KuferSQL übernommen.',
                'Temporärer Teilnehmer'
              );
              $resultObj->page = '<div>' . $message . $resultObj->page . '</div>';
            }
          }

          $result = JsonOperations::encode4Ajax($resultObj);
          break;

        
        case 'kursFilter':
          $result = $this->_handleAjaxKursFilter4Teilnehmer();
          break;
        case 'validate':
          $result = JsonOperations::encode4Ajax($this->_handleAjaxValidateBankData());
          break;
        case 'getBankDaten':
          $stammBvId = PostOperations::getVarValue('bank_id');
          $result = $this->_getStammBv4Ajax($stammBvId);
          break;
       
      
      } 
    } 

    return $result;
  }

  

  
  private function _getStammBv4Ajax($pId)
  {
    $dbwStammBv = new DBWorkStammBv();
    $tnr = $this->getNr4Userdetails('teilnehmer');
    $dbwStammBv->isTnOwner($pId, $tnr);
    $stammBv = $dbwStammBv->getOne($pId);

    return JsonOperations::encodeBase64($stammBv);
  }

  
  private function _handleAjaxKursFilter4Teilnehmer()
  {
    $datVon = PostOperations::getVarValue('filter_datumvon');
    $datBis = PostOperations::getVarValue('filter_datumbis');

    $kursTitel = PostOperations::getVarValue('filter_kurstitel');
    $knrVon = PostOperations::getVarValue('filter_knrvon');
    $knrBis = PostOperations::getVarValue('filter_knrbis');

    $dbwBelegung = new DBWorkBelegung(1, true);
    $dbwBelegung->newSearch();
    
    
    $dbwBelegung->toobject->kurs->beginn_dat = $datBis;
    $dbwBelegung->toobject->kurs->ende_dat = $datVon;
    $dbwBelegung->fromobject->kurs->id = $knrVon;
    $dbwBelegung->toobject->kurs->id = $knrBis;
    $dbwBelegung->fromobject->kurs->kurzbez = $kursTitel;

    
    $this->toolSettings->sortkurse = str_replace('nr', 'k.nr', $this->toolSettings->sortkurse);
    $this->toolSettings->sortkurse2 = str_replace('nr', 'k.nr', $this->toolSettings->sortkurse2);

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

    $tnr = $this->getNr4Userdetails('teilnehmer');
    $kursTab = $this->_getKurseTab($tnr, $dbwBelegung, '');

    return $kursTab->getContent();
  }

  

  
  private function _handleTeilnehmerInsert()
  {
    $saveSight = 42;
    $saveTool = $this->getToolId();
    $teilnehmer = $this->_dbwtn->getNewObject();
    $builder = new SightBuilder($saveTool, $saveSight, $teilnehmer);

    return TeilnehmerAPI::saveTeilnehmerBySightBuilder($builder);
  }

  

  
  private function _handleTeilnehmerUpdate($pSightId)
  {
    $statusMessage = '';
    $dbwTeiln = new DBWorkTeilnehmer(1, true);
    $tnr = $this->getNr4Userdetails('teilnehmer');
    $teilnehmer = $dbwTeiln->getTeilnehm($tnr, true);

    
    if (RequestOperations::getMethod() == 'post') {
      $builder = new SightBuilder($this->getToolId(), $pSightId, $teilnehmer);

      
      $builder->saveData();
      $validationOK = $builder->checkValidation();

      if ($validationOK) {
        
        $saveResult = TeilnehmerAPI::saveTeilnehmer($builder, true);
        $statusMessage .= $saveResult['statusMessage'];
      }
    } 
    
    return $statusMessage;
  }

  

  
  private function _handleTeilnehmerdetails($pPageId = 411, $pStatusMessage = '')
  {
    
    $fromOtherTab = SessionOperations::getVarValueWTIntern($this->toolId . '_fromTab');
    
    
    
    
    if (GetOperations::isDefined('fromOtherTool')) {
      $tnr = GetOperations::getVarValue('tnr');
      $this->setTotalData(array($tnr));
    }
    $tnr = $this->getNr4Userdetails('teilnehmer');

    
    $data = $this->_dbwtn->getTeilnehm($tnr, true);
    
    $dbw = new DBWorkTools();

    $userid = $this->getUser()->getIdentifier(); 
    
    $reiterSeite = new ReiterSeite($pPageId, $this->toolSettings->reiterBeschriftung);
    $sprachsettings = new SprachSettingsObject();

    
    
    
    $allTnNrs = $this->getTotalData('##');

    $anzahlAllerTeilnehmer = 0;
    $anzahlTnProSeite = 1;
    if ($allTnNrs != '##') {
      $anzahlAllerTeilnehmer = count($allTnNrs);
    }

    $detailSightId = 42;
    $tabPage = new TabCollectionPersonendetails(
      $sprachsettings->Teilnehmer['Plural']['Nominativ'],
      $pPageId,
      $this,
      $sprachsettings->Teilnehmer['Singular']['Nominativ'] . '  ' . $data->namevorname,
      $data,
      $anzahlAllerTeilnehmer,
      $anzahlTnProSeite,
      $pStatusMessage,
      'teilnehmerdetails'
    );
    $pageLinks = array();

    
    if (\SecurityOperations::privilegAllowed($userid, $this->getToolId(), $reiterSeite->getRecht('Teilnehmerdetails'))) {
      $tabPage->addTabPage(new TabPageSightBuilderUebersicht($reiterSeite->getLabel('Teilnehmerdetails'), $data, $this->getToolId(), $detailSightId));
    }
    
    if (\SecurityOperations::privilegAllowed($userid, $this->getToolId(), $reiterSeite->getRecht('belegteKurse'))) {
      $dbwBelegung = new DBWorkBelegung(1, true);
      $dbwBelegung->newSearch();
      
      
      $actualDate = DateTimeOperations::getDateNow();
      $dbwHlSem = new DBWorkHLSemester();
      $semester = $dbwHlSem->getSemesterByDate($actualDate);

      
      
      if ($this->toolSettings->useZeitraumVorbelegung) {
        $dbwBelegung->toobject->kurs->beginn_dat = $this->toolSettings->zeitraumVorbelegung_ende_dat;
        $dbwBelegung->toobject->kurs->ende_dat = $this->toolSettings->zeitraumVorbelegung_beginn_dat;
      } elseif ($semester !== false) {
        $dbwBelegung->toobject->kurs->beginn_dat = $semester->bis;
        $dbwBelegung->toobject->kurs->ende_dat = $semester->von;
      }
      
      
      
      
      $this->toolSettings->sortkurse = str_replace('nr', 'k.nr', $this->toolSettings->sortkurse);
      $this->toolSettings->sortkurse2 = str_replace('nr', 'k.nr', $this->toolSettings->sortkurse2);

      $tool8Setting = ToolSettingsAPI::getToolSettings(8);
      $dbwBelegung->dbwkurse->justNoAusfall = $tool8Setting->keineAusgefallenenKurse;
      $dbwBelegung->setOrderBySettings($this->toolSettings);

      $kurseTab = $this->_getKurseTab($tnr, $dbwBelegung, $reiterSeite->getLabel('belegteKurse'));
      $tabPage->addTabPage($kurseTab);
    }
    
    if (\SecurityOperations::privilegAllowed($userid, $this->getToolId(), $reiterSeite->getRecht('Qualifikationen'))) {
      $sight4TnAusbildung = 259;
      $sight4TnWerdegang = 260;
      $tabPage->addTabPage(new TabTeilnehmerQualifikationen($reiterSeite->getLabel('Qualifikationen'), $data, $sight4TnAusbildung, $sight4TnWerdegang));
    }

    
    if (\SecurityOperations::privilegAllowed($userid, $this->getToolId(), $reiterSeite->getRecht('Bankverbindungen'))) {
      $sight4Bankverbindungen = 435;

      $dbwStammBv = new DBWorkStammBv();
      $stammBvAry = $dbwStammBv->getStammBvByTnr($data->id);

      $bearbeitbar = false;
      
      if (SessionOperations::isDmzBetrieb() || !SessionOperations::isReplikat()) {
        $bearbeitbar = \SecurityOperations::privilegAllowed($userid, $this->getToolId(), $sight4Bankverbindungen . '.0.1') == 2;
      }
      $tabPage->addTabPage(new TabTeilnehmerBankverbindungen($reiterSeite->getLabel('Bankverbindungen'), $stammBvAry, $sight4Bankverbindungen, $data, $bearbeitbar));
    }

    

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

    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_TEILNEHMERINFO_MA, $pPageId . '.0.1')) {
      $pageLinks['tnUpdate'] = true;
    }

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

    
    if (\SecurityOperations::privilegAllowed($userid, \ToolsAPI::TOOL_TEILNEHMERINFO_MA, $pPageId . '.0.3') && $dbw->isToolAllowed($userid, \ToolsAPI::TOOL_ANMELDUNGBUCHEN_MA)) {
      
      
      $pageLinks['anmelden'] = $this->getUrlParamsForFile(array('tool_id' => \ToolsAPI::TOOL_ANMELDUNGBUCHEN_MA, 'toolsection_id' => 19,
                                                          'einstieg' => 1, 'tnr' => $data->id, 'link2AnmeldfromTool' => \ToolsAPI::TOOL_TEILNEHMERINFO_MA));
    }

    
    $tabPage->setLinks($pageLinks);

    return $tabPage;
  }

  
  private function _getKurseTab($pTnr, $pDbwBelegung, $pReiterBezeichnung)
  {
    $sightId = 43;
    $user = SessionOperations::getCurrentWebToolsUser();
    $showButtonAbmelden = \SecurityOperations::privilegAllowed($user->getIdentifier(), \ToolsAPI::TOOL_TEILNEHMERINFO_MA, $sightId . '.0.3') == 2;

    $enableMarkieren = $showButtonAbmelden;

    
    $belegungen = $pDbwBelegung->getBelegungenbyTeilnehmerNR($pTnr);

    
    $spalten = array();
    $htmlStyle = new HtmlStyle();
    $htmlStyle->width = '16px';
    if ($enableMarkieren) {
      $spalten[] = new HtmlTableColumn('', function($pBelegung, $pIndex) {
        return '<input type="checkbox" value="' . CleanOperations::cleanStringForHtml($pBelegung->id) . '" name="' . CleanOperations::cleanStringForHtml($pBelegung->id) . '" class="markable">';
      }, '', $htmlStyle, $htmlStyle);
    }
    $dbwWss = new DBWorkSightsSettings();
    $wssAry = $dbwWss->getColumns($sightId);

    $sonderFaelle = $this->_getSonderFaelle4ColumnsByWss();
    $spaltenByWss = HtmlTableColumn::getTableColumnsByWss($wssAry, $sonderFaelle);
    $spalten = array_merge($spalten, $spaltenByWss);

    
    $buttons = array();
    $buttons[] = PageButtonsAPI::getEinzeiligMehrzeilig('kurse');

    if ($enableMarkieren) {
      $buttons[] = PageButtonsAPI::getMarkierenButtons();
    }
    $buttons[] = PageButtonsAPI::getKursFilter($pDbwBelegung->toobject->kurs->ende_dat, $pDbwBelegung->toobject->kurs->beginn_dat);
    if ($showButtonAbmelden) {
      $buttons[] = PageButtonsAPI::getAbmeldenButton4KursUebersicht($belegungen);
    }

    return new TabPageTable($pReiterBezeichnung, $belegungen, $spalten, $buttons);
  }

  
  private function _getSonderFaelle4ColumnsByWss()
  {
    $knrsImToolKursuebersicht = ToolMitarbeiter::getKursnummern4Ma();
    $urlZuKursdetails = URL::loadCurrent();
    $urlZuKursdetails->cleanParameter();
    $urlZuKursdetails->setParameterValue('tool_id', \ToolsAPI::TOOL_KURSPLANUNG_MA);
    $urlZuKursdetails->setParameterValue('toolsection_id', 377);
    $urlZuKursdetails->setParameterValue('fromOtherTool', 1);
    $urlZuKursdetails->removeSpecialParametersFromUrl();

    $sonderFaelle = array();
    
    $spaltenAry = array('id');
    foreach ($spaltenAry as $spalte) {
      $sonderFaelle['kurs'][$spalte] = function($pDatamodul, $pIndex) use ($knrsImToolKursuebersicht, $urlZuKursdetails, $spalte) {
        $knr = $pDatamodul->getVarValueEx('id', 'kurs');
        if (in_array($knr, $knrsImToolKursuebersicht)) {
          $urlZuKursdetails->setParameterValue('nr', $knr);

          return '<a href="' . $urlZuKursdetails->toString() . '">' . $pDatamodul->getVarValueEx($spalte, 'kurs') . '</a>';
        } else {
          return $pDatamodul->getVarValueEx($spalte, 'kurs');
        }
      };
    } 

    return $sonderFaelle;
  }

  
  private function _handleAktualisiereStammBv($pTnr)
  {
    $successful = null;
    if (PostOperations::isDefined('edit_bank')) {
      $successful = $this->_updateStammBv(PostOperations::getVarValue('edit_bank'), $pTnr);
    } elseif (PostOperations::isDefined('insert_bank')) {
      $successful = $this->_insertStammBv($pTnr);
    } elseif (PostOperations::isDefined('del_bank')) {
      $successful = $this->_deleteStammBv(PostOperations::getVarValue('del_bank'), $pTnr);
    }

    if (is_null($successful)) {
      return '';
    } elseif ($successful) {
      return HTMLOperations::getSuccessBox('<div class="infobox_text">' . CleanOperations::cleanStringForHtml($this->allgSettings->successMsgTeilnehmerNeu) . '</div>', 'Hinweis', 'in_background');
    } else {
      return HTMLOperations::getAlertBox('<div class="infobox_text">' . CleanOperations::cleanStringForHtml($this->allgSettings->failSubmitMsgTeilnehmer) . '</div>', 'Hinweis', 'in_background');
    }
  }

  
  private function _deleteStammBv($pStammBvId, $pTnr)
  {
    if (Xsrf::KEY_OK != Xsrf::checkAndUseXsrfFromGet('wt_ma_delete_stammbv', $pStammBvId)) {
      return false;
    }

    $dbwStammBv = new DBWorkStammBv(1, true);
    $isOwner = $dbwStammBv->isTnOwner($pStammBvId, $pTnr);
    if ($isOwner) {
      return StammBvAPI::deleteStammBv($pStammBvId, $pTnr);
    } else {
      return false;
    }
  }

  
  private function _updateStammBv($pStammBvId, $pTnr)
  {
    if (Xsrf::KEY_OK != Xsrf::checkAndUseXsrfFromGet('wt_ma_edit_stammbv', $pStammBvId)) {
      return false;
    }

    $dbwStammBv = new DBWorkStammBv(1, true);
    $isOwner = $dbwStammBv->isTnOwner($pStammBvId, $pTnr);
    if ($isOwner) {
      $origStammBv = $dbwStammBv->getOne($pStammBvId);
      $stammBv = $this->_fillStammBvFromPost(clone($origStammBv));
      if ($this->_validateStammBv($stammBv)) {
        return StammBvAPI::updateStammBv($stammBv, $origStammBv);
      } else {
        return false;
      }
    } else {
      return false;
    }
  }

  
  private function _validateStammBv($pStammBv)
  {
    $validierung = ValidierungBasis::getInstance();
    if (trim($pStammBv->bic) != '' && trim($pStammBv->iban) != '') {
      if ($validierung->isValidVar('bic', $pStammBv->bic) !== true
          || $validierung->isValidVar('iban', $pStammBv->iban, array($pStammBv->bic)) !== true) {
        return false;
      }
    }

    if (trim($pStammBv->blz) != '' && trim($pStammBv->konto) != '') {
      if ($validierung->isValidVar('blz', $pStammBv->blz) !== true
          || $validierung->isValidVar('konto', $pStammBv->konto, array($pStammBv->blz)) !== true) {
        return false;
      }
    }

    return true;
  }

  
  private function _insertStammBv($pTnr)
  {
    if (Xsrf::KEY_OK != Xsrf::checkAndUseXsrfFromGet('wt_ma_insert_stammbv', $pTnr)) {
      return false;
    }

    $dbwStammBv = new DBWorkStammBv(1, true);
    $stammBv = $dbwStammBv->getNewObject();

    $stammBv = $this->_fillStammBvFromPost($stammBv);
    $stammBv->lfd = -1;
    $stammBv->nr = $pTnr;
    $stammBv->typ = 'T';

    if ($this->_validateStammBv($stammBv)) {
      return StammBvAPI::insertStammBv($stammBv);
    } else {
      return false;
    }
  }

  protected function getJsDeclarationsHook()
  {
    $user = SessionOperations::getCurrentWebToolsUser();

    $result = '';
    if (\SecurityOperations::privilegAllowed($user->getIdentifier(), \ToolsAPI::TOOL_TEILNEHMERINFO_MA, '43.0.3') == 2) {
      $xsrf = new Xsrf();
      $xsrfKey = $xsrf->generateKey4Action('wt_ma_tnstorno', $this->getNr4Userdetails('teilnehmer'));
      $result .= JsOperations::getDeclarationString('KuferTools.StornoXsrf', $xsrfKey);
    }

    if (\SecurityOperations::privilegAllowed($user->getIdentifier(), $this->getToolId(), '435.0.1') == 2) {
      $xsrf = new Xsrf();
      $xsrfKey = $xsrf->generateKey4Action('wt_ma_insert_stammbv', $this->getNr4Userdetails('teilnehmer'));
      $result .= JsOperations::getDeclarationString('KuferTools.InsertStammBvXsrf', $xsrfKey);
    }

    return $result;
  }

  
  private function _fillStammBvFromPost($pStammBv)
  {
    $pStammBv->inhaber = PostOperations::getVarValue('editStammBv_Inhaber', $pStammBv->inhaber);
    $pStammBv->bankbez = PostOperations::getVarValue('editStammBv_Bank', $pStammBv->bankbez);
    $pStammBv->sepa = PostOperations::getVarValue('editStammBv_Art', $pStammBv->sepa);
    $pStammBv->blz = PostOperations::getVarValue('editStammBv_BLZ', $pStammBv->blz);
    $pStammBv->konto = PostOperations::getVarValue('editStammBv_KTO', $pStammBv->konto);
    $pStammBv->iban = PostOperations::getVarValue('editStammBv_IBAN', $pStammBv->iban);
    $pStammBv->bic = PostOperations::getVarValue('editStammBv_BIC', $pStammBv->bic);
    $pStammBv->bemerkung = PostOperations::getVarValue('editStammBv_Bemerkung', $pStammBv->bemerkung);
    $pStammBv->ls_von = PostOperations::getVarValue('editStammBv_gueltig_von', $pStammBv->ls_von);
    $pStammBv->ls_bis = PostOperations::getVarValue('editStammBv_gueltig_bis', $pStammBv->ls_bis);
    $pStammBv->mandatam = PostOperations::getVarValue('editStammBv_mandat_am', $pStammBv->mandatam);
    $pStammBv->mandatid = PostOperations::getVarValue('editStammBv_mandat_referenz', $pStammBv->mandatid);
    $pStammBv->mandatbem = PostOperations::getVarValue('editStammBv_mandat_bemerkung', $pStammBv->mandatbem);

    return $pStammBv;
  }

  
  public function getSearchForm()
  {
    $tnForm = '<div id="tnSuche" style="display:none;">' . "\n";
    $searchAPI = new TeilnehmersuchAPI();
    

    
    $fromobject = $searchAPI->getFromObjectBySession(new Teilnehmer(), 'tool' . $this->toolId, false);
    
    $actionLink = $searchAPI->getTnSearchLink();
    $tnForm
       .= '<form action="' . $actionLink . '" method="POST"> '
       . ' <table cellspacing="5" cellpadding="5">' . "\n"
       . '   <tr><td class="labelleft">Name:</td>'
       . '     <td class="inputleft"><input type="text" name="s_name" value="' . CleanOperations::cleanStringForHtml($fromobject->getVarValue('name')) . '" size="20"></td>' . "\n"
       . '     <td class="labelright">Nummer:</td>'
       . '     <td><input type="text" size="5" class="val_int" name="s_tnr" value="' . CleanOperations::cleanInt($fromobject->getVarValue('id'), '') . '"></td></tr>' . "\n"
       . '   <tr><td class="labelleft">Vorname:</td>'
       . '     <td class="inputleft"><input type="text" name="s_vorname" value="' . CleanOperations::cleanStringForHtml($fromobject->getVarValue('vorname')) . '" size="20"></td>' . "\n"
       . '     <td class="labelright">Personalnummer:</td>'
       . '     <td><input type="text" size="5" name="s_pnr" value="' . CleanOperations::cleanStringForHtml($fromobject->getVarValue('pers_nr')) . '"></td></tr>' . "\n"
       . '   <tr><td class="labelleft">Stra&szlig;e:</td>'
       . '     <td class="inputleft"><input type="text" name="s_strasse" value="' . CleanOperations::cleanStringForHtml($fromobject->getVarValue('strasse')) . '" size="20"></td></tr>' . "\n"
       . '   <tr><td class="labelleft">Wohnort:</td>'
       . '     <td class="inputleft"><input type="text" name="s_wohnort" value="' . CleanOperations::cleanStringForHtml($fromobject->getVarValue('ort')) . '" size="20"></td></tr>' . "\n"
       . '   <tr><td class="labelleft">Ausweisnummer:</td>'
       . '     <td class="inputleft"><input type="text" name="s_ausweisnr" value="' . CleanOperations::cleanStringForHtml($fromobject->getVarValue('ausweisnr')) . '" size="20"></td></tr>' . "\n"
       . ' </table>' . "\n";

    $tnForm .= '</form>' . "\n"
                . '</div>' . "\n";

    return $tnForm;
  }

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

  private function _getDefaultDBWorkTeilnehmer()
  {
    $dbwTn = new DBWorkTeilnehmer();
    $dbwTn->newSearch();
    $dbwTn->setPersonenOrderBySettings($this->toolSettings, 'tn');

    return $dbwTn;
  }
}