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

class Belegung extends Datamodul
{
  public $knr;
  public $tnr;
  
  public $kurs;
  
  public $teilnehmer;
  public $kinder_alle;
  public $kinderanzahl;
  
  public $kindernamen;
  public $anm_datum;
  public $bearbeiter;
  public $bearbdatum;
  
  public $anmeldeart;
  public $ermgrund;
  public $erm_grund;
  
  public $abwzpid;
  public $bemerkung;
  
  public $bemerk_ext;
  
  public $bemerk_ext_default;
  public $info;
  public $entgelt = 0.0;
  
  
  

  
  public $tn_namevorname_hauptteilnehmer;

  public $bet_offen = 0.0;

  
  public $firma = 0;
  public $firmabelegid = 0;
  public $status = '';
  public $invisibleStatus = '';
  public $status_lang = '';
  
  public $bank;
  
  public $blz;
  
  public $konto;
  
  public $konto_inh;
  
  public $rchg_datum = DEFAULTDATE;
  
  public $druckzeugnis = DEFAULTDATE;
  
  public $druckanmeld = DEFAULTDATE;
  
  public $bfbrfgedr1 = DEFAULTDATE;
  
  public $bfbrfgedr2 = DEFAULTDATE;
  
  public $bfbrfgedr3 = DEFAULTDATE;
  
  public $bfbrfgedr4 = DEFAULTDATE;
  
  public $bfbrfgedr5 = DEFAULTDATE;
  
  public $bfbrfgedr6 = DEFAULTDATE;
  
  public $rchgnr = 0.0;
  
  public $belegnr;
  
  public $kassenz = 0.0;
  
  public $zahlart;
  
  public $zahlnr = 0.0;
  
  public $status_2;
  
  public $pauschal = 0.0;
  
  public $betrag = 0.0;
  
  public $warte_pool;
  
  public $teil_real = 0;
  
  public $sofortzahl;
  
  public $vkz;
  
  public $ermproz = 0;
  
  public $aufzjn;
  
  public $aufztext;
  
  public $massnahmennr;
  
  public $ratenzahlungjn;
  
  public $text1;
  
  public $text2;
  
  public $text3;
  
  public $text4;
  
  public $text5;
  
  public $text6;
  
  public $betrag1 = 0.0;
  
  public $betrag2 = 0.0;
  
  public $betrag3 = 0.0;
  
  public $betrag4 = 0.0;
  
  public $betrag5 = 0.0;
  
  public $betrag6 = 0.0;
  
  public $betrag7 = 0.0;
  
  public $betrag8 = 0.0;
  
  public $betrag9 = 0.0;
  
  public $gebuehrok = 'F';
  
  public $gebuehrbearb = '';
  
  public $mf_abh;
  
  public $mf_bva;
  
  public $mf_kostenbef;
  
  public $mf_kostenbef_typ;
  
  public $mf_einsttest;
  
  public $mf_abschtest;
  
  public $mf_anwtag1;
  
  public $mf_status;
  
  public $mf_bestnr;
  
  public $mf_fehlstdn = 0.0;
  
  public $mf_fehlstdv = 0.0;
  
  public $mf_fehlstdk = 0.0;
  
  public $mf_abschorient;
  
  public $lastschr;

  
  public $bezahlt;

  
  public $notenende;

  
  public $notenendema;

  
  public $notenendedat;

  
  public $niveau;

  
  public $zahlungshinweis;

  
  public $anzahl_ma_firma;

  public $anzahl_ma_firma_platzreserv;

  
  public $liste_ma_firma;


  
  public $punkte;

  
  public $pkt_ok_stat;

  
  public $pkt_ok_am;

  
  public $pkt_ok_von;

  public $uebern_jn;
  public $uebern_von;
  public $uebern_bis;
  public $hotel_info;

  public $historiekrit1;
  public $historiekrit2;
  public $historiekrit3;
  public $historiekrit4;
  public $historiekrit5;
  public $historiekrit6;
  public $historiekrit7;
  public $historiekrit8;
  public $historiekrit9;
  public $historiekrit10;
  public $historiekrit11;
  public $historiekrit12;
  public $historiekrit13;
  public $historiekrit14;
  public $historiekrit15;
  public $historiekrit16;

  public $iban;
  public $bic;
  public $mf_ok;

  public $erstesKind_Name;
  public $erstesKind_Vorname;
  public $erstesKind_Name_Vorname;
  public $erstesKind_Name_Vorname_ohneKomma;
  public $erstesKind_Vorname_Name_ohneKomma;
  public $erstesKind_gebdat;

