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

namespace Kufer\Web\KuferTools\Firma\Anmeldung\HandleAnmeldung;

use Kufer\Mail\Sender\EMailSenderFactory;
use Kufer\Web\KuferTools\Utils\Anmeldung\AnmeldeButtonUtils;
use Kufer\Web\KuferTools\Utils\Spezial\BLAKUtils;

class HandleAnmeldungUseCase extends \Kufer\Web\KuferTools\Basis\Anmeldung\KursUebersicht\HandleAnmeldung\HandleAnmeldungUseCase
{
  public function __construct($request)
  {
    parent::__construct($request);
  }

  public static function getToolSectionId()
  {
    return 327;
  }

  public static function getToolId()
  {
    return \ToolsAPI::TOOL_ANMELDUNGBUCHEN_FA;
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess($pToolSectionId)) {
      return false;
    } elseif (!$this->isRechtAllowed('322.0.2')) {
      return false;
    }
    if (empty($this->request->mitarbeiter)) {
      return false;
    }

    $dbwkurse = \DBWorkKurse::getDefaultInstance();
    $kurs = $dbwkurse->getKurs($this->request->knr);
    if (BLAKUtils::isKursZertifikatsfortbildungsKurs($this->toolSettings, $kurs) && !$this->request->blakzertifkatsbstg) {
      return false;
    }

    
    $teilnehmer = \DBWorkTeilnehmer::getDefaultInstance()->getTeilnehm($this->getUser()->getTnrIdentifier());
    
    $emptyMandatorys = \AnmeldeAPI::getEmptyMandatoryFieldName($this->toolSettings, $teilnehmer);
    if (!AnmeldeButtonUtils::isFirmaAnmeldungAllowed($kurs, $emptyMandatorys, $teilnehmer)) {
      return false;
    }

