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


abstract class AnmeldedatenSelector implements IAnmeldedatenSelector
{
  
  private $argument;
  private static $ersteKursnummer = '';

  
  protected function setArgument($argument)
  {
    $this->argument = $argument;
  }

  
  protected function getArgument()
  {
    return $this->argument;
  }

  
  protected function getArgumentKursInfoValue($pVarName)
  {
    if ($this->getArgument()->getKurs() != null) {
      return $this->getArgument()->getKurs()->getVarValue($pVarName);
    }

    return '';
  }

  
  protected function fillDublettenNummern($anmeldedaten)
  {
    if ($this->getArgument()->getIsDublette()) {
      $teilnehmerNr = $this->getArgument()->getHauptTeilnehmerNrMssql();
      $dublettenNummern = array($teilnehmerNr);
      $anmeldedaten->setDublettenNummern($dublettenNummern);
    }
  }

  
  protected function fillEPayInfo($anmeldedaten)
  {
    $anmeldedaten->setEPayInfo($this->getArgument()->getEPayInfo());
  }

  
  protected function fillKurs($anmeldedaten)
  {
    if (SessionOperations::getVarValueWeitermelden('active') == '1') {
      $kurs = \Kufer\Web\Classes\Addfunctions\KursOperations::getKursFromDMZ($this->getArgument()->getKursnummer());
    } else {
      $dbwKurs = new DBWorkKurse();
      $kurs = $dbwKurs->getKurs($this->getArgument()->getKursnummer());
    }
    $anmeldedaten->setKurs($kurs);
  }

  
  protected function fillGutscheinId($anmeldedaten)
  {
    $anmeldedaten->setGutscheinId($this->getArgument()->getGutscheinId());
  }

  
  protected function fillAbwZahler($anmeldedaten)
  {
    $anmeldedaten->setAbwZahler($this->getAbwZahler());
  }

  
  protected function getHauptTeilnehmer()
  {
    if (SessionOperations::isKuferTools()) {
      $isDublette = $this->getArgument()->getIsDublette();
      if ($isDublette) {
        $teilnehmer = $this->getArgument()->getHauptTeilnehmer();
      } else {
        $dbwteilnehm = new DBWorkTeilnehmer();
        $teilnehmer = $dbwteilnehm->getTeilnehm($this->getArgument()->getHauptTeilnehmerNr(), true);
        
        $teilnehmer->id = $this->getArgument()->getHauptTeilnehmerNr();
      }

      return $teilnehmer;
    } else {
      return $this->getArgument()->getHauptTeilnehmer();
    }
  }

  
  protected function fillHauptBelegungNormal($anmeldedaten)
  {
    $dbwb = new DBWorkBelegung();
    $belegung = $dbwb->getNewObject();
    $teilnehmer = $this->getHauptTeilnehmer();
    $belegung->id = -1;
    $belegung->tnr = $teilnehmer->id;
    $belegung->knr = $this->argument->getKursnummer();
    $belegung->teilnehmer = $teilnehmer;

    $belegung = $this->_fillZusatzdatenFromSession4Belegung($belegung);

    $dbwKursGeb = new DBWorkKursgebuehr();

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty(); 

    
    $belegung->anm_datum = DateTimeOperations::getDateTimeNow();
    $belegung->bearbeiter = $basysbenutzer->kennung;
    $belegung->anm_bearbeiter = $basysbenutzer->kennung;
    $belegung->bearbdatum = DateTimeOperations::getDateTimeNow();
    $belegung->erm_grund = -1;
    if ($teilnehmer->erm_grund > 0) {
      $dbwErmaess = new DBWorkErmaessigung();
      if ($dbwErmaess->isErmaessigungStillValid($belegung->knr, $teilnehmer->erm_ende) && APIGebuehren::greiftErmaessigungBeiDiesenKurs($belegung->knr, $teilnehmer->erm_grund)) {
        $belegung->erm_grund = $teilnehmer->erm_grund;
        $belegung->ermproz = $teilnehmer->erm_proz;
      }
    }

    $belegung = $this->addAnmquelleByArgument($belegung);

    if (SessionOperations::getVarValueGv('is_gutscheinbestellung', false)) {
      $kursGebuehrenAry = $this->getEntgeltAndBetragOffenForGutschein($belegung);
    } else {
      $kursGebuehrenAry = $this->getEntgeltAndBetragOffen($belegung, $dbwKursGeb, $belegung->status, 0, $teilnehmer);
    }

    $belegung->entgelt = $kursGebuehrenAry['entgelt'];
    $belegung->bet_offen = $kursGebuehrenAry['betragOffen'];
    $belegung->mf_ok = 'W';
    if (System::isKuferSql5()) {
      $belegung->bezug = AnmeldungOperations::isKursKinderkurs($this->argument->getKursnummer()) ? 3 : 1;
    } else {
      if (!SessionOperations::getVarValueGv('is_gutscheinbestellung', false)) {
        $belegung->betrag = $this->getAbwBetrag($belegung, $dbwKursGeb, 0, $teilnehmer);
      }
    }
    if (System::isKuferSql5() && AnmeldungOperations::isKursKinderkurs($this->argument->getKursnummer()) && isset($anmeldedaten->getAbwZahler()->id)) {
      $belegung->firma = $anmeldedaten->getAbwZahler()->id;
    }
    if (!SessionOperations::isKuferTools()) {
      $belegung->eintritt = $this->getArgument()->getKurs()->eintritt;
      $belegung->austritt = $this->getArgument()->getKurs()->austritt;
    }
    $anmeldedaten->setHauptBelegung($belegung);
  }

