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


class ToolTnAnmeldung extends ToolBase
{
  private $_dbwKurse;
  private $_user;

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

    $this->_dbwKurse = $this->initDBWork(true);
    $this->_user = SessionOperations::getCurrentWebToolsUser();
  }

  protected static function initDBWork($pMitSuche = false)
  {
    $toolId = \ToolsAPI::TOOL_ANMELDUNGBUCHEN_TN;


    $toolSettings = ToolSettingsAPI::getToolSettings($toolId);
    
    $dbwKurse = new DBWorkKurseINetAktiv();
    $dbwKurse->newSearch();
    $dbwKurse->setOrderBySettings($toolSettings);

    if ($pMitSuche) {
      

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

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

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

    $dbwKurse->beruecksichtigeKurstagRaumanzeige = $toolSettings->versteckeKurstageWieImRaumanzeigeprogramm;

    return $dbwKurse;
  }

  public static function getKursnummern($pDBWork = null)
  {
    if ($pDBWork == null) {
      $dbw = self::initDBWork();
    } else {
      $dbw = $pDBWork;
    }

    return $dbw->getAllKursnummern();
  }

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

    $page = null;
    switch ($pPageId) {
      default:
      case 94:
        if (RequestOperations::getVarValue('einstieg') != '') {
          $sprachsettings = new SprachSettingsObject();

          if (DBWorkBASysSettings::isBlak()) {
            $contenHeader = 'Suchen und anmelden:';
          } else {
            $contenHeader = 'neue Anmeldung zu ' . $sprachsettings->Kurs['Plural_mit_Artikel']['Dativ'] . ':';
          }
          $page = new PageAnmeldEinstieg('Neue Anmeldung', 94, $this, $contenHeader);
        } else {
          
          $page = $this->_handleKursuebersichtAnmeld();
        }
        break;
      case 95:
        break;
      case 96:
        break;
      case 97:
        
        $page = $this->_handleAnmeldeseite();
        break;
      case 337: 
        $page = $this->_handleKursdetailsAnmeld();
        break;
    }
    if ($page == null) {
      throw new Exception('ungültige PageId');
    }
    $this->currentPage = $page;
  }

  public function getAjaxResponse()
  {
    $action = RequestOperations::getVarValue('action');
    
    if ($action == 'checkSepa') {
      return $this->_handleCheckSepa4Ajax();
    }
    
    elseif ($action == 'checkKonto') {
      return $this->_handleCheckDta4Ajax();
    }
  }

  
  private function _handleCheckSepa4Ajax()
  {
    $iban = trim(RequestOperations::getVarValue('iban'));
    $bic = trim(RequestOperations::getVarValue('bic'));
    $tnr = SessionOperations::getCurrentWebToolsUser()->tnr;

    $resultAry = ValidationAPI::validateSepa($iban, $bic, $tnr);

    return JsonOperations::encode4Ajax($resultAry);
  }

  
  private function _handleCheckDta4Ajax()
  {
    $konto = RequestOperations::getVarValue('konto');
    $blz = RequestOperations::getVarValue('blz');

    $resultAry = ValidationAPI::validateDta($konto, $blz);

    return JsonOperations::encode4Ajax($resultAry);
  }

  
  private function _handleKursuebersichtAnmeld()
  {
    $sprachsettings = new SprachSettingsObject();
    
    SessionOperations::setVarValueWTIntern('cansignon', true);

    $pageLinks = array();

    
    $alleIds = $this->getAlleIdsKurse($this->_dbwKurse);
    $data = $this->getData($this->_dbwKurse, $alleIds, $this->toolSettings->kurseproseite);

    $data = $this->aktualisiereKursePerDmz($data);

    $anzahlDerKurse = count($alleIds);

    $pageLinks['back'] = ToolsAPI::getLastHistoryEntry(); 
    
    if (\SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), '94.0.1')
            && $this->rechteOR(array('337.1.1', '337.1.2', '337.1.3', '337.1.4', '337.1.5'))) {
      $pageLinks['details'] = $this->getUrlParamsForFile(array('toolsection_id' => 337));
    }
    
    if (\SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), '94.0.2')) {
      

      $httpsPath = ConstantOperations::getHTTPSPath4Url(ANMELDUNG);
      $pageLinks['anmelden'] = $httpsPath . $this->getUrlParamsForFile(array('toolsection_id' => 97));

      $dbtn = new DBWorkTeilnehmer(1, true);
      $teilnehmer = $dbtn->getTeilnehm($this->_user->tnr);

      $dbwStammBv = new DBWorkStammBv(1, true);
      $stammBv = $dbwStammBv->getStammBvByTnrAndIban($teilnehmer->id, $teilnehmer->iban);
      $pageLinks['hasSepaMandat'] = StammBvAPI::checkSepaMandatFromTn($stammBv);


      

      $pageLinks['emptyMandatorys'] = AnmeldeAPI::getEmptyMandatoryFieldName($this->toolSettings, $teilnehmer);
    }
    
    $pageLinks['filter'] = \SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), '94.0.3');
    $page = new PageKurseUebersichtAnmeld('neue Anmeldung', 94, $this, 'neue Anmeldung - ' . $sprachsettings->KursZusammengesetzt['Singular']['Nominativ'] . 'übersicht', $data, $anzahlDerKurse, $this->toolSettings->kurseproseite);
    $page->setLinks($pageLinks);

    return $page;
  }

  
  private function _handleKursdetailsAnmeld()
  {
    $sprachsettings = new SprachSettingsObject();
    $detailSightId = 337;
    
    SessionOperations::setVarValueWTIntern('cansignon', true);

    
    

    $knr = GetOperations::GetVarValue('knr');
    if (GetOperations::isDefined('fromOtherTool')) {
      $alleIds = array($knr);
    } else {
      
      $alleIds = $this->getAlleIdsKurse($this->_dbwKurse);
    }

    $data = $this->getData($this->_dbwKurse, $alleIds, 1, $knr);
    $kurs = $data[0];

    $kurs = $this->aktualisiereKursPerDmz($kurs);

    $knr = $kurs->id;
    $anzahlDerKurse = count($alleIds);
    

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

    
    if (DBWorkBASysSettings::isBlak() && $kurs->kursauswahl2 == 'W') {
      $kurs->gebuehr = BLAK_NOT_SHOW_WSS;
      $kurs->geb_erm = BLAK_NOT_SHOW_WSS;
    }

    $tabPage = new TabCollectionKursdetails('neue Anmeldung', $detailSightId, $this, 'Anmeldung zum ' . $sprachsettings->Kurs['Singular']['Nominativ'] . ' ' . $knr, $kurs, $knr, '', $anzahlDerKurse, 1);
    
    if (\SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), $reiterSeite->getRecht('Kursdetails'))) {
      $pagedetails = new TabPageSightBuilderUebersicht($reiterSeite->getLabel('Kursdetails'), $kurs, $this->getToolId(), 95, '', $alleIds);
      $tabPage->addTabPage($pagedetails);

      
      $detailLinks = array();
      $detailLinks['kursdetails'] = $this->getUrlParamsForFile(array('toolsection_id' => $detailSightId));
      $pagedetails->setLinks($detailLinks);
    }

    
    if (\SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), $reiterSeite->getRecht('Inhalt'))) {
      $tabPage->addTabPage(new TabKursDetailsInhalt($reiterSeite->getLabel('Inhalt'), $kurs, 0));
    }
    
    if (\SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), $reiterSeite->getRecht('Termine'))) {
      $termineTab = new TabKursDetailsTermine($reiterSeite->getLabel('Termine'), $kurs, 96, '', '', true);
      $termineTab->setLinks(array(
          'versteckeKurstageWieImRaumanzeigeprogramm' => $this->toolSettings->versteckeKurstageWieImRaumanzeigeprogramm
      ));
      $tabPage->addTabPage($termineTab);
    }

    
    if (\SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), $reiterSeite->getRecht('Downloads'))) {
      $tabPage->addTabPage(new TabKursDetailsDownloadsTN($reiterSeite->getLabel('Downloads'), $knr, $this->getToolId(), 329, $this->_user->tnr));
    }
    
    if (\SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), $reiterSeite->getRecht('Fotos'))) {
      $tabPage->addTabPage(new TabKursDetailsFotos($reiterSeite->getLabel('Fotos'), $knr));
    }
    $page = $tabPage;

    $pageLinks = array();
    $pageLinks['self'] = $this->getUrlParamsForFile(array('toolsection_id' => 95));
    $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();


























    
    if (DBWorkBASysSettings::isBlak() && $kurs->kursauswahl2 == 'W') {
      $pageLinks['BLAK_hinweis_button'] = true;
    
    } elseif (\SecurityOperations::privilegAllowed($this->_user->getIdentifier(), $this->getToolId(), '337.0.1')) {
      $pageLinks['anmelden'] = ConstantOperations::getHTTPSPath4Url(ANMELDUNG) . $this->getUrlParamsForFile(array('toolsection_id' => 97, 'knr' => $knr));

      $dbtn = new DBWorkTeilnehmer(1, true);
      $teilnehmer = $dbtn->getTeilnehm($this->_user->tnr);

      $dbwStammBv = new DBWorkStammBv(1, true);
      $stammBv = $dbwStammBv->getStammBvByTnrAndIban($teilnehmer->id, $teilnehmer->iban);
      $pageLinks['hasSepaMandat'] = StammBvAPI::checkSepaMandatFromTn($stammBv);

      

      $pageLinks['emptyMandatorys'] = AnmeldeAPI::getEmptyMandatoryFieldName($this->toolSettings, $teilnehmer);
    }
    $page->setLinks($pageLinks);

    return $page;
  }

  
  private function _handleAnmeldeseite()
  {
    $post_id = PostOperations::getVarValue('postId', 0);
    if ($post_id == 0) {
      
      $data = SessionOperations::getVarValueWTIntern('anm_bestaetigung_last');
    } elseif (SessionOperations::getVarValueWTIntern('anm_bestaetigung_' . $post_id, false)) {
      
      $data = SessionOperations::getVarValueWTIntern('anm_bestaetigung_' . $post_id);
    } else {
      $knr = RequestOperations::getVarValue('knr');
      
      SessionOperations::setVarValueAnm(ANMELDEART, ''); 

      $zahlart = PostOperations::getVarValue('anm_zahlart', '');
      if ($zahlart == 'Ü') {
        SessionOperations::setVarValueWK('w_zahlart_b', 'Ü');
      }

      $kurs = $this->_dbwKurse->getKurs($knr);
      $kurs = $this->aktualisiereKursPerDmz($kurs);

      if (DBWorkBASysSettings::isBlak() && $kurs->isBGLU()) {
        SessionOperations::_getAttachmentsFromRequest2Session('tnanm_', '', false, true);
      } elseif (DBWorkBASysSettings::isBlak() && $kurs->isFSP()) {
        SessionOperations::_getAttachmentsFromRequest2Session('tnanm_', '', false, false);
        SessionOperations::setVarValueWk('w_datei1_beschreibung', 'Berufszulassung'); 
      }

      
      $guthaben_verwenden = GetOperations::isDefined('guthaben_verwenden');
      SessionOperations::setVarValueWk('w_guthabenverwenden_b', $guthaben_verwenden);
      
      SessionOperations::setVarValueWk('w_abw_kontoverwenden_b', false);
      
      
      
      if (PostOperations::isDefined('abw_isNurFuerAnmeldung')) {
        
        
        $isNurFuerAnmeldung = (PostOperations::getVarValue('abw_isNurFuerAnmeldung', false) === 'true');
        
        SessionOperations::setVarValueWk('w_isNurFuerAnmeldung_b', $isNurFuerAnmeldung);

        $verfahren = PostOperations::getVarValue('abw_verfahren');
        $inhaber = PostOperations::getVarValue('abw_inhaber');
        $bank = PostOperations::getVarValue('abw_bank');

        $kto = PostOperations::getVarValue('abw_kto');
        $blz = PostOperations::getVarValue('abw_blz');
        $bic = PostOperations::getVarValue('abw_bic');
        $iban = PostOperations::getVarValue('abw_iban');

        if ($isNurFuerAnmeldung) {
          
          SessionOperations::setVarValueWk('w_abw_kontoverwenden_b', true);
          
          SessionOperations::setVarValueWk('w_abw_bankbez_b', $bank);
          SessionOperations::setVarValueWk('w_abw_kontoinh_b', $inhaber);
          if ($verfahren === 'iban') {
            SessionOperations::setVarValueWk('w_abw_bic_b', $bic);
            SessionOperations::setVarValueWk('w_abw_iban_b', $iban);
          } else {
            SessionOperations::setVarValueWk('w_abw_kontonr_b', $kto);
            SessionOperations::setVarValueWk('w_abw_blz_b', $blz);
          }
        } else {
          
          $dbwtn = new DBWorkTeilnehmer(1, true);
          $tn = $dbwtn->getTeilnehm(SessionOperations::getCurrentWebToolsUser()->tnr);
          $tn->kontoinhaber = $inhaber;

          $tn->bankbez = $bank;
          
          if ($verfahren === 'iban') {
            $tn->bic = $bic;
            $tn->iban = $iban;
            $tn->konto = '';
            $tn->blz = '';
          } else {
            $tn->konto = $kto;
            $tn->blz = $blz;
            $tn->bic = '';
            $tn->iban = '';
          }
          StammBvAPI::bereinigeBankdatenAnhandTeilnehmer($tn, true, false);
        }
      }

      
      $dbwWK = new DBWorkWarenkorbKurse();
      
      
      
      
      $dbwWK->clear();
      $dbwWK->addEntry($knr);
      
      
      
      


      
      $dbwKurse = new DBWorkKurse();
      $elearningKursID = $dbwKurse->getKurs($knr)->elearningKursID;

      
      
      $anmeldungDurchgefuehrt = false;
      if ($elearningKursID > 0 && (!SessionOperations::isReplikat() || SessionOperations::isDmzBetrieb())) {
        if (WbPluginBasis::pluginExists(PLUGIN_MOODLE)) {
          Logger::logg('Beginne Anmeldevorgang für eLearning-Kurs mit Kursnr. ' . $knr . ' und eLearningKursID ' . $elearningKursID . '.', 7);
          $anmeldungDurchgefuehrt = true;

          $tn = \SessionOperations::getCurrentWebToolsTeilnehmer();
          $anmeldeStaticSight = new AnmeldeStaticSight();
          $anmeld = AnmeldeAPI::buchungsvorgangVorbereiten($knr, $this->getToolId(), $this->_user->email, $tn->id); 
          $anmeld->setStatusForKurse(ANMELDUNGONLINE_OK); 

          $anmeldevorgangAr = $anmeldeStaticSight->doAnmeldung($tn->id, $knr); 
          $success = $anmeldevorgangAr[0];

          
          if ($success) {
            
            $soapMoodle = new SoapMoodle();
            $technischeProbleme = $soapMoodle->anmeldungTnBeiElearning() !== SoapMoodle::TN_ANMELDUNG_STATUS_SUCCESS;
            
            $technischeProbleme |= $soapMoodle->anmeldungZuKursBeiElearning($elearningKursID);
          }
          else {
            Logger::logg('Die Anmeldung war NICHT erfolgreich. Teilnehmer-Nr.: ' . $tn->id . ' Kurs-Nr.: ' . $knr . '. Weder in KuferSQL, '
                    . 'KuferTools noch bei der eLearning-Plattform angemeldet. Vermutlich DMZ-Dienst nicht gestartet.', 57);
            $technischeProbleme = true;
          }
          if ($technischeProbleme) {
            $data = HTMLOperations::getAlertBox('Die Anmeldung zu diesem eLearning-Kurs konnte nicht übermittelt werden. '
                            . BR_WT . 'Bitte setzen Sie sich mit uns in Verbindung.', 'Fehler aufgetreten');
          } else {
            $data = AnmeldeAPI::buchungsvorgangBestaetigen($anmeld);
          }
        } else {
          $anmeldungDurchgefuehrt = false;
          Logger::logg('Das Plugin SoapMoodle existiert nicht. Der Anmeldevorgang für den Teilnehmer mit der Nr. ' . $tn->id . ' für den Kurs mit der Nr. ' . $knr . ' wird nicht als eLearning-Anmeldung sondern als normale Anmeldung durchgeführt.', 7);
        }
      }

      
      if (!$anmeldungDurchgefuehrt) {
        Logger::logg('Beginne Anmeldevorgang für Kurs mit Kursnr. ' . $knr . '.', 7);
        
        
        $data = AnmeldeAPI::Kursbuchen($knr, $this->getToolId(), $this->_user->email);
      }
      $menu = new Menu();
      $data .= '<div class="clear">' . $menu->getBackLink(ToolsAPI::getLastHistoryEntry()) . '</div>';
      
      
      SessionOperations::setVarValueWTIntern('anm_bestaetigung_' . $post_id, $data);
      SessionOperations::setVarValueWTIntern('anm_bestaetigung_last', $data);
    }

    $sprachsettings = new SprachSettingsObject();
    $contentHeader = 'Anmeldung ' . $sprachsettings->Teilnehmer['Singular']['Nominativ'];
    if (DBWorkBASysSettings::isBlak()) {
      
      $contentHeader = '';
    }
    $pageLinks = array();

    $page = new Page4ExternContent('Anmeldung', 97, $this, $contentHeader, $data);
    $page->setLinks($pageLinks);

    return $page;
  }

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

  private function aktualisiereKursPerDmz($pKurs)
  {
    $isDmzBetrieb = SessionOperations::isDmzBetrieb();
    $isSettingOk = $this->toolSettings->kursePerDmzAktualisieren;

    if ($isDmzBetrieb && $isSettingOk) {
      try {
        $pKurs = AnmeldeAPI::updateKursData($pKurs);
      } catch (Exception $e) {
        
      }
    }

    return $pKurs;
  }

  private function aktualisiereKursePerDmz($pKurse)
  {
    $isDmzBetrieb = SessionOperations::isDmzBetrieb();
    $isSettingOk = $this->toolSettings->kursePerDmzAktualisieren;

    if ($isDmzBetrieb && $isSettingOk) {
      try {
        $pKurse = AnmeldeAPI::updateKursArrayData($pKurse);
      } catch (Exception $e) {
        
      }
    }

    return $pKurse;
  }

  protected function getJsDeclarationsHook()
  {
    $nachweisMap = DatDocAPI::getNachweisartMap();
    $nachweisMap = array_merge(array('nachreichen' => 'wird nachgereicht'), $nachweisMap);

    return JsOperations::getDeclarationJson('KuferTools.NachweisartMap', $nachweisMap);
  }
}