src/Controller/Frontend/TournamentController.php line 765

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Controller\Frontend\Tournament\TournamentView;
  4. use App\Controller\Gestion\GestionHorarioController;
  5. use App\Controller\Shared\Inscribed\IncludeInscribedOnWaitingList;
  6. use App\Controller\Shared\Inscribed\UpdateInscribedToIncludeAtWaitingList;
  7. use App\Controller\Shared\Livescoring\LivescoringCache;
  8. use App\DBAL\Backend\EnumEstadoCompeticion;
  9. use App\DBAL\Backend\EnumEstadoInscrito;
  10. use App\DBAL\Backend\EnumEstadoPedido;
  11. use App\DBAL\Backend\EnumEstadoRestringirLicencias;
  12. use App\DBAL\Backend\EnumLivescoringFormula;
  13. use App\Entity\Backend\CompetitionSectionHidden;
  14. use App\Shared\Domain\ProjectEnvironment;
  15. use App\Util\UtilCache;
  16. use App\Web\Player\Domain\Properties\PlayerLicense;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpFoundation\JsonResponse;
  23. use Symfony\Component\HttpKernel\KernelInterface;
  24. use Symfony\Component\Asset\Packages;
  25. use Twig\Environment;
  26. use App\Form\Frontend\InscripcionType;
  27. use App\Form\Frontend\InscripcionParejaType;
  28. use App\Form\Frontend\InscripcionEquipoType;
  29. use App\Entity\Backend\Inscrito;
  30. use App\Entity\Backend\InscritoDocumento;
  31. use App\Entity\Backend\Log;
  32. use App\Entity\Backend\HcpJuego;
  33. use App\Entity\Backend\Equipo;
  34. use App\Util\Util;
  35. use App\Util\UtilJugadores;
  36. use App\Entity\Backend\Pedido;
  37. use App\Entity\Backend\Jugador;
  38. use App\Entity\Backend\AdicionalesInscrito;
  39. use App\Entity\Backend\AutorizadasCircuito;
  40. use App\Entity\Backend\Categoria;
  41. use App\Entity\Backend\CategoriaConfig;
  42. use App\Entity\Backend\Clasificacion;
  43. use App\Entity\Backend\Clasificado;
  44. use App\Entity\Backend\Cliente;
  45. use App\Entity\Backend\Club;
  46. use App\Entity\Backend\Competicion;
  47. use App\Entity\Backend\CompeticionesExcluyentes;
  48. use App\Entity\Backend\Especial;
  49. use App\Entity\Backend\Estadisticas;
  50. use App\Entity\Backend\Horario;
  51. use App\Entity\Backend\Hoyo;
  52. use App\Entity\Backend\InscritoMarcador;
  53. use App\Entity\Backend\Jornada;
  54. use App\Entity\Backend\JornadaConfig;
  55. use App\Entity\Backend\JugadorRGPD;
  56. use App\Entity\Backend\Meteo;
  57. use App\Entity\Backend\Pais;
  58. use App\Entity\Backend\PublicacionPrograma;
  59. use App\Entity\Backend\Resultado;
  60. use App\Entity\Backend\SoftwareGolf;
  61. use App\Entity\Backend\Tarifa;
  62. use App\Entity\Backend\TrazadoBarra;
  63. use App\Entity\Backend\Voucher;
  64. use App\Entity\Gestion\JugadorHorario;
  65. use App\Entity\Gestion\PartidaHorario;
  66. use App\Entity\Gestion\Ranking;
  67. use App\Entity\Gestion\SinAsignarHorario;
  68. use App\Entity\User\User;
  69. use App\Entity\User\UserApp;
  70. use App\Service\EnvioCorreo;
  71. use App\Service\EnvioSms;
  72. use App\Service\FederatedWebService;
  73. use App\Service\NotificacionesService;
  74. use App\Util\SoftwareExternoUtil;
  75. use App\Util\Utilidades;
  76. use App\Util\UtilResultados;
  77. use Doctrine\Persistence\ManagerRegistry;
  78. use Psr\Log\LoggerInterface;
  79. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  80. /**
  81.  * Tournament controller.
  82.  *
  83.  * @Route("/tour")
  84.  */
  85. class TournamentController extends AbstractController
  86. {
  87.     private $em;
  88.     private $util;
  89.     private $utilidades;
  90.     private $util_cache;
  91.     private $manager;
  92.     public function __construct(ManagerRegistry $doctrineUtil $utilUtilidades $utilidadesUtilCache $util_cache)
  93.     {
  94.         $this->util $util;
  95.         $this->utilidades $utilidades;
  96.         $this->em $doctrine->getManager();
  97.         $this->util_cache $util_cache;
  98.         $this->manager $doctrine;
  99.     }
  100.     /**
  101.      * F-031 Visualización de un resumen de competicion (iframe)
  102.      *
  103.      * @Route("-widget/{id}", name="_tour_widget", options={"expose"=true})
  104.      */
  105.     public function tourWidgetAction($id)
  106.     {
  107.         $competicion $this->em->getRepository(Competicion::class)->findBy(['id' => $id'visible' => 1]);
  108.         if (!$competicion) {
  109.             //$this->addFlash('error', "No existe la competición");
  110.             return $this->render('frontend/Competicion/widget.html.twig');
  111.         }
  112.         $numInscritos count($this->em->getRepository(Inscrito::class)->getInscritosActivos($id));
  113.         $climas = [];
  114.         $jornadas $competicion[0]->getJornadas();
  115.         foreach ($jornadas as $jornada) {
  116.             $unserial unserialize($jornada->getClima());      //Devuelve "false" o el deserializado
  117.             if ($unserial) {
  118.                 $climas[$jornada->getOrden()] = $unserial;
  119.             }
  120.         }
  121.         return $this->render('frontend/Competicion/widget.html.twig', [
  122.             'competicion' => $competicion[0],
  123.             'climas' => $climas,
  124.             'numInscritos' => $numInscritos
  125.         ]);
  126.     }
  127.     /**
  128.      * F-032 Muestra la clasificacion de un torneo
  129.      *
  130.      * @Route("/clasificados", name="_ajClasificados", options={"expose"=true})
  131.      */
  132.     public function ajaxGetClasificados(Request $request)
  133.     {
  134.         $params = array();
  135.         $competicion $request->get("id");
  136.         $competi $this->em->getRepository(Competicion::class)->findOneById($competicion);
  137.         $isAjax $request->isXMLHttpRequest();
  138.         if ($isAjax && $competi) {
  139.             if (($competi->getFicheroClasificaciones() == null) || ($competi->getFicheroClasificaciones() == '')) {
  140.                 $totalesbyJornada = array();
  141.                 $equiposJornadas = array();
  142.                 $especial = array();
  143.                 $totales = array();
  144.                 switch ($competi->getJugadores()) {
  145.                     case 1:
  146.                         $njornadas $this->em->getRepository(Clasificado::class)->getJornadasByClasificacion($competicion);
  147.                         $entity $this->em->getRepository(Clasificado::class)->getDataByJornada($competicion$competi->getCalculo()->getId());
  148.                         $view 'frontend/Club/clasificados_new.html.twig';
  149.                         break;
  150.                     case 2:
  151.                         $njornadas $this->em->getRepository(Clasificado::class)->getJornadasByClasificacionCouple($competicion);
  152.                         $entity $this->em->getRepository(Clasificado::class)->getDataByJornadaCouple($competicion$competi->getCalculo()->getId(), falsefalse);
  153.                         foreach ($entity as $e) {
  154.                             $equiposJornadas[$e['idc']][] = $e['jornada'];
  155.                             $totales[$e['idc']] = $this->em->getRepository(Clasificado::class)->getTotalesParejas($e['idc']);
  156.                         }
  157.                         $view 'frontend/Club/clasificadosParejas_new.html.twig';
  158.                         break;
  159.                     default:
  160.                         $njornadas_aux $this->em->getRepository(Clasificado::class)->getJornadasByClasificacionCouple($competiciontrue);
  161.                         //esto lo hacemos solamente aqui, ya que solo se modifica la clasificacion de equipos, pero seria interesante hacerlo en los otros tipos, para optimizar
  162.                         $njornadas = array();
  163.                         foreach ($njornadas_aux as $nja) {
  164.                             $njornadas[$nja['id']] = $nja['contador'];
  165.                         }
  166.                         $entity $this->em->getRepository(Clasificado::class)->getDataByJornadaCouple($competicion$competi->getCalculo()->getId(), truefalse);
  167.                         foreach ($entity as $e) {
  168.                             $totalesbyJornada[$e['idc']][$e['equipo']][$e['jornada']] = array('neto' => $e['neto'], 'bruto' => $e['bruto']);
  169.                             $totalesbyJornada[$e['idc']]['calculo'] = $e['calculo'];
  170.                             $totalesbyJornada[$e['idc']]['clasificacion'] = $e['clasificacion'];
  171.                             $totalesbyJornada[$e['idc']][$e['equipo']]['posicion'] = $e['posicion'];
  172.                             $totalesbyJornada[$e['idc']][$e['equipo']]['nombre_equipo'] = $e['nombre_equipo'];
  173.                             //Reutilizamos este array para no crear uno nuevo y ahorarar memoria. Ahora sera un array de la estructura array[id_equipo[][id_iscrito] = (nombre, hcp, licencia)
  174.                             //$equiposJornadas[$e['idc']][] = $e['jornada'];
  175.                             $equiposJornadas[$e['equipo']][$e['id']]['nombre'] = $e['nombre'];
  176.                             $equiposJornadas[$e['equipo']][$e['id']]['apellidos'] = $e['apellidos'];
  177.                             $equiposJornadas[$e['equipo']][$e['id']]['pais'] = $e['pais'];
  178.                             $equiposJornadas[$e['equipo']][$e['id']]['idPais'] = $e['idPais'];
  179.                             $equiposJornadas[$e['equipo']][$e['id']]['licencia'] = $e['licencia'];
  180.                             $equiposJornadas[$e['equipo']][$e['id']]['hcp'] = $e['hcp'];
  181.                             $equiposJornadas[$e['equipo']][$e['id']]['id'] = $e['id'];
  182.                             if ($e['especial'] != null) {
  183.                                 $nombreEspecial $this->em->getRepository(Especial::class)->findOneById($e['especial']);
  184.                                 $especial[$e['idc']][$e['jornada']][$e['equipo']] = $nombreEspecial->getNombre();
  185.                             }
  186.                         }
  187.                         $view 'frontend/Club/clasificadosEquipos_new.html.twig';
  188.                         break;
  189.                 }
  190.                 $nClasif count($this->em->getRepository(Clasificacion::class)->findByCompeticion($competicion));
  191.                 $params['entities'] = $entity;
  192.                 $params['numClasif'] = $nClasif;
  193.                 $params['njornadas'] = $njornadas;
  194.                 $params['totalesbyJor'] = $totalesbyJornada;
  195.                 $params['eqJornadas'] = $equiposJornadas;
  196.                 $params['especial'] = $especial;
  197.                 $params['competi'] = $competi;
  198.                 $params['totales'] = $totales;
  199.                 if ($nClasif 0) {
  200.                     return $this->render($view$params);
  201.                 } else {
  202.                     $response = new JsonResponse();
  203.                     return $response->setData('No data');
  204.                 }
  205.                 //return new JsonResponse(array('datos' => 'this is a json response '.$competicion));
  206.             } else {
  207.                 $view 'frontend/Club/clasificados_new.html.twig';
  208.                 return $this->render($view, array(
  209.                     /*
  210.                       'entities' => $entity,
  211.                       'numClasif' => $nClasif,
  212.                       'njornadas' => $njornadas,
  213.                       'totalesbyJor' => $totalesbyJornada,
  214.                       'eqJornadas' => $equiposJornadas,
  215.                       'especial' => $especial,
  216.                       'totales' => $totales,
  217.                      */
  218.                     'competi' => $competi
  219.                 ));
  220.             }
  221.         }
  222.         return new Response('This is not ajax!'400);
  223.     }
  224.     /**
  225.      * F-039 Mostrar inscritos. [ NO SE USA ]
  226.      *
  227.      * @Route("/complayers", name="_ajInscritos", options={"expose"=true})
  228.      *
  229.      */
  230.     public function ajaxGetCompPlayers(Request $request)
  231.     {
  232.         $competicion $request->request->get("id");
  233.         $isAjax $request->isXMLHttpRequest();
  234.         if ($isAjax) {
  235.             $comp $this->em->getRepository(Competicion::class)->find($competicion);
  236.             if (($comp->getFicheroInscritos() == null) || ($comp->getFicheroInscritos() == '')) {
  237.                 $num_jugadores $comp->getJugadores();
  238.                 if ($num_jugadores == 1) {
  239.                     $players $this->em->getRepository(Inscrito::class)->getPlayersByCompeticion($competicion);
  240.                     $view "frontend/Inscritos/inscritos_tbl_new.html.twig";
  241.                 } else {
  242.                     $players $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($comp);
  243.                     if ($num_jugadores == 2) {
  244.                         $view "frontend/Inscritos/inscritos_tbl_parejas_new.html.twig";
  245.                     } else {
  246.                         $view "frontend/Inscritos/inscritos_tbl_equipos_new.html.twig";
  247.                     }
  248.                 }
  249.                 $list = array();
  250.                 foreach ($players as $i) {
  251.                     if (!in_array($i->getJugador()->getSexo(), $listtrue)) {
  252.                         array_push($list$i->getJugador()->getSexo());
  253.                     }
  254.                 }
  255.                 if (!$players) {
  256.                     $response = new JsonResponse();
  257.                     return $response->setData('No data');
  258.                 } else {
  259.                     return $this->render($view, array(
  260.                         'inscritos' => $players,
  261.                         'competi' => $comp,
  262.                         'sexos' => count($list)
  263.                     ));
  264.                 }
  265.             } else {
  266.                 $view 'frontend/Inscritos/inscritos_tbl.html.twig';
  267.                 return $this->render($view, array(
  268.                     'competi' => $comp
  269.                 ));
  270.             }
  271.         }
  272.         return new Response('This is not ajax!'400);
  273.     }
  274.     /**
  275.      * F-040 Buscamos la categoria que mejor ajusta para un jugador en una competicion
  276.      *
  277.      * Actualmente solo es llamada desde backend:
  278.      * - admin_competicion_inscritos_new
  279.      * - admin_competicion_inscritos_pareja_new
  280.      * Modularizar con UtilInscritos F-144
  281.      *
  282.      * @Route("/autocomplete-forms/get-categoria-jugador/{idj}/{idc}", name="tour_autocomplete_get_categoria_jugador", options={"expose"=true})
  283.      */
  284.     public function getCategoriaJugador($idj$idc)
  285.     {
  286.         $id_categoria 0;
  287.         $categorias $this->em->getRepository(CategoriaConfig::class)->findAllByCompeticion($idc);
  288.         $jugador $this->em->getRepository(Jugador::class)->find($idj);
  289.         if (empty($jugador) || empty($categorias)) {
  290.             return new JsonResponse($id_categoria);
  291.         }
  292.         $fecha_dummy = new \DateTime('0001-01-01');
  293.         foreach ($categorias as $categoria) {
  294.             $sigue true;
  295.             if (($categoria->getSexo() != NULL) && ($categoria->getSexo() != '') && ($categoria->getSexo() != 'sin especificar')) {
  296.                 $sigue = ($categoria->getSexo() == $jugador->getSexo());
  297.             }
  298.             if (($categoria->getHcpMax() != NULL) && ($categoria->getHcpMax() != 0) && $sigue) {
  299.                 $sigue = (($jugador->getHcp() <= $categoria->getHcpMax()) && $sigue);
  300.             }
  301.             if (($categoria->getHcpMin() != NULL) && ($categoria->getHcpMin() != 0) && $sigue) {
  302.                 $sigue = (($jugador->getHcp() >= $categoria->getHcpMin()) && $sigue);
  303.             }
  304.             if (($categoria->getDesde() != NULL) && ($categoria->getDesde() != $fecha_dummy) && $sigue) {
  305.                 $sigue = (($jugador->getFecha() >= $categoria->getDesde()) && $sigue);
  306.             }
  307.             if (($categoria->getHasta() != NULL) && ($categoria->getHasta() != $fecha_dummy) && $sigue) {
  308.                 $sigue = (($jugador->getFecha() <= $categoria->getHasta()) && $sigue);
  309.             }
  310.             if (($categoria->getNivel() != NULL) && $sigue) {
  311.                 $sigue = (($categoria->getNivel() == $jugador->getNivel()) && $sigue);
  312.             }
  313.             //si hemos seguido en todos los criterios, es decir que coincide en dicha categoria, por lo tanto, salimos y devolvemos el IdCartegoria
  314.             if ($sigue) {
  315.                 $id_categoria $categoria->getCategoria()->getId();
  316.                 break;
  317.             }
  318.         }
  319.         return new JsonResponse($id_categoria);
  320.     }
  321.     /**
  322.      * F-041 Obtenencion el handicap y el sexo de un jugador
  323.      *
  324.      * @Route("/autocomplete-forms/get-hcp-jugador/{licencia}/{club}", name="tour_autocomplete_get_hcp_jugador", options={"expose"=true})
  325.      */
  326.     public function getHcpJugador($licencia$clubFederatedWebService $rfeg)
  327.     {
  328.         $l $licencia;
  329.         $lic substr($l4);
  330.         //Si no es un numero o n oes licencia profesional (acaba en "-P") salimos
  331.         if (!(is_numeric($lic) || substr($lic, -2) === "-P")) {
  332.             return new JsonResponse(array('hcp' => 'ND''sexo' => 's'));
  333.         }
  334.         $jugador $this->em->getRepository(Jugador::class)->findByLicenciaCortaNoTemporal($lic);
  335.         //Aqui solo entra cuando no encuentra a nadie coincidente en nuestra BD
  336.         if (!$jugador) {
  337.             $clubEntity $this->em->getRepository(Club::class)->find($club);
  338.             $cliente $clubEntity->getCliente();
  339.             $organizador $this->em->getRepository(Club::class)->find($cliente->getNombreCorto());
  340.             $rfeg->init($organizador);
  341.             //$jugadores = $rfeg->searchByCode(array('federationCode' => $lic));
  342.             $jugadores $rfeg->listByCode2020(array('federatedCodes' => ['federatedCode' => $lic]));
  343.             if (is_array($jugadores) && array_key_exists('federateds'$jugadores)) {
  344.                 $federados $jugadores->federateds;
  345.                 if (array_key_exists('federated'$federados)) {
  346.                     foreach ($federados as $federado) {
  347.                         $jugador = new Jugador(__METHOD__);
  348.                         $this->utilidades->actualizarDatosJugadorFromFederated($federado$jugador);
  349.                     }
  350.                     $jugador $this->em->getRepository(Jugador::class)->findOneBy(array('habilitado' => 1'licencia' => $jugador->getLicencia()));
  351.                 } else {
  352.                     $jugador null;
  353.                 }
  354.             } else {
  355.                 $jugador null;
  356.             }
  357.         }
  358.         if ($jugador) {
  359.             return new JsonResponse(array('hcp' => $jugador->getHcp(), 'sexo' => substr($jugador->getSexo(), 01)));
  360.         } else {
  361.             return new JsonResponse(array('hcp' => 'ND''sexo' => 's'));
  362.         }
  363.     }
  364.     /**
  365.      * F-042 Obtenencion de valores de slope y campo de un trazado
  366.      *
  367.      * @Route("/autocomplete-forms/get-trazadobarra-valores", name="tour_autocomplete_get_tb_valores", options={"expose"=true})
  368.      */
  369.     public function getTrazadobarraValores(Request $request)
  370.     {
  371.         $valores = array();
  372.         $contrarios = array("femenino" => "masculino""masculino" => "femenino");
  373.         $barra $request->query->get('barra');
  374.         $trazado $request->query->get('trazado');
  375.         $tipo_hoyos $request->query->get('hoyos');
  376.         $trazadosbarras $this->em->getRepository(TrazadoBarra::class)->findBy(array('barra' => $barra'trazado' => $trazado'activo' => 1));
  377.         $sexoAnt "";
  378.         foreach ($trazadosbarras as $tb) {
  379.             $sexo $tb->getSexo();
  380.             switch ($tipo_hoyos) {
  381.                 case 1:
  382.                     $valores[$tb->getSexo()]['slope'] = $tb->getSlope19();
  383.                     $valores[$tb->getSexo()]['campo'] = $tb->getCampo19();
  384.                     break;
  385.                 case 2:
  386.                     $valores[$tb->getSexo()]['slope'] = $tb->getSlope1018();
  387.                     $valores[$tb->getSexo()]['campo'] = $tb->getCampo1018();
  388.                     break;
  389.                 case 3:
  390.                     $valores[$tb->getSexo()]['slope'] = $tb->getSlope();
  391.                     $valores[$tb->getSexo()]['campo'] = $tb->getCampo();
  392.                     break;
  393.             }
  394.             $sexoAnt $sexo;
  395.         }
  396.         if (count($trazadosbarras) < 2) {
  397.             $valores[$contrarios[$sexoAnt]]['slope'] = 0;
  398.             $valores[$contrarios[$sexoAnt]]['campo'] = 0;
  399.         }
  400.         return new JsonResponse($valores);
  401.     }
  402.     /**
  403.      * F-043 Obtencion de todas las barras de un trazado
  404.      *
  405.      * @Route("/autocomplete-forms/get-barras-trazado", name="tour_autocomplete_get_barras_trazado", options={"expose"=true})
  406.      */
  407.     public function getBarraTrazado(Request $request)
  408.     {
  409.         $trazado $request->query->get('trazado');
  410.         $barras $this->em->getRepository(TrazadoBarra::class)->findBarrasTrazados($trazado);
  411.         return new JsonResponse($barras);
  412.     }
  413.     /**
  414.      * F-044 Guarda la configuracion de RGPD del jugador
  415.      *
  416.      * @Route("/autocomplete-forms/actualizar-rgpd", name="tour_autocomplete_update_rgpd", options={"expose"=true})
  417.      */
  418.     public function updateRgpd(Request $requestUtilJugadores $util_jugadores)
  419.     {
  420.         $datos $request->request->get("form");
  421.         if (empty($datos["id"])) {
  422.             return new JsonResponse(["codigo" => -1]);
  423.         }
  424.         $jugador $this->em->getRepository(Jugador::class)->find($datos["id"]);
  425.         if (!$jugador) {
  426.             return new JsonResponse(["codigo" => -1]);
  427.         }
  428.         $organizador "";
  429.         $privacidad $jugador->getPrivacidadSimple();
  430.         //Si es una competicion, marcamos solo la RGPD asociada a dicho organizador, sino marcamos todas
  431.         if ($datos['organizador'] != "0") {
  432.             $organizador $datos["organizador"];
  433.             //Arreglo 28/04/2023
  434.             //$privacidades = ["AM00", "LV05", "CM00"]; //21/03 AQUI HAY QUE AÑADIR MAS POSIBLES PRIVACIDADES <--
  435.             //Si es nulo o falso, lo actualizamos
  436.             if ((!isset($privacidad[$organizador]) || !$privacidad[$organizador])) {
  437.                 $new false;
  438.                 if (isset($privacidad[$organizador])) {
  439.                     $jugadorRGPD $this->em->getRepository(JugadorRGPD::class)->findOneBy(['jugador' => $jugador'aceptacion' => $organizador]);
  440.                 } else {
  441.                     //Pablo 02/05/2023: Buscamos el cliente del club para la aceptacion de la privacidad. Como los clubes "sin cliente" tienen a su federacion, esa es la que se debe aceptar
  442.                     //Pero lo normal es que ese caso en concreo no ocura y que se coja adecuadamente el cliente del club (ya que sino no tiene privacidad propia, sino la de federacion
  443.                     $club $this->em->getRepository(Club::class)->find($organizador);
  444.                     $cliente $club->getCliente();     //$this->em->getRepository(Cliente::class)->findOneBy(['nombreCorto' => $organizador]);
  445.                     if ($cliente) {
  446.                         $jugadorRGPD = new JugadorRGPD();
  447.                         $jugadorRGPD->setCliente($cliente);
  448.                         $jugadorRGPD->setAceptacion($organizador);
  449.                         $jugadorRGPD->setJugador($jugador);
  450.                         $new true;
  451.                     } else {
  452.                         //Este caso no se va a dar, pero debe de estar controlado
  453.                         return new JsonResponse(["codigo" => 0]);
  454.                     }
  455.                 }
  456.                 $jugadorRGPD->setRgpdExtra($request->headers->get("user-agent"));
  457.                 $jugadorRGPD->setRgpdIP($request->getClientIp());
  458.                 $jugadorRGPD->setRgpd(true);
  459.                 if ($new) {
  460.                     $this->em->persist($jugadorRGPD);
  461.                 }
  462.                 if (!empty($datos["email"])) {
  463.                     $jugador $util_jugadores->setDatoPlanoDesdeJugador($jugador"EmailCod"$datos["email"], false);
  464.                     // $jugador->setEmailCod($datos["email"], $secret);
  465.                     // //$jugador->setEmail($datos["email"]);
  466.                     $jugadorRGPD->setNewsletters(!empty($datos["newsletters"]) || intval($datos["newsletters"]));
  467.                 }
  468.                 $this->em->flush();
  469.             }
  470.         } else {    //Si es desde el area de usuario, aceptamos todas las RGPD que tengamos de federaciones
  471.             $privacidades $this->em->getRepository(Cliente::class)->findFederaciones();
  472.             foreach ($privacidades as $p) {
  473.                 $new false;
  474.                 $jugadorRGPD $this->em->getRepository(JugadorRGPD::class)->findOneBy(['jugador' => $jugador'aceptacion' => $p]);
  475.                 if (!$jugadorRGPD) {
  476.                     $jugadorRGPD = new JugadorRGPD();
  477.                     $jugadorRGPD->setCliente($p);
  478.                     $jugadorRGPD->setAceptacion($p->getNombreCorto());
  479.                     $jugadorRGPD->setJugador($jugador);
  480.                     $new true;
  481.                 }
  482.                 $jugadorRGPD->setRgpdExtra($request->headers->get("user-agent"));
  483.                 $jugadorRGPD->setRgpdIP($request->getClientIp());
  484.                 $jugadorRGPD->setRgpd(true);
  485.                 if ($new) {
  486.                     $this->em->persist($jugadorRGPD);
  487.                 }
  488.                 if (!empty($datos["email"])) {
  489.                     $jugador $util_jugadores->setDatoPlanoDesdeJugador($jugador"EmailCod"$datos["email"], false);
  490.                     // $jugador->setEmailCod($datos["email"], $secret);
  491.                     // //$jugador->setEmail($datos["email"]);
  492.                     $jugadorRGPD->setNewsletters(!empty($datos["newsletters"]) || intval($datos["newsletters"]));
  493.                 }
  494.                 $this->em->flush();
  495.             }
  496.         }
  497.         return new JsonResponse(["codigo" => intval($datos["rgpd"])]);
  498.     }
  499.     /**
  500.      * F-045 Obtenemos la informacion detallada de un trazadobarra
  501.      *
  502.      * @Route("/autocomplete-forms/get-datos-trazado", name="tour_autocomplete_get_datos_trazado", options={"expose"=true})
  503.      */
  504.     public function getDatosTrazado(Request $request)
  505.     {
  506.         $trazado $request->query->get('trazado');
  507.         $barra $request->query->get('barra');
  508.         $sexoAnt "";
  509.         $datos = array();
  510.         $contrarios = array("f" => "m""m" => "f");
  511.         $trazadosbarras $this->em->getRepository(TrazadoBarra::class)->findBy(array('trazado' => $trazado'barra' => $barra'activo' => 1));
  512.         foreach ($trazadosbarras as $tb) {
  513.             $sexo substr($tb->getSexo(), 01);
  514.             $hoyos $this->em->getRepository(Hoyo::class)->findBy(array('trazadoBarra' => $tb->getId()));
  515.             $datos[$sexo] = array();
  516.             $datos[$sexo]['metros'] = array();
  517.             $datos[$sexo]['par'] = array();
  518.             $datos[$sexo]['hcp'] = array();
  519.             if ($hoyos) {
  520.                 foreach ($hoyos as $hoyo) {
  521.                     $datos[$sexo]['hoyo'][] = ($hoyo->getAlias()) ? ($hoyo->getAlias()) : ($hoyo->getNumero());
  522.                     $datos[$sexo]['metros'][] = $hoyo->getMetros();
  523.                     $datos[$sexo]['par'][] = $hoyo->getPar();
  524.                     $datos[$sexo]['hcp'][] = $hoyo->getHcp();
  525.                 }
  526.             } else {
  527.                 $datos[$sexo] = $datos[$sexoAnt];
  528.             }
  529.             $sexoAnt $sexo;
  530.         }
  531.         if (count($trazadosbarras) < 2) {
  532.             $datos[$contrarios[$sexoAnt]] = -1;
  533.         }
  534.         return new JsonResponse($datos);
  535.     }
  536.     /**
  537.      * F-046 Se muestra el punto del guardado para la tarjeta-foto
  538.      *
  539.      * @Route("/foto/{token}", name="frontend_tarjeta_foto", options={"expose"=true})
  540.      *
  541.      */
  542.     public function tarjetaFoto($tokenRequest $requestAuthorizationCheckerInterface $authorizationChecker)
  543.     {
  544.         $secret $this->getParameter('secret');
  545.         $long $this->getParameter('next.longitud.hash');
  546.         $params = [];
  547.         $environment $this->getParameter('kernel.environment');
  548.         if ($environment == "dev") {
  549.             $id $token;
  550.         } else {
  551.             $id $this->util->desencriptarLargo($token$secret$long);
  552.         }
  553.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  554.         if (!$competicion) {
  555.             $this->addFlash(
  556.                 'error'"No existe la competicion");
  557.             return $this->redirect($this->generateUrl('provincias'));
  558.         }
  559.         if ($competicion->getModo()->getId() != && !$authorizationChecker->isGranted('ROLE_ADMIN')) {
  560.             $now = new \DateTime('now');
  561.             $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id'fecha' => $now));
  562.         } else {
  563.             $jornadas $competicion->getJornadas();
  564.             $jornada $jornadas[0];
  565.         }
  566.         if (!$jornada) {
  567.             $this->addFlash(
  568.                 'error'"No hay jornada para el dia de hoy en esta competición");
  569.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competicion->getId())));
  570.         }
  571.         $ordenacion = ["i.participa" => "DESC""j.apellidos" => "ASC""j.nombre" => "ASC"];
  572.         $inscritos $this->em->getRepository(Inscrito::class)->getInscritosJugadorActivos($id$ordenacion0, [01]); //getInscritosActivos($id);
  573.         //esto coge los jugadore SIN tarjeta rellena o sin marcador asignado (segun corresponda)
  574.         //$inscritos = $this->em->getRepository(Inscrito::class)->getInscritosSinTarjetaFoto($id, "inscrito", $jornada);
  575.         //$marcadores = $this->em->getRepository(Inscrito::class)->getInscritosSinTarjetaFoto($id, "marcador", $jornada);
  576.         if ($jornada->getModalidad()->getId() != "I") {
  577.             $parejas = [];
  578.             foreach ($inscritos as $ins) {
  579.                 $index $ins->getEquipo() . "-" $ins->getPareja();
  580.                 if (!isset($parejas[$index])) {
  581.                     $parejas[$index] = array();
  582.                 }
  583.                 $parejas[$index][] = $ins;
  584.             }
  585.             $params['parejas'] = $parejas;
  586.         }
  587.         //desglosamos y cogemos siempre todos, de momento ya que puede haber errores al seleccionar el jugador y sino no podrian meter la tarjeta los ultimos jugadores
  588.         $params['inscritos'] = $inscritos;
  589.         $params['marcadores'] = $inscritos;
  590.         $params['jornada'] = $jornada;
  591.         $params['competicion'] = $competicion;
  592.         $insc null;
  593.         $inscToken $request->query->get('i'null);   //esto es una licencia tokenizada
  594.         if (!empty($inscToken)) {
  595.             if ($environment == "dev") {
  596.                 $insc $inscToken;
  597.             } else {
  598.                 $insc $this->util->desencriptarLargo($inscToken$secret$long);
  599.             }
  600.             if ($insc) {
  601.                 //buscamos el inscrito a partir de la licencia y la competicion
  602.                 $inscrt $this->em->getRepository(Inscrito::class)->findJugadorInscritoLicencia($insc$id);  //siempre el primer inscrito del equipo!!
  603.                 if (!empty($inscrt)) {
  604.                     if ($jornada->getModalidad()->getId() != "I") {
  605.                         $params['inscrt'] = $parejas[$inscrt->getEquipo() . "-" $inscrt->getPareja()][0];  //siempre el primer inscrito del equipo!!
  606.                     } else {
  607.                         $params['inscrt'] = $inscrt;
  608.                     }
  609.                 }   //no hay else, dejamos $params['inscrt'] sin definir
  610.                 // //TEMPORAL: Redirigimos a la tarjeta virtual los QRs de las etiquetas para competiciones especificas, para pruebas
  611.                 // $parametro = $this->em->getRepository(Parametro::class)->findOneBy(["tipo" => "ecard", "parametro" => "competiciones"]);
  612.                 // if (in_array($id, explode(",", $parametro->getValor()))) {
  613.                 //     $tokenTVInsc = $this->util->encriptarLargo($jornada->getOrden() . "-" . $params['inscrt']->getId(), $secret, $long);    //tomamos $params['inscrt'] por asegurarnos
  614.                 //     return $this->redirect($this->generateUrl('tarjeta_virtual', ["token" => $tokenTVInsc]));
  615.                 // }
  616.                 if ($competicion->getTarjetaElectronica()) {
  617.                     $tokenTVInsc $this->util->encriptarLargo($jornada->getOrden() . "-" $params['inscrt']->getId(), $secret$long);    //tomamos $params['inscrt'] por asegurarnos
  618.                     return $this->redirect($this->generateUrl('tarjeta_virtual', ["token" => $tokenTVInsc]));
  619.                 }
  620.             }
  621.         }
  622.         $marc null;
  623.         $marcToken $request->query->get('m'null);
  624.         if (!empty($marcToken)) {
  625.             if ($environment == "dev") {
  626.                 $marc $marcToken;
  627.             } else {
  628.                 $marc $this->util->desencriptarLargo($marcToken$secret$long);
  629.             }
  630.         } else {
  631.             $marc false;
  632.             $inscrito_marcador $this->em->getRepository(InscritoMarcador::class)->findOneBy(["inscrito" => $inscrt"jornada" => $jornada]);
  633.             if ($inscrito_marcador) {
  634.                 $marc $inscrito_marcador->getMarcador()->getJugador()->getLicencia();
  635.             }
  636.         }
  637.         if ($marc) {
  638.             $marcador $this->em->getRepository(Inscrito::class)->findJugadorInscritoLicencia($marc$id);  //siempre el primer inscrito del equipo!!
  639.             if ($jornada->getModalidad()->getId() != "I") {
  640.                 $params['mrcdr'] = $parejas[$marcador->getEquipo() . "-" $marcador->getPareja()][0];  //siempre el primer inscrito del equipo!!
  641.             } else {
  642.                 $params['mrcdr'] = $marcador;
  643.             }
  644.         }   //no hay else, dejamos $params['mrcdr'] sin definir
  645.         return $this->render("frontend/Competicion/tarjetaFoto.html.twig"$params);
  646.     }
  647.     /**
  648.      * F-047 Muestra un formulario para crear una nueva entidad de Inscrito
  649.      *
  650.      * @Route("/{id}/inscripcion", name="competicion_inscritos_new", methods={"GET"})
  651.      */
  652.     public function newInscribed($idAuthorizationCheckerInterface $authorizationChecker)
  653.     {
  654.         $competition $this->em->getRepository(Competicion::class)->find($id);
  655.         if (!$competition) {
  656.             $this->addFlash('error'"El torneo buscado no existe");
  657.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  658.         }
  659.         if ($competition->getModo()->getId() < 3) {
  660.             $this->addFlash('error'"No es posible la inscripción Online en esta Competición");
  661.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  662.         }
  663.         if ($competition->getJugadores() != 1) {
  664.             $this->addFlash('error'"No es posible la inscripción individual en este torneo");
  665.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  666.         }
  667.         if (!$authorizationChecker->isGranted('ROLE_ADMIN')) {
  668.             $dateNow = new \DateTime('now');
  669.             if ($competition->getEstado() == EnumEstadoCompeticion::ABIERTA) {
  670.                 if ($competition->getInicio() != NULL) {
  671.                     $inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U'));
  672.                     if ($inscriptionPeriodClosed) {
  673.                         $this->addFlash('other'"Aún no está abierto el plazo --- El plazo de inscripción online se abre el " $competition->getInicio()->format("d/m/Y") . " a las " $competition->getInicio()->format("H:i"));
  674.                         return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  675.                     }
  676.                 } else {
  677.                     $this->addFlash('error'"No es posible la inscripción Online en esta Competición");
  678.                     return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  679.                 }
  680.             } else {
  681.                 if ($competition->getEstado() == EnumEstadoCompeticion::FINALIZADA) {
  682.                     $flashMessage "No es posible la inscripción, el plazo está cerrado";
  683.                 } else {
  684.                     $flashMessage "No es posible la inscripción. La competición está '" $competition->getEstado() . "'";
  685.                 }
  686.                 $this->addFlash('error'$flashMessage);
  687.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  688.             }
  689.         }
  690.         $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  691.         $noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
  692.         if ($noSlotsAvailable) {
  693.             $totalInscribedAtWaitingList $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($idfalse, ["espera"]);
  694.             if ($totalInscribedAtWaitingList 0) {
  695.                 $this->addFlash('info'"Las plazas disponibles están en proceso de pago, inténtelo de nuevo más tarde por si algún jugador no finaliza el proceso");
  696.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  697.             } else {
  698.                 $this->addFlash('error'"No hay más plazas disponibles");
  699.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  700.             }
  701.         }
  702.         $federationId $competition->getClub()->getRfegId();
  703.         if (empty($federationId)) {
  704.             $federationClub = [];
  705.         } else {
  706.             $federationClub $this->manager->getConnection()
  707.                 ->prepare("SELECT c.id as codigo_club, f.id as codigo_federacion FROM Club c inner join club_federacion cf on c.id = cf.club_id inner join Federacion f on cf.federacion_id = f.id WHERE c.rfeg_id = " $federationId)
  708.                 ->executeQuery()->fetchAllAssociative();
  709.         }
  710.         $federationCode = isset($federationClub[0]) ? ($federationClub[0]["codigo_federacion"] ?? null) : null;
  711.         $slotsAvailableMorning 0;
  712.         $slotsAvailableEvening 0;
  713.         $slotsMorning $competition->getPlazasManana();
  714.         $slotsEvening $competition->getPlazasTarde();
  715.         if ($slotsMorning || $slotsEvening 0) {    //si tenemos inscripcion por turnos vemos donde hay hueco
  716.             $slotsAvailableMorning $slotsMorning $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idtrue);
  717.             $slotsAvailableEvening $slotsEvening $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idfalse);
  718.         }
  719.         $form $this->createForm(InscripcionType::class, null, array(
  720.             'attr' => array('id' => "insc" $id'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition'dispManana' => $slotsAvailableMorning'dispTarde' => $slotsAvailableEvening),
  721.             'action' => $this->generateUrl('competicion_guardainscrito', array('id' => $id)),
  722.             'method' => 'POST',
  723.         ));
  724.         $validRates $this->em->getRepository(Tarifa::class)->findTarifasValidasPorCompeticion($id);
  725.         $categories $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  726.         $rounds $competition->getJornadas();
  727.         $miniature file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
  728.         $countries $this->em->getRepository(Pais::class)->findAll();
  729.         return $this->render("frontend/Inscritos/new_new.html.twig", [
  730.             'form' => $form->createView(),
  731.             'competicion' => $competition,
  732.             'tarifas' => $validRates,
  733.             'categorias' => $categories,
  734.             'num_inscritos' => $totalInscribedWithCorrectStatus,
  735.             'codigo_federacion' => $federationCode,
  736.             'jornadas' => $rounds,
  737.             'paises' => $countries,
  738.             'hayMiniatura' => $miniature,
  739.             'flp' => 0,
  740.             'menu' => [], //en el infoalert hay un condicional para que se despliegue si no tiene 'menu' ni 'orden'. Habilitamos uno de los dos
  741.             'orden' => [] //Ya no los habilitamos porque queremos que salga abierto el informacion de interes. 16/07/2019
  742.         ]);
  743.     }
  744.     /**
  745.      * F-048 Muestra un formulario para crear una nueva pareja de Inscritos
  746.      *
  747.      * @Route("/{id}/inscripcion/pareja", name="competicion_inscritos_pareja_new", methods={"GET"})
  748.      */
  749.     public function newInscribedCouple($id)
  750.     {
  751.         $competition $this->em->getRepository(Competicion::class)->find($id);
  752.         if (!$competition) {
  753.             $this->addFlash('error'"El torneo buscado no existe");
  754.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  755.         }
  756.         $competitionIsCalendarMode $competition->getModo()->getId() === 1;
  757.         $competitionIsOfflineMode $competition->getModo()->getId() === 2;
  758.         $incorrectCompetitionMode $competitionIsCalendarMode || $competitionIsOfflineMode;
  759.         if ($incorrectCompetitionMode) {
  760.             $this->addFlash('error'"No es posible la inscripción Online en esta Competición");
  761.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  762.         }
  763.         if ($competition->getJugadores() != 2) {
  764.             $this->addFlash(
  765.                 'error'"Este torneo sólo permite la inscripcion de parejas");
  766.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  767.         }
  768.         $dateNow = new \DateTime('now');
  769.         if ($competition->getEstado() == EnumEstadoCompeticion::ABIERTA) {
  770.             if (!is_null($competition->getInicio())) {
  771.                 $inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U'));
  772.                 if ($inscriptionPeriodClosed) {
  773.                     $this->addFlash('error'"El plazo de inscripción online se abre el " $competition->getInicio()->format("d/m/Y") . " a las " $competition->getInicio()->format("H:i"));
  774.                     return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  775.                 }
  776.             } else {
  777.                 $this->addFlash('error'"La competición aún no tiene plazo de inscripción");
  778.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  779.             }
  780.         } else {
  781.             if ($competition->getEstado() == EnumEstadoCompeticion::FINALIZADA) {
  782.                 $this->addFlash('error'"No es posible la inscripción, el plazo está cerrado");
  783.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  784.             } else {
  785.                 $this->addFlash('error'"No es posible la inscripción. La competición está '" $competition->getEstado() . "'");
  786.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  787.             }
  788.         }
  789.         $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  790.         $noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
  791.         if ($noSlotsAvailable) {
  792.             $this->addFlash('error'"No hay más plazas disponibles");
  793.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  794.         }
  795.         $federationId $competition->getClub()->getRfegId();
  796.         $federationClub $this->manager->getConnection()
  797.             ->prepare("SELECT c.id as codigo_club, f.id as codigo_federacion FROM Club c inner join club_federacion cf on c.id = cf.club_id inner join Federacion f on cf.federacion_id = f.id WHERE c.rfeg_id = " $federationId)
  798.             ->executeQuery()->fetchAllAssociative();
  799.         $federationCode $federationClub[0] ? ($federationClub[0]["codigo_federacion"] ?? null) : null;
  800.         $slotsAvailableMorning 0;
  801.         $slotsAvailableEvening 0;
  802.         $slotsMorning $competition->getPlazasManana();
  803.         $slotsEvening $competition->getPlazasTarde();
  804.         if ($slotsMorning || $slotsEvening 0) {    //si tenemos inscripcion por turnos vemos donde hay hueco
  805.             $slotsAvailableMorning $slotsMorning $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idtrue);
  806.             $slotsAvailableEvening $slotsEvening $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idfalse);
  807.         }
  808.         $form $this->createForm(InscripcionParejaType::class, null, array(
  809.             'attr' => array('id' => "insc" $id'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition'dispManana' => $slotsAvailableMorning'dispTarde' => $slotsAvailableEvening),
  810.             'action' => $this->generateUrl('competicion_guardainscrito_pareja', array('id' => $id)),
  811.             'method' => 'POST',
  812.         ));
  813.         $validRates $this->em->getRepository(Tarifa::class)->findTarifasValidasPorCompeticion($id);
  814.         $categoriesByCompetition $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  815.         $rounds $competition->getJornadas();
  816.         $countries $this->em->getRepository(Pais::class)->findAll();
  817.         $miniature file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
  818.         $hasProam boolval($this->em->getRepository(Competicion::class)->hasJornadaProam($id));
  819.         return $this->render("frontend/Inscritos/new_pareja_new.html.twig", [
  820.             'form' => $form->createView(),
  821.             'competicion' => $competition,
  822.             'tarifas' => $validRates,
  823.             'categorias' => $categoriesByCompetition,
  824.             'num_inscritos' => $totalInscribedWithCorrectStatus,
  825.             'jornadas' => $rounds,
  826.             'codigo_federacion' => $federationCode,
  827.             'paises' => $countries,
  828.             'hayMiniatura' => $miniature,
  829.             'esProam' => $hasProam,
  830.             'menu' => [], //en el infoalert hay un condicional para que se despliegue si no tiene 'menu' ni 'orden'. Habilitamos uno de los dos
  831.             'orden' => [] //Ya no los habilitamos porque queremos que salga abierto el informacion de interes. 16/07/2019
  832.         ]);
  833.     }
  834.     /**
  835.      * F-084 Muestra el formulario de inscripciones de equipos
  836.      *
  837.      * @Route("/{id}/inscripcion/equipo", name="competicion_inscritos_equipo_new", methods={"GET"})
  838.      */
  839.     public function newInscribedTeam($id)
  840.     {
  841.         $competition $this->em->getRepository(Competicion::class)->find($id);
  842.         if (!$competition) {
  843.             $this->addFlash('error'"El torneo buscado no existe");
  844.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  845.         }
  846.         $competitionIsCalendarMode $competition->getModo()->getId() === 1;
  847.         $competitionIsOfflineMode $competition->getModo()->getId() === 2;
  848.         $incorrectCompetitionMode $competitionIsCalendarMode || $competitionIsOfflineMode;
  849.         if ($incorrectCompetitionMode) {
  850.             $this->addFlash('error'"No es posible la inscripción Online en esta Competición");
  851.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  852.         }
  853.         $competitionIsNotForTeams $competition->getJugadores() <= 2;
  854.         if ($competitionIsNotForTeams) {
  855.             $this->addFlash('error'"Este torneo solo permite la inscripción de equipos");
  856.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  857.         }
  858.         $dateNow = new \DateTime('now');
  859.         if ($competition->getEstado() == EnumEstadoCompeticion::ABIERTA) {
  860.             if ($competition->getInicio() != NULL) {
  861.                 $inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U'));
  862.                 if ($inscriptionPeriodClosed) {
  863.                     $this->addFlash('error'"El plazo de inscripción online se abre el " $competition->getInicio()->format("d/m/Y") . " a las " $competition->getInicio()->format("H:i"));
  864.                     return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  865.                 }
  866.             } else {
  867.                 $this->addFlash('error'"La competición aún no tiene plazo de inscripción");
  868.                 return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  869.             }
  870.         } else {
  871.             if ($competition->getEstado() == EnumEstadoCompeticion::FINALIZADA) {
  872.                 if (($competition->getInicio() != NULL) && ($competition->getFin() != NULL)) {
  873.                     $inscriptionPeriodClosed = ($dateNow->format('Y-m-d') < $competition->getInicio()->format('Y-m-d')) || ($dateNow->format('Y-m-d') > $competition->getFin()->format('Y-m-d'));
  874.                     if ($inscriptionPeriodClosed) {
  875.                         $this->addFlash('error'"El plazo para la inscripción online finalizó el " $competition->getFin()->format('d/m/Y') . " a las " $competition->getFin()->format('H:i') . ". Consulte con su Club");
  876.                         return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  877.                     }
  878.                 } else {
  879.                     $this->addFlash('error'"No es posible la inscripción. La competición está '" $competition->getEstado() . "'");
  880.                     return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  881.                 }
  882.             } else {
  883.                 $this->addFlash('error'"No es posible la inscripción. La competición está '" $competition->getEstado() . "'");
  884.                 return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  885.             }
  886.         }
  887.         $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  888.         $noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
  889.         if ($noSlotsAvailable) {
  890.             $this->addFlash('error'"No hay más plazas disponibles");
  891.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  892.         }
  893.         $slotsAvailableMorning 0;
  894.         $slotsAvailableEvening 0;
  895.         $slotsMorning $competition->getPlazasManana();
  896.         $slotsEvening $competition->getPlazasTarde();
  897.         if ($slotsMorning || $slotsEvening 0) {    //si tenemos inscripcion por turnos vemos donde hay hueco
  898.             $slotsAvailableMorning $slotsMorning $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idtrue);
  899.             $slotsAvailableEvening $slotsEvening $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idfalse);
  900.         }
  901.         $federationId $competition->getClub()->getRfegId();
  902.         $federationClub $this->manager->getConnection()
  903.             ->prepare("SELECT c.id as codigo_club, f.id as codigo_federacion FROM Club c inner join club_federacion cf on c.id = cf.club_id inner join Federacion f on cf.federacion_id = f.id WHERE c.rfeg_id = " $federationId)
  904.             ->executeQuery()->fetchAllAssociative();
  905.         $federationClubCode $federationClub[0] ? ($federationClub[0]["codigo_federacion"] ?? null) : null;
  906.         $form $this->createForm(InscripcionEquipoType::class, null, array(
  907.             'attr' => array('jugadores' => $competition->getJugadores(), 'id' => "insc" $id'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition'dispManana' => $slotsAvailableMorning'dispTarde' => $slotsAvailableEvening),
  908.             'action' => $this->generateUrl('competicion_guardainscrito_equipo', array('id' => $id)),
  909.             'method' => 'POST',
  910.         ));
  911.         $validRates $this->em->getRepository(Tarifa::class)->findTarifasValidasPorCompeticion($id);
  912.         $categories $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  913.         $rounds $competition->getJornadas();
  914.         $miniature file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
  915.         $hasProam boolval($this->em->getRepository(Competicion::class)->hasJornadaProam($id));
  916.         return $this->render("frontend/Inscritos/new_equipo.html.twig", [
  917.             'form' => $form->createView(),
  918.             'competicion' => $competition,
  919.             'tarifas' => $validRates,
  920.             'categorias' => $categories,
  921.             'num_inscritos' => $totalInscribedWithCorrectStatus,
  922.             'jornadas' => $rounds,
  923.             'codigo_federacion' => $federationClubCode,
  924.             'hayMiniatura' => $miniature,
  925.             'esProam' => $hasProam,
  926.             'menu' => [], //en el infoalert hay un condicional para que se despliegue si no tiene 'menu' ni 'orden'. Habilitamos uno de los dos
  927.             'orden' => [] //Ya no los habilitamos porque queremos que salga abierto el informacion de interes. 16/07/2019
  928.         ]);
  929.     }
  930.     /**
  931.      * F-049 Guardado de un inscrito individual
  932.      *
  933.      * @Route("/{id}/guardar-inscrito", name="competicion_guardainscrito")
  934.      */
  935.     public function saveInscribed($idRequest $requestEnvioCorreo $mailerNotificacionesService $notificatorEnvioSms $messagingLoggerInterface $swgolfLoggerSoftwareExternoUtil $swutilUtilJugadores $util_jugadoresIncludeInscribedOnWaitingList $includeInscribedOnWaitingList)
  936.     {
  937.         $competition $this->em->getRepository(Competicion::class)->find($id);
  938.         if (!$competition) {
  939.             $this->addFlash(
  940.                 'error'"El torneo buscado no existe");
  941.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  942.         }
  943.         $competitionIsCalendarMode $competition->getModo()->getId() === 1;
  944.         $competitionIsOfflineMode $competition->getModo()->getId() === 2;
  945.         $incorrectCompetitionMode $competitionIsCalendarMode || $competitionIsOfflineMode;
  946.         $competitionStatusIsNotOpen $competition->getEstado() != EnumEstadoCompeticion::ABIERTA;
  947.         if ($incorrectCompetitionMode && $competitionStatusIsNotOpen) {
  948.             $this->addFlash('error'"No es posible inscribirse online en esta competición o el plazo ha finalizado. Consulte con su Club");
  949.             return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  950.         }
  951.         $dateNow = new \DateTime('now');
  952.         if (($competition->getInicio() != NULL) && ($competition->getFin() != NULL)) {
  953.             $inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U')) || ($dateNow->format('U') > $competition->getFin()->format('U'));
  954.             if ($inscriptionPeriodClosed) {
  955.                 $this->addFlash('error'"El plazo para la inscripción online está cerrado. Consulte con su Club");
  956.                 return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  957.             }
  958.         }
  959.         $competitionIsNotIndividual $competition->getJugadores() != 1;
  960.         if ($competitionIsNotIndividual) {
  961.             $this->addFlash('error'"Solo es posible la inscripción individual");
  962.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  963.         }
  964.         $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  965.         $noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
  966.         if ($noSlotsAvailable) {
  967.             $totalInscribedWithWaitStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($idfalse, ['espera']);
  968.             $errorMessage "No hay plazas disponibles en este momento.";
  969.             if ($totalInscribedWithWaitStatus 0) {
  970.                 $errorMessage .= " Hay $totalInscribedWithWaitStatus pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
  971.             }
  972.             $this->addFlash('error'$errorMessage);
  973.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  974.         }
  975.         $waitingListWithSlots $competition->getListaEspera() && $competition->getPlazasListaEspera() > 0;
  976.         if ($waitingListWithSlots) {
  977.             $totalSlotsWaitingList $this->em->getRepository(Inscrito::class)->getCountInscritosListaEspera($competition);
  978.             $waitingListFull $totalSlotsWaitingList >= $competition->getPlazasListaEspera();
  979.             if ($waitingListFull) {
  980.                 $this->addFlash('error'"La lista de espera esta completa en este momento");
  981.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  982.             }
  983.         }
  984.         $slotsAvailableMorning 0;
  985.         $slotsAvailableEvening 0;
  986.         $slotsMorning $competition->getPlazasManana();
  987.         $slotsEvening $competition->getPlazasTarde();
  988.         if ($slotsMorning || $slotsEvening 0) {
  989.             $slotsAvailableMorning $slotsMorning $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idtrue);
  990.             $slotsAvailableEvening $slotsEvening $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idfalse);
  991.         }
  992.         $playerId $request->request->get('inscripcion_jugador')['id'];
  993.         if (empty($playerId)) {
  994.             $this->addFlash('error'"No se ha seleccionado un jugador");
  995.             return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  996.         }
  997.         $player $this->em->getRepository(Jugador::class)->find($playerId);
  998.         if (!$player) {
  999.             $this->addFlash('error'"No se ha seleccionado un jugador");
  1000.             return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1001.         }
  1002.         $form $this->createForm(InscripcionType::class, null, array(
  1003.             'attr' => array('id' => "insc" $id'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition'dispManana' => $slotsAvailableMorning'dispTarde' => $slotsAvailableEvening),
  1004.             'method' => 'POST'
  1005.         ));
  1006.         $form->handleRequest($request);
  1007.         $secret $this->getParameter('secret');
  1008.         if ($form->isSubmitted() && $form->isValid()) {
  1009.             $emptyEmailOrId = empty($form->get('email')->getData()) || empty($form->get('id')->getData());
  1010.             if ($emptyEmailOrId) {
  1011.                 $this->addFlash('error'"Ni el jugador ni el email pueden ser vacíos");
  1012.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1013.             }
  1014.             $categoryId 0;
  1015.             $existTeeFromForm $form->has('barra') && !empty($form->get('barra')->getData());
  1016.             $existCategoryFromForm $form->has('categoria') && !empty($form->get('categoria')->getData());
  1017.             if ($existTeeFromForm) {
  1018.                 $categoryId $form->get('barra')->getData(); //No es la barra, es el ID de categoria de la barra que ha selecionado el jugador
  1019.             } elseif ($existCategoryFromForm) {
  1020.                 $categoryId $form->get('categoria')->getData(); //ID de categoria del jugador
  1021.             }
  1022.             $category $this->em->getRepository(Categoria::class)->find($categoryId);
  1023.             if (!$category) {
  1024.                 $this->addFlash('error'"Su inscripción no se ha podido completar porque no reune las condiciones definidas en las Categorías de la Competición. Para más información, póngase en contacto con el club");
  1025.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1026.             }
  1027.             $rateFromForm $form->get('tarifa')->getData();
  1028.             if (!$rateFromForm) {
  1029.                 $this->addFlash('error'"Su inscripción no se ha podido completar porque no reune las condiciones definidas en las Tarifas de la Competición. Para más información, póngase en contacto con el club");
  1030.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1031.             }
  1032.             $shiftForm 'mañana';  //por defecto
  1033.             if ($form->has('turno')) {  //si viene turno tomamos su valor
  1034.                 $shiftForm $form->get('turno')->getData();
  1035.                 if (!empty($shiftForm)) {
  1036.                     if ($shiftForm == 'mañana') {
  1037.                         $slotsShift $competition->getPlazasManana();
  1038.                     } else {
  1039.                         $slotsShift $competition->getPlazasTarde();
  1040.                     }
  1041.                     $slotsAvailable $slotsShift $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shiftForm == 'mañana'));
  1042.                     if ($slotsAvailable 1) {
  1043.                         $this->addFlash('error'"No se ha podido completar la inscripción porque el turno seleccionado está lleno");
  1044.                         return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1045.                     }
  1046.                 } else {
  1047.                     $shiftForm 'mañana';  //por defecto
  1048.                 }
  1049.             }
  1050.             $inscribed = new Inscrito();
  1051.             $emailForm $form->get('email')->getData();
  1052.             $phoneForm = (!$form->has('telefono_jugador')) ? null $form->get('telefono_jugador')->getData();
  1053.             if (!empty($phoneForm)) {
  1054.                 $competitionClient $competition->getOrganizador()->getCliente();
  1055.                 $playerPhone $util_jugadores->getDatoPlanoDesdeJugador($player"Telefono"$competitionClient);
  1056.                 if (empty($playerPhone)) {
  1057.                     $logMessage "Cambio de teléfono del Jugador " $player->getNombreCompleto() . " (" $player->getLicencia() . ") en el método " __METHOD__ ", de " . ($playerPhone ?: "(vacio)") . " a " $phoneForm;
  1058.                     $player $util_jugadores->setDatoPlanoDesdeJugador($player"Telefono"$phoneFormfalse$competitionClient);
  1059.                     $log = new Log('i'$logMessagenull);
  1060.                     $this->em->persist($log);
  1061.                 }
  1062.             }
  1063.             $observationsForm $this->util->limpiar($form->get('observaciones')->getData(), false);
  1064.             if (str_contains($competition->getOrganizador()->getId(), "AM")) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  1065.                 $privacyOrganiser "AM00";
  1066.             } else {
  1067.                 $privacyOrganiser $competition->getOrganizador()->getId();
  1068.             }
  1069.             $rgpd $player->getPrivacidadSimple();
  1070.             if (!isset($rgpd[$privacyOrganiser])) {
  1071.                 $playerPrivacy = new JugadorRGPD();
  1072.                 $playerPrivacy->setAceptacion($privacyOrganiser);
  1073.                 $playerPrivacy->setNewsletters(null);
  1074.                 $playerPrivacy->setJugador($player);
  1075.                 $playerPrivacy->setRgpd(true);
  1076.                 $playerPrivacy->setRgpdExtra($request->headers->get("user-agent"));
  1077.                 $playerPrivacy->setRgpdIP($request->getClientIp());
  1078.                 $playerPrivacy->setCliente($competition->getOrganizador()->getCliente());
  1079.                 $player->addPrivacidad($playerPrivacy);
  1080.             }
  1081.             $playerHasPlayAnyCompetition $competition->getNumCompeticiones() != 0;
  1082.             $incorrectNumberOfCompetitionsForConditions $player->getNumCompeticiones() < $competition->getNumCompeticiones();
  1083.             $incorrectStatusHcp = ($player->getEstadoHcp()) != 10 && ($player->getEstadoHcp() != 99);
  1084.             $playerIsNotActive = !$player->getActivo();
  1085.             $playerNotComplyWithCompetitionsConditions = ($playerHasPlayAnyCompetition && $incorrectNumberOfCompetitionsForConditions) || ($incorrectStatusHcp) || $playerIsNotActive;
  1086.             if ($playerNotComplyWithCompetitionsConditions) {
  1087.                 $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") no cumple las condiciones de inscripción");
  1088.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1089.             }
  1090.             $orderNumber $this->em->getRepository(Pedido::class)->findLastPedido($competition->getId());
  1091.             if (!is_null($orderNumber)) {
  1092.                 $orderNumber substr($orderNumber['numero'], 102);
  1093.                 $orderNumber++;
  1094.             } else {
  1095.                 $orderNumber 'AA';
  1096.             }
  1097.             //Inicializamos el pedido, pero no lo guardamos todavia, hace falta el inscrito
  1098.             $inscribedOrder = new Pedido();
  1099.             $inscribedOrder->setEmail($emailForm);
  1100.             $inscribedOrder->setEmailCod($emailForm$secret);
  1101.             $inscribedOrder->setConcepto("ionline");
  1102.             $amount 0;
  1103.             $applyRate true;
  1104.             $letter "F";
  1105.             $autorizedLicenseToCircuit $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $player->getLicenciaCorta());
  1106.             //Comprobamos si esta licencia pertenece a las licencias permitidas que no pagan, pero deben de ir por el flujo normal de inscripcion {NEX-1754}
  1107.             if (count($autorizedLicenseToCircuit) > 0) {
  1108.                 $applyRate false;
  1109.                 $letter "V";
  1110.             }
  1111.             $inscribedOrder->setNumero($competition->getId() . $letter $competition->getOrganizador()->getId() . $orderNumber);
  1112.             $rate $this->em->getRepository(Tarifa::class)->find($rateFromForm);
  1113.             if ($applyRate) {
  1114.                 $amount $rate->getImporte();
  1115.             }
  1116.             if ($form->has('voucher')) {
  1117.                 $voucherCodeForm strtoupper($form['voucher']->getData());
  1118.                 if (!empty($voucherCodeForm)) {
  1119.                     $voucher $this->em->getRepository(Voucher::class)->findOneBy(['codigo' => $voucherCodeForm]);
  1120.                     if (empty($voucher)) {
  1121.                         $this->addFlash('error''No existe ningún voucher con este código');
  1122.                         return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  1123.                     } else {
  1124.                         $validVoucher false;
  1125.                         $now = new \DateTime('now');
  1126.                         $validDate = ($voucher->getFechaInicio()->format('U') <= $now->format('U')) && ($now->format('U') <= $voucher->getFechaFin()->format('U'));
  1127.                         if (!$validDate) {
  1128.                             $this->addFlash('error''Ha expirado la fecha de validez del voucher');
  1129.                             return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  1130.                         }
  1131.                         if (count($voucher->getCompeticiones()) == 0) {
  1132.                             $validVoucher true;
  1133.                         } else {
  1134.                             foreach ($voucher->getCompeticiones() as $voucherCompetition) {
  1135.                                 if ($voucherCompetition->getId() == $id) {
  1136.                                     $validVoucher true;
  1137.                                 }
  1138.                             }
  1139.                         }
  1140.                         if ($validVoucher) {
  1141.                             $voucherAmount $voucher->getCantidad();
  1142.                             switch ($voucher->getTipo()) {
  1143.                                 //Fijo
  1144.                                 case 1:
  1145.                                     $amount -= $voucherAmount;
  1146.                                     break;
  1147.                                 //Porcentual
  1148.                                 case 2:
  1149.                                     $voucherAmount $voucherAmount 100;
  1150.                                     $amount $amount - ($amount $voucherAmount);
  1151.                             }
  1152.                             $amount max($amount0);
  1153.                             $inscribedOrder->setVoucher($voucher);
  1154.                         } else {
  1155.                             $this->addFlash('error''Este voucher no es válido para esta competición');
  1156.                             return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  1157.                         }
  1158.                     }
  1159.                 }
  1160.             }
  1161.             $inscribedOrder->setImporte($amount);
  1162.             $inscribedOrder->setTarifa(($applyRate) ? $rate null);     //Si tenemos un miembro de comite que juega gratis, el pedido NO tiene tarifaa y es importe cero (es como se se hubiera inscrito por gestion)
  1163.             $inscribedOrder->setTarifa2(null);
  1164.             if (== $amount) {
  1165.                 $inscribedOrder->setEstado(EnumEstadoPedido::PAGADO);
  1166.             } else {
  1167.                 $inscribedOrder->setEstado(EnumEstadoPedido::ESPERA);
  1168.             }
  1169.             $exclusionsList = array();
  1170.             $exclusionsCompetitions $this->em->getRepository(CompeticionesExcluyentes::class)->findByCompeticion($id);
  1171.             foreach ($exclusionsCompetitions as $exclusionCompetition) {
  1172.                 $exclusionsList[] = $exclusionCompetition->getAgrupacion()->getId();
  1173.             }
  1174.             //Si no hay ninguna, continuamos
  1175.             if (count($exclusionsList) > 0) {
  1176.                 //Buscamos si esta inscrito en alguna de las competiciones excluyentes, a partir del grupo.
  1177.                 $exclusionCompetitionsByPlayerLicense $this->em->getRepository(CompeticionesExcluyentes::class)->findExcluyentesSimpleLicencia($player->getLicencia(), $exclusionsList$id);
  1178.                 if (count($exclusionCompetitionsByPlayerLicense) > 0) {
  1179.                     $messageResponse "<ul>";
  1180.                     foreach ($exclusionCompetitionsByPlayerLicense as $exc) {
  1181.                         $messageResponse .= "<li><a href='" $this->generateUrl('competicion_inscritos_new', array('id' => $id)) . "' class='alert-link'>" $exc->getNombre() . " (" $exc->getFecha()->format("d/m/Y") . ")</a></li>, ";
  1182.                     }
  1183.                     $messageResponse substr($messageResponse0, -1) . "</ul>";
  1184.                     $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") está inscrito en alguna competición excluyente de ésta:" $messageResponse);
  1185.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1186.                 }
  1187.             }
  1188.             $checkPlayerId = function ($playerId) {
  1189.                 return function ($keyInscrito $inscribed) use ($playerId) {
  1190.                     return (($inscribed->getJugador()->getId() == $playerId) && ($inscribed->getEstado() == "pagado"));
  1191.                 };
  1192.             };
  1193.             if ($competition->getInscritos()->exists($checkPlayerId($player->getId()))) {
  1194.                 $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") ya está inscrito en la competición");
  1195.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1196.             }
  1197.             if (str_starts_with($player->getLicencia(), PlayerLicense::FOREING_PREFIX)) {
  1198.                 $hcpDocumentForm $form->get('documentoHcp')->getData();
  1199.                 if (!is_null($hcpDocumentForm)) {
  1200.                     $hcpNameReport md5(rand() . "_" uniqid('infHcp')) . ".pdf";
  1201.                     $hcpDocumentForm->move(__DIR__ '/../../../../web/uploads/informesHcp'$hcpNameReport);
  1202.                     $documentInscribed = new InscritoDocumento();
  1203.                     $documentInscribed->setInscrito($inscribed);
  1204.                     $documentInscribed->setDocumento($hcpNameReport);
  1205.                     $documentInscribed->setTipo(1);
  1206.                     $inscribed->addDocumento($documentInscribed);
  1207.                 } else {
  1208.                     $this->addFlash('error'"Para jugadores extranjeros es necesario adjuntar el informe de handicap de su federación");
  1209.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1210.                 }
  1211.             }
  1212.             $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  1213.             $isWaitingList = (($totalInscribedWithCorrectStatus >= $competition->getPlazas()) && $competition->getListaEspera());
  1214.             $inscribed->setCompeticion($competition);
  1215.             $inscribed->setJugador($player);
  1216.             $inscribed->setCategoria($category);
  1217.             $inscribed->setCategoriaCondicion($category->getCategoriaCondicion());
  1218.             $maximumTeamNumber $this->em->getRepository(Inscrito::class)->findMaxEquipoInscrito($competition->getId());
  1219.             $maximumTeamId = (!empty($maximumTeamNumber)) ? ($maximumTeamNumber 1) : 1;
  1220.             $maximumTeamId = (substr($competition->getOrganizador()->getId(), 0, -2) != "AM") ? $maximumTeamId;
  1221.             $inscribed->setEquipo($maximumTeamId);
  1222.             $inscribed->setPareja('0');
  1223.             $inscribed->setParticipa($isWaitingList ? -1);
  1224.             $inscribed->setNivel($player->getNivel());
  1225.             $inscribed->setTipoInscripcion("frontend");
  1226.             $inscribed->setNombreEquipo("");
  1227.             $inscribed->setEstado($inscribedOrder->getEstado());
  1228.             $inscribed->setObservaciones($observationsForm);
  1229.             $inscribed->setValido(true);
  1230.             $inscribed->setTarifa($rate);
  1231.             $inscribed->setTurno($shiftForm);
  1232.             $inscribed->setHcp($player->getHcp());
  1233.             $inscribed $includeInscribedOnWaitingList->__invoke($competition$inscribed);
  1234.             $this->em->persist($inscribed);
  1235.             $this->em->flush();
  1236.             //terminamos de montar y guardamos el Pedido
  1237.             $breakdownOrder "";
  1238.             if ($competition->getOrganizador() != null) {
  1239.                 $breakdownOrder $competition->getOrganizador()->getId() . "-";
  1240.             }
  1241.             $breakdownOrder .= $competition->getNombre() . ".<br />";
  1242.             $breakdownOrder .= $inscribed->getJugador()->getLicencia() . " - ";
  1243.             $breakdownOrder .= $inscribed->getCategoria()->getNombre() . ". ";
  1244.             $inscribedOrder->setDesglose($breakdownOrder);
  1245.             $this->em->persist($inscribedOrder);
  1246.             //guardamos en inscrito su Pedido asociado despues de guardar éste
  1247.             $inscribed->setPedido($inscribedOrder);
  1248.             $additionalDataByCompetition $competition->getAdicionales();
  1249.             if ($additionalDataByCompetition) {
  1250.                 $dataForm $request->request->all();
  1251.                 foreach ($additionalDataByCompetition as $additionalData) {
  1252.                     if (isset($dataForm["adicional" $additionalData->getId()])) {
  1253.                         $additionalInscribed = new AdicionalesInscrito();
  1254.                         $additionalInscribed->setValor($dataForm["adicional" $additionalData->getId()]);
  1255.                         $additionalInscribed->setInscrito($inscribed);
  1256.                         $additionalInscribed->setDato($additionalData);
  1257.                         $this->em->persist($additionalInscribed);
  1258.                     } else {
  1259.                         //si tipo "privacidad", lo guardo aunque sea no
  1260.                         if ("Privacidad" == $additionalData->getTipo()) {
  1261.                             $additionalInscribed = new AdicionalesInscrito();
  1262.                             $additionalInscribed->setValor("off");
  1263.                             $additionalInscribed->setInscrito($inscribed);
  1264.                             $additionalInscribed->setDato($additionalData);
  1265.                             $this->em->persist($additionalInscribed);
  1266.                         }
  1267.                     }
  1268.                 }
  1269.             }
  1270.             //Aprovechamos esta llamada para guardar en la BD el pedido, la actualización del inscrito y los datos adicionales
  1271.             $this->em->flush();
  1272.             // NO SE POR QUE ESTABA ESTO PUESTO
  1273. //            if ($form->get('save')->isClicked()) {
  1274. //
  1275. //            }
  1276.             //$importe = $tar->getImporte();
  1277.             //como ahora puede haber descuento habra que coger el importe del pedido 2022-12-07
  1278.             $amount $inscribedOrder->getImporte();
  1279.             if (($amount == 0) || ($amount == 0.0)) {
  1280.                 $inscribedOrder->setPayedAt(new \DateTime('now'));  //como son de tarifa cero, las marcamos como pagadas, ya que no hay que pagar nada
  1281.                 $this->em->flush();
  1282.                 //Preparación y envio del SMS
  1283.                 $playerPrivacy $inscribed->getJugador()->getPrivacidadSimple();
  1284.                 $rgpd false;
  1285.                 if (str_contains($competition->getOrganizador()->getId(), "AM")) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  1286.                     if (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"]) {
  1287.                         $rgpd true;
  1288.                     }
  1289.                 } else { //buscamos la privacidad del organizador
  1290.                     if ((isset($playerPrivacy[$competition->getOrganizador()->getId()]) && $playerPrivacy[$competition->getOrganizador()->getId()]) || (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"])) {
  1291.                         $rgpd true;
  1292.                     }
  1293.                 }
  1294.                 $competitionClient $competition->getOrganizador()->getCliente();
  1295.                 $phonePlayer $util_jugadores->getDatoPlanoDesdeJugador($inscribed->getJugador(), "Telefono"$competitionClient);
  1296.                 if ($rgpd && !empty($phonePlayer)) {
  1297.                     $competitionShortUrl $this->util->getShortUrl($competition);
  1298.                     if ($isWaitingList || $inscribed->getParticipa() == -1) {
  1299.                         $notificationText "Está en lista de espera de " substr($this->util->limpiar($competition->getNombre()), 050) . ". Consulte lista de inscritos en " $competitionShortUrl;
  1300.                     } else {
  1301.                         $notificationText "Se ha inscrito correctamente en " substr($this->util->limpiar($competition->getNombre()), 045) . ". Puede consultar el listado de inscritos en " $competitionShortUrl;
  1302.                     }
  1303.                     $userApp $this->em->getRepository(UserApp::class)->findOneByTelefono($phonePlayer);
  1304.                     $sendForApi $competitionClient?->getId() > 2;
  1305.                     $messaging->enviarSms($phonePlayer$notificationText$competition2$sendForApi);
  1306.                     $argumentsToNotify = [];
  1307.                     $argumentsToNotify["title"] = "Nueva inscripción en torneo";
  1308.                     $argumentsToNotify["msg"] = $notificationText;
  1309.                     $argumentsToNotify["url"] = $competitionShortUrl;
  1310.                     $argumentsToNotify["destinatario"] = $userApp;
  1311.                     $argumentsToNotify["tipo"] = "new-inscription";
  1312.                     $argumentsToNotify["competicion"] = $competition->getId();
  1313.                     $notificator->enviarNotificacion($argumentsToNotify);
  1314.                 }
  1315.                 $logMessage "Nueva inscripción online en Competición " $competition->getNombre() . "(" $id "): " $player->getLicencia() . "(" $inscribedOrder->getNumero() . ")";
  1316.                 $log = new Log('i'$logMessagenull);
  1317.                 $this->em->persist($log);
  1318.                 $this->em->flush();
  1319.                 try {
  1320.                     $this->util->guardaCsvInscripciones($inscribed);
  1321.                 } catch (\Throwable $exception) {
  1322.                     //does nothing, continues execution
  1323.                     error_log($exception->getMessage());
  1324.                 }
  1325.                 $emailView 'frontend/Inscritos/emailInscripcion.html.twig';
  1326.                 $argumentsToEmail = [
  1327.                     "to" => $emailForm,
  1328.                     "competicion" => $competition,
  1329.                     "subject" => '⛳ NEXTCADDY - Inscripción online [' $inscribedOrder->getNumero() . ']',
  1330.                     "html" => $this->renderView($emailView, array('jugador' => $player,
  1331.                         'competicion' => $competition,
  1332.                         'inscrito' => $inscribed,
  1333.                         'barras' => $this->em->getRepository(JornadaConfig::class)->findByInscrito($inscribed),
  1334.                         'pedido' => $inscribedOrder,
  1335.                         'tarifa' => $rate,
  1336.                         'lista_espera' => $isWaitingList
  1337.                     ))
  1338.                 ];
  1339.                 $mailer->enviarCorreo($argumentsToEmail);
  1340.                 try {
  1341.                     $swbd $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club""cliente" => $competition->getOrganizador()->getCliente()]);
  1342.                     if ($swbd) {
  1343.                         $swutil->init($swbd);
  1344.                         $swutil->addClientToActivity($inscribed$this->emtrue);
  1345.                     }
  1346.                 } catch (\Throwable $exception) {
  1347.                     $swgolfLogger->error("Error en " __FILE__ "\n" $exception->getMessage());
  1348.                 }
  1349.                 return $this->redirect($this->generateUrl('pago_terminado', array('token' => 'success''id' => $competition->getId(), 'idi' => $inscribed->getId())));
  1350.             } else {
  1351.                 try {
  1352.                     $this->util->guardaCsvInscripciones($inscribed);
  1353.                 } catch (\Throwable $exception) {
  1354.                     error_log($exception->getMessage());
  1355.                 }
  1356.                 return $this->redirect($this->generateUrl('pago_intermedio', array('idi' => $inscribed->getId(), 'idp' => $inscribedOrder->getId())));
  1357.             }
  1358.         } else {
  1359.             $competition $this->em->getRepository(Competicion::class)->find($id);
  1360.             if (!$competition) {
  1361.                 $this->addFlash('error'"El torneo buscado no existe");
  1362.                 return $this->redirect($this->generateUrl('competiciones_abiertas'));
  1363.             }
  1364.             $ratesByCompetition $this->em->getRepository(Tarifa::class)->findByCompeticion($id);
  1365.             $categoriesByCompetition $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  1366.             $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  1367.             //buscamos todas las jornadas, para asi poder poner el ASC aparte del rago de fechas involucrado
  1368.             $roundsByCompetition $this->em->getRepository(Jornada::class)->findBy(array("competicion" => $competition->getId()), array("orden" => "ASC"));
  1369.             $miniature file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
  1370.             $countries $this->em->getRepository(Pais::class)->findAll();
  1371.             return $this->render("frontend/Inscritos/new_new.html.twig", [
  1372.                 'form' => $form->createView(),
  1373.                 'competicion' => $competition,
  1374.                 'tarifas' => $ratesByCompetition,
  1375.                 'paises' => $countries,
  1376.                 'jornadas' => $roundsByCompetition,
  1377.                 'categorias' => $categoriesByCompetition,
  1378.                 'num_inscritos' => $totalInscribedWithCorrectStatus,
  1379.                 'hayMiniatura' => $miniature
  1380.             ]);
  1381.         }
  1382.     }
  1383.     /**
  1384.      * F-050 Guardado de inscritos parejas
  1385.      *
  1386.      * @Route("/{id}/guardar-inscrito-pareja", name="competicion_guardainscrito_pareja")
  1387.      */
  1388.     public function saveInscribedCouple($idRequest $requestEnvioCorreo $mailerNotificacionesService $notificatorEnvioSms $messagingLoggerInterface $loggerSoftwareExternoUtil $swutilUtilJugadores $utilJugadoresUpdateInscribedToIncludeAtWaitingList $updateInscribedToIncludeAtWaitingList)
  1389.     {
  1390.         $competition $this->em->getRepository(Competicion::class)->find($id);
  1391.         if (!$competition) {
  1392.             $this->addFlash(
  1393.                 'error'"El torneo buscado no existe");
  1394.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  1395.         }
  1396.         if (($competition->getModo()->getId() < 3) && ($competition->getEstado() != "abierta")) {
  1397.             $this->addFlash('error'"No es posible inscribirse online en esta competición o el plazo ha finalizado. Consulte con su Club");
  1398.             return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  1399.         }
  1400.         if ($competition->getJugadores() != 2) {
  1401.             $this->addFlash('error'"No es posible la inscripción de parejas en este torneo");
  1402.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1403.         }
  1404.         $dateNow = new \DateTime('now');
  1405.         if (!is_null($competition->getInicio()) && !is_null($competition->getFin()) != NULL) {
  1406.             $inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U')) || ($dateNow->format('U') > $competition->getFin()->format('U'));
  1407.             if ($inscriptionPeriodClosed) {
  1408.                 $this->addFlash('error'"El plazo para la inscripción online está cerrado. Consulte con su Club");
  1409.                 return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  1410.             }
  1411.         }
  1412.         $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($competition->getId());
  1413.         $noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
  1414.         if ($noSlotsAvailable) {
  1415.             $totalInscribedWithWaitStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($idfalse, ['espera']);
  1416.             $errorMessage "No hay plazas disponibles en este momento.";
  1417.             if ($totalInscribedWithWaitStatus 0) {
  1418.                 $errorMessage .= " Hay $totalInscribedWithWaitStatus pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
  1419.             }
  1420.             $this->addFlash('error'$errorMessage);
  1421.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1422.         }
  1423.         $slotsAvailableMorning 0;
  1424.         $slotsAvailableEvening 0;
  1425.         $slotsMorning $competition->getPlazasManana();
  1426.         $slotsEvening $competition->getPlazasTarde();
  1427.         if ($slotsMorning || $slotsEvening 0) {    //si tenemos inscripcion por turnos vemos donde hay hueco
  1428.             $slotsAvailableMorning $slotsMorning $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idtrue);
  1429.             $slotsAvailableEvening $slotsEvening $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idfalse);
  1430.         }
  1431.         $form $this->createForm(InscripcionParejaType::class, null, array(
  1432.             'attr' => array(
  1433.                 'id' => "insc" $id,
  1434.                 'org' => $competition->getOrganizador()->getId(),
  1435.                 'competicion' => $competition,
  1436.                 'dispManana' => $slotsAvailableMorning,
  1437.                 'dispTarde' => $slotsAvailableEvening
  1438.             )
  1439.         ));
  1440.         $form->handleRequest($request);
  1441.         $shift 'mañana';
  1442.         if ($form->has('turno')) {
  1443.             $shift $form->get('turno')->getData();
  1444.             if (!empty($shift)) {
  1445.                 if ($shift == 'mañana') {
  1446.                     $slotsShift $competition->getPlazasManana();
  1447.                 } else {
  1448.                     $slotsShift $competition->getPlazasTarde();
  1449.                 }
  1450.                 $slotsAvailable $slotsShift $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shift == 'mañana'));
  1451.                 if ($slotsAvailable 2) {
  1452.                     $this->addFlash('error'"No se ha podido completar la inscripción porque el turno seleccionado está lleno");
  1453.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1454.                 }
  1455.             } else {
  1456.                 $shift 'mañana';
  1457.             }
  1458.         }
  1459.         if (empty($form->get('id1')->getData()) || empty($form->get('id2')->getData())) {
  1460.             $this->addFlash('error'"Ninguno de los jugadores puede ser vacío para una competición de parejas");
  1461.             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1462.         }
  1463.         if ($form->get('id1')->getData() == $form->get('id2')->getData()) {
  1464.             $this->addFlash('error'"Los jugadores tienen que ser distintos");
  1465.             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1466.         }
  1467.         $ratePlayerOne $form->get('tarifa1')->getData();
  1468.         $ratePlayerTwo $form->get('tarifa2')->getData();
  1469.         if (!$ratePlayerOne || !$ratePlayerTwo) {
  1470.             $this->addFlash('error'"Su inscripción no se ha podido completar porque una de las inscripciones no reune las condiciones definidas en las Tarifas de la Competición");
  1471.             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1472.         }
  1473.         if ($form->get('email')->getData() == '') {
  1474.             $this->addFlash('error'"El email no puede ser vacío");
  1475.             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1476.         }
  1477.         if ($competition->getListaEspera() && $competition->getPlazasListaEspera() > 0) {
  1478.             $totalSlotsWaitingList $this->em->getRepository(Inscrito::class)->getCountInscritosListaEspera($competition);
  1479.             $waitingListFull $totalSlotsWaitingList >= $competition->getPlazasListaEspera();
  1480.             if ($waitingListFull) {
  1481.                 $this->addFlash('error'"La lista de espera esta completa en este momento");
  1482.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1483.             }
  1484.         }
  1485.         $secret $this->getParameter('secret');
  1486.         if ($form->isSubmitted() && $form->isValid()) {
  1487.             $hasScrambleOrProam boolval($this->em->getRepository(Competicion::class)->hasJornadaScrambleOrProAM($id));
  1488.             $inscribedOrder = new Pedido();
  1489.             $playerList = [];
  1490.             $rateList = [];
  1491.             $maximumTeamNumber 0;
  1492.             if ($hasScrambleOrProam) {
  1493.                 $maximumCoupleNumber 1;
  1494.             } else {
  1495.                 $maximumCoupleNumber 0;
  1496.             }
  1497.             $inscribedList = [];
  1498.             $softwareGolfEntity $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club""cliente" => $competition->getOrganizador()->getCliente()]);
  1499.             if ($softwareGolfEntity) {
  1500.                 $swutil->init($softwareGolfEntity);
  1501.             }
  1502.             $organiserClient $competition->getOrganizador()->getCliente();
  1503.             for ($counter 1$counter <= 2$counter++) {
  1504.                 $playerIdForm $form->get('id' $counter)->getData();
  1505.                 $licenseForm $form->get('licencia' $counter)->getData();
  1506.                 //buscamos los objetos a partir del ID
  1507.                 $player $this->em->getRepository(Jugador::class)->find($playerIdForm);
  1508.                 if (!$player) {
  1509.                     $player = new Jugador(__METHOD__);
  1510.                 } else {
  1511.                     //Arreglo para evitar las mayusculas
  1512.                     $player->setNombre($player->getNombre());
  1513.                     $player->setApellidos($player->getApellidos());
  1514.                 }
  1515.                 $phonePlayerForm = (!$form->has('telefono_jugador' $counter)) ? null $form->get('telefono_jugador' $counter)->getData();
  1516.                 if (!empty($phonePlayerForm)) {
  1517.                     $phonePlayer $utilJugadores->getDatoPlanoDesdeJugador($player"Telefono"$organiserClient);  //
  1518.                     if (empty($phonePlayer)) {
  1519.                         $logMessage "Cambio de teléfono del Jugador " $player->getNombreCompleto() . " (" $player->getLicencia() . ") en el método " __METHOD__ ", de " . ($phonePlayer ?: "(vacio)") . " a " $phonePlayerForm;
  1520.                         $player $utilJugadores->setDatoPlanoDesdeJugador($player"Telefono"$phonePlayerFormfalse$organiserClient);
  1521.                         $log = new Log('i'$logMessagenull);
  1522.                         $this->em->persist($log);
  1523.                     }
  1524.                 }
  1525.                 if (str_contains($competition->getOrganizador()->getId(), "AM")) {
  1526.                     $privi "AM00";
  1527.                 } else {
  1528.                     $privi $competition->getOrganizador()->getId();
  1529.                 }
  1530.                 $rgpd $player->getPrivacidadSimple();
  1531.                 if (array_key_exists($privi$rgpd) && !$rgpd[$privi]) {
  1532.                     $playerPrivacy = new JugadorRGPD();
  1533.                     $playerPrivacy->setAceptacion($privi);
  1534.                     $playerPrivacy->setNewsletters(null);
  1535.                     $playerPrivacy->setJugador($player);
  1536.                     $playerPrivacy->setRgpd(true);
  1537.                     $playerPrivacy->setRgpdExtra($request->headers->get("user-agent"));
  1538.                     $playerPrivacy->setRgpdIP($request->getClientIp());
  1539.                     $playerPrivacy->setCliente($competition->getOrganizador()->getCliente());
  1540.                     $player->addPrivacidad($playerPrivacy);
  1541.                 }
  1542.                 $playerHasPlayAnyCompetition $competition->getNumCompeticiones() != 0;
  1543.                 $incorrectNumberOfCompetitionsForConditions $player->getNumCompeticiones() < $competition->getNumCompeticiones();
  1544.                 $incorrectStatusHcp = ($player->getEstadoHcp()) != 10 && ($player->getEstadoHcp() != 99);
  1545.                 $playerIsNotActive = !$player->getActivo();
  1546.                 $playerNotComplyWithCompetitionsConditions = ($playerHasPlayAnyCompetition && $incorrectNumberOfCompetitionsForConditions) || ($incorrectStatusHcp) || $playerIsNotActive;
  1547.                 if ($playerNotComplyWithCompetitionsConditions) {
  1548.                     $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") no cumple las condiciones de inscripción");
  1549.                     return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1550.                 }
  1551.                 //Buscamos si esta competicion pertenece a algun listado de excluyentes
  1552.                 $exclusionCompetitionsList = [];
  1553.                 $exclusionCompetitions $this->em->getRepository(CompeticionesExcluyentes::class)->findByCompeticion($id);
  1554.                 foreach ($exclusionCompetitions as $exclusionCompetition) {
  1555.                     $exclusionCompetitionsList[] = $exclusionCompetition->getAgrupacion()->getId();
  1556.                 }
  1557.                 if (count($exclusionCompetitionsList) > 0) {
  1558.                     $exclusionCompetitionsByPlayerLicense $this->em->getRepository(CompeticionesExcluyentes::class)->findExcluyentesSimpleLicencia($player->getLicencia(), $exclusionCompetitionsList$id);
  1559.                     if (count($exclusionCompetitionsByPlayerLicense) > 0) {
  1560.                         $responseMessage "<ul>";
  1561.                         foreach ($exclusionCompetitionsByPlayerLicense as $exclusionCompetition) {
  1562.                             $responseMessage .= "<li><a href='" $this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)) . "' class='alert-link'>" $exclusionCompetition->getNombre() . " (" $exclusionCompetition->getFecha()->format("d/m/Y") . ")</a></li>, ";
  1563.                         }
  1564.                         $responseMessage substr($responseMessage0, -1) . "</ul>";
  1565.                         $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") está inscrito en alguna competición excluyente de ésta:" $responseMessage);
  1566.                         return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1567.                     }
  1568.                 }
  1569.                 $checkPlayerId = function ($playerId) {
  1570.                     return function ($keyInscrito $inscrito) use ($playerId) {
  1571.                         return (($inscrito->getJugador()->getId() == $playerId) && ($inscrito->getEstado() == EnumEstadoInscrito::PAGADO));
  1572.                     };
  1573.                 };
  1574.                 if ($competition->getInscritos()->exists($checkPlayerId($player->getId()))) {
  1575.                     $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") ya está inscrito en la competición");
  1576.                     return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1577.                 }
  1578.             }
  1579.             $validVoucher false;
  1580.             if ($form->has('voucher')) {
  1581.                 $voucherCode $form['voucher']->getData();
  1582.                 if (!empty($voucherCode)) {
  1583.                     $voucher $this->em->getRepository(Voucher::class)->findOneBy(['codigo' => $voucherCode]);
  1584.                     if (empty($voucher)) {
  1585.                         $this->addFlash('error''No existe ningún voucher con este código');
  1586.                         return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
  1587.                     } else {
  1588.                         $now = new \DateTime('now');
  1589.                         $validDate = ($voucher->getFechaInicio()->format('U') <= $now->format('U')) && ($now->format('U') <= $voucher->getFechaFin()->format('U'));
  1590.                         if (!$validDate) {
  1591.                             $this->addFlash('error''Ha expirado la fecha de validez del voucher');
  1592.                             return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  1593.                         }
  1594.                         if (count($voucher->getCompeticiones()) == 0) {
  1595.                             $validVoucher true;
  1596.                         } else {
  1597.                             foreach ($voucher->getCompeticiones() as $comp) {
  1598.                                 if ($comp->getId() == $id) {
  1599.                                     $validVoucher true;
  1600.                                 }
  1601.                             }
  1602.                         }
  1603.                         if (!$validVoucher) {
  1604.                             $this->addFlash('error''Este voucher no es válido para esta competición');
  1605.                             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
  1606.                         }
  1607.                     }
  1608.                 }
  1609.             }
  1610.             $teamName "";
  1611.             $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  1612.             $waitingList = (($totalInscribedWithCorrectStatus >= $competition->getPlazas()) && $competition->getListaEspera());
  1613.             $inscribedData = [];
  1614.             for ($counter 1$counter <= 2$counter++) {
  1615.                 $inscribed = new Inscrito();
  1616.                 $categoryIdForm $form->get('categoria' $counter)->getData();
  1617.                 $existTeeFromForm $form->has('barra' $counter) && !empty($form->get('barra' $counter)->getData());
  1618.                 if ($existTeeFromForm) {
  1619.                     $categoryIdForm $form->get('barra' $counter)->getData(); //No es la barra, es el ID de categoria de la barra que ha selecionado el jugador
  1620.                 }
  1621.                 $playerIdForm $form->get('id' $counter)->getData();
  1622.                 $licenseForm $form->get('licencia' $counter)->getData();
  1623.                 $rateForm $form->get('tarifa' $counter)->getData();
  1624.                 $emailForm $form->get('email')->getData();
  1625.                 $observationsForm $this->util->limpiar($form->get('observaciones')->getData(), false);
  1626.                 $player $this->em->getRepository(Jugador::class)->find($playerIdForm);
  1627.                 $category $this->em->getRepository(Categoria::class)->find($categoryIdForm);
  1628.                 if (!$category) {
  1629.                     $this->addFlash('error'"Ha ocurrido un error asignando la categoría al jugador " $counter ". Por favor, inténtelo de nuevo");
  1630.                     return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1631.                 }
  1632.                 if (str_starts_with($player->getLicencia(), PlayerLicense::FOREING_PREFIX)) {
  1633.                     $uploadedFile $form->get('documentoHcp' $counter)->getData();
  1634.                     if (!is_null($uploadedFile)) {
  1635.                         $hcpNameReport md5(rand() . "_" uniqid('infHcp')) . ".pdf";
  1636.                         $uploadedFile->move(__DIR__ '/../../../../web/uploads/informesHcp'$hcpNameReport);
  1637.                         $inscribedDocument = new InscritoDocumento();
  1638.                         $inscribedDocument->setInscrito($inscribed);
  1639.                         $inscribedDocument->setDocumento($hcpNameReport);
  1640.                         $inscribedDocument->setTipo(1);
  1641.                         $inscribed->addDocumento($inscribedDocument);
  1642.                     } else {
  1643.                         $this->addFlash('error'"Para jugadores extranjeros es necesario adjuntar el informe de handicap de su federación");
  1644.                         return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1645.                     }
  1646.                 }
  1647.                 if ($counter == 1) {
  1648.                     $orderNumber $this->em->getRepository(Pedido::class)->findLastPedido($competition->getId());
  1649.                     if (!is_null($orderNumber)) {
  1650.                         $orderNumber substr($orderNumber['numero'], 102);
  1651.                         $orderNumber++;
  1652.                     } else {
  1653.                         $orderNumber 'AA';
  1654.                     }
  1655.                     $inscribedOrder->setEmail($emailForm);
  1656.                     $inscribedOrder->setEmailCod($emailForm$secret);
  1657.                     $inscribedOrder->setConcepto("ionline");
  1658.                     $inscribedOrder->setNumero($orderNumber);
  1659.                     $amount 0;
  1660.                     $applyRate true;
  1661.                     $letter "F";
  1662.                     $authorised $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $player->getLicenciaCorta());
  1663.                     if (count($authorised) > 0) {
  1664.                         $applyRate false;
  1665.                         $letter "V";
  1666.                     }
  1667.                     $rate $this->em->getRepository(Tarifa::class)->find($rateForm);
  1668.                     if ($applyRate) {
  1669.                         $amount $rate->getImporte();
  1670.                     }
  1671.                     $inscribedOrder->setImporte($amount);
  1672.                     $inscribedOrder->setTarifa(($applyRate) ? $rate null);
  1673.                     $inscribedOrder->setEstado($amount == "pagado" "espera");
  1674.                 } else {
  1675.                     $amount 0;
  1676.                     $applyRate true;
  1677.                     $authorised $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $player->getLicenciaCorta());
  1678.                     //Comprobamos si esta licencia pertenece a las licencias permitidas que no pagan, pero deben de ir por el flujo normal de inscripcion {NEX-1754}
  1679.                     if (count($authorised) > 0) {
  1680.                         $applyRate false;
  1681.                         $letter "V";
  1682.                     }
  1683.                     //como ya tenemos el pedido, solamente actualizamos los campos necesarios
  1684.                     $rate $this->em->getRepository(Tarifa::class)->find($rateForm);
  1685.                     if ($applyRate) {
  1686.                         $amount $rate->getImporte();
  1687.                     }
  1688.                     //asignamos la segunda tarifa del segundo jugador
  1689.                     $inscribedOrder->setTarifa2(($applyRate) ? $rate null);
  1690.                     $inscribedOrder->setImporte($inscribedOrder->getImporte() + $amount);
  1691.                 }
  1692.                 //terminamos de montar y guardamos el Pedido
  1693.                 $breakdownOrder "";
  1694.                 if ($competition->getOrganizador() != null) {
  1695.                     $breakdownOrder $competition->getOrganizador()->getId() . "-";
  1696.                 }
  1697.                 $breakdownOrder .= $competition->getNombre() . ".<br />";
  1698.                 $breakdownOrder .= $player->getLicencia() . " - ";
  1699.                 $breakdownOrder .= $category->getNombre() . ". ";
  1700.                 $inscribedOrder->setDesglose($breakdownOrder ". " $inscribedOrder->getDesglose());
  1701.                 if ($counter !== 1) {
  1702.                     if ($validVoucher) {
  1703.                         $voucherAmount $voucher->getCantidad();
  1704.                         $amount $inscribedOrder->getImporte();
  1705.                         switch ($voucher->getTipo()) {
  1706.                             //Fijo
  1707.                             case 1:
  1708.                                 $amount -= $voucherAmount;
  1709.                                 break;
  1710.                             //Porcentual
  1711.                             case 2:
  1712.                                 $voucherAmount $voucherAmount 100;
  1713.                                 $amount $amount - ($amount $voucherAmount);
  1714.                         }
  1715.                         //Controlamos que minimo sea 0
  1716.                         $amount max($amount0);
  1717.                         $inscribedOrder->setImporte($amount);
  1718.                         $inscribedOrder->setVoucher($voucher);
  1719.                     }
  1720.                 }
  1721.                 $this->em->persist($inscribedOrder);
  1722.                 $inscribed->setCompeticion($competition);
  1723.                 $inscribed->setJugador($player);
  1724.                 $inscribed->setCategoria($category);
  1725.                 $inscribed->setCategoriaCondicion($category->getCategoriaCondicion());
  1726.                 if ($counter === 1) {
  1727.                     //Le asignamos un número de equipo, aun siendo individual. Para ello cogemos el último numero de equipo y lo incrementamos
  1728.                     $maximumTeamNumber $this->em->getRepository(Inscrito::class)->findMaxEquipoInscrito($competition->getId());
  1729.                     $maximumTeamNumber = (!empty($maximumTeamNumber)) ? ($maximumTeamNumber 1) : 1;
  1730.                     if (!$hasScrambleOrProam) {
  1731.                         $maximumCoupleNumber $this->em->getRepository(Inscrito::class)->findMaxParejaInscrito($competition->getId()) + 1;
  1732.                     }
  1733.                     $team = new Equipo();
  1734.                     //Montamos el inscrito
  1735.                     $teamName sprintf("Pareja %d", ((!$hasScrambleOrProam) ? $maximumCoupleNumber $maximumTeamNumber));
  1736.                     $team->setNombre($teamName);
  1737.                     $team->setCompeticion($competition);
  1738.                     $team->setEquipo($maximumTeamNumber);
  1739.                     $this->em->persist($team);
  1740.                     //$this->em->flush();
  1741.                     $inscribed->setObservaciones($observationsForm);    //Evitamos duplicar el comentario
  1742.                 }
  1743.                 $inscribed->setNombreEquipo($teamName);
  1744.                 $inscribed->setEquipoEntidad($team);
  1745.                 $inscribed->setEquipo($maximumTeamNumber);
  1746.                 $inscribed->setPareja($maximumCoupleNumber);
  1747.                 $inscribed->setParticipa($waitingList ? -1);
  1748.                 $inscribed->setNivel($player->getNivel());
  1749.                 $inscribed->setTipoInscripcion("frontend");
  1750.                 $inscribed->setEstado($inscribedOrder->getEstado());
  1751.                 $inscribed->setValido(true);
  1752.                 $inscribed->setTarifa($rate);
  1753.                 $inscribed->setTurno($shift);
  1754.                 $inscribed->setHcp($player->getHcp());
  1755.                 $inscribed->setPedido($inscribedOrder);
  1756.                 $inscribed->setTarifa($rate);
  1757.                 $inscribed->setOrderWaitingList(0);
  1758.                 $this->em->persist($inscribed);
  1759.                 $this->em->flush();
  1760.                 $inscribedData[$maximumTeamNumber]['licenses'][] = $inscribed->getJugador()->getLicencia();
  1761.                 $inscribedData[$maximumTeamNumber]['ids'][] = $inscribed->getId();
  1762.                 $additionalDataByCompetition $competition->getAdicionales();
  1763.                 if ($additionalDataByCompetition) {
  1764.                     $dataForm $request->request->all();
  1765.                     foreach ($additionalDataByCompetition as $additionalData) {
  1766.                         if (isset($dataForm["adicional" $additionalData->getId() . "_" $counter])) {
  1767.                             $additionalInscribed = new AdicionalesInscrito();
  1768.                             $additionalInscribed->setValor($dataForm["adicional" $additionalData->getId() . "_" $counter]);
  1769.                             $additionalInscribed->setInscrito($inscribed);
  1770.                             $additionalInscribed->setDato($additionalData);
  1771.                             $this->em->persist($additionalInscribed);
  1772.                         }
  1773.                     }
  1774.                 }
  1775.                 $playerList[] = $player;
  1776.                 $inscribedList[] = $inscribed;
  1777.                 $rateList[] = $rate;
  1778.                 //Log y control
  1779.                 $logMessage "Nueva inscripción online en Competición " $competition->getNombre() . "(" $id "): " $player->getLicencia() . "(" $inscribedOrder->getNumero() . ") en la categoria " $category->getNombre();
  1780.                 $log = new Log('i'$logMessagenull);
  1781.                 $this->em->persist($log);
  1782.                 $this->em->flush();
  1783.                 try {
  1784.                     $this->util->guardaCsvInscripciones($inscribed);
  1785.                 } catch (\Throwable $ex) {
  1786.                     //does nothing, continues execution
  1787.                     error_log($ex->getMessage());
  1788.                 }
  1789.             }
  1790.             $inscribedOrder->setNumero($competition->getId() . $letter $competition->getOrganizador()->getId() . $orderNumber);
  1791.             $this->em->flush();
  1792.             if ($competition->getRestringirLicencia() === EnumEstadoRestringirLicencias::PREFERENCIA) {
  1793.                 $updateInscribedToIncludeAtWaitingList->__invoke($competition$inscribedData);
  1794.             }
  1795.             //puede que haya que modificar y poner el pedido en vez de la tarifa
  1796.             if ($form->get('save')->isClicked()) {
  1797.                 $amount $inscribedOrder->getImporte();
  1798.                 if (($amount == 0) || ($amount == 0.0)) {
  1799.                     //Apaño para poner todos los inscritos a pagado
  1800.                     foreach ($inscribedList as $inscribed) {
  1801.                         $inscribed->setEstado("pagado");
  1802.                     }
  1803.                     $inscribedOrder->setEstado("pagado");
  1804.                     $inscribedOrder->setPayedAt(new \DateTime('now'));  //como son de tarifa cero, las marcamos como pagadas, ya que no hay que pagar nada
  1805.                     $this->em->flush();
  1806.                     //peparamos la URL bitly y el contenido del SMS
  1807.                     $competitionShortUrl $this->util->getShortUrl($competition);
  1808.                     if ($waitingList || $inscribedList[0]->getParticipa() == -1) {
  1809.                         $textMessage "Está en lista de espera de " substr($this->util->limpiar($competition->getNombre()), 050) . ". Consulte lista de inscritos en " $competitionShortUrl;
  1810.                     } else {
  1811.                         $textMessage "Se ha inscrito correctamente en " substr($this->util->limpiar($competition->getNombre()), 045) . ". Puede consultar el listado de inscritos en " $competitionShortUrl;
  1812.                     }
  1813.                     $organiserClient $competition->getOrganizador()->getCliente();
  1814.                     //le mandamos un SMS a cada miembro de la pareja
  1815.                     foreach ($inscribedList as $inscribed) {
  1816.                         $player $inscribed->getjugador();
  1817.                         //Preparación y envio del SMS a cada uno de los jugadores
  1818.                         $playerPrivacy $inscribed->getJugador()->getPrivacidadSimple();
  1819.                         $rgpd false;
  1820.                         if (str_contains($competition->getOrganizador()->getId(), "AM")) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  1821.                             if (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"]) {
  1822.                                 $rgpd true;
  1823.                             }
  1824.                         } else {    //buscamos la privacidad del organizador
  1825.                             if ((isset($playerPrivacy[$competition->getOrganizador()->getId()]) && $playerPrivacy[$competition->getOrganizador()->getId()]) || (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"])) {
  1826.                                 $rgpd true;
  1827.                             }
  1828.                         }
  1829.                         $phonePlayer $utilJugadores->getDatoPlanoDesdeJugador($player"Telefono"$organiserClient);
  1830.                         if ($rgpd && !empty($phonePlayer)) {
  1831.                             $userApp $this->em->getRepository(UserApp::class)->findOneByTelefono($phonePlayer);
  1832.                             $sendForApi $organiserClient?->getId() > 2;
  1833.                             $messaging->enviarSms($phonePlayer$textMessage$competition2$sendForApi);
  1834.                             $argumentsToNotify = [];
  1835.                             $argumentsToNotify["title"] = "Nueva inscripción en torneo";
  1836.                             $argumentsToNotify["msg"] = $textMessage;
  1837.                             $argumentsToNotify["url"] = $competitionShortUrl;
  1838.                             $argumentsToNotify["destinatario"] = $userApp;
  1839.                             $argumentsToNotify["tipo"] = "new-inscription";
  1840.                             $argumentsToNotify["competicion"] = $competition->getId();
  1841.                             $notificator->enviarNotificacion($argumentsToNotify);
  1842.                         }
  1843.                         $this->addFlash('success''El jugador ' $player->getNombre() . ' ' $player->getApellidos() . ' (' $player->getLicencia() . ') '
  1844.                             'se ha inscrito con éxito, en la categoría ' $inscribed->getCategoria()?->getNombre());
  1845.                         try {
  1846.                             if ($softwareGolfEntity) {
  1847.                                 $swutil->addClientToActivity($inscribed$this->emtrue);
  1848.                             }
  1849.                         } catch (\Throwable $exception) {
  1850.                             $logger->error("Error en " __FILE__ "\n" $exception->getMessage());
  1851.                         }
  1852.                     }
  1853.                     $vista 'frontend/Inscritos/emailInscripcionPareja.html.twig';
  1854.                     $argumentsToEmail = [
  1855.                         "to" => $emailForm,
  1856.                         "competicion" => $competition,
  1857.                         "subject" => '⛳ NEXTCADDY - Inscripción online [' $inscribedOrder->getNumero() . ']',
  1858.                         "html" => $this->renderView($vista, array('jugadores' => $playerList,
  1859.                             'inscritos' => $inscribedList,
  1860.                             'competicion' => $competition,
  1861.                             'pedido' => $inscribedOrder,
  1862.                             'tarifas' => $rateList,
  1863.                             'lista_espera' => $waitingList
  1864.                         ))
  1865.                     ];
  1866.                     //EnvioCorreo::enviarCorreo($args);
  1867.                     $mailer->enviarCorreo($argumentsToEmail);
  1868.                     return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  1869.                 } else {
  1870.                     return $this->redirect($this->generateUrl('pago_intermedio', array('idi' => $inscribed->getId(), 'idp' => $inscribedOrder->getId())));
  1871.                 }
  1872.             }
  1873.         } else {
  1874.             $competition $this->em->getRepository(Competicion::class)->find($id);
  1875.             if (!$competition) {
  1876.                 $this->addFlash('error'"El torneo buscado no existe");
  1877.                 return $this->redirect($this->generateUrl('competiciones_abiertas'));
  1878.             }
  1879.             $rateList $this->em->getRepository(Tarifa::class)->findByCompeticion($id);
  1880.             $categories $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  1881.             $rounds $this->em->getRepository(Jornada::class)->findBy(array("competicion" => $id), array("orden" => "ASC"));
  1882.             $totalInscribedWithCorrectStatus count($this->em->getRepository(Inscrito::class)->getInscritosActivos($id));
  1883.             $miniature file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
  1884.             return $this->render("frontend/Inscritos/new_pareja_new.html.twig", [
  1885.                 'form' => $form->createView(),
  1886.                 'competicion' => $competition,
  1887.                 //'data' => $data,
  1888.                 'tarifas' => $rateList,
  1889.                 'categorias' => $categories,
  1890.                 'jornadas' => $rounds,
  1891.                 'hayMiniatura' => $miniature,
  1892.                 'num_inscritos' => $totalInscribedWithCorrectStatus
  1893.             ]);
  1894.         }
  1895.     }
  1896.     /**
  1897.      * F-051 Guardado de inscritos equipos
  1898.      *
  1899.      * @Route("/{id}/guardar-inscrito-equipo", name="competicion_guardainscrito_equipo")
  1900.      */
  1901.     public function saveInscribedTeam($idRequest $requestEnvioCorreo $mailerNotificacionesService $notificatorEnvioSms $messagingLoggerInterface $swgolfLoggerSoftwareExternoUtil $swutilUtilJugadores $utilJugadoresUpdateInscribedToIncludeAtWaitingList $updateInscribedToIncludeAtWaitingList)
  1902.     {
  1903.         $dateNow = new \DateTime('now');
  1904.         $competition $this->em->getRepository(Competicion::class)->find($id);
  1905.         if (!$competition) {
  1906.             $this->addFlash('error'"El torneo buscado no existe");
  1907.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  1908.         }
  1909.         $competitionIsCalendarMode $competition->getModo()->getId() === 1;
  1910.         $competitionIsOfflineMode $competition->getModo()->getId() === 2;
  1911.         $incorrectCompetitionMode $competitionIsCalendarMode || $competitionIsOfflineMode;
  1912.         if ($incorrectCompetitionMode && ($competition->getEstado() != EnumEstadoCompeticion::ABIERTA)) {
  1913.             $this->addFlash('error'"No es posible inscribirse online en esta competición o el plazo ha finalizado. Consulte con su Club");
  1914.             return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  1915.         }
  1916.         $competitionIsNotForTeams $competition->getJugadores() <= 2;
  1917.         if ($competitionIsNotForTeams) {
  1918.             $this->addFlash('error'"No se admite la inscripción de equipos en este torneo");
  1919.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1920.         }
  1921.         if (($competition->getInicio() != NULL) && ($competition->getFin() != NULL)) {
  1922.             $inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U')) || ($dateNow->format('U') > $competition->getFin()->format('U'));
  1923.             if ($inscriptionPeriodClosed) {
  1924.                 $this->addFlash('error'"El plazo para la inscripción online está cerrado. Consulte con su Club");
  1925.                 return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  1926.             }
  1927.         }
  1928.         $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  1929.         $noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
  1930.         if ($noSlotsAvailable) {
  1931.             $totalInscribedAtWaitingList $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($idfalse, ['espera']);
  1932.             $errorMessage "No hay plazas disponibles en este momento.";
  1933.             if ($totalInscribedAtWaitingList 0) {
  1934.                 $errorMessage .= " Hay $totalInscribedAtWaitingList pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
  1935.             }
  1936.             $this->addFlash('error'$errorMessage);
  1937.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1938.         }
  1939.         $slotsAvailableMorning 0;
  1940.         $slotsAvailableEvening 0;
  1941.         $slotsMorning $competition->getPlazasManana();
  1942.         $slotsEvening $competition->getPlazasTarde();
  1943.         if ($slotsMorning || $slotsEvening 0) {    //si tenemos inscripcion por turnos vemos donde hay hueco
  1944.             $slotsAvailableMorning $slotsMorning $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idtrue);
  1945.             $slotsAvailableEvening $slotsEvening $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idfalse);
  1946.         }
  1947.         $form $this->createForm(InscripcionEquipoType::class, null, array(
  1948.             'attr' => array('jugadores' => $competition->getJugadores(), 'id' => "insc" $id'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition'dispManana' => $slotsAvailableMorning'dispTarde' => $slotsAvailableEvening),
  1949.             'action' => $this->generateUrl('competicion_guardainscrito_equipo', array('id' => $id)),
  1950.             'method' => 'POST',
  1951.         ));
  1952.         $form->handleRequest($request);
  1953.         $shift 'mañana';  //por defecto
  1954.         if ($form->has('turno')) {  //si viene el campo "turno" tomamos su valor
  1955.             $shift $form->get('turno')->getData();
  1956.             if (!empty($shift)) {
  1957.                 if ($shift == 'mañana') {
  1958.                     $slotsShift $competition->getPlazasManana();
  1959.                 } else {
  1960.                     $slotsShift $competition->getPlazasTarde();
  1961.                 }
  1962.                 //comprobamos que hay hueco para la nueva inscripcion en dicho turno
  1963.                 $slotsAvailable $slotsShift $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shift == 'mañana'));
  1964.                 if ($slotsAvailable $competition->getJugadores()) {   //como es equipos, queremos que haya al menos numJugadoresPorEquipo plazas
  1965.                     $this->addFlash(
  1966.                         'error'"No se ha podido completar la inscripción porque el turno seleccionado está lleno");
  1967.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1968.                 }
  1969.             } else {
  1970.                 $shift 'mañana';  //por defecto
  1971.             }
  1972.         }
  1973.         $playerIdsList = [];
  1974.         for ($i 1$i <= $competition->getJugadores(); $i++) {
  1975.             $playerIdForm $form->get("id$i")->getData();
  1976.             if ($i == $competition->getJugadores() && !$competition->getEstricto() && !$playerIdForm) {
  1977.                 continue;
  1978.             }
  1979.             if (!$form->get("categoria$i")->getData()) {
  1980.                 $this->addFlash('error'"Su inscripción no se ha podido completar porque una de las inscripciones no reune las condiciones definidas en las Categorías de la Competición");
  1981.                 return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1982.             }
  1983.             if (!$form->get("tarifa$i")->getData()) {
  1984.                 $this->addFlash('error'"Su inscripción no se ha podido completar porque una de las inscripciones no reune las condiciones definidas en las Tarifas de la Competición");
  1985.                 return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1986.             }
  1987.             if (!$playerIdForm) {
  1988.                 $this->addFlash('error'"Ninguno de los jugadores puede ser vacío para una competición de parejas");
  1989.                 return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1990.             }
  1991.             $playerIdsList[] = $playerIdForm;
  1992.         }
  1993.         //Array_unique quita duplicados en un array, si tenemos menos ID que numero de jugadores, alguno era el mismo.
  1994.         $incorrectNumberOfPlayerByTeam = ($competition->getEstricto() && count(array_unique($playerIdsList)) < $competition->getJugadores()) || (!$competition->getEstricto() && (count(array_unique($playerIdsList)) < ($competition->getJugadores() - 1)));
  1995.         if ($incorrectNumberOfPlayerByTeam) {
  1996.             $this->addFlash('error'"Los jugadores tienen que ser distintos");
  1997.             return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1998.         }
  1999.         if ($form->get('email')->getData() == '') {
  2000.             $this->addFlash('error'"El email no puede ser vacío");
  2001.             return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  2002.         }
  2003.         $secret $this->getParameter('secret');
  2004.         if ($form->isSubmitted() && $form->isValid()) {
  2005.             $hasScrambleOrProam boolval($this->em->getRepository(Competicion::class)->hasJornadaScrambleOrProAM($id));
  2006.             $teamName $form->get('teamname')->getData();
  2007.             $inscriptionOrder = new Pedido();
  2008.             $inscribedList = [];
  2009.             $playerList = [];
  2010.             $rateList = [];
  2011.             $softwareGolfRelated $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club""cliente" => $competition->getOrganizador()->getCliente()]);
  2012.             if ($softwareGolfRelated) {
  2013.                 $software $softwareGolfRelated->getExternalClass();
  2014.                 if (strtolower($software) == "golfmanager") {
  2015.                     $swutil->init($softwareGolfRelated);
  2016.                 }
  2017.             }
  2018.             $competitionOrganiserClient $competition->getOrganizador()->getCliente();
  2019.             for ($playerCount 1$playerCount <= count($playerIdsList); $playerCount++) {
  2020.                 $playerIdForm $form->get('id' $playerCount)->getData();
  2021.                 $licenseForm $form->get('licencia' $playerCount)->getData();
  2022.                 $playerByIdForm $this->em->getRepository(Jugador::class)->find($playerIdForm);
  2023.                 if (!$playerByIdForm) {
  2024.                     $playerByIdForm = new Jugador(__METHOD__);
  2025.                 } else {
  2026.                     $playerByIdForm->setNombre($playerByIdForm->getNombre());
  2027.                     $playerByIdForm->setApellidos($playerByIdForm->getApellidos());
  2028.                 }
  2029.                 $phonePlayerForm = (!$form->has('telefono_jugador' $playerCount)) ? null $form->get('telefono_jugador' $playerCount)->getData();
  2030.                 if (!empty($phonePlayerForm)) {
  2031.                     $phonePlayer $utilJugadores->getDatoPlanoDesdeJugador($playerByIdForm"Telefono"$competitionOrganiserClient);  //
  2032.                     if (empty($phonePlayer)) {
  2033.                         $logMessage "Cambio de teléfono del Jugador " $playerByIdForm->getNombreCompleto() . " (" $playerByIdForm->getLicencia() . ") en el método " __METHOD__ ", de " . ($phonePlayer ?: "(vacio)") . " a " $phonePlayerForm;
  2034.                         $playerByIdForm $utilJugadores->setDatoPlanoDesdeJugador($playerByIdForm"Telefono"$phonePlayerFormfalse$competitionOrganiserClient);
  2035.                         $log = new Log('i'$logMessagenull);
  2036.                         $this->em->persist($log);
  2037.                     }
  2038.                 }
  2039.                 if (str_contains($competition->getOrganizador()->getId(), "AM")) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  2040.                     $privi "AM00";
  2041.                 } else {
  2042.                     $privi $competition->getOrganizador()->getId();
  2043.                 }
  2044.                 $rgpd $playerByIdForm->getPrivacidadSimple();
  2045.                 if (array_key_exists($privi$rgpd) && !$rgpd[$privi]) {
  2046.                     $playerPrivacy = new JugadorRGPD();
  2047.                     $playerPrivacy->setAceptacion($privi);
  2048.                     $playerPrivacy->setNewsletters(null);
  2049.                     $playerPrivacy->setJugador($playerByIdForm);
  2050.                     $playerPrivacy->setRgpd(true);
  2051.                     $playerPrivacy->setRgpdExtra($request->headers->get("user-agent"));
  2052.                     $playerPrivacy->setRgpdIP($request->getClientIp());
  2053.                     $playerPrivacy->setCliente($competition->getOrganizador()->getCliente());
  2054.                     $playerByIdForm->addPrivacidad($playerPrivacy);
  2055.                 }
  2056.                 $playerHasPlayAnyCompetition $competition->getNumCompeticiones() != 0;
  2057.                 $incorrectNumberOfCompetitionsForConditions $playerByIdForm->getNumCompeticiones() < $competition->getNumCompeticiones();
  2058.                 $incorrectStatusHcp = ($playerByIdForm->getEstadoHcp()) != 10 && ($playerByIdForm->getEstadoHcp() != 99);
  2059.                 $playerIsNotActive = !$playerByIdForm->getActivo();
  2060.                 $playerNotComplyWithCompetitionsConditions = ($playerHasPlayAnyCompetition && $incorrectNumberOfCompetitionsForConditions) || ($incorrectStatusHcp) || $playerIsNotActive;
  2061.                 if ($playerNotComplyWithCompetitionsConditions) {
  2062.                     $this->addFlash('error'"El jugador " $playerByIdForm->getNombre() . " " $playerByIdForm->getApellidos() . " (" $playerByIdForm->getLicencia() . ") no cumple las condiciones de inscripción");
  2063.                     return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  2064.                 }
  2065.                 $exclusionCompetitionsList = [];
  2066.                 $exclusionCompetitions $this->em->getRepository(CompeticionesExcluyentes::class)->findByCompeticion($id);
  2067.                 foreach ($exclusionCompetitions as $exclusionCompetition) {
  2068.                     $exclusionCompetitionsList[] = $exclusionCompetition->getAgrupacion()->getId();
  2069.                 }
  2070.                 if (count($exclusionCompetitionsList) > 0) {
  2071.                     $exclusionCompetitionsByPlayerLicense $this->em->getRepository(CompeticionesExcluyentes::class)->findExcluyentesSimpleLicencia($playerByIdForm->getLicencia(), $exclusionCompetitionsList$id);
  2072.                     if (count($exclusionCompetitionsByPlayerLicense) > 0) {
  2073.                         $responseMessage "<ul>";
  2074.                         foreach ($exclusionCompetitionsByPlayerLicense as $exclusionCompetition) {
  2075.                             $responseMessage .= "<li><a href='" $this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)) . "' class='alert-link'>" $exclusionCompetition->getNombre() . " (" $exclusionCompetition->getFecha()->format("d/m/Y") . ")</a></li>, ";
  2076.                         }
  2077.                         $responseMessage substr($responseMessage0, -1) . "</ul>";
  2078.                         $this->addFlash('error'"El jugador " $playerByIdForm->getNombre() . " " $playerByIdForm->getApellidos() . " (" $playerByIdForm->getLicencia() . ") está inscrito en alguna competición excluyente de ésta:" $responseMessage);
  2079.                         return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  2080.                     }
  2081.                 }
  2082.                 $checkPlayerId = function ($playerId) {
  2083.                     return function ($keyInscrito $inscribed) use ($playerId) {
  2084.                         return (($inscribed->getJugador()->getId() == $playerId) && ($inscribed->getEstado() == "pagado"));
  2085.                     };
  2086.                 };
  2087.                 if ($competition->getInscritos()->exists($checkPlayerId($playerByIdForm->getId()))) {
  2088.                     $this->addFlash('error'"El jugador " $playerByIdForm->getNombre() . " " $playerByIdForm->getApellidos() . " (" $playerByIdForm->getLicencia() . ") ya está inscrito en la competición");
  2089.                     return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  2090.                 }
  2091.             }
  2092.             //COMPROBACION VOUCHER
  2093.             $validVoucher false;
  2094.             if ($form->has('voucher')) {
  2095.                 $voucherCode $form['voucher']->getData();
  2096.                 if (!empty($voucherCode)) {
  2097.                     $voucher $this->em->getRepository(Voucher::class)->findOneBy(['codigo' => $voucherCode]);
  2098.                     if (empty($voucher)) {
  2099.                         $this->addFlash('error''No existe ningún voucher con este código');
  2100.                         return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
  2101.                     } else {
  2102.                         $now = new \DateTime('now');
  2103.                         $validDate = ($voucher->getFechaInicio()->format('U') <= $now->format('U')) && ($now->format('U') <= $voucher->getFechaFin()->format('U'));
  2104.                         if (!$validDate) {
  2105.                             $this->addFlash('error''Ha expirado la fecha de validez del voucher');
  2106.                             return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  2107.                         }
  2108.                         if (count($voucher->getCompeticiones()) == 0) {
  2109.                             $validVoucher true;
  2110.                         } else {
  2111.                             foreach ($voucher->getCompeticiones() as $comp) {
  2112.                                 if ($comp->getId() == $id) {
  2113.                                     $validVoucher true;
  2114.                                 }
  2115.                             }
  2116.                         }
  2117.                         if (!$validVoucher) {
  2118.                             $this->addFlash('error''Este voucher no es válido para esta competición');
  2119.                             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
  2120.                         }
  2121.                     }
  2122.                 }
  2123.             }
  2124.             $letter "F";
  2125.             $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  2126.             $waitingList = (($totalInscribedWithCorrectStatus >= $competition->getPlazas()) && $competition->getListaEspera());
  2127.             if ($hasScrambleOrProam) {
  2128.                 $coupleNumber 1;
  2129.             } else {
  2130.                 $coupleNumber 0;
  2131.             }
  2132.             $inscribedData = [];
  2133.             for ($playerCounter 1$playerCounter <= count($playerIdsList); $playerCounter++) {
  2134.                 $playerIdForm $form->get('id' $playerCounter)->getData();
  2135.                 $licenseForm $form->get('licencia' $playerCounter)->getData();
  2136.                 $rateForm $form->get('tarifa' $playerCounter)->getData();
  2137.                 $emailForm $form->get('email')->getData();
  2138.                 $observationsForm $this->util->limpiar($form->get('observaciones')->getData(), false);
  2139.                 $categoryIdForm $form->get('categoria' $playerCounter)->getData();
  2140.                 if ($form->has('barra' $playerCounter) && !empty($form->get('barra' $playerCounter)->getData())) {
  2141.                     $categoryIdForm $form->get('barra' $playerCounter)->getData(); //No es la barra, es el ID de categoria de la barra que ha selecionado el jugador
  2142.                 }
  2143.                 //Al haber pasado por el for anterior el jugador está seguro si ha llegado a este punto
  2144.                 $playerByIdForm $this->em->getRepository(Jugador::class)->find($playerIdForm);
  2145.                 $category $this->em->getRepository(Categoria::class)->find($categoryIdForm);
  2146.                 if ($playerCounter == 1) {
  2147.                     $orderNumber $this->em->getRepository(Pedido::class)->findLastPedido($competition->getId());
  2148.                     if (!is_null($orderNumber)) {
  2149.                         $orderNumber substr($orderNumber['numero'], 102);
  2150.                         $orderNumber++;
  2151.                     } else {
  2152.                         $orderNumber 'AA';
  2153.                     }
  2154.                     //inicializamos el pedido
  2155.                     $inscriptionOrder->setEmail($emailForm);
  2156.                     $inscriptionOrder->setEmailCod($emailForm$secret);
  2157.                     $inscriptionOrder->setConcepto("ionline");
  2158.                     $inscriptionOrder->setnumero($orderNumber);        //Ponemos algo para que no este vacio, pero se pone el numero correcto mas adelante
  2159.                     $amount 0;
  2160.                     $applyRate true;
  2161.                     $letter "F";
  2162.                     $authorized $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $playerByIdForm->getLicenciaCorta());
  2163.                     if (count($authorized) > 0) {
  2164.                         $applyRate false;
  2165.                         $letter "V";
  2166.                     }
  2167.                     $rate $this->em->getRepository(Tarifa::class)->find($rateForm);
  2168.                     if ($applyRate) {
  2169.                         $amount $rate->getImporte();
  2170.                     }
  2171.                     $inscriptionOrder->setImporte($amount);
  2172.                     $inscriptionOrder->setTarifa(($applyRate) ? $rate null);
  2173.                     if ($amount == 0) {
  2174.                         $inscriptionOrder->setEstado("pagado");
  2175.                     } else {
  2176.                         $inscriptionOrder->setEstado("espera");
  2177.                     }
  2178.                 } else {
  2179.                     $amount 0;
  2180.                     $applyRate true;
  2181.                     $authorized $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $playerByIdForm->getLicenciaCorta());
  2182.                     //Comprobamos si esta licencia pertenece a las licencias permitidas que no pagan, pero deben de ir por el flujo normal de inscripcion {NEX-1754}
  2183.                     if (count($authorized) > 0) {
  2184.                         $applyRate false;
  2185.                         $letter "V";
  2186.                     }
  2187.                     //como ya tenemos el pedido, solamente actualizamos los campos necesarios
  2188.                     if ($applyRate) {
  2189.                         $rate $this->em->getRepository(Tarifa::class)->find($rateForm);
  2190.                         $amount $rate->getImporte();
  2191.                     }
  2192.                     //asignamos la segunda tarifa del segundo jugador
  2193.                     //$pedido->setTarifa2(($aplicarTarifa) ? $tar : null);     //En equipos vamos a tener la misma tarifa por cada miembro de momento
  2194.                     $inscriptionOrder->setImporte($inscriptionOrder->getImporte() + $amount);
  2195.                 }
  2196.                 //terminamos de montar y guardamos el Pedido
  2197.                 $breakdownOrder "";
  2198.                 if ($competition->getOrganizador() != null) {
  2199.                     $breakdownOrder $competition->getOrganizador()->getId() . "-";
  2200.                 }
  2201.                 $breakdownOrder .= $competition->getNombre() . ".<br />";
  2202.                 $breakdownOrder .= $playerByIdForm->getLicencia() . " - ";
  2203.                 $breakdownOrder .= $category->getNombre() . ".";
  2204.                 //Actualizamos el desglose con los datos del primer jugador tambien
  2205.                 $inscriptionOrder->setDesglose($breakdownOrder " " $inscriptionOrder->getDesglose());
  2206.                 //en el ultimo jugador miramos el voucher
  2207.                 if ($playerCounter == count($playerIdsList)) {
  2208.                     if ($validVoucher) {
  2209.                         $voucherAmount $voucher->getCantidad();
  2210.                         $amount $inscriptionOrder->getImporte();
  2211.                         switch ($voucher->getTipo()) {
  2212.                             //Fijo
  2213.                             case 1:
  2214.                                 $amount -= $voucherAmount;
  2215.                                 break;
  2216.                             //Porcentual
  2217.                             case 2:
  2218.                                 $voucherAmount $voucherAmount 100;
  2219.                                 $amount $amount - ($amount $voucherAmount);
  2220.                         }
  2221.                         //Controlamos que minimo sea 0
  2222.                         $amount max($amount0);
  2223.                         $inscriptionOrder->setImporte($amount);
  2224.                         $inscriptionOrder->setVoucher($voucher);
  2225.                     }
  2226.                 }
  2227.                 $this->em->persist($inscriptionOrder);
  2228.                 //Montamos el inscrito
  2229.                 $inscribed = new Inscrito();
  2230.                 $inscribed->setCompeticion($competition);
  2231.                 $inscribed->setJugador($playerByIdForm);
  2232.                 $inscribed->setCategoria($category);
  2233.                 $inscribed->setCategoriaCondicion($category->getCategoriaCondicion());
  2234.                 if ($playerCounter == 1) {
  2235.                     //Le asignamos un numero de equipo, aun siendo individual. Para ello cogemos el último numero de equipo y lo incrementamos
  2236.                     $maximumTeamNumberAtCompetition $this->em->getRepository(Inscrito::class)->findMaxEquipoInscrito($competition->getId());
  2237.                     $maximumTeamNumber = (!empty($maximumTeamNumberAtCompetition)) ? ($maximumTeamNumberAtCompetition 1) : 1;
  2238.                     $team = new Equipo();
  2239.                     $team->setCompeticion($competition);
  2240.                     $team->setEquipo($maximumTeamNumber);
  2241.                     if (!$teamName || strlen($teamName) < 2) {
  2242.                         $teamName "Equipo $maximumTeamNumber";
  2243.                     }
  2244.                     $team->setNombre($teamName);
  2245.                     $this->em->persist($team);
  2246.                     $inscribed->setObservaciones($observationsForm);
  2247.                 }
  2248.                 if (($playerCounter != 0) && !$hasScrambleOrProam) {//Empieza en 0, y X empieza en 1 por lo tanto empezamos por pareja 1 y sumando cada impar.
  2249.                     $coupleNumber++;
  2250.                 }
  2251.                 $inscribed->setPareja($coupleNumber);
  2252.                 $inscribed->setEquipoEntidad($team);
  2253.                 $inscribed->setEquipo($maximumTeamNumber);
  2254.                 $inscribed->setParticipa($waitingList ? -1);
  2255.                 $inscribed->setNivel($playerByIdForm->getNivel());
  2256.                 $inscribed->setTipoInscripcion("frontend");
  2257.                 $inscribed->setNombreEquipo($teamName);
  2258.                 $inscribed->setEstado($inscriptionOrder->getEstado());
  2259.                 $inscribed->setValido(true);
  2260.                 $inscribed->setTurno($shift);
  2261.                 $inscribed->setTarifa($rate);
  2262.                 $inscribed->setHcp($playerByIdForm->getHcp());
  2263.                 $inscribed->setOrderWaitingList(0);
  2264.                 $inscribed->setPedido($inscriptionOrder);
  2265.                 $this->em->persist($inscribed);
  2266.                 $this->em->flush();
  2267.                 $inscribedData[$maximumTeamNumber]['licenses'][] = $inscribed->getJugador()->getLicencia();
  2268.                 $inscribedData[$maximumTeamNumber]['ids'][] = $inscribed->getId();
  2269.                 $additionalDataByCompetition $competition->getAdicionales();
  2270.                 if ($additionalDataByCompetition) {
  2271.                     $dataForm $request->request->all();
  2272.                     foreach ($additionalDataByCompetition as $additionalData) {
  2273.                         if (isset($dataForm["adicional" $additionalData->getId() . "_" $playerCounter])) {
  2274.                             $additionalInscribed = new AdicionalesInscrito();
  2275.                             $additionalInscribed->setValor($dataForm["adicional" $additionalData->getId() . "_" $playerCounter]);
  2276.                             $additionalInscribed->setInscrito($inscribed);
  2277.                             $additionalInscribed->setDato($additionalData);
  2278.                             $this->em->persist($additionalInscribed);
  2279.                         }
  2280.                     }
  2281.                 }
  2282.                 $inscribedList[] = $inscribed;
  2283.                 $playerList[] = $playerByIdForm;
  2284.                 $rateList[] = $rate;
  2285.                 $this->addFlash('success''El jugador ' $playerByIdForm->getNombre() . ' ' $playerByIdForm->getApellidos() . ' (' $playerByIdForm->getLicencia() . ') ' 'se ha inscrito con éxito, en la categoría ' $category->getNombre());
  2286.                 //Log y control
  2287.                 $logMessage "Nueva inscripción online en Competición " $competition->getNombre() . "(" $id "): " $playerByIdForm->getLicencia() . "(" $inscriptionOrder->getNumero() . ")";
  2288.                 $log = new Log('i'$logMessagenull);
  2289.                 $this->em->persist($log);
  2290.                 //$this->em->flush();
  2291.                 try {
  2292.                     $this->util->guardaCsvInscripciones($inscribed);
  2293.                 } catch (\Throwable $exception) {
  2294.                     //does nothing, continues execution
  2295.                     error_log($exception->getMessage());
  2296.                 }
  2297.             }
  2298.             $inscriptionOrder->setNumero($competition->getId() . $letter $competition->getOrganizador()->getId() . $orderNumber);
  2299.             $this->em->flush();
  2300.             if ($competition->getRestringirLicencia() === EnumEstadoRestringirLicencias::PREFERENCIA) {
  2301.                 $updateInscribedToIncludeAtWaitingList->__invoke($competition$inscribedData);
  2302.             }
  2303.             //puede que haya que modificar y poner el pedido en vez de la tarifa
  2304.             if ($form->get('save')->isClicked()) {
  2305.                 $amount $inscriptionOrder->getImporte();
  2306.                 if (($amount == 0) || ($amount == 0.0)) {
  2307.                     //Apaño para poner todos los inscritos a pagado
  2308.                     if ($validVoucher) {
  2309.                         foreach ($inscribedList as $inscribed) {
  2310.                             $inscribed->setEstado("pagado");
  2311.                         }
  2312.                     }
  2313.                     $inscriptionOrder->setEstado("pagado");
  2314.                     $inscriptionOrder->setPayedAt(new \DateTime('now'));  //como son de tarifa cero, las marcamos como pagadas, ya que no hay que pagar nada
  2315.                     $this->em->flush();
  2316.                     //peparamos la URL bitly y el contenido del SMS
  2317.                     $competitionShortUrl $this->util->getShortUrl($competition);
  2318.                     if ($waitingList || $inscribedList[0]->getParticipa() == -1) {
  2319.                         $responseText "Está en lista de espera de " substr($this->util->limpiar($competition->getNombre()), 050) . ". Consulte lista de inscritos en " $competitionShortUrl;
  2320.                     } else {
  2321.                         $responseText "Se ha inscrito correctamente en " substr($this->util->limpiar($competition->getNombre()), 045) . ". Puede consultar el listado de inscritos en " $competitionShortUrl;
  2322.                     }
  2323.                     $competitionOrganiserClient $competition->getOrganizador()->getCliente();
  2324.                     foreach ($playerList as $playerByIdForm) {
  2325.                         $playerPrivacy $inscribed->getJugador()->getPrivacidadSimple();
  2326.                         $rgpd false;
  2327.                         if (str_contains($competition->getOrganizador()->getId(), "AM")) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  2328.                             if (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"]) {
  2329.                                 $rgpd true;
  2330.                             }
  2331.                         } else {    //buscamos la privacidad del organizador
  2332.                             if ((isset($playerPrivacy[$competition->getOrganizador()->getId()]) && $playerPrivacy[$competition->getOrganizador()->getId()]) || (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"])) {
  2333.                                 $rgpd true;
  2334.                             }
  2335.                         }
  2336.                         $playerInscribedPhone $utilJugadores->getDatoPlanoDesdeJugador($playerByIdForm"Telefono"$competitionOrganiserClient);
  2337.                         if ($rgpd && !empty($playerInscribedPhone)) {
  2338.                             $userApp $this->em->getRepository(UserApp::class)->findOneByTelefono($playerInscribedPhone);
  2339.                             $sendForApi $competitionOrganiserClient?->getId() > 2;
  2340.                             $messaging->enviarSms($playerInscribedPhone$responseText$competition2$sendForApi);
  2341.                             $argumentsToNotify = [];
  2342.                             $argumentsToNotify["title"] = "Nueva inscripción en torneo";
  2343.                             $argumentsToNotify["msg"] = $responseText;
  2344.                             $argumentsToNotify["url"] = $competitionShortUrl;
  2345.                             $argumentsToNotify["destinatario"] = $userApp;
  2346.                             $argumentsToNotify["tipo"] = "new-inscription";
  2347.                             $argumentsToNotify["competicion"] = $competition->getId();
  2348.                             $notificator->enviarNotificacion($argumentsToNotify);
  2349.                         }
  2350.                         try {
  2351.                             if ($softwareGolfRelated) {
  2352.                                 $swutil->addClientToActivity($inscribed$this->emtrue);
  2353.                             }
  2354.                         } catch (\Throwable $ex) {
  2355.                             $swgolfLogger->error("Error en " __FILE__ "\n" $ex->getMessage());
  2356.                         }
  2357.                     }
  2358.                     $emailView 'frontend/Inscritos/emailInscripcionPareja.html.twig';
  2359.                     $argumentsToEmail = [
  2360.                         "to" => $emailForm,
  2361.                         "competicion" => $competition,
  2362.                         "subject" => '⛳ NEXTCADDY - Inscripción online [' $inscriptionOrder->getNumero() . ']',
  2363.                         "html" => $this->renderView($emailView, array('jugadores' => $playerList,
  2364.                             'competicion' => $competition,
  2365.                             'inscritos' => $inscribedList,
  2366.                             'pedido' => $inscriptionOrder,
  2367.                             'tarifas' => $rateList,
  2368.                             'lista_espera' => $waitingList
  2369.                         ))
  2370.                     ];
  2371.                     $mailer->enviarCorreo($argumentsToEmail);
  2372.                     return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2373.                 } else {
  2374.                     return $this->redirect($this->generateUrl('pago_intermedio', array('idi' => $inscribed->getId(), 'idp' => $inscriptionOrder->getId())));
  2375.                 }
  2376.             }
  2377.         } else {
  2378.             $competition $this->em->getRepository(Competicion::class)->find($id);
  2379.             if (!$competition) {
  2380.                 $this->addFlash('error'"El torneo buscado no existe");
  2381.                 return $this->redirect($this->generateUrl('competiciones_abiertas'));
  2382.             }
  2383.             $rateList $this->em->getRepository(Tarifa::class)->findByCompeticion($id);
  2384.             $categories $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  2385.             $rounds $this->em->getRepository(Jornada::class)->findBy(array("competicion" => $id), array("orden" => "ASC"));
  2386.             $totalInscribedWithCorrectStatus count($this->em->getRepository(Inscrito::class)->getInscritosActivos($id));
  2387.             $miniature file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
  2388.             return $this->render("frontend/Inscritos/new_equipo.html.twig", [
  2389.                 'form' => $form->createView(),
  2390.                 'competicion' => $competition,
  2391.                 //'data' => $data,
  2392.                 'tarifas' => $rateList,
  2393.                 'categorias' => $categories,
  2394.                 'jornadas' => $rounds,
  2395.                 'hayMiniatura' => $miniature,
  2396.                 'num_inscritos' => $totalInscribedWithCorrectStatus
  2397.             ]);
  2398.         }
  2399.     }
  2400.     /**
  2401.      * F-053 Pregunta si desea cancelar su inscripción
  2402.      *
  2403.      * @Route("/{id}/cancelar-inscrito-pregunta/{ped}", name="competicion_cancelainscrito_pregunta")
  2404.      */
  2405.     public function cancelarInscritoIntermedio($id$ped)
  2406.     {
  2407.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  2408.         if (!$competicion) {
  2409.             $this->addFlash('error'"El torneo buscado no existe");
  2410.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  2411.         }
  2412.         $pedido $this->em->getRepository(Pedido::class)->find($ped);
  2413.         if (!$pedido) {
  2414.             $this->addFlash('error'"El pedido no existe");
  2415.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  2416.         }
  2417.         if (($competicion->getEstado() == 'abierta') && ($competicion->getModo()->getId() >= 3)) {
  2418.             $inscrito $this->em->getRepository(Inscrito::class)->findOneBy(['pedido' => $pedido'competicion' => $id]);
  2419.             return $this->render("frontend/Inscritos/cancelar_inscripcion_pregunta.html.twig", [
  2420.                 'id' => $id,
  2421.                 'pedido' => $pedido,
  2422.                 'competicion' => $competicion,
  2423.                 'inscrito' => $inscrito
  2424.             ]);
  2425.         } else {
  2426.             $this->addFlash('error'"No se puede realizar la cancelación online una vez cerrado el proceso de inscripción. Póngase en contacto con el club");
  2427.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2428.         }
  2429.     }
  2430.     /**
  2431.      * F-054 Cancelar la inscripción online de un jugador
  2432.      *
  2433.      * @Route("/{id}/cancelar-inscrito/{pedido}", name="competicion_cancelainscrito")
  2434.      */
  2435.     public function cancelarInscrito($id$pedidoEnvioCorreo $mailerNotificacionesService $notificatorEnvioSms $messagingSoftwareExternoUtil $swutilLoggerInterface $swgolfLoggerUtilJugadores $util_jugadores)
  2436.     {
  2437.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  2438.         if (!$competicion) {
  2439.             $this->addFlash('error'"El torneo buscado no existe");
  2440.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  2441.         }
  2442.         $secret $this->getParameter('secret');
  2443.         if (($competicion->getEstado() == 'abierta') && ($competicion->getModo()->getId() >= 3)) {
  2444.             if ($pedido == '') {
  2445.                 $this->addFlash('error'"El numero de pedido no puede ser vacío");
  2446.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2447.             }
  2448.             $inscritos $this->em->getRepository(Inscrito::class)->findBy(array('competicion' => $id'pedido' => $pedido));
  2449.             if (!$inscritos) {
  2450.                 $this->addFlash('error'"No se ha podido realizar la cancelación. No existe el inscrito para la competición dada");
  2451.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2452.             }
  2453.             $p $this->em->getRepository(Pedido::class)->find($pedido);
  2454.             if (!$p) {
  2455.                 $this->addFlash('error'"No se ha podido realizar la cancelación. No existe el pedido indicado");
  2456.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2457.             }
  2458.             if ($p->getEstado() != "pagado") {
  2459.                 $this->addFlash('error'"No se ha podido realizar la cancelación. Este pedido ya ha sido cancelado");
  2460.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2461.             }
  2462.             $cl $competicion->getOrganizador()->getCliente();
  2463.             foreach ($inscritos as $inscrito) {
  2464.                 //tomamos valor antes de cambiarlo
  2465.                 $inscritoEstabaEnEspera = ($inscrito->getParticipa() == -1);
  2466.                 $inscrito->setEstado("devolucion");
  2467.                 $inscrito->setParticipa(0);
  2468.                 //Si hay horarios lo borramos
  2469.                 //(esto se va a dar sobretodo si están haciendo pruebas con gestion)
  2470.                 $horarios $this->em->getRepository(Horario::class)->findBy(array('inscrito' => $inscrito));
  2471.                 if (count($horarios) > 0) {
  2472.                     foreach ($horarios as $horario) {
  2473.                         $this->em->remove($horario);
  2474.                     }
  2475.                 }
  2476.                 $jornadas $competicion->getJornadas();
  2477.                 foreach ($jornadas as $jornada) {
  2478.                     if ($jornada->getModalidad()->getId() != 'G' && $jornada->getModalidad()->getId() != 'F' && $jornada->getModalidad()->getId() != 'H') {
  2479.                         $hor $this->em->getRepository(JugadorHorario::class)->deleteJugadorHorario($inscrito$jornadanullnull);
  2480.                         $res $this->em->getRepository(Resultado::class)->deletePuntuacionesInscrito($inscrito$jornada);
  2481.                         $delsh $this->em->getRepository(SinAsignarHorario::class)->deleteSinAsignarHorario($inscrito$jornadanullnull);
  2482.                     } else {
  2483.                         $rr $this->em->getRepository(Resultado::class)->deletePuntuacionesEquipoPareja($inscrito->getEquipo(), $inscrito->getPareja(), $jornada);
  2484.                         $jh_jh $this->em->getRepository(JugadorHorario::class)->findJugadorHorario(null$jornada$inscrito->getEquipo(), $inscrito->getPareja());
  2485.                         $resus array_merge(
  2486.                             $this->em->getRepository(SinAsignarHorario::class)->findEquipoParejaConcreta($inscrito->getEquipo(), $inscrito->getPareja(), $jornada),
  2487.                             ((!empty($jh_jh)) ? [$jh_jh] : []));
  2488.                         foreach ($resus as $resu) {
  2489.                             $this->em->remove($resu);
  2490.                         }
  2491.                     }
  2492.                 }
  2493.                 $p->setEstado("devolucion");
  2494.                 $p->setReturnedAt(new \DateTime('now'));
  2495.                 $this->em->flush();
  2496.                 $jugador $inscrito->getJugador();
  2497.                 $log_message "Cancelación de inscripción online en Competición " $competicion->getNombre() . "(" $id "): " $jugador->getLicencia() . "(" $p->getNumero() . ")";
  2498.                 $log = new Log('i'$log_messagenull);
  2499.                 $this->em->persist($log);
  2500.                 $this->em->flush();
  2501.                 try {
  2502.                     $this->util->guardaCsvInscripciones($inscrito);
  2503.                 } catch (\Throwable $ex) {
  2504.                     //does nothing, continues execution
  2505.                     error_log($ex->getMessage());
  2506.                 }
  2507.                 //avisamos al jugador
  2508.                 $vista 'frontend/Inscritos/emailInscripcion.html.twig';
  2509.                 $args = [
  2510.                     //"to" => $p->getEmail(),
  2511.                     "to" => $p->getEmailCodDecod($secret),
  2512.                     "competicion" => $competicion,
  2513.                     "subject" => "⛳ NEXTCADDY - Cancelación de inscripción [" $p->getNumero() . "]",
  2514.                     "html" => $this->renderView($vista, array('jugador' => $jugador,
  2515.                         'inscrito' => $inscrito,
  2516.                         'competicion' => $competicion,
  2517.                         'pedido' => $p,
  2518.                         "devolucion" => true,
  2519.                         'cancel' => true
  2520.                     ))
  2521.                 ];
  2522.                 //EnvioCorreo::enviarCorreo($args);
  2523.                 $mailer->enviarCorreo($args);
  2524.                 $tar $p->getTarifa();
  2525.                 //Avisamos de la devolucion al organizador
  2526.                 if (!is_null($p)) {
  2527.                     //Solo los que manejan TPV (LV05 o nosotros, segun corresponda)
  2528.                     if (strpos($competicion->getOrganizador()->getId(), "LV") === false) {
  2529.                         $to $this->getParameter('next.email.rfga');
  2530.                     } else {
  2531.                         $usuar $this->em->getRepository(User::class)->findOneByUsername($competicion->getOrganizador()->getId());
  2532.                         $to $usuar->getEmail();
  2533.                     }
  2534.                     if (!empty($p) && $p->getImporte() != 0) {
  2535.                         $args = [
  2536.                             //"to" => $p->getEmail(),
  2537.                             "to" => $to,
  2538.                             "competicion" => $competicion,
  2539.                             "subject" => "Aviso de Devolución - " $competicion->getId() . " [" . ((is_object($p)) ? $p->getNumero() : $p) . "]: Importe " . ((is_object($p)) ? ($p->getImporte() . "€") : "Sin importe en el pedido"),
  2540.                             "html" => $this->renderView('backend/mail/email_devolucion.html.twig', array('jugador' => $jugador,
  2541.                                 'competicion' => $competicion,
  2542.                                 'inscrito' => $inscrito,
  2543.                                 'tarifa' => $tar,
  2544.                                 'razon' => 1,
  2545.                                 'motivo' => "El jugador ha realizado su cancelación en la inscripción a través del email",
  2546.                             ))
  2547.                         ];
  2548.                         //EnvioCorreo::enviarCorreo($args);
  2549.                         $mailer->enviarCorreo($args);
  2550.                     }
  2551.                 }
  2552.                 //Preparación y envio del SMS
  2553.                 $privacidad $inscrito->getJugador()->getPrivacidadSimple();
  2554.                 $rgpd false;
  2555.                 if (strpos($competicion->getOrganizador()->getId(), "AM") !== false) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  2556.                     if (isset($privacidad["AM00"]) && $privacidad["AM00"]) {
  2557.                         $rgpd true;
  2558.                     }
  2559.                 } else {//buscamos la privacidad del organizador
  2560.                     if ((isset($privacidad[$competicion->getOrganizador()->getId()]) && $privacidad[$competicion->getOrganizador()->getId()]) || (isset($privacidad["AM00"]) && $privacidad["AM00"])) {
  2561.                         $rgpd true;
  2562.                     }
  2563.                 }
  2564.                 //$telefono = $jugador->getTlfn();    //$this->em->getRepository(Telefono::class)->findOneBy(array("jugador" => $jugador->getId(), "activo" => true));
  2565.                 $telefono $util_jugadores->getDatoPlanoDesdeJugador($inscrito->getJugador(), "Telefono"$cl);  // $telefono = $jugador->getTelefonoDecod($secret);    //$this->em->getRepository(Telefono::class)->findOneBy(array("jugador" => $jugador->getId(), "activo" => true));
  2566.                 if ($rgpd && !empty($telefono)) {
  2567.                     $url $this->util->getShortUrl($competicion);
  2568.                     $texto "Ha cancelado su inscripción correctamente en " $competicion->getNombre() . ". Puede consultar el listado de inscritos en " $url;
  2569.                     $userApp $this->em->getRepository(UserApp::class)->findOneByTelefono($telefono);
  2570.                     //if (!$userApp) {
  2571.                     $api $cl?->getId() > 2;
  2572.                     $messaging->enviarSms($telefono$texto$competicion2$api);
  2573.                     //} else {
  2574.                     $args = [];
  2575.                     $args["title"] = "Cancelación de inscripción en torneo";
  2576.                     $args["msg"] = $texto;
  2577.                     $args["url"] = $url;
  2578.                     $args["destinatario"] = $userApp;
  2579.                     $args["tipo"] = "anulation";
  2580.                     $args["competicion"] = $competicion->getId();
  2581.                     $notificator->enviarNotificacion($args);
  2582.                     //}
  2583.                 }
  2584.                 //Pablo 15/12/2022: Se cambia la funcion ya que para saber el numero de inscritos para la lista de espera tenemos que tener en cuenta los "pagado" y participa = 1
  2585.                 $num_inscritos count($this->em->getRepository(Inscrito::class)->getInscritosJugadorActivos($competicion->getId(), [], 0, [1]));
  2586.                 $lista_espera = (($num_inscritos $competicion->getPlazas()) && $competicion->getListaEspera());
  2587.                 if ($lista_espera && !$inscritoEstabaEnEspera) {//Si hay lista de espera tenemos que buscar el siguiente inscrito para cambiarle el participa e informar de que va a jugar.
  2588.                     $inscrito_espera $this->em->getRepository(Inscrito::class)->getPrimeroListaEspera($competicion->getId());
  2589.                     if ($inscrito_espera) {
  2590.                         $inscrito_espera->setParticipa(1);
  2591.                         $pedidoInscritoEspera $inscrito_espera->getPedido();
  2592.                         $this->em->flush();
  2593.                         $email $pedidoInscritoEspera->getEmailCodDecod($secret);
  2594.                         if (!empty($email)) {
  2595.                             $args = [
  2596.                                 "to" => $email,
  2597.                                 "subject" => "⛳ NEXTCADDY - Incluido en Competición [" $competicion->getId() . "]",
  2598.                                 "competicion" => $competicion,
  2599.                                 "html" => $this->renderView('frontend/Inscritos/emailAdmitido.html.twig', array(
  2600.                                     'jugador' => $inscrito_espera->getJugador(),
  2601.                                     'competicion' => $competicion,
  2602.                                     'pedido' => $pedidoInscritoEspera,
  2603.                                     'inscrito' => $inscrito_espera,
  2604.                                     'tarifa' => false
  2605.                                 ))
  2606.                             ];
  2607.                             //EnvioCorreo::enviarCorreo($args);
  2608.                             $mailer->enviarCorreo($args);
  2609.                         }
  2610.                         $this->em->flush();
  2611.                     }
  2612.                 }
  2613.                 try {
  2614.                     //Borramos el inscrito anterior de la tabla de Golfmanager y del propio sistema de Golfmanager
  2615.                     $swbd $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club""cliente" => $competicion->getOrganizador()->getCliente(),"clubId" => $competicion->getClub()->getId()]);
  2616.                     if ($swbd) {
  2617.                         $swutil->init($swbd);
  2618.                         $swutil->deleteClientFromActivity($inscrito$this->emtrue);
  2619.                         //Pablo 22/02/2024: Borramos esta condicion, me da igual el softwaregolf que tengamos que ha de ejecutarse la funcion de borrar
  2620.                         //en el caso de Evora no hace nada
  2621.                         //en el caso de GM si borra en su plataforma
  2622.                         // if (strtolower($software) == "golfmanager") {
  2623.                         //     $swutil->init($software);
  2624.                         //     $gmutil = $swutil->getSoftware(); //$new GolfmanagerUtilidad();
  2625.                         //     $gmutil->deleteClientFromActivity($inscrito, $this->em, true);
  2626.                         // }
  2627.                     }
  2628.                 } catch (\Throwable $ex) {
  2629.                     $swgolfLogger->error("Error en " __FILE__ "\n" $ex->getMessage());
  2630.                 }
  2631.             }
  2632.             //Si no tenemos importe, es inscripcion gratuita, por lo que no hay que ir al banco, solo se viene aqui y se cancela la inscripcion, volviendo al inicio
  2633.             if ($p->getimporte() != 0) {
  2634.                 return new JsonResponse([]);
  2635.             } else {
  2636.                 $this->addFlash('success''Se ha cancelado su inscripción al torneo ' $competicion->getNombre());
  2637.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2638.             }
  2639.         } else {
  2640.             //            $this->addFlash(
  2641.             //                    'error', "No se puede realizar la cancelación online una vez cerrado el proceso de inscripción. Póngase en contacto con el club");
  2642.             //            return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2643.             //quizas aqui un email avisando para revision del pedido y la devolucion
  2644.             $this->addFlash('error'"No se puede realizar la cancelación online una vez cerrado el proceso de inscripción. Póngase en contacto con el club");
  2645.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2646.         }
  2647.     }
  2648.     /**
  2649.      * F-055 Llamada ajax de los datos en Vivo de Resultados de parejas
  2650.      *
  2651.      * @Route("/{id}/livescoring/simplificado/parejas", name="competicion_envivo_parejas_simplificado", options={"expose"=true})
  2652.      */
  2653.     public function resultadosEnvivoParejasSimplificado($idRequest $request)
  2654.     {
  2655.         $limite $request->request->get('limite'5);
  2656.         $idj $request->request->get('idj'0);
  2657.         $tipo $request->request->get('tipo''p');
  2658.         $tarjeta $request->request->get('tarjeta''p');
  2659.         $numHoyos $request->request->get('numHoyos'18);
  2660.         $fecha $request->request->get('fecha''c');
  2661.         $sexo $request->request->get('sexo''t');
  2662.         $categoria $request->request->get('categoria'0);
  2663.         $token $request->request->get('token'null);
  2664.         $respuesta = array();
  2665.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  2666.         if (!$competicion) {
  2667.             //No existe la competicion
  2668.             return new JsonResponse(-1);
  2669.         }
  2670.         if (!$this->util->checkTokenValidIframe($competicion$token)) {
  2671.             return new JsonResponse(-1);
  2672.         }
  2673.         //$respuesta['competicion'] = $competicion;
  2674.         $calculo $competicion->getCalculo()->getId();
  2675.         $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('id' => $idj));
  2676.         if (!$jornada) {
  2677.             //No existe la jornada
  2678.             return new JsonResponse(-2);
  2679.         }
  2680.         if (($this->em->getRepository(Competicion::class)->hasResultados($id) && $competicion->getShowLiveScoring()) || ($this->utilidades->compruebaRol(["ADMIN""RFGA""DIRE""AYUDANTE""LIVESCORING"], false))) {
  2681.             //$respuesta['resultados'] = $this->em->getRepository(Resultado::class)->findResultadosSimplificados($idj, $limite, $tipo, $tarjeta, $numHoyos, $calculo, $sexo, $categoria);
  2682.             $inscritosAux $this->em->getRepository(Inscrito::class)->getInscritosJugadorActivos($id, [], $categoria);
  2683.             $resultadosaux = array();
  2684.             $parejas = array();
  2685.             foreach ($inscritosAux as $ins) {
  2686.                 $index $ins->getEquipo() . "-" $ins->getPareja();
  2687.                 if (!isset($parejas[$index])) {
  2688.                     $pareja["index"] = $index;
  2689.                     $pareja["equipo"] = $ins->getEquipo();
  2690.                     $pareja["pareja"] = $ins->getPareja();
  2691.                     $pareja["equipo-entidad"] = $ins->getEquipoEntidad() ? $ins->getEquipoEntidad()->getId() : -1;
  2692.                     $pareja["miembros"] = array();
  2693.                     $parejas[$index] = $pareja;
  2694.                 }
  2695.                 $parejas[$index]["miembros"][] = $ins->getId();
  2696.             }
  2697.             $golpes = array();
  2698.             $totales = array();
  2699.             //$query = $qb->select("IDENTITY(r.inscrito) AS idi", "SUM(r.scratch) AS scratch", "SUM(r.hcp) AS hcp", "SUM(r.golpes) AS golpes", "MAX(r.hoyo + 0) AS hoyo", "r.updated_at", "SUM(r.contrapar_hcp) AS contraparHcp", "SUM(r.contrapar_scratch) AS contraparScratch", "MOD(COUNT(r.hoyo), " . ($numHoyos + 1 ) . " ) AS numHoyos")
  2700.             foreach ($parejas as $pareja) {
  2701.                 $index $pareja["index"];
  2702.                 $resaux = [];
  2703.                 $res $this->em->getRepository(Resultado::class)->findBy(array('jornada' => $jornada'equipo' => $pareja['equipo'], 'pareja' => $pareja['pareja']));
  2704.                 //Los resultados especiales nos lo saltamos
  2705.                 if (count($res) == && $res[0]->getEspecial()) {
  2706.                     continue;
  2707.                 }
  2708.                 $resaux["index"] = $pareja["index"];
  2709.                 $resaux["equipo"] = $pareja["equipo"];
  2710.                 $resaux["pareja"] = $pareja["pareja"];
  2711.                 $resaux["scratch"] = 0;
  2712.                 $resaux["contraparScratch"] = 0;
  2713.                 $resaux["hcp"] = 0;
  2714.                 $resaux["contraparHcp"] = 0;
  2715.                 $resaux["golpes"] = 0;
  2716.                 $resaux["hoyo"] = 0;
  2717.                 $resaux["updated_at"] = -1;
  2718.                 $resaux['idi'] = $pareja['miembros'][0];
  2719.                 $cont 0;
  2720.                 foreach ($res as $re) {
  2721.                     $hoyo $re->getHoyo();
  2722.                     $golpes[$index][$hoyo]['golpes'] = intval($re->getGolpes());
  2723.                     $golpes[$index][$hoyo]['scratch'] = $re->getScratch();
  2724.                     $golpes[$index][$hoyo]['hcp'] = $re->getHcp();
  2725.                     $golpes[$index][$hoyo]['hoyo'] = intval($re->getHoyo());
  2726.                     if ($calculo == "S") {
  2727.                         $golpes[$index][$hoyo]['contrapar'] = $re->getContraparScratch();
  2728.                     } else {
  2729.                         $golpes[$index][$hoyo]['contrapar'] = $re->getContraparHcp();
  2730.                     }
  2731.                     $resaux["scratch"] += $re->getScratch();
  2732.                     $resaux["contraparScratch"] += $re->getContraparScratch();
  2733.                     $resaux["hcp"] += $re->getHcp();
  2734.                     $resaux["contraparHcp"] += $re->getContraparHcp();
  2735.                     $resaux["golpes"] += intval($re->getGolpes());
  2736.                     $resaux["hoyo"] = max($resaux["hoyo"], $hoyo);
  2737.                     $resaux["updated_at"] = max($resaux["updated_at"], $re->getUpdatedAt()->format("Y-m-d H:i:s"));
  2738.                     if (!empty($re->getGolpes())) {
  2739.                         $cont++;
  2740.                     }
  2741.                 }
  2742.                 $resaux["numHoyos"] = $cont;    //count($res);
  2743.                 // [!]
  2744.                 if ($fecha == "h") {
  2745.                     $res2 $this->em->getRepository(Resultado::class)->getAcumuladoParejaHastaJornadaCompeticion($pareja["equipo"], $pareja["pareja"], $id$jornada->getOrden(), $calculo);
  2746.                     $totales[$index] = $res2;
  2747.                 }
  2748.                 if ($resaux['golpes'] == 0) {
  2749.                     $resaux["contraparScratch"] = '-';
  2750.                     $resaux["contraparHcp"] = '-';
  2751.                 }
  2752.                 $resultadosaux[] = $resaux;
  2753.             }
  2754.             $respuesta['resultados'] = $resultadosaux;
  2755.             //$horarios = array();
  2756.             $especiales = array();
  2757.             //Si no son los resultados de hoy, quiere decir que son todos los inscritos.
  2758.             if ($fecha != "h") {
  2759.                 foreach ($inscritosAux as $ins) {
  2760.                     if (empty($ins->getCategoria())) {
  2761.                         //nos lo saltamos
  2762.                         continue;
  2763.                     }
  2764.                     $index $ins->getEquipo() . "-" $ins->getPareja();
  2765.                     $hayEspecial false;
  2766.                     $tot $this->em->getRepository(Resultado::class)->getResultadosParejasJornadasAnteriores($id$ins->getEquipo(), $ins->getPareja(), $jornada->getOrden());
  2767.                     foreach ($tot as $t) {
  2768.                         $hayEspecial = (!is_null($t["especial"])) || $hayEspecial;
  2769.                     }
  2770.                     if (!$hayEspecial) {
  2771.                         $totales[$index] = $this->em->getRepository(Resultado::class)->getAcumuladoParejaHastaJornadaCompeticion($ins->getEquipo(), $ins->getPareja(), $id$jornada->getOrden(), $calculo);
  2772.                         $totales[$index]["jornadas"] = $tot;
  2773.                     } else {
  2774.                         $especiales[$index] = ["especial" => "Ret""prioridad" => 1"updated_at" => new \DateTime('now')];
  2775.                     }
  2776.                     /* if (!isset($inscritos[$ins->getId()])) {
  2777.                       $inscr = $this->em->getRepository(Inscrito::class)->findInscritoBarra($idj, $ins->getId());
  2778.                       $inscritos[$ins->getId()] = ["handicap" => $inscr["hcp"], "apellidos" => $inscr["apellidos"], "nombre" => $inscr["nombre"], "categoria" => $inscr["categoria"], "barra" => $inscr["barra"]];
  2779.                       } */
  2780.                     /* $horarioAux = $this->em->getRepository(Horario::class)->findOneBy(array("jornada" => $idj, "inscrito" => $ins->getId()));
  2781.                       if ($horarioAux) {
  2782.                       $horarios[$ins->getId()] = ["tee" => $horarioAux->getTee(), "hora" => $horarioAux->getFecha()->format("H:i")];
  2783.                       } */
  2784.                     //OJO con Descalificado con resultados!!
  2785.                     $especialesAux $this->em->getRepository(Resultado::class)->findResultadosEspecialesSimplificados($idj$ins->getId(), $limite$tipo);
  2786.                     if ($especialesAux) {
  2787.                         $especiales[$ins->getId()] = ["especial" => $especialesAux[0]["especial"], "prioridad" => $especialesAux[0]["prioridad"], "updated_at" => $especialesAux[0]["updated_at"]];
  2788.                     }
  2789.                 }
  2790.             }
  2791.             $respuesta['especiales'] = $especiales;
  2792.             //$respuesta['inscritos'] = $inscritos;
  2793.             //$respuesta['horarios'] = $horarios;
  2794.             if (!empty($golpes)) {
  2795.                 $respuesta['golpes'] = $golpes;
  2796.             } else {
  2797.                 $respuesta['hayDatos'] = false;
  2798.                 return new JsonResponse($respuesta);
  2799.             }
  2800.             if (!empty($totales)) {
  2801.                 $respuesta['totales'] = $totales;
  2802.             }
  2803.             $respuesta['parejas'] = $parejas;
  2804.             $respuesta['hayDatos'] = true;
  2805.         } else {
  2806.             $respuesta['trazadosbarras'] = array();
  2807.             $respuesta['golpes'] = array();
  2808.             $respuesta['minmaxHours'] = array();
  2809.             $respuesta['minmaxTimes'] = array();
  2810.             $respuesta['minmaxPoints'] = array();
  2811.             $respuesta['resultados'] = array();
  2812.             $respuesta['especiales'] = array();
  2813.             $respuesta['totales'] = array();
  2814.             $respuesta['inscritos'] = array();
  2815.             $respuesta['parejas'] = array();
  2816.             $respuesta['hayDatos'] = false;
  2817.         }
  2818.         $respuesta['jornadasCompatibles'] = $competicion->getJornadasCompatibles();
  2819.         return new JsonResponse($respuesta);
  2820.     }
  2821.     /**
  2822.      * F-056 Llamada ajax de los datos en Vivo de Resultados individuales
  2823.      *
  2824.      * @Route("/{id}/livescoring/simplificado", name="competicion_envivo_simplificado", options={"expose"=true})
  2825.      */
  2826.     public function resultadosEnvivoSimplificado($idRequest $request)
  2827.     {
  2828.         $limite $request->request->get('limite'5);
  2829.         $idj $request->request->get('idj'0);
  2830.         $tipo $request->request->get('tipo''p');
  2831.         $tarjeta $request->request->get('tarjeta''p');
  2832.         $numHoyos $request->request->get('numHoyos'18);
  2833.         $fecha $request->request->get('fecha''c');
  2834.         $sexo $request->request->get('sexo''t');
  2835.         $categoria $request->request->get('categoria'0);
  2836.         $grupo $request->request->get('grupo'"");
  2837.         $token $request->request->get('token'null);
  2838.         $respuesta = [
  2839.             'trazadosbarras' => array(),
  2840.             'golpes' => array(),
  2841.             'minmaxHours' => array(),
  2842.             'minmaxTimes' => array(),
  2843.             'minmaxPoints' => array(),
  2844.             'resultados' => array(),
  2845.             'especiales' => array(),
  2846.             'totales' => array(),
  2847.             'inscritos' => array(),
  2848.             'hayDatos' => false];
  2849.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  2850.         if (!$competicion) {
  2851.             //No existe la competicion
  2852.             return new JsonResponse(-1);
  2853.         }
  2854.         if (!$this->util->checkTokenValidIframe($competicion$token)) {
  2855.             return new JsonResponse(-1);
  2856.         }
  2857.         //$respuesta['competicion'] = $competicion;
  2858.         $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('id' => $idj));
  2859.         if (!$jornada) {
  2860.             //No existe la jornada
  2861.             return new JsonResponse(-2);
  2862.         }
  2863.         if (!(($this->em->getRepository(Competicion::class)->hasResultados($id) && $competicion->getShowLiveScoring()) || ($this->utilidades->compruebaRol(["ADMIN""RFGA""DIRE""AYUDANTE""LIVESCORING"], false)))) {
  2864.             return new JsonResponse($respuesta);
  2865.         }
  2866.         $calculo $competicion->getCalculo()->getId();
  2867.         $respuesta['resultados'] = $this->em->getRepository(Resultado::class)->findResultadosSimplificados($idj$limite$tipo$tarjeta$numHoyos$calculo$sexo$categoria$grupo);
  2868.         if (!$respuesta['resultados']) {
  2869.             $respuesta['hayDatos'] = false;
  2870.             return new JsonResponse($respuesta);
  2871.         }
  2872.         //obtenemos los resultados de los inscritos en esta jornada y los metemos en un array facilmente manejable
  2873.         $golpes = array();
  2874.         $totales = array();
  2875.         foreach ($respuesta['resultados'] as $result) {
  2876.             $res $this->em->getRepository(Resultado::class)->findBy(array('tipo' => 'individual''jornada' => $jornada'inscrito' => $result['idi']));
  2877.             foreach ($res as $re) {
  2878.                 $golpes[$result['idi']][$re->getHoyo()]['golpes'] = intval($re->getGolpes());
  2879.                 $golpes[$result['idi']][$re->getHoyo()]['scratch'] = $re->getScratch();
  2880.                 $golpes[$result['idi']][$re->getHoyo()]['hcp'] = $re->getHcp();
  2881.                 $golpes[$result['idi']][$re->getHoyo()]['hoyo'] = intval($re->getHoyo());
  2882.                 if ($calculo == "S") {
  2883.                     $golpes[$result['idi']][$re->getHoyo()]['contrapar'] = $re->getContraparScratch();
  2884.                 } else {
  2885.                     $golpes[$result['idi']][$re->getHoyo()]['contrapar'] = $re->getContraparHcp();
  2886.                 }
  2887.             }
  2888.             if ($fecha == "h") {    //Si son los resultados de Hoy, traemos los totales de esos jugadores
  2889.                 $res2 $this->em->getRepository(Resultado::class)->getAcumuladoHastaJornadaCompeticion($result['idi'], $id$jornada->getOrden(), $calculo);
  2890.                 $totales[$result['idi']] = $res2;
  2891.             }
  2892.             //guardamos los datos de esos inscritos
  2893.             //$ins = $this->em->getRepository(Inscrito::class)->findInscritoBarra($idj, $result['idi']);
  2894.             //$inscritos[$result['idi']] = ["handicap" => $ins["hcpJ"], "apellidos" => $ins["apellidos"], "nombre" => $ins["nombre"], "categoria" => $ins["categoria"], "barra" => $ins["barra"]];
  2895.         }
  2896.         //$horarios = array();
  2897.         $especiales = array();
  2898.         //Si no son los resultados de hoy, quiere decir que son todos los inscritos.
  2899.         if ($fecha != "h") {
  2900.             $inscritosAux $this->em->getRepository(Inscrito::class)->getInscritosJugadorActivos($id, [], $categoria);
  2901.             foreach ($inscritosAux as $ins) {
  2902.                 if (empty($ins->getCategoria())) {
  2903.                     //nos lo saltamos
  2904.                     continue;
  2905.                 }
  2906.                 if ($grupo != "" && $ins->getAgrupacion() != $grupo) {
  2907.                     continue;
  2908.                 }
  2909.                 $hayEspecial false;
  2910.                 $tot $this->em->getRepository(Resultado::class)->getResultadosJornadasAnteriores($id$ins->getId(), $jornada->getOrden());
  2911.                 foreach ($tot as $t) {
  2912.                     $hayEspecial = (!is_null($t["especial"])) || $hayEspecial;
  2913.                 }
  2914.                 if (!$hayEspecial) {
  2915.                     $totales[$ins->getId()] = $this->em->getRepository(Resultado::class)->getAcumuladoHastaJornadaCompeticion($ins->getId(), $id$jornada->getOrden(), $calculo);
  2916.                     $totales[$ins->getId()]["jornadas"] = $tot;
  2917.                 } else {
  2918.                     $especiales[$ins->getId()] = ["especial" => "Ret""prioridad" => 1"updated_at" => new \DateTime('now')];
  2919.                 }
  2920.                 /* if (!isset($inscritos[$ins->getId()])) {
  2921.                   $inscr = $this->em->getRepository(Inscrito::class)->findInscritoBarra($idj, $ins->getId());
  2922.                   $inscritos[$ins->getId()] = ["handicap" => $inscr["hcp"], "apellidos" => $inscr["apellidos"], "nombre" => $inscr["nombre"], "categoria" => $inscr["categoria"], "barra" => $inscr["barra"]];
  2923.                   } */
  2924.                 /* $horarioAux = $this->em->getRepository(Horario::class)->findOneBy(array("jornada" => $idj, "inscrito" => $ins->getId()));
  2925.                   if ($horarioAux) {
  2926.                   $horarios[$ins->getId()] = ["tee" => $horarioAux->getTee(), "hora" => $horarioAux->getFecha()->format("H:i")];
  2927.                   } */
  2928.                 //OJO con Descalificado con resultados!!
  2929.                 $especialesAux $this->em->getRepository(Resultado::class)->findResultadosEspecialesSimplificados($idj$ins->getId(), $limite$tipo);
  2930.                 if ($especialesAux) {
  2931.                     $especiales[$ins->getId()] = ["especial" => $especialesAux[0]["especial"], "prioridad" => $especialesAux[0]["prioridad"], "updated_at" => $especialesAux[0]["updated_at"]];
  2932.                 }
  2933.             }
  2934.         }
  2935.         $respuesta['especiales'] = $especiales;
  2936.         //$respuesta['inscritos'] = $inscritos;
  2937.         //$respuesta['horarios'] = $horarios;
  2938.         if (!empty($golpes)) {
  2939.             $respuesta['golpes'] = $golpes;
  2940.         } else {
  2941.             $respuesta['hayDatos'] = false;
  2942.             return new JsonResponse($respuesta);
  2943.         }
  2944.         if (!empty($totales)) {
  2945.             $respuesta['totales'] = $totales;
  2946.         }
  2947.         $respuesta['hayDatos'] = true;
  2948.         return new JsonResponse($respuesta);
  2949.     }
  2950.     /**
  2951.      *
  2952.      * @Route("/{id}/new-livescoring/{orden}", name="livescoring")
  2953.      */
  2954.     public function livescoring(UtilResultados $utilResultadosRequest $requestLivescoringCache $livescoring$id$orden null): RedirectResponse|Response
  2955.     {
  2956.         // TODO eliminar 'new' de la ruta y los archivos del livescoring antiguo para completar el cambio al nuevo livescoring
  2957.         // Obtenemos competicion para echar si no existe y para poder obtener parametros por si no hay jornada
  2958.         $competicion $this->em->getRepository(Competicion::class)->getCompeticionAvailable($id);
  2959.         /* @var Competicion $competicion */
  2960.         if (empty($competicion)) {
  2961.             $this->addFlash('error'"No existe esta competicion");
  2962.             return $this->redirectToRoute("portada");
  2963.         }
  2964.         $ahora = new \DateTime();
  2965.         if (!$orden) {
  2966.             $round $this->em->getRepository(Jornada::class)->getMaxJornadaWithResults($idnull1);
  2967.             if ($round) {
  2968.                 $orden $round->getOrden();
  2969.             } else {
  2970.                 $orden 1;
  2971.             }
  2972.         } else {
  2973.             $orden intval($orden);
  2974.             if ($orden 1) {
  2975.                 $orden 1;
  2976.             }
  2977.         }
  2978.         // Vamos a la jornada de hoy, pero si somos ADMIN o FEDE vamos a la que hemos indicado
  2979.         if ($this->utilidades->compruebaRol(["ADMIN""FEDE"], false)) {
  2980.             $jornada $this->em->getRepository(Jornada::class)->findOneBy(["competicion" => $id"orden" => $orden]);
  2981.         } else {
  2982.             $jornada $this->em->getRepository(Jornada::class)->findOneBy(["competicion" => $id"fecha" => $ahora]);
  2983.             $orden $jornada?->getOrden() ?? $orden;
  2984.         }
  2985.         $livescoringData null;
  2986.         $horaSalida null;
  2987.         $livescoringH null;
  2988.         $livescoringS null;
  2989.         if ($jornada) {
  2990.             $team $jornada->isTeamLivescoring() ?? $request->query->get('team'false);
  2991.             // llamada a la funcion de cache para obtener team
  2992.             // $team = $this->util_cache->getTeamLivescoringValueCache($competicion->getId(), 'new-livescoring', $team);
  2993.             // Se obtiene toda la informacion necesaria para el componente livescoring
  2994.             // $livescoring = $utilResultados->livescoring($jornada, [], $team); // OLD LIVESCORING POR SI FALLA EL REFACTORIZADO
  2995.             $livescoringParams = [
  2996.                 'isTeamLivescoring' => $team
  2997.             ];
  2998.             $livescoringFormula $competicion->getLivescoringFormula();
  2999.             if (EnumLivescoringFormula::HANDICAP_SCRATCH === $livescoringFormula) {
  3000.                 $livescoringH $livescoring->__invoke($jornada$livescoringParamsHANDICAP_CALCULATION);
  3001.                 $livescoringS $livescoring->__invoke($jornada$livescoringParamsSCRATCH_CALCULATION);
  3002.                 $livescoringData $livescoring->__invoke($jornada$livescoringParams);
  3003.             } else if (EnumLivescoringFormula::SCRATCH === $livescoringFormula) {
  3004.                 $livescoringData $livescoring->__invoke($jornada$livescoringParamsSCRATCH_CALCULATION);
  3005.             } else if (EnumLivescoringFormula::HANDICAP === $livescoringFormula) {
  3006.                 $livescoringData $livescoring->__invoke($jornada$livescoringParamsHANDICAP_CALCULATION);
  3007.             }
  3008.             $horaSalida $utilResultados->horaSalida($jornada->getId(), $livescoringData['individual']);
  3009.         }
  3010.         $isProd ProjectEnvironment::isProd();
  3011.         $calculation $competicion->getCalculo()->getId();
  3012.         $response = new Response($this->renderView("frontend/Competicion/livescoring.html.twig", [
  3013.             "nombreCompeticion" => $competicion->getNombre(),
  3014.             "nombreClub" => $competicion->getClub()->getNombre(),
  3015.             "compId" => $id,
  3016.             "orden" => $orden,
  3017.             "livescoring" => $livescoringData,
  3018.             "livescoringS" => $livescoringS,
  3019.             "livescoringH" => $livescoringH,
  3020.             "horaSalida" => $horaSalida,
  3021.             'competicion' => $competicion,
  3022.             'isProduction' => $isProd,
  3023.             "calculation" => $calculation
  3024.         ]));
  3025.         $competitionIsOrganizerByCM01 "CM01" == $competicion->getOrganizador()->getId() && $competicion->getPrivada() && !$this->utilidades->compruebaRol(["ADMIN""ROLE_CLUB_CM01"], false);
  3026.         if ($competitionIsOrganizerByCM01) {
  3027.             $response->headers->set("Content-Security-Policy""frame-ancestors https://www.rcphierro.com/");
  3028.         }
  3029.         return $response;
  3030.     }
  3031.     /**
  3032.      * F-057 Livescoring individual
  3033.      *
  3034.      * @Route("/{id}/livescoring/{orden}/{letra}", name="competicion_envivo", defaults={ "orden" = 0, "letra" = "H" }, options={"expose"=true})
  3035.      *
  3036.      */
  3037.     public function resultadosEnvivo(Request $request$id$orden$letraKernelInterface $kernelPackages $doctrineAuthorizationCheckerInterface $authorizationChecker)
  3038.     {
  3039.         $files = [];
  3040.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  3041.         if (empty($competicion)) {
  3042.             $this->addFlash('error'"El torneo buscado no existe");
  3043.             //return $this->redirect($this->generateUrl('_club', array('id' => "AM00")));
  3044.             return $this->redirect($this->generateUrl('portada'));
  3045.         }
  3046.         //Si no es publica, admin logado como admin o federacion logado como (fede o admin), entonces error
  3047.         $showLivescoring $competicion->getShowLiveScoring();
  3048.         if (!($authorizationChecker->isGranted('ROLE_ADMIN') ||
  3049.             ($showLivescoring == "publico") ||
  3050.             ($authorizationChecker->isGranted('ROLE_ADMIN')) ||
  3051.             ($showLivescoring == "club" && $authorizationChecker->isGranted('ROLE_CLUB')) ||
  3052.             ($showLivescoring == "federacion" && (($this->utilidades->compruebaRol(["ADMIN""RFGA""DIRE""AYUDANTE""LIVESCORING"], false))))
  3053.         )) {
  3054.             $this->addFlash('info'"El livescoring de esta competición no está activado en este momento");
  3055.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  3056.         }
  3057.         $isToday false;
  3058.         if ($orden <= 0) {
  3059.             //Por defecto si no hay día indicado, toma el actual
  3060.             $now = new \DateTime('midnight');
  3061.             $jornada $this->em->getRepository(Jornada::class)->getMaxJornadaWithResults($id$now1);
  3062.             $isToday true;
  3063.         } else {
  3064.             //Para ADMIN o FEDE si dejamos ver indicando el orden de jornada
  3065.             if ($this->utilidades->compruebaRol(["ADMIN""FEDE "], false)) {
  3066.                 $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id'orden' => $orden));
  3067.             } else {
  3068.                 //Para el resto de roles solo se deja ver el día de hoy.
  3069.                 //Al estar marcado el orden, usa dicho orden para varias jornadas el mismo día
  3070.                 $now = new \DateTime('midnight');
  3071.                 $jornada $this->em->getRepository(Jornada::class)->getMaxJornadaWithResults($id$now1$orden);
  3072.                 $isToday true;
  3073.             }
  3074.         }
  3075.         if (empty($jornada)) {
  3076.             $hoy = new \DateTime('today 23:59:59');
  3077.             $jornadasHastaAhora = [];
  3078.             $jornadasDesdeAhora = [];
  3079.             foreach ($competicion->getJornadas() as $competicionJornada) {
  3080.                 if ($competicionJornada->getFecha() <= $hoy) {
  3081.                     $jornadasHastaAhora[] = $competicionJornada->getOrden();
  3082.                 } else {
  3083.                     $jornadasDesdeAhora[] = $competicionJornada->getOrden();
  3084.                 }
  3085.             }
  3086.             if (empty($jornadasHastaAhora)) {
  3087.                 $orden $jornadasDesdeAhora[array_key_first($jornadasDesdeAhora)];
  3088.             } else {
  3089.                 $orden $jornadasHastaAhora[array_key_last($jornadasHastaAhora)];
  3090.             }
  3091.             $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id'orden' => $orden));
  3092.             if (empty($jornada)) {
  3093.                 $this->addFlash('error'"No hay resultados  para el torneo en el día de hoy o no tiene permisos para acceder");
  3094.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  3095.             }
  3096.         } else {
  3097.             /* if ($jornada->getModalidad()->getId() != "I") {
  3098.               $this->addFlash(
  3099.               'error', "No podemos mostrarle la jornada solicitada");
  3100.               return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  3101.               } */
  3102.         }
  3103.         //tomamos solo una para coger el número de hoyos a jugar, ya que va a ser el mismo para todas las categorías, si no que estaría mal
  3104.         $jornadaConfig $this->em->getRepository(JornadaConfig::class)->findOneByJornada($jornada);
  3105.         $limits explode("-"$jornadaConfig->getHoyos());
  3106.         //Si todas son individuales esto devuelve cero, si hay alguna no individual, entonces será falso
  3107.         $todasIndividual = ($this->em->getRepository(Jornada::class)->cuentaJornadasNoIndividuales($id) == 0);
  3108.         //comprobamos si hay fotos y se las pasamos al JS
  3109.         $clubes = [$competicion->getClub()->getId(), "AMXX"];
  3110.         $cFondo 0;
  3111.         $hayUrl false;
  3112.         try {
  3113.             while ($cFondo && !$hayUrl) {
  3114.                 $imgPath $doctrine->getUrl('img/frontend/livescore/' $clubes[$cFondo] . "/");
  3115.                 $fullPath $kernel->getProjectDir() . '/public/' $imgPath;  //prod
  3116.                 $hayUrl file_exists($fullPath);
  3117.                 if ($hayUrl) {
  3118.                     $files scandir($fullPath);
  3119.                 }
  3120.                 $cFondo++;
  3121.             }
  3122.         } catch (\Exception $ex) {
  3123.             //Nothing
  3124.         }
  3125.         //21/02/2019 Movido del simplificado para que las actualizaciones del livescoring sean menos pesadas
  3126.         $inscritosAux $this->em->getRepository(Inscrito::class)->getInscritosActivos($id0);
  3127.         $horarios = array();
  3128.         $inscritos = array();
  3129.         foreach ($inscritosAux as $ins) {
  3130.             if (empty($ins->getCategoria())) {
  3131.                 //nos lo saltamos
  3132.                 continue;
  3133.             }
  3134.             $horarioAux $this->em->getRepository(Horario::class)->findOneBy(array("jornada" => $jornada"inscrito" => $ins->getId()));
  3135.             if ($horarioAux) {
  3136.                 $horarios[$ins->getId()] = ["tee" => $horarioAux->getTee(), "hora" => $horarioAux->getFecha()->format("H:i")];
  3137.             }
  3138.             $i $this->em->getRepository(Inscrito::class)->findInscritoBarra($jornada$ins->getId());
  3139.             if (!is_null($i)) {
  3140.                 $inscritos[$ins->getId()] = ["licencia" => $i["licencia"], "handicap" => $i["hcpJ"], "apellidos" => $i["apellidos"], "nombre" => $i["nombre"], "categoria" => $i["categoria"], "barra" => $i["barra"] != "outline" $i["barra"] : "basic"];
  3141.             } else {
  3142.                 //Si no encuentra el InscritoBarra (normalmente es porque el jugador es invalido, no deberia de salir, pero acordamos que saltga) asi que montamos a manos el elemento
  3143.                 //asi nos garantizamos siempre que exista, aunque controlemos en el JS que no exista para evitar errores
  3144.                 $jugador $ins->getJugador();
  3145.                 $inscritos[$ins->getId()] = ["licencia" => $jugador->getLicencia(), "apellidos" => $jugador->getApellidos(), "nombre" => $jugador->getNombre(), "categoria" => $ins->getCategoria()->getId()];
  3146.                 //Y ponemos a mano la barra y el hcp (estos valores han de ser corregidos calculados en inscritos)
  3147.                 $hcpJugg $this->em->getRepository(HcpJuego::class)->findBy(["jornada" => $jornada"inscrito" => $ins]);
  3148.                 if ($hcpJugg) {
  3149.                     $inscritos[$ins->getId()]["handicap"] = $hcpJugg[0]->getHcp();
  3150.                 } else {
  3151.                     $inscritos[$ins->getId()]["handicap"] = " ";
  3152.                 }
  3153.                 $traz_barr $this->em->getRepository(Inscrito::class)->getTrazadoBarra($jugador->getSexo(), $ins->getCategoria()->getId(), $jornada);
  3154.                 if ($traz_barr) {
  3155.                     $inscritos[$ins->getId()]["barra"] = $traz_barr->getBarra()->getColor() != "outline" $traz_barr->getBarra()->getColor() : "basic";
  3156.                 } else {
  3157.                     $inscritos[$ins->getId()]["barra"] = " ";
  3158.                 }
  3159.             }
  3160.             $inscritos[$ins->getId()]["teamname"] = $ins->getEquipoEntidad() ? $ins->getEquipoEntidad()->getNombre() : $ins->getNombreEquipo();
  3161.         }
  3162.         //mejorar esto para que solo lo haga una vez y no cada vez que se le llama (sacarla fuera o algo)
  3163.         $trazadosbarras = array();
  3164.         try {
  3165.             $categos $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  3166.             foreach ($categos as $cat) {
  3167.                 //buscamos cada categoriaconfig para obtener el sexo
  3168.                 $categosconfig $this->em->getRepository(CategoriaConfig::class)->findOneByCategoria($cat);
  3169.                 //buscamos en cada jornada config (a partir de la categoria y jornada) para obtener la Barra. Relacion 1:1
  3170.                 $jornadaconfig $this->em->getRepository(JornadaConfig::class)->findOneBy(array('categoria' => $cat'jornada' => $jornada));
  3171.                 if (empty($jornadaconfig)) {
  3172.                     //para evitar el error de que $jornadaconfig es nulo y se esta intentando acceder mas adelante. Nos saltamos el elemento
  3173.                     continue;
  3174.                 }
  3175.                 //el trazado sale de la jornada (no tengo que buscarlo)
  3176.                 //obtenemos el trazado barra a partir de:
  3177.                 $trazadobarra $this->em->getRepository(TrazadoBarra::class)->findOneBy(array('trazado' => $jornada->getTrazado(), 'barra' => $jornadaconfig->getBarra(), 'sexo' => $categosconfig->getSexo(), 'activo' => 1));
  3178.                 //Obtenemos la info de los hoyos (metros, par y hcp) a aprtir del trazado barra
  3179.                 $hoyos $this->em->getRepository(Hoyo::class)->findBy(array('trazadoBarra' => $trazadobarra));
  3180.                 $hoyosmodif = array();
  3181.                 foreach ($hoyos as $hoyo) {
  3182.                     $hoyito = array();
  3183.                     $hoyito['metros'] = $hoyo->getMetros();
  3184.                     $hoyito['par'] = $hoyo->getPar();
  3185.                     $hoyito['hcp'] = $hoyo->getHcp();
  3186.                     $hoyito['hoyo'] = $hoyo->getNumero();
  3187.                     $hoyosmodif[] = $hoyito;
  3188.                 }
  3189.                 $hoyosmodif['barra'] = $jornadaconfig->getBarra()->getId();
  3190.                 $trazadosbarras[$cat->getId()] = $hoyosmodif;
  3191.             }
  3192.             //$respuesta['trazadosbarras'] = $trazadosbarras;
  3193.         } catch (\Exception $ex) {
  3194.             $trazadosbarras = array();
  3195.         }
  3196.         $jornadas $competicion->getJornadas();        // $this->em->getRepository(Jornada::class)->findBy(['competicion' => $competicion], ['orden' => 'ASC']);
  3197.         /* ADAPTAR ESTO QUE ES DE INSERCION DE RESULTADOS PARA PONERLO AQUI */
  3198.         $mobile false;
  3199.         $useragent $request->headers->get('User-Agent');
  3200.         if (preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i'$useragent) || preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i'substr($useragent04))) {
  3201.             $mobile true;
  3202.         }
  3203.         if (!$mobile) {
  3204.             $vista 'frontend/Competicion/envivo.html.twig';
  3205.         } else {
  3206.             $vista 'frontend/Competicion/envivoMobile.html.twig';
  3207.         }
  3208.         $agrupaciones $this->em->getRepository(Inscrito::class)->getAgrupacionesByCompeticion($competicion);
  3209.         $response = new Response($this->renderView($vista, array(
  3210.             'competicion' => $competicion,
  3211.             'esEquipo' => intval($competicion->getJugadores() > 2),
  3212.             'jornada' => $jornada,
  3213.             'jornadas' => $jornadas,
  3214.             'letra' => $letra,
  3215.             'isToday' => $isToday,
  3216.             'imgPath' => $imgPath,
  3217.             'files' => array_slice($files2), //eliminamos "." y ".."
  3218.             'hayUrl' => $hayUrl,
  3219.             'todasIndividual' => $todasIndividual,
  3220.             'numHoyos' => intval($limits[1]) - intval($limits[0]) + 1,
  3221.             'trazadosbarras' => $trazadosbarras,
  3222.             'inscritos' => $inscritos,
  3223.             'horarios' => $horarios,
  3224.             'agrupaciones' => $agrupaciones,
  3225.         )));
  3226.         if ("CM01" == $competicion->getOrganizador()->getId() && $competicion->getPrivada() && !$this->utilidades->compruebaRol(["ADMIN""ROLE_CLUB_CM01"], false)) {
  3227.             $response->headers->set("Content-Security-Policy""frame-ancestors https://www.rcphierro.com/");
  3228.         }
  3229.         return $response;
  3230.     }
  3231.     /**
  3232.      * F-058 Livescoring de parejas
  3233.      *
  3234.      * @Route("/{id}/livescoring-couple/{orden}/{letra}", name="competicion_envivo_parejas", defaults={ "letra" = "H" })
  3235.      */
  3236.     public function resultadosEnvivoParejas(Request $request$id$orden$letraKernelInterface $kernelAuthorizationCheckerInterface $authorizationChecker)
  3237.     {
  3238.         //        if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == "on")) {
  3239.         //            $url = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
  3240.         //            header("Location: $url");
  3241.         //            exit;
  3242.         //        }
  3243.         $files = [];
  3244.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  3245.         if (!$competicion) {
  3246.             $this->addFlash('error'"El torneo buscado no existe");
  3247.             //return $this->redirect($this->generateUrl('_club', array('id' => "AM00")));
  3248.             return $this->redirect($this->generateUrl('portada'));
  3249.         }
  3250.         //Si no es publica, admin logado como admin o federacion logado como (fede o admin), entonces error
  3251.         $showLivescoring $competicion->getShowLiveScoring();
  3252.         if (!($authorizationChecker->isGranted('ROLE_ADMIN') ||
  3253.             ($showLivescoring == "publico") ||
  3254.             ($showLivescoring == "deshabilitado" && $authorizationChecker->isGranted('ROLE_ADMIN')) ||
  3255.             ($showLivescoring == "club" && $authorizationChecker->isGranted('ROLE_CLUB')) ||
  3256.             ($showLivescoring == "federacion" && (($this->utilidades->compruebaRol(["ADMIN""FEDE""DIRE""AYUDANTE""LIVESCORING"], false))))
  3257.         )) {
  3258.             $this->addFlash('info'"El livescoring de esta competición no está activado en este momento");
  3259.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  3260.         }
  3261.         $isToday false;
  3262.         if ($orden <= 0) {
  3263.             //Por defecto si no hay día indicado, toma el actual
  3264.             $now = new \DateTime('midnight');
  3265.             $jornada $this->em->getRepository(Jornada::class)->getMaxJornadaWithResults($id$now1);
  3266.             $isToday true;
  3267.         } else {
  3268.             //Para ADMIN o FEDE si dejamos ver indicando el orden de jornada
  3269.             if ($this->utilidades->compruebaRol(["ADMIN""FEDE "], false)) {
  3270.                 $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id'orden' => $orden));
  3271.             } else {
  3272.                 //Para el resto de roles solo se deja ver el día de hoy.
  3273.                 //Al estar marcado el orden, usa dicho orden para varias jornadas el mismo día
  3274.                 $now = new \DateTime('midnight');
  3275.                 $jornada $this->em->getRepository(Jornada::class)->getMaxJornadaWithResults($id$now1$orden);
  3276.                 $isToday true;
  3277.             }
  3278.         }
  3279.         if (empty($jornada)) {
  3280.             $hoy = new \DateTime('today 23:59:59');
  3281.             $jornadasHastaAhora = [];
  3282.             $jornadasDesdeAhora = [];
  3283.             foreach ($competicion->getJornadas() as $competicionJornada) {
  3284.                 if ($competicionJornada->getFecha() <= $hoy) {
  3285.                     $jornadasHastaAhora[] = $competicionJornada->getOrden();
  3286.                 } else {
  3287.                     $jornadasDesdeAhora[] = $competicionJornada->getOrden();
  3288.                 }
  3289.             }
  3290.             if (empty($jornadasHastaAhora)) {
  3291.                 $orden $jornadasDesdeAhora[array_key_first($jornadasDesdeAhora)];
  3292.             } else {
  3293.                 $orden $jornadasHastaAhora[array_key_last($jornadasHastaAhora)];
  3294.             }
  3295.             $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id'orden' => $orden));
  3296.         }
  3297.         if (!$jornada) {
  3298.             $this->addFlash('error'"No existen resultados para ese torneo en el día de hoy o No tiene permisos para acceder");
  3299.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  3300.         }
  3301.         //tomamos solo una para coger el numero de hoyos a jugar, ya que va a ser el mismo para todas las categorias,sino es que estaria mal
  3302.         $jornadaConfig $this->em->getRepository(JornadaConfig::class)->findOneByJornada($jornada);
  3303.         $limits explode("-"$jornadaConfig->getHoyos());
  3304.         //Si todas son individuales esto devuelve cero, si hay alguna no individual, entonces será falso
  3305.         $todasIndividual = ($this->em->getRepository(Jornada::class)->cuentaJornadasNoIndividuales($id) == 0);
  3306.         //comprobamos si hay fotos y se las pasamos al JS
  3307.         $clubes = [$competicion->getClub()->getId(), "AMXX"];
  3308.         $cFondo 0;
  3309.         $hayUrl false;
  3310.         while ($cFondo && !$hayUrl) {
  3311.             $imgPath 'img/frontend/livescore/' $clubes[$cFondo] . "/";
  3312.             $fullPath $kernel->getProjectDir() . '/public/' $imgPath;  //prod
  3313.             $hayUrl file_exists($fullPath);
  3314.             if ($hayUrl) {
  3315.                 $files scandir($fullPath);
  3316.             }
  3317.             $cFondo++;
  3318.         }
  3319.         //21/02/2019 Movido del simplificado para que las actualizaciones del livescoring sean menos pesadas
  3320.         $inscritosAux $this->em->getRepository(Inscrito::class)->getInscritosActivos($id0);
  3321.         $horarios = array();
  3322.         $inscritos = array();
  3323.         foreach ($inscritosAux as $ins) {
  3324.             if (empty($ins->getCategoria())) {
  3325.                 //nos lo saltamos
  3326.                 continue;
  3327.             }
  3328.             $horarioAux $this->em->getRepository(Horario::class)->findOneBy(array("jornada" => $jornada"inscrito" => $ins->getId()));
  3329.             if ($horarioAux) {
  3330.                 $horarios[$ins->getId()] = ["tee" => $horarioAux->getTee(), "hora" => $horarioAux->getFecha()->format("H:i")];
  3331.             }
  3332.             $i $this->em->getRepository(Inscrito::class)->findInscritoBarra($jornada$ins->getId());
  3333.             if (!is_null($i)) {
  3334.                 $inscritos[$ins->getId()] = ["licencia" => $i["licencia"], "handicap" => $i["hcpJ"], "apellidos" => $i["apellidos"], "nombre" => $i["nombre"], "categoria" => $i["categoria"], "barra" => $i["barra"] != "outline" $i["barra"] : "basic"];
  3335.             } else {
  3336.                 //Si no encuentra el InscritoBarra (normalmente es porque el jugador es invalido, no deberia de salir, pero acordamos que saltga) asi que montamos a manos el elemento
  3337.                 //asi nos garantizamos siempre que exista, aunque controlemos en el JS que no exista para evitar errores
  3338.                 $jugador $ins->getJugador();
  3339.                 $inscritos[$ins->getId()] = ["licencia" => $jugador->getLicencia(), "apellidos" => $jugador->getApellidos(), "nombre" => $jugador->getNombre(), "categoria" => $ins->getCategoria()->getId()];
  3340.                 //Y ponemos a mano la barra y el hcp (estos valores han de ser corregidos calculados en inscritos)
  3341.                 $hcpJugg $this->em->getRepository(HcpJuego::class)->findBy(["jornada" => $jornada"inscrito" => $ins]);
  3342.                 if ($hcpJugg) {
  3343.                     $inscritos[$ins->getId()]["handicap"] = $hcpJugg[0]->getHcp();
  3344.                 } else {
  3345.                     $inscritos[$ins->getId()]["handicap"] = " ";
  3346.                 }
  3347.                 $traz_barr $this->em->getRepository(Inscrito::class)->getTrazadoBarra($jugador->getSexo(), $ins->getCategoria()->getId(), $jornada);
  3348.                 if ($traz_barr) {
  3349.                     $inscritos[$ins->getId()]["barra"] = $traz_barr->getBarra()->getColor() != "outline" $traz_barr->getBarra()->getColor() : "basic";
  3350.                 } else {
  3351.                     $inscritos[$ins->getId()]["barra"] = " ";
  3352.                 }
  3353.             }
  3354.             $inscritos[$ins->getId()]["index"] = $ins->getEquipo() . "-" $ins->getPareja();
  3355.             $inscritos[$ins->getId()]["id"] = $ins->getId();
  3356.             $inscritos[$ins->getId()]["teamname"] = $ins->getEquipoEntidad() ? $ins->getEquipoEntidad()->getNombre() : $ins->getNombreEquipo();
  3357.         }
  3358.         //mejorar esto para que solo lo haga una vez y no cada vez que se le llama (sacarla fuera o algo)
  3359.         $trazadosbarras = array();
  3360.         try {
  3361.             $categos $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  3362.             foreach ($categos as $cat) {
  3363.                 //buscamos cada categoriaconfig para obtener el sexo
  3364.                 $categosconfig $this->em->getRepository(CategoriaConfig::class)->findOneByCategoria($cat);
  3365.                 //buscamos en cada jornada config (a partir de la categoria y jornada) para obtener la Barra. Relacion 1:1
  3366.                 $jornadaconfig $this->em->getRepository(JornadaConfig::class)->findOneBy(array('categoria' => $cat'jornada' => $jornada));
  3367.                 if (empty($jornadaconfig)) {
  3368.                     //para evitar el error de que $jornadaconfig es nulo y se esta intentando acceder mas adelante. Nos saltamos el elemento
  3369.                     continue;
  3370.                 }
  3371.                 //el trazado sale de la jornada (no tengo que buscarlo)
  3372.                 //obtenemos el trazado barra a partir de:
  3373.                 $trazadobarra $this->em->getRepository(TrazadoBarra::class)->findOneBy(array('trazado' => $jornada->getTrazado(), 'barra' => $jornadaconfig->getBarra(), 'sexo' => $categosconfig->getSexo(), 'activo' => 1));
  3374.                 //Obtenemos la info de los hoyos (metros, par y hcp) a aprtir del trazado barra
  3375.                 $hoyos $this->em->getRepository(Hoyo::class)->findBy(array('trazadoBarra' => $trazadobarra));
  3376.                 $hoyosmodif = array();
  3377.                 foreach ($hoyos as $hoyo) {
  3378.                     $hoyito = array();
  3379.                     $hoyito['metros'] = $hoyo->getMetros();
  3380.                     $hoyito['par'] = $hoyo->getPar();
  3381.                     $hoyito['hcp'] = $hoyo->getHcp();
  3382.                     $hoyito['hoyo'] = $hoyo->getNumero();
  3383.                     $hoyosmodif[] = $hoyito;
  3384.                 }
  3385.                 $hoyosmodif['barra'] = $jornadaconfig->getBarra()->getId();
  3386.                 $trazadosbarras[$cat->getId()] = $hoyosmodif;
  3387.             }
  3388.             //$respuesta['trazadosbarras'] = $trazadosbarras;
  3389.         } catch (\Exception $ex) {
  3390.             $trazadosbarras = array();
  3391.         }
  3392.         $jornadas $this->em->getRepository(Jornada::class)->findBy(['competicion' => $competicion], ['orden' => 'ASC']);
  3393.         /* ADAPTAR ESTO QUE ES DE INSERCION DE RESULTADOS PARA PONERLO AQUI */
  3394.         $mobile false;
  3395.         $useragent $request->headers->get('User-Agent');
  3396.         if (preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i'$useragent) || preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i'substr($useragent04))) {
  3397.             $mobile true;
  3398.         }
  3399.         if (!$mobile) {
  3400.             $vista 'frontend/Competicion/envivoParejas.html.twig';
  3401.         } else {
  3402.             $vista 'frontend/Competicion/envivoMobileParejas.html.twig';
  3403.         }
  3404.         $jornadasCompatibles $competicion->getJornadasCompatibles();
  3405.         $response = new Response($this->renderView($vista, array(
  3406.             'competicion' => $competicion,
  3407.             'esEquipo' => intval($competicion->getJugadores() > 2),
  3408.             'jornada' => $jornada,
  3409.             'jornadas' => $jornadas,
  3410.             'letra' => $letra,
  3411.             'isToday' => $isToday,
  3412.             'imgPath' => $imgPath,
  3413.             'files' => array_slice($files2), //eliminamos "." y ".."
  3414.             'hayUrl' => $hayUrl,
  3415.             'todasIndividual' => $todasIndividual,
  3416.             'numHoyos' => intval($limits[1]) - intval($limits[0]) + 1,
  3417.             'trazadosbarras' => $trazadosbarras,
  3418.             'inscritos' => $inscritos,
  3419.             'horarios' => $horarios,
  3420.             'jornadasCompatibles' => $jornadasCompatibles
  3421.         )));
  3422.         if ("CM01" == $competicion->getOrganizador()->getId() && $competicion->getPrivada() && !$this->utilidades->compruebaRol(["ADMIN""ROLE_CLUB_CM01"], false)) {
  3423.             $response->headers->set("Content-Security-Policy""frame-ancestors https://www.rcphierro.com/");
  3424.         } else {
  3425.             //En principio nada, no se pone cabecera
  3426.         }
  3427.         return $response;
  3428.     }
  3429.     /**
  3430.      * F-061 Visualizacion detallada de un torneo
  3431.      *
  3432.      * @Route("/{id}/{publi}", name="_tournament", requirements={"id": "\d+"}, options={"expose"=true}, defaults={"publi" = 0})
  3433.      */
  3434.     public function tournament($id$publiRequest $requestTournamentView $tournamentView): RedirectResponse|Response
  3435.     {
  3436.         return $tournamentView->__invoke($id$publi$request);
  3437.     }
  3438.     /**
  3439.      * F-085 Enviar etiquetas por correo a un jugador
  3440.      *
  3441.      * @Route("/{idc}/etiqueta-mail/{id}/{idi}", name="etiquetas_enviar_correo", options={"expose"=true}, methods={"POST"})
  3442.      */
  3443.     public function enviarEtiquetasCorreo($id$idc$idiRequest $requestKernelInterface $kernelEnvioCorreo $mailerEnvironment $twigGestionHorarioController $gh)
  3444.     {
  3445.         $request->request->set('inscritos'1); //como si viniera el parametro de que vienen inscritos
  3446.         $request->request->set('inscrito', [$idi]); //simulando el select de inscritos
  3447.         $request->request->set('tipo''tarjetasA4');     //adhesivas2, adhesivas3, tarjetasA4, preimpreso
  3448.         //habra que ver si definimos el tipo segun el organizador de la competicion
  3449.         //(en el fondo no hace falta, asi la gente se acostumbra a la tarjeta de nextcaddy)
  3450.         $request->request->set('tipoTarj''nextcaddy');
  3451.         //$request->request->set('correo', 1);
  3452.         $retorno $gh->generarEtiquetas($request$id$idc0$this$twig$kernel);
  3453.         $secret $this->getParameter('secret');
  3454.         if ($retorno['data']) {
  3455.             $inscrito $this->em->getRepository(Inscrito::class)->find($idi);
  3456.             //ENVIAR CORREO
  3457.             //$retorno es el pdf
  3458.             $to $request->request->get('correo');
  3459.             if (!$to && !empty($inscrito->getPedido())) {
  3460.                 $to $inscrito->getPedido()->getEmailCod($secret);
  3461.             }
  3462.             $dir $kernel->getProjectDir() . '/public/relaxed';
  3463.             $args = [
  3464.                 "to" => $to,
  3465.                 "attachments" => [$dir "/" $retorno["mensaje"]],
  3466.                 'competicion' => $inscrito->getCompeticion(),
  3467.                 "subject" => "NEXTCADDY - Tarjeta torneo {$inscrito->getCompeticion()->getNombre()} ({$inscrito->getCompeticion()->getFecha()->format("d-m-y")})| {$inscrito->getJugador()->getNombreCompleto()}",
  3468.                 "html" => $this->renderView('backend/mail/email_imprimir_tarjeta.html.twig', array(
  3469.                     'inscrito' => $inscrito,
  3470.                     'competicion' => $inscrito->getCompeticion(),
  3471.                 ))
  3472.             ];
  3473.             //EnvioCorreo::enviarCorreo($args);
  3474.             $mailer->enviarCorreo($args);
  3475.             return new JsonResponse(true);
  3476.         } else {
  3477.             return new JsonResponse(false);
  3478.         }
  3479.     }
  3480.     /**
  3481.      * F-002 Obtención del historico acumulado de los contrapares de una partida (PARECE ESTAR OBSOLETA)
  3482.      *
  3483.      * @Route("/{idc}/partida-horario", name="horario_partida_estadisticas", options={"expose"=true})
  3484.      */
  3485.     public function horarioPartidaEstadisticas($idcRequest $request)
  3486.     {
  3487.         $partidaID $request->request->get("partida");
  3488.         $partida $this->em->getRepository(PartidaHorario::class)->find($partidaID);
  3489.         if (!$partida) {
  3490.             return -2;
  3491.         }
  3492.         $jornada $partida->getHorario()->getJornada();
  3493.         $calculo $jornada->getCompeticion()->getCalculo()->getNombre();
  3494.         $modalidad $jornada->getModalidad()->getId();
  3495.         $jornadaId $jornada->getId();
  3496.         $jugadoresHorario $this->em->getRepository(JugadorHorario::class)->findBy(['partida' => $partida], ['inscrito' => 'ASC']); //ordenamos por ID inscrito para mantener siempre el orden
  3497.         $jugadores = array();
  3498.         $contrapares = array();
  3499.         if ($modalidad == "I") {
  3500.             foreach ($jugadoresHorario as $h) {
  3501.                 $insc $h->getInscrito();
  3502.                 $inscId $insc->getId();
  3503.                 $esp $this->em->getRepository(Resultado::class)->findResultadoEspecial($inscId$jornadaId);   //buscamos si tiene resultado especial para no incluirlo
  3504.                 if (!$esp) {
  3505.                     $jugadores[$insc->getId()] = $insc->getJugador()->getNombre();
  3506.                     $hoyoAnt 0;
  3507.                     $acumulado 0;
  3508.                     $resultados $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId'inscrito' => $insc->getId()], ['hoyo' => 'ASC']);
  3509.                     foreach ($resultados as $resultado) {
  3510.                         //Si nos falta un hoyo (Stableford), lo añadimos a mano
  3511.                         for ($e $hoyoAnt 1$e $resultado->getHoyo(); $e++) {
  3512.                             $acumulado += 2;    //Si levanta bola (no existe el hoyo, stableford [pero solo desde programa]) el contrapar es +2 siempre (en ese hoyo)
  3513.                             $contrapares[$insc->getId()][] = $acumulado;
  3514.                         }
  3515.                         $acumulado += $resultado->{"getContrapar" ucfirst($calculo)}();
  3516.                         $contrapares[$insc->getId()][] = $acumulado;
  3517.                         $hoyoAnt $resultado->getHoyo();
  3518.                     }
  3519.                 }
  3520.             }
  3521.         } else {
  3522.             foreach ($jugadoresHorario as $jh) {
  3523.                 $equipo $jh->getEquipo();
  3524.                 $pareja $jh->getPareja();
  3525.                 $esp $this->em->getRepository(Resultado::class)->findResultadoEspecialEquipoPareja($equipo$pareja$jornadaId);
  3526.                 if (!$esp) {
  3527.                     $jugadores[$equipo "-" $pareja] = "";
  3528.                     $inscritos $this->em->getRepository(Inscrito::class)->findBy(['equipo' => $equipo'pareja' => $pareja'competicion' => $jornada->getCompeticion()->getId()]);
  3529.                     foreach ($inscritos as $inscrito) {
  3530.                         $jugadores[$equipo "-" $pareja] .= $inscrito->getjugador()->getNombre() . " - ";
  3531.                     }
  3532.                     $jugadores[$equipo "-" $pareja] = substr($jugadores[$equipo "-" $pareja], 0strlen($jugadores[$equipo "-" $pareja]) - 3);
  3533.                     $acumulado 0;
  3534.                     $resultados $this->em->getRepository(Resultado::class)->findBy(['equipo' => $equipo'pareja' => $pareja'jornada' => $jornada->getId()], ['hoyo' => 'ASC']);
  3535.                     foreach ($resultados as $resultado) {
  3536.                         $acumulado += $resultado->{"getContrapar" ucfirst($calculo)}();
  3537.                         $contrapares[$equipo "-" $pareja][] = $acumulado;
  3538.                     }
  3539.                 }
  3540.             }
  3541.         }
  3542.         return new JsonResponse(["contrapares" => $contrapares"jugadores" => $jugadores]);
  3543.     }
  3544. }