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


class AnmeldedatenSelectorMehrfachSofortEinbuchen extends AnmeldedatenSelectorMehrfach
{
  
  public function getAnmeldedaten($argument)
  {
    $this->setArgument($argument);

    $anmeldedaten = new Anmeldedaten();

    $this->fillEPayInfo($anmeldedaten);
    $this->fillKurs($anmeldedaten);
    $this->fillAbwZahler($anmeldedaten);
    $this->fillTeilnehmerdatenMehrfach($anmeldedaten);


    
    $this->fillWeitereBelegungenMehrfach($anmeldedaten);
    
    $this->fillHauptBelegungMehrfach($anmeldedaten); 
    $belegung = $anmeldedaten->getHauptBelegung();
    if ($belegung->status == 'W' || $belegung->status === 'P' || $belegung->status === 'I') {
      $this->fillZahlungenMehrfachWarteliste($anmeldedaten);
    } else {
      $this->fillZahlungenMehrfach($anmeldedaten);
      $this->fillGutschein($anmeldedaten);
    }

    return $anmeldedaten;
  }

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

    return $pBelegung;
  }

  
  protected function _fillHistoryKrit4Belegung($pBelegung, $mehrfachnr = 0)
  {
    
    if ($mehrfachnr > 0) {
      for ($i = 1; $i <= 16; $i++) {
        $belegVar = 'historiekrit' . $i;
        $pBelegung->{$belegVar} = SessionOperations::getBelegungValueFromSession($pBelegung->getVarValue('knr'), 'beleghistorie' . $i, $mehrfachnr, 4);
      }
    } else { 
      for ($i = 1; $i <= 16; $i++) {
        $belegVar = 'historiekrit' . $i;
        $pBelegung->{$belegVar} = SessionOperations::getBelegungValueFromSession($pBelegung->getVarValue('knr'), 'beleghistorie' . $i);
      }
    }

    return $pBelegung;
  }

  
  protected function fillHauptBelegungMehrfach($pAnmeldedaten)
  {
    $dbwb = new DBWorkBelegung();
    $teilnehmer = $this->getArgument()->getHauptTeilnehmer();
    $belegung = $dbwb->getNewObject();
    $belegung->id = -1;
    $belegung->knr = $this->getArgument()->getKursnummer();
    $belegung->tnr = $teilnehmer->id;
    $belegung->teilnehmer = $teilnehmer;

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

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();
    $isOnlineteilnahme = $this->getArgumentKursInfoValue('nuronline');
    $belegungsStatus = $this->getBelegungStatusSofortEinbuchen($belegung->knr, $pAnmeldedaten->getWeitereTeilnehmer(), $isOnlineteilnahme, $teilnehmer->geschlecht);

    $weitereBelegungen = $pAnmeldedaten->getWeitereBelegungen();
    $anzWeitereBelegungen = count($weitereBelegungen);

    $belegung->entgelt = \MathOperations::floatToString(0);
    $belegung->bet_offen = \MathOperations::floatToString(0);

    
    $settings = BASysSettingsAPI::getBASysSettings();
    $belegung->anmeldeart = $settings->eanmart;
    $belegung->anm_datum = DateTimeOperations::getDateTimeNow();
    $belegung->bearbeiter = $basysbenutzer->kennung;
    $belegung->anm_bearbeiter = $basysbenutzer->kennung;
    $belegung->bearbdatum = DateTimeOperations::getDateTimeNow();
    $belegung->status = $belegungsStatus;

    $belegung->mf_ok = 'W';
    $belegung->erm_grund = $teilnehmer->erm_grund;
    $belegung = $this->addAnmquelleByArgument($belegung);
    
    if (System::isKuferSql5() && SessionOperations::isSofortEinbuchenWEB() && AnmeldungOperations::isKursKinderkurs($belegung->knr)) {
      $bemerkungBisher = $belegung->getBemerkung4Anmeldung(false);
      $bemerkung = $this->addBemerkungKinderanmeldung($bemerkungBisher, $belegung->knr);
      if ($bemerkung != $bemerkungBisher) {
        $belegung->setBemerkung4Anmeldung($bemerkung, false);
      }
    } else {
      $belegung->setBemerkung4Anmeldung($this->getZusatzBemerkung4Belegung($belegung, $anzWeitereBelegungen), false, true);
    }

    if (trim($belegung->bemerkung) !== '' && substr(trim($belegung->bemerkung), -1) != ';') {
      $belegung->bemerkung .= '; ';
    }
    
    
    
    
    

    if (System::isKuferSql5()) {
      $belegung->bezug = AnmeldungOperations::isKursKinderkurs($belegung->knr) ? 3 : 1;
    }
    if (System::isKuferSql5() && AnmeldungOperations::isKursKinderkurs($this->getArgument()->getKursnummer()) && isset($pAnmeldedaten->getAbwZahler()->id)) {
      $belegung->firma = $pAnmeldedaten->getAbwZahler()->id;
    }

    $belegung->eintritt = $this->getArgument()->getKurs()->eintritt;
    $belegung->austritt = $this->getArgument()->getKurs()->austritt;
    $pAnmeldedaten->setHauptBelegung($belegung);
  }

  private function _getDmzIdWeiterer($laufvar)
  {
    $dmzid = SessionOperations::getVarValueWk('w_' . 'dmzid' . 'mehr' . $laufvar);
    if ($dmzid != '') {
      return $dmzid;
    }

    return false;
  }

  
  protected function fillTeilnehmerdatenMehrfach($pAnmeldedaten)
  {
    $teilnehmerMenge = array();
    $weitere = $this->getWeitereTeilnehmer();

    $id = -1; 
    $tnId = 0; 
    $dublettenArray = $pAnmeldedaten->getDublettenNummern();
    $dublettenAktiviert = SessionOperations::isDublettenerkennung();
    foreach ($weitere as $tnpflicht) {
      if ($dublettenAktiviert) {
        $tnIdAry = TeilnehmerAPI::isDublette($tnpflicht);
        if ($tnIdAry == false) {
          $tnId = false;
        } else {
          $tnId = $tnIdAry['sqlid'];
          $tnIdMysql = $tnIdAry['replikatid'];
        }
      }
      if ($tnId > 0) {
        $dublettenArray[] = $tnId;
        $teilnehmerMSSQLInfos = TeilnehmerAPI::getTeilnehmerInfosPerDMZ($tnId);
        $kommunikationMSSQLInfos = KommunikationsAPI::getKommunikationInfosPerDMZ($tnId);
        $teilnehmerMSSQLInfosForEmail = $teilnehmerMSSQLInfos->copyAsTeilnehmerPflicht();
        $teilnehmerMSSQLInfosForEmail->tnr = $teilnehmerMSSQLInfos->tnr; 
        TeilnehmerAPI::eMailBeiDublette($tnpflicht, $teilnehmerMSSQLInfosForEmail, $kommunikationMSSQLInfos);
        $tnpflicht->id = $tnId;
        $tnpflicht->mysqlid = $tnIdMysql;
      } else {
        $tnpflicht->info_intern = 'Angelegt durch Online-Anmeldung';
        $dmzid = $this->_getDmzIdWeiterer(abs($id));
        if ($dmzid) {
          $tnpflicht->id = $dmzid;
        } else {
          
          
          
          if ($tnpflicht->id <= 0) {
            $tnpflicht->id = $id; 
          }
        }
        $id--;
      }
      $tnpflicht = $this->_aendereFeldnamen($tnpflicht);
      
      
      
      $teilnehmerMenge[] = $tnpflicht->copyAsTeilnehmer(array('istanonym'));
    }

    $pAnmeldedaten->setDublettenNummern($dublettenArray);
    $pAnmeldedaten->setWeitereTeilnehmer($teilnehmerMenge);
  }

  protected function getWeitereTeilnehmer()
  {
    return SessionOperations::getWeitereFromSession();
  }

  
  private function _aendereFeldnamen($pTnpflicht)
  {
    $tnpflicht = $pTnpflicht;
    foreach ($tnpflicht as $key => $value) {
      if ($key == 'kontoinhaber') {
        $tnpflicht->kontoname = $value;
        unset($tnpflicht->{$key});
      }
    }

    return $tnpflicht;
  }

  
  protected function fillWeitereBelegungenMehrfach($pAnmeldedaten)
  {
    $dbbelegung = new DBWorkBelegung();
    $teilnehmerdaten = $pAnmeldedaten->getWeitereTeilnehmer();

    $hauptTeilnehmerId = $this->getArgument()->getHauptTeilnehmerNr();
    $hauptTeilnehmer = $this->getArgument()->getHauptTeilnehmer();
    $hauptbelegung = $pAnmeldedaten->getHauptBelegung();

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

    $weitereBelegungen = $pAnmeldedaten->getWeitereBelegungen();

    $isOnlineteilnahme = $this->getArgumentKursInfoValue('nuronline');
    $belegungsStatus = $this->getBelegungStatusSofortEinbuchen($pAnmeldedaten->getKurs()->id, $teilnehmerdaten, $isOnlineteilnahme);
    $settings = BASysSettingsAPI::getBASysSettings();
    $count = -1;
    $i = 1;
    foreach ($teilnehmerdaten as $weitererTeilnehmer) {
      --$count;
      
      $tmpbelegung = $dbbelegung->getNewObject();
      $tmpbelegung->id = $count;
      $tmpbelegung->knr = $this->getArgument()->getKursnummer();
      $tmpbelegung->tnr = $weitererTeilnehmer->id;
      $tmpbelegung->anmeldeart = $settings->eanmart; 
      $tmpbelegung->anm_datum = DateTimeOperations::getDateTimeNow();
      $tmpbelegung->bearbeiter = $basysbenutzer->kennung;
      $tmpbelegung->anm_bearbeiter = $basysbenutzer->kennung;
      $tmpbelegung->bearbdatum = DateTimeOperations::getDateTimeNow();

      $bisherigeBemerkung = $this->getBemerkung4Belegung($this->getArgument()->getKursnummer());
      $bemerkung = $this->addBemerkungKinderanmeldung($bisherigeBemerkung, $this->getArgument()->getKursnummer());
      if ($bisherigeBemerkung != $bemerkung) {
        $tmpbelegung->setBemerkung4Anmeldung($bemerkung, false);
      } else {
        $tmpbelegung->setBemerkung4Anmeldung('Mehrfachanmeldung; Ursprünglicher Hauptzahler: '
                                . $hauptTeilnehmer->vorname . ' ' . $hauptTeilnehmer->name . ' (' . $hauptTeilnehmerId . ')', false);
      }
      $tmpbelegung = $this->_fillBemerkung4BelegungMehrfach($tmpbelegung, true);
      $tmpbelegung = $this->fillInfo2Doz4BelegungMehrfach($tmpbelegung);
      $tmpbelegung = $this->fillNurOnline4BelegungMehrfach($tmpbelegung);
      $tmpbelegung->status = $belegungsStatus;
      if (System::isKuferSql5() && AnmeldungOperations::isKursKinderkurs($this->getArgument()->getKursnummer()) && isset($pAnmeldedaten->getAbwZahler()->id)) {
        $tmpbelegung->firma = $pAnmeldedaten->getAbwZahler()->id;
      } else {
        $tmpbelegung->firma = $hauptTeilnehmerId;
      }
      $tmpbelegung->firmabelegid = -1; 
      $tmpbelegung->mf_ok = 'W';
      $tmpbelegung->erm_grund = -1;
      if (System::isKuferSql5()) {
        $tmpbelegung->bezug = AnmeldungOperations::isKursKinderkurs($tmpbelegung->knr) ? 3 : 1;
      }
      $weitererTeilnehmer->altersklasseUndGeburtsdatumAnpassen();

      $tmpbelegung = $this->_fillHistoryKrit4Belegung($tmpbelegung, $i);
      $weitereBelegungen[] = $tmpbelegung;
      $i++;
    }
    $pAnmeldedaten->setWeitereBelegungen($weitereBelegungen);
  }

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

    $dbzahlung = new DBWorkZahlung();

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

    $tn = $this->getArgument()->getHauptTeilnehmer();


    $teilnehmerdaten = $pAnmeldedaten->getWeitereTeilnehmer();
    $anzahlTeilnehmer = 1 + count($teilnehmerdaten);
    $gebuehrenCtx = $this->createGebuehrenContextMehrfach($belegung, $tn, $anzahlTeilnehmer);
    $gebuehrenRechner = GebuehrenElementRechner::createInstance(null);
    $gebuehrenRechner->ladeGebuehren($belegung->knr);
    
    $kursgebuehren = array();
    for ($i = 0; $i < $anzahlTeilnehmer; ++$i) {
      $kursgebuehren[] = $gebuehrenRechner->getGebuehrenSaetzeErmaessigt($i, $gebuehrenCtx);
    }

    $abwNr = 0;
    $abwZahlObj = $pAnmeldedaten->getAbwZahler();
    if (!empty($abwZahlObj)) {
      $abwNr = $abwZahlObj->id;
    }

    $zahlungen = $pAnmeldedaten->getZahlungen();

    if (!System::isKuferSql5()) {
      $zahlungen[] = $dbzahlung->getNeutralenZahlungssatz($belegung->knr, $belegung->tnr, $belegung->id, $basysbenutzer, 'Mehrfachanmeldung', 18, '', '', $basysbenutzer->kennung, $abwNr, 'T', 'T');
    }

    
    

    $count = 0;
    foreach ($kursgebuehren as $kursgebuehrenTn) {
      foreach ($kursgebuehrenTn as $kursgebuehr) {
        if(!$kursgebuehr->nurFurBerechnung){
        $tmpzahlung = $dbzahlung->getNewObject();
        $tmpzahlung->setStandardValues();
        $tmpzahlung->id = --$count;
        $tmpzahlung->knr = $belegung->knr;
        $tmpzahlung->tnr = $belegung->tnr;
        $tmpzahlung->typ = 'T';
        $tmpzahlung->art = 1;
        $tmpzahlung->datum = DateTimeOperations::getDateNow();
        $tmpzahlung->uhrzeit = DateTimeOperations::getTimeNow();
        $tmpzahlung->gebuehrenart = $kursgebuehr->gebart;
        $tmpzahlung->betrag = MathOperations::floatToString($kursgebuehr->betrag);
        $tmpzahlung->einzelpreis = $kursgebuehr->betrag;
        $tmpzahlung->faktor = 1;
        $tmpzahlung->text = $kursgebuehr->text;
        $tmpzahlung->dp = $kursgebuehr->dp;
        $tmpzahlung->faelligkeit = $kursgebuehr->faelligkeit;
        $tmpzahlung->mwst = $kursgebuehr->mwst;
        $tmpzahlung->sollist = 'S';
        $tmpzahlung->belegid = $pAnmeldedaten->getHauptBelegung()->id;
        $tmpzahlung->konto = $kursgebuehr->konto;
        $tmpzahlung->kostenst = $kursgebuehr->kostenst;
        $tmpzahlung->bearbeiter = $basysbenutzer->kennung;
        $tmpzahlung->bearbdatum = DateTimeOperations::getDateNow();
        $tmpzahlung->kursgeb_id = $kursgebuehr->id;

        if (System::isKuferSql5()) {
          $tmpzahlung->zpf = $abwNr > 0 ? $abwNr : $belegung->tnr;
        } else {
          if ($abwNr > 0) {
            $tmpzahlung->abw_nr = $abwNr;
            $tmpzahlung->abw_typ = 'T';
          }
        }

        $zahlungen[] = $tmpzahlung;

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

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

    $this->writeSumOfZahlungenToHauptbelegung($pAnmeldedaten);

    $this->fillZahlungenWeitererTn($pAnmeldedaten, $basysbenutzer);
  }

  protected function _fillAbwBankDaten4Belegung($pBelegung)
  {
    $fillAbwBankDaten4Belegung = new FillAbwBankDaten4BelegungSofortEinbuchen($this->getArgument());

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

  
  protected function fillStatus($pBelegung)
  {
    return $pBelegung;
  }

  
  protected function getNachlassBetragFromSession()
  {
    if ($this->KuferWeb_IsNachlassAllowed()) {
      return parent::getNachlassBetragFromSession();
    }

    return 0.0;
  }

  
  protected function fillNachlassZahlungen($pAnmeldedaten)
  {
    if ($this->KuferWeb_IsNachlassAllowed()) {
      parent::fillNachlassZahlungen($pAnmeldedaten);
    }
  }

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

  protected function setzeEinzelPreisUndFaktor($pZahlung)
  { 
    
    if ($pZahlung->beleg === 'Nachl.') {
      $pZahlung->einzelpreis = $pZahlung->betrag;
      $pZahlung->faktor = 1;
    } else {
      $pZahlung = parent::setzeEinzelPreisUndFaktor($pZahlung);
    }

    return $pZahlung;
  }

  protected function fillInfo2Doz4Belegung($pBelegung)
  {
    $pBelegung->info2doz = $this->getArgumentKursInfoValue('info2doz');

    return $pBelegung;
  }

  protected function fillInfo2Doz4BelegungMehrfach($pBelegung)
  {
    $pBelegung->info2doz = $this->getArgumentKursInfoValue('info2doz');

    return $pBelegung;
  }

  protected function fillNurOnline4Belegung($pBelegung)
  {
    $pBelegung->nuronline = $this->getArgumentKursInfoValue('nuronline');

    return $pBelegung;
  }

  protected function fillNurOnline4BelegungMehrfach($pBelegung)
  {
    $pBelegung->nuronline = $this->getArgumentKursInfoValue('nuronline');

    return $pBelegung;
  }
}