src/Controller/Frontend/TournamentController.php line 746

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