  protected function addAnmquelleByArgument($belegung)
  {
    $argument = $this->getArgument();
    $argumentHauptTn = $argument->getHauptTeilnehmer();
    if (isset($argumentHauptTn, $argumentHauptTn->anmquelle)) {
      $belegung->anm_quelle = $argumentHauptTn->anmquelle;
    }

    return $belegung;
  }

  
  protected function getEntgeltAndBetragOffen($pBelegung, $pDbwKursGeb, $pBelegungsStatus, $pAnzWeitereBelegungen = 0, $pTn = null)
  {
    if ($pBelegungsStatus === 'W' || $pBelegungsStatus === 'P' || $pBelegungsStatus === 'I') {
      $entgelt = MathOperations::floatToString(0);
      $betragOffen = $entgelt;
    } elseif (DBWorkBASysSettings::isInnsbruckStadt() && $pBelegungsStatus === 'G') {
      $entgelt = MathOperations::floatToString(0);
      $betragOffen = $entgelt;
    } else {
      $zahlplanKursnummer = $this->_getZahlplanKursnummer($pBelegung);
      $entgelt = $pDbwKursGeb->getKursgebuehrErmaessigt($pBelegung->knr, $pBelegung->tnr, '', '', '', $pTn, $zahlplanKursnummer);
      $entgelt = $entgelt * (1 + $pAnzWeitereBelegungen);
      $entgelt = $this->addiereNachlassBetragZuGebuehr($entgelt);
      $entgelt = MathOperations::floatToString($entgelt);
      $betragOffen = $entgelt;
    }
    if ($this->checkAndSetErsterKurs($pBelegung->knr)) {
      if ($this->checkSpendenbetragHinzufuegenNeueAnmeldung()) {
        $anminfo = SessionOperations::getVarValueAnmInfo();
        $spendenbetrag = $anminfo->hauptTn->spendenbetrag;
      } else {
        $spendenbetrag = '0,00';
        if (SessionOperations::getVarValueWk('w_spendenbetrag') > 0
            && SessionOperations::getVarValueWk('w_spendencheck')) {
          $spendenbetrag = SessionOperations::getVarValueWk('w_spendenbetrag');
        }
      }
      $entgelt = MathOperations::floatToStringTruncateNull(MathOperations::stringToFloat($entgelt) + MathOperations::stringToFloat($spendenbetrag));
      $betragOffen = MathOperations::floatToStringTruncateNull(MathOperations::stringToFloat($betragOffen) + MathOperations::stringToFloat($spendenbetrag));
    }

    return array('entgelt' => $entgelt, 'betragOffen' => $betragOffen);
  }

  
  private function checkAndSetErsterKurs($pKnr)
  {
    if (self::$ersteKursnummer == '') {
      self::$ersteKursnummer = $pKnr;
    }

    return (self::$ersteKursnummer == $pKnr);
  }

  
  private function checkSpendenbetragHinzufuegenNeueAnmeldung()
  {
    if (SessionOperations::isNeuesAnmeldeverfahren()) {
      $anminfo = SessionOperations::getVarValueAnmInfo();
      if (isset($anminfo, $anminfo->hauptTn, $anminfo->hauptTn->spendenbetrag) && $anminfo->hauptTn->spendenbetrag > 0
          && isset($anminfo->hauptTn->spendencheck) && $anminfo->hauptTn->spendencheck) {
        return true;
      }
    }

    return false;
  }

  
  protected function getEntgeltAndBetragOffenForGutschein($pBelegung)
  {
    $entgelt = SessionOperations::getVarValueGv('betrag');
    if (SessionOperations::getVarValueAnm('payonline', false)) {
      $betragOffen = MathOperations::floatToString(0);
    } else {
      $betragOffen = $entgelt;
    }
    
    
    if ($this->checkAndSetErsterKurs($pBelegung->knr)) {
      if ($this->checkSpendenbetragHinzufuegenNeueAnmeldung()) {
        $anminfo = SessionOperations::getVarValueAnmInfo();
        $spendenbetrag = $anminfo->hauptTn->spendenbetrag;
      } else {
        $spendenbetrag = '0,00';
        if (SessionOperations::getVarValueWk('w_spendenbetrag') > 0
            && SessionOperations::getVarValueWk('w_spendencheck')) {
          $spendenbetrag = SessionOperations::getVarValueWk('w_spendenbetrag');
        }
      }
      $entgelt = MathOperations::floatToStringTruncateNull(MathOperations::stringToFloat($entgelt) + MathOperations::stringToFloat($spendenbetrag));
      $betragOffen = MathOperations::floatToStringTruncateNull(MathOperations::stringToFloat($betragOffen) + MathOperations::stringToFloat($spendenbetrag));
    }

    return array('entgelt' => $entgelt, 'betragOffen' => $betragOffen);
  }

  
  protected function getKursgebuehrGutschein()
  {
    $dbwHlGrundSys = new DBWorkHLGrundSys();

    $kursgebuehr = new Kursgebuehr();
    $kursgebuehr->gebart = 0;
    if (SessionOperations::getVarValueAnm('payonline', false)) {
      $kursgebuehr->gebuehr = 0;
    } else {
      $kursgebuehr->gebuehr = SessionOperations::getVarValueGv('betrag');
    }
    $kursgebuehr->bezeichnung = 'Gutschein';
    $kursgebuehr->dp = 'F';
    $kursgebuehr->faelligkeit = DEFAULTDATE;
    $kursgebuehr->mwst = 0;
    $kursgebuehr->konto = $dbwHlGrundSys->getFeldWert('Gutschein_Kto', '');
    $kursgebuehr->kostenst = $dbwHlGrundSys->getFeldWert('Gutschein_Kostenstelle', '');

    return array($kursgebuehr);
  }

  
  protected function _fillZusatzdatenFromSession4Belegung($pBelegung)
  {
    $pBelegung = $this->fillBemerkung4Belegung($pBelegung);
    $pBelegung = $this->_fillZahlart4Belegung($pBelegung);
    $pBelegung = $this->_fillZahlplan4Belegung($pBelegung);
    $pBelegung = $this->_fillNewsletter4Belegung($pBelegung);
    if (!System::isKuferSql5()) {
      $pBelegung = $this->_fillAbwBankDaten4Belegung($pBelegung);
    }
    $pBelegung = $this->_fillHistoryKrit4Belegung($pBelegung);
    $pBelegung = $this->_fillAnmeldeArt($pBelegung);
    $pBelegung = $this->fillStatus($pBelegung);
    $pBelegung = $this->fillEintritt($pBelegung);
    $pBelegung = $this->fillNurOnline4Belegung($pBelegung);

    return $this->fillInfo2Doz4Belegung($pBelegung);
  }

  
  protected function fillBemerkung4Belegung($pBelegung)
  {
    $bemerkung = $this->getBemerkung4Belegung($pBelegung->knr);
    $bemerkung = $this->addBemerkungKinderanmeldung($bemerkung, $pBelegung->knr);
    $pBelegung->setBemerkung4Anmeldung($bemerkung, false);


    return $pBelegung;
  }

