src/Controller/EventsController.php line 80

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Service\ApiConnService;
  4. use DateTime;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. class EventsController extends AbstractController
  13. {
  14.   #[Route('/'name'empty_index')]
  15.   public function index(): Response
  16.   {
  17.     return $this->redirect($this->generateUrl('homepage'));
  18.   }
  19.   #[Route('/home/{type}'name'homepage'defaults: ['type' => ''])]
  20.   public function calendar($typeRequest $requestApiConnService $conn): Response
  21.   {
  22.     $mode    $request->query->get('mode''week');
  23.     $session $request->getSession();
  24.     
  25.     $this->getConfigData($conn$session$this->getUser()->getApiKey());
  26.   
  27.     $types $session->get('types');
  28.     // DEFAULT CLUBBING
  29.     $type $type == '' ? ($types[0]['slug'] ?? null) : $type;
  30.     if ($type != null) {
  31.       $cal $conn->getCalendar($this->getUser()->getApiKey(), $type$mode$request->query->get('sub'null));
  32.       
  33.       $tpl $cal['template'] != '' $cal['template'] : 'general';
  34.     }
  35.   
  36.     return $this->render('events/home_'.($tpl ?? 'general').'.html.twig', [
  37.       'calendar'    => $cal['events'] ?? [],
  38.       'subcats'     => $cal['subcats'] ?? [],
  39.       'type'        => $type,
  40.       'mode'        => $mode
  41.     ]);
  42.   }
  43.   
  44.   #[Route('/home-event-info/{slug}'name'view_event_info')]
  45.   # Información de evento en pop up.
  46.   public function getEventInfo($slugApiConnService $conn): Response
  47.   {
  48.     $ev $conn->getOneEvent($this->getUser()->getApiKey(), $slug);
  49.     
  50.     return $this->render('events/_event_info.html.twig', [
  51.       'ev'    => $ev,
  52.       'modal' => 1
  53.     ]);
  54.   }
  55.   
  56.   #[Route('/home/{type}/{slug}'name'view_event')]
  57.   # Información de evento.
  58.   public function getEvent($type$slugApiConnService $conn): Response
  59.   {
  60.     $ev    $conn->getOneEvent($this->getUser()->getApiKey(), $slug);
  61.     $files $conn->execute('/get-event-files', [
  62.       'key' => $this->getUser()->getApiKey(),
  63.       'id'  => $ev['venue']['id']
  64.     ]);
  65.     return $this->render('events/view.html.twig', [
  66.       'ev'    => $ev,
  67.       'files' => $files,
  68.       'type'  => $type
  69.     ]);
  70.   }
  71.   
  72.   #[Route('/{date_id}/tickets'name'date_tickets')]
  73.   public function getTicketDate($date_idRequest $requestApiConnService $connEntityManagerInterface $em): Response
  74.   {
  75.     // Paso time() para invalidar cualquier tipo de caché.
  76.     $date $conn->getTicketDate($date_id$this->getUser()->getApiKey());
  77.     
  78.     // Actualiza la config antes de cada venta.
  79.     $session $request->getSession();
  80.     $session->set('expire_conf'0);
  81.     $this->getConfigData($conn$session$this->getUser()->getApiKey());
  82.     
  83.     $sellers $em->getRepository('App\Entity\seller')
  84.       ->getPinsForUserById($this->getUser()->getId());
  85.     
  86.     if (isset($date['extras']) && count($date['extras'])) {
  87.       return $this->render('events/date_tickets_extras.html.twig', [
  88.         'date'    => $date,
  89.         'sellers' => $sellers
  90.       ]);
  91.     }
  92.   
  93.     return $this->render('events/date_tickets.html.twig', [
  94.       'date'     => $date,
  95.       'sellers'  => $sellers
  96.     ]);
  97.   }
  98.   
  99.   #[Route('/make-sale'name'make_sale')]
  100.   public function makeSale(Request $requestApiConnService $conn): RedirectResponse
  101.   {
  102.     $tdates  $request->request->get('td');
  103.     $exdates $request->request->get('ecd', []);
  104.     $seller  $request->request->get('seller');
  105.   
  106.     // Solo puede llegar un tipo de entrada. Si llega alguno más,
  107.     // solo se tendrá en cuenta el último.
  108.     $tktArray null;
  109.     foreach ($tdates as $key => $amount) {
  110.       if ($amount 0) {
  111.         $tktArray[] = array('tdate' => $key'tq' => $amount);
  112.         // Los formateo porque el JSON_ENCODE se comía los índices.
  113.       }
  114.     }
  115.   
  116.     $extArray null;
  117.     foreach ($exdates as $key => $amount) {
  118.       if ($amount && $key != 'pickup') {
  119.         $extArray[] = array('eid' => $key'eq' => $amount);
  120.         // Los formateo porque el JSON_ENCODE se comía los índices.
  121.       }
  122.     }
  123.   
  124.     if ($request->request->get('cooltra'false)) {
  125.       $extArray[] = array('eid' => $exdates['pickup'], 'eq' => 1);
  126.     }
  127.   
  128.     if ($request->request->get('send-mail')) {
  129.       $buyer $request->request->get('buyer');
  130.     } else {
  131.       $buyer null;
  132.     }
  133.   
  134.     if ($request->request->get('payType') == 1) {
  135.       // TODO: Comprobar si para este evento tiene habilitada tarjeta.
  136.       // El pago es con tarjeta, he de crear un pedido.
  137.       $cart $conn->makePendingSale($this->getUser()->getApiKey(), $tktArray$extArray$seller$buyer$request->headers->get('x-forwarded-for'));
  138.     
  139.       if (isset($cart['error_message'])) {
  140.         // Hay un error, no está la venta completada.
  141.         $this->addFlash(
  142.           'danger',
  143.           'ERROR: ' .$cart['error_message']
  144.         );
  145.       
  146.         return $this->redirect($this->generateUrl('homepage'));
  147.       }
  148.     
  149.       return $this->redirect($this->generateUrl('view_pending_sale',
  150.         ['hashid' => $cart['hashid']]
  151.       ));
  152.     } else {
  153.       // TODO: Comprobar que para este evento tiene habilitado cash
  154.       $sale $conn->makeSaleAction($this->getUser()->getApiKey(), $tktArray$extArray$seller$buyer$request->headers->get('x-forwarded-for'));
  155.     
  156.       if (isset($sale['error'])) {
  157.         // Hay un error, no está la venta completada.
  158.         $this->addFlash(
  159.           'danger',
  160.           'ERROR: Some error has ocurred creating the sale. Please try again. ' .$sale['message']
  161.         );
  162.       
  163.         return $this->redirect($this->generateUrl('homepage'));
  164.       }
  165.     
  166.       return $this->redirect($this->generateUrl('view_sale',
  167.         ['sale_token' => $sale['sale_token']]
  168.       ));
  169.     }
  170.   }
  171.   
  172.   #[Route('/sale-pdf/{sale_token}'name'sale_pdf')]
  173.   public function salePdf($sale_tokenRequest $requestApiConnService $conn): Response
  174.   {
  175.     $sale_data $conn->getSaleToPrint($sale_token);
  176.     $config    $request->getSession()->get('config'false);
  177.     $tpl $request->query->get('small'0) ? 'sale_pdf_single' 'sale_pdf';
  178.     
  179.     return $this->render('events/'.$tpl.'.html.twig', [
  180.       'data'       => $sale_data,
  181.       'download'   => 0,
  182.       'show_price' => $config $config['showPrice'] : false
  183.     ]);
  184.   }
  185.   
  186.   #[Route('/sale-receipt/{sale_token}'name'sale_receipt')]
  187.   public function saleReceipt($sale_tokenRequest $requestApiConnService $conn): Response
  188.   {
  189.     $sale_data $conn->getSaleToPrint($sale_token);
  190.     $config    $request->getSession()->get('config'false);
  191.     
  192.     return $this->render('events/sale_receipt.html.twig', [
  193.       'data'       => $sale_data,
  194.       'show_price' => $config $config['showPrice'] : false
  195.     ]);
  196.   }
  197.   
  198.   #[Route('/manage-workers-ferry'name'workers_ferry')]
  199.   public function workers(Request $requestApiConnService $conn): RedirectResponse|Response
  200.   {
  201.     $conn->setEndpoint($this->getParameter('ferry_api'));
  202.     
  203.     $workers $conn->getWorkers($this->getUser()->getUserIdentifier());
  204.     
  205.     if ($request->isMethod('POST')){
  206.       $wk $request->request->get('wk');
  207.       
  208.       $res $conn->addWorker(
  209.         $wk['name'],
  210.         $wk['surname'],
  211.         $wk['email'],
  212.         $wk['idNumber'],
  213.         $this->getUser()->getUserIdentifier()
  214.       );
  215.       
  216.       if (isset($res['success'])) {
  217.         $this->addFlash('success''flash.msg.add.worker.success');
  218.       } else {
  219.         $this->addFlash('danger'$res['message']);
  220.       }
  221.       
  222.       return $this->redirect($request->headers->get('referer'));
  223.     }
  224.     
  225.     return $this->render('events/workers_ferry.html.twig', [
  226.       'workers' => $workers
  227.     ]);
  228.   }
  229.   
  230.   
  231.   # Carga la configuración del TPV al hacer login y luego cada 30 minutos.
  232.   private function getConfigData(ApiConnService $conn, callable|SessionInterface|null $session$apiKey)
  233.   {
  234.     $now = new DateTime();
  235.     if ($now->format('U') >= $session->get('expire_conf'0)) {
  236.       $config $conn->getConfig($apiKey);
  237.       $session->set('config'$config);
  238.     
  239.       // Para ver si hay que mostrar el menu de compras TPV.
  240.       foreach ($config['configs'] as $cfg) {
  241.         if ($cfg['can_tpv']) {
  242.           $session->set('can_tpv'1);
  243.           break;
  244.         }
  245.       }
  246.     
  247.       $unread $conn->hasMessages($apiKey);
  248.       $session->set('unread'$unread);
  249.     
  250.       // Comprueba si tiene listas de invitados
  251.       $guestlists $conn->hasGuestList($apiKey);
  252.       $session->set('guestlists'$guestlists['q']);
  253.     
  254.       $types $conn->getVenueTypes($apiKey);
  255.       $session->set('types'$types);
  256.     
  257.       // De esta forma hago que solo se obtenga la configuración cada 30 minutos.
  258.       // Lo quito temporalmente 25Jun por errores en Redis.
  259.       // $now->modify('+30minutes');
  260.       $session->set('expire_conf'$now->format('U'));
  261.     }
  262.   }
  263. }