src/Controller/LoginController.php line 40

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Auswahllisten;
  4. use App\Entity\Mailtexte;
  5. use App\Entity\Mandanten;
  6. use App\Entity\Portalsettings;
  7. use App\Entity\Settings;
  8. use App\Entity\Texte;
  9. use App\Entity\Unterkonten;
  10. use App\Entity\User;
  11. use DateTime;
  12. use Doctrine\ORM\EntityManager;
  13. use Symfony\Bridge\Twig\Mime\BodyRenderer;
  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\Transport;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  23. use Doctrine\ORM\EntityManagerInterface;
  24. use Doctrine\Persistence\ManagerRegistry;
  25. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  26. use Symfony\Component\Mailer\MailerInterface;
  27. use Symfony\Component\Mime\Email;
  28. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  29. use Symfony\Component\Mime\Address;
  30. use App\Controller\WebserviceController;
  31. use DateInterval;
  32. use Twig\Environment;
  33. use Twig\Loader\FilesystemLoader;
  34. class LoginController extends AbstractController
  35. {
  36.     #[Route('/'name'login')]
  37.     public function index(AuthenticationUtils $authenticationUtilsRequest $requestManagerRegistry $doctrineEntityManagerInterface $entityManager): Response
  38.     {
  39.         $session = new Session();
  40.         // Einstellungen für das Portal je Kunde
  41.         $oTarifrechner     $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "tarifrechner"]);
  42.         $session->set('tarifrechner',false);
  43.         if($oTarifrechner)
  44.         {
  45.             if($oTarifrechner->getMetavalue() == "on")
  46.             {
  47.                 $session->set('tarifrechner',true);
  48.             }
  49.         }
  50.         // Einstellungen für das Portal je Kunde
  51.         $oZugangbeantragen $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "textzugangbeantragen"]);
  52.         $session->set('textzugangbeantragen',false);
  53.         if($oZugangbeantragen)
  54.         {
  55.             if($oZugangbeantragen->getMetavalue() == "on")
  56.             {
  57.                 $session->set('textzugangbeantragen',true);
  58.             }
  59.         }
  60.         $oNutzerkontenverwaltung $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "nutzkontenverwaltung"]);
  61.         $session->set('nutzerkontenverwaltung',false);
  62.         if($oNutzerkontenverwaltung)
  63.         {
  64.             if($oNutzerkontenverwaltung->getMetavalue() == 1)
  65.             {
  66.                 $session->set('nutzerkontenverwaltung',true);
  67.             }
  68.         }
  69.         $o2FA               $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "2fa"]);
  70.         $aZustellarten      = array("Abruf im Kundenportal""Zustellung per E-Mail");
  71.         $aAuswahllisten     $doctrine->getRepository(Auswahllisten::class)->findBy(["type" => "abschlagsaenderung"]);
  72.         $oLinkImpressum     $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "impressum"]);
  73.         $oAuthMethode       $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "authentifizierung"]);
  74.         $sImpressum         "";
  75.         $sPortalvariante    "";
  76.         $sTargetAction      "";
  77.         #$sRoute             = $request->get("origin_route") ? trim($request->get("origin_route")) : '';
  78.         #$aReturn            = array();
  79.         $sAuthMethode "";
  80.         if ($oAuthMethode)
  81.         {
  82.             $sAuthMethode $oAuthMethode->getMetavalue();
  83.         }
  84.         if ($oLinkImpressum)
  85.         {
  86.             $sImpressum $oLinkImpressum->getMetavalue();
  87.         }
  88.         $oLinkDatenschutz $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "datenschutz"]);
  89.         $sDatenschutz     "";
  90.         if ($oLinkDatenschutz) {
  91.             $sDatenschutz $oLinkDatenschutz->getMetavalue();
  92.         }
  93.         $oLinkBarrierefreiheit $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheit"]);
  94.         $sBarrierefreiheit     "";
  95.         if ($oLinkBarrierefreiheit) {
  96.             $sBarrierefreiheit $oLinkBarrierefreiheit->getMetavalue();
  97.         }
  98.         // Zählerstand online start
  99.         $oZaehlerstandOnlineStart $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlstand_online_start"]);
  100.         $sZaehlerstandOnlineStart     "";
  101.         if ($oZaehlerstandOnlineStart) {
  102.             $sZaehlerstandOnlineStart $oZaehlerstandOnlineStart->getMetavalue();
  103.         }
  104.         // Zählerstand online ende
  105.         $oZaehlerstandOnlineEnd $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlstand_online_ende"]);
  106.         $sZaehlerstandOnlineEnd     "";
  107.         if ($oZaehlerstandOnlineEnd) {
  108.             $sZaehlerstandOnlineEnd $oZaehlerstandOnlineEnd->getMetavalue();
  109.         }
  110.         $bZaehlerstandOnline false;
  111.         if (time() > strtotime($sZaehlerstandOnlineStart) && time() < strtotime($sZaehlerstandOnlineEnd))
  112.         {
  113.             $bZaehlerstandOnline true;
  114.         }
  115.         if (!$request->getSession()) {
  116.             $session->start();
  117.         }
  118.         $oLogo $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  119.         if ($oLogo) {
  120.             $session->set('logo'$oLogo->getMetavalue());
  121.         } else {
  122.             $session->set('logo''');
  123.         }
  124.         $oAbmelden $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "abmelden"]);
  125.         if ($oAbmelden) {
  126.             $session->set('abmelden'$oAbmelden->getMetavalue());
  127.         } else {
  128.             $session->set('abmelden''Abmelden');
  129.         }
  130.         $oWartung        $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "wartungsarbeiten"]);
  131.         $oOffline        $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "portalonline"]);
  132.         $oPortalvariante $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "portalvariante"]);
  133.         if ($oPortalvariante)
  134.         {
  135.             if ($oPortalvariante->getMetavalue() == "zaehlerstand")
  136.             {
  137.                 $sTargetAction 'zaehlerstand_melden';
  138.             }
  139.             else if ($oPortalvariante->getMetavalue() == "komplett")
  140.             {
  141.                 $sTargetAction 'komplett';
  142.             }
  143.             $sPortalvariante $oPortalvariante->getMetavalue();
  144.         }
  145.         // Wartungsarbeiten
  146.         $bWartung false;
  147.         if ($oWartung->getMetavalue() == "on")
  148.         {
  149.             $bWartung true;
  150.         }
  151.         // Portal online/offline
  152.         $bOnline false;
  153.         if ($oOffline->getMetavalue() == "on")
  154.         {
  155.             $bOnline true;
  156.         }
  157.         if ($this->getUser()) {
  158.             if (in_array("ROLE_ADMIN"$this->getUser()->getRoles())) {
  159.                 $session->set('nutzername'"AD");
  160.                 if (!empty($request->get('edit'))) {
  161.                     $aReturn = array(
  162.                         'zustellarten'    => $aZustellarten,
  163.                         'impressum' => $sImpressum,
  164.                         'datenschutz' => $sDatenschutz,
  165.                         'barrierefreiheit' => $sBarrierefreiheit,
  166.                         'auswahllisten' => $aAuswahllisten,
  167.                         'error' => '',
  168.                         'neu' => '',
  169.                         'twofa' => '',
  170.                     );
  171.                     return $this->render('login/index.html.twig'$aReturn);
  172.                 }
  173.                 $session->set('webservice'true);
  174.                 $oLogo $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  175.                 if ($oLogo) {
  176.                     $session->set('logo'$oLogo->getMetavalue());
  177.                 }
  178.                 return $this->redirectToRoute('dashboard');
  179.             } else {
  180.                 $oWebservice = new WebserviceController();
  181.                 $oClient     $oWebservice->getClient($doctrine);
  182.                 $oUser       $doctrine->getRepository(User::class)->find($this->getUser()->getId());
  183.                 $iCustomerId $oUser->getKundennummer();
  184.                 $oConnection $oClient->SoundCheck(array('p_Text' => 'Webportal-Connection Test'));
  185.                 if ($oConnection->return_value == "Hello World Webportal-Connection Test") {
  186.                     #$aUserdata = $oClient->GetCustomerInternalsByNo(array('p_No' => $iCustomerId, 'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals->CustomerInternal;
  187.                     #$sFirst = substr($aUserdata->Name, 0, 1);
  188.                     #$sLast = substr($aUserdata->Name2, 0, 1);
  189.                     #$session->set('nutzername', $sFirst . "" . $sLast);
  190.                     #$session->set('name', $aUserdata->Name . " " . $aUserdata->Name2);
  191.                     #$session->set('webservice', true);
  192.                 } else {
  193.                     $session->set('webservice'false);
  194.                 }
  195.                 return $this->redirectToRoute('vertraege', ["code" => $request->get('code')]);
  196.             }
  197.         }
  198.         // get the login error if there is one
  199.         $error $authenticationUtils->getLastAuthenticationError();
  200.         // last username entered by the user
  201.         $lastUsername $authenticationUtils->getLastUsername();
  202.         $aTexte $doctrine->getRepository(Texte::class)->findAll();
  203.         $aTemp  = array();
  204.         foreach($aTexte as $iKey => $oText)
  205.         {
  206.             $aTemp[$oText->getMetakey()] = $oText->getMetavalue();
  207.         }
  208.         $aTexte $aTemp;
  209.         if(!array_key_exists("portalname",$aTexte))
  210.         {
  211.             $aTexte["portalname"] = "Energieportal";
  212.         }
  213.         $session->set('texte',$aTexte);
  214.         $aReturn = array(
  215.             'controller_name' => 'LoginController',
  216.             'last_username' => $lastUsername,
  217.             'error'         => $error,
  218.             'zustellarten'    => $aZustellarten,
  219.             'impressum' => $sImpressum,
  220.             'datenschutz' => $sDatenschutz,
  221.             'barrierefreiheit' => $sBarrierefreiheit,
  222.             'auswahllisten' => $aAuswahllisten,
  223.             'wartungsarbeiten' => $bWartung,
  224.             'online' => $bOnline,
  225.             'target_action' => $request->get('target_action') ? $request->get('target_action') : $sTargetAction,
  226.             'portalvariante' => $sPortalvariante,
  227.             'zaehlerstand_online' => $bZaehlerstandOnline,
  228.             'authmethode' => $sAuthMethode,
  229.             'texte' => $aTexte
  230.         );
  231.         $b2FA false;
  232.         // 2FA
  233.         if ($o2FA->getMetavalue())
  234.         {
  235.             if ($o2FA->getMetavalue() == "on")
  236.             {
  237.                 $b2FA true;
  238.             }
  239.         }
  240.         $aReturn["twofa"] = $b2FA;
  241.         // Anzeige drucken Dialog
  242.         if ($request->get('drucken')) {
  243.             $aReturn["drucken"]     = true;
  244.             $aReturn["zaehler"]     = $request->get('zaehler');
  245.             $aReturn["ablesedatum"] = $request->get('ablesedatum');
  246.             $aReturn["ablesestand"] = $request->get('ablesestand');
  247.         }
  248.         return $this->render('login/index.html.twig'$aReturn);
  249.     }
  250.     #[Route('/admin'name'login_admin')]
  251.     public function loginAdmin(AuthenticationUtils $authenticationUtilsRequest $requestManagerRegistry $doctrineEntityManagerInterface $entityManager): Response
  252.     {
  253.         $aReturn = array();
  254.         // if ($request->get('origin_route') && $request->get('origin_route') == 'admin' || $this->getUser()) {
  255.         //     $this->index($authenticationUtils, $request, $doctrine, $entityManager, "admin");
  256.         // }
  257.         $aReturn['error'] = "";
  258.         return $this->render('login/index_admin.html.twig'$aReturn);
  259.     }
  260.     #[Route('/passwort-vergessen/'name'passwort-vergessen')]
  261.     public function passwordForget(Request $requestMailerInterface $mailerManagerRegistry $doctrineEntityManagerInterface $entityManager,  UserPasswordHasherInterface $userPasswordHasher)
  262.     {
  263.         if ($this->getUser()) {
  264.             return $this->redirectToRoute('dashboard');
  265.         }
  266.         $oLinkImpressum     $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "impressum"]);
  267.         $sImpressum         "";
  268.         if ($oLinkImpressum) {
  269.             $sImpressum $oLinkImpressum->getMetavalue();
  270.         }
  271.         $oLinkDatenschutz $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "datenschutz"]);
  272.         $sDatenschutz     "";
  273.         if ($oLinkDatenschutz) {
  274.             $sDatenschutz $oLinkDatenschutz->getMetavalue();
  275.         }
  276.         $oLinkBarrierefreiheit $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheit"]);
  277.         $sBarrierefreiheit     "";
  278.         if ($oLinkBarrierefreiheit) {
  279.             $sBarrierefreiheit $oLinkBarrierefreiheit->getMetavalue();
  280.         }
  281.         $aTexte $doctrine->getRepository(Texte::class)->findAll();
  282.         $aTemp  = array();
  283.         foreach($aTexte as $iKey => $oText)
  284.         {
  285.             $aTemp[$oText->getMetakey()] = $oText->getMetavalue();
  286.         }
  287.         $aTexte $aTemp;
  288.         if(!array_key_exists("portalname",$aTexte))
  289.         {
  290.             $aTexte["portalname"] = "Energieportal";
  291.         }
  292.         $session = new Session();
  293.         $session->set('texte',$aTexte);
  294.         if ($request->get('email'))
  295.         {
  296.             $oWebservice     = new WebserviceController();
  297.             $oClient         $oWebservice->getClient($doctrine);
  298.             $user            $doctrine->getRepository(user::class)->findOneBy(["email" => $request->get('email')]);
  299.             if(!$user)
  300.             {
  301.                 $this->addFlash(
  302.                     'error',
  303.                     "Die Mailadresse ist nicht korrekt."
  304.                 );
  305.                 return $this->redirectToRoute('passwort-vergessen');
  306.             }
  307.             $iCustomerId $user->getKundennummer();
  308.             $oSystem    $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  309.             $sStyle     "";
  310.             $sFile      "css/email.css";
  311.             if(file_exists($sFile))
  312.             {
  313.                 $sStyle file_get_contents($sFile);
  314.             }
  315.             $sFile      "css/customer.css";
  316.             if(file_exists($sFile))
  317.             {
  318.                 $sStyle .= file_get_contents($sFile);
  319.             }
  320.             $sSignatur "Mit freundlichen Grüßen, Ihr Stadtwerk";
  321.             $oSignatur $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Signatur"]);
  322.             if ($oSignatur)
  323.             {
  324.                 $sSignatur $oSignatur->getMetavalue();
  325.             }
  326.             $sAnrede "Sehr geehrte Damen und Herren";
  327.             $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  328.             if($oAnrede)
  329.             {
  330.                 $sAnrede $oAnrede->getMetavalue();
  331.             }
  332.             if (!$user) {
  333.                 return $this->render('login/password-lost.html.twig', ['info' => '''error' => "Bitte prüfen Sie Ihre Eingabe."]);
  334.             }
  335.             // Ermitteln der Daten zum BusinessPartner
  336.             $aBusinessDaten $oClient->GetBusinessPartnersByNo(array(
  337.                 "p_No" => $iCustomerId,
  338.                 "v_ExportBusinessPartners" => 1
  339.             ));
  340.             if (is_array($aBusinessDaten->v_ExportBusinessPartners->BusinessPartner)) {
  341.                 $oBusinessPartner       $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner[0];
  342.             } else {
  343.                 $oBusinessPartner       $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner;
  344.             }
  345.             // Anrede ermitteln
  346.             if ($oBusinessPartner && $oBusinessPartner->SalutationFormal) {
  347.                 $sAnrede $oBusinessPartner->SalutationFormal;
  348.             }
  349.             $sHash substr(md5(time()), 010);
  350.             $user->setHash($sHash);
  351.             $entityManager->persist($user);
  352.             $entityManager->flush();
  353.             $sLink  "<a href='https://" $_SERVER['SERVER_NAME'] . "/passwort-vergessen/?hash=" $sHash."'>Passwort zurücksetzen</a>";
  354.             $sTo    $request->get('email');
  355.             $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "smtp_user"]);
  356.             $sMail      'portal.support@msu-solutions.de';
  357.             if($oAbsender)
  358.             {
  359.                 $sMail $oAbsender->getMetavalue();
  360.             }
  361.             $sText      "";
  362.             $sSubject   "Passwort vergessen";
  363.             $oText $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "pw_change_request"]);
  364.             if ($oText)
  365.             {
  366.                 $sText      $oText->getInhalt();
  367.                 $sText      str_replace("#anrede#",$sAnrede,$sText);
  368.                 $sSubject   $oText->getBetreff();
  369.             }
  370.             $sText str_replace("#link#",$sLink,$sText);
  371.             $email = (new TemplatedEmail())
  372.                 ->from($sMail)
  373.                 ->to($sTo)
  374.                 ->subject($sSubject)
  375.                 // path of the Twig template to render
  376.                 ->htmlTemplate('emails/password.html.twig')
  377.                 // pass variables (name => value) to the template
  378.                 ->context([
  379.                     "anrede" => $sAnrede,
  380.                     "text" => $sText,
  381.                     "style" => $sStyle,
  382.                     "system" => $oSystem->getMetavalue(),
  383.                     "signatur" => $sSignatur
  384.                 ]);
  385.             try
  386.             {
  387.                 $mailer->send($email);
  388.             }
  389.             catch(\Exception $exception)
  390.             {
  391.                 $this->addFlash(
  392.                     'error',
  393.                     "Die Mail konnte leider nicht versendet werden."
  394.                 );
  395.             }
  396.             return $this->render('login/password-lost.html.twig', ['info' => 'Die Mail wurde versendet.''error' => "",  'impressum' => $sImpressum,
  397.                 'datenschutz' => $sDatenschutz'barrierefreiheit' => $sBarrierefreiheit'texte' => $aTexte]);
  398.         }
  399.         if ($request->get('hash'))
  400.         {
  401.             $sHash $request->get('hash');
  402.             $user $doctrine->getRepository(user::class)->findOneBy(["hash" => $sHash]);
  403.             if ($user)
  404.             {
  405.                 return $this->render('login/password-lost.html.twig', ['error' => ""'newpassword' => $request->get('hash'), 'texte' => $aTexte]);
  406.             }
  407.             else
  408.             {
  409.                 return $this->render('login/password-lost.html.twig', ['error' => "",'texte' => $aTexte]);
  410.             }
  411.         }
  412.         if ($request->get('password-first') == $request->get('password-second') and !empty($request->get('password-first')))
  413.         {
  414.             $oWebservice     = new WebserviceController();
  415.             $oClient         $oWebservice->getClient($doctrine);
  416.             $user            $doctrine->getRepository(user::class)->findOneBy(["hash" => $request->get("newhash")]);
  417.             $iCustomerId     $user->getKundennummer();
  418.             $user->setPassword(
  419.                 $userPasswordHasher->hashPassword(
  420.                     $user,
  421.                     $request->get('password-first')
  422.                 )
  423.             );
  424.             $user->setHash("");
  425.             $entityManager->persist($user);
  426.             $entityManager->flush();
  427.             $sStyle     "";
  428.             $sFile      "css/email.css";
  429.             if(file_exists($sFile))
  430.             {
  431.                 $sStyle file_get_contents($sFile);
  432.             }
  433.             $sFile      "css/customer.css";
  434.             if(file_exists($sFile))
  435.             {
  436.                 $sStyle .= file_get_contents($sFile);
  437.             }
  438.             $sSignatur "Mit freundlichen Grüßen, Ihr Stadtwerk";
  439.             $oSignatur $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Signatur"]);
  440.             if ($oSignatur)
  441.             {
  442.                 $sSignatur $oSignatur->getMetavalue();
  443.             }
  444.             $sAnrede "Sehr geehrte Damen und Herren";
  445.             $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  446.             if($oAnrede)
  447.             {
  448.                 $sAnrede $oAnrede->getMetavalue();
  449.             }
  450.             if (!$user) {
  451.                 return $this->render('login/password-lost.html.twig', ['info' => '''error' => "Bitte prüfen Sie Ihre Eingabe."'texte' => $aTexte]);
  452.             }
  453.             // Ermitteln der Daten zum BusinessPartner
  454.             $aBusinessDaten $oClient->GetBusinessPartnersByNo(array(
  455.                 "p_No" => $iCustomerId,
  456.                 "v_ExportBusinessPartners" => 1
  457.             ));
  458.             if (is_array($aBusinessDaten->v_ExportBusinessPartners->BusinessPartner)) {
  459.                 $oBusinessPartner       $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner[0];
  460.             } else {
  461.                 $oBusinessPartner       $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner;
  462.             }
  463.             // Anrede ermitteln
  464.             if ($oBusinessPartner && $oBusinessPartner->SalutationFormal) {
  465.                 $sAnrede $oBusinessPartner->SalutationFormal;
  466.             }
  467.             $sHash substr(md5(time()), 010);
  468.             $user->setHash($sHash);
  469.             $entityManager->persist($user);
  470.             $entityManager->flush();
  471.             $sTo        $request->get('email');
  472.             $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "smtp_user"]);
  473.             $sMail      'portal.support@msu-solutions.de';
  474.             if(empty($sTo))
  475.             {
  476.                 $sTo $user->getEmail();
  477.             }
  478.             if($oAbsender)
  479.             {
  480.                 $sMail $oAbsender->getMetavalue();
  481.             }
  482.             $sText      "";
  483.             $sSubject   "Passwort geändert";
  484.             $oText $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "pw_changed"]);
  485.             if ($oText)
  486.             {
  487.                 $sText      $oText->getInhalt();
  488.                 $sText      str_replace("#anrede#",$sAnrede,$sText);
  489.                 $sSubject   $oText->getBetreff();
  490.             }
  491.             $email = (new TemplatedEmail())
  492.                 ->from($sMail)
  493.                 ->to($sTo)
  494.                 ->subject($sSubject)
  495.                 // path of the Twig template to render
  496.                 ->htmlTemplate('emails/passwordchanged.html.twig')
  497.                 // pass variables (name => value) to the template
  498.                 ->context([
  499.                     "text" => $sText,
  500.                     "style" => $sStyle,
  501.                     "signatur" => $sSignatur
  502.                 ]);
  503.             try
  504.             {
  505.                 $mailer->send($email);
  506.             }
  507.             catch(\Exception $exception)
  508.             {
  509.                 $this->addFlash(
  510.                     'error',
  511.                     "Die Mail konnte leider nicht versendet werden."
  512.                 );
  513.             }
  514.             return $this->render('login/index.html.twig', ['info' => 'Das Passwort wurde gespeichert. Sie können sich nun anmelden.''error' => '''texte' => $aTexte]);
  515.         }
  516.         return $this->render('login/password-lost.html.twig',['impressum' => $sImpressum'datenschutz' => $sDatenschutz'barrierefreiheit' => $sBarrierefreiheit'texte' => $aTexte]);
  517.     }
  518.     #[Route('/zugangbeantragen/'name'zugangbeantragen')]
  519.     public function addUser(Request $requestUserPasswordHasherInterface $userPasswordHasherMailerInterface $mailerEntityManagerInterface $entityManagerManagerRegistry $doctrine)
  520.     {
  521.         $session        = new Session();
  522.         $oClient        = new WebserviceController();
  523.         $iMandantenId   "";
  524.         if(!empty($session->get('mandantenid')))
  525.         {
  526.             $oMandant       $doctrine->getRepository(Mandanten::class)->find($session->get('mandantenid'));
  527.             $oClient        $oClient->getClient($doctrine$oMandant->getWsmandant());
  528.             $iMandantenId   $session->get('mandantenid');
  529.         }
  530.         else
  531.         {
  532.             $oClient     $oClient->getClient($doctrine);
  533.         }
  534.         $aMailvorlage $doctrine->getRepository(Mailtexte::class)->findAll();
  535.         $aTemp = array();
  536.         $sAnrede "Sehr geehrte Damen und Herren";
  537.         $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  538.         if($oAnrede)
  539.         {
  540.             $sAnrede $oAnrede->getMetavalue();
  541.         }
  542.         foreach ($aMailvorlage as $iKey => $oSetting)
  543.         {
  544.             $aTemp[$oSetting->getMetakey()] = $oSetting;
  545.         }
  546.         $aMailvorlage $aTemp;
  547.         if ($request->get('email') && $request->get('passwort'))
  548.         {
  549.             $sKundennummer          $request->get('kundennummer');
  550.             $sLeistungsobjektnummer $request->get('leistungsobjektnummer');
  551.             // Abruf Webservice zum Prüfen, ob Kundennummer und Leistungsobjektnummer vorhanden sind
  552.             $oCheckConfig $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "authentifizierung"]);
  553.             if ($oCheckConfig->getMetavalue() == "internal") {
  554.                 $oAuth $oClient->AuthenticateBusinessPartner(
  555.                     array(
  556.                         'p_BusinessPartnerNo' => '',
  557.                         'p_BaseContractNo' => $sKundennummer,
  558.                         'p_MeterNo' => $sLeistungsobjektnummer,
  559.                         'v_ExportBusinessPartners' => array()
  560.                     )
  561.                 );
  562.             } else {
  563.                 $oAuth $oClient->GetBusinessPartnersByNo(array(
  564.                     "p_No" => $sKundennummer,
  565.                     "v_ExportBusinessPartners" => 1
  566.                 ));
  567.             }
  568.             // Nutzerdaten ermitteln
  569.             if ($oAuth && $oAuth->return_value) {
  570.                 $sGeschaeftspartnerNummer $oAuth->v_ExportBusinessPartners->BusinessPartner->No;
  571.                 $oBusinessPartner $oAuth->v_ExportBusinessPartners->BusinessPartner;
  572.             }
  573.             
  574.             // Anrede ermitteln
  575.             if ($oBusinessPartner && $oBusinessPartner->SalutationFormal) {
  576.                 $sAnrede $oBusinessPartner->SalutationFormal;
  577.             }
  578.             // Gibt es den User bzw. Verknüpfung bereits schon
  579.             $oUser          $doctrine->getRepository(User::class)->findOneBy(["kundennummer" => $sGeschaeftspartnerNummer]);
  580.             $oUnterkonto    $doctrine->getRepository(Unterkonten::class)->findOneBy(["unterkontonr" => $sGeschaeftspartnerNummer]);
  581.             if ($oUser || $oUnterkonto)
  582.             {
  583.                 $this->addFlash(
  584.                     'error',
  585.                     'Dieser Zugang existiert bereits. Prüfen Sie ihre Unterkonten.'
  586.                 );
  587.                 return $this->redirectToRoute('login');
  588.             }
  589.             // Token-Lebensdauer und Länge aus den Einstellungen holen
  590.             $sTokenDuration 3600;
  591.             $sTokenLength   12;
  592.             $oTokenDuration $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_duration"]);
  593.             $oTokenLength   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_length"]);
  594.             if ($oTokenDuration)
  595.             {
  596.                 $sTokenDuration = (int)$oTokenDuration->getMetavalue();
  597.             }
  598.             if ($oTokenLength)
  599.             {
  600.                 $sTokenLength = (int)$oTokenLength->getMetavalue();
  601.             }
  602.             if(empty($sTokenDuration))
  603.             {
  604.                 $sTokenDuration 3600;
  605.             }
  606.             if(empty($sTokenLength))
  607.             {
  608.                 $sTokenLength 12;
  609.             }
  610.             #$currentDate = new DateTime();
  611.             #$sTokenDuration = $currentDate->add(new DateInterval('PT' . $sTokenDuration . 'S'))->format('d.m.Y H:i:s');
  612.             $sTokenDuration $sTokenDuration 60;
  613.             $sTokenDuration += 120;
  614.             $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$sTokenDuration." minutes"time()));
  615.             // Signatur
  616.             $sSignatur "Mit freundlichen Grüßen, Ihr Stadtwerk";
  617.             $oSignatur $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Signatur"]);
  618.             if ($oSignatur)
  619.             {
  620.                 $sSignatur $oSignatur->getMetavalue();
  621.             }
  622.             // lokales Nutzerobjekt
  623.             $user = new User();
  624.             $user->setEmail($request->get('email'));
  625.             $user->setRoles(array("ROLE_USER"));
  626.             $user->setZustellart($request->get('zustellart'));
  627.             $user->setAktiv(0);
  628.             $user->setKundennummer($sGeschaeftspartnerNummer);
  629.             $user->setLeistungsobjektnummer($sLeistungsobjektnummer);
  630.             $user->setDatenschutz(1);
  631.             $user->setTokenduration($sTokenDuration);
  632.             $user->setMandantenid($iMandantenId);
  633.             $sHash bin2hex(random_bytes(intval($sTokenLength)));
  634.             $user->setHash($sHash);
  635.             $oKeyLength $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "webid_key_length""type" => "konto"]);
  636.             $iLength    $oKeyLength->getMetavalue();
  637.             $user->setPassword(
  638.                 $userPasswordHasher->hashPassword(
  639.                     $user,
  640.                     $request->get('passwort')
  641.                 )
  642.             );
  643.             $entityManager->persist($user);
  644.             $entityManager->flush();
  645.             // Mailversand
  646.             $sLink          $_SERVER['SERVER_NAME'];
  647.             $sAbsender      $aMailvorlage["zugang_beantragung"]->getAbsender();
  648.             if(empty($sAbsender))
  649.             {
  650.                 $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  651.                 $sAbsender  'portal.support@msu-solutions.de';
  652.                 if($oAbsender)
  653.                 {
  654.                     $sAbsender $oAbsender->getMetavalue();
  655.                 }
  656.             }
  657.             $sStyle     "";
  658.             $sFile      "css/email.css";
  659.             if(file_exists($sFile))
  660.             {
  661.                 $sStyle file_get_contents($sFile);
  662.             }
  663.             $sFile      "css/customer.css";
  664.             if(file_exists($sFile))
  665.             {
  666.                 $sStyle .= file_get_contents($sFile);
  667.             }
  668.             $sUrl '<p class="block text-center"><a href="https://' $sLink '/zugang/aktivieren/' $sHash '/" class="btn">Zugang aktivieren</a></p>';
  669.             $oText $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "zugang_beantragung"]);
  670.             $sText    "Anfrage zur Beantragung eines Zugangs";
  671.             $sSubject "Anfrage";
  672.             if($oText)
  673.             {
  674.                 $sText      $oText->getInhalt();
  675.                 $sText      str_replace("#anrede#",$sAnrede,$sText);
  676.                 $sText      str_replace("#url#",$sUrl,$sText);
  677.                 $sText      str_replace("#tokenduration#",$sTokenDuration,$sText);
  678.                 $sSubject   $oText->getBetreff();
  679.             }
  680.             $oSystem    $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  681.             $email = (new TemplatedEmail())
  682.                 ->from($sAbsender)
  683.                 ->to($request->get('email'))
  684.                 ->subject($sSubject)
  685.                 // path of the Twig template to render
  686.                 ->htmlTemplate('emails/zugang.html.twig')
  687.                 // pass variables (name => value) to the template
  688.                 ->context([
  689.                     "context" => $sText,
  690.                     "betreff" => $sSubject,
  691.                     "style" => $sStyle,
  692.                     "signatur" => $sSignatur,
  693.                     "system" => $oSystem->getMetavalue()
  694.                 ]);
  695.             $loader = new FilesystemLoader('../templates/');
  696.             $twigEnv = new Environment($loader);
  697.             $twigBodyRenderer = new BodyRenderer($twigEnv);
  698.             $twigBodyRenderer->render($email);
  699.             $oCustomMailer = new MailController();
  700.             $oCustomMailer $oCustomMailer->getMailer($doctrine);
  701.             try
  702.             {
  703.                 $this->addFlash(
  704.                     'neu',
  705.                     'Ihr Zugang wurde beantragt. Ihnen wurde ein Mail mit einem Link zum Aktivieren des Zugangs zugesendet.'
  706.                 );
  707.                 $oCustomMailer->send($email);
  708.             }
  709.             catch(\Exception $exception)
  710.             {
  711.                 $this->addFlash(
  712.                     'error',
  713.                     "Die Mail konnte leider nicht versendet werden."
  714.                 );
  715.             }
  716.         }
  717.         return $this->redirectToRoute('login');
  718.     }
  719.     #[Route('/zaehlerstand/{rahmenvertrag}/{zaehlernr}/'name'zaehlerstand_link')]
  720.     public function zaehlerstandlink(Request $requestEntityManagerInterface $entityManagerManagerRegistry $doctrine$rahmenvertrag$zaehlernr)
  721.     {
  722.         $session = new Session();
  723.         if($rahmenvertrag and $zaehlernr)
  724.         {
  725.             $session->set('rahmenvertrag',$rahmenvertrag);
  726.             $session->set('zaehlernr',$zaehlernr);
  727.             return $this->redirectToRoute('login',["rahmenvertrag" => $rahmenvertrag]);
  728.         }
  729.     }
  730.     #[Route('/zugang/aktivieren/{hash}/'name'zugangaktivieren')]
  731.     public function activeAccount(Request $requestUserPasswordHasherInterface $userPasswordHasherMailerInterface $mailerEntityManagerInterface $entityManagerManagerRegistry $doctrine$hash)
  732.     {
  733.         $oWebservice = new WebserviceController();
  734.         $oClient     $oWebservice->getClient($doctrine);
  735.         $oUser $doctrine->getRepository(User::class)->findOneBy(["hash" => $hash]);
  736.         // Prüfung Token-Laufzeit
  737.         if ($oUser) {
  738.             $sTokenDuration          $oUser->getTokenduration();
  739.             $sTokenDurationTimestamp strtotime("- 120 minutes"strtotime($sTokenDuration));
  740.             if (time() > $sTokenDurationTimestamp)
  741.             {
  742.                 $this->addFlash(
  743.                     'error',
  744.                     'Ihr Aktivierungslink ist abgelaufen.'
  745.                 );
  746.                 return $this->redirectToRoute('login');
  747.             }
  748.         }
  749.         if (!$oUser) {
  750.             $this->addFlash(
  751.                 'error',
  752.                 'Der Code ist leider falsch.'
  753.             );
  754.             return $this->redirectToRoute('login');
  755.         } else {
  756.             $iCustomerId $oUser->getKundennummer();
  757.             $iZaehlerNo  $oUser->getLeistungsobjektnummer();
  758.             $aBusinessDaten $oClient->GetBusinessPartnersByNo(array(
  759.                 "p_No" => $iCustomerId,
  760.                 "v_ExportBusinessPartners" => 1
  761.             ));
  762.             if (!$aBusinessDaten || !$aBusinessDaten->return_value) {
  763.                 $this->addFlash(
  764.                     'error',
  765.                     'Ihr Freischaltung konnte nicht durchgeführt werden.'
  766.                 );
  767.                 return $this->redirectToRoute('login');
  768.             }
  769.             if(is_array($aBusinessDaten->v_ExportBusinessPartners->BusinessPartner->BaseContracts->BaseContract))
  770.             {
  771.                 $oBaseContract  $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner->BaseContracts->BaseContract[0];
  772.             }
  773.             else
  774.             {
  775.                 $oBaseContract  $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner->BaseContracts->BaseContract;
  776.             }
  777.             $sBaseContract  $oBaseContract->No;
  778.             $oUser->setAktiv(1);
  779.             $oUser->setHash("");
  780.             $oUser->setTokenduration("");
  781.             $entityManager->persist($oUser);
  782.             $entityManager->flush();
  783.             $aTempData = array(
  784.                 "ZB_GPNUMMER" => $iCustomerId,
  785.                 "ZB_RVERTRAG"     => $sBaseContract,
  786.                 "ZB_ZNUMMER"      => $iZaehlerNo,
  787.                 "ZB_NUTZERNAME"   => $oUser->getEmail(),
  788.                 "ZB_ANMELD_EMAIL" => $oUser->getEmail()
  789.             );
  790.             $aResult $oWebservice->sendData($doctrine"ZUGANG_BEANT"$iCustomerId$sBaseContract$aTempData);
  791.             if (!$aResult->return_value) {
  792.                 $this->addFlash(
  793.                     'error',
  794.                     'Ihr Zugang wurde nicht beantragt.'
  795.                 );
  796.             } else {
  797.                 $this->addFlash(
  798.                     'neu',
  799.                     'Ihre Freischaltung wurde bearbeitet.'
  800.                 );
  801.             }
  802.             return $this->redirectToRoute('login');
  803.         }
  804.     }
  805.     #[Route('/zaehlerstanderfassen/'name'zaehlerstanderfassen')]
  806.     public function zaehlerstanderfassen(Request $requestMailerInterface $mailerEntityManagerInterface $entityManagerManagerRegistry $doctrine)
  807.     {
  808.         $aZaehlernummern    $request->get('zaehlernr');
  809.         $oWebservice        = new WebserviceController();
  810.         $oClient            $oWebservice->getClient($doctrine);
  811.         $sBusinessPartnerNo $request->get('kundennummer');
  812.         $sBaseContractNo    $request->get('basecontractnr');
  813.         $bDrucken           false;
  814.         $sAnrede "Sehr geehrte Damen und Herren";
  815.         $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  816.         if($oAnrede)
  817.         {
  818.             $sAnrede         $oAnrede->getMetavalue();
  819.         }
  820.         $aBusinessDaten $oClient->GetBusinessPartnersByNo(array(
  821.             "p_No" => $sBusinessPartnerNo,
  822.             "v_ExportBusinessPartners" => 1
  823.         ));
  824.         if($aBusinessDaten)
  825.         {
  826.             if (is_array($aBusinessDaten->v_ExportBusinessPartners->BusinessPartner))
  827.             {
  828.                 $sAnrede $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner[0]->SalutationFormal;
  829.             }
  830.             else
  831.             {
  832.                 $sAnrede $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner->SalutationFormal;
  833.             }
  834.         }
  835.         $sEmailkontakt   $request->get('ZS_EMAIL');
  836.         $sTelefonKontakt $request->get('ZS_TEL');
  837.         $aResults        = array();
  838.         $aTempData["ZS_EMAIL"]  = $sEmailkontakt;
  839.         $aTempData["ZS_TEL"]    = $sTelefonKontakt;
  840.         $sTempNr 0;
  841.         $sMailText "";
  842.         $sTempText "";
  843.         foreach($aZaehlernummern as $iKey => $sZaehlerNr)
  844.         {
  845.             if(empty($request->get('zaehlerstandneu')[$iKey]))
  846.             {
  847.                 continue;
  848.             }
  849.             $dAblesedatum     =  $request->get('ablesedatum')[$iKey];
  850.             $iZaehlerstandNeu =  $request->get('zaehlerstandneu')[$iKey];
  851.             $iZaehlerstandNeu =  str_replace(".",",",$iZaehlerstandNeu);
  852.             #$iZaehlerstandAlt =  $request->get('zaehlerstandalt')[$iKey];
  853.             #$iZaehlerstandAlt =  str_replace(".",",",$iZaehlerstandAlt);
  854.             #$iZaehlerNo       =  $request->get('zaehlernr')[$iKey];
  855.             $sCode            "ZS_ACODE_HT";
  856.             $sStand           "ZS_ABLSTAND_HT";
  857.             if($request->get('htnt')[$iKey] == 2)
  858.             {
  859.                 $sCode            "ZS_ACODE_NT";
  860.                 $sStand           "ZS_ABLSTAND_NT";
  861.             }
  862.             if($sTempNr != $sZaehlerNr)
  863.             {
  864.                 // Daten für den Geschäftsvorgang ermitteln
  865.                 $aTempData[$iKey] = array(
  866.                     "ZS_ZNUMMER" => $sZaehlerNr,
  867.                     "ZS_ABLDATUM" => $dAblesedatum,
  868.                     $sCode => $request->get('ZS_METERREGIDX')[$iKey],
  869.                     $sStand => $iZaehlerstandNeu,
  870.                     // "ZS_ACODE_NT" => "2 WIRKARBEIT NT",
  871.                     // "ZS_ABLSTAND_NT" => $request->get('zaehlerstandneu'),
  872.                 );
  873.                 $sTempNr $sZaehlerNr;
  874.             }
  875.             else
  876.             {
  877.                 $iTemp $iKey;
  878.                 $iTemp--;
  879.                 $aTempData[$iTemp][$sCode]  = $request->get('ZS_METERREGIDX')[$iKey];
  880.                 $aTempData[$iTemp][$sStand] = $iZaehlerstandNeu;
  881.             }
  882.             if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] == 'Anderer Grund')
  883.             {
  884.                 $aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzgrundtext')[$iKey];
  885.                 #$sGrund = $request->get('toleranzgrundtext')[$iKey];
  886.             }
  887.             if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] != 'Anderer Grund')
  888.             {
  889.                 $aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzart')[$iKey];
  890.                 #$sGrund = $request->get('toleranzart')[$iKey];
  891.             }
  892.             $sGrund "";
  893.             $iZaehlerstandNeu str_replace(",",".",$iZaehlerstandNeu);
  894.             if($request->get('htnt')[$iKey] == 2)
  895.             {
  896.                 if(!empty($sTempText))
  897.                 {
  898.                     $sMailText "Zählernummer: ".$sZaehlerNr."<br>";
  899.                     $sMailText .= $sTempText;
  900.                     $sMailText .= "Zählerstand (NT): ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
  901.                     $sMailText .= "Ablesedatum: ".date("d.m.Y",strtotime($dAblesedatum))."<br><br>";
  902.                 }
  903.                 $sTempText "Zählerstand (NT): ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
  904.             }
  905.             elseif($request->get('htnt')[$iKey] == 1)
  906.             {
  907.                 if(!empty($sTempText))
  908.                 {
  909.                     $sMailText "Zählernummer: ".$sZaehlerNr."<br>";
  910.                     $sMailText .= $sTempText;
  911.                     $sMailText .= "Zählerstand (HT): ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
  912.                     $sMailText .= "Ablesedatum: ".date("d.m.Y",strtotime($dAblesedatum))."<br><br>";
  913.                 }
  914.                 $sTempText "Zählerstand (HT): ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
  915.             }
  916.             else
  917.             {
  918.                 $sMailText .= "Zählernummer: ".$sZaehlerNr."<br>";
  919.                 $sMailText .= "Zählerstand: ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
  920.                 $sMailText .= "Ablesedatum: ".date("d.m.Y",strtotime($dAblesedatum))."<br><br>";
  921.             }
  922.             if(!empty($sGrund))
  923.             {
  924.                 $sMailText .= "Änderung: ".$sGrund."<br>";
  925.             }
  926.             $sMailText .= "";
  927.         }
  928.         $aResult $oWebservice->sendData($doctrine"ZAEHLER_ERFASS"$sBusinessPartnerNo$sBaseContractNo$aTempData);
  929.         $oSystem    $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  930.         $sStyle     "";
  931.         $sFile      "css/email.css";
  932.         if(file_exists($sFile))
  933.         {
  934.             $sStyle file_get_contents($sFile);
  935.         }
  936.         $sFile      "css/customer.css";
  937.         if(file_exists($sFile))
  938.         {
  939.             $sStyle .= file_get_contents($sFile);
  940.         }
  941.         $sSignatur "Mit freundlichen Grüßen, Ihr Stadtwerk";
  942.         $oSignatur $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Signatur"]);
  943.         if ($oSignatur)
  944.         {
  945.             $sSignatur $oSignatur->getMetavalue();
  946.         }
  947.         if ($aResult->return_value)
  948.         {
  949.             if ($sEmailkontakt)
  950.             {
  951.                 $sTo                $sEmailkontakt;
  952.                 $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  953.                 $sMail      'portal.support@msu-solutions.de';
  954.                 if($oAbsender)
  955.                 {
  956.                     $sMail $oAbsender->getMetavalue();
  957.                 }
  958.                 $oText    $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "send_meter"]);
  959.                 $sText    "Sie haben folgende Zählerstände erfolgreich gemeldet:";
  960.                 $sSubject "Übertragung Zählerstand";
  961.                 if($oText)
  962.                 {
  963.                     $sText      $oText->getInhalt();
  964.                     $sText      str_replace("#anrede#",$sAnrede,$sText);
  965.                     $sText      str_replace("#zaehlerinfos#",$sMailText,$sText);
  966.                     $sSubject   $oText->getBetreff();
  967.                 }
  968.                 $oMail = (new TemplatedEmail())
  969.                     ->from($sMail)
  970.                     ->to($sTo)
  971.                     ->subject($sSubject)
  972.                     // path of the Twig template to render
  973.                     ->htmlTemplate('emails/zaehlerstand.html.twig')
  974.                     // pass variables (name => value) to the template
  975.                     ->context([
  976.                         'anrede' => $sAnrede,
  977.                         'ablesedatum' => $dAblesedatum,
  978.                         'ablesestand' => $iZaehlerstandNeu,
  979.                         'zaehler' => $sZaehlerNr,
  980.                         "system" => $oSystem->getMetavalue(),
  981.                         "signatur" => $sSignatur,
  982.                         "style" => $sStyle,
  983.                         "text" => $sText,
  984.                         "subject" => $sSubject,
  985.                         "zaehlertext" => $sMailText
  986.                     ]);
  987.                 $loader = new FilesystemLoader('../templates/');
  988.                 $twigEnv = new Environment($loader);
  989.                 $twigBodyRenderer = new BodyRenderer($twigEnv);
  990.                 $twigBodyRenderer->render($oMail);
  991.                 $oCustomMailer = new MailController();
  992.                 $oCustomMailer $oCustomMailer->getMailer($doctrine);
  993.                 try
  994.                 {
  995.                     $oCustomMailer->send($oMail);
  996.                 }
  997.                 catch(\Exception $exception)
  998.                 {
  999.                     $this->addFlash(
  1000.                         'error',
  1001.                         "Die Mail konnte leider nicht versendet werden."
  1002.                     );
  1003.                 }
  1004.             }
  1005.             $this->addFlash(
  1006.                 'neu',
  1007.                 'Der Zählerstand wurde gesendet.'
  1008.             );
  1009.             $bDrucken true;
  1010.         }
  1011.         else
  1012.         {
  1013.             $this->addFlash(
  1014.                 'error',
  1015.                 'Ihr Zählerstand wurde nicht übertragen.'
  1016.             );
  1017.         }
  1018.         $session = new Session();
  1019.         $session->set('rahmenvertrag',false);
  1020.         $session->set('zaehlernr',false);
  1021.         $session->set('zaehler',$aZaehlernummern);
  1022.         $session->set('staende',$request->get('zaehlerstandneu'));
  1023.         $session->set('ablesedatum',$request->get('ablesedatum'));
  1024.         $session->set('druckentext',$sMailText);
  1025.         return $this->redirectToRoute('login',["drucken" => $bDrucken]);
  1026.     }
  1027.     #[Route('/login/twofa/'name'login_twofa')]
  1028.     public function logintwofa(Request $requestMailerInterface $mailerEntityManagerInterface $entityManagerManagerRegistry $doctrine)
  1029.     {
  1030.         $session = new Session();
  1031.         if ($request->get('emailtwofa'))
  1032.         {
  1033.             $oWebservice = new WebserviceController();
  1034.             $oClient     $oWebservice->getClient($doctrine);
  1035.             $aTemp       = array();
  1036.             $sTo         $request->get('emailtwofa');
  1037.             $sAnrede "Sehr geehrte Damen und Herren";
  1038.             $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1039.             if($oAnrede)
  1040.             {
  1041.                 $sAnrede $oAnrede->getMetavalue();
  1042.             }
  1043.             $sSignatur "Mit freundlichen Grüßen, Ihr Stadtwerk";
  1044.             // Signatur
  1045.             $oSignatur $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Signatur"]);
  1046.             if ($oSignatur)
  1047.             {
  1048.                 $sSignatur $oSignatur->getMetavalue();
  1049.             }
  1050.             $sTokenDuration 3600;
  1051.             $sTokenLength   12;
  1052.             $oTokenDuration $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_duration"]);
  1053.             $oTokenLength   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_length"]);
  1054.             if ($oTokenDuration)
  1055.             {
  1056.                 $sTokenDuration = (int)$oTokenDuration->getMetavalue();
  1057.             }
  1058.             if ($oTokenLength)
  1059.             {
  1060.                 $sTokenLength = (int)$oTokenLength->getMetavalue();
  1061.             }
  1062.             if(empty($sTokenDuration))
  1063.             {
  1064.                 $sTokenDuration 3600;
  1065.             }
  1066.             if(empty($sTokenLength))
  1067.             {
  1068.                 $sTokenLength 12;
  1069.             }
  1070.             #$currentDate = new DateTime();
  1071.             #$sTokenDuration = $currentDate->add(new DateInterval('PT' . $sTokenDuration . 'S'))->format('d.m.Y H:i:s');
  1072.             $sTokenDuration $sTokenDuration 60;
  1073.             $sTokenDuration += 120;
  1074.             $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$sTokenDuration." minutes"time()));
  1075.  
  1076.             // Mailvorlage
  1077.             $aMailvorlage $doctrine->getRepository(Mailtexte::class)->findAll();
  1078.             $aTemp = array();
  1079.             foreach ($aMailvorlage as $iKey => $oSetting) {
  1080.                 $aTemp[$oSetting->getMetakey()] = $oSetting;
  1081.             }
  1082.             $aMailvorlage $aTemp;
  1083.             $oUser $doctrine->getRepository(User::class)->findOneBy(["email" => $request->get('emailtwofa')]);
  1084.             if(in_array("ROLE_ADMIN",$oUser->getRoles()))
  1085.             {
  1086.                 $sAnrede  "Sehr geehrte Damen und Herrren";
  1087.                 $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1088.                 if($oAnrede)
  1089.                 {
  1090.                     $sAnrede $oAnrede->getMetavalue();
  1091.                 }
  1092.             }
  1093.             else
  1094.             {
  1095.                 // Ermitteln der Daten zum BusinessPartner
  1096.                 $aBusinessDaten $oClient->GetBusinessPartnersByNo(array(
  1097.                     "p_No" => $oUser->getKundennummer(),
  1098.                     "v_ExportBusinessPartners" => 1
  1099.                 ));
  1100.                 if (is_array($aBusinessDaten->v_ExportBusinessPartners->BusinessPartner)) {
  1101.                     $oBusinessPartner       $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner[0];
  1102.                 } else {
  1103.                     $oBusinessPartner       $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner;
  1104.                 }
  1105.                 // Anrede ermitteln
  1106.                 if ($oBusinessPartner && $oBusinessPartner->SalutationFormal) {
  1107.                     $sAnrede $oBusinessPartner->SalutationFormal;
  1108.                 }
  1109.             }
  1110.             if (!$oUser) {
  1111.                 return $this->redirectToRoute('login');
  1112.             }
  1113.             $sHash substr(md5(time()), 05);
  1114.             $oUser->setHash($sHash);
  1115.             $oUser->setTokenduration($sTokenDuration);
  1116.             $entityManager->persist($oUser);
  1117.             $entityManager->flush();
  1118.             $sSubject  $aMailvorlage["2fa"]->getBetreff();
  1119.             $sMailBody $aMailvorlage["2fa"]->getInhalt();
  1120.             $sAbsender $aMailvorlage["2fa"]->getAbsender();
  1121.             if(empty($sAbsender))
  1122.             {
  1123.                 $oAbsender $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1124.                 if($oAbsender)
  1125.                 {
  1126.                     $sAbsender $oAbsender->getMetavalue();
  1127.                 }
  1128.             }
  1129.             $sReplacedMailBody str_replace(array(
  1130.                 "#anrede#""#code#""#tokenduration#"
  1131.             ), array(
  1132.                 $sAnrede$sHash$sTokenDuration
  1133.             ), $sMailBody);
  1134.             $sStyle     "";
  1135.             $sFile      "css/email.css";
  1136.             if(file_exists($sFile))
  1137.             {
  1138.                 $sStyle file_get_contents($sFile);
  1139.             }
  1140.             $sFile      "css/customer.css";
  1141.             if(file_exists($sFile))
  1142.             {
  1143.                 $sStyle .= file_get_contents($sFile);
  1144.             }
  1145.             $oSystem    $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  1146.             $oMail = (new TemplatedEmail())
  1147.                 ->from($sAbsender)
  1148.                 ->to($sTo)
  1149.                 ->subject($sSubject)
  1150.                 // path of the Twig template to render
  1151.                 ->htmlTemplate('emails/twofa.html.twig')
  1152.                 // pass variables (name => value) to the template
  1153.                 ->context([
  1154.                     "context" => $sReplacedMailBody,
  1155.                     "betreff" => $sSubject,
  1156.                     "signatur" => $sSignatur,
  1157.                     "style" => $sStyle,
  1158.                     "system" => $oSystem->getMetavalue()
  1159.                 ]);
  1160.             $loader             = new FilesystemLoader('../templates/');
  1161.             $twigEnv            = new Environment($loader);
  1162.             $twigBodyRenderer   = new BodyRenderer($twigEnv);
  1163.             $twigBodyRenderer->render($oMail);
  1164.             $oMailer  = new MailController();
  1165.             $oMailer  $oMailer->getMailer($doctrine);
  1166.             $session->set("emailtwofa",$request->get('emailtwofa'));
  1167.             $session->set("pwtwofa",$request->get('pwtwofa'));
  1168.             try
  1169.             {
  1170.                 $oMailer->send($oMail);
  1171.                 $this->addFlash(
  1172.                     'neu',
  1173.                     'Wir haben Ihnen einen Logincode per E-Mail zugesendet.'
  1174.                 );
  1175.             }
  1176.             catch(\Exception $exception)
  1177.             {
  1178.                 $this->addFlash(
  1179.                     'error',
  1180.                     "Die Mail konnte leider nicht versendet werden."
  1181.                 );
  1182.             }
  1183.         }
  1184.         return $this->redirectToRoute('login', ["twofa" => true]);
  1185.     }
  1186. }