<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, 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 fillGutscheinNr($anmeldedaten)
  {
    $anmeldedaten->setGutscheinNr($this->getHauptTeilnehmer()->getVarValue('gutschein_nr'));
  }

  
  protected function fillGutscheinCode($anmeldedaten)
  {
    $anmeldedaten->setGutscheinCode($this->getHauptTeilnehmer()->getVarValue('gutschein_code'));
  }

  
  protected function fillGutschein($anmeldedaten): void
  {
    $this->fillGutscheinId($anmeldedaten);
    $this->fillGutscheinCode($anmeldedaten);
    $this->fillGutscheinNr($anmeldedaten);
  }

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

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

  protected function fillDmzFeatureNr($anmeldedaten)
  {
    $anmeldedaten->setDmzFeatureNr($this->getDmzFeatureNr());
  }

  
  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)) {
      list('entgelt' => $gutscheinEntgelt, 'betragOffen' => $gutscheinBetOffen)
        = $this->getEntgeltAndBetragOffenForGutschein($belegung);
      $belegung->entgelt = $gutscheinEntgelt;
      $belegung->bet_offen = $gutscheinBetOffen;
    } else {
      $belegung->entgelt = \MathOperations::floatToString(0);
      $belegung->bet_offen = \MathOperations::floatToString(0);
    }

    $belegung->mf_ok = 'W';
    if (System::isKuferSql5()) {
      $belegung->bezug = AnmeldungOperations::isKursKinderkurs($this->argument->getKursnummer()) ? 3 : 1;
    }
    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 writeSumOfZahlungenToHauptbelegung($pAnmeldedaten): float
  {
    $belegung = $pAnmeldedaten->getHauptBelegung();
    if (SessionOperations::getVarValueGv('is_gutscheinbestellung', false)) {
      return \MathOperations::stringToFloat($this->getEntgeltAndBetragOffenForGutschein($belegung)['entgelt']);
    }

    $gesamt = ZahlungAPI::berechneGesamtGebuehrMitNachlass($pAnmeldedaten->getZahlungen());
    $belegung->entgelt = \MathOperations::floatToString($gesamt);
    if (!\System::isKuferSql5() && (!empty($belegung->konto) || !empty($belegung->iban))) {
      $belegung->betrag = $gesamt;
    }
    $belegung->bet_offen = \MathOperations::floatToString($gesamt);

    return $gesamt;
  }

  
  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 isEPayment(): bool
  {
    return SessionOperations::getVarValueAnm('payonline', false);
  }

  
  protected function getEntgeltAndBetragOffenForGutschein($pBelegung)
  {
    $entgelt = SessionOperations::getVarValueGv('betrag');

    $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;
    $kursgebuehr->betrag = SessionOperations::getVarValueGv('betrag');
    $kursgebuehr->text = '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, $pForceKindAnmeldung = false)
  {
    $bemerkung = $bisherigeBemerkung;
    if (System::isKuferSql5()
      && (SessionOperations::isSofortEinbuchenWEB() || SessionOperations::isKuferTools())
      && (AnmeldungOperations::isKursKinderkurs($kursnr) || $pForceKindAnmeldung)) {
      $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 _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);
  }

  
  private function createGebuehrenContext(\Belegung $belegung, $tn): \KursgebuehrBerechnungsKontext
  {
    $gebuehrCtxTn = new \KursgebuehrBerechnungsKontextTeilnehmer();
    if ($tn->erm_grund > 0) {
      $dbwErmaess = new \DBWorkErmaessigung();
      if ($dbwErmaess->isErmaessigungStillValid($belegung->knr, $tn->erm_ende)) {
        $gebuehrCtxTn = \KursgebuehrBerechnungsKontextTeilnehmer::fromErmGrund($tn->erm_grund);
      }
    }
    $gebuehrCtxTn->zahlplan = $belegung->abwzpid;
    $gebuehrCtxTnAry = array($gebuehrCtxTn);

    return new \KursgebuehrBerechnungsKontext(
      $belegung->knr,
      0,
      false,
      true,
      true,
      true,
      $tn->pers_nr ?? '',
      $gebuehrCtxTnAry
    );
  }

  
  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 {
      $tn = $this->getArgument()->getHauptTeilnehmer();

      $gebuehrenCtx = $this->createGebuehrenContext($belegung, $tn);
      $gebuehrenRecher = GebuehrenElementRechner::createInstance(null);
      $gebuehrenRecher->ladeGebuehren($belegung->knr);
      $kursgebuehren = $gebuehrenRecher->getGebuehrenSaetzeErmaessigt(0, $gebuehrenCtx);

      $kursAboGebuehren = array_filter($dbwKursGeb->getGebuehrenbyKNR($belegung->knr), function($gebuehr) { return $gebuehr->fortlaufend != ''; });
      $sollIst = $belegung->status === 'W' ? 'V' : 'S';
    }

    $zahlungen = $pAnmeldedaten->getZahlungen();
    foreach ($kursgebuehren as $kursgebuehr) {
      $abwNr = 0;
      $abwZahlObj = $pAnmeldedaten->getAbwZahler();
      if (!empty($abwZahlObj)) {
        $abwNr = $abwZahlObj->id;
      }

      if (!$kursgebuehr->nurFurBerechnung) {
        $zahlungen[] = $dbwZahlung->getZahlungssatz4AnmeldungNormal(
          $belegung->id,
          $belegung->knr,
          $belegung->tnr,
          $kursgebuehr,
          $basysbenutzer->kennung,
          $abwNr,
          $sollIst
        );
      }
    }

    if (count($kursgebuehren) === 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);
    }

    $this->writeSumOfZahlungenToHauptbelegung($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();

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

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

  protected function getNachlassZahlungen($pZahlungen, $pNachlassBetrag, $pNachlassGrund, $pNachlassArt, $pNachlassBeiAnmeldung)
  {
    return ZahlungAPI::getNachlassZahlungen($pZahlungen, $pNachlassBetrag, $pNachlassGrund, $pNachlassArt, $pNachlassBeiAnmeldung);
  }

  
  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 KuferWeb_IsNachlassAllowed()
  {
    return false; 
  }

  
  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;
  }

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

  
  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 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);
  }
}