  protected function addBemerkungKinderanmeldung($bisherigeBemerkung, $kursnr)
  {
    $bemerkung = $bisherigeBemerkung;
    if (System::isKuferSql5() && SessionOperations::isSofortEinbuchenWEB() && AnmeldungOperations::isKursKinderkurs($kursnr)) {
      $abwZahler = $this->getAbwZahler();
      $kinderbemerkung = 'Kinderanmeldung: ' . $abwZahler->name . ', ' . $abwZahler->vorname;
      if (strpos($bemerkung, $kinderbemerkung) === false) {
        $bemerkung = $kinderbemerkung . ($bemerkung != '' ? '; ' : '') . $bemerkung;
      }
    }

    return $bemerkung;
  }

  
  protected function getBemerkung4Belegung($pKnr)
  {
    $bemerkung = '';
    if (SessionOperations::isDefinedIntern('wk_w_bemerkung')) {
      $bemerkung .= SessionOperations::getVarValueIntern('wk_w_bemerkung') . ' ';
    } elseif (SessionOperations::isKuferTools()) {
      if (isset($_REQUEST['bemerkung'])) { 
        $bemerkung = $_REQUEST['bemerkung'];
      } elseif (isset($_REQUEST['anm_bemerkung'])) {
        $bemerkung = $_REQUEST['anm_bemerkung'];
      }
    }

    return $bemerkung;
  }

  
  protected function _fillNewsletter4Belegung($pBelegung)
  {
    if (SessionOperations::getVarValueIntern('w_newsl_erlaubt', false)) {
      
      
      
      $pBelegung->teilnehmer->newsl_erlaubt = 'J';
    }

    return $pBelegung;
  }

  
  protected function _fillZahlart4Belegung($pBelegung)
  {
    if (SessionOperations::getVarValueIntern('w_zahlart') == 'Ü') {
      
      $pBelegung->zahlart = 'Ü';
    }

    return $pBelegung;
  }

  
  protected function _fillZahlplan4Belegung($pBelegung)
  {
    $pBelegung->abwzpid = SessionOperations::getBelegungValueFromSession($pBelegung->knr, 'zahlplan', 0);

    return $pBelegung;
  }

  
  protected function _getZahlplanKursnummer($pBelegung)
  {
    if ($pBelegung->abwzpid > 0) {
      $zahlplanKursnummer = \StringOperations::rpad($pBelegung->knr, 10, ' ') . $pBelegung->abwzpid;
    } else {
      $zahlplanKursnummer = '';
    }

    return $zahlplanKursnummer;
  }

  
  protected function _fillAbwBankDaten4Belegung($pBelegung)
  {
    $fillAbwBankDaten4Belegung = new FillAbwBankDaten4Belegung();

    return $fillAbwBankDaten4Belegung->fillAbwBankDaten($pBelegung);
  }

  
  protected function _fillAnmeldeArt($pBelegung)
  {
    if (SessionOperations::isDefinedIntern('w_anmeldeart')) {
      $pBelegung->anmeldeart = SessionOperations::getVarValueIntern('w_anmeldeart');
    } else {
      $settings = BASysSettingsAPI::getBASysSettings();
      $pBelegung->anmeldeart = $settings->eanmart;
    }

    return $pBelegung;
  }

  
  protected function fillStatus($pBelegung)
  {
    $pBelegung->status = $this->getArgument()->getStatus();

    return $pBelegung;
  }

  
  protected function _fillHistoryKrit4Belegung($pBelegung)
  {
    for ($i = 0; $i < 16; $i++) {
      $var = ('w_beleghistorie' . ($i + 1));
      if (trim(SessionOperations::getVarValueIntern($var)) != '') {
        $belegVar = 'historiekrit' . ($i + 1);
        $pBelegung->{$belegVar} = SessionOperations::getVarValueIntern($var);
      }
    }

    return $pBelegung;
  }

