<?php


class StornoFirmenMode extends StornoMode
{
  
  const SEND_SUCCESSFUL_PER_DIREKT_MORE = 11; 
  const SEND_SUCCESSFUL_PER_DIREKT_KOMPLETT = 21; 
  const SEND_SUCCESSFUL_PER_DMZ_MORE = 12; 
  const SEND_SUCCESSFUL_PER_DMZ_KOMPLETT = 22; 
  const SEND_SUCCESSFUL_PER_EMAIL_MORE = 13;
  
  
  public function doStornoDMZBetrieb($pBelegung) {
     
    
    try {
      
      $anzahlFreiwerdenderPlaetze = $this->getAnzahlFreiWerdenderPlaetze();
      
      
      
      
      BelegungAPI::storniereBelegungDMZ($pBelegung->id, $this->status, $this->stornogrund, $anzahlFreiwerdenderPlaetze, false, $this->kindBelegungen, $this->austritt);
    
      
      
      
      if (!empty($pBelegung) && $pBelegung->id != '') {
        
        
        $stornoDone = $this->storniereDirektBetrieb($pBelegung); 
        if ($stornoDone) {
          return self::SEND_SUCCESSFUL_PER_DMZ_KOMPLETT;
        }
        return self::SEND_SUCCESSFUL_PER_DMZ_MORE;  
      } 
      
      
      return  self::SEND_ERROR;

    } catch( Exception $e ) {
      Logger::logg('Fehler bei der Stornierung durch den Stammhörer über DMZ: '.$e->getMessage(), 200);
      return self::SEND_ERROR;
    }
  } 
  
  
  public function doStornoDirektBetrieb($pBelegung) {
    
    $stornoDone = $this->storniereDirektBetrieb($pBelegung);
    
    if ($stornoDone) {
      return self::SEND_SUCCESSFUL_PER_DIREKT_KOMPLETT;
    }
     return self::SEND_SUCCESSFUL_PER_DIREKT_MORE;
  } 
  
  
  private function storniereDirektBetrieb($pBelegung) {
    $dbwBelegung = new DBWorkBelegung( 1, true );
    
    $userId = SessionOperations::getUserID();
   
    
    

    $haveBelegungenNurStatusW = $this->haveBelegungenNurStatusW($this->kindBelegungen);
    if (!$haveBelegungenNurStatusW && $this->komplettStorno) {
       
      
      $dbwBelegung->doFirmenStorno($pBelegung, $this->stornogrund, $userId, 'WT');
      $komplettStornoDone = true;
    }
    
    else {
      
      $dbwBelegung->doStornoFirmenMitarbeiter($pBelegung, $this->kindBelegungen, $this->stornogrund, $userId, 'WT');
      
      $komplettStornoDone = false;
    }
    return $komplettStornoDone;

    
  } 
  
  
  
  
  public function doStornoMailBetrieb($pBelegung) {
    $emailSicht = 591;
    $sprachsettings = new SprachSettingsObject();
    
    
    
    
    $teilnehmer = $pBelegung->teilnehmer;
    $email = EmailOperations::getStandardEmail(); 
    
    
    
    
    
    $betreff = self::_getEMailBetreff($pBelegung, $sprachsettings);
    $body = $this->_getEMailBody($pBelegung, $sprachsettings);

    $from = $teilnehmer->email; 
    $sendername = $teilnehmer->getVarValue('vorname_name_ohne_komma');
    
    $success = smtpMail::sendStandardTextMail( $email, $betreff, $body );
    
    
    if ($success) {
      return self::SEND_SUCCESSFUL_PER_EMAIL_MORE;
    }
    return self::SEND_ERROR;
  } 
  
  
  
  protected function _wirdMinTnAnzahlUnterschritten($pBelegung)
  {
    $anzahlFreiwerdenderPlaetze = $this->getAnzahlFreiWerdenderPlaetze();
    return $anzahlFreiwerdenderPlaetze > 0 && $pBelegung->kurs->teil_min > $pBelegung->kurs->anmeldungen - $anzahlFreiwerdenderPlaetze;
  }
  
 
  