    return true;
  }

  public function action()
  {
    $knr = $this->request->knr;
    $this->response->knr = $knr;

    $user = $this->getUser();
    if ($this->request->isRefresh) {
      
      
      return \SessionOperations::getVarValueWTIntern('anm_bestaetigung_' . $this->request->knr);
    }
    if ($user->email == '') {
      $this->response->userHasNoEmail = true;

      return $this->getResponse();
    }

    $this->dbwWarenKorbKurse->clear();
    $this->dbwWarenKorbKurse->addEntry($knr);

    $dbwkurse = new \DBWorkKurseWT(1, true);
    $kurs = $dbwkurse->getKurs($knr);
    $kurs = $this->aktualisiereKursPerDmz($kurs, $this->getToolId());

    if (BLAKUtils::isKursZertifikatsfortbildungsKurs($this->toolSettings, $kurs)) {
      $freidefField = BLAKUtils::getFreidefFieldBelegungZertifikatsfortbildungFromToolSettings($this->toolSettings);
      if (!is_null($freidefField)) {
        $sessionVar = \preg_replace('/^historiekrit/', 'beleghistorie', $freidefField);
        \SessionOperations::setVarValueWk('w_' . $sessionVar . '_' . $knr, \DateTimeOperations::getDateNow());
      }
    }

    if ($this->request->zahlart == 'Ü') {
      \SessionOperations::setVarValueWK('w_zahlart_b', 'Ü');
    }

    \SessionOperations::setVarValueAnm(ANMELDEART, ANMELDEART_INTERN_FIRMA);
    \SessionOperations::setVarValueWk('gAnzahl_Mehrfach', count($this->request->mitarbeiter));

    $this->response->kurs = $kurs;

    if ($this->request->abwBankverbindungAngegeben) {
      $this->verwendeAbweichendKontodaten($user);
    }

    $this->anmeldungDurchfuehren($knr, $kurs, $user);

    return $this->getResponse();
  }

  private function anmeldungDurchfuehren($knr, $kurs, $user)
  {
    
    $warenkorb = new \DBWorkWarenkorbKurse();
    $warenkorb->clear();
    $warenkorb->addEntry($knr);
    $warenkorb->implodeEntries();

    
    $dbwtn = new \DBWorkTeilnehmer(1, true);
    $tn = $dbwtn->getTeilnehm($user->tnr);
    \SessionOperations::TNObjectToSession($tn, 'w_', $user->tnr);

    if ($this->request->zahlart == 'Ü') {
      \SessionOperations::setVarValueWK('w_zahlart_b', 'Ü');
    }

    
    \SessionOperations::setVarValueWk('w_guthabenverwenden_b', $this->request->guthaben_verwenden);

    \SessionOperations::setVarValueWk('gAnzahl_Mitarbeiter', count($this->request->mitarbeiter));

    $this->fillMitarbeiterDaten($kurs);

    \Logger::logg('Beginne Anmeldevorgang für Kurs mit Kursnr. ' . $knr . '.', 7);
    
    

    $anmeld = $this->Kursbuchen($knr, $this->getToolId(), $user->email);

    if ($this->toolSettings->bestaetigungAnTeilnehmerSenden) {
      $sender = EMailSenderFactory::create();

      $mitarbeiter = $anmeld->_tninfo->getWeitere();
      $successAnmeldungen = array(ANMELDUNGONLINE_OK, ANMELDUNGONLINE_OFFLINE, ANMELDUNGONLINE_KURSVOLL);
      $viewModel = new MaEMail\MitarbeiterEmailViewModel();
      $viewModel->firma = \SessionOperations::getCurrentWebToolsTeilnehmer();
      $viewModel->kurs = $kurs; 
      foreach ($anmeld->_kurse as $kursBuchung) {
        if (!in_array($kursBuchung->actualstatus, $successAnmeldungen)) {
          continue; 
        }

        foreach ($mitarbeiter as $currentMa) {
          $viewModel->anmeldeStatus = $kursBuchung->actualstatus;
          $viewModel->teilnehmer = $currentMa;
          $emailPresenter = new MaEMail\MitarbeiterEMailPresenter($viewModel);
          $sender->sendFromTeilnehmerToTeilnehmer($emailPresenter, $viewModel->firma, array($currentMa), 'MitarbeiterIn');
        }
      }
    }
  }

  private function fillMitarbeiterDaten($kurs)
  {
    $dbwKennz = new \DBWorkKennz();

    
    \SessionOperations::setVarValueAnm(ANMELDEART, ANMELDEART_INTERN_FIRMA);
    $tn = \SessionOperations::getCurrentWebToolsTeilnehmer();

    $dbwTeilnehmer = new \DBWorkTeilnehmer(1, true);
    $zertifikatsfortbildungBlak = BLAKUtils::isKursZertifikatsfortbildungsKurs($this->toolSettings, $kurs);
    $zertifikatfortbildungFreidefField = BLAKUtils::getFreidefFieldBelegungZertifikatsfortbildungFromToolSettings($this->toolSettings);

    
    foreach ($this->request->mitarbeiter as $i => $mitarbeiter) {
      
      
      \SessionOperations::setVarValueWk('w_nachname_ma' . $i, $mitarbeiter->name);
      \SessionOperations::setVarValueWk('w_name_ma' . $i, $mitarbeiter->name);
      \SessionOperations::setVarValueWk('w_vorname_ma' . $i, $mitarbeiter->vorname);
      \SessionOperations::setVarValueWk('w_abwadr_ma' . $i, '');
      \SessionOperations::setVarValueWk('w_tel_ma' . $i, $mitarbeiter->tel);
      \SessionOperations::setVarValueWk('w_email_ma' . $i, $mitarbeiter->email);
      \SessionOperations::setVarValueWk('w_tnr_ma' . $i, $mitarbeiter->tnr);

      \SessionOperations::setVarValueWk('w_kennz1_ma' . $i, $mitarbeiter->kennz);
      if (is_numeric($mitarbeiter->kennz)) {
        \SessionOperations::setVarValueWk('w_beruf_ma' . $i, $dbwKennz->getKennzNamebyKnr($mitarbeiter->kennz));
      }
      \SessionOperations::setVarValueWk('w_geschlecht_ma' . $i, $mitarbeiter->geschlecht);
      \SessionOperations::setVarValueWk('w_name_titel_ma' . $i, $mitarbeiter->name_titel);
      \SessionOperations::setVarValueWk('w_gebdat_ma' . $i, $mitarbeiter->gebdat);

      
      if ($mitarbeiter->tnr == '') {
        \SessionOperations::setVarValueWk('w_zusatz_ma' . $i, $tn->name);
        \SessionOperations::setVarValueWk('w_strasse_ma' . $i, $tn->strasse);
        \SessionOperations::setVarValueWk('w_ort_ma' . $i, $tn->ort);
      } else {
        $teilnehmer = $dbwTeilnehmer->getTeilnehm($mitarbeiter->tnr);
        \SessionOperations::setVarValueWk('w_strasse_ma' . $i, $teilnehmer->strasse);
        \SessionOperations::setVarValueWk('w_ort_ma' . $i, $teilnehmer->ort);
      }

      if ($zertifikatsfortbildungBlak && !is_null($zertifikatfortbildungFreidefField)) {
        $sessionVar = \preg_replace('/^historiekrit/', 'beleghistorie', $zertifikatfortbildungFreidefField);
        \SessionOperations::setVarValueWk('w_' . $sessionVar . '_' . $kurs->id . '_ma' . $i, \DateTimeOperations::getDateNow());
      }
    }
  }

  protected function KursbuchenResponse($anmeld)
  {
    parent::KursbuchenResponse($anmeld);

    $this->response->weitereTN = $anmeld->_tninfo->_weitere;
  }
}