src/Controller/Frontend/TournamentController.php line 3113

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Controller\Frontend\Livescoring\LivescoringView;
  4. use App\Controller\Frontend\Inscription\NewCoupleInscription;
  5. use App\Controller\Frontend\Inscription\NewIndividualInscription;
  6. use App\Controller\Frontend\Inscription\NewTeamInscription;
  7. use App\Controller\Frontend\Tournament\Service\AddPlayerRGPDPrivacy;
  8. use App\Controller\Frontend\Tournament\Service\SendInscriptionNotificationByChannels;
  9. use App\Controller\Frontend\Tournament\TournamentView;
  10. use App\Controller\Gestion\GestionHorarioController;
  11. use App\Controller\Shared\Inscribed\IncludeInscribedOnWaitingList;
  12. use App\Controller\Shared\Inscribed\ObtainFirstInscribedOnWaitingList;
  13. use App\Controller\Shared\Inscribed\UpdateInscribedToIncludeAtWaitingList;
  14. use App\Controller\Shared\Livescoring\LivescoringCache;
  15. use App\Controller\Shared\ObtainDefaultConfigurationCategoryByCompetition;
  16. use App\Controller\Shared\AdditionalCondition\ObtainAdditionalConditionsByCompetition;
  17. use App\Controller\Shared\Player\UpdatePlayerFromFederated;
  18. use App\DBAL\Backend\EnumEstadoCompeticion;
  19. use App\DBAL\Backend\EnumEstadoInscrito;
  20. use App\DBAL\Backend\EnumEstadoPedido;
  21. use App\DBAL\Backend\EnumEstadoRestringirLicencias;
  22. use App\DBAL\Backend\EnumLivescoringFormula;
  23. use App\DBAL\General\EnumAdditionalCondition;
  24. use App\Entity\Backend\CompetitionSectionHidden;
  25. use App\Service\Competition\PreferredLicenseClubChecker;
  26. use App\Shared\Domain\ProjectEnvironment;
  27. use App\Util\UtilCache;
  28. use App\Web\Player\Domain\Properties\PlayerLicense;
  29. use Doctrine\ORM\EntityManagerInterface;
  30. use Symfony\Component\HttpFoundation\RedirectResponse;
  31. use Symfony\Component\Routing\Annotation\Route;
  32. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  33. use Symfony\Component\HttpFoundation\Request;
  34. use Symfony\Component\HttpFoundation\Response;
  35. use Symfony\Component\HttpFoundation\JsonResponse;
  36. use Symfony\Component\HttpKernel\KernelInterface;
  37. use Symfony\Component\Asset\Packages;
  38. use Twig\Environment;
  39. use App\Form\Frontend\InscripcionType;
  40. use App\Form\Frontend\InscripcionParejaType;
  41. use App\Form\Frontend\InscripcionEquipoType;
  42. use App\Entity\Backend\AdditionalConditionInscribed;
  43. use App\Entity\Backend\Inscrito;
  44. use App\Entity\Backend\InscritoDocumento;
  45. use App\Entity\Backend\Log;
  46. use App\Entity\Backend\HcpJuego;
  47. use App\Entity\Backend\Equipo;
  48. use App\Util\Util;
  49. use App\Util\UtilJugadores;
  50. use App\Entity\Backend\Pedido;
  51. use App\Entity\Backend\Jugador;
  52. use App\Entity\Backend\AdicionalesInscrito;
  53. use App\Entity\Backend\AutorizadasCircuito;
  54. use App\Entity\Backend\Categoria;
  55. use App\Entity\Backend\CategoriaConfig;
  56. use App\Entity\Backend\Clasificacion;
  57. use App\Entity\Backend\Clasificado;
  58. use App\Entity\Backend\Cliente;
  59. use App\Entity\Backend\Club;
  60. use App\Entity\Backend\Competicion;
  61. use App\Entity\Backend\CompeticionesExcluyentes;
  62. use App\Entity\Backend\ConfigurationClub;
  63. use App\Entity\Backend\Especial;
  64. use App\Entity\Backend\Estadisticas;
  65. use App\Entity\Backend\Horario;
  66. use App\Entity\Backend\Hoyo;
  67. use App\Entity\Backend\InscritoMarcador;
  68. use App\Entity\Backend\Jornada;
  69. use App\Entity\Backend\JornadaConfig;
  70. use App\Entity\Backend\JugadorRGPD;
  71. use App\Entity\Backend\Meteo;
  72. use App\Entity\Backend\Pais;
  73. use App\Entity\Backend\PublicacionPrograma;
  74. use App\Entity\Backend\Resultado;
  75. use App\Entity\Backend\SoftwareGolf;
  76. use App\Entity\Backend\Tarifa;
  77. use App\Entity\Backend\TrazadoBarra;
  78. use App\Entity\Backend\Voucher;
  79. use App\Entity\Gestion\JugadorHorario;
  80. use App\Entity\Gestion\PartidaHorario;
  81. use App\Entity\Gestion\Ranking;
  82. use App\Entity\Gestion\SinAsignarHorario;
  83. use App\Entity\User\User;
  84. use App\Entity\User\UserApp;
  85. use App\Service\CompetitionRegistration\CompetitionRegistrationResponseManager;
  86. use App\Service\EnvioCorreo;
  87. use App\Service\EnvioSms;
  88. use App\Service\FederatedWebService;
  89. use App\Service\NotificacionesService;
  90. use App\Util\SoftwareExternoUtil;
  91. use App\Util\UtilResultados;
  92. use Doctrine\Persistence\ManagerRegistry;
  93. use Psr\Log\LoggerInterface;
  94. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  95. /**
  96.  * Tournament controller.
  97.  *
  98.  * @Route("/tour")
  99.  */
  100. class TournamentController extends AbstractController
  101. {
  102.     public function __construct(
  103.         private readonly EntityManagerInterface    $em,
  104.         private readonly Util                      $util,
  105.         private readonly UpdatePlayerFromFederated $updatePlayerFromFederated,
  106.         private readonly PreferredLicenseClubChecker $preferredLicenseClubChecker,
  107.         private readonly ObtainAdditionalConditionsByCompetition $obtainAdditionalConditionsByCompetition
  108.     )
  109.     {
  110.     }
  111.     /**
  112.      * F-031 Visualización de un resumen de competicion (iframe)
  113.      *
  114.      * @Route("-widget/{id}", name="_tour_widget", options={"expose"=true})
  115.      */
  116.     public function tourWidgetAction($id)
  117.     {
  118.         $competicion $this->em->getRepository(Competicion::class)->findBy(['id' => $id'visible' => 1]);
  119.         if (!$competicion) {
  120.             //$this->addFlash('error', "No existe la competición");
  121.             return $this->render('frontend/Competicion/widget.html.twig');
  122.         }
  123.         $numInscritos count($this->em->getRepository(Inscrito::class)->getInscritosActivos($id));
  124.         $climas = [];
  125.         $jornadas $competicion[0]->getJornadas();
  126.         foreach ($jornadas as $jornada) {
  127.             $unserial unserialize($jornada->getClima());      //Devuelve "false" o el deserializado
  128.             if ($unserial) {
  129.                 $climas[$jornada->getOrden()] = $unserial;
  130.             }
  131.         }
  132.         return $this->render('frontend/Competicion/widget.html.twig', [
  133.             'competicion' => $competicion[0],
  134.             'climas' => $climas,
  135.             'numInscritos' => $numInscritos
  136.         ]);
  137.     }
  138.     /**
  139.      * F-032 Muestra la clasificacion de un torneo
  140.      *
  141.      * @Route("/clasificados", name="_ajClasificados", options={"expose"=true})
  142.      */
  143.     public function ajaxGetClasificados(Request $request)
  144.     {
  145.         $params = array();
  146.         $competicion $request->get("id");
  147.         $competi $this->em->getRepository(Competicion::class)->findOneById($competicion);
  148.         $isAjax $request->isXMLHttpRequest();
  149.         if ($isAjax && $competi) {
  150.             if (($competi->getFicheroClasificaciones() == null) || ($competi->getFicheroClasificaciones() == '')) {
  151.                 $totalesbyJornada = array();
  152.                 $equiposJornadas = array();
  153.                 $especial = array();
  154.                 $totales = array();
  155.                 switch ($competi->getJugadores()) {
  156.                     case 1:
  157.                         $njornadas $this->em->getRepository(Clasificado::class)->getJornadasByClasificacion($competicion);
  158.                         $entity $this->em->getRepository(Clasificado::class)->getDataByJornada($competicion$competi->getCalculo()->getId());
  159.                         $view 'frontend/Club/clasificados_new.html.twig';
  160.                         break;
  161.                     case 2:
  162.                         $njornadas $this->em->getRepository(Clasificado::class)->getJornadasByClasificacionCouple($competicion);
  163.                         $entity $this->em->getRepository(Clasificado::class)->getDataByJornadaCouple($competicion$competi->getCalculo()->getId(), falsefalse);
  164.                         foreach ($entity as $e) {
  165.                             $equiposJornadas[$e['idc']][] = $e['jornada'];
  166.                             $totales[$e['idc']] = $this->em->getRepository(Clasificado::class)->getTotalesParejas($e['idc']);
  167.                         }
  168.                         $view 'frontend/Club/clasificadosParejas_new.html.twig';
  169.                         break;
  170.                     default:
  171.                         $njornadas_aux $this->em->getRepository(Clasificado::class)->getJornadasByClasificacionCouple($competiciontrue);
  172.                         //esto lo hacemos solamente aqui, ya que solo se modifica la clasificacion de equipos, pero seria interesante hacerlo en los otros tipos, para optimizar
  173.                         $njornadas = array();
  174.                         foreach ($njornadas_aux as $nja) {
  175.                             $njornadas[$nja['id']] = $nja['contador'];
  176.                         }
  177.                         $entity $this->em->getRepository(Clasificado::class)->getDataByJornadaCouple($competicion$competi->getCalculo()->getId(), truefalse);
  178.                         foreach ($entity as $e) {
  179.                             $totalesbyJornada[$e['idc']][$e['equipo']][$e['jornada']] = array('neto' => $e['neto'], 'bruto' => $e['bruto']);
  180.                             $totalesbyJornada[$e['idc']]['calculo'] = $e['calculo'];
  181.                             $totalesbyJornada[$e['idc']]['clasificacion'] = $e['clasificacion'];
  182.                             $totalesbyJornada[$e['idc']][$e['equipo']]['posicion'] = $e['posicion'];
  183.                             $totalesbyJornada[$e['idc']][$e['equipo']]['nombre_equipo'] = $e['nombre_equipo'];
  184.                             //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)
  185.                             //$equiposJornadas[$e['idc']][] = $e['jornada'];
  186.                             $equiposJornadas[$e['equipo']][$e['id']]['nombre'] = $e['nombre'];
  187.                             $equiposJornadas[$e['equipo']][$e['id']]['apellidos'] = $e['apellidos'];
  188.                             $equiposJornadas[$e['equipo']][$e['id']]['pais'] = $e['pais'];
  189.                             $equiposJornadas[$e['equipo']][$e['id']]['idPais'] = $e['idPais'];
  190.                             $equiposJornadas[$e['equipo']][$e['id']]['licencia'] = $e['licencia'];
  191.                             $equiposJornadas[$e['equipo']][$e['id']]['hcp'] = $e['hcp'];
  192.                             $equiposJornadas[$e['equipo']][$e['id']]['id'] = $e['id'];
  193.                             if ($e['especial'] != null) {
  194.                                 $nombreEspecial $this->em->getRepository(Especial::class)->findOneById($e['especial']);
  195.                                 $especial[$e['idc']][$e['jornada']][$e['equipo']] = $nombreEspecial->getNombre();
  196.                             }
  197.                         }
  198.                         $view 'frontend/Club/clasificadosEquipos_new.html.twig';
  199.                         break;
  200.                 }
  201.                 $nClasif count($this->em->getRepository(Clasificacion::class)->findByCompeticion($competicion));
  202.                 $params['entities'] = $entity;
  203.                 $params['numClasif'] = $nClasif;
  204.                 $params['njornadas'] = $njornadas;
  205.                 $params['totalesbyJor'] = $totalesbyJornada;
  206.                 $params['eqJornadas'] = $equiposJornadas;
  207.                 $params['especial'] = $especial;
  208.                 $params['competi'] = $competi;
  209.                 $params['totales'] = $totales;
  210.                 if ($nClasif 0) {
  211.                     return $this->render($view$params);
  212.                 } else {
  213.                     $response = new JsonResponse();
  214.                     return $response->setData('No data');
  215.                 }
  216.                 //return new JsonResponse(array('datos' => 'this is a json response '.$competicion));
  217.             } else {
  218.                 $view 'frontend/Club/clasificados_new.html.twig';
  219.                 return $this->render($view, array(
  220.                     /*
  221.                       'entities' => $entity,
  222.                       'numClasif' => $nClasif,
  223.                       'njornadas' => $njornadas,
  224.                       'totalesbyJor' => $totalesbyJornada,
  225.                       'eqJornadas' => $equiposJornadas,
  226.                       'especial' => $especial,
  227.                       'totales' => $totales,
  228.                      */
  229.                     'competi' => $competi
  230.                 ));
  231.             }
  232.         }
  233.         return new Response('This is not ajax!'400);
  234.     }
  235.     /**
  236.      * F-039 Mostrar inscritos. [ NO SE USA ]
  237.      *
  238.      * @Route("/complayers", name="_ajInscritos", options={"expose"=true})
  239.      *
  240.      */
  241.     public function ajaxGetCompPlayers(Request $request)
  242.     {
  243.         $competicion $request->request->get("id");
  244.         $isAjax $request->isXMLHttpRequest();
  245.         if ($isAjax) {
  246.             $comp $this->em->getRepository(Competicion::class)->find($competicion);
  247.             if (($comp->getFicheroInscritos() == null) || ($comp->getFicheroInscritos() == '')) {
  248.                 $num_jugadores $comp->getJugadores();
  249.                 if ($num_jugadores == 1) {
  250.                     $players $this->em->getRepository(Inscrito::class)->getPlayersByCompeticion($competicion);
  251.                     $view "frontend/Inscritos/inscritos_tbl_new.html.twig";
  252.                 } else {
  253.                     $players $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($comp);
  254.                     if ($num_jugadores == 2) {
  255.                         $view "frontend/Inscritos/inscritos_tbl_parejas_new.html.twig";
  256.                     } else {
  257.                         $view "frontend/Inscritos/inscritos_tbl_equipos_new.html.twig";
  258.                     }
  259.                 }
  260.                 $list = array();
  261.                 foreach ($players as $i) {
  262.                     if (!in_array($i->getJugador()->getSexo(), $listtrue)) {
  263.                         array_push($list$i->getJugador()->getSexo());
  264.                     }
  265.                 }
  266.                 if (!$players) {
  267.                     $response = new JsonResponse();
  268.                     return $response->setData('No data');
  269.                 } else {
  270.                     return $this->render($view, array(
  271.                         'inscritos' => $players,
  272.                         'competi' => $comp,
  273.                         'sexos' => count($list)
  274.                     ));
  275.                 }
  276.             } else {
  277.                 $view 'frontend/Inscritos/inscritos_tbl.html.twig';
  278.                 return $this->render($view, array(
  279.                     'competi' => $comp
  280.                 ));
  281.             }
  282.         }
  283.         return new Response('This is not ajax!'400);
  284.     }
  285.     /**
  286.      * F-040 Buscamos la categoria que mejor ajusta para un jugador en una competicion
  287.      *
  288.      * Actualmente solo es llamada desde backend:
  289.      * - admin_competicion_inscritos_new
  290.      * - admin_competicion_inscritos_pareja_new
  291.      * Modularizar con UtilInscritos F-144
  292.      *
  293.      * @Route("/autocomplete-forms/get-categoria-jugador/{idj}/{idc}", name="tour_autocomplete_get_categoria_jugador", options={"expose"=true})
  294.      */
  295.     public function getCategoriaJugador($idj$idcObtainDefaultConfigurationCategoryByCompetition $obtainDefaultConfigurationCategoryByCompetition)
  296.     {
  297.         $player $this->em->getRepository(Jugador::class)->find($idj);
  298.         $competition $this->em->getRepository(Competicion::class)->find($idc);
  299.         $configurationCategoryChoose $obtainDefaultConfigurationCategoryByCompetition->__invoke($player$competition);
  300.         $id_categoria $configurationCategoryChoose?->getCategoria()->getId() ?? 0;
  301.         return new JsonResponse($id_categoria);
  302.     }
  303.     /**
  304.      * F-041 Obtenencion el handicap y el sexo de un jugador
  305.      *
  306.      * @Route("/autocomplete-forms/get-hcp-jugador/{licencia}/{club}", name="tour_autocomplete_get_hcp_jugador", options={"expose"=true})
  307.      */
  308.     public function getHcpJugador($licencia$clubFederatedWebService $rfeg)
  309.     {
  310.         $l $licencia;
  311.         $federatedCode substr($l4);
  312.         //Si no es un numero o n oes licencia profesional (acaba en "-P") salimos
  313.         if (!(is_numeric($federatedCode) || substr($federatedCode, -2) === "-P")) {
  314.             return new JsonResponse(array('hcp' => 'ND''sexo' => 's'));
  315.         }
  316.         $jugador $this->em->getRepository(Jugador::class)->findByLicenciaCortaNoTemporal($federatedCode);
  317.         //Aqui solo entra cuando no encuentra a nadie coincidente en nuestra BD
  318.         if (!$jugador) {
  319.             $clubEntity $this->em->getRepository(Club::class)->find($club);
  320.             $cliente $clubEntity->getCliente();
  321.             $organizador $this->em->getRepository(Club::class)->find($cliente->getNombreCorto());
  322.             $rfeg->init($organizador);
  323.             //$jugadores = $rfeg->searchByCode(array('federationCode' => $lic));
  324.             $dataForRequest = ['federatedCodes' => ['federatedCode' => $federatedCode]];
  325.             $jugadores $rfeg->listByCode2020($dataForRequest);
  326.             if (isset($jugadores->federateds->federated)) {
  327.                 $jugador = new Jugador(__METHOD__);
  328.                 $dataFromFederated $jugadores->federateds->federated;
  329.                 $saceDataRequest $rfeg->getSACEData($dataForRequest);
  330.                 $saceData $saceDataRequest->federateds->federated ?? null;
  331.                 $this->updatePlayerFromFederated->__invoke($dataFromFederated$saceData$jugador);
  332.             }
  333.             if (is_array($jugadores) && array_key_exists('federateds'$jugadores)) {
  334.                 $federados $jugadores->federateds;
  335.                 if (array_key_exists('federated'$federados)) {
  336.                     foreach ($federados as $federado) {
  337.                     }
  338.                     $jugador $this->em->getRepository(Jugador::class)->findOneBy(array('habilitado' => 1'licencia' => $jugador->getLicencia()));
  339.                 } else {
  340.                     $jugador null;
  341.                 }
  342.             } else {
  343.                 $jugador null;
  344.             }
  345.         }
  346.         if ($jugador) {
  347.             return new JsonResponse(array('hcp' => $jugador->getHcp(), 'sexo' => substr($jugador->getSexo(), 01)));
  348.         } else {
  349.             return new JsonResponse(array('hcp' => 'ND''sexo' => 's'));
  350.         }
  351.     }
  352.     /**
  353.      * F-042 Obtenencion de valores de slope y campo de un trazado
  354.      *
  355.      * @Route("/autocomplete-forms/get-trazadobarra-valores", name="tour_autocomplete_get_tb_valores", options={"expose"=true})
  356.      */
  357.     public function getTrazadobarraValores(Request $request)
  358.     {
  359.         $valores = array();
  360.         $contrarios = array("femenino" => "masculino""masculino" => "femenino");
  361.         $barra $request->query->get('barra');
  362.         $trazado $request->query->get('trazado');
  363.         $tipo_hoyos $request->query->get('hoyos');
  364.         $trazadosbarras $this->em->getRepository(TrazadoBarra::class)->findBy(array('barra' => $barra'trazado' => $trazado'activo' => 1));
  365.         $sexoAnt "";
  366.         foreach ($trazadosbarras as $tb) {
  367.             $sexo $tb->getSexo();
  368.             switch ($tipo_hoyos) {
  369.                 case 1:
  370.                     $valores[$tb->getSexo()]['slope'] = $tb->getSlope19();
  371.                     $valores[$tb->getSexo()]['campo'] = $tb->getCampo19();
  372.                     break;
  373.                 case 2:
  374.                     $valores[$tb->getSexo()]['slope'] = $tb->getSlope1018();
  375.                     $valores[$tb->getSexo()]['campo'] = $tb->getCampo1018();
  376.                     break;
  377.                 case 3:
  378.                     $valores[$tb->getSexo()]['slope'] = $tb->getSlope();
  379.                     $valores[$tb->getSexo()]['campo'] = $tb->getCampo();
  380.                     break;
  381.             }
  382.             $sexoAnt $sexo;
  383.         }
  384.         if (count($trazadosbarras) < 2) {
  385.             $valores[$contrarios[$sexoAnt]]['slope'] = 0;
  386.             $valores[$contrarios[$sexoAnt]]['campo'] = 0;
  387.         }
  388.         return new JsonResponse($valores);
  389.     }
  390.     /**
  391.      * F-043 Obtencion de todas las barras de un trazado
  392.      *
  393.      * @Route("/autocomplete-forms/get-barras-trazado", name="tour_autocomplete_get_barras_trazado", options={"expose"=true})
  394.      */
  395.     public function getBarraTrazado(Request $request)
  396.     {
  397.         $trazado $request->query->get('trazado');
  398.         $barras $this->em->getRepository(TrazadoBarra::class)->findBarrasTrazados($trazado);
  399.         return new JsonResponse($barras);
  400.     }
  401.     /**
  402.      * F-044 Guarda la configuracion de RGPD del jugador
  403.      *
  404.      * @Route("/autocomplete-forms/actualizar-rgpd", name="tour_autocomplete_update_rgpd", options={"expose"=true})
  405.      */
  406.     public function updateRgpd(Request $requestUtilJugadores $util_jugadores)
  407.     {
  408.         $datos $request->request->get("form");
  409.         if (empty($datos["id"])) {
  410.             return new JsonResponse(["codigo" => -1]);
  411.         }
  412.         $jugador $this->em->getRepository(Jugador::class)->find($datos["id"]);
  413.         if (!$jugador) {
  414.             return new JsonResponse(["codigo" => -1]);
  415.         }
  416.         $organizador "";
  417.         $privacidad $jugador->getPrivacidadSimple();
  418.         //Si es una competicion, marcamos solo la RGPD asociada a dicho organizador, sino marcamos todas
  419.         if ($datos['organizador'] != "0") {
  420.             $organizador $datos["organizador"];
  421.             //Arreglo 28/04/2023
  422.             //$privacidades = ["AM00", "LV05", "CM00"]; //21/03 AQUI HAY QUE AÑADIR MAS POSIBLES PRIVACIDADES <--
  423.             //Si es nulo o falso, lo actualizamos
  424.             if ((!isset($privacidad[$organizador]) || !$privacidad[$organizador])) {
  425.                 $new false;
  426.                 if (isset($privacidad[$organizador])) {
  427.                     $jugadorRGPD $this->em->getRepository(JugadorRGPD::class)->findOneBy(['jugador' => $jugador'aceptacion' => $organizador]);
  428.                 } else {
  429.                     //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
  430.                     //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
  431.                     $club $this->em->getRepository(Club::class)->find($organizador);
  432.                     $cliente $club->getCliente();     //$this->em->getRepository(Cliente::class)->findOneBy(['nombreCorto' => $organizador]);
  433.                     if ($cliente) {
  434.                         $jugadorRGPD = new JugadorRGPD();
  435.                         $jugadorRGPD->setCliente($cliente);
  436.                         $jugadorRGPD->setAceptacion($organizador);
  437.                         $jugadorRGPD->setJugador($jugador);
  438.                         $new true;
  439.                     } else {
  440.                         //Este caso no se va a dar, pero debe de estar controlado
  441.                         return new JsonResponse(["codigo" => 0]);
  442.                     }
  443.                 }
  444.                 $jugadorRGPD->setRgpdExtra($request->headers->get("user-agent"));
  445.                 $jugadorRGPD->setRgpdIP($request->getClientIp());
  446.                 $jugadorRGPD->setRgpd(true);
  447.                 if ($new) {
  448.                     $this->em->persist($jugadorRGPD);
  449.                 }
  450.                 if (!empty($datos["email"])) {
  451.                     $jugador $util_jugadores->setDatoPlanoDesdeJugador($jugador"EmailCod"$datos["email"], false);
  452.                     // $jugador->setEmailCod($datos["email"], $secret);
  453.                     // //$jugador->setEmail($datos["email"]);
  454.                     $jugadorRGPD->setNewsletters(!empty($datos["newsletters"]) || intval($datos["newsletters"]));
  455.                 }
  456.                 $this->em->flush();
  457.             }
  458.         } else {    //Si es desde el area de usuario, aceptamos todas las RGPD que tengamos de federaciones
  459.             $privacidades $this->em->getRepository(Cliente::class)->findFederaciones();
  460.             foreach ($privacidades as $p) {
  461.                 $new false;
  462.                 $jugadorRGPD $this->em->getRepository(JugadorRGPD::class)->findOneBy(['jugador' => $jugador'aceptacion' => $p]);
  463.                 if (!$jugadorRGPD) {
  464.                     $jugadorRGPD = new JugadorRGPD();
  465.                     $jugadorRGPD->setCliente($p);
  466.                     $jugadorRGPD->setAceptacion($p->getNombreCorto());
  467.                     $jugadorRGPD->setJugador($jugador);
  468.                     $new true;
  469.                 }
  470.                 $jugadorRGPD->setRgpdExtra($request->headers->get("user-agent"));
  471.                 $jugadorRGPD->setRgpdIP($request->getClientIp());
  472.                 $jugadorRGPD->setRgpd(true);
  473.                 if ($new) {
  474.                     $this->em->persist($jugadorRGPD);
  475.                 }
  476.                 if (!empty($datos["email"])) {
  477.                     $jugador $util_jugadores->setDatoPlanoDesdeJugador($jugador"EmailCod"$datos["email"], false);
  478.                     // $jugador->setEmailCod($datos["email"], $secret);
  479.                     // //$jugador->setEmail($datos["email"]);
  480.                     $jugadorRGPD->setNewsletters(!empty($datos["newsletters"]) || intval($datos["newsletters"]));
  481.                 }
  482.                 $this->em->flush();
  483.             }
  484.         }
  485.         return new JsonResponse(["codigo" => intval($datos["rgpd"])]);
  486.     }
  487.     /**
  488.      * F-045 Obtenemos la informacion detallada de un trazadobarra
  489.      *
  490.      * @Route("/autocomplete-forms/get-datos-trazado", name="tour_autocomplete_get_datos_trazado", options={"expose"=true})
  491.      */
  492.     public function getDatosTrazado(Request $request)
  493.     {
  494.         $trazado $request->query->get('trazado');
  495.         $barra $request->query->get('barra');
  496.         $sexoAnt "";
  497.         $datos = array();
  498.         $contrarios = array("f" => "m""m" => "f");
  499.         $trazadosbarras $this->em->getRepository(TrazadoBarra::class)->findBy(array('trazado' => $trazado'barra' => $barra'activo' => 1));
  500.         foreach ($trazadosbarras as $tb) {
  501.             $sexo substr($tb->getSexo(), 01);
  502.             $hoyos $this->em->getRepository(Hoyo::class)->findBy(array('trazadoBarra' => $tb->getId()));
  503.             $datos[$sexo] = array();
  504.             $datos[$sexo]['metros'] = array();
  505.             $datos[$sexo]['par'] = array();
  506.             $datos[$sexo]['hcp'] = array();
  507.             if ($hoyos) {
  508.                 foreach ($hoyos as $hoyo) {
  509.                     $datos[$sexo]['hoyo'][] = ($hoyo->getAlias()) ? ($hoyo->getAlias()) : ($hoyo->getNumero());
  510.                     $datos[$sexo]['metros'][] = $hoyo->getMetros();
  511.                     $datos[$sexo]['par'][] = $hoyo->getPar();
  512.                     $datos[$sexo]['hcp'][] = $hoyo->getHcp();
  513.                 }
  514.             } else {
  515.                 $datos[$sexo] = $datos[$sexoAnt];
  516.             }
  517.             $sexoAnt $sexo;
  518.         }
  519.         if (count($trazadosbarras) < 2) {
  520.             $datos[$contrarios[$sexoAnt]] = -1;
  521.         }
  522.         return new JsonResponse($datos);
  523.     }
  524.     /**
  525.      * F-046 Se muestra el punto del guardado para la tarjeta-foto
  526.      *
  527.      * @Route("/foto/{token}", name="frontend_tarjeta_foto", options={"expose"=true})
  528.      *
  529.      */
  530.     public function tarjetaFoto($tokenRequest $requestAuthorizationCheckerInterface $authorizationChecker)
  531.     {
  532.         $secret $this->getParameter('secret');
  533.         $long $this->getParameter('next.longitud.hash');
  534.         $params = [];
  535.         $environment $this->getParameter('kernel.environment');
  536.         if ($environment == "dev") {
  537.             $id $token;
  538.         } else {
  539.             $id $this->util->desencriptarLargo($token$secret$long);
  540.         }
  541.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  542.         if (!$competicion) {
  543.             $this->addFlash(
  544.                 'error'"No existe la competicion");
  545.             return $this->redirect($this->generateUrl('provincias'));
  546.         }
  547.         if ($competicion->getModo()->getId() != && !$authorizationChecker->isGranted('ROLE_ADMIN')) {
  548.             $now = new \DateTime('now');
  549.             $jornada $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id'fecha' => $now));
  550.         } else {
  551.             $jornadas $competicion->getJornadas();
  552.             $jornada $jornadas[0];
  553.         }
  554.         if (!$jornada) {
  555.             $this->addFlash(
  556.                 'error'"No hay jornada para el dia de hoy en esta competición");
  557.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competicion->getId())));
  558.         }
  559.         $ordenacion = ["i.participa" => "DESC""j.apellidos" => "ASC""j.nombre" => "ASC"];
  560.         $inscritos $this->em->getRepository(Inscrito::class)->getInscritosJugadorActivos($id$ordenacion0, [01]); //getInscritosActivos($id);
  561.         //esto coge los jugadore SIN tarjeta rellena o sin marcador asignado (segun corresponda)
  562.         //$inscritos = $this->em->getRepository(Inscrito::class)->getInscritosSinTarjetaFoto($id, "inscrito", $jornada);
  563.         //$marcadores = $this->em->getRepository(Inscrito::class)->getInscritosSinTarjetaFoto($id, "marcador", $jornada);
  564.         if ($jornada->getModalidad()->getId() != "I") {
  565.             $parejas = [];
  566.             foreach ($inscritos as $ins) {
  567.                 $index $ins->getEquipo() . "-" $ins->getPareja();
  568.                 if (!isset($parejas[$index])) {
  569.                     $parejas[$index] = array();
  570.                 }
  571.                 $parejas[$index][] = $ins;
  572.             }
  573.             $params['parejas'] = $parejas;
  574.         }
  575.         //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
  576.         $params['inscritos'] = $inscritos;
  577.         $params['marcadores'] = $inscritos;
  578.         $params['jornada'] = $jornada;
  579.         $params['competicion'] = $competicion;
  580.         $insc null;
  581.         $inscToken $request->query->get('i'null);   //esto es una licencia tokenizada
  582.         if (!empty($inscToken)) {
  583.             if ($environment == "dev") {
  584.                 $insc $inscToken;
  585.             } else {
  586.                 $insc $this->util->desencriptarLargo($inscToken$secret$long);
  587.             }
  588.             if ($insc) {
  589.                 //buscamos el inscrito a partir de la licencia y la competicion
  590.                 $inscrt $this->em->getRepository(Inscrito::class)->findJugadorInscritoLicencia($insc$id);  //siempre el primer inscrito del equipo!!
  591.                 if (!empty($inscrt)) {
  592.                     if ($jornada->getModalidad()->getId() != "I") {
  593.                         $params['inscrt'] = $parejas[$inscrt->getEquipo() . "-" $inscrt->getPareja()][0];  //siempre el primer inscrito del equipo!!
  594.                     } else {
  595.                         $params['inscrt'] = $inscrt;
  596.                     }
  597.                 }   //no hay else, dejamos $params['inscrt'] sin definir
  598.                 // //TEMPORAL: Redirigimos a la tarjeta virtual los QRs de las etiquetas para competiciones especificas, para pruebas
  599.                 // $parametro = $this->em->getRepository(Parametro::class)->findOneBy(["tipo" => "ecard", "parametro" => "competiciones"]);
  600.                 // if (in_array($id, explode(",", $parametro->getValor()))) {
  601.                 //     $tokenTVInsc = $this->util->encriptarLargo($jornada->getOrden() . "-" . $params['inscrt']->getId(), $secret, $long);    //tomamos $params['inscrt'] por asegurarnos
  602.                 //     return $this->redirect($this->generateUrl('tarjeta_virtual', ["token" => $tokenTVInsc]));
  603.                 // }
  604.                 if ($competicion->getTarjetaElectronica()) {
  605.                     $tokenTVInsc $this->util->encriptarLargo($jornada->getOrden() . "-" $params['inscrt']->getId(), $secret$long);    //tomamos $params['inscrt'] por asegurarnos
  606.                     return $this->redirect($this->generateUrl('tarjeta_virtual', ["token" => $tokenTVInsc]));
  607.                 }
  608.             }
  609.         }
  610.         $marc null;
  611.         $marcToken $request->query->get('m'null);
  612.         if (!empty($marcToken)) {
  613.             if ($environment == "dev") {
  614.                 $marc $marcToken;
  615.             } else {
  616.                 $marc $this->util->desencriptarLargo($marcToken$secret$long);
  617.             }
  618.         } else {
  619.             $marc false;
  620.             $inscrito_marcador $this->em->getRepository(InscritoMarcador::class)->findOneBy(["inscrito" => $inscrt"jornada" => $jornada]);
  621.             if ($inscrito_marcador) {
  622.                 $marc $inscrito_marcador->getMarcador()->getJugador()->getLicencia();
  623.             }
  624.         }
  625.         if ($marc) {
  626.             $marcador $this->em->getRepository(Inscrito::class)->findJugadorInscritoLicencia($marc$id);  //siempre el primer inscrito del equipo!!
  627.             if ($jornada->getModalidad()->getId() != "I") {
  628.                 $params['mrcdr'] = $parejas[$marcador->getEquipo() . "-" $marcador->getPareja()][0];  //siempre el primer inscrito del equipo!!
  629.             } else {
  630.                 $params['mrcdr'] = $marcador;
  631.             }
  632.         }   //no hay else, dejamos $params['mrcdr'] sin definir
  633.         return $this->render("frontend/Competicion/tarjetaFoto.html.twig"$params);
  634.     }
  635.     /**
  636.      * F-047 Muestra un formulario para crear una nueva entidad de Inscrito
  637.      *
  638.      * @Route("/{id}/inscripcion", name="competicion_inscritos_new", methods={"GET"})
  639.      */
  640.     public function newInscribed($idRequest $requestNewIndividualInscription $newIndividualInscription): Response
  641.     {
  642.         return $newIndividualInscription->__invoke((int) $id$request);
  643.     }
  644.     /**
  645.      * F-048 Muestra un formulario para crear una nueva pareja de Inscritos
  646.      *
  647.      * @Route("/{id}/inscripcion/pareja", name="competicion_inscritos_pareja_new", methods={"GET"})
  648.      */
  649.     public function newInscribedCouple($idRequest $requestNewCoupleInscription $newCoupleInscription): Response
  650.     {
  651.         return $newCoupleInscription->__invoke((int) $id$request);
  652.     }
  653.     /**
  654.      * F-084 Muestra el formulario de inscripciones de equipos
  655.      *
  656.      * @Route("/{id}/inscripcion/equipo", name="competicion_inscritos_equipo_new", methods={"GET"})
  657.      */
  658.     public function newInscribedTeam($idRequest $requestNewTeamInscription $newTeamInscription): Response
  659.     {
  660.         return $newTeamInscription->__invoke((int) $id$request);
  661.     }
  662.     /**
  663.      * @Route("/{id}/inscripcion/formulario-adicional-estado", name="competicion_registration_form_status", methods={"GET"})
  664.      */
  665.     public function registrationFormStatus($idRequest $request): JsonResponse
  666.     {
  667.         $competition $this->em->getRepository(Competicion::class)->find($id);
  668.         if (!$competition || null === $competition->getRegistrationForm() || !$this->canCompetitionUseCustomRegistrationForms($competition)) {
  669.             return new JsonResponse([
  670.                 'hasRegistrationForm' => false,
  671.                 'resolved' => false,
  672.                 'requiresResponse' => false,
  673.             ]);
  674.         }
  675.         $license trim((string) $request->query->get('license'''));
  676.         if ('' === $license) {
  677.             $playerId = (int) $request->query->get('playerId'0);
  678.             if ($playerId 0) {
  679.                 $player $this->em->getRepository(Jugador::class)->find($playerId);
  680.                 $license $player instanceof Jugador ? (string) $player->getLicencia() : '';
  681.             }
  682.         }
  683.         if ('' === $license) {
  684.             return new JsonResponse([
  685.                 'hasRegistrationForm' => true,
  686.                 'resolved' => false,
  687.                 'requiresResponse' => false,
  688.             ]);
  689.         }
  690.         return new JsonResponse([
  691.             'hasRegistrationForm' => true,
  692.             'resolved' => true,
  693.             'requiresResponse' => true,
  694.         ]);
  695.     }
  696.     /**
  697.      * F-049 Guardado de un inscrito individual
  698.      *
  699.      * @Route("/{id}/guardar-inscrito", name="competicion_guardainscrito")
  700.      */
  701.     public function saveInscribed($idRequest $requestEnvioCorreo $mailerNotificacionesService $notificatorEnvioSms $messagingLoggerInterface $swgolfLoggerSoftwareExternoUtil $swutilUtilJugadores $util_jugadoresAddPlayerRGPDPrivacy $addPlayerRGPDPrivacyUpdateInscribedToIncludeAtWaitingList $updateInscribedToIncludeAtWaitingListSendInscriptionNotificationByChannels $sendInscriptionNotificationByChannelsCompetitionRegistrationResponseManager $competitionRegistrationResponseManager)
  702.     {
  703.         $competition $this->em->getRepository(Competicion::class)->find($id);
  704.         if (!$competition) {
  705.             $this->addFlash(
  706.                 'error'"El torneo buscado no existe");
  707.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  708.         }
  709.         $additionalCompetitionConditions $this->obtainAdditionalConditionsByCompetition->__invoke($competition);
  710.         $competitionIsCalendarMode $competition->getModo()->getId() === 1;
  711.         $competitionIsOfflineMode $competition->getModo()->getId() === 2;
  712.         $incorrectCompetitionMode $competitionIsCalendarMode || $competitionIsOfflineMode;
  713.         $competitionStatusIsNotOpen $competition->getEstado() != EnumEstadoCompeticion::ABIERTA;
  714.         if ($incorrectCompetitionMode && $competitionStatusIsNotOpen) {
  715.             $this->addFlash('error'"No es posible inscribirse online en esta competición o el plazo ha finalizado. Consulte con su Club");
  716.             return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  717.         }
  718.         $dateNow = new \DateTime('now');
  719.         if (($competition->getInicio() != NULL) && ($competition->getFin() != NULL)) {
  720.             $inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U')) || ($dateNow->format('U') > $competition->getFin()->format('U'));
  721.             if ($inscriptionPeriodClosed) {
  722.                 $this->addFlash('error'"El plazo para la inscripción online está cerrado. Consulte con su Club");
  723.                 return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  724.             }
  725.         }
  726.         $competitionIsNotIndividual $competition->getJugadores() != 1;
  727.         if ($competitionIsNotIndividual) {
  728.             $this->addFlash('error'"Solo es posible la inscripción individual");
  729.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  730.         }
  731.         $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  732.         $noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
  733.         if ($noSlotsAvailable) {
  734.             $totalInscribedWithWaitStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($idfalse, ['espera']);
  735.             $errorMessage "No hay plazas disponibles en este momento.";
  736.             if ($totalInscribedWithWaitStatus 0) {
  737.                 $errorMessage .= " Hay $totalInscribedWithWaitStatus pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
  738.             }
  739.             $this->addFlash('error'$errorMessage);
  740.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  741.         }
  742.         $waitingListWithSlots $competition->getListaEspera() && $competition->getPlazasListaEspera() > 0;
  743.         if ($waitingListWithSlots) {
  744.             $totalSlotsWaitingList $this->em->getRepository(Inscrito::class)->getCountInscritosListaEspera($competition);
  745.             $waitingListFull $totalSlotsWaitingList >= $competition->getPlazasListaEspera();
  746.             if ($waitingListFull) {
  747.                 $this->addFlash('error'"La lista de espera esta completa en este momento");
  748.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  749.             }
  750.         }
  751.         $slotsAvailableMorning 0;
  752.         $slotsAvailableEvening 0;
  753.         $slotsMorning $competition->getPlazasManana();
  754.         $slotsEvening $competition->getPlazasTarde();
  755.         if ($slotsMorning || $slotsEvening 0) {
  756.             $slotsAvailableMorning $slotsMorning $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idtrue);
  757.             $slotsAvailableEvening $slotsEvening $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idfalse);
  758.         }
  759.         $playerId $request->request->get('inscripcion_jugador')['id'];
  760.         if (empty($playerId)) {
  761.             $this->addFlash('error'"No se ha seleccionado un jugador");
  762.             return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  763.         }
  764.         $player $this->em->getRepository(Jugador::class)->find($playerId);
  765.         if (!$player) {
  766.             $this->addFlash('error'"No se ha seleccionado un jugador");
  767.             return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  768.         }
  769.         $form $this->createForm(InscripcionType::class, null, array(
  770.             'attr' => array('id' => "insc" $id'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition'dispManana' => $slotsAvailableMorning'dispTarde' => $slotsAvailableEvening),
  771.             'method' => 'POST'
  772.         ));
  773.         $form->handleRequest($request);
  774.         $secret $this->getParameter('secret');
  775.         if ($form->isSubmitted() && $form->isValid()) {
  776.             $emptyEmailOrId = empty($form->get('email')->getData()) || empty($form->get('id')->getData());
  777.             if ($emptyEmailOrId) {
  778.                 $this->addFlash('error'"Ni el jugador ni el email pueden ser vacíos");
  779.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  780.             }
  781.             try {
  782.                 $registrationFormResponse $competitionRegistrationResponseManager->extractSubmittedResponse(
  783.                     $competition,
  784.                     $request,
  785.                     'registration_form_response_1'
  786.                 );
  787.             } catch (\InvalidArgumentException $exception) {
  788.                 $this->addFlash('error'$exception->getMessage());
  789.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  790.             }
  791.             $categoryId 0;
  792.             $existTeeFromForm $form->has('barra') && !empty($form->get('barra')->getData());
  793.             $existCategoryFromForm $form->has('categoria') && !empty($form->get('categoria')->getData());
  794.             if ($existTeeFromForm) {
  795.                 $categoryId $form->get('barra')->getData(); //No es la barra, es el ID de categoria de la barra que ha selecionado el jugador
  796.             } elseif ($existCategoryFromForm) {
  797.                 $categoryId $form->get('categoria')->getData(); //ID de categoria del jugador
  798.             }
  799.             $category $this->em->getRepository(Categoria::class)->find($categoryId);
  800.             if (!$category) {
  801.                 $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");
  802.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  803.             }
  804.             $rateFromForm $form->get('tarifa')->getData();
  805.             if (!$rateFromForm) {
  806.                 $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");
  807.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  808.             }
  809.             $shiftForm 'mañana';  //por defecto
  810.             if ($form->has('turno')) {  //si viene turno tomamos su valor
  811.                 $shiftForm $form->get('turno')->getData();
  812.                 if (!empty($shiftForm)) {
  813.                     if ($shiftForm == 'mañana') {
  814.                         $slotsShift $competition->getPlazasManana();
  815.                     } else {
  816.                         $slotsShift $competition->getPlazasTarde();
  817.                     }
  818.                     $slotsAvailable $slotsShift $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shiftForm == 'mañana'));
  819.                     if ($slotsAvailable 1) {
  820.                         $this->addFlash('error'"No se ha podido completar la inscripción porque el turno seleccionado está lleno");
  821.                         return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  822.                     }
  823.                 } else {
  824.                     $shiftForm 'mañana';  //por defecto
  825.                 }
  826.             }
  827.             $activeInscribedCount = (int) $this->em->getRepository(Inscrito::class)->getCountInscribedByCorrectStatusAndParticipate($competition);
  828.             $reservedInscribedCount = (int) $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  829.             $isWaitingList $competition->getListaEspera() && (($activeInscribedCount 1) > $competition->getPlazas());
  830.             if (!$competition->getListaEspera() && (($reservedInscribedCount 1) > $competition->getPlazas())) {
  831.                 $totalInscribedWithWaitStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($idfalse, ['espera']);
  832.                 $errorMessage "No hay plazas disponibles en este momento.";
  833.                 if ($totalInscribedWithWaitStatus 0) {
  834.                     $errorMessage .= " Hay $totalInscribedWithWaitStatus pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
  835.                 }
  836.                 $this->addFlash('error'$errorMessage);
  837.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  838.             }
  839.             if ($isWaitingList && $competition->getPlazasListaEspera() > 0) {
  840.                 $totalSlotsWaitingList = (int) $this->em->getRepository(Inscrito::class)->getCountInscritosListaEspera($competition);
  841.                 if (($totalSlotsWaitingList 1) > $competition->getPlazasListaEspera()) {
  842.                     $this->addFlash('error'"La lista de espera esta completa en este momento");
  843.                     return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  844.                 }
  845.             }
  846.             if ($form->has('turno') && !empty($shiftForm)) {
  847.                 $slotsShift = ($shiftForm == 'mañana') ? $competition->getPlazasManana() : $competition->getPlazasTarde();
  848.                 $slotsAvailableShift $slotsShift $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shiftForm == 'mañana'));
  849.                 if ($slotsAvailableShift 1) {
  850.                     $this->addFlash('error'"No se ha podido completar la inscripción porque el turno seleccionado está lleno");
  851.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  852.                 }
  853.             }
  854.             $inscribed = new Inscrito();
  855.             $emailForm $form->get('email')->getData();
  856.             $phoneForm = (!$form->has('telefono_jugador')) ? null $form->get('telefono_jugador')->getData();
  857.             if (!empty($phoneForm)) {
  858.                 // Obtener el prefijo del teléfono
  859.                 $tlfnPrefix $request->request->get("inscripcion_jugador")["tlfnPrefix"] ?? "0034";
  860.                 $fullPhone $tlfnPrefix $phoneForm;
  861.                 $competitionClient $competition->getOrganizador()->getCliente();
  862.                 $playerPhone $util_jugadores->getDatoPlanoDesdeJugador($player"Telefono"$competitionClient);
  863.                 if (empty($playerPhone)) {
  864.                     $logMessage "Cambio de teléfono del Jugador " $player->getNombreCompleto() . " (" $player->getLicencia() . ") en el método " __METHOD__ ", de " . ($playerPhone ?: "(vacio)") . " a " $fullPhone;
  865.                     $player $util_jugadores->setDatoPlanoDesdeJugador($player"Telefono"$fullPhonefalse$competitionClient);
  866.                     $log = new Log('i'$logMessagenull);
  867.                     $this->em->persist($log);
  868.                 }
  869.             }
  870.             $observationsForm $this->util->limpiar($form->get('observaciones')->getData(), false);
  871.             $addPlayerRGPDPrivacy->__invoke($competition$player$request);
  872.             $playerHasPlayAnyCompetition $competition->getNumCompeticiones() != 0;
  873.             $incorrectNumberOfCompetitionsForConditions $player->getNumCompeticiones() < $competition->getNumCompeticiones();
  874.             $incorrectStatusHcp = ($player->getEstadoHcp()) != 10 && ($player->getEstadoHcp() != 99);
  875.             $playerIsNotActive = !$player->getActivo();
  876.             $playerNotComplyWithCompetitionsConditions = ($playerHasPlayAnyCompetition && $incorrectNumberOfCompetitionsForConditions) || ($incorrectStatusHcp) || $playerIsNotActive;
  877.             if ($playerNotComplyWithCompetitionsConditions) {
  878.                 $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") no cumple las condiciones de inscripción");
  879.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  880.             }
  881.             $orderNumber $this->em->getRepository(Pedido::class)->findLastPedido($competition->getId());
  882.             if (!is_null($orderNumber)) {
  883.                 $orderNumber substr($orderNumber['numero'], 102);
  884.                 $orderNumber++;
  885.             } else {
  886.                 $orderNumber 'AA';
  887.             }
  888.             //Inicializamos el pedido, pero no lo guardamos todavia, hace falta el inscrito
  889.             $inscribedOrder = new Pedido();
  890.             $inscribedOrder->setEmail($emailForm);
  891.             $inscribedOrder->setEmailCod($emailForm$secret);
  892.             $inscribedOrder->setConcepto("ionline");
  893.             $amount 0;
  894.             $applyRate true;
  895.             $letter "F";
  896.             $autorizedLicenseToCircuit $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $player->getLicenciaCorta());
  897.             //Comprobamos si esta licencia pertenece a las licencias permitidas que no pagan, pero deben de ir por el flujo normal de inscripcion {NEX-1754}
  898.             if (count($autorizedLicenseToCircuit) > 0) {
  899.                 $applyRate false;
  900.                 $letter "V";
  901.             }
  902.             $inscribedOrder->setNumero($competition->getId() . $letter $competition->getOrganizador()->getId() . $orderNumber);
  903.             $rate $this->em->getRepository(Tarifa::class)->find($rateFromForm);
  904.             if ($applyRate) {
  905.                 $amount $rate->getImporte();
  906.             }
  907.             if ($form->has('voucher')) {
  908.                 $voucherCodeForm strtoupper($form['voucher']->getData());
  909.                 if (!empty($voucherCodeForm)) {
  910.                     $voucher $this->em->getRepository(Voucher::class)->findOneBy(['codigo' => $voucherCodeForm]);
  911.                     if (empty($voucher)) {
  912.                         $this->addFlash('error''No existe ningún voucher con este código');
  913.                         return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  914.                     } else {
  915.                         $validVoucher false;
  916.                         $now = new \DateTime('now');
  917.                         $validDate = ($voucher->getFechaInicio()->format('U') <= $now->format('U')) && ($now->format('U') <= $voucher->getFechaFin()->format('U'));
  918.                         if (!$validDate) {
  919.                             $this->addFlash('error''Ha expirado la fecha de validez del voucher');
  920.                             return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  921.                         }
  922.                         if (count($voucher->getCompeticiones()) == 0) {
  923.                             $validVoucher true;
  924.                         } else {
  925.                             foreach ($voucher->getCompeticiones() as $voucherCompetition) {
  926.                                 if ($voucherCompetition->getId() == $id) {
  927.                                     $validVoucher true;
  928.                                 }
  929.                             }
  930.                         }
  931.                         if ($validVoucher) {
  932.                             $voucherAmount $voucher->getCantidad();
  933.                             switch ($voucher->getTipo()) {
  934.                                 //Fijo
  935.                                 case 1:
  936.                                     $amount -= $voucherAmount;
  937.                                     break;
  938.                                 //Porcentual
  939.                                 case 2:
  940.                                     $voucherAmount $voucherAmount 100;
  941.                                     $amount $amount - ($amount $voucherAmount);
  942.                             }
  943.                             $amount max($amount0);
  944.                             $inscribedOrder->setVoucher($voucher);
  945.                         } else {
  946.                             $this->addFlash('error''Este voucher no es válido para esta competición');
  947.                             return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  948.                         }
  949.                     }
  950.                 }
  951.             }
  952.             $inscribedOrder->setImporte($amount);
  953.             $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)
  954.             $inscribedOrder->setTarifa2(null);
  955.             if (== $amount) {
  956.                 $inscribedOrder->setEstado(EnumEstadoPedido::PAGADO);
  957.             } else {
  958.                 $inscribedOrder->setEstado(EnumEstadoPedido::ESPERA);
  959.             }
  960.             $exclusionsList = array();
  961.             $exclusionsCompetitions $this->em->getRepository(CompeticionesExcluyentes::class)->findByCompeticion($id);
  962.             foreach ($exclusionsCompetitions as $exclusionCompetition) {
  963.                 $exclusionsList[] = $exclusionCompetition->getAgrupacion()->getId();
  964.             }
  965.             //Si no hay ninguna, continuamos
  966.             if (count($exclusionsList) > 0) {
  967.                 //Buscamos si esta inscrito en alguna de las competiciones excluyentes, a partir del grupo.
  968.                 $exclusionCompetitionsByPlayerLicense $this->em->getRepository(CompeticionesExcluyentes::class)->findExcluyentesSimpleLicencia($player->getLicencia(), $exclusionsList$id);
  969.                 if (count($exclusionCompetitionsByPlayerLicense) > 0) {
  970.                     $messageResponse "<ul>";
  971.                     foreach ($exclusionCompetitionsByPlayerLicense as $exc) {
  972.                         $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>, ";
  973.                     }
  974.                     $messageResponse substr($messageResponse0, -1) . "</ul>";
  975.                     $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") está inscrito en alguna competición excluyente de ésta:" $messageResponse);
  976.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  977.                 }
  978.             }
  979.             $checkPlayerId = function ($playerId) {
  980.                 return function ($keyInscrito $inscribed) use ($playerId) {
  981.                     return (($inscribed->getJugador()->getId() == $playerId) && ($inscribed->getEstado() == "pagado"));
  982.                 };
  983.             };
  984.             if ($competition->getInscritos()->exists($checkPlayerId($player->getId()))) {
  985.                 $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") ya está inscrito en la competición");
  986.                 return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  987.             }
  988.             if (str_starts_with($player->getLicencia(), PlayerLicense::FOREING_PREFIX)) {
  989.                 $hcpDocumentForm $form->get('documentoHcp')->getData();
  990.                 if (!is_null($hcpDocumentForm)) {
  991.                     $hcpNameReport md5(rand() . "_" uniqid('infHcp')) . ".pdf";
  992.                     $hcpDocumentForm->move(__DIR__ '/../../../../web/uploads/informesHcp'$hcpNameReport);
  993.                     $documentInscribed = new InscritoDocumento();
  994.                     $documentInscribed->setInscrito($inscribed);
  995.                     $documentInscribed->setDocumento($hcpNameReport);
  996.                     $documentInscribed->setTipo(1);
  997.                     $inscribed->addDocumento($documentInscribed);
  998.                 } else {
  999.                     $this->addFlash('error'"Para jugadores extranjeros es necesario adjuntar el informe de handicap de su federación");
  1000.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1001.                 }
  1002.             }
  1003.             $inscribed->setCompeticion($competition);
  1004.             $inscribed->setJugador($player);
  1005.             $inscribed->setCategoria($category);
  1006.             $inscribed->setCategoriaCondicion($category->getCategoriaCondicion());
  1007.             $maximumTeamNumber $this->em->getRepository(Inscrito::class)->findMaxEquipoInscrito($competition->getId());
  1008.             $maximumTeamId = (!empty($maximumTeamNumber)) ? ($maximumTeamNumber 1) : 1;
  1009.             $maximumTeamId = (substr($competition->getOrganizador()->getId(), 0, -2) != "AM") ? $maximumTeamId;
  1010.             //Preferente y con la licencia -> Entra directo -> 1
  1011.             //Preferente y con la licencia, pero no hay sitio -> Entra directo a waiting list -> -1
  1012.             //No preferente, directamente entra en la lista de espera -> -1
  1013.             $participateValue $isWaitingList ? -1;
  1014.             if ($competition->getListaEspera() && $competition->getRestringirLicencia() === EnumEstadoRestringirLicencias::PREFERENCIA) {
  1015.                 $belongsToPreferredClub $this->preferredLicenseClubChecker->belongsToPreferredClub($player->getLicencia(), $competition);
  1016.                 if (!$belongsToPreferredClub) {
  1017.                     $participateValue = -1;
  1018.                 }
  1019.             }
  1020.             $inscribed->setEquipo($maximumTeamId);
  1021.             $inscribed->setPareja('0');
  1022.             $inscribed->setParticipa($participateValue);
  1023.             $inscribed->setOrderWaitingList(0);
  1024.             $inscribed->setNivel($player->getNivel());
  1025.             $inscribed->setTipoInscripcion("frontend");
  1026.             $inscribed->setNombreEquipo("");
  1027.             $inscribed->setEstado($inscribedOrder->getEstado());
  1028.             $inscribed->setObservaciones($observationsForm);
  1029.             $inscribed->setValido(true);
  1030.             $inscribed->setTarifa($rate);
  1031.             $inscribed->setTurno($shiftForm);
  1032.             $inscribed->setHcp($player->getHcp());
  1033.             $inscribed->setSace($player->getSace());
  1034.             $inscribed->setSacePp($player->getSacePp());
  1035.             $this->em->persist($inscribed);
  1036.             if (is_array($registrationFormResponse)) {
  1037.                 $competitionRegistrationResponseManager->saveResponse($inscribed$registrationFormResponse);
  1038.             }
  1039.             $this->em->flush();
  1040.             $inscribedData = [];
  1041.             $inscribedData[0]['licenses'][] = $inscribed->getJugador()->getLicencia();
  1042.             $inscribedData[0]['ids'][] = $inscribed->getId();
  1043.             //terminamos de montar y guardamos el Pedido
  1044.             $breakdownOrder "";
  1045.             if ($competition->getOrganizador() != null) {
  1046.                 $breakdownOrder $competition->getOrganizador()->getId() . "-";
  1047.             }
  1048.             $breakdownOrder .= $competition->getNombre() . ".<br />";
  1049.             $breakdownOrder .= $inscribed->getJugador()->getLicencia() . " - ";
  1050.             $breakdownOrder .= $inscribed->getCategoria()->getNombre() . ". ";
  1051.             $inscribedOrder->setDesglose($breakdownOrder);
  1052.             $this->em->persist($inscribedOrder);
  1053.             //guardamos en inscrito su Pedido asociado despues de guardar éste
  1054.             $inscribed->setPedido($inscribedOrder);
  1055.             $additionalDataByCompetition $competition->getAdicionales();
  1056.             if ($additionalDataByCompetition) {
  1057.                 $dataForm $request->request->all();
  1058.                 foreach ($additionalDataByCompetition as $additionalData) {
  1059.                     if (isset($dataForm["adicional" $additionalData->getId()])) {
  1060.                         $additionalInscribed = new AdicionalesInscrito();
  1061.                         $additionalInscribed->setValor($dataForm["adicional" $additionalData->getId()]);
  1062.                         $additionalInscribed->setInscrito($inscribed);
  1063.                         $additionalInscribed->setDato($additionalData);
  1064.                         $this->em->persist($additionalInscribed);
  1065.                     } else {
  1066.                         //si tipo "privacidad", lo guardo aunque sea no
  1067.                         if ("Privacidad" == $additionalData->getTipo()) {
  1068.                             $additionalInscribed = new AdicionalesInscrito();
  1069.                             $additionalInscribed->setValor("off");
  1070.                             $additionalInscribed->setInscrito($inscribed);
  1071.                             $additionalInscribed->setDato($additionalData);
  1072.                             $this->em->persist($additionalInscribed);
  1073.                         }
  1074.                     }
  1075.                 }
  1076.             }
  1077.             if (!empty($additionalCompetitionConditions)) {
  1078.                 foreach ($additionalCompetitionConditions as $additionalCompetitionCondition) {
  1079.                     $additionalConditionInscribed = new AdditionalConditionInscribed();
  1080.                     $additionalConditionInscribed->setAdditionalCondition($additionalCompetitionCondition);
  1081.                     $additionalConditionInscribed->setInscribed($inscribed);
  1082.                     $additionalConditionInscribed->setAccepted($request->request->has('additionalCondition' $additionalCompetitionCondition->getId()));
  1083.                     $this->em->persist($additionalConditionInscribed);
  1084.                 }
  1085.             }
  1086.             //Aprovechamos esta llamada para guardar en la BD el pedido, la actualización del inscrito y los datos adicionales
  1087.             $this->em->flush();
  1088.             if ($competition->getRestringirLicencia() === EnumEstadoRestringirLicencias::PREFERENCIA) {
  1089.                 $updateInscribedToIncludeAtWaitingList->__invoke($competition$inscribedData);
  1090.             }
  1091.             // NO SE POR QUE ESTABA ESTO PUESTO
  1092. //            if ($form->get('save')->isClicked()) {
  1093. //
  1094. //            }
  1095.             //$importe = $tar->getImporte();
  1096.             //como ahora puede haber descuento habra que coger el importe del pedido 2022-12-07
  1097.             $amount $inscribedOrder->getImporte();
  1098.             if (($amount == 0) || ($amount == 0.0)) {
  1099.                 $inscribedOrder->setPayedAt(new \DateTime('now'));  //como son de tarifa cero, las marcamos como pagadas, ya que no hay que pagar nada
  1100.                 $this->em->flush();
  1101.                 //Preparación y envio de la notificación
  1102.                 $competitionShortUrl $this->util->getShortUrl($competition);
  1103.                 if ($isWaitingList || $inscribed->getParticipa() == -1) {
  1104.                     $notificationText "Está en lista de espera de " substr($this->util->limpiar($competition->getNombre()), 050) . ". Consulte lista de inscritos en " $competitionShortUrl;
  1105.                 } else {
  1106.                     $notificationText "Se ha inscrito correctamente en " substr($this->util->limpiar($competition->getNombre()), 045) . ". Puede consultar el listado de inscritos en " $competitionShortUrl;
  1107.                 }
  1108.                 $playerPrivacy $inscribed->getJugador()->getPrivacidadSimple();
  1109.                 $rgpd false;
  1110.                 if (str_contains($competition->getOrganizador()->getId(), "AM")) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  1111.                     if (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"]) {
  1112.                         $rgpd true;
  1113.                     }
  1114.                 } else { //buscamos la privacidad del organizador
  1115.                     if ((isset($playerPrivacy[$competition->getOrganizador()->getId()]) && $playerPrivacy[$competition->getOrganizador()->getId()]) || (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"])) {
  1116.                         $rgpd true;
  1117.                     }
  1118.                 }
  1119.                 $competitionClient $competition->getOrganizador()->getCliente();
  1120.                 $phonePlayer $util_jugadores->getDatoPlanoDesdeJugador($inscribed->getJugador(), "Telefono"$competitionClient);
  1121.                 $notificationPhone null;
  1122.                 if ($rgpd && !empty($phonePlayer)) {
  1123.                     $userApp $this->em->getRepository(UserApp::class)->findOneByTelefono($phonePlayer);
  1124.                     $notificationPhone $phonePlayer;
  1125.                     $argumentsToNotify = [];
  1126.                     $argumentsToNotify["title"] = "Nueva inscripción en torneo";
  1127.                     $argumentsToNotify["msg"] = $notificationText;
  1128.                     $argumentsToNotify["url"] = $competitionShortUrl;
  1129.                     $argumentsToNotify["destinatario"] = $userApp;
  1130.                     $argumentsToNotify["tipo"] = "new-inscription";
  1131.                     $argumentsToNotify["competicion"] = $competition->getId();
  1132.                     $notificator->enviarNotificacion($argumentsToNotify);
  1133.                 }
  1134.                 $logMessage "Nueva inscripción online en Competición " $competition->getNombre() . "(" $id "): " $player->getLicencia() . "(" $inscribedOrder->getNumero() . ")";
  1135.                 $log = new Log('i'$logMessagenull);
  1136.                 $this->em->persist($log);
  1137.                 $this->em->flush();
  1138.                 try {
  1139.                     $this->util->guardaCsvInscripciones($inscribed);
  1140.                 } catch (\Throwable $exception) {
  1141.                     //does nothing, continues execution
  1142.                     error_log($exception->getMessage());
  1143.                 }
  1144.                 $emailView 'frontend/Inscritos/emailInscripcion.html.twig';
  1145.                 $emailSubject '⛳ NEXTCADDY - Inscripción online [' $inscribedOrder->getNumero() . ']';
  1146.                 $argumentsToEmail = [
  1147.                     "to" => $emailForm,
  1148.                     "competicion" => $competition,
  1149.                     "subject" => $emailSubject,
  1150.                     "html" => $this->renderView($emailView, array('jugador' => $player,
  1151.                         'competicion' => $competition,
  1152.                         'inscrito' => $inscribed,
  1153.                         'barras' => $this->em->getRepository(JornadaConfig::class)->findByInscrito($inscribed),
  1154.                         'pedido' => $inscribedOrder,
  1155.                         'tarifa' => $rate,
  1156.                         'lista_espera' => $isWaitingList
  1157.                     ))
  1158.                 ];
  1159.                 $sendInscriptionNotificationByChannels->__invoke(
  1160.                     $competition,
  1161.                     $notificationPhone,
  1162.                     $emailForm,
  1163.                     $notificationText,
  1164.                     $emailSubject,
  1165.                     $argumentsToEmail['html']
  1166.                 );
  1167.                 try {
  1168.                     $swbd $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club""cliente" => $competition->getOrganizador()->getCliente()]);
  1169.                     if ($swbd) {
  1170.                         $swutil->init($swbd);
  1171.                         $swutil->addClientToActivity($inscribed$this->emtrue);
  1172.                     }
  1173.                 } catch (\Throwable $exception) {
  1174.                     $swgolfLogger->error("Error en " __FILE__ "\n" $exception->getMessage());
  1175.                 }
  1176.                 return $this->redirect($this->generateUrl('pago_terminado'$this->fromAppRouteParameters($request, array('token' => 'success''id' => $competition->getId(), 'idi' => $inscribed->getId()))));
  1177.             } else {
  1178.                 try {
  1179.                     $this->util->guardaCsvInscripciones($inscribed);
  1180.                 } catch (\Throwable $exception) {
  1181.                     error_log($exception->getMessage());
  1182.                 }
  1183.                 return $this->redirect($this->generateUrl('pago_intermedio'$this->fromAppRouteParameters($request, array('idi' => $inscribed->getId(), 'idp' => $inscribedOrder->getId()))));
  1184.             }
  1185.         } else {
  1186.             $competition $this->em->getRepository(Competicion::class)->find($id);
  1187.             if (!$competition) {
  1188.                 $this->addFlash('error'"El torneo buscado no existe");
  1189.                 return $this->redirect($this->generateUrl('competiciones_abiertas'));
  1190.             }
  1191.             $ratesByCompetition $this->em->getRepository(Tarifa::class)->findByCompeticion($id);
  1192.             $categoriesByCompetition $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  1193.             $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  1194.             //buscamos todas las jornadas, para asi poder poner el ASC aparte del rago de fechas involucrado
  1195.             $roundsByCompetition $this->em->getRepository(Jornada::class)->findBy(array("competicion" => $competition->getId()), array("orden" => "ASC"));
  1196.             $miniature file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
  1197.             $countries $this->em->getRepository(Pais::class)->findAll();
  1198.             return $this->render("frontend/Inscritos/new_new.html.twig", [
  1199.                 'form' => $form->createView(),
  1200.                 'competicion' => $competition,
  1201.                 'competitionRegistrationFormsEnabled' => $this->canCompetitionUseCustomRegistrationForms($competition),
  1202.                 'tarifas' => $ratesByCompetition,
  1203.                 'paises' => $countries,
  1204.                 'jornadas' => $roundsByCompetition,
  1205.                 'categorias' => $categoriesByCompetition,
  1206.                 'num_inscritos' => $totalInscribedWithCorrectStatus,
  1207.                 'additionalCompetitionConditions' => $additionalCompetitionConditions,
  1208.                 'hayMiniatura' => $miniature
  1209.             ]);
  1210.         }
  1211.     }
  1212.     /**
  1213.      * F-050 Guardado de inscritos parejas
  1214.      *
  1215.      * @Route("/{id}/guardar-inscrito-pareja", name="competicion_guardainscrito_pareja")
  1216.      */
  1217.     public function saveInscribedCouple($idRequest $requestEnvioCorreo $mailerNotificacionesService $notificatorEnvioSms $messagingLoggerInterface $loggerSoftwareExternoUtil $swutilUtilJugadores $utilJugadoresUpdateInscribedToIncludeAtWaitingList $updateInscribedToIncludeAtWaitingListAddPlayerRGPDPrivacy $addPlayerRGPDPrivacySendInscriptionNotificationByChannels $sendInscriptionNotificationByChannelsCompetitionRegistrationResponseManager $competitionRegistrationResponseManager)
  1218.     {
  1219.         $competition $this->em->getRepository(Competicion::class)->find($id);
  1220.         if (!$competition) {
  1221.             $this->addFlash(
  1222.                 'error'"El torneo buscado no existe");
  1223.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  1224.         }
  1225.         $additionalCompetitionConditions $this->obtainAdditionalConditionsByCompetition->__invoke($competition);
  1226.         if (($competition->getModo()->getId() < 3) && ($competition->getEstado() != "abierta")) {
  1227.             $this->addFlash('error'"No es posible inscribirse online en esta competición o el plazo ha finalizado. Consulte con su Club");
  1228.             return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  1229.         }
  1230.         if ($competition->getJugadores() != 2) {
  1231.             $this->addFlash('error'"No es posible la inscripción de parejas en este torneo");
  1232.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1233.         }
  1234.         $dateNow = new \DateTime('now');
  1235.         if (!is_null($competition->getInicio()) && !is_null($competition->getFin()) != NULL) {
  1236.             $inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U')) || ($dateNow->format('U') > $competition->getFin()->format('U'));
  1237.             if ($inscriptionPeriodClosed) {
  1238.                 $this->addFlash('error'"El plazo para la inscripción online está cerrado. Consulte con su Club");
  1239.                 return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  1240.             }
  1241.         }
  1242.         $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($competition->getId());
  1243.         $noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
  1244.         if ($noSlotsAvailable) {
  1245.             $totalInscribedWithWaitStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($idfalse, ['espera']);
  1246.             $errorMessage "No hay plazas disponibles en este momento.";
  1247.             if ($totalInscribedWithWaitStatus 0) {
  1248.                 $errorMessage .= " Hay $totalInscribedWithWaitStatus pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
  1249.             }
  1250.             $this->addFlash('error'$errorMessage);
  1251.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1252.         }
  1253.         $slotsAvailableMorning 0;
  1254.         $slotsAvailableEvening 0;
  1255.         $slotsMorning $competition->getPlazasManana();
  1256.         $slotsEvening $competition->getPlazasTarde();
  1257.         if ($slotsMorning || $slotsEvening 0) {    //si tenemos inscripcion por turnos vemos donde hay hueco
  1258.             $slotsAvailableMorning $slotsMorning $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idtrue);
  1259.             $slotsAvailableEvening $slotsEvening $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idfalse);
  1260.         }
  1261.         $form $this->createForm(InscripcionParejaType::class, null, array(
  1262.             'attr' => array(
  1263.                 'id' => "insc" $id,
  1264.                 'org' => $competition->getOrganizador()->getId(),
  1265.                 'competicion' => $competition,
  1266.                 'dispManana' => $slotsAvailableMorning,
  1267.                 'dispTarde' => $slotsAvailableEvening
  1268.             )
  1269.         ));
  1270.         $form->handleRequest($request);
  1271.         if ($form->isSubmitted() && !empty($additionalCompetitionConditions)) {
  1272.             foreach ($additionalCompetitionConditions as $additionalCompetitionCondition) {
  1273.                 $conditionIsRequired $additionalCompetitionCondition->getCondition() === EnumAdditionalCondition::REQUIRED;
  1274.                 $conditionAccepted $request->request->has('additionalCondition' $additionalCompetitionCondition->getId());
  1275.                 if ($conditionIsRequired && !$conditionAccepted) {
  1276.                     $this->addFlash('error'"Debe aceptar todas las condiciones adicionales obligatorias para completar la inscripción");
  1277.                     return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1278.                 }
  1279.             }
  1280.         }
  1281.         $shift 'mañana';
  1282.         if ($form->has('turno')) {
  1283.             $shift $form->get('turno')->getData();
  1284.             if (!empty($shift)) {
  1285.                 if ($shift == 'mañana') {
  1286.                     $slotsShift $competition->getPlazasManana();
  1287.                 } else {
  1288.                     $slotsShift $competition->getPlazasTarde();
  1289.                 }
  1290.                 $slotsAvailable $slotsShift $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shift == 'mañana'));
  1291.                 if ($slotsAvailable 2) {
  1292.                     $this->addFlash('error'"No se ha podido completar la inscripción porque el turno seleccionado está lleno");
  1293.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1294.                 }
  1295.             } else {
  1296.                 $shift 'mañana';
  1297.             }
  1298.         }
  1299.         if (empty($form->get('id1')->getData()) || empty($form->get('id2')->getData())) {
  1300.             $this->addFlash('error'"Ninguno de los jugadores puede ser vacío para una competición de parejas");
  1301.             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1302.         }
  1303.         if ($form->get('id1')->getData() == $form->get('id2')->getData()) {
  1304.             $this->addFlash('error'"Los jugadores tienen que ser distintos");
  1305.             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1306.         }
  1307.         $registrationFormResponses = [];
  1308.         foreach ([12] as $playerCounter) {
  1309.             try {
  1310.                 $registrationFormResponses[$playerCounter] = $competitionRegistrationResponseManager->extractSubmittedResponse(
  1311.                     $competition,
  1312.                     $request,
  1313.                     'registration_form_response_' $playerCounter
  1314.                 );
  1315.             } catch (\InvalidArgumentException $exception) {
  1316.                 $this->addFlash('error'$exception->getMessage());
  1317.                 return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
  1318.             }
  1319.         }
  1320.         $ratePlayerOne $form->get('tarifa1')->getData();
  1321.         $ratePlayerTwo $form->get('tarifa2')->getData();
  1322.         if (!$ratePlayerOne || !$ratePlayerTwo) {
  1323.             $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");
  1324.             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1325.         }
  1326.         if ($form->get('email')->getData() == '') {
  1327.             $this->addFlash('error'"El email no puede ser vacío");
  1328.             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1329.         }
  1330.         if ($competition->getListaEspera() && $competition->getPlazasListaEspera() > 0) {
  1331.             $totalSlotsWaitingList $this->em->getRepository(Inscrito::class)->getCountInscritosListaEspera($competition);
  1332.             $waitingListFull $totalSlotsWaitingList >= $competition->getPlazasListaEspera();
  1333.             if ($waitingListFull) {
  1334.                 $this->addFlash('error'"La lista de espera esta completa en este momento");
  1335.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1336.             }
  1337.         }
  1338.         $secret $this->getParameter('secret');
  1339.         if ($form->isSubmitted() && $form->isValid()) {
  1340.             $hasScrambleOrProam boolval($this->em->getRepository(Competicion::class)->hasJornadaScrambleOrProAM($id));
  1341.             $requiredSlots 2;
  1342.             $activeInscribedCount = (int) $this->em->getRepository(Inscrito::class)->getCountInscribedByCorrectStatusAndParticipate($competition);
  1343.             $reservedInscribedCount = (int) $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  1344.             $waitingList $competition->getListaEspera() && (($activeInscribedCount $requiredSlots) > $competition->getPlazas());
  1345.             if (!$competition->getListaEspera() && (($reservedInscribedCount $requiredSlots) > $competition->getPlazas())) {
  1346.                 $totalInscribedWithWaitStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($idfalse, ['espera']);
  1347.                 $errorMessage "No hay plazas disponibles en este momento.";
  1348.                 if ($totalInscribedWithWaitStatus 0) {
  1349.                     $errorMessage .= " Hay $totalInscribedWithWaitStatus pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
  1350.                 }
  1351.                 $this->addFlash('error'$errorMessage);
  1352.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1353.             }
  1354.             if ($waitingList && $competition->getPlazasListaEspera() > 0) {
  1355.                 $totalSlotsWaitingList = (int) $this->em->getRepository(Inscrito::class)->getCountInscritosListaEspera($competition);
  1356.                 if (($totalSlotsWaitingList $requiredSlots) > $competition->getPlazasListaEspera()) {
  1357.                     $this->addFlash('error'"La lista de espera esta completa en este momento");
  1358.                     return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1359.                 }
  1360.             }
  1361.             if ($form->has('turno') && !empty($shift)) {
  1362.                 $slotsShift = ($shift == 'mañana') ? $competition->getPlazasManana() : $competition->getPlazasTarde();
  1363.                 $slotsAvailable $slotsShift $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shift == 'mañana'));
  1364.                 if ($slotsAvailable $requiredSlots) {
  1365.                     $this->addFlash('error'"No se ha podido completar la inscripción porque el turno seleccionado está lleno");
  1366.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1367.                 }
  1368.             }
  1369.             $inscribedOrder = new Pedido();
  1370.             $playerList = [];
  1371.             $rateList = [];
  1372.             $maximumTeamNumber 0;
  1373.             if ($hasScrambleOrProam) {
  1374.                 $maximumCoupleNumber 1;
  1375.             } else {
  1376.                 $maximumCoupleNumber 0;
  1377.             }
  1378.             $inscribedList = [];
  1379.             $softwareGolfEntity $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club""cliente" => $competition->getOrganizador()->getCliente()]);
  1380.             if ($softwareGolfEntity) {
  1381.                 $swutil->init($softwareGolfEntity);
  1382.             }
  1383.             $organiserClient $competition->getOrganizador()->getCliente();
  1384.             for ($counter 1$counter <= 2$counter++) {
  1385.                 $playerIdForm $form->get('id' $counter)->getData();
  1386.                 $licenseForm $form->get('licencia' $counter)->getData();
  1387.                 //buscamos los objetos a partir del ID
  1388.                 $player $this->em->getRepository(Jugador::class)->find($playerIdForm);
  1389.                 if (!$player) {
  1390.                     $player = new Jugador(__METHOD__);
  1391.                 } else {
  1392.                     //Arreglo para evitar las mayusculas
  1393.                     $player->setNombre($player->getNombre());
  1394.                     $player->setApellidos($player->getApellidos());
  1395.                 }
  1396.                 $phonePlayerForm = (!$form->has('telefono_jugador' $counter)) ? null $form->get('telefono_jugador' $counter)->getData();
  1397.                 if (!empty($phonePlayerForm)) {
  1398.                     // Obtener el prefijo del teléfono
  1399.                     $tlfnPrefix $request->request->get("inscripcion_equipo")["tlfnPrefix" $counter] ?? "0034";
  1400.                     $fullPhone $tlfnPrefix $phonePlayerForm;
  1401.                     $phonePlayer $utilJugadores->getDatoPlanoDesdeJugador($player"Telefono"$organiserClient);  //
  1402.                     if (empty($phonePlayer)) {
  1403.                         $logMessage "Cambio de teléfono del Jugador " $player->getNombreCompleto() . " (" $player->getLicencia() . ") en el método " __METHOD__ ", de " . ($phonePlayer ?: "(vacio)") . " a " $fullPhone;
  1404.                         $player $utilJugadores->setDatoPlanoDesdeJugador($player"Telefono"$fullPhonefalse$organiserClient);
  1405.                         $log = new Log('i'$logMessagenull);
  1406.                         $this->em->persist($log);
  1407.                     }
  1408.                 }
  1409.                 $addPlayerRGPDPrivacy->__invoke($competition$player$request);
  1410.                 $playerHasPlayAnyCompetition $competition->getNumCompeticiones() != 0;
  1411.                 $incorrectNumberOfCompetitionsForConditions $player->getNumCompeticiones() < $competition->getNumCompeticiones();
  1412.                 $incorrectStatusHcp = ($player->getEstadoHcp()) != 10 && ($player->getEstadoHcp() != 99);
  1413.                 $playerIsNotActive = !$player->getActivo();
  1414.                 $playerNotComplyWithCompetitionsConditions = ($playerHasPlayAnyCompetition && $incorrectNumberOfCompetitionsForConditions) || ($incorrectStatusHcp) || $playerIsNotActive;
  1415.                 if ($playerNotComplyWithCompetitionsConditions) {
  1416.                     $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") no cumple las condiciones de inscripción");
  1417.                     return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1418.                 }
  1419.                 //Buscamos si esta competicion pertenece a algun listado de excluyentes
  1420.                 $exclusionCompetitionsList = [];
  1421.                 $exclusionCompetitions $this->em->getRepository(CompeticionesExcluyentes::class)->findByCompeticion($id);
  1422.                 foreach ($exclusionCompetitions as $exclusionCompetition) {
  1423.                     $exclusionCompetitionsList[] = $exclusionCompetition->getAgrupacion()->getId();
  1424.                 }
  1425.                 if (count($exclusionCompetitionsList) > 0) {
  1426.                     $exclusionCompetitionsByPlayerLicense $this->em->getRepository(CompeticionesExcluyentes::class)->findExcluyentesSimpleLicencia($player->getLicencia(), $exclusionCompetitionsList$id);
  1427.                     if (count($exclusionCompetitionsByPlayerLicense) > 0) {
  1428.                         $responseMessage "<ul>";
  1429.                         foreach ($exclusionCompetitionsByPlayerLicense as $exclusionCompetition) {
  1430.                             $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>, ";
  1431.                         }
  1432.                         $responseMessage substr($responseMessage0, -1) . "</ul>";
  1433.                         $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") está inscrito en alguna competición excluyente de ésta:" $responseMessage);
  1434.                         return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1435.                     }
  1436.                 }
  1437.                 $checkPlayerId = function ($playerId) {
  1438.                     return function ($keyInscrito $inscrito) use ($playerId) {
  1439.                         return (($inscrito->getJugador()->getId() == $playerId) && ($inscrito->getEstado() == EnumEstadoInscrito::PAGADO));
  1440.                     };
  1441.                 };
  1442.                 if ($competition->getInscritos()->exists($checkPlayerId($player->getId()))) {
  1443.                     $this->addFlash('error'"El jugador " $player->getNombre() . " " $player->getApellidos() . " (" $player->getLicencia() . ") ya está inscrito en la competición");
  1444.                     return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1445.                 }
  1446.             }
  1447.             $validVoucher false;
  1448.             if ($form->has('voucher')) {
  1449.                 $voucherCode $form['voucher']->getData();
  1450.                 if (!empty($voucherCode)) {
  1451.                     $voucher $this->em->getRepository(Voucher::class)->findOneBy(['codigo' => $voucherCode]);
  1452.                     if (empty($voucher)) {
  1453.                         $this->addFlash('error''No existe ningún voucher con este código');
  1454.                         return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
  1455.                     } else {
  1456.                         $now = new \DateTime('now');
  1457.                         $validDate = ($voucher->getFechaInicio()->format('U') <= $now->format('U')) && ($now->format('U') <= $voucher->getFechaFin()->format('U'));
  1458.                         if (!$validDate) {
  1459.                             $this->addFlash('error''Ha expirado la fecha de validez del voucher');
  1460.                             return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  1461.                         }
  1462.                         if (count($voucher->getCompeticiones()) == 0) {
  1463.                             $validVoucher true;
  1464.                         } else {
  1465.                             foreach ($voucher->getCompeticiones() as $comp) {
  1466.                                 if ($comp->getId() == $id) {
  1467.                                     $validVoucher true;
  1468.                                 }
  1469.                             }
  1470.                         }
  1471.                         if (!$validVoucher) {
  1472.                             $this->addFlash('error''Este voucher no es válido para esta competición');
  1473.                             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
  1474.                         }
  1475.                     }
  1476.                 }
  1477.             }
  1478.             $teamName "";
  1479.             $inscribedData = [];
  1480.             for ($counter 1$counter <= 2$counter++) {
  1481.                 $inscribed = new Inscrito();
  1482.                 $categoryIdForm $form->get('categoria' $counter)->getData();
  1483.                 $existTeeFromForm $form->has('barra' $counter) && !empty($form->get('barra' $counter)->getData());
  1484.                 if ($existTeeFromForm) {
  1485.                     $categoryIdForm $form->get('barra' $counter)->getData(); //No es la barra, es el ID de categoria de la barra que ha selecionado el jugador
  1486.                 }
  1487.                 $playerIdForm $form->get('id' $counter)->getData();
  1488.                 $licenseForm $form->get('licencia' $counter)->getData();
  1489.                 $rateForm $form->get('tarifa' $counter)->getData();
  1490.                 $emailForm $form->get('email')->getData();
  1491.                 $observationsForm $this->util->limpiar($form->get('observaciones')->getData(), false);
  1492.                 $player $this->em->getRepository(Jugador::class)->find($playerIdForm);
  1493.                 $category $this->em->getRepository(Categoria::class)->find($categoryIdForm);
  1494.                 if (!$category) {
  1495.                     $this->addFlash('error'"Ha ocurrido un error asignando la categoría al jugador " $counter ". Por favor, inténtelo de nuevo");
  1496.                     return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1497.                 }
  1498.                 if (str_starts_with($player->getLicencia(), PlayerLicense::FOREING_PREFIX)) {
  1499.                     $uploadedFile $form->get('documentoHcp' $counter)->getData();
  1500.                     if (!is_null($uploadedFile)) {
  1501.                         $hcpNameReport md5(rand() . "_" uniqid('infHcp')) . ".pdf";
  1502.                         $uploadedFile->move(__DIR__ '/../../../../web/uploads/informesHcp'$hcpNameReport);
  1503.                         $inscribedDocument = new InscritoDocumento();
  1504.                         $inscribedDocument->setInscrito($inscribed);
  1505.                         $inscribedDocument->setDocumento($hcpNameReport);
  1506.                         $inscribedDocument->setTipo(1);
  1507.                         $inscribed->addDocumento($inscribedDocument);
  1508.                     } else {
  1509.                         $this->addFlash('error'"Para jugadores extranjeros es necesario adjuntar el informe de handicap de su federación");
  1510.                         return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
  1511.                     }
  1512.                 }
  1513.                 if ($counter == 1) {
  1514.                     $orderNumber $this->em->getRepository(Pedido::class)->findLastPedido($competition->getId());
  1515.                     if (!is_null($orderNumber)) {
  1516.                         $orderNumber substr($orderNumber['numero'], 102);
  1517.                         $orderNumber++;
  1518.                     } else {
  1519.                         $orderNumber 'AA';
  1520.                     }
  1521.                     $inscribedOrder->setEmail($emailForm);
  1522.                     $inscribedOrder->setEmailCod($emailForm$secret);
  1523.                     $inscribedOrder->setConcepto("ionline");
  1524.                     $inscribedOrder->setNumero($orderNumber);
  1525.                     $amount 0;
  1526.                     $applyRate true;
  1527.                     $letter "F";
  1528.                     $authorised $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $player->getLicenciaCorta());
  1529.                     if (count($authorised) > 0) {
  1530.                         $applyRate false;
  1531.                         $letter "V";
  1532.                     }
  1533.                     $rate $this->em->getRepository(Tarifa::class)->find($rateForm);
  1534.                     if ($applyRate) {
  1535.                         $amount $rate->getImporte();
  1536.                     }
  1537.                     $inscribedOrder->setImporte($amount);
  1538.                     $inscribedOrder->setTarifa(($applyRate) ? $rate null);
  1539.                     $inscribedOrder->setEstado($amount == "pagado" "espera");
  1540.                 } else {
  1541.                     $amount 0;
  1542.                     $applyRate true;
  1543.                     $authorised $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $player->getLicenciaCorta());
  1544.                     //Comprobamos si esta licencia pertenece a las licencias permitidas que no pagan, pero deben de ir por el flujo normal de inscripcion {NEX-1754}
  1545.                     if (count($authorised) > 0) {
  1546.                         $applyRate false;
  1547.                         $letter "V";
  1548.                     }
  1549.                     //como ya tenemos el pedido, solamente actualizamos los campos necesarios
  1550.                     $rate $this->em->getRepository(Tarifa::class)->find($rateForm);
  1551.                     if ($applyRate) {
  1552.                         $amount $rate->getImporte();
  1553.                     }
  1554.                     //asignamos la segunda tarifa del segundo jugador
  1555.                     $inscribedOrder->setTarifa2(($applyRate) ? $rate null);
  1556.                     $inscribedOrder->setImporte($inscribedOrder->getImporte() + $amount);
  1557.                 }
  1558.                 //terminamos de montar y guardamos el Pedido
  1559.                 $breakdownOrder "";
  1560.                 if ($competition->getOrganizador() != null) {
  1561.                     $breakdownOrder $competition->getOrganizador()->getId() . "-";
  1562.                 }
  1563.                 $breakdownOrder .= $competition->getNombre() . ".<br />";
  1564.                 $breakdownOrder .= $player->getLicencia() . " - ";
  1565.                 $breakdownOrder .= $category->getNombre() . ". ";
  1566.                 $inscribedOrder->setDesglose($breakdownOrder ". " $inscribedOrder->getDesglose());
  1567.                 if ($counter !== 1) {
  1568.                     if ($validVoucher) {
  1569.                         $voucherAmount $voucher->getCantidad();
  1570.                         $amount $inscribedOrder->getImporte();
  1571.                         switch ($voucher->getTipo()) {
  1572.                             //Fijo
  1573.                             case 1:
  1574.                                 $amount -= $voucherAmount;
  1575.                                 break;
  1576.                             //Porcentual
  1577.                             case 2:
  1578.                                 $voucherAmount $voucherAmount 100;
  1579.                                 $amount $amount - ($amount $voucherAmount);
  1580.                         }
  1581.                         //Controlamos que minimo sea 0
  1582.                         $amount max($amount0);
  1583.                         $inscribedOrder->setImporte($amount);
  1584.                         $inscribedOrder->setVoucher($voucher);
  1585.                     }
  1586.                 }
  1587.                 $this->em->persist($inscribedOrder);
  1588.                 $inscribed->setCompeticion($competition);
  1589.                 $inscribed->setJugador($player);
  1590.                 $inscribed->setCategoria($category);
  1591.                 $inscribed->setCategoriaCondicion($category->getCategoriaCondicion());
  1592.                 if ($counter === 1) {
  1593.                     //Le asignamos un número de equipo, aun siendo individual. Para ello cogemos el último numero de equipo y lo incrementamos
  1594.                     $maximumTeamNumber $this->em->getRepository(Inscrito::class)->findMaxEquipoInscrito($competition->getId());
  1595.                     $maximumTeamNumber = (!empty($maximumTeamNumber)) ? ($maximumTeamNumber 1) : 1;
  1596.                     if (!$hasScrambleOrProam) {
  1597.                         $maximumCoupleNumber $this->em->getRepository(Inscrito::class)->findMaxParejaInscrito($competition->getId()) + 1;
  1598.                     }
  1599.                     $team = new Equipo();
  1600.                     //Montamos el inscrito
  1601.                     $teamName sprintf("Pareja %d", ((!$hasScrambleOrProam) ? $maximumCoupleNumber $maximumTeamNumber));
  1602.                     $team->setNombre($teamName);
  1603.                     $team->setCompeticion($competition);
  1604.                     $team->setEquipo($maximumTeamNumber);
  1605.                     $this->em->persist($team);
  1606.                     //$this->em->flush();
  1607.                     $inscribed->setObservaciones($observationsForm);    //Evitamos duplicar el comentario
  1608.                 }
  1609.                 $inscribed->setNombreEquipo($teamName);
  1610.                 $inscribed->setEquipoEntidad($team);
  1611.                 $inscribed->setEquipo($maximumTeamNumber);
  1612.                 $inscribed->setPareja($maximumCoupleNumber);
  1613.                 $inscribed->setParticipa($waitingList ? -1);
  1614.                 $inscribed->setNivel($player->getNivel());
  1615.                 $inscribed->setTipoInscripcion("frontend");
  1616.                 $inscribed->setEstado($inscribedOrder->getEstado());
  1617.                 $inscribed->setValido(true);
  1618.                 $inscribed->setTarifa($rate);
  1619.                 $inscribed->setTurno($shift);
  1620.                 $inscribed->setHcp($player->getHcp());
  1621.                 $inscribed->setSace($player->getSace());
  1622.                 $inscribed->setSacePp($player->getSacePp());
  1623.                 $inscribed->setPedido($inscribedOrder);
  1624.                 $inscribed->setTarifa($rate);
  1625.                 $inscribed->setOrderWaitingList(0);
  1626.                 $this->em->persist($inscribed);
  1627.                 if (isset($registrationFormResponses[$counter]) && is_array($registrationFormResponses[$counter])) {
  1628.                     $competitionRegistrationResponseManager->saveResponse($inscribed$registrationFormResponses[$counter]);
  1629.                 }
  1630.                 $this->em->flush();
  1631.                 $inscribedData[$maximumTeamNumber]['licenses'][] = $inscribed->getJugador()->getLicencia();
  1632.                 $inscribedData[$maximumTeamNumber]['ids'][] = $inscribed->getId();
  1633.                 $additionalDataByCompetition $competition->getAdicionales();
  1634.                 if ($additionalDataByCompetition) {
  1635.                     $dataForm $request->request->all();
  1636.                     foreach ($additionalDataByCompetition as $additionalData) {
  1637.                         if (isset($dataForm["adicional" $additionalData->getId() . "_" $counter])) {
  1638.                             $additionalInscribed = new AdicionalesInscrito();
  1639.                             $additionalInscribed->setValor($dataForm["adicional" $additionalData->getId() . "_" $counter]);
  1640.                             $additionalInscribed->setInscrito($inscribed);
  1641.                             $additionalInscribed->setDato($additionalData);
  1642.                             $this->em->persist($additionalInscribed);
  1643.                         }
  1644.                     }
  1645.                 }
  1646.                 if (!empty($additionalCompetitionConditions)) {
  1647.                     foreach ($additionalCompetitionConditions as $additionalCompetitionCondition) {
  1648.                         $additionalConditionInscribed = new AdditionalConditionInscribed();
  1649.                         $additionalConditionInscribed->setAdditionalCondition($additionalCompetitionCondition);
  1650.                         $additionalConditionInscribed->setInscribed($inscribed);
  1651.                         $additionalConditionInscribed->setAccepted($request->request->has('additionalCondition' $additionalCompetitionCondition->getId()));
  1652.                         $this->em->persist($additionalConditionInscribed);
  1653.                     }
  1654.                 }
  1655.                 $playerList[] = $player;
  1656.                 $inscribedList[] = $inscribed;
  1657.                 $rateList[] = $rate;
  1658.                 //Log y control
  1659.                 $logMessage "Nueva inscripción online en Competición " $competition->getNombre() . "(" $id "): " $player->getLicencia() . "(" $inscribedOrder->getNumero() . ") en la categoria " $category->getNombre();
  1660.                 $log = new Log('i'$logMessagenull);
  1661.                 $this->em->persist($log);
  1662.                 $this->em->flush();
  1663.                 try {
  1664.                     $this->util->guardaCsvInscripciones($inscribed);
  1665.                 } catch (\Throwable $ex) {
  1666.                     //does nothing, continues execution
  1667.                     error_log($ex->getMessage());
  1668.                 }
  1669.             }
  1670.             $inscribedOrder->setNumero($competition->getId() . $letter $competition->getOrganizador()->getId() . $orderNumber);
  1671.             $this->em->flush();
  1672.             if ($competition->getRestringirLicencia() === EnumEstadoRestringirLicencias::PREFERENCIA) {
  1673.                 $updateInscribedToIncludeAtWaitingList->__invoke($competition$inscribedData);
  1674.             }
  1675.             //puede que haya que modificar y poner el pedido en vez de la tarifa
  1676.             $amount $inscribedOrder->getImporte();
  1677.             if (($amount == 0) || ($amount == 0.0)) {
  1678.                     //Apaño para poner todos los inscritos a pagado
  1679.                     foreach ($inscribedList as $inscribed) {
  1680.                         $inscribed->setEstado("pagado");
  1681.                     }
  1682.                     $inscribedOrder->setEstado("pagado");
  1683.                     $inscribedOrder->setPayedAt(new \DateTime('now'));  //como son de tarifa cero, las marcamos como pagadas, ya que no hay que pagar nada
  1684.                     $this->em->flush();
  1685.                     //peparamos la URL bitly y el contenido del SMS
  1686.                     $competitionShortUrl $this->util->getShortUrl($competition);
  1687.                     if ($waitingList || $inscribedList[0]->getParticipa() == -1) {
  1688.                         $textMessage "Está en lista de espera de " substr($this->util->limpiar($competition->getNombre()), 050) . ". Consulte lista de inscritos en " $competitionShortUrl;
  1689.                     } else {
  1690.                         $textMessage "Se ha inscrito correctamente en " substr($this->util->limpiar($competition->getNombre()), 045) . ". Puede consultar el listado de inscritos en " $competitionShortUrl;
  1691.                     }
  1692.                     $organiserClient $competition->getOrganizador()->getCliente();
  1693.                     $emailSubject '⛳ NEXTCADDY - Inscripción online [' $inscribedOrder->getNumero() . ']';
  1694.                     //le mandamos un SMS a cada miembro de la pareja
  1695.                     foreach ($inscribedList as $inscribed) {
  1696.                         $player $inscribed->getjugador();
  1697.                         //Preparación y envio del SMS a cada uno de los jugadores
  1698.                         $playerPrivacy $inscribed->getJugador()->getPrivacidadSimple();
  1699.                         $rgpd false;
  1700.                         if (str_contains($competition->getOrganizador()->getId(), "AM")) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  1701.                             if (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"]) {
  1702.                                 $rgpd true;
  1703.                             }
  1704.                         } else {    //buscamos la privacidad del organizador
  1705.                             if ((isset($playerPrivacy[$competition->getOrganizador()->getId()]) && $playerPrivacy[$competition->getOrganizador()->getId()]) || (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"])) {
  1706.                                 $rgpd true;
  1707.                             }
  1708.                         }
  1709.                         $phonePlayer $utilJugadores->getDatoPlanoDesdeJugador($player"Telefono"$organiserClient);
  1710.                         if ($rgpd && !empty($phonePlayer)) {
  1711.                             $userApp $this->em->getRepository(UserApp::class)->findOneByTelefono($phonePlayer);
  1712.                             $sendInscriptionNotificationByChannels->__invoke(
  1713.                                 $competition,
  1714.                                 $phonePlayer,
  1715.                                 null,
  1716.                                 $textMessage,
  1717.                                 $emailSubject,
  1718.                                 null
  1719.                             );
  1720.                             $argumentsToNotify = [];
  1721.                             $argumentsToNotify["title"] = "Nueva inscripción en torneo";
  1722.                             $argumentsToNotify["msg"] = $textMessage;
  1723.                             $argumentsToNotify["url"] = $competitionShortUrl;
  1724.                             $argumentsToNotify["destinatario"] = $userApp;
  1725.                             $argumentsToNotify["tipo"] = "new-inscription";
  1726.                             $argumentsToNotify["competicion"] = $competition->getId();
  1727.                             $notificator->enviarNotificacion($argumentsToNotify);
  1728.                         }
  1729.                         $this->addFlash('success''El jugador ' $player->getNombre() . ' ' $player->getApellidos() . ' (' $player->getLicencia() . ') '
  1730.                             'se ha inscrito con éxito, en la categoría ' $inscribed->getCategoria()?->getNombre());
  1731.                         try {
  1732.                             if ($softwareGolfEntity) {
  1733.                                 $swutil->addClientToActivity($inscribed$this->emtrue);
  1734.                             }
  1735.                         } catch (\Throwable $exception) {
  1736.                             $logger->error("Error en " __FILE__ "\n" $exception->getMessage());
  1737.                         }
  1738.                     }
  1739.                     $vista 'frontend/Inscritos/emailInscripcionPareja.html.twig';
  1740.                     $argumentsToEmail = [
  1741.                         "to" => $emailForm,
  1742.                         "competicion" => $competition,
  1743.                         "subject" => $emailSubject,
  1744.                         "html" => $this->renderView($vista, array('jugadores' => $playerList,
  1745.                             'inscritos' => $inscribedList,
  1746.                             'competicion' => $competition,
  1747.                             'pedido' => $inscribedOrder,
  1748.                             'tarifas' => $rateList,
  1749.                             'lista_espera' => $waitingList
  1750.                         ))
  1751.                     ];
  1752.                     $sendInscriptionNotificationByChannels->__invoke(
  1753.                         $competition,
  1754.                         null,
  1755.                         $emailForm,
  1756.                         $textMessage,
  1757.                         $emailSubject,
  1758.                         $argumentsToEmail['html']
  1759.                     );
  1760.                 return $this->redirect($this->generateUrl('_tournament'$this->fromAppRouteParameters($request, array('id' => $id))));
  1761.             } else {
  1762.                 return $this->redirect($this->generateUrl('pago_intermedio'$this->fromAppRouteParameters($request, array('idi' => $inscribed->getId(), 'idp' => $inscribedOrder->getId()))));
  1763.             }
  1764.         } else {
  1765.             $competition $this->em->getRepository(Competicion::class)->find($id);
  1766.             if (!$competition) {
  1767.                 $this->addFlash('error'"El torneo buscado no existe");
  1768.                 return $this->redirect($this->generateUrl('competiciones_abiertas'));
  1769.             }
  1770.             $rateList $this->em->getRepository(Tarifa::class)->findByCompeticion($id);
  1771.             $categories $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  1772.             $rounds $this->em->getRepository(Jornada::class)->findBy(array("competicion" => $id), array("orden" => "ASC"));
  1773.             $totalInscribedWithCorrectStatus count($this->em->getRepository(Inscrito::class)->getInscritosActivos($id));
  1774.             $miniature file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
  1775.             return $this->render("frontend/Inscritos/new_pareja_new.html.twig", [
  1776.                 'form' => $form->createView(),
  1777.                 'competicion' => $competition,
  1778.                 'competitionRegistrationFormsEnabled' => $this->canCompetitionUseCustomRegistrationForms($competition),
  1779.                 //'data' => $data,
  1780.                 'tarifas' => $rateList,
  1781.                 'categorias' => $categories,
  1782.                 'jornadas' => $rounds,
  1783.                 'additionalCompetitionConditions' => $additionalCompetitionConditions,
  1784.                 'hayMiniatura' => $miniature,
  1785.                 'num_inscritos' => $totalInscribedWithCorrectStatus
  1786.             ]);
  1787.         }
  1788.     }
  1789.     /**
  1790.      * F-051 Guardado de inscritos equipos
  1791.      *
  1792.      * @Route("/{id}/guardar-inscrito-equipo", name="competicion_guardainscrito_equipo")
  1793.      */
  1794.     public function saveInscribedTeam($idRequest $requestEnvioCorreo $mailerNotificacionesService $notificatorEnvioSms $messagingLoggerInterface $swgolfLoggerSoftwareExternoUtil $swutilUtilJugadores $utilJugadoresUpdateInscribedToIncludeAtWaitingList $updateInscribedToIncludeAtWaitingListAddPlayerRGPDPrivacy $addPlayerRGPDPrivacySendInscriptionNotificationByChannels $sendInscriptionNotificationByChannelsCompetitionRegistrationResponseManager $competitionRegistrationResponseManager)
  1795.     {
  1796.         $dateNow = new \DateTime('now');
  1797.         $competition $this->em->getRepository(Competicion::class)->find($id);
  1798.         if (!$competition) {
  1799.             $this->addFlash('error'"El torneo buscado no existe");
  1800.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  1801.         }
  1802.         $additionalCompetitionConditions $this->obtainAdditionalConditionsByCompetition->__invoke($competition);
  1803.         $competitionIsCalendarMode $competition->getModo()->getId() === 1;
  1804.         $competitionIsOfflineMode $competition->getModo()->getId() === 2;
  1805.         $incorrectCompetitionMode $competitionIsCalendarMode || $competitionIsOfflineMode;
  1806.         if ($incorrectCompetitionMode && ($competition->getEstado() != EnumEstadoCompeticion::ABIERTA)) {
  1807.             $this->addFlash('error'"No es posible inscribirse online en esta competición o el plazo ha finalizado. Consulte con su Club");
  1808.             return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  1809.         }
  1810.         $competitionIsNotForTeams $competition->getJugadores() <= 2;
  1811.         if ($competitionIsNotForTeams) {
  1812.             $this->addFlash('error'"No se admite la inscripción de equipos en este torneo");
  1813.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1814.         }
  1815.         if (($competition->getInicio() != NULL) && ($competition->getFin() != NULL)) {
  1816.             $inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U')) || ($dateNow->format('U') > $competition->getFin()->format('U'));
  1817.             if ($inscriptionPeriodClosed) {
  1818.                 $this->addFlash('error'"El plazo para la inscripción online está cerrado. Consulte con su Club");
  1819.                 return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
  1820.             }
  1821.         }
  1822.         $totalInscribedWithCorrectStatus $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  1823.         $noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
  1824.         if ($noSlotsAvailable) {
  1825.             $totalInscribedAtWaitingList $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($idfalse, ['espera']);
  1826.             $errorMessage "No hay plazas disponibles en este momento.";
  1827.             if ($totalInscribedAtWaitingList 0) {
  1828.                 $errorMessage .= " Hay $totalInscribedAtWaitingList pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
  1829.             }
  1830.             $this->addFlash('error'$errorMessage);
  1831.             return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1832.         }
  1833.         $slotsAvailableMorning 0;
  1834.         $slotsAvailableEvening 0;
  1835.         $slotsMorning $competition->getPlazasManana();
  1836.         $slotsEvening $competition->getPlazasTarde();
  1837.         if ($slotsMorning || $slotsEvening 0) {    //si tenemos inscripcion por turnos vemos donde hay hueco
  1838.             $slotsAvailableMorning $slotsMorning $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idtrue);
  1839.             $slotsAvailableEvening $slotsEvening $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($idfalse);
  1840.         }
  1841.         $form $this->createForm(InscripcionEquipoType::class, null, array(
  1842.             'attr' => array('jugadores' => $competition->getJugadores(), 'id' => "insc" $id'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition'dispManana' => $slotsAvailableMorning'dispTarde' => $slotsAvailableEvening),
  1843.             'action' => $this->generateUrl('competicion_guardainscrito_equipo', array('id' => $id)),
  1844.             'method' => 'POST',
  1845.         ));
  1846.         $form->handleRequest($request);
  1847.         if ($form->isSubmitted() && !empty($additionalCompetitionConditions)) {
  1848.             foreach ($additionalCompetitionConditions as $additionalCompetitionCondition) {
  1849.                 $conditionIsRequired $additionalCompetitionCondition->getCondition() === EnumAdditionalCondition::REQUIRED;
  1850.                 $conditionAccepted $request->request->has('additionalCondition' $additionalCompetitionCondition->getId());
  1851.                 if ($conditionIsRequired && !$conditionAccepted) {
  1852.                     $this->addFlash('error'"Debe aceptar todas las condiciones adicionales obligatorias para completar la inscripción");
  1853.                     return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1854.                 }
  1855.             }
  1856.         }
  1857.         $shift 'mañana';  //por defecto
  1858.         if ($form->has('turno')) {  //si viene el campo "turno" tomamos su valor
  1859.             $shift $form->get('turno')->getData();
  1860.             if (!empty($shift)) {
  1861.                 if ($shift == 'mañana') {
  1862.                     $slotsShift $competition->getPlazasManana();
  1863.                 } else {
  1864.                     $slotsShift $competition->getPlazasTarde();
  1865.                 }
  1866.                 //comprobamos que hay hueco para la nueva inscripcion en dicho turno
  1867.                 $slotsAvailable $slotsShift $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shift == 'mañana'));
  1868.                 if ($slotsAvailable $competition->getJugadores()) {   //como es equipos, queremos que haya al menos numJugadoresPorEquipo plazas
  1869.                     $this->addFlash(
  1870.                         'error'"No se ha podido completar la inscripción porque el turno seleccionado está lleno");
  1871.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1872.                 }
  1873.             } else {
  1874.                 $shift 'mañana';  //por defecto
  1875.             }
  1876.         }
  1877.         $playerIdsList = [];
  1878.         for ($i 1$i <= $competition->getJugadores(); $i++) {
  1879.             $playerIdForm $form->get("id$i")->getData();
  1880.             if ($i == $competition->getJugadores() && !$competition->getEstricto() && !$playerIdForm) {
  1881.                 continue;
  1882.             }
  1883.             if (!$form->get("categoria$i")->getData() && !$form->get("barra$i")->getData()) {
  1884.                 $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");
  1885.                 return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1886.             }
  1887.             if (!$form->get("tarifa$i")->getData()) {
  1888.                 $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");
  1889.                 return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1890.             }
  1891.             if (!$playerIdForm) {
  1892.                 $this->addFlash('error'"Ninguno de los jugadores puede ser vacío para una competición de parejas");
  1893.                 return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1894.             }
  1895.             $playerIdsList[] = $playerIdForm;
  1896.         }
  1897.         //Array_unique quita duplicados en un array, si tenemos menos ID que numero de jugadores, alguno era el mismo.
  1898.         $incorrectNumberOfPlayerByTeam = ($competition->getEstricto() && count(array_unique($playerIdsList)) < $competition->getJugadores()) || (!$competition->getEstricto() && (count(array_unique($playerIdsList)) < ($competition->getJugadores() - 1)));
  1899.         if ($incorrectNumberOfPlayerByTeam) {
  1900.             $this->addFlash('error'"Los jugadores tienen que ser distintos");
  1901.             return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1902.         }
  1903.         if ($form->get('email')->getData() == '') {
  1904.             $this->addFlash('error'"El email no puede ser vacío");
  1905.             return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1906.         }
  1907.         $secret $this->getParameter('secret');
  1908.         if ($form->isSubmitted() && $form->isValid()) {
  1909.             $hasScrambleOrProam boolval($this->em->getRepository(Competicion::class)->hasJornadaScrambleOrProAM($id));
  1910.             $teamName $form->get('teamname')->getData();
  1911.             $requiredSlots count($playerIdsList);
  1912.             $activeInscribedCount = (int) $this->em->getRepository(Inscrito::class)->getCountInscribedByCorrectStatusAndParticipate($competition);
  1913.             $reservedInscribedCount = (int) $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
  1914.             $waitingList $competition->getListaEspera() && (($activeInscribedCount $requiredSlots) > $competition->getPlazas());
  1915.             $registrationFormResponses = [];
  1916.             for ($playerCounter 1$playerCounter <= $requiredSlots$playerCounter++) {
  1917.                 try {
  1918.                     $registrationFormResponses[$playerCounter] = $competitionRegistrationResponseManager->extractSubmittedResponse(
  1919.                         $competition,
  1920.                         $request,
  1921.                         'registration_form_response_' $playerCounter
  1922.                     );
  1923.                 } catch (\InvalidArgumentException $exception) {
  1924.                     $this->addFlash('error'$exception->getMessage());
  1925.                     return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', ['id' => $id]));
  1926.                 }
  1927.             }
  1928.             if (!$competition->getListaEspera() && (($reservedInscribedCount $requiredSlots) > $competition->getPlazas())) {
  1929.                 $totalInscribedAtWaitingList $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($idfalse, ['espera']);
  1930.                 $errorMessage "No hay plazas disponibles en este momento.";
  1931.                 if ($totalInscribedAtWaitingList 0) {
  1932.                     $errorMessage .= " Hay $totalInscribedAtWaitingList pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
  1933.                 }
  1934.                 $this->addFlash('error'$errorMessage);
  1935.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1936.             }
  1937.             if ($waitingList && $competition->getPlazasListaEspera() > 0) {
  1938.                 $totalSlotsWaitingList = (int) $this->em->getRepository(Inscrito::class)->getCountInscritosListaEspera($competition);
  1939.                 if (($totalSlotsWaitingList $requiredSlots) > $competition->getPlazasListaEspera()) {
  1940.                     $this->addFlash('error'"La lista de espera esta completa en este momento");
  1941.                     return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
  1942.                 }
  1943.             }
  1944.             if ($form->has('turno') && !empty($shift)) {
  1945.                 $slotsShift = ($shift == 'mañana') ? $competition->getPlazasManana() : $competition->getPlazasTarde();
  1946.                 $slotsAvailableShift $slotsShift $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shift == 'mañana'));
  1947.                 if ($slotsAvailableShift $requiredSlots) {
  1948.                     $this->addFlash('error'"No se ha podido completar la inscripción porque el turno seleccionado está lleno");
  1949.                     return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
  1950.                 }
  1951.             }
  1952.             $inscriptionOrder = new Pedido();
  1953.             $inscribedList = [];
  1954.             $playerList = [];
  1955.             $rateList = [];
  1956.             $softwareGolfRelated $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club""cliente" => $competition->getOrganizador()->getCliente()]);
  1957.             if ($softwareGolfRelated) {
  1958.                 $software $softwareGolfRelated->getExternalClass();
  1959.                 if (strtolower($software) == "golfmanager") {
  1960.                     $swutil->init($softwareGolfRelated);
  1961.                 }
  1962.             }
  1963.             $competitionOrganiserClient $competition->getOrganizador()->getCliente();
  1964.             for ($playerCount 1$playerCount <= count($playerIdsList); $playerCount++) {
  1965.                 $playerIdForm $form->get('id' $playerCount)->getData();
  1966.                 $licenseForm $form->get('licencia' $playerCount)->getData();
  1967.                 $playerByIdForm $this->em->getRepository(Jugador::class)->find($playerIdForm);
  1968.                 if (!$playerByIdForm) {
  1969.                     $playerByIdForm = new Jugador(__METHOD__);
  1970.                 } else {
  1971.                     $playerByIdForm->setNombre($playerByIdForm->getNombre());
  1972.                     $playerByIdForm->setApellidos($playerByIdForm->getApellidos());
  1973.                 }
  1974.                 $phonePlayerForm = (!$form->has('telefono_jugador' $playerCount)) ? null $form->get('telefono_jugador' $playerCount)->getData();
  1975.                 if (!empty($phonePlayerForm)) {
  1976.                     // Obtener el prefijo del teléfono
  1977.                     $tlfnPrefix $request->request->get("inscripcion_pareja")["tlfnPrefix" $playerCount] ?? "0034";
  1978.                     $fullPhone $tlfnPrefix $phonePlayerForm;
  1979.                     $phonePlayer $utilJugadores->getDatoPlanoDesdeJugador($playerByIdForm"Telefono"$competitionOrganiserClient);  //
  1980.                     if (empty($phonePlayer)) {
  1981.                         $logMessage "Cambio de teléfono del Jugador " $playerByIdForm->getNombreCompleto() . " (" $playerByIdForm->getLicencia() . ") en el método " __METHOD__ ", de " . ($phonePlayer ?: "(vacio)") . " a " $fullPhone;
  1982.                         $playerByIdForm $utilJugadores->setDatoPlanoDesdeJugador($playerByIdForm"Telefono"$fullPhonefalse$competitionOrganiserClient);
  1983.                         $log = new Log('i'$logMessagenull);
  1984.                         $this->em->persist($log);
  1985.                     }
  1986.                 }
  1987.                 $addPlayerRGPDPrivacy->__invoke($competition$playerByIdForm$request);
  1988.                 $playerHasPlayAnyCompetition $competition->getNumCompeticiones() != 0;
  1989.                 $incorrectNumberOfCompetitionsForConditions $playerByIdForm->getNumCompeticiones() < $competition->getNumCompeticiones();
  1990.                 $incorrectStatusHcp = ($playerByIdForm->getEstadoHcp()) != 10 && ($playerByIdForm->getEstadoHcp() != 99);
  1991.                 $playerIsNotActive = !$playerByIdForm->getActivo();
  1992.                 $playerNotComplyWithCompetitionsConditions = ($playerHasPlayAnyCompetition && $incorrectNumberOfCompetitionsForConditions) || ($incorrectStatusHcp) || $playerIsNotActive;
  1993.                 if ($playerNotComplyWithCompetitionsConditions) {
  1994.                     $this->addFlash('error'"El jugador " $playerByIdForm->getNombre() . " " $playerByIdForm->getApellidos() . " (" $playerByIdForm->getLicencia() . ") no cumple las condiciones de inscripción");
  1995.                     return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  1996.                 }
  1997.                 $exclusionCompetitionsList = [];
  1998.                 $exclusionCompetitions $this->em->getRepository(CompeticionesExcluyentes::class)->findByCompeticion($id);
  1999.                 foreach ($exclusionCompetitions as $exclusionCompetition) {
  2000.                     $exclusionCompetitionsList[] = $exclusionCompetition->getAgrupacion()->getId();
  2001.                 }
  2002.                 if (count($exclusionCompetitionsList) > 0) {
  2003.                     $exclusionCompetitionsByPlayerLicense $this->em->getRepository(CompeticionesExcluyentes::class)->findExcluyentesSimpleLicencia($playerByIdForm->getLicencia(), $exclusionCompetitionsList$id);
  2004.                     if (count($exclusionCompetitionsByPlayerLicense) > 0) {
  2005.                         $responseMessage "<ul>";
  2006.                         foreach ($exclusionCompetitionsByPlayerLicense as $exclusionCompetition) {
  2007.                             $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>, ";
  2008.                         }
  2009.                         $responseMessage substr($responseMessage0, -1) . "</ul>";
  2010.                         $this->addFlash('error'"El jugador " $playerByIdForm->getNombre() . " " $playerByIdForm->getApellidos() . " (" $playerByIdForm->getLicencia() . ") está inscrito en alguna competición excluyente de ésta:" $responseMessage);
  2011.                         return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  2012.                     }
  2013.                 }
  2014.                 $checkPlayerId = function ($playerId) {
  2015.                     return function ($keyInscrito $inscribed) use ($playerId) {
  2016.                         return (($inscribed->getJugador()->getId() == $playerId) && ($inscribed->getEstado() == "pagado"));
  2017.                     };
  2018.                 };
  2019.                 if ($competition->getInscritos()->exists($checkPlayerId($playerByIdForm->getId()))) {
  2020.                     $this->addFlash('error'"El jugador " $playerByIdForm->getNombre() . " " $playerByIdForm->getApellidos() . " (" $playerByIdForm->getLicencia() . ") ya está inscrito en la competición");
  2021.                     return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
  2022.                 }
  2023.             }
  2024.             //COMPROBACION VOUCHER
  2025.             $validVoucher false;
  2026.             if ($form->has('voucher')) {
  2027.                 $voucherCode $form['voucher']->getData();
  2028.                 if (!empty($voucherCode)) {
  2029.                     $voucher $this->em->getRepository(Voucher::class)->findOneBy(['codigo' => $voucherCode]);
  2030.                     if (empty($voucher)) {
  2031.                         $this->addFlash('error''No existe ningún voucher con este código');
  2032.                         return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
  2033.                     } else {
  2034.                         $now = new \DateTime('now');
  2035.                         $validDate = ($voucher->getFechaInicio()->format('U') <= $now->format('U')) && ($now->format('U') <= $voucher->getFechaFin()->format('U'));
  2036.                         if (!$validDate) {
  2037.                             $this->addFlash('error''Ha expirado la fecha de validez del voucher');
  2038.                             return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
  2039.                         }
  2040.                         if (count($voucher->getCompeticiones()) == 0) {
  2041.                             $validVoucher true;
  2042.                         } else {
  2043.                             foreach ($voucher->getCompeticiones() as $comp) {
  2044.                                 if ($comp->getId() == $id) {
  2045.                                     $validVoucher true;
  2046.                                 }
  2047.                             }
  2048.                         }
  2049.                         if (!$validVoucher) {
  2050.                             $this->addFlash('error''Este voucher no es válido para esta competición');
  2051.                             return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
  2052.                         }
  2053.                     }
  2054.                 }
  2055.             }
  2056.             $letter "F";
  2057.             if ($hasScrambleOrProam) {
  2058.                 $coupleNumber 1;
  2059.             } else {
  2060.                 $coupleNumber 0;
  2061.             }
  2062.             $inscribedData = [];
  2063.             for ($playerCounter 1$playerCounter <= count($playerIdsList); $playerCounter++) {
  2064.                 $playerIdForm $form->get('id' $playerCounter)->getData();
  2065.                 $licenseForm $form->get('licencia' $playerCounter)->getData();
  2066.                 $rateForm $form->get('tarifa' $playerCounter)->getData();
  2067.                 $emailForm $form->get('email')->getData();
  2068.                 $observationsForm $this->util->limpiar($form->get('observaciones')->getData(), false);
  2069.                 $categoryIdForm $form->get('categoria' $playerCounter)->getData();
  2070.                 if ($form->has('barra' $playerCounter) && !empty($form->get('barra' $playerCounter)->getData())) {
  2071.                     $categoryIdForm $form->get('barra' $playerCounter)->getData(); //No es la barra, es el ID de categoria de la barra que ha selecionado el jugador
  2072.                 }
  2073.                 //Al haber pasado por el for anterior el jugador está seguro si ha llegado a este punto
  2074.                 $playerByIdForm $this->em->getRepository(Jugador::class)->find($playerIdForm);
  2075.                 $category $this->em->getRepository(Categoria::class)->find($categoryIdForm);
  2076.                 if ($playerCounter == 1) {
  2077.                     $orderNumber $this->em->getRepository(Pedido::class)->findLastPedido($competition->getId());
  2078.                     if (!is_null($orderNumber)) {
  2079.                         $orderNumber substr($orderNumber['numero'], 102);
  2080.                         $orderNumber++;
  2081.                     } else {
  2082.                         $orderNumber 'AA';
  2083.                     }
  2084.                     //inicializamos el pedido
  2085.                     $inscriptionOrder->setEmail($emailForm);
  2086.                     $inscriptionOrder->setEmailCod($emailForm$secret);
  2087.                     $inscriptionOrder->setConcepto("ionline");
  2088.                     $inscriptionOrder->setnumero($orderNumber);        //Ponemos algo para que no este vacio, pero se pone el numero correcto mas adelante
  2089.                     $amount 0;
  2090.                     $applyRate true;
  2091.                     $letter "F";
  2092.                     $authorized $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $playerByIdForm->getLicenciaCorta());
  2093.                     if (count($authorized) > 0) {
  2094.                         $applyRate false;
  2095.                         $letter "V";
  2096.                     }
  2097.                     $rate $this->em->getRepository(Tarifa::class)->find($rateForm);
  2098.                     if ($applyRate) {
  2099.                         $amount $rate->getImporte();
  2100.                     }
  2101.                     $inscriptionOrder->setImporte($amount);
  2102.                     $inscriptionOrder->setTarifa(($applyRate) ? $rate null);
  2103.                     if ($amount == 0) {
  2104.                         $inscriptionOrder->setEstado("pagado");
  2105.                     } else {
  2106.                         $inscriptionOrder->setEstado("espera");
  2107.                     }
  2108.                 } else {
  2109.                     $amount 0;
  2110.                     $applyRate true;
  2111.                     $authorized $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $playerByIdForm->getLicenciaCorta());
  2112.                     //Comprobamos si esta licencia pertenece a las licencias permitidas que no pagan, pero deben de ir por el flujo normal de inscripcion {NEX-1754}
  2113.                     if (count($authorized) > 0) {
  2114.                         $applyRate false;
  2115.                         $letter "V";
  2116.                     }
  2117.                     //como ya tenemos el pedido, solamente actualizamos los campos necesarios
  2118.                     if ($applyRate) {
  2119.                         $rate $this->em->getRepository(Tarifa::class)->find($rateForm);
  2120.                         $amount $rate->getImporte();
  2121.                     }
  2122.                     //asignamos la segunda tarifa del segundo jugador
  2123.                     //$pedido->setTarifa2(($aplicarTarifa) ? $tar : null);     //En equipos vamos a tener la misma tarifa por cada miembro de momento
  2124.                     $inscriptionOrder->setImporte($inscriptionOrder->getImporte() + $amount);
  2125.                 }
  2126.                 //terminamos de montar y guardamos el Pedido
  2127.                 $breakdownOrder "";
  2128.                 if ($competition->getOrganizador() != null) {
  2129.                     $breakdownOrder $competition->getOrganizador()->getId() . "-";
  2130.                 }
  2131.                 $breakdownOrder .= $competition->getNombre() . ".<br />";
  2132.                 $breakdownOrder .= $playerByIdForm->getLicencia() . " - ";
  2133.                 $breakdownOrder .= $category->getNombre() . ".";
  2134.                 //Actualizamos el desglose con los datos del primer jugador tambien
  2135.                 $inscriptionOrder->setDesglose($breakdownOrder " " $inscriptionOrder->getDesglose());
  2136.                 //en el ultimo jugador miramos el voucher
  2137.                 if ($playerCounter == count($playerIdsList)) {
  2138.                     if ($validVoucher) {
  2139.                         $voucherAmount $voucher->getCantidad();
  2140.                         $amount $inscriptionOrder->getImporte();
  2141.                         switch ($voucher->getTipo()) {
  2142.                             //Fijo
  2143.                             case 1:
  2144.                                 $amount -= $voucherAmount;
  2145.                                 break;
  2146.                             //Porcentual
  2147.                             case 2:
  2148.                                 $voucherAmount $voucherAmount 100;
  2149.                                 $amount $amount - ($amount $voucherAmount);
  2150.                         }
  2151.                         //Controlamos que minimo sea 0
  2152.                         $amount max($amount0);
  2153.                         $inscriptionOrder->setImporte($amount);
  2154.                         $inscriptionOrder->setVoucher($voucher);
  2155.                     }
  2156.                 }
  2157.                 $this->em->persist($inscriptionOrder);
  2158.                 //Montamos el inscrito
  2159.                 $inscribed = new Inscrito();
  2160.                 $inscribed->setCompeticion($competition);
  2161.                 $inscribed->setJugador($playerByIdForm);
  2162.                 $inscribed->setCategoria($category);
  2163.                 $inscribed->setCategoriaCondicion($category->getCategoriaCondicion());
  2164.                 if ($playerCounter == 1) {
  2165.                     //Le asignamos un numero de equipo, aun siendo individual. Para ello cogemos el último numero de equipo y lo incrementamos
  2166.                     $maximumTeamNumberAtCompetition $this->em->getRepository(Inscrito::class)->findMaxEquipoInscrito($competition->getId());
  2167.                     $maximumTeamNumber = (!empty($maximumTeamNumberAtCompetition)) ? ($maximumTeamNumberAtCompetition 1) : 1;
  2168.                     $team = new Equipo();
  2169.                     $team->setCompeticion($competition);
  2170.                     $team->setEquipo($maximumTeamNumber);
  2171.                     if (!$teamName || strlen($teamName) < 2) {
  2172.                         $teamName "Equipo $maximumTeamNumber";
  2173.                     }
  2174.                     $team->setNombre($teamName);
  2175.                     $this->em->persist($team);
  2176.                     $inscribed->setObservaciones($observationsForm);
  2177.                 }
  2178.                 if (($playerCounter != 0) && !$hasScrambleOrProam) {//Empieza en 0, y X empieza en 1 por lo tanto empezamos por pareja 1 y sumando cada impar.
  2179.                     $coupleNumber++;
  2180.                 }
  2181.                 $inscribed->setPareja($coupleNumber);
  2182.                 $inscribed->setEquipoEntidad($team);
  2183.                 $inscribed->setEquipo($maximumTeamNumber);
  2184.                 $inscribed->setParticipa($waitingList ? -1);
  2185.                 $inscribed->setNivel($playerByIdForm->getNivel());
  2186.                 $inscribed->setTipoInscripcion("frontend");
  2187.                 $inscribed->setNombreEquipo($teamName);
  2188.                 $inscribed->setEstado($inscriptionOrder->getEstado());
  2189.                 $inscribed->setValido(true);
  2190.                 $inscribed->setTurno($shift);
  2191.                 $inscribed->setTarifa($rate);
  2192.                 $inscribed->setHcp($playerByIdForm->getHcp());
  2193.                 $inscribed->setSace($playerByIdForm->getSace());
  2194.                 $inscribed->setSacePp($playerByIdForm->getSacePp());
  2195.                 $inscribed->setOrderWaitingList(0);
  2196.                 $inscribed->setPedido($inscriptionOrder);
  2197.                 $this->em->persist($inscribed);
  2198.                 if (isset($registrationFormResponses[$playerCounter]) && is_array($registrationFormResponses[$playerCounter])) {
  2199.                     $competitionRegistrationResponseManager->saveResponse($inscribed$registrationFormResponses[$playerCounter]);
  2200.                 }
  2201.                 $this->em->flush();
  2202.                 $inscribedData[$maximumTeamNumber]['licenses'][] = $inscribed->getJugador()->getLicencia();
  2203.                 $inscribedData[$maximumTeamNumber]['ids'][] = $inscribed->getId();
  2204.                 $additionalDataByCompetition $competition->getAdicionales();
  2205.                 if ($additionalDataByCompetition) {
  2206.                     $dataForm $request->request->all();
  2207.                     foreach ($additionalDataByCompetition as $additionalData) {
  2208.                         if (isset($dataForm["adicional" $additionalData->getId() . "_" $playerCounter])) {
  2209.                             $additionalInscribed = new AdicionalesInscrito();
  2210.                             $additionalInscribed->setValor($dataForm["adicional" $additionalData->getId() . "_" $playerCounter]);
  2211.                             $additionalInscribed->setInscrito($inscribed);
  2212.                             $additionalInscribed->setDato($additionalData);
  2213.                             $this->em->persist($additionalInscribed);
  2214.                         }
  2215.                     }
  2216.                 }
  2217.                 if (!empty($additionalCompetitionConditions)) {
  2218.                     foreach ($additionalCompetitionConditions as $additionalCompetitionCondition) {
  2219.                         $additionalConditionInscribed = new AdditionalConditionInscribed();
  2220.                         $additionalConditionInscribed->setAdditionalCondition($additionalCompetitionCondition);
  2221.                         $additionalConditionInscribed->setInscribed($inscribed);
  2222.                         $additionalConditionInscribed->setAccepted($request->request->has('additionalCondition' $additionalCompetitionCondition->getId()));
  2223.                         $this->em->persist($additionalConditionInscribed);
  2224.                     }
  2225.                 }
  2226.                 $inscribedList[] = $inscribed;
  2227.                 $playerList[] = $playerByIdForm;
  2228.                 $rateList[] = $rate;
  2229.                 $this->addFlash('success''El jugador ' $playerByIdForm->getNombre() . ' ' $playerByIdForm->getApellidos() . ' (' $playerByIdForm->getLicencia() . ') ' 'se ha inscrito con éxito, en la categoría ' $category->getNombre());
  2230.                 //Log y control
  2231.                 $logMessage "Nueva inscripción online en Competición " $competition->getNombre() . "(" $id "): " $playerByIdForm->getLicencia() . "(" $inscriptionOrder->getNumero() . ")";
  2232.                 $log = new Log('i'$logMessagenull);
  2233.                 $this->em->persist($log);
  2234.                 //$this->em->flush();
  2235.                 try {
  2236.                     $this->util->guardaCsvInscripciones($inscribed);
  2237.                 } catch (\Throwable $exception) {
  2238.                     //does nothing, continues execution
  2239.                     error_log($exception->getMessage());
  2240.                 }
  2241.             }
  2242.             $inscriptionOrder->setNumero($competition->getId() . $letter $competition->getOrganizador()->getId() . $orderNumber);
  2243.             $this->em->flush();
  2244.             if ($competition->getRestringirLicencia() === EnumEstadoRestringirLicencias::PREFERENCIA) {
  2245.                 $updateInscribedToIncludeAtWaitingList->__invoke($competition$inscribedData);
  2246.             }
  2247.             //puede que haya que modificar y poner el pedido en vez de la tarifa
  2248.             $amount $inscriptionOrder->getImporte();
  2249.             if (($amount == 0) || ($amount == 0.0)) {
  2250.                     //Apaño para poner todos los inscritos a pagado
  2251.                     if ($validVoucher) {
  2252.                         foreach ($inscribedList as $inscribed) {
  2253.                             $inscribed->setEstado("pagado");
  2254.                         }
  2255.                     }
  2256.                     $inscriptionOrder->setEstado("pagado");
  2257.                     $inscriptionOrder->setPayedAt(new \DateTime('now'));  //como son de tarifa cero, las marcamos como pagadas, ya que no hay que pagar nada
  2258.                     $this->em->flush();
  2259.                     //peparamos la URL bitly y el contenido del SMS
  2260.                     $competitionShortUrl $this->util->getShortUrl($competition);
  2261.                     if ($waitingList || $inscribedList[0]->getParticipa() == -1) {
  2262.                         $responseText "Está en lista de espera de " substr($this->util->limpiar($competition->getNombre()), 050) . ". Consulte lista de inscritos en " $competitionShortUrl;
  2263.                     } else {
  2264.                         $responseText "Se ha inscrito correctamente en " substr($this->util->limpiar($competition->getNombre()), 045) . ". Puede consultar el listado de inscritos en " $competitionShortUrl;
  2265.                     }
  2266.                     $competitionOrganiserClient $competition->getOrganizador()->getCliente();
  2267.                     $emailSubject '⛳ NEXTCADDY - Inscripción online [' $inscriptionOrder->getNumero() . ']';
  2268.                     foreach ($playerList as $playerByIdForm) {
  2269.                         $playerPrivacy $playerByIdForm->getPrivacidadSimple();
  2270.                         $rgpd false;
  2271.                         if (str_contains($competition->getOrganizador()->getId(), "AM")) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  2272.                             if (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"]) {
  2273.                                 $rgpd true;
  2274.                             }
  2275.                         } else {    //buscamos la privacidad del organizador
  2276.                             if ((isset($playerPrivacy[$competition->getOrganizador()->getId()]) && $playerPrivacy[$competition->getOrganizador()->getId()]) || (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"])) {
  2277.                                 $rgpd true;
  2278.                             }
  2279.                         }
  2280.                         $playerInscribedPhone $utilJugadores->getDatoPlanoDesdeJugador($playerByIdForm"Telefono"$competitionOrganiserClient);
  2281.                         if ($rgpd && !empty($playerInscribedPhone)) {
  2282.                             $userApp $this->em->getRepository(UserApp::class)->findOneByTelefono($playerInscribedPhone);
  2283.                             $sendInscriptionNotificationByChannels->__invoke(
  2284.                                 $competition,
  2285.                                 $playerInscribedPhone,
  2286.                                 null,
  2287.                                 $responseText,
  2288.                                 $emailSubject,
  2289.                                 null
  2290.                             );
  2291.                             $argumentsToNotify = [];
  2292.                             $argumentsToNotify["title"] = "Nueva inscripción en torneo";
  2293.                             $argumentsToNotify["msg"] = $responseText;
  2294.                             $argumentsToNotify["url"] = $competitionShortUrl;
  2295.                             $argumentsToNotify["destinatario"] = $userApp;
  2296.                             $argumentsToNotify["tipo"] = "new-inscription";
  2297.                             $argumentsToNotify["competicion"] = $competition->getId();
  2298.                             $notificator->enviarNotificacion($argumentsToNotify);
  2299.                         }
  2300.                         try {
  2301.                             if ($softwareGolfRelated) {
  2302.                                 $swutil->addClientToActivity($inscribed$this->emtrue);
  2303.                             }
  2304.                         } catch (\Throwable $ex) {
  2305.                             $swgolfLogger->error("Error en " __FILE__ "\n" $ex->getMessage());
  2306.                         }
  2307.                     }
  2308.                     $emailView 'frontend/Inscritos/emailInscripcionPareja.html.twig';
  2309.                     $argumentsToEmail = [
  2310.                         "to" => $emailForm,
  2311.                         "competicion" => $competition,
  2312.                         "subject" => $emailSubject,
  2313.                         "html" => $this->renderView($emailView, array('jugadores' => $playerList,
  2314.                             'competicion' => $competition,
  2315.                             'inscritos' => $inscribedList,
  2316.                             'pedido' => $inscriptionOrder,
  2317.                             'tarifas' => $rateList,
  2318.                             'lista_espera' => $waitingList
  2319.                         ))
  2320.                     ];
  2321.                     $sendInscriptionNotificationByChannels->__invoke(
  2322.                         $competition,
  2323.                         null,
  2324.                         $emailForm,
  2325.                         $responseText,
  2326.                         $emailSubject,
  2327.                         $argumentsToEmail['html']
  2328.                     );
  2329.                 return $this->redirect($this->generateUrl('_tournament'$this->fromAppRouteParameters($request, array('id' => $id))));
  2330.             } else {
  2331.                 return $this->redirect($this->generateUrl('pago_intermedio'$this->fromAppRouteParameters($request, array('idi' => $inscribed->getId(), 'idp' => $inscriptionOrder->getId()))));
  2332.             }
  2333.         } else {
  2334.             $competition $this->em->getRepository(Competicion::class)->find($id);
  2335.             if (!$competition) {
  2336.                 $this->addFlash('error'"El torneo buscado no existe");
  2337.                 return $this->redirect($this->generateUrl('competiciones_abiertas'));
  2338.             }
  2339.             $rateList $this->em->getRepository(Tarifa::class)->findByCompeticion($id);
  2340.             $categories $this->em->getRepository(Categoria::class)->findByCompeticion($id);
  2341.             $rounds $this->em->getRepository(Jornada::class)->findBy(array("competicion" => $id), array("orden" => "ASC"));
  2342.             $totalInscribedWithCorrectStatus count($this->em->getRepository(Inscrito::class)->getInscritosActivos($id));
  2343.             $miniature file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
  2344.             return $this->render("frontend/Inscritos/new_equipo.html.twig", [
  2345.                 'form' => $form->createView(),
  2346.                 'competicion' => $competition,
  2347.                 'competitionRegistrationFormsEnabled' => $this->canCompetitionUseCustomRegistrationForms($competition),
  2348.                 //'data' => $data,
  2349.                 'tarifas' => $rateList,
  2350.                 'categorias' => $categories,
  2351.                 'jornadas' => $rounds,
  2352.                 'additionalCompetitionConditions' => $additionalCompetitionConditions,
  2353.                 'hayMiniatura' => $miniature,
  2354.                 'num_inscritos' => $totalInscribedWithCorrectStatus
  2355.             ]);
  2356.         }
  2357.     }
  2358.     /**
  2359.      * F-053 Pregunta si desea cancelar su inscripción
  2360.      *
  2361.      * @Route("/{id}/cancelar-inscrito-pregunta/{ped}", name="competicion_cancelainscrito_pregunta")
  2362.      */
  2363.     public function cancelarInscritoIntermedio($id$ped)
  2364.     {
  2365.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  2366.         if (!$competicion) {
  2367.             $this->addFlash('error'"El torneo buscado no existe");
  2368.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  2369.         }
  2370.         $pedido $this->em->getRepository(Pedido::class)->find($ped);
  2371.         if (!$pedido) {
  2372.             $this->addFlash('error'"El pedido no existe");
  2373.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  2374.         }
  2375.         if (($competicion->getEstado() == 'abierta') && ($competicion->getModo()->getId() >= 3)) {
  2376.             $inscrito $this->em->getRepository(Inscrito::class)->findOneBy(['pedido' => $pedido'competicion' => $id]);
  2377.             return $this->render("frontend/Inscritos/cancelar_inscripcion_pregunta.html.twig", [
  2378.                 'id' => $id,
  2379.                 'pedido' => $pedido,
  2380.                 'competicion' => $competicion,
  2381.                 'inscrito' => $inscrito
  2382.             ]);
  2383.         } else {
  2384.             $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");
  2385.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2386.         }
  2387.     }
  2388.     /**
  2389.      * F-054 Cancelar la inscripción online de un jugador
  2390.      *
  2391.      * @Route("/{id}/cancelar-inscrito/{pedido}", name="competicion_cancelainscrito")
  2392.      */
  2393.     public function cancelarInscrito($id$pedidoEnvioCorreo $mailerNotificacionesService $notificatorEnvioSms $messagingSoftwareExternoUtil $swutilLoggerInterface $swgolfLoggerUtilJugadores $util_jugadoresObtainFirstInscribedOnWaitingList $obtainFirstInscribedOnWaitingList)
  2394.     {
  2395.         $competicion $this->em->getRepository(Competicion::class)->find($id);
  2396.         if (!$competicion) {
  2397.             $this->addFlash('error'"El torneo buscado no existe");
  2398.             return $this->redirect($this->generateUrl('competiciones_abiertas'));
  2399.         }
  2400.         $secret $this->getParameter('secret');
  2401.         if (($competicion->getEstado() == 'abierta') && ($competicion->getModo()->getId() >= 3)) {
  2402.             if ($pedido == '') {
  2403.                 $this->addFlash('error'"El numero de pedido no puede ser vacío");
  2404.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2405.             }
  2406.             $inscritos $this->em->getRepository(Inscrito::class)->findBy(array('competicion' => $id'pedido' => $pedido));
  2407.             if (!$inscritos) {
  2408.                 $this->addFlash('error'"No se ha podido realizar la cancelación. No existe el inscrito para la competición dada");
  2409.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2410.             }
  2411.             $p $this->em->getRepository(Pedido::class)->find($pedido);
  2412.             if (!$p) {
  2413.                 $this->addFlash('error'"No se ha podido realizar la cancelación. No existe el pedido indicado");
  2414.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2415.             }
  2416.             if ($p->getEstado() != "pagado") {
  2417.                 $this->addFlash('error'"No se ha podido realizar la cancelación. Este pedido ya ha sido cancelado");
  2418.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2419.             }
  2420.             $cl $competicion->getOrganizador()->getCliente();
  2421.             foreach ($inscritos as $inscrito) {
  2422.                 //tomamos valor antes de cambiarlo
  2423.                 $inscritoEstabaEnEspera = ($inscrito->getParticipa() == -1);
  2424.                 $inscrito->setEstado("devolucion");
  2425.                 $inscrito->setParticipa(0);
  2426.                 //Si hay horarios lo borramos
  2427.                 //(esto se va a dar sobretodo si están haciendo pruebas con gestion)
  2428.                 $horarios $this->em->getRepository(Horario::class)->findBy(array('inscrito' => $inscrito));
  2429.                 if (count($horarios) > 0) {
  2430.                     foreach ($horarios as $horario) {
  2431.                         $this->em->remove($horario);
  2432.                     }
  2433.                 }
  2434.                 $jornadas $competicion->getJornadas();
  2435.                 foreach ($jornadas as $jornada) {
  2436.                     if ($jornada->getModalidad()->getId() != 'G' && $jornada->getModalidad()->getId() != 'F' && $jornada->getModalidad()->getId() != 'H') {
  2437.                         $hor $this->em->getRepository(JugadorHorario::class)->deleteJugadorHorario($inscrito$jornadanullnull);
  2438.                         $res $this->em->getRepository(Resultado::class)->deletePuntuacionesInscrito($inscrito$jornada);
  2439.                         $delsh $this->em->getRepository(SinAsignarHorario::class)->deleteSinAsignarHorario($inscrito$jornadanullnull);
  2440.                     } else {
  2441.                         $rr $this->em->getRepository(Resultado::class)->deletePuntuacionesEquipoPareja($inscrito->getEquipo(), $inscrito->getPareja(), $jornada);
  2442.                         $jh_jh $this->em->getRepository(JugadorHorario::class)->findJugadorHorario(null$jornada$inscrito->getEquipo(), $inscrito->getPareja());
  2443.                         $resus array_merge(
  2444.                             $this->em->getRepository(SinAsignarHorario::class)->findEquipoParejaConcreta($inscrito->getEquipo(), $inscrito->getPareja(), $jornada),
  2445.                             ((!empty($jh_jh)) ? [$jh_jh] : []));
  2446.                         foreach ($resus as $resu) {
  2447.                             $this->em->remove($resu);
  2448.                         }
  2449.                     }
  2450.                 }
  2451.                 $p->setEstado("devolucion");
  2452.                 $p->setReturnedAt(new \DateTime('now'));
  2453.                 $this->em->flush();
  2454.                 $jugador $inscrito->getJugador();
  2455.                 $log_message "Cancelación de inscripción online en Competición " $competicion->getNombre() . "(" $id "): " $jugador->getLicencia() . "(" $p->getNumero() . ")";
  2456.                 $log = new Log('i'$log_messagenull);
  2457.                 $this->em->persist($log);
  2458.                 $this->em->flush();
  2459.                 try {
  2460.                     $this->util->guardaCsvInscripciones($inscrito);
  2461.                 } catch (\Throwable $ex) {
  2462.                     //does nothing, continues execution
  2463.                     error_log($ex->getMessage());
  2464.                 }
  2465.                 //avisamos al jugador
  2466.                 $vista 'frontend/Inscritos/emailInscripcion.html.twig';
  2467.                 $args = [
  2468.                     //"to" => $p->getEmail(),
  2469.                     "to" => $p->getEmailCodDecod($secret),
  2470.                     "competicion" => $competicion,
  2471.                     "subject" => "⛳ NEXTCADDY - Cancelación de inscripción [" $p->getNumero() . "]",
  2472.                     "html" => $this->renderView($vista, array('jugador' => $jugador,
  2473.                         'inscrito' => $inscrito,
  2474.                         'competicion' => $competicion,
  2475.                         'pedido' => $p,
  2476.                         "devolucion" => true,
  2477.                         'cancel' => true
  2478.                     ))
  2479.                 ];
  2480.                 //EnvioCorreo::enviarCorreo($args);
  2481.                 $mailer->enviarCorreo($args);
  2482.                 $tar $p->getTarifa();
  2483.                 //Avisamos de la devolucion al organizador
  2484.                 if (!is_null($p)) {
  2485.                     //Solo los que manejan TPV (LV05 o nosotros, segun corresponda)
  2486.                     if (strpos($competicion->getOrganizador()->getId(), "LV") === false) {
  2487.                         $to $this->getParameter('next.email.rfga');
  2488.                     } else {
  2489.                         $usuar $this->em->getRepository(User::class)->findOneByUsername($competicion->getOrganizador()->getId());
  2490.                         $to $usuar->getEmail();
  2491.                     }
  2492.                     if (!empty($p) && $p->getImporte() != 0) {
  2493.                         $args = [
  2494.                             //"to" => $p->getEmail(),
  2495.                             "to" => $to,
  2496.                             "competicion" => $competicion,
  2497.                             "subject" => "Aviso de Devolución - " $competicion->getId() . " [" . ((is_object($p)) ? $p->getNumero() : $p) . "]: Importe " . ((is_object($p)) ? ($p->getImporte() . "€") : "Sin importe en el pedido"),
  2498.                             "html" => $this->renderView('backend/mail/email_devolucion.html.twig', array('jugador' => $jugador,
  2499.                                 'competicion' => $competicion,
  2500.                                 'inscrito' => $inscrito,
  2501.                                 'tarifa' => $tar,
  2502.                                 'razon' => 1,
  2503.                                 'motivo' => "El jugador ha realizado su cancelación en la inscripción a través del email",
  2504.                             ))
  2505.                         ];
  2506.                         //EnvioCorreo::enviarCorreo($args);
  2507.                         $mailer->enviarCorreo($args);
  2508.                     }
  2509.                 }
  2510.                 //Preparación y envio del SMS
  2511.                 $privacidad $inscrito->getJugador()->getPrivacidadSimple();
  2512.                 $rgpd false;
  2513.                 if (strpos($competicion->getOrganizador()->getId(), "AM") !== false) {    //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
  2514.                     if (isset($privacidad["AM00"]) && $privacidad["AM00"]) {
  2515.                         $rgpd true;
  2516.                     }
  2517.                 } else {//buscamos la privacidad del organizador
  2518.                     if ((isset($privacidad[$competicion->getOrganizador()->getId()]) && $privacidad[$competicion->getOrganizador()->getId()]) || (isset($privacidad["AM00"]) && $privacidad["AM00"])) {
  2519.                         $rgpd true;
  2520.                     }
  2521.                 }
  2522.                 $telefono $util_jugadores->getDatoPlanoDesdeJugador($inscrito->getJugador(), "Telefono"$cl);
  2523.                 if ($rgpd && !empty($telefono)) {
  2524.                     $url $this->util->getShortUrl($competicion);
  2525.                     $texto "Ha cancelado su inscripción correctamente en " $competicion->getNombre() . ". Puede consultar el listado de inscritos en " $url;
  2526.                     $userApp $this->em->getRepository(UserApp::class)->findOneByTelefono($telefono);
  2527.                     //if (!$userApp) {
  2528.                     $api $cl?->getId() > 2;
  2529.                     $messaging->enviarSms($telefono$texto$competicion2$api);
  2530.                     //} else {
  2531.                     $args = [];
  2532.                     $args["title"] = "Cancelación de inscripción en torneo";
  2533.                     $args["msg"] = $texto;
  2534.                     $args["url"] = $url;
  2535.                     $args["destinatario"] = $userApp;
  2536.                     $args["tipo"] = "anulation";
  2537.                     $args["competicion"] = $competicion->getId();
  2538.                     $notificator->enviarNotificacion($args);
  2539.                     //}
  2540.                 }
  2541.                 //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
  2542.                 $num_inscritos count($this->em->getRepository(Inscrito::class)->getInscritosJugadorActivos($competicion->getId(), [], 0, [1]));
  2543.                 $lista_espera = (($num_inscritos $competicion->getPlazas()) && $competicion->getListaEspera());
  2544.                 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.
  2545.                     $inscrito_espera $obtainFirstInscribedOnWaitingList->__invoke($competicion);
  2546.                     if ($inscrito_espera) {
  2547.                         $participateValue 1;
  2548.                         if ($competicion->getListaEspera() && $competicion->getRestringirLicencia() === EnumEstadoRestringirLicencias::PREFERENCIA) {
  2549.                             $belongsToPreferredClub $this->preferredLicenseClubChecker->belongsToPreferredClub((string) $inscrito_espera->getJugador()->getLicencia(), $competicion);
  2550.                             if (!$belongsToPreferredClub) {
  2551.                                 $participateValue = -1;
  2552.                             }
  2553.                         }
  2554.                         $inscrito_espera->setParticipa($participateValue);
  2555. //                        $inscrito_espera->setOrderWaitingList(0);
  2556.                         $pedidoInscritoEspera $inscrito_espera->getPedido();
  2557.                         $this->em->flush();
  2558.                         $email $pedidoInscritoEspera $pedidoInscritoEspera->getEmailCodDecod($secret) : null;
  2559.                         if (!empty($email) && $participateValue === 1) {
  2560.                             $args = [
  2561.                                 "to" => $email,
  2562.                                 "subject" => "⛳ NEXTCADDY - Incluido en Competición [" $competicion->getId() . "]",
  2563.                                 "competicion" => $competicion,
  2564.                                 "html" => $this->renderView('frontend/Inscritos/emailAdmitido.html.twig', array(
  2565.                                     'jugador' => $inscrito_espera->getJugador(),
  2566.                                     'competicion' => $competicion,
  2567.                                     'pedido' => $pedidoInscritoEspera,
  2568.                                     'inscrito' => $inscrito_espera,
  2569.                                     'tarifa' => false
  2570.                                 ))
  2571.                             ];
  2572.                             //EnvioCorreo::enviarCorreo($args);
  2573.                             $mailer->enviarCorreo($args);
  2574.                         }
  2575.                         $this->em->flush();
  2576.                     }
  2577.                 }
  2578.                 try {
  2579.                     //Borramos el inscrito anterior de la tabla de Golfmanager y del propio sistema de Golfmanager
  2580.                     $swbd $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club""cliente" => $competicion->getOrganizador()->getCliente(), "clubId" => $competicion->getClub()->getId()]);
  2581.                     if ($swbd) {
  2582.                         $swutil->init($swbd);
  2583.                         $swutil->deleteClientFromActivity($inscrito$this->emtrue);
  2584.                         //Pablo 22/02/2024: Borramos esta condicion, me da igual el softwaregolf que tengamos que ha de ejecutarse la funcion de borrar
  2585.                         //en el caso de Evora no hace nada
  2586.                         //en el caso de GM si borra en su plataforma
  2587.                         // if (strtolower($software) == "golfmanager") {
  2588.                         //     $swutil->init($software);
  2589.                         //     $gmutil = $swutil->getSoftware(); //$new GolfmanagerUtilidad();
  2590.                         //     $gmutil->deleteClientFromActivity($inscrito, $this->em, true);
  2591.                         // }
  2592.                     }
  2593.                 } catch (\Throwable $ex) {
  2594.                     $swgolfLogger->error("Error en " __FILE__ "\n" $ex->getMessage());
  2595.                 }
  2596.             }
  2597.             //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
  2598.             if ($p->getimporte() != 0) {
  2599.                 return new JsonResponse([]);
  2600.             } else {
  2601.                 $this->addFlash('success''Se ha cancelado su inscripción al torneo ' $competicion->getNombre());
  2602.                 return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2603.             }
  2604.         } else {
  2605.             //            $this->addFlash(
  2606.             //                    'error', "No se puede realizar la cancelación online una vez cerrado el proceso de inscripción. Póngase en contacto con el club");
  2607.             //            return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2608.             //quizas aqui un email avisando para revision del pedido y la devolucion
  2609.             $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");
  2610.             return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
  2611.         }
  2612.     }
  2613.     /**
  2614.      *
  2615.      * @Route("/{id}/new-livescoring/{orden}", name="livescoring")
  2616.      */
  2617.     public function livescoring(LivescoringView $livescoringViewRequest $request$id$orden null): RedirectResponse|Response
  2618.     {
  2619.         // TODO eliminar 'new' de la ruta y los archivos del livescoring antiguo para completar el cambio al nuevo livescoring
  2620.         return $livescoringView->__invoke($request$id$orden);
  2621.     }
  2622.     /**
  2623.      * F-061 Visualizacion detallada de un torneo
  2624.      *
  2625.      * @Route("/{id}/{publi}", name="_tournament", requirements={"id": "\d+"}, options={"expose"=true}, defaults={"publi" = 0})
  2626.      */
  2627.     public function tournament($id$publiRequest $requestTournamentView $tournamentView): RedirectResponse|Response
  2628.     {
  2629.         return $tournamentView->__invoke($id$publi$request);
  2630.     }
  2631.     /**
  2632.      * F-085 Enviar etiquetas por correo a un jugador
  2633.      *
  2634.      * @Route("/{idc}/etiqueta-mail/{id}/{idi}", name="etiquetas_enviar_correo", options={"expose"=true}, methods={"POST"})
  2635.      */
  2636.     public function enviarEtiquetasCorreo($id$idc$idiRequest $requestKernelInterface $kernelEnvioCorreo $mailerEnvironment $twigGestionHorarioController $gh)
  2637.     {
  2638.         $request->request->set('inscritos'1); //como si viniera el parametro de que vienen inscritos
  2639.         $request->request->set('inscrito', [$idi]); //simulando el select de inscritos
  2640.         $request->request->set('tipo''tarjetasA4');     //adhesivas2, adhesivas3, tarjetasA4, preimpreso
  2641.         //habra que ver si definimos el tipo segun el organizador de la competicion
  2642.         //(en el fondo no hace falta, asi la gente se acostumbra a la tarjeta de nextcaddy)
  2643.         $request->request->set('tipoTarj''nextcaddy');
  2644.         //$request->request->set('correo', 1);
  2645.         $retorno $gh->generarEtiquetas($request$id$idc0$this$twig$kernel);
  2646.         $secret $this->getParameter('secret');
  2647.         if ($retorno['data']) {
  2648.             $inscrito $this->em->getRepository(Inscrito::class)->find($idi);
  2649.             //ENVIAR CORREO
  2650.             //$retorno es el pdf
  2651.             $to $request->request->get('correo');
  2652.             if (!$to && !empty($inscrito->getPedido())) {
  2653.                 $to $inscrito->getPedido()->getEmailCod($secret);
  2654.             }
  2655.             $dir $kernel->getProjectDir() . '/public/relaxed';
  2656.             $args = [
  2657.                 "to" => $to,
  2658.                 "attachments" => [$dir "/" $retorno["mensaje"]],
  2659.                 'competicion' => $inscrito->getCompeticion(),
  2660.                 "subject" => "NEXTCADDY - Tarjeta torneo {$inscrito->getCompeticion()->getNombre()} ({$inscrito->getCompeticion()->getFecha()->format("d-m-y")})| {$inscrito->getJugador()->getNombreCompleto()}",
  2661.                 "html" => $this->renderView('backend/mail/email_imprimir_tarjeta.html.twig', array(
  2662.                     'inscrito' => $inscrito,
  2663.                     'competicion' => $inscrito->getCompeticion(),
  2664.                 ))
  2665.             ];
  2666.             //EnvioCorreo::enviarCorreo($args);
  2667.             $mailer->enviarCorreo($args);
  2668.             return new JsonResponse(true);
  2669.         } else {
  2670.             return new JsonResponse(false);
  2671.         }
  2672.     }
  2673.     /**
  2674.      * F-002 Obtención del historico acumulado de los contrapares de una partida (PARECE ESTAR OBSOLETA)
  2675.      *
  2676.      * @Route("/{idc}/partida-horario", name="horario_partida_estadisticas", options={"expose"=true})
  2677.      */
  2678.     public function horarioPartidaEstadisticas($idcRequest $request)
  2679.     {
  2680.         $partidaID $request->request->get("partida");
  2681.         $partida $this->em->getRepository(PartidaHorario::class)->find($partidaID);
  2682.         if (!$partida) {
  2683.             return -2;
  2684.         }
  2685.         $jornada $partida->getHorario()->getJornada();
  2686.         $calculo $jornada->getCompeticion()->getCalculo()->getNombre();
  2687.         $modalidad $jornada->getModalidad()->getId();
  2688.         $jornadaId $jornada->getId();
  2689.         $jugadoresHorario $this->em->getRepository(JugadorHorario::class)->findBy(['partida' => $partida], ['inscrito' => 'ASC']); //ordenamos por ID inscrito para mantener siempre el orden
  2690.         $jugadores = array();
  2691.         $contrapares = array();
  2692.         if ($modalidad == "I") {
  2693.             foreach ($jugadoresHorario as $h) {
  2694.                 $insc $h->getInscrito();
  2695.                 $inscId $insc->getId();
  2696.                 $esp $this->em->getRepository(Resultado::class)->findResultadoEspecial($inscId$jornadaId);   //buscamos si tiene resultado especial para no incluirlo
  2697.                 if (!$esp) {
  2698.                     $jugadores[$insc->getId()] = $insc->getJugador()->getNombre();
  2699.                     $hoyoAnt 0;
  2700.                     $acumulado 0;
  2701.                     $resultados $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId'inscrito' => $insc->getId()], ['hoyo' => 'ASC']);
  2702.                     foreach ($resultados as $resultado) {
  2703.                         //Si nos falta un hoyo (Stableford), lo añadimos a mano
  2704.                         for ($e $hoyoAnt 1$e $resultado->getHoyo(); $e++) {
  2705.                             $acumulado += 2;    //Si levanta bola (no existe el hoyo, stableford [pero solo desde programa]) el contrapar es +2 siempre (en ese hoyo)
  2706.                             $contrapares[$insc->getId()][] = $acumulado;
  2707.                         }
  2708.                         $acumulado += $resultado->{"getContrapar" ucfirst($calculo)}();
  2709.                         $contrapares[$insc->getId()][] = $acumulado;
  2710.                         $hoyoAnt $resultado->getHoyo();
  2711.                     }
  2712.                 }
  2713.             }
  2714.         } else {
  2715.             foreach ($jugadoresHorario as $jh) {
  2716.                 $equipo $jh->getEquipo();
  2717.                 $pareja $jh->getPareja();
  2718.                 $esp $this->em->getRepository(Resultado::class)->findResultadoEspecialEquipoPareja($equipo$pareja$jornadaId);
  2719.                 if (!$esp) {
  2720.                     $jugadores[$equipo "-" $pareja] = "";
  2721.                     $inscritos $this->em->getRepository(Inscrito::class)->findBy(['equipo' => $equipo'pareja' => $pareja'competicion' => $jornada->getCompeticion()->getId()]);
  2722.                     foreach ($inscritos as $inscrito) {
  2723.                         $jugadores[$equipo "-" $pareja] .= $inscrito->getjugador()->getNombre() . " - ";
  2724.                     }
  2725.                     $jugadores[$equipo "-" $pareja] = substr($jugadores[$equipo "-" $pareja], 0strlen($jugadores[$equipo "-" $pareja]) - 3);
  2726.                     $acumulado 0;
  2727.                     $resultados $this->em->getRepository(Resultado::class)->findBy(['equipo' => $equipo'pareja' => $pareja'jornada' => $jornada->getId()], ['hoyo' => 'ASC']);
  2728.                     foreach ($resultados as $resultado) {
  2729.                         $acumulado += $resultado->{"getContrapar" ucfirst($calculo)}();
  2730.                         $contrapares[$equipo "-" $pareja][] = $acumulado;
  2731.                     }
  2732.                 }
  2733.             }
  2734.         }
  2735.         return new JsonResponse(["contrapares" => $contrapares"jugadores" => $jugadores]);
  2736.     }
  2737.     private function canCompetitionUseCustomRegistrationForms(Competicion $competition): bool
  2738.     {
  2739.         if (null === $competition->getRegistrationForm()) {
  2740.             return false;
  2741.         }
  2742.         $registrationFormOwner $competition->getOrganizador() ?? $competition->getClub();
  2743.         if (null === $registrationFormOwner) {
  2744.             return true;
  2745.         }
  2746.         $configurationClub $this->em->getRepository(ConfigurationClub::class)->findOneBy(['club' => $registrationFormOwner]);
  2747.         return $configurationClub?->canUseCustomRegistrationForms() ?? false;
  2748.     }
  2749.     private function fromAppRouteParameters(Request $request, array $parameters): array
  2750.     {
  2751.         if ((string) $request->query->get('fromapp''') === '1') {
  2752.             $parameters['fromapp'] = 1;
  2753.         }
  2754.         return $parameters;
  2755.     }
  2756. }