src/Controller/Frontend/IndexController.php line 105

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Controller\Shared\Livescoring\LivescoringCache;
  4. use App\DBAL\Backend\EnumEstadoInscrito;
  5. use App\Service\CalculateCurrentHoleService;
  6. use App\Entity\Backend\CompetitionSection;
  7. use App\Entity\Backend\CompetitionSectionHidden;
  8. use Doctrine\Common\Collections\ArrayCollection;
  9. use Redis;
  10. use Symfony\Component\HttpFoundation\RedirectResponse;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  18. use Symfony\Component\HttpKernel\KernelInterface;
  19. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  20. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  21. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  22. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  23. use Symfony\Component\Form\Extension\Core\Type\TextType;
  24. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  25. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  26. use Symfony\Component\Validator\Constraints\NotBlank;
  27. use Symfony\Component\Asset\Packages;
  28. use Buzz\Browser;
  29. use Buzz\Client\FileGetContents;
  30. use Nyholm\Psr7\Factory\Psr17Factory;
  31. use App\Entity\Backend\Inscrito;
  32. use App\Entity\Backend\InscritoDocumento;
  33. use App\Entity\Backend\Log;
  34. use App\Entity\Backend\HcpJuego;
  35. use App\Entity\Backend\Equipo;
  36. use App\Util\Util;
  37. use App\Util\UtilStatic;
  38. use App\Util\UtilJugadores;
  39. use App\Util\Tarjetas;
  40. use App\Entity\Backend\Pedido;
  41. use App\Entity\Backend\Jugador;
  42. use App\Entity\Backend\Categoria;
  43. use App\Entity\Backend\CategoriaConfig;
  44. use App\Entity\Backend\Clasificacion;
  45. use App\Entity\Backend\Clasificado;
  46. use App\Entity\Backend\Cliente;
  47. use App\Entity\Backend\Comunidad;
  48. use App\Service\FederatedWebService;
  49. // use App\Service\RFEGWebService;
  50. use App\Util\RedsysAPI;
  51. use App\Util\Recipe;
  52. use App\Entity\Backend\JugadorRGPD;
  53. use App\Service\EnvioCorreo;
  54. use App\Service\EnvioSms;
  55. use App\Service\NotificacionesService;
  56. use App\Util\Utilidades;
  57. use App\Entity\Backend\Club;
  58. use App\Entity\Backend\Competicion;
  59. use App\Entity\Backend\Estadisticas;
  60. use App\Entity\Backend\Horario;
  61. use App\Entity\Backend\Jornada;
  62. use App\Entity\Backend\JornadaConfig;
  63. use App\Entity\Backend\Resultado;
  64. use App\Entity\Backend\Sms;
  65. use App\Entity\Backend\SoftwareGolf;
  66. use App\Entity\Backend\Trazado;
  67. use App\Entity\Backend\TrazadoBarra;
  68. use App\Entity\Gestion\JugadorHorario;
  69. use App\Entity\Gestion\PartidaHorario;
  70. use App\Entity\User\User;
  71. use App\Entity\User\UserApp;
  72. use App\Entity\Backend\Provincia;
  73. use Doctrine\Persistence\ManagerRegistry;
  74. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  75. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  76. use App\Util\SoftwareExternoUtil;
  77. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  78. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  79. class IndexController extends AbstractController {
  80.     private $em;
  81.     private $util;
  82.     private $utilidades;
  83.     private $tokenStorage;
  84.     private $session;
  85.     public function __construct(ManagerRegistry $doctrineUtil $utilUtilidades $utilidadesTokenStorageInterface $tokenStorageSessionInterface $session) {
  86.         $this->util $util;
  87.         $this->utilidades $utilidades;
  88.         $this->em $doctrine->getManager();
  89.         $this->tokenStorage $tokenStorage;
  90.         $this->session $session;
  91.     }
  92.     /**
  93.      * F-017 Pagina principal
  94.      *
  95.      * @Route("/", name="portada")
  96.      *
  97.      */
  98.     public function index(Request $requestEnvioCorreo $mailer) {
  99. //        $secret = $this->getParameter('secret');
  100. //        $long = $this->getParameter('next.longitud.hash');
  101. //        $cifrado = $this->util->encriptarLargo('majgolfacademyForSlope', $secret, $long);
  102.         $numTournaments $this->em->getRepository(Competicion::class)->cuentaCompeticionesTotal();
  103.         $totalPaidEnrolled $this->em->getRepository(Inscrito::class)->countPaid();
  104.         // Creamos el formulario. Lo creamos asi ya que no hace falta entidad para contacto.
  105.         $form $this->createContactForm();
  106.         $form->handleRequest($request);
  107.         // Cuando se mande el formulario se enviara un correo para nosotros con el mensaje del usuario y los datos que ha introducido
  108.         if($form->isSubmitted() && $form->isValid()){
  109.             $this->sendContact($form$mailer);
  110.             $form $this->createContactForm();
  111.             return $this->redirectToRoute('portada');
  112.         }
  113.         // Se recoge la informacion necesaria para mostrar el componente de las plazas de la competicion
  114.         $competicionesInscripcionCercana $this->em->getRepository(Competicion::class)->competicionesInscripcionCercana(12);
  115.         return $this->render('frontend/Default/index.html.twig', [
  116.             "form" => $form->createView(),
  117.             "limiteLivescoring" => 4// tarjetas que se muestran por cada componente livescoring
  118.             "competicionesInscripcionCercana" => $competicionesInscripcionCercana,
  119.             "counter" => [
  120.                 "tournaments" => $numTournaments,
  121.                 "players" => $totalPaidEnrolled
  122.             ]
  123.         ]);
  124.     }
  125.     // Creamos aqui el formulario de contacto que tendra la index
  126.     private function createContactForm() {
  127.         $form $this->createFormBuilder()
  128.             ->setMethod("POST")
  129.             ->add('name'TextType::class, array(
  130.                 'constraints' => new NotBlank(),
  131.                 "required" => true,
  132.                 "label" => "labels.contact.name",
  133.                 "translation_domain" => "FrontendBundle",
  134.                 'label_attr' => [
  135.                     'class' => 'label'
  136.                 ],
  137.                 'attr' => [
  138.                     'class' => "text-input"
  139.                 ]
  140.             ))
  141.             ->add('email'EmailType::class, array(
  142.                 'constraints' => new NotBlank(),
  143.                 "required" => true,
  144.                 "label" => "labels.contact.email",
  145.                 "translation_domain" => "FrontendBundle",
  146.                 'label_attr' => [
  147.                     'class' => 'label'
  148.                 ],
  149.                 'attr' => [
  150.                     'class' => "text-input"
  151.                 ]
  152.             ))
  153.             ->add('club'TextType::class, array(
  154.                 "required" => false,
  155.                 "label" => "labels.contact.club",
  156.                 "translation_domain" => "FrontendBundle",
  157.                 'label_attr' => [
  158.                     'class' => 'label'
  159.                 ],
  160.                 'attr' => [
  161.                     'class' => "text-input"
  162.                 ]
  163.             ))
  164.             ->add('license'TextType::class, array(
  165.                 "required" => false,
  166.                 "label" => "labels.contact.license",
  167.                 "translation_domain" => "FrontendBundle",
  168.                 'label_attr' => [
  169.                     'class' => 'label'
  170.                 ],
  171.                 'attr' => [
  172.                     'class' => "text-input"
  173.                 ]
  174.             ))
  175.             ->add('message'TextareaType::class, array(
  176.                 'constraints' => new NotBlank(),
  177.                 "required" => true,
  178.                 "label" => "labels.contact.message",
  179.                 "translation_domain" => "FrontendBundle",
  180.                 'label_attr' => [
  181.                     'class' => 'label'
  182.                 ],
  183.                 'attr' => [
  184.                     "rows" => 4,
  185.                     "cols" => 50,
  186.                     'class' => "textarea"
  187.                 ]
  188.             ))
  189.             ->add('privacyPolicy'CheckboxType::class, array(
  190.                 'constraints' => new NotBlank(),
  191.                 "required" => true,
  192.                 "label" => false,
  193.                 'label_attr' => [
  194.                     'class' => 'label-check'
  195.                 ],
  196.                 "translation_domain" => "FrontendBundle"
  197.             ))
  198.             ->add('send'SubmitType::class, array(
  199.                 'label' => "labels.contact.send",
  200.                 "translation_domain" => "FrontendBundle",
  201.                 'attr' => [
  202.                     'class' => "button enviar"
  203.                 ]
  204.             ))
  205.             ->getForm();
  206.         return $form;
  207.     }
  208.     /**
  209.      * @Route("/livescoring-start", name="livescoring_start")
  210.      */
  211.     public function indexLivescoringStart (LivescoringCache $livescoringCache) {
  212.         // Devuelve las jornadas que se quieren mostrar en el livescoring de la index
  213.         $jornadasLivescoring $this->em->getRepository(Jornada::class)->indexLivescoring();
  214.         $livescoring = [];
  215.         foreach($jornadasLivescoring as $jl){
  216.             $jornada $this->em->getRepository(Jornada::class)->find($jl["id"]);
  217.             $competicion $jornada->getCompeticion();
  218.             $livescoringParams = [
  219.                 'isTeamLivescoring' => false
  220.             ];
  221.             $livescoring["l-" $jl["id"]] = [
  222.                 ...$livescoringCache->__invoke($jornada$livescoringParams),
  223.                 "compId" => $competicion->getId(),
  224.                 "nombreClub" => $competicion->getClub()->getNombre(),
  225.                 "nombreCompeticion" => $competicion->getNombre()
  226.             ];
  227.         }
  228.         return $this->json($livescoring);
  229.     }
  230.     // public function contacto(Request $request, SendEmailUtil $mailer): Response {
  231.     //     $sended = 0;
  232.     //     //Creamos el formulario. Lo creamos asi ya que no hace falta entidad para contacto.
  233.     //     $form = $this->createContactForm([]);
  234.     //     $form->handleRequest($request);
  235.     //     if (count($form->getErrors()) > 0) {
  236.     //         $sended = -1;
  237.     //     }
  238.     //     if ($form->isSubmitted() && $form->isValid() /* && $this->captchaverify($request->get('g-recaptcha-response')) */) {
  239.     //         $mailer->sendEmail([
  240.     //             "from" => $this->getParameter('app.notifications.email_sender'),
  241.     //             "to" => $this->getParameter('email.contacto'),
  242.     //             "asunto" => 'Contacto FGM',
  243.     //             "cco" => "gest.slope@gmail.com",
  244.     //             "html" => $this->renderView('mail/contact_mail.html.twig', [
  245.     //                 'nombre' => $form->get("name")->getData(),
  246.     //                 'emailFrom' => $form->get("email")->getData(),
  247.     //                 'texto' => $form->get("text")->getData(),
  248.     //                 'telefono' => $form->get("phone")->getData(),
  249.     //                 'bloque' => 'contacto'
  250.     //             ])
  251.     //         ]);
  252.     //         //EmailContacto::sendEmailContact($form, $mailer, $this->getParameter('emails.contacto.user'));
  253.     //         //Limpiamos el array (lo creamos de nuevo)
  254.     //         $data = array();
  255.     //         $form = $this->createContactForm($data);
  256.     //         $sended = 1;
  257.     //     }
  258.     //     return $this->render('frontend/default/contacto.html.twig', array("form" => $form->createView(), "sended" => $sended));
  259.     // }
  260.     /**
  261.      * @Route("/search-panel", name="searchPanel", options={"expose"=true})
  262.      *
  263.      * Hace la busqueda de competiciones y clubes en la index
  264.      */
  265.     public function searchPanel(Request $request) {
  266.         $text $request->request->get('text');
  267.         $competicionesBusqueda $this->em->getRepository(Competicion::class)->indexSearch($text);
  268.         $clubes $this->em->getRepository(Club::class)->findClubes($text);
  269.         $competiciones = [];
  270.         foreach ($competicionesBusqueda as $cb) {
  271.             $competiciones[] = [
  272.                 "id"         => $cb["id"],
  273.                 "nombre"     => $cb["nombre"],
  274.                 "fecha"      => $cb["fecha"]->format("Y-m-d"),
  275.                 "nombreClub" => $cb["nombreClub"]
  276.             ];
  277.         }
  278.         return $this->json([
  279.                     "competiciones" => $competiciones,
  280.                     "clubes"        => $clubes
  281.         ]);
  282.     }
  283.     /**
  284.      * F-018 Falso feed de calendario
  285.      *
  286.      * @Route("/{locale}/f/club/{club}/feed.ics", name="feed")
  287.      *
  288.      */
  289.     public function feed($locale$club) {
  290.         return new JsonResponse(["club" => $club"locale" => $locale]);  //$this->redirect($this->generateUrl('_club', array('id' => $club)));
  291.     }
  292.     /**
  293.      * F-019 Envio de SMS de prueba para los usuarios con rol marketing
  294.      *
  295.      * @Route("/sms-reset", name="sms_reset_marketing", options={"expose"=true})
  296.      *
  297.      */
  298.     public function smsReset(Request $requestEnvioCorreo $mailerEnvioSms $messagingUtilJugadores $util_jugadores) {
  299.         $respuesta = array();
  300.         $numero $request->request->get('numero');
  301.         if (!$numero) {
  302.             $respuesta['codigo'] = -2;
  303.             $respuesta['mensaje'] = "No se ha indicado ningĆŗn numero de telefono al que mandar los mensajes";
  304.             return new JsonResponse($respuesta);
  305.         }
  306.         //usamos el campo publicidad a modo de prioridad. Buscamos los que son de prioridad negativa, segun su usuario
  307.         $usuario $request->request->get('usuario');
  308.         $smss $this->em->getRepository(Sms::class)->findBy(array('publicidad' => (-$usuario)));
  309.         if (!$smss) {
  310.             $respuesta['codigo'] = -1;
  311.             $respuesta['mensaje'] = "No hay ningĆŗn SMS de ejemplo";
  312.             return new JsonResponse($respuesta);
  313.         }
  314.         $ahora = new \DateTime('now');
  315.         //ponemos los mensjaes como no enviados y le asignamos el numero de telefono que le corresponde
  316.         foreach ($smss as $sms) {
  317.             $sms->setTelefono($numero);
  318.             $sms->setUpdatedAt($ahora);
  319.             $messaging->enviarSmsAPI($smstrue0true);
  320.         }
  321.         $this->em->flush();
  322.         //tomamos la IP y la localización del cliente para adjuntarla al email
  323.         $client_location Recipe::getClientLocation();
  324.         $client_IP Recipe::getClientIP();
  325.         $user $this->em->getRepository(User::class)->findOneBy(array('ccc' => $usuario));
  326.         //mandamos email avisando del login
  327.         $args = [
  328.             "to"      => "nacho.perez.benito@gmail.com",
  329.             "subject" => 'NextCaddy - SMS de prueba enviados (pagina de marketing)',
  330.             "html"    => $this->renderView('backend/mail/email_envio_sms.html.twig', array(
  331.                 'user'            => $user,
  332.                 'numero'          => $numero,
  333.                 'client_ip'       => $client_IP,
  334.                 'client_location' => $client_location))
  335.         ];
  336.         //EnvioCorreo::enviarCorreo($args);
  337.         $mailer->enviarCorreo($args);
  338.         $respuesta['codigo'] = 0;
  339.         $respuesta['mensaje'] = "Se han enviado los mensajes de ejemplo";
  340.         return new JsonResponse($respuesta);
  341.     }
  342.     /**
  343.      * @Route("/field-f1", name="field_f1")
  344.      */
  345.     public function fieldF1 () {
  346.         $totalRoundsNumber $this->em->getRepository(Jornada::class)->countAllWithDeleted();
  347.         $totalPaidEnrolled $this->em->getRepository(Inscrito::class)->countPaid();
  348.         return $this->render("frontend/Television/formula1.html.twig", [
  349.             "totalRoundsNumber" => $totalRoundsNumber,
  350.             "totalPaidEnrolled" => $totalPaidEnrolled
  351.         ]);
  352.     }
  353.     /**
  354.      * F-020 Envio de SMS de prueba para demos y presentaciones
  355.      *
  356.      * @Route("/sms-reset/{numero}", name="sms_reset", options={"expose"=true})
  357.      *
  358.      */
  359.     public function smsExample($numeroEnvioSms $messaging) {
  360.         $respuesta = ['codigo' => 0];
  361.         //usamos el campo publicidad a modo de prioridad. Buscamos los que son de maxima prioridad, ya que esos seran los que sean de ejemplo (prioridad minima 8, 9 o mas, no envia)
  362.         $smss $this->em->getRepository(Sms::class)->findBy(array('publicidad' => 0));
  363.         if (!$smss) {
  364.             $respuesta['codigo'] = -1;
  365.             return $this->render("frontend/Default/smsExamples.html.twig"$respuesta);
  366.         }
  367.         $ahora = new \DateTime('now');
  368.         //ponemos los mensjaes como no enviados y le asignamos el numero de telefono que le corresponde
  369.         foreach ($smss as $sms) {
  370.             $sms->setTelefono($numero);
  371.             $sms->setUpdatedAt($ahora);
  372.             $messaging->enviarSmsAPI($smstrue0true);
  373.         }
  374.         $this->em->flush();
  375.         $log_message "Envio de Sms de prueba al telĆ©fono " $numero;
  376.         $log = new Log('i'$log_messagenull);
  377.         $this->em->persist($log);
  378.         $this->em->flush();
  379.         return $this->render("frontend/Default/smsExamples.html.twig"$respuesta);
  380.     }
  381.     /**
  382.      * F-021 Envio de visita a la pagina para estadisticas de Google Analitycs para Internet Explorer o fallo de la libreria Javascript
  383.      *
  384.      * @Route("/collect", name="collect", options={"expose"=true})
  385.      *
  386.      */
  387.     public function collect() {
  388.         $params = array('v'   => 1,
  389.             'tid' => "UA-61056427-1",
  390.             'cid' => rand(10000009999999),
  391.             't'   => "event",
  392.             'ec'  => "Blocking",
  393.             'ea'  => "NextCaddy",
  394.             'ni'  => '0',
  395.             'z'   => rand(10000009999999),
  396.         );
  397.         $client = new FileGetContents(new Psr17Factory());
  398.         $browser = new Browser($client, new Psr17Factory());
  399.         $url 'https://www.google-analytics.com/collect?' http_build_query($params);
  400.         try {
  401.             $response $browser->get($url);
  402.             $res $response->getStatusCode() == '200';
  403.         } catch (\Throwable $e) {
  404.             $res false;
  405.         }
  406.         return new JsonResponse($res);
  407.     }
  408.     /**
  409.      * F-022 Obtención de datos de un club concreto
  410.      *
  411.      * @Route("/getClubs", name="_ajGetClubs", options={"expose"=true})
  412.      *
  413.      */
  414.     public function getClubsByName(Request $request) {
  415.         //retrieve the query
  416.         $query $request->request->get("query");
  417.         $Clubs $this->em->getRepository(Club::class)->findClubByName($query);
  418.         if (!$Clubs) {
  419.             // throw exception
  420.         }
  421.         $response = new JsonResponse();
  422.         $response->setData($Clubs);
  423.         return $response;
  424.     }
  425.     /**
  426.      * F-023 Obtención de datos de un jugador en un torneo
  427.      *
  428.      * @Route("/getJugador", name="_ajGetJugador", options={"expose"=true})
  429.      *
  430.      */
  431.     public function getJugadorByName(Request $request) {
  432.         //retrieve the query
  433.         $query $request->get('query');
  434.         $tour $request->get('tournament');
  435.         $playersNames $this->em->getRepository(Jugador::class)->findPlayerCard($query$tour);
  436.         if (!$playersNames) {
  437.             // throw exception
  438.         }
  439.         $response = new JsonResponse();
  440.         $response->setData($playersNames);
  441.         return $response;
  442.     }
  443.     /**
  444.      * F-024 Pagina de instrucciones para integrar NextCaddy en la web del club
  445.      *
  446.      * @Route("/integracion", name="integracion")
  447.      */
  448.     public function integracionWidget() {
  449.         $clubs $this->em->getRepository(Club::class)->findTodosParaRandom();
  450.         if (!$clubs) {
  451.             $this->addFlash(
  452.                     'error'"Ha ocurrido un error. Por favor, intĆ©ntelo mĆ”s tarde");
  453.             //return $this->redirect($this->generateUrl('_club', array('id' => "AM00")));
  454.             return $this->redirect($this->generateUrl('portada'));
  455.         }
  456.         return $this->render("frontend/Club/generarWidget.html.twig", [
  457.                     'clubes' => $clubs
  458.         ]);
  459.     }
  460.     /**
  461.      * F-025 Pagina de Politica de cookies
  462.      *
  463.      * @Route("/cookies", name="cookies")
  464.      */
  465.     public function cookies() {
  466.         return $this->render("frontend/Default/politica_cookies.html.twig");
  467.     }
  468.     /**
  469.      * F-026 Pagina de Politica de privacidad
  470.      *
  471.      * @Route("/privacidad", name="privacidad")
  472.      */
  473.     public function privacidad() {
  474.         return $this->render("frontend/Default/privacidad.html.twig");
  475.     }
  476.     /**
  477.      * F-027 Pagina de Terminos y condiciones
  478.      *
  479.      * @Route("/terminos-y-condiciones", name="terminos_condiciones")
  480.      */
  481.     public function terminosCondiciones() {
  482.         return $this->render("frontend/Default/terminos_condiciones.html.twig");
  483.     }
  484.     /**
  485.      * F-028 Listado de competiciones que tienen una jornada en el dia de hoy
  486.      *
  487.      * @Route("/livescoring/ahora/{letra}", name="envivo_ahora", defaults={ "letra" = "H" })
  488.      */
  489.     public function envivoAhora($letra) {
  490.         $competiciones $this->em->getRepository(Competicion::class)->findTodasEnVivo();
  491.         if (!$competiciones) {
  492.             $this->addFlash('error'"En este momento no disponemos de datos en vivo del dĆ­a de hoy. IntĆ©ntelo mĆ”s tarde");
  493.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  494.         } else {
  495.             return $this->redirect($this->generateUrl('competicion_envivo', array('id' => $competiciones[0]['id'], 'letra' => $letra)));
  496.         }
  497.     }
  498.     /**
  499.      * F-029 Seleccionamos el tipo de livescoring para la competicion
  500.      *
  501.      * @Route("/livescoring-select/{id}/{ordenUrl}/{letra}", name="envivo_select", defaults={"letra"="H", "ordenUrl"=0}, options={"expose"=true})
  502.      */
  503.     public function envivoSelect($id$ordenUrl$letra): RedirectResponse
  504.     {
  505.         //TODO search all uses and change to new livesoring route. While Redirect to new livescoring
  506.         return $this->redirect($this->generateUrl('livescoring', array('id' => $id)));
  507.     }
  508.     /**
  509.      * F-030 Visualización de competiciones a travĆ©s del widget (iframe)
  510.      *
  511.      * @Route("/widget/{id}", name="_widget")
  512.      */
  513.     public function widget($id) {
  514.         $entity $this->em->getRepository(Club::class)->findOneBy(array("id" => $id"habilitado" => true));
  515.         if (!$entity) {
  516.             $this->addFlash(
  517.                     'error'"No encontramos el Club que nos ha solicitado");
  518.             //return $this->redirect($this->generateUrl('_club', array('id' => "AM00")));
  519.             return $this->redirect($this->generateUrl('portada'));
  520.         }
  521.         $futuras = array();
  522.         $pasadas = array();
  523.         if ($id != "AM00") {
  524.             //Me traigo competiciones futuras y pasadas
  525.             $futuras $this->em->getRepository(Competicion::class)->getCompeticiones($id360"mayor""ASC"true);
  526.             $pasadas $this->em->getRepository(Competicion::class)->getCompeticiones($id360"menor""DESC"true);
  527.         } else {
  528.             //Me traigo competiciones futuras y pasadas
  529.             $futuras $this->em->getRepository(Competicion::class)->getCompeticionesOrganizador("AM00"480"mayor""ASC"true);
  530.             $pasadas $this->em->getRepository(Competicion::class)->getCompeticionesOrganizador("AM00"480"menor""DESC"true);
  531.         }
  532.         return $this->render("frontend/Club/widget.html.twig", [
  533.                     'entity'  => $entity,
  534.                     'futuras' => $futuras,
  535.                     'pasadas' => $pasadas
  536.         ]);
  537.     }
  538.     /**
  539.      * F-033 Mostrar inscritos estado de corte. [Creo que en desuso]
  540.      *
  541.      * @Route("/inscritoscorte", name="_ajInscritosCorte", options={"expose"=true})
  542.      */
  543.     public function inscritosCorte(Request $request) {
  544.         $id $request->request->get("id");
  545.         //comprobar datos de ordenacion competicion.
  546.         $comp_criteria $this->em->getRepository(Competicion::class)->find($id);
  547.         $num_jugadores $comp_criteria->getJugadores();
  548.         //Distinguimos entre si tenemos 1 o mas jugadores por equipo en la competicion,
  549.         //de esta manera para parejas y equipos mostramos la lista sin linea de corte (que ha sido deshabilidada en el backend)
  550.         //para mostrar el listado que estĆ” agrupado por parejas o equipos
  551.         if ($num_jugadores == 1) {
  552.             $params['competi'] = $comp_criteria;
  553.             if ($comp_criteria->getCriterio() == null && $comp_criteria->getCriterio2() == null) {
  554.                 //comprobar datos de ordenacion categoria.
  555.                 //$cat_criteria = $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  556.                 $cat_criteria $this->em->getRepository(Categoria::class)->findCategoriasInscritosActivos($id);
  557.                 foreach ($cat_criteria as $crit) {
  558.                     $inscritosporcategoria[$crit->getId()] = $this->em->getRepository(Inscrito::class)->getPlayersByCatCorte($id$crit->getId(), $crit->getCriterio(), $crit->getCriterio2());
  559.                 }
  560.                 $params['inscritosbycat'] = $inscritosporcategoria;
  561.                 $params['categorias'] = $cat_criteria;
  562.             } else {
  563.                 $cri1 null;
  564.                 $ord1 "ASC";
  565.                 $cmpcr1 $comp_criteria->getCriterio();
  566.                 if (!empty($cmpcr1)) {
  567.                     $cri1 $cmpcr1->getCampo();
  568.                     $ord1 $cmpcr1->getOrden();
  569.                 }
  570.                 $cri2 null;
  571.                 $ord2 "ASC";
  572.                 $cmpcr2 $comp_criteria->getCriterio2();
  573.                 if (!empty($cmpcr2)) {
  574.                     $cri2 $cmpcr2->getCampo();
  575.                     $ord2 $cmpcr2->getOrden();
  576.                 }
  577.                 $players $this->em->getRepository(Inscrito::class)->getPlayersByCorte($id$cri1$ord1$cri2$ord2);
  578.                 $params['inscritos'] = $players;
  579.             }
  580.             $params['showInscribeDateInWaitingList'] = $this->checkIfShowInscribeDateInWaitingList($id);
  581.             return $this->render('frontend/Inscritos/inscritos_corte_tbl_new.html.twig'$params);
  582.         } else {
  583.             $players $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($comp_criteriatrue);
  584.             if ($num_jugadores == 2) {
  585.                 $view 'frontend/Inscritos/inscritos_tbl_parejas_new.html.twig';
  586.             } else {
  587.                 $view 'frontend/Inscritos/inscritos_tbl_equipos_new.html.twig';
  588.             }
  589.             $list = array();
  590.             foreach ($players as $i) {
  591.                 if (!in_array($i->getJugador()->getSexo(), $listtrue)) {
  592.                     array_push($list$i->getJugador()->getSexo());
  593.                 }
  594.             }
  595.             // if (!$players) {
  596.             //     $response = new JsonResponse();
  597.             //     return $response->setData('No data');
  598.             // } else {
  599.             return $this->render($view, array(
  600.                         'inscritos' => $players,
  601.                         'competi'   => $comp_criteria,
  602.                         'sexos'     => count($list)
  603.             ));
  604.             // }
  605.         }
  606.     }
  607.     /**
  608.      * F-034 Mostrar inscritos con y sin linea de corte
  609.      * Ya es la plantilla la que me lo separa. Yo solo mando array agrupado
  610.      *
  611.      * @Route("/getListadoInscritos", name="listado_inscritos", options={"expose"=true})
  612.      *
  613.      */
  614.     public function listadoInscritos(Request $request) {
  615.         $competitionId $request->request->get("id"0);
  616.         $token $request->request->get("token"null);
  617.         //comprobar datos de ordenacion competicion.
  618.         $competition $this->em->getRepository(Competicion::class)->find($competitionId);
  619.         if (!$competition) {
  620.             return new JsonResponse(-1);
  621.         }
  622.         if (!$this->util->checkTokenValidIframe($competition$token)) {
  623.             return new JsonResponse(-1);
  624.         }
  625.         $numPlayersByTeam $competition->getJugadores();
  626.         //Distinguimos entre si tenemos 1 o mas jugadores por equipo en la competicion,
  627.         //de esta manera para parejas y equipos mostramos la lista sin linea de corte (que ha sido deshabilidada en el backend)
  628.         //para mostrar el listado que estĆ” agrupado por parejas o equipos
  629.         if ($numPlayersByTeam == 1) {
  630.             $numTotalJornadas count($competition->getJornadas());
  631.             $params['competition'] = $competition;
  632.             $jornadaConfigByCategory = [];
  633.             if ($competition->getCriterio() == null && $competition->getCriterio2() == null) {
  634.                 $inscritosByCategory = [];
  635.                 $categoriasByCompetition = [];
  636.                 $cutOffByCategory false;
  637.                 $inscritos $this->em->getRepository(Inscrito::class)->getActiveInscribedOrdered($competition);
  638.                 foreach ($inscritos as $inscrito) {
  639.                     if (!isset($categoriasByCompetition[$inscrito->getCategoria()->getId()])) {
  640.                         $categoriasByCompetition[$inscrito->getCategoria()->getId()] = [
  641.                             'id' => $inscrito->getCategoria()->getId(),
  642.                             'name' => $inscrito->getCategoria()->getNombre(),
  643.                             'criterio' => $inscrito->getCategoria()->getCriterio()?->getNombre(),
  644.                             'criterio_id' => $inscrito->getCategoria()->getCriterio()?->getId(),
  645.                             'criterio_orden' => $inscrito->getCategoria()->getCriterio()?->getOrden(),
  646.                             'criterio2' => $inscrito->getCategoria()->getCriterio2()?->getNombre(),
  647.                         ];
  648.                         if (!$cutOffByCategory && !is_null($inscrito->getCategoria()->getCriterio())) {
  649.                             $cutOffByCategory true;
  650.                         }
  651.                         $inscritosByCategory[$inscrito->getCategoria()->getId()] = [];
  652.                     }
  653.                     if ($inscrito->getParticipa() !== -1) {
  654.                         $inscritosByCategory[$inscrito->getCategoria()->getId()][] = $inscrito;
  655.                     }
  656.                     $inscritosByCategory['total'][] = $inscrito;
  657.                 }
  658.                 foreach ($categoriasByCompetition as $categoria) {
  659.                     if ($numTotalJornadas == 1) {
  660.                         $jornadaConfigByCategory[$categoria['id']] = $this->em->getRepository(JornadaConfig::class)->findOneByCategoria($categoria['id']);
  661.                     }
  662.                     if ($categoria['criterio_id'] == 'HCP') {
  663.                         usort($inscritosByCategory[$categoria['id']], function (Inscrito $aInscrito $b) use ($categoria) {
  664.                             $participaComparison $b->getParticipa() <=> $a->getParticipa();
  665.                             if ($participaComparison !== 0) {
  666.                                 return $participaComparison;
  667.                             }
  668.                             if ($categoria['criterio_orden'] == 'ASC') {
  669.                                 $hcpComparison $a->getHCP() <=> $b->getHCP();
  670.                             } else {
  671.                                 $hcpComparison $b->getHCP() <=> $a->getHCP();
  672.                             }
  673.                             if ($hcpComparison === 0) {
  674.                                 return $a->getId() <=> $b->getId();
  675.                             }
  676.                             return $hcpComparison;
  677.                         });
  678.                     }
  679.                 }
  680.                 $categoriasByCompetition['total'] = [
  681.                     'id' => 'total',
  682.                     'name' => 'Total'
  683.                 ];
  684.                 if ($cutOffByCategory) {
  685.                     unset($inscritosByCategory['total']);
  686.                     unset($categoriasByCompetition['total']);
  687.                 }
  688.                 $params['inscritosByCat'] = $inscritosByCategory;
  689.                 $params['categories'] = $categoriasByCompetition;
  690.                 $params['jornadaConfig'] = $jornadaConfigByCategory;
  691.             } else {
  692.                 $players $this->em->getRepository(Inscrito::class)->getPlayersByCorte($competitionId$competition->getCriterio()?->getCampo(), $competition->getCriterio()?->getOrden(), $competition->getCriterio2()?->getCampo(), $competition->getCriterio2()?->getOrden());
  693.                 $params['inscritos'] = $players;
  694.             }
  695.             $params['showInscribeDateInWaitingList'] = $this->checkIfShowInscribeDateInWaitingList($competitionId);
  696.             return $this->render('frontend/Inscritos/inscritos_corte_tbl_new.html.twig'$params);
  697.         } else {
  698.             $players $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($competitiontrue);
  699.             if ($numPlayersByTeam == && $competition->getEstricto()) {
  700.                 $view 'frontend/Inscritos/inscritos_tbl_parejas_new.html.twig';
  701.             } else {
  702.                 $view 'frontend/Inscritos/inscritos_tbl_equipos_new.html.twig';
  703.             }
  704.             $list = array();
  705.             foreach ($players as $i) {
  706.                 if (!in_array($i->getJugador()->getSexo(), $listtrue)) {
  707.                     array_push($list$i->getJugador()->getSexo());
  708.                 }
  709.             }
  710.             if (!$players) {
  711.                 $response = new JsonResponse();
  712.                 return $response->setData('No data');
  713.             } else {
  714.                 return $this->render($view, array(
  715.                             'inscritos' => $players,
  716.                             'competi'   => $competition,
  717.                             'sexos'     => count($list)
  718.                 ));
  719.             }
  720.         }
  721.     }
  722.     private function checkIfShowInscribeDateInWaitingList (int $competitionId): bool
  723.     {
  724.         $competitionSectionInscribedDateInWaitingList $this->em->getRepository(CompetitionSection::class)->findOneBy([
  725.             "dom_id" => "fecha_lista_espera"
  726.         ]);
  727.         $competitionSectionHiddenInscribedDateInWaitingList $this->em->getRepository(CompetitionSectionHidden::class)->findOneBy([
  728.             "competition" => $competitionId,
  729.             "competition_section" => $competitionSectionInscribedDateInWaitingList
  730.         ]);
  731.         return empty($competitionSectionHiddenInscribedDateInWaitingList);
  732.     }
  733.     /**
  734.      * @Route("/f1/{roundId}", name="formula1", options={"expose"=true})
  735.      */
  736.     public function formula1 ($roundId) {
  737.         $round $this->em->getRepository(Jornada::class)->find($roundId);
  738.         if (empty($round)) {
  739.             return $this->json([]);
  740.         }
  741.         $calculateCurrentHoleService = new CalculateCurrentHoleService();
  742.         $jornadaConfig $this->em->getRepository(JornadaConfig::class)->findOneByJornada($round->getId());
  743.         $holesRange explode("-"$jornadaConfig->getHoyos());
  744.         $holesRangeArray range(intval($holesRange[0]), intval($holesRange[1]));
  745.         $isIndividual "I" === $round->getModalidad()->getId();
  746.         $playerSchedules $this->em->getRepository(JugadorHorario::class)->findJugadoresJornadaPublicada($round);
  747.         $numberHolesPlayed 0;
  748.         $players = [];
  749.         if ($playerSchedules) {
  750.             foreach ($playerSchedules as $playerSchedule) {
  751.                 $match $playerSchedule->getPartida();
  752.                 $lastHolePlayed $this->em->getRepository(Resultado::class)->findUltimoHoyo($roundId,[$playerSchedule->getInscrito()->getId()])["hoyo"] ?? 0;
  753.                 $currentHole $calculateCurrentHoleService->calculateCurrentHole($lastHolePlayed$holesRangeArray$match->getTee(), $numberHolesPlayed);
  754.                 if ($isIndividual) {
  755.                     $player $playerSchedule->getInscrito()?->getJugador();
  756.                     $hcp_juego $playerSchedule->getInscrito()->getHcpJuego() ? unserialize($playerSchedule->getInscrito()->getHcpJuego()) : "";
  757.                     if(!empty($hcp_juego)) {
  758.                         $hcpGame $this->em->getRepository(HcpJuego::class)->findOneBy(["inscrito" => $playerSchedule->getInscrito(), "jornada" => array_keys($hcp_juego)[0]]);
  759.                     }
  760.                     $players[] = [
  761.                         "teamId" => $playerSchedule->getEquipo(),
  762.                         "pairId" => $playerSchedule->getPareja(),
  763.                         "hcp" => round($playerSchedule->getInscrito()?->getHcp(),2),
  764.                         "hcp_game" => round($hcpGame?->getHcp(), 2),
  765.                         "matchId" => $match->getId(),
  766.                         "teeTime" => $match->getHora(),
  767.                         "currentHole" => $currentHole,
  768.                         "name" => $player->getNombre(),
  769.                         "surname" => $player->getApellidos(),
  770.                         "license" => $player->getLicencia()
  771.                     ];
  772.                 } else {
  773.                     $enrolleds $this->em->getRepository(Inscrito::class)->findBy([
  774.                         "competicion" => $round->getCompeticion()?->getId(),
  775.                         "equipo" => $playerSchedule->getEquipo(),
  776.                         "pareja" => $playerSchedule->getPareja(),
  777.                         "participa" => 1,
  778.                         "estado" => "pagado"
  779.                     ]);
  780.                     foreach ($enrolleds as $enrolled) {
  781.                         $hcp_juego $enrolled->getHcpJuego() ? unserialize($enrolled->getHcpJuego()) : "";
  782.                         $hcpGame "";
  783.                         if(!empty($hcp_juego)) {
  784.                             $hcpGame $this->em->getRepository(HcpJuego::class)->findOneBy(["inscrito" => $enrolled"jornada" => array_keys($hcp_juego)[0]]);
  785.                         }
  786.                         $players[] = [
  787.                             "teamId" => $playerSchedule->getEquipo(),
  788.                             "pairId" => $playerSchedule->getPareja(),
  789.                             "hcp" => $enrolled?->getHcp(),
  790.                             "hcp_game" => round($hcpGame2),
  791.                             "matchId" => $match->getId(),
  792.                             "teeTime" => $match->getHora(),
  793.                             "currentHole" => $currentHole,
  794.                             "name" => $enrolled->getJugador()?->getNombre(),
  795.                             "surname" => $enrolled->getJugador()?->getApellidos(),
  796.                             "license" => $enrolled->getJugador()?->getLicencia()
  797.                         ];
  798.                     }
  799.                 }
  800.             }
  801.         }
  802.         return $this->json($players);
  803.     }
  804.     /**
  805.      * @Route("/3djs/{teeId}/{holeId}", name="3djs", options={"expose"=true})
  806.      */
  807.     public function apiInfoMarkers(Request $request)
  808.     {
  809.         $id $request->request->get("id"0);
  810.     }
  811.     /**
  812.      * F-036 Mostrar listado de las clasificaciones publicadas
  813.      *
  814.      * @Route("/getListadoClasificaciones", name="listado_clasificaciones", options={"expose"=true})
  815.      *
  816.      */
  817.     public function listadoClasificaciones(Request $request)
  818.     {
  819.         $id $request->request->get("id"0);
  820.         $token $request->request->get("token"null);
  821.         //comprobar competicion.
  822.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  823.         if (!$competicion) {
  824.             return new JsonResponse(-1);
  825.         }
  826.         if (!$this->util->checkTokenValidIframe($competicion$token)) {
  827.             return new JsonResponse(-1);
  828.         }
  829.         $tipoClasif 0;    //Normal, ExAequo, PlayOff
  830.         $clasificaciones = array();
  831.         $nombresEquipos = array();
  832.         $equipos = array();
  833.         $numJugadores $competicion->getJugadores();
  834.         //Me traigo todas las clasificaciones de esta competicion que sean visibles
  835.         $clasifs $this->em->getRepository(Clasificacion::class)->findBy(["competicion" => $id"publicada" => true], array("orden" => "ASC""id" => "DESC"));
  836.         //Esta es la que sustituye a la anterior cuando se haga bien el menu para que no salga el icono de clasificaicones si no hay ninguna clasificacion visible
  837.         //$clasifs = $this->em->getRepository(Clasificacion::class)->findBy(array("id" => $id, "publicada" => 1), array("id" => "DESC"));
  838.         foreach ($clasifs as $clf) {
  839.             $modalidad = ($numJugadores == || $clf->getModalidad() != "pareja") ? $clf->getModalidad() : "equipo-pareja";
  840.             $posicionAnt 0;
  841.             switch ($modalidad) {
  842.                 case "individual":
  843.                     //13/07/2018 Jose: Se saca fuera del for $njornadasAux = $this->em->getRepository(Clasificado::class)->getJornadasByClasificacion($competicion);
  844.                     //indexamos por clasificacion
  845.                     //Tengo un listado ordenado por clasificaciones, de manera que tengo primero todos los clasificados ordenados de la 1Āŗ clasif, despues la 2Āŗ clasif y asi
  846.                     $clasificaciones[$clf->getId()] = array("clasificacion" => $clf->getNombre(), "modalidad" => $modalidad"calculo" => $clf->getCalculo()->getId(), "tipo" => $clf->getTipo(), "clasificados" => array(), "plantilla" => "Frontend:Clasificacion:clasificados_new-torneo-profesional.html.twig""equipos" => array());
  847.                     $listado $this->em->getRepository(Clasificado::class)->getClasificacionIndividualListado($id$clf->getCalculo()->getId(), $clf->getId());
  848.                     foreach ($listado as $elemento) {
  849.                         //El listado me repite el jugador para la siguiente jornada, me aprovecho de eso
  850.                         //Al estar indexado, no repito los datos del jugador
  851.                         if ($posicionAnt != $elemento["posicion"]) {
  852.                             $clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]] = array("idi" => $elemento["idi"], "nombre" => $elemento["nombre"], "apellidos" => $elemento["apellidos"], "licencia" => $elemento["licencia"], "nacimiento" => $elemento["nacimiento"], "hcp" => $elemento["hcp"], "nivel" => $elemento["nivel"], "jornadas" => array());
  853.                             $posicionAnt $elemento["posicion"];
  854.                         }
  855.                         //Como estoy indexando arrays y no necesito repetir el jugador, aƱado tantas jornadas con sus resultados como necesite para ese jugador
  856.                         $clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]]["jornadas"][$elemento["jornada"]] = array(
  857.                             "bruto"     => $elemento["bruto"],
  858.                             "neto"      => $elemento["neto"],
  859.                             "contrapar" => $elemento["contrapar"],
  860.                             "ide"       => $elemento["ide"],
  861.                             "penalidad" => $elemento["penalidad"],
  862.                             "hcpJuego"  => $elemento["hcpJuego"],
  863.                             "especial"  => $elemento["especial"]
  864.                         );
  865.                     }
  866.                     break;
  867.                 case "equipo-pareja":
  868.                     //caso inscritos equipo clasificacion parejas. La plantilla puede ser la de equipo y parejas
  869.                     $esEquipo false;
  870.                     //13/07/2018 Jose: Se saca fuera del for $njornadasAux = $this->em->getRepository(Clasificado::class)->getJornadasByClasificacionCouple($competicion, $esEquipo);
  871.                     //Tengo un listado ordenado por clasificaciones, de manera que tengo primero todos los clasificados ordenados de la 1Āŗ clasif, despues la 2Āŗ clasif y asi
  872.                     $clasificaciones[$clf->getId()] = array("clasificacion" => $clf->getNombre(), "modalidad" => $modalidad"calculo" => $clf->getCalculo()->getId(), "tipo" => $clf->getTipo(), "clasificados" => array(), "plantilla" => "Frontend:Clasificacion:clasificadosParejasEquipos_new-torneo.html.twig");
  873.                     $listado $this->em->getRepository(Clasificado::class)->getClasificacionParejaListado($id$competicion->getCalculo()->getId(), $clf->getId());
  874.                     foreach ($listado as $elemento) {
  875.                         //El listado me repite el jugador para la siguiente jornada, me aprovecho de eso
  876.                         //Al estar indexado, no repito los datos del jugador
  877.                         if ($posicionAnt != $elemento["posicion"]) {
  878.                             $clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]] = array("equipo" => $elemento["equipo"], "pareja" => $elemento["pareja"], "jornadas" => array());
  879.                             $posicionAnt $elemento["posicion"];
  880.                         }
  881.                         //Como estoy indexando arrays y no necesito repetir el jugador, aƱado tantas jornadas con sus resultados como necesite para ese jugador
  882.                         $clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]]["jornadas"][$elemento["jornada"]] = array(
  883.                             "bruto"     => $elemento["bruto"],
  884.                             "neto"      => $elemento["neto"],
  885.                             "contrapar" => $elemento["contrapar"],
  886.                             "ide"       => $elemento["ide"],
  887.                             "especial"  => $elemento["especial"]
  888.                         );
  889.                     }
  890.                     $equipos = array();
  891.                     //$nombresEquipos = array();
  892.                     $equiposAux $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($competicion);
  893.                     foreach ($equiposAux as $equipo) {
  894.                         $indice $equipo->getEquipo() . "-" $equipo->getPareja();
  895.                         if (!isset($equipos[$indice])) {
  896.                             $equipos[$indice] = array();
  897.                             $nombresEquipos[$indice] = $equipo->getNombreEquipo();
  898.                         }
  899.                         $jugador $equipo->getJugador();
  900.                         $equipos[$indice][] = array(
  901.                             "idi"        => $equipo->getId(),
  902.                             "nombre"     => $jugador->getNombre(),
  903.                             "apellidos"  => $jugador->getApellidos(),
  904.                             "licencia"   => $jugador->getLicencia(),
  905.                             "nacimiento" => $jugador->getFecha(),
  906.                             "hcp"        => $equipo->getHcp(),
  907.                             "nivel"      => (!is_null($equipo->getNivel())) ? $equipo->getNivel()->getId() : "M"
  908.                         );
  909.                     }
  910.                     $clasificaciones[$clf->getId()]["equipos"] = $equipos;
  911.                     break;
  912.                 default:
  913.                     //caso inscritos equipo clasificacion equipo
  914.                     //caso inscritos parejas clasificacion parejas
  915.                     $equipos = array();
  916.                     $esEquipo = ($competicion->getJugadores() > 2);
  917.                     //13/07/2018 Jose: Se saca fuera del for $njornadasAux = $this->em->getRepository(Clasificado::class)->getJornadasByClasificacionCouple($competicion, $esEquipo);
  918.                     //Tengo un listado ordenado por clasificaciones, de manera que tengo primero todos los clasificados ordenados de la 1Āŗ clasif, despues la 2Āŗ clasif y asi
  919.                     $clasificaciones[$clf->getId()] = array("clasificacion" => $clf->getNombre(), "modalidad" => $modalidad"calculo" => $clf->getCalculo()->getId(), "tipo" => $clf->getTipo(), "clasificados" => array(), "plantilla" => "Frontend:Clasificacion:clasificadosParejasEquipos_new-torneo.html.twig");
  920.                     $listado $this->em->getRepository(Clasificado::class)->getClasificacionParejaListado($id$competicion->getCalculo()->getId(), $clf->getId());
  921.                     foreach ($listado as $elemento) {
  922.                         //El listado me repite el jugador para la siguiente jornada, me aprovecho de eso
  923.                         //Al estar indexado, no repito los datos del jugador
  924.                         if ($posicionAnt != $elemento["posicion"]) {
  925.                             $clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]] = array("equipo" => $elemento["equipo"], "equipoId" => $elemento["equipoId"], "pareja" => $elemento["pareja"], "jornadas" => array());
  926.                             $posicionAnt $elemento["posicion"];
  927.                         }
  928.                         //Como estoy indexando arrays y no necesito repetir el jugador, aƱado tantas jornadas con sus resultados como necesite para ese jugador
  929.                         $clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]]["jornadas"][$elemento["jornada"]] = array(
  930.                             "bruto"     => $elemento["bruto"],
  931.                             "neto"      => $elemento["neto"],
  932.                             "contrapar" => $elemento["contrapar"],
  933.                             "ide"       => $elemento["ide"],
  934.                             "especial"  => $elemento["especial"]
  935.                         );
  936.                         //Para una competicion de equipos (clasif de equipos) ha ocurrido que (supongo con logica) ha publicado las clasificaciones con pareja = 0,
  937.                         //entocnes a la hora de buscar por equipo-pareja no encuentra los miembros, por lo que no los pintaba en el listado
  938.                         //Si filtramos de manera que si pareja = 0 coja todos los miembros del equipo, ya los debe de pintar
  939.                         if ($elemento["equipoId"]) {
  940.                             if ($elemento["pareja"] != 0) {
  941.                                 $miembros $this->em->getRepository(Inscrito::class)->getParejaByEquipoEntidad($elemento["pareja"], $elemento["equipoId"]);
  942.                             } else {
  943.                                 $miembros $this->em->getRepository(Inscrito::class)->findBy(["estado" => "pagado""equipo_entidad" => $elemento["equipoId"]]);
  944.                             }
  945.                             $indice $elemento["equipoId"];
  946.                         } else {
  947.                             if ($elemento["pareja"] != 0) {
  948.                                 $miembros $this->em->getRepository(Inscrito::class)->getInscritosParejaCompeticion($competicion->getId(), $elemento["pareja"], $elemento["equipo"]);
  949.                             } else {
  950.                                 $miembros $this->em->getRepository(Inscrito::class)->findBy(["estado" => "pagado""equipo" => $elemento["equipo"], "pareja" => $elemento["pareja"], "competicion" => $competicion]);
  951.                             }
  952.                             $indice $elemento["equipo"] . "-" $elemento["pareja"];
  953.                         }
  954.                         foreach ($miembros as $miembro) {
  955.                             $jugador $miembro->getJugador();
  956.                             $mid $miembro->getId();
  957.                             $equipos[$indice][$mid] = array(//indexamos el miembro por Id de inscrito para evitar que duplique, que es lo que ocurria
  958.                                 "idi"        => $mid,
  959.                                 "nombre"     => $jugador->getNombre(),
  960.                                 "apellidos"  => $jugador->getApellidos(),
  961.                                 "licencia"   => $jugador->getLicencia(),
  962.                                 "nacimiento" => $jugador->getFecha(),
  963.                                 "hcp"        => $miembro->getHcp(),
  964.                                 "pais"       => (!is_null($jugador->getPais())) ? $jugador->getPais()->getId() : "EX",
  965.                                 "nivel"      => (!is_null($miembro->getNivel())) ? $miembro->getNivel()->getId() : "M"
  966.                             );
  967.                         }
  968.                     }
  969.                     //$nombresEquipos = array();
  970.                     //$equiposEntidadAux = $this->em->getRepository(Equipo::class)->findEquiposEnClasificacion($clf->getId());
  971.                     //$equiposAux = $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($id);
  972.                     /* if (count($equiposEntidadAux) > 1) { //26/07/2018 Jose: Si hay equipos de la entidad nueva se hace mas facil
  973.                       foreach ($equiposEntidadAux as $idAux) {
  974.                       $equipo = $this->em->getRepository(Equipo::class)->find($idAux[1]); //Tengo que hacer el "[1]" por como lo devuelve la query.
  975.                       $indice = $equipo->getEquipo();
  976.                       if (!isset($equipos[$indice])) {
  977.                       $equipos[$indice] = array();
  978.                       $nombresEquipos[$indice] = $equipo->getNombre();
  979.                       }
  980.                       foreach ($equipo->getInscritos() as $inscrito) {
  981.                       $jugador = $inscrito->getJugador();
  982.                       $equipos[$indice][] = array(
  983.                       "idi" => $inscrito->getId(),
  984.                       "nombre" => $jugador->getNombre(),
  985.                       "apellidos" => $jugador->getApellidos(),
  986.                       "licencia" => $jugador->getLicencia(),
  987.                       "hcp" => $inscrito->getHcp(),
  988.                       "nivel" => (!is_null($inscrito->getNivel())) ? $inscrito->getNivel()->getId() : "M"
  989.                       );
  990.                       }
  991.                       }
  992.                       } else {
  993.                      */
  994.                     /* foreach ($equiposAux as $equipo) {//"equipo" es inscrito
  995.                       if (!$esEquipo) {
  996.                       $indice = $equipo->getPareja();
  997.                       } else {
  998.                       $indice = $equipo->getEquipo();
  999.                       }
  1000.                       if (!isset($equipos[$indice])) {
  1001.                       $equipos[$indice] = array();
  1002.                       $nombresEquipos[$indice] = $equipo->getNombreEquipo();
  1003.                       }
  1004.                       $jugador = $equipo->getJugador();
  1005.                       $equipos[$indice][] = array(
  1006.                       "idi" => $equipo->getId(),
  1007.                       "nombre" => $jugador->getNombre(),
  1008.                       "apellidos" => $jugador->getApellidos(),
  1009.                       "licencia" => $jugador->getLicencia(),
  1010.                       "nacimiento" => $jugador->getFecha(),
  1011.                       "hcp" => $equipo->getHcp(),
  1012.                       "nivel" => (!is_null($equipo->getNivel())) ? $equipo->getNivel()->getId() : "M"
  1013.                       );
  1014.                       } */
  1015.                     $equiposEntity $this->em->getRepository(Equipo::class)->findEquiposParticipantesTodos($competicion);
  1016.                     if ($equiposEntity) {
  1017.                         foreach ($equiposEntity as $equipo) {
  1018.                             $nombresEquipos[$equipo->getEquipo()] = $equipo->getNombre();
  1019.                         }
  1020.                     }
  1021.                     //}
  1022.                     $clasificaciones[$clf->getId()]["equipos"] = $equipos;
  1023.                     break;
  1024.             }
  1025.             $clasificaciones[$clf->getId()]["posicion_corte"] = $clf->getPosicionCorte();
  1026.             $clasificaciones[$clf->getId()]["etiqueta_corte"] = $clf->getEtiquetaCorte();
  1027.         }
  1028.         //13/07/2018 Jose: Se hace aqui porque no hay que calcularlo dentro de cada clasificacion
  1029.         $njornadasAux $this->em->getRepository(Clasificado::class)->getJornadasClasificacionByCompeticion($competicion);
  1030.         //Busco cuantas jornadas tiene cada clasificacion, lo necesito para la cabecera de las tablas
  1031.         $njornadas = array();
  1032.         foreach ($njornadasAux as $nja) {
  1033.             $njornadas[$nja['id']] = $nja['contador'];
  1034.         }
  1035.         // $zonasneutras = [];
  1036.         // $bajadas = [];
  1037.         // $znsAux = $this->em->getRepository(ZonaNeutra::class)->findBy([], ["tipoPrueba" => "ASC", "campoCorto" => "ASC", "son18hoyos" => "ASC", "categoria" => "ASC"]);
  1038.         // foreach ($znsAux as $zn) {
  1039.         //     $zonasneutras[$zn->getTipoPrueba()][intval($zn->getCampoCorto())][intval($zn->getSon18hoyos())][$zn->getCategoria()->getId()] = ['max' => $zn->getPuntosMax(), 'min' => $zn->getPuntosMin(), 'subida' => $zn->getSubidaInferiorZn()];
  1040.         // }
  1041.         // $bajadasAux = $this->em->getRepository(Bajada::class)->findBy([], array('tipoPrueba' => 'ASC', 'campoCorto' => 'ASC', 'categoria' => 'ASC', 'puntos' => 'ASC'));
  1042.         // foreach ($bajadasAux as $b) {
  1043.         //     $bajadas[$b->getTipoPrueba()][intval($b->getCampoCorto())][$b->getCategoria()->getId()][$b->getPuntos()] = $b->getBajada();
  1044.         // }
  1045.         // $categoriasHcp = $this->em->getRepository(CategoriaHandicap::class)->findAll();
  1046.         return $this->render("frontend/Clasificacion/clasificacion_base.html.twig", [
  1047.                     'clasificaciones' => $clasificaciones,
  1048.                     'competicion'     => $competicion,
  1049.                     'njornadas'       => $njornadas,
  1050.                     'numJugadores'    => $numJugadores,
  1051.                     'equipos'         => $equipos,
  1052.                     'nombresEquipos'  => $nombresEquipos,
  1053.                     'tipoClasif'      => $tipoClasif,
  1054.                         //            "zonasneutras" => $zonasneutras,
  1055.                         //            "bajadas" => $bajadas,
  1056.                         //            "categoriasHcp" => $categoriasHcp,
  1057.         ]);
  1058.     }
  1059.     /**
  1060.      * F-037 Listado ordenado de resultados hasta un hoyo concreto
  1061.      *
  1062.      * @Route("/getListadoDinamicoClasificacion", name="listado_dinamico", options={"expose"=true})
  1063.      *
  1064.      */
  1065.     public function listadoClasificacionDinamico(Request $request) {
  1066.         $id $request->request->get("id"0);
  1067.         $token $request->request->get("token"null);
  1068.         //comprobar competicion.
  1069.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  1070.         if (!$competicion) {
  1071.             return $this->render("frontend/Clasificacion/clasificacionListadoDinamico.html.twig", array('listado' => []));
  1072.         }
  1073.         if (!$this->util->checkTokenValidIframe($competicion$token)) {
  1074.             return new JsonResponse(-1);
  1075.         }
  1076.         $nJor $this->em->getRepository(Jornada::class)->getCountPorCompeticion($competicion);
  1077.         $clasificacionId $request->request->get("clasificacion");
  1078.         $clasificacion $this->em->getRepository(Clasificacion::class)->find($clasificacionId);
  1079.         if (is_null($clasificacion)) {
  1080.             return $this->render("frontend/Clasificacion/clasificacionListadoDinamico.html.twig", array('listado' => []));
  1081.         }
  1082.         $orden $request->request->get("orden"$nJor);
  1083.         $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $competicion'orden' => intval($orden)));
  1084.         if (!$jornada) {
  1085.             return $this->render("frontend/Clasificacion/clasificacionListadoDinamico.html.twig", array('listado' => []));
  1086.         }
  1087.         $hoyo $request->request->get("hoyo"18);
  1088.         $inscritos $this->em->getRepository(Inscrito::class)->getPlayersByCompeticion($competicion);
  1089.         foreach ($inscritos as $inscrito) {
  1090.             $hcpJuego unserialize($inscrito->getHcpJuego());
  1091.             if (isset($hcpJuego[$jornada->getId()])) {
  1092.                 $hcpJuegoJornada $hcpJuego[$jornada->getId()];
  1093.                 $hcpJuegoNuevaTabla $this->em->getRepository(HcpJuego::class)->findOneBy(array('jornada' => $jornada'inscrito' => $inscrito));
  1094.                 if (is_null($hcpJuegoNuevaTabla)) {
  1095.                     $hcpJuegoNuevaTabla = new HcpJuego();
  1096.                     $hcpJuegoNuevaTabla->setHcp($hcpJuegoJornada);
  1097.                     $hcpJuegoNuevaTabla->setInscrito($inscrito);
  1098.                     $hcpJuegoNuevaTabla->setJornada($jornada);
  1099.                     $this->em->persist($hcpJuegoNuevaTabla);
  1100.                     $this->em->flush();
  1101.                 }
  1102.             }
  1103.         }
  1104.         //Si es individual o si es Four Ball o Canada que se guarda tambiĆ©n la tarjeta individual del jugador.
  1105.         if ($clasificacion->getModalidad() == "individual" || $jornada->getModalidad()->getId() == "P" || $jornada->getModalidad()->getId() == "C") {
  1106.             $listado $this->em->getRepository(Resultado::class)->getListadoAcumuladoHoyos($clasificacion->getId(), $jornadaintval($hoyo), $clasificacion->getCalculo()->getId(), $competicion->getFormula()->getId());
  1107.         } else {
  1108.             /*
  1109.              * Habria que hacer la query para clasificar individualmente a los miembros de la pareja en caso de haberse hecho una clasificacion individual de una Xsome.
  1110.              */
  1111.         }
  1112.         return $this->render("frontend/Clasificacion/clasificacionListadoDinamico.html.twig", [
  1113.                     'listado'       => $listado,
  1114.                     'hoyo'          => $hoyo,
  1115.                     'competicion'   => $competicion,
  1116.                     'njornadas'     => $nJor,
  1117.                     'clasificacion' => $clasificacion,
  1118.                     'orden'         => $orden
  1119.         ]);
  1120.     }
  1121.     /**
  1122.      * F-038 Listado ordenado de resultados de parejas hasta un hoyo concreto variable
  1123.      *
  1124.      * @Route("/getListadoDinamicoClasificacionPareja", name="listado_dinamico_pareja", options={"expose"=true})
  1125.      *
  1126.      */
  1127.     public function listadoClasificacionDinamicoPareja(Request $request) {
  1128.         $id $request->request->get("id");
  1129.         //comprobar competicion.
  1130.         $competicion $this->em->getRepository(Competicion::class)->findOneById($id);
  1131.         if (!$competicion) {
  1132.             return new JsonResponse(-1);
  1133.         }
  1134.         $nJor $this->em->getRepository(Jornada::class)->getCountPorCompeticion($competicion);
  1135.         $numJugadores $competicion->getJugadores();
  1136.         $clasificacionId $request->request->get("clasificacion");
  1137.         $clasificacion $this->em->getRepository(Clasificacion::class)->findOneById($clasificacionId);
  1138.         if (is_null($clasificacion)) {
  1139.             return new JsonResponse(-1);
  1140.         }
  1141.         $orden $request->request->get("orden");
  1142.         if (is_null($orden)) {
  1143.             $orden $nJor;
  1144.         }
  1145.         $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $competicion'orden' => intval($orden)));
  1146.         if (!$jornada) {
  1147.             return new JsonResponse(-1);
  1148.         }
  1149.         $hoyo $request->request->get("hoyo"18);
  1150.         $inscritos $this->em->getRepository(Inscrito::class)->getPlayersByCompeticion($competicion);
  1151.         $nombresEquipos = array();
  1152.         foreach ($inscritos as $inscrito) {
  1153.             $hcpJuego unserialize($inscrito->getHcpJuego());
  1154.             if (isset($hcpJuego[$jornada->getId()])) {
  1155.                 $hcpJuegoJornada $hcpJuego[$jornada->getId()];
  1156.                 $hcpJuegoNuevaTabla $this->em->getRepository(HcpJuego::class)->findOneBy(array('jornada' => $jornada'inscrito' => $inscrito));
  1157.                 if (is_null($hcpJuegoNuevaTabla)) {
  1158.                     $hcpJuegoNuevaTabla = new HcpJuego();
  1159.                     $hcpJuegoNuevaTabla->setHcp($hcpJuegoJornada);
  1160.                     $hcpJuegoNuevaTabla->setInscrito($inscrito);
  1161.                     $hcpJuegoNuevaTabla->setJornada($jornada);
  1162.                     $this->em->persist($hcpJuegoNuevaTabla);
  1163.                     $this->em->flush();
  1164.                 }
  1165.             }
  1166.             if ($numJugadores != 2) {
  1167.                 if (!isset($nombresEquipos[$inscrito->getEquipo()])) {
  1168.                     $nombresEquipos[$inscrito->getEquipo()] = $inscrito->getNombreEquipo();
  1169.                 }
  1170.             }
  1171.         }
  1172.         if ($clasificacion->getModalidad() == "pareja" || $clasificacion->getModalidad() == "equipo") {
  1173.             $listado $this->em->getRepository(Resultado::class)->getAcumuladoHoyosEquipo($clasificacion->getId(), $jornadaintval($hoyo), $clasificacion->getCalculo()->getId());
  1174.         } else {
  1175.             /*
  1176.              * Habria que hacer la query para buscar la suma de cada miembro de la pareja.
  1177.              */
  1178.         }
  1179.         $datosJugadores = array();
  1180.         foreach ($listado as $equipo) {
  1181.             $datosJugadores[$equipo["equipo"]] = $this->em->getRepository(Inscrito::class)->getDatosHcpJuegoByEquipo($equipo["equipo"], $jornada);
  1182.         }
  1183.         return $this->render("frontend/Clasificacion/clasificacionListadoDinamicoPareja.html.twig", array(
  1184.                     'listado'        => $listado,
  1185.                     'datosJugadores' => $datosJugadores,
  1186.                     'hoyo'           => $hoyo,
  1187.                     'competicion'    => $competicion,
  1188.                     'njornadas'      => $nJor,
  1189.                     'clasificacion'  => $clasificacion,
  1190.                     'numJugadores'   => $numJugadores,
  1191.                     'nombresEquipos' => $nombresEquipos,
  1192.                     'orden'          => $orden
  1193.         ));
  1194.     }
  1195.     /**
  1196.      * F-052 Verificacion del captcha
  1197.      *
  1198.      * @param type $recaptcha
  1199.      * @return type
  1200.      *
  1201.      */
  1202.     function captchaverify($recaptcha) {
  1203.         $url "https://www.google.com/recaptcha/api/siteverify";
  1204.         $ch curl_init();
  1205.         curl_setopt($chCURLOPT_URL$url);
  1206.         curl_setopt($chCURLOPT_HEADER0);
  1207.         curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
  1208.         curl_setopt($chCURLOPT_POSTtrue);
  1209.         curl_setopt($chCURLOPT_POSTFIELDS, array(
  1210.             "secret"   => "6Ld1hVIUAAAAAPgO50zNtsjjVDmorOUMwMCf8J_U""response" => $recaptcha));
  1211.         $response curl_exec($ch);
  1212.         curl_close($ch);
  1213.         $data json_decode($response);
  1214.         return $data->success;
  1215.     }
  1216.     /**
  1217.      * F-060 Estadisticas de una partida tras haber sido jugada [EN DESUSO]
  1218.      *
  1219.      * @Route("/match/{token}/{publi}", name="_match", options={"expose"=true}, defaults={"publi" = 0})
  1220.      */
  1221.     public function partidaInscrito($token$publi) {
  1222.         // TODO: COMPROBAR QUE ESTƉ EN DESUSO Y ELIMINAR O RECUPERAR EN TAL CASO
  1223.         $i 0;
  1224.         $enc false;
  1225.         $partidas $this->em->getRepository(PartidaHorario::class)->findByToken($token);
  1226.         $tam count($partidas);
  1227.         while ($i $tam && !$enc) {
  1228.             $partida $partidas[$i];
  1229.             $enc = (strcmp($partida->getToken(), $token) == 0); //buscamos la partida exacta (antes habia un findoneby pero es caseinsensitive, por lo que no nos vale)
  1230.             $i++;
  1231.         }
  1232.         if (!$enc) {
  1233.             $this->addFlash('error'"No existe la partida");
  1234.             return $this->redirect($this->generateUrl('competiciones_comite'));
  1235.         }
  1236.         $jornada $partida->getHorario()->getJornada();     //Cuidado si horario es nulo porque no exista $partida
  1237.         if (!$jornada) {
  1238.             $this->addFlash('error'"No existe la Jornada");
  1239.             return $this->redirect($this->generateUrl('competiciones_comite'));
  1240.         }
  1241.         //Deshabilitamos el filtro del softdelete, ya que como no tenemos el ID de la competicion no podemos hacer su busqueda explicita para la comprobacion,
  1242.         //Al deshabilitarse la competicion va a existir, pero va a estar marcado el softdelete, por lo que si es asĆ­, avisamos de que estĆ” borrada
  1243.         $this->em->getFilters()->disable('softdeleteable');
  1244.         $competicion $jornada->getCompeticion();
  1245.         if (!$competicion || !is_null($competicion->getDeletedAt())) {
  1246.             $this->addFlash('error''No se ha encontrado la competición');
  1247.             return $this->redirect($this->generateUrl('competiciones_comite'));
  1248.         }
  1249.         $this->em->getFilters()->enable('softdeleteable');
  1250.         //Si no tenemos resultados, rediigimos a la pagina de frontend
  1251.         if (!$this->em->getRepository(Competicion::class)->hasResultados($competicion->getId())) {
  1252.             $this->addFlash('error''Información de partida aĆŗn no disponible. IntĆ©ntelo mĆ”s tarde');
  1253.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competicion->getId())));
  1254.         }
  1255.         $jornadaId $jornada->getId();
  1256.         $modalidad $jornada->getModalidad()->getId();
  1257.         $jugadoresAux $this->em->getRepository(JugadorHorario::class)->findBy(['partida' => $partida->getId()], ['inscrito' => 'ASC']);     //ordenamos por ID inscrito para mantener siempre el orden
  1258.         $equipos = array();
  1259.         $hcpJs = array();
  1260.         $contrapares = array();
  1261.         $resumen = array();
  1262.         $valores = ["eagles" => -2"birdies" => -1"pares" => 0"bogeys" => 1];      //Falta resultado Peor (> +1)
  1263.         $acumulados = ["eagles" => 0"birdies" => 0"pares" => 0"bogeys" => 0"peor" => 0];      //Falta resultado Peor (> +1)
  1264.         //$calculo = ($competicion->getCalculo()->getId() == "H" ? "Hcp" : "Scratch" );
  1265.         //Si es medal play es susceptible de no tener los contrapares
  1266.         //Por lo tanto preparamos los datos que nos hacen falta
  1267.         if ($competicion->getFormula()->getId() == 'M') {
  1268.             $jcs $this->em->getRepository(JornadaConfig::class)->findByJornada($jornada);
  1269.             $hoyosDatos = array();
  1270.             $hoyosDatosAux = array();
  1271.             foreach ($jcs as $jc) {
  1272.                 $jconfig_cat $jc->getCategoria()->getId();
  1273.                 $cc $this->em->getRepository(CategoriaConfig::class)->findOneByCategoria($jconfig_cat);
  1274.                 if ($cc->getSexo() == "" || $cc->getSexo() == "sin especificar") {
  1275.                     $cc->setSexo('masculino');
  1276.                 }
  1277.                 $hoyosDatosAux $this->em->getRepository(Trazado::class)->findDatosHoyoByTrazado($jornada->getTrazado()->getNumero(), $jc->getBarra()->getId(), $cc->getSexo());
  1278.                 foreach ($hoyosDatosAux as $h) {
  1279.                     $hoyosDatos[$cc->getSexo()][$jconfig_cat][$h["numero"]] = $h;
  1280.                 }
  1281.             }
  1282.         }
  1283.         if ($modalidad == "I") {
  1284.             //AƱadido para calculo de contrapares que no tengamos todavia de medal play.
  1285.             if ($jornada->getCompeticion()->getFormula()->getId() == 'M') {
  1286.                 foreach ($jugadoresAux as $h) {
  1287.                     $insc $h->getInscrito();
  1288.                     $inscId $insc->getId();
  1289.                     $resultados $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId"inscrito" => $inscId], ['hoyo' => 'ASC']);
  1290.                     foreach ($resultados as $r) {
  1291.                         if (is_null($r->getContraparScratch())) {
  1292.                             $par $hoyosDatos[$insc->getJugador()->getSexo()][$insc->getCategoria()->getId()][$r->getHoyo()]["par"];
  1293.                             $r->setContraparScratch($r->getScratch() - $par);
  1294.                             $r->setContraparHcp($r->getHcp() - $par);
  1295.                         }
  1296.                     }
  1297.                 }
  1298.                 $this->em->flush();
  1299.             }
  1300.             foreach ($jugadoresAux as $h) {
  1301.                 $insc $h->getInscrito();
  1302.                 $inscId $insc->getId();
  1303.                 $jorConfig $this->em->getRepository(JornadaConfig::class)->findOneBy(["jornada" => $jornadaId"categoria" => $insc->getCategoria()]);
  1304.                 $tipo_hoyos $jorConfig->getHoyos();
  1305.                 $limits explode('-'$tipo_hoyos);
  1306.                 $esp $this->em->getRepository(Resultado::class)->findResultadoEspecial($inscId$jornadaId);   //buscamos si tiene resultado especial para no incluirlo
  1307.                 if (!$esp) {
  1308.                     $hoyos array_fill($limits[0], ($limits[1] - $limits[0]) + 1true);
  1309.                     $hcpJs[$inscId] = $this->em->getRepository(HcpJuego::class)->findOneByInscrito($insc);
  1310.                     foreach ($valores as $k => $v) {
  1311.                         $resultados $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId"inscrito" => $inscId"contrapar_scratch" => $v], ['hoyo' => 'ASC']);
  1312.                         $valor count($resultados);
  1313.                         $contrapares[$inscId][$k] = $valor;
  1314.                         $acumulados[$k] += $valor;
  1315.                         $resumen[$inscId][$k] = [];
  1316.                         foreach ($resultados as $resu) {
  1317.                             $resumen[$inscId][$k][] = $resu->getHoyo();
  1318.                             //eliminamos el hoyo, para saber cuales nos quedan sin usar, esos seran los resultados peores (ya que no son ni par, ni eagle, ni birdie ni bogey)
  1319.                             unset($hoyos[$resu->getHoyo()]);
  1320.                         }
  1321.                     }
  1322.                     //Lo que nos queda son los resultados peores
  1323.                     $peor count($hoyos);
  1324.                     $contrapares[$inscId]["peor"] = $peor;
  1325.                     $acumulados["peor"] += $peor;
  1326.                     $resumen[$inscId]["peor"] = [];
  1327.                     foreach ($hoyos as $hoyo => $ho) {
  1328.                         $resumen[$inscId]["peor"][] = $hoyo;
  1329.                     }
  1330.                     $jugadores[] = $h;
  1331.                 }
  1332.             }
  1333.         } else {
  1334.             //AƱadido para calculo de contrapares que no tengamos todavia de medal play.
  1335.             if ($jornada->getCompeticion()->getFormula()->getId() == 'M' && in_array($modalidad, ["C""P"])) {
  1336.                 $teams = array();
  1337.                 foreach ($jugadoresAux as $h) {
  1338.                     $equipo $h->getEquipo();
  1339.                     $pareja $h->getPareja();
  1340.                     $teams[$h->getEquipo() . "-" $h->getPareja()] = ["equipo" => $equipo"pareja" => $pareja];
  1341.                     $inscritos $this->em->getRepository(Inscrito::class)->findBy(['equipo' => $equipo'pareja' => $pareja'competicion' => $jornada->getCompeticion()->getId()], ['id' => 'ASC']);
  1342.                     $resultadosMiembros = array();
  1343.                     foreach ($inscritos as $inscrito) {
  1344.                         $resultados $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId"inscrito" => $inscrito->getId()], ['hoyo' => 'ASC']);
  1345.                         foreach ($resultados as $r) {
  1346.                             if (is_null($r->getContraparScratch())) {
  1347.                                 $par $hoyosDatos[$inscrito->getJugador()->getSexo()][$inscrito->getCategoria()->getId()][$r->getHoyo()]["par"];
  1348.                                 $r->setContraparScratch($r->getScratch() - $par);
  1349.                                 $r->setContraparHcp($r->getHcp() - $par);
  1350.                             }
  1351.                         }
  1352.                         array_push($resultadosMiembros$resultados);
  1353.                     }
  1354.                     $resultadosPareja $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId'equipo' => $equipo'pareja' => $pareja], ['hoyo' => 'ASC']);
  1355.                     foreach ($resultadosPareja as $loop => $rp) {
  1356.                         if (is_null($rp->getContraparScratch())) {
  1357.                             $m1 $resultadosMiembros[0][$loop];
  1358.                             $m2 $resultadosMiembros[1][$loop];
  1359.                             if ($modalidad == "C") {
  1360.                                 $rp->setContraparScratch($m1->getContraparScratch() + $m2->getContraparScratch());
  1361.                                 $rp->setContraparHcp($m1->getContraparHcp() + $m2->getContraparHcp());
  1362.                             } elseif ($modalidad == "P") {
  1363.                                 $rp->setContraparScratch(min($m1->getContraparScratch(), $m2->getContraparScratch()));
  1364.                                 $rp->setContraparHcp(min($m1->getContraparHcp(), $m2->getContraparHcp()));
  1365.                             }
  1366.                         }
  1367.                     }
  1368.                 }
  1369.                 $this->em->flush();
  1370.             }
  1371.             foreach ($jugadoresAux as $h) {
  1372.                 $equipo $h->getEquipo();
  1373.                 $pareja $h->getPareja();
  1374.                 $esp $this->em->getRepository(Resultado::class)->findResultadoEspecialEquipoPareja($equipo$pareja$jornadaId);
  1375.                 if (!$esp) {
  1376.                     $jugadores[$equipo "-" $pareja] = "";
  1377.                     $inscritos $this->em->getRepository(Inscrito::class)->findBy(['equipo' => $equipo'pareja' => $pareja'competicion' => $jornada->getCompeticion()->getId()], ['id' => 'ASC']);
  1378.                     foreach ($inscritos as $inscrito) {
  1379.                         $jugadores[$equipo "-" $pareja] .= $inscrito->getJugador()->getNombre() . " - ";
  1380.                     }
  1381.                     $jugadores[$equipo "-" $pareja] = substr($jugadores[$equipo "-" $pareja], 0strlen($jugadores[$equipo "-" $pareja]) - 3);
  1382.                     $jorConfig $this->em->getRepository(JornadaConfig::class)->findOneBy(["jornada" => $jornadaId"categoria" => $inscrito->getCategoria()]);
  1383.                     $tipo_hoyos $jorConfig->getHoyos();
  1384.                     $limits explode('-'$tipo_hoyos);
  1385.                     $hcpJs[$equipo "-" $pareja] = $this->em->getRepository(HcpJuego::class)->findOneBy(['equipo' => $equipo'pareja' => $pareja'jornada' => $jornada->getId()]);
  1386.                     $equipos[$equipo "-" $pareja] = $this->em->getRepository(Inscrito::class)->findOneBy(['equipo' => $equipo'pareja' => $pareja'competicion' => $competicion->getId()]);
  1387.                     $hoyos array_fill($limits[0], ($limits[1] - $limits[0]) + 1true);
  1388.                     //Calculo de los detalles por hoyo
  1389.                     foreach ($valores as $k => $v) {
  1390.                         $resultados $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId'equipo' => $equipo'pareja' => $pareja"contrapar_scratch" => $v], ['hoyo' => 'ASC']);
  1391.                         $valor count($resultados);
  1392.                         $contrapares[$equipo "-" $pareja][$k] = $valor;
  1393.                         $acumulados[$k] += $valor;
  1394.                         $resumen[$equipo "-" $pareja][$k] = [];
  1395.                         foreach ($resultados as $resu) {
  1396.                             $resumen[$equipo "-" $pareja][$k][] = $resu->getHoyo();
  1397.                             //eliminamos el hoyo, para saber cuales nos quedan sin usar, esos seran los resultados peores (ya que no son ni par, ni eagle, ni birdie ni bogey)
  1398.                             unset($hoyos[$resu->getHoyo()]);
  1399.                         }
  1400.                     }
  1401.                     //Lo que nos queda son los resultados peores
  1402.                     $peor count($hoyos);
  1403.                     $contrapares[$equipo "-" $pareja]["peor"] = $peor;
  1404.                     $acumulados["peor"] += $peor;
  1405.                     $resumen[$equipo "-" $pareja]["peor"] = [];
  1406.                     foreach ($hoyos as $hoyo => $ho) {
  1407.                         $resumen[$equipo "-" $pareja]["peor"][] = $hoyo;
  1408.                     }
  1409.                 }
  1410.             }
  1411.         }
  1412.         // 2023/08/07 esto esta obsoleto a dia de hoy (deberia haberse ocultado en 2023/05/08)
  1413.         // $url = $this->util->acortarUrl('_match', array('token' => $token));
  1414.         return $this->render("frontend/Competicion/match.html.twig", [
  1415.                     'competicion' => $competicion,
  1416.                     'jugadores'   => $jugadores,
  1417.                     'hcpJs'       => $hcpJs,
  1418.                     'equipos'     => $equipos,
  1419.                     'ccc'         => $publi,
  1420.                     'contrapares' => $contrapares,
  1421.                     'acumulados'  => $acumulados,
  1422.                     'resumen'     => $resumen,
  1423.                     'partida'     => $partida,
  1424.                     // 'url'         => $url,
  1425.                     'modalidad'   => $modalidad,
  1426.                     'limits'      => $limits
  1427.         ]);
  1428.     }
  1429.     /**
  1430.      * F-062
  1431.      *
  1432.      * @Route("/pago/{idi}/tpv/{idp}", name="pago_tpv")
  1433.      */
  1434.     public function tpv($idi$idp) {
  1435.         $params = array();
  1436.         $inscrito $this->em->getRepository(Inscrito::class)->find($idi);
  1437.         if (!$inscrito) {
  1438.             throw new NotFoundHttpException("No existe el inscrito");
  1439.         }
  1440.         $competicion $inscrito->getCompeticion();
  1441.         if (!$competicion) {
  1442.             $this->addFlash(
  1443.                     'error'"El torneo buscado no existe");
  1444.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  1445.         }
  1446.         $pedido $this->em->getRepository(Pedido::class)->find($idp);
  1447.         if (!$pedido) {
  1448.             //poner que redirija a competicion en un mensaje de esos flash
  1449.             //y que ponga el inscrito y el pedido a "Error"
  1450.             throw new NotFoundHttpException("No existe el pedido asociado a la inscripcion");
  1451.         }
  1452.         $secret $this->getParameter('secret');
  1453.         $redsys = new RedsysAPI();
  1454.         $redsys->setParameter("DS_MERCHANT_AMOUNT"intval(number_format($pedido->getImporte() * 1000"""")));
  1455.         $redsys->setParameter("DS_MERCHANT_ORDER"strval($inscrito->getPedido()->getNumero()));
  1456.         $redsys->setParameter("DS_MERCHANT_CURRENCY"$this->getParameter('tpv.currency'));
  1457.         $redsys->setParameter("DS_MERCHANT_TRANSACTIONTYPE"0);        //0 = Pago
  1458.         /*
  1459.           if (strpos($competicion->getOrganizador()->getId(), "AM") !== false) {
  1460.           $usuario = $this->em->getRepository(User::class)->findOneByUsername("AM00");
  1461.           } else {
  1462.           $usuario = $this->em->getRepository(User::class)->findOneByUsername($competicion->getOrganizador()->getId());
  1463.           }
  1464.          */
  1465.         $fechaTPVDesprosa = new \DateTime("2021-04-20 10:00:00");    //Desprosa es el nombre de la empresa y 20 de mayo es cuando se hizo este codigo
  1466.         $fechaTPVSherry = new \DateTime("2022-03-14 00:00:00");      //Aunque el cambio se hace el dia 09/03/2022, hay competiciones abiertas hasta el dia 12, por lo que se espera a que se cierren
  1467.         $fechaTPVAlhaurin = new \DateTime("2023-05-19 00:00:00");      //Peticion de la solicitud
  1468.         $idComp $competicion->getId();
  1469.         //El pago, lo hace LV05 o CM81 o lo hacemos con nuestra pasarela
  1470.         //IMportante!!! En la configuracion del TPV (en la web del redsys) debe de aparecer como "Asincrona"
  1471.         $orgnzdr "AM00";
  1472.         switch (trim($competicion->getOrganizador()->getId())) {
  1473.             case "LV05":
  1474.                 $orgnzdr "LV05";
  1475.                 break;
  1476.             case "GALN":
  1477.                 $orgnzdr "GALN";
  1478.                 break;
  1479.             case "CMC8":
  1480.                 $orgnzdr "CMC8";
  1481.                 if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
  1482.                     $orgnzdr "AM00";
  1483.                 }
  1484.                 break;
  1485.             case "CM81":
  1486.                 $orgnzdr "CM81";
  1487.                 if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
  1488.                     $orgnzdr "AM00";
  1489.                 }
  1490.                 break;
  1491.             case "AM15":
  1492.                 $orgnzdr "AM15";
  1493.                 if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
  1494.                     $orgnzdr "AM00";
  1495.                 }
  1496.                 break;
  1497.             case "AMC3":
  1498.                 $orgnzdr "AMC3";
  1499.                 if ($competicion->getInicio()->format("U") < $fechaTPVSherry->format("U")) {
  1500.                     $orgnzdr "AM00";
  1501.                 }
  1502.                 break;
  1503.             case "AM22":
  1504.                 $orgnzdr "AM22";
  1505.                 if ($competicion->getInicio()->format("U") < $fechaTPVAlhaurin->format("U")) {
  1506.                     $orgnzdr "AM00";
  1507.                 }
  1508.                 break;
  1509.             default:
  1510.                 $orgnzdr "AM00";
  1511.                 break;
  1512.         }
  1513.         $usuario $this->em->getRepository(User::class)->findOneByUsername($orgnzdr);
  1514.         $usuarioTpv $usuario->getTpv();
  1515.         $merchantCode $redsys->merchantCodeFromUser($usuarioTpv$secret);
  1516.         $terminal $redsys->terminalFromUser($usuarioTpv$secret);
  1517.         $redsys->setParameter("DS_MERCHANT_MERCHANTCODE"$merchantCode);
  1518.         $redsys->setParameter("DS_MERCHANT_TERMINAL"$terminal);
  1519.         $params['Ds_Merchant_KEY_256'] = $redsys->keyFromUser($usuarioTpv$secret); //Key de REAL del TPV correspondiente
  1520.         //lineas originales
  1521.         //$params['Ds_Merchant_KEY_256'] = $this->getParameter('tpv.key_test_256');   //Key de TEST.
  1522.         //$params['Ds_Merchant_KEY_256'] = $this->getParameter('tpv.key_256');   //Key de REAL. Codigo antiguo
  1523.         //$redsys->setParameter("DS_MERCHANT_MERCHANTCODE", $this->getParameter('tpv.merchant_code'));
  1524.         //$redsys->setParameter("DS_MERCHANT_TERMINAL", $this->getParameter('tpv.terminal'));
  1525.         //$dire = str_replace("https", "http", $this->generateUrl('pago_procesar', array(), UrlGeneratorInterface::ABSOLUTE_URL));   //Como el SSL de la pagina es Lets encrypt y el banco no lo admite, tenemos que hacerlo por HTTP, y no por HTTPS para evitar errores
  1526.         $dire $this->generateUrl('pago_procesar', array(), UrlGeneratorInterface::ABSOLUTE_URL);
  1527.         $redsys->setParameter("DS_MERCHANT_MERCHANTURL"$dire);    //URL de mi pagina para procesar el pago
  1528.         //$redsys->setParameter("DS_MERCHANT_MERCHANTURL", $this->generateUrl('pago_procesar', array(), UrlGeneratorInterface::ABSOLUTE_URL));    //URL de mi pagina para procesar el pago
  1529.         $idInsc = ($competicion->getJugadores() == 1) ? $inscrito->getId() : 0;
  1530.         $redsys->setParameter("DS_MERCHANT_URLOK"$this->generateUrl('pago_terminado', array('token' => 'success''id' => $idComp'idi' => $idInsc), UrlGeneratorInterface::ABSOLUTE_URL));
  1531.         $redsys->setParameter("DS_MERCHANT_URLKO"$this->generateUrl('pago_terminado', array('token' => 'fail''id' => $idComp'idi' => $idInsc), UrlGeneratorInterface::ABSOLUTE_URL));
  1532.         $redsys->setParameter("DS_MERCHANT_PAYMETHODS""C");   //solo pago con tarjeta
  1533.         $redsys->setParameter("DS_MERCHANT_MERCHANTNAME"$this->getParameter('tpv.merchant_name'));
  1534.         $redsys->setParameter("DS_MERCHANT_MERCHANTDATA"base64_encode(json_encode(array('idi' => $idi'idp' => $idp))));
  1535.         $params['Ds_Merchant_URL_Pago'] = $this->getParameter('tpv.url');
  1536.         $params['Ds_SignatureVersion'] = $this->getParameter('tpv.version');      //Version SHA256 --> esto no se usa
  1537.         $params['Ds_MerchantParameters'] = $redsys->createMerchantParameters();              //Parametros, una vez codificados
  1538.         $params['Ds_Signature'] = $redsys->createMerchantSignature($params['Ds_Merchant_KEY_256']);                     //Firma de SHA256
  1539.         return $this->render('frontend/Default/tpv.html.twig'$params);
  1540.     }
  1541.     /**
  1542.      * F-063 Genera el formulario de devolución del banco
  1543.      *
  1544.      * @Route("/devolucion/{idi}/tpv/{idp}", name="devolucion_tpv")
  1545.      */
  1546.     public function tpvDevolucion($idi$idp) {
  1547.         $params = array();
  1548.         $inscrito $this->em->getRepository(Inscrito::class)->find($idi);
  1549.         if (!$inscrito) {
  1550.             throw new NotFoundHttpException("No existe el inscrito");
  1551.         }
  1552.         $competicion $inscrito->getCompeticion();
  1553.         if (!$competicion) {
  1554.             $this->addFlash(
  1555.                     'error'"El torneo buscado no existe");
  1556.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  1557.         }
  1558.         $pedido $this->em->getRepository(Pedido::class)->find($idp);
  1559.         if (!$pedido) {
  1560.             //poner que redirija a competicion en un mensaje de esos flash
  1561.             //y que ponga el inscrito y el pedido a "Error"
  1562.             throw new NotFoundHttpException("No existe el pedido asociado a la inscripcion");
  1563.         }
  1564.         $secret $this->getParameter('secret');
  1565.         $importeDev intval(number_format($pedido->getImporte() * 1000""""));
  1566.         $redsys = new RedsysAPI();
  1567.         $redsys->setParameter("DS_MERCHANT_AMOUNT"$importeDev);
  1568.         $redsys->setParameter("DS_MERCHANT_ORDER"$this->util->reformatPedido($pedido));
  1569.         $redsys->setParameter("DS_MERCHANT_CURRENCY"$this->getParameter('tpv.currency'));
  1570.         $redsys->setParameter("DS_MERCHANT_TRANSACTIONTYPE"3);        //3 = Devolucion
  1571.         /*
  1572.           if (strpos($competicion->getOrganizador()->getId(), "AM") !== false) {
  1573.           $usuario = $this->em->getRepository(User::class)->findOneByUsername("AM00");
  1574.           } else {
  1575.           $usuario = $this->em->getRepository(User::class)->findOneByUsername($competicion->getOrganizador()->getId());
  1576.           }
  1577.          */
  1578.         $fechaTPVDesprosa = new \DateTime("2021-04-20 10:00:00");    //Desprosa es el nombre de la empresa y 20 de mayo es cuando se hizo este codigo
  1579.         $fechaTPVSherry = new \DateTime("2022-03-14 00:00:00");      //Aunque el cambio se hace el dia 09/03/2022, hay competiciones abiertas hasta el dia 12, por lo que se espera a que se cierren
  1580.         $fechaTPVAlhaurin = new \DateTime("2023-05-19 00:00:00");
  1581.         $idComp $competicion->getId();
  1582.         //El pago, lo hace LV05 o CM81 o lo hacemos con nuestra pasarela
  1583.         $orgnzdr "AM00";
  1584.         switch (trim($competicion->getOrganizador()->getId())) {
  1585.             case "LV05":
  1586.                 $orgnzdr "LV05";
  1587.                 break;
  1588.             case "GALN":
  1589.                 $orgnzdr "GALN";
  1590.                 break;
  1591.             case "CMC8":
  1592.                 $orgnzdr "CMC8";
  1593.                 if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
  1594.                     $orgnzdr "AM00";
  1595.                 }
  1596.                 break;
  1597.             case "CM81":
  1598.                 $orgnzdr "CM81";
  1599.                 if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
  1600.                     $orgnzdr "AM00";
  1601.                 }
  1602.                 break;
  1603.             case "AM15":
  1604.                 $orgnzdr "AM15";
  1605.                 if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
  1606.                     $orgnzdr "AM00";
  1607.                 }
  1608.                 break;
  1609.             case "AMC3":
  1610.                 $orgnzdr "AMC3";
  1611.                 if ($competicion->getInicio()->format("U") < $fechaTPVSherry->format("U")) {
  1612.                     $orgnzdr "AM00";
  1613.                 }
  1614.                 break;
  1615.             case "AM22":
  1616.                 $orgnzdr "AM22";
  1617.                 if ($competicion->getInicio()->format("U") < $fechaTPVAlhaurin->format("U")) {
  1618.                     $orgnzdr "AM00";
  1619.                 }
  1620.                 break;
  1621.             default:
  1622.                 $orgnzdr "AM00";
  1623.                 break;
  1624.         }
  1625.         $usuario $this->em->getRepository(User::class)->findOneByUsername($orgnzdr);
  1626.         $usuarioTpv $usuario->getTpv();
  1627.         $redsys->setParameter("DS_MERCHANT_MERCHANTCODE"$redsys->merchantCodeFromUser($usuarioTpv$secret));
  1628.         $redsys->setParameter("DS_MERCHANT_TERMINAL"$redsys->terminalFromUser($usuarioTpv$secret));
  1629.         $params['Ds_Merchant_KEY_256'] = $redsys->keyFromUser($usuarioTpv$secret); //Key de REAL del TPV correspondiente
  1630.         //lineas originales
  1631.         //$redsys->setParameter("DS_MERCHANT_MERCHANTCODE", $this->getParameter('tpv.merchant_code'));
  1632.         //$redsys->setParameter("DS_MERCHANT_TERMINAL", $this->getParameter('tpv.terminal'));
  1633.         //$dire = str_replace("https", "http", $this->generateUrl('competicion_cancelainscrito', array('id' => $idComp, 'pedido' => $idp), UrlGeneratorInterface::ABSOLUTE_URL));   //Como el SSL de la pagina es Lets encrypt y el banco no lo admite, tenemos que hacerlo por HTTP, y no por HTTPS para evitar errores
  1634.         $dire $this->generateUrl('competicion_cancelainscrito', array('id' => $idComp'pedido' => $idp), UrlGeneratorInterface::ABSOLUTE_URL);
  1635.         $redsys->setParameter("DS_MERCHANT_MERCHANTURL"$dire);    //URL de mi pagina para procesar el pago
  1636.         //$redsys->setParameter("DS_MERCHANT_MERCHANTURL", $this->generateUrl('pago_procesar', array(), UrlGeneratorInterface::ABSOLUTE_URL));    //URL de mi pagina para procesar el pago
  1637.         $idInsc = ($competicion->getJugadores() == 1) ? $inscrito->getId() : 0;
  1638.         $redsys->setParameter("DS_MERCHANT_URLOK"$this->generateUrl('pago_terminado', array('token' => 'cancel''id' => $idComp'idi' => $idInsc), UrlGeneratorInterface::ABSOLUTE_URL));
  1639.         $redsys->setParameter("DS_MERCHANT_URLKO"$this->generateUrl('pago_terminado', array('token' => 'fail''id' => $idComp'idi' => $idInsc), UrlGeneratorInterface::ABSOLUTE_URL));
  1640.         $redsys->setParameter("DS_MERCHANT_PAYMETHODS""C");   //solo pago con tarjeta
  1641.         $redsys->setParameter("DS_MERCHANT_MERCHANTNAME"$this->getParameter('tpv.merchant_name'));
  1642.         $redsys->setParameter("DS_MERCHANT_MERCHANTDATA"base64_encode(json_encode(array('idi' => $idi'idp' => $idp))));
  1643.         //$params['Ds_Merchant_KEY_256'] = $this->getParameter('tpv.key_test_256');   //Key de TEST.
  1644.         //$params['Ds_Merchant_KEY_256'] = $this->getParameter('tpv.key_256');   //Key de REAL. Codigo antiguo
  1645.         //$params['Ds_Merchant_URL_Pago'] = $this->getParameter('tpv.url_test');   //Direccion de TEST
  1646.         $params['Ds_Merchant_URL_Pago'] = $this->getParameter('tpv.url');      //Direccion REAL
  1647.         $params['Ds_SignatureVersion'] = $this->getParameter('tpv.version');      //Version SHA256 --> esto no se usa
  1648.         $params['Ds_MerchantParameters'] = $redsys->createMerchantParameters();              //Parametros, una vez codificados
  1649.         $params['Ds_Signature'] = $redsys->createMerchantSignature($params['Ds_Merchant_KEY_256']);                     //Firma de SHA256
  1650.         return $this->render('frontend/Default/tpv.html.twig'$params);
  1651.     }
  1652.     /**
  1653.      * F-064 Landing de retorno al pago en el banco
  1654.      *
  1655.      * @Route("/pago/{idi}/intermedio/{idp}", name="pago_intermedio")
  1656.      */
  1657.     public function pagoIntermedio($idi$idp) {
  1658.         $inscrito $this->em->getRepository(Inscrito::class)->find($idi);
  1659.         if (!$inscrito) {
  1660.             throw new NotFoundHttpException("No existe el inscrito");
  1661.         }
  1662.         $pedido $this->em->getRepository(Pedido::class)->find($idp);
  1663.         if (!$pedido) {
  1664.             //poner que redirija a competicion en un mensaje de esos flash
  1665.             //y que ponga el inscrito y el pedido a "Error"
  1666.             throw new NotFoundHttpException("No existe el pedido asociado a la inscripcion");
  1667.         }
  1668.         return $this->render("frontend/Default/pagoIntermedio.html.twig", [
  1669.                     'inscrito' => $inscrito,
  1670.                     'pedido'   => $pedido
  1671.         ]);
  1672.     }
  1673.     /**
  1674.      * F-065 Landing de retorno al pago en el banco
  1675.      *
  1676.      * @Route("/pago-terminado/{token}/{id}/{idi}", name="pago_terminado", defaults={"idi" = 0})
  1677.      */
  1678.     public function pagoTerminado($token$id$idiUtilJugadores $util_jugadores) {
  1679.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  1680.         if (!$competicion) {
  1681.             $this->addFlash(
  1682.                     'error'"El torneo buscado no existe");
  1683.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  1684.         }
  1685.         $params = [
  1686.             'token' => $token,
  1687.             'id'    => $id
  1688.         ];
  1689.         if ($idi != 0) {
  1690.             $inscrito $this->em->getRepository(Inscrito::class)->find($idi);
  1691.             if (!empty($inscrito) && ($token == "success")) {
  1692.                 $jugador $inscrito->getJugador();
  1693.                 $cl $competicion->getOrganizador()->getCliente();
  1694.                 $telefono $util_jugadores->getDatoPlanoDesdeJugador($jugador"Telefono"$cl);  //
  1695.                 if (empty($telefono)) {
  1696.                     $params["idj"] = $jugador->getId();
  1697.                 }
  1698.             }
  1699.         }
  1700.         /*
  1701.           $tarifa = $this->em->getRepository(Tarifa::class)->find($idt);
  1702.           if (!$tarifa) {
  1703.           //poner que redirija a competicion en un mensaje de esos flash
  1704.           //y que ponga el inscrito y el pedido a "Error"
  1705.           throw new NotFoundHttpException("No existe la tarifa");
  1706.           }
  1707.          */
  1708.         return $this->render("frontend/Default/pagoTerminado.html.twig"$params);
  1709.     }
  1710.     /**
  1711.      * F-066 Procesamiento del pago tras aviso del banco
  1712.      *
  1713.      * @Route("/pago-procesar", name="pago_procesar")
  1714.      *
  1715.      */
  1716.     public function pagoProcesar(Request $requestEnvioCorreo $mailerNotificacionesService $notificatorEnvioSms $messagingUtilJugadores $util_jugadoresSoftwareExternoUtil $swutil) {
  1717.         $redsys = new RedsysAPI();
  1718.         $Ds_MerchantParameters $request->request->get('Ds_MerchantParameters');
  1719.         $decodec $redsys->decodeMerchantParameters($Ds_MerchantParameters);
  1720.         $fields json_decode($decodectrue);
  1721.         $other_fields json_decode(base64_decode($fields['Ds_MerchantData']), true);
  1722.         $inscritos = array();
  1723.         $jugadores = array();
  1724.         $secret $this->getParameter('secret');
  1725.         $inscrito $this->em->getRepository(Inscrito::class)->find($other_fields['idi']);
  1726.         if (!$inscrito) {
  1727.             return new JsonResponse([]);
  1728.         }
  1729.         $pedido $this->em->getRepository(Pedido::class)->find($other_fields['idp']);
  1730.         if (!$pedido) {
  1731.             return new JsonResponse([]);
  1732.         }
  1733.         $competicion $inscrito->getCompeticion();
  1734.         $num_inscritos $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($competicion->getId(), false, ["pagado"]);
  1735.         $lista_espera = (($num_inscritos >= $competicion->getPlazas()) && $competicion->getListaEspera());
  1736.         //Permitimos que se terminen de inscribir aquellos, que aun habiendo acbado el plazo, la competicion sigue abierta a la espera de que la tarea la ponga en "finalizada"
  1737.         if (($competicion->getModo()->getId() != 3) && ($competicion->getEstado() != "abierta")) {
  1738.             //Mandamos correo a soporte para avisar
  1739.             $args = [
  1740.                 "to"          => $this->getParameter('next.email.rfga'),
  1741.                 "bcc"         => false,
  1742.                 "competicion" => $competicion,
  1743.                 "subject"     => '⛳ NEXTCADDY - Inscripción AL LƍMITE [' $pedido->getNumero() . ']',
  1744.                 "html"        => $this->renderView('frontend/Inscritos/emailInscripcionLimite.html.twig', array('jugador'     => $inscrito->getJugador(),
  1745.                     'inscrito'    => $inscrito,
  1746.                     'competicion' => $competicion,
  1747.                     'pedido'      => $pedido,
  1748.                     'tarifa'      => $pedido->getTarifa()
  1749.                 ))
  1750.             ];
  1751.             //EnvioCorreo::enviarCorreo($args);
  1752.             $mailer->enviarCorreo($args);
  1753.             return new JsonResponse([]);
  1754.         }
  1755.         //SWGOLF
  1756.         //$gmutil = new GolfmanagerUtilidad();
  1757.         $swbd $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club""cliente" => $competicion->getOrganizador()->getCliente(),"clubId" => $competicion->getClub()->getId()]);
  1758.         if ($swbd) {
  1759.             $swutil->init($swbd);
  1760.         }
  1761.         if (in_array($inscrito->getEstado(), ["espera""error"]) && in_array($pedido->getEstado(), ["espera""error"])) {
  1762.             $avisar false;
  1763.             if ($fields['Ds_Order'] == $pedido->getNumero()) {
  1764.                 if (intval($fields['Ds_Response']) < 100) {
  1765.                     $estado "pagado";
  1766.                     $avisar true;
  1767.                     /*
  1768.                       } else if (intval($fields['Ds_Response']) == 900) {
  1769.                       $estado = "devolucion";
  1770.                       $avisar = false;
  1771.                      *
  1772.                      */
  1773.                     $pedido->setPayedAt(new \DateTime('now'));
  1774.                 } else {
  1775.                     $pedido->setCodigoError($fields['Ds_Response']);
  1776.                     $estado "error";
  1777.                     $avisar false;
  1778.                 }
  1779.                 //04/03/20 Subimos el pedido set estado aqui porque sospechamos que el guardaCsv ha podido dar error, para que el pedido e quede en "pagado"/"error" para evitar que la tarea que busca los "en espera" lo limpie.
  1780.                 $pedido->setEstado($estado);
  1781.                 $pedido->setUpdatedAt(new \DateTime('now'));
  1782.                 //buscamos todos los inscritos que tienen el mismo pedido para cambiarle el estado
  1783.                 $inscritos $this->em->getRepository(Inscrito::class)->findBy(array('pedido' => $pedido->getId()));
  1784.                 foreach ($inscritos as $ins) {
  1785.                     $ins->setEstado($estado);
  1786.                     $participaAux 0;
  1787.                     if ($avisar) {
  1788.                         if ($lista_espera) {
  1789.                             $participaAux = -1;
  1790.                         } else {
  1791.                             $participaAux 1;
  1792.                         }
  1793.                     }
  1794.                     $ins->setParticipa($participaAux);
  1795.                     $ins->setUpdatedAt(new \DateTime('now'));
  1796.                     $jugador $ins->getJugador();
  1797.                     $log_message "Inscripción online en Competicion " $competicion->getNombre() . "(" $competicion->getId() . "): " $jugador->getLicencia() . " - " $estado " - (" $pedido->getNumero() . ")";
  1798.                     $log = new Log('i'$log_messagenull);
  1799.                     $this->em->persist($log);
  1800.                     $this->em->flush();
  1801.                     try {
  1802.                         $this->util->guardaCsvInscripciones($ins);
  1803.                     } catch (\Throwable $ex) {
  1804.                         $log_message "Error guardaCsvInscripciones inscripcion online en Competicion " $competicion->getNombre() . "(" $competicion->getId() . "): " $jugador->getLicencia() . " - " $estado " - (" $pedido->getNumero() . ")";
  1805.                         $log = new Log('i'$log_messagenull);
  1806.                         $this->em->persist($log);
  1807.                         $this->em->flush();
  1808.                     }
  1809.                     //Pablo 22/02/2024: Borramos esta condicion, me da igual el softwaregolf que tengamos que ha de ejecutarse la funcion de agregar,
  1810.                     // como es de pago avisamos aqui al proveedor (pago formalziado)
  1811.                     if ($swbd) {
  1812.                         $swutil->addClientToActivity($inscrito$this->emtrue);
  1813.                     }
  1814.                 }
  1815.                 $this->em->flush();
  1816.             }
  1817.             //Separado, para eviar que falle y deje a la mitad la inscripcion, sino iria arriba. De esta manera nos aseguramos que
  1818.             if ($avisar) {
  1819.                 $url $this->util->getShortUrl($competicion);
  1820.                 if (!$lista_espera) {
  1821.                     $texto "Se ha inscrito correctamente en " substr($this->util->limpiar($competicion->getNombre()), 045) . ". Puede consultar el listado de inscritos en " $url;
  1822.                 } else {
  1823.                     $texto "EstĆ” en lista de espera de " substr($this->util->limpiar($competicion->getNombre()), 050) . ". Consulte lista de inscritos en " $url;
  1824.                 }
  1825.                 $cl $competicion->getOrganizador()->getCliente();
  1826.                 foreach ($inscritos as $ins) {
  1827.                     $jugador $ins->getJugador();
  1828.                     //Preparación y envio del SMS
  1829.                     $privacidad $inscrito->getJugador()->getPrivacidadSimple();
  1830.                     $rgpd false;
  1831.                     if (strpos($competicion->getOrganizador()->getId(), "AM") !== false) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  1832.                         if (isset($privacidad["AM00"]) && $privacidad["AM00"]) {
  1833.                             $rgpd true;
  1834.                         }
  1835.                     } else {//buscamos la privacidad del organizador
  1836.                         if ((isset($privacidad[$competicion->getOrganizador()->getId()]) && $privacidad[$competicion->getOrganizador()->getId()]) || (isset($privacidad["AM00"]) && $privacidad["AM00"])) {
  1837.                             $rgpd true;
  1838.                         }
  1839.                     }
  1840.                     //$telefono = $jugador->getTlfn();    //$this->em->getRepository(Telefono::class)->findOneBy(array("jugador" => $jugador->getId(), "activo" => true));
  1841.                     $telefono $util_jugadores->getDatoPlanoDesdeJugador($jugador"Telefono"$cl);  // $telefono = $jugador->getTelefonoDecod($secret);    //$this->em->getRepository(Telefono::class)->findOneBy(array("jugador" => $jugador->getId(), "activo" => true));
  1842.                     if ($rgpd && !empty($telefono)) {
  1843.                         $userApp $this->em->getRepository(UserApp::class)->findOneByTelefono($telefono);
  1844.                         //if (!$userApp) {
  1845.                         $api $cl?->getId() > 2;
  1846.                         $messaging->enviarSms($telefono$texto$competicion2$api);
  1847.                         //} else {
  1848.                         $args = [];
  1849.                         $args["title"] = "Nueva inscripción en torneo";
  1850.                         $args["msg"] = $texto;
  1851.                         $args["url"] = $url;
  1852.                         $args["destinatario"] = $userApp;
  1853.                         $args["tipo"] = "new-inscription";
  1854.                         $args["competicion"] = $competicion->getId();
  1855.                         $notificator->enviarNotificacion($args);
  1856.                         //}
  1857.                     }
  1858.                     $jugadores[] = $jugador;
  1859.                 }
  1860.                 //$email = $pedido->getEmail();
  1861.                 $email $pedido->getEmailCodDecod($secret);
  1862.                 if (count($jugadores) == 1) {
  1863.                     $html $this->renderView('frontend/Inscritos/emailInscripcion.html.twig', array('jugador'      => $jugador,
  1864.                         'competicion'  => $competicion,
  1865.                         'pedido'       => $pedido,
  1866.                         'inscrito'     => $inscrito,
  1867.                         'barras'       => $this->em->getRepository(JornadaConfig::class)->findByInscrito($inscrito),
  1868.                         'tarifa'       => $pedido->getTarifa(),
  1869.                         'lista_espera' => $lista_espera
  1870.                     ));
  1871.                     /* $email_send->addTo($email)
  1872.                       ->setBcc($this->getParameter('next.email.rfga'))
  1873.                       ->setFrom('mailing@nextcaddy.com')
  1874.                       ->setSubject('⛳ NextCaddy - Inscripción online [' . $pedido->getNumero() . ']')
  1875.                       ->setHtml($this->renderView('frontend/Inscritos/emailInscripcion.html.twig', array('jugador' => $jugador,
  1876.                       'competicion' => $competicion,
  1877.                       'pedido' => $pedido,
  1878.                       'tarifa' => $pedido->getTarifa()
  1879.                       ))
  1880.                       ); */
  1881.                 } else {
  1882.                     $html $this->renderView('frontend/Inscritos/emailInscripcionPareja.html.twig', array('jugadores'    => $jugadores,
  1883.                         'competicion'  => $competicion,
  1884.                         'inscritos'    => $inscritos,
  1885.                         'pedido'       => $pedido,
  1886.                         'tarifas'      => $pedido->getImporte() . "€",
  1887.                         'lista_espera' => $lista_espera
  1888.                     ));
  1889.                 }
  1890.                 /* $organizador = (substr($competicion->getOrganizador()->getId(), 0, 2) == "AM") ? "AM00" : $competicion->getOrganizador()->getId();
  1891.                   $userSendgrid = $this->em->getRepository(User::class)->findOneByUsername($organizador);
  1892.                   $sendgridKey = $userSendgrid->getSocialRed($this->getParameter('secret'), "sendgrid");
  1893.                   $sendgrid = new \SendGrid($sendgridKey["api_key"]);      //segun usuario
  1894.                   if ($_SERVER['SERVER_NAME'] != 'localhost') {
  1895.                   $sendgrid->send($email_send); } */
  1896.                 $args = [
  1897.                     "to"          => $email,
  1898.                     "competicion" => $competicion,
  1899.                     "subject"     => '⛳ NEXTCADDY - Inscripción online [' $pedido->getNumero() . ']',
  1900.                     "html"        => $html
  1901.                 ];
  1902.                 //EnvioCorreo::enviarCorreo($args);
  1903.                 $mailer->enviarCorreo($args);
  1904.             }
  1905.             //Simplificamos la condicion, ya que puede haber inscritos anulados y preservado el pedido e inscritos a los que se le devuelve el importe
  1906.         } else if (empty($pedido->getReturnedAt()) && in_array($pedido->getEstado(), ["devolucion""anulado"])) {
  1907.             //} else if ((empty($pedido->getReturnedAt())) && ($inscrito->getEstado() == $pedido->getEstado()) && (($pedido->getEstado() == "devolucion") || ($pedido->getEstado() == "anulado"))) {
  1908.             //
  1909.             //En este ELSEIF solamente entra cuando es una devolucion desde los emials de aviso por reemplazo de un jugador
  1910.             ////https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Redireccion.pdf
  1911.             //0000 a 0099 Transacción autorizada para pagos y preautorizaciones
  1912.             //900 Transacción autorizada para devoluciones y confirmaciones
  1913.             //400 Transacción autorizada para anulaciones
  1914.             //Resto son errores en el pedido: Tarjeta caducada, Código de seguridad (CVV2/CVC2) incorrecto, Tarjeta no existente, etc
  1915.             $ds_response intval($fields['Ds_Response']);
  1916.             if (($ds_response == 900) || ($ds_response == 400)) {
  1917.                 //marcamos como devuelto en el banco el elemento
  1918.                 $pedido->setReturnedAt(new \DateTime('now'));
  1919.                 $pedido->setEstado("anulado");  //Esto es anulado, ya que para el caso de que el jugador autocancele su inscripcion va por la URL de "competicion_cancelainscrito"
  1920.                 $log_message "Devolución del pedido " $pedido->getNumero() . " realizada con Ć©xito.";
  1921.                 //Pablo 22/02/2024: Me da igual el softwaregolf que tengamos que ha de ejecutarse la funcion de borrar inscrito, como es de pago avisamos aqui al proveedor (devolucion formalziado)
  1922.                 //Lo ponemos aqui, que la devolucion ha ido OK, si hay fallo no borramos a nadie
  1923.                 if ($swbd) {
  1924.                     $swutil->deleteClientFromActivity($inscrito$this->emtrue);
  1925.                 }
  1926.             } else {
  1927.                 $pedido->setCodigoError($fields['Ds_Response']);
  1928.                 $log_message "Error realizando la devolución del pedido " $pedido->getNumero() . "Codigo de error: " $fields['Ds_Response'];
  1929.             }
  1930.             $log = new Log('i'$log_message$this->getUser()?->getUserIdentifier());
  1931.             $this->em->persist($log);
  1932.             $this->em->flush();
  1933.         }
  1934.         return new JsonResponse([]);
  1935.     }
  1936.     /**
  1937.      * F-067 Muestra un listado con los cambios de handicap tras el torneo
  1938.      *
  1939.      * @Route("/getListadoCambiosHandicap", name="listado_cambios_handicap", options={"expose"=true})
  1940.      *
  1941.      */
  1942.     public function listadoCambiosHandicap(Request $request) {
  1943.         $id $request->request->get("id");
  1944.         //comprobar competicion.
  1945.         $competicion $this->em->getRepository(Competicion::class)->findOneById($id);
  1946.         if (!$competicion) {
  1947.             return new JsonResponse(-1);
  1948.         }
  1949.         $diferencias = array();
  1950.         $inscritos = array();
  1951.         $inscritosAux $this->em->getRepository(Inscrito::class)->getHandicapsSms($id);
  1952.         foreach ($inscritosAux as $inscrito) {
  1953.             $idi $inscrito->getId();
  1954.             $handicaps unserialize($inscrito->getHcpSms());
  1955.             $long count($handicaps);
  1956.             $cambio 0;
  1957.             for ($i 1$i <= $long$i++) {
  1958.                 if ($i != 1) {
  1959.                     $diferencias[$i] = number_format($handicaps[$i], 1) - number_format($handicaps[$i 1], 1);
  1960.                     $cambio += $diferencias[$i];
  1961.                 } else {
  1962.                     $diferencias[$i] = number_format($handicaps[$i], 1) - $inscrito->getHcp();
  1963.                     $cambio += $diferencias[$i];
  1964.                 }
  1965.             }
  1966.             $inscritos[$idi] = [
  1967.                 "nombre"      => $inscrito->getJugador()->getNombre(),
  1968.                 "apellidos"   => $inscrito->getJugador()->getApellidos(),
  1969.                 "licencia"    => $inscrito->getJugador()->getLicencia(),
  1970.                 "hcp"         => $inscrito->getHcp(),
  1971.                 "handicaps"   => $handicaps,
  1972.                 "cambio"      => $cambio,
  1973.                 "diferencias" => $diferencias
  1974.             ];
  1975.         }
  1976.         $cmp = function ($a$b) {
  1977.             $a1 number_format($a["cambio"], 1);
  1978.             $b1 number_format($b["cambio"], 1);
  1979.             if ($a1 == $b1) {
  1980.                 if (number_format($a["hcp"]) == number_format($b["hcp"])) {
  1981.                     return 0;
  1982.                 }
  1983.                 return (number_format($a["hcp"]) < number_format($b["hcp"])) ? -1;
  1984.             }
  1985.             return ($a1 $b1) ? -1;
  1986.         };
  1987.         //ordenamos
  1988.         usort($inscritos$cmp);
  1989.         return $this->render("frontend/Inscritos/listado_cambio_handicap.html.twig", [
  1990.                     'competicion' => $competicion,
  1991.                     'inscritos'   => $inscritos
  1992.         ]);
  1993.     }
  1994.     /**
  1995.      * F-068 Devuelve las estadisticas de una competicion
  1996.      *
  1997.      * @Route("/getListadoEstadisticas", name="listado_estadisticas", options={"expose"=true})
  1998.      *
  1999.      */
  2000.     public function listadoEstadisticas(Request $request) {
  2001.         //$isAjax = $request->isXMLHttpRequest();
  2002.         //if ($isAjax) {
  2003.         $response = new JsonResponse();
  2004.         //comprobar que hay Puntuaciones publicadas.
  2005.         $competicion $request->get("id");
  2006.         $estadisticas $this->em->getRepository(Estadisticas::class)->findBy(array('competicion' => $competicion));
  2007.         if ($estadisticas) {
  2008.             $arDatos = array();
  2009.             foreach ($estadisticas as $data) {
  2010.                 if (!isset($arDatos[$data->getJornada()])) {
  2011.                     $arDatos[$data->getJornada()] = array();
  2012.                 }
  2013.                 $arDatos[$data->getJornada()][$data->getTipo()] = array("id" => $data->getId(), "datos" => $data->getDatos());
  2014.             }
  2015.             $response->setData($arDatos);
  2016.         } else {
  2017.             $response->setData("No data");
  2018.         }
  2019.         return $response;
  2020.         //} else {
  2021.         //    return new Response('This is not ajax!', 400);
  2022.         //}
  2023.     }
  2024.     /**
  2025.      * F-069 Muestra las estadisticas de una competicion
  2026.      *
  2027.      * @Route("/renderStats", name="_ajRenderStats", options={"expose"=true})
  2028.      *
  2029.      */
  2030.     public function renderEstadistica(Request $request) {
  2031.         $isAjax $request->isXMLHttpRequest();
  2032.         $response = new JsonResponse();
  2033.         $competicion $request->get("id");
  2034.         if ($isAjax) {
  2035.             $datos = array();
  2036.             $fechas = array(=> "");   //primer elemento ficticio para el total
  2037.             //comprobar que hay Puntuaciones publicadas.
  2038.             $estadisticas $this->em->getRepository(Estadisticas::class)->findBy(array('competicion' => $competicion), array("jornada" => "ASC"));
  2039.             if (!$estadisticas) {
  2040.                 $response->setData("No data");
  2041.             } else {
  2042.                 foreach ($estadisticas as $data) {
  2043.                     if (!isset($datos[$data->getJornada()])) {
  2044.                         $datos[$data->getJornada()] = array();
  2045.                         $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $competicion"orden" => $data->getJornada()));
  2046.                         if ($jornada) {
  2047.                             $fechas[$data->getJornada()] = $jornada->getFecha();
  2048.                         }
  2049.                     }
  2050.                     $datos[$data->getJornada()][$data->getTipo()] = array('id' => $data->getId(), 'datos' => $data->getDatos());
  2051.                 }
  2052.             }
  2053.             return $this->render('frontend/Estadisticas/index.html.twig', array("datos" => $datos"fechas" => $fechas));
  2054.         } else {
  2055.             return new Response('This is not ajax!'400);
  2056.         }
  2057.     }
  2058.     /**
  2059.      * F-070 Pagina de bienvenida a jugadores
  2060.      *
  2061.      * @Route("/bienvenido/{lic}", name="bienvenido_nextcaddy")
  2062.      */
  2063.     public function bienvenido($lic) {
  2064.         $inicialFed substr(trim($lic), 02);
  2065.         $jugador $this->em->getRepository(Jugador::class)->findOneBy(array('habilitado' => 1'licencia_corta' => substr($lic, -6)));
  2066.         if (!$jugador) {
  2067.             //creamos un jugador por defecto si no existe, para que vaya a la pagina de club de la federacion
  2068.             $jugador = new Jugador(__METHOD__);
  2069.             $jugador->setLicencia($inicialFed "00123456");
  2070.         }
  2071.         $club $this->em->getRepository(Club::class)->findOneBy(array('id' => substr(trim($jugador->getLicencia()), 04), 'habilitado' => true));
  2072.         if (!$club) {
  2073.             $club $this->em->getRepository(Club::class)->find($inicialFed "00");
  2074.             if (!$club) {
  2075.                 return $this->redirect($this->generateUrl('provincias'));
  2076.             }
  2077.         }
  2078.         return $this->render("frontend/Default/bienvenido.html.twig", [
  2079.                     'club'    => $club,
  2080.                     'jugador' => $jugador
  2081.         ]);
  2082.     }
  2083.     /**
  2084.      * F-071 Listado de clubes agrupados por provincia
  2085.      *
  2086.      * @Route("/provincias/{id}", name="provincias", defaults={"id" = 0})
  2087.      */
  2088.     public function provinces($id): Response
  2089.     {
  2090.         $clubRepository $this->em->getRepository(Club::class);
  2091.         $provinceRepository $this->em->getRepository(Provincia::class);
  2092.         $regionRepository $this->em->getRepository(Comunidad::class);
  2093.         $clubsByProvince $this->getClubsByProvince($clubRepository);
  2094.         $provincesWithCount $this->getProvincesWithClubCount($clubsByProvince$provinceRepository);
  2095.         $regionsWithProvinces $this->getRegionsWithProvinces($provincesWithCount$provinceRepository$regionRepository);
  2096.         return $this->render("frontend/Default/provincias.html.twig", [
  2097.             'id'                 => $id,
  2098.             'clubsByProvince'    => $clubsByProvince,
  2099.             'provincesWithCount' => $provincesWithCount,
  2100.             'regions'            => $regionsWithProvinces
  2101.         ]);
  2102.     }
  2103.     private function getClubsByProvince($clubRepository): array
  2104.     {
  2105.         $clubs $clubRepository->findTodosProvincia();
  2106.         $clubsByProvince = [];
  2107.         foreach ($clubs as $club) {
  2108.             $locality $club->getLocalidad();
  2109.             $province $locality?->getProvincia();
  2110.             if (!$province) {
  2111.                 continue;
  2112.             }
  2113.             $provinceId $province->getId();
  2114.             $clubsByProvince[$provinceId]['name'] = $province->getNombre();
  2115.             $clubsByProvince[$provinceId]['clubs'][] = [
  2116.                 'id'       => $club->getId(),
  2117.                 'name'     => $club->getNombre(),
  2118.                 'locality' => $locality->getNombre(),
  2119.                 'phone'    => $club->getTelefono() ?? 'No disponible'
  2120.             ];
  2121.         }
  2122.         return $clubsByProvince;
  2123.     }
  2124.     private function getProvincesWithClubCount(array $clubsByProvince$provinceRepository): array
  2125.     {
  2126.         $provinces $provinceRepository->findAll();
  2127.         $provincesWithCount = [];
  2128.         foreach ($provinces as $province) {
  2129.             $provinceId $province->getId();
  2130.             $provincesWithCount[$provinceId] = [
  2131.                 'name'       => $province->getNombre(),
  2132.                 'num_clubs'  => count($clubsByProvince[$provinceId]['clubs'] ?? [])
  2133.             ];
  2134.         }
  2135.         return $provincesWithCount;
  2136.     }
  2137.     private function getRegionsWithProvinces(array $provincesWithCount$provinceRepository$regionRepository): array
  2138.     {
  2139.         $regions $regionRepository->findAll();
  2140.         $regionsWithProvinces = [];
  2141.         foreach ($regions as $region) {
  2142.             $regionsWithProvinces[$region->getId()] = [
  2143.                 'name'         => $region->getNombre(),
  2144.                 'default_logo' => $region->getDefaultLogo() ?? 'https://resources.nextcaddy.com/clubResources/nextcaddy/logos/SVG/nextcaddy.svg',
  2145.                 'provinces'    => []
  2146.             ];
  2147.         }
  2148.         foreach ($provincesWithCount as $provinceId => $provinceData) {
  2149.             $province $provinceRepository->find($provinceId);
  2150.             $regionId $province->getComunidad()->getId();
  2151.             if (isset($regionsWithProvinces[$regionId])) {
  2152.                 $regionsWithProvinces[$regionId]['provinces'][$provinceId] = $provinceData;
  2153.             }
  2154.         }
  2155.         return $regionsWithProvinces;
  2156.     }
  2157.     /**
  2158.      * F-072 Pagina para felicitar el aƱo nuevo
  2159.      * @Route("/felicitacion-navidad/{token}", name="felicitacion_navidad")
  2160.      *
  2161.      * MĆ”s info: https://slopenxt.atlassian.net/wiki/spaces/NXT/pages/638386177/Felicitaci+n+de+Navidad
  2162.      *
  2163.      */
  2164.     public function felicitacionNavidad($token) {
  2165.         $key $this->getParameter('secret');
  2166.         $cadena UtilStatic::desencriptar($token$key); //LICENCIA-AƑO
  2167.         $f = new \DateTime("now");
  2168.         if (intval($f->format("Y")) > 2020) {
  2169.             $valores explode("_"$cadena);   //asi los profesionales pueden verlo sin que sea generico
  2170.         } else {
  2171.             $valores explode("-"$cadena);
  2172.         }
  2173.         $licencia $valores[0];
  2174.         $year $valores[1];
  2175.         $jugador $this->em->getRepository(Jugador::class)->findOneBy(array('habilitado' => 1'licencia' => $licencia));
  2176.         if ($jugador) {
  2177.             //Excepcion en el aƱo 2019 por culpa de la RGPD
  2178.             if ($year != 2019) {
  2179.                 if (substr($jugador->getLicencia(), 02) != "CM") {
  2180.                     //buscamos las competiciones del aƱo anterior
  2181.                     $competiciones $this->em->getRepository(Inscrito::class)->getCompeticionesAnualLicencia($licencia"" . ($year 1));
  2182.                 }
  2183.             }
  2184.         } else {
  2185.             //creamos un jugador por defecto si no existe, para que vaya a la pagina de club de la federacion
  2186.             $jugador = new Jugador(__METHOD__);
  2187.             $jugador->setNombre("Golfista");
  2188.             $jugador->setLicencia("AM00123456");
  2189.             $competiciones = [];
  2190.         }
  2191.         if ($year >= 2020) {
  2192.             $view "frontend/Navidad/navidad_" $year ".html.twig";
  2193.         } else {
  2194.             $view "frontend/Navidad/navidad.html.twig";
  2195.         }
  2196.         return $this->render($view, array(
  2197.                     'year'          => $year,
  2198.                     'jugador'       => $jugador,
  2199.                     'competiciones' => $competiciones,
  2200.                     'leones'        => false   //in_array($licencia, ["AM85111566"])
  2201.         ));
  2202.     }
  2203.     /**
  2204.      * F-073 Pagina para felicitar las fiestas navideƱas 2016/17
  2205.      *
  2206.      * @Route("/navidad/{licencia}", name="navidad")
  2207.      */
  2208.     public function navidad($licencia) {
  2209.         $key $this->getParameter('secret');
  2210.         $token UtilStatic::encriptar($licencia "-" 2017$key);
  2211.         return $this->redirect($this->generateUrl('felicitacion_navidad', array("token" => $token)));
  2212.         /*
  2213.           $jugador = $this->em->getRepository(Jugador::class)->findOneBy(array('licencia' => $licencia));
  2214.           if (!$jugador) {
  2215.           //creamos un jugador por defecto si no existe, para que vaya a la pagina de club de la federacion
  2216.           $jugador = new Jugador(__METHOD__);
  2217.           $jugador->setNombre("Golfista");
  2218.           $jugador->setLicencia("AM00123456");
  2219.           }
  2220.           $competiciones = $this->em->getRepository(Inscrito::class)->getCompeticionesAnualLicencia($licencia, "2016");
  2221.           return array('jugador' => $jugador,
  2222.           'competiciones' => $competiciones
  2223.           );
  2224.          * */
  2225.     }
  2226.     //    Pablo 10/08/2023: Se comenta ya que estan llegando muchos errores a esta pagina (posiblemente un bot);
  2227.     //    y asi evitar el bombardeo de emails de error en esta pagina obsoleta y sin mantenimiento
  2228.     // /**
  2229.     //  * F-074 Cambio de handicap de un jugador tras competicion
  2230.     //  *
  2231.     //  * @Route("/cambio-hcp/{id}/{orden}/{ccc}", name="cambio_hcp", defaults={ "ccc" = 0 })
  2232.     //  */
  2233.     // public function cambioHcp($id, $orden, $ccc) {
  2234.     //     $inscrito = $this->em->getRepository(Inscrito::class)->find($id);
  2235.     //     if (!$inscrito) {
  2236.     //         $this->addFlash(
  2237.     //                 'error', "No encontramos el Inscrito que nos ha solicitado");
  2238.     //         return $this->redirect($this->generateUrl('portada'));
  2239.     //     }
  2240.     //     $this->em->getFilters()->disable('softdeleteable');
  2241.     //     $competicion = $inscrito->getCompeticion();
  2242.     //     if (!$competicion || !is_null($competicion->getDeletedAt())) {
  2243.     //         $this->addFlash('error', 'No se ha encontrado la competición');
  2244.     //         return $this->redirect($this->generateUrl('portada'));
  2245.     //     }
  2246.     //     $this->em->getFilters()->enable('softdeleteable');
  2247.     //     //$totalJornadas = count($this->em->getRepository(Jornada'::class->findBy(array('competicion' => $competicion->getId()), array('orden' => 'ASC')));
  2248.     //     $totalJornadas = count($competicion->getJornadas());
  2249.     //     $jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $competicion->getId(), 'orden' => $orden));
  2250.     //     if (!$jornada) {
  2251.     //         $this->addFlash(
  2252.     //                 'error', "No encontramos la Jornada que nos ha solicitado");
  2253.     //         return $this->redirect($this->generateUrl('portada'));
  2254.     //     }
  2255.     //     $hcpInscrito = $inscrito->getHcp();
  2256.     //     //buscamos la categoria de HCP para empezar a mirar la tabla
  2257.     //     $categoria = $this->em->getRepository(CategoriaHandicap::class)->findOneByHandicapRange($hcpInscrito);
  2258.     //     $handicaps = unserialize($inscrito->getHcpSms());
  2259.     //     $diferencia = 0;
  2260.     //     $precision = 1;
  2261.     //     if ($categoria->getId() == 6) {
  2262.     //         $precision = 0;      //Para 6a categoria se redondea sin decimales para que queden numeros enteros
  2263.     //     }
  2264.     //     if ((!isset($handicaps[$orden - 1])) || ($orden == 1)) {
  2265.     //         $diferencia = round($handicaps[$orden] - $inscrito->getHcp(), $precision);
  2266.     //     } else {
  2267.     //         $diferencia = round($handicaps[$orden] - $handicaps[$orden - 1], $precision);
  2268.     //     }
  2269.     //     $array_bajada = array();
  2270.     //     $clasificado = array();
  2271.     //     $acumulado = 0;
  2272.     //     if ($competicion->getFormula() != NULL) {
  2273.     //         if ($competicion->getFormula()->getId() == "S") {
  2274.     //             $clasificaciones = $this->em->getRepository(Clasificacion::class)->findBy(array('competicion' => $competicion->getId(), 'calculo' => 'H'));
  2275.     //             $parciales = $this->em->getRepository(Parcial::class)->findBy(array('jornada' => null, 'clasificacion' => $clasificaciones));
  2276.     //             $clasificado = $this->em->getRepository(Clasificado::class)->findOneBy(array('parcial' => $parciales, 'inscrito' => $inscrito->getId()));
  2277.     //             if ($clasificado) {
  2278.     //                 //buscamos en la zona neutra una vez que sabemos la categoriahcp
  2279.     //                 $tipo_prueba = "i";
  2280.     //                 if ($jornada->getModalidad()->getId() == "P") {
  2281.     //                     $tipo_prueba = "p";
  2282.     //                 }
  2283.     //                 $son18hoyos = true;
  2284.     //                 if ($tipo_prueba != "p") {    //el distinguir entre 18 o 9 hoyos solo tiene sentido para Individual o CanadaCup
  2285.     //                     $jc = $this->em->getRepository(JornadaConfig::class)->findOneBy(array('jornada' => $jornada->getId(), 'categoria' => $inscrito->getCategoria()));
  2286.     //                     if (!empty($jc)) {
  2287.     //                         if ($jc->getHoyos() != "1-18") {
  2288.     //                             $son18hoyos = false;
  2289.     //                         }
  2290.     //                     }
  2291.     //                 }
  2292.     //                 $campoCorto = false;
  2293.     //                 $t = $jornada->getTrazado();
  2294.     //                 if (!is_null($t->getCampoCorto())) {
  2295.     //                     $campoCorto = $t->getCampoCorto();
  2296.     //                 } else {
  2297.     //                     // Consultar a la espaƱola la primera vez y guardar el dato para las siguientes consultas
  2298.     //                     $numero_trazado = $t->spanishFederationNumberCourseFormat();
  2299.     //                     $this->cws->init();
  2300.     //                     //$resultado = $coursews->listar(array("courseCode" => $numero_trazado));
  2301.     //                     //$campoCorto = $resultado->course->shortCourse;
  2302.     //                     $resultado = $this->cws->listar2020(array("courseCode" => $numero_trazado));
  2303.     //                     $campoCorto = $resultado->courses->course->shortCourse; //En este caso solo se busca por un trzado en concreto, por lo que podemos acceder directamente
  2304.     //                     $t->setCampoCorto($campoCorto);
  2305.     //                     $this->em->flush();
  2306.     //                 }
  2307.     //                 $zona_neutra = $this->em->getRepository(ZonaNeutra::class)->findOneBy(array('categoria' => $categoria, 'tipoPrueba' => $tipo_prueba, 'campoCorto' => $campoCorto, 'son18hoyos' => $son18hoyos));
  2308.     //                 $ascValor = $jornada->getAscValor();
  2309.     //                 if ($ascValor == 99) {
  2310.     //                     $ascValor = 2;
  2311.     //                 }
  2312.     //                 $suma_asc_neto = $clasificado->getNeto() + $ascValor;   //$jornada->getAscValor();
  2313.     //                 if ($suma_asc_neto < $zona_neutra->getPuntosMin()) {
  2314.     //                     $array_bajada[$clasificado->getNeto() + $ascValor /* $jornada->getAscValor() */] = $zona_neutra->getSubidaInferiorZn();
  2315.     //                 } else {
  2316.     //                     if ($suma_asc_neto < $zona_neutra->getPuntosMax()) {
  2317.     //                         $array_bajada[$clasificado->getNeto() + $ascValor /* $jornada->getAscValor() */] = 0;
  2318.     //                     } else {
  2319.     //                         if ($suma_asc_neto > 72) {
  2320.     //                             $suma_asc_neto = 72;
  2321.     //                         }
  2322.     //                         if ($tipo_prueba == "i") {
  2323.     //                             for ($b = ($zona_neutra->getPuntosMax() + 1); $b <= $suma_asc_neto; $b++) {
  2324.     //                                 $bajada = $this->em->getRepository(Bajada::class)->findBajadasExact($b, $categoria->getId(), $tipo_prueba, $campoCorto);
  2325.     //                                 $array_bajada[$b] = $bajada->getBajada();
  2326.     //                                 $acumulado += $bajada->getBajada();
  2327.     //                                 //comprobamos si tenemos que actualizar categoria para cambiar los valores
  2328.     //                                 $acu = $inscrito->getHcp() + $acumulado;
  2329.     //                                 if (($acu < $categoria->getHcpMin()) || ($acu > $categoria->getHcpMax())) {
  2330.     //                                     $categoria = $this->em->getRepository(CategoriaHandicap::class)->findOneByHandicapRange($inscrito->getHcp() + $acumulado);
  2331.     //                                 }
  2332.     //                             }
  2333.     //                         } else {
  2334.     //                             $bajada = $this->em->getRepository(Bajada::class)->findBajadasExact($suma_asc_neto, $categoria->getId(), $tipo_prueba, $campoCorto);
  2335.     //                             $array_bajada[$suma_asc_neto] = $bajada->getBajada();
  2336.     //                             $acumulado += $bajada->getBajada();
  2337.     //                         }
  2338.     //                     }
  2339.     //                 }
  2340.     //             }
  2341.     //         }
  2342.     //     }
  2343.     //     $jugador = $inscrito->getjugador();
  2344.     //     $fb = $this->createFormBuilder($jugador, array('action' => $this->generateUrl('tour_autocomplete_update_rgpd'), 'method' => 'POST'))
  2345.     //             ->add('newsletters', CheckboxType::class, array('mapped' => false, "label" => "TambiĆ©n quiero recibir newsletters", "required" => false, "attr" => array("checked" => (strpos($competicion->getOrganizador()->getId(), "AM") !== false))))
  2346.     //             ->add('organizador', HiddenType::class, array('mapped' => false, 'attr' => array('value' => $competicion->getOrganizador()->getId())))
  2347.     //             ->add('rgpd', HiddenType::class, array('mapped' => false))
  2348.     //             ->add('id', HiddenType::class);
  2349.     //     //$secret = $this->getParameter('secret');
  2350.     //     //if (empty($jugador->getEmail())) {
  2351.     //     if (empty($jugador->getEmailCod())) {
  2352.     //         $fb->add('email', EmailType::class, array("label" => false, "required" => false, "attr" => array("placeholder" => "Introduzca email")));
  2353.     //     }
  2354.     //     $form = $fb->getForm();
  2355.     //     return $this->render("frontend/Default/cambioHcp.html.twig", [
  2356.     //                 'hcp'           => $handicaps[$orden],
  2357.     //                 'diferencia'    => $diferencia,
  2358.     //                 'competicion'   => $competicion,
  2359.     //                 'clasificado'   => $clasificado,
  2360.     //                 'orden'         => $orden,
  2361.     //                 'form'          => $form,
  2362.     //                 'id'            => $id,
  2363.     //                 'ccc'           => $ccc,
  2364.     //                 'inscrito'      => $inscrito,
  2365.     //                 'acumulado'     => round($acumulado, 1), //Es necesario redondear. Se manda para solucionar temporalmente el probblema del campo corto
  2366.     //                 'jornada'       => $jornada,
  2367.     //                 'totalJornadas' => $totalJornadas,
  2368.     //                 'array_bajada'  => $array_bajada
  2369.     //     ]);
  2370.     // }
  2371.     /**
  2372.      * F-075 Muestra la pagina de información de marketing
  2373.      *
  2374.      * @Route("/descripcion", name="marketing")
  2375.      */
  2376.     public function marketing() {
  2377.         $user $this->getUser();
  2378.         if (!$this->utilidades->compruebaRol(["NUEVA_FEDE""PUBLICIDAD"], false)) {
  2379.             $this->addFlash(
  2380.                     'error'"No tiene permisos suficientes para acceder a la pĆ”gina solicitada");
  2381.             return $this->redirect($this->generateUrl('_club', array('id' => 'AM00')));
  2382.         }
  2383.         return $this->render("frontend/Default/marketing.html.twig", [
  2384.                     'user' => $user,
  2385.         ]);
  2386.     }
  2387.     /**
  2388.      * F-076 Demo de visualización del HĆ”ndicap actual de acceso al campeonato de EspaƱa INFANTIL
  2389.      *
  2390.      * @Route("/acceso-campeonato-rfeg/{licencia}", name="acceso_campeonato_rfeg")
  2391.      */
  2392.     public function accesoCampeonatosEspania($licenciaFederatedWebService $rfeg) {
  2393.         $lic substr($licencia4);
  2394.         $rfeg->init("AM00");
  2395.         //$jugadores = $rfeg->searchByCode(array('federationCode' => $lic));
  2396.         $jugadores $rfeg->listByCode2020(array('federatedCodes' => ['federatedCode' => $lic]));
  2397.         if (isset($jugadores->federateds)) {
  2398.             if (isset($jugadores->federateds->federated)) {
  2399.                 $jugador $this->em->getRepository(Jugador::class)->findByLicenciaCortaNoTemporal($lic);
  2400.                 if (!$jugador) {
  2401.                     $jugador = new Jugador(__METHOD__);
  2402.                 }
  2403.                 $this->utilidades->actualizarDatosJugadorFromFederated($jugadores->federateds->federated$jugador);
  2404.             }
  2405.             //vemos si es el tercer o cuarto mejor handicap
  2406.             $posicionHcp = ($jugador->getNivel()->getId() != "B") ? 3;
  2407.             return $this->render("frontend/Default/acceso_campeonato_rfeg.html.twig", [
  2408.                         'jugador'     => $jugador,
  2409.                         'posicionHcp' => $posicionHcp,
  2410.             ]);
  2411.         } else {
  2412.             $this->addFlash('error''No existen datos para ese jugador');
  2413.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  2414.         }
  2415.     }
  2416. //
  2417. //    Pablo 08/02/2024: Comentamos ya que el RFEGWebService
  2418. //
  2419. //    F-077 Demo del Calculo nuevo Hcp Mundial
  2420. //
  2421. //    @Route("/world-hcp/{licencia}", name="world_hcp")
  2422. //
  2423. //    public function newHcpMundial($licencia, FederatedWebService $rfeg, RFEGWebService $webservice) {
  2424. //        $rfeg->init("AM00");
  2425. //
  2426. //        if (strlen($licencia) > 6) {
  2427. //            $lic = substr($licencia, 4);
  2428. //        } else {
  2429. //            $lic = $licencia;
  2430. //        }
  2431. //
  2432. //        //$jugadores = $rfeg->searchByCode(array('federationCode' => $lic));
  2433. //        $jugadores = $rfeg->listByCode2020(array('federatedCodes' => ['federatedCode' => $lic]));
  2434. //
  2435. //        if (isset($jugadores->federateds)) {
  2436. //            if (isset($jugadores->federateds->federated)) {
  2437. //
  2438. //                $jugador = $this->em->getRepository(Jugador::class)->findOneBy(array('habilitado' => 1, 'licencia_corta' => $lic));
  2439. //                if (!$jugador) {
  2440. //                    $jugador = new Jugador(__METHOD__);
  2441. //                }
  2442. //
  2443. //                $this->utilidades->actualizarDatosJugadorFromFederated($jugadores->federateds->federated, $jugador);
  2444. //            }
  2445. //
  2446. //            $ultimasVueltas = $webservice->getUltimas20Vueltas($jugador->getLicenciaCorta());
  2447. //            $ultimasVueltasSinOrdenar = $ultimasVueltas;
  2448. //            $nVueltas = count($ultimasVueltas);
  2449. //            $diferenciales = [];
  2450. //            $hcpCalculo = 0;
  2451. //            $ajuste = 0;
  2452. //            $nResultados = 0;
  2453. //            if ($nVueltas > 1) {
  2454. //                usort($ultimasVueltas, function ($a, $b) {
  2455. //                    return strnatcmp($a["sgd"], $b["sgd"]);
  2456. //                });
  2457. //
  2458. //                switch ($nVueltas) {
  2459. //                    case 1:
  2460. //                    case 2:
  2461. //                    case 3:
  2462. //                        $ajuste = -2;
  2463. //                        $diferenciales[] = $ultimasVueltas[0];
  2464. //                        $hcpCalculo = $diferenciales[0]["sgd"] - $ajuste;
  2465. //                    case 4:
  2466. //                        $ajuste = -1;
  2467. //                        $diferenciales[] = $ultimasVueltas[0];
  2468. //                        $hcpCalculo = $diferenciales[0]["sgd"] - $ajuste;
  2469. //                    case 5:
  2470. //                        $diferenciales[] = $ultimasVueltas[0];
  2471. //                        $hcpCalculo = $diferenciales[0]["sgd"] - $ajuste;
  2472. //                    case 5:
  2473. //                        $diferenciales[] = $ultimasVueltas[0];
  2474. //                        $hcpCalculo = $diferenciales[0]["sgd"] - $ajuste;
  2475. //                    case 6:
  2476. //                        $ajuste = -1;
  2477. //                        $nResultados = 2;
  2478. //                        $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
  2479. //                        $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados) - $ajuste;
  2480. //                    case 7:
  2481. //                    case 8:
  2482. //                        $nResultados = 2;
  2483. //                        $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
  2484. //                        $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados) - $ajuste;
  2485. //                    case 9:
  2486. //                    case 10:
  2487. //                    case 11:
  2488. //                        $nResultados = 3;
  2489. //                        $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
  2490. //                        $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
  2491. //                    case 12:
  2492. //                    case 13:
  2493. //                    case 14:
  2494. //                        $nResultados = 4;
  2495. //                        $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
  2496. //                        $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
  2497. //                    case 15:
  2498. //                    case 16:
  2499. //                        $nResultados = 5;
  2500. //                        $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
  2501. //                        $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
  2502. //                    case 17:
  2503. //                    case 18:
  2504. //                        $nResultados = 6;
  2505. //                        $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
  2506. //                        $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
  2507. //                    case 19:
  2508. //                        $nResultados = 7;
  2509. //                        $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
  2510. //                        $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
  2511. //                    case 20:
  2512. //                        $nResultados = 8;
  2513. //                        $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
  2514. //                        $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
  2515. //                }
  2516. //            }
  2517. //
  2518. //            return $this->render("frontend/Default/world_hcp.html.twig", [
  2519. //                        'jugador'       => $jugador,
  2520. //                        'vueltas'       => $ultimasVueltasSinOrdenar,
  2521. //                        "resultados"    => $nResultados,
  2522. //                        "diferenciales" => array_column($diferenciales, null, 'id'),
  2523. //                        "hcp"           => $hcpCalculo
  2524. //            ]);
  2525. //        } else {
  2526. //            $this->addFlash(
  2527. //                    'error', 'No existen datos para ese jugador');
  2528. //
  2529. //            return $this->redirect($this->generateUrl('club', array('id' => "AM00")));
  2530. //        }
  2531. //    }
  2532. //
  2533. //
  2534. //    F-078 Calcula la media de un array de valores
  2535. //
  2536. //    @param type $array
  2537. //    @param type $n
  2538. //    @return type
  2539. //
  2540. //
  2541. //    function calcularMedia($array, $n) {
  2542. //        $result = 0;
  2543. //        for ($i = 1; $i < sizeof($array); $i++) {
  2544. //            $result += $array[$i]["sgd"];
  2545. //        }
  2546. //
  2547. //        return $result / $n;
  2548. //    }
  2549.     /**
  2550.      * @Route("/calculo-hcpjuego", name="nxt_calculo_hcpjuego", options={"expose"=true})
  2551.      */
  2552.     public function calculoHcpjuego(Request $request) {
  2553.         $data $request->request;
  2554.         $hcp str_replace(",""."$data->get('handicap')); //arreglo que en JS no funcionaba
  2555.         $tramo $data->get('tramo');
  2556.         $barraNombre $data->get('barra');
  2557.         $trazadoNombre $data->get('trazado');
  2558.         $porcentaje $data->get('porcentaje');
  2559.         $parAnt 0;
  2560.         $hcps_juego = array();
  2561.         $trazado_barra $this->em->getRepository(TrazadoBarra::class)->getTrazadoBarraByName($trazadoNombre$barraNombre);
  2562.         foreach ($trazado_barra as $tb) {
  2563.             $vs $tb["slope"];
  2564.             $vc $tb["campo"];
  2565.             $par $tb["par"];
  2566.             switch ($tramo) {
  2567.                 case "1-9":
  2568.                     $vs $tb["slope19"];
  2569.                     $vc $tb["campo19"];
  2570.                     $par $tb["par19"];
  2571.                     break;
  2572.                 case "10-18":
  2573.                     $vs $tb["slope1018"];
  2574.                     $vc $tb["campo1018"];
  2575.                     $par $tb["par1018"];
  2576.                     break;
  2577.             }
  2578.             if (!$par || $par == 0) {
  2579.                 $par $parAnt;
  2580.             }
  2581.             $hcps_juego[$tb["sexo"]] = null;
  2582.             if (!is_null($vs) && !is_null($vc) && ($par != 0)) {
  2583.                 $hcps_juego[$tb["sexo"]] = Tarjetas::calcularHcpJuego(null$hcp$vs$vc$par$tramo$porcentaje);
  2584.             }
  2585.             $parAnt $par;
  2586.         }
  2587.         return new JsonResponse($hcps_juego);
  2588.     }
  2589.     /**
  2590.      * F-079 Calcula el handicap de juego de un jugador para la vista de calculadora de club
  2591.      *
  2592.      * TODO Ya existe funcion "nxt_calculo_hcpjuego" que sustituye a esta, cuando se introduzca el nuevo componente en nextcaddy se debera eliminar
  2593.      *
  2594.      * @Route("/calculadora", name="nextcaddy_calculadora_hcpjuego", options={"expose"=true})
  2595.      */
  2596.     public function calculadoraHcpJuego(Request $request) {
  2597.         $data $request->request;
  2598.         $hcp str_replace(",""."$data->get('handicap'));   //arreglo que en JS no funcionaba
  2599.         $hoyo $data->get('hoyo');
  2600.         $barra $data->get('barra');
  2601.         $trazado $data->get('trazado');
  2602.         $parAnt 0;
  2603.         $hcps_juego = array();
  2604.         $trazado_barra $this->em->getRepository(TrazadoBarra::class)->findBy(array('trazado' => $trazado'barra' => $barra'activo' => 1));
  2605.         foreach ($trazado_barra as $tb) {
  2606.             $hoyos '1-18';
  2607.             $vs $tb->getSlope();
  2608.             $vc $tb->getCampo();
  2609.             $par $tb->getPar();
  2610.             switch ($hoyo) {
  2611.                 case 1:
  2612.                     $hoyos '1-9';
  2613.                     $vs $tb->getSlope19();
  2614.                     $vc $tb->getCampo19();
  2615.                     $par $tb->getPar19();
  2616.                     break;
  2617.                 case 2:
  2618.                     $hoyos '10-18';
  2619.                     $vs $tb->getSlope1018();
  2620.                     $vc $tb->getCampo1018();
  2621.                     $par $tb->getPar1018();
  2622.                     break;
  2623.             }
  2624.             //$limites = explode("-", $hoyos);
  2625.             //$par = $this->em->getRepository(Hoyo::class)->getSumaPar($tb->getId(), $limites[0], $limites[1]);
  2626.             if (!$par || $par == 0) {
  2627.                 $par $parAnt;
  2628.             }
  2629.             $hcps_juego[$tb->getSexo()] = null;
  2630.             if (!is_null($vs) && !is_null($vc) && ($par != 0)) {
  2631.                 $hcps_juego[$tb->getSexo()] = Tarjetas::calcularHcpJuego(null$hcp$vs$vc$par$hoyos);
  2632.             }
  2633.             $parAnt $par;
  2634.         }
  2635.         return new JsonResponse($hcps_juego);
  2636.     }
  2637. //    Esta vista deja de ser accesible, se comenta
  2638. //    /*
  2639. //     * F-080 URL de acceso rapido en la pagina de marketing para usuarios de rol Gerente
  2640. //     *
  2641. //     * @Route("/info", name="info", options={"expose"=true})
  2642. //     *
  2643. //     */
  2644. //    public function accesoGerente() {
  2645. //        $username = "gerente";
  2646. //        $token = strtoupper(sha1($username . $this->getParameter('next.secret')));
  2647. //
  2648. //        return $this->redirect($this->generateUrl('get_auto_login', array('username' => $username, 'token' => $token)));
  2649. //    }
  2650.     /**
  2651.      * F-081 Hace autologin y redirige
  2652.      *
  2653.      * @Route("/redirect-login", name="redirect_login", options={"expose"=true}, methods={"GET"})
  2654.      */
  2655.     public function redirectAutoLogin(Request $request) {
  2656.         $data json_decode(base64_decode($request->query->get("g")));
  2657.         $secret $this->getParameter("secret");
  2658.         $nxtSecret $this->getParameter("next.secret");
  2659.         $id UtilStatic::desencriptar($data->i$secret);
  2660.         $username UtilStatic::desencriptar($data->u$secret);
  2661.         $url UtilStatic::desencriptar($data->r$secret);
  2662.         $token UtilStatic::desencriptar($data->t$secret);
  2663.         $iat = new \DateTime(UtilStatic::desencriptar($data->a$secret));
  2664.         $hoy = new \DateTime("now");
  2665.         if ($hoy->format("U") > $iat->format("U")) {
  2666.             $this->addFlash('error'"Imposible acceder (-1)");
  2667.             return $this->redirect($this->generateUrl("portada"));
  2668.         }
  2669.         $user $this->em->getRepository(User::class)->findOneBy(array('username' => $username"enabled" => 1));
  2670.         if (!$user) {
  2671.             $this->addFlash('error'"Imposible acceder (-2)");
  2672.             return $this->redirect($this->generateUrl("portada"));
  2673.         }
  2674.         if (strtoupper($token) != strtoupper(sha1($nxtSecret UtilStatic::encriptar($username$secret) . $secret))) {
  2675.             $this->addFlash('error'"Imposible acceder (-3)");
  2676.             return $this->redirect($this->generateUrl("portada"));
  2677.         }
  2678.         $roles $user->getRoles();
  2679.         $uspsto = new UsernamePasswordToken($usernull'main'$roles);
  2680.         $this->get('security.token_storage')->setToken($uspsto);
  2681.         $this->get('session')->set('_security_main'serialize($uspsto));
  2682.         return $this->redirect($this->generateUrl($url, ['idc' => $id]));
  2683.     }
  2684.     /**
  2685.      * @Route("/staff-redirect/{params}", name="staff_redirect", methods={"GET"})
  2686.      */
  2687.     public function staffRedirect ($params) {
  2688.         $params json_decode(base64_decode($params));
  2689.         $secret $this->getParameter("secret");
  2690.         $nxtSecret $this->getParameter("next.secret");
  2691.         $username UtilStatic::desencriptar($params->username$secret);
  2692.         $token UtilStatic::desencriptar($params->authToken$secret);
  2693.         $url UtilStatic::desencriptar($params->url$secret);
  2694.         $user $this->em->getRepository(User::class)->findOneBy(array('username' => $username"enabled" => 1));
  2695.         if (!$user) {
  2696.             return $this->json([
  2697.                 'success' => false
  2698.             ]);
  2699.         }
  2700.         if (strtoupper($token) != strtoupper(sha1($nxtSecret UtilStatic::encriptar($username$secret) . $secret))) {
  2701.             return $this->json([
  2702.                 'success' => false
  2703.             ]);
  2704.         }
  2705.         $uspsto = new UsernamePasswordToken($usernull'main'$user->getRoles());
  2706.         $this->tokenStorage->setToken($uspsto);
  2707.         $this->session->set('_security_main'serialize($uspsto));
  2708.         return $this->redirect($url);
  2709.     }
  2710.     /**
  2711.      * F-082 Muestra la pagina de suscripcion del telefono
  2712.      *
  2713.      * @Route("/suscripcion/{token}", name="next_suscribe_rgpd", options={"expose"=true})
  2714.      */
  2715.     public function suscripcionRgpd($token) {
  2716.         $key $this->getParameter('secret');
  2717.         $idj UtilStatic::desencriptar($token$key);
  2718.         $jugador $this->em->getRepository(Jugador::class)->find($idj);
  2719.         $clientes $this->em->getRepository(Cliente::class)->findFederaciones();     //findBy(['nombreCorto' => array("AM00", "LV05", "CM41")]);
  2720.         return $this->render("frontend/User/suscribe_rgpd.html.twig", [
  2721.                     "idj"         => $idj,
  2722.                     "clientes"    => $clientes,
  2723.                     'jugadorRGPD' => $jugador->getPrivacidadAsArray(),
  2724.                     'jugador'     => $jugador
  2725.         ]);
  2726.     }
  2727.     /**
  2728.      * F-083 Guarda la configuracion de privacidad del jugador
  2729.      *
  2730.      * @Route("/realizar-suscripcion", name="next_realizar_suscripcion", options={"expose"=true}, methods={"POST"})
  2731.      */
  2732.     public function realizarSuscripcion(Request $requestEnvioSms $messagingUtilJugadores $util_jugadores) {
  2733.         $telefono $request->request->get('telefono');
  2734.         $idj $request->request->get('idj');
  2735.         $privacidad = array();
  2736.         //$clientes = $this->em->getRepository(Cliente::class)->findBy(['nombreCorto' => array("AM00", "LV05", "CM41")]);
  2737.         //$clientes = array("AM00", "LV05", "CM41");
  2738.         $clientes $this->em->getRepository(Cliente::class)->findFederaciones();
  2739.         $todas boolval($request->request->get('pTodas'));
  2740.         if ($todas) {
  2741.             foreach ($clientes as $cn) {
  2742.                 $c $cn->getNombreCorto();
  2743.                 $privacidad[$c] = true;
  2744.             }
  2745.         } else {
  2746.             foreach ($clientes as $cn) {
  2747.                 $c $cn->getNombreCorto();
  2748.                 $privacidad[$c] = boolval($request->request->get('p' $c));
  2749.             }
  2750.         }
  2751.         $jugador $this->em->getRepository(Jugador::class)->find($idj);
  2752.         if ($jugador) {
  2753.             $jpriv $jugador->getPrivacidadSimple();
  2754.             $tel $util_jugadores->getDatoPlanoDesdeJugador($jugador"Telefono");
  2755.             if ($telefono != $tel) {
  2756.                 $log_message "Cambio de telĆ©fono del Jugador " $jugador->getNombreCompleto() . " (" $jugador->getLicencia() . ") en el mĆ©todo " __METHOD__ ", de " . ($tel ?: "(vacio)") . " a " $telefono;
  2757.                 // $jugador->setTelefono($telefono, $secret);
  2758.                 // //$entity->setTlfn($telefono);
  2759.                 $jugador $util_jugadores->setDatoPlanoDesdeJugador($jugador"Telefono"$telefonofalse);
  2760.                 $log = new \App\Entity\Backend\Log('i'$log_messagenull);
  2761.                 $this->em->persist($log);
  2762.             }
  2763.             $new false;
  2764.             foreach ($privacidad as $key => $priv) {
  2765.                 if ($priv) {
  2766.                     if (isset($jpriv[$key])) {
  2767.                         $jugadorRGPD $this->em->getRepository(JugadorRGPD::class)->findBy(['jugador' => $jugador'aceptacion' => $key])[0];
  2768.                     } else {
  2769.                         $jugadorRGPD = new JugadorRGPD();
  2770.                         $jugadorRGPD->setCliente($this->em->getRepository(Cliente::class)->findOneBy(['nombreCorto' => $key]));
  2771.                         $jugadorRGPD->setAceptacion($key);
  2772.                         $jugadorRGPD->setJugador($jugador);
  2773.                         $new true;
  2774.                     }
  2775.                     $jugadorRGPD->setRgpdExtra($request->headers->get("user-agent"));
  2776.                     $jugadorRGPD->setRgpdIP($request->getClientIp());
  2777.                     $jugadorRGPD->setRgpd(true);
  2778.                     if ($new) {
  2779.                         $this->em->persist($jugadorRGPD);
  2780.                     }
  2781.                 }
  2782.             }
  2783.             $this->em->flush();
  2784.             $competi null;
  2785.             $api false;   //mandamos por la api segun corresponda
  2786.             //Buscamos la ultima competicion donde se ha inscrito. Lo normal es que llegue a suscripcion porque se ha inscrito y no tenemos el telefono
  2787.             $inscrito $this->em->getRepository(Inscrito::class)->findOneBy(['jugador' => $jugador], ["created_at" => "DESC"]);
  2788.             if ($inscrito) {
  2789.                 $competi $inscrito->getCompeticion();
  2790.                 $org $competi->getOrganizador()->getCliente()->getId();
  2791.                 $api = ($org >= 3);     //1-RFGA 2-LV05 3-FCG 4y5-FGM
  2792.             }
  2793.             $messaging->enviarSms($telefono"Bienvenido a Nextcaddy, " $jugador->getNombre() . ". " $this->generateUrl('bienvenido_nextcaddy', array('lic' => $jugador->getLicencia()), UrlGeneratorInterface::ABSOLUTE_URL), $competi5$api);
  2794.         }
  2795.         return new JsonResponse(true);
  2796.     }
  2797. // Se elimina esta funcion ya que desaparece el covid de la inscripcion NEX-1838
  2798. //     /**
  2799. //      * F-086 Guardado del FLP. Protocolo covid-19
  2800. //      *
  2801. //      * @Route("/formulario/{idc}", name="_formulario", options={"expose"=true}, methods={"POST"})
  2802. //      */
  2803. //     public function formularioCovid($idc, Request $request, KernelInterface $kernel) {
  2804. //         $competicion = $this->em->getRepository(Competicion::class)->find($idc);
  2805. //         $datos = [];
  2806. //         //$organizadorId = $competicion->getOrganizador()->getId();
  2807. //         /* if (!in_array($organizadorId, ["CM00", "AM00"])) {
  2808. //           return new JsonResponse(["error" => "La competición no estĆ” organizada por la Federación de Golf", "codigo" => false]);
  2809. //           } */
  2810. //         /*
  2811. //           //Se cambia segun tarea NEX-1447-5
  2812. //           if (strpos($competicion->getOrganizador()->getId(), "0") !== false) {
  2813. //           //if ('NEW-FORM' != $competicion->getCodigo() && $competicion->getOrganizador()->getId() != "CM00") {
  2814. //           return new JsonResponse(["error" => "La competición no tiene disponible esta funcionalidad", "codigo" => false]);
  2815. //           } */
  2816. //         $cliente = $competicion->getOrganizador()->getCliente();
  2817. //         $ruta_temporal = $kernel->getProjectDir() . "/public/uploads/inscritoCovid/$idc";
  2818. //         if (!file_exists($ruta_temporal)) {
  2819. //             mkdir($ruta_temporal, 0777, true);
  2820. //         }
  2821. //         $filenameid = sha1(uniqid(mt_rand(), true));
  2822. //         if ($request->request->get('riesgo', 0)) {
  2823. //             $filenameid .= "_x";
  2824. //         }
  2825. //         if (file_exists($ruta_temporal . '/' . $filenameid . '.pdf')) {
  2826. //             unlink($ruta_temporal . '/' . $filenameid . '.pdf');
  2827. //         }
  2828. //         if (in_array($cliente->getId(), [4, 5])) {
  2829. //             $datos['dni'] = $request->request->get('dni');
  2830. //             $params["vulnerable"] = $request->request->get('vulnerable', 0);
  2831. //             if (boolval($params["vulnerable"])) {
  2832. //                 $params["vulnerable_entidad"] = $request->request->get('vulnerable_entidad', "-");
  2833. //                 $params["vulnerable_actividades"] = $request->request->get('vulnerable_actividad', "-");
  2834. //                 $params["vulnerable_fecha"] = $request->request->get('vulnerable_fecha', "-");
  2835. //             }
  2836. //         } elseif (1 == $cliente->getId()) {
  2837. //             $datos['competicion'] = $request->request->get('competicion');
  2838. //             $datos['telefono'] = $request->request->get('telefono', "");
  2839. //             $datos['emailCovid'] = $request->request->get('emailCovid', "");
  2840. //             $datos['ciudad'] = $request->request->get('ciudad');
  2841. //             $params['contacto'] = $request->request->get('contacto');
  2842. //             $params['atencion'] = $request->request->get('atencion');
  2843. //             $params['ambiente'] = $request->request->get('ambiente');
  2844. //             $params['cercana'] = $request->request->get('cercana');
  2845. //             $params['viaje'] = $request->request->get('viaje');
  2846. //             $params['vivir'] = $request->request->get('vivir');
  2847. //             $params['detalles'] = $request->request->get('detalles');
  2848. // //            if(count($competicion->getJornadas()) > 1){
  2849. // //                $params['consciente'] = $request->request->get('detalles');
  2850. // //            }
  2851. //         }
  2852. //         $datos['nombre'] = $request->request->get('nombre');
  2853. //         $params['datos'] = $datos;
  2854. //         $params['firma'] = $request->request->get('firma', null);
  2855. //         $params["propio"] = $request->request->get('propio', 1);
  2856. //         if ($params["propio"] == 0) {
  2857. //             $interesado['nombre'] = $request->request->get('interesado-nombre');
  2858. //             $interesado['dni'] = $request->request->get('interesado-dni', "");
  2859. //         } else {
  2860. //             $interesado['nombre'] = "";
  2861. //             $interesado['dni'] = "";
  2862. //         }
  2863. //         $params['interesado'] = $interesado;
  2864. //         $params['flp'] = $request->request->get('flp', 0);
  2865. //         setlocale(LC_ALL, "es_ES");
  2866. //         $params['fecha'] = strftime("%A %d de %B del %Y");
  2867. //         $params['localidad'] = ucwords($request->request->get('localidad'));
  2868. //         $params['jornadas'] = $competicion->getJornadas();
  2869. //         $html = $this->render('frontend/Competicion/formulario_covid_' . strtolower(substr($cliente->getNombreCorto(), 0, 2)) . '.html.twig', $params);
  2870. //         $myfile = fopen($ruta_temporal . "/" . $filenameid . ".html", "w");
  2871. //         fwrite($myfile, $html);
  2872. //         fclose($myfile);
  2873. //         try {
  2874. //             $isProd = ($kernel->getEnvironment() == 'prod');
  2875. //             if ($_SERVER['SERVER_ADDR'] == "178.33.230.218") {
  2876. //                 $cmd = "/opt/plesk/node/8/bin/relaxed " . $ruta_temporal . "/" . $filenameid . ".html --bo";
  2877. //             } else {
  2878.     // La direccion ha quedado obsoleta
  2879. //                 $cmd = "relaxed " . $ruta_temporal . "/" . $filenameid . ".html --build-once";
  2880. //             }
  2881. //             exec($cmd);
  2882. //             if ($isProd) {
  2883. //                 //Borramos los ficheros temporales generados
  2884. //                 if (file_exists($ruta_temporal . '/' . $filenameid . '.html')) {
  2885. //                     unlink($ruta_temporal . '/' . $filenameid . '.html');
  2886. //                 }
  2887. //                 if (file_exists($ruta_temporal . '/' . $filenameid . '_temp.htm')) {
  2888. //                     unlink($ruta_temporal . '/' . $filenameid . '_temp.htm');
  2889. //                 }
  2890. //             }
  2891. //             $keyAge = $this->getParameter('age.key');
  2892. //             $rutaArchivo = $ruta_temporal . '/' . $filenameid . '.pdf';
  2893. //             if ($isProd) {
  2894. //                 $cmd = "/var/www/vhosts/nextcaddy.com/.linuxbrew/bin/age -r " . $keyAge . " " . $rutaArchivo . " > " . $rutaArchivo . ".age";
  2895. //             } else {
  2896. //                 $cmd = "C:\age\age.exe -r " . $keyAge . " " . $rutaArchivo . " > " . $rutaArchivo . ".age";
  2897. //             }
  2898. //             exec($cmd);
  2899. //             if (file_exists($rutaArchivo) && file_exists($rutaArchivo . ".age")) {
  2900. //                 unlink($rutaArchivo);
  2901. //             }
  2902. //         } catch (\Exception $excptn) {
  2903. //             return new JsonResponse(["error" => "Error generando el PDF", "codigo" => false]);
  2904. //         }
  2905. //         //$file = $ruta_temporal . "/" . $idc . "_formcovid.pdf";
  2906. //         //Si ya tenemos inscrito (es el formulario del horario) entonces aƱadimos el nuevo documento y lo marcamos como ya modificado
  2907. //         $idi = $request->request->get("idi", null);
  2908. //         if (!empty($idi)) {
  2909. //             try {
  2910. //                 $inscrito = $this->em->getRepository(Inscrito::class)->find($idi);
  2911. //                 if ($inscrito) {
  2912. //                     $documento = new InscritoDocumento();
  2913. //                     $documento->setInscrito($inscrito);
  2914. //                     $documento->setDocumento($filenameid . ".pdf");
  2915. //                     $documento->setTipo(2);
  2916. //                     $inscrito->addDocumento($documento);
  2917. //                     //if (is_null($inscrito->getCovidModif())) {
  2918. //                     //    $inscrito->setCovidModif(0);
  2919. //                     //} else {
  2920. //                     $inscrito->setCovidModif(1);
  2921. //                     //}
  2922. //                     $this->em->flush();
  2923. //                 }
  2924. //             } catch (\Throwable $ex) {
  2925. //                 throw new NotFoundHttpException("Error generando el PDF");
  2926. //             }
  2927. //             //        // Segun la nota informativa del 28/03/2022 se comenta esta parte
  2928. //             //        } else {
  2929. //             //            try {
  2930. //             //                $certificado = $request->files->get("certificado", 0);
  2931. //             //
  2932. //             //                if ($certificado) {
  2933. //             //                    $certname = md5(rand() . "_" . uniqid('certCov19')) . ".pdf";
  2934. //             //
  2935. //             //                    $rutaCarpeta = __DIR__ . '/../../../../web/uploads/inscritoCovid/' . $idc;
  2936. //             //                    $rutaArchivo = $rutaCarpeta . "/" . $certname;
  2937. //             //
  2938. //             //                    $certificado->move($rutaCarpeta, $certname);
  2939. //             //
  2940. //             //                    $keyAge = $this->getParameter('age.key');
  2941. //             //                    $isProd = ($kernel->getEnvironment() == 'prod');
  2942. //             //                    if ($isProd) {
  2943. //             //                        $cmd = "/var/www/vhosts/nextcaddy.com/.linuxbrew/bin/age -r " . $keyAge . " " . $rutaArchivo . " > " . $rutaArchivo . ".age";
  2944. //             //                    } else {
  2945. //             //                        $cmd = "C:\age\age.exe -r " . $keyAge . " " . $rutaArchivo . " > " . $rutaArchivo . ".age";
  2946. //             //                    }
  2947. //             //                    exec($cmd);
  2948. //             //
  2949. //             //                    if (file_exists($rutaArchivo) && file_exists($rutaArchivo . ".age")) {
  2950. //             //                        unlink($rutaArchivo);
  2951. //             //                    }
  2952. //             //                } else {
  2953. //             //                    $certname = 0;
  2954. //             //                }
  2955. //             //            } catch (\Throwable $ex) {
  2956. //             //                $log_message = "Error guardando fichero certificado covid " . $idc;
  2957. //             //                $log = new Log('i', $log_message, null);
  2958. //             //                $this->em->persist($log);
  2959. //             //                $this->em->flush();
  2960. //             //            }
  2961. //         }
  2962. //         $flp = $request->request->get("flp", 0);
  2963. //         if ($flp) {
  2964. //             $this->addFlash(
  2965. //                     'success', "Formulario rellenado correctamente");
  2966. //         }
  2967. //         return new JsonResponse(["file" => $filenameid . ".pdf", "codigo" => true /* , "certificado" => $certname */]);
  2968. //     }
  2969. // Se elimina esta funcion ya que desaparece el covid de la inscripcion NEX-1838
  2970.     // /**
  2971.     //  * F-087 Mostrar formulario FLP - Protocolo covid-19
  2972.     //  *
  2973.     //  * @Route("/flp/{idc}/{idi}", name="flp", options={"expose"=true})
  2974.     //  */
  2975.     // function formularioFLP($idc, $idi) {
  2976.     //     $competicion = $this->em->getRepository(Competicion::class)->find($idc);
  2977.     //     if (!$competicion) {
  2978.     //         $this->addFlash('error', "El torneo buscado no existe");
  2979.     //         return $this->redirect($this->generateUrl('portada'));
  2980.     //     }
  2981.     //     $inscrito = $this->em->getRepository(Inscrito::class)->find($idi);
  2982.     //     if (!$inscrito) {
  2983.     //         $this->addFlash('error', "No se ha encontrado al jugador solicitado");
  2984.     //         return $this->redirect($this->generateUrl('_tournament', array('id' => $idc)));
  2985.     //     }
  2986.     //     $secret = $this->getParameter('secret');
  2987.     //     return $this->render("frontend/Default/flp.html.twig", [
  2988.     //                 'competicion' => $competicion,
  2989.     //                 'jornadas'    => $competicion->getJornadas(),
  2990.     //                 'inscrito'    => $inscrito,
  2991.     //                 'secret'      => $secret
  2992.     //     ]);
  2993.     // }
  2994.     /**
  2995.      * F-158 - Mostrar url tokenizada de archivo
  2996.      *
  2997.      * @Route("/resource/{token}", name="resource", options={"expose"=true})
  2998.      *
  2999.      */
  3000.     public function mostrarArchivo($token): Response {
  3001.         try {
  3002.             $ruta explode("|"UtilStatic::desencriptarNew($token$this->getParameter('secret')));
  3003.             $response = new BinaryFileResponse($ruta[1]);
  3004.             switch ($ruta[2]) {
  3005.                 case 'txt':
  3006.                     $documento 'Documento.txt';
  3007.                     break;
  3008.                 case 'exe':
  3009.                     $documento 'Programa.exe';
  3010.                     break;
  3011.                 case 'zip':
  3012.                     $documento 'Programa.zip';
  3013.                     break;
  3014.                 case 'rar':
  3015.                     $documento 'Programa.rar';
  3016.                     break;
  3017.                 default:
  3018.                     $documento 'Documento.pdf';
  3019.                     break;
  3020.             }
  3021.             $response->setContentDisposition(
  3022.                     ResponseHeaderBag::DISPOSITION_INLINE$documento$documento
  3023.             );
  3024.         } catch (\Exception $e) {
  3025.             throw new \Exception("Error, no existe el documento");
  3026.         }
  3027.         return $response;
  3028.     }
  3029.     /**
  3030.      * @param \Symfony\Component\Form\FormInterface $form
  3031.      * @param EnvioCorreo $mailer
  3032.      * @return void
  3033.      */
  3034.     public function sendContact(\Symfony\Component\Form\FormInterface $formEnvioCorreo $mailer): bool
  3035.     {
  3036.         $formData $form->getData();
  3037.         $msg "<br>" $formData['message'];
  3038.         $msg .= "<br><br> [Nombre: " . ($formData['name'] ?? "Sin especificar") . ", Email: " . ($formData['email'] ?? "Sin especificar") . ", Club: " . ($formData['club'] ?? "Sin especificar") . ", License: " . ($formData['license'] ?? "Sin especificar") . "]";
  3039.         $emailStatus $mailer->enviarCorreo([
  3040.             "to" => "info@nextcaddy.com",
  3041.             "subject" => "Mensaje de contacto",
  3042.             "html" => $msg
  3043.         ]);
  3044.         if ($emailStatus) {
  3045.             $this->addFlash("success""Se ha enviado tu mensaje");
  3046.             return true;
  3047.         } else {
  3048.             $this->addFlash("error""No se ha podido enviar tu mensaje");
  3049.             return false;
  3050.         }
  3051.     }
  3052.     /**
  3053.      * @Route("/livescoring-new-template", name="livescoring_new_template")
  3054.      */
  3055.     public function livescoringNewTemplate(): Response
  3056.     {
  3057.         return $this->render('frontend/Default/livescoring_new_template.html.twig');
  3058.     }
  3059. }