src/Controller/TarifrechnerController.php line 31

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Auswahllisten;
  4. use App\Entity\Links;
  5. use App\Entity\Mailtexte;
  6. use App\Entity\Portalsettings;
  7. use App\Entity\Settings;
  8. use App\Entity\Texte;
  9. use App\Entity\User;
  10. use App\Entity\Warenkorb;
  11. use App\Service\Utilities;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Doctrine\Persistence\ManagerRegistry;
  19. use Exception;
  20. use Symfony\Bridge\Twig\Mime\BodyRenderer;
  21. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  22. use Symfony\Component\HttpFoundation\Session\Session;
  23. use Twig\Environment;
  24. use Twig\Loader\FilesystemLoader;
  25. class TarifrechnerController extends AbstractController
  26. {
  27.     #[Route('/tarifrechner'name'app_tarifrechner')]
  28.     public function index(Request $requestManagerRegistry $doctrineEntityManagerInterface $entityManagerUtilities $utilities): Response
  29.     {
  30.         // Tarifwahl
  31.         $iStep              1;
  32.         
  33.         $session            = new Session();
  34.         $oWebsercice        = new WebserviceController();
  35.         $oClient            $oWebsercice->getClient($doctrine);
  36.         // Logos
  37.         $oLogo              $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  38.         $oLogoGraustufen    $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-graustufen"]);
  39.         $oLogoSchwarzWeiss  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-schwarzweiss"]);
  40.         $oFavicon           $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "favicon"]);
  41.         // Texte
  42.         $aTexte             $doctrine->getRepository(Texte::class)->findAll();
  43.         
  44.         $aProdukte          = array();
  45.         $aRequestData       = array();
  46.         $aError             = array();
  47.         $aTemp              = array();
  48.         $aWarenkorb         = array();
  49.         $aTarifInfo         = array();
  50.         $aProdukteStrom     = array();
  51.         $aProdukteGas       = array();        
  52.         $bWarenkorbExists   false;
  53.         $sSparte            null;
  54.         $sKundentyp         null;
  55.         $sJahresverbrauch   null;
  56.         $iPersonen          null;
  57.         if ($oLogo)
  58.         {
  59.             $session->set('logo'$oLogo->getMetavalue());
  60.         }
  61.         else
  62.         {
  63.             $session->set('logo''');
  64.         }
  65.         if($oLogoGraustufen)
  66.         {
  67.             $session->set('logo-graustufen'$oLogoGraustufen->getMetavalue());
  68.         }
  69.         else
  70.         {
  71.             $session->set('logo-graustufen''');
  72.         }
  73.         if($oLogoSchwarzWeiss)
  74.         {
  75.             $session->set('logo-schwarzweiss'$oLogoSchwarzWeiss->getMetavalue());
  76.         }
  77.         else
  78.         {
  79.             $session->set('logo-schwarzweiss''');
  80.         }
  81.         
  82.         if($oFavicon && $oFavicon->getMetavalue())
  83.         {
  84.             $session->set('favicon'$oFavicon->getMetavalue());
  85.         }
  86.         else
  87.         {
  88.             $session->set('favicon''');
  89.         }
  90.         $aTemp  = array();
  91.         foreach($aTexte as $iKey => $oText)
  92.         {
  93.             $aTemp[$oText->getMetakey()] = $oText->getMetavalue();
  94.         }
  95.         $oInhaltsController = new InhalteController();
  96.         $aTexte             $oInhaltsController->getTexte($doctrine);
  97.         if($session->get('tarifinfo'))
  98.         {
  99.             $aTarifInfo $session->get('tarifinfo');
  100.         }
  101.         // Fallback Spartenkennung
  102.         $aSpartenkennung  = array(
  103.             "SVV" => "Strom",
  104.             "GVV" => "Gas",
  105.             "WVV" => "Wasser",
  106.             "FWV" => "Fernwärme"
  107.         );
  108.         // Produktspaten ermitteln
  109.         $oSpartencodes $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_spatencodes"]);
  110.         if($oSpartencodes && $oSpartencodes->getMetavalue())
  111.         {
  112.             $aSpartenkennung json_decode($oSpartencodes->getMetavalue(), true);
  113.         }
  114.         $sCodeStrom "SVV";
  115.         $sCodeGas   "GVV";
  116.         foreach($aSpartenkennung as $sSpartencode => $sSpartenbezeichnung)
  117.         {
  118.             if(strtolower($sSpartenbezeichnung) == "strom")
  119.             {
  120.                 $sCodeStrom $sSpartencode;
  121.             }
  122.             if(strtolower($sSpartenbezeichnung) == "gas")
  123.             {
  124.                 $sCodeGas $sSpartencode;
  125.             }
  126.         }
  127.         // Produktgebiet ermitteln (PLZ, Ort, Strasse, Anschlussobjekt)
  128.         $oPortalsettings $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_produktgebiet"]);
  129.         
  130.         $aProduktgebiet = array("Anschlussobjekt");
  131.         
  132.         if($oPortalsettings && $oPortalsettings->getMetavalue()) 
  133.         {
  134.             $aProduktgebiet str_replace(","";"$oPortalsettings->getMetavalue());
  135.             $aProduktgebiet explode(";"$aProduktgebiet);
  136.         }
  137.         // Text "schon Kunde"
  138.         $oPortalsettings $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_bereits_kunde"]);
  139.         
  140.         $sTextBereitsKunde "Sie sind bereits Kunde bei uns und möchten einen weiteren Vertrag abschließen? Dann loggen Sie sich jetzt in Ihr Kundenkonto ein. Dort müssen Sie Ihre persönlichen Daten nicht nochmal eingeben. Wenn Sie noch kein Kundenkonto haben, können Sie sich hier registrieren.";
  141.         
  142.         if($oPortalsettings && $oPortalsettings->getMetavalue()) 
  143.         {
  144.             $sTextBereitsKunde $oPortalsettings->getMetavalue();
  145.         }
  146.         // Anzahl Abschläge
  147.         $oPortalsettings $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_anzahl_abschlaege"]);
  148.         
  149.         $iAnzahlAbschlaege 12;
  150.         
  151.         if($oPortalsettings && $oPortalsettings->getMetavalue()) 
  152.         {
  153.             $iAnzahlAbschlaege $oPortalsettings->getMetavalue();
  154.         }
  155.         // Sortierung Produktsimulation
  156.         $oPortalsettings $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_sortierung_simulation"]);
  157.         $sSortierungProduktsimulation 'Gesamtsumme';
  158.         if($oPortalsettings && $oPortalsettings->getMetavalue()) 
  159.         {
  160.             $sSortierungProduktsimulation =$oPortalsettings->getMetavalue();
  161.         }
  162.         // Erklärungstext für weniger als 12 Abschläge
  163.         $oPortalsettings $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_abschlag_erklaerung"]);
  164.         
  165.         $sAbschlagserklaerung 'Der Abschlag bezieht sich auf eine Dauer von weniger als 12 Monaten';
  166.         
  167.         if($oPortalsettings && $oPortalsettings->getMetavalue()) 
  168.         {
  169.             $sAbschlagserklaerung $oPortalsettings->getMetavalue();
  170.         }
  171.         // Gewerbeprodukte nutzen
  172.         // Wenn 0 wird Text eingeblendet,
  173.         // ansonsten wird Produktsimulation angezeigt
  174.         $oGewerbeprodukte $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_gewerbeprodukte"]);
  175.         
  176.         $sGewerbeprodukte "on";
  177.         
  178.         if($oGewerbeprodukte && $oGewerbeprodukte->getMetavalue() == "0"
  179.         {
  180.             $sGewerbeprodukte "off";
  181.         }
  182.         // Anpassbarer Text für Gewerbekunden
  183.         $oTextGewerbeprodukte $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_gewerbeprodukte_text"]);
  184.         
  185.         // Kontakt E-Mail ermitteln
  186.         $oKontaktMail $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "email""metakey" => "kontakt_mail"]);
  187.         
  188.         $sTextGewerbeprodukte "Bitte kontaktieren Sie uns telefonisch oder per E-Mail für ein  individuelles Angebot.";
  189.         
  190.         if($oKontaktMail && $oKontaktMail->getMetavalue())
  191.         {
  192.             $sTextGewerbeprodukte .= '<br><br>E-Mail: <a href=mailto:"'.$oKontaktMail->getMetavalue().'" class="text-primary dark:text-slate-200">' $oKontaktMail->getMetavalue() . '</a>';
  193.         }
  194.         
  195.         if($oTextGewerbeprodukte && $oTextGewerbeprodukte->getMetavalue())
  196.         {
  197.             $sTextGewerbeprodukte $oTextGewerbeprodukte->getMetavalue();
  198.         }
  199.         // Tarifrechner Passwort
  200.         $oTarifrechnerPasswort $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "tarifrechner_passwort"]);
  201.         
  202.         $bTarifrechnerPasswort false;
  203.         
  204.         if($oTarifrechnerPasswort && $oTarifrechnerPasswort->getMetavalue()) 
  205.         {
  206.             $bTarifrechnerPasswort true;
  207.         }
  208.         // Ermitteln der Daten für Einzugsgebiet aus Session
  209.         if($session->get("requestData")) 
  210.         {
  211.             $aRequestData $session->get("requestData");
  212.         }
  213.         if(key_exists('kundentyp'$aRequestData))
  214.         {
  215.             $sKundentyp $aRequestData['kundentyp'];
  216.         }
  217.         // Rundungsart für Preise ermitteln
  218.         $oRundungsart $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_rundungsart"]);
  219.         // Fallback Rundungsart; wenn nicht anders definiert, auf ganze Cent runden
  220.         $sRundungsart   "aufrunden";
  221.         // Mögliche Rundungsarten
  222.         $aRundungsarten = array("abrunden""aufrunden""kaufmännisch");
  223.         if($oRundungsart && $oRundungsart->getMetavalue())
  224.         {
  225.             if(in_array(strtolower($oRundungsart->getMetavalue()), $aRundungsarten))
  226.             {
  227.                 $sRundungsart strtolower($oRundungsart->getMetavalue());
  228.             }
  229.         }
  230.         if ($request->getMethod() == "POST" && $request->get('formSend')) {
  231.             // Daten aus Anfrage werden ermittelt
  232.             $sJahresverbrauch       $request->get("jahresverbrauch") ? trim($request->get("jahresverbrauch")) : null;
  233.             $sPlz                   $request->get("plz") ? trim($request->get("plz")) : null;
  234.             $sOrt                   $request->get("ort") ? trim($request->get("ort")) : null;
  235.             $sStrasse               $request->get("strasse") ? trim($request->get("strasse")) : null;
  236.             $sHausNr                $request->get("hausnr") ? trim($request->get("hausnr")) : null;
  237.             $sHausNrZusatz          $request->get("hausnrzusatz") ? trim($request->get("hausnrzusatz")) : null;
  238.             $sSparte                $request->get("sparte") ? trim($request->get("sparte")) : null;
  239.             $sProduktCode           $request->get("produktcode") ? trim($request->get("produktcode")) : null;
  240.             $sTarifrechnerPasswort  $request->get("tarifrechner_passwort") ? trim($request->get("tarifrechner_passwort")) : null;
  241.             $sKundentyp             $request->get("kundentyp") ? trim($request->get("kundentyp")) : $sKundentyp;
  242.             $iPersonen              $request->get("personen") ? trim($request->get("personen")) : null;
  243.             $aRequestData['p_Quantity']                 = $sJahresverbrauch;
  244.             $aRequestData['p_PostCode']                 = $sPlz;
  245.             $aRequestData['p_CityName']                 = $sOrt;
  246.             $aRequestData['p_StreetName']               = $sStrasse;
  247.             $aRequestData['p_HouseNo']                  = intval($sHausNr);
  248.             $aRequestData['p_HouseNumberAddition']      = $sHausNrZusatz;
  249.             $aRequestData['p_SectorCodes']              = $sSparte;
  250.             $aRequestData['p_ProductCode']              = $sProduktCode;
  251.             $aRequestData['p_DistrictName']             = '';
  252.             $aRequestData['p_Sorting']                  = $sSortierungProduktsimulation;
  253.             $aRequestData['p_ProductTyp']               = 0;
  254.             $aRequestData['v_ExportProductSimulation']  = 1;
  255.             $aRequestData['kundentyp']                  = $sKundentyp;
  256.             $aRequestData['personen']                   = $iPersonen;
  257.             try {
  258.                 // Initial-Daten holen
  259.                 $aInitialDataResponse $oClient->GetInitialData(array(
  260.                     "v_InitialData" => 1
  261.                 ));
  262.                 // Produkte aus den Initial-Daten ermitteln
  263.                 $aProdukteFromWebService $aInitialDataResponse->v_InitialData->Products->Product;
  264.                 if($session->get('warenkorb'))
  265.                 {
  266.                     $aWarenkorb $session->get('warenkorb');
  267.                 }
  268.                 // assoziatives Array "productCode => oProduct"
  269.                 foreach ($aProdukteFromWebService as $iKey => $oProdukt) {
  270.                     $aTemp[$oProdukt->ProductCode] = $oProdukt;
  271.                     if ($oProdukt->SectorCodes == $sCodeStrom)
  272.                     {
  273.                         $aProdukteStrom[] = $oProdukt->ProductCode;
  274.                     }
  275.                     if ($oProdukt->SectorCodes == $sCodeGas)
  276.                     {
  277.                         $aProdukteGas[] = $oProdukt->ProductCode;
  278.                     }
  279.                 }
  280.                 $aAlleProdukte $aTemp;
  281.                 // Ermitteln aller Produkte (Produktsimulation)
  282.                 $aProduktSimulation $oClient->GetProductSimulationWithProductTyp($aRequestData)->v_ExportProductSimulation->ProductSimulation;
  283.                 
  284.                 // Struktur anpassen
  285.                 if (is_object($aProduktSimulation)) 
  286.                 {
  287.                     if (empty($aProduktSimulation->ProductCode)) 
  288.                     {
  289.                         throw new Exception('Keine Produkte vorhanden!');
  290.                     } 
  291.                     else 
  292.                     {
  293.                         $aProduktSimulation = array($aProduktSimulation);
  294.                     }
  295.                 }
  296.                 
  297.                 $sEinheit "kWh";
  298.                 // durch die simulierten Produkte gehen und alle zusätzlichen Informationen ermitteln
  299.                 foreach ($aProduktSimulation as $iIndex => $oProdukt) {
  300.                     if ($sTarifrechnerPasswort && $oProdukt->ProductCode != $sTarifrechnerPasswort
  301.                     {
  302.                         continue;
  303.                     }
  304.                     if(array_key_exists($oProdukt->ProductCode$aWarenkorb))
  305.                     {
  306.                         continue;
  307.                     }
  308.                     // Arbeitspreis und Grundpreis ermitteln
  309.                     foreach ($oProdukt->Lines->Lines as $iLineIndex => $oLine) {
  310.                         $sPreisOhneSteuern str_replace("."""$oLine->Price);
  311.                         $sPreisOhneSteuern = (float) str_replace(",""."$sPreisOhneSteuern);
  312.                         $sPreisMitSteuern str_replace("."""$oLine->PriceWithVAT);
  313.                         $sPreisMitSteuern = (float) str_replace(",""."$sPreisMitSteuern);
  314.                         // Arbeitspreis
  315.                         if ($oLine->KindOfPrice == "V1010_VO_ARB"
  316.                         {
  317.                             $aProdukte[$iIndex]['arbeitspreis']             = number_format($sPreisOhneSteuern2","".");
  318.                             $aProdukte[$iIndex]['arbeitspreisMitSteuern']   = number_format($sPreisMitSteuern2","".");
  319.                         }
  320.                         // Grundpreis
  321.                         if ($oLine->KindOfPrice == "V1020_VO_GP"
  322.                         {
  323.                             $aProdukte[$iIndex]['grundpreis']               = number_format($sPreisOhneSteuern2","".");
  324.                             // Preis nach Steuern je Monat
  325.                             $sPreisMitSteuern $sPreisMitSteuern 12;
  326.                             
  327.                             switch ($sRundungsart) {
  328.                                 case 'kaufmännisch':
  329.                                     $sPreisMitSteuern round($sPreisMitSteuern2);
  330.                                     break;
  331.                                 case 'abrunden':
  332.                                     $sPreisMitSteuern floor($sPreisMitSteuern 100) / 100;
  333.                                     break;
  334.                                 
  335.                                 default:
  336.                                     $sPreisMitSteuern ceil($sPreisMitSteuern 100) / 100;
  337.                                     break;
  338.                             }
  339.                             
  340.                             $aProdukte[$iIndex]['grundpreisMitSteuern']     = number_format($sPreisMitSteuern2","".");
  341.                         }
  342.                     }
  343.                     // Gesamtpreis ermitteln
  344.                     $sGesamtpreis str_replace("."""$oProdukt->TotalAmount);
  345.                     $sGesamtpreis = (float) str_replace(",""."$sGesamtpreis);
  346.                     
  347.                     $aProdukte[$iIndex]['gesamtpreis'] = number_format($sGesamtpreis2","".");
  348.                     
  349.                     // Abschlag pro Monat
  350.                     $sAbschlagMonat str_replace("."""$oProdukt->TotalAmount);
  351.                     $sAbschlagMonat = (float) str_replace(",""."$sAbschlagMonat);
  352.                     $sAbschlagMonat ceil($sAbschlagMonat $iAnzahlAbschlaege);
  353.                     $aProdukte[$iIndex]['monatlAbschlag'] = number_format($sAbschlagMonat0","".");
  354.                     // Anzahl Abschlaege
  355.                     $aProdukte[$iIndex]['anzahlAbschlaege'] = $iAnzahlAbschlaege;
  356.                     // Abschlagserklärung
  357.                     $aProdukte[$iIndex]['abschlagErklaerung'] = $iAnzahlAbschlaege 12 $sAbschlagserklaerung '';
  358.                     // Mindestvertragslaufzeit
  359.                     $sVertragslaufzeit $aAlleProdukte[$oProdukt->ProductCode]->MinimumTerm;
  360.                     $aProdukte[$iIndex]['minimumTerm'] = $sVertragslaufzeit;
  361.                     // Auf Datumsformat YYYY-MM-DD in String prüfen
  362.                     if(preg_match('/^\d{4}-\d{2}-\d{2}$/'$sVertragslaufzeit)) 
  363.                     {
  364.                         $sVertragslaufzeit "bis " date("d.m.Y"strtotime($sVertragslaufzeit));
  365.                     }
  366.                     else
  367.                     {
  368.                         $sVertragslaufzeit $utilities->convertRuntimeDetails($sVertragslaufzeit);
  369.                     }
  370.                     
  371.                     $aProdukte[$iIndex]['vertragslaufzeit'] = $sVertragslaufzeit;
  372.                     // Verlängerungszeitraum
  373.                     $aProdukte[$iIndex]['verlaengerungszeitraum']   = $utilities->convertRuntimeDetails($aAlleProdukte[$oProdukt->ProductCode]->ExtensionPeriod);
  374.                     $aProdukte[$iIndex]['extensionPeriod'] = $aAlleProdukte[$oProdukt->ProductCode]->ExtensionPeriod;
  375.                     // Kündigungsfrist
  376.                     $aProdukte[$iIndex]['kuendigungsfrist'] = $utilities->convertRuntimeDetails($aAlleProdukte[$oProdukt->ProductCode]->ExtensionNotice);
  377.                     $aProdukte[$iIndex]['extensionNotice'] = $aAlleProdukte[$oProdukt->ProductCode]->ExtensionNotice;
  378.                     // Produktbeschreibung
  379.                     $aProdukte[$iIndex]['produktbeschreibung'] = $oProdukt->ProductDescription;
  380.                     // Produktcode
  381.                     $aProdukte[$iIndex]['produktcode'] = $oProdukt->ProductCode;
  382.                     // Spatencode
  383.                     $aProdukte[$iIndex]['spatencode'] = $aAlleProdukte[$oProdukt->ProductCode]->SectorCodes;
  384.                     // Verlinkung, um Produkt dem Warenkorb hinzuzufügen
  385.                     $aProdukte[$iIndex]['linkWarenkorb'] = "/tarifrechner/tarif-waehlen";
  386.                     
  387.                     if(in_array($oProdukt->ProductCode$aProdukteGas) || in_array($oProdukt->ProductCode$aProdukteStrom))
  388.                     {
  389.                         $sEinheit "kWh";
  390.                     }
  391.                     else
  392.                     {
  393.                         $sEinheit "m³";
  394.                     }
  395.                     $aTarifInfo[$oProdukt->ProductCode] = array(
  396.                         'produktcode'               => $oProdukt->ProductCode,
  397.                         'produktname'               => $aProdukte[$iIndex]['produktbeschreibung'],
  398.                         'gesamtpreis'               => $aProdukte[$iIndex]['gesamtpreis'],
  399.                         'arbeitspreis'              => $aProdukte[$iIndex]['arbeitspreisMitSteuern'],
  400.                         'grundpreis'                => $aProdukte[$iIndex]['arbeitspreisMitSteuern'],
  401.                         'abschlag'                  => $aProdukte[$iIndex]['monatlAbschlag'],
  402.                         'vertragslaufzeit'          => $aProdukte[$iIndex]['vertragslaufzeit'],
  403.                         'verlaengerungszeitraum'    => $aProdukte[$iIndex]['verlaengerungszeitraum'],
  404.                         'kuendigungsfrist'          => $aProdukte[$iIndex]['kuendigungsfrist'],
  405.                         'vertragslaufzeit_ws'       => $aProdukte[$iIndex]['minimumTerm'],
  406.                         'verlaengerungszeitraum_ws' => $aProdukte[$iIndex]['extensionPeriod'],
  407.                         'kuendigungsfrist_ws'       => $aProdukte[$iIndex]['extensionNotice'],
  408.                         'einheit'                   => $sEinheit
  409.                     );
  410.                 }
  411.             } catch (Exception $error) {
  412.                 $aError $error;
  413.             }
  414.         }
  415.         if($aTarifInfo)
  416.         {
  417.             $session->set('tarifinfo'$aTarifInfo);
  418.         }
  419.         // Gibt es einen Warenkorb
  420.         if (!$this->getUser() && $session->get("warenkorb") && count($session->get("warenkorb")) > 0
  421.         {
  422.             // anonymer Nutzer
  423.             $bWarenkorbExists true;
  424.         } 
  425.         elseif($this->getUser() && $doctrine->getRepository(Warenkorb::class)->findBy(["userid" => $this->getUser()->getId()])) 
  426.         {
  427.             // angemeldeter Nutzer
  428.             $bWarenkorbExists true;
  429.         }
  430.         // Daten zum Einzugsgebiet in die Session speichern
  431.         $session->set("requestData"$aRequestData);
  432.         if(key_exists('p_SectorCodes'$aRequestData))
  433.         {
  434.             $sSparte $aRequestData['p_SectorCodes'];
  435.         }
  436.         if(key_exists('personen'$aRequestData))
  437.         {
  438.             $iPersonen $aRequestData['personen'];
  439.         }
  440.         if(key_exists('p_Quantity'$aRequestData))
  441.         {
  442.             $sJahresverbrauch $aRequestData['p_Quantity'];
  443.         }
  444.         $sPlz "";
  445.         if(key_exists('p_PostCode'$aRequestData))
  446.         {
  447.             $sPlz $aRequestData['p_PostCode'];
  448.         }
  449.         $sOrt "";
  450.         if(key_exists('p_CityName'$aRequestData))
  451.         {
  452.             $sOrt $aRequestData['p_CityName'];
  453.         }
  454.         $sStrasse "";
  455.         if(key_exists('p_StreetName'$aRequestData))
  456.         {
  457.             $sStrasse $aRequestData['p_StreetName'];
  458.         }
  459.         $aReturn = array(
  460.             'spartenkennung'    => $aSpartenkennung,
  461.             'einzugsgebiet'     => $aProduktgebiet,
  462.             'produkte'          => $aProdukte,
  463.             'jahresverbrauch'   => $sJahresverbrauch,
  464.             'requestData'       => $aRequestData,
  465.             'error'             => $aError,
  466.             'warenkorbExists'   => $bWarenkorbExists,
  467.             'inputReadonly'     => $bWarenkorbExists,
  468.             'step'              => $iStep,
  469.             'text_bereits_kunde'    => $sTextBereitsKunde,
  470.             'text_gewerbeprodukte'  => $sTextGewerbeprodukte,
  471.             'gewerbeprodukte'   => $sGewerbeprodukte,
  472.             'simulation'            => $request->get('formSend') ? true false,
  473.             'tarifrechner_passwort' => $bTarifrechnerPasswort,
  474.             'kundentyp'         => $sKundentyp,
  475.             'sparte'            => $sSparte,
  476.             'personen'          => $iPersonen,
  477.             'plz'               => $sPlz,
  478.             'ort'               => $sOrt,
  479.             'strasse'           => $sStrasse
  480.         );
  481.         return $this->render('tarifrechner/index.html.twig'$aReturn);
  482.     }
  483.     #[Route('/tarifrechner/tarif-waehlen'name'app_tarifrechner_tarif_waehlen')]
  484.     public function tarifwaehlen(Request $requestManagerRegistry $doctrineEntityManagerInterface $entityManagerUtilities $utilities): Response
  485.     {
  486.         // Warenkorb
  487.         $iStep      2;
  488.         $session    = new Session();
  489.         
  490.         $aWarenkorb = array();
  491.         // bereits ausgewählte Produkte aus der Session holen
  492.         if(!$session->get('warenkorb')) 
  493.         {
  494.             $session->set('warenkorb'$aWarenkorb);
  495.         }
  496.         $aWarenkorb $session->get('warenkorb');
  497.         // Prüfen, ob ein Produkt existiert was zum Warenkorb hinzugefügt werden muss
  498.         if($request->get("produktcode")) 
  499.         {
  500.             if(!key_exists($request->get("produktcode"), $aWarenkorb))
  501.             {
  502.                 $aWarenkorb[$request->get("produktcode")] = array(
  503.                     'spartencode'           => $request->get("spartencode") ? trim($request->get("spartencode")) : '',
  504.                     'produktcode'           => $request->get("produktcode") ? trim($request->get("produktcode")) : '',
  505.                     'produktbeschreibung'   => $request->get("produktbeschreibung") ? trim($request->get("produktbeschreibung")) : '',
  506.                     'jahresverbrauch'       => $request->get("jahresverbrauch") ? trim($request->get("jahresverbrauch")) : '',
  507.                     'gesamtpreis'           => $request->get("gesamtpreis") ? trim($request->get("gesamtpreis")) : ''
  508.                 );
  509.     
  510.                 // Warenkorb speichern
  511.                 $session->set('warenkorb'$aWarenkorb);
  512.             }
  513.         }
  514.         $aReturn = array(
  515.             'produkte'          => $aWarenkorb,
  516.             'step'              => $iStep
  517.         );
  518.         return $this->render('tarifrechner/tarif-waehlen.html.twig'$aReturn);
  519.     }
  520.     #[Route('/tarifrechner/verbrauchsstelle'name'app_tarifrechner_verbrauchsstelle')]
  521.     public function verbrauchsstelle(Request $requestManagerRegistry $doctrineEntityManagerInterface $entityManagerUtilities $utilities): Response
  522.     {
  523.         // Verbrauchsstelle
  524.         $iStep          3;
  525.         $session            = new Session();
  526.         $oWebservice        = new WebserviceController();
  527.         $oClient            $oWebservice->getClient($doctrine);
  528.         $aRequestData       $session->get("requestData");
  529.         $aWarenkorb         $session->get("warenkorb");
  530.         $sVerbrauchsstelle  $session->get("verbrauchsstelle");
  531.         // Fallback Spartenkennung
  532.         $aSpartenkennung  = array(
  533.             "SVV" => "Strom",
  534.             "GVV" => "Gas",
  535.             "WVV" => "Wasser",
  536.             "FWV" => "Fernwärme"
  537.         );
  538.         // Produktspaten ermitteln
  539.         $oSpartencodes $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_spatencodes"]);
  540.         if($oSpartencodes && $oSpartencodes->getMetavalue())
  541.         {
  542.             $aSpartenkennung json_decode($oSpartencodes->getMetavalue(), true);
  543.         }
  544.         // Initialdaten ermitteln
  545.         $aInitialData $oClient->GetInitialData(array(
  546.             "v_InitialData" => 1
  547.         ));
  548.         // Lieferanten ermitteln
  549.         $aLieferanten $aInitialData->v_InitialData->Presuppliers->Presupplier;
  550.         // Anordnung und Sortierung der Lieferanten
  551.         foreach($aLieferanten as $iKey => $oLieferant
  552.         {
  553.             foreach($aWarenkorb as $sProduktcode => $aProdukt)
  554.             {
  555.                 $aTemp[] = $oLieferant;
  556.             }
  557.         }
  558.         ksort($aTemp);
  559.         $aLieferanten $aTemp;
  560.         if($request->getMethod() == "POST" && $request->get('formSend')) 
  561.         {
  562.             // speichern der Daten aus "Verbrauchsstelle"
  563.             $session->set("verbrauchsstelle"$request->request->all());
  564.             
  565.             if(!$session->get("verbrauchsstelle")) 
  566.             {
  567.                 $aError = array(
  568.                     'message' => "Übertragende Daten (Verbrauchsstelle) konnten nicht gespeichert werden!"
  569.                 );
  570.                 return $this->render('tarifrechner/verbrauchsstelle.html.twig'$aError);
  571.             }
  572.             return $this->redirectToRoute('app_tarifrechner_personendaten');
  573.         }
  574.         // Produktgebiet ermitteln (PLZ, Ort, Strasse, Anschlussobjekt)
  575.         $oPortalsettings $doctrine->getRepository(Portalsettings::class)->findBy(["type" => "tarifrechner""metakey" => "tarifrechner_produktgebiet"])[0]->getMetavalue();
  576.         
  577.         if($oPortalsettings
  578.         {
  579.             $aProduktgebiet $oPortalsettings;
  580.         } 
  581.         else 
  582.         {
  583.             $aProduktgebiet = array(
  584.                 "Anschlussobjekt"
  585.             );
  586.         }
  587.         $bWarenkorbExists false;
  588.         if($aWarenkorb)
  589.         {
  590.             $bWarenkorbExists true;
  591.         }
  592.         $aReturn = array(
  593.             'requestData'       => $aRequestData,
  594.             'einzugsgebiet'     => $aProduktgebiet,
  595.             'produkte'          => $aWarenkorb,
  596.             'step'              => $iStep,
  597.             'lieferanten'       => $aLieferanten,
  598.             'spartencodes'      => $aSpartenkennung,
  599.             'verbrauchsstelle'  => $sVerbrauchsstelle,
  600.             'warenkorbExists'   => $bWarenkorbExists
  601.         );
  602.         return $this->render('tarifrechner/verbrauchsstelle.html.twig'$aReturn);
  603.     }
  604.     #[Route('/tarifrechner/personendaten'name'app_tarifrechner_personendaten')]
  605.     public function personendaten(Request $requestManagerRegistry $doctrineEntityManagerInterface $entityManagerUtilities $utilities): Response
  606.     {
  607.         // Persönliche Daten
  608.         $iStep          4;
  609.         $session        = new Session();
  610.         // Anreden ermitteln
  611.         $aAnreden $doctrine->getRepository(Auswahllisten::class)->findBy(["type" => "anreden"]);
  612.         $aReturn        = array();
  613.         
  614.         $sKundentyp     null;
  615.         $aPersonDaten   null;
  616.         // Kundentyp aus Session ermitteln, sofern vorhanden
  617.         if($session->get("requestData"))
  618.         {
  619.             $sKundentyp $session->get("requestData")['kundentyp'];
  620.         }
  621.         // Persönliche Daten aus Session ermitteln, sofern vorhanden
  622.         if($session->get("personendaten")) 
  623.         {
  624.             $aPersonDaten $session->get("personendaten");
  625.         }
  626.         
  627.         // Anreden ermitteln
  628.         if ($aAnreden
  629.         {
  630.             $aTemp = array();
  631.             
  632.             foreach ($aAnreden as $iIndex => $oOption
  633.             {
  634.                 $aTemp[$oOption->getMetavalue()] = $oOption->getMetaKey();
  635.             }
  636.             $aAnredeOptionen $aTemp;
  637.         } 
  638.         else 
  639.         {
  640.             $aAnredeOptionen = array(
  641.                 "HERRN"         => "Herr",
  642.                 "FRAU"          => "Frau",
  643.                 "FAMILIE"       => "Familie",
  644.                 "AN DIE GEB"    => "An die Gebrüder",
  645.                 "AN DIE GES"    => "An die Geschwister",
  646.                 "HERR UND F"    => "Herr und Frau",
  647.             );
  648.         }
  649.         $aWarenkorb $session->get("warenkorb");
  650.         if($request->getMethod() == "POST" && $request->get('formSend')) 
  651.         {
  652.             // Formulardaten ermitteln und in Session speichern
  653.             $aPersonDaten $request->request->all();
  654.             $session->set("personendaten"$aPersonDaten);
  655.             $aReturn = array(
  656.                 'anredeOptionen'    => $aAnredeOptionen,
  657.                 'kundentyp'         => $sKundentyp,
  658.                 'personDaten'       => $aPersonDaten,
  659.                 'produkte'          => $aWarenkorb,
  660.                 'step'              => $iStep
  661.             );
  662.             if(!$session->get("personendaten")) 
  663.             {
  664.                 $aError = array(
  665.                     'message' => "Übertragende Daten (Persönliche Daten) konnten nicht gespeichert werden!"
  666.                 );
  667.                 return $this->render('tarifrechner/persoenlichedaten.html.twig'$aError);
  668.             }
  669.             return $this->redirectToRoute('app_tarifrechner_zahlweise');
  670.         }
  671.         $bWarenkorbExists false;
  672.         if($aWarenkorb)
  673.         {
  674.             $bWarenkorbExists true;
  675.         }
  676.         $aReturn = array(
  677.             'anredeOptionen'    => $aAnredeOptionen,
  678.             'kundentyp'         => $sKundentyp,
  679.             'personDaten'       => $aPersonDaten,
  680.             'produkte'          => $aWarenkorb,
  681.             'step'              => $iStep,
  682.             'warenkorbExists'   => $bWarenkorbExists
  683.         );
  684.         return $this->render('tarifrechner/persoenlichedaten.html.twig'$aReturn);
  685.     }
  686.     #[Route('/tarifrechner/zahlweise'name'app_tarifrechner_zahlweise')]
  687.     public function zahlweise(Request $requestManagerRegistry $doctrineEntityManagerInterface $entityManagerUtilities $utilities): Response
  688.     {
  689.         // Zahlweise
  690.         $iStep              5;
  691.         $session            = new Session();
  692.         $aWarenkorb         $session->get("warenkorb");
  693.         // Texte
  694.         $oHinweis        $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "bankdaten_hinweis"]);
  695.         $sHinweis        "Ich ermächtige die Stadtwerke Musterstadt (Gläubiger-Identifikationsnummer: MUSTER123, Mandatsreferenz wird separat mitgeteilt), Zahlungen von meinem Konto mittels Lastschrift einzulösen.";
  696.         if($oHinweis)
  697.         {
  698.             $sHinweis $oHinweis->getMetavalue();
  699.         }
  700.         $aZahlweise null;
  701.         if($session->get('zahlweise'))
  702.         {
  703.             $aZahlweise $session->get('zahlweise');
  704.         }
  705.         $bWarenkorbExists false;
  706.         if($aWarenkorb)
  707.         {
  708.             $bWarenkorbExists true;
  709.         }
  710.         $aReturn = array(
  711.             'zahlweise'                 => $aZahlweise,
  712.             'hinweis'                   => $sHinweis,
  713.             'produkte'                  => $aWarenkorb,
  714.             'step'                      => $iStep,
  715.             'warenkorbExists'           => $bWarenkorbExists
  716.         );
  717.         if($request->getMethod() == "POST" && $request->get('formSend')) 
  718.         {
  719.             // speichern der Daten aus "Zahlweise"
  720.             $session->set("zahlweise"$request->request->all());
  721.             return $this->redirectToRoute('app_tarifrechner_zusammenfassung');
  722.         }
  723.         return $this->render('tarifrechner/zahlweise.html.twig'$aReturn);
  724.     }
  725.     #[Route('/tarifrechner/zusammenfassung'name'app_tarifrechner_zusammenfassung')]
  726.     public function zusammenfassung(Request $requestManagerRegistry $doctrineEntityManagerInterface $entityManagerUserPasswordHasherInterface $userPasswordHasherUtilities $utilities): Response
  727.     {
  728.         // Zusammenfassung
  729.         $iStep              6;
  730.         $session            = new Session();
  731.         $oWebservice        = new WebserviceController();
  732.         $oClient            $oWebservice->getClient($doctrine);
  733.         
  734.         $aRequestData       $session->get('requestData');
  735.         $aWarenkorb         $session->get('warenkorb');
  736.         $aVerbrauchsstelle  $session->get('verbrauchsstelle');
  737.         $aPersonenDaten     $session->get('personendaten');
  738.         $aZahlweise         $session->get('zahlweise');
  739.         $aResult            = array();        
  740.         $aZustellarten      = array("Abruf im Kundenportal""Zustellung per E-Mail");
  741.         
  742.         if($aZahlweise)
  743.         {
  744.             $session->set('zahlweise'$aZahlweise);
  745.         }
  746.         $aTarifinfo null;
  747.         if($session->get('tarifinfo'))
  748.         {
  749.             $aTarifinfo $session->get('tarifinfo');
  750.         }
  751.         $oLinks             = new LinksController();
  752.         $sImpressum         $oLinks->getImpressum($doctrineNULL);
  753.         $sDatenschutz       $oLinks->getDatenschutz($doctrineNULL);
  754.         $sBarrierefreiheit  $oLinks->getBarrierefreiheit($doctrineNULL);
  755.         $sWiderruf          $oLinks->getWiderruf($doctrineNULL);
  756.         $sHilfe             $oLinks->getHilfe($doctrineNULL);
  757.         // falls die Session leer sein sollte...
  758.         if(!$aWarenkorb || !$aPersonenDaten || !$aVerbrauchsstelle || !$aZahlweise) {
  759.             $this->addFlash(
  760.                 'neu',
  761.                 'Diese Sitzung ist abgelaufen. Die Tarifwahl wird neu gestartet.'
  762.             );
  763.             return $this->redirectToRoute('app_tarifrechner');
  764.         }
  765.         // Adresse der Verbrauchsstelle ermitteln
  766.         $sPlz           "";
  767.         $sOrt           "";
  768.         $sOrtsteil      "";
  769.         $sStrasse       "";
  770.         $sHausNr        "";
  771.         $sHausNrZusatz  "";
  772.         if(key_exists("plz"$aVerbrauchsstelle))
  773.         {
  774.             $sPlz $aVerbrauchsstelle["plz"];
  775.         }
  776.         if(key_exists("ort"$aVerbrauchsstelle))
  777.         {
  778.             $sOrt $aVerbrauchsstelle["ort"];
  779.         }
  780.         if(key_exists("ortsteil"$aVerbrauchsstelle))
  781.         {
  782.             $sOrtsteil $aVerbrauchsstelle["ortsteil"];
  783.         }
  784.         if(key_exists("strasse"$aVerbrauchsstelle))
  785.         {
  786.             $sStrasse $aVerbrauchsstelle["strasse"];
  787.         }
  788.         if(key_exists("hausnr"$aVerbrauchsstelle))
  789.         {
  790.             $sHausNr $aVerbrauchsstelle["hausnr"];
  791.         }
  792.         if(key_exists("hausnrzusatz"$aVerbrauchsstelle))
  793.         {
  794.             $sHausNrZusatz $aVerbrauchsstelle["hausnrzusatz"];
  795.         }
  796.         // Initialdaten ermitteln
  797.         $aInitialData $oClient->GetInitialData(array(
  798.             "v_InitialData" => 1
  799.         ));
  800.         // Lieferanten ermitteln
  801.         $aLieferanten   $aInitialData->v_InitialData->Presuppliers->Presupplier;
  802.         $aTemp          = array();
  803.         
  804.         // Anordnung und Sortierung der Lieferanten
  805.         foreach($aLieferanten as $iKey => $oLieferant
  806.         {
  807.             foreach($aVerbrauchsstelle['bisheriger_lieferant'] as $sProduktcode => $sLieferantencode
  808.             {
  809.                 if($sLieferantencode == $oLieferant->PresupplierCode)
  810.                 {
  811.                     $aTemp[$sProduktcode] = $oLieferant;
  812.                 }
  813.             }
  814.         }
  815.         ksort($aTemp);
  816.         
  817.         $aVerbrauchsstelle['vorlieferant'] = $aTemp;
  818.         
  819.         $sKundentyp null;
  820.         // Geschäftspartnertyp
  821.         // 1 => privat; 2 => gewerbe
  822.         $iGPTyp 1;
  823.         if($aRequestData && key_exists('kundentyp'$aRequestData))
  824.         {
  825.             $sKundentyp $aRequestData['kundentyp'];
  826.             if($sKundentyp == "gewerbe")
  827.             {
  828.                 $iGPTyp 2;
  829.             }
  830.         }
  831.         
  832.         // Fallback Spartenkennung
  833.         $aSpartenkennung  = array(
  834.             "SVV" => "Strom",
  835.             "GVV" => "Gas",
  836.             "WVV" => "Wasser",
  837.             "FWV" => "Fernwärme"
  838.         );
  839.         // Produktspaten ermitteln
  840.         $oSpartencodes $doctrine->getRepository(Portalsettings::class)->findOneBy(["type" => "tarifrechner""metakey" => "tarifrechner_spatencodes"]);
  841.         if($oSpartencodes && $oSpartencodes->getMetavalue())
  842.         {
  843.             $aSpartenkennung json_decode($oSpartencodes->getMetavalue(), true);
  844.         }
  845.         $bWarenkorbExists false;
  846.         
  847.         $aLinks         = array();
  848.         $aLinksTemp     = array();
  849.         $aFilterlist    = array();
  850.         
  851.         if($aWarenkorb)
  852.         {
  853.             $bWarenkorbExists true;
  854.         
  855.             foreach($aWarenkorb as $iKey => $aProdukt)
  856.             {
  857.                 $sProduktCode           $aProdukt["produktcode"];
  858.                 $sProduktSparte         $aProdukt["spartencode"];
  859.                 $sProduktbeschreibung   $aProdukt["produktbeschreibung"];
  860.                 
  861.                 $aLinksProduktcode      $doctrine->getRepository(Links::class)->findBy(["produktcode" => $sProduktCode'bezeichnung' => $sProduktbeschreibung]);
  862.                 $aLinksSparte           $doctrine->getRepository(Links::class)->findBy(["produktcode" => $sProduktSparte'bezeichnung' => $sProduktbeschreibung]);
  863.                 if(!$aLinksProduktcode)
  864.                 {
  865.                     $aLinksProduktcode  $doctrine->getRepository(Links::class)->findBy(["produktcode" => $sProduktCode]);
  866.                 }
  867.                 
  868.                 if(!$aLinksSparte)
  869.                 {
  870.                     $aLinksSparte       $doctrine->getRepository(Links::class)->findBy(["produktcode" => $sProduktSparte]);
  871.                 }
  872.                 $aLinksTemp         array_merge($aLinksProduktcode$aLinksSparte);
  873.                 $sLinks             "";
  874.                 foreach($aLinksTemp as $iKey2 => $oLink)
  875.                 {
  876.                     if(key_exists($sProduktCode$aFilterlist))
  877.                     {
  878.                         $bLinkExists in_array($oLink->getLink(), $aFilterlist[$sProduktCode]);
  879.                         $bFileExists in_array($oLink->getDatei(), $aFilterlist[$sProduktCode]);
  880.                         
  881.                         if($bLinkExists || $bFileExists)
  882.                         {
  883.                             continue;
  884.                         }
  885.                     }
  886.                     $sMandant "";
  887.                     if($oLink->getMandantenid())
  888.                     {
  889.                         $sMandant $oLink->getMandantenid() . "/";
  890.                     }
  891.                     if(!empty($oLink->getLink()))
  892.                     {
  893.                         $sBezeichnung $oLink->getLink();
  894.                         if($oLink->getBezeichnung())
  895.                         {
  896.                             $sBezeichnung $oLink->getBezeichnung();
  897.                         }
  898.                         $sLinks .= "<a href='"$oLink->getLink() . "' target='_blank' class='text-danger'>" $sBezeichnung "</a><br>";
  899.                         $aFilterlist[$sProduktCode][] = $oLink->getLink();
  900.                     }
  901.                     if(!empty($oLink->getDatei())) 
  902.                     {
  903.                         $sBezeichnung $oLink->getDatei();
  904.                         if($oLink->getBezeichnung())
  905.                         {
  906.                             $sBezeichnung $oLink->getBezeichnung();
  907.                         }
  908.                         
  909.                         $sLinks .= "<a href='/customerdata/" $sMandant $oLink->getDatei() . "' target='_blank' class='text-danger'>" $sBezeichnung "</a><br>";
  910.                         $aFilterlist[$sProduktCode][] = $oLink->getDatei();
  911.                     }
  912.                 }
  913.                 
  914.                 $aLinks[$sProduktCode] = $sLinks;
  915.             }
  916.         }
  917.         
  918.         $aReturn = array(
  919.             'personendaten'     => $aPersonenDaten,
  920.             'verbrauchsstelle'  => $aVerbrauchsstelle,
  921.             'produkte'          => $aWarenkorb,
  922.             'tarifinfo'         => $aTarifinfo,
  923.             'zahlweise'         => $aZahlweise,
  924.             'kundentyp'         => $sKundentyp,
  925.             'step'              => $iStep,
  926.             'warenkorbExists'   => $bWarenkorbExists,
  927.             'links'             => $aLinks,
  928.             'sparten'           => $aSpartenkennung,
  929.             'plz'               => $sPlz,
  930.             'ort'               => $sOrt,
  931.             'ortsteil'          => $sOrtsteil,
  932.             'strasse'           => $sStrasse,
  933.             'hausnr'            => $sHausNr,
  934.             'hausnrzusatz'      => $sHausNrZusatz,
  935.         );
  936.         if($request->getMethod() == "POST" && $request->get('formSend')) 
  937.         {
  938.             // Gewählte Zustellart speichern
  939.             $oUser null;
  940.             
  941.             if($aPersonenDaten['email'])
  942.             {
  943.                 $oUser $doctrine->getRepository(user::class)->findOneBy(["email" => $aPersonenDaten['email']]);
  944.             }
  945.             // UseCase 'MELD_NEU_EIN'   - Einzug
  946.             // UseCase 'MELD_NEU_LIEF'  - Neuer Lieferant
  947.             $sUsecase "MELD_NEU_EIN";
  948.             if($aVerbrauchsstelle['switch_usecase'])
  949.             {
  950.                 $sUsecase $aVerbrauchsstelle['switch_usecase'];
  951.             }
  952.             $iTransactionId null;
  953.             if($aWarenkorb
  954.             {
  955.                 $aMessages = array();
  956.                 foreach($aWarenkorb as $iKey => $aProdukt
  957.                 {
  958.                     $iCustomerId        '';
  959.                     $sBaseContractNo    '';
  960.                     $sSpartencode       $aProdukt['spartencode'];
  961.                     $sProduktcode       $aProdukt['produktcode'];
  962.                     $aData = array(
  963.                         'MS_TSPARTE'    => $aSpartenkennung[$sSpartencode],
  964.                         'MS_STRASSE'    => $sStrasse,
  965.                         'MS_HAUSNR'     => $sHausNr,
  966.                         'MS_HAUSNRZ'    => $sHausNrZusatz,
  967.                         'MS_PLZ'        => $sPlz,
  968.                         'MS_ORT'        => $sOrt,
  969.                         'MS_ORTSTEIL'   => $sOrtsteil,
  970.                         'PD_GPTYP'      => $iGPTyp,
  971.                         'PD_ANREDE'     => $aPersonenDaten['anrede'],
  972.                         'PD_NAME1'      => key_exists('name'$aPersonenDaten) ? $aPersonenDaten['name'] : "",
  973.                         'PD_NAME2'      => key_exists('name2'$aPersonenDaten) ? $aPersonenDaten['name2'] : "",
  974.                         'PD_VORNAME'    => $aPersonenDaten['vorname'],
  975.                         'PD_NACHNAME'   => $aPersonenDaten['nachname'],
  976.                         'PD_STRASSE'    => $sStrasse,
  977.                         'PD_HAUSNR'     => $sHausNr,
  978.                         'PD_HAUSNRZ'    => $sHausNrZusatz,
  979.                         'PD_PLZ'        => $sPlz,
  980.                         'PD_ORT'        => $sOrt,
  981.                         'PD_ORTSTEIL'   => $sOrtsteil,
  982.                         'PD_CNTRYREGCODE' => 'DE',
  983.                         'PD_EMAIL'      => $aPersonenDaten['email'],
  984.                         'PD_TEL'        => $aPersonenDaten['telefon'],
  985.                         'PD_MOBIL'      => $aPersonenDaten['mobil'],
  986.                         'PD_REGGERICHT' => key_exists('registergericht'$aPersonenDaten) ? $aPersonenDaten['registergericht'] : "",
  987.                         'GD_REGISTERNR' => key_exists('registernr'$aPersonenDaten) ? $aPersonenDaten['registernr'] : "",
  988.                     );
  989.                     // Parameter bei abweichender Rechnungsadresse
  990.                     if (isset($aPersonenDaten['abweichende_rechnungsadresse']) && $aPersonenDaten['abweichende_rechnungsadresse'] == 1
  991.                     {
  992.                         $aData['PD_ABW_GPVORH']         = 1;
  993.                         $aData['PD_ABW_GPTYP']          = 1;
  994.                         $aData['PD_ABW_ANREDE']         = $aPersonenDaten['anrede'];
  995.                         $aData['PD_ABW_NAME1']          = '';
  996.                         $aData['PD_ABW_NAME2']          = '';
  997.                         $aData['PD_ABW_VORNAME']        = $aPersonenDaten['vorname'];
  998.                         $aData['PD_ABW_NACHNAME']       = $aPersonenDaten['nachname'];
  999.                         $aData['PD_ABW_STRASSE']        = $aPersonenDaten['rechnungStrasse'];
  1000.                         $aData['PD_ABW_HAUSNR']         = $aPersonenDaten['rechnungHausnummer'];
  1001.                         $aData['PD_ABW_HAUSNRZ']        = $aPersonenDaten['rechnungHausnrzusatz'];
  1002.                         $aData['PD_ABW_PLZ']            = $aPersonenDaten['rechnungPlz'];
  1003.                         $aData['PD_ABW_ORT']            = $aPersonenDaten['rechnungOrt'];
  1004.                         $aData['PD_ABW_ORTSTEIL']       = $aPersonenDaten['rechnungOrtsteil'];
  1005.                         $aData['PD_ABW_CNTRYREGCODE']   = 'DE';
  1006.                         $aData['PD_ABW_EMAIL']          = $aPersonenDaten['email'];
  1007.                     }
  1008.                     else
  1009.                     {
  1010.                         $aData['PD_ABW_GPVORH']         = 0;
  1011.                     }
  1012.                     // Parameter für Zahlungsart
  1013.                     // Bei Lastschrift entsprechende Kontoinformationen
  1014.                     if($aZahlweise['zahlweise'] && $aZahlweise['zahlweise'] == 'lastschrift'
  1015.                     {
  1016.                         $aData['BD_PMVORH']         = 0;
  1017.                         $aData['BD_ZAHLUNGSART']    = 1;
  1018.                         $aData['BD_IBAN']           = $aZahlweise['iban'];
  1019.                         $aData['BD_SWIFT']          = $aZahlweise['bic'];
  1020.                         // Parameter für abweichenden Kontoinhaber
  1021.                         if(isset($aZahlweise['abweichender_kontoinhaber']) && !empty($aZahlweise['abweichender_kontoinhaber'])) 
  1022.                         {
  1023.                             $aData['BD_KINHABER']   = $aZahlweise['abweichender_kontoinhaber'];
  1024.                             $aData['BD_PMVORH']     = 1;
  1025.                         } 
  1026.                         else 
  1027.                         {
  1028.                             $aData['BD_KINHABER']   = $aPersonenDaten['vorname'] . " " $aPersonenDaten['nachname'];
  1029.                         }
  1030.                     } 
  1031.                     else 
  1032.                     {
  1033.                         $aData['BD_ZAHLUNGSART']    = 2;
  1034.                     }
  1035.                     $aData['VD_LIEFBEGINN'] = $aVerbrauchsstelle['einzug_datum'];
  1036.                     $aData['VD_PRODUKT']    = $aProdukt['produktcode'];
  1037.                     $aData['VD_PROGNOSE']   = $aProdukt['jahresverbrauch'];
  1038.                     $aData['ZS_ZNUMMER']    = $aVerbrauchsstelle['zaehlernummer'][$sProduktcode];
  1039.                     $aData['MS_MALO']       = $aVerbrauchsstelle['marktlokation'][$sProduktcode];
  1040.                     if($sUsecase == "MELD_NEU_LIEF"
  1041.                     {
  1042.                         $iVorliefGekuendigt false;
  1043.                         if(key_exists("check_supplier_terminated"$aVerbrauchsstelle) && key_exists($sProduktcode$aVerbrauchsstelle['check_supplier_terminated']))
  1044.                         {
  1045.                             if($aVerbrauchsstelle['check_supplier_terminated'][$sProduktcode] == "on")
  1046.                             {
  1047.                                 $iVorliefGekuendigt true;
  1048.                             }
  1049.                         }
  1050.                         $aData['VD_LIEFBEGINN']         = $aVerbrauchsstelle['lieferbeginn_datum'];
  1051.                         $aData['VORLIEF']               = $aVerbrauchsstelle['bisheriger_lieferant'][$sProduktcode];
  1052.                         $aData['VORLIEF_KUENDIGUNG']    = $iVorliefGekuendigt;
  1053.                         $aData['VORLIEF_KDNR']          = $aVerbrauchsstelle['kundennummer_lieferant'][$sProduktcode];
  1054.                     }
  1055.                     $aResult $oWebservice->sendData(
  1056.                         $doctrine,
  1057.                         $sUsecase,
  1058.                         $iCustomerId,
  1059.                         $sBaseContractNo,
  1060.                         $aData
  1061.                     );
  1062.                     if(!$aResult->return_value)
  1063.                     {
  1064.                         if(!key_exists("error"$aMessages))
  1065.                         {
  1066.                             $this->addFlash(
  1067.                                 'error',
  1068.                                 $aResult->v_ErrorMessage
  1069.                             );
  1070.                             $aMessages['error'] = $aResult->v_ErrorMessage;
  1071.                         }
  1072.                         return $this->render('tarifrechner/zusammenfassung.html.twig'$aReturn);
  1073.                     }
  1074.                     else
  1075.                     {
  1076.                         if(!$iTransactionId)
  1077.                         {
  1078.                             $iTransactionId $aResult->v_TransactionID;
  1079.                         }
  1080.                         
  1081.                         if(!key_exists("neu"$aMessages))
  1082.                         {
  1083.                             $sMessage "Ihre Bestellung ist bei uns eingegangen. Sie erhalten schnellstmöglich von uns eine Bestätigung. Bei Fragen können Sie uns gerne kontaktieren.";
  1084.                             
  1085.                             $this->addFlash(
  1086.                                 'neu',
  1087.                                 $sMessage
  1088.                             );
  1089.     
  1090.                             $aMessages['neu'] = $sMessage;
  1091.                         }
  1092.                     }
  1093.                 }
  1094.                 // Mailversand
  1095.                 $oMailer = new MailController();
  1096.                 $oMailer $oMailer->getMailer($doctrine);
  1097.                 $oSystem    $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  1098.                 $sStyle     "";
  1099.                 $sFile      "css/email.css";
  1100.                 if(file_exists($sFile))
  1101.                 {
  1102.                     $sStyle file_get_contents($sFile);
  1103.                 }
  1104.                 $sFile      "css/customer.css";
  1105.                 if(file_exists($sFile))
  1106.                 {
  1107.                     $sStyle .= file_get_contents($sFile);
  1108.                 }
  1109.                 // Mailsignatur
  1110.                 $oInhalte  = new InhalteController();
  1111.                 $sSignatur $oInhalte->getMailSignatur($doctrineNULL);
  1112.                 if($iGPTyp == 1)
  1113.                 {
  1114.                     $sAnrede "Sehr geehrte Damen und Herren";
  1115.                     $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1116.                     if($oAnrede)
  1117.                     {
  1118.                         $sAnrede $oAnrede->getMetavalue();
  1119.                     }
  1120.                 }
  1121.                 else
  1122.                 {
  1123.                     // Anrede Firma
  1124.                     $sAnrede "An Firma " $aPersonenDaten['name'] . " " $aPersonenDaten['name2'];
  1125.                     
  1126.                     // Anrede Ansprechpartner
  1127.                     if($aPersonenDaten['nachname'])
  1128.                     {
  1129.                         if($aPersonenDaten['vorname'])
  1130.                         {
  1131.                             $sApVorname $aPersonenDaten['vorname'] . " ";
  1132.                         }
  1133.                         $sAnrede "Sehr geehrte(r) Herr/ Frau " $sApVorname $aPersonenDaten['nachname'];
  1134.                     }
  1135.                 }
  1136.                 $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1137.                 $sMail      'portal.support@msu-solutions.de';
  1138.                 if($oAbsender)
  1139.                 {
  1140.                     $sMail $oAbsender->getMetavalue();
  1141.                 }
  1142.                 $oMail = (new TemplatedEmail())
  1143.                     ->from($sMail)
  1144.                     ->to($aPersonenDaten['email'])
  1145.                     ->subject("Übertragung Auftrag")
  1146.                     //->text('Auftrag ist bei uns angekommen')
  1147.                     // path of the Twig template to render
  1148.                     ->htmlTemplate('emails/tarifrechner_tarifbeantragung.html.twig')
  1149.                     // pass variables (name => value) to the template
  1150.                     ->context([
  1151.                         'anrede'            => $sAnrede,
  1152.                         'personendaten'     => $aPersonenDaten,
  1153.                         'verbrauchsstelle'  => $aVerbrauchsstelle,
  1154.                         'produkte'          => $aWarenkorb,
  1155.                         'tarifinfo'         => $aTarifinfo,
  1156.                         "style"             => $sStyle,
  1157.                         "signatur"          => $sSignatur,
  1158.                         "system"            => $oSystem->getMetavalue(),
  1159.                         'kundentyp'         => $iGPTyp
  1160.                     ]);
  1161.                 
  1162.                 $loader             = new FilesystemLoader('../templates/');
  1163.                 $twigEnv            = new Environment($loader);
  1164.                 $twigBodyRenderer   = new BodyRenderer($twigEnv);
  1165.                 $twigBodyRenderer->render($oMail);
  1166.                 try
  1167.                 {
  1168.                     // Wenn Nuter noch nicht vorhanden und Bestätigungsmail gesendet werden konnte, wird Nutzer angelegt
  1169.                     $oMailer->send($oMail);
  1170.                 }
  1171.                 catch(\Exception $exception)
  1172.                 {
  1173.                     $this->addFlash(
  1174.                         'error',
  1175.                         "Die Mail konnte leider nicht versendet werden."
  1176.                     );
  1177.                 }
  1178.                 if(!$oUser)
  1179.                 {
  1180.                     // Nutzer im Portal anlegen
  1181.                     if($aPersonenDaten['email'] && $aPersonenDaten['passwort'])
  1182.                     {
  1183.                         // Token-Lebensdauer und Länge aus den Einstellungen holen
  1184.                         $sTokenDuration 3600;
  1185.                         $sTokenLength   12;
  1186.                         $oTokenDuration $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_duration"]);
  1187.                         $oTokenLength   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_length"]);
  1188.                         if ($oTokenDuration)
  1189.                         {
  1190.                             $sTokenDuration = (int)$oTokenDuration->getMetavalue();
  1191.                         }
  1192.                         if ($oTokenLength)
  1193.                         {
  1194.                             $sTokenLength = (int)$oTokenLength->getMetavalue();
  1195.                         }
  1196.                         if(empty($sTokenDuration))
  1197.                         {
  1198.                             $sTokenDuration 3600;
  1199.                         }
  1200.                         if(empty($sTokenLength))
  1201.                         {
  1202.                             $sTokenLength 12;
  1203.                         }
  1204.                         $sTokenDuration $sTokenDuration 60;
  1205.                         $sTokenDuration += 120;
  1206.                         $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$sTokenDuration." minutes"time()));
  1207.                         
  1208.                         // Gewählte Zustellart speichern
  1209.                         $sZustellart $aZustellarten[1];
  1210.                         if($request->get('zustellart') == 1)
  1211.                         {
  1212.                             $sZustellart $aZustellarten[0];
  1213.                         }
  1214.                         // lokales Nutzerobjekt
  1215.                         $user = new User();
  1216.                         $user->setEmail($aPersonenDaten['email']);
  1217.                         $user->setRoles(array("ROLE_USER"));
  1218.                         $user->setZustellart($sZustellart);
  1219.                         $user->setAktiv(0);
  1220.                         $user->setKundennummer(null);
  1221.                         $user->setDatenschutz(1);
  1222.                         $user->setTokenduration($sTokenDuration);
  1223.                         $user->setMandantenid(null);
  1224.                         $user->setTransactionid($iTransactionId);
  1225.                         $sHash bin2hex(random_bytes(intval($sTokenLength)));
  1226.                         $user->setHash($sHash);
  1227.                         $oKeyLength $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "webid_key_length""type" => "konto"]);
  1228.                         $iLength    $oKeyLength->getMetavalue();
  1229.                         $user->setPassword(
  1230.                             $userPasswordHasher->hashPassword(
  1231.                                 $user,
  1232.                                 $aPersonenDaten['passwort']
  1233.                             )
  1234.                         );
  1235.                         try
  1236.                         {
  1237.                             $entityManager->persist($user);
  1238.                             $entityManager->flush();
  1239.                             $aMailvorlage $doctrine->getRepository(Mailtexte::class)->findAll();
  1240.                             $aTemp = array();
  1241.                             $sAnrede "Sehr geehrte Damen und Herren";
  1242.                             $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1243.                             if($oAnrede)
  1244.                             {
  1245.                                 $sAnrede $oAnrede->getMetavalue();
  1246.                             }
  1247.                             foreach ($aMailvorlage as $iKey => $oSetting)
  1248.                             {
  1249.                                 $aTemp[$oSetting->getMetakey()] = $oSetting;
  1250.                             }
  1251.                             $aMailvorlage $aTemp;
  1252.                             // Mailsignatur
  1253.                             $oInhalte  = new InhalteController();
  1254.                             $sSignatur $oInhalte->getMailSignatur($doctrineNULL);
  1255.                             // Mailversand
  1256.                             $sLink          $_SERVER['SERVER_NAME'];
  1257.                             $sAbsender      $aMailvorlage["zugang_beantragung"]->getAbsender();
  1258.                             if(empty($sAbsender))
  1259.                             {
  1260.                                 $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1261.                                 $sAbsender  'portal.support@msu-solutions.de';
  1262.                                 if($oAbsender)
  1263.                                 {
  1264.                                     $sAbsender $oAbsender->getMetavalue();
  1265.                                 }
  1266.                             }
  1267.                             $sStyle     "";
  1268.                             $sFile      "css/email.css";
  1269.                             if(file_exists($sFile))
  1270.                             {
  1271.                                 $sStyle file_get_contents($sFile);
  1272.                             }
  1273.                             $sFile      "css/customer.css";
  1274.                             if(file_exists($sFile))
  1275.                             {
  1276.                                 $sStyle .= file_get_contents($sFile);
  1277.                             }
  1278.                             $sUrl '<p class="block text-center"><a href="https://' $sLink '/zugang/aktivieren/' $sHash '/" class="btn">Zugang aktivieren</a></p>';
  1279.                             $oText $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "zugang_beantragung"]);
  1280.                             $sText    "Anfrage zur Beantragung eines Zugangs";
  1281.                             $sSubject "Anfrage";
  1282.                             if($oText)
  1283.                             {
  1284.                                 $sSubject   $oText->getBetreff();
  1285.                                 
  1286.                                 $sText      $oText->getInhalt();
  1287.                                 $sText      str_replace("#anrede#",$sAnrede,$sText);
  1288.                                 $sText      str_replace("#url#",$sUrl,$sText);
  1289.                                 $sText      str_replace("#tokenduration#",$sTokenDuration,$sText);
  1290.                             }
  1291.                             $oSystem    $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  1292.                             $email = (new TemplatedEmail())
  1293.                                 ->from($sAbsender)
  1294.                                 ->to($aPersonenDaten['email'])
  1295.                                 ->subject($sSubject)
  1296.                                 // path of the Twig template to render
  1297.                                 ->htmlTemplate('emails/zugang.html.twig')
  1298.                                 // pass variables (name => value) to the template
  1299.                                 ->context([
  1300.                                     "context" => $sText,
  1301.                                     "betreff" => $sSubject,
  1302.                                     "style" => $sStyle,
  1303.                                     "signatur" => $sSignatur,
  1304.                                     "system" => $oSystem->getMetavalue()
  1305.                                 ]);
  1306.                             $loader = new FilesystemLoader('../templates/');
  1307.                             $twigEnv = new Environment($loader);
  1308.                             $twigBodyRenderer = new BodyRenderer($twigEnv);
  1309.                             $twigBodyRenderer->render($email);
  1310.                             try
  1311.                             {
  1312.                                 $this->addFlash(
  1313.                                     'neu',
  1314.                                     'Ihr Zugang wurde beantragt. Ihnen wurde ein Mail mit einem Link zum Aktivieren des Zugangs zugesendet.'
  1315.                                 );
  1316.                                 $oMailer->send($email);
  1317.                             }
  1318.                             catch(\Exception $exception)
  1319.                             {
  1320.                                 $this->addFlash(
  1321.                                     'error',
  1322.                                     "Die Mail konnte leider nicht versendet werden."
  1323.                                 );
  1324.                             }
  1325.                         } 
  1326.                         catch (\Throwable $th
  1327.                         {
  1328.                             $this->addFlash(
  1329.                                 'error',
  1330.                                 'Beim Anlegen Ihres Kontos ist ein Fehler ausgetreten.'
  1331.                             );
  1332.                         }
  1333.                     }
  1334.                 }
  1335.                 // Session bereinigen
  1336.                 // Gibt es einen Warenkorb
  1337.                 if($session->get("warenkorb")) 
  1338.                 {
  1339.                     $session->set("warenkorb", array());
  1340.                 }
  1341.                 // Gibt es request-Daten
  1342.                 if($session->get("requestData")) 
  1343.                 {
  1344.                     $session->set("requestData", array());
  1345.                 }
  1346.                 // Gibt es eine Zahlweise
  1347.                 if($session->get("zahlweise")) 
  1348.                 {
  1349.                     $session->set("zahlweise", array());
  1350.                 }
  1351.                 // Gibt es Tarifinfos
  1352.                 if($session->get("tarifinfo")) 
  1353.                 {
  1354.                     $session->set("tarifinfo", array());
  1355.                 }
  1356.                 // Gibt es Personendaten
  1357.                 if($session->get("personendaten")) 
  1358.                 {
  1359.                     $session->set("personendaten", array());
  1360.                 }
  1361.                 // Gibt es Verbrauchsstelle
  1362.                 if($session->get("verbrauchsstelle")) 
  1363.                 {
  1364.                     $session->set("verbrauchsstelle", array());
  1365.                 }
  1366.                 return $this->redirectToRoute('login');
  1367.             }
  1368.         }
  1369.         return $this->render('/tarifrechner/zusammenfassung.html.twig'$aReturn);
  1370.     }
  1371. }