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

class AnmeldedatenSelectorFirma extends AnmeldedatenSelector
{
  protected $anzahlAnmeldungenPauschalNeutral = 0;
  protected $anzahlAnmeldungenPauschalMaennlich = 0;
  protected $anzahlAnmeldungenPauschalWeiblich = 0;

  
  public function getAnmeldedaten($argument)
  {
    $this->setArgument($argument);

    $anmeldedaten = new 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);
    } else {
      $this->fillZahlungenFirma($anmeldedaten);
    }

    return $anmeldedaten;
  }

  
  protected function fillZahlungenFirmaWarteliste($pAnmeldedaten)
  {
    $belegung = $pAnmeldedaten->getHauptBelegung();
    $tnr = $this->getArgument()->getHauptTeilnehmerNr();

    $dbwZahlung = new DBWorkZahlung();

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

    $zahlungen = $pAnmeldedaten->getZahlungen();
    $zahlungen[] = $dbwZahlung->getNeutralenZahlungssatz($belegung->knr, $tnr, $belegung->id, $basysbenutzer, 'Firmenanmeldung', 19, '', '', $basysbenutzer->kennung);
    $zahlungen[] = $dbwZahlung->getNeutralenZahlungssatz($belegung->knr, $tnr, $belegung->id, $basysbenutzer, 'Anmeldung ohne Gebühr', 19, '', '', $basysbenutzer->kennung);

    $pAnmeldedaten->setZahlungen($zahlungen);

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

  
  protected function fillTeilnehmerdatenFirma($pAnmeldedaten)
  {
    $teilnehmerMenge = $pAnmeldedaten->getWeitereTeilnehmer();
    $dbwteilnehm = new DBWorkTeilnehmer();

    $count = 0;
    for ($j = 1; $j <= SessionOperations::getVarValueWk('gAnzahl_Mitarbeiter'); $j++) {
      $tnr = SessionOperations::getVarValueIntern('w_tnr_ma' . $j);
      $tn = $dbwteilnehm->getNewObject();
      $tn->name = SessionOperations::getVarValueIntern('w_nachname_ma' . $j);
      $tn->vorname = SessionOperations::getVarValueIntern('w_vorname_ma' . $j);
      $tn->geschlecht = SessionOperations::getVarValueIntern('w_geschlecht_ma' . $j);
      $tn->strasse = SessionOperations::getVarValueIntern('w_strasse_ma' . $j);
      $tn->ort = SessionOperations::getVarValueIntern('w_ort_ma' . $j);
      $tn->rechadr3 = SessionOperations::getVarValueIntern('w_abwadr_ma' . $j);

      


      if ($tnr > 0) {
        
        $tn->id = $tnr;
        $teilnehmerMenge[] = $tn;
      } elseif ($tnr < 0) {
        

        
        switch ($tn->name) {
          case 'TN N':
            $this->anzahlAnmeldungenPauschalNeutral++;
            break;
          case 'TN M':
            $this->anzahlAnmeldungenPauschalMaennlich++;
            break;
          case 'TN W':
            $this->anzahlAnmeldungenPauschalWeiblich++;
            break;

          default:
            

            $tn->id = --$count;
            $teilnehmerMenge[] = $tn;

            break;
        }
      } else {
        
        
        throw new Exception('Die Teilnehmernummer darf nicht 0 sein', 1, null);
      }

      
      $tn->setValue2Var('tel', SessionOperations::getVarValueIntern('w_tel_ma' . $j));
      $tn->setValue2Var('email', SessionOperations::getVarValueIntern('w_email_ma' . $j));
    }


    if ($this->anzahlAnmeldungenPauschalNeutral > 0) {
      

      
      $tmpTn = $dbwteilnehm->getTeilnehmerPauschalNeutral();

      if ($tmpTn->id > 0) {
        $tn = $tmpTn;
      } else {
        $tn = $dbwteilnehm->getNewObject();
        $tn->id = --$count;
        $tn->name = 'TN N';
        $tn->geschlecht = 'N';
        $tn->suchbegriff = 'PAUSCHAL - N';
      }

      
      $tn->setValue2Var('tel', '');
      $tn->setValue2Var('email', '');

      $teilnehmerMenge[] = $tn;
    }

    if ($this->anzahlAnmeldungenPauschalMaennlich > 0) {
      

      
      $tmpTn = $dbwteilnehm->getTeilnehmerPauschalMaennlich();

      if ($tmpTn->id > 0) {
        $tn = $tmpTn;
      } else {
        $tn = $dbwteilnehm->getNewObject();
        $tn->id = --$count;
        $tn->name = 'TN M';
        $tn->geschlecht = 'M';
        $tn->suchbegriff = 'PAUSCHAL - M';
      }

      
      $tn->setValue2Var('tel', '');
      $tn->setValue2Var('email', '');

      $teilnehmerMenge[] = $tn;
    }

    if ($this->anzahlAnmeldungenPauschalWeiblich > 0) {
      

      
      $tmpTn = $dbwteilnehm->getTeilnehmerPauschalWeiblich();

      if ($tmpTn->id > 0) {
        $tn = $tmpTn;
      } else {
        $tn = $dbwteilnehm->getNewObject();
        $tn->id = --$count;
        $tn->name = 'TN W';
        $tn->geschlecht = 'W';
        $tn->suchbegriff = 'PAUSCHAL - W';
      }

      
      $tn->setValue2Var('tel', '');
      $tn->setValue2Var('email', '');

      $teilnehmerMenge[] = $tn;
    }

    $pAnmeldedaten->setWeitereTeilnehmer($teilnehmerMenge);
  }

  
  protected function fillHauptBelegungFirma($pAnmeldedaten)
  {
    $dbwb = new DBWorkBelegung();
    $dbwteilnehm = new DBWorkTeilnehmer();
    $argument = $this->getArgument();
    $teilnehmer = $dbwteilnehm->getTeilnehm($argument->getHauptTeilnehmerNr());
    $belegung = $dbwb->getNewObject();
    $belegung->id = -1;
    $belegung->tnr = $teilnehmer->id;
    $belegung->knr = $argument->getKursnummer();
    $belegung = $this->_fillZusatzdatenFromSession4Belegung($belegung);

    $dbwKursGeb = new DBWorkKursgebuehr();

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

    $kursGebuehrenAry = $this->getEntgeltAndBetragOffen($belegung, $dbwKursGeb, $argument->getStatus(), count($pAnmeldedaten->getWeitereBelegungen()) - 1);

    
    $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($pAnmeldedaten->getWeitereBelegungen()) - 1);
    }
    $belegung->eintritt = '';

    $pAnmeldedaten->setHauptBelegung($belegung);
  }

  
  protected function fillWeitereBelegungenFirma($pAnmeldedaten)
  {
    $dbwBelegung = new DBWorkBelegung();
    $teilnehmerdaten = $pAnmeldedaten->getWeitereTeilnehmer();

    $dbwTeilnehm = new DBWorkTeilnehmer();
    $hauptTeilnehmer = $dbwTeilnehm->getTeilnehm($this->getArgument()->getHauptTeilnehmerNr(), true);
    $hauptbelegung = $pAnmeldedaten->getHauptBelegung();

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

    $weitereBelegungen = $pAnmeldedaten->getWeitereBelegungen();

    $count = -1;
    foreach ($teilnehmerdaten as $weitererTeilnehmer) {
      $anzahlDesTeilnehmers = 1;
      switch ($weitererTeilnehmer->name) {
        case 'TN N':
          $anzahlDesTeilnehmers = $this->anzahlAnmeldungenPauschalNeutral;
          break;
        case 'TN M':
          $anzahlDesTeilnehmers = $this->anzahlAnmeldungenPauschalMaennlich;
          break;
        case 'TN W':
          $anzahlDesTeilnehmers = $this->anzahlAnmeldungenPauschalWeiblich;
          break;
        default:
          $anzahlDesTeilnehmers = 1;
          break;
      }

      for ($index = 0; $index < $anzahlDesTeilnehmers; ++$index) {
        --$count;
        
        $tmpbelegung = $dbwBelegung->getNewObject();
        $tmpbelegung->id = $count;
        $tmpbelegung->knr = $this->getArgument()->getKursnummer();
        $tmpbelegung->tnr = $weitererTeilnehmer->id;
        $tmpbelegung->anm_datum = DateTimeOperations::getDateTimeNow();
        $tmpbelegung->bearbeiter = $basysbenutzer->kennung;
        $tmpbelegung->anm_bearbeiter = $basysbenutzer->kennung;
        $tmpbelegung->bearbdatum = DateTimeOperations::getDateTimeNow();
        $tmpbelegung = $this->fillBemerkung4BelegungFirma($tmpbelegung);
        $tmpbelegung = $this->fillInfo2Doz4BelegungFirma($tmpbelegung);
        $tmpbelegung = $this->fillNurOnline4BelegungFirma($tmpbelegung);
        $tmpbelegung = $this->fillStatus($tmpbelegung);
        $tmpbelegung->firma = $hauptTeilnehmer->id;
        $tmpbelegung->firmabelegid = -1; 

        $tmpbelegung->erm_grund = -1;
        if (System::isKuferSql5()) {
          $tmpbelegung->bezug = 2;
        }

        $tmpbelegung = $this->_fillAnmeldeArt($tmpbelegung);

        $weitereBelegungen[] = $tmpbelegung;
      }
    }

    $pAnmeldedaten->setWeitereBelegungen($weitereBelegungen);
  }

  
  protected function fillBemerkung4BelegungFirma($pBelegung, $pWoEinzutragenBeachten = true)
  {
    $bemerkung = $this->getZusatzBemerkung4BelegungFirma($pBelegung);
    $pBelegung->setBemerkung4Anmeldung($bemerkung, $pWoEinzutragenBeachten);

    return $pBelegung;
  }

  
  protected function getZusatzBemerkung4BelegungFirma($pBelegung)
  {
    return '';
  }

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

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

    $basysbenutzer = SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty();

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

    $teinehmerdaten = $pAnmeldedaten->getWeitereTeilnehmer();

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

    $gebuehrenCount = count($kursgebuehren);

    $anzahlTeilnehmer = count($teinehmerdaten);
    
    if ($this->anzahlAnmeldungenPauschalNeutral > 1) {
      $anzahlTeilnehmer += ($this->anzahlAnmeldungenPauschalNeutral - 1);
    }
    if ($this->anzahlAnmeldungenPauschalMaennlich > 1) {
      $anzahlTeilnehmer += ($this->anzahlAnmeldungenPauschalMaennlich - 1);
    }
    if ($this->anzahlAnmeldungenPauschalWeiblich > 1) {
      $anzahlTeilnehmer += ($this->anzahlAnmeldungenPauschalWeiblich - 1);
    }

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

      
      
      

      $zahlungId = --$count;
      $zahlungen[] = $dbwZahlung->getZahlungssatz4AnmeldungFirma(
        $belegung->id,
        $belegung->knr,
        $belegung->tnr,
        $kursgebuehren[$i],
        $basysbenutzer->kennung,
        $zahlungId,
        $anzahlTeilnehmer,
        $zpf
      );
    }

    $pAnmeldedaten->setZahlungen($zahlungen);

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

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

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

  
  protected function fillZahlungenWeitererTn($pAnmeldedaten, $pBasysBenutzer)
  {
    $belegung = $pAnmeldedaten->getHauptBelegung();
    $dbwZahlung = new DBWorkZahlung();
    $teinehmerdaten = $pAnmeldedaten->getWeitereTeilnehmer();
    $zahlungen = $pAnmeldedaten->getZahlungen();
    $weitereBelegungen = $pAnmeldedaten->getWeitereBelegungen();
    $belegungsStatus = $weitereBelegungen[0]->status;

    foreach ($teinehmerdaten as $weitererTeilnehmer) {
      
      
      

      $anzahlTeilnehmerPauschal = 1;
      switch ($weitererTeilnehmer->name) {
        case 'TN N':
          $anzahlTeilnehmerPauschal = $this->anzahlAnmeldungenPauschalNeutral;
          break;
        case 'TN M':
          $anzahlTeilnehmerPauschal = $this->anzahlAnmeldungenPauschalMaennlich;
          break;
        case 'TN W':
          $anzahlTeilnehmerPauschal = $this->anzahlAnmeldungenPauschalWeiblich;
          break;

        default:
          
          $anzahlTeilnehmerPauschal = 1;
          break;
      }

      
      
      

      $bereitsVerwendeteBelids = array();

      $zahlungIds = ArrayOperations::mapAttribut($zahlungen, 'id');
      $negativeMaxZahlungsId = min($zahlungIds);

      for ($index = 0; $index < $anzahlTeilnehmerPauschal; ++$index) {

        
        
        
        
        
        
        
        
        
        

        $belidWeitererTeilnehmer = 0;
        foreach ($weitereBelegungen as $weitereBelegung) {
          if ($weitereBelegung->tnr == $weitererTeilnehmer->id && !in_array($weitereBelegung->id, $bereitsVerwendeteBelids)) {
            $belidWeitererTeilnehmer = $weitereBelegung->id;
            $bereitsVerwendeteBelids[] = $belidWeitererTeilnehmer;
            break;
          }
        }

        
        $zahlungId = --$negativeMaxZahlungsId;
        $zahlungen[] = $dbwZahlung->getZahlungssatz4AnmeldungWeitereHauptTeilnehmer(
          $belegung->id,
          $belegung->knr,
          $belegung->tnr,
          $pBasysBenutzer->kennung,
          $zahlungId,
          $weitererTeilnehmer,
          $belegungsStatus
        );

        
        $zahlungId = --$negativeMaxZahlungsId;
        $zahlungen[] = $dbwZahlung->getZahlungssatz4AnmeldungWeitereTeilnehmer(
          $belidWeitererTeilnehmer,
          $belegung->knr,
          $weitererTeilnehmer->id,
          $pBasysBenutzer->kennung,
          $zahlungId,
          'Firmenanmeldung'
        );
      }
    }

    $pAnmeldedaten->setZahlungen($zahlungen);
  }

  
  protected function setzeEinzelPreisUndFaktor($pZahlung)
  {
    return $this->setzeEinzelPreisUndFaktor4MehrfachOderFirma($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;
  }
}