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

namespace Kufer\KuferTools\Firma\KursUebersicht\KursUebersicht\Detailsreiter\Anmeldung;

class AnmeldungAbsendenUseCase extends \Kufer\KuferTools\Basis\UseCase\EinzelKursUseCase
{
  private $toolFaAnmeldungSettings;

  public const MDS_ANMELDEN_SUCCESS = 0;
  public const MDS_ANMELDEN_NICHT_ABGESENDET = 1;
  public const MDS_ANMELDEN_DIREKTBETRIEB = 2;

  public function __construct($request)
  {
    parent::__construct($request, new AnmeldungAbsendenResponse());

    $this->toolFaAnmeldungSettings = \ToolSettingsAPI::getToolSettings(24);
  }

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

  public static function getToolSectionId()
  {
    return 336; 
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess(336)) {
      return false;
    }

    $firmenbelegung = $this->getFirmenBelegung();
    $firma = \SessionOperations::getCurrentWebToolsTeilnehmer();

    if ($firmenbelegung->tnr != $firma->getIdentifier()->getId()) {
      return false;
    }

    if ($firmenbelegung->knr != $this->request->knr) {
      return false;
    }

    return $this->isRechtAllowed('336.1.8') && \DBWorkBasysSettings::isMDS();
  }

  public function action()
  {
    if (!$this->request->isXsrfOk || $this->request->isRefresh) {
      $status = self::MDS_ANMELDEN_NICHT_ABGESENDET;
    } elseif (!\SessionOperations::isReplikat()) {
      $status = self::MDS_ANMELDEN_DIREKTBETRIEB;
    } else {
      $status = $this->handleAnmeldungMDS();
    }

    return $this->getResponse($status);
  }

  private function handleAnmeldungMDS()
  {
    $dbwBel = new \DBWorkBelegung();
    $dbwTeiln = new \DBWorkTeilnehmer();
    $dbwAdrPers = new \DBWorkAdrPers();
    $data = \JsonOperations::getFromString($this->request->jsonData);
    $vars = get_object_vars($data);

    $aryForXML = array();
    foreach ($vars as $key => $value) {
      
      if (\StringOperations::startsWith($key, 'bel_')) {
        $belegungNeu = isset($value->belegung) ? $value->belegung : null;
        $teilnehmerNeu = isset($value->teilnehmer) ? $value->teilnehmer : null;
        $adrPersNeu = isset($value->adrPers) ? $value->adrPers : null;

        if (!is_null($teilnehmerNeu)) {
          if (isset($teilnehmerNeu->id) && $teilnehmerNeu->id != '') {
            $teilnehmerAlt = $dbwTeiln->getTeilnehm($teilnehmerNeu->id);
            $teilnehmerMerged = \Datamodul::mergeWith($teilnehmerAlt, $teilnehmerNeu);

            
            $teilnehmerMerged = \Datamodul::toDatamodul('Teilnehmer', $teilnehmerMerged, array('email' => 'Kommunikation', 'mobil' => 'Kommunikation', 'tel' => 'Kommunikation', 'tel2' => 'Kommunikation', 'fax' => 'Kommunikation'));

            
            $dbwTeiln->updateTeilnehmer($teilnehmerMerged, false, null, true);
            $idTeiln = $teilnehmerMerged->id;
          } else {
            $idTeiln = $dbwTeiln->insertTeilnehmer(
              \Datamodul::toDatamodul('Teilnehmer', $teilnehmerNeu, array('email' => 'Kommunikation', 'mobil' => 'Kommunikation', 'tel' => 'Kommunikation', 'tel2' => 'Kommunikation', 'fax' => 'Kommunikation')),
              false,
              true
            );
            $teilnehmerMerged = $dbwTeiln->getTeilnehm($idTeiln, true);
          }
        }

        if (!is_null($adrPersNeu)) {
          $adrPersNeuDM = \Datamodul::toDatamodul('AdrPers', $adrPersNeu);
          if (isset($adrPersNeuDM->adrnr) && $adrPersNeuDM->adrnr != '') {
            $adrPersAlt = $dbwAdrPers->getFirstAdrPersByTnNr($adrPersNeuDM->adrnr);
            if (!$adrPersAlt->isEmpty()) {
              $adrPersMerged = \Datamodul::mergeWith($adrPersAlt, $adrPersNeuDM);
            } else {
              $adrPersMerged = $adrPersNeuDM;
            }
            $adrPersMerged->zusatz2 = $adrPersNeu->dienststelle;
            if ($adrPersMerged->id != '') {
              $dbwAdrPers->updateAdrPers($adrPersMerged);
            } else {
              $dbwAdrPers->insertAdrPers($adrPersNeuDM);
            }
          } else {
            $adrPers2Save = \Datamodul::toDatamodul('AdrPers', $adrPersNeu);
            if (empty($adrPersNeu->adrnr)) {
              $adrPers2Save->adrnr = $idTeiln;
            }
            $adrPers2Save->zusatz2 = $adrPersNeu->dienststelle;
            $idAdrPers = $dbwAdrPers->insertAdrPers($adrPers2Save);
            $adrPersMerged = $dbwAdrPers->getAdrPersByID($idAdrPers);
          }
        }
        if (!is_null($belegungNeu)) {
          if (isset($belegungNeu->id) && $belegungNeu->id != '') {
            $belegungAlt = $dbwBel->getBelegung($belegungNeu->id);


            if (isset($belegungNeu->nuronline) && $belegungNeu->nuronline) {
              $belegungNeu->hotel_info = 'Online-Seminar';
            } elseif ($belegungNeu->uebern_jn == false) { 
              
              
              $belegungNeu->hotel_info = 'Tagesteilnehmer/-in';
            } else {
              
              
              if ($belegungAlt->hotel_info == 'Tagesteilnehmer' || $belegungAlt->hotel_info == 'Tagesteilnehmer/-in') {
                
                $belegungNeu->hotel_info = ' ';
              }
            }

            $belegungMerged = \Datamodul::mergeWith($belegungAlt, $belegungNeu);
            if (empty($belegungNeu->tnr) && !empty($idTeiln)) {
              $belegungMerged->tnr = $idTeiln;
            }

            $dbwBel->updateBelegung($belegungMerged);
          } else {
            throw new \Exception('Es wurde keine Belegung gefunden');
          }
        }

        
        
        $iNetAnm = \InetFirmaAnm::getInetFirmaAnmByBelAndTnr($belegungNeu, $teilnehmerNeu);
        $iNetAnm->statusvon = 'P';

        
        $iNetAnm->uebern_jn = (($iNetAnm->uebern_jn == false) ? 'N' : 'J');

        $iNetAdrFirma = \InetFirmaAdr::getInetFirmaAdrByAdrPers($adrPersNeu, $teilnehmerNeu);

        $iNetAdrFirma->firma = \SessionOperations::getCurrentWebToolsTeilnehmer()->name;
        $iNetAdrPrivat = \InetFirmaAdr::getInetFirmaAdrByTnr($teilnehmerNeu);
        $aryForXML[] = new \Tripel($iNetAnm, $iNetAdrFirma, $iNetAdrPrivat);
      }
      
      elseif (\StringOperations::startsWith($key, 'wl_')) {
        $belegungNeu = $value->belegung;
        $teilnehmerNeu = $value->teilnehmer;
        $adrPersNeu = $value->adrPers;

        if (!is_null($belegungNeu)) {
          if ($belegungNeu->nuronline) {
            $belegungNeu->hotel_info = 'Online-Seminar';
          } elseif ($belegungNeu->uebern_jn == false) {
            $belegungNeu->hotel_info = 'Tagesteilnehmer/-in';
          }
        }

        $iNetAnm = \InetFirmaAnm::getInetFirmaAnmByBelAndTnr($belegungNeu, $teilnehmerNeu);
        $iNetAnm->statusvon = '';

        
        $iNetAnm->uebern_jn = (($iNetAnm->uebern_jn == false) ? 'N' : 'J');

        $iNetAdrFirma = \InetFirmaAdr::getInetFirmaAdrByAdrPers($adrPersNeu, $teilnehmerNeu);

        $iNetAdrFirma->firma = \SessionOperations::getCurrentWebToolsTeilnehmer()->name;
        $iNetAdrPrivat = \InetFirmaAdr::getInetFirmaAdrByTnr($teilnehmerNeu);

        $aryForXML[] = new \Tripel($iNetAnm, $iNetAdrFirma, $iNetAdrPrivat);

        if (!is_null($teilnehmerNeu)) {
          if (isset($teilnehmerNeu->id) && $teilnehmerNeu->id != '') {
            $teilnehmerAlt = $dbwTeiln->getTeilnehm($teilnehmerNeu->id);
            $teilnehmerMerged = \Datamodul::mergeWith($teilnehmerAlt, $teilnehmerNeu);

            
            $teilnehmerMerged = \Datamodul::toDatamodul('Teilnehmer', $teilnehmerMerged, array('email' => 'Kommunikation', 'mobil' => 'Kommunikation', 'tel' => 'Kommunikation', 'tel2' => 'Kommunikation', 'fax' => 'Kommunikation'));

            $dbwTeiln->updateTeilnehmer($teilnehmerMerged, false, null, true);
            $idTeiln = $teilnehmerMerged->id;
          } else {
            
            
            

            $idTeiln = $dbwTeiln->insertTeilnehmer(
              \Datamodul::toDatamodul('Teilnehmer', $teilnehmerNeu, array('email' => 'Kommunikation', 'mobil' => 'Kommunikation', 'tel' => 'Kommunikation')),
              false,
              true
            );
            $teilnehmerMerged = $dbwTeiln->getTeilnehm($idTeiln, true);
          }
        }

        if (!is_null($adrPersNeu)) {
          $adrPersNeuDM = \Datamodul::toDatamodul('AdrPers', $adrPersNeu);
          if (isset($adrPersNeuDM->adrnr) && $adrPersNeuDM->adrnr != '') {
            $adrPersAlt = $dbwAdrPers->getFirstAdrPersByTnNr($adrPersNeuDM->adrnr);
            if (!$adrPersAlt->isEmpty()) {
              $adrPersMerged = \Datamodul::mergeWith($adrPersAlt, $adrPersNeuDM);
            } else {
              $adrPersMerged = $adrPersNeuDM;
            }
            $adrPersMerged->zusatz2 = $adrPersNeu->dienststelle;
            if ($adrPersMerged->id != '') {
              $dbwAdrPers->updateAdrPers($adrPersMerged);
            } else {
              $dbwAdrPers->insertAdrPers($adrPersNeuDM);
            }
          } else {
            $adrPers2Save = \Datamodul::toDatamodul('AdrPers', $adrPersNeu);
            if (empty($adrPersNeu->adrnr)) {
              $adrPers2Save->adrnr = $idTeiln;
            }
            $adrPers2Save->zusatz2 = $adrPersNeu->dienststelle;
            $idAdrPers = $dbwAdrPers->insertAdrPers($adrPers2Save);
            $adrPersMerged = $dbwAdrPers->getAdrPersByID($idAdrPers);
          }
        }

        if (!is_null($belegungNeu)) {
          $belegungNeu->knr = $knr;
          $belegungNeu->tnr = $idTeiln;
          $belegungNeu->firma = $firmaTnr;
          $belegungMerged = \Datamodul::toDatamodul('Belegung', $belegungNeu, array(), array());
          $dbwBel->insertBelegung($belegungMerged);
        }
      }
      elseif ($key === 'firmaBelid') {
        $firmaBelid = $value;
      } elseif ($key === 'firmaTnr') {
        $firmaTnr = $value;
      } elseif ($key === 'knr') {
        $knr = $value;
      }
    } 

    
    
    $this->doXmlAnmeldungMDS($aryForXML, $knr, $firmaBelid, $firmaTnr);

    $this->_sendOKMailMDS($knr, $aryForXML);

    return self::MDS_ANMELDEN_SUCCESS;
  }

  private function _sendOKMailMDS($pKnr, $pAryForXml)
  {
    $user = \SessionOperations::getCurrentWebToolsTeilnehmer();
    $email = $user->getVarValueEx('email', 'kommunikation');
    if ($email == '') {
      return;
    }

    $dbwKurse = new \DBWorkKurseINetAktiv();
    $kurs = $dbwKurse->getKurs($pKnr);
    
    $msg = $this->_replaceVarsMDS($this->toolFaAnmeldungSettings->anmeldeBestaetigungVorspann, $kurs, $user);
    $msg .= "\n\n";

    $weitereReservierungenVerworfen = false;

    foreach ($pAryForXml as $tripel) {

      
      
      $anzeigen = true;
      $status = '';
      switch ($tripel->eins->statusnach) {
        case 'W':
          $status = 'Anmeldung auf Warteliste';
          break;
        case 'S':
          if (!$weitereReservierungenVerworfen) {
            $msg .= "\n" . 'Weitere Reservierungen werden verworfen.' . "\n\n";
          }
          $weitereReservierungenVerworfen = true;
          $anzeigen = false;
          break;
        case 'A':
          $status = 'Teilnehmer angemeldet';
          break;
      }
      if ($anzeigen) {
        $tnDaten = $status . ":\n";
        $tnDaten .= 'Name: ' . $tripel->eins->name_titel . ' ' . $tripel->eins->vorname . ' ' . $tripel->eins->name . "\n";
        if (isset($tripel->eins->beruf) && $tripel->eins->beruf != '') {
          $tnDaten .= 'Beruf: ' . $tripel->eins->beruf . "\n";
        }
        $tnDaten .= 'Gebiets-/Zusatzbez.: ' . $tripel->eins->gebietsbezeichnung . "\n";

        $tnDaten .= 'Im MD tätig seit: ' . $tripel->eins->eintritt . "\n";
        $tnDaten .= 'Mail-Adresse: ' . $tripel->eins->email . "\n";
        $tnDaten .= 'Telefon: ' . $tripel->drei->telefon . "\n";
        $tnDaten .= 'Mobil-Tel: ' . $tripel->drei->mobiltel . "\n\n";

        $tnDaten .= 'Dienststelle: ' . $tripel->zwei->dienststelle . "\n";
        $tnDaten .= 'Straße: ' . $tripel->zwei->strasse . "\n";
        $tnDaten .= 'PLZ Ort: ' . $tripel->zwei->ort . "\n";

        $msg .= $tnDaten;
        $msg .= "\n" . 'Übernachtung: ';

        if ($tripel->eins->uebern_jn === 'J') {
          $msg .= 'vom ' . $tripel->eins->uebern_von . ' bis ' . $tripel->eins->uebern_bis;
        } elseif ($tripel->eins->hotel_info == 'Online-Seminar') {
          $msg .= 'Online-Seminar';
        } else {
          $msg .= 'Tagesteilnehmer/-in (ohne Übernachtung)';
        }
        $msg .= "\n\n";
        $msg .= 'Bemerkung: ' . $tripel->eins->bemerk_ext;
        $msg .= "\n\n";
      }
    }

    $msg .= "\n\n" . $this->_replaceVarsMDS($this->toolFaAnmeldungSettings->anmeldeBestaetigungNachspann, $kurs, $user);
    \smtpMail::sendStandardTextMail($email, $this->_replaceVarsMDS($this->toolFaAnmeldungSettings->anmeldeBestaetigungBetreff, $kurs, $user), $msg);
  }

  private function _replaceVarsMDS($pMsg, $pKurs, $pUser)
  {
    $result = str_replace('{%k_kurzbez_titel%}', $pKurs->getVarValue('kurzbez_titel'), $pMsg);
    $result = str_replace('{%k_kurzbez%}', $pKurs->getVarValue('kurzbez'), $result);
    $result = str_replace('{%k_id%}', $pKurs->getVarValue('id'), $result);
    $result = str_replace('{%k_nrab%}', $pKurs->getVarValue('nrab'), $result);
    $result = str_replace('{%k_beginn_dat%}', $pKurs->getVarValue('beginn_dat'), $result);
    $result = str_replace('{%k_ende_dat%}', $pKurs->getVarValue('ende_dat'), $result);
    $result = str_replace('{%t_ansprache%}', \ConstantOperations::getAnsprache($pUser), $result);

    return str_replace('{%t_anrede%}', \ConstantOperations::getAnrede($pUser), $result);
  }

  
  private function doXmlAnmeldungMDS($pAryTripel, $knr, $firmaBelid, $firmaTnr)
  {
    $firmenanmeldungen = new \XMLNode('firmenanmeldungen');
    $firmenanmeldung = new \XMLNode('firmenanmeldung');
    $firmenanmeldung->addChild(new \XMLNode('firma_belegid', $firmaBelid));
    $firmenanmeldung->addChild(new \XMLNode('firma_tnr', $firmaTnr));
    $firmenanmeldung->addChild(new \XMLNode('firma_knr', $knr));

    $anmeldungen = new \XMLNode('anmeldungen');

    foreach ($pAryTripel as $tripel) {
      $anmeldung = \XMLNode::getXMLNode($tripel->eins, 'anmeldung', array('bearbeiter', 'bearbdatum', 'knr', 'mobil', 'tel', 'telefon'));

      $adressen = new \XMLNode('adressen');
      $adressen->addChild(\XMLNode::getXMLNode($tripel->zwei, 'adresse', array('bearbeiter', 'bearbdatum')));
      $adressen->addChild(\XMLNode::getXMLNode($tripel->drei, 'adresse', array('bearbeiter', 'bearbdatum')));
      if ($adressen->hasChildren()) {
        $anmeldung->addChild($adressen);
      }

      $anmeldungen->addChild($anmeldung);
    }

    $firmenanmeldung->addChild($anmeldungen);
    $firmenanmeldungen->addChild($firmenanmeldung);

    $allgsettings = \AllgSettingsAPI::getAllgSettings();

    
    $teilnehmer = \SessionOperations::getCurrentWebToolsTeilnehmer();
    $senderEmailData = \ToolsAPI::getSenderEmailAddressAndName($teilnehmer);

    $mailAdress = $allgsettings->emailanm;
    $email = new \smtpMail();
    $email->SetVar2Value('from', $senderEmailData['email']);
    $email->SetVar2Value('sendername', $senderEmailData['name']);
    $email->SetVar2Value('reply', $senderEmailData['reply']);
    $email->SetVar2Value('replyname', $senderEmailData['replyname']);
    $email->SetVar2Value('to', $mailAdress);
    $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_TEXT);
    $email->SetVar2Value('doNotSplitHTMLBody', true);
    $email->subject = 'automatisch generierte eMail - FirmenAnmeldung';
    $email->body = '<?xml version="1.0" encoding="' . \CodingOperations::getInternalEncoding() . '"?>' . "\n" . $firmenanmeldungen->getXMLstring();
    if (!$email->sendMail()) {
      throw new \Exception('Versenden der Anmelde-Mail fehlgeschlagen');
    }
  }

  private function getFirmenBelegung()
  {
    $dbwBelegung = new \DBWorkBelegung();

    return $dbwBelegung->getBelegung($this->request->belegId);
  }

  protected function getResponse($status)
  {
    $this->handleResponseStrategies();
    $this->response->belegungFirma = $this->getFirmenBelegung();
    $this->response->status = $status;

    return $this->response;
  }

  protected function getResponseStrategies()
  {
    return array(
      new \Kufer\KuferTools\Utils\ResponseStrategies\ResponseMitRahmen($this)
    );
  }
}

class AnmeldungAbsendenRequest
{
  public $knr;
  public $belegId;
  public $jsonData;

  public $isRefresh;
  public $isXsrfOk;
}

class AnmeldungAbsendenResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $belegungFirma;
  public $status;
}