  public $zweitesKind_Name;
  public $zweitesKind_Vorname;
  public $zweitesKind_Name_Vorname;
  public $zweitesKind_Name_Vorname_ohneKomma;
  public $zweitesKind_Vorname_Name_ohneKomma;
  public $zweitesKind_gebdat;

  public $eintritt;
  public $austritt;

  public $prioanm;
  public $webinarlink;

  public $anm_quelle;

  public $fp_firma;

  
  public $anm_bearbeiter = '';

  
  public $bezug;

  
  public $bms;

  
  public $nuronline;

  
  public $info2doz;

  public $gekuendigt_zum;

  public function getDMZVarnameMappingForSendingData()
  {
    return array('status' => 'status_1');
  }

  public function getDatamodulByName($datamodulname)
  {
    switch ($datamodulname) {
      default:
        return parent::getDatamodulByName($datamodulname);
      case 'kurs2':
        return $this->getKurs()->getKurse2();
      case 'maplanend':
        return $this->getKurs()->getPlanendenMitarbeiter();
      case 'maverwaltend':
        return $this->getKurs()->getVerwaltendenMitarbeiter();
      case 'maverantwortend':
        return $this->getKurs()->getVerantwortendenMitarbeiter();
      case 'teilnehm':
      case 'teilnehmer':
        return $this->getTeilnehmer();
      case 'kursausstellung':
        return $this->getKurs()->getKursAusstellung();
      case 'kurszusatztexte':
        return $this->getKurs()->zusatztexte;
    }
  }

  public function getVarValue($name)
  {
    switch ($name) {
      default: return parent::getVarValue($name);
      case 'status_mit_online':
        $status = $this->status;
        if ($status === '' || $status === ' ') {
          $status = 'A';
        }

        if ($this->nuronline ?? false) {
          return $status . '/O';
        } else {
          return $status;
        }
        
      case 'is_kind':
        return $this->isKind() ? '1' : '0';
      case 'is_eltern_kind':
        return $this->isElternKindAnmeldung() ? '1' : '0';
    }
  }

  public function getVarValueEx($name, $datamodulname)
  {
    $datamodulnamelc = \StringOperations::strtolower($datamodulname);
    if ($datamodulnamelc == 'kommunikation') {
      $value = $this->teilnehmer->getVarValueEx($name, $datamodulname);
      
      
      return str_replace('##IDPART##', 'belids=' . $this->id, $value ?? '');
    } elseif ($datamodulnamelc == 'dozent') {
      $hauptdozent = $this->kurs->getVarValue('hauptdozent');

      return $hauptdozent->getVarValueEx($name, $datamodulname);
    } elseif ($datamodulnamelc == 'basysbenutzer') {
      return $this->kurs->getVarValueEx($name, $datamodulname);
    } elseif ($datamodulnamelc == 'kursort') {
      return $this->kurs->getVarValueEx($name, $datamodulname);
    }

    return Datamodul::getVarValueEx($name, $datamodulname);
  }

  public function setValue2VarEx($var, $val, $datamodulname)
  {
    switch (StringOperations::strtolower($datamodulname)) {
      case 'kommunikation':
        $this->teilnehmer->setValue2VarEx($var, $val, $datamodulname);
        break;
      default:
        Datamodul::setValue2VarEx($var, $val, $datamodulname);
        break;
    }
  }