  protected function fillZahlungenWartelistePlatzreservierungInteresse($pAnmeldedaten)
  {
    $this->fillZahlungenNeutralenZahlungssatzWartelistePlatzreservierungInteresse($pAnmeldedaten);
    $this->fillZahlungenSpenden($pAnmeldedaten);
  }

  
  protected function fillZahlungenNeutralenZahlungssatzWartelistePlatzreservierungInteresse($pAnmeldedaten)
  {
    $belegung = $pAnmeldedaten->getHauptBelegung();

    $dbwZahlung = new DBWorkZahlung();

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

    $zahlungen = $pAnmeldedaten->getZahlungen();

    $text = 'Auf Warteliste gesetzt';
    if ($belegung->status == 'P') {
      $text = 'Im Kurs mit Status P';
    }
    if ($belegung->status == 'I') {
      $text = 'Im Kurs mit Status I';
    }
    $zahlungen[] = $dbwZahlung->getNeutralenZahlungssatz($belegung->knr, $belegung->tnr, $belegung->id, $basysbenutzer, $text, 17, '', '', $basysbenutzer->kennung);

    $pAnmeldedaten->setZahlungen($zahlungen);
  }

  protected function fillZahlungenSpenden($pAnmeldedaten)
  {
    $belegung = $pAnmeldedaten->getHauptBelegung();

    $zahlungen = $pAnmeldedaten->getZahlungen();
    $zahlungen = $this->addSpendenzahlung($belegung->knr, $zahlungen);

    $pAnmeldedaten->setZahlungen($zahlungen);
  }

  
  protected function fillZahlungenNormal($pAnmeldedaten)
  {
    $belegung = $pAnmeldedaten->getHauptBelegung();

    $dbwZahlung = new DBWorkZahlung();
    $dbwKursGeb = new DBWorkKursgebuehr();

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

    $kursAboGebuehren = array();
    $sollIst = 'S';
    if (SessionOperations::getVarValueGv('is_gutscheinbestellung', false)) {
      $kursgebuehren = $this->getKursgebuehrGutschein();
    } else {
      $zahlplanKursnummer = $this->_getZahlplanKursnummer($belegung);
      $tn = $this->getArgument()->getHauptTeilnehmer();
      $kursgebuehren = $dbwKursGeb->getKursgebuehrenErmaessigtTab($belegung->knr, $belegung->tnr, '', '', '', $tn, $zahlplanKursnummer);
      $kursAboGebuehren = array_filter($dbwKursGeb->getGebuehrenbyKNR($belegung->knr), function($gebuehr) { return $gebuehr->fortlaufend != ''; });
      $sollIst = $belegung->status === 'W' ? 'V' : 'S';
    }

    $zahlungen = $pAnmeldedaten->getZahlungen();
    $gebuehrenCount = count($kursgebuehren);
    for ($i = 0; $i < $gebuehrenCount; $i++) {
      $abwNr = 0;
      $abwZahlObj = $pAnmeldedaten->getAbwZahler();
      if (!empty($abwZahlObj)) {
        $abwNr = $abwZahlObj->id;
      }

      $zahlungen[] = $dbwZahlung->getZahlungssatz4AnmeldungNormal($belegung->id, $belegung->knr, $belegung->tnr, $kursgebuehren[$i], $basysbenutzer->kennung, $abwNr, $sollIst);
    }

    if ($gebuehrenCount === 0 && count($kursAboGebuehren) === 0) {
      $zahlungen[] = $dbwZahlung->getNeutralenZahlungssatz($belegung->knr, $belegung->tnr, $belegung->id, $basysbenutzer, 'Anmeldung ohne Gebühr', 19, '', '', $basysbenutzer->kennung);
    }

    $pAnmeldedaten->setZahlungen($this->addSpendenzahlung($belegung->knr, $zahlungen));

    if (count($kursAboGebuehren) > 0) {
      $this->fillFortlaufendeGebuehren($pAnmeldedaten, $kursAboGebuehren, $basysbenutzer->kennung);
    }

    
    if (ZahlungAPI::berechneGesamtGebuehr($zahlungen) > 0 && $this->getNachlassBetragFromSession() != 0.0) {
      $this->fillNachlassZahlungen($pAnmeldedaten);
    }
  }

  
  protected function addSpendenzahlung($pKnr, $pBisherigeZahlungen)
  {
    $zahlungen = $pBisherigeZahlungen;
    $spendenbetrag = $this->getSpendenbetrag();
    if ($spendenbetrag == 0.0) {
      return $zahlungen;
    }
    if ($this->checkAndSetErsterKurs($pKnr)) {
      $dbwhl = new DBWorkHLGrundSys(1, true);
      $zuschlagkostenstelle = $dbwhl->getFeldWert('E539_ZUSCHLAGKTOKST1', false);
      $zuschlagkostenstelle = ($zuschlagkostenstelle == 'W');
      $zuschlagzart = $dbwhl->getFeldWert('E539_ZUSCHLAGZART', '-1');

      if ($zuschlagzart == '-1') {
        if (!SessionOperations::isKuferTools()) {
          Logger::logg('Die Zuschlagzahlart konnte nicht ermittelt werden, sodass der Spendenbetrag nicht hinzugefügt wurde.', 300);
        }

        return $zahlungen;
      }
      $spendenzahlung = $this->createSpendenzahlung($zahlungen[0], $zuschlagzart);
      if ($zuschlagkostenstelle) {
        $spendenzahlung->konto = $zahlungen[0]->konto;
        $spendenzahlung->kostenst = $zahlungen[0]->kostenst;
      }
      $spendenzahlung->betrag = MathOperations::floatToStringTruncateNull($spendenbetrag);

      $spendenzahlung->sollist = 'S';
      $zahlungen[] = $spendenzahlung;
    }

    return $zahlungen;
  }

