<?php

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


class ToolDozHonorar extends ToolBase
{
  private $_messages = '';
  private $_isRefresh = false;

  public function __construct()
  {
    parent::__construct();
    $this->toolTitle = 'Honorarabrechnung';
  }

  protected function doByBrowserRefresh()
  {
    $this->_isRefresh = true;
    $_POST = array();
    $_SERVER['REQUEST_METHOD'] = 'GET';
  }

  
  public function init($pPageId)
  {
    $this->checkBrowserReload();

    
    switch ($pPageId) {
      default:
      case 487: 
        $page = $this->_handleHonorarAbrechnung();
        break;
    }
    if ($page == null) {
      throw new Exception('ungültige PageId');
    }

    $this->currentPage = $page;
  }

  

  
  private function _handleHonorarAbrechnung()
  {
    $user = SessionOperations::getCurrentWebToolsUser();
    try {
      $pVonDatum = $this->toolSettings->zahlungenAbDatum;
      $data = HonorargutschriftAPI::getHonorargutschriftInformationen($user->dnr, $pVonDatum);
      if ($this->_handleDruckAbrechnung($data) == false) {
        $this->_messages .= HTMLOperations::getAlertBox('Der PDF-Ausdruck der Honorarabrechnung wurde nicht gefunden', 'Honorarabrechnung nicht gefunden.');
      }
      if (GetOperations::getVarValue('action') == 'reklamation' && !$this->_isRefresh) {
        $this->_handleAbrechnungReklamation($data);
        
        $data = HonorargutschriftAPI::getHonorargutschriftInformationen($user->dnr, $pVonDatum);
      }
    } catch (Exception $e) {
      $data = HonorargutschriftAPI::getEmptyHonorargutschriftInformationen();

      if ($e->errorType == 10) { 
        Logger::logg('Honorarinfos: Beschäftigungsverhältnisse nicht konsistent für Dozent ' . $user->name . ' ' . $user->vorname . '('.$user->dnr.')', 825);
        $this->_messages .= HTMLOperations::getAlertBox('Die Honorarinformationen konnten nicht ausgelesen werden.<br>Bitte lassen Sie von einem Mitarbeiter der BFI die Zeiträume Ihrer Beschäftigungsverhältnisse prüfen.', 'Honorarinformationen konnten nicht ausgelesen werden.');
      } else {
        $this->_messages .= HTMLOperations::getAlertBox('Die Honorarinformationen konnten nicht ausgelesen werden.<br>Bitte versuchen Sie es erneut, oder wenden sich an die Einrichtung.', 'Honorarinformationen konnten nicht ausgelesen werden.');
      }
    }

    return new PageDozHonorar($this, $data, $this->_messages, $this->getReklamationsGruende());
  }

  private function getReklamationsGruende()
  {
    $dbwHlHonReklaGrund = new DBWorkHLHonReklaGrund(1, true);
    $reklamationsGruende = $dbwHlHonReklaGrund->getAll();
    return ArrayOperations::mapAttribut($reklamationsGruende, 'grund');
  }

  private function _handleDruckAbrechnung($data)
  {
    $user = SessionOperations::getCurrentWebToolsUser();
    if (GetOperations::getVarValue('action') == 'printAbrechnung') {
      $monatAb = GetOperations::getVarValue('monat_ab');
      $zahlnummer = GetOperations::getVarValue('zahlnummer');

      try {
        $datei = DatDocAPI::getDeputatsHonorarAbrechnungenFromDmz4BFI($user->dnr, $monatAb, $zahlnummer);
        $contentType = FSOperations::getContentTypeByFileName($datei->DateiName);
        $fileParts = FSOperations::getFileParts($datei->DateiName);
        $fileExtension = isset($fileParts['extension']) ? $fileParts['extension'] : 'pdf';

        if ($contentType) {
          header('Content-Type: ' . $contentType);
        }

        header('Content-Disposition: attachment; filename="honorarabrechnung.' . $fileExtension . '"');
        echo base64_decode($datei->ContentBase64);
        die(); 
      } catch (Exception $e) {
        Logger::logg('Fehler beim Druck der Honorargutschrift: ' . $e->getMessage(), 200);

        return false;
      }
    }

    return true;
  }

