src/Controller/TicketController.php line 61

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Item;
  4. use App\Entity\Line;
  5. use App\Entity\Purchase;
  6. use PHPUnit\Util\Json;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\Mailer\MailerInterface;
  9. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  10. use Symfony\Component\Mime\Email;
  11. use Symfony\Component\HttpFoundation\{RequestResponse};
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use App\Utils\Ticketing;
  14. use App\Utils\Functions;
  15. use App\Entity\User;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Endroid\QrCode\QrCode;
  18. use Dompdf\Dompdf;
  19. use Dompdf\Options;
  20. use Doctrine\Persistence\ManagerRegistry;
  21. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  22. use App\Utils\RedsysAPI;
  23. /**
  24.  * @Route("/{_locale}", requirements={"_locale": "en|es"})
  25.  */
  26. class TicketController extends AbstractController
  27. {
  28.     /**
  29.      * @var Ticketing
  30.      */
  31.     private $ticketing;
  32.     /**
  33.      * @var Functions
  34.      */
  35.     private $functions;
  36.     /**
  37.      * @var ManagerRegistry
  38.      */
  39.     private $doctrine;
  40.     /**
  41.      * @param Ticketing $ticketing
  42.      * @param Functions $functions
  43.      * @param ManagerRegistry $doctrine
  44.      */
  45.     public function __construct(Ticketing $ticketingFunctions $functionsManagerRegistry $doctrine)
  46.     {
  47.         $this->ticketing $ticketing;
  48.         $this->functions $functions;
  49.         $this->doctrine  $doctrine;
  50.     }
  51.     /**
  52.      * @Route("/tickets", name="tickets")
  53.      */
  54.     public function tickets(Request $request): Response
  55.     {
  56.         // General function to set discount ref/affId
  57.         $this->functions->setDiscount($request);
  58.         $events $this->ticketing->curl("events""normal", array(), "GET");
  59.         $keys   $this->ticketing->curl("tickets?limit=3&orderBy=price&order=desc&name=keys""normal", array(), "GET");
  60.         $filters array_filter($request->query->all());
  61.         $request->request->set('saleuser'1);
  62.         return $this->render('tickets/tickets.html.twig', [
  63.             'events' => $events["events"],
  64.             'filters' => $filters,
  65.             'keys' => $keys["tickets"]
  66.         ]);
  67.     }
  68.     /**
  69.      * @Route("/include-tickets-map", name="include_tickets_map")
  70.      */
  71.     public function includeTicketsMap(Request $request$mapUrl): Response
  72.     {
  73.         $sessionRand md5(uniqid(mt_rand(), true));
  74.         $version $this->functions->addAppVersion();
  75.         return $this->render('events/include-event-tickets-map.html.twig',
  76.             [
  77.                 'mapUrl' => $mapUrl,
  78.                 'sessionRand' => $sessionRand,
  79.                 'version' => $version
  80.             ]);
  81.     }
  82.     /**
  83.      * @Route("/axerquia/include-tickets-map", name="axerquia_include_tickets_map")
  84.      */
  85.     public function axerquiaIncludeTicketsMap(Request $request): Response
  86.     {
  87.         $sessionRand md5(uniqid(mt_rand(), true));
  88.         $version $this->functions->addAppVersion();
  89.         return $this->render('events/include-event-tickets-map-axerquia.html.twig',
  90.             [                
  91.                 'sessionRand' => $sessionRand,
  92.                 'version' => $version
  93.             ]);
  94.     }
  95.     /**
  96.      * @Route("/include-tickets-json", name="include_tickets_json")
  97.      */
  98.     public function includeTicketsJson(Request $request$mapUrl): Response
  99.     {
  100.         $sessionRand md5(uniqid(mt_rand(), true));
  101.         $version $this->functions->addAppVersion();
  102.         return $this->render('events/include-event-tickets-json.html.twig',
  103.             [
  104.                 'mapUrl' => $mapUrl,
  105.                 'sessionRand' => $sessionRand,
  106.                 'version' => $version,
  107.                 'event' => $request->get('event'),
  108.             ]);
  109.     }
  110.     /**
  111.      * @Route("/include-tickets-wizink-json", name="include_tickets_wizink_json")
  112.      */    
  113.     public function includeWizinkTicketsJson(Request $request$mapUrl): Response
  114.     {
  115.         $sessionRand md5(uniqid(mt_rand(), true));
  116.         $version $this->functions->addAppVersion();
  117.         return $this->render('events/include-event-tickets-wizink-json.html.twig',
  118.             [
  119.                 'mapUrl' => $mapUrl,
  120.                 'sessionRand' => $sessionRand,
  121.                 'version' => $version,
  122.                 'event' => $request->get('event'),
  123.             ]);
  124.     }
  125.     /**
  126.      * @Route("/include-tickets-axerquia-json", name="include_tickets_axerquia_json")
  127.      */    
  128.     public function includeAxerquiaTicketsJson(Request $request$mapUrl): Response
  129.     {
  130.         $sessionRand md5(uniqid(mt_rand(), true));
  131.         $version $this->functions->addAppVersion();
  132.         return $this->render('events/include-event-tickets-axerquia-json.html.twig',
  133.             [
  134.                 'mapUrl' => $mapUrl,
  135.                 'sessionRand' => $sessionRand,
  136.                 'version' => $version,
  137.                 'event' => $request->get('event'),
  138.             ]);
  139.     }
  140.     /**
  141.      * @Route("/load-map", name="load_map")
  142.      */
  143.     public function loadMap(Request $request)
  144.     {
  145.         $data $this->ticketing->curl("tickets?limit=1000&sector=".$request->get('sector')."&event=".$request->get('event'), "normal", [], "GET");
  146.         if (empty($data)) {
  147.             return new JsonResponse([
  148.                 'status' => false,
  149.                 'message' => 'No hay tickets',
  150.                 'data' => []
  151.             ], 403);
  152.         }
  153.         return new JsonResponse($data['tickets']);
  154.     }
  155.     /**
  156.      * @Route("/check-map", name="check_map")
  157.      */
  158.     public function checkMap(Request $request)
  159.     {
  160.         // answer is always positive
  161.         $id $request->get('id');
  162.         $token $request->get('token');
  163.         $result = [];
  164.         // block or unblock ticket
  165.         switch ($request->get('action')) {
  166.             case 'S':
  167.                 // Ticket block
  168.                 $data = ["blocked" => "true""seat" => $id"setBlockedDate" => true];
  169.                 $result $this->ticketing->curl("tickets/".$token"normal"$data"PATCH");
  170.                 if ($result["code"] != "200") {
  171.                     return new JsonResponse([
  172.                         'status' => false,
  173.                         'message' => json_encode($result),
  174.                         'data' => []
  175.                     ], 403);
  176.                 }
  177.                 break;
  178.             case 'D':
  179.                 // Ticket unblock
  180.                 $data = ["blocked" => "false""setBlockedDate" => false];
  181.                 $result $this->ticketing->curl("tickets/".$token"normal"$data"PATCH");
  182.                 if ($result["code"] != "200") {
  183.                     return new JsonResponse([
  184.                         'status' => false,
  185.                         'message' => 'Ha ocurrido un error',
  186.                         'data' => []
  187.                     ], 403);
  188.                 }
  189.                 break;
  190.         }
  191.         return new JsonResponse([
  192.             'status' => true,
  193.             'ticket' => $result
  194.         ]);
  195.     }
  196.     /**
  197.      * @Route("/unblock-map", name="unblock_map")
  198.      */
  199.     public function unblockMap(Request $request) {
  200.         // unblock is disabled if output page is checkout
  201.         if (!filter_var($request->get("checkout"), FILTER_VALIDATE_BOOLEAN)) {
  202.             // tokens to unblock
  203.             $tokens $request->get('tokens');
  204.             if (!empty($tokens)) {
  205.                 $data explode(','$tokens);
  206.                 $tickets_to_unblock = [];
  207.                 foreach ($data as $item) {
  208.                     $tickets_to_unblock[] = ["blocked" => "false""id" => $item];
  209.                 }
  210.                 $this->ticketing->curl("tickets""json"$tickets_to_unblock"PATCH");
  211.             }
  212.         }
  213.         return new JsonResponse('done');
  214.     }
  215.     /**
  216.      * @Route("/include-tickets", name="include_tickets")
  217.      */
  218.     public function includeTickets(Request $request): Response
  219.     {
  220.         if(!$request->get("saleuser")){
  221.             $sintax="&pack=null";
  222.         }
  223.         else{
  224.             $sintax="";
  225.         }
  226.         if($request->get("type")){
  227.             switch($request->get("type")){
  228.                 case "2":$sintax.="&maxPrice=5000";break;
  229.                 case "4":
  230.                     $sintax.="&name=keys";
  231.                     break;
  232.                 case "6":
  233.                 case "7":
  234.                     $sintax .= "&name=Space+Top+Moment";
  235.                     break;
  236.                 default: $sintax.="";break;
  237.             }
  238.         }
  239.         if ($request->get('maxPrice'))
  240.             $sintax.="&minPrice=".$request->get('minPrice')."&maxPrice=".$request->get('maxPrice');
  241.         if($request->get("order") && $request->get("order")=="2"){
  242.             $sintax.="&order=desc";
  243.             $order SORT_DESC;
  244.         }
  245.         else{
  246.             $sintax.="&order=asc";
  247.             $order SORT_ASC;
  248.         }
  249.         if($request->get("name")){
  250.             $sintax.="&name=".urlencode($request->get("name"));
  251.         }
  252.         if($request->get("price_equal")){
  253.             $sintax.="&maxPrice=".$request->get("price_equal")."&minPrice=".$request->get("price_equal");
  254.         }
  255.         if($request->get("offset")){
  256.             $sintax.="&offset=".$request->get("offset");
  257.         }
  258.         if($request->get("limit")){
  259.             $sintax.="&limit=".$request->get("limit");
  260.         }
  261.         else{
  262.             $sintax.="&limit=12";
  263.         }
  264.         if($request->get("event")){
  265.             $sintax.="&event=".$request->get("event");
  266.         }
  267.         if($request->get("group")){
  268.             $sintax.="&groupBy=price";
  269.         }
  270.         $userId $this->functions->getUserLogged();
  271.         if($request->get("small")) {
  272.             $event $request->get("event");
  273.             // Secondary market
  274.             //$pageOnSaleByUsers = $this->onSaleByUsers($sintax);
  275.             // Tickets
  276.             $sintax '?pack=null&maxPrice=1000&order=asc&event='.$event;
  277.             // Tickets for sale
  278.             $sintaxAdd '&onSale=true&groupBy=price&orderBy=price&not_category=true';
  279.             $page $this->ticketing->curl("tickets".$sintax.$sintaxAdd"normal", [], "GET");
  280.             // Set quantity
  281.             foreach ($page['tickets'] as $key => $ticket) {
  282.                 $auxTotal $this->ticketing->curl("tickets?limit=1&onSale=true&maxPrice=" . (float)$ticket["price"] . "&minPrice=" . (float)$ticket["price"] . "&event=" $event"normal", [], "GET");
  283.                 $page["tickets"][$key]["quantity"] = $auxTotal["total"];
  284.                 if ($page["tickets"][$key]["quantity"] > 6)
  285.                     $page["tickets"][$key]["quantity"] = 6;
  286.             }
  287.             // PMR movilidad reducida for sale
  288.             $sintaxAdd '&onSale=true&groupBy=price&orderBy=price&category_name=PMR';
  289.             $pmr $this->ticketing->curl("tickets".$sintax.$sintaxAdd"normal", [], "GET");
  290.             // Set quantity
  291.             foreach ($pmr['tickets'] as $key => $ticket) {
  292.                 $auxTotal $this->ticketing->curl("tickets?category_name=PMR&limit=1&onSale=true&maxPrice=" . (float)$ticket["price"] . "&minPrice=" . (float)$ticket["price"] . "&event=" $event"normal", [], "GET");
  293.                 $pmr["tickets"][$key]["quantity"] = $auxTotal["total"];
  294.                 if ($pmr["tickets"][$key]["quantity"] > 6)
  295.                     $pmr["tickets"][$key]["quantity"] = 6;
  296.             }
  297.             // Tickets sold out
  298.             $sintaxAdd '&onSale=false&onSaleByUser=false&groupBy=price&orderBy=price';
  299.             $pageSoldOut $this->ticketing->curl("tickets".$sintax.$sintaxAdd"normal", [], "GET");
  300.             foreach ($pageSoldOut['tickets'] as $key => $ticket) {
  301.                 $auxTotal $this->ticketing->curl("tickets?limit=1&onSale=true&maxPrice=" . (float)$ticket["price"] . "&minPrice=" . (float)$ticket["price"] . "&event=" $event,
  302.                     "normal", [], "GET");
  303.                 // Delete block of tickets that are not fully sold out
  304.                 if (isset($auxTotal) && $auxTotal['total'] > 0)
  305.                     unset($pageSoldOut['tickets'][$key]);
  306.             }
  307.             return $this->render('events/include-event-tickets.html.twig', [
  308.                 'page' => $page,
  309.                 'pageSoldOut' => $pageSoldOut,
  310.                 //'pageOnSaleByUsers' => $pageOnSaleByUsers,
  311.                 'pmr' => $pmr,
  312.                 "userId" => $userId,
  313.             ]);
  314.         }
  315.         else{
  316.             $sintax.= "&onSaleByUser=true";
  317.             $page $this->ticketing->curl("tickets?orderBy=price".$sintax"normal", [], "GET");
  318.             $price array_column($page['tickets'], 'price');
  319.             array_multisort($price$order$page['tickets']);
  320.             return $this->render('tickets/include-tickets.html.twig', [
  321.                 'page' => $page,
  322.                 "userId" => $userId,
  323.             ]);
  324.         }
  325.     }
  326.     /**
  327.      * @Route("/include-tickets-type", name="include_tickets_type")
  328.      */
  329.     public function includeTicketType(Request $request$ticketsTypes null$anonymousPurchase null): Response
  330.     {
  331.         // General function to set discount ref/affId
  332.         $csession $request->getSession();
  333.         $this->functions->setDiscount($request);
  334.         // Anonymous purchase
  335.         if (!empty($request->get('email-guest'))) {
  336.             $userId $request->get('email-guest');
  337.             $csession->set('email-guest'$userId);
  338.         } else {
  339.             $userId $this->functions->getUserLogged();
  340.         }
  341.         $event $request->get("event");
  342.         $userType $csession->get('userType');
  343.         $userEventId $csession->get('userEventId');
  344.         // Direct sale for special users
  345.         if (!empty($userType) && $userType == && $userEventId == $event) {
  346.             $params '?event='$event .'&saleType=offline';
  347.         } elseif(!empty($userType) && $userType == && $userEventId != $event) {
  348.             $params '';
  349.         } else {
  350.             $params '?event='$event;
  351.         }
  352.         if (!empty($ticketsTypes))
  353.             $params.= '&types='.urlencode(json_encode($ticketsTypes));
  354.         $mapUrl '';
  355.         $eventData =  $this->ticketing->curl("events/"$event"normal", [], "GET");
  356.         if (!empty($eventData['attributes']['json']) )
  357.             $mapUrl $eventData['attributes']['json'];
  358.         $ticketsTypes $this->ticketing->curl("tickets-types"$params"normal", [], "GET");
  359.         return $this->render('events/include-event-tickets-types.html.twig', [
  360.             'ticketsType' => $ticketsTypes['tickets'],
  361.             "userId" => $userId,
  362.             'eventId' => $event,
  363.             'mapUrl' => $mapUrl,
  364.             'anonymousPurchase' => $anonymousPurchase
  365.         ]);
  366.     }
  367.     /**
  368.      * @Route("/include-tickets-stadium", name="include_tickets_stadium")
  369.      */
  370.     public function includeTicketStadium(Request $request): Response
  371.     {
  372.         // General function to set discount ref/affId
  373.         $this->functions->setDiscount($request);
  374.         $userId $this->functions->getUserLogged();
  375.         if($request->get("small")) {
  376.             $event $request->get("event");
  377.             $tickets $this->ticketing->curl("tickets-model?orderBy=price&order=desc&event_id=".$event"normal", [], "GET");
  378.             $data = [];
  379.             $data['tier'] = '';
  380.             $data['pmr'] = '';
  381.             $data['upcoming_tickets'] = [];
  382.             $data['pages'] = [];
  383.             $data['free'] = '';
  384.             
  385.             foreach($tickets['tickets'] as $ticket) {
  386.                 if (empty($ticket['categoryName'])) {
  387.                     $data['pages'][] = $ticket;
  388.                 }
  389.                 if (!empty($ticket['categoryName']) && $ticket['categoryName'] == 'PMR') {
  390.                     $data['pmr'] = $ticket;
  391.                 }
  392.                 if (!empty($ticket['categoryName']) && $ticket['categoryName'] == 'Grada') {
  393.                     $data['tier'] = $ticket;
  394.                 }
  395.                 if (!empty($ticket['categoryName']) && $ticket['categoryName'] == 'upcoming') {
  396.                     $data['upcoming_tickets'][] = $ticket;
  397.                 }
  398.                 if (!empty($ticket['categoryName']) && $ticket['categoryName'] == 'free') {
  399.                     $data['free'] = $ticket;
  400.                 }
  401.             }
  402.             usort($data['upcoming_tickets'], function($a$b) {
  403.                 return strcmp($a['attributes']['level'], $b['attributes']['level']);
  404.             });
  405.             return $this->render('events/include-event-tickets-stadium.html.twig', [
  406.                 'pages' => $data['pages'],
  407.                 'tier' => $data['tier'],
  408.                 "userId" => $userId,
  409.                 'pmr' => $data['pmr'],
  410.                 'free' => $data['free'],
  411.                 'upcoming_tickets' => $data['upcoming_tickets'],
  412.                 'total' => $tickets['total'],
  413.                 'eventId' => $event
  414.             ]);
  415.         }
  416.         else{
  417.             if(!$request->get("saleuser")){
  418.                 $sintax="&pack=null";
  419.             }
  420.             else{
  421.                 $sintax="";
  422.             }
  423.             if($request->get("type")){
  424.                 switch($request->get("type")){
  425.                     case "2":$sintax.="&maxPrice=5000";break;
  426.                     case "4":
  427.                         $sintax.="&name=keys";
  428.                         break;
  429.                     case "6":
  430.                     case "7":
  431.                         $sintax .= "&name=Space+Top+Moment";
  432.                         break;
  433.                     default: $sintax.="";break;
  434.                 }
  435.             }
  436.             if ($request->get('maxPrice'))
  437.                 $sintax.="&minPrice=".$request->get('minPrice')."&maxPrice=".$request->get('maxPrice');
  438.             if($request->get("order") && $request->get("order")=="2"){
  439.                 $sintax.="&order=desc";
  440.                 $order SORT_DESC;
  441.             }
  442.             else{
  443.                 $sintax.="&order=asc";
  444.                 $order SORT_ASC;
  445.             }
  446.             if($request->get("name")){
  447.                 $sintax.="&name=".urlencode($request->get("name"));
  448.             }
  449.             if($request->get("price_equal")){
  450.                 $sintax.="&maxPrice=".$request->get("price_equal")."&minPrice=".$request->get("price_equal");
  451.             }
  452.             if($request->get("offset")){
  453.                 $sintax.="&offset=".$request->get("offset");
  454.             }
  455.             if($request->get("limit")){
  456.                 $sintax.="&limit=".$request->get("limit");
  457.             }
  458.             else{
  459.                 $sintax.="&limit=12";
  460.             }
  461.             if($request->get("event")){
  462.                 $sintax.="&event=".$request->get("event");
  463.             }
  464.             if($request->get("group")){
  465.                 $sintax.="&groupBy=price";
  466.             }
  467.             $sintax.= "&onSaleByUser=true";
  468.             $page $this->ticketing->curl("tickets?orderBy=price".$sintax"normal", [], "GET");
  469.             $price array_column($page['tickets'], 'price');
  470.             array_multisort($price$order$page['tickets']);
  471.             return $this->render('tickets/include-tickets.html.twig', [
  472.                 'page' => $page,
  473.                 "userId" => $userId,
  474.             ]);
  475.         }
  476.     }
  477.     /**
  478.      * @Route("/ticket-detail/{ticketId}", name="ticket-detail")
  479.      * @Route("/nft-collection/{ticketId}", name="ticket-detail-finished")
  480.      * @Route("/qr-ticket-detail/{ticketId}", name="qr-ticket-detail")
  481.      */
  482.     public function ticketDetail(Request $request$ticketId): Response
  483.     {
  484.         $em $this->doctrine->getManager();
  485.         // General function to set discount ref/affId
  486.         $this->functions->setDiscount($request);
  487.         // Check if user is not registered but has tickets as anonymous user
  488.         $anonymous FALSE;
  489.         if ($request->get('anonymous'))
  490.             $anonymous filter_var($request->get('anonymous'), FILTER_VALIDATE_BOOLEAN);
  491.         // Check if ticketId is a serialized string (mailing links)
  492.         $serializedString '';
  493.         if ((@unserialize(base64_decode($ticketId)) !== false)) {
  494.             $serializedString $ticketId;
  495.             $unserializeData unserialize(base64_decode($ticketId));
  496.             $ticketId $unserializeData['tokenId'];
  497.         }
  498.         $userId=false;
  499.         $max=0;
  500.         $quantity=1;
  501.         $history["activity"]=array();
  502.         $ticket $this->ticketing->curl("tickets/".$ticketId"normal", [], "GET");
  503.         // Protect nft collection and ticket detail routes
  504.         date_default_timezone_set($ticket['event']['region']['name']);
  505.         $dateAccessTicket date("Y-m-d H:i:s"strtotime('-24 hours'));
  506.         $route_name $request->attributes->get('_route');
  507.         // Urls where tickets are activated
  508.         $automatic_activation_url = ['qr-ticket-detail''ticket-detail'];
  509.         // Automatic activation for tickets
  510.         if (!$ticket["active"] && in_array($route_name$automatic_activation_url) && !empty($ticket["user"])
  511.             && !$ticket['onSaleUser'] && (date("Y-m-d H:i:s") >= $ticket['event']['dateActivation']) ) {
  512.             // get event
  513.             $event $this->ticketing->curl("events/".$ticket["event"]["id"], "normal", [], "GET");
  514.             $activation $this->ticketing->curl("tickets/".$ticketId."/activate""normal", ["latitude" => $event["latitude"], "longitude" => $event["longitude"]], "PATCH");
  515.             if ($activation["code"] != "200") {
  516.                 $ticket['activation_not_success'] = true;
  517.             } else {
  518.                 $ticket['active'] = true;
  519.                 $ticket['accessCode'] = $activation['accessCode'];
  520.             }
  521.         }
  522.         if (($dateAccessTicket $ticket['event']['dateEvent']) && $route_name != 'ticket-detail-finished') {
  523.             $this->addFlash(
  524.                 'notice',
  525.                 'No se puede acceder a este ticket'
  526.             );
  527.             return $this->redirectToRoute('home');
  528.         } elseif (($dateAccessTicket $ticket['event']['dateEvent']) && $route_name != 'ticket-detail' && $route_name != 'qr-ticket-detail') {
  529.             $this->addFlash(
  530.                 'notice',
  531.                 'No se puede acceder a este ticket'
  532.             );
  533.             return $this->redirectToRoute('home');
  534.         }
  535.         if(!$ticket || $ticket["code"]!="200"){
  536.             $this->addFlash(
  537.                 'notice',
  538.                 'No se puede acceder al ticket'
  539.             );
  540.             return $this->redirectToRoute('home');
  541.         }
  542.         //Si el ticket pertence a un usuario
  543.         if($ticket["user"]){
  544.             $userId = !empty($unserializeData) ? $unserializeData['userId'] : $this->functions->getUserLogged();
  545.             if ($anonymous && !$ticket["user"]["enabled"])
  546.                 $userId $ticket["user"]["userId"];
  547.             // Anonymous users are allowed to access to nft collection
  548.             if (($dateAccessTicket $ticket['event']['dateEvent']) && !$userId && empty($unserializeData)) {
  549.                 $this->addFlash(
  550.                     'notice',
  551.                     'Debe iniciar sesión como usuario'
  552.                 );
  553.                 return $this->redirectToRoute('access', array("redirect" => $this->generateUrl('ticket-detail', array("ticketId" => $ticketId))));
  554.             }
  555.             if ($ticket["user"]["userId"] != $userId && !$ticket["onSaleUser"]) {
  556.                 $this->addFlash(
  557.                     'notice',
  558.                     'No se puede acceder a este ticket'
  559.                 );
  560.                 return $this->redirectToRoute('home');
  561.             }
  562.             if(!empty($ticket["pack"])){
  563.                 $page $this->ticketing->curl("packs?event=".$ticket["event"]["id"]."&onSale=true&category=".$ticket["pack"]["category"]["id"], "normal", array(), "GET");
  564.                 $sold $this->ticketing->curl("packs?event=".$ticket["event"]["id"]."&onSale=false&category=".$ticket["pack"]["category"]["id"], "normal", array(), "GET");
  565.             }
  566.             else{
  567.                 $page $this->ticketing->curl("tickets?event=".$ticket["event"]["id"]."&onSale=true&pack=null&maxPrice=".$ticket["price"]."&minPrice=".$ticket["price"], "normal", array(), "GET");
  568.                 $sold $this->ticketing->curl("tickets?event=".$ticket["event"]["id"]."&onSale=false&pack=null&maxPrice=".$ticket["price"]."&minPrice=".$ticket["price"], "normal", array(), "GET");
  569.             }
  570.             $history $this->ticketing->curl("tickets/activity?ticket=".$ticketId"normal", array(), "GET");
  571.             foreach($history["activity"] as $key => $activity){
  572.                 if(array_key_exists("newUser"$activity) && !empty($activity["newUser"])){
  573.                     $auxUser $em->getRepository(User::class)->findOneBy(['user_id' => $activity["newUser"]["userId"]]);
  574.                     if ($auxUser instanceof User){
  575.                         $alias = !empty($auxUser->getAlias()) ? $auxUser->getAlias() : "(unknown)";
  576.                         $history["activity"][$key]["newUser"]["alias"] = $alias;
  577.                     }
  578.                 }
  579.             }
  580.         }
  581.         else{
  582.             //Si es un ticket en venta
  583.             if(!empty($ticket["pack"])){
  584.                 $this->addFlash(
  585.                     'notice',
  586.                     'Ticket no a la venta en este momento'
  587.                 );
  588.                 return $this->redirectToRoute('home');
  589.             }
  590.             $page $this->ticketing->curl("tickets?event=".$ticket["event"]["id"]."&onSale=true&pack=null&maxPrice=".$ticket["price"]."&minPrice=".$ticket["price"], "normal", array(), "GET");
  591.             if($page && array_key_exists("total"$page)){
  592.                 $max=$page["total"];
  593.                 if($max>15){
  594.                     $max=15;
  595.                 }
  596.             }
  597.             else{
  598.                 $max=1;
  599.             }
  600.             $sold $this->ticketing->curl("tickets?event=".$ticket["event"]["id"]."&onSale=false&pack=null&maxPrice=".$ticket["price"]."&minPrice=".$ticket["price"], "normal", array(), "GET");
  601.         }
  602.         if($request->get("quantity")){
  603.             if($request->get("quantity")>$max){
  604.                 $this->addFlash(
  605.                     'notice',
  606.                     'Ha solicitado mĆ”s unidades de las disponibles, se le ha ajustado la cantidad al mĆ”ximo'
  607.                 );
  608.                 $quantity=$max;
  609.             }
  610.             else{
  611.                 $quantity=$request->get("quantity");
  612.             }
  613.         }
  614.         $routeName $request->attributes->get('_route');
  615.         $event $this->ticketing->curl("events/".$ticket['event']['id'], "normal", array(), "GET");
  616.         return $this->render('tickets/'.$routeName.'.html.twig', [
  617.             "ticket" => $ticket,
  618.             "max" => $max,
  619.             "onSale" => $page["total"],
  620.             "sold" => $sold["total"],
  621.             "quantity" => $quantity,
  622.             "userId" => $userId,
  623.             "history" => $history["activity"],
  624.             "scagle_url" => $_ENV['SCAGLE_URL'],
  625.             "event" => $event,
  626.             "dataSerialized" => $serializedString,
  627.             "anonymous" => $anonymous,
  628.         ]);
  629.     }
  630.     /**
  631.      * @Route("/checkout-ticket/{ticketTypeId}", name="ticket-type-buy")
  632.      */
  633.     public function ticketTypeBuy(Request $request$ticketTypeId): Response
  634.     {
  635.         $csession $request->getSession();
  636.         $userType $csession->get('userType');
  637.         if (!empty($userType) && $userType == )
  638.             return $this->ticketDirectSale($request$ticketTypeId);
  639.         $em $this->doctrine->getManager();
  640.         $type "tickets";
  641.         $ticketType $this->ticketing->curl("tickets-types/" $ticketTypeId"normal", [], "GET");
  642.         if (!$ticketType || $ticketType["code"] != "200") {
  643.             $this->addFlash(
  644.                 'notice',
  645.                 'No se puede acceder al ticket'
  646.             );
  647.             return $this->redirectToRoute('home');
  648.         }
  649.         // Reference data
  650.         $quantity $request->get("quantity");
  651.         $price $ticketType['price'];
  652.         $event $ticketType['eventId'];
  653.         // Anonymous purchase
  654.         if (!empty($csession->get('email-guest'))) {
  655.             $userId $this->anonymousCheckout($csession->get('email-guest'), $em);
  656.         } else {
  657.             $userId $this->functions->getUserLogged();
  658.         }
  659.         // Check user
  660.         if (empty($userId)) {
  661.             $this->addFlash(
  662.                 'notice',
  663.                 'Debe iniciar sesión como usuario'
  664.             );
  665.             return $this->redirectToRoute('home');
  666.         }
  667.         // Max tickets per eventb based on maxOrder field
  668.         $tickets $this->ticketing->curl("tickets?user=" $userId "&event=" $ticketType['eventId'] . "&limit=10""normal", [], "GET");
  669.         $sents $this->ticketing->curl("tickets/activity?origin=" $userId "&limit=1&enabled=true&type=transfer&event=" $ticketType['eventId'], "normal", [], "GET");
  670.         $sales $this->ticketing->curl("tickets/activity?origin=" $userId "&limit=1&enabled=true&type=sale&event=" $ticketType['eventId'], "normal", [], "GET");
  671.         $total_user_tickets $tickets['total'] + $sents['total'] + $sales['total'];
  672.         $tickets_total $total_user_tickets $request->get('quantity');
  673.         if ($tickets_total $ticketType['maxOrder']) {
  674.             $this->addFlash(
  675.                 'notice',
  676.                 'Se puede comprar un mĆ”ximo de '$ticketType['maxOrder'] .' tickets por evento'
  677.             );
  678.             return $this->redirectToRoute('home');
  679.         }
  680.         // Ticket type sold
  681.         $data = [
  682.             'quantity' => $quantity,
  683.         ];
  684.         // Quantity sold + 1
  685.         $ticketTypeSold $this->ticketing->curl("tickets-types/" $ticketType['ticketTypeId'], "normal"$data"PATCH");
  686.         if ($ticketTypeSold["code"] != "200") {
  687.             $this->addFlash(
  688.                 'notice',
  689.                 'No hay tickets suficientes'
  690.             );
  691.             return $this->redirectToRoute('event-tickets', ['event' => $event]);
  692.         }
  693.         // Autocomplete input coupon
  694.         $codeRef $this->functions->autoInputCouponCode($request);
  695.         // General function to set discount ref/affId/code
  696.         $discount $this->functions->setDiscount($request);
  697.         $version $this->functions->addAppVersion();
  698.         $discounts = [];
  699.         $administrationFees 0;
  700.         if (empty($ticketType['manageFeeBy']) or $ticketType['manageFeeBy'] == 'buyer') {
  701.             $administrationFees = ($ticketType['manageFee'] / 100) + 1;
  702.         }
  703.         $total $price $quantity;
  704.         $discountType null;
  705.         $baseTotal 0;
  706.         if ($discount && !empty($request->get('discount-type'))) {
  707.             $discountType $request->get('discount-type');
  708.             switch ($discountType) {
  709.                 case 1:
  710.                     $total $total - ($total * ($discount 100));
  711.                     $baseTotal $total;
  712.                     break;
  713.                 case 2:
  714.                     $total $total $discount;
  715.                     $baseTotal $total;
  716.                     break;
  717.             }
  718.         }
  719.         $total $total $administrationFees;
  720.         // Purchase data
  721.         date_default_timezone_set('UTC');
  722.         $objUser $em->getRepository(User::class)->findOneBy(['user_id' => $userId]);
  723.         $wh_token bin2hex(random_bytes(45));
  724.         $purchase = new Purchase();
  725.         $purchase->setUser($objUser);
  726.         $purchase->setPrice($total);
  727.         $purchase->setToken($wh_token);
  728.         $purchase->setUpdatedAt(new \DateTime());
  729.         $purchase->setRemoved(FALSE);
  730.         if ($csession->get('ref'))
  731.             $purchase->setRef($csession->get('ref'));
  732.         if ($csession->get('affId'))
  733.             $purchase->setRef($csession->get('affId'));
  734.         if($csession->get('coupon'))
  735.             $purchase->setRef($csession->get('coupon'));
  736.         $em->persist($purchase);
  737.         $line = new Line();
  738.         $line->setPurchase($purchase);
  739.         $line->setPrice($total);
  740.         $line->setDescription("Tickets");
  741.         $em->persist($line);
  742.         for ($i 0$i $quantity$i++) {
  743.             $item = new Item();
  744.             $item->setLine($line);
  745.             $item->setTicket($ticketType['ticketTypeId']);
  746.             $item->setName($ticketType['name']);
  747.             $item->setPrice($ticketType["price"]);
  748.             $item->setQuantity(1);
  749.             $item->setCompleted(FALSE);
  750.             $em->persist($item);
  751.         }
  752.         $em->flush();
  753.         $line_items[] = [
  754.             'price_data' => [
  755.                 'currency' => 'eur',
  756.                 'product_data' => [
  757.                     'name' => $quantity ' x ' $ticketType["name"]
  758.                 ],
  759.                 'unit_amount' => (number_format($total2'.''') * 100),
  760.             ],
  761.             'quantity' => 1,
  762.         ];
  763.         $locale $request->getLocale();
  764.         $checkout = [
  765.             'payment_method_types' => ['card'],
  766.             'line_items' => $line_items,
  767.             'locale' => $locale,
  768.             'mode' => 'payment',
  769.             'discounts' => $discounts,
  770.             'success_url' => $this->generateUrl('purchase_completed', ["token" => $purchase->getToken()], UrlGeneratorInterface::ABSOLUTE_URL),
  771.             'cancel_url' => $this->generateUrl('stripe_error', [], UrlGeneratorInterface::ABSOLUTE_URL),
  772.             'expires_at' => time() + 1800// Configured to expire after 15 minutes
  773.         ];
  774.         $checkout['customer_email'] = $userId;
  775.         //-------------
  776.         // init stripe
  777.         //-------------
  778.         \Stripe\Stripe::setApiKey($_ENV['STRIPE_PRIVATE']);
  779.         $session = \Stripe\Checkout\Session::create($checkout);
  780.         $purchase->setType("stripe");
  781.         $purchase->setPaymentId($session->id);
  782.         $purchase->setUpdatedAt(new \DateTime());
  783.         $em->persist($purchase);
  784.         $em->flush();
  785.         return $this->render('tickets/ticket-type-buy.html.twig', [
  786.             "item" => $ticketType,
  787.             "quantity" => $request->get("quantity"),
  788.             "type" => $type,
  789.             "image" => $ticketType["imageThumb"],
  790.             "discount" => $discount,
  791.             'version' => $version,
  792.             'codeRef' => $codeRef,
  793.             'env' => $_ENV['APP_ENV'],
  794.             "token" => $purchase->getToken(),
  795.             'checkout_id' => $session->id,
  796.             'stripe_public' => $_ENV['STRIPE_PUBLIC'],
  797.             'total' => $total,
  798.             'discount_type' => $discountType,
  799.             'base_total' => $baseTotal
  800.         ]);
  801.     }
  802.     /**
  803.      * @Route("/ticket-buy/{ticketId}", name="ticket-buy")
  804.      */
  805.     public function ticketBuy(Request $request$ticketId): Response
  806.     {
  807.         $csession $request->getSession();
  808.         $em $this->doctrine->getManager();
  809.         $type "tickets";
  810.         $ticketReference $this->ticketing->curl("tickets/" $ticketId"normal", [], "GET");
  811.         if (!$ticketReference || $ticketReference["code"] != "200") {
  812.             $this->addFlash(
  813.                 'notice',
  814.                 'No se puede acceder al ticket'
  815.             );
  816.             return $this->redirectToRoute('home');
  817.         }
  818.         // Reference data
  819.         $quantity $request->get("quantity");
  820.         $event $ticketReference['event']['id'];
  821.         $price $ticketReference['price'];
  822.         $data = [
  823.             'event' => $event,
  824.             'price' => $price,
  825.             'quantity' => $quantity,
  826.         ];
  827.         $category $ticketReference['category'];
  828.         if (!empty($category)) $data['categoryId'] = $category['id'];
  829.         // Check user
  830.         $userId $this->functions->getUserLogged();
  831.         if (empty($userId)) {
  832.             $this->addFlash(
  833.                 'notice',
  834.                 'Debe iniciar sesión como usuario'
  835.             );
  836.             return $this->redirectToRoute('home');
  837.         }
  838.         // Max 6 tickets per event
  839.         $tickets $this->ticketing->curl("tickets?user=" $userId "&event=" $ticketReference['event']['id'] . "&limit=10""normal", [], "GET");
  840.         $sents $this->ticketing->curl("tickets/activity?origin=" $userId "&limit=1&enabled=true&type=transfer&event=" $ticketReference['event']['id'], "normal", [], "GET");
  841.         $sales $this->ticketing->curl("tickets/activity?origin=" $userId "&limit=1&enabled=true&type=sale&event=" $ticketReference['event']['id'], "normal", [], "GET");
  842.         $total_user_tickets $tickets['total'] + $sents['total'] + $sales['total'];
  843.         $tickets_total $total_user_tickets $request->get('quantity');
  844.         if ($tickets_total 6) {
  845.             $this->addFlash(
  846.                 'notice',
  847.                 'Se puede comprar un mĆ”ximo de 6 tickets por evento'
  848.             );
  849.             return $this->redirectToRoute('home');
  850.         }
  851.         // Ticket info count
  852.         $ticketInfo $this->ticketing->curl("tickets-info""normal"$data"PATCH");
  853.         if ($ticketInfo["code"] != "200") {
  854.             $this->addFlash(
  855.                 'notice',
  856.                 'No hay tickets suficientes'
  857.             );
  858.             return $this->redirectToRoute('event-tickets', ['event' => $event]);
  859.         }
  860.         // Autocomplete input coupon
  861.         $codeRef $this->functions->autoInputCouponCode($request);
  862.         // General function to set discount ref/affId/code
  863.         $discount $this->functions->setDiscount($request$ticketId);
  864.         $version $this->functions->addAppVersion();
  865.         $discounts = [];
  866.         $administrationFees 1.10;
  867.         $administrationFeesIfZero 0.10;
  868.         $totalWithoutDiscount $price $quantity;
  869.         $total = ($totalWithoutDiscount - ($discount $totalWithoutDiscount) / 100);
  870.         $total $discount 0
  871.             $total + ($totalWithoutDiscount $administrationFeesIfZero)
  872.             : $total $administrationFees;
  873.         // Purchase data
  874.         date_default_timezone_set('UTC');
  875.         $objUser $em->getRepository(User::class)->findOneBy(['user_id' => $userId]);
  876.         $wh_token bin2hex(random_bytes(45));
  877.         $purchase = new Purchase();
  878.         $purchase->setUser($objUser);
  879.         $purchase->setPrice($total);
  880.         $purchase->setToken($wh_token);
  881.         $purchase->setUpdatedAt(new \DateTime());
  882.         $purchase->setRemoved(FALSE);
  883.         if ($csession->get('ref') && !$ticketReference["user"])
  884.             $purchase->setRef($csession->get('ref'));
  885.         if ($csession->get('affId') && !$ticketReference["user"])
  886.             $purchase->setRef($csession->get('affId'));
  887.         $em->persist($purchase);
  888.         $line = new Line();
  889.         $line->setPurchase($purchase);
  890.         $line->setPrice($total);
  891.         $line->setDescription("Tickets");
  892.         $em->persist($line);
  893.         for ($i 0$i $quantity$i++) {
  894.             $item = new Item();
  895.             $item->setLine($line);
  896.             $item->setTicket($ticketInfo['id']);
  897.             $item->setName($ticketReference['name']);
  898.             $item->setPrice($ticketReference["price"]);
  899.             $item->setQuantity(1);
  900.             $item->setCompleted(FALSE);
  901.             $em->persist($item);
  902.         }
  903.         $em->flush();
  904.         $line_items[] = [
  905.             'price_data' => [
  906.                 'currency' => 'eur',
  907.                 'product_data' => [
  908.                     'name' => $quantity ' x ' $ticketReference["name"]
  909.                 ],
  910.                 'unit_amount' => (number_format($total2'.''') * 100),
  911.             ],
  912.             'quantity' => 1,
  913.         ];
  914.         $checkout = [
  915.             'payment_method_types' => ['card'],
  916.             'line_items' => $line_items,
  917.             'locale' => 'es',
  918.             'mode' => 'payment',
  919.             'discounts' => $discounts,
  920.             'success_url' => $this->generateUrl('purchase_completed', ["token" => $purchase->getToken()], UrlGeneratorInterface::ABSOLUTE_URL),
  921.             'cancel_url' => $this->generateUrl('stripe_error', [], UrlGeneratorInterface::ABSOLUTE_URL),
  922.             'expires_at' => time() + 1800// Configured to expire after 15 minutes
  923.         ];
  924.         $checkout['customer_email'] = $userId;
  925.         //-------------
  926.         // init stripe
  927.         //-------------
  928.         \Stripe\Stripe::setApiKey($_ENV['STRIPE_PRIVATE']);
  929.         $session = \Stripe\Checkout\Session::create($checkout);
  930.         $purchase->setType("stripe");
  931.         $purchase->setPaymentId($session->id);
  932.         $purchase->setUpdatedAt(new \DateTime());
  933.         $em->persist($purchase);
  934.         $em->flush();
  935.         return $this->render('tickets/ticket-buy.html.twig', [
  936.             "item" => $ticketReference,
  937.             "quantity" => $request->get("quantity"),
  938.             "type" => $type,
  939.             "image" => $ticketReference["image"],
  940.             "discount" => $discount,
  941.             'version' => $version,
  942.             'codeRef' => $codeRef,
  943.             'env' => $_ENV['APP_ENV'],
  944.             "token" => $purchase->getToken(),
  945.             'checkout_id' => $session->id,
  946.             'stripe_public' => $_ENV['STRIPE_PUBLIC']
  947.         ]);
  948.     }
  949.     /**
  950.      * @Route("/ticket-sale/{ticketId}", name="ticket-sale")
  951.      */
  952.     public function ticketBuySecondaryMarket(Request $request$ticketId): Response
  953.     {
  954.         $csession $request->getSession();
  955.         $em $this->doctrine->getManager();
  956.         $userId false;
  957.         $type "tickets";
  958.         $max 0;
  959.         $ticketReference $this->ticketing->curl("tickets/" $ticketId"normal", [], "GET");
  960.         if (!$ticketReference || $ticketReference["code"] != "200") {
  961.             $this->addFlash(
  962.                 'notice',
  963.                 'No se puede acceder al ticket'
  964.             );
  965.             return $this->redirectToRoute('home');
  966.         }
  967.         $event $ticketReference['event']['id'];
  968.         $ticketPrice $ticketReference['price'];
  969.         $userId $this->functions->getUserLogged();
  970.         if (empty($userId)) {
  971.             $this->addFlash(
  972.                 'notice',
  973.                 'Debe iniciar sesión como usuario'
  974.             );
  975.             return $this->redirectToRoute('home');
  976.         }
  977.         // Max 6 tickets per event
  978.         $tickets $this->ticketing->curl("tickets?user=" $userId "&event=" $ticketReference['event']['id'] . "&limit=10""normal", [], "GET");
  979.         $sents $this->ticketing->curl("tickets/activity?origin=" $userId "&limit=1&enabled=true&type=transfer&event=" $ticketReference['event']['id'], "normal", [], "GET");
  980.         $sales $this->ticketing->curl("tickets/activity?origin=" $userId "&limit=1&enabled=true&type=sale&event=" $ticketReference['event']['id'], "normal", [], "GET");
  981.         $total_user_tickets $tickets['total'] + $sents['total'] + $sales['total'];
  982.         $tickets_total $total_user_tickets $request->get('quantity');
  983.         if ($tickets_total 6) {
  984.             $this->addFlash(
  985.                 'notice',
  986.                 'Se puede comprar un mĆ”ximo de 6 tickets por evento'
  987.             );
  988.             return $this->redirectToRoute('home');
  989.         }
  990.         // Stripe controller
  991.         $discounts = [];
  992.         $disc 0;
  993.         if (!$ticketReference["user"]) {
  994.             if (!$request->get("quantity") || !is_numeric($request->get("quantity")) || $request->get("quantity") < || $request->get("quantity") > 15) {
  995.                 $this->addFlash(
  996.                     'notice',
  997.                     'Debe indicar una cantidad vĆ”lida'
  998.                 );
  999.                 return $this->redirectToRoute('event-tickets', ['event' => $event]);
  1000.             }
  1001.             $quantity $request->get("quantity");
  1002.             if (!$ticketPrice || !is_numeric($ticketPrice)) {
  1003.                 $this->addFlash(
  1004.                     'notice',
  1005.                     'El precio indicado no es correcto'
  1006.                 );
  1007.                 return $this->redirectToRoute('event-tickets', ['event' => $event]);
  1008.             }
  1009.             // PMR personas de movilidad reducida tickets
  1010.             $pmr '';
  1011.             if ($request->get('pmr')) $pmr filter_var($request->get('pmr'), FILTER_VALIDATE_BOOLEAN);
  1012.             if (!empty($pmr) && $pmr) {
  1013.                 $tickets $this->ticketing->curl("tickets/ticket-selection?event=" $event "&minPrice=" $ticketPrice "&maxPrice=" $ticketPrice "&orderBy=token&order=desc&onSale=true&pack=null&limit=" $quantity "&category_name=PMR""normal", [], "PATCH");
  1014.             } else {
  1015.                 $tickets $this->ticketing->curl("tickets/ticket-selection?event=" $event "&minPrice=" $ticketPrice "&maxPrice=" $ticketPrice "&orderBy=token&order=desc&onSale=true&pack=null&limit=" $quantity "&not_category=true""normal", [], "PATCH");
  1016.             }
  1017.             if ((!$tickets || !array_key_exists("tickets"$tickets)) && count($tickets['tickets']) != $quantity) {
  1018.                 $this->addFlash(
  1019.                     'notice',
  1020.                     'No hay tickets suficientes'
  1021.                 );
  1022.                 return $this->redirectToRoute('event-tickets', ['event' => $event]);
  1023.             }
  1024.             if ($csession->get('eXCxKChv'))
  1025.                 $disc = (int)$csession->get('eXCxKChv');
  1026.             $price 0;
  1027.             foreach ($tickets["tickets"] as $tic) {
  1028.                 $price += $tic["price"] - ($disc $tic['price']) / 100;
  1029.                 $tickets_json[] = $tic;
  1030.                 $quantity--;
  1031.                 if ($quantity <= 0) {
  1032.                     break;
  1033.                 }
  1034.             }
  1035.             if ($quantity 0) {
  1036.                 $this->addFlash(
  1037.                     'notice',
  1038.                     'No hay tickets suficientes'
  1039.                 );
  1040.                 return $this->redirectToRoute('event-tickets', ['event' => $event]);
  1041.             }
  1042.         } else {
  1043.             if (!$ticketReference["onSaleUser"]) {
  1044.                 $this->addFlash(
  1045.                     'notice',
  1046.                     'Este ticket no estĆ” a la venta'
  1047.                 );
  1048.                 return $this->redirectToRoute('event-tickets', ['event' => $event]);
  1049.             }
  1050.             if ($ticketReference["isBlocked"]) {
  1051.                 $this->addFlash(
  1052.                     'notice',
  1053.                     'Este ticket no estĆ” disponible ahora mismo. Vuelva a intentarlo mĆ”s tarde'
  1054.                 );
  1055.                 return $this->redirectToRoute('event-tickets', ['event' => $event]);
  1056.             }
  1057.             $price $ticketReference["price"];
  1058.             $tickets_to_buy[] = ["blocked" => "true""id" => $ticketReference["id"]];
  1059.             $tickets_json[] = $ticketReference;
  1060.             //Bloqueamos los registros para que nadie pueda comprarlos
  1061.             $toBlock $this->ticketing->curl("tickets""json"$tickets_to_buy"PATCH");
  1062.             if ($toBlock["code"] != "200") {
  1063.                 $this->addFlash(
  1064.                     'notice',
  1065.                     'No se ha podido realizar la operación. Vuelva a intentarlo mĆ”s tarde'
  1066.                 );
  1067.                 return $this->redirectToRoute('event-tickets', ['event' => $event]);
  1068.             }
  1069.         }
  1070.         // Autocomplete input coupon
  1071.         $codeRef $this->functions->autoInputCouponCode($request);
  1072.         // General function to set discount ref/affId/code
  1073.         $discount $this->functions->setDiscount($request$ticketId);
  1074.         $version $this->functions->addAppVersion();
  1075.         // Purchase data
  1076.         date_default_timezone_set('UTC');
  1077.         $objUser $em->getRepository(User::class)->findOneBy(['user_id' => $userId]);
  1078.         $wh_token bin2hex(random_bytes(45));
  1079.         $administrationFees 0;
  1080.         if (empty($ticketReference['event']['manageFeeBy']) or $ticketReference['event']['manageFeeBy'] == 'buyer') {
  1081.             $administrationFees = !empty($ticketReference['event']['manageFee'])
  1082.                 ? ($ticketReference['event']['manageFee'] / 100)
  1083.                 : ($ticketReference['manageFee'] / 100);
  1084.         }
  1085.         $price $price * ($administrationFees 1);
  1086.         $purchase = new Purchase();
  1087.         $purchase->setUser($objUser);
  1088.         $purchase->setPrice($price);
  1089.         $purchase->setToken($wh_token);
  1090.         $purchase->setUpdatedAt(new \DateTime());
  1091.         $purchase->setRemoved(FALSE);
  1092.         if ($csession->get('ref') && !$ticketReference["user"])
  1093.             $purchase->setRef($csession->get('ref'));
  1094.         if ($csession->get('affId') && !$ticketReference["user"])
  1095.             $purchase->setRef($csession->get('affId'));
  1096.         $em->persist($purchase);
  1097.         $line = new Line();
  1098.         $line->setPurchase($purchase);
  1099.         $line->setPrice($price);
  1100.         $line->setDescription("Tickets");
  1101.         $em->persist($line);
  1102.         foreach ($tickets_json as $tic_item) {
  1103.             $item = new Item();
  1104.             $item->setLine($line);
  1105.             $item->setTicket($tic_item["id"]);
  1106.             $item->setName($tic_item["name"]);
  1107.             $item->setPrice($tic_item["price"]);
  1108.             $item->setQuantity(1);
  1109.             $item->setCompleted(FALSE);
  1110.             $em->persist($item);
  1111.         }
  1112.         $em->flush();
  1113.         $line_items = [];
  1114.         foreach ($tickets_json as $tic_item) {
  1115.             $price $tic_item["price"] - ($disc $tic_item['price']) / 100;
  1116.             $price *= 1.10;
  1117.             $line_items[] = [
  1118.                 'price_data' => [
  1119.                     'currency' => 'eur',
  1120.                     'product_data' => [
  1121.                         'name' => $tic_item["name"] . " - " $tic_item["id"]
  1122.                     ],
  1123.                     'unit_amount' => (number_format($price2'.''') * 100),
  1124.                 ],
  1125.                 'quantity' => 1,
  1126.             ];
  1127.         }
  1128.         $locale $request->getLocale();
  1129.         $checkout = [
  1130.             'payment_method_types' => ['card'],
  1131.             'line_items' => $line_items,
  1132.             'locale' => $locale,
  1133.             'mode' => 'payment',
  1134.             'discounts' => $discounts,
  1135.             'success_url' => $this->generateUrl('purchase_completed', ["token" => $purchase->getToken()], UrlGeneratorInterface::ABSOLUTE_URL),
  1136.             'cancel_url' => $this->generateUrl('stripe_error', [], UrlGeneratorInterface::ABSOLUTE_URL),
  1137.             'expires_at' => time() + 1800// Configured to expire after 15 minutes
  1138.         ];
  1139.         $checkout['customer_email'] = $userId;
  1140.         //-------------
  1141.         // init stripe
  1142.         //-------------
  1143.         \Stripe\Stripe::setApiKey($_ENV['STRIPE_PRIVATE']);
  1144.         $session = \Stripe\Checkout\Session::create($checkout);
  1145.         $purchase->setType("stripe");
  1146.         $purchase->setPaymentId($session->id);
  1147.         $purchase->setUpdatedAt(new \DateTime());
  1148.         $em->persist($purchase);
  1149.         $em->flush();
  1150.         return $this->render('tickets/ticket-buy.html.twig', [
  1151.             "item" => $ticketReference,
  1152.             "quantity" => $request->get("quantity"),
  1153.             "type" => $type,
  1154.             "image" => $ticketReference["image"],
  1155.             "discount" => $discount,
  1156.             'version' => $version,
  1157.             'codeRef' => $codeRef,
  1158.             'env' => $_ENV['APP_ENV'],
  1159.             "token" => $purchase->getToken(),
  1160.             'checkout_id' => $session->id,
  1161.             'stripe_public' => $_ENV['STRIPE_PUBLIC']
  1162.         ]);
  1163.     }
  1164.     /**
  1165.      * @Route("/ticket-seat-buy", name="ticket-seat-buy")
  1166.      */
  1167.     public function ticketSeatBuy(Request $request): Response
  1168.     {
  1169.         $csession $request->getSession();
  1170.         $userType $csession->get('userType');
  1171.         if (!empty($userType) && $userType == )
  1172.             return $this->ticketDirectSeatBuy($request);
  1173.         $type "tickets";
  1174.         $em $this->doctrine->getManager();
  1175.         $user $this->functions->getUserLogged();
  1176.         $tokens $request->get('tokens');
  1177.         if (!$user) {
  1178.             // tokens to unblock
  1179.             $data explode(','$tokens);
  1180.             $tickets_to_unblock = [];
  1181.             foreach ($data as $item) {
  1182.                 $tickets_to_unblock[] = ["blocked" => "false""id" => $item];
  1183.             }
  1184.             // if not user logged all tickets selected are unblocked
  1185.             $this->ticketing->curl("tickets""json"$tickets_to_unblock"PATCH");
  1186.             $this->addFlash(
  1187.                 'notice',
  1188.                 'Debe iniciar sesión como usuario'
  1189.             );
  1190.             return $this->redirectToRoute('home');
  1191.         }
  1192.         $tickets $this->ticketing->curl("tickets/?tokens=".$tokens"normal", [], "GET");
  1193.         if (!$tickets || $tickets["code"] != "200") {
  1194.                 $this->addFlash(
  1195.                 'notice',
  1196.                 'No se puede acceder al ticket'
  1197.             );
  1198.             return $this->redirectToRoute('home');
  1199.         }
  1200.         $administrationFees 0;
  1201.         if (empty($tickets['tickets'][0]['event']['manageFeeBy']) or $tickets['tickets'][0]['event']['manageFeeBy'] == 'buyer') {
  1202.             // Get commission from event
  1203.             $administrationFees = !empty($tickets['tickets'][0]['event']['manageFee'])
  1204.                 ? $tickets['tickets'][0]['event']['manageFee'] : 10;
  1205.         }
  1206.         $total $tickets['tickets'][0]['originalPrice'] * $tickets['total'];
  1207. //        $extra = $request->get('price') * ($administrationFees / 100);
  1208. //        $price = $request->get('price') + $extra;
  1209.         $extra $total * ($administrationFees 100);
  1210.         $price $total;
  1211.         $priceWithoutDiscount $price;
  1212.         // Autocomplete input coupon
  1213.         $codeRef $this->functions->autoInputCouponCode($request);
  1214.         // General function to set discount ref/affId/code
  1215.         $discount $this->functions->setDiscount($request);
  1216.         $version $this->functions->addAppVersion();
  1217.         $discountType null;
  1218.         $baseTotal 0;
  1219.         if ($discount && !empty($request->get('discount-type'))) {
  1220.             $discountType $request->get('discount-type');
  1221.             switch ($discountType) {
  1222.                 case 1:
  1223.                     $price $price - ($price * ($discount 100));
  1224.                     $baseTotal $price;
  1225.                     $extra $price * ($administrationFees 100);
  1226.                     break;
  1227.                 case 2:
  1228.                     $price $price $discount;
  1229.                     $baseTotal $price;
  1230.                     $extra $price * ($administrationFees 100);
  1231.                     break;
  1232.             }
  1233.         }
  1234.         $price $price $extra;
  1235.         // Purchase data
  1236.         date_default_timezone_set('UTC');
  1237.         $objUser $em->getRepository(User::class)->findOneBy(['user_id' => $user]);
  1238.         $wh_token bin2hex(random_bytes(45));
  1239.         $purchase = new Purchase();
  1240.         $purchase->setUser($objUser);
  1241.         $purchase->setPrice($price);
  1242.         $purchase->setToken($wh_token);
  1243.         $purchase->setUpdatedAt(new \DateTime());
  1244.         $purchase->setRemoved(FALSE);
  1245.         if ($csession->get('ref'))
  1246.             $purchase->setRef($csession->get('ref'));
  1247.         if ($csession->get('affId'))
  1248.             $purchase->setRef($csession->get('affId'));
  1249.         if($csession->get('coupon'))
  1250.             $purchase->setRef($csession->get('coupon'));
  1251.         $em->persist($purchase);
  1252.         $line = new Line();
  1253.         $line->setPurchase($purchase);
  1254.         $line->setPrice($price);
  1255.         $line->setDescription("Tickets");
  1256.         $em->persist($line);
  1257.         foreach ($tickets['tickets'] as $ticket) {
  1258.             $item = new Item();
  1259.             $item->setLine($line);
  1260.             $item->setTicket($ticket["id"]);
  1261.             $item->setName($ticket["name"]);
  1262.             $item->setPrice($ticket["price"]);
  1263.             $item->setQuantity(1);
  1264.             $item->setCompleted(FALSE);
  1265.             $em->persist($item);
  1266.         }
  1267.         $em->flush();
  1268.         $line_items[] = [
  1269.             'price_data' => [
  1270.                 'currency' => 'eur',
  1271.                 'product_data' => [
  1272.                     'name' => strip_tags($tickets['tickets'][0]['event']['name']) . " x " $tickets['total']
  1273.                 ],
  1274.                 'unit_amount' => (number_format($price2'.''') * 100),
  1275.             ],
  1276.             'quantity' => 1,
  1277.         ];
  1278.         $locale $request->getLocale();
  1279.         $checkout = [
  1280.             'payment_method_types' => ['card'],
  1281.             'line_items' => $line_items,
  1282.             'locale' => $locale,
  1283.             'mode' => 'payment',
  1284.             'success_url' => $this->generateUrl('purchase_completed', ["token" => $purchase->getToken()], UrlGeneratorInterface::ABSOLUTE_URL),
  1285.             'cancel_url' => $this->generateUrl('stripe_error', [], UrlGeneratorInterface::ABSOLUTE_URL),
  1286.             'expires_at' => time() + 1800// Configured to expire after 15 minutes
  1287.         ];
  1288.         $checkout['customer_email'] = $objUser->getUserId();
  1289.         //-------------
  1290.         // init stripe
  1291.         //-------------
  1292.         \Stripe\Stripe::setApiKey($_ENV['STRIPE_PRIVATE']);
  1293.         $session = \Stripe\Checkout\Session::create($checkout);
  1294.         $purchase->setType("stripe");
  1295.         $purchase->setPaymentId($session->id);
  1296.         $em->persist($purchase);
  1297.         $em->flush();
  1298.         return $this->render('tickets/ticket-seat-buy.html.twig', [
  1299.             "item" => $tickets,
  1300.             "event" => $tickets['tickets'][0]['event']['name'],
  1301.             "dateEvent" => $tickets['tickets'][0]['event']['dateEvent'],
  1302.             "type" => $type,
  1303.             "price" => $price,
  1304.             "extra" => $extra,
  1305.             "image" => $tickets['tickets'][0]['imageThumb'],
  1306.             "discount" => $discount,
  1307.             'version' => $version,
  1308.             'codeRef' => $codeRef,
  1309.             "token" => $purchase->getToken(),
  1310.             'env' => $_ENV['APP_ENV'],
  1311.             'checkout_id' => $session->id,
  1312.             'stripe_public' => $_ENV['STRIPE_PUBLIC'],
  1313.             'discount_type' => $discountType,
  1314.             'tokens' => $tokens,
  1315.             'priceWithoutDiscount' => $priceWithoutDiscount
  1316.         ]);
  1317.     }
  1318.     /**
  1319.      * @Route("/keys", name="keys")
  1320.      */
  1321.     public function keys(Request $request): Response
  1322.     {
  1323.         // General function to set discount ref/affId
  1324.         $this->functions->setDiscount($request);
  1325.         $keys $this->ticketing->curl("tickets?limit=3&orderBy=price&order=desc&name=Keys""normal", array(), "GET");
  1326.         return $this->render('keys/keys.html.twig', [
  1327.             'keys' => $keys["tickets"]
  1328.         ]);
  1329.     }
  1330.     /**
  1331.      * @Route("/key-detail/{keyId}", name="key-detail")
  1332.      */
  1333.     public function keyDetail(Request $request,$keyId): Response
  1334.     {
  1335.         // General function to set discount ref/affId
  1336.         $this->functions->setDiscount($request);
  1337.         $key $this->ticketing->curl("tickets/".$keyId"normal", array(), "GET");
  1338.         return $this->render('keys/key-detail.html.twig', [
  1339.             "key" => $key
  1340.         ]);
  1341.     }
  1342.     /**
  1343.      * @Route("/key-request/{keyId}", name="key-request")
  1344.      */
  1345.     public function keyRequest(Request $requestMailerInterface $mailer$keyId): Response
  1346.     {
  1347.         $key $this->ticketing->curl("tickets/".$keyId"normal", array(), "GET");
  1348.         if($request->get('send-form')){
  1349.             $name $request->get('name');
  1350.             $surname $request->get('surname');
  1351.             $phone $request->get('phone');
  1352.             $email $request->get('email');
  1353.             $key $request->get('key');
  1354.             $mail = (new TemplatedEmail())
  1355.                 ->from($this->getParameter('mailer_from'))
  1356.                 ->to($this->getParameter('mailer_contact'))
  1357.                 ->subject('DOW - Solicitud Key')
  1358.                 ->htmlTemplate('mail/key-request.html.twig')
  1359.                 ->context([
  1360.                     'name' => $name,
  1361.                     'surname' => $surname,
  1362.                     'phone' => $phone,
  1363.                     'correo' => $email,
  1364.                     'key' => $key
  1365.                 ]);
  1366.             $mailer->send($mail);
  1367.             $this->addFlash(
  1368.                 'success',
  1369.                 'Solicitud enviada'
  1370.             );
  1371.             return $this->redirectToRoute('home');
  1372.         }
  1373.         return $this->render('ticket/key-request.html.twig', [
  1374.             "key" => $key
  1375.         ]);
  1376.     }
  1377.     /**
  1378.      * @Route("/ticket-transfer/{ticketId}", name="ticket-transfer")
  1379.      */
  1380.     public function ticket_transfer(Request $requestMailerInterface $mailer$ticketId)
  1381.     {
  1382.         $em $this->doctrine->getManager();
  1383.         $user $this->functions->getUserLogged();
  1384.         if (!$user) {
  1385.             $this->addFlash(
  1386.                 'notice',
  1387.                 'Debe iniciar sesión como usuario'
  1388.             );
  1389.             return new JsonResponse([
  1390.                 'status' => false,
  1391.                 'message' => '#ERROR1#',
  1392.                 'data' => []
  1393.             ], 403);
  1394.         }
  1395.         if (!$request->get("user")) {
  1396.             return new JsonResponse([
  1397.                 'status' => false,
  1398.                 'message' => 'El email no ha sido especificado',
  1399.                 'data' => []
  1400.             ], 403);
  1401.         }
  1402.         if (!filter_var($request->get("user"), FILTER_VALIDATE_EMAIL)) {
  1403.             return new JsonResponse([
  1404.                 'status' => false,
  1405.                 'message' => 'No es un email vĆ”lido',
  1406.                 'data' => []
  1407.             ], 403);
  1408.         }
  1409.         if ($user == $request->get("user")) {
  1410.             return new JsonResponse([
  1411.                 'status' => false,
  1412.                 'message' => 'No puede enviarse la entrada a sĆ­ mismo',
  1413.                 'data' => []
  1414.             ], 403);
  1415.         }
  1416.         $ticket $this->ticketing->curl("tickets/" $ticketId"normal", [], "GET");
  1417.         if (!$ticket || $ticket["code"] != "200") {
  1418.             $this->addFlash(
  1419.                 'notice',
  1420.                 'No se puede acceder al ticket'
  1421.             );
  1422.             return $this->redirectToRoute('home');
  1423.         }
  1424.         if ($ticket["user"]["userId"] != $user) {
  1425.             $this->addFlash(
  1426.                 'notice',
  1427.                 'No se puede acceder a este ticket'
  1428.             );
  1429.             return $this->redirectToRoute('home');
  1430.         }
  1431.         $wh_token bin2hex(random_bytes(45));
  1432.         $transfer $this->ticketing->curl("tickets/" $ticketId "/transfer""normal",
  1433.             [
  1434.                 "token" => $wh_token,
  1435.                 "user" => $request->get("user")
  1436.             ], "PATCH");
  1437.         if ($transfer["code"] != "200") {
  1438.             return new JsonResponse([
  1439.                 'status' => false,
  1440.                 'message' => $transfer['message'],
  1441.                 'data' => []
  1442.             ], 403);
  1443.         }
  1444.         if (array_key_exists('registerCode'$transfer)) {
  1445.             $objUser $em->getRepository(User::class)->findOneBy(['user_id' => $request->get("user")]);
  1446.             if (!$objUser) {
  1447.                 $objUser = new User();
  1448.                 $objUser->setUserId($request->get("user"));
  1449.                 $objUser->setCreatedAt(new \DateTime());
  1450.                 $em->persist($objUser);
  1451.                 $em->flush();
  1452.             }
  1453.             $email = (new TemplatedEmail())
  1454.                 ->from($this->getParameter('mailer_from'))
  1455.                 ->to($request->get("user"))
  1456.                 ->subject('DOW - Entradas recibidas')
  1457.                 ->htmlTemplate('mail/register2.html.twig')
  1458.                 ->context([
  1459.                     'userId' => $request->get("user"),
  1460.                     'registerCode' => $transfer["registerCode"],
  1461.                     'event' => $ticket["event"]["name"]
  1462.                 ]);
  1463.         } else {
  1464.             $email = (new TemplatedEmail())
  1465.                 ->from($this->getParameter('mailer_from'))
  1466.                 ->to($request->get("user"))
  1467.                 ->subject('DOW - Entradas recibidas')
  1468.                 ->htmlTemplate('mail/receive-tickets.html.twig')
  1469.                 ->context([
  1470.                     'event' => $ticket["event"]["name"]
  1471.                 ]);
  1472.         }
  1473.         $mailer->send($email);
  1474.         return new JsonResponse([
  1475.             'status' => true,
  1476.             'message' => 'El ticket se ha enviado con Ć©xito'
  1477.         ]);
  1478.     }
  1479.     /**
  1480.      * @Route("/ticket-sell/{ticketId}", name="ticket-sell")
  1481.      */
  1482.     public function ticket_sell(Request $requestMailerInterface $mailer$ticketId)
  1483.     {
  1484.         $em $this->doctrine->getManager();
  1485.         $user $this->functions->getUserLogged();
  1486.         if (!$user) {
  1487.             $this->addFlash(
  1488.                 'notice',
  1489.                 'Debe iniciar sesión como usuario'
  1490.             );
  1491.             return new JsonResponse([
  1492.                 'status' => false,
  1493.                 'message' => '#ERROR1#',
  1494.                 'data' => []
  1495.             ], 403);
  1496.         }
  1497.         if (!$request->get("price")) {
  1498.             return new JsonResponse([
  1499.                 'status' => false,
  1500.                 'message' => 'El precio no ha sido especificado',
  1501.                 'data' => []
  1502.             ], 403);
  1503.         }
  1504.         $ticket $this->ticketing->curl("tickets/" $ticketId"normal", [], "GET");
  1505.         if (!$ticket || $ticket["code"] != "200") {
  1506.             return new JsonResponse([
  1507.                 'status' => false,
  1508.                 'message' => 'No se puede acceder al nft',
  1509.                 'data' => []
  1510.             ], 403);
  1511.         }
  1512.         // Check sale price
  1513.         $price $request->get("price");
  1514.         $marketplaceStartPercentage = !empty($ticket['event']['marketplaceStartPercentage'])
  1515.             ? $ticket['event']['marketplaceStartPercentage'] : 999;
  1516.         $marketplaceMaxSalePercentage = !empty($ticket['event']['marketplaceMaxSalePercentage'])
  1517.             ? $ticket['event']['marketplaceMaxSalePercentage'] : 999;
  1518.         $minPrice $ticket['originalPrice'] - ($ticket['originalPrice'] * ($marketplaceStartPercentage 100));
  1519.         $maxPrice $ticket['originalPrice'] + ($ticket['originalPrice'] * ($marketplaceMaxSalePercentage 100));
  1520.         if ($price >= $minPrice && $price <= $maxPrice) {
  1521.             $checkPrice true;
  1522.         } else {
  1523.             return new JsonResponse([
  1524.                 'status' => false,
  1525.                 'message' => 'El precio de venta no puede ser inferior a '$minPrice .' ni superior a '$maxPrice,
  1526.                 'data' => []
  1527.             ], 403);
  1528.         }
  1529.         // Type collection or ticket for messages
  1530.         date_default_timezone_set("Europe/Madrid");
  1531.         if (date("Y-m-d h:i:s") > $ticket['event']['dateEvent']) {
  1532.             $type 'collection';
  1533.         } else {
  1534.             $type 'ticket';
  1535.         }
  1536.         if ($ticket["user"]["userId"] != $user) {
  1537.             return new JsonResponse([
  1538.                 'status' => false,
  1539.                 'message' => 'No se puede acceder al ' $type,
  1540.                 'data' => []
  1541.             ], 403);
  1542.         }
  1543.         $sell $this->ticketing->curl("sales""normal", ["ticket" => $ticketId"price" => $request->get("price")], "POST");
  1544.         if ($sell["code"] != "200") {
  1545.             return new JsonResponse([
  1546.                 'status' => false,
  1547.                 'message' => 'El ' $type ' no ha podido ponserse en venta. Vuelva a intentarlo mĆ”s tarde',
  1548.                 'data' => []
  1549.             ], 403);
  1550.         }
  1551.         return new JsonResponse([
  1552.             'status' => true,
  1553.             'message' => 'El ' $type ' ha sido puesto en venta satisfactoriamente'
  1554.         ]);
  1555.     }
  1556.     /**
  1557.      * @Route("/ticket-retire-sell/{ticketId}", name="ticket-retire-sell")
  1558.      */
  1559.     public function ticket_retire_sell(Request $request$ticketId)
  1560.     {
  1561.         $em $this->doctrine->getManager();
  1562.         $user $this->functions->getUserLogged();
  1563.         if (!$user) {
  1564.             $this->addFlash(
  1565.                 'notice',
  1566.                 'Debe iniciar sesión como usuario'
  1567.             );
  1568.             return new JsonResponse([
  1569.                 'status' => false,
  1570.                 'message' => '#ERROR1#',
  1571.                 'data' => []
  1572.             ], 403);
  1573.         }
  1574.         $ticket $this->ticketing->curl("tickets/" $ticketId"normal", [], "GET");
  1575.         if (!$ticket || $ticket["code"] != "200") {
  1576.             return new JsonResponse([
  1577.                 'status' => false,
  1578.                 'message' => 'No se puede acceder al nft',
  1579.                 'data' => []
  1580.             ], 403);
  1581.         }
  1582.         // Type collection or ticket for messages
  1583.         date_default_timezone_set("Europe/Madrid");
  1584.         if (date("Y-m-d h:i:s") > $ticket['event']['dateEvent']) {
  1585.             $type 'collection';
  1586.         } else {
  1587.             $type 'ticket';
  1588.         }
  1589.         if ($ticket["user"]["userId"] != $user) {
  1590.             return new JsonResponse([
  1591.                 'status' => false,
  1592.                 'message' => 'No se puede acceder al ' $type,
  1593.                 'data' => []
  1594.             ], 403);
  1595.         }
  1596.         $sell $this->ticketing->curl("sales/" $ticketId"normal", [], "DELETE");
  1597.         if ($sell["code"] != "200") {
  1598.             return new JsonResponse([
  1599.                 'status' => false,
  1600.                 'message' => 'El ' $type ' no ha podido retirarse de la venta. Vuelva a intentarlo mĆ”s tarde',
  1601.                 'data' => []
  1602.             ], 403);
  1603.         }
  1604.         return new JsonResponse([
  1605.             'status' => true,
  1606.             'message' => 'El ' $type ' se ha retirado de la venta satisfactoriamente'
  1607.         ]);
  1608.     }
  1609.     /**
  1610.      * @Route("/ticket-activation/{ticketId}", name="ticket-activation")
  1611.      */
  1612.     public function ticket_activation(Request $requestMailerInterface $mailer$ticketId)
  1613.     {
  1614.         $em $this->doctrine->getManager();
  1615.         $anonymous FALSE;
  1616.         $user $this->functions->getUserLogged();
  1617.         if ($request->get('anonymous'))
  1618.             $anonymous filter_var($request->get('anonymous'), FILTER_VALIDATE_BOOLEAN);
  1619.         // Check if ticketId is a serialized string
  1620.         if ((@unserialize(base64_decode($ticketId)) !== false)) {
  1621.             $unserializeData unserialize(base64_decode($ticketId));
  1622.             $ticketId $unserializeData['tokenId'];
  1623.             $user $unserializeData['userId'];
  1624.         }
  1625.         $ticket $this->ticketing->curl("tickets/".$ticketId"normal", array(), "GET");
  1626.         if ($anonymous && !$ticket["user"]["enabled"])
  1627.             $user $ticket["user"]["userId"];
  1628.         if(!$ticket || $ticket["code"]!="200"){
  1629.             $this->addFlash(
  1630.                 'notice',
  1631.                 'No se puede acceder al QR'
  1632.             );
  1633.             return $this->redirectToRoute('home');
  1634.         }
  1635.         if($ticket["user"]["userId"]!=$user){
  1636.             $this->addFlash(
  1637.                 'notice',
  1638.                 'No se puede acceder a este ticket'
  1639.             );
  1640.             return $this->redirectToRoute('home');
  1641.         }
  1642.         if($ticket["onSaleUser"])
  1643.         {
  1644.              $this->addFlash(
  1645.                 'notice',
  1646.                 'No se puede activar este ticket porque estĆ” en venta'
  1647.             );
  1648.             return $this->redirectToRoute('home');
  1649.         }
  1650.         if(!$ticket["active"]){
  1651.             $event $this->ticketing->curl("events/".$ticket["event"]["id"], "normal", array(), "GET");
  1652.             if(!$event || $event["code"]!="200"){
  1653.                 $this->addFlash(
  1654.                     'notice',
  1655.                     'No se puede acceder al QR'
  1656.                 );
  1657.                 return $this->redirectToRoute('home');
  1658.             }
  1659.             $ticket $this->ticketing->curl("tickets/".$ticketId."/activate""normal", array("latitude" => $event["latitude"], "longitude" => $event["longitude"]), "PATCH");
  1660.             if($ticket["code"]!="200"){
  1661.                 return new JsonResponse([
  1662.                     'status' => false,
  1663.                     'message' => $ticket["message"],
  1664.                     'data' => []
  1665.                 ], 403);
  1666.             }
  1667.         }
  1668.         $qr = new QrCode($ticket["accessCode"]);
  1669.         return new JsonResponse([
  1670.             'status' => true,
  1671.             'accessCode' => $qr->writeDataUri()
  1672.         ]);
  1673.     }
  1674.     /**
  1675.      * @Route("/view-qr/{ticketId}", name="view-qr")
  1676.      */
  1677.     public function view_qr(Request $requestMailerInterface $mailer$ticketId)
  1678.     {
  1679.         $anonymous FALSE;
  1680.         if ($request->get('anonymous'))
  1681.             $anonymous filter_var($request->get('anonymous'), FILTER_VALIDATE_BOOLEAN);
  1682.         $ticket $this->ticketing->curl("tickets/" $ticketId"normal", [], "GET");
  1683.         $user $this->functions->getUserLogged();
  1684.         if ($anonymous && !$ticket["user"]["enabled"])
  1685.             $user $ticket["user"]["userId"];
  1686.         // Users not logged, code for download pdf in url tokenized
  1687.         if ($anonymous && empty($user))
  1688.             $user $ticket["user"]["userId"];
  1689.         if(!$ticket || $ticket["code"]!="200" || !$ticket["active"]){
  1690.             $this->addFlash(
  1691.                 'notice',
  1692.                 'No se puede acceder al QR'
  1693.             );
  1694.             return $this->redirectToRoute('home');
  1695.         }
  1696.         if ($ticket["user"]["userId"] != $user) {
  1697.             $this->addFlash(
  1698.                 'notice',
  1699.                 'No se puede acceder a este ticket'
  1700.             );
  1701.             return $this->redirectToRoute('home');
  1702.         }
  1703.         $qr = new QrCode($ticket["accessCode"]);
  1704.         // Configure Dompdf according to your needs
  1705.         $pdfOptions = new Options();
  1706.         $pdfOptions->set('defaultFont''Helvetica');
  1707.         $pdfOptions->set('isRemoteEnabled'TRUE);
  1708.         $pdfOptions->set('isHtml5ParserEnabled'TRUE);
  1709.         // Instantiate Dompdf with our options
  1710.         $dompdf = new Dompdf($pdfOptions);
  1711.         // Retrieve the HTML generated in our twig file
  1712.         // mail/view-qr.html.twig
  1713.         $html $this->renderView('downloads/download-pdf.html.twig', [
  1714.             "ticket" => $ticket
  1715.         ]);
  1716.         // Load HTML to Dompdf
  1717.         $dompdf->loadHtml($html);
  1718.         // (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
  1719.         $dompdf->setPaper('A4''portrait');
  1720.         // Render the HTML as PDF
  1721.         $dompdf->render();
  1722.         // Output the generated PDF to Browser (force download)
  1723.         $dompdf->stream("ticket-".$ticket["id"].".pdf", [
  1724.             "Attachment" => true
  1725.         ]);
  1726.     }
  1727.     /**
  1728.      * @Route("/download-pdf/{ticketId}", name="download-pdf")
  1729.      */
  1730.     public function download_pdf(Request $requestMailerInterface $mailer$ticketId)
  1731.     {
  1732.         $em $this->doctrine->getManager();
  1733.         $user $this->functions->getUserLogged();
  1734.         $anonymous FALSE;
  1735.         $ticket $this->ticketing->curl("tickets/" $ticketId"normal", [], "GET");
  1736.         if ($request->get('anonymous'))
  1737.             $anonymous filter_var($request->get('anonymous'), FILTER_VALIDATE_BOOLEAN);
  1738.         if ($anonymous && !$ticket["user"]["enabled"])
  1739.             $user $ticket["user"]["userId"];
  1740.         // Users not logged, code for download pdf in url tokenized
  1741.         if ($anonymous && empty($user))
  1742.             $user $ticket["user"]["userId"];
  1743.         if (!$user) {
  1744.             $this->addFlash(
  1745.                 'notice',
  1746.                 'Debe iniciar sesión como usuario'
  1747.             );
  1748.             return $this->redirectToRoute('access');
  1749.         }
  1750.         if ($ticket["code"] == "200" && !empty($ticket) && !$ticket['active']) {
  1751.             // Unblock ticket
  1752.             if ($ticket['isBlocked'])
  1753.                 $this->ticketing->curl("tickets/" $ticket['id'], "normal", ["blocked" => "false"], "PATCH");
  1754.             // Remove tickets on sale in secondary market
  1755.             if ($ticket['onSaleUser'])
  1756.                 $this->ticketing->curl("sales/" $ticket['id'], "normal", [], "DELETE");
  1757.             // Get event
  1758.             $event $this->ticketing->curl("events/".$ticket["event"]["id"], "normal", [], "GET");
  1759.             $ticket $this->ticketing->curl("tickets/".$ticket['id']."/activate""normal", ["latitude" => $event["latitude"], "longitude" => $event["longitude"]], "PATCH");
  1760.             if ($ticket["code"] != "200" && $ticket['active']) {
  1761.                 $this->addFlash(
  1762.                     'notice',
  1763.                     'No se puede acceder al QR'
  1764.                 );
  1765.                 return $this->redirectToRoute('userProfile');
  1766.             }
  1767.         }
  1768.         if ($ticket["user"]["userId"] != $user) {
  1769.             $this->addFlash(
  1770.                 'notice',
  1771.                 'No se puede acceder a este ticket'
  1772.             );
  1773.             return $this->redirectToRoute('userProfile');
  1774.         }
  1775.         $qr = new QrCode($ticket["accessCode"]);
  1776.         // Configure Dompdf according to your needs
  1777.         $pdfOptions = new Options();
  1778.         $pdfOptions->set('defaultFont''Helvetica');
  1779.         $pdfOptions->set('isRemoteEnabled'TRUE);
  1780.         $pdfOptions->set('isHtml5ParserEnabled'TRUE);
  1781.         // Instantiate Dompdf with our options
  1782.         $dompdf = new Dompdf($pdfOptions);
  1783.         // Retrieve the HTML generated in our twig file
  1784.         $html $this->renderView('downloads/download-pdf.html.twig', [
  1785.             "ticket" => $ticket
  1786.         ]);
  1787.         // Load HTML to Dompdf
  1788.         $dompdf->loadHtml($html);
  1789.         // (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
  1790.         $dompdf->setPaper('A4''portrait');
  1791.         // Render the HTML as PDF
  1792.         $dompdf->render();
  1793.         // Output the generated PDF to Browser (force download)
  1794.         $dompdf->stream("ticket-" $ticket["id"] . ".pdf", [
  1795.             "Attachment" => true
  1796.         ]);
  1797.     }
  1798.     /**
  1799.      * @Route("/select-ticket", name="select-ticket")
  1800.      */
  1801.     public function selectTicket(Request $request): Response
  1802.     {
  1803.         //Keep url for url referrals
  1804.         // General function to set discount ref/affId
  1805.         $this->functions->setDiscount($request);
  1806.         return $this->redirectToRoute('events');
  1807.     }
  1808.     /**
  1809.      * @Route("/ticket-recover/{ticketId}", name="ticket-recover")
  1810.      */
  1811.     public function ticket_recover(Request $requestMailerInterface $mailer$ticketId)
  1812.     {
  1813.         $em     $this->doctrine->getManager();
  1814.         $user   $this->functions->getUserLogged();
  1815.         if(!$user){
  1816.             $this->addFlash(
  1817.                 'notice',
  1818.                 'Debe iniciar sesión como usuario'
  1819.             );
  1820.             return new JsonResponse([
  1821.                 'status'    => false,
  1822.                 'message'   => '#ERROR1#',
  1823.                 'data'      => []
  1824.             ], 403);
  1825.         }
  1826.         $ticket $this->ticketing->curl("tickets/".$ticketId"normal", [], "GET");
  1827.         if(!$ticket || $ticket["code"] != "200") {
  1828.             $this->addFlash(
  1829.                 'notice',
  1830.                 'No se puede acceder al ticket'
  1831.             );
  1832.             return $this->redirectToRoute('home');
  1833.         }
  1834.         $wh_token bin2hex(random_bytes(45));
  1835.         $transfer $this->ticketing->curl("tickets/".$ticketId."/recover""normal", ["token" => $wh_token"oldUserId" => $request->get("oldUserId"), "newUserId" => $request->get("newUserId")], "PATCH");
  1836.         if($transfer["code"] != "200") {
  1837.             return new JsonResponse([
  1838.                 'status'    => false,
  1839.                 'message'   => 'El ticket no ha podido recuperarse en este momento. Vuelva a intentarlo mĆ”s tarde',
  1840.                 'data'      => []
  1841.             ], 403);
  1842.         }
  1843.         return new JsonResponse([
  1844.             'status' => true,
  1845.             'message' => 'El ticket se ha recuperado con Ć©xito.'
  1846.         ]);
  1847.     }
  1848.     /**
  1849.      * @param $sintax
  1850.      * @return array|mixed
  1851.      */
  1852.     private function onSaleByUsers($sintax){
  1853.         // On sale false
  1854.         $sintax.="&onSaleByUser=true";
  1855.         // Searching params for tickets
  1856.         $userAlias ' ';
  1857.         $page $this->ticketing->curl("tickets?orderBy=price".$sintax"normal", [], "GET");
  1858.         foreach($page["tickets"] as $key => $ticket){
  1859.             $em $this->doctrine->getManager();
  1860.             if (!empty($page["tickets"][$key]["user"]['userId']))
  1861.                 $userAlias $em->getRepository(User::class)->findOneBy(['user_id' => $page["tickets"][$key]["user"]["userId"]])->getAlias();
  1862.             $page["tickets"][$key]["user"]["userAlias"] = $userAlias;
  1863.         }
  1864.         return $page;
  1865.     }
  1866.     /**
  1867.      * @param $purchaseId
  1868.      * @param $purchaseToken
  1869.      * @param $total
  1870.      * @return array
  1871.      */
  1872.     private function redsysData($purchaseId$purchaseToken$total): array
  1873.     {
  1874.         $redsys = new RedsysAPI;
  1875.         $fuc $_ENV['REDSYS_FUC'];
  1876.         $terminal "1";
  1877.         $currency "978";
  1878.         $trans "0";
  1879.         $url $this->generateUrl('redsys_notification', [], UrlGeneratorInterface::ABSOLUTE_URL);
  1880.         $urlOK $this->generateUrl('purchase_completed', ["token" => $purchaseToken], UrlGeneratorInterface::ABSOLUTE_URL);
  1881.         $urlKO $this->generateUrl('home', [], UrlGeneratorInterface::ABSOLUTE_URL);
  1882.         $id $purchaseId;
  1883.         $amount $total 100;
  1884.         $redsys->setParameter("DS_MERCHANT_AMOUNT", (string)$amount);
  1885.         $redsys->setParameter("DS_MERCHANT_ORDER"$id);
  1886.         $redsys->setParameter("DS_MERCHANT_MERCHANTCODE"$fuc);
  1887.         $redsys->setParameter("DS_MERCHANT_CURRENCY"$currency);
  1888.         $redsys->setParameter("DS_MERCHANT_TRANSACTIONTYPE"$trans);
  1889.         $redsys->setParameter("DS_MERCHANT_TERMINAL"$terminal);
  1890.         $redsys->setParameter("DS_MERCHANT_MERCHANTURL"$url);
  1891.         $redsys->setParameter("DS_MERCHANT_URLOK"$urlOK);
  1892.         $redsys->setParameter("DS_MERCHANT_URLKO"$urlKO);
  1893.         $redsysVersion "HMAC_SHA256_V1";
  1894.         $kc $_ENV['REDSYS_KC'];
  1895.         $redsysParams $redsys->createMerchantParameters();
  1896.         $redsysSignature $redsys->createMerchantSignature($kc);
  1897.         return [
  1898.             'redsysVersion' => $redsysVersion,
  1899.             'redsysParams' => $redsysParams,
  1900.             'redsysSignature' => $redsysSignature
  1901.         ];
  1902.     }
  1903.     private function ticketDirectSale(Request $request$ticketTypeId): Response
  1904.     {
  1905.         $csession $request->getSession();
  1906.         $em $this->doctrine->getManager();
  1907.         $type "tickets";
  1908.         $ticketType $this->ticketing->curl("tickets-types/" $ticketTypeId"normal", [], "GET");
  1909.         if (!$ticketType || $ticketType["code"] != "200") {
  1910.             $this->addFlash(
  1911.                 'notice',
  1912.                 'No se puede acceder al ticket'
  1913.             );
  1914.             return $this->redirectToRoute('home');
  1915.         }
  1916.         // Reference data
  1917.         $quantity $request->get("quantity");
  1918.         $price $ticketType['price'];
  1919.         $event $ticketType['eventId'];
  1920.         // Check user
  1921.         $userId $this->functions->getUserLogged();
  1922.         if (empty($userId)) {
  1923.             $this->addFlash(
  1924.                 'notice',
  1925.                 'Debe iniciar sesión como usuario'
  1926.             );
  1927.             return $this->redirectToRoute('home');
  1928.         }
  1929.         // Max tickets per eventb based on maxOrder field
  1930.         $tickets $this->ticketing->curl("tickets?user=" $userId "&event=" $ticketType['eventId'] . "&limit=10""normal", [], "GET");
  1931.         $sents $this->ticketing->curl("tickets/activity?origin=" $userId "&limit=1&enabled=true&type=transfer&event=" $ticketType['eventId'], "normal", [], "GET");
  1932.         $sales $this->ticketing->curl("tickets/activity?origin=" $userId "&limit=1&enabled=true&type=sale&event=" $ticketType['eventId'], "normal", [], "GET");
  1933.         $total_user_tickets $tickets['total'] + $sents['total'] + $sales['total'];
  1934.         $tickets_total $total_user_tickets $request->get('quantity');
  1935.         if ($tickets_total $ticketType['maxOrder']) {
  1936.             $this->addFlash(
  1937.                 'notice',
  1938.                 'Se puede comprar un mĆ”ximo de '$ticketType['maxOrder'] .' tickets por evento'
  1939.             );
  1940.             return $this->redirectToRoute('home');
  1941.         }
  1942.         // Ticket type sold
  1943.         $data = [
  1944.             'quantity' => $quantity,
  1945.         ];
  1946.         // Quantity sold + 1
  1947.         $ticketTypeSold $this->ticketing->curl("tickets-types/" $ticketType['ticketTypeId'], "normal"$data"PATCH");
  1948.         if ($ticketTypeSold["code"] != "200") {
  1949.             $this->addFlash(
  1950.                 'notice',
  1951.                 'No hay tickets suficientes'
  1952.             );
  1953.             return $this->redirectToRoute('event-tickets', ['event' => $event]);
  1954.         }
  1955.         // Autocomplete input coupon
  1956.         $codeRef $this->functions->autoInputCouponCode($request);
  1957.         // General function to set discount ref/affId/code
  1958.         $discount $this->functions->setDiscount($request);
  1959.         $version $this->functions->addAppVersion();
  1960.         $discounts = [];
  1961.         $administrationFees 0;
  1962.         $administrationFeesIfZero 0;
  1963.         if (empty($ticketType['manageFeeBy']) or $ticketType['manageFeeBy'] == 'buyer') {
  1964.             $administrationFees = ($ticketType['manageFee'] / 100) + 1;
  1965.             $administrationFeesIfZero $ticketType['manageFee'] / 100;
  1966.         }
  1967.         $totalWithoutDiscount $price $quantity;
  1968.         $total = ($totalWithoutDiscount - ($discount $totalWithoutDiscount) / 100);
  1969.         $total $discount 0
  1970.             $total + ($totalWithoutDiscount $administrationFeesIfZero)
  1971.             : $total $administrationFees;
  1972.         // Purchase data
  1973.         date_default_timezone_set('UTC');
  1974.         $objUser $em->getRepository(User::class)->findOneBy(['user_id' => $userId]);
  1975.         $wh_token bin2hex(random_bytes(45));
  1976.         $purchase = new Purchase();
  1977.         $purchase->setUser($objUser);
  1978.         $purchase->setPrice($total);
  1979.         $purchase->setToken($wh_token);
  1980.         $purchase->setUpdatedAt(new \DateTime());
  1981.         $purchase->setRemoved(FALSE);
  1982.         $purchase->setType("taquilla");
  1983.         if ($csession->get('ref'))
  1984.             $purchase->setRef($csession->get('ref'));
  1985.         if ($csession->get('affId'))
  1986.             $purchase->setRef($csession->get('affId'));
  1987.         $em->persist($purchase);
  1988.         $line = new Line();
  1989.         $line->setPurchase($purchase);
  1990.         $line->setPrice($total);
  1991.         $line->setDescription("Tickets");
  1992.         $em->persist($line);
  1993.         for ($i 0$i $quantity$i++) {
  1994.             $item = new Item();
  1995.             $item->setLine($line);
  1996.             $item->setTicket($ticketType['ticketTypeId']);
  1997.             $item->setName($ticketType['name']);
  1998.             $item->setPrice($ticketType["price"]);
  1999.             $item->setQuantity(1);
  2000.             $item->setCompleted(FALSE);
  2001.             $em->persist($item);
  2002.         }
  2003.         $em->flush();
  2004.         return $this->render('tickets/ticket-type-direct-buy.html.twig', [
  2005.             'item' => $ticketType,
  2006.             'quantity' => $request->get("quantity"),
  2007.             'type' => $type,
  2008.             'image' => $ticketType["imageThumb"],
  2009.             'discount' => $discount,
  2010.             'version' => $version,
  2011.             'codeRef' => $codeRef,
  2012.             'env' => $_ENV['APP_ENV'],
  2013.             'token' => $purchase->getToken(),
  2014.         ]);
  2015.     }
  2016.     private function ticketDirectSeatBuy(Request $request): Response
  2017.     {
  2018.         $type "tickets";
  2019.         $em $this->doctrine->getManager();
  2020.         $user $this->functions->getUserLogged();
  2021.         $tokens $request->get('tokens');
  2022.         if (!$user) {
  2023.             // tokens to unblock
  2024.             $data explode(','$tokens);
  2025.             $tickets_to_unblock = [];
  2026.             foreach ($data as $item) {
  2027.                 $tickets_to_unblock[] = ["blocked" => "false""id" => $item];
  2028.             }
  2029.             // if not user logged all tickets selected are unblocked
  2030.             $this->ticketing->curl("tickets""json"$tickets_to_unblock"PATCH");
  2031.             $this->addFlash(
  2032.                 'notice',
  2033.                 'Debe iniciar sesión como usuario'
  2034.             );
  2035.             return $this->redirectToRoute('home');
  2036.         }
  2037.         $tickets $this->ticketing->curl("tickets/?tokens=".$tokens"normal", [], "GET");
  2038.         if (!$tickets || $tickets["code"] != "200") {
  2039.             $this->addFlash(
  2040.                 'notice',
  2041.                 'No se puede acceder al ticket'
  2042.             );
  2043.             return $this->redirectToRoute('home');
  2044.         }
  2045.         $administrationFees 0;
  2046.         if (empty($tickets['tickets'][0]['event']['manageFeeBy']) or $tickets['tickets'][0]['event']['manageFeeBy'] == 'buyer') {
  2047.             // Get commission from event
  2048.             $administrationFees = !empty($tickets['tickets'][0]['event']['manageFee'])
  2049.                 ? $tickets['tickets'][0]['event']['manageFee'] : 10;
  2050.         }
  2051.         $extra $request->get('price') * ($administrationFees 100);
  2052.         $price $request->get('price') + $extra ;
  2053.         // Autocomplete input coupon
  2054.         $codeRef $this->functions->autoInputCouponCode($request);
  2055.         // General function to set discount ref/affId/code
  2056.         $discount $this->functions->setDiscount($request);
  2057.         $version $this->functions->addAppVersion();
  2058.         // Purchase data
  2059.         date_default_timezone_set('UTC');
  2060.         $objUser $em->getRepository(User::class)->findOneBy(['user_id' => $user]);
  2061.         $wh_token bin2hex(random_bytes(45));
  2062.         $purchase = new Purchase();
  2063.         $purchase->setUser($objUser);
  2064.         $purchase->setPrice($price);
  2065.         $purchase->setToken($wh_token);
  2066.         $purchase->setUpdatedAt(new \DateTime());
  2067.         $purchase->setRemoved(FALSE);
  2068.         $purchase->setType("taquilla");
  2069.         $em->persist($purchase);
  2070.         $line = new Line();
  2071.         $line->setPurchase($purchase);
  2072.         $line->setPrice($price);
  2073.         $line->setDescription("Tickets");
  2074.         $em->persist($line);
  2075.         $price 0;
  2076.         foreach ($tickets['tickets'] as $ticket) {
  2077.             $item = new Item();
  2078.             $item->setLine($line);
  2079.             $item->setTicket($ticket["id"]);
  2080.             $item->setName($ticket["name"]);
  2081.             $item->setPrice($ticket["price"]);
  2082.             $item->setQuantity(1);
  2083.             $item->setCompleted(FALSE);
  2084.             $em->persist($item);
  2085.             $price += $ticket["price"];
  2086.             $tickets_json[]=$ticket;
  2087.         }
  2088.         $em->flush();
  2089.         $em->persist($purchase);
  2090.         $em->flush();
  2091.         return $this->render('tickets/ticket-seat-direct-buy.html.twig', [
  2092.             "item" => $tickets,
  2093.             "event" => $tickets['tickets'][0]['event']['name'],
  2094.             "eventId" => $tickets['tickets'][0]['event']['id'],
  2095.             "dateEvent" => $tickets['tickets'][0]['event']['dateEvent'],
  2096.             "type" => $type,
  2097.             "price" => $price,
  2098.             "extra" => $extra,
  2099.             "image" => $tickets['tickets'][0]['imageThumb'],
  2100.             "discount" => $discount,
  2101.             'version' => $version,
  2102.             'codeRef' => $codeRef,
  2103.             "token" => $purchase->getToken(),
  2104.             'env' => $_ENV['APP_ENV'],
  2105.         ]);
  2106.     }
  2107.     /**
  2108.      * @param $emailPreregister
  2109.      * @param $em
  2110.      * @return mixed|null
  2111.      */
  2112.     private function anonymousCheckout($emailPreregister$em)
  2113.     {
  2114.         $result $this->ticketing->curl("users""normal", ["userId" => $emailPreregister], "POST");
  2115.         if (!empty($result['id'])) {
  2116.             $user = new User();
  2117.             $user->setUserId($result["userId"]);
  2118.             $user->setCreatedAt(new \DateTime());
  2119.             $user->setAlias('-');
  2120.             $em->persist($user);
  2121.             $em->flush();
  2122.             return $result["userId"];
  2123.         }
  2124.         return $emailPreregister;
  2125.     }
  2126. }