  public function getTyp($pFieldName)
  {
    switch ($pFieldName) {
      default:
        return parent::getTyp($pFieldName);
      case 'bearbdatum':
      case 'rchg_datum':
      case 'druckzeugnis':
      case 'bfbrfgedr1':
      case 'bfbrfgedr2':
      case 'bfbrfgedr3':
      case 'bfbrfgedr4':
      case 'bfbrfgedr5':
      case 'bfbrfgedr6':
      case 'eintritt':
      case 'austritt':
      case 'notenendedat':
      case 'pkt_ok_am':
      case 'uebern_von':
      case 'uebern_bis':
      case 'gekuendigt_zum':
        return \DatamodulVarType::TYPE_DATE;
      case 'anm_datum':
      case 'tn_mandatam_hauptteilnehmer':
      case 'druckanmeld':
        return \DatamodulVarType::TYPE_DATETIME;
      case 'tnr':
      case 'firma':
      case 'firmabelegid':
      case 'teil_real':
      case 'ermproz':
      case 'erm_grund':
      case 'prioanm':
      case 'fp_firma':
      case 'bezug':
        return \DatamodulVarType::TYPE_INT;
      case 'entgelt':
      case 'entgelt_je_firmenmitarbeiter':
      case 'bet_offen':
        return \DatamodulVarType::TYPE_FLOAT;
      case 'rchgnr':
      case 'kassenz':
      case 'zahlnr':
      case 'pauschal':
      case 'betrag':
      case 'betrag1':
      case 'betrag2':
      case 'betrag3':
      case 'betrag4':
      case 'betrag5':
      case 'betrag6':
      case 'betrag7':
      case 'betrag8':
      case 'betrag9':
      case 'mf_fehlstdn':
      case 'mf_fehlstdv':
      case 'mf_fehlstdk':
      case 'punkte':
        return \DatamodulVarType::TYPE_FLOAT_DOT;
      case 'pkt_ok_stat':
        return \DatamodulVarType::TYPE_WF_EMPTY;
      case 'uebern_jn':
        return \DatamodulVarType::TYPE_BOOL_JN;
      case 'nuronline':
      case 'info2doz':
        return \DatamodulVarType::TYPE_BOOL_WF;
    }
  }

  
  public function setBemerkung4Anmeldung($pBemerkung, $pWoEinzutragenBeachten = true)
  {
    if ($pWoEinzutragenBeachten) {
      $varName = $this->getVarNameBemerkung4Anmeldung();
    } else {
      $varName = 'bemerkung';
    }
    if ($this->{$varName} != '') {
      $this->{$varName} = $this->{$varName} . '; ';
    }
    $this->{$varName} .= $pBemerkung;
  }

  
  public function getBemerkung4Anmeldung($pWoEinzutragenBeachten = true)
  {
    if ($pWoEinzutragenBeachten) {
      $varName = $this->getVarNameBemerkung4Anmeldung();
    } else {
      $varName = 'bemerkung';
    }

    return $this->{$varName};
  }

  
  private function getVarNameBemerkung4Anmeldung()
  {
    $dbwBASysSettings = DBWorkBASysSettings::getDefaultInstance();
    $basysSettings = $dbwBASysSettings->getSettings();

    $result = 'bemerkung';
    if ($basysSettings->bemerkung4anmeldung == 2) {
      $result = 'info';
    } elseif ($basysSettings->bemerkung4anmeldung == 0) {
      $result = 'bemerk_ext';
    }

    return $result;
  }

  
  public function isStornierbar($pAllowedStornoStati)
  {
    if (trim($pAllowedStornoStati) === '') {
      
      $allowedStornoStati = 'ATW';
    } else {
      $allowedStornoStati = $pAllowedStornoStati;
    }
    $status = trim($this->status) != '' ? $this->status : 'A';
    $isStornierbar = true;
    if (StringOperations::stripos($allowedStornoStati, $status) === false) {
      $isStornierbar = false;
      if (isset($this->kindernamen)) {
        foreach ($this->kindernamen as $kindBelObj) {
          $kindStatus = trim($kindBelObj->status) != '' ? $kindBelObj->status : 'A';
          if (StringOperations::stripos($allowedStornoStati, $kindStatus) !== false) {
            $isStornierbar = true;
            break;
          } else {
            $isStornierbar = false;
          }
        } 
      }
    }

    return $isStornierbar;
  }

  
  public function isElternKindAnmeldung()
  {
    if ($this->kurs->typ === 'K') {
      return false;
    }
    if ($this->isElternteil() || $this->isWeiteresElternteil() || $this->isKind()) {
      return true;
    }

    return false;
  }

  
  private function isElternteil()
  {
    return $this->firma === 0 && $this->bezug === 3;
  }

  
  private function isWeiteresElternteil()
  {
    return ($this->firma > 0 || $this->firma === -1) && $this->bezug === 4;
  }

  
  public function isKind()
  {
    return ($this->firma > 0 || $this->firma === -1) && $this->bezug === 3;
  }

  
  public function getTeilnehmer()
  {
    return $this->teilnehmer;
  }

  
  public function getKurs()
  {
    return $this->kurs;
  }

  public function getTnIdentifier(): \Kufer\Web\Classes\Identifier\Identifier
  {
    return new \Kufer\Web\Classes\Identifier\Identifier($this->tnr, null);
  }

  
  public function isBetweenEintrittAndAustritt(string $date): bool
  {
    $hasEintritt = !\DateTimeOperations::isEmptyOrDefault($this->eintritt);
    $hasAustritt = !\DateTimeOperations::isEmptyOrDefault($this->austritt);
    if (!$hasEintritt && !$hasAustritt) {
      return true;
    }

    $eintritt = $this->eintritt;
    $austritt = $this->austritt;
    if (!$hasEintritt) {
      $eintritt = $date;
    }

    if ($hasAustritt) {
      $austritt = $date;
    }

    return \DateTimeOperations::isDateBetween($date, $eintritt, $austritt);
  }
}