<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, 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);
    }

    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);
    $dbwKursGeb = new DBWorkKursgebuehr();

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

    $isOnlineteilnahme = $this->getArgumentKursInfoValue('nuronline');
    $belegungsStatus = $this->getBelegungStatusSofortEinbuchen($belegung->knr, $pAnmeldedaten->getWeitereTeilnehmer(), $isOnlineteilnahme, 'F');

    $weitereBelegungen = $pAnmeldedaten->getWeitereBelegungen();
    $kursGebuehrenAry = $this->getEntgeltAndBetragOffen($belegung, $dbwKursGeb, $belegungsStatus, count($weitereBelegungen) - 1, $teilnehmer);

    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 = $kursGebuehrenAry['entgelt'];
    $belegung->bet_offen = $kursGebuehrenAry['betragOffen'];
    $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;
    } else {
      $belegung->betrag = $this->getAbwBetrag($belegung, $dbwKursGeb, count($weitereBelegungen) - 1, $teilnehmer);
    }

    $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();
    $dbkursgeb = new DBWorkKursgebuehr();

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

    $zahlplanKursnummer = $this->_getZahlplanKursnummer($belegung);
    $tn = $this->getArgument()->getHauptTeilnehmer();
    $kursgebuehren = $dbkursgeb->getKursgebuehrenErmaessigtTab($belegung->knr, $tnr, '', '', '', $tn, $zahlplanKursnummer);

    $teilnehmerdaten = $pAnmeldedaten->getWeitereTeilnehmer();

    $zahlungen = $pAnmeldedaten->getZahlungen();

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

    $gebuehrenCount = count($kursgebuehren);

    
    
    $count = 0;
    for ($i = 0; $i < $gebuehrenCount; $i++) {
      $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 = $kursgebuehren[$i]->gebart;
      $tmpzahlung->kursgeb_id = $kursgebuehren[$i]->id;

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

      $tmpzahlung->betrag = MathOperations::floatToString($kursgebuehren[$i]->gebuehr * ($anzahlT));
      $tmpzahlung->einzelpreis = $kursgebuehren[$i]->gebuehr;
      $tmpzahlung->faktor = $anzahlT;
      $tmpzahlung->text = $kursgebuehren[$i]->bezeichnung;
      $tmpzahlung->dp = $kursgebuehren[$i]->dp;
      $tmpzahlung->faelligkeit = $kursgebuehren[$i]->faelligkeit;
      $tmpzahlung->mwst = $kursgebuehren[$i]->mwst;
      $tmpzahlung->sollist = 'S';
      $tmpzahlung->belegid = $belegung->id;
      $tmpzahlung->konto = $kursgebuehren[$i]->konto;
      $tmpzahlung->kostenst = $kursgebuehren[$i]->kostenst;
      $tmpzahlung->bearbeiter = $basysbenutzer->kennung;
      $tmpzahlung->bearbdatum = DateTimeOperations::getDateNow();

      $abwNr = 0;
      $abwZahlObj = $pAnmeldedaten->getAbwZahler();
      if (!empty($abwZahlObj)) {
        $abwNr = $abwZahlObj->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->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()
  {
    return 0.0;
  }

  
  protected function fillNachlassZahlungen($pAnmeldedaten)
  {
  }

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