src/Controller/LoginController.php line 38

  1. <?php
  2. namespace App\Controller;
  3. use App\Controller\WebserviceController;
  4. use App\Entity\Auswahllisten;
  5. use App\Entity\Mailtexte;
  6. use App\Entity\Portaleinstellungen;
  7. use App\Entity\Portalsettings;
  8. use App\Entity\Settings;
  9. use App\Entity\Texte;
  10. use App\Entity\User;
  11. use Doctrine\ORM\EntityManager;
  12. use Symfony\Bridge\Twig\Mime\BodyRenderer;
  13. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpFoundation\Session\Session;
  19. use Symfony\Component\Mailer\Mailer;
  20. use Symfony\Component\Mailer\MailerInterface;
  21. use Symfony\Component\Mailer\Transport;
  22. use Symfony\Component\Mime\Address;
  23. use Symfony\Component\Mime\Email;
  24. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Component\Security\Core\Signature\SignatureHasher;
  27. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  28. use Doctrine\ORM\EntityManagerInterface;
  29. use Doctrine\Persistence\ManagerRegistry;
  30. use Twig\Environment;
  31. use Twig\Loader\FilesystemLoader;
  32. class LoginController extends AbstractController
  33. {
  34.     #[Route('/'name'login')]
  35.     public function index(AuthenticationUtils $authenticationUtilsRequest $requestManagerRegistry $doctrineEntityManagerInterface $entityManager): Response
  36.     {
  37.         // Settings
  38.         $o2FA                    $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "2fa"]);
  39.         $oWartung                $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "wartungsarbeiten"]);
  40.         $oOffline                $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "portalonline"]);
  41.         $oAuth                   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "authentifizierung"]);
  42.         $oAuthZ                  $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "authentifizierungz"]);
  43.         $oOutput                 $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "output"]);
  44.         $oLinkWiderruf           $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "widerruf"]);
  45.         $oLinkImpressum          $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "impressum"]);
  46.         $oLinkDatenschutz        $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "datenschutz"]);
  47.         $oLinkSatzung            $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "satzung"]);
  48.         $oLinkBarrierefreiheit   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheit"]);
  49.         $oZeigeBarrierefreiheit  $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheitanzeigen"]);
  50.         $oZaehlerstandMelden     $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "zaehlerstandmelden_abgemeldet"]);
  51.         // Portalsettings
  52.         $oZSMeldenAktivText      $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlerstandsmeldung_aktiv_text"]);
  53.         $oZSMeldenAktivStart     $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlerstandsmeldung_aktiv_startdatum"]);
  54.         $oZSMeldenAktivEnde      $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlerstandsmeldung_aktiv_enddatum"]);
  55.         $oLogo                   $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  56.         $oLogoGraustufen         $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-graustufen"]);
  57.         $oLogoSchwarzWeiss       $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-schwarzweiss"]);
  58.         $oLogoDruckenDialog      $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-print"]);
  59.         $oLogoPositionStartseite $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-position-startseite"]);
  60.         $oAnzahlLogosStartseite  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "anzahl-logos-startseite"]);
  61.         // Texte
  62.         $aTexte                  $doctrine->getRepository(Texte::class)->findAll();
  63.         $oDatenschutzText        $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "datenschutz_text"]);
  64.         $oDatenschutzMail        $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "datenschutz_mail"]);
  65.         
  66.         // Auswahllisten
  67.         $aAuswahllisten          $doctrine->getRepository(Auswahllisten::class)->findBy(["type" => "abschlagsaenderung"]);
  68.         
  69.         // Zustellarten
  70.         $aZustellarten           = array("Abruf im Kundenportal","Zustellung per E-Mail");
  71.         
  72.         $session                 = new Session();
  73.         $oWebservice             = new WebserviceController();
  74.         $oClient                 null;
  75.         if($oWebservice->checkWsConnection($doctrine))
  76.         {
  77.             $oClient $oWebservice->getClient($doctrine);
  78.         }
  79.         $aAbrufarten = array();
  80.         if($oClient)
  81.         {
  82.             $aResult        $oClient->GetInitialData(array(
  83.                 "v_InitialData" => 1
  84.             ));
  85.     
  86.             if($aResult->return_value)
  87.             {
  88.                 if(property_exists($aResult->v_InitialData"OutputCategoriesOM")) 
  89.                 {
  90.                     if(property_exists($aResult->v_InitialData->OutputCategoriesOM"OutputCategoryOM")) 
  91.                     {
  92.                         $aAbrufarten $aResult->v_InitialData->OutputCategoriesOM->OutputCategoryOM;
  93.                         if($aAbrufarten && !is_array($aAbrufarten))
  94.                         {
  95.                             $aAbrufarten= array($aAbrufarten);
  96.                         }
  97.                     }
  98.                 }
  99.             }
  100.         }
  101.         
  102.         // Impressum
  103.         $sImpressum "";
  104.         
  105.         if($oLinkImpressum)
  106.         {
  107.             $sImpressum $oLinkImpressum->getMetavalue();
  108.         }
  109.         
  110.         $session->set('impressum',$sImpressum);
  111.         
  112.         // Datenschutz
  113.         $sDatenschutz       "";
  114.         
  115.         if($oLinkDatenschutz)
  116.         {
  117.             $sDatenschutz $oLinkDatenschutz->getMetavalue();
  118.         }
  119.         
  120.         $session->set('datenschutz',$sDatenschutz);
  121.         // Satzung        
  122.         $sSatzung "";
  123.         if($oLinkSatzung)
  124.         {
  125.             $sSatzung $oLinkSatzung->getMetavalue();
  126.         }
  127.         
  128.         $session->set('satzung',$sSatzung);
  129.         // Barrierefreiheit
  130.         $sBarrierefreiheit  "";
  131.         
  132.         if($oLinkBarrierefreiheit)
  133.         {
  134.             $sBarrierefreiheit $oLinkBarrierefreiheit->getMetavalue();
  135.         }
  136.         
  137.         $session->set('barrierefreiheit',$sBarrierefreiheit);
  138.         // Status Barrierefreiheit anzeigen / nicht anzeigen
  139.         $sZeigeBarrierefreiheit "on";
  140.         
  141.         if($oZeigeBarrierefreiheit)
  142.         {
  143.             $sZeigeBarrierefreiheit $oZeigeBarrierefreiheit->getMetavalue();
  144.         }
  145.         
  146.         $session->set('barrierefreiheitanzeigen'$sZeigeBarrierefreiheit);
  147.         
  148.         if(!$request->getSession())
  149.         {
  150.             $session->start();
  151.         }
  152.         
  153.         // Laden des Kundenlogos, wenn vorhanden
  154.         if ($oLogo)
  155.         {
  156.             $session->set('logo'$oLogo->getMetavalue());
  157.         }
  158.         else
  159.         {
  160.             $session->set('logo''');
  161.         }
  162.         if($oLogoGraustufen)
  163.         {
  164.             $session->set('logo-graustufen'$oLogoGraustufen->getMetavalue());
  165.         }
  166.         else{
  167.             $session->set('logo-graustufen''');
  168.         }
  169.         if($oLogoSchwarzWeiss)
  170.         {
  171.             $session->set('logo-schwarzweiss'$oLogoSchwarzWeiss->getMetavalue());
  172.         }
  173.         else
  174.         {
  175.             $session->set('logo-schwarzweiss''');
  176.         }
  177.         if($oLogoDruckenDialog)
  178.         {
  179.             $session->set('logo-print'$oLogoDruckenDialog->getMetavalue());
  180.         }
  181.         else
  182.         {
  183.             $session->set('logo-print''');
  184.         }
  185.         // Anzahl der Logos auf Startseite ermitteln
  186.         $iAnzahlLogosStartseite 1;
  187.         if($oAnzahlLogosStartseite && $oAnzahlLogosStartseite->getMetavalue())
  188.         {
  189.             $iAnzahlLogosStartseite $oAnzahlLogosStartseite->getMetavalue();
  190.         }
  191.         // Logos & Satzungen
  192.         $aLogos     = array();
  193.         $aSatzungen = array();
  194.         // Verzeichnis der Logos
  195.         $sVerzeichnis "/customerdata/";
  196.         for($i 0$i $iAnzahlLogosStartseite$i++)
  197.         {
  198.             $sKeyname "";
  199.             if($i 0)
  200.             {
  201.                 $sKeyname "-" $i;
  202.             }
  203.             // Logos & Satzung ermitteln
  204.             $oLogo                  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo".$sKeyname]);
  205.             $oLogoGraustufen        $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-graustufen".$sKeyname]);
  206.             $oLogoSchwarzWeiss      $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-schwarzweiss".$sKeyname]);
  207.             $oLogoDruckenDialog     $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-print".$sKeyname]);
  208.             $oSatzung               $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "satzung".$sKeyname]);
  209.             // Logo Graustufen
  210.             $sLogoGraustufen "";
  211.             
  212.             if($oLogoGraustufen && $oLogoGraustufen->getMetavalue())
  213.             {
  214.                 $sLogoGraustufen $sVerzeichnis $oLogoGraustufen->getMetavalue();
  215.             }
  216.             // Logo Schwarz-Weiss
  217.             $sLogoSchwarzWeiss "";
  218.             
  219.             if($oLogoSchwarzWeiss && $oLogoSchwarzWeiss->getMetavalue())
  220.             {
  221.                 $sLogoSchwarzWeiss $sVerzeichnis $oLogoSchwarzWeiss->getMetavalue();
  222.             }
  223.             // Logo Drucken-Dialog
  224.             $sLogoDruckenDialog "";
  225.             
  226.             if($oLogoDruckenDialog && $oLogoDruckenDialog->getMetavalue())
  227.             {
  228.                 $sLogoDruckenDialog $sVerzeichnis $oLogoDruckenDialog->getMetavalue();
  229.             }
  230.             // Logo Farbe
  231.             $sLogo "";
  232.             
  233.             if($oLogo && $oLogo->getMetavalue())
  234.             {
  235.                 $sLogo $sVerzeichnis $oLogo->getMetavalue();
  236.             
  237.                 // Fallbacks wenn Logos nicht vorhanden
  238.                 if(!$sLogoGraustufen)
  239.                 {
  240.                     $sLogoGraustufen $sLogo;
  241.                 }
  242.                 if(!$sLogoSchwarzWeiss)
  243.                 {
  244.                     $sLogoSchwarzWeiss $sLogo;
  245.                 }
  246.                 if(!$sLogoDruckenDialog)
  247.                 {
  248.                     $sLogoDruckenDialog $sLogo;
  249.                 }
  250.             }
  251.             // Satzung
  252.             $sSatzung "";
  253.             
  254.             if($oSatzung && $oSatzung->getMetavalue())
  255.             {
  256.                 $sSatzung $oSatzung->getMetavalue();
  257.             }
  258.             $aSatzungen[] = $sSatzung;
  259.             $aLogos[] = array(
  260.                 "logo-farbe" => [
  261.                     'key'   => "logo".$sKeyname,
  262.                     'value' => $sLogo
  263.                 ],
  264.                 "logo-graustufen" => [
  265.                     'key'   => "logo-graustufen".$sKeyname,
  266.                     'value' => $sLogoGraustufen
  267.                 ],
  268.                 "logo-schwarzweiss" => [
  269.                     'key'   => "logo-schwarzweiss".$sKeyname,
  270.                     'value' => $sLogoSchwarzWeiss
  271.                 ],
  272.                 "logo-print" => [
  273.                     'key'   => "logo-print".$sKeyname,
  274.                     'value' => $sLogoDruckenDialog
  275.                 ],
  276.             );
  277.         }
  278.         $session->set('logos'$aLogos);
  279.         $session->set('satzungen'$aSatzungen);
  280.         if($oLogoPositionStartseite)
  281.         {
  282.             $session->set('logo-position-startseite'$oLogoPositionStartseite->getMetavalue());
  283.         }
  284.         $sZaehlerstandMelden "on";
  285.         if($oZaehlerstandMelden)
  286.         {
  287.             $sZaehlerstandMelden $oZaehlerstandMelden->getMetavalue();
  288.         }
  289.         $session->set('zaehlerstandmelden_abgemeldet'$sZaehlerstandMelden);
  290.         // Zählerstand inaktiv Text, Start- und Enddatum
  291.         $sZählerstandAktivText    "";
  292.         $sZählerstandAktivStart   "";
  293.         $sZählerstandAktivEnde    "";
  294.         if($oZSMeldenAktivText && trim($oZSMeldenAktivText->getMetavalue())) 
  295.         {
  296.             $sZählerstandAktivText    $oZSMeldenAktivText->getMetavalue();
  297.         }
  298.         
  299.         if($oZSMeldenAktivStart && trim($oZSMeldenAktivStart->getMetavalue())) 
  300.         {
  301.             $sZählerstandAktivStart   $oZSMeldenAktivStart->getMetavalue();
  302.             $sZählerstandAktivText    str_replace("#startdatum#"$sZählerstandAktivStart$sZählerstandAktivText);
  303.         }
  304.         
  305.         if($oZSMeldenAktivEnde && trim($oZSMeldenAktivEnde->getMetavalue()))
  306.         {
  307.             $sZählerstandAktivEnde    $oZSMeldenAktivEnde->getMetavalue();
  308.             $sZählerstandAktivText    str_replace("#enddatum#"$sZählerstandAktivEnde$sZählerstandAktivText);
  309.         }
  310.         // Fallback Text
  311.         $sDatenschutzText   "Ich habe die Datenschutzerklärung zur Kenntnis genommen und stimme zu, dass meine personenbezogenen Daten entsprechend der Datenschutzerklärung verarbeitet werden. Hinweis: Sie können Ihre Einwilligung jederzeit für die Zukunft per E-Mail an #datenschutz_mail# widerrufen.";
  312.         // Fallback Mail
  313.         $sDatenschutzMail "kundenportal@msu-solutions.de";
  314.         // Text für Datenschutzerklärung
  315.         if($oDatenschutzText && $oDatenschutzText->getMetavalue())
  316.         {
  317.             $sDatenschutzText $oDatenschutzText->getMetavalue();
  318.         }
  319.         // E-Mail-Adresse für Datenschutzerklärung
  320.         if($oDatenschutzMail && $oDatenschutzMail->getMetavalue())
  321.         {
  322.             $sDatenschutzMail $oDatenschutzMail->getMetavalue();
  323.         }
  324.         
  325.         $sDatenschutzMail   "<a href='mailto:".$sDatenschutzMail."'>".$sDatenschutzMail."</a>";
  326.         $sDatenschutzText   str_replace("#datenschutz_mail#"$sDatenschutzMail$sDatenschutzText);
  327.         // Widerruf
  328.         if($oLinkWiderruf)
  329.         {
  330.             $sLinkWiderruf "";
  331.             
  332.             if($oLinkWiderruf->getMetavalue())
  333.             {
  334.                 $sLinkWiderruf $oLinkWiderruf->getMetavalue();
  335.             }
  336.             
  337.             $sLinkWiderruf       "<a href='".$sLinkWiderruf."' target='_blank' title='Link zum Widerruf'>".$sLinkWiderruf."</a>";
  338.             
  339.             $sDatenschutzText   str_replace("#widerruf#"$sLinkWiderruf$sDatenschutzText);
  340.         }
  341.         
  342.         $sDatenschutzText str_replace("  "" "$sDatenschutzText);
  343.         // Wartungsarbeiten
  344.         $bWartung false;
  345.         if($oWartung->getMetavalue() && $oWartung->getMetavalue() == "on")
  346.         {
  347.             $bWartung true;
  348.         }
  349.         // Portal online/offline
  350.         $bOnline false;
  351.         if($oOffline && $oOffline->getMetavalue() == "on")
  352.         {
  353.             $bOnline true;
  354.         }
  355.         $aTemp  = array();
  356.         foreach($aTexte as $iKey => $oText)
  357.         {
  358.             $aTemp[$oText->getMetakey()] = $oText->getMetavalue();
  359.         }
  360.         $aTexte $aTemp;
  361.         if(!array_key_exists("portalname",$aTexte))
  362.         {
  363.             $aTexte["portalname"] = "Wasserportal";
  364.         }
  365.         if(!array_key_exists("bezeichn_kundennummer_AuthwithHash",$aTexte))
  366.         {
  367.             $aTexte["bezeichn_kundennummer_AuthwithHash"] = "Kundennummer";
  368.         }
  369.         $session->set('texte',$aTexte);
  370.         $sEmail "";
  371.          // prüfen ob webid im request vorhanden ist und wenn ja user Ã¼ber die webid aus der datenbank ermitteln
  372.         if($request->get('webid'))
  373.         {
  374.             $oUser $doctrine->getRepository(User::class)->findOneBy(["webid" => $request->get('webid')]);
  375.             if($oUser)
  376.             {
  377.                 $sEmail $oUser->getEmail();
  378.             }
  379.         }
  380.         $oUser null;;
  381.         if($this->getUser())
  382.         {
  383.             $oUser $doctrine->getRepository(User::class)->find($this->getUser()->getId());
  384.         }
  385.         if($oUser)
  386.         {
  387.             if(in_array("ROLE_ADMIN"$oUser->getRoles()))
  388.             {
  389.                 $session->set('nutzername',"AD");
  390.                 if(!empty($request->get('edit')))
  391.                 {
  392.                     $aReturn = array(
  393.                         'zustellarten'      => $aZustellarten,
  394.                         'impressum'         => $sImpressum,
  395.                         'datenschutz'       => $sDatenschutz,
  396.                         'barrierefreiheit'  => $sBarrierefreiheit,
  397.                         'satzung'           => $sSatzung,
  398.                         'auswahllisten'     => $aAuswahllisten,
  399.                         'error'             => '',
  400.                         'neu'               => '',
  401.                         'twofa'             => '',
  402.                         'auth'              => $oAuth,
  403.                         'authz'             => $oAuthZ,
  404.                         'output'            => $oOutput,
  405.                         'webservice'        => $oWebservice->checkWsConnection($doctrine),
  406.                         'abrufarten'        => $aAbrufarten,
  407.                         'texte'             => $aTexte,
  408.                         'email'             => $sEmail,
  409.                         'datenschutzText'   => $sDatenschutzText,
  410.                     );
  411.                     return $this->render('login/index.html.twig'$aReturn);
  412.                 }
  413.                 $session->set('webservice'true);
  414.                 
  415.                 $oLogo              $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  416.                 $oLogoGraustufen    $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-graustufen"]);
  417.                 $oLogoSchwarzWeiss  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-schwarzweiss"]);
  418.                 if($oLogo
  419.                 {
  420.                     $session->set('logo'$oLogo->getMetavalue());
  421.                 }
  422.                 if($oLogoGraustufen)
  423.                 {
  424.                     $session->set('logo-graustufen'$oLogoGraustufen->getMetavalue());
  425.                 }
  426.                 if($oLogoSchwarzWeiss)
  427.                 {
  428.                     $session->set('logo-schwarzweiss'$oLogoSchwarzWeiss->getMetavalue());
  429.                 }
  430.                 return $this->redirectToRoute('dashboard');
  431.             }
  432.             else
  433.             {
  434.                 $iCustomerId $oUser->getKundennummer();
  435.                 if($oClient)
  436.                 {
  437.                     $aUserdata $oClient->GetCustomerInternalsByNo(array('p_No' => $iCustomerId'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals->CustomerInternal;
  438.                     $sFirst substr($aUserdata->Name01);
  439.                     $sLast substr($aUserdata->Name201);
  440.                     $session->set('nutzername'$sFirst "" $sLast);
  441.                     $session->set('name'$aUserdata->Name " " $aUserdata->Name2);
  442.                     $session->set('webservice'true);
  443.                 }
  444.                 else
  445.                 {
  446.                     $session->set('webservice'false);
  447.                 }
  448.                 return $this->redirectToRoute('vertraege',["code" => $request->get('code')]);
  449.             }
  450.         }
  451.         $oPortalvariante $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "portalvariante"]);
  452.         
  453.         $sPortalvariante "";
  454.         if ($oPortalvariante)
  455.         {
  456.             if ($oPortalvariante->getMetavalue() == "zaehlerstand")
  457.             {
  458.                 $sTargetAction 'zaehlerstand_melden';
  459.             }
  460.             else if ($oPortalvariante->getMetavalue() == "komplett")
  461.             {
  462.                 $sTargetAction 'komplett';
  463.             }
  464.             $sPortalvariante $oPortalvariante->getMetavalue();
  465.         }
  466.         // get the login error if there is one
  467.         $error $authenticationUtils->getLastAuthenticationError();
  468.         // last username entered by the user
  469.         $lastUsername $authenticationUtils->getLastUsername();
  470.         $aReturn = array(
  471.             'controller_name'           => 'LoginController',
  472.             'last_username'             => $lastUsername,
  473.             'error'                     => $error,
  474.             'zustellarten'              => $aZustellarten,
  475.             'abrufarten'                => $aAbrufarten,
  476.             'impressum'                 => $sImpressum,
  477.             'datenschutz'               => $sDatenschutz,
  478.             'satzung'                   => $sSatzung,
  479.             'target_action'             => $request->get('target_action') ? $request->get('target_action') : $sTargetAction,
  480.             'texte'                     => $aTexte,
  481.             'zaehlerstandAktivText'     => $sZählerstandAktivText
  482.             'zaehlerstandAktivStart'    => $sZählerstandAktivStart
  483.             'zaehlerstandAktivEnde'     => $sZählerstandAktivEnde,
  484.             'barrierefreiheit'          => $sBarrierefreiheit,
  485.             'portalvariante'            => $sPortalvariante,
  486.             'auswahllisten'             => $aAuswahllisten,
  487.             'wartungsarbeiten'          => $bWartung,
  488.             'online'                    => $bOnline,
  489.             'output'                    => $oOutput,
  490.             'webservice'                => $oWebservice->checkWsConnection($doctrine),
  491.             'datenschutzText'           => $sDatenschutzText,
  492.             'email'                     => $sEmail
  493.         );
  494.         $b2FA   false;
  495.         // 2FA
  496.         if($o2FA->getMetavalue() && $o2FA->getMetavalue() == "on")
  497.         {
  498.             $b2FA true;
  499.         }
  500.         
  501.         $aReturn["twofa"]    = $b2FA;
  502.         $aReturn["auth"]     = $oAuth;
  503.         $aReturn["authz"]    = $oAuthZ;
  504.         // Anzeige drucken Dialog
  505.         if($request->get('drucken'))
  506.         {
  507.             $aReturn["drucken"]     = true;
  508.             $aReturn["zaehler"]     = $request->get('zaehler');
  509.             $aReturn["ablesedatum"] = $request->get('ablesedatum');
  510.             $aReturn["ablesestand"] = $request->get('ablesestand');
  511.         }
  512.         
  513.         return $this->render('login/index.html.twig'$aReturn);
  514.     }
  515.     #[Route('/passwort-vergessen/'name'passwort-vergessen')]
  516.     public function passwordForget(Request $requestManagerRegistry $doctrineEntityManagerInterface $entityManager,  UserPasswordHasherInterface $userPasswordHasher)
  517.     {
  518.         $session = new Session();
  519.         
  520.         if ($this->getUser())
  521.         {
  522.             return $this->redirectToRoute('dashboard');
  523.         }
  524.         
  525.         $oWebservice            = new WebserviceController();
  526.         $oMailer                = new MailController();
  527.         $oMailer                $oMailer->getMailer($doctrine);
  528.         
  529.         // Settings
  530.         $oLinkImpressum         $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "impressum"]);
  531.         $oLinkDatenschutz       $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "datenschutz"]);
  532.         $oLinkSatzung           $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "satzung"]);
  533.         $oLinkBarrierefreiheit  $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheit"]);
  534.         $oZeigeBarrierefreiheit $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheitanzeigen"]);
  535.         
  536.         // Portalsettings
  537.         $oLogo                  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  538.         $oAbsender              $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  539.         
  540.         // Texte
  541.         $aTexte                 $doctrine->getRepository(Texte::class)->findAll();
  542.         
  543.         $oClient            null;
  544.         if($oWebservice->checkWsConnection($doctrine))
  545.         {
  546.             $oClient $oWebservice->getClient($doctrine);
  547.         }
  548.         
  549.         $sImpressum "";
  550.         if($oLinkImpressum
  551.         {
  552.             $sImpressum $oLinkImpressum->getMetavalue();
  553.         }
  554.         $session->set('impressum',$sImpressum);
  555.         $sDatenschutz "";
  556.         if($oLinkDatenschutz
  557.         {
  558.             $sDatenschutz $oLinkDatenschutz->getMetavalue();
  559.         }
  560.         $session->set('datenschutz',$sDatenschutz);
  561.         // Satzung        
  562.         $sSatzung "";
  563.         if($oLinkSatzung)
  564.         {
  565.             $sSatzung $oLinkSatzung->getMetavalue();
  566.         }
  567.         
  568.         $session->set('satzung',$sSatzung);
  569.         $sBarrierefreiheit "";
  570.         if($oLinkBarrierefreiheit
  571.         {
  572.             $sBarrierefreiheit $oLinkBarrierefreiheit->getMetavalue();
  573.         }
  574.         $session->set('barrierefreiheit',$sBarrierefreiheit);
  575.         // Status Barrierefreiheit anzeigen / nicht anzeigen
  576.         $sZeigeBarrierefreiheit "on";
  577.         if($oZeigeBarrierefreiheit)
  578.         {
  579.             $sZeigeBarrierefreiheit $oZeigeBarrierefreiheit->getMetavalue();
  580.         }
  581.         $session->set('barrierefreiheitanzeigen'$sZeigeBarrierefreiheit);
  582.         $aTemp  = array();
  583.         foreach($aTexte as $iKey => $oText)
  584.         {
  585.             $aTemp[$oText->getMetakey()] = $oText->getMetavalue();
  586.         }
  587.         $aTexte $aTemp;
  588.         if(!array_key_exists("portalname",$aTexte))
  589.         {
  590.             $aTexte["portalname"] = "Energieportal";
  591.         }
  592.         if ($oLogo)
  593.         {
  594.             $session->set('logo'$oLogo->getMetavalue());
  595.         }
  596.         else
  597.         {
  598.             $session->set('logo''');
  599.         }
  600.         
  601.         $session->set('texte',$aTexte);
  602.         $aReturn = array(
  603.             'error'             => ""
  604.             'impressum'         => $sImpressum,
  605.             'datenschutz'       => $sDatenschutz
  606.             'satzung'           => $sSatzung,
  607.             'barrierefreiheit'  => $sBarrierefreiheit,
  608.             'texte'             => $aTexte
  609.         );
  610.         // CSS für Mailvorlage ermitteln
  611.         $sStyle     "";
  612.         $sFile      "css/email.css";
  613.         if(file_exists($sFile))
  614.         {
  615.             $sStyle file_get_contents($sFile);
  616.         }
  617.         $sFile      "css/customer.css";
  618.         if(file_exists($sFile))
  619.         {
  620.             $sStyle .= file_get_contents($sFile);
  621.         }
  622.         // Absender
  623.         $sFrom 'portal.support@msu-solutions.de';
  624.         if($oAbsender)
  625.         {
  626.             $sFrom trim($oAbsender->getMetavalue());
  627.         }
  628.         // Mailsignatur
  629.         $oInhalte  = new InhalteController();
  630.         $sSignatur $oInhalte->getMailSignatur($doctrine);
  631.         if($request->get('email'))
  632.         {
  633.             $oUser $doctrine->getRepository(User::class)->findOneBy(["email" => $request->get('email')]);
  634.             if(!$oUser)
  635.             {
  636.                 $aReturn['error'] = "Bitte prüfen Sie Ihre Eingabe.";
  637.                 
  638.                 return $this->render('login/password-lost.html.twig'$aReturn);
  639.             }
  640.             $sHash substr(md5(time()), 010);
  641.             $sTokenDuration 3600 60;
  642.             $sTokenDuration += 120;
  643.             $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$sTokenDuration." minutes"time()));
  644.             $oUser->setHash($sHash);
  645.             $oUser->setTokenduration($sTokenDuration);
  646.             
  647.             $entityManager->persist($oUser);
  648.             $entityManager->flush();
  649.             
  650.             // Empfänger
  651.             $sTo        trim($request->get('email'));
  652.             
  653.             // Textvorlage
  654.             $oText      $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "password_reset_request"]);
  655.             $sText      "";
  656.             
  657.             // Betreff
  658.             $sSubject   "Passwort vergessen";
  659.             
  660.             $sAnrede    "";
  661.             if($oClient && $oUser->getKundennummer())
  662.             {
  663.                 $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $oUser->getKundennummer(), 'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals;
  664.                 if(property_exists($aResult"CustomerInternal"))
  665.                 {
  666.                     $aResult $aResult->CustomerInternal;
  667.     
  668.                     if(is_array($aResult))
  669.                     {
  670.                         $sAnrede $aResult[0]->SalutationFormal;
  671.                     }
  672.                     else
  673.                     {
  674.                         $sAnrede $aResult->SalutationFormal;
  675.                     }
  676.                 }
  677.             }
  678.             if(!$sAnrede)
  679.             {
  680.                 // Standardanrede ermitteln
  681.                 $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  682.                 
  683.                 $sAnrede "Sehr geehrte Damen und Herren";
  684.                 if($oAnrede && $oAnrede->getMetavalue())
  685.                 {
  686.                     $sAnrede $oAnrede->getMetavalue();
  687.                 }
  688.             }
  689.             if($oText)
  690.             {
  691.                 // Betreff ermitteln
  692.                 if($oText->getBetreff())
  693.                 {
  694.                     $sSubject $oText->getBetreff();
  695.                 }
  696.                 
  697.                 // Inhalt ermitteln
  698.                 $sText $oText->getInhalt();
  699.             }
  700.             // URL
  701.             $sUrl   $_SERVER['REQUEST_SCHEME'] . '://' $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
  702.             
  703.             // HTML-Link
  704.             $sLink  $sUrl."?hash=".$sHash;
  705.             $sLink  '<a href="'$sLink .'" target="_blank" title="Passwort zurücksetzen">' $sLink '</a>';
  706.             
  707.             $sText  str_replace("#anrede#"$sAnrede$sText);
  708.             $sText  str_replace("#link#"$sLink$sText);
  709.             $sText  str_replace("#tokenduration#"$sTokenDuration$sText);
  710.             $oMail = (new TemplatedEmail())
  711.                 ->from($sFrom)
  712.                 ->to($sTo)
  713.                 ->subject($sSubject)
  714.                 // path of the Twig template to render
  715.                 ->htmlTemplate('emails/password.html.twig')
  716.                 // pass variables (name => value) to the template
  717.                 ->context([
  718.                     "subject"   => $sSubject,
  719.                     "text"      => $sText,
  720.                     "style"     => $sStyle,
  721.                     "signatur"  => $sSignatur
  722.                 ]);
  723.             $loader             = new FilesystemLoader('../templates/');
  724.             $twigEnv            = new Environment($loader);
  725.             $twigBodyRenderer   = new BodyRenderer($twigEnv);
  726.             $twigBodyRenderer->render($oMail);
  727.             try
  728.             {
  729.                 $oMailer->send($oMail);
  730.                 
  731.                 $this->addFlash(
  732.                     'neu',
  733.                     "Sie erhalten in Kürze eine E-Mail mit Informationen zum Zurücksetzen Ihres Passwortes. Bitte prüfen Sie auch den Posteingang in Ihrem Spam-Ordner"
  734.                 );
  735.             }
  736.             catch(\Exception $exception)
  737.             {
  738.                 $this->addFlash(
  739.                     'error',
  740.                     "Die Mail konnte leider nicht versendet werden."
  741.                 );
  742.             }
  743.             return $this->redirectToRoute('login');
  744.             /*
  745.             $email = (new TemplatedEmail())
  746.                 ->from('hws@nvii-dev.com')
  747.                 ->to($sTo)
  748.                 ->subject('Passwort vergesssen')
  749.                 // path of the Twig template to render
  750.                 ->htmlTemplate('emails/password.html.twig')
  751.                 // pass variables (name => value) to the template
  752.                 ->context([
  753.                     "link" => $sLink,
  754.                     "style" => $sStyle,
  755.                     "signatur" => $sSignatur
  756.                 ])
  757.             ;
  758.             $mailer->send($email);
  759.             return $this->render('login/password-lost.html.twig', ['info' => 'Die Mail wurde versendet.', 'error' => "", 'impressum' => $sImpressum,
  760.                 'datenschutz' => $sDatenschutz, 'barrierefreiheit' => $sBarrierefreiheit]);
  761.             */
  762.         }
  763.         if($request->get('hash'))
  764.         {
  765.             $sHash $request->get('hash');
  766.             $oUser $doctrine->getRepository(User::class)->findOneBy(["hash" => $sHash]);
  767.             if($oUser)
  768.             {
  769.                 // Prüfung Token-Laufzeit
  770.                 $sTokenDuration          $oUser->getTokenduration();
  771.                 $sTokenDurationTimestamp strtotime("- 120 minutes"strtotime($sTokenDuration));
  772.                 if(time() > $sTokenDurationTimestamp)
  773.                 {
  774.                     $oUser->setTokenduration(null);
  775.             
  776.                     $entityManager->persist($oUser);
  777.                     $entityManager->flush();
  778.                     
  779.                     $this->addFlash(
  780.                         'error',
  781.                         "Der Link zum Zurücksetzen Ihres Passworts ist abgelaufen."
  782.                     );
  783.                     return $this->redirectToRoute('login');
  784.                 }
  785.                 $aReturn['newpassword'] = $request->get('hash');
  786.             }
  787.             return $this->render('login/password-lost.html.twig'$aReturn);
  788.         }
  789.         if($request->get('password-first') == $request->get('password-second') AND !empty($request->get('password-first')))
  790.         {
  791.             $oUser $doctrine->getRepository(User::class)->findOneBy(["hash" => $request->get("newhash")]);
  792.             $this->addFlash(
  793.                 'neu',
  794.                 'Das Passwort wurde gespeichert. Sie können sich nun anmelden.'
  795.             );
  796.             $oUser->setPassword(
  797.                 $userPasswordHasher->hashPassword(
  798.                     $oUser,
  799.                     $request->get('password-first')
  800.                 )
  801.             );
  802.             $oUser->setTokenduration(null);
  803.             
  804.             $entityManager->persist($oUser);
  805.             $entityManager->flush();
  806.             // Empfänger
  807.             $sTo $oUser->getEmail();
  808.             // Textvorlage
  809.             $oText      $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "password_reset_successfully"]);
  810.             $sText      "";
  811.             
  812.             // Betreff
  813.             $sSubject   "Passwort geändert";
  814.             
  815.             $sAnrede    "";
  816.             if($oClient && $oUser->getKundennummer())
  817.             {
  818.                 $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $oUser->getKundennummer(), 'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals;
  819.                 if(property_exists($aResult"CustomerInternal"))
  820.                 {
  821.                     $aResult $aResult->CustomerInternal;
  822.     
  823.                     if(is_array($aResult))
  824.                     {
  825.                         $sAnrede $aResult[0]->SalutationFormal;
  826.                     }
  827.                     else
  828.                     {
  829.                         $sAnrede $aResult->SalutationFormal;
  830.                     }
  831.                 }
  832.             }
  833.             if(!$sAnrede)
  834.             {
  835.                 // Standardanrede ermitteln
  836.                 $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  837.                 
  838.                 $sAnrede "Sehr geehrte Damen und Herren";
  839.                 if($oAnrede && $oAnrede->getMetavalue())
  840.                 {
  841.                     $sAnrede $oAnrede->getMetavalue();
  842.                 }
  843.             }
  844.             if($oText)
  845.             {
  846.                 // Betreff ermitteln
  847.                 if($oText->getBetreff())
  848.                 {
  849.                     $sSubject $oText->getBetreff();
  850.                 }
  851.                 
  852.                 // Inhalt ermitteln
  853.                 $sText $oText->getInhalt();
  854.             }
  855.             // Aktuelles Datum & Uhrzeit
  856.             $sDatum     date("d.m.Y"time());
  857.             $sUhrzeit   date("H:i:s"time());
  858.             $sText str_replace("#anrede#"$sAnrede$sText);
  859.             $sText str_replace("#datum#"$sDatum$sText);
  860.             $sText str_replace("#uhrzeit#"$sUhrzeit$sText);
  861.             $oMail = (new TemplatedEmail())
  862.                 ->from($sFrom)
  863.                 ->to($sTo)
  864.                 ->subject($sSubject)
  865.                 // path of the Twig template to render
  866.                 ->htmlTemplate('emails/password.html.twig')
  867.                 // pass variables (name => value) to the template
  868.                 ->context([
  869.                     "subject"   => $sSubject,
  870.                     "text"      => $sText,
  871.                     "style"     => $sStyle,
  872.                     "signatur"  => $sSignatur
  873.                 ]);
  874.             $loader             = new FilesystemLoader('../templates/');
  875.             $twigEnv            = new Environment($loader);
  876.             $twigBodyRenderer   = new BodyRenderer($twigEnv);
  877.             $twigBodyRenderer->render($oMail);
  878.             try
  879.             {
  880.                 $oMailer->send($oMail);
  881.                 
  882.                 $this->addFlash(
  883.                     'neu',
  884.                     "Sie haben Ihr Passwort erfolgreich geändert und erhalten in Kürze eine Bestätigung per E-Mail. Bitte prüfen Sie auch den Posteingang in Ihrem Spam-Ordner"
  885.                 );
  886.             }
  887.             catch(\Exception $exception)
  888.             {
  889.                 $this->addFlash(
  890.                     'error',
  891.                     "Sie haben Ihr Passwort erfolgreich geändert. Beim Senden der Bestätigung per E-Mail ist ein Fehler aufgetreten."
  892.                 );
  893.             }
  894.             return $this->redirectToRoute('login');
  895.         }
  896.         return $this->render('login/password-lost.html.twig'$aReturn);
  897.     }
  898.     #[Route('/zugangbeantragen/'name'zugangbeantragen')]
  899.     public function addUser(Request $requestUserPasswordHasherInterface $userPasswordHasherEntityManagerInterface $entityManagerManagerRegistry $doctrine)
  900.     {
  901.         $oWebservice        = new WebserviceController();
  902.         $oMailer            = new MailController();
  903.         $oMailer            $oMailer->getMailer($doctrine);
  904.         
  905.         $aPortalSettings    $doctrine->getRepository(Mailtexte::class)->findAll();
  906.         $oClient            null;
  907.         
  908.         $aTemp              = array();
  909.         foreach($aPortalSettings as $iKey => $oSetting)
  910.         {
  911.             $aTemp[$oSetting->getMetakey()] = $oSetting;
  912.         }
  913.         $aPortalSettings $aTemp;
  914.         if($request->get('email') && $request->get('passwort'))
  915.         {
  916.             // Abruf Webservice zum Prüfen, ob Kundennummer und Leistungsobjektnummer vorhanden sind
  917.             $sKundennummer          $request->get('kundennummer');
  918.             $sLeistungsobjektnummer $request->get('leistungsobjektnummer');
  919.             // lokales Nutzerobjekt
  920.             $oUser = new User();
  921.             $oUser->setEmail($request->get('email'));
  922.             $oUser->setRoles(array("ROLE_USER"));
  923.             $oUser->setZustellart($request->get('zustellart'));
  924.             $oUser->setAktiv(0);
  925.             $oUser->setKundennummer($sKundennummer);
  926.             $oUser->setLeistungsobjektnummer($sLeistungsobjektnummer);
  927.             $oUser->setDatenschutz(1);
  928.             $sHash bin2hex(random_bytes(5));
  929.             $oUser->setHash($sHash);
  930.             $iWebId     null;
  931.             
  932.             $oKeyLength $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "webid_key_length","type" => "konto"]);
  933.             if($oKeyLength)
  934.             {
  935.                 $iLength    $oKeyLength->getMetavalue();
  936.             }
  937.             else
  938.             {
  939.                 $iLength 6;
  940.             }
  941.             $iWebId     bin2hex(random_bytes($iLength));
  942.             
  943.             $oUser->setWebid($iWebId);
  944.             $sTokenDuration 3600 60;
  945.             $sTokenDuration += 120;
  946.             $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$sTokenDuration." minutes"time()));
  947.             $oUser->setTokenduration($sTokenDuration);
  948.             $oUser->setPassword(
  949.                 $userPasswordHasher->hashPassword(
  950.                     $oUser,
  951.                     $request->get('passwort')
  952.                 )
  953.             );
  954.             $entityManager->persist($oUser);
  955.             $entityManager->flush();
  956.             
  957.             $sMessage "Ihr Zugang wurde beantragt! Zur Bestätigung Ihrer E-Mail erhalten Sie einen Link zugesandt. Erst nach der Bestätigung, kann die Registrierung abgeschlossen werden.";
  958.             
  959.             // Mailversand
  960.             try 
  961.             {
  962.                 $oMail      $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "zugang_beantrag_an_kunde"]);
  963.                 $oCompany   $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  964.                 
  965.                 // CSS für Mailvorlage ermitteln
  966.                 $sStyle     "";
  967.                 $sFile      "css/email.css";
  968.                 if(file_exists($sFile))
  969.                 {
  970.                     $sStyle file_get_contents($sFile);
  971.                 }
  972.                 $sFile      "css/customer.css";
  973.                 if(file_exists($sFile))
  974.                 {
  975.                     $sStyle .= file_get_contents($sFile);
  976.                 }
  977.                 $sAnrede    "";
  978.                 $sSubject   "";
  979.                 $sThema     "";
  980.                 if($oWebservice->checkWsConnection($doctrine))
  981.                 {
  982.                     $oClient $oWebservice->getClient($doctrine);
  983.                 }
  984.                 
  985.                 if($oClient)
  986.                 {
  987.                     // Anrede ermitteln
  988.                     $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $sKundennummer'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals;
  989.                     if(property_exists($aResult"CustomerInternal"))
  990.                     {
  991.                         $aResult $aResult->CustomerInternal;
  992.                         
  993.                         if(is_array($aResult))
  994.                         {
  995.                             $sAnrede $aResult[0]->SalutationFormal;
  996.                         }
  997.                         else
  998.                         {
  999.                             $sAnrede $aResult->SalutationFormal;
  1000.                         }
  1001.                     }
  1002.                 }
  1003.                 if(!$sAnrede)
  1004.                 {
  1005.                     $sAnrede "Sehr geehrte Damen und Herren";
  1006.                     $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1007.                     if($oAnrede && $oAnrede->getMetavalue())
  1008.                     {
  1009.                         $sAnrede $oAnrede->getMetavalue();
  1010.                     }
  1011.                 }
  1012.                 // Betreff ermitteln
  1013.                 $sSubject   $oMail->getBetreff();
  1014.                 $sSubject   str_replace("#company_title#",$oCompany->getMetavalue(), $sSubject);
  1015.                 if(!$sSubject)
  1016.                 {
  1017.                     $sSubject $request->get('kontaktgrund');
  1018.                 }
  1019.                 // Aktivierungslink
  1020.                 $sLink $_SERVER['REQUEST_SCHEME'] . '://'$_SERVER['SERVER_NAME'] .'/zugang/aktivieren/'.$sHash.'/';
  1021.                 // Mailsignatur
  1022.                 $oInhalte  = new InhalteController();
  1023.                 $sSignatur $oInhalte->getMailSignatur($doctrine);
  1024.                 // Nachricht
  1025.                 $sThema     $oMail->getInhalt();
  1026.                 $sThema     str_replace("#anrede#"$sAnrede$sThema);
  1027.                 $sThema     str_replace("#kundennummer#"$sKundennummer$sThema);
  1028.                 $sThema     str_replace("#link#"$sLink$sThema);
  1029.                 $sThema     str_replace("#datum#"$sTokenDuration$sThema);
  1030.                 $sThema     str_replace("#signatur#"$sSignatur$sThema);
  1031.                 
  1032.                 // Sender & Empfänger ermitteln
  1033.                 $sTo        $request->get('email');
  1034.                 $sFrom      'portal.support@msu-solutions.de';
  1035.                 $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1036.                 if($oAbsender)
  1037.                 {
  1038.                     $sFrom  trim($oAbsender->getMetavalue());
  1039.                 }
  1040.                 $oMail = (new TemplatedEmail())
  1041.                     ->from($sFrom)
  1042.                     ->to($sTo)
  1043.                     ->subject($sSubject)
  1044.                     // path of the Twig template to render
  1045.                     ->htmlTemplate('emails/zugang.html.twig')
  1046.                     // pass variables (name => value) to the template
  1047.                     ->context([
  1048.                         "context"   => $sThema,
  1049.                         "hash"      => $sHash,
  1050.                         "code"      => $iWebId,
  1051.                         "style"     => $sStyle,
  1052.                         "signatur"  => $sSignatur
  1053.                     ]);
  1054.                 
  1055.                 $loader             = new FilesystemLoader('../templates/');
  1056.                 $twigEnv            = new Environment($loader);
  1057.                 $twigBodyRenderer   = new BodyRenderer($twigEnv);
  1058.                 $twigBodyRenderer->render($oMail);
  1059.                 $oMailer->send($oMail);
  1060.             } 
  1061.             catch (\Throwable $th
  1062.             {
  1063.                 $sMessage "Ihr Zugang wurde beantragt! Beim Senden Ihrer Bestätigung per E-Mail ist ein Fehler aufgetreten. Bitte wenden Sie sich an uns!";
  1064.             }
  1065.                 
  1066.             $this->addFlash(
  1067.                 'neu',
  1068.                 $sMessage
  1069.             );
  1070.             
  1071.             $session = new Session();
  1072.             $session->set('email'$request->get('email'));
  1073.         }
  1074.         
  1075.         $bWebId false;
  1076.         if($oUser->getAktiv() == 1)
  1077.         {
  1078.             $bWebId true;
  1079.         }
  1080.         return $this->redirectToRoute('login', ["webid" => $bWebId]);
  1081.     }
  1082.     #[Route('/admin'name'login_admin')]
  1083.     public function loginAdmin(AuthenticationUtils $authenticationUtilsRequest $requestManagerRegistry $doctrineEntityManagerInterface $entityManagerSession $session): Response
  1084.     {
  1085.         // Settings
  1086.         $oLinkImpressum          $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "impressum"]);
  1087.         $oLinkDatenschutz        $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "datenschutz"]);
  1088.         $oLinkSatzung            $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "satzung"]);
  1089.         $oLinkBarrierefreiheit   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheit"]);
  1090.         $oZeigeBarrierefreiheit  $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheitanzeigen"]);
  1091.         // Portalsettings
  1092.         $oLogo                   $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  1093.         $oLogoGraustufen         $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-graustufen"]);
  1094.         $oLogoSchwarzWeiss       $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-schwarzweiss"]);
  1095.         $oLogoDruckenDialog      $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-print"]);
  1096.         $oLogoPositionStartseite $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-position-startseite"]);
  1097.         if(!$request->getSession())
  1098.         {
  1099.             $session->start();
  1100.         }
  1101.         // Texte
  1102.         $aTexte                  $doctrine->getRepository(Texte::class)->findAll();
  1103.         $aTemp  = array();
  1104.         foreach($aTexte as $iKey => $oText)
  1105.         {
  1106.             $aTemp[$oText->getMetakey()] = $oText->getMetavalue();
  1107.         }
  1108.         $aTexte $aTemp;
  1109.         if(!array_key_exists("portalname",$aTexte))
  1110.         {
  1111.             $aTexte["portalname"] = "Wasserportal";
  1112.         }
  1113.         $session->get('texte',$aTexte);
  1114.         $sTitel "Administratoren-Login";
  1115.         if(array_key_exists("login-13"$aTexte) && $aTexte["login-13"])
  1116.         {
  1117.             $sTitel $aTexte["login-13"];
  1118.         }
  1119.         // Impressum
  1120.         $sImpressum "";
  1121.         
  1122.         if($oLinkImpressum)
  1123.         {
  1124.             $sImpressum $oLinkImpressum->getMetavalue();
  1125.         }
  1126.         
  1127.         $session->set('impressum',$sImpressum);
  1128.         
  1129.         // Datenschutz
  1130.         $sDatenschutz       "";
  1131.         
  1132.         if($oLinkDatenschutz)
  1133.         {
  1134.             $sDatenschutz $oLinkDatenschutz->getMetavalue();
  1135.         }
  1136.         
  1137.         $session->set('datenschutz',$sDatenschutz);
  1138.         // Satzung        
  1139.         $sSatzung "";
  1140.         if($oLinkSatzung)
  1141.         {
  1142.             $sSatzung $oLinkSatzung->getMetavalue();
  1143.         }
  1144.         
  1145.         $session->set('satzung',$sSatzung);
  1146.         // Barrierefreiheit
  1147.         $sBarrierefreiheit  "";
  1148.         
  1149.         if($oLinkBarrierefreiheit)
  1150.         {
  1151.             $sBarrierefreiheit $oLinkBarrierefreiheit->getMetavalue();
  1152.         }
  1153.         
  1154.         $session->set('barrierefreiheit',$sBarrierefreiheit);
  1155.         // Status Barrierefreiheit anzeigen / nicht anzeigen
  1156.         $sZeigeBarrierefreiheit "on";
  1157.         
  1158.         if($oZeigeBarrierefreiheit)
  1159.         {
  1160.             $sZeigeBarrierefreiheit $oZeigeBarrierefreiheit->getMetavalue();
  1161.         }
  1162.         
  1163.         $session->set('barrierefreiheitanzeigen'$sZeigeBarrierefreiheit);
  1164.         // Laden des Kundenlogos, wenn vorhanden
  1165.         if ($oLogo)
  1166.         {
  1167.             $session->set('logo'$oLogo->getMetavalue());
  1168.         }
  1169.         else
  1170.         {
  1171.             $session->set('logo''');
  1172.         }
  1173.         if($oLogoGraustufen)
  1174.         {
  1175.             $session->set('logo-graustufen'$oLogoGraustufen->getMetavalue());
  1176.         }
  1177.         else{
  1178.             $session->set('logo-graustufen''');
  1179.         }
  1180.         if($oLogoSchwarzWeiss)
  1181.         {
  1182.             $session->set('logo-schwarzweiss'$oLogoSchwarzWeiss->getMetavalue());
  1183.         }
  1184.         else
  1185.         {
  1186.             $session->set('logo-schwarzweiss''');
  1187.         }
  1188.         if($oLogoDruckenDialog)
  1189.         {
  1190.             $session->set('logo-print'$oLogoDruckenDialog->getMetavalue());
  1191.         }
  1192.         else
  1193.         {
  1194.             $session->set('logo-print''');
  1195.         }
  1196.         if($oLogoPositionStartseite)
  1197.         {
  1198.             $session->set('logo-position-startseite'$oLogoPositionStartseite->getMetavalue());
  1199.         }
  1200.         
  1201.         $aReturn = array(
  1202.             'titel'             => $sTitel,
  1203.             'texte'             => $aTexte,
  1204.             'impressum'         => $sImpressum,
  1205.             'datenschutz'       => $sDatenschutz,
  1206.             'barrierefreiheit'  => $sBarrierefreiheit,
  1207.             'satzung'           => $sSatzung,
  1208.             'error' => ""
  1209.         );
  1210.         return $this->render('login/index_admin.html.twig'$aReturn);
  1211.     }
  1212.     #[Route('/zaehlerstand/{rahmenvertrag}/{leistungsobjektnr}/'name'zaehlerstand_link')]
  1213.     public function zaehlerstandlink(Request $requestEntityManagerInterface $entityManagerManagerRegistry $doctrine$rahmenvertrag$leistungsobjektnr)
  1214.     {
  1215.         $session = new Session();
  1216.         if($rahmenvertrag and $leistungsobjektnr)
  1217.         {
  1218.             $session->set('rahmenvertrag',$rahmenvertrag);
  1219.             $session->set('leistungsobjektnr',$leistungsobjektnr);
  1220.             return $this->redirectToRoute('login',["rahmenvertrag" => $rahmenvertrag]);
  1221.         }
  1222.     }
  1223.     #[Route('/zugang/aktivieren/{hash}/'name'zugangaktivieren')]
  1224.     public function activeAccount(Request $requestUserPasswordHasherInterface $userPasswordHasherMailerInterface $mailerEntityManagerInterface $entityManagerManagerRegistry $doctrine$hash)
  1225.     {
  1226.         $session    = new Session();
  1227.         $oUser      $doctrine->getRepository(User::class)->findOneBy(["hash" => $hash]);
  1228.         if(!$oUser)
  1229.         {
  1230.             $this->addFlash(
  1231.                 'error',
  1232.                 'Der Code ist leider falsch.'
  1233.             );
  1234.         }
  1235.         else
  1236.         {
  1237.             // Prüfen, ob Tokenduration in der Vergangenheit liegt
  1238.             $sTokenDuration $oUser->getTokenduration();
  1239.             // Mail mit Aktivierungslink wird erneut versendet wenn Token abgelaufen ist
  1240.             if(time() > strtotime($sTokenDuration))
  1241.             {
  1242.                 // Mailversand
  1243.                 $sLink $_SERVER['REQUEST_SCHEME'] . '://' $_SERVER['SERVER_NAME'] .'/zugang/aktivieren/'.$oUser->getHash().'/';
  1244.                 $sStyle     "";
  1245.                 $sFile      "css/email.css";
  1246.                 if(file_exists($sFile))
  1247.                 {
  1248.                     $sStyle file_get_contents($sFile);
  1249.                 }
  1250.                 $sFile      "css/customer.css";
  1251.                 if(file_exists($sFile))
  1252.                 {
  1253.                     $sStyle .= file_get_contents($sFile);
  1254.                 }
  1255.                 // Mailsignatur
  1256.                 $oInhalte  = new InhalteController();
  1257.                 $sSignatur $oInhalte->getMailSignatur($doctrine);
  1258.                 $oMail    $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "zugang_beantrag_an_kunde"]);
  1259.                 $oCompany $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  1260.                 $sThema   "";
  1261.                 $oWebservice        = new WebserviceController();
  1262.                 $oClient            null;
  1263.                 if($oWebservice->checkWsConnection($doctrine))
  1264.                 {
  1265.                     $oClient $oWebservice->getClient($doctrine);
  1266.                 }
  1267.                 $sAnrede "Sehr geehrte Damen und Herren";
  1268.                 if($oClient)
  1269.                 {
  1270.                     $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $oUser->getKundennummer(), 'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals;
  1271.                     if(property_exists($aResult"CustomerInternal"))
  1272.                     {
  1273.                         $aResult $aResult->CustomerInternal;
  1274.                         if(is_array($aResult))
  1275.                         {
  1276.                             $sAnrede $aResult[0]->SalutationFormal;
  1277.                         }
  1278.                         else
  1279.                         {
  1280.                             $sAnrede $aResult->SalutationFormal;
  1281.                         }
  1282.                     }
  1283.                 }
  1284.                 if($oMail)
  1285.                 {
  1286.                     $sTokenDuration 3600 60;
  1287.                     $sTokenDuration += 120;
  1288.                     $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$sTokenDuration." minutes"time()));
  1289.                     $oUser->setTokenduration($sTokenDuration);
  1290.                     $entityManager->persist($oUser);
  1291.                     $entityManager->flush();
  1292.                     $sSubject   $oMail->getBetreff();
  1293.                     $sSubject   str_replace("#company_title#",$oCompany->getMetavalue(), $sSubject);
  1294.                     $sThema     $oMail->getInhalt();
  1295.                     $sThema     str_replace("#anrede#",$sAnrede$sThema);
  1296.                     $sThema     str_replace("#kundennummer#",$oUser->getKundennummer(), $sThema);
  1297.                     $sThema     str_replace("#link#",$sLink$sThema);
  1298.                     $sThema     str_replace("#datum#",$sTokenDuration$sThema);
  1299.                     $sThema     str_replace("#signatur#",$sSignatur$sThema);
  1300.                 }
  1301.                 if(empty($sSubject))
  1302.                 {
  1303.                     $sSubject $request->get('kontaktgrund');
  1304.                 }
  1305.                 $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1306.                 $sMail      'portal.support@msu-solutions.de';
  1307.                 if($oAbsender)
  1308.                 {
  1309.                     $sMail trim($oAbsender->getMetavalue());
  1310.                 }
  1311.                 $email = (new TemplatedEmail())
  1312.                     ->from($sMail)
  1313.                     ->to($oUser->getEmail())
  1314.                     ->subject($sSubject)
  1315.                     // path of the Twig template to render
  1316.                     ->htmlTemplate('emails/zugang.html.twig')
  1317.                     // pass variables (name => value) to the template
  1318.                     ->context([
  1319.                         "context" => $sThema,
  1320.                         "hash" => $oUser->getHash(),
  1321.                         "code" => $oUser->getWebid(),
  1322.                         "style" => $sStyle,
  1323.                         "signatur" => $sSignatur
  1324.                     ]);
  1325.                 $mailer->send($email);
  1326.                 $this->addFlash(
  1327.                     'neu',
  1328.                     'Ihr Zugang wurde beantragt! Zur Bestätigung Ihrer E-Mail erhalten Sie einen Link zugesandt. Erst nach der Bestätigung, kann die Registrierung abgeschlossen werden.'
  1329.                 );
  1330.             }
  1331.             else
  1332.             {
  1333.                 if($oUser->getAktiv() != 1)
  1334.                 {
  1335.                     $oWebservice        = new WebserviceController();
  1336.                     $oClient            null;
  1337.                     if($oWebservice->checkWsConnection($doctrine))
  1338.                     {
  1339.                         $oClient $oWebservice->getClient($doctrine);
  1340.                     }
  1341.                     if($oClient)
  1342.                     {
  1343.                         $sKundennummer  $oUser->getKundennummer();
  1344.                         $iWebId         $oUser->getWebid();
  1345.                         $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $sKundennummer'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals;
  1346.                         if(property_exists($aResult"CustomerInternal"))
  1347.                         {
  1348.                             $aResult $aResult->CustomerInternal;
  1349.                             if(property_exists($aResult->AccountingContracts"AccountingContract"))
  1350.                             {
  1351.                                 if(is_array($aResult->AccountingContracts->AccountingContract))
  1352.                                 {
  1353.                                     $sContractNo $aResult->AccountingContracts->AccountingContract[0]->No;
  1354.                                     $sZaehlerNo  $aResult->AccountingContracts->AccountingContract[0]->ServiceObjects->ServiceObject->Code;
  1355.                                 }
  1356.                                 else
  1357.                                 {
  1358.                                     $sContractNo    $aResult->AccountingContracts->AccountingContract->No;
  1359.                                     $sZaehlerNo     $aResult->AccountingContracts->AccountingContract->ServiceObjects->ServiceObject->Code;
  1360.                                 }
  1361.     
  1362.                                 // Prüfen, ob in Settings der metavalue auf on steht beim metakey output
  1363.                                 $oOutput $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "output"]);
  1364.     
  1365.                                 $aTempData = array(
  1366.                                     "ZB_ADNUMMER"     => $sKundennummer,
  1367.                                     "ZB_AVERTRAG"     => $sContractNo,
  1368.                                     "ZB_ZNUMMER"      => $sZaehlerNo,
  1369.                                     "ZB_NUTZERNAME"   => $oUser->getEmail(),
  1370.                                     "ZB_WEBID"        => $iWebId,
  1371.                                     "ZB_ANMELD_EMAIL" => $oUser->getEmail()
  1372.                                 );
  1373.     
  1374.                                 if($oOutput->getMetavalue() == "on")
  1375.                                 {
  1376.                                     $aTempData["ZB_OM_KATEGORIE"] = $oUser->getZustellart();
  1377.                                 }
  1378.     
  1379.                                 $aResult $oWebservice->sendData($doctrine"ZUGANG_BEANT"$sKundennummer$aTempData);
  1380.                                 
  1381.                                 if($aResult->return_value)
  1382.                                 {
  1383.                                     $oUser->setAktiv(1);
  1384.     
  1385.                                     $entityManager->persist($oUser);
  1386.                                     $entityManager->flush();
  1387.                                 }
  1388.                             }
  1389.                             else
  1390.                             {
  1391.                                 $this->addFlash(
  1392.                                     'error',
  1393.                                     'Bei der Aktivierung Ihres Zugangs ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.'
  1394.                                 );
  1395.                                 return $this->redirectToRoute('login');
  1396.                             }
  1397.                         }
  1398.                     }
  1399.                     if($oUser->getWebid() && $oUser->getWebid() != 0)
  1400.                     {
  1401.                         // Verifizierung per Web-Id ausstehend
  1402.                         $this->addFlash(
  1403.                             'neu',
  1404.                             'Ihre E-Mail-Adresse wurde erfolgreich validiert. Bevor Sie sich das erste mal in unseren Kundenportal einloggen können, erhalten Sie postalisch eine spezielle Web-ID. Dies dient zur Sicherheit Ihrer Daten.'
  1405.                         );
  1406.                         return $this->redirectToRoute('login');
  1407.                     }
  1408.                     else
  1409.                     {
  1410.                         $session->set('emailtwofa'"");
  1411.                         $session->set('passwordtwofa'"");
  1412.                         $this->addFlash(
  1413.                             'neu',
  1414.                             'Ihr Zugang wurde erfolgreich aktiviert.'
  1415.                         );
  1416.                     }
  1417.                 }
  1418.                 else
  1419.                 {
  1420.                     if($oUser->getWebid() == 0)
  1421.                     {
  1422.                         // Verifizierung per Web-ID abgeschlossen
  1423.                         $this->addFlash(
  1424.                             'neu',
  1425.                             'Ihr Zugang ist bereits aktiv.'
  1426.                         );
  1427.                     }
  1428.                     else
  1429.                     {
  1430.                         // Verifizierung per Web-ID ausstehend
  1431.                         $this->addFlash(
  1432.                             'neu',
  1433.                             'Ihre E-Mail-Adresse wurde erfolgreich validiert. Bevor Sie sich das erste mal in unseren Kundenportal einloggen können, erhalten Sie postalisch eine spezielle Web-ID. Dies dient zur Sicherheit Ihrer Daten.'
  1434.                         );
  1435.                     }
  1436.                 }
  1437.             }
  1438.         }
  1439.         return $this->redirectToRoute('login');
  1440.     }
  1441.     #[Route('/zaehlerstanderfassen/'name'zaehlerstanderfassen')]
  1442.     public function zaehlerstanderfassen(Request $requestMailerInterface $mailerEntityManagerInterface $entityManagerManagerRegistry $doctrine)
  1443.     {
  1444.         $aZaehlernummern    $request->get('zaehlernr');
  1445.         
  1446.         $oWebservice        = new WebserviceController();
  1447.         $oClient            null;
  1448.         if($oWebservice->checkWsConnection($doctrine))
  1449.         {
  1450.             $oClient $oWebservice->getClient($doctrine);
  1451.         }
  1452.         
  1453.         $sBusinessPartnerNo $request->get('kundennummer');
  1454.         $sBaseContractNo    $request->get('basecontractnr');
  1455.         $sLeistungsobjektNr $request->get('leistungsobjektnummerajax');
  1456.         $oCheckConfig $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "authentifizierungz"]);
  1457.         if($oCheckConfig->getMetavalue() == "hashz")
  1458.         {
  1459.             $aResult $oClient->AuthenticateWithHash(array('p_ServiceObject' => $sLeistungsobjektNr'p_Hash' => $sBusinessPartnerNo,'v_ExportCustomerInternals' => array()));
  1460.             $sBusinessPartnerNo $aResult->v_ExportCustomerInternals->CustomerInternal->No;
  1461.         }
  1462.         $bDrucken           false;
  1463.         // Prüfen ob in den settings der metakey fotoupload auf on steht
  1464.         $oSettingsFoto $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "fotoupload"]);
  1465.         $sData         "";
  1466.         $sAnrede            "Sehr geehrte Damen und Herren";
  1467.         $oAnrede            $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1468.         if($oAnrede)
  1469.         {
  1470.             $sAnrede        $oAnrede->getMetavalue();
  1471.         }
  1472.         $sEmailkontakt      $request->get('emailkontakt');
  1473.         $sTelefonKontakt    $request->get('telefonkontakt');
  1474.         $aResult            = array();
  1475.         $sTempNr 0;
  1476.         $sMailText "";
  1477.         $aTempData["ZS_EMAIL"]  = $sEmailkontakt;
  1478.         $aTempData["ZS_TEL"]    = $sTelefonKontakt;
  1479.         $aFotos                 = array();
  1480.         $iDokument              1;
  1481.         foreach($aZaehlernummern as $iKey => $sZaehlerNr)
  1482.         {
  1483.             $sData     "";
  1484.             if(empty($request->get('zaehlerstandneu')[$iKey]))
  1485.             {
  1486.                 continue;
  1487.             }
  1488.             $dAblesedatum     $request->get('ablesedatum')[$iKey];
  1489.             $dAblesedatum     date_create($dAblesedatum);
  1490.             $dAblesedatum     date_format($dAblesedatum,"d.m.Y");
  1491.             $iZaehlerstandNeu $request->get('zaehlerstandneu')[$iKey];
  1492.             $iZaehlerstandNeu str_replace(".",",",$iZaehlerstandNeu);
  1493.             $iZaehlerNo       $request->get('zaehlernr')[$iKey];
  1494.             $sAccountNr       $request->get('AccountingContractNo')[$iKey];
  1495.             
  1496.             if($sTempNr != $sZaehlerNr)
  1497.             {
  1498.                 $aTempData[$iKey] = array(
  1499.                     "ZS_ZNUMMER"            => $iZaehlerNo,
  1500.                     "ZS_ABLDATUM"           => $dAblesedatum,
  1501.                     "ZS_ABLSTAND"           => $iZaehlerstandNeu,
  1502.                     "ZS_LOBJEKT"            => $sLeistungsobjektNr,
  1503.                     "ZS_REASON"             => "",
  1504.                     "ZS_METERREGIDX"        => $request->get('ZS_METERREGIDX')[$iKey],
  1505.                 );
  1506.                 $sTempNr $sZaehlerNr;
  1507.             } 
  1508.             else
  1509.             {
  1510.                 $iTemp $iKey;
  1511.                 $iTemp--;
  1512.                 $aTempData[$iTemp]['ZS_METERREGIDX']    = $request->get('ZS_METERREGIDX')[$iKey];
  1513.                 $aTempData[$iTemp]['ZS_ABLSTAND']       = $iZaehlerstandNeu;
  1514.             }
  1515.             $sGrund "";
  1516.             #if($oSettingsFoto && $oSettingsFoto->getMetavalue() == "on")
  1517.             if($request->files->get('zaehlerstandfoto'))
  1518.             {
  1519.                 if(array_key_exists($iKey$request->files->get('zaehlerstandfoto')))
  1520.                 {
  1521.                     // Prüfen ob im request zaehlerstandfoto mitgesendet wurde
  1522.                     if($request->files->get('zaehlerstandfoto')[$iKey])
  1523.                     {
  1524.                         // Datei aus dem $_FILES request direkt in base64 umwandeln
  1525.                         #$sData = base64_encode(file_get_contents($request->files->get('zaehlerstandfoto')[$iKey]));
  1526.                         $file $request->files->get('zaehlerstandfoto')[$iKey];
  1527.                         $tempPath $file->getPathname();
  1528.                         // Lese das Bild in PHP mit GD
  1529.                         $source imagecreatefromstring(file_get_contents($tempPath));
  1530.                         // Bestimme neue Größe
  1531.                         list($width$height) = getimagesize($tempPath);
  1532.                         $newWidth 500;
  1533.                         $newHeight = ($height $width) * $newWidth;
  1534.                         // Erstelle ein neues Bild mit neuer Größe
  1535.                         $newImage imagecreatetruecolor($newWidth$newHeight);
  1536.                         // Skaliere das Original-Bild in das neue Bild
  1537.                         imagecopyresampled($newImage$source0000$newWidth$newHeight$width$height);
  1538.                         // Speicher das neue Bild als PNG-Datei
  1539.                         imagepng($newImage'customerdata/new_image.png');
  1540.                         // Lösche die Bilder aus dem Speicher
  1541.                         imagedestroy($source);
  1542.                         imagedestroy($newImage);
  1543.                         $sData base64_encode(file_get_contents('customerdata/new_image.png'));
  1544.                         unlink('customerdata/new_image.png');
  1545.                         // Dateiname ermitteln
  1546.                         $sFileName $request->files->get('zaehlerstandfoto')[$iKey]->getClientOriginalName();
  1547.                         // Dateityp ermitteln
  1548.                         $sFileType $request->files->get('zaehlerstandfoto')[$iKey]->getClientOriginalExtension();
  1549.                         $aTempData[$iKey]["ZS_DOCUMENT".$iDokument]        = $sData;
  1550.                         $aTempData[$iKey]["ZS_FILEFORMAT".$iDokument]      = $sFileType;
  1551.                         $aTempData[$iKey]["ZS_FILEDESCRIPTION".$iDokument] = $sFileName;
  1552.                         $aFotos[$sZaehlerNr]                               = $sData;
  1553.                         $iDokument++;
  1554.                     }
  1555.                 }
  1556.                 // Prüfen ob in den settings der metakey fotoupload auf on steht
  1557.                 $oSettingsFotoPflicht $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "fotouploadpflicht"]);
  1558.                 if($oSettingsFotoPflicht)
  1559.                 {
  1560.                     if($oSettingsFotoPflicht->getMetavalue() == 0)
  1561.                     {
  1562.                         if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] == 'Anderer Grund')
  1563.                         {
  1564.                             $aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzgrundtext')[$iKey];
  1565.                             $sGrund $request->get('toleranzgrundtext')[$iKey];
  1566.                         }
  1567.                         if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] != 'Anderer Grund')
  1568.                         {
  1569.                             $aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzart')[$iKey];
  1570.                             $sGrund $request->get('toleranzart')[$iKey];
  1571.                         }
  1572.                     }
  1573.                 }
  1574.             }
  1575.             else
  1576.             {
  1577.                 if($request->files->get('toleranzart') && array_key_exists($iKey$request->files->get('toleranzart')))
  1578.                 {
  1579.                     if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] == 'Anderer Grund')
  1580.                     {
  1581.                         $aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzgrundtext')[$iKey];
  1582.                         $sGrund $request->get('toleranzgrundtext')[$iKey];
  1583.                     }
  1584.                     if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] != 'Anderer Grund')
  1585.                     {
  1586.                         $aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzart')[$iKey];
  1587.                         $sGrund $request->get('toleranzart')[$iKey];
  1588.                     }
  1589.                 }
  1590.             }
  1591.             $iZaehlerstandNeu str_replace(",",".",$iZaehlerstandNeu);
  1592.             $sMailText .= "Zählernummer: ".$sZaehlerNr."<br>";
  1593.             $sMailText .= "Zählerstand: ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
  1594.             $sMailText .= "Ablesedatum: ".date("d.m.Y",strtotime($dAblesedatum))."<br>";
  1595.             if(!empty($sGrund))
  1596.             {
  1597.                 $sMailText .= "Änderung: ".$sGrund."<br>";
  1598.             }
  1599.             if(!empty($sData))
  1600.             {
  1601.                 $sMailText .= "<img src='data:image/jpeg;base64,".$sData."' alt='Zählerstandfoto'><br>";
  1602.             }
  1603.             $sMailText .= "<br><br>";
  1604.         }
  1605.         if($oClient)
  1606.         {
  1607.             try {
  1608.                 $oResult $oWebservice->sendData($doctrine"ZAEHLER_ERFASS"$sBusinessPartnerNo$aTempData$sAccountNr);
  1609.                 if($oResult->return_value)
  1610.                 {
  1611.                     if($sEmailkontakt)
  1612.                     {
  1613.                         $sTo $sEmailkontakt;
  1614.         
  1615.                         $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1616.                         $sMail      'portal.support@msu-solutions.de';
  1617.                         // $sMail      = 'msu@nvii-dev.com';
  1618.         
  1619.                         if($oAbsender)
  1620.                         {
  1621.                             $sMail trim($oAbsender->getMetavalue());
  1622.                         }
  1623.         
  1624.                         $sStyle     "";
  1625.                         $sFile      "css/email.css";
  1626.         
  1627.                         if(file_exists($sFile))
  1628.                         {
  1629.                             $sStyle file_get_contents($sFile);
  1630.                         }
  1631.         
  1632.                         $sFile      "css/customer.css";
  1633.         
  1634.                         if(file_exists($sFile))
  1635.                         {
  1636.                             $sStyle .= file_get_contents($sFile);
  1637.                         }
  1638.         
  1639.                         $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1640.                         $sAnrede    "Sehr geehrte Damen und Herren";
  1641.                         $oAnrede    $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1642.         
  1643.                         if($oAnrede)
  1644.                         {
  1645.                             $sAnrede $oAnrede->getMetavalue();
  1646.                         }
  1647.         
  1648.                         $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $sBusinessPartnerNo'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals->CustomerInternal;
  1649.         
  1650.                         if(is_array($aResult))
  1651.                         {
  1652.                             $sAnrede $aResult[0]->SalutationFormal;
  1653.                         }
  1654.                         else
  1655.                         {
  1656.                             $sAnrede $aResult->SalutationFormal;
  1657.                         }
  1658.         
  1659.                         $sMail 'portal.support@msu-solutions.de';
  1660.         
  1661.                         if($oAbsender)
  1662.                         {
  1663.                             $sMail trim($oAbsender->getMetavalue());
  1664.                         }
  1665.         
  1666.                         $oMail $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "zaeherstand_gemeldet_nologin"]);
  1667.         
  1668.                         if($oMail)
  1669.                         {
  1670.                             $sSubject   $oMail->getBetreff();
  1671.                             $sSubject   str_replace("#objectno#",$sLeistungsobjektNr$sSubject);
  1672.         
  1673.                             $sThema     $oMail->getInhalt();
  1674.                             $sThema     str_replace("#anrede#",$sAnrede$sThema);
  1675.                             $sThema     str_replace("#objectno#",$sLeistungsobjektNr$sThema);
  1676.                             $sThema     str_replace("#stand#",$sMailText$sThema);
  1677.                         }
  1678.         
  1679.                         $sTo    $sEmailkontakt;
  1680.         
  1681.                         // Mailsignatur
  1682.                         $oInhalte  = new InhalteController();
  1683.                         $sSignatur $oInhalte->getMailSignatur($doctrine);
  1684.         
  1685.                         $oMail = (new TemplatedEmail())
  1686.                             ->from($sMail)
  1687.                             ->to($sTo)
  1688.                             ->subject($sSubject)
  1689.         
  1690.                             // path of the Twig template to render
  1691.                             ->htmlTemplate('emails/zaehlerstandmelden.html.twig')
  1692.         
  1693.                             // pass variables (name => value) to the template
  1694.                             ->context([
  1695.                                 "text" => $sThema,
  1696.                                 "signatur" => $sSignatur,
  1697.                                 "style" => $sStyle
  1698.                             ]);
  1699.         
  1700.                         $loader = new FilesystemLoader('../templates/');
  1701.                         $twigEnv = new Environment($loader);
  1702.                         $twigBodyRenderer = new BodyRenderer($twigEnv);
  1703.                         $twigBodyRenderer->render($oMail);
  1704.         
  1705.                         $oCustomMailer = new MailController();
  1706.                         $oCustomMailer $oCustomMailer->getMailer($doctrine);
  1707.         
  1708.                         try
  1709.                         {
  1710.                             $oCustomMailer->send($oMail);
  1711.                         }
  1712.                         catch(\Exception $exception)
  1713.                         {
  1714.                             $this->addFlash(
  1715.                                 'error',
  1716.                                 "Die Mail konnte leider nicht versendet werden."
  1717.                             );
  1718.                         }
  1719.                     }
  1720.                     $this->addFlash(
  1721.                         'neu',
  1722.                         'Der Zählerstand wurde gesendet.'
  1723.                     );
  1724.         
  1725.                     $bDrucken true;
  1726.                 }
  1727.                 else
  1728.                 {
  1729.                     $this->addFlash(
  1730.                         'error',
  1731.                         'Ihr Zählerstand wurde nicht Ã¼bertragen.'
  1732.                     );
  1733.                 }
  1734.             } catch (\Throwable $th) {
  1735.                 $this->addFlash(
  1736.                     'error',
  1737.                     'Ihr Zählerstand wurde nicht Ã¼bertragen. Bitte versuchen Sie es später erneut.'
  1738.                 );
  1739.             }
  1740.     
  1741.             $session = new Session();
  1742.     
  1743.             $session->set('zaehler',$aZaehlernummern);
  1744.             $session->set('staende',$request->get('zaehlerstandneu'));
  1745.             $session->set('ablesedatum',$request->get('ablesedatum'));
  1746.             $session->set('einheit',$request->get('einheit'));
  1747.             $session->set('fotos',$aFotos);
  1748.             $session->set('toleranzart',$request->get('toleranzart'));
  1749.             $session->set('toleranzarttext',$request->get('toleranzgrundtext'));
  1750.     
  1751.             return $this->redirectToRoute('login',["drucken" => $bDrucken]);
  1752.         }
  1753.         else
  1754.         {
  1755.             $this->addFlash(
  1756.                 'error',
  1757.                 'Die Ãœbermittlung Ihres Zählerstands ist zur Zeit nicht möglich. Bitte versuchen Sie es später erneut.'
  1758.             );
  1759.             return $this->redirectToRoute('login');
  1760.         }
  1761.     }
  1762.     #[Route('/login/twofa/'name'login_twofa')]
  1763.     public function logintwofa(Request $requestMailerInterface $mailerEntityManagerInterface $entityManagerManagerRegistry $doctrine)
  1764.     {
  1765.         if($request->get('emailtwofa'))
  1766.         {
  1767.             $session            = new Session();
  1768.             $session->set('email'$request->get('emailtwofa'));
  1769.             $session->set('passwordtwofa'$request->get('passwordtwofa'));
  1770.             
  1771.             $oUser $doctrine->getRepository(User::class)->findOneBy(["email" => $request->get('emailtwofa')]);
  1772.             if(!$oUser)
  1773.             {                
  1774.                 return $this->redirectToRoute('login');
  1775.             }
  1776.             // Prüfung Token-Laufzeit
  1777.             $sTokenDuration          $oUser->getTokenduration();
  1778.             $sTokenDurationTimestamp strtotime("- 120 minutes"strtotime($sTokenDuration));
  1779.             
  1780.             if(time() > $sTokenDurationTimestamp)
  1781.             {
  1782.                 $oWebservice        = new WebserviceController();
  1783.                 $oClient            null;
  1784.     
  1785.                 if($oWebservice->checkWsConnection($doctrine))
  1786.                 {
  1787.                     $oClient $oWebservice->getClient($doctrine);
  1788.                 }
  1789.                 
  1790.                 $aTemp       = array();
  1791.                 $sTo         $request->get('emailtwofa');
  1792.                 $sAnrede     "Sehr geehrte Damen und Herren";
  1793.                 $oAnrede     $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1794.     
  1795.                 if($oAnrede)
  1796.                 {
  1797.                     $sAnrede $oAnrede->getMetavalue();
  1798.                 }
  1799.     
  1800.                 // Mailsignatur
  1801.                 $oInhalte  = new InhalteController();
  1802.                 $sSignatur $oInhalte->getMailSignatur($doctrine);
  1803.     
  1804.                 $sTokenDuration 3600;
  1805.                 $sTokenLength   12;
  1806.     
  1807.                 $oTokenDuration $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_duration"]);
  1808.                 $oTokenLength   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_length"]);
  1809.     
  1810.                 if ($oTokenDuration)
  1811.                 {
  1812.                     $sTokenDuration = (int) $oTokenDuration->getMetavalue();
  1813.                 }
  1814.     
  1815.                 if ($oTokenLength)
  1816.                 {
  1817.                     $sTokenLength = (int) $oTokenLength->getMetavalue();
  1818.                 }
  1819.     
  1820.                 if(empty($sTokenDuration))
  1821.                 {
  1822.                     $sTokenDuration 3600;
  1823.                 }
  1824.     
  1825.                 if(empty($sTokenLength))
  1826.                 {
  1827.                     $sTokenLength 12;
  1828.                 }
  1829.     
  1830.                 $sTokenDuration $sTokenDuration 60;
  1831.                 $sTokenDuration += 120;
  1832.                 $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$sTokenDuration." minutes"time()));
  1833.     
  1834.                 // Mailvorlage
  1835.                 $aMailvorlage $doctrine->getRepository(Mailtexte::class)->findAll();
  1836.                 $aTemp = array();
  1837.     
  1838.                 foreach ($aMailvorlage as $iKey => $oSetting) {
  1839.                     $aTemp[$oSetting->getMetakey()] = $oSetting;
  1840.                 }
  1841.     
  1842.                 $aMailvorlage $aTemp;
  1843.     
  1844.                 $sAnrede  "Sehr geehrte Damen und Herrren";
  1845.                 
  1846.                 if(in_array("ROLE_ADMIN",$oUser->getRoles()))
  1847.                 {
  1848.                     $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1849.     
  1850.                     if($oAnrede)
  1851.                     {
  1852.                         $sAnrede $oAnrede->getMetavalue();
  1853.                     }
  1854.                 }
  1855.                 else
  1856.                 {
  1857.                     if($oClient)
  1858.                     {
  1859.                         $aResult         $oClient->GetCustomerInternalsByNo(array('p_No' => $oUser->getKundennummer(), 'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals->CustomerInternal;
  1860.         
  1861.                         if(is_array($aResult))
  1862.                         {
  1863.                             $sAnrede $aResult[0]->SalutationFormal;
  1864.                         }
  1865.                         else
  1866.                         {
  1867.                             $sAnrede $aResult->SalutationFormal;
  1868.                         }
  1869.                     }
  1870.                 }
  1871.     
  1872.                 $sHash substr(md5(time()), 05);
  1873.     
  1874.                 $oUser->setHash($sHash);
  1875.                 $oUser->setTokenduration($sTokenDuration);
  1876.     
  1877.                 $entityManager->persist($oUser);
  1878.                 $entityManager->flush();
  1879.     
  1880.                 $sSubject  $aMailvorlage["token_sendet"]->getBetreff();
  1881.                 $sMailBody $aMailvorlage["token_sendet"]->getInhalt();
  1882.                 $sAbsender $aMailvorlage["token_sendet"]->getAbsender();
  1883.     
  1884.                 if(empty($sAbsender))
  1885.                 {
  1886.                     $oAbsender $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1887.     
  1888.                     if($oAbsender)
  1889.                     {
  1890.                         $sAbsender trim($oAbsender->getMetavalue());
  1891.                     }
  1892.                 }
  1893.     
  1894.                 $sReplacedMailBody str_replace(array(
  1895.                     "#anrede#""#code#""#tokenduration#"
  1896.                 ), array(
  1897.                     $sAnrede$sHash$sTokenDuration
  1898.                 ), $sMailBody);
  1899.     
  1900.                 $sStyle     "";
  1901.                 $sFile      "css/email.css";
  1902.     
  1903.                 if(file_exists($sFile))
  1904.                 {
  1905.                     $sStyle file_get_contents($sFile);
  1906.                 }
  1907.     
  1908.                 $sFile      "css/customer.css";
  1909.     
  1910.                 if(file_exists($sFile))
  1911.                 {
  1912.                     $sStyle .= file_get_contents($sFile);
  1913.                 }
  1914.     
  1915.                 $oSystem    $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  1916.     
  1917.                 $oMail = (new TemplatedEmail())
  1918.                     ->from($sAbsender)
  1919.                     ->to($sTo)
  1920.                     ->subject($sSubject)
  1921.                     // path of the Twig template to render
  1922.                     ->htmlTemplate('emails/twofa.html.twig')
  1923.     
  1924.                     // pass variables (name => value) to the template
  1925.                     ->context([
  1926.                         "context" => $sReplacedMailBody,
  1927.                         "betreff" => $sSubject,
  1928.                         "signatur" => $sSignatur,
  1929.                         "style" => $sStyle,
  1930.                         "system" => $oSystem->getMetavalue()
  1931.                     ]);
  1932.     
  1933.                 $loader             = new FilesystemLoader('../templates/');
  1934.                 $twigEnv            = new Environment($loader);
  1935.                 $twigBodyRenderer   = new BodyRenderer($twigEnv);
  1936.                 $twigBodyRenderer->render($oMail);
  1937.     
  1938.                 $oMailer  = new MailController();
  1939.                 $oMailer  $oMailer->getMailer($doctrine);
  1940.     
  1941.                 $session = new Session();
  1942.                 $session->set("emailtwofa",$request->get('emailtwofa'));
  1943.                 $session->set("pwtwofa",$request->get('pwtwofa'));
  1944.     
  1945.                 try
  1946.                 {
  1947.                     $oMailer->send($oMail);
  1948.     
  1949.                     $this->addFlash(
  1950.                         'neu',
  1951.                         'Wir haben Ihnen einen Logincode per E-Mail zugesendet.'
  1952.                     );
  1953.                 }
  1954.                 catch(\Exception $exception)
  1955.                 {
  1956.                     $this->addFlash(
  1957.                         'error',
  1958.                         "Die Mail konnte leider nicht versendet werden."
  1959.                     );
  1960.                 }
  1961.             }
  1962.         }
  1963.         return $this->redirectToRoute('login',["twofa" => true]);
  1964.     }
  1965. }