  private function _handleAbrechnungReklamation($data)
  {
    $json64honorargutschriften = PostOperations::getVarValue('honorargutschriften');
    $honorarGutschriftAry = JsonOperations::getFromStringBase64($json64honorargutschriften);

    $reklamationsGrundJson = PostOperations::getVarValue('reklamationsgrund');
    $reklamationsGrund = nl2br(JsonOperations::getFromStringBase64($reklamationsGrundJson));

    
    
    
    
    

    $success = array();
    foreach ($honorarGutschriftAry as $honorarGutschrift) {
      $deputateZuReklamieren = array();
      foreach ($data->deputate as $deputat) {
        if (in_array($deputat->id, $honorarGutschrift->deputatIds)) {
          $deputateZuReklamieren[] = $deputat;
        }
      }

      $zahlungenZuReklamieren = array();
      foreach($data->zahlungen as $zahlung) {
        if (in_array($zahlung->id, $honorarGutschrift->zahlungIds)) {
          $zahlungenZuReklamieren[] = $zahlung;
        }
      }

      $successZahlungenPerDMZreklamiert = $this->reklamiereZahlungen($zahlungenZuReklamieren, $reklamationsGrund);
      if($successZahlungenPerDMZreklamiert && $this->toolSettings->sendInfoMailBeiReklamation) {
        $this->_sendReklamationEMail($honorarGutschrift->honorargutschrift, $deputateZuReklamieren, $reklamationsGrund, $data);
      }
      $success[] = $successZahlungenPerDMZreklamiert;
    }


    if (count($honorarGutschriftAry) > 0) {
      $alleMailsErfolgreich = array_reduce($success, function($a, $b) {
        return $a && $b;
      }, true);

      if ($alleMailsErfolgreich) {
        $this->_messages .= HTMLOperations::getSuccessBox(
          '<div class="successbox_text">Ihre Reklamation wurde erfolgreich abgesendet.</div>',
          'Honorargutschrift reklamiert'
        );
      } else {
        $this->_messages .= HTMLOperations::getAlertBox(
          '<div class="alertbox_text">Beim Versenden Ihrer Reklamation ist ein Fehler aufgetreten. '
                . 'Bitte versuchen Sie es erneut, oder wenden Sie sich an die Einrichtung.</div>',
          'Fehler beim Versenden der Reklamation'
        );
      }
    } else {
      $this->_messages .= HTMLOperations::getAlertBox(
        '<div class="alertbox_text">Beim Versenden Ihrer Reklamation ist ein Fehler aufgetreten. '
                . 'Bitte versuchen Sie es erneut, oder wenden Sie sich an die Einrichtung.</div>',
        'Fehler beim Versenden der Reklamation'
      );
    }
  }

  private function reklamiereZahlungen($zahlungen, $grund)
  {
    $zahlungenMitOrigTupel = array();
    foreach($zahlungen as $zahlung) {
      $orig = clone($zahlung);
      $neu = $zahlung;

      $neu->reklamation_grund = StringOperations::substr($grund, 0, 250);
      $neu->reklamation_dat = DateTimeOperations::getDateNow();
      $neu->reklamation_von = ToolSettingsAPI::getToolSettings(0)->direktMaKuerzel;
      $zahlungenMitOrigTupel[] = new Tuple($neu, $orig);
    }

    return ZahlungAPI::updateZahlungenNurPerDMZ($zahlungenMitOrigTupel);
  }

  private function _sendReklamationEMail($pHonorargutschrift, $pDeputate, $pGrund, $data)
  {
    $dozent = SessionOperations::getCurrentWebToolsDozent();
    $betreff = 'Honorar-Reklamation von ' . $dozent->getVarValue('namevorname') . ' für ' . $pHonorargutschrift;

    $message = $dozent->getVarValue('namevorname') . ' reklamiert folgende Honorargutschrift: <br>';
    $message .= $pHonorargutschrift . '<br><br>';
    $message .= 'Deputat(e):<br>';

    foreach ($pDeputate as $deputat) {
      $kurs = $this->getKurs4Deputat($deputat, $data);
      if (trim($kurs->id) != '') {
        $message .= '- ' . $deputat->titel . ' (Kurs ' . $kurs->id . ' ' . $kurs->kurzbez . ' ' . ')<br>';
      } else {
        $message .= '- ' . $deputat->titel . '<br>';
      }
    }
    

    $message .= '<br>Folgender Reklamationsgrund wurde angegeben:<br>';
    $message .= $pGrund;

    $senderEmailData = ToolsAPI::getSenderEmailAddressAndName(SessionOperations::getCurrentWebToolsDozent());

    $mailAddress = EmailOperations::getToolEmailAddressForVhs($this->toolSettings->vhsEmailTool38Section487);

    $email = new smtpMailTools();
    $email->SetVar2Value('from', $senderEmailData['email']);
    $email->SetVar2Value('sendername', $senderEmailData['name']);
    $email->SetVar2Value('reply', $senderEmailData['reply']);
    $email->SetVar2Value('replyname', $senderEmailData['replyname']);
    $email->SetVar2Value('to', $mailAddress);
    $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_HTML);
    $email->SetVar2Value('doNotSplitHTMLBody', true);
    $email->subject = $betreff;
    $email->body = $message;
    $email->setFooter('Reklamation von Honorargutschriften', SessionOperations::getCurrentWebToolsUser());

    return $email->sendMail();
  }

  private function getKurs4Deputat($deputat, $data)
  {
    $ktKey = ArrayOperations::usearch($deputat, $data->kurstage, function($deputat, $kurstag) {
      return $kurstag->deputatid == $deputat->id;
    });

    if ($ktKey === false) {
      return new \Kurs();
    }

    $kursKey = ArrayOperations::usearch($data->kurstage[$ktKey], $data->kurse, function($kurstag, $kurs) {
      return $kurstag->knr == $kurs->id;
    });

    if ($kursKey === false) {
      return new \Kurs();
    }

    return $data->kurse[$kursKey];
  }

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