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


class KursgebuehrBerechnungsKontext
{
  
  public $knr;

  
  public $kinderanzahl;

  
  public $rabattierbar;

  
  public $hauptTnAuch;

  
  public $brutto;

  
  public $isFirmenAnmeldung;

  
  public $spendeninfos;

  
  public $pers_nr;

  
  public $tns;

  
  public $useKostenstellenAndererGebuehrenForSpenden;

  
  public function __construct(
    string $knr,
    int $kinderanzahl = 0,
    bool $rabattierbar = false,
    bool $hauptTnAuch = true,
    bool $brutto = true,
    bool $isFirmenAnmeldung = false,
    string $persNr = '',
    ?array $tns = null,
    ?bool $useKostenstellenAndererGebuehrenForSpenden = null
  ) {
    $this->knr = $knr;
    $this->kinderanzahl = $kinderanzahl;
    $this->rabattierbar = $rabattierbar;
    $this->hauptTnAuch = $hauptTnAuch;
    $this->brutto = $brutto;
    $this->isFirmenAnmeldung = $isFirmenAnmeldung;
    $this->pers_nr = $persNr;
    if (is_null($tns)) {
      $tns = array(new KursgebuehrBerechnungsKontextTeilnehmer());
    }
    $this->tns = $tns;

    if (is_null($useKostenstellenAndererGebuehrenForSpenden)) {
      $dbwhl = \DBWorkHLGrundSys::getDefaultInstance();
      $this->useKostenstellenAndererGebuehrenForSpenden
        = $dbwhl->getFeldWert('E539_ZUSCHLAGKTOKST1', 'F') == 'W';
    } else {
      $this->useKostenstellenAndererGebuehrenForSpenden = $useKostenstellenAndererGebuehrenForSpenden;
    }
  }

  public function setAllTnNichtErmaessigt(): void
  {
    $this->rabattierbar = false;
    foreach ($this->tns as $index => $tn) {
      $this->tns[$index]->setNichtErmaessigt();
    }
  }

  
  public function setTnsNichtErmaessigtRange($start, $end): void
  {
    if ($end == -1) {
      $end = count($this->tns) - 1;
    }
    for ($i = $start; $i <= $end; $i++) {
      if (isset($this->tns[$i])) {
        $this->tns[$i]->setNichtErmaessigt();
      }
    }
  }

  public function setStandardZahlplan(): void
  {
    $this->setAllTnZahlplan(-1);
  }

  private function setAllTnZahlplan(int $zp): void
  {
    foreach ($this->tns as $index => $tn) {
      $this->tns[$index]->zahlplan = $zp;
    }
  }

  public function isKollegenrabattApplicable(int $currentTnIndex): bool
  {
    
    if ($currentTnIndex < 1) {
      return false;
    }

    return $this->rabattierbar;
  }

  public function isFruehbucherrabattApplicable(): bool
  {
    if (\DBWorkBASysSettings::isFruehbucherrabattAktiviert()) {
      return true;
    } else {
      return false;
    }
  }

  
  public function isVsbMitgliederRabattApplicable(int $currentTnIndex): bool
  {
    if (\DBWorkBASysSettings::isVerbraucherServiceOderZentrale()
      && $this->pers_nr != ''
      && $currentTnIndex < 1) {
      return true;
    } else {
      return false;
    }
  }
}


class KursgebuehrBerechnungsKontextTeilnehmer
{
  
  public $ermProzent;

  
  public $kursbezogeneErmaessigung;

  
  public $zahlplan;

  
  public $ermGrund;

  public function __construct($ermProzent = 0, $zahlplan = -1, bool $kursbezogeneErmaessigung = false, $ermGrund = null)
  {
    $this->ermProzent = $ermProzent;
    $this->zahlplan = $zahlplan;
    $this->kursbezogeneErmaessigung = $kursbezogeneErmaessigung;
    $this->ermGrund = $ermGrund;
  }

  
  public static function fromErmGrund($ermGrund, $zp = -1): KursgebuehrBerechnungsKontextTeilnehmer
  {
    if (empty($ermGrund) || $ermGrund == '-1') {
      return new KursgebuehrBerechnungsKontextTeilnehmer(0, $zp, false, $ermGrund);
    }
    $dbwerm = new DBWorkErmaessigung(1, true);
    $erm = $dbwerm->getErmaessigungbyNr($ermGrund);
    if (empty($erm)) {
      return new KursgebuehrBerechnungsKontextTeilnehmer(0, $zp, false, $ermGrund);
    }
    $ermProz = $erm[0]->prozente;
    $kursbezogeneErmaessigung = ($ermProz == 0 && $ermGrund > 0);

    return new KursgebuehrBerechnungsKontextTeilnehmer($ermProz, $zp, $kursbezogeneErmaessigung, $ermGrund);
  }

  public function setNichtErmaessigt(): void
  {
    $this->ermProzent = 0;
    $this->kursbezogeneErmaessigung = false;
  }
}

class SpendenFondInfos
{
  
  public $gebuehrenArt;

  
  public $betrag;

  public function __construct(GebuehrArt $gebuehrenArt, float $betrag)
  {
    $this->gebuehrenArt = $gebuehrenArt;
    $this->betrag = $betrag;
  }

  
  public static function create(?float $betrag = null): SpendenFondInfos
  {
    $dbwHlG = new DBWorkHLGrundSys();
    if (is_null($betrag)) {
      $betrag = MathOperations::stringToFloat($dbwHlG->getSetting('E539_NORMALBETRAG', '0,00'));
    }

    $gebArtSchluessel = $dbwHlG->getFeldWert('E539_ZUSCHLAGZART', '0');

    $dbwGebArt = new DBWorkHLGebuehrenArten();
    $gebArt = $dbwGebArt->getBySchluessel($gebArtSchluessel);
    if ($gebArt->isEmpty()) {
      Logger::logg('SpendenFond: Die hinterlegte Gebührenart (' . $gebArtSchluessel
        . ') konnte nicht in der Datenbank gefunden werden.', 1500);
    }

    return new SpendenFondInfos($gebArt, $betrag);
  }
}