src/Controller/MainController.php line 50

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Activity;
  4. use App\Entity\Buttons;
  5. use App\Entity\Category;
  6. use App\Entity\Lang;
  7. use App\Entity\LocationPhone;
  8. use App\Entity\Locations;
  9. use App\Entity\LogUser;
  10. use App\Entity\LogWhatsapp;
  11. use App\Entity\Qr;
  12. use App\Entity\TemplateWhatsapp;
  13. use App\Entity\User;
  14. use App\Entity\Link;
  15. use App\Entity\LogTracking;
  16. use App\Service\Emoji;
  17. use App\Service\ExternalCalls;
  18. use App\Service\Meta;
  19. use App\Service\GupShup;
  20. use App\Service\Utilities;
  21. use App\Service\Dialog;
  22. use Doctrine\Persistence\ManagerRegistry;
  23. use Google\Service\AIPlatformNotebooks\Location;
  24. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  25. use Symfony\Component\HttpFoundation\JsonResponse;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\HttpFoundation\RedirectResponse;
  29. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. use PHPMailer\PHPMailer\PHPMailer;
  32. use PHPMailer\PHPMailer\SMTP;
  33. use PHPMailer\PHPMailer\Exception;
  34. use Symfony\Contracts\HttpClient\HttpClientInterface;
  35. class MainController extends AbstractController{
  36.     private $client;
  37.     public function __construct(HttpClientInterface $client)
  38.     {
  39.         $this->client $client;
  40.     }
  41.     /**
  42.      * @Route("/", name="main_page", methods={"GET"})
  43.      * 
  44.      */
  45.     public function main(Request $requestManagerRegistry $doctrine){
  46.         
  47.         $lang mb_strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 02));
  48.         if ( $request->get('lang') && !empty($request->get('lang')) ) {
  49.             $lang $request->get('lang');
  50.         }
  51.         if ( $lang == "gl" || $lang == "eu" $lang "es";
  52.         $lang in_array($lang, ['es''ca''fr''it''pt']) ? $lang 'en';
  53.         return $this->redirect('/'.$lang '/');
  54.         /*
  55.         // $this->redirectToRoute('get_hash', ['C4mprod0n']);
  56.         $user = $this->getUser();
  57.         if (!$user) {
  58.             return $this->forward('App\Controller\LandingController::landing');
  59.             //return $this->redirectToRoute('landing'); // app_login
  60.         }
  61.         $em = $doctrine->getManager();
  62.         $locationsRepo = $em->getRepository(Locations::class);
  63.         $isAdmin = in_array("ROLE_ADMIN", $user->getRoles());
  64.         if(!$isAdmin) {
  65.             return $this->forward('App\Controller\LandingController::landing');
  66.             //return $this->redirectToRoute('landing');
  67.         }
  68.         $locations = $locationsRepo->findBy(array("status" => 1));
  69.         return $this->render('main/mainTemplate.html.twig', array(
  70.             "baseUrl" => $this->getParameter("app.base_url"),
  71.             "locations" => $locations,
  72.             "isAdmin" => $isAdmin,
  73.         ));
  74.         */
  75.     }
  76.     /**
  77.      * @Route("/meteo", name="meteo", methods={"GET"})
  78.      * 
  79.      */
  80.     public function meteo(ExternalCalls $externallCalls){
  81.         $user $this->getUser();
  82.         if (!$user) {
  83.             return $this->redirectToRoute('app_login');
  84.         }
  85.         $url "https://www.el-tiempo.net/api/json/v2/provincias/17/municipios/17039";
  86.         return new Response($externallCalls->getMeteo($url));
  87.     }
  88.     /**
  89.      * @Route("/r/{hash}", name="get_redirect", methods={"GET"})
  90.      * 
  91.      */
  92.     public function getRedirect(Request $requestUtilities $utilitiesManagerRegistry $doctrine$hash): Response
  93.     {
  94.         $em $doctrine->getManager();
  95.         $locationRepo $em->getRepository(Locations::class);
  96.         $userRepo $em->getRepository(User::class);
  97.         $logTrackingRepo $em->getRepository(LogTracking::class);
  98.         $now = new \DateTime('now');
  99.         $now->setTimezone(new \DateTimeZone('Europe/Madrid'));
  100.         $parsedString = [];
  101.         
  102.         parse_str(base64_decode($hash), $parsedString);
  103.         // dd(base64_decode($hash));
  104.         $url base64_decode($parsedString["url"]);
  105.         $user $userRepo->find($parsedString["user"]);
  106.         $log $logTrackingRepo->findOneBy(array("user" => $user), array("dateCreated" => "DESC"));
  107.         if(!$log || ($log && $log->getUrl() != $url)){
  108.             $location $locationRepo->find($parsedString["location"]);
  109.     
  110.             $logTracking = new LogTracking();
  111.             $logTracking->setUrl($url);
  112.             $logTracking->setType($parsedString["type"]);
  113.             $logTracking->setLocation($location);
  114.             $logTracking->setUser($user);
  115.             $logTracking->setEvent($parsedString["event"] == "null" null $parsedString["event"]);
  116.             $logTracking->setExtraInfo($parsedString["extra"] == "null" null $parsedString["extra"]);
  117.             $logTracking->setDateCreated($now);
  118.     
  119.             $em->persist($logTracking);
  120.             $em->flush();
  121.     
  122.         }
  123.         return $this->redirect($url);
  124.     }
  125.     /**
  126.      * @Route("/l/{hash}", name="get_hash", methods={"GET"})
  127.      * 
  128.      */
  129.     public function getHash(Request $request,Utilities $utilitiesManagerRegistry $doctrineSessionInterface $sessionDialog $dialog): Response
  130.     {
  131.         return $this->controlHash($request$utilities$doctrine$session$dialog);
  132.     }
  133.     public function controlHash(Request $requestUtilities $utilitiesManagerRegistry $doctrineSessionInterface $sessionDialog $dialog): Response
  134.     {
  135.         $hash $request->get('hash');
  136.         $text $request->get('text');
  137.         $url "";
  138.         $em $doctrine->getManager();
  139.         $qrRepo $em->getRepository(Qr::class);
  140.         $now = new \DateTime('now');
  141.         $now->setTimezone(new \DateTimeZone('Europe/Madrid'));
  142.         $qrHash $qrRepo->findOneBy(array("hash" => $hash));
  143.     
  144.         //Guardar info a log_user i depenent l'idioma envia el missatge en l'idioma corresponent
  145.         if($qrHash){
  146.             $link $em->getRepository(Link::class)->find($qrHash->getLink());
  147.             if($link){
  148.                 $hash $utilities->generateHash();
  149.                 $session_qr $session->get('qr');
  150.                 $session_qr_exists = ( ($session_qr) && ( $session_qr['expires'] <= time() + (86400) ) ) ? true false;
  151.                 if ( $session_qr_exists ) {
  152.                     $logUser $em->getRepository(LogUser::class)->findOneBy(array("hash" => $session_qr['hash'] ));
  153.                     if ($logUser) {
  154.                         
  155.                         $session->set('logUser'$logUser->getId());
  156.                         
  157.                         $separator = (strpos($link->getLink(), '?') !== false) ? "&" "?";
  158.                         return new RedirectResponse$link->getLink().$separator.'hash='.$session_qr['hash'] );
  159.                     }
  160.                 }
  161.                 $session->set('qr', [
  162.                     'hash' => $hash,
  163.                     'expires' =>  time() + (86400)
  164.                 ]);
  165.                 $logUser = new LogUser();
  166.                 $user_agent $_SERVER['HTTP_USER_AGENT'];
  167.                 $platform $utilities->getPlatform($user_agent);
  168.                 $browser $utilities->getBrowser($user_agent);
  169.                 $ip $_SERVER['REMOTE_ADDR'];
  170.                 $lang mb_strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 02));
  171.                 
  172.                 $logUser = new LogUser();
  173.                 $logUser->setQr($qrHash);
  174.                 $logUser->setHash($hash);
  175.                 $logUser->setPlatform($platform['name']);
  176.                 $logUser->setPlatformVersion($platform['version']);
  177.                 $logUser->setBrowser($browser);
  178.                 $logUser->setRemoteAddr($ip);
  179.                 $logUser->setDateCreated($now);
  180.                 $logUser->setBrowserLang($lang);
  181.                 $logUser->setUser(null);
  182.                 
  183.                 $em->persist($logUser);
  184.                 $em->flush();
  185.                 $session->set('logUser'$logUser->getId());
  186.                 // REDIRECT
  187.                 $locationPhoneFlux $qrHash->getLocationPhone()->getFlux();
  188.                 $locationName mb_strtolower($qrHash->getLocationPhone()->getLocation()->getName());
  189.                 
  190.                 if($locationPhoneFlux == "direct"){
  191.                     //Send message depending on the lang
  192.                     $text $dialog->getStartText($locationName$lang);
  193.                     $phone $utilities->dcrypt($qrHash->getLocationPhone()->getPhone());
  194.                     $url 'https://api.whatsapp.com/send?phone='.$phone.'&text=' $text
  195.                 } else {
  196.                     $u = (strpos($link->getLink(), "?") == false) ? "?" "&";
  197.                     $url $link->getLink() . $u 'hash=' $logUser->getHash();
  198.                 }
  199.                 
  200.                 return $this->redirect$url );
  201.             }
  202.         }
  203.         // TODO: Page error
  204.         die('Link not found');
  205.     }
  206.     /**
  207.      * @Route("/checkPhone", name="get_check_phone", methods={"POST"})
  208.      * 
  209.      */
  210.     public function functionCheckPhone(Request $requestUtilities $utilitiesManagerRegistry $doctrineSessionInterface $session){
  211.         $id null;
  212.         $now = new \DateTime('now');
  213.         $now->setTimezone(new \DateTimeZone('Europe/Madrid'));
  214.         try{
  215.             $locationName $session->get('location');
  216.             $post $request->request->all();
  217.             $em $doctrine->getManager();
  218.             $userRepo $em->getRepository(User::class);
  219.             $logUserRepo $em->getRepository(LogUser::class);
  220.             $locationRepo $em->getRepository(Locations::class);
  221.             if($post && (key_exists("prefix"$post) && $post['prefix']) 
  222.             && (key_exists("phone"$post) && $post['phone'] && strlen($post['phone']) > 7
  223.             && (key_exists("lang"$post) && $post['lang'])){
  224.                 $user $userRepo->findOneBy(array("phone" => $utilities->ecrypt($post['prefix'].$post['phone'])));
  225.                 $exists $user && $user->getTermsPolicy() ? truefalse;
  226.                 $langDetected key_exists("langDetected"$post) && $post["langDetected"]? $post["langDetected"]:null;
  227.                 //Create user if it doesn't exists
  228.                 if(!$user){
  229.                     $user = new User();
  230.                     $user->setPhone($utilities->ecrypt($post['prefix'].$post['phone']));
  231.                     $user->setPrefix($utilities->ecrypt($post['prefix']));
  232.                     $user->setHash(bin2hex(random_bytes(16)));
  233.                     $user->setTermsPolicy(0);
  234.                     $user->setDateCreated($now);
  235.                     $user->setLang(mb_strtolower($post["lang"]));
  236.                     $user->setLangDetected(mb_strtolower($langDetected));
  237.                     if($locationName){
  238.                         $location $locationRepo->findOneBy(array("name" => $locationName));
  239.                         $user->setRegisteredLocation($location);
  240.                     }
  241.                     $em->persist($user);
  242.                     $em->flush();
  243.                 }else if($user->getLang() != mb_strtolower($post["lang"])){
  244.                     $user->setLang(mb_strtolower($post["lang"]));
  245.                     $em->persist($user);
  246.                     $em->flush();
  247.                 }
  248.                 $session->set('user'$user->getId());
  249.                 //Update logUser
  250.                 $logUser $session->get('logUser');
  251.                 if ( $logUser ) {
  252.                     $logUserFound $logUserRepo->find($logUser);
  253.                     $logUserFound->setUser($user);
  254.                     if(!$locationName && !$user->getRegisteredLocation()){
  255.                         $loc $logUserFound->getQr()->getLocationPhone()->getLocation();
  256.                         $user->setRegisteredLocation($loc);
  257.                         $em->persist($user);
  258.                     }
  259.                     $em->persist($logUserFound);
  260.                     $em->flush();
  261.                 }
  262.             }else{
  263.                 throw new \Exception("empty_fields");
  264.             }
  265.         }catch(\Exception $e){
  266.             return new JsonResponse([
  267.                 "status" => "error",
  268.                 "data" => $e->getMessage()
  269.             ]);
  270.         }
  271.         
  272.         return new JsonResponse([
  273.             "status" => "success",
  274.             "exists" => $exists
  275.         ]);
  276.     }
  277.     /**
  278.      * @Route("/checkTerms", name="get_check_terms", methods={"POST"})
  279.      * 
  280.      */
  281.     public function functionCheckTerms(Request $requestUtilities $utilitiesManagerRegistry $doctrineSessionInterface $session){
  282.         $phone null;
  283.         $now = new \DateTime('now');
  284.         $now->setTimezone(new \DateTimeZone('Europe/Madrid'));
  285.         
  286.         try{
  287.             $post $request->request->all();
  288.             $em $doctrine->getManager();
  289.             $userRepo $em->getRepository(User::class);
  290.             $user $session->get('user');
  291.             if($post
  292.             && ($user
  293.             && (key_exists("lang"$post) && $post['lang'])){
  294.                 $userFound $userRepo->find($user);
  295.                 //Update Terms And Policy
  296.                 if($userFound){
  297.                     $userFound->setTermsPolicy(1);
  298.                     $em->persist($userFound);
  299.                     $em->flush();
  300.                 }else{
  301.                     throw new \Exception("not_valid_user"); 
  302.                 }
  303.                 $phone $utilities->dcrypt($userFound->getPhone());
  304.             }else{
  305.                 throw new \Exception("empty_fields");
  306.             }
  307.         }catch(\Exception $e){
  308.             return new JsonResponse([
  309.                 "status" => "error",
  310.                 "data" => $e->getMessage()
  311.             ]);
  312.         }
  313.         
  314.         return new JsonResponse([
  315.             "status" => "success",
  316.             "data" => $phone
  317.         ]);
  318.     }
  319.     /**
  320.      * @Route("/start", name="get_send_first_template", methods={"POST"})
  321.      * 
  322.      */
  323.     public function sendStartTemplate(Request $requestUtilities $utilitiesManagerRegistry $doctrineMeta $metaGupShup $gupshupEmoji $emojiSessionInterface $session){
  324.         $em $doctrine->getManager();
  325.         //$post = $request->request->all();
  326.         $now = new \DateTime('now');
  327.         $now->setTimezone(new \DateTimeZone('Europe/Madrid'));
  328.         $userRepo $em->getRepository(User::class);
  329.         $locationRepo $em->getRepository(Locations::class);
  330.         $buttonsRepo $em->getRepository(Buttons::class);
  331.         $templateRepo $em->getRepository(TemplateWhatsapp::class);
  332.         $langRepo $em->getRepository(Lang::class);
  333.         $locPhoneRepo $em->getRepository(LocationPhone::class);
  334.         $user $session->get('user') ? $userRepo->find($session->get('user')): null;
  335.         if ( $user ) {
  336.             $phone $user->getPhone();
  337.             $prefix $user->getPrefix();
  338.             $lang $user->getLang();
  339.                 // $lang = "es";
  340.             $location $locationRepo->findOneBy(array("name" => $session->get('location')));
  341.             $buttons $buttonsRepo->getTextButton($location0$user->getLang());
  342.             $locPhone $locPhoneRepo->findOneBy(array("location" => $location));
  343.             $btns0 = array();
  344.     
  345.             foreach($buttons as $btn0){
  346.                 array_push($btns0, [
  347.                     "postback_id" => $btn0['postbackText'],
  348.                     "text" => $btn0['text']
  349.                 ]);
  350.             }
  351.     
  352.             $type $_ENV['gs_PAYLOAD__IMAGE'];
  353.             
  354.             $langEntity $langRepo->findOneBy(array("lang" => $lang));
  355.             $template $templateRepo->findOneBy(array("slug" => "start_flow""lang" => $langEntity"location" => $location));
  356.             $logWhatsapp = new LogWhatsapp();
  357.             if($locPhone->getApiKey()){ //GUPSHUP
  358.                 $payload = array(
  359.                     "template_name" => $template->getName(), 
  360.                     "lang" => $lang
  361.                     // "url" => $_SERVER['HTTP_HOST']."/images/locations/".$location->getName()."/logo_padding.png",
  362.                     "url" =>"https://guest-assistant.com/images/locations/".$location->getName()."/logo_padding.png",
  363.                     "buttons" => $btns0,
  364.                     "params" => []
  365.                 );
  366.                     // "url" => "https://guest-assistant.com/public/images/locations/".$location->getName()."/logo.png");
  367.                 // dd($dataGS);
  368.                 $gupshup->setLog("[GUPSHUP] Response sendBeforeStartTemplate"$utilities->ecrypt(json_encode($payload)), $location$phone);
  369.                 $res = (object)$gupshup->sendTemplate(
  370.                     $type,
  371.                     $utilities->dcrypt($phone),
  372.                     $location,
  373.                     $payload
  374.                 );
  375.                 $gupshup->setLog("[GUPSHUP] Response sendStartTemplate"$utilities->ecrypt(json_encode($res)), $location$phone);
  376.                 $messageId = ( $res && property_exists($res"response") && $res->response->messageId) ? $res->response->messageId "";
  377.                 
  378.                 $logWhatsapp->setText$emoji->encode$template->getText() ));
  379.             }else{ //META
  380.                 $payload = array(
  381.                     "template_name" => $template->getName(), 
  382.                     "lang" => $lang
  383.                     // "url" => $_SERVER['HTTP_HOST']."/images/locations/".$location->getName()."/logo_padding.png",
  384.                     "url" =>"https://guest-assistant.com/images/locations/".$location->getName()."/logo_padding.png",
  385.                     "buttons" => $btns0
  386.                 );
  387.                     // "url" => "https://guest-assistant.com/public/images/locations/".$location->getName()."/logo.png");
  388.                 // dd($dataGS);
  389.                 $res = (object)$meta->sendTemplate(
  390.                     $type,
  391.                     $utilities->dcrypt($phone),
  392.                     $location,
  393.                     $payload
  394.                 );
  395.                 $messageId = ( $res && property_exists($res"messages") && $res->messages[0]->id) ? $res->messages[0]->id "";
  396.                 $logWhatsapp->setText$emoji->encode$payload["template_name"] ));
  397.             }
  398.             $session->set('templateSended'true);
  399.             $logWhatsapp->setMessageId($messageId);
  400.             $logWhatsapp->setPhone$phone );
  401.             $logWhatsapp->setPrefix$prefix );
  402.             $logWhatsapp->setStatus"outbound" );
  403.             $logWhatsapp->setDateCreated$now );
  404.             $logWhatsapp->setTimestampProvider$now->getTimestamp() );
  405.             $logWhatsapp->setUser$user );
  406.             $logWhatsapp->setLocation$location );
  407.             $logWhatsapp->setLang(mb_strtolower$langEntity->getLang()) );
  408.             $logWhatsapp->setConversationId(null);
  409.             $logWhatsapp->setTemplate(null);
  410.             $em->persist($logWhatsapp);
  411.             $em->flush();
  412.             return new JsonResponse([
  413.                 "status" => "success"
  414.             ]);
  415.         }
  416.         return new JsonResponse([
  417.             "status" => "error",
  418.             "data" => "User not found"
  419.         ]);
  420.     }
  421.     /**
  422.      * @Route("/startMessage", name="get_send_first_message", methods={"POST"})
  423.      * 
  424.      */
  425.     public function sendStartMesage(Request $requestUtilities $utilitiesManagerRegistry $doctrineMeta $metaEmoji $emojiSessionInterface $sessionDialog $dialog){
  426.         $em $doctrine->getManager();
  427.         //$post = $request->request->all();
  428.         $now = new \DateTime('now');
  429.         $now->setTimezone(new \DateTimeZone('Europe/Madrid'));
  430.         $userRepo $em->getRepository(User::class);
  431.         $locationRepo $em->getRepository(Locations::class);
  432.         $locationPhoneRepo $em->getRepository(LocationPhone::class);
  433.         $buttonsRepo $em->getRepository(Buttons::class);
  434.         $templateRepo $em->getRepository(TemplateWhatsapp::class);
  435.         $langRepo $em->getRepository(Lang::class);
  436.         $logWhatsRepo $em->getRepository(LogWhatsapp::class);
  437.         $user $userRepo->find($session->get('user'));
  438.         if ( $user ) {
  439.             $phone $user->getPhone();
  440.             $prefix $user->getPrefix();
  441.             $lang $user->getLang();
  442.                 // $lang = "es";
  443.             $location $locationRepo->findOneBy(array("name" => $session->get('location')));
  444.             //Revisar si te algun missatge, si el te no se li envia
  445.             $sendedMsg $logWhatsRepo->findOneBy(array("phone" => $phone"status" => "delivered"));
  446.             $locationPhone $locationPhoneRepo->findOneBy(array("location" => $location));
  447.             $phone $utilities->dcrypt($locationPhone->getPhone());
  448.             // dd($sendedMsg);
  449.             if($sendedMsg){
  450.                 return new JsonResponse([
  451.                     "status" => "error",
  452.                     "data" => "User has template"
  453.                 ]);
  454.             }
  455.             $session->set('messageSended'true);
  456.             $locationName mb_strtolower($location->getName());
  457.             $text $dialog->getStartText($locationName$lang);
  458.             $phone $utilities->dcrypt($user->getPhone());
  459.             $url 'https://api.whatsapp.com/send?phone='.$phone.'&text='.$text
  460.             return $this->redirect$url );
  461.         }
  462.         return new JsonResponse([
  463.             "status" => "error",
  464.             "data" => "User not found"
  465.         ]);
  466.     }
  467.     /**
  468.      * @Route("/reset", name="reset", methods={"POST"})
  469.      * 
  470.      */
  471.     public function functionReset(Request $requestSessionInterface $session){
  472.         
  473.         // NO ELIMINAR $session->remove('logUser');
  474.         $session->remove('templateSended');
  475.         $session->remove('user');
  476.  
  477.         return new JsonResponse([
  478.             "status" => "success"
  479.         ]);
  480.     }
  481.     /**
  482.      * @Route("/{lang}/send", name="form_send", methods={"POST"})
  483.      * 
  484.      */
  485.     public function form_send(Request $requestManagerRegistry $doctrine){
  486.   
  487.         $lang mb_strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 02));
  488.         if ( $request->get('lang') && !empty($request->get('lang')) ) {
  489.             $lang $request->get('lang');
  490.         }
  491.         if ( $lang == "gl" || $lang == "eu" $lang "es";
  492.         $lang in_array($lang, ['es''ca''fr''it''pt']) ? $lang 'en';
  493.         // ---
  494.         if (!empty($request->getContent())) {
  495.             $post = (array) json_decode($request->getContent());
  496.             if (count($post) == 0) {
  497.                 $post = (array) $request->request->all();
  498.             }
  499.         } else {
  500.             $post = (array) $request->request->all();
  501.         }
  502.         // ---
  503.         $recaptchaResponse $post['recaptcha'];
  504.         $response $this->client->request('POST''https://www.google.com/recaptcha/api/siteverify', [
  505.             'body' => [
  506.                 'secret' => $_ENV['RECAPTCHA_SECRET'],
  507.                 'response' => $recaptchaResponse,
  508.             ],
  509.         ]);
  510.         $recaptchaData $response->toArray();
  511.         if (!$recaptchaData['success']) {
  512.             return new JsonResponse([
  513.                 'status' => 'error',
  514.                 'reason' => 'Invalid reCAPTCHA response.'
  515.             ]);
  516.         }
  517.         // ---
  518.         
  519.         $mail = new PHPMailer(true);
  520.         try {
  521.             //Server settings
  522.             //$mail->SMTPDebug = 1;                         //Enable verbose debug output
  523.             $mail->isSMTP();                                //Send using SMTP
  524.             $mail->Host       $_ENV["MAILER_HOST"];       //Set the SMTP server to send through
  525.             $mail->SMTPAuth   true;                       //Enable SMTP authentication
  526.             $mail->Username   $_ENV["MAILER_USER"];       //SMTP username
  527.             $mail->Password   $_ENV["MAILER_PASSWORD"];   //SMTP password
  528.             //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
  529.             $mail->SMTPSecure 'tls';                      // Enable TLS encryption, `ssl` also accepted
  530.             $mail->Port 587;                              // TCP port to connect to
  531.             $mail->SMTPOptions = array(
  532.                 'ssl' => array(
  533.                     'verify_peer' => false,
  534.                     'verify_peer_name' => false,
  535.                     'allow_self_signed' => true
  536.                 )
  537.             );
  538.             //Recipients
  539.             $mail->setFrom($_ENV["MAILER_USER"], 'Guest Assistant Contacte');
  540.             $mail->addAddress('info@tridenia.com''Guest Assistant Contacte');     //Add a recipient
  541.         
  542.             //Content
  543.             $mail->CharSet "UTF-8";
  544.             $mail->isHTML(true);                                  //Set email format to HTML
  545.             $mail->Subject 'Guest Assistant Contacte: ' $post["name"] . ' (' $post["company"] . ')';
  546.             $mail->Body    $this->renderView(
  547.                 'mail/ca.html.twig', [
  548.                     'post' => $post,
  549.                     'lang' => $lang
  550.                 ]
  551.             );
  552.             // $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
  553.         
  554.             if(!$mail->send()) {
  555.                 return new JsonResponse([
  556.                     'status' => 'error',
  557.                     'reason' => "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"
  558.                 ]);
  559.             } else {
  560.                 return new JsonResponse([
  561.                     'status' => 'success'
  562.                 ]);
  563.             }
  564.         } catch (\Exception $e) {
  565.             return new JsonResponse([
  566.                 'status' => 'error',
  567.                 'reason' => "Message could not be sent. Mailer Error: {$e}"
  568.             ]);
  569.         }
  570.     }
  571.     /**
  572.      * @Route("/{lang}/press", name="press", methods={"GET"})
  573.      * 
  574.      */
  575.     public function press(Request $requestManagerRegistry $doctrine){
  576.   
  577.         $lang mb_strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 02));
  578.         if ( $request->get('lang') && !empty($request->get('lang')) ) {
  579.             $lang $request->get('lang');
  580.         }
  581.         if ( $lang == "gl" || $lang == "eu" $lang "es";
  582.         $lang in_array($lang, ['es''ca''fr''it''pt']) ? $lang 'en';
  583.         $news_national = array(
  584.             'camprodon-noticia-cat' => 'https://www.camprodon.cat/la-intelligencia-artificial-arriba-a-camprodon-de-la-ma-dun-guia-turistic/',
  585.             'camprodon-noticia-lavanguardia' => 'https://www.lavanguardia.com/local/girona/20240328/9584016/camprodon-estrena-guia-turistica-ia-contesta-visitante-whatsapp.html',
  586.             'camprodon-noticia-puntavui' => 'https://www.elpuntavui.cat/societat/article/5-societat/2401599-s-estrena-una-guia-turistica-que-utilitza-la-intel-ligencia-artificial.html',
  587.             'camprodon-noticia-larepublica' => 'https://www.larepublica.cat/minut-a-minut/camprodon-estrena-una-guia-turistica-amb-intelligencia-artificial-per-millorar-lexperiencia-del-visitant/',
  588.             'camprodon-noticia-el9nou' => 'https://el9nou.cat/osona-ripolles/actualitat/societat/camprodon-estrena-una-guia-turistica-amb-intelligencia-artificial/',
  589.             'camprodon-noticia-naciodigital' => 'https://naciodigital.cat/ripolles/camprodon-estrena-una-guia-turistica-amb-intelligencia-artificial-per-fomentar-el-turisme_1842460_102.html',
  590.             'camprodon-noticia-ripollesdigital' => 'https://www.ripollesdigital.cat/documents/ripollesdigital.cat/revistes/elripolles1036bx.pdf',
  591.             'camprodon-noticia-acn' => 'https://www.acn.cat/new/d3104aec-2194-43f9-a6e9-f331945b3162/texts',
  592.             'camprodon-noticia-gerio' => 'https://www.gerio.cat/noticia/1661874/camprodon-estrena-una-guia-turistica-amb-intelligencia-artificial',
  593.             'camprodon-noticia-lesvegueries' => 'https://www.lesvegueries.cat/comarques-gironines/ripolles/camprodon-estrena-una-guia-turistica-amb-intel-ligencia-artificial-per-millorar-lexperiencia-del-visitant',
  594.             'camprodon-noticia-metadata' => 'https://www.metadata.cat/noticia/4360/camprodon-estrena-guia-turistica-usa-IA',
  595.             'camprodon-noticia-viaempresa' => 'https://www.viaempresa.cat/es/territorio/camprodon-estrena-guia-turistica-con-inteligencia-artificial-mejorar-experiencia_2195791_102.html'
  596.         );
  597.         $news_international = array(
  598.             'camprodon-noticia-catalannews' => 'https://www.catalannews.com/tech-science/item/camprodon-launches-tourist-guide-with-artificial-intelligence',
  599.             'camprodon-noticia-capcatalogne' => 'https://capcatalogne.com/guest-assistant/',
  600.             'camprodon-noticia-wn' => 'https://article.wn.com/view/2024/03/28/Camprodon_launches_tourist_guide_with_artificial_intelligenc/',
  601.             'camprodon-noticia-noveltybilisim' => 'https://noveltybilisim.com.tr/blog/yapay-zekali-turist-rehberi-guest-assistant/'
  602.         );
  603.         return $this->render('landing/press.html.twig', array(
  604.             "baseUrl" => $this->getParameter("app.base_url"),
  605.             "lang" => $lang,
  606.             "news_national" => $news_national,
  607.             "news_international" => $news_international,
  608.             'site_key' => $_ENV['RECAPTCHA_KEY']
  609.         ));
  610.     }
  611.     /**
  612.      * @Route("/{lang}/cookies", name="cookies", methods={"GET"})
  613.      * 
  614.      */
  615.     public function cookies(Request $requestManagerRegistry $doctrine){
  616.   
  617.         $lang mb_strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 02));
  618.         if ( $request->get('lang') && !empty($request->get('lang')) ) {
  619.             $lang $request->get('lang');
  620.         }
  621.         if ( $lang == "gl" || $lang == "eu" $lang "es";
  622.         $lang in_array($lang, ['es''ca''fr''it''pt']) ? $lang 'en';
  623.         return $this->render('landing/cookies.html.twig', array(
  624.             "baseUrl" => $this->getParameter("app.base_url"),
  625.             "lang" => $lang
  626.         ));
  627.     }
  628.     /**
  629.      * @Route("/{lang}/", name="main_lang", methods={"GET"}, requirements={"lang" = "(es|ca|en|fr|it|pt)"})
  630.      * 
  631.      */
  632.     public function landing_main(Request $requestManagerRegistry $doctrine){
  633.         //Ha d'estar l'Ășltim per evitar problemes amb el path
  634.         $em $doctrine->getManager();
  635.         $locationsRepo $em->getRepository(Locations::class);
  636.         $lang mb_strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 02));
  637.         if ( $request->get('lang') && !empty($request->get('lang')) ) {
  638.             $lang $request->get('lang');
  639.         }
  640.         if ( $lang == "gl" || $lang == "eu" $lang "es";
  641.         $lang in_array($lang, ['es''ca''fr''it''pt']) ? $lang 'en';
  642.         $locations $locationsRepo->findBy(array("status" => 1));
  643.         // dd($locations);
  644.         return $this->render('landing/location_selector.html.twig', array(
  645.             "baseUrl" => $this->getParameter("app.base_url"),
  646.             "locations" => $locations,
  647.             "lang" => $lang,
  648.             'site_key' => $_ENV['RECAPTCHA_KEY'],
  649.         ));
  650.     }
  651. }