  private function getSpendenbetrag()
  {
    if ($this->checkSpendenbetragHinzufuegenNeueAnmeldung()) {
      $anminfo = SessionOperations::getVarValueAnmInfo();
      $spendenbetrag = $anminfo->hauptTn->spendenbetrag;
    } else {
      $spendenbetrag = '0,00';
      if (SessionOperations::getVarValueWk('w_spendenbetrag') > 0
        && SessionOperations::getVarValueWk('w_spendencheck')) {
        $spendenbetrag = SessionOperations::getVarValueWk('w_spendenbetrag');
      }
    }

    return MathOperations::stringToFloat($spendenbetrag);
  }

  protected function createSpendenzahlung($pZahlungToCopy, $pZuschlagZahlart)
  {
    $dbwhlgeb = new DBWorkHLGebuehrenArten();
    $gebart = $dbwhlgeb->getBySchluessel($pZuschlagZahlart);
    $zahlung = clone $pZahlungToCopy;
    $zahlung->gebuehrenart = $gebart->schluessel;
    $zahlung->text = $gebart->text;
    $zahlung->konto = $gebart->konto;
    $zahlung->kostenst = $gebart->kostenst;
    $zahlung->dp = $gebart->dp;
    $zahlung->mwst = $gebart->mwst;
    $zahlung->kursgeb_id = 0;

    return $zahlung;
  }

  
  protected function fillNachlassZahlungen($pAnmeldedaten)
  {
    $zahlungen = $pAnmeldedaten->getZahlungen();

    $nachlassgrund = $this->getNachlassGrundFromSession();
    $nachlassart = $this->getNachlassArtFromSession();
    
    $zahlungenNachlass = ZahlungAPI::getNachlassZahlungen($zahlungen, $this->getNachlassBetragFromSession(), $nachlassgrund, $nachlassart, true);

    
    foreach ($zahlungenNachlass as &$zahlungNachlass) {
      $zahlungNachlass = $this->setzeEinzelPreisUndFaktor($zahlungNachlass);
    }
    $zahlungen = array_merge($zahlungen, $zahlungenNachlass);
    $pAnmeldedaten->setZahlungen($zahlungen);
  }

  
  protected function fillEintritt($pBelegung)
  {
    if (SessionOperations::isDefinedIntern('w_eintritt')) {
      $pBelegung->eintritt = SessionOperations::getVarValueIntern('w_eintritt');
    }

    return $pBelegung;
  }

  
  protected function fillNurOnline4Belegung($pBelegung)
  {
    $value = SessionOperations::getBelegungValueFromSession($pBelegung->knr, 'nuronline', 0);
    $pBelegung->nuronline = $value;

    return $pBelegung;
  }

  
  protected function fillInfo2Doz4Belegung($pBelegung)
  {
    $value = SessionOperations::getBelegungValueFromSession($pBelegung->knr, 'info2doz', 0);
    $pBelegung->info2doz = $value;

    return $pBelegung;
  }

  
  protected function getNachlassBetragFromSession()
  {
    if (SessionOperations::isDefinedIntern('w_nachlassbetrag')) {
      return SessionOperations::getVarValueIntern('w_nachlassbetrag');
    }

    return 0.0;
  }

  
  protected function getNachlassGrundFromSession()
  {
    if (SessionOperations::isDefinedIntern('w_nachlassgrund')) {
      return SessionOperations::getVarValueIntern('w_nachlassgrund');
    }

    return '';
  }

  
  protected function getNachlassArtFromSession()
  {
    if (SessionOperations::isDefinedIntern('w_nachlassart')) {
      return SessionOperations::getVarValueIntern('w_nachlassart');
    }

    return '';
  }

  
  protected function getNachlassGrund($pGebuehrenText, $pNachlassInProzent)
  {
    $nachlassGrund = $this->getNachlassGrundFromSession();
    if ($this->getNachlassArtFromSession() !== 'Nachlass') {
      $nachlassInProzent = round($pNachlassInProzent);
      $nachlassGrund .= ' ' . $pGebuehrenText . ' (' . $nachlassInProzent . ' %)';
    }

    return $nachlassGrund;
  }

  
  protected function getAbwZahler()
  {
    if (SessionOperations::isKuferTools()) {
      $teilnehmer = $this->getAbwZahlerFromSession();
    } else {
      $teilnehmer = $this->getArgument()->getAbwZahler();
    }

    return $teilnehmer;
  }

  
  private function getAbwZahlerFromSession()
  {
    $teilnehmer = null;
    if (SessionOperations::getVarValueIntern('w_abw_kontoverwenden', false)) {
      $teilnehmer = new TeilnehmerPflicht();
      $teilnehmer->id = SessionOperations::getVarValueIntern('w_abw_zahler', 0);
      $teilnehmer->bankbez = SessionOperations::getVarValueIntern('w_abw_bankbez');
      $teilnehmer->kontoinhaber = SessionOperations::getVarValueIntern('w_abw_kontoinh');
      $teilnehmer->blz = SessionOperations::getVarValueIntern('w_abw_blz');
      $teilnehmer->konto = SessionOperations::getVarValueIntern('w_abw_kontonr');
      $teilnehmer->bic = SessionOperations::getVarValueIntern('w_abw_bic');
      $teilnehmer->iban = SessionOperations::getVarValueIntern('w_abw_iban');
    }

    return $teilnehmer;
  }

  
  protected function addiereNachlassBetragZuGebuehr($pKursGebuehr)
  {
    return $pKursGebuehr + $this->getNachlassBetragFromSession();
  }

  
  

  
  protected function setzeEinzelPreisUndFaktor($pZahlung)
  {
    $pZahlung->einzelpreis = 0.0;
    $pZahlung->faktor = 0;

    return $pZahlung;
  }

  
  protected function setzeEinzelPreisUndFaktor4MehrfachOderFirma($pZahlung)
  {
    $einzelPreis = MathOperations::stringToFloat($pZahlung->betrag) / $pZahlung->faktor;
    
    if (StringOperations::strpos((string)($einzelPreis * 100), '.') === false) {
      $pZahlung->einzelpreis = $einzelPreis;
    } else {
      $pZahlung->einzelpreis = 0.0;
      $pZahlung->faktor = 0;
    }

    return $pZahlung;
  }

  
  protected function getBelegungStatusSofortEinbuchen($pKnr, $pWeitereTeilnehmer, $pIsOnlineteilnahme, $pTnGeschlecht = '')
  {
    $result = $this->getArgument()->getStatus();
    if ($result === 'A' || ($result === 'G' && DBWorkBASysSettings::isInnsbruckStadt())) {
      $bucherDMZ = new BucherDMZ(null);
      $status = $bucherDMZ->validateWithDmz($pTnGeschlecht, $pKnr, $pWeitereTeilnehmer, $pIsOnlineteilnahme);
      
      if ($status == ANMELDUNGONLINE_KURSVOLL) {
        $result = 'W'; 
      }
    }

    return $result;
  }

  
  protected function getAbwBetrag($belegung, $dbwKursGeb, $anzahlWeitere, $hauptteilnehmer = null)
  {
    if (!empty($belegung->konto) || !empty($belegung->iban)) {
      $gebuehrWieAngemeldetAry = $this->getEntgeltAndBetragOffen($belegung, $dbwKursGeb, 'A', $anzahlWeitere, $hauptteilnehmer);

      return MathOperations::stringToFloat($gebuehrWieAngemeldetAry['entgelt']);
    } else {
      return 0.0;
    }
  }

  
  protected function fillFortlaufendeGebuehren($pAnmeldedaten, $pKursAboGebuehren, $pBearbeiter, $pAnzTeilnehmer = 1, $pIsFirmenAnmeldung = false)
  {
    $belegung = $pAnmeldedaten->getHauptBelegung();
    $fortlGebuehren = $pAnmeldedaten->getFortlGebuehren();

    $dbwGebFort = new DBWorkGebFort();
    $anzAboGebuehren = count($pKursAboGebuehren);
    $betragFaktor = $pIsFirmenAnmeldung ? 1 : $pAnzTeilnehmer;

    for ($i = 0; $i < $anzAboGebuehren; $i++) {
      $fortlGebuehr = $dbwGebFort->getNewObject();
      $fortlGebuehr->setStandardValues();
      $fortlGebuehr->belegid = $belegung->id;
      $fortlGebuehr->geb_art = $pKursAboGebuehren[$i]->gebart;
      $fortlGebuehr->betrag = MathOperations::floatToString($pKursAboGebuehren[$i]->betrag * $betragFaktor);
      $fortlGebuehr->text = $pKursAboGebuehren[$i]->text;
      $fortlGebuehr->abr_datum = GebFortAPI::getNextAbrechnungDatum($pKursAboGebuehren[$i]->fortlaufend);
      $fortlGebuehr->konto = $pKursAboGebuehren[$i]->konto;
      $fortlGebuehr->kostenst = $pKursAboGebuehren[$i]->kostenst;
      $fortlGebuehr->mwst = $pKursAboGebuehren[$i]->mwst;
      $fortlGebuehr->kursgeb_id = $pKursAboGebuehren[$i]->id;
      $fortlGebuehr->fortlaufend = $pKursAboGebuehren[$i]->fortlaufend;
      $fortlGebuehr->dp = $pKursAboGebuehren[$i]->dp;
      $fortlGebuehr->bearbeiter = $pBearbeiter;
      $fortlGebuehr->bearbdatum = DateTimeOperations::getDateTimeNow();
      $fortlGebuehr->ermtab = ''; 

      if (System::isKuferSql5()) {
        $abwNr = 0;
        $abwZahlObj = $pAnmeldedaten->getAbwZahler();
        if (!empty($abwZahlObj)) {
          $abwNr = $abwZahlObj->id;
        }
        $fortlGebuehr->zpf = $abwNr > 0 ? $abwNr : $belegung->tnr;
      }

      $fortlGebuehren[] = $fortlGebuehr;
    }

    if ($pIsFirmenAnmeldung) {
      $tmpFortlGebuehren = unserialize(serialize($fortlGebuehren));
      for ($i = 1; $i < $pAnzTeilnehmer; $i++) {
        foreach ($tmpFortlGebuehren as $fortlGebuehr) {
          $fortlGebuehren[] = clone $fortlGebuehr;
        }
      }
    }

    $pAnmeldedaten->setFortlGebuehren($fortlGebuehren);
  }
}