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


class AnmeldedatenSelectorFirmaSofortEinbuchen extends AnmeldedatenSelectorFirma
{
  
  public function getAnmeldedaten($argument)
  {
    $this->setArgument($argument);

    $anmeldedaten = new Anmeldedaten();
    $this->fillEPayInfo($anmeldedaten);
    $this->fillKurs($anmeldedaten);
    $this->fillAbwZahler($anmeldedaten);
    $this->fillTeilnehmerdatenFirma($anmeldedaten);
    $this->fillWeitereBelegungenFirma($anmeldedaten);
    $this->fillHauptBelegungFirma($anmeldedaten);
    $weitereBelegungen = $anmeldedaten->getWeitereBelegungen();
    if ($weitereBelegungen[0]->status === 'W' || $weitereBelegungen[0]->status === 'P' || $weitereBelegungen[0]->status === 'I') {
      $this->fillZahlungenFirmaWarteliste($anmeldedaten);
    } elseif (DBWorkBASysSettings::isInnsbruckStadt() && $weitereBelegungen[0]->status === 'G') {
      $this->fillZahlungenFirmaWarteliste($anmeldedaten);
    } else {
      $this->fillZahlungenFirma($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 fillHauptBelegungFirma($pAnmeldedaten)
  {
    $dbwBelegung = new DBWorkBelegung();
    $teilnehmer = $this->getArgument()->getHauptTeilnehmer();
    $belegung = $dbwBelegung->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');

    if (SessionOperations::isKuferTools() && isset($_REQUEST['anm_bemerkung'])) {
      if ($belegung->getBemerkung4Anmeldung() == '') {
        $belegung->setBemerkung4Anmeldung($_REQUEST['anm_bemerkung']);
      }
    }

    
    $belegung->anm_datum = DateTimeOperations::getDateTimeNow();
    $belegung->bearbeiter = $basysbenutzer->kennung;
    $belegung->anm_bearbeiter = $basysbenutzer->kennung;
    $belegung->bearbdatum = DateTimeOperations::getDateTimeNow();
    $belegung->status = 'F';
    $belegung->entgelt = \MathOperations::floatToString(0);
    $belegung->bet_offen = \MathOperations::floatToString(0);
    $belegung->mf_ok = 'W';
    $belegung->erm_grund = ($teilnehmer->erm_grund == 0 ? -1 : $teilnehmer->erm_grund);
    $belegung = $this->addAnmquelleByArgument($belegung);

    if (System::isKuferSql5()) {
      $belegung->bezug = 2;
    }

    $dublettenAktiviert = SessionOperations::isDublettenerkennung();
    
    
    
    if (!SessionOperations::isKuferTools() && (!$dublettenAktiviert || SessionOperations::getVarValueAnm('payonline') > 0 || $this->getArgument()->getEPayId() > 0 || $pAnmeldedaten->getAbwZahler() != null)) {
      $pAnmeldedaten->setFirmaNichtZuordnen(true);
    }

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

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

    return false;
  }

  
  protected function fillTeilnehmerdatenFirma($pAnmeldedaten)
  {
    $teilnehmerMenge = array();
    $dublettenArray = $pAnmeldedaten->getDublettenNummern();
    $dublettenAktiviert = SessionOperations::isDublettenerkennung();
    $mitarbeiter = $this->getMitarbeiter();

    $id = -1; 
    $tnId = 0; 
    foreach ($mitarbeiter as $tnpflicht) {
      
      if ($dublettenAktiviert) {
        $tnIdAry = TeilnehmerAPI::isDublette($tnpflicht);
        if ($tnIdAry == false) {
          $tnId = false;
        } else {
          $tnId = $tnIdAry['sqlid'];
          $tnIdMysql = $tnIdAry['replikatid'];
        }
      }
      
      if (SessionOperations::isKuferTools() && $tnpflicht->id > 0) {
        $tnId = $tnpflicht->id;
      }
      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 ?? null;
      } else {
        if (!(isset($tnpflicht->istanonym) && $tnpflicht->istanonym == 1 && $tnpflicht->id > 0)) {
          $dmzid = $this->_getDmzIdMitarbeiter(abs($id));
          if ($dmzid) {
            $tnpflicht->id = $dmzid;
          } else {
            $tnpflicht->id = $id; 
          }
          $id--;
        }
      }
      
      
      
      
      $teilnehmerMenge[] = $tnpflicht->copyAsTeilnehmer(array('istanonym'));
    }
    $pAnmeldedaten->setDublettenNummern($dublettenArray);
    $pAnmeldedaten->setWeitereTeilnehmer($teilnehmerMenge);
  }

  protected function getMitarbeiter()
  {
    return SessionOperations::getMitarbeiterFromSession();
  }

  
  protected function fillWeitereBelegungenFirma($pAnmeldedaten)
  {
    $dbwBelegung = 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, 'F');
    $settings = BASysSettingsAPI::getBASysSettings();
    $count = -1;
    foreach ($teilnehmerdaten as $weitererTeilnehmer) {
      --$count;
      
      $tmpbelegung = $dbwBelegung->getNewObject();
      $tmpbelegung->id = $count;
      $tmpbelegung->knr = $this->getArgument()->getKursnummer();
      if (isset($weitererTeilnehmer->istanonym) && $weitererTeilnehmer->istanonym == '1') {
        $tmpbelegung->tnr = $hauptTeilnehmerId;
      } else {
        
        
        
        $tmpbelegung->tnr = $weitererTeilnehmer->id;
      }
      $tmpbelegung->anmeldeart = $settings->eanmart;
      $tmpbelegung->anm_datum = DateTimeOperations::getDateTimeNow();
      $tmpbelegung->bearbeiter = $basysbenutzer->kennung;
      $tmpbelegung->bearbdatum = DateTimeOperations::getDateTimeNow();
      
      
      $tmpbelegung = $this->fillBemerkung4BelegungFirma($tmpbelegung, true);
      $tmpbelegung->setBemerkung4Anmeldung('Firma: ' . $hauptTeilnehmer->getVarValue('name_ggf_vorname'), false);
      $tmpbelegung = $this->fillInfo2Doz4BelegungFirma($tmpbelegung);
      $tmpbelegung = $this->fillNurOnline4BelegungFirma($tmpbelegung);
      $tmpbelegung->status = $belegungsStatus;
      $tmpbelegung->firma = $hauptTeilnehmerId;
      $tmpbelegung->firmabelegid = -1; 
      $tmpbelegung->erm_grund = -1;
      if (System::isKuferSql5()) {
        $tmpbelegung->bezug = 2;
      }
      $weitererTeilnehmer->altersklasseUndGeburtsdatumAnpassen();
      $weitererTeilnehmer->info_intern = 'Angelegt durch Online-Anmeldung';
      $weitereBelegungen[] = $tmpbelegung;
    }
    $weitereBelegungen = $this->_fillHistoryKrit4WeitereBelegungen($weitereBelegungen);
    $pAnmeldedaten->setWeitereBelegungen($weitereBelegungen);
  }

  
  protected function getZusatzBemerkung4BelegungFirma($pBelegung)
  {
    $bemerkung = '';
    $lauf = 0 - ($pBelegung->id + 1);
    $varname = 'wk_w_bemerkung_ma' . $lauf;
    if (SessionOperations::isDefinedIntern($varname)) {
      $bemerkung .= ' ' . SessionOperations::getVarValueIntern($varname);
    }

    return $bemerkung;
  }

  
  protected function fillZahlungenFirmaWarteliste($pAnmeldedaten)
  {
    parent::fillZahlungenFirmaWarteliste($pAnmeldedaten);

    $belegung = $pAnmeldedaten->getHauptBelegung();

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

    $pAnmeldedaten->setZahlungen($zahlungen);
  }

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

    $tnr = $this->getArgument()->getHauptTeilnehmerNr();

    $dbzahlung = new DBWorkZahlung();
    $dbwKursGeb = new DBWorkKursgebuehr();
    $kursAboGebuehren = array_filter($dbwKursGeb->getGebuehrenbyKNR($belegung->knr), function($gebuehr) { return ($gebuehr->fortlaufend != ''); });

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

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

    $teilnehmerdaten = $pAnmeldedaten->getWeitereTeilnehmer();
    $anzahlT = count($teilnehmerdaten);
    
    if ($this->anzahlAnmeldungenPauschalNeutral > 1) {
      $anzahlT += ($this->anzahlAnmeldungenPauschalNeutral - 1);
    }
    if ($this->anzahlAnmeldungenPauschalMaennlich > 1) {
      $anzahlT += ($this->anzahlAnmeldungenPauschalMaennlich - 1);
    }
    if ($this->anzahlAnmeldungenPauschalWeiblich > 1) {
      $anzahlT += ($this->anzahlAnmeldungenPauschalWeiblich - 1);
    }

    $kursgebuehren = $this->determineKursgebuehrenForFirma($belegung, $belegung->knr, $tn, $anzahlT);

    $zahlungen = $pAnmeldedaten->getZahlungen();
    $zahlungen[] = $dbzahlung->getNeutralenZahlungssatz($belegung->knr, $tnr, $belegung->id, $basysbenutzer, 'Firmenanmeldung', 19, '', '', $basysbenutzer->kennung);

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

    $count = 0;
    foreach ($kursgebuehren as $i => $kursgebuehrenTn) {
      foreach ($kursgebuehrenTn as $kursgebuehr) {
        if(!$kursgebuehr->nurFurBerechnung){
        $tmpzahlung = $dbzahlung->getNewObject();
        $tmpzahlung->setStandardValues();
        $tmpzahlung->id = --$count;
        $tmpzahlung->knr = $belegung->knr;
        $tmpzahlung->tnr = $tnr;
        $tmpzahlung->typ = 'T';
        $tmpzahlung->art = 1;
        $tmpzahlung->datum = DateTimeOperations::getDateNow();
        $tmpzahlung->uhrzeit = DateTimeOperations::getTimeNow();
        $tmpzahlung->gebuehrenart = $kursgebuehr->gebart;
        $tmpzahlung->kursgeb_id = $kursgebuehr->id;

        $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 = $belegung->id;
        $tmpzahlung->konto = $kursgebuehr->konto;
        $tmpzahlung->kostenst = $kursgebuehr->kostenst;
        $tmpzahlung->bearbeiter = $basysbenutzer->kennung;
        $tmpzahlung->bearbdatum = DateTimeOperations::getDateNow();

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

    $this->fillFortlaufendeGebuehren($pAnmeldedaten, $kursAboGebuehren, $basysbenutzer->kennung, $anzahlT, true);

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

    $this->writeSumOfZahlungenToHauptbelegung($pAnmeldedaten);

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

  
  protected function _fillHistoryKrit4WeitereBelegungen($pWeitereBelegungen)
  {
    for ($j = 0; $j < count($pWeitereBelegungen); $j++) {
      for ($i = 0; $i < 16; $i++) {
        $var = ('w_beleghistorie' . ($i + 1));
        $belegVar = 'historiekrit' . ($i + 1);
        
        if (SessionOperations::isKuferTools() && trim(SessionOperations::getVarValueIntern($var . '_' . 'ma' . ($j + 1))) != '') {
          $pWeitereBelegungen[$j]->{$belegVar} = SessionOperations::getVarValueIntern($var);
        } else {
          $var .= '_' . $pWeitereBelegungen[$j]->knr;
          $var .= '_' . 'ma' . ($j + 1);
          $pWeitereBelegungen[$j]->{$belegVar} = SessionOperations::getVarValueWk($var);
        }
      }
    }

    return $pWeitereBelegungen;
  }

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

    return $fillAbwBankDaten4Belegung->fillAbwBankDaten($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 fillInfo2Doz4BelegungFirma($pBelegung)
  {
    $pBelegung->info2doz = $this->getArgumentKursInfoValue('info2doz');

    return $pBelegung;
  }

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

    return $pBelegung;
  }

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

    return $pBelegung;
  }
}