  protected function getText4MinTNZahlUnterschritten($pBelegung) {
    $anzahlFreiwerdenderPlaetze = $this->getAnzahlFreiWerdenderPlaetze();
    $grund =  'Durch eine Abmeldung würde die Mindestteilnehmerzahl unterschritten (minimal '.$pBelegung->kurs->teil_min
        .' - derzeit '.$pBelegung->kurs->anmeldungen.' - abzumelden '.$anzahlFreiwerdenderPlaetze.')';
    return $grund;
  }
  

  
  protected function getSingleKindGruende($pIsAutomatisch) {
    $gruende =  array();
    
    if (count($this->kindBelegungen) == 0) {
      $gruende[] = $this->getGrundObject(self::HINDERUNG_KEIN_KIND_STORNO);
    }
    
    else {
    
      
      
      if ($pIsAutomatisch) {
          foreach ($this->kindBelegungen as $kindBelegung)  { 
            
          
              $addInfo = array('tnr' => $kindBelegung->teilnehmer->id, 'name' => $kindBelegung->teilnehmer->namevorname);
              $gruende[] = $this->getGrundObject(self::HINDERUNG_HAT_ZAHLUNGEN_KIND, $addInfo);
        
          } 
      }
    } 
    
    return $gruende;
  } 
  

  
  private function _getEMailBody($pBelegung, $pSprachsettings)
  {
    
    $kinderCount = count($this->kindBelegungen);
    $komplettStornoText = '';
     $kindNameStr = '';
   
    if ($kinderCount > 0) {
      
      
      if ($this->komplettStorno) {
        $komplettStornoText = 'mit allen zugehörigen Teilnehmern';
      }
      $kindNameStr .= ' Die folgenden zugehörigen Teilehmer werden ebenfalls vom  Kurs abgemeldet: ' . "\n\n";
       
      foreach ($this->kindBelegungen as $kindBelegung) {
          $kindNameStr .= $kindBelegung->teilnehmer->name. ' (interne '.$pSprachsettings->Teilnehmer['Singular']['Nominativ'].'-Nr. ' . 
            $kindBelegung->teilnehmer->id . ') mit Status '.$kindBelegung->status."\n";
      }  
    } 
    $body = 'Teilnehmer ' . $pBelegung->teilnehmer->vorname . ' '. $pBelegung->teilnehmer->name . ' (interne '.$pSprachsettings->Teilnehmer['Singular']['Nominativ'].'-Nr. ' . 
            $pBelegung->teilnehmer->id . ')'. ' möchte sich von '.$pSprachsettings->Kurs['Singular_mit_Artikel']['Dativ'].' "' . $pBelegung->kurs->kurzbez_titel . 
            '" (Kurs-Nr. '.$pBelegung->knr.') '.$komplettStornoText.' abmelden.'."\n".$kindNameStr."\n";
   
    

    
    
    $austrittDatum = $this->austritt;
    
    
    if ($this->stornogrund != '') {
      $body .= 'Dabei wurde vom Teilnehmer folgender Grund angegeben: '."\n".$this->stornogrund."\n\n";
    }
    $body .= 'neuer Status: ' . $this->status . "\n";
    $body .= $austrittDatum !== '' ? 'Austritt: ' . $austrittDatum . "\n\n" : "\n";
    $gruendeCount = count($this->hinderungsGruendeAuto);
    if ($gruendeCount > 0) {
      $body .= ' Eine automatische Abmeldung konnte ';
      $body .= 'aus folgende' . ($gruendeCount==1?'m Grund':'n Gründen');
      $body .= ' nicht durchgeführt werden:'."\n\n";
      
      foreach ($this->hinderungsGruendeAuto as $grund) {
        $body .= "- " . self::getText4HinderungsKonstanten($grund, $pBelegung, $pSprachsettings) . "\n";
      }
    }
    $body .= "\n\n".'Diese E-Mail wurde am '.DateTimeOperations::getDateNow() . ' um '. DateTimeOperations::getTimeNow() .' aus '.KUFERWEB.' versandt.';
    return $body;
  }


 
  private function getAnzahlFreiWerdenderPlaetze()
  {
    $anzahlFreiwerdenderPlaetze = 0;
    foreach ($this->kindBelegungen as $belegung) {
      if (in_array($belegung->status, array('A', ' ', '', 'P'))) {
        $anzahlFreiwerdenderPlaetze++;
      }
    }
    return $anzahlFreiwerdenderPlaetze;
  }
  
  
   
  protected function haveBelegungenNurStatusW($pBelegung)
  {
    
    foreach ((array) $this->kindBelegungen as $belegung) {
      if ($belegung->status != 'W') {
        return false;
      }
    }
    return true;
  }
 
  
}