src/Controller/LoginController.php line 322
<?php
namespace App\Controller;
use App\Entity\Auswahllisten;
use App\Entity\Mailtexte;
use App\Entity\Mandanten;
use App\Entity\Portalsettings;
use App\Entity\Settings;
use App\Entity\Texte;
use App\Entity\Unterkonten;
use App\Entity\User;
use DateTime;
use Doctrine\ORM\EntityManager;
use Symfony\Bridge\Twig\Mime\BodyRenderer;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mime\Address;
use App\Controller\WebserviceController;
use DateInterval;
use Twig\Environment;
use Twig\Loader\FilesystemLoader;
class LoginController extends AbstractController
{
#[Route('/', name: 'login')]
public function index(AuthenticationUtils $authenticationUtils, Request $request, ManagerRegistry $doctrine, EntityManagerInterface $entityManager): Response
{
$session = new Session();
// Einstellungen für das Portal je Kunde
$oTarifrechner = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "tarifrechner"]);
$session->set('tarifrechner',false);
if($oTarifrechner)
{
if($oTarifrechner->getMetavalue() == "on")
{
$session->set('tarifrechner',true);
}
}
// Einstellungen für das Portal je Kunde
$oZugangbeantragen = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "textzugangbeantragen"]);
$session->set('textzugangbeantragen',false);
if($oZugangbeantragen)
{
if($oZugangbeantragen->getMetavalue() == "on")
{
$session->set('textzugangbeantragen',true);
}
}
$oNutzerkontenverwaltung = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "nutzkontenverwaltung"]);
$session->set('nutzerkontenverwaltung',false);
if($oNutzerkontenverwaltung)
{
if($oNutzerkontenverwaltung->getMetavalue() == 1)
{
$session->set('nutzerkontenverwaltung',true);
}
}
$o2FA = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "2fa"]);
$aZustellarten = array("Abruf im Kundenportal", "Zustellung per E-Mail");
$aAuswahllisten = $doctrine->getRepository(Auswahllisten::class)->findBy(["type" => "abschlagsaenderung"]);
$oLinkImpressum = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "impressum"]);
$oAuthMethode = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "authentifizierung"]);
$sImpressum = "";
$sPortalvariante = "";
$sTargetAction = "";
#$sRoute = $request->get("origin_route") ? trim($request->get("origin_route")) : '';
#$aReturn = array();
$sAuthMethode = "";
if ($oAuthMethode)
{
$sAuthMethode = $oAuthMethode->getMetavalue();
}
if ($oLinkImpressum)
{
$sImpressum = $oLinkImpressum->getMetavalue();
}
$oLinkDatenschutz = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "datenschutz"]);
$sDatenschutz = "";
if ($oLinkDatenschutz) {
$sDatenschutz = $oLinkDatenschutz->getMetavalue();
}
$oLinkBarrierefreiheit = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheit"]);
$sBarrierefreiheit = "";
if ($oLinkBarrierefreiheit) {
$sBarrierefreiheit = $oLinkBarrierefreiheit->getMetavalue();
}
// Zählerstand online start
$oZaehlerstandOnlineStart = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlstand_online_start"]);
$sZaehlerstandOnlineStart = "";
if ($oZaehlerstandOnlineStart) {
$sZaehlerstandOnlineStart = $oZaehlerstandOnlineStart->getMetavalue();
}
// Zählerstand online ende
$oZaehlerstandOnlineEnd = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlstand_online_ende"]);
$sZaehlerstandOnlineEnd = "";
if ($oZaehlerstandOnlineEnd) {
$sZaehlerstandOnlineEnd = $oZaehlerstandOnlineEnd->getMetavalue();
}
$bZaehlerstandOnline = false;
if (time() > strtotime($sZaehlerstandOnlineStart) && time() < strtotime($sZaehlerstandOnlineEnd))
{
$bZaehlerstandOnline = true;
}
if (!$request->getSession()) {
$session->start();
}
$oLogo = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
if ($oLogo) {
$session->set('logo', $oLogo->getMetavalue());
} else {
$session->set('logo', '');
}
$oAbmelden = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "abmelden"]);
if ($oAbmelden) {
$session->set('abmelden', $oAbmelden->getMetavalue());
} else {
$session->set('abmelden', 'Abmelden');
}
$oWartung = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "wartungsarbeiten"]);
$oOffline = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "portalonline"]);
$oPortalvariante = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "portalvariante"]);
if ($oPortalvariante)
{
if ($oPortalvariante->getMetavalue() == "zaehlerstand")
{
$sTargetAction = 'zaehlerstand_melden';
}
else if ($oPortalvariante->getMetavalue() == "komplett")
{
$sTargetAction = 'komplett';
}
$sPortalvariante = $oPortalvariante->getMetavalue();
}
// Wartungsarbeiten
$bWartung = false;
if ($oWartung->getMetavalue() == "on")
{
$bWartung = true;
}
// Portal online/offline
$bOnline = false;
if ($oOffline->getMetavalue() == "on")
{
$bOnline = true;
}
if ($this->getUser()) {
if (in_array("ROLE_ADMIN", $this->getUser()->getRoles())) {
$session->set('nutzername', "AD");
if (!empty($request->get('edit'))) {
$aReturn = array(
'zustellarten' => $aZustellarten,
'impressum' => $sImpressum,
'datenschutz' => $sDatenschutz,
'barrierefreiheit' => $sBarrierefreiheit,
'auswahllisten' => $aAuswahllisten,
'error' => '',
'neu' => '',
'twofa' => '',
);
return $this->render('login/index.html.twig', $aReturn);
}
$session->set('webservice', true);
$oLogo = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
if ($oLogo) {
$session->set('logo', $oLogo->getMetavalue());
}
return $this->redirectToRoute('dashboard');
} else {
$oWebservice = new WebserviceController();
$oClient = $oWebservice->getClient($doctrine);
$oUser = $doctrine->getRepository(User::class)->find($this->getUser()->getId());
$iCustomerId = $oUser->getKundennummer();
$oConnection = $oClient->SoundCheck(array('p_Text' => 'Webportal-Connection Test'));
if ($oConnection->return_value == "Hello World Webportal-Connection Test") {
#$aUserdata = $oClient->GetCustomerInternalsByNo(array('p_No' => $iCustomerId, 'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals->CustomerInternal;
#$sFirst = substr($aUserdata->Name, 0, 1);
#$sLast = substr($aUserdata->Name2, 0, 1);
#$session->set('nutzername', $sFirst . "" . $sLast);
#$session->set('name', $aUserdata->Name . " " . $aUserdata->Name2);
#$session->set('webservice', true);
} else {
$session->set('webservice', false);
}
return $this->redirectToRoute('vertraege', ["code" => $request->get('code')]);
}
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
$aTexte = $doctrine->getRepository(Texte::class)->findAll();
$aTemp = array();
foreach($aTexte as $iKey => $oText)
{
$aTemp[$oText->getMetakey()] = $oText->getMetavalue();
}
$aTexte = $aTemp;
if(!array_key_exists("portalname",$aTexte))
{
$aTexte["portalname"] = "Energieportal";
}
$session->set('texte',$aTexte);
$aReturn = array(
'controller_name' => 'LoginController',
'last_username' => $lastUsername,
'error' => $error,
'zustellarten' => $aZustellarten,
'impressum' => $sImpressum,
'datenschutz' => $sDatenschutz,
'barrierefreiheit' => $sBarrierefreiheit,
'auswahllisten' => $aAuswahllisten,
'wartungsarbeiten' => $bWartung,
'online' => $bOnline,
'target_action' => $request->get('target_action') ? $request->get('target_action') : $sTargetAction,
'portalvariante' => $sPortalvariante,
'zaehlerstand_online' => $bZaehlerstandOnline,
'authmethode' => $sAuthMethode,
'texte' => $aTexte
);
$b2FA = false;
// 2FA
if ($o2FA->getMetavalue())
{
if ($o2FA->getMetavalue() == "on")
{
$b2FA = true;
}
}
$aReturn["twofa"] = $b2FA;
// Anzeige drucken Dialog
if ($request->get('drucken')) {
$aReturn["drucken"] = true;
$aReturn["zaehler"] = $request->get('zaehler');
$aReturn["ablesedatum"] = $request->get('ablesedatum');
$aReturn["ablesestand"] = $request->get('ablesestand');
}
return $this->render('login/index.html.twig', $aReturn);
}
#[Route('/admin', name: 'login_admin')]
public function loginAdmin(AuthenticationUtils $authenticationUtils, Request $request, ManagerRegistry $doctrine, EntityManagerInterface $entityManager): Response
{
$aReturn = array();
// if ($request->get('origin_route') && $request->get('origin_route') == 'admin' || $this->getUser()) {
// $this->index($authenticationUtils, $request, $doctrine, $entityManager, "admin");
// }
$aReturn['error'] = "";
return $this->render('login/index_admin.html.twig', $aReturn);
}
#[Route('/passwort-vergessen/', name: 'passwort-vergessen')]
public function passwordForget(Request $request, MailerInterface $mailer, ManagerRegistry $doctrine, EntityManagerInterface $entityManager, UserPasswordHasherInterface $userPasswordHasher)
{
if ($this->getUser()) {
return $this->redirectToRoute('dashboard');
}
$oLinkImpressum = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "impressum"]);
$sImpressum = "";
if ($oLinkImpressum) {
$sImpressum = $oLinkImpressum->getMetavalue();
}
$oLinkDatenschutz = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "datenschutz"]);
$sDatenschutz = "";
if ($oLinkDatenschutz) {
$sDatenschutz = $oLinkDatenschutz->getMetavalue();
}
$oLinkBarrierefreiheit = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheit"]);
$sBarrierefreiheit = "";
if ($oLinkBarrierefreiheit) {
$sBarrierefreiheit = $oLinkBarrierefreiheit->getMetavalue();
}
$aTexte = $doctrine->getRepository(Texte::class)->findAll();
$aTemp = array();
foreach($aTexte as $iKey => $oText)
{
$aTemp[$oText->getMetakey()] = $oText->getMetavalue();
}
$aTexte = $aTemp;
if(!array_key_exists("portalname",$aTexte))
{
$aTexte["portalname"] = "Energieportal";
}
$session = new Session();
$session->set('texte',$aTexte);
if ($request->get('email'))
{
$oWebservice = new WebserviceController();
$oClient = $oWebservice->getClient($doctrine);
$user = $doctrine->getRepository(user::class)->findOneBy(["email" => $request->get('email')]);
if(!$user)
{
$this->addFlash(
'error',
"Die Mailadresse ist nicht korrekt."
);
return $this->redirectToRoute('passwort-vergessen');
}
$iCustomerId = $user->getKundennummer();
$oSystem = $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
$sStyle = "";
$sFile = "css/email.css";
if(file_exists($sFile))
{
$sStyle = file_get_contents($sFile);
}
$sFile = "css/customer.css";
if(file_exists($sFile))
{
$sStyle .= file_get_contents($sFile);
}
$sSignatur = "Mit freundlichen Grüßen, Ihr Stadtwerk";
$oSignatur = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Signatur"]);
if ($oSignatur)
{
$sSignatur = $oSignatur->getMetavalue();
}
$sAnrede = "Sehr geehrte Damen und Herren";
$oAnrede = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
if($oAnrede)
{
$sAnrede = $oAnrede->getMetavalue();
}
if (!$user) {
return $this->render('login/password-lost.html.twig', ['info' => '', 'error' => "Bitte prüfen Sie Ihre Eingabe."]);
}
// Ermitteln der Daten zum BusinessPartner
$aBusinessDaten = $oClient->GetBusinessPartnersByNo(array(
"p_No" => $iCustomerId,
"v_ExportBusinessPartners" => 1
));
if (is_array($aBusinessDaten->v_ExportBusinessPartners->BusinessPartner)) {
$oBusinessPartner = $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner[0];
} else {
$oBusinessPartner = $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner;
}
// Anrede ermitteln
if ($oBusinessPartner && $oBusinessPartner->SalutationFormal) {
$sAnrede = $oBusinessPartner->SalutationFormal;
}
$sHash = substr(md5(time()), 0, 10);
$user->setHash($sHash);
$entityManager->persist($user);
$entityManager->flush();
$sLink = "<a href='https://" . $_SERVER['SERVER_NAME'] . "/passwort-vergessen/?hash=" . $sHash."'>Passwort zurücksetzen</a>";
$sTo = $request->get('email');
$oAbsender = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "smtp_user"]);
$sMail = 'portal.support@msu-solutions.de';
if($oAbsender)
{
$sMail = $oAbsender->getMetavalue();
}
$sText = "";
$sSubject = "Passwort vergessen";
$oText = $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "pw_change_request"]);
if ($oText)
{
$sText = $oText->getInhalt();
$sText = str_replace("#anrede#",$sAnrede,$sText);
$sSubject = $oText->getBetreff();
}
$sText = str_replace("#link#",$sLink,$sText);
$email = (new TemplatedEmail())
->from($sMail)
->to($sTo)
->subject($sSubject)
// path of the Twig template to render
->htmlTemplate('emails/password.html.twig')
// pass variables (name => value) to the template
->context([
"anrede" => $sAnrede,
"text" => $sText,
"style" => $sStyle,
"system" => $oSystem->getMetavalue(),
"signatur" => $sSignatur
]);
try
{
$mailer->send($email);
}
catch(\Exception $exception)
{
$this->addFlash(
'error',
"Die Mail konnte leider nicht versendet werden."
);
}
return $this->render('login/password-lost.html.twig', ['info' => 'Die Mail wurde versendet.', 'error' => "", 'impressum' => $sImpressum,
'datenschutz' => $sDatenschutz, 'barrierefreiheit' => $sBarrierefreiheit, 'texte' => $aTexte]);
}
if ($request->get('hash'))
{
$sHash = $request->get('hash');
$user = $doctrine->getRepository(user::class)->findOneBy(["hash" => $sHash]);
if ($user)
{
return $this->render('login/password-lost.html.twig', ['error' => "", 'newpassword' => $request->get('hash'), 'texte' => $aTexte]);
}
else
{
return $this->render('login/password-lost.html.twig', ['error' => "",'texte' => $aTexte]);
}
}
if ($request->get('password-first') == $request->get('password-second') and !empty($request->get('password-first')))
{
$oWebservice = new WebserviceController();
$oClient = $oWebservice->getClient($doctrine);
$user = $doctrine->getRepository(user::class)->findOneBy(["hash" => $request->get("newhash")]);
$iCustomerId = $user->getKundennummer();
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$request->get('password-first')
)
);
$user->setHash("");
$entityManager->persist($user);
$entityManager->flush();
$sStyle = "";
$sFile = "css/email.css";
if(file_exists($sFile))
{
$sStyle = file_get_contents($sFile);
}
$sFile = "css/customer.css";
if(file_exists($sFile))
{
$sStyle .= file_get_contents($sFile);
}
$sSignatur = "Mit freundlichen Grüßen, Ihr Stadtwerk";
$oSignatur = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Signatur"]);
if ($oSignatur)
{
$sSignatur = $oSignatur->getMetavalue();
}
$sAnrede = "Sehr geehrte Damen und Herren";
$oAnrede = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
if($oAnrede)
{
$sAnrede = $oAnrede->getMetavalue();
}
if (!$user) {
return $this->render('login/password-lost.html.twig', ['info' => '', 'error' => "Bitte prüfen Sie Ihre Eingabe.", 'texte' => $aTexte]);
}
// Ermitteln der Daten zum BusinessPartner
$aBusinessDaten = $oClient->GetBusinessPartnersByNo(array(
"p_No" => $iCustomerId,
"v_ExportBusinessPartners" => 1
));
if (is_array($aBusinessDaten->v_ExportBusinessPartners->BusinessPartner)) {
$oBusinessPartner = $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner[0];
} else {
$oBusinessPartner = $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner;
}
// Anrede ermitteln
if ($oBusinessPartner && $oBusinessPartner->SalutationFormal) {
$sAnrede = $oBusinessPartner->SalutationFormal;
}
$sHash = substr(md5(time()), 0, 10);
$user->setHash($sHash);
$entityManager->persist($user);
$entityManager->flush();
$sTo = $request->get('email');
$oAbsender = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "smtp_user"]);
$sMail = 'portal.support@msu-solutions.de';
if(empty($sTo))
{
$sTo = $user->getEmail();
}
if($oAbsender)
{
$sMail = $oAbsender->getMetavalue();
}
$sText = "";
$sSubject = "Passwort geändert";
$oText = $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "pw_changed"]);
if ($oText)
{
$sText = $oText->getInhalt();
$sText = str_replace("#anrede#",$sAnrede,$sText);
$sSubject = $oText->getBetreff();
}
$email = (new TemplatedEmail())
->from($sMail)
->to($sTo)
->subject($sSubject)
// path of the Twig template to render
->htmlTemplate('emails/passwordchanged.html.twig')
// pass variables (name => value) to the template
->context([
"text" => $sText,
"style" => $sStyle,
"signatur" => $sSignatur
]);
try
{
$mailer->send($email);
}
catch(\Exception $exception)
{
$this->addFlash(
'error',
"Die Mail konnte leider nicht versendet werden."
);
}
return $this->render('login/index.html.twig', ['info' => 'Das Passwort wurde gespeichert. Sie können sich nun anmelden.', 'error' => '', 'texte' => $aTexte]);
}
return $this->render('login/password-lost.html.twig',['impressum' => $sImpressum, 'datenschutz' => $sDatenschutz, 'barrierefreiheit' => $sBarrierefreiheit, 'texte' => $aTexte]);
}
#[Route('/zugangbeantragen/', name: 'zugangbeantragen')]
public function addUser(Request $request, UserPasswordHasherInterface $userPasswordHasher, MailerInterface $mailer, EntityManagerInterface $entityManager, ManagerRegistry $doctrine)
{
$session = new Session();
$oClient = new WebserviceController();
$iMandantenId = "";
if(!empty($session->get('mandantenid')))
{
$oMandant = $doctrine->getRepository(Mandanten::class)->find($session->get('mandantenid'));
$oClient = $oClient->getClient($doctrine, $oMandant->getWsmandant());
$iMandantenId = $session->get('mandantenid');
}
else
{
$oClient = $oClient->getClient($doctrine);
}
$aMailvorlage = $doctrine->getRepository(Mailtexte::class)->findAll();
$aTemp = array();
$sAnrede = "Sehr geehrte Damen und Herren";
$oAnrede = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
if($oAnrede)
{
$sAnrede = $oAnrede->getMetavalue();
}
foreach ($aMailvorlage as $iKey => $oSetting)
{
$aTemp[$oSetting->getMetakey()] = $oSetting;
}
$aMailvorlage = $aTemp;
if ($request->get('email') && $request->get('passwort'))
{
$sKundennummer = $request->get('kundennummer');
$sLeistungsobjektnummer = $request->get('leistungsobjektnummer');
// Abruf Webservice zum Prüfen, ob Kundennummer und Leistungsobjektnummer vorhanden sind
$oCheckConfig = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "authentifizierung"]);
if ($oCheckConfig->getMetavalue() == "internal") {
$oAuth = $oClient->AuthenticateBusinessPartner(
array(
'p_BusinessPartnerNo' => '',
'p_BaseContractNo' => $sKundennummer,
'p_MeterNo' => $sLeistungsobjektnummer,
'v_ExportBusinessPartners' => array()
)
);
} else {
$oAuth = $oClient->GetBusinessPartnersByNo(array(
"p_No" => $sKundennummer,
"v_ExportBusinessPartners" => 1
));
}
// Nutzerdaten ermitteln
if ($oAuth && $oAuth->return_value) {
$sGeschaeftspartnerNummer = $oAuth->v_ExportBusinessPartners->BusinessPartner->No;
$oBusinessPartner = $oAuth->v_ExportBusinessPartners->BusinessPartner;
}
// Anrede ermitteln
if ($oBusinessPartner && $oBusinessPartner->SalutationFormal) {
$sAnrede = $oBusinessPartner->SalutationFormal;
}
// Gibt es den User bzw. Verknüpfung bereits schon
$oUser = $doctrine->getRepository(User::class)->findOneBy(["kundennummer" => $sGeschaeftspartnerNummer]);
$oUnterkonto = $doctrine->getRepository(Unterkonten::class)->findOneBy(["unterkontonr" => $sGeschaeftspartnerNummer]);
if ($oUser || $oUnterkonto)
{
$this->addFlash(
'error',
'Dieser Zugang existiert bereits. Prüfen Sie ihre Unterkonten.'
);
return $this->redirectToRoute('login');
}
// Token-Lebensdauer und Länge aus den Einstellungen holen
$sTokenDuration = 3600;
$sTokenLength = 12;
$oTokenDuration = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_duration"]);
$oTokenLength = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_length"]);
if ($oTokenDuration)
{
$sTokenDuration = (int)$oTokenDuration->getMetavalue();
}
if ($oTokenLength)
{
$sTokenLength = (int)$oTokenLength->getMetavalue();
}
if(empty($sTokenDuration))
{
$sTokenDuration = 3600;
}
if(empty($sTokenLength))
{
$sTokenLength = 12;
}
#$currentDate = new DateTime();
#$sTokenDuration = $currentDate->add(new DateInterval('PT' . $sTokenDuration . 'S'))->format('d.m.Y H:i:s');
$sTokenDuration = $sTokenDuration / 60;
$sTokenDuration += 120;
$sTokenDuration = date("d.m.Y H:i:s", strtotime("+".$sTokenDuration." minutes", time()));
// Signatur
$sSignatur = "Mit freundlichen Grüßen, Ihr Stadtwerk";
$oSignatur = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Signatur"]);
if ($oSignatur)
{
$sSignatur = $oSignatur->getMetavalue();
}
// lokales Nutzerobjekt
$user = new User();
$user->setEmail($request->get('email'));
$user->setRoles(array("ROLE_USER"));
$user->setZustellart($request->get('zustellart'));
$user->setAktiv(0);
$user->setKundennummer($sGeschaeftspartnerNummer);
$user->setLeistungsobjektnummer($sLeistungsobjektnummer);
$user->setDatenschutz(1);
$user->setTokenduration($sTokenDuration);
$user->setMandantenid($iMandantenId);
$sHash = bin2hex(random_bytes(intval($sTokenLength)));
$user->setHash($sHash);
$oKeyLength = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "webid_key_length", "type" => "konto"]);
$iLength = $oKeyLength->getMetavalue();
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$request->get('passwort')
)
);
$entityManager->persist($user);
$entityManager->flush();
// Mailversand
$sLink = $_SERVER['SERVER_NAME'];
$sAbsender = $aMailvorlage["zugang_beantragung"]->getAbsender();
if(empty($sAbsender))
{
$oAbsender = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
$sAbsender = 'portal.support@msu-solutions.de';
if($oAbsender)
{
$sAbsender = $oAbsender->getMetavalue();
}
}
$sStyle = "";
$sFile = "css/email.css";
if(file_exists($sFile))
{
$sStyle = file_get_contents($sFile);
}
$sFile = "css/customer.css";
if(file_exists($sFile))
{
$sStyle .= file_get_contents($sFile);
}
$sUrl = '<p class="block text-center"><a href="https://' . $sLink . '/zugang/aktivieren/' . $sHash . '/" class="btn">Zugang aktivieren</a></p>';
$oText = $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "zugang_beantragung"]);
$sText = "Anfrage zur Beantragung eines Zugangs";
$sSubject = "Anfrage";
if($oText)
{
$sText = $oText->getInhalt();
$sText = str_replace("#anrede#",$sAnrede,$sText);
$sText = str_replace("#url#",$sUrl,$sText);
$sText = str_replace("#tokenduration#",$sTokenDuration,$sText);
$sSubject = $oText->getBetreff();
}
$oSystem = $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
$email = (new TemplatedEmail())
->from($sAbsender)
->to($request->get('email'))
->subject($sSubject)
// path of the Twig template to render
->htmlTemplate('emails/zugang.html.twig')
// pass variables (name => value) to the template
->context([
"context" => $sText,
"betreff" => $sSubject,
"style" => $sStyle,
"signatur" => $sSignatur,
"system" => $oSystem->getMetavalue()
]);
$loader = new FilesystemLoader('../templates/');
$twigEnv = new Environment($loader);
$twigBodyRenderer = new BodyRenderer($twigEnv);
$twigBodyRenderer->render($email);
$oCustomMailer = new MailController();
$oCustomMailer = $oCustomMailer->getMailer($doctrine);
try
{
$this->addFlash(
'neu',
'Ihr Zugang wurde beantragt. Ihnen wurde ein Mail mit einem Link zum Aktivieren des Zugangs zugesendet.'
);
$oCustomMailer->send($email);
}
catch(\Exception $exception)
{
$this->addFlash(
'error',
"Die Mail konnte leider nicht versendet werden."
);
}
}
return $this->redirectToRoute('login');
}
#[Route('/zaehlerstand/{rahmenvertrag}/{zaehlernr}/', name: 'zaehlerstand_link')]
public function zaehlerstandlink(Request $request, EntityManagerInterface $entityManager, ManagerRegistry $doctrine, $rahmenvertrag, $zaehlernr)
{
$session = new Session();
if($rahmenvertrag and $zaehlernr)
{
$session->set('rahmenvertrag',$rahmenvertrag);
$session->set('zaehlernr',$zaehlernr);
return $this->redirectToRoute('login',["rahmenvertrag" => $rahmenvertrag]);
}
}
#[Route('/zugang/aktivieren/{hash}/', name: 'zugangaktivieren')]
public function activeAccount(Request $request, UserPasswordHasherInterface $userPasswordHasher, MailerInterface $mailer, EntityManagerInterface $entityManager, ManagerRegistry $doctrine, $hash)
{
$oWebservice = new WebserviceController();
$oClient = $oWebservice->getClient($doctrine);
$oUser = $doctrine->getRepository(User::class)->findOneBy(["hash" => $hash]);
// Prüfung Token-Laufzeit
if ($oUser) {
$sTokenDuration = $oUser->getTokenduration();
$sTokenDurationTimestamp = strtotime("- 120 minutes", strtotime($sTokenDuration));
if (time() > $sTokenDurationTimestamp)
{
$this->addFlash(
'error',
'Ihr Aktivierungslink ist abgelaufen.'
);
return $this->redirectToRoute('login');
}
}
if (!$oUser) {
$this->addFlash(
'error',
'Der Code ist leider falsch.'
);
return $this->redirectToRoute('login');
} else {
$iCustomerId = $oUser->getKundennummer();
$iZaehlerNo = $oUser->getLeistungsobjektnummer();
$aBusinessDaten = $oClient->GetBusinessPartnersByNo(array(
"p_No" => $iCustomerId,
"v_ExportBusinessPartners" => 1
));
if (!$aBusinessDaten || !$aBusinessDaten->return_value) {
$this->addFlash(
'error',
'Ihr Freischaltung konnte nicht durchgeführt werden.'
);
return $this->redirectToRoute('login');
}
if(is_array($aBusinessDaten->v_ExportBusinessPartners->BusinessPartner->BaseContracts->BaseContract))
{
$oBaseContract = $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner->BaseContracts->BaseContract[0];
}
else
{
$oBaseContract = $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner->BaseContracts->BaseContract;
}
$sBaseContract = $oBaseContract->No;
$oUser->setAktiv(1);
$oUser->setHash("");
$oUser->setTokenduration("");
$entityManager->persist($oUser);
$entityManager->flush();
$aTempData = array(
"ZB_GPNUMMER" => $iCustomerId,
"ZB_RVERTRAG" => $sBaseContract,
"ZB_ZNUMMER" => $iZaehlerNo,
"ZB_NUTZERNAME" => $oUser->getEmail(),
"ZB_ANMELD_EMAIL" => $oUser->getEmail()
);
$aResult = $oWebservice->sendData($doctrine, "ZUGANG_BEANT", $iCustomerId, $sBaseContract, $aTempData);
if (!$aResult->return_value) {
$this->addFlash(
'error',
'Ihr Zugang wurde nicht beantragt.'
);
} else {
$this->addFlash(
'neu',
'Ihre Freischaltung wurde bearbeitet.'
);
}
return $this->redirectToRoute('login');
}
}
#[Route('/zaehlerstanderfassen/', name: 'zaehlerstanderfassen')]
public function zaehlerstanderfassen(Request $request, MailerInterface $mailer, EntityManagerInterface $entityManager, ManagerRegistry $doctrine)
{
$aZaehlernummern = $request->get('zaehlernr');
$oWebservice = new WebserviceController();
$oClient = $oWebservice->getClient($doctrine);
$sBusinessPartnerNo = $request->get('kundennummer');
$sBaseContractNo = $request->get('basecontractnr');
$bDrucken = false;
$sAnrede = "Sehr geehrte Damen und Herren";
$oAnrede = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
if($oAnrede)
{
$sAnrede = $oAnrede->getMetavalue();
}
$aBusinessDaten = $oClient->GetBusinessPartnersByNo(array(
"p_No" => $sBusinessPartnerNo,
"v_ExportBusinessPartners" => 1
));
if($aBusinessDaten)
{
if (is_array($aBusinessDaten->v_ExportBusinessPartners->BusinessPartner))
{
$sAnrede = $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner[0]->SalutationFormal;
}
else
{
$sAnrede = $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner->SalutationFormal;
}
}
$sEmailkontakt = $request->get('ZS_EMAIL');
$sTelefonKontakt = $request->get('ZS_TEL');
$aResults = array();
$aTempData["ZS_EMAIL"] = $sEmailkontakt;
$aTempData["ZS_TEL"] = $sTelefonKontakt;
$sTempNr = 0;
$sMailText = "";
$sTempText = "";
foreach($aZaehlernummern as $iKey => $sZaehlerNr)
{
if(empty($request->get('zaehlerstandneu')[$iKey]))
{
continue;
}
$dAblesedatum = $request->get('ablesedatum')[$iKey];
$iZaehlerstandNeu = $request->get('zaehlerstandneu')[$iKey];
$iZaehlerstandNeu = str_replace(".",",",$iZaehlerstandNeu);
#$iZaehlerstandAlt = $request->get('zaehlerstandalt')[$iKey];
#$iZaehlerstandAlt = str_replace(".",",",$iZaehlerstandAlt);
#$iZaehlerNo = $request->get('zaehlernr')[$iKey];
$sCode = "ZS_ACODE_HT";
$sStand = "ZS_ABLSTAND_HT";
if($request->get('htnt')[$iKey] == 2)
{
$sCode = "ZS_ACODE_NT";
$sStand = "ZS_ABLSTAND_NT";
}
if($sTempNr != $sZaehlerNr)
{
// Daten für den Geschäftsvorgang ermitteln
$aTempData[$iKey] = array(
"ZS_ZNUMMER" => $sZaehlerNr,
"ZS_ABLDATUM" => $dAblesedatum,
$sCode => $request->get('ZS_METERREGIDX')[$iKey],
$sStand => $iZaehlerstandNeu,
// "ZS_ACODE_NT" => "2 WIRKARBEIT NT",
// "ZS_ABLSTAND_NT" => $request->get('zaehlerstandneu'),
);
$sTempNr = $sZaehlerNr;
}
else
{
$iTemp = $iKey;
$iTemp--;
$aTempData[$iTemp][$sCode] = $request->get('ZS_METERREGIDX')[$iKey];
$aTempData[$iTemp][$sStand] = $iZaehlerstandNeu;
}
if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] == 'Anderer Grund')
{
$aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzgrundtext')[$iKey];
#$sGrund = $request->get('toleranzgrundtext')[$iKey];
}
if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] != 'Anderer Grund')
{
$aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzart')[$iKey];
#$sGrund = $request->get('toleranzart')[$iKey];
}
$sGrund = "";
$iZaehlerstandNeu = str_replace(",",".",$iZaehlerstandNeu);
if($request->get('htnt')[$iKey] == 2)
{
if(!empty($sTempText))
{
$sMailText = "Zählernummer: ".$sZaehlerNr."<br>";
$sMailText .= $sTempText;
$sMailText .= "Zählerstand (NT): ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
$sMailText .= "Ablesedatum: ".date("d.m.Y",strtotime($dAblesedatum))."<br><br>";
}
$sTempText = "Zählerstand (NT): ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
}
elseif($request->get('htnt')[$iKey] == 1)
{
if(!empty($sTempText))
{
$sMailText = "Zählernummer: ".$sZaehlerNr."<br>";
$sMailText .= $sTempText;
$sMailText .= "Zählerstand (HT): ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
$sMailText .= "Ablesedatum: ".date("d.m.Y",strtotime($dAblesedatum))."<br><br>";
}
$sTempText = "Zählerstand (HT): ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
}
else
{
$sMailText .= "Zählernummer: ".$sZaehlerNr."<br>";
$sMailText .= "Zählerstand: ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
$sMailText .= "Ablesedatum: ".date("d.m.Y",strtotime($dAblesedatum))."<br><br>";
}
if(!empty($sGrund))
{
$sMailText .= "Änderung: ".$sGrund."<br>";
}
$sMailText .= "";
}
$aResult = $oWebservice->sendData($doctrine, "ZAEHLER_ERFASS", $sBusinessPartnerNo, $sBaseContractNo, $aTempData);
$oSystem = $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
$sStyle = "";
$sFile = "css/email.css";
if(file_exists($sFile))
{
$sStyle = file_get_contents($sFile);
}
$sFile = "css/customer.css";
if(file_exists($sFile))
{
$sStyle .= file_get_contents($sFile);
}
$sSignatur = "Mit freundlichen Grüßen, Ihr Stadtwerk";
$oSignatur = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Signatur"]);
if ($oSignatur)
{
$sSignatur = $oSignatur->getMetavalue();
}
if ($aResult->return_value)
{
if ($sEmailkontakt)
{
$sTo = $sEmailkontakt;
$oAbsender = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
$sMail = 'portal.support@msu-solutions.de';
if($oAbsender)
{
$sMail = $oAbsender->getMetavalue();
}
$oText = $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "send_meter"]);
$sText = "Sie haben folgende Zählerstände erfolgreich gemeldet:";
$sSubject = "Übertragung Zählerstand";
if($oText)
{
$sText = $oText->getInhalt();
$sText = str_replace("#anrede#",$sAnrede,$sText);
$sText = str_replace("#zaehlerinfos#",$sMailText,$sText);
$sSubject = $oText->getBetreff();
}
$oMail = (new TemplatedEmail())
->from($sMail)
->to($sTo)
->subject($sSubject)
// path of the Twig template to render
->htmlTemplate('emails/zaehlerstand.html.twig')
// pass variables (name => value) to the template
->context([
'anrede' => $sAnrede,
'ablesedatum' => $dAblesedatum,
'ablesestand' => $iZaehlerstandNeu,
'zaehler' => $sZaehlerNr,
"system" => $oSystem->getMetavalue(),
"signatur" => $sSignatur,
"style" => $sStyle,
"text" => $sText,
"subject" => $sSubject,
"zaehlertext" => $sMailText
]);
$loader = new FilesystemLoader('../templates/');
$twigEnv = new Environment($loader);
$twigBodyRenderer = new BodyRenderer($twigEnv);
$twigBodyRenderer->render($oMail);
$oCustomMailer = new MailController();
$oCustomMailer = $oCustomMailer->getMailer($doctrine);
try
{
$oCustomMailer->send($oMail);
}
catch(\Exception $exception)
{
$this->addFlash(
'error',
"Die Mail konnte leider nicht versendet werden."
);
}
}
$this->addFlash(
'neu',
'Der Zählerstand wurde gesendet.'
);
$bDrucken = true;
}
else
{
$this->addFlash(
'error',
'Ihr Zählerstand wurde nicht übertragen.'
);
}
$session = new Session();
$session->set('rahmenvertrag',false);
$session->set('zaehlernr',false);
$session->set('zaehler',$aZaehlernummern);
$session->set('staende',$request->get('zaehlerstandneu'));
$session->set('ablesedatum',$request->get('ablesedatum'));
$session->set('druckentext',$sMailText);
return $this->redirectToRoute('login',["drucken" => $bDrucken]);
}
#[Route('/login/twofa/', name: 'login_twofa')]
public function logintwofa(Request $request, MailerInterface $mailer, EntityManagerInterface $entityManager, ManagerRegistry $doctrine)
{
$session = new Session();
if ($request->get('emailtwofa'))
{
$oWebservice = new WebserviceController();
$oClient = $oWebservice->getClient($doctrine);
$aTemp = array();
$sTo = $request->get('emailtwofa');
$sAnrede = "Sehr geehrte Damen und Herren";
$oAnrede = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
if($oAnrede)
{
$sAnrede = $oAnrede->getMetavalue();
}
$sSignatur = "Mit freundlichen Grüßen, Ihr Stadtwerk";
// Signatur
$oSignatur = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Signatur"]);
if ($oSignatur)
{
$sSignatur = $oSignatur->getMetavalue();
}
$sTokenDuration = 3600;
$sTokenLength = 12;
$oTokenDuration = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_duration"]);
$oTokenLength = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_length"]);
if ($oTokenDuration)
{
$sTokenDuration = (int)$oTokenDuration->getMetavalue();
}
if ($oTokenLength)
{
$sTokenLength = (int)$oTokenLength->getMetavalue();
}
if(empty($sTokenDuration))
{
$sTokenDuration = 3600;
}
if(empty($sTokenLength))
{
$sTokenLength = 12;
}
#$currentDate = new DateTime();
#$sTokenDuration = $currentDate->add(new DateInterval('PT' . $sTokenDuration . 'S'))->format('d.m.Y H:i:s');
$sTokenDuration = $sTokenDuration / 60;
$sTokenDuration += 120;
$sTokenDuration = date("d.m.Y H:i:s", strtotime("+".$sTokenDuration." minutes", time()));
// Mailvorlage
$aMailvorlage = $doctrine->getRepository(Mailtexte::class)->findAll();
$aTemp = array();
foreach ($aMailvorlage as $iKey => $oSetting) {
$aTemp[$oSetting->getMetakey()] = $oSetting;
}
$aMailvorlage = $aTemp;
$oUser = $doctrine->getRepository(User::class)->findOneBy(["email" => $request->get('emailtwofa')]);
if(in_array("ROLE_ADMIN",$oUser->getRoles()))
{
$sAnrede = "Sehr geehrte Damen und Herrren";
$oAnrede = $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
if($oAnrede)
{
$sAnrede = $oAnrede->getMetavalue();
}
}
else
{
// Ermitteln der Daten zum BusinessPartner
$aBusinessDaten = $oClient->GetBusinessPartnersByNo(array(
"p_No" => $oUser->getKundennummer(),
"v_ExportBusinessPartners" => 1
));
if (is_array($aBusinessDaten->v_ExportBusinessPartners->BusinessPartner)) {
$oBusinessPartner = $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner[0];
} else {
$oBusinessPartner = $aBusinessDaten->v_ExportBusinessPartners->BusinessPartner;
}
// Anrede ermitteln
if ($oBusinessPartner && $oBusinessPartner->SalutationFormal) {
$sAnrede = $oBusinessPartner->SalutationFormal;
}
}
if (!$oUser) {
return $this->redirectToRoute('login');
}
$sHash = substr(md5(time()), 0, 5);
$oUser->setHash($sHash);
$oUser->setTokenduration($sTokenDuration);
$entityManager->persist($oUser);
$entityManager->flush();
$sSubject = $aMailvorlage["2fa"]->getBetreff();
$sMailBody = $aMailvorlage["2fa"]->getInhalt();
$sAbsender = $aMailvorlage["2fa"]->getAbsender();
if(empty($sAbsender))
{
$oAbsender = $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
if($oAbsender)
{
$sAbsender = $oAbsender->getMetavalue();
}
}
$sReplacedMailBody = str_replace(array(
"#anrede#", "#code#", "#tokenduration#"
), array(
$sAnrede, $sHash, $sTokenDuration
), $sMailBody);
$sStyle = "";
$sFile = "css/email.css";
if(file_exists($sFile))
{
$sStyle = file_get_contents($sFile);
}
$sFile = "css/customer.css";
if(file_exists($sFile))
{
$sStyle .= file_get_contents($sFile);
}
$oSystem = $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
$oMail = (new TemplatedEmail())
->from($sAbsender)
->to($sTo)
->subject($sSubject)
// path of the Twig template to render
->htmlTemplate('emails/twofa.html.twig')
// pass variables (name => value) to the template
->context([
"context" => $sReplacedMailBody,
"betreff" => $sSubject,
"signatur" => $sSignatur,
"style" => $sStyle,
"system" => $oSystem->getMetavalue()
]);
$loader = new FilesystemLoader('../templates/');
$twigEnv = new Environment($loader);
$twigBodyRenderer = new BodyRenderer($twigEnv);
$twigBodyRenderer->render($oMail);
$oMailer = new MailController();
$oMailer = $oMailer->getMailer($doctrine);
$session->set("emailtwofa",$request->get('emailtwofa'));
$session->set("pwtwofa",$request->get('pwtwofa'));
try
{
$oMailer->send($oMail);
$this->addFlash(
'neu',
'Wir haben Ihnen einen Logincode per E-Mail zugesendet.'
);
}
catch(\Exception $exception)
{
$this->addFlash(
'error',
"Die Mail konnte leider nicht versendet werden."
);
}
}
return $this->redirectToRoute('login', ["twofa" => true]);
}
}