<?php
namespace App\Controller\Frontend;
use App\Controller\Frontend\Tournament\TournamentView;
use App\Controller\Gestion\GestionHorarioController;
use App\Controller\Shared\Inscribed\IncludeInscribedOnWaitingList;
use App\Controller\Shared\Inscribed\UpdateInscribedToIncludeAtWaitingList;
use App\Controller\Shared\Livescoring\LivescoringCache;
use App\DBAL\Backend\EnumEstadoCompeticion;
use App\DBAL\Backend\EnumEstadoInscrito;
use App\DBAL\Backend\EnumEstadoPedido;
use App\DBAL\Backend\EnumEstadoRestringirLicencias;
use App\DBAL\Backend\EnumLivescoringFormula;
use App\Entity\Backend\CompetitionSectionHidden;
use App\Shared\Domain\ProjectEnvironment;
use App\Util\UtilCache;
use App\Web\Player\Domain\Properties\PlayerLicense;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Asset\Packages;
use Twig\Environment;
use App\Form\Frontend\InscripcionType;
use App\Form\Frontend\InscripcionParejaType;
use App\Form\Frontend\InscripcionEquipoType;
use App\Entity\Backend\Inscrito;
use App\Entity\Backend\InscritoDocumento;
use App\Entity\Backend\Log;
use App\Entity\Backend\HcpJuego;
use App\Entity\Backend\Equipo;
use App\Util\Util;
use App\Util\UtilJugadores;
use App\Entity\Backend\Pedido;
use App\Entity\Backend\Jugador;
use App\Entity\Backend\AdicionalesInscrito;
use App\Entity\Backend\AutorizadasCircuito;
use App\Entity\Backend\Categoria;
use App\Entity\Backend\CategoriaConfig;
use App\Entity\Backend\Clasificacion;
use App\Entity\Backend\Clasificado;
use App\Entity\Backend\Cliente;
use App\Entity\Backend\Club;
use App\Entity\Backend\Competicion;
use App\Entity\Backend\CompeticionesExcluyentes;
use App\Entity\Backend\Especial;
use App\Entity\Backend\Estadisticas;
use App\Entity\Backend\Horario;
use App\Entity\Backend\Hoyo;
use App\Entity\Backend\InscritoMarcador;
use App\Entity\Backend\Jornada;
use App\Entity\Backend\JornadaConfig;
use App\Entity\Backend\JugadorRGPD;
use App\Entity\Backend\Meteo;
use App\Entity\Backend\Pais;
use App\Entity\Backend\PublicacionPrograma;
use App\Entity\Backend\Resultado;
use App\Entity\Backend\SoftwareGolf;
use App\Entity\Backend\Tarifa;
use App\Entity\Backend\TrazadoBarra;
use App\Entity\Backend\Voucher;
use App\Entity\Gestion\JugadorHorario;
use App\Entity\Gestion\PartidaHorario;
use App\Entity\Gestion\Ranking;
use App\Entity\Gestion\SinAsignarHorario;
use App\Entity\User\User;
use App\Entity\User\UserApp;
use App\Service\EnvioCorreo;
use App\Service\EnvioSms;
use App\Service\FederatedWebService;
use App\Service\NotificacionesService;
use App\Util\SoftwareExternoUtil;
use App\Util\Utilidades;
use App\Util\UtilResultados;
use Doctrine\Persistence\ManagerRegistry;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
/**
* Tournament controller.
*
* @Route("/tour")
*/
class TournamentController extends AbstractController
{
private $em;
private $util;
private $utilidades;
private $util_cache;
private $manager;
public function __construct(ManagerRegistry $doctrine, Util $util, Utilidades $utilidades, UtilCache $util_cache)
{
$this->util = $util;
$this->utilidades = $utilidades;
$this->em = $doctrine->getManager();
$this->util_cache = $util_cache;
$this->manager = $doctrine;
}
/**
* F-031 Visualización de un resumen de competicion (iframe)
*
* @Route("-widget/{id}", name="_tour_widget", options={"expose"=true})
*/
public function tourWidgetAction($id)
{
$competicion = $this->em->getRepository(Competicion::class)->findBy(['id' => $id, 'visible' => 1]);
if (!$competicion) {
//$this->addFlash('error', "No existe la competición");
return $this->render('frontend/Competicion/widget.html.twig');
}
$numInscritos = count($this->em->getRepository(Inscrito::class)->getInscritosActivos($id));
$climas = [];
$jornadas = $competicion[0]->getJornadas();
foreach ($jornadas as $jornada) {
$unserial = unserialize($jornada->getClima()); //Devuelve "false" o el deserializado
if ($unserial) {
$climas[$jornada->getOrden()] = $unserial;
}
}
return $this->render('frontend/Competicion/widget.html.twig', [
'competicion' => $competicion[0],
'climas' => $climas,
'numInscritos' => $numInscritos
]);
}
/**
* F-032 Muestra la clasificacion de un torneo
*
* @Route("/clasificados", name="_ajClasificados", options={"expose"=true})
*/
public function ajaxGetClasificados(Request $request)
{
$params = array();
$competicion = $request->get("id");
$competi = $this->em->getRepository(Competicion::class)->findOneById($competicion);
$isAjax = $request->isXMLHttpRequest();
if ($isAjax && $competi) {
if (($competi->getFicheroClasificaciones() == null) || ($competi->getFicheroClasificaciones() == '')) {
$totalesbyJornada = array();
$equiposJornadas = array();
$especial = array();
$totales = array();
switch ($competi->getJugadores()) {
case 1:
$njornadas = $this->em->getRepository(Clasificado::class)->getJornadasByClasificacion($competicion);
$entity = $this->em->getRepository(Clasificado::class)->getDataByJornada($competicion, $competi->getCalculo()->getId());
$view = 'frontend/Club/clasificados_new.html.twig';
break;
case 2:
$njornadas = $this->em->getRepository(Clasificado::class)->getJornadasByClasificacionCouple($competicion);
$entity = $this->em->getRepository(Clasificado::class)->getDataByJornadaCouple($competicion, $competi->getCalculo()->getId(), false, false);
foreach ($entity as $e) {
$equiposJornadas[$e['idc']][] = $e['jornada'];
$totales[$e['idc']] = $this->em->getRepository(Clasificado::class)->getTotalesParejas($e['idc']);
}
$view = 'frontend/Club/clasificadosParejas_new.html.twig';
break;
default:
$njornadas_aux = $this->em->getRepository(Clasificado::class)->getJornadasByClasificacionCouple($competicion, true);
//esto lo hacemos solamente aqui, ya que solo se modifica la clasificacion de equipos, pero seria interesante hacerlo en los otros tipos, para optimizar
$njornadas = array();
foreach ($njornadas_aux as $nja) {
$njornadas[$nja['id']] = $nja['contador'];
}
$entity = $this->em->getRepository(Clasificado::class)->getDataByJornadaCouple($competicion, $competi->getCalculo()->getId(), true, false);
foreach ($entity as $e) {
$totalesbyJornada[$e['idc']][$e['equipo']][$e['jornada']] = array('neto' => $e['neto'], 'bruto' => $e['bruto']);
$totalesbyJornada[$e['idc']]['calculo'] = $e['calculo'];
$totalesbyJornada[$e['idc']]['clasificacion'] = $e['clasificacion'];
$totalesbyJornada[$e['idc']][$e['equipo']]['posicion'] = $e['posicion'];
$totalesbyJornada[$e['idc']][$e['equipo']]['nombre_equipo'] = $e['nombre_equipo'];
//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)
//$equiposJornadas[$e['idc']][] = $e['jornada'];
$equiposJornadas[$e['equipo']][$e['id']]['nombre'] = $e['nombre'];
$equiposJornadas[$e['equipo']][$e['id']]['apellidos'] = $e['apellidos'];
$equiposJornadas[$e['equipo']][$e['id']]['pais'] = $e['pais'];
$equiposJornadas[$e['equipo']][$e['id']]['idPais'] = $e['idPais'];
$equiposJornadas[$e['equipo']][$e['id']]['licencia'] = $e['licencia'];
$equiposJornadas[$e['equipo']][$e['id']]['hcp'] = $e['hcp'];
$equiposJornadas[$e['equipo']][$e['id']]['id'] = $e['id'];
if ($e['especial'] != null) {
$nombreEspecial = $this->em->getRepository(Especial::class)->findOneById($e['especial']);
$especial[$e['idc']][$e['jornada']][$e['equipo']] = $nombreEspecial->getNombre();
}
}
$view = 'frontend/Club/clasificadosEquipos_new.html.twig';
break;
}
$nClasif = count($this->em->getRepository(Clasificacion::class)->findByCompeticion($competicion));
$params['entities'] = $entity;
$params['numClasif'] = $nClasif;
$params['njornadas'] = $njornadas;
$params['totalesbyJor'] = $totalesbyJornada;
$params['eqJornadas'] = $equiposJornadas;
$params['especial'] = $especial;
$params['competi'] = $competi;
$params['totales'] = $totales;
if ($nClasif > 0) {
return $this->render($view, $params);
} else {
$response = new JsonResponse();
return $response->setData('No data');
}
//return new JsonResponse(array('datos' => 'this is a json response '.$competicion));
} else {
$view = 'frontend/Club/clasificados_new.html.twig';
return $this->render($view, array(
/*
'entities' => $entity,
'numClasif' => $nClasif,
'njornadas' => $njornadas,
'totalesbyJor' => $totalesbyJornada,
'eqJornadas' => $equiposJornadas,
'especial' => $especial,
'totales' => $totales,
*/
'competi' => $competi
));
}
}
return new Response('This is not ajax!', 400);
}
/**
* F-039 Mostrar inscritos. [ NO SE USA ]
*
* @Route("/complayers", name="_ajInscritos", options={"expose"=true})
*
*/
public function ajaxGetCompPlayers(Request $request)
{
$competicion = $request->request->get("id");
$isAjax = $request->isXMLHttpRequest();
if ($isAjax) {
$comp = $this->em->getRepository(Competicion::class)->find($competicion);
if (($comp->getFicheroInscritos() == null) || ($comp->getFicheroInscritos() == '')) {
$num_jugadores = $comp->getJugadores();
if ($num_jugadores == 1) {
$players = $this->em->getRepository(Inscrito::class)->getPlayersByCompeticion($competicion);
$view = "frontend/Inscritos/inscritos_tbl_new.html.twig";
} else {
$players = $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($comp);
if ($num_jugadores == 2) {
$view = "frontend/Inscritos/inscritos_tbl_parejas_new.html.twig";
} else {
$view = "frontend/Inscritos/inscritos_tbl_equipos_new.html.twig";
}
}
$list = array();
foreach ($players as $i) {
if (!in_array($i->getJugador()->getSexo(), $list, true)) {
array_push($list, $i->getJugador()->getSexo());
}
}
if (!$players) {
$response = new JsonResponse();
return $response->setData('No data');
} else {
return $this->render($view, array(
'inscritos' => $players,
'competi' => $comp,
'sexos' => count($list)
));
}
} else {
$view = 'frontend/Inscritos/inscritos_tbl.html.twig';
return $this->render($view, array(
'competi' => $comp
));
}
}
return new Response('This is not ajax!', 400);
}
/**
* F-040 Buscamos la categoria que mejor ajusta para un jugador en una competicion
*
* Actualmente solo es llamada desde backend:
* - admin_competicion_inscritos_new
* - admin_competicion_inscritos_pareja_new
* Modularizar con UtilInscritos F-144
*
* @Route("/autocomplete-forms/get-categoria-jugador/{idj}/{idc}", name="tour_autocomplete_get_categoria_jugador", options={"expose"=true})
*/
public function getCategoriaJugador($idj, $idc)
{
$id_categoria = 0;
$categorias = $this->em->getRepository(CategoriaConfig::class)->findAllByCompeticion($idc);
$jugador = $this->em->getRepository(Jugador::class)->find($idj);
if (empty($jugador) || empty($categorias)) {
return new JsonResponse($id_categoria);
}
$fecha_dummy = new \DateTime('0001-01-01');
foreach ($categorias as $categoria) {
$sigue = true;
if (($categoria->getSexo() != NULL) && ($categoria->getSexo() != '') && ($categoria->getSexo() != 'sin especificar')) {
$sigue = ($categoria->getSexo() == $jugador->getSexo());
}
if (($categoria->getHcpMax() != NULL) && ($categoria->getHcpMax() != 0) && $sigue) {
$sigue = (($jugador->getHcp() <= $categoria->getHcpMax()) && $sigue);
}
if (($categoria->getHcpMin() != NULL) && ($categoria->getHcpMin() != 0) && $sigue) {
$sigue = (($jugador->getHcp() >= $categoria->getHcpMin()) && $sigue);
}
if (($categoria->getDesde() != NULL) && ($categoria->getDesde() != $fecha_dummy) && $sigue) {
$sigue = (($jugador->getFecha() >= $categoria->getDesde()) && $sigue);
}
if (($categoria->getHasta() != NULL) && ($categoria->getHasta() != $fecha_dummy) && $sigue) {
$sigue = (($jugador->getFecha() <= $categoria->getHasta()) && $sigue);
}
if (($categoria->getNivel() != NULL) && $sigue) {
$sigue = (($categoria->getNivel() == $jugador->getNivel()) && $sigue);
}
//si hemos seguido en todos los criterios, es decir que coincide en dicha categoria, por lo tanto, salimos y devolvemos el IdCartegoria
if ($sigue) {
$id_categoria = $categoria->getCategoria()->getId();
break;
}
}
return new JsonResponse($id_categoria);
}
/**
* F-041 Obtenencion el handicap y el sexo de un jugador
*
* @Route("/autocomplete-forms/get-hcp-jugador/{licencia}/{club}", name="tour_autocomplete_get_hcp_jugador", options={"expose"=true})
*/
public function getHcpJugador($licencia, $club, FederatedWebService $rfeg)
{
$l = $licencia;
$lic = substr($l, 4);
//Si no es un numero o n oes licencia profesional (acaba en "-P") salimos
if (!(is_numeric($lic) || substr($lic, -2) === "-P")) {
return new JsonResponse(array('hcp' => 'ND', 'sexo' => 's'));
}
$jugador = $this->em->getRepository(Jugador::class)->findByLicenciaCortaNoTemporal($lic);
//Aqui solo entra cuando no encuentra a nadie coincidente en nuestra BD
if (!$jugador) {
$clubEntity = $this->em->getRepository(Club::class)->find($club);
$cliente = $clubEntity->getCliente();
$organizador = $this->em->getRepository(Club::class)->find($cliente->getNombreCorto());
$rfeg->init($organizador);
//$jugadores = $rfeg->searchByCode(array('federationCode' => $lic));
$jugadores = $rfeg->listByCode2020(array('federatedCodes' => ['federatedCode' => $lic]));
if (is_array($jugadores) && array_key_exists('federateds', $jugadores)) {
$federados = $jugadores->federateds;
if (array_key_exists('federated', $federados)) {
foreach ($federados as $federado) {
$jugador = new Jugador(__METHOD__);
$this->utilidades->actualizarDatosJugadorFromFederated($federado, $jugador);
}
$jugador = $this->em->getRepository(Jugador::class)->findOneBy(array('habilitado' => 1, 'licencia' => $jugador->getLicencia()));
} else {
$jugador = null;
}
} else {
$jugador = null;
}
}
if ($jugador) {
return new JsonResponse(array('hcp' => $jugador->getHcp(), 'sexo' => substr($jugador->getSexo(), 0, 1)));
} else {
return new JsonResponse(array('hcp' => 'ND', 'sexo' => 's'));
}
}
/**
* F-042 Obtenencion de valores de slope y campo de un trazado
*
* @Route("/autocomplete-forms/get-trazadobarra-valores", name="tour_autocomplete_get_tb_valores", options={"expose"=true})
*/
public function getTrazadobarraValores(Request $request)
{
$valores = array();
$contrarios = array("femenino" => "masculino", "masculino" => "femenino");
$barra = $request->query->get('barra');
$trazado = $request->query->get('trazado');
$tipo_hoyos = $request->query->get('hoyos');
$trazadosbarras = $this->em->getRepository(TrazadoBarra::class)->findBy(array('barra' => $barra, 'trazado' => $trazado, 'activo' => 1));
$sexoAnt = "";
foreach ($trazadosbarras as $tb) {
$sexo = $tb->getSexo();
switch ($tipo_hoyos) {
case 1:
$valores[$tb->getSexo()]['slope'] = $tb->getSlope19();
$valores[$tb->getSexo()]['campo'] = $tb->getCampo19();
break;
case 2:
$valores[$tb->getSexo()]['slope'] = $tb->getSlope1018();
$valores[$tb->getSexo()]['campo'] = $tb->getCampo1018();
break;
case 3:
$valores[$tb->getSexo()]['slope'] = $tb->getSlope();
$valores[$tb->getSexo()]['campo'] = $tb->getCampo();
break;
}
$sexoAnt = $sexo;
}
if (count($trazadosbarras) < 2) {
$valores[$contrarios[$sexoAnt]]['slope'] = 0;
$valores[$contrarios[$sexoAnt]]['campo'] = 0;
}
return new JsonResponse($valores);
}
/**
* F-043 Obtencion de todas las barras de un trazado
*
* @Route("/autocomplete-forms/get-barras-trazado", name="tour_autocomplete_get_barras_trazado", options={"expose"=true})
*/
public function getBarraTrazado(Request $request)
{
$trazado = $request->query->get('trazado');
$barras = $this->em->getRepository(TrazadoBarra::class)->findBarrasTrazados($trazado);
return new JsonResponse($barras);
}
/**
* F-044 Guarda la configuracion de RGPD del jugador
*
* @Route("/autocomplete-forms/actualizar-rgpd", name="tour_autocomplete_update_rgpd", options={"expose"=true})
*/
public function updateRgpd(Request $request, UtilJugadores $util_jugadores)
{
$datos = $request->request->get("form");
if (empty($datos["id"])) {
return new JsonResponse(["codigo" => -1]);
}
$jugador = $this->em->getRepository(Jugador::class)->find($datos["id"]);
if (!$jugador) {
return new JsonResponse(["codigo" => -1]);
}
$organizador = "";
$privacidad = $jugador->getPrivacidadSimple();
//Si es una competicion, marcamos solo la RGPD asociada a dicho organizador, sino marcamos todas
if ($datos['organizador'] != "0") {
$organizador = $datos["organizador"];
//Arreglo 28/04/2023
//$privacidades = ["AM00", "LV05", "CM00"]; //21/03 AQUI HAY QUE AÑADIR MAS POSIBLES PRIVACIDADES <--
//Si es nulo o falso, lo actualizamos
if ((!isset($privacidad[$organizador]) || !$privacidad[$organizador])) {
$new = false;
if (isset($privacidad[$organizador])) {
$jugadorRGPD = $this->em->getRepository(JugadorRGPD::class)->findOneBy(['jugador' => $jugador, 'aceptacion' => $organizador]);
} else {
//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
//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
$club = $this->em->getRepository(Club::class)->find($organizador);
$cliente = $club->getCliente(); //$this->em->getRepository(Cliente::class)->findOneBy(['nombreCorto' => $organizador]);
if ($cliente) {
$jugadorRGPD = new JugadorRGPD();
$jugadorRGPD->setCliente($cliente);
$jugadorRGPD->setAceptacion($organizador);
$jugadorRGPD->setJugador($jugador);
$new = true;
} else {
//Este caso no se va a dar, pero debe de estar controlado
return new JsonResponse(["codigo" => 0]);
}
}
$jugadorRGPD->setRgpdExtra($request->headers->get("user-agent"));
$jugadorRGPD->setRgpdIP($request->getClientIp());
$jugadorRGPD->setRgpd(true);
if ($new) {
$this->em->persist($jugadorRGPD);
}
if (!empty($datos["email"])) {
$jugador = $util_jugadores->setDatoPlanoDesdeJugador($jugador, "EmailCod", $datos["email"], false);
// $jugador->setEmailCod($datos["email"], $secret);
// //$jugador->setEmail($datos["email"]);
$jugadorRGPD->setNewsletters(!empty($datos["newsletters"]) || intval($datos["newsletters"]));
}
$this->em->flush();
}
} else { //Si es desde el area de usuario, aceptamos todas las RGPD que tengamos de federaciones
$privacidades = $this->em->getRepository(Cliente::class)->findFederaciones();
foreach ($privacidades as $p) {
$new = false;
$jugadorRGPD = $this->em->getRepository(JugadorRGPD::class)->findOneBy(['jugador' => $jugador, 'aceptacion' => $p]);
if (!$jugadorRGPD) {
$jugadorRGPD = new JugadorRGPD();
$jugadorRGPD->setCliente($p);
$jugadorRGPD->setAceptacion($p->getNombreCorto());
$jugadorRGPD->setJugador($jugador);
$new = true;
}
$jugadorRGPD->setRgpdExtra($request->headers->get("user-agent"));
$jugadorRGPD->setRgpdIP($request->getClientIp());
$jugadorRGPD->setRgpd(true);
if ($new) {
$this->em->persist($jugadorRGPD);
}
if (!empty($datos["email"])) {
$jugador = $util_jugadores->setDatoPlanoDesdeJugador($jugador, "EmailCod", $datos["email"], false);
// $jugador->setEmailCod($datos["email"], $secret);
// //$jugador->setEmail($datos["email"]);
$jugadorRGPD->setNewsletters(!empty($datos["newsletters"]) || intval($datos["newsletters"]));
}
$this->em->flush();
}
}
return new JsonResponse(["codigo" => intval($datos["rgpd"])]);
}
/**
* F-045 Obtenemos la informacion detallada de un trazadobarra
*
* @Route("/autocomplete-forms/get-datos-trazado", name="tour_autocomplete_get_datos_trazado", options={"expose"=true})
*/
public function getDatosTrazado(Request $request)
{
$trazado = $request->query->get('trazado');
$barra = $request->query->get('barra');
$sexoAnt = "";
$datos = array();
$contrarios = array("f" => "m", "m" => "f");
$trazadosbarras = $this->em->getRepository(TrazadoBarra::class)->findBy(array('trazado' => $trazado, 'barra' => $barra, 'activo' => 1));
foreach ($trazadosbarras as $tb) {
$sexo = substr($tb->getSexo(), 0, 1);
$hoyos = $this->em->getRepository(Hoyo::class)->findBy(array('trazadoBarra' => $tb->getId()));
$datos[$sexo] = array();
$datos[$sexo]['metros'] = array();
$datos[$sexo]['par'] = array();
$datos[$sexo]['hcp'] = array();
if ($hoyos) {
foreach ($hoyos as $hoyo) {
$datos[$sexo]['hoyo'][] = ($hoyo->getAlias()) ? ($hoyo->getAlias()) : ($hoyo->getNumero());
$datos[$sexo]['metros'][] = $hoyo->getMetros();
$datos[$sexo]['par'][] = $hoyo->getPar();
$datos[$sexo]['hcp'][] = $hoyo->getHcp();
}
} else {
$datos[$sexo] = $datos[$sexoAnt];
}
$sexoAnt = $sexo;
}
if (count($trazadosbarras) < 2) {
$datos[$contrarios[$sexoAnt]] = -1;
}
return new JsonResponse($datos);
}
/**
* F-046 Se muestra el punto del guardado para la tarjeta-foto
*
* @Route("/foto/{token}", name="frontend_tarjeta_foto", options={"expose"=true})
*
*/
public function tarjetaFoto($token, Request $request, AuthorizationCheckerInterface $authorizationChecker)
{
$secret = $this->getParameter('secret');
$long = $this->getParameter('next.longitud.hash');
$params = [];
$environment = $this->getParameter('kernel.environment');
if ($environment == "dev") {
$id = $token;
} else {
$id = $this->util->desencriptarLargo($token, $secret, $long);
}
$competicion = $this->em->getRepository(Competicion::class)->find($id);
if (!$competicion) {
$this->addFlash(
'error', "No existe la competicion");
return $this->redirect($this->generateUrl('provincias'));
}
if ($competicion->getModo()->getId() != 4 && !$authorizationChecker->isGranted('ROLE_ADMIN')) {
$now = new \DateTime('now');
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id, 'fecha' => $now));
} else {
$jornadas = $competicion->getJornadas();
$jornada = $jornadas[0];
}
if (!$jornada) {
$this->addFlash(
'error', "No hay jornada para el dia de hoy en esta competición");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competicion->getId())));
}
$ordenacion = ["i.participa" => "DESC", "j.apellidos" => "ASC", "j.nombre" => "ASC"];
$inscritos = $this->em->getRepository(Inscrito::class)->getInscritosJugadorActivos($id, $ordenacion, 0, [0, 1]); //getInscritosActivos($id);
//esto coge los jugadore SIN tarjeta rellena o sin marcador asignado (segun corresponda)
//$inscritos = $this->em->getRepository(Inscrito::class)->getInscritosSinTarjetaFoto($id, "inscrito", $jornada);
//$marcadores = $this->em->getRepository(Inscrito::class)->getInscritosSinTarjetaFoto($id, "marcador", $jornada);
if ($jornada->getModalidad()->getId() != "I") {
$parejas = [];
foreach ($inscritos as $ins) {
$index = $ins->getEquipo() . "-" . $ins->getPareja();
if (!isset($parejas[$index])) {
$parejas[$index] = array();
}
$parejas[$index][] = $ins;
}
$params['parejas'] = $parejas;
}
//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
$params['inscritos'] = $inscritos;
$params['marcadores'] = $inscritos;
$params['jornada'] = $jornada;
$params['competicion'] = $competicion;
$insc = null;
$inscToken = $request->query->get('i', null); //esto es una licencia tokenizada
if (!empty($inscToken)) {
if ($environment == "dev") {
$insc = $inscToken;
} else {
$insc = $this->util->desencriptarLargo($inscToken, $secret, $long);
}
if ($insc) {
//buscamos el inscrito a partir de la licencia y la competicion
$inscrt = $this->em->getRepository(Inscrito::class)->findJugadorInscritoLicencia($insc, $id); //siempre el primer inscrito del equipo!!
if (!empty($inscrt)) {
if ($jornada->getModalidad()->getId() != "I") {
$params['inscrt'] = $parejas[$inscrt->getEquipo() . "-" . $inscrt->getPareja()][0]; //siempre el primer inscrito del equipo!!
} else {
$params['inscrt'] = $inscrt;
}
} //no hay else, dejamos $params['inscrt'] sin definir
// //TEMPORAL: Redirigimos a la tarjeta virtual los QRs de las etiquetas para competiciones especificas, para pruebas
// $parametro = $this->em->getRepository(Parametro::class)->findOneBy(["tipo" => "ecard", "parametro" => "competiciones"]);
// if (in_array($id, explode(",", $parametro->getValor()))) {
// $tokenTVInsc = $this->util->encriptarLargo($jornada->getOrden() . "-" . $params['inscrt']->getId(), $secret, $long); //tomamos $params['inscrt'] por asegurarnos
// return $this->redirect($this->generateUrl('tarjeta_virtual', ["token" => $tokenTVInsc]));
// }
if ($competicion->getTarjetaElectronica()) {
$tokenTVInsc = $this->util->encriptarLargo($jornada->getOrden() . "-" . $params['inscrt']->getId(), $secret, $long); //tomamos $params['inscrt'] por asegurarnos
return $this->redirect($this->generateUrl('tarjeta_virtual', ["token" => $tokenTVInsc]));
}
}
}
$marc = null;
$marcToken = $request->query->get('m', null);
if (!empty($marcToken)) {
if ($environment == "dev") {
$marc = $marcToken;
} else {
$marc = $this->util->desencriptarLargo($marcToken, $secret, $long);
}
} else {
$marc = false;
$inscrito_marcador = $this->em->getRepository(InscritoMarcador::class)->findOneBy(["inscrito" => $inscrt, "jornada" => $jornada]);
if ($inscrito_marcador) {
$marc = $inscrito_marcador->getMarcador()->getJugador()->getLicencia();
}
}
if ($marc) {
$marcador = $this->em->getRepository(Inscrito::class)->findJugadorInscritoLicencia($marc, $id); //siempre el primer inscrito del equipo!!
if ($jornada->getModalidad()->getId() != "I") {
$params['mrcdr'] = $parejas[$marcador->getEquipo() . "-" . $marcador->getPareja()][0]; //siempre el primer inscrito del equipo!!
} else {
$params['mrcdr'] = $marcador;
}
} //no hay else, dejamos $params['mrcdr'] sin definir
return $this->render("frontend/Competicion/tarjetaFoto.html.twig", $params);
}
/**
* F-047 Muestra un formulario para crear una nueva entidad de Inscrito
*
* @Route("/{id}/inscripcion", name="competicion_inscritos_new", methods={"GET"})
*/
public function newInscribed($id, AuthorizationCheckerInterface $authorizationChecker)
{
$competition = $this->em->getRepository(Competicion::class)->find($id);
if (!$competition) {
$this->addFlash('error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
if ($competition->getModo()->getId() < 3) {
$this->addFlash('error', "No es posible la inscripción Online en esta Competición");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
if ($competition->getJugadores() != 1) {
$this->addFlash('error', "No es posible la inscripción individual en este torneo");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
if (!$authorizationChecker->isGranted('ROLE_ADMIN')) {
$dateNow = new \DateTime('now');
if ($competition->getEstado() == EnumEstadoCompeticion::ABIERTA) {
if ($competition->getInicio() != NULL) {
$inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U'));
if ($inscriptionPeriodClosed) {
$this->addFlash('other', "Aún no está abierto el plazo --- El plazo de inscripción online se abre el " . $competition->getInicio()->format("d/m/Y") . " a las " . $competition->getInicio()->format("H:i"));
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
} else {
$this->addFlash('error', "No es posible la inscripción Online en esta Competición");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
} else {
if ($competition->getEstado() == EnumEstadoCompeticion::FINALIZADA) {
$flashMessage = "No es posible la inscripción, el plazo está cerrado";
} else {
$flashMessage = "No es posible la inscripción. La competición está '" . $competition->getEstado() . "'";
}
$this->addFlash('error', $flashMessage);
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
}
$totalInscribedWithCorrectStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
$noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
if ($noSlotsAvailable) {
$totalInscribedAtWaitingList = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id, false, ["espera"]);
if ($totalInscribedAtWaitingList > 0) {
$this->addFlash('info', "Las plazas disponibles están en proceso de pago, inténtelo de nuevo más tarde por si algún jugador no finaliza el proceso");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
} else {
$this->addFlash('error', "No hay más plazas disponibles");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
}
$federationId = $competition->getClub()->getRfegId();
if (empty($federationId)) {
$federationClub = [];
} else {
$federationClub = $this->manager->getConnection()
->prepare("SELECT c.id as codigo_club, f.id as codigo_federacion FROM Club c inner join club_federacion cf on c.id = cf.club_id inner join Federacion f on cf.federacion_id = f.id WHERE c.rfeg_id = " . $federationId)
->executeQuery()->fetchAllAssociative();
}
$federationCode = isset($federationClub[0]) ? ($federationClub[0]["codigo_federacion"] ?? null) : null;
$slotsAvailableMorning = 0;
$slotsAvailableEvening = 0;
$slotsMorning = $competition->getPlazasManana();
$slotsEvening = $competition->getPlazasTarde();
if ($slotsMorning > 0 || $slotsEvening > 0) { //si tenemos inscripcion por turnos vemos donde hay hueco
$slotsAvailableMorning = $slotsMorning - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, true);
$slotsAvailableEvening = $slotsEvening - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, false);
}
$form = $this->createForm(InscripcionType::class, null, array(
'attr' => array('id' => "insc" . $id, 'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition, 'dispManana' => $slotsAvailableMorning, 'dispTarde' => $slotsAvailableEvening),
'action' => $this->generateUrl('competicion_guardainscrito', array('id' => $id)),
'method' => 'POST',
));
$validRates = $this->em->getRepository(Tarifa::class)->findTarifasValidasPorCompeticion($id);
$categories = $this->em->getRepository(Categoria::class)->findByCompeticion($id);
$rounds = $competition->getJornadas();
$miniature = file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
$countries = $this->em->getRepository(Pais::class)->findAll();
return $this->render("frontend/Inscritos/new_new.html.twig", [
'form' => $form->createView(),
'competicion' => $competition,
'tarifas' => $validRates,
'categorias' => $categories,
'num_inscritos' => $totalInscribedWithCorrectStatus,
'codigo_federacion' => $federationCode,
'jornadas' => $rounds,
'paises' => $countries,
'hayMiniatura' => $miniature,
'flp' => 0,
'menu' => [], //en el infoalert hay un condicional para que se despliegue si no tiene 'menu' ni 'orden'. Habilitamos uno de los dos
'orden' => [] //Ya no los habilitamos porque queremos que salga abierto el informacion de interes. 16/07/2019
]);
}
/**
* F-048 Muestra un formulario para crear una nueva pareja de Inscritos
*
* @Route("/{id}/inscripcion/pareja", name="competicion_inscritos_pareja_new", methods={"GET"})
*/
public function newInscribedCouple($id)
{
$competition = $this->em->getRepository(Competicion::class)->find($id);
if (!$competition) {
$this->addFlash('error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
$competitionIsCalendarMode = $competition->getModo()->getId() === 1;
$competitionIsOfflineMode = $competition->getModo()->getId() === 2;
$incorrectCompetitionMode = $competitionIsCalendarMode || $competitionIsOfflineMode;
if ($incorrectCompetitionMode) {
$this->addFlash('error', "No es posible la inscripción Online en esta Competición");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
if ($competition->getJugadores() != 2) {
$this->addFlash(
'error', "Este torneo sólo permite la inscripcion de parejas");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
$dateNow = new \DateTime('now');
if ($competition->getEstado() == EnumEstadoCompeticion::ABIERTA) {
if (!is_null($competition->getInicio())) {
$inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U'));
if ($inscriptionPeriodClosed) {
$this->addFlash('error', "El plazo de inscripción online se abre el " . $competition->getInicio()->format("d/m/Y") . " a las " . $competition->getInicio()->format("H:i"));
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
} else {
$this->addFlash('error', "La competición aún no tiene plazo de inscripción");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
} else {
if ($competition->getEstado() == EnumEstadoCompeticion::FINALIZADA) {
$this->addFlash('error', "No es posible la inscripción, el plazo está cerrado");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
} else {
$this->addFlash('error', "No es posible la inscripción. La competición está '" . $competition->getEstado() . "'");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
}
$totalInscribedWithCorrectStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
$noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
if ($noSlotsAvailable) {
$this->addFlash('error', "No hay más plazas disponibles");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
$federationId = $competition->getClub()->getRfegId();
$federationClub = $this->manager->getConnection()
->prepare("SELECT c.id as codigo_club, f.id as codigo_federacion FROM Club c inner join club_federacion cf on c.id = cf.club_id inner join Federacion f on cf.federacion_id = f.id WHERE c.rfeg_id = " . $federationId)
->executeQuery()->fetchAllAssociative();
$federationCode = $federationClub[0] ? ($federationClub[0]["codigo_federacion"] ?? null) : null;
$slotsAvailableMorning = 0;
$slotsAvailableEvening = 0;
$slotsMorning = $competition->getPlazasManana();
$slotsEvening = $competition->getPlazasTarde();
if ($slotsMorning > 0 || $slotsEvening > 0) { //si tenemos inscripcion por turnos vemos donde hay hueco
$slotsAvailableMorning = $slotsMorning - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, true);
$slotsAvailableEvening = $slotsEvening - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, false);
}
$form = $this->createForm(InscripcionParejaType::class, null, array(
'attr' => array('id' => "insc" . $id, 'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition, 'dispManana' => $slotsAvailableMorning, 'dispTarde' => $slotsAvailableEvening),
'action' => $this->generateUrl('competicion_guardainscrito_pareja', array('id' => $id)),
'method' => 'POST',
));
$validRates = $this->em->getRepository(Tarifa::class)->findTarifasValidasPorCompeticion($id);
$categoriesByCompetition = $this->em->getRepository(Categoria::class)->findByCompeticion($id);
$rounds = $competition->getJornadas();
$countries = $this->em->getRepository(Pais::class)->findAll();
$miniature = file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
$hasProam = boolval($this->em->getRepository(Competicion::class)->hasJornadaProam($id));
return $this->render("frontend/Inscritos/new_pareja_new.html.twig", [
'form' => $form->createView(),
'competicion' => $competition,
'tarifas' => $validRates,
'categorias' => $categoriesByCompetition,
'num_inscritos' => $totalInscribedWithCorrectStatus,
'jornadas' => $rounds,
'codigo_federacion' => $federationCode,
'paises' => $countries,
'hayMiniatura' => $miniature,
'esProam' => $hasProam,
'menu' => [], //en el infoalert hay un condicional para que se despliegue si no tiene 'menu' ni 'orden'. Habilitamos uno de los dos
'orden' => [] //Ya no los habilitamos porque queremos que salga abierto el informacion de interes. 16/07/2019
]);
}
/**
* F-084 Muestra el formulario de inscripciones de equipos
*
* @Route("/{id}/inscripcion/equipo", name="competicion_inscritos_equipo_new", methods={"GET"})
*/
public function newInscribedTeam($id)
{
$competition = $this->em->getRepository(Competicion::class)->find($id);
if (!$competition) {
$this->addFlash('error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
$competitionIsCalendarMode = $competition->getModo()->getId() === 1;
$competitionIsOfflineMode = $competition->getModo()->getId() === 2;
$incorrectCompetitionMode = $competitionIsCalendarMode || $competitionIsOfflineMode;
if ($incorrectCompetitionMode) {
$this->addFlash('error', "No es posible la inscripción Online en esta Competición");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
$competitionIsNotForTeams = $competition->getJugadores() <= 2;
if ($competitionIsNotForTeams) {
$this->addFlash('error', "Este torneo solo permite la inscripción de equipos");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
$dateNow = new \DateTime('now');
if ($competition->getEstado() == EnumEstadoCompeticion::ABIERTA) {
if ($competition->getInicio() != NULL) {
$inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U'));
if ($inscriptionPeriodClosed) {
$this->addFlash('error', "El plazo de inscripción online se abre el " . $competition->getInicio()->format("d/m/Y") . " a las " . $competition->getInicio()->format("H:i"));
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
} else {
$this->addFlash('error', "La competición aún no tiene plazo de inscripción");
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
} else {
if ($competition->getEstado() == EnumEstadoCompeticion::FINALIZADA) {
if (($competition->getInicio() != NULL) && ($competition->getFin() != NULL)) {
$inscriptionPeriodClosed = ($dateNow->format('Y-m-d') < $competition->getInicio()->format('Y-m-d')) || ($dateNow->format('Y-m-d') > $competition->getFin()->format('Y-m-d'));
if ($inscriptionPeriodClosed) {
$this->addFlash('error', "El plazo para la inscripción online finalizó el " . $competition->getFin()->format('d/m/Y') . " a las " . $competition->getFin()->format('H:i') . ". Consulte con su Club");
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
} else {
$this->addFlash('error', "No es posible la inscripción. La competición está '" . $competition->getEstado() . "'");
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
} else {
$this->addFlash('error', "No es posible la inscripción. La competición está '" . $competition->getEstado() . "'");
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
}
$totalInscribedWithCorrectStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
$noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
if ($noSlotsAvailable) {
$this->addFlash('error', "No hay más plazas disponibles");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
$slotsAvailableMorning = 0;
$slotsAvailableEvening = 0;
$slotsMorning = $competition->getPlazasManana();
$slotsEvening = $competition->getPlazasTarde();
if ($slotsMorning > 0 || $slotsEvening > 0) { //si tenemos inscripcion por turnos vemos donde hay hueco
$slotsAvailableMorning = $slotsMorning - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, true);
$slotsAvailableEvening = $slotsEvening - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, false);
}
$federationId = $competition->getClub()->getRfegId();
$federationClub = $this->manager->getConnection()
->prepare("SELECT c.id as codigo_club, f.id as codigo_federacion FROM Club c inner join club_federacion cf on c.id = cf.club_id inner join Federacion f on cf.federacion_id = f.id WHERE c.rfeg_id = " . $federationId)
->executeQuery()->fetchAllAssociative();
$federationClubCode = $federationClub[0] ? ($federationClub[0]["codigo_federacion"] ?? null) : null;
$form = $this->createForm(InscripcionEquipoType::class, null, array(
'attr' => array('jugadores' => $competition->getJugadores(), 'id' => "insc" . $id, 'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition, 'dispManana' => $slotsAvailableMorning, 'dispTarde' => $slotsAvailableEvening),
'action' => $this->generateUrl('competicion_guardainscrito_equipo', array('id' => $id)),
'method' => 'POST',
));
$validRates = $this->em->getRepository(Tarifa::class)->findTarifasValidasPorCompeticion($id);
$categories = $this->em->getRepository(Categoria::class)->findByCompeticion($id);
$rounds = $competition->getJornadas();
$miniature = file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
$hasProam = boolval($this->em->getRepository(Competicion::class)->hasJornadaProam($id));
return $this->render("frontend/Inscritos/new_equipo.html.twig", [
'form' => $form->createView(),
'competicion' => $competition,
'tarifas' => $validRates,
'categorias' => $categories,
'num_inscritos' => $totalInscribedWithCorrectStatus,
'jornadas' => $rounds,
'codigo_federacion' => $federationClubCode,
'hayMiniatura' => $miniature,
'esProam' => $hasProam,
'menu' => [], //en el infoalert hay un condicional para que se despliegue si no tiene 'menu' ni 'orden'. Habilitamos uno de los dos
'orden' => [] //Ya no los habilitamos porque queremos que salga abierto el informacion de interes. 16/07/2019
]);
}
/**
* F-049 Guardado de un inscrito individual
*
* @Route("/{id}/guardar-inscrito", name="competicion_guardainscrito")
*/
public function saveInscribed($id, Request $request, EnvioCorreo $mailer, NotificacionesService $notificator, EnvioSms $messaging, LoggerInterface $swgolfLogger, SoftwareExternoUtil $swutil, UtilJugadores $util_jugadores, IncludeInscribedOnWaitingList $includeInscribedOnWaitingList)
{
$competition = $this->em->getRepository(Competicion::class)->find($id);
if (!$competition) {
$this->addFlash(
'error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
$competitionIsCalendarMode = $competition->getModo()->getId() === 1;
$competitionIsOfflineMode = $competition->getModo()->getId() === 2;
$incorrectCompetitionMode = $competitionIsCalendarMode || $competitionIsOfflineMode;
$competitionStatusIsNotOpen = $competition->getEstado() != EnumEstadoCompeticion::ABIERTA;
if ($incorrectCompetitionMode && $competitionStatusIsNotOpen) {
$this->addFlash('error', "No es posible inscribirse online en esta competición o el plazo ha finalizado. Consulte con su Club");
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
$dateNow = new \DateTime('now');
if (($competition->getInicio() != NULL) && ($competition->getFin() != NULL)) {
$inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U')) || ($dateNow->format('U') > $competition->getFin()->format('U'));
if ($inscriptionPeriodClosed) {
$this->addFlash('error', "El plazo para la inscripción online está cerrado. Consulte con su Club");
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
}
$competitionIsNotIndividual = $competition->getJugadores() != 1;
if ($competitionIsNotIndividual) {
$this->addFlash('error', "Solo es posible la inscripción individual");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
$totalInscribedWithCorrectStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
$noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
if ($noSlotsAvailable) {
$totalInscribedWithWaitStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id, false, ['espera']);
$errorMessage = "No hay plazas disponibles en este momento.";
if ($totalInscribedWithWaitStatus > 0) {
$errorMessage .= " Hay $totalInscribedWithWaitStatus pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
}
$this->addFlash('error', $errorMessage);
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
$waitingListWithSlots = $competition->getListaEspera() && $competition->getPlazasListaEspera() > 0;
if ($waitingListWithSlots) {
$totalSlotsWaitingList = $this->em->getRepository(Inscrito::class)->getCountInscritosListaEspera($competition);
$waitingListFull = $totalSlotsWaitingList >= $competition->getPlazasListaEspera();
if ($waitingListFull) {
$this->addFlash('error', "La lista de espera esta completa en este momento");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
}
$slotsAvailableMorning = 0;
$slotsAvailableEvening = 0;
$slotsMorning = $competition->getPlazasManana();
$slotsEvening = $competition->getPlazasTarde();
if ($slotsMorning > 0 || $slotsEvening > 0) {
$slotsAvailableMorning = $slotsMorning - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, true);
$slotsAvailableEvening = $slotsEvening - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, false);
}
$playerId = $request->request->get('inscripcion_jugador')['id'];
if (empty($playerId)) {
$this->addFlash('error', "No se ha seleccionado un jugador");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
$player = $this->em->getRepository(Jugador::class)->find($playerId);
if (!$player) {
$this->addFlash('error', "No se ha seleccionado un jugador");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
$form = $this->createForm(InscripcionType::class, null, array(
'attr' => array('id' => "insc" . $id, 'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition, 'dispManana' => $slotsAvailableMorning, 'dispTarde' => $slotsAvailableEvening),
'method' => 'POST'
));
$form->handleRequest($request);
$secret = $this->getParameter('secret');
if ($form->isSubmitted() && $form->isValid()) {
$emptyEmailOrId = empty($form->get('email')->getData()) || empty($form->get('id')->getData());
if ($emptyEmailOrId) {
$this->addFlash('error', "Ni el jugador ni el email pueden ser vacíos");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
$categoryId = 0;
$existTeeFromForm = $form->has('barra') && !empty($form->get('barra')->getData());
$existCategoryFromForm = $form->has('categoria') && !empty($form->get('categoria')->getData());
if ($existTeeFromForm) {
$categoryId = $form->get('barra')->getData(); //No es la barra, es el ID de categoria de la barra que ha selecionado el jugador
} elseif ($existCategoryFromForm) {
$categoryId = $form->get('categoria')->getData(); //ID de categoria del jugador
}
$category = $this->em->getRepository(Categoria::class)->find($categoryId);
if (!$category) {
$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");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
$rateFromForm = $form->get('tarifa')->getData();
if (!$rateFromForm) {
$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");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
$shiftForm = 'mañana'; //por defecto
if ($form->has('turno')) { //si viene turno tomamos su valor
$shiftForm = $form->get('turno')->getData();
if (!empty($shiftForm)) {
if ($shiftForm == 'mañana') {
$slotsShift = $competition->getPlazasManana();
} else {
$slotsShift = $competition->getPlazasTarde();
}
$slotsAvailable = $slotsShift - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shiftForm == 'mañana'));
if ($slotsAvailable < 1) {
$this->addFlash('error', "No se ha podido completar la inscripción porque el turno seleccionado está lleno");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
} else {
$shiftForm = 'mañana'; //por defecto
}
}
$inscribed = new Inscrito();
$emailForm = $form->get('email')->getData();
$phoneForm = (!$form->has('telefono_jugador')) ? null : $form->get('telefono_jugador')->getData();
if (!empty($phoneForm)) {
$competitionClient = $competition->getOrganizador()->getCliente();
$playerPhone = $util_jugadores->getDatoPlanoDesdeJugador($player, "Telefono", $competitionClient);
if (empty($playerPhone)) {
$logMessage = "Cambio de teléfono del Jugador " . $player->getNombreCompleto() . " (" . $player->getLicencia() . ") en el método " . __METHOD__ . ", de " . ($playerPhone ?: "(vacio)") . " a " . $phoneForm;
$player = $util_jugadores->setDatoPlanoDesdeJugador($player, "Telefono", $phoneForm, false, $competitionClient);
$log = new Log('i', $logMessage, null);
$this->em->persist($log);
}
}
$observationsForm = $this->util->limpiar($form->get('observaciones')->getData(), false);
if (str_contains($competition->getOrganizador()->getId(), "AM")) { //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
$privacyOrganiser = "AM00";
} else {
$privacyOrganiser = $competition->getOrganizador()->getId();
}
$rgpd = $player->getPrivacidadSimple();
if (!isset($rgpd[$privacyOrganiser])) {
$playerPrivacy = new JugadorRGPD();
$playerPrivacy->setAceptacion($privacyOrganiser);
$playerPrivacy->setNewsletters(null);
$playerPrivacy->setJugador($player);
$playerPrivacy->setRgpd(true);
$playerPrivacy->setRgpdExtra($request->headers->get("user-agent"));
$playerPrivacy->setRgpdIP($request->getClientIp());
$playerPrivacy->setCliente($competition->getOrganizador()->getCliente());
$player->addPrivacidad($playerPrivacy);
}
$playerHasPlayAnyCompetition = $competition->getNumCompeticiones() != 0;
$incorrectNumberOfCompetitionsForConditions = $player->getNumCompeticiones() < $competition->getNumCompeticiones();
$incorrectStatusHcp = ($player->getEstadoHcp()) != 10 && ($player->getEstadoHcp() != 99);
$playerIsNotActive = !$player->getActivo();
$playerNotComplyWithCompetitionsConditions = ($playerHasPlayAnyCompetition && $incorrectNumberOfCompetitionsForConditions) || ($incorrectStatusHcp) || $playerIsNotActive;
if ($playerNotComplyWithCompetitionsConditions) {
$this->addFlash('error', "El jugador " . $player->getNombre() . " " . $player->getApellidos() . " (" . $player->getLicencia() . ") no cumple las condiciones de inscripción");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
$orderNumber = $this->em->getRepository(Pedido::class)->findLastPedido($competition->getId());
if (!is_null($orderNumber)) {
$orderNumber = substr($orderNumber['numero'], 10, 2);
$orderNumber++;
} else {
$orderNumber = 'AA';
}
//Inicializamos el pedido, pero no lo guardamos todavia, hace falta el inscrito
$inscribedOrder = new Pedido();
$inscribedOrder->setEmail($emailForm);
$inscribedOrder->setEmailCod($emailForm, $secret);
$inscribedOrder->setConcepto("ionline");
$amount = 0;
$applyRate = true;
$letter = "F";
$autorizedLicenseToCircuit = $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $player->getLicenciaCorta());
//Comprobamos si esta licencia pertenece a las licencias permitidas que no pagan, pero deben de ir por el flujo normal de inscripcion {NEX-1754}
if (count($autorizedLicenseToCircuit) > 0) {
$applyRate = false;
$letter = "V";
}
$inscribedOrder->setNumero($competition->getId() . $letter . $competition->getOrganizador()->getId() . $orderNumber);
$rate = $this->em->getRepository(Tarifa::class)->find($rateFromForm);
if ($applyRate) {
$amount = $rate->getImporte();
}
if ($form->has('voucher')) {
$voucherCodeForm = strtoupper($form['voucher']->getData());
if (!empty($voucherCodeForm)) {
$voucher = $this->em->getRepository(Voucher::class)->findOneBy(['codigo' => $voucherCodeForm]);
if (empty($voucher)) {
$this->addFlash('error', 'No existe ningún voucher con este código');
return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
} else {
$validVoucher = false;
$now = new \DateTime('now');
$validDate = ($voucher->getFechaInicio()->format('U') <= $now->format('U')) && ($now->format('U') <= $voucher->getFechaFin()->format('U'));
if (!$validDate) {
$this->addFlash('error', 'Ha expirado la fecha de validez del voucher');
return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
}
if (count($voucher->getCompeticiones()) == 0) {
$validVoucher = true;
} else {
foreach ($voucher->getCompeticiones() as $voucherCompetition) {
if ($voucherCompetition->getId() == $id) {
$validVoucher = true;
}
}
}
if ($validVoucher) {
$voucherAmount = $voucher->getCantidad();
switch ($voucher->getTipo()) {
//Fijo
case 1:
$amount -= $voucherAmount;
break;
//Porcentual
case 2:
$voucherAmount = $voucherAmount / 100;
$amount = $amount - ($amount * $voucherAmount);
}
$amount = max($amount, 0);
$inscribedOrder->setVoucher($voucher);
} else {
$this->addFlash('error', 'Este voucher no es válido para esta competición');
return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
}
}
}
}
$inscribedOrder->setImporte($amount);
$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)
$inscribedOrder->setTarifa2(null);
if (0 == $amount) {
$inscribedOrder->setEstado(EnumEstadoPedido::PAGADO);
} else {
$inscribedOrder->setEstado(EnumEstadoPedido::ESPERA);
}
$exclusionsList = array();
$exclusionsCompetitions = $this->em->getRepository(CompeticionesExcluyentes::class)->findByCompeticion($id);
foreach ($exclusionsCompetitions as $exclusionCompetition) {
$exclusionsList[] = $exclusionCompetition->getAgrupacion()->getId();
}
//Si no hay ninguna, continuamos
if (count($exclusionsList) > 0) {
//Buscamos si esta inscrito en alguna de las competiciones excluyentes, a partir del grupo.
$exclusionCompetitionsByPlayerLicense = $this->em->getRepository(CompeticionesExcluyentes::class)->findExcluyentesSimpleLicencia($player->getLicencia(), $exclusionsList, $id);
if (count($exclusionCompetitionsByPlayerLicense) > 0) {
$messageResponse = "<ul>";
foreach ($exclusionCompetitionsByPlayerLicense as $exc) {
$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>, ";
}
$messageResponse = substr($messageResponse, 0, -1) . "</ul>";
$this->addFlash('error', "El jugador " . $player->getNombre() . " " . $player->getApellidos() . " (" . $player->getLicencia() . ") está inscrito en alguna competición excluyente de ésta:" . $messageResponse);
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
}
$checkPlayerId = function ($playerId) {
return function ($key, Inscrito $inscribed) use ($playerId) {
return (($inscribed->getJugador()->getId() == $playerId) && ($inscribed->getEstado() == "pagado"));
};
};
if ($competition->getInscritos()->exists($checkPlayerId($player->getId()))) {
$this->addFlash('error', "El jugador " . $player->getNombre() . " " . $player->getApellidos() . " (" . $player->getLicencia() . ") ya está inscrito en la competición");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
if (str_starts_with($player->getLicencia(), PlayerLicense::FOREING_PREFIX)) {
$hcpDocumentForm = $form->get('documentoHcp')->getData();
if (!is_null($hcpDocumentForm)) {
$hcpNameReport = md5(rand() . "_" . uniqid('infHcp')) . ".pdf";
$hcpDocumentForm->move(__DIR__ . '/../../../../web/uploads/informesHcp', $hcpNameReport);
$documentInscribed = new InscritoDocumento();
$documentInscribed->setInscrito($inscribed);
$documentInscribed->setDocumento($hcpNameReport);
$documentInscribed->setTipo(1);
$inscribed->addDocumento($documentInscribed);
} else {
$this->addFlash('error', "Para jugadores extranjeros es necesario adjuntar el informe de handicap de su federación");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
}
$totalInscribedWithCorrectStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
$isWaitingList = (($totalInscribedWithCorrectStatus >= $competition->getPlazas()) && $competition->getListaEspera());
$inscribed->setCompeticion($competition);
$inscribed->setJugador($player);
$inscribed->setCategoria($category);
$inscribed->setCategoriaCondicion($category->getCategoriaCondicion());
$maximumTeamNumber = $this->em->getRepository(Inscrito::class)->findMaxEquipoInscrito($competition->getId());
$maximumTeamId = (!empty($maximumTeamNumber)) ? ($maximumTeamNumber + 1) : 1;
$maximumTeamId = (substr($competition->getOrganizador()->getId(), 0, -2) != "AM") ? 0 : $maximumTeamId;
$inscribed->setEquipo($maximumTeamId);
$inscribed->setPareja('0');
$inscribed->setParticipa($isWaitingList ? -1 : 1);
$inscribed->setNivel($player->getNivel());
$inscribed->setTipoInscripcion("frontend");
$inscribed->setNombreEquipo("");
$inscribed->setEstado($inscribedOrder->getEstado());
$inscribed->setObservaciones($observationsForm);
$inscribed->setValido(true);
$inscribed->setTarifa($rate);
$inscribed->setTurno($shiftForm);
$inscribed->setHcp($player->getHcp());
$inscribed = $includeInscribedOnWaitingList->__invoke($competition, $inscribed);
$this->em->persist($inscribed);
$this->em->flush();
//terminamos de montar y guardamos el Pedido
$breakdownOrder = "";
if ($competition->getOrganizador() != null) {
$breakdownOrder = $competition->getOrganizador()->getId() . "-";
}
$breakdownOrder .= $competition->getNombre() . ".<br />";
$breakdownOrder .= $inscribed->getJugador()->getLicencia() . " - ";
$breakdownOrder .= $inscribed->getCategoria()->getNombre() . ". ";
$inscribedOrder->setDesglose($breakdownOrder);
$this->em->persist($inscribedOrder);
//guardamos en inscrito su Pedido asociado despues de guardar éste
$inscribed->setPedido($inscribedOrder);
$additionalDataByCompetition = $competition->getAdicionales();
if ($additionalDataByCompetition) {
$dataForm = $request->request->all();
foreach ($additionalDataByCompetition as $additionalData) {
if (isset($dataForm["adicional" . $additionalData->getId()])) {
$additionalInscribed = new AdicionalesInscrito();
$additionalInscribed->setValor($dataForm["adicional" . $additionalData->getId()]);
$additionalInscribed->setInscrito($inscribed);
$additionalInscribed->setDato($additionalData);
$this->em->persist($additionalInscribed);
} else {
//si tipo "privacidad", lo guardo aunque sea no
if ("Privacidad" == $additionalData->getTipo()) {
$additionalInscribed = new AdicionalesInscrito();
$additionalInscribed->setValor("off");
$additionalInscribed->setInscrito($inscribed);
$additionalInscribed->setDato($additionalData);
$this->em->persist($additionalInscribed);
}
}
}
}
//Aprovechamos esta llamada para guardar en la BD el pedido, la actualización del inscrito y los datos adicionales
$this->em->flush();
// NO SE POR QUE ESTABA ESTO PUESTO
// if ($form->get('save')->isClicked()) {
//
// }
//$importe = $tar->getImporte();
//como ahora puede haber descuento habra que coger el importe del pedido 2022-12-07
$amount = $inscribedOrder->getImporte();
if (($amount == 0) || ($amount == 0.0)) {
$inscribedOrder->setPayedAt(new \DateTime('now')); //como son de tarifa cero, las marcamos como pagadas, ya que no hay que pagar nada
$this->em->flush();
//Preparación y envio del SMS
$playerPrivacy = $inscribed->getJugador()->getPrivacidadSimple();
$rgpd = false;
if (str_contains($competition->getOrganizador()->getId(), "AM")) { //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
if (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"]) {
$rgpd = true;
}
} else { //buscamos la privacidad del organizador
if ((isset($playerPrivacy[$competition->getOrganizador()->getId()]) && $playerPrivacy[$competition->getOrganizador()->getId()]) || (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"])) {
$rgpd = true;
}
}
$competitionClient = $competition->getOrganizador()->getCliente();
$phonePlayer = $util_jugadores->getDatoPlanoDesdeJugador($inscribed->getJugador(), "Telefono", $competitionClient);
if ($rgpd && !empty($phonePlayer)) {
$competitionShortUrl = $this->util->getShortUrl($competition);
if ($isWaitingList || $inscribed->getParticipa() == -1) {
$notificationText = "Está en lista de espera de " . substr($this->util->limpiar($competition->getNombre()), 0, 50) . ". Consulte lista de inscritos en " . $competitionShortUrl;
} else {
$notificationText = "Se ha inscrito correctamente en " . substr($this->util->limpiar($competition->getNombre()), 0, 45) . ". Puede consultar el listado de inscritos en " . $competitionShortUrl;
}
$userApp = $this->em->getRepository(UserApp::class)->findOneByTelefono($phonePlayer);
$sendForApi = $competitionClient?->getId() > 2;
$messaging->enviarSms($phonePlayer, $notificationText, $competition, 2, $sendForApi);
$argumentsToNotify = [];
$argumentsToNotify["title"] = "Nueva inscripción en torneo";
$argumentsToNotify["msg"] = $notificationText;
$argumentsToNotify["url"] = $competitionShortUrl;
$argumentsToNotify["destinatario"] = $userApp;
$argumentsToNotify["tipo"] = "new-inscription";
$argumentsToNotify["competicion"] = $competition->getId();
$notificator->enviarNotificacion($argumentsToNotify);
}
$logMessage = "Nueva inscripción online en Competición " . $competition->getNombre() . "(" . $id . "): " . $player->getLicencia() . "(" . $inscribedOrder->getNumero() . ")";
$log = new Log('i', $logMessage, null);
$this->em->persist($log);
$this->em->flush();
try {
$this->util->guardaCsvInscripciones($inscribed);
} catch (\Throwable $exception) {
//does nothing, continues execution
error_log($exception->getMessage());
}
$emailView = 'frontend/Inscritos/emailInscripcion.html.twig';
$argumentsToEmail = [
"to" => $emailForm,
"competicion" => $competition,
"subject" => '⛳ NEXTCADDY - Inscripción online [' . $inscribedOrder->getNumero() . ']',
"html" => $this->renderView($emailView, array('jugador' => $player,
'competicion' => $competition,
'inscrito' => $inscribed,
'barras' => $this->em->getRepository(JornadaConfig::class)->findByInscrito($inscribed),
'pedido' => $inscribedOrder,
'tarifa' => $rate,
'lista_espera' => $isWaitingList
))
];
$mailer->enviarCorreo($argumentsToEmail);
try {
$swbd = $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club", "cliente" => $competition->getOrganizador()->getCliente()]);
if ($swbd) {
$swutil->init($swbd);
$swutil->addClientToActivity($inscribed, $this->em, true);
}
} catch (\Throwable $exception) {
$swgolfLogger->error("Error en " . __FILE__ . "\n" . $exception->getMessage());
}
return $this->redirect($this->generateUrl('pago_terminado', array('token' => 'success', 'id' => $competition->getId(), 'idi' => $inscribed->getId())));
} else {
try {
$this->util->guardaCsvInscripciones($inscribed);
} catch (\Throwable $exception) {
error_log($exception->getMessage());
}
return $this->redirect($this->generateUrl('pago_intermedio', array('idi' => $inscribed->getId(), 'idp' => $inscribedOrder->getId())));
}
} else {
$competition = $this->em->getRepository(Competicion::class)->find($id);
if (!$competition) {
$this->addFlash('error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
$ratesByCompetition = $this->em->getRepository(Tarifa::class)->findByCompeticion($id);
$categoriesByCompetition = $this->em->getRepository(Categoria::class)->findByCompeticion($id);
$totalInscribedWithCorrectStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
//buscamos todas las jornadas, para asi poder poner el ASC aparte del rago de fechas involucrado
$roundsByCompetition = $this->em->getRepository(Jornada::class)->findBy(array("competicion" => $competition->getId()), array("orden" => "ASC"));
$miniature = file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
$countries = $this->em->getRepository(Pais::class)->findAll();
return $this->render("frontend/Inscritos/new_new.html.twig", [
'form' => $form->createView(),
'competicion' => $competition,
'tarifas' => $ratesByCompetition,
'paises' => $countries,
'jornadas' => $roundsByCompetition,
'categorias' => $categoriesByCompetition,
'num_inscritos' => $totalInscribedWithCorrectStatus,
'hayMiniatura' => $miniature
]);
}
}
/**
* F-050 Guardado de inscritos parejas
*
* @Route("/{id}/guardar-inscrito-pareja", name="competicion_guardainscrito_pareja")
*/
public function saveInscribedCouple($id, Request $request, EnvioCorreo $mailer, NotificacionesService $notificator, EnvioSms $messaging, LoggerInterface $logger, SoftwareExternoUtil $swutil, UtilJugadores $utilJugadores, UpdateInscribedToIncludeAtWaitingList $updateInscribedToIncludeAtWaitingList)
{
$competition = $this->em->getRepository(Competicion::class)->find($id);
if (!$competition) {
$this->addFlash(
'error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
if (($competition->getModo()->getId() < 3) && ($competition->getEstado() != "abierta")) {
$this->addFlash('error', "No es posible inscribirse online en esta competición o el plazo ha finalizado. Consulte con su Club");
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
if ($competition->getJugadores() != 2) {
$this->addFlash('error', "No es posible la inscripción de parejas en este torneo");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
$dateNow = new \DateTime('now');
if (!is_null($competition->getInicio()) && !is_null($competition->getFin()) != NULL) {
$inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U')) || ($dateNow->format('U') > $competition->getFin()->format('U'));
if ($inscriptionPeriodClosed) {
$this->addFlash('error', "El plazo para la inscripción online está cerrado. Consulte con su Club");
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
}
$totalInscribedWithCorrectStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($competition->getId());
$noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
if ($noSlotsAvailable) {
$totalInscribedWithWaitStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id, false, ['espera']);
$errorMessage = "No hay plazas disponibles en este momento.";
if ($totalInscribedWithWaitStatus > 0) {
$errorMessage .= " Hay $totalInscribedWithWaitStatus pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
}
$this->addFlash('error', $errorMessage);
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
$slotsAvailableMorning = 0;
$slotsAvailableEvening = 0;
$slotsMorning = $competition->getPlazasManana();
$slotsEvening = $competition->getPlazasTarde();
if ($slotsMorning > 0 || $slotsEvening > 0) { //si tenemos inscripcion por turnos vemos donde hay hueco
$slotsAvailableMorning = $slotsMorning - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, true);
$slotsAvailableEvening = $slotsEvening - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, false);
}
$form = $this->createForm(InscripcionParejaType::class, null, array(
'attr' => array(
'id' => "insc" . $id,
'org' => $competition->getOrganizador()->getId(),
'competicion' => $competition,
'dispManana' => $slotsAvailableMorning,
'dispTarde' => $slotsAvailableEvening
)
));
$form->handleRequest($request);
$shift = 'mañana';
if ($form->has('turno')) {
$shift = $form->get('turno')->getData();
if (!empty($shift)) {
if ($shift == 'mañana') {
$slotsShift = $competition->getPlazasManana();
} else {
$slotsShift = $competition->getPlazasTarde();
}
$slotsAvailable = $slotsShift - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shift == 'mañana'));
if ($slotsAvailable < 2) {
$this->addFlash('error', "No se ha podido completar la inscripción porque el turno seleccionado está lleno");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
} else {
$shift = 'mañana';
}
}
if (empty($form->get('id1')->getData()) || empty($form->get('id2')->getData())) {
$this->addFlash('error', "Ninguno de los jugadores puede ser vacío para una competición de parejas");
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
}
if ($form->get('id1')->getData() == $form->get('id2')->getData()) {
$this->addFlash('error', "Los jugadores tienen que ser distintos");
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
}
$ratePlayerOne = $form->get('tarifa1')->getData();
$ratePlayerTwo = $form->get('tarifa2')->getData();
if (!$ratePlayerOne || !$ratePlayerTwo) {
$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");
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
}
if ($form->get('email')->getData() == '') {
$this->addFlash('error', "El email no puede ser vacío");
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
}
if ($competition->getListaEspera() && $competition->getPlazasListaEspera() > 0) {
$totalSlotsWaitingList = $this->em->getRepository(Inscrito::class)->getCountInscritosListaEspera($competition);
$waitingListFull = $totalSlotsWaitingList >= $competition->getPlazasListaEspera();
if ($waitingListFull) {
$this->addFlash('error', "La lista de espera esta completa en este momento");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
}
$secret = $this->getParameter('secret');
if ($form->isSubmitted() && $form->isValid()) {
$hasScrambleOrProam = boolval($this->em->getRepository(Competicion::class)->hasJornadaScrambleOrProAM($id));
$inscribedOrder = new Pedido();
$playerList = [];
$rateList = [];
$maximumTeamNumber = 0;
if ($hasScrambleOrProam) {
$maximumCoupleNumber = 1;
} else {
$maximumCoupleNumber = 0;
}
$inscribedList = [];
$softwareGolfEntity = $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club", "cliente" => $competition->getOrganizador()->getCliente()]);
if ($softwareGolfEntity) {
$swutil->init($softwareGolfEntity);
}
$organiserClient = $competition->getOrganizador()->getCliente();
for ($counter = 1; $counter <= 2; $counter++) {
$playerIdForm = $form->get('id' . $counter)->getData();
$licenseForm = $form->get('licencia' . $counter)->getData();
//buscamos los objetos a partir del ID
$player = $this->em->getRepository(Jugador::class)->find($playerIdForm);
if (!$player) {
$player = new Jugador(__METHOD__);
} else {
//Arreglo para evitar las mayusculas
$player->setNombre($player->getNombre());
$player->setApellidos($player->getApellidos());
}
$phonePlayerForm = (!$form->has('telefono_jugador' . $counter)) ? null : $form->get('telefono_jugador' . $counter)->getData();
if (!empty($phonePlayerForm)) {
$phonePlayer = $utilJugadores->getDatoPlanoDesdeJugador($player, "Telefono", $organiserClient); //
if (empty($phonePlayer)) {
$logMessage = "Cambio de teléfono del Jugador " . $player->getNombreCompleto() . " (" . $player->getLicencia() . ") en el método " . __METHOD__ . ", de " . ($phonePlayer ?: "(vacio)") . " a " . $phonePlayerForm;
$player = $utilJugadores->setDatoPlanoDesdeJugador($player, "Telefono", $phonePlayerForm, false, $organiserClient);
$log = new Log('i', $logMessage, null);
$this->em->persist($log);
}
}
if (str_contains($competition->getOrganizador()->getId(), "AM")) {
$privi = "AM00";
} else {
$privi = $competition->getOrganizador()->getId();
}
$rgpd = $player->getPrivacidadSimple();
if (array_key_exists($privi, $rgpd) && !$rgpd[$privi]) {
$playerPrivacy = new JugadorRGPD();
$playerPrivacy->setAceptacion($privi);
$playerPrivacy->setNewsletters(null);
$playerPrivacy->setJugador($player);
$playerPrivacy->setRgpd(true);
$playerPrivacy->setRgpdExtra($request->headers->get("user-agent"));
$playerPrivacy->setRgpdIP($request->getClientIp());
$playerPrivacy->setCliente($competition->getOrganizador()->getCliente());
$player->addPrivacidad($playerPrivacy);
}
$playerHasPlayAnyCompetition = $competition->getNumCompeticiones() != 0;
$incorrectNumberOfCompetitionsForConditions = $player->getNumCompeticiones() < $competition->getNumCompeticiones();
$incorrectStatusHcp = ($player->getEstadoHcp()) != 10 && ($player->getEstadoHcp() != 99);
$playerIsNotActive = !$player->getActivo();
$playerNotComplyWithCompetitionsConditions = ($playerHasPlayAnyCompetition && $incorrectNumberOfCompetitionsForConditions) || ($incorrectStatusHcp) || $playerIsNotActive;
if ($playerNotComplyWithCompetitionsConditions) {
$this->addFlash('error', "El jugador " . $player->getNombre() . " " . $player->getApellidos() . " (" . $player->getLicencia() . ") no cumple las condiciones de inscripción");
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
}
//Buscamos si esta competicion pertenece a algun listado de excluyentes
$exclusionCompetitionsList = [];
$exclusionCompetitions = $this->em->getRepository(CompeticionesExcluyentes::class)->findByCompeticion($id);
foreach ($exclusionCompetitions as $exclusionCompetition) {
$exclusionCompetitionsList[] = $exclusionCompetition->getAgrupacion()->getId();
}
if (count($exclusionCompetitionsList) > 0) {
$exclusionCompetitionsByPlayerLicense = $this->em->getRepository(CompeticionesExcluyentes::class)->findExcluyentesSimpleLicencia($player->getLicencia(), $exclusionCompetitionsList, $id);
if (count($exclusionCompetitionsByPlayerLicense) > 0) {
$responseMessage = "<ul>";
foreach ($exclusionCompetitionsByPlayerLicense as $exclusionCompetition) {
$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>, ";
}
$responseMessage = substr($responseMessage, 0, -1) . "</ul>";
$this->addFlash('error', "El jugador " . $player->getNombre() . " " . $player->getApellidos() . " (" . $player->getLicencia() . ") está inscrito en alguna competición excluyente de ésta:" . $responseMessage);
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
}
}
$checkPlayerId = function ($playerId) {
return function ($key, Inscrito $inscrito) use ($playerId) {
return (($inscrito->getJugador()->getId() == $playerId) && ($inscrito->getEstado() == EnumEstadoInscrito::PAGADO));
};
};
if ($competition->getInscritos()->exists($checkPlayerId($player->getId()))) {
$this->addFlash('error', "El jugador " . $player->getNombre() . " " . $player->getApellidos() . " (" . $player->getLicencia() . ") ya está inscrito en la competición");
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
}
}
$validVoucher = false;
if ($form->has('voucher')) {
$voucherCode = $form['voucher']->getData();
if (!empty($voucherCode)) {
$voucher = $this->em->getRepository(Voucher::class)->findOneBy(['codigo' => $voucherCode]);
if (empty($voucher)) {
$this->addFlash('error', 'No existe ningún voucher con este código');
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
} else {
$now = new \DateTime('now');
$validDate = ($voucher->getFechaInicio()->format('U') <= $now->format('U')) && ($now->format('U') <= $voucher->getFechaFin()->format('U'));
if (!$validDate) {
$this->addFlash('error', 'Ha expirado la fecha de validez del voucher');
return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
}
if (count($voucher->getCompeticiones()) == 0) {
$validVoucher = true;
} else {
foreach ($voucher->getCompeticiones() as $comp) {
if ($comp->getId() == $id) {
$validVoucher = true;
}
}
}
if (!$validVoucher) {
$this->addFlash('error', 'Este voucher no es válido para esta competición');
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
}
}
}
}
$teamName = "";
$totalInscribedWithCorrectStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
$waitingList = (($totalInscribedWithCorrectStatus >= $competition->getPlazas()) && $competition->getListaEspera());
$inscribedData = [];
for ($counter = 1; $counter <= 2; $counter++) {
$inscribed = new Inscrito();
$categoryIdForm = $form->get('categoria' . $counter)->getData();
$existTeeFromForm = $form->has('barra' . $counter) && !empty($form->get('barra' . $counter)->getData());
if ($existTeeFromForm) {
$categoryIdForm = $form->get('barra' . $counter)->getData(); //No es la barra, es el ID de categoria de la barra que ha selecionado el jugador
}
$playerIdForm = $form->get('id' . $counter)->getData();
$licenseForm = $form->get('licencia' . $counter)->getData();
$rateForm = $form->get('tarifa' . $counter)->getData();
$emailForm = $form->get('email')->getData();
$observationsForm = $this->util->limpiar($form->get('observaciones')->getData(), false);
$player = $this->em->getRepository(Jugador::class)->find($playerIdForm);
$category = $this->em->getRepository(Categoria::class)->find($categoryIdForm);
if (!$category) {
$this->addFlash('error', "Ha ocurrido un error asignando la categoría al jugador " . $counter . ". Por favor, inténtelo de nuevo");
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
}
if (str_starts_with($player->getLicencia(), PlayerLicense::FOREING_PREFIX)) {
$uploadedFile = $form->get('documentoHcp' . $counter)->getData();
if (!is_null($uploadedFile)) {
$hcpNameReport = md5(rand() . "_" . uniqid('infHcp')) . ".pdf";
$uploadedFile->move(__DIR__ . '/../../../../web/uploads/informesHcp', $hcpNameReport);
$inscribedDocument = new InscritoDocumento();
$inscribedDocument->setInscrito($inscribed);
$inscribedDocument->setDocumento($hcpNameReport);
$inscribedDocument->setTipo(1);
$inscribed->addDocumento($inscribedDocument);
} else {
$this->addFlash('error', "Para jugadores extranjeros es necesario adjuntar el informe de handicap de su federación");
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', array('id' => $id)));
}
}
if ($counter == 1) {
$orderNumber = $this->em->getRepository(Pedido::class)->findLastPedido($competition->getId());
if (!is_null($orderNumber)) {
$orderNumber = substr($orderNumber['numero'], 10, 2);
$orderNumber++;
} else {
$orderNumber = 'AA';
}
$inscribedOrder->setEmail($emailForm);
$inscribedOrder->setEmailCod($emailForm, $secret);
$inscribedOrder->setConcepto("ionline");
$inscribedOrder->setNumero($orderNumber);
$amount = 0;
$applyRate = true;
$letter = "F";
$authorised = $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $player->getLicenciaCorta());
if (count($authorised) > 0) {
$applyRate = false;
$letter = "V";
}
$rate = $this->em->getRepository(Tarifa::class)->find($rateForm);
if ($applyRate) {
$amount = $rate->getImporte();
}
$inscribedOrder->setImporte($amount);
$inscribedOrder->setTarifa(($applyRate) ? $rate : null);
$inscribedOrder->setEstado($amount == 0 ? "pagado" : "espera");
} else {
$amount = 0;
$applyRate = true;
$authorised = $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $player->getLicenciaCorta());
//Comprobamos si esta licencia pertenece a las licencias permitidas que no pagan, pero deben de ir por el flujo normal de inscripcion {NEX-1754}
if (count($authorised) > 0) {
$applyRate = false;
$letter = "V";
}
//como ya tenemos el pedido, solamente actualizamos los campos necesarios
$rate = $this->em->getRepository(Tarifa::class)->find($rateForm);
if ($applyRate) {
$amount = $rate->getImporte();
}
//asignamos la segunda tarifa del segundo jugador
$inscribedOrder->setTarifa2(($applyRate) ? $rate : null);
$inscribedOrder->setImporte($inscribedOrder->getImporte() + $amount);
}
//terminamos de montar y guardamos el Pedido
$breakdownOrder = "";
if ($competition->getOrganizador() != null) {
$breakdownOrder = $competition->getOrganizador()->getId() . "-";
}
$breakdownOrder .= $competition->getNombre() . ".<br />";
$breakdownOrder .= $player->getLicencia() . " - ";
$breakdownOrder .= $category->getNombre() . ". ";
$inscribedOrder->setDesglose($breakdownOrder . ". " . $inscribedOrder->getDesglose());
if ($counter !== 1) {
if ($validVoucher) {
$voucherAmount = $voucher->getCantidad();
$amount = $inscribedOrder->getImporte();
switch ($voucher->getTipo()) {
//Fijo
case 1:
$amount -= $voucherAmount;
break;
//Porcentual
case 2:
$voucherAmount = $voucherAmount / 100;
$amount = $amount - ($amount * $voucherAmount);
}
//Controlamos que minimo sea 0
$amount = max($amount, 0);
$inscribedOrder->setImporte($amount);
$inscribedOrder->setVoucher($voucher);
}
}
$this->em->persist($inscribedOrder);
$inscribed->setCompeticion($competition);
$inscribed->setJugador($player);
$inscribed->setCategoria($category);
$inscribed->setCategoriaCondicion($category->getCategoriaCondicion());
if ($counter === 1) {
//Le asignamos un número de equipo, aun siendo individual. Para ello cogemos el último numero de equipo y lo incrementamos
$maximumTeamNumber = $this->em->getRepository(Inscrito::class)->findMaxEquipoInscrito($competition->getId());
$maximumTeamNumber = (!empty($maximumTeamNumber)) ? ($maximumTeamNumber + 1) : 1;
if (!$hasScrambleOrProam) {
$maximumCoupleNumber = $this->em->getRepository(Inscrito::class)->findMaxParejaInscrito($competition->getId()) + 1;
}
$team = new Equipo();
//Montamos el inscrito
$teamName = sprintf("Pareja %d", ((!$hasScrambleOrProam) ? $maximumCoupleNumber : $maximumTeamNumber));
$team->setNombre($teamName);
$team->setCompeticion($competition);
$team->setEquipo($maximumTeamNumber);
$this->em->persist($team);
//$this->em->flush();
$inscribed->setObservaciones($observationsForm); //Evitamos duplicar el comentario
}
$inscribed->setNombreEquipo($teamName);
$inscribed->setEquipoEntidad($team);
$inscribed->setEquipo($maximumTeamNumber);
$inscribed->setPareja($maximumCoupleNumber);
$inscribed->setParticipa($waitingList ? -1 : 1);
$inscribed->setNivel($player->getNivel());
$inscribed->setTipoInscripcion("frontend");
$inscribed->setEstado($inscribedOrder->getEstado());
$inscribed->setValido(true);
$inscribed->setTarifa($rate);
$inscribed->setTurno($shift);
$inscribed->setHcp($player->getHcp());
$inscribed->setPedido($inscribedOrder);
$inscribed->setTarifa($rate);
$inscribed->setOrderWaitingList(0);
$this->em->persist($inscribed);
$this->em->flush();
$inscribedData[$maximumTeamNumber]['licenses'][] = $inscribed->getJugador()->getLicencia();
$inscribedData[$maximumTeamNumber]['ids'][] = $inscribed->getId();
$additionalDataByCompetition = $competition->getAdicionales();
if ($additionalDataByCompetition) {
$dataForm = $request->request->all();
foreach ($additionalDataByCompetition as $additionalData) {
if (isset($dataForm["adicional" . $additionalData->getId() . "_" . $counter])) {
$additionalInscribed = new AdicionalesInscrito();
$additionalInscribed->setValor($dataForm["adicional" . $additionalData->getId() . "_" . $counter]);
$additionalInscribed->setInscrito($inscribed);
$additionalInscribed->setDato($additionalData);
$this->em->persist($additionalInscribed);
}
}
}
$playerList[] = $player;
$inscribedList[] = $inscribed;
$rateList[] = $rate;
//Log y control
$logMessage = "Nueva inscripción online en Competición " . $competition->getNombre() . "(" . $id . "): " . $player->getLicencia() . "(" . $inscribedOrder->getNumero() . ") en la categoria " . $category->getNombre();
$log = new Log('i', $logMessage, null);
$this->em->persist($log);
$this->em->flush();
try {
$this->util->guardaCsvInscripciones($inscribed);
} catch (\Throwable $ex) {
//does nothing, continues execution
error_log($ex->getMessage());
}
}
$inscribedOrder->setNumero($competition->getId() . $letter . $competition->getOrganizador()->getId() . $orderNumber);
$this->em->flush();
if ($competition->getRestringirLicencia() === EnumEstadoRestringirLicencias::PREFERENCIA) {
$updateInscribedToIncludeAtWaitingList->__invoke($competition, $inscribedData);
}
//puede que haya que modificar y poner el pedido en vez de la tarifa
if ($form->get('save')->isClicked()) {
$amount = $inscribedOrder->getImporte();
if (($amount == 0) || ($amount == 0.0)) {
//Apaño para poner todos los inscritos a pagado
foreach ($inscribedList as $inscribed) {
$inscribed->setEstado("pagado");
}
$inscribedOrder->setEstado("pagado");
$inscribedOrder->setPayedAt(new \DateTime('now')); //como son de tarifa cero, las marcamos como pagadas, ya que no hay que pagar nada
$this->em->flush();
//peparamos la URL bitly y el contenido del SMS
$competitionShortUrl = $this->util->getShortUrl($competition);
if ($waitingList || $inscribedList[0]->getParticipa() == -1) {
$textMessage = "Está en lista de espera de " . substr($this->util->limpiar($competition->getNombre()), 0, 50) . ". Consulte lista de inscritos en " . $competitionShortUrl;
} else {
$textMessage = "Se ha inscrito correctamente en " . substr($this->util->limpiar($competition->getNombre()), 0, 45) . ". Puede consultar el listado de inscritos en " . $competitionShortUrl;
}
$organiserClient = $competition->getOrganizador()->getCliente();
//le mandamos un SMS a cada miembro de la pareja
foreach ($inscribedList as $inscribed) {
$player = $inscribed->getjugador();
//Preparación y envio del SMS a cada uno de los jugadores
$playerPrivacy = $inscribed->getJugador()->getPrivacidadSimple();
$rgpd = false;
if (str_contains($competition->getOrganizador()->getId(), "AM")) { //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
if (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"]) {
$rgpd = true;
}
} else { //buscamos la privacidad del organizador
if ((isset($playerPrivacy[$competition->getOrganizador()->getId()]) && $playerPrivacy[$competition->getOrganizador()->getId()]) || (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"])) {
$rgpd = true;
}
}
$phonePlayer = $utilJugadores->getDatoPlanoDesdeJugador($player, "Telefono", $organiserClient);
if ($rgpd && !empty($phonePlayer)) {
$userApp = $this->em->getRepository(UserApp::class)->findOneByTelefono($phonePlayer);
$sendForApi = $organiserClient?->getId() > 2;
$messaging->enviarSms($phonePlayer, $textMessage, $competition, 2, $sendForApi);
$argumentsToNotify = [];
$argumentsToNotify["title"] = "Nueva inscripción en torneo";
$argumentsToNotify["msg"] = $textMessage;
$argumentsToNotify["url"] = $competitionShortUrl;
$argumentsToNotify["destinatario"] = $userApp;
$argumentsToNotify["tipo"] = "new-inscription";
$argumentsToNotify["competicion"] = $competition->getId();
$notificator->enviarNotificacion($argumentsToNotify);
}
$this->addFlash('success', 'El jugador ' . $player->getNombre() . ' ' . $player->getApellidos() . ' (' . $player->getLicencia() . ') '
. 'se ha inscrito con éxito, en la categoría ' . $inscribed->getCategoria()?->getNombre());
try {
if ($softwareGolfEntity) {
$swutil->addClientToActivity($inscribed, $this->em, true);
}
} catch (\Throwable $exception) {
$logger->error("Error en " . __FILE__ . "\n" . $exception->getMessage());
}
}
$vista = 'frontend/Inscritos/emailInscripcionPareja.html.twig';
$argumentsToEmail = [
"to" => $emailForm,
"competicion" => $competition,
"subject" => '⛳ NEXTCADDY - Inscripción online [' . $inscribedOrder->getNumero() . ']',
"html" => $this->renderView($vista, array('jugadores' => $playerList,
'inscritos' => $inscribedList,
'competicion' => $competition,
'pedido' => $inscribedOrder,
'tarifas' => $rateList,
'lista_espera' => $waitingList
))
];
//EnvioCorreo::enviarCorreo($args);
$mailer->enviarCorreo($argumentsToEmail);
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
} else {
return $this->redirect($this->generateUrl('pago_intermedio', array('idi' => $inscribed->getId(), 'idp' => $inscribedOrder->getId())));
}
}
} else {
$competition = $this->em->getRepository(Competicion::class)->find($id);
if (!$competition) {
$this->addFlash('error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
$rateList = $this->em->getRepository(Tarifa::class)->findByCompeticion($id);
$categories = $this->em->getRepository(Categoria::class)->findByCompeticion($id);
$rounds = $this->em->getRepository(Jornada::class)->findBy(array("competicion" => $id), array("orden" => "ASC"));
$totalInscribedWithCorrectStatus = count($this->em->getRepository(Inscrito::class)->getInscritosActivos($id));
$miniature = file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
return $this->render("frontend/Inscritos/new_pareja_new.html.twig", [
'form' => $form->createView(),
'competicion' => $competition,
//'data' => $data,
'tarifas' => $rateList,
'categorias' => $categories,
'jornadas' => $rounds,
'hayMiniatura' => $miniature,
'num_inscritos' => $totalInscribedWithCorrectStatus
]);
}
}
/**
* F-051 Guardado de inscritos equipos
*
* @Route("/{id}/guardar-inscrito-equipo", name="competicion_guardainscrito_equipo")
*/
public function saveInscribedTeam($id, Request $request, EnvioCorreo $mailer, NotificacionesService $notificator, EnvioSms $messaging, LoggerInterface $swgolfLogger, SoftwareExternoUtil $swutil, UtilJugadores $utilJugadores, UpdateInscribedToIncludeAtWaitingList $updateInscribedToIncludeAtWaitingList)
{
$dateNow = new \DateTime('now');
$competition = $this->em->getRepository(Competicion::class)->find($id);
if (!$competition) {
$this->addFlash('error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
$competitionIsCalendarMode = $competition->getModo()->getId() === 1;
$competitionIsOfflineMode = $competition->getModo()->getId() === 2;
$incorrectCompetitionMode = $competitionIsCalendarMode || $competitionIsOfflineMode;
if ($incorrectCompetitionMode && ($competition->getEstado() != EnumEstadoCompeticion::ABIERTA)) {
$this->addFlash('error', "No es posible inscribirse online en esta competición o el plazo ha finalizado. Consulte con su Club");
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
$competitionIsNotForTeams = $competition->getJugadores() <= 2;
if ($competitionIsNotForTeams) {
$this->addFlash('error', "No se admite la inscripción de equipos en este torneo");
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
if (($competition->getInicio() != NULL) && ($competition->getFin() != NULL)) {
$inscriptionPeriodClosed = ($dateNow->format('U') < $competition->getInicio()->format('U')) || ($dateNow->format('U') > $competition->getFin()->format('U'));
if ($inscriptionPeriodClosed) {
$this->addFlash('error', "El plazo para la inscripción online está cerrado. Consulte con su Club");
return $this->redirect($this->generateUrl('_club', array('id' => $competition->getClub()->getId())));
}
}
$totalInscribedWithCorrectStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
$noSlotsAvailable = !$competition->getListaEspera() && (($competition->getPlazas() - $totalInscribedWithCorrectStatus) <= 0);
if ($noSlotsAvailable) {
$totalInscribedAtWaitingList = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id, false, ['espera']);
$errorMessage = "No hay plazas disponibles en este momento.";
if ($totalInscribedAtWaitingList > 0) {
$errorMessage .= " Hay $totalInscribedAtWaitingList pagos en curso, es posible que alguno no se complete y se libere la plaza en unos minutos.";
}
$this->addFlash('error', $errorMessage);
return $this->redirect($this->generateUrl('_tournament', array('id' => $competition->getId())));
}
$slotsAvailableMorning = 0;
$slotsAvailableEvening = 0;
$slotsMorning = $competition->getPlazasManana();
$slotsEvening = $competition->getPlazasTarde();
if ($slotsMorning > 0 || $slotsEvening > 0) { //si tenemos inscripcion por turnos vemos donde hay hueco
$slotsAvailableMorning = $slotsMorning - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, true);
$slotsAvailableEvening = $slotsEvening - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, false);
}
$form = $this->createForm(InscripcionEquipoType::class, null, array(
'attr' => array('jugadores' => $competition->getJugadores(), 'id' => "insc" . $id, 'org' => $competition->getOrganizador()->getId(), 'competicion' => $competition, 'dispManana' => $slotsAvailableMorning, 'dispTarde' => $slotsAvailableEvening),
'action' => $this->generateUrl('competicion_guardainscrito_equipo', array('id' => $id)),
'method' => 'POST',
));
$form->handleRequest($request);
$shift = 'mañana'; //por defecto
if ($form->has('turno')) { //si viene el campo "turno" tomamos su valor
$shift = $form->get('turno')->getData();
if (!empty($shift)) {
if ($shift == 'mañana') {
$slotsShift = $competition->getPlazasManana();
} else {
$slotsShift = $competition->getPlazasTarde();
}
//comprobamos que hay hueco para la nueva inscripcion en dicho turno
$slotsAvailable = $slotsShift - $this->em->getRepository(Inscrito::class)->getPlazasOcupadasTurno($id, ($shift == 'mañana'));
if ($slotsAvailable < $competition->getJugadores()) { //como es equipos, queremos que haya al menos numJugadoresPorEquipo plazas
$this->addFlash(
'error', "No se ha podido completar la inscripción porque el turno seleccionado está lleno");
return $this->redirect($this->generateUrl('competicion_inscritos_new', array('id' => $id)));
}
} else {
$shift = 'mañana'; //por defecto
}
}
$playerIdsList = [];
for ($i = 1; $i <= $competition->getJugadores(); $i++) {
$playerIdForm = $form->get("id$i")->getData();
if ($i == $competition->getJugadores() && !$competition->getEstricto() && !$playerIdForm) {
continue;
}
if (!$form->get("categoria$i")->getData()) {
$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");
return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
}
if (!$form->get("tarifa$i")->getData()) {
$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");
return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
}
if (!$playerIdForm) {
$this->addFlash('error', "Ninguno de los jugadores puede ser vacío para una competición de parejas");
return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
}
$playerIdsList[] = $playerIdForm;
}
//Array_unique quita duplicados en un array, si tenemos menos ID que numero de jugadores, alguno era el mismo.
$incorrectNumberOfPlayerByTeam = ($competition->getEstricto() && count(array_unique($playerIdsList)) < $competition->getJugadores()) || (!$competition->getEstricto() && (count(array_unique($playerIdsList)) < ($competition->getJugadores() - 1)));
if ($incorrectNumberOfPlayerByTeam) {
$this->addFlash('error', "Los jugadores tienen que ser distintos");
return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
}
if ($form->get('email')->getData() == '') {
$this->addFlash('error', "El email no puede ser vacío");
return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
}
$secret = $this->getParameter('secret');
if ($form->isSubmitted() && $form->isValid()) {
$hasScrambleOrProam = boolval($this->em->getRepository(Competicion::class)->hasJornadaScrambleOrProAM($id));
$teamName = $form->get('teamname')->getData();
$inscriptionOrder = new Pedido();
$inscribedList = [];
$playerList = [];
$rateList = [];
$softwareGolfRelated = $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club", "cliente" => $competition->getOrganizador()->getCliente()]);
if ($softwareGolfRelated) {
$software = $softwareGolfRelated->getExternalClass();
if (strtolower($software) == "golfmanager") {
$swutil->init($softwareGolfRelated);
}
}
$competitionOrganiserClient = $competition->getOrganizador()->getCliente();
for ($playerCount = 1; $playerCount <= count($playerIdsList); $playerCount++) {
$playerIdForm = $form->get('id' . $playerCount)->getData();
$licenseForm = $form->get('licencia' . $playerCount)->getData();
$playerByIdForm = $this->em->getRepository(Jugador::class)->find($playerIdForm);
if (!$playerByIdForm) {
$playerByIdForm = new Jugador(__METHOD__);
} else {
$playerByIdForm->setNombre($playerByIdForm->getNombre());
$playerByIdForm->setApellidos($playerByIdForm->getApellidos());
}
$phonePlayerForm = (!$form->has('telefono_jugador' . $playerCount)) ? null : $form->get('telefono_jugador' . $playerCount)->getData();
if (!empty($phonePlayerForm)) {
$phonePlayer = $utilJugadores->getDatoPlanoDesdeJugador($playerByIdForm, "Telefono", $competitionOrganiserClient); //
if (empty($phonePlayer)) {
$logMessage = "Cambio de teléfono del Jugador " . $playerByIdForm->getNombreCompleto() . " (" . $playerByIdForm->getLicencia() . ") en el método " . __METHOD__ . ", de " . ($phonePlayer ?: "(vacio)") . " a " . $phonePlayerForm;
$playerByIdForm = $utilJugadores->setDatoPlanoDesdeJugador($playerByIdForm, "Telefono", $phonePlayerForm, false, $competitionOrganiserClient);
$log = new Log('i', $logMessage, null);
$this->em->persist($log);
}
}
if (str_contains($competition->getOrganizador()->getId(), "AM")) { //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
$privi = "AM00";
} else {
$privi = $competition->getOrganizador()->getId();
}
$rgpd = $playerByIdForm->getPrivacidadSimple();
if (array_key_exists($privi, $rgpd) && !$rgpd[$privi]) {
$playerPrivacy = new JugadorRGPD();
$playerPrivacy->setAceptacion($privi);
$playerPrivacy->setNewsletters(null);
$playerPrivacy->setJugador($playerByIdForm);
$playerPrivacy->setRgpd(true);
$playerPrivacy->setRgpdExtra($request->headers->get("user-agent"));
$playerPrivacy->setRgpdIP($request->getClientIp());
$playerPrivacy->setCliente($competition->getOrganizador()->getCliente());
$playerByIdForm->addPrivacidad($playerPrivacy);
}
$playerHasPlayAnyCompetition = $competition->getNumCompeticiones() != 0;
$incorrectNumberOfCompetitionsForConditions = $playerByIdForm->getNumCompeticiones() < $competition->getNumCompeticiones();
$incorrectStatusHcp = ($playerByIdForm->getEstadoHcp()) != 10 && ($playerByIdForm->getEstadoHcp() != 99);
$playerIsNotActive = !$playerByIdForm->getActivo();
$playerNotComplyWithCompetitionsConditions = ($playerHasPlayAnyCompetition && $incorrectNumberOfCompetitionsForConditions) || ($incorrectStatusHcp) || $playerIsNotActive;
if ($playerNotComplyWithCompetitionsConditions) {
$this->addFlash('error', "El jugador " . $playerByIdForm->getNombre() . " " . $playerByIdForm->getApellidos() . " (" . $playerByIdForm->getLicencia() . ") no cumple las condiciones de inscripción");
return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
}
$exclusionCompetitionsList = [];
$exclusionCompetitions = $this->em->getRepository(CompeticionesExcluyentes::class)->findByCompeticion($id);
foreach ($exclusionCompetitions as $exclusionCompetition) {
$exclusionCompetitionsList[] = $exclusionCompetition->getAgrupacion()->getId();
}
if (count($exclusionCompetitionsList) > 0) {
$exclusionCompetitionsByPlayerLicense = $this->em->getRepository(CompeticionesExcluyentes::class)->findExcluyentesSimpleLicencia($playerByIdForm->getLicencia(), $exclusionCompetitionsList, $id);
if (count($exclusionCompetitionsByPlayerLicense) > 0) {
$responseMessage = "<ul>";
foreach ($exclusionCompetitionsByPlayerLicense as $exclusionCompetition) {
$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>, ";
}
$responseMessage = substr($responseMessage, 0, -1) . "</ul>";
$this->addFlash('error', "El jugador " . $playerByIdForm->getNombre() . " " . $playerByIdForm->getApellidos() . " (" . $playerByIdForm->getLicencia() . ") está inscrito en alguna competición excluyente de ésta:" . $responseMessage);
return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
}
}
$checkPlayerId = function ($playerId) {
return function ($key, Inscrito $inscribed) use ($playerId) {
return (($inscribed->getJugador()->getId() == $playerId) && ($inscribed->getEstado() == "pagado"));
};
};
if ($competition->getInscritos()->exists($checkPlayerId($playerByIdForm->getId()))) {
$this->addFlash('error', "El jugador " . $playerByIdForm->getNombre() . " " . $playerByIdForm->getApellidos() . " (" . $playerByIdForm->getLicencia() . ") ya está inscrito en la competición");
return $this->redirect($this->generateUrl('competicion_inscritos_equipo_new', array('id' => $id)));
}
}
//COMPROBACION VOUCHER
$validVoucher = false;
if ($form->has('voucher')) {
$voucherCode = $form['voucher']->getData();
if (!empty($voucherCode)) {
$voucher = $this->em->getRepository(Voucher::class)->findOneBy(['codigo' => $voucherCode]);
if (empty($voucher)) {
$this->addFlash('error', 'No existe ningún voucher con este código');
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
} else {
$now = new \DateTime('now');
$validDate = ($voucher->getFechaInicio()->format('U') <= $now->format('U')) && ($now->format('U') <= $voucher->getFechaFin()->format('U'));
if (!$validDate) {
$this->addFlash('error', 'Ha expirado la fecha de validez del voucher');
return $this->redirect($this->generateUrl('competicion_inscritos_new', ['id' => $id]));
}
if (count($voucher->getCompeticiones()) == 0) {
$validVoucher = true;
} else {
foreach ($voucher->getCompeticiones() as $comp) {
if ($comp->getId() == $id) {
$validVoucher = true;
}
}
}
if (!$validVoucher) {
$this->addFlash('error', 'Este voucher no es válido para esta competición');
return $this->redirect($this->generateUrl('competicion_inscritos_pareja_new', ['id' => $id]));
}
}
}
}
$letter = "F";
$totalInscribedWithCorrectStatus = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($id);
$waitingList = (($totalInscribedWithCorrectStatus >= $competition->getPlazas()) && $competition->getListaEspera());
if ($hasScrambleOrProam) {
$coupleNumber = 1;
} else {
$coupleNumber = 0;
}
$inscribedData = [];
for ($playerCounter = 1; $playerCounter <= count($playerIdsList); $playerCounter++) {
$playerIdForm = $form->get('id' . $playerCounter)->getData();
$licenseForm = $form->get('licencia' . $playerCounter)->getData();
$rateForm = $form->get('tarifa' . $playerCounter)->getData();
$emailForm = $form->get('email')->getData();
$observationsForm = $this->util->limpiar($form->get('observaciones')->getData(), false);
$categoryIdForm = $form->get('categoria' . $playerCounter)->getData();
if ($form->has('barra' . $playerCounter) && !empty($form->get('barra' . $playerCounter)->getData())) {
$categoryIdForm = $form->get('barra' . $playerCounter)->getData(); //No es la barra, es el ID de categoria de la barra que ha selecionado el jugador
}
//Al haber pasado por el for anterior el jugador está seguro si ha llegado a este punto
$playerByIdForm = $this->em->getRepository(Jugador::class)->find($playerIdForm);
$category = $this->em->getRepository(Categoria::class)->find($categoryIdForm);
if ($playerCounter == 1) {
$orderNumber = $this->em->getRepository(Pedido::class)->findLastPedido($competition->getId());
if (!is_null($orderNumber)) {
$orderNumber = substr($orderNumber['numero'], 10, 2);
$orderNumber++;
} else {
$orderNumber = 'AA';
}
//inicializamos el pedido
$inscriptionOrder->setEmail($emailForm);
$inscriptionOrder->setEmailCod($emailForm, $secret);
$inscriptionOrder->setConcepto("ionline");
$inscriptionOrder->setnumero($orderNumber); //Ponemos algo para que no este vacio, pero se pone el numero correcto mas adelante
$amount = 0;
$applyRate = true;
$letter = "F";
$authorized = $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $playerByIdForm->getLicenciaCorta());
if (count($authorized) > 0) {
$applyRate = false;
$letter = "V";
}
$rate = $this->em->getRepository(Tarifa::class)->find($rateForm);
if ($applyRate) {
$amount = $rate->getImporte();
}
$inscriptionOrder->setImporte($amount);
$inscriptionOrder->setTarifa(($applyRate) ? $rate : null);
if ($amount == 0) {
$inscriptionOrder->setEstado("pagado");
} else {
$inscriptionOrder->setEstado("espera");
}
} else {
$amount = 0;
$applyRate = true;
$authorized = $this->em->getRepository(AutorizadasCircuito::class)->getLicenciaAutorizadaCompeticion($competition->getId(), $playerByIdForm->getLicenciaCorta());
//Comprobamos si esta licencia pertenece a las licencias permitidas que no pagan, pero deben de ir por el flujo normal de inscripcion {NEX-1754}
if (count($authorized) > 0) {
$applyRate = false;
$letter = "V";
}
//como ya tenemos el pedido, solamente actualizamos los campos necesarios
if ($applyRate) {
$rate = $this->em->getRepository(Tarifa::class)->find($rateForm);
$amount = $rate->getImporte();
}
//asignamos la segunda tarifa del segundo jugador
//$pedido->setTarifa2(($aplicarTarifa) ? $tar : null); //En equipos vamos a tener la misma tarifa por cada miembro de momento
$inscriptionOrder->setImporte($inscriptionOrder->getImporte() + $amount);
}
//terminamos de montar y guardamos el Pedido
$breakdownOrder = "";
if ($competition->getOrganizador() != null) {
$breakdownOrder = $competition->getOrganizador()->getId() . "-";
}
$breakdownOrder .= $competition->getNombre() . ".<br />";
$breakdownOrder .= $playerByIdForm->getLicencia() . " - ";
$breakdownOrder .= $category->getNombre() . ".";
//Actualizamos el desglose con los datos del primer jugador tambien
$inscriptionOrder->setDesglose($breakdownOrder . " " . $inscriptionOrder->getDesglose());
//en el ultimo jugador miramos el voucher
if ($playerCounter == count($playerIdsList)) {
if ($validVoucher) {
$voucherAmount = $voucher->getCantidad();
$amount = $inscriptionOrder->getImporte();
switch ($voucher->getTipo()) {
//Fijo
case 1:
$amount -= $voucherAmount;
break;
//Porcentual
case 2:
$voucherAmount = $voucherAmount / 100;
$amount = $amount - ($amount * $voucherAmount);
}
//Controlamos que minimo sea 0
$amount = max($amount, 0);
$inscriptionOrder->setImporte($amount);
$inscriptionOrder->setVoucher($voucher);
}
}
$this->em->persist($inscriptionOrder);
//Montamos el inscrito
$inscribed = new Inscrito();
$inscribed->setCompeticion($competition);
$inscribed->setJugador($playerByIdForm);
$inscribed->setCategoria($category);
$inscribed->setCategoriaCondicion($category->getCategoriaCondicion());
if ($playerCounter == 1) {
//Le asignamos un numero de equipo, aun siendo individual. Para ello cogemos el último numero de equipo y lo incrementamos
$maximumTeamNumberAtCompetition = $this->em->getRepository(Inscrito::class)->findMaxEquipoInscrito($competition->getId());
$maximumTeamNumber = (!empty($maximumTeamNumberAtCompetition)) ? ($maximumTeamNumberAtCompetition + 1) : 1;
$team = new Equipo();
$team->setCompeticion($competition);
$team->setEquipo($maximumTeamNumber);
if (!$teamName || strlen($teamName) < 2) {
$teamName = "Equipo $maximumTeamNumber";
}
$team->setNombre($teamName);
$this->em->persist($team);
$inscribed->setObservaciones($observationsForm);
}
if (($playerCounter % 2 != 0) && !$hasScrambleOrProam) {//Empieza en 0, y X empieza en 1 por lo tanto empezamos por pareja 1 y sumando cada impar.
$coupleNumber++;
}
$inscribed->setPareja($coupleNumber);
$inscribed->setEquipoEntidad($team);
$inscribed->setEquipo($maximumTeamNumber);
$inscribed->setParticipa($waitingList ? -1 : 1);
$inscribed->setNivel($playerByIdForm->getNivel());
$inscribed->setTipoInscripcion("frontend");
$inscribed->setNombreEquipo($teamName);
$inscribed->setEstado($inscriptionOrder->getEstado());
$inscribed->setValido(true);
$inscribed->setTurno($shift);
$inscribed->setTarifa($rate);
$inscribed->setHcp($playerByIdForm->getHcp());
$inscribed->setOrderWaitingList(0);
$inscribed->setPedido($inscriptionOrder);
$this->em->persist($inscribed);
$this->em->flush();
$inscribedData[$maximumTeamNumber]['licenses'][] = $inscribed->getJugador()->getLicencia();
$inscribedData[$maximumTeamNumber]['ids'][] = $inscribed->getId();
$additionalDataByCompetition = $competition->getAdicionales();
if ($additionalDataByCompetition) {
$dataForm = $request->request->all();
foreach ($additionalDataByCompetition as $additionalData) {
if (isset($dataForm["adicional" . $additionalData->getId() . "_" . $playerCounter])) {
$additionalInscribed = new AdicionalesInscrito();
$additionalInscribed->setValor($dataForm["adicional" . $additionalData->getId() . "_" . $playerCounter]);
$additionalInscribed->setInscrito($inscribed);
$additionalInscribed->setDato($additionalData);
$this->em->persist($additionalInscribed);
}
}
}
$inscribedList[] = $inscribed;
$playerList[] = $playerByIdForm;
$rateList[] = $rate;
$this->addFlash('success', 'El jugador ' . $playerByIdForm->getNombre() . ' ' . $playerByIdForm->getApellidos() . ' (' . $playerByIdForm->getLicencia() . ') ' . 'se ha inscrito con éxito, en la categoría ' . $category->getNombre());
//Log y control
$logMessage = "Nueva inscripción online en Competición " . $competition->getNombre() . "(" . $id . "): " . $playerByIdForm->getLicencia() . "(" . $inscriptionOrder->getNumero() . ")";
$log = new Log('i', $logMessage, null);
$this->em->persist($log);
//$this->em->flush();
try {
$this->util->guardaCsvInscripciones($inscribed);
} catch (\Throwable $exception) {
//does nothing, continues execution
error_log($exception->getMessage());
}
}
$inscriptionOrder->setNumero($competition->getId() . $letter . $competition->getOrganizador()->getId() . $orderNumber);
$this->em->flush();
if ($competition->getRestringirLicencia() === EnumEstadoRestringirLicencias::PREFERENCIA) {
$updateInscribedToIncludeAtWaitingList->__invoke($competition, $inscribedData);
}
//puede que haya que modificar y poner el pedido en vez de la tarifa
if ($form->get('save')->isClicked()) {
$amount = $inscriptionOrder->getImporte();
if (($amount == 0) || ($amount == 0.0)) {
//Apaño para poner todos los inscritos a pagado
if ($validVoucher) {
foreach ($inscribedList as $inscribed) {
$inscribed->setEstado("pagado");
}
}
$inscriptionOrder->setEstado("pagado");
$inscriptionOrder->setPayedAt(new \DateTime('now')); //como son de tarifa cero, las marcamos como pagadas, ya que no hay que pagar nada
$this->em->flush();
//peparamos la URL bitly y el contenido del SMS
$competitionShortUrl = $this->util->getShortUrl($competition);
if ($waitingList || $inscribedList[0]->getParticipa() == -1) {
$responseText = "Está en lista de espera de " . substr($this->util->limpiar($competition->getNombre()), 0, 50) . ". Consulte lista de inscritos en " . $competitionShortUrl;
} else {
$responseText = "Se ha inscrito correctamente en " . substr($this->util->limpiar($competition->getNombre()), 0, 45) . ". Puede consultar el listado de inscritos en " . $competitionShortUrl;
}
$competitionOrganiserClient = $competition->getOrganizador()->getCliente();
foreach ($playerList as $playerByIdForm) {
$playerPrivacy = $inscribed->getJugador()->getPrivacidadSimple();
$rgpd = false;
if (str_contains($competition->getOrganizador()->getId(), "AM")) { //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
if (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"]) {
$rgpd = true;
}
} else { //buscamos la privacidad del organizador
if ((isset($playerPrivacy[$competition->getOrganizador()->getId()]) && $playerPrivacy[$competition->getOrganizador()->getId()]) || (isset($playerPrivacy["AM00"]) && $playerPrivacy["AM00"])) {
$rgpd = true;
}
}
$playerInscribedPhone = $utilJugadores->getDatoPlanoDesdeJugador($playerByIdForm, "Telefono", $competitionOrganiserClient);
if ($rgpd && !empty($playerInscribedPhone)) {
$userApp = $this->em->getRepository(UserApp::class)->findOneByTelefono($playerInscribedPhone);
$sendForApi = $competitionOrganiserClient?->getId() > 2;
$messaging->enviarSms($playerInscribedPhone, $responseText, $competition, 2, $sendForApi);
$argumentsToNotify = [];
$argumentsToNotify["title"] = "Nueva inscripción en torneo";
$argumentsToNotify["msg"] = $responseText;
$argumentsToNotify["url"] = $competitionShortUrl;
$argumentsToNotify["destinatario"] = $userApp;
$argumentsToNotify["tipo"] = "new-inscription";
$argumentsToNotify["competicion"] = $competition->getId();
$notificator->enviarNotificacion($argumentsToNotify);
}
try {
if ($softwareGolfRelated) {
$swutil->addClientToActivity($inscribed, $this->em, true);
}
} catch (\Throwable $ex) {
$swgolfLogger->error("Error en " . __FILE__ . "\n" . $ex->getMessage());
}
}
$emailView = 'frontend/Inscritos/emailInscripcionPareja.html.twig';
$argumentsToEmail = [
"to" => $emailForm,
"competicion" => $competition,
"subject" => '⛳ NEXTCADDY - Inscripción online [' . $inscriptionOrder->getNumero() . ']',
"html" => $this->renderView($emailView, array('jugadores' => $playerList,
'competicion' => $competition,
'inscritos' => $inscribedList,
'pedido' => $inscriptionOrder,
'tarifas' => $rateList,
'lista_espera' => $waitingList
))
];
$mailer->enviarCorreo($argumentsToEmail);
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
} else {
return $this->redirect($this->generateUrl('pago_intermedio', array('idi' => $inscribed->getId(), 'idp' => $inscriptionOrder->getId())));
}
}
} else {
$competition = $this->em->getRepository(Competicion::class)->find($id);
if (!$competition) {
$this->addFlash('error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
$rateList = $this->em->getRepository(Tarifa::class)->findByCompeticion($id);
$categories = $this->em->getRepository(Categoria::class)->findByCompeticion($id);
$rounds = $this->em->getRepository(Jornada::class)->findBy(array("competicion" => $id), array("orden" => "ASC"));
$totalInscribedWithCorrectStatus = count($this->em->getRepository(Inscrito::class)->getInscritosActivos($id));
$miniature = file_exists(substr($competition->getAbsolutePath("cartel"), 0, -3) . "png");
return $this->render("frontend/Inscritos/new_equipo.html.twig", [
'form' => $form->createView(),
'competicion' => $competition,
//'data' => $data,
'tarifas' => $rateList,
'categorias' => $categories,
'jornadas' => $rounds,
'hayMiniatura' => $miniature,
'num_inscritos' => $totalInscribedWithCorrectStatus
]);
}
}
/**
* F-053 Pregunta si desea cancelar su inscripción
*
* @Route("/{id}/cancelar-inscrito-pregunta/{ped}", name="competicion_cancelainscrito_pregunta")
*/
public function cancelarInscritoIntermedio($id, $ped)
{
$competicion = $this->em->getRepository(Competicion::class)->find($id);
if (!$competicion) {
$this->addFlash('error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
$pedido = $this->em->getRepository(Pedido::class)->find($ped);
if (!$pedido) {
$this->addFlash('error', "El pedido no existe");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
if (($competicion->getEstado() == 'abierta') && ($competicion->getModo()->getId() >= 3)) {
$inscrito = $this->em->getRepository(Inscrito::class)->findOneBy(['pedido' => $pedido, 'competicion' => $id]);
return $this->render("frontend/Inscritos/cancelar_inscripcion_pregunta.html.twig", [
'id' => $id,
'pedido' => $pedido,
'competicion' => $competicion,
'inscrito' => $inscrito
]);
} else {
$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");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
}
/**
* F-054 Cancelar la inscripción online de un jugador
*
* @Route("/{id}/cancelar-inscrito/{pedido}", name="competicion_cancelainscrito")
*/
public function cancelarInscrito($id, $pedido, EnvioCorreo $mailer, NotificacionesService $notificator, EnvioSms $messaging, SoftwareExternoUtil $swutil, LoggerInterface $swgolfLogger, UtilJugadores $util_jugadores)
{
$competicion = $this->em->getRepository(Competicion::class)->find($id);
if (!$competicion) {
$this->addFlash('error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
$secret = $this->getParameter('secret');
if (($competicion->getEstado() == 'abierta') && ($competicion->getModo()->getId() >= 3)) {
if ($pedido == '') {
$this->addFlash('error', "El numero de pedido no puede ser vacío");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
$inscritos = $this->em->getRepository(Inscrito::class)->findBy(array('competicion' => $id, 'pedido' => $pedido));
if (!$inscritos) {
$this->addFlash('error', "No se ha podido realizar la cancelación. No existe el inscrito para la competición dada");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
$p = $this->em->getRepository(Pedido::class)->find($pedido);
if (!$p) {
$this->addFlash('error', "No se ha podido realizar la cancelación. No existe el pedido indicado");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
if ($p->getEstado() != "pagado") {
$this->addFlash('error', "No se ha podido realizar la cancelación. Este pedido ya ha sido cancelado");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
$cl = $competicion->getOrganizador()->getCliente();
foreach ($inscritos as $inscrito) {
//tomamos valor antes de cambiarlo
$inscritoEstabaEnEspera = ($inscrito->getParticipa() == -1);
$inscrito->setEstado("devolucion");
$inscrito->setParticipa(0);
//Si hay horarios lo borramos
//(esto se va a dar sobretodo si están haciendo pruebas con gestion)
$horarios = $this->em->getRepository(Horario::class)->findBy(array('inscrito' => $inscrito));
if (count($horarios) > 0) {
foreach ($horarios as $horario) {
$this->em->remove($horario);
}
}
$jornadas = $competicion->getJornadas();
foreach ($jornadas as $jornada) {
if ($jornada->getModalidad()->getId() != 'G' && $jornada->getModalidad()->getId() != 'F' && $jornada->getModalidad()->getId() != 'H') {
$hor = $this->em->getRepository(JugadorHorario::class)->deleteJugadorHorario($inscrito, $jornada, null, null);
$res = $this->em->getRepository(Resultado::class)->deletePuntuacionesInscrito($inscrito, $jornada);
$delsh = $this->em->getRepository(SinAsignarHorario::class)->deleteSinAsignarHorario($inscrito, $jornada, null, null);
} else {
$rr = $this->em->getRepository(Resultado::class)->deletePuntuacionesEquipoPareja($inscrito->getEquipo(), $inscrito->getPareja(), $jornada);
$jh_jh = $this->em->getRepository(JugadorHorario::class)->findJugadorHorario(null, $jornada, $inscrito->getEquipo(), $inscrito->getPareja());
$resus = array_merge(
$this->em->getRepository(SinAsignarHorario::class)->findEquipoParejaConcreta($inscrito->getEquipo(), $inscrito->getPareja(), $jornada),
((!empty($jh_jh)) ? [$jh_jh] : []));
foreach ($resus as $resu) {
$this->em->remove($resu);
}
}
}
$p->setEstado("devolucion");
$p->setReturnedAt(new \DateTime('now'));
$this->em->flush();
$jugador = $inscrito->getJugador();
$log_message = "Cancelación de inscripción online en Competición " . $competicion->getNombre() . "(" . $id . "): " . $jugador->getLicencia() . "(" . $p->getNumero() . ")";
$log = new Log('i', $log_message, null);
$this->em->persist($log);
$this->em->flush();
try {
$this->util->guardaCsvInscripciones($inscrito);
} catch (\Throwable $ex) {
//does nothing, continues execution
error_log($ex->getMessage());
}
//avisamos al jugador
$vista = 'frontend/Inscritos/emailInscripcion.html.twig';
$args = [
//"to" => $p->getEmail(),
"to" => $p->getEmailCodDecod($secret),
"competicion" => $competicion,
"subject" => "⛳ NEXTCADDY - Cancelación de inscripción [" . $p->getNumero() . "]",
"html" => $this->renderView($vista, array('jugador' => $jugador,
'inscrito' => $inscrito,
'competicion' => $competicion,
'pedido' => $p,
"devolucion" => true,
'cancel' => true
))
];
//EnvioCorreo::enviarCorreo($args);
$mailer->enviarCorreo($args);
$tar = $p->getTarifa();
//Avisamos de la devolucion al organizador
if (!is_null($p)) {
//Solo los que manejan TPV (LV05 o nosotros, segun corresponda)
if (strpos($competicion->getOrganizador()->getId(), "LV") === false) {
$to = $this->getParameter('next.email.rfga');
} else {
$usuar = $this->em->getRepository(User::class)->findOneByUsername($competicion->getOrganizador()->getId());
$to = $usuar->getEmail();
}
if (!empty($p) && $p->getImporte() != 0) {
$args = [
//"to" => $p->getEmail(),
"to" => $to,
"competicion" => $competicion,
"subject" => "Aviso de Devolución - " . $competicion->getId() . " [" . ((is_object($p)) ? $p->getNumero() : $p) . "]: Importe " . ((is_object($p)) ? ($p->getImporte() . "€") : "Sin importe en el pedido"),
"html" => $this->renderView('backend/mail/email_devolucion.html.twig', array('jugador' => $jugador,
'competicion' => $competicion,
'inscrito' => $inscrito,
'tarifa' => $tar,
'razon' => 1,
'motivo' => "El jugador ha realizado su cancelación en la inscripción a través del email",
))
];
//EnvioCorreo::enviarCorreo($args);
$mailer->enviarCorreo($args);
}
}
//Preparación y envio del SMS
$privacidad = $inscrito->getJugador()->getPrivacidadSimple();
$rgpd = false;
if (strpos($competicion->getOrganizador()->getId(), "AM") !== false) { //si organiza alguien de la RFGA, buscamos la privacidad de RFGA
if (isset($privacidad["AM00"]) && $privacidad["AM00"]) {
$rgpd = true;
}
} else {//buscamos la privacidad del organizador
if ((isset($privacidad[$competicion->getOrganizador()->getId()]) && $privacidad[$competicion->getOrganizador()->getId()]) || (isset($privacidad["AM00"]) && $privacidad["AM00"])) {
$rgpd = true;
}
}
//$telefono = $jugador->getTlfn(); //$this->em->getRepository(Telefono::class)->findOneBy(array("jugador" => $jugador->getId(), "activo" => true));
$telefono = $util_jugadores->getDatoPlanoDesdeJugador($inscrito->getJugador(), "Telefono", $cl); // $telefono = $jugador->getTelefonoDecod($secret); //$this->em->getRepository(Telefono::class)->findOneBy(array("jugador" => $jugador->getId(), "activo" => true));
if ($rgpd && !empty($telefono)) {
$url = $this->util->getShortUrl($competicion);
$texto = "Ha cancelado su inscripción correctamente en " . $competicion->getNombre() . ". Puede consultar el listado de inscritos en " . $url;
$userApp = $this->em->getRepository(UserApp::class)->findOneByTelefono($telefono);
//if (!$userApp) {
$api = $cl?->getId() > 2;
$messaging->enviarSms($telefono, $texto, $competicion, 2, $api);
//} else {
$args = [];
$args["title"] = "Cancelación de inscripción en torneo";
$args["msg"] = $texto;
$args["url"] = $url;
$args["destinatario"] = $userApp;
$args["tipo"] = "anulation";
$args["competicion"] = $competicion->getId();
$notificator->enviarNotificacion($args);
//}
}
//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
$num_inscritos = count($this->em->getRepository(Inscrito::class)->getInscritosJugadorActivos($competicion->getId(), [], 0, [1]));
$lista_espera = (($num_inscritos < $competicion->getPlazas()) && $competicion->getListaEspera());
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.
$inscrito_espera = $this->em->getRepository(Inscrito::class)->getPrimeroListaEspera($competicion->getId());
if ($inscrito_espera) {
$inscrito_espera->setParticipa(1);
$pedidoInscritoEspera = $inscrito_espera->getPedido();
$this->em->flush();
$email = $pedidoInscritoEspera->getEmailCodDecod($secret);
if (!empty($email)) {
$args = [
"to" => $email,
"subject" => "⛳ NEXTCADDY - Incluido en Competición [" . $competicion->getId() . "]",
"competicion" => $competicion,
"html" => $this->renderView('frontend/Inscritos/emailAdmitido.html.twig', array(
'jugador' => $inscrito_espera->getJugador(),
'competicion' => $competicion,
'pedido' => $pedidoInscritoEspera,
'inscrito' => $inscrito_espera,
'tarifa' => false
))
];
//EnvioCorreo::enviarCorreo($args);
$mailer->enviarCorreo($args);
}
$this->em->flush();
}
}
try {
//Borramos el inscrito anterior de la tabla de Golfmanager y del propio sistema de Golfmanager
$swbd = $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club", "cliente" => $competicion->getOrganizador()->getCliente(),"clubId" => $competicion->getClub()->getId()]);
if ($swbd) {
$swutil->init($swbd);
$swutil->deleteClientFromActivity($inscrito, $this->em, true);
//Pablo 22/02/2024: Borramos esta condicion, me da igual el softwaregolf que tengamos que ha de ejecutarse la funcion de borrar
//en el caso de Evora no hace nada
//en el caso de GM si borra en su plataforma
// if (strtolower($software) == "golfmanager") {
// $swutil->init($software);
// $gmutil = $swutil->getSoftware(); //$new GolfmanagerUtilidad();
// $gmutil->deleteClientFromActivity($inscrito, $this->em, true);
// }
}
} catch (\Throwable $ex) {
$swgolfLogger->error("Error en " . __FILE__ . "\n" . $ex->getMessage());
}
}
//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
if ($p->getimporte() != 0) {
return new JsonResponse([]);
} else {
$this->addFlash('success', 'Se ha cancelado su inscripción al torneo ' . $competicion->getNombre());
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
} else {
// $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");
// return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
//quizas aqui un email avisando para revision del pedido y la devolucion
$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");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
}
/**
* F-055 Llamada ajax de los datos en Vivo de Resultados de parejas
*
* @Route("/{id}/livescoring/simplificado/parejas", name="competicion_envivo_parejas_simplificado", options={"expose"=true})
*/
public function resultadosEnvivoParejasSimplificado($id, Request $request)
{
$limite = $request->request->get('limite', 5);
$idj = $request->request->get('idj', 0);
$tipo = $request->request->get('tipo', 'p');
$tarjeta = $request->request->get('tarjeta', 'p');
$numHoyos = $request->request->get('numHoyos', 18);
$fecha = $request->request->get('fecha', 'c');
$sexo = $request->request->get('sexo', 't');
$categoria = $request->request->get('categoria', 0);
$token = $request->request->get('token', null);
$respuesta = array();
$competicion = $this->em->getRepository(Competicion::class)->find($id);
if (!$competicion) {
//No existe la competicion
return new JsonResponse(-1);
}
if (!$this->util->checkTokenValidIframe($competicion, $token)) {
return new JsonResponse(-1);
}
//$respuesta['competicion'] = $competicion;
$calculo = $competicion->getCalculo()->getId();
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('id' => $idj));
if (!$jornada) {
//No existe la jornada
return new JsonResponse(-2);
}
if (($this->em->getRepository(Competicion::class)->hasResultados($id) && $competicion->getShowLiveScoring()) || ($this->utilidades->compruebaRol(["ADMIN", "RFGA", "DIRE", "AYUDANTE", "LIVESCORING"], false))) {
//$respuesta['resultados'] = $this->em->getRepository(Resultado::class)->findResultadosSimplificados($idj, $limite, $tipo, $tarjeta, $numHoyos, $calculo, $sexo, $categoria);
$inscritosAux = $this->em->getRepository(Inscrito::class)->getInscritosJugadorActivos($id, [], $categoria);
$resultadosaux = array();
$parejas = array();
foreach ($inscritosAux as $ins) {
$index = $ins->getEquipo() . "-" . $ins->getPareja();
if (!isset($parejas[$index])) {
$pareja["index"] = $index;
$pareja["equipo"] = $ins->getEquipo();
$pareja["pareja"] = $ins->getPareja();
$pareja["equipo-entidad"] = $ins->getEquipoEntidad() ? $ins->getEquipoEntidad()->getId() : -1;
$pareja["miembros"] = array();
$parejas[$index] = $pareja;
}
$parejas[$index]["miembros"][] = $ins->getId();
}
$golpes = array();
$totales = array();
//$query = $qb->select("IDENTITY(r.inscrito) AS idi", "SUM(r.scratch) AS scratch", "SUM(r.hcp) AS hcp", "SUM(r.golpes) AS golpes", "MAX(r.hoyo + 0) AS hoyo", "r.updated_at", "SUM(r.contrapar_hcp) AS contraparHcp", "SUM(r.contrapar_scratch) AS contraparScratch", "MOD(COUNT(r.hoyo), " . ($numHoyos + 1 ) . " ) AS numHoyos")
foreach ($parejas as $pareja) {
$index = $pareja["index"];
$resaux = [];
$res = $this->em->getRepository(Resultado::class)->findBy(array('jornada' => $jornada, 'equipo' => $pareja['equipo'], 'pareja' => $pareja['pareja']));
//Los resultados especiales nos lo saltamos
if (count($res) == 1 && $res[0]->getEspecial()) {
continue;
}
$resaux["index"] = $pareja["index"];
$resaux["equipo"] = $pareja["equipo"];
$resaux["pareja"] = $pareja["pareja"];
$resaux["scratch"] = 0;
$resaux["contraparScratch"] = 0;
$resaux["hcp"] = 0;
$resaux["contraparHcp"] = 0;
$resaux["golpes"] = 0;
$resaux["hoyo"] = 0;
$resaux["updated_at"] = -1;
$resaux['idi'] = $pareja['miembros'][0];
$cont = 0;
foreach ($res as $re) {
$hoyo = $re->getHoyo();
$golpes[$index][$hoyo]['golpes'] = intval($re->getGolpes());
$golpes[$index][$hoyo]['scratch'] = $re->getScratch();
$golpes[$index][$hoyo]['hcp'] = $re->getHcp();
$golpes[$index][$hoyo]['hoyo'] = intval($re->getHoyo());
if ($calculo == "S") {
$golpes[$index][$hoyo]['contrapar'] = $re->getContraparScratch();
} else {
$golpes[$index][$hoyo]['contrapar'] = $re->getContraparHcp();
}
$resaux["scratch"] += $re->getScratch();
$resaux["contraparScratch"] += $re->getContraparScratch();
$resaux["hcp"] += $re->getHcp();
$resaux["contraparHcp"] += $re->getContraparHcp();
$resaux["golpes"] += intval($re->getGolpes());
$resaux["hoyo"] = max($resaux["hoyo"], $hoyo);
$resaux["updated_at"] = max($resaux["updated_at"], $re->getUpdatedAt()->format("Y-m-d H:i:s"));
if (!empty($re->getGolpes())) {
$cont++;
}
}
$resaux["numHoyos"] = $cont; //count($res);
// [!]
if ($fecha == "h") {
$res2 = $this->em->getRepository(Resultado::class)->getAcumuladoParejaHastaJornadaCompeticion($pareja["equipo"], $pareja["pareja"], $id, $jornada->getOrden(), $calculo);
$totales[$index] = $res2;
}
if ($resaux['golpes'] == 0) {
$resaux["contraparScratch"] = '-';
$resaux["contraparHcp"] = '-';
}
$resultadosaux[] = $resaux;
}
$respuesta['resultados'] = $resultadosaux;
//$horarios = array();
$especiales = array();
//Si no son los resultados de hoy, quiere decir que son todos los inscritos.
if ($fecha != "h") {
foreach ($inscritosAux as $ins) {
if (empty($ins->getCategoria())) {
//nos lo saltamos
continue;
}
$index = $ins->getEquipo() . "-" . $ins->getPareja();
$hayEspecial = false;
$tot = $this->em->getRepository(Resultado::class)->getResultadosParejasJornadasAnteriores($id, $ins->getEquipo(), $ins->getPareja(), $jornada->getOrden());
foreach ($tot as $t) {
$hayEspecial = (!is_null($t["especial"])) || $hayEspecial;
}
if (!$hayEspecial) {
$totales[$index] = $this->em->getRepository(Resultado::class)->getAcumuladoParejaHastaJornadaCompeticion($ins->getEquipo(), $ins->getPareja(), $id, $jornada->getOrden(), $calculo);
$totales[$index]["jornadas"] = $tot;
} else {
$especiales[$index] = ["especial" => "Ret", "prioridad" => 1, "updated_at" => new \DateTime('now')];
}
/* if (!isset($inscritos[$ins->getId()])) {
$inscr = $this->em->getRepository(Inscrito::class)->findInscritoBarra($idj, $ins->getId());
$inscritos[$ins->getId()] = ["handicap" => $inscr["hcp"], "apellidos" => $inscr["apellidos"], "nombre" => $inscr["nombre"], "categoria" => $inscr["categoria"], "barra" => $inscr["barra"]];
} */
/* $horarioAux = $this->em->getRepository(Horario::class)->findOneBy(array("jornada" => $idj, "inscrito" => $ins->getId()));
if ($horarioAux) {
$horarios[$ins->getId()] = ["tee" => $horarioAux->getTee(), "hora" => $horarioAux->getFecha()->format("H:i")];
} */
//OJO con Descalificado con resultados!!
$especialesAux = $this->em->getRepository(Resultado::class)->findResultadosEspecialesSimplificados($idj, $ins->getId(), $limite, $tipo);
if ($especialesAux) {
$especiales[$ins->getId()] = ["especial" => $especialesAux[0]["especial"], "prioridad" => $especialesAux[0]["prioridad"], "updated_at" => $especialesAux[0]["updated_at"]];
}
}
}
$respuesta['especiales'] = $especiales;
//$respuesta['inscritos'] = $inscritos;
//$respuesta['horarios'] = $horarios;
if (!empty($golpes)) {
$respuesta['golpes'] = $golpes;
} else {
$respuesta['hayDatos'] = false;
return new JsonResponse($respuesta);
}
if (!empty($totales)) {
$respuesta['totales'] = $totales;
}
$respuesta['parejas'] = $parejas;
$respuesta['hayDatos'] = true;
} else {
$respuesta['trazadosbarras'] = array();
$respuesta['golpes'] = array();
$respuesta['minmaxHours'] = array();
$respuesta['minmaxTimes'] = array();
$respuesta['minmaxPoints'] = array();
$respuesta['resultados'] = array();
$respuesta['especiales'] = array();
$respuesta['totales'] = array();
$respuesta['inscritos'] = array();
$respuesta['parejas'] = array();
$respuesta['hayDatos'] = false;
}
$respuesta['jornadasCompatibles'] = $competicion->getJornadasCompatibles();
return new JsonResponse($respuesta);
}
/**
* F-056 Llamada ajax de los datos en Vivo de Resultados individuales
*
* @Route("/{id}/livescoring/simplificado", name="competicion_envivo_simplificado", options={"expose"=true})
*/
public function resultadosEnvivoSimplificado($id, Request $request)
{
$limite = $request->request->get('limite', 5);
$idj = $request->request->get('idj', 0);
$tipo = $request->request->get('tipo', 'p');
$tarjeta = $request->request->get('tarjeta', 'p');
$numHoyos = $request->request->get('numHoyos', 18);
$fecha = $request->request->get('fecha', 'c');
$sexo = $request->request->get('sexo', 't');
$categoria = $request->request->get('categoria', 0);
$grupo = $request->request->get('grupo', "");
$token = $request->request->get('token', null);
$respuesta = [
'trazadosbarras' => array(),
'golpes' => array(),
'minmaxHours' => array(),
'minmaxTimes' => array(),
'minmaxPoints' => array(),
'resultados' => array(),
'especiales' => array(),
'totales' => array(),
'inscritos' => array(),
'hayDatos' => false];
$competicion = $this->em->getRepository(Competicion::class)->find($id);
if (!$competicion) {
//No existe la competicion
return new JsonResponse(-1);
}
if (!$this->util->checkTokenValidIframe($competicion, $token)) {
return new JsonResponse(-1);
}
//$respuesta['competicion'] = $competicion;
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('id' => $idj));
if (!$jornada) {
//No existe la jornada
return new JsonResponse(-2);
}
if (!(($this->em->getRepository(Competicion::class)->hasResultados($id) && $competicion->getShowLiveScoring()) || ($this->utilidades->compruebaRol(["ADMIN", "RFGA", "DIRE", "AYUDANTE", "LIVESCORING"], false)))) {
return new JsonResponse($respuesta);
}
$calculo = $competicion->getCalculo()->getId();
$respuesta['resultados'] = $this->em->getRepository(Resultado::class)->findResultadosSimplificados($idj, $limite, $tipo, $tarjeta, $numHoyos, $calculo, $sexo, $categoria, $grupo);
if (!$respuesta['resultados']) {
$respuesta['hayDatos'] = false;
return new JsonResponse($respuesta);
}
//obtenemos los resultados de los inscritos en esta jornada y los metemos en un array facilmente manejable
$golpes = array();
$totales = array();
foreach ($respuesta['resultados'] as $result) {
$res = $this->em->getRepository(Resultado::class)->findBy(array('tipo' => 'individual', 'jornada' => $jornada, 'inscrito' => $result['idi']));
foreach ($res as $re) {
$golpes[$result['idi']][$re->getHoyo()]['golpes'] = intval($re->getGolpes());
$golpes[$result['idi']][$re->getHoyo()]['scratch'] = $re->getScratch();
$golpes[$result['idi']][$re->getHoyo()]['hcp'] = $re->getHcp();
$golpes[$result['idi']][$re->getHoyo()]['hoyo'] = intval($re->getHoyo());
if ($calculo == "S") {
$golpes[$result['idi']][$re->getHoyo()]['contrapar'] = $re->getContraparScratch();
} else {
$golpes[$result['idi']][$re->getHoyo()]['contrapar'] = $re->getContraparHcp();
}
}
if ($fecha == "h") { //Si son los resultados de Hoy, traemos los totales de esos jugadores
$res2 = $this->em->getRepository(Resultado::class)->getAcumuladoHastaJornadaCompeticion($result['idi'], $id, $jornada->getOrden(), $calculo);
$totales[$result['idi']] = $res2;
}
//guardamos los datos de esos inscritos
//$ins = $this->em->getRepository(Inscrito::class)->findInscritoBarra($idj, $result['idi']);
//$inscritos[$result['idi']] = ["handicap" => $ins["hcpJ"], "apellidos" => $ins["apellidos"], "nombre" => $ins["nombre"], "categoria" => $ins["categoria"], "barra" => $ins["barra"]];
}
//$horarios = array();
$especiales = array();
//Si no son los resultados de hoy, quiere decir que son todos los inscritos.
if ($fecha != "h") {
$inscritosAux = $this->em->getRepository(Inscrito::class)->getInscritosJugadorActivos($id, [], $categoria);
foreach ($inscritosAux as $ins) {
if (empty($ins->getCategoria())) {
//nos lo saltamos
continue;
}
if ($grupo != "" && $ins->getAgrupacion() != $grupo) {
continue;
}
$hayEspecial = false;
$tot = $this->em->getRepository(Resultado::class)->getResultadosJornadasAnteriores($id, $ins->getId(), $jornada->getOrden());
foreach ($tot as $t) {
$hayEspecial = (!is_null($t["especial"])) || $hayEspecial;
}
if (!$hayEspecial) {
$totales[$ins->getId()] = $this->em->getRepository(Resultado::class)->getAcumuladoHastaJornadaCompeticion($ins->getId(), $id, $jornada->getOrden(), $calculo);
$totales[$ins->getId()]["jornadas"] = $tot;
} else {
$especiales[$ins->getId()] = ["especial" => "Ret", "prioridad" => 1, "updated_at" => new \DateTime('now')];
}
/* if (!isset($inscritos[$ins->getId()])) {
$inscr = $this->em->getRepository(Inscrito::class)->findInscritoBarra($idj, $ins->getId());
$inscritos[$ins->getId()] = ["handicap" => $inscr["hcp"], "apellidos" => $inscr["apellidos"], "nombre" => $inscr["nombre"], "categoria" => $inscr["categoria"], "barra" => $inscr["barra"]];
} */
/* $horarioAux = $this->em->getRepository(Horario::class)->findOneBy(array("jornada" => $idj, "inscrito" => $ins->getId()));
if ($horarioAux) {
$horarios[$ins->getId()] = ["tee" => $horarioAux->getTee(), "hora" => $horarioAux->getFecha()->format("H:i")];
} */
//OJO con Descalificado con resultados!!
$especialesAux = $this->em->getRepository(Resultado::class)->findResultadosEspecialesSimplificados($idj, $ins->getId(), $limite, $tipo);
if ($especialesAux) {
$especiales[$ins->getId()] = ["especial" => $especialesAux[0]["especial"], "prioridad" => $especialesAux[0]["prioridad"], "updated_at" => $especialesAux[0]["updated_at"]];
}
}
}
$respuesta['especiales'] = $especiales;
//$respuesta['inscritos'] = $inscritos;
//$respuesta['horarios'] = $horarios;
if (!empty($golpes)) {
$respuesta['golpes'] = $golpes;
} else {
$respuesta['hayDatos'] = false;
return new JsonResponse($respuesta);
}
if (!empty($totales)) {
$respuesta['totales'] = $totales;
}
$respuesta['hayDatos'] = true;
return new JsonResponse($respuesta);
}
/**
*
* @Route("/{id}/new-livescoring/{orden}", name="livescoring")
*/
public function livescoring(UtilResultados $utilResultados, Request $request, LivescoringCache $livescoring, $id, $orden = null): RedirectResponse|Response
{
// TODO eliminar 'new' de la ruta y los archivos del livescoring antiguo para completar el cambio al nuevo livescoring
// Obtenemos competicion para echar si no existe y para poder obtener parametros por si no hay jornada
$competicion = $this->em->getRepository(Competicion::class)->getCompeticionAvailable($id);
/* @var Competicion $competicion */
if (empty($competicion)) {
$this->addFlash('error', "No existe esta competicion");
return $this->redirectToRoute("portada");
}
$ahora = new \DateTime();
if (!$orden) {
$round = $this->em->getRepository(Jornada::class)->getMaxJornadaWithResults($id, null, 1);
if ($round) {
$orden = $round->getOrden();
} else {
$orden = 1;
}
} else {
$orden = intval($orden);
if ($orden < 1) {
$orden = 1;
}
}
// Vamos a la jornada de hoy, pero si somos ADMIN o FEDE vamos a la que hemos indicado
if ($this->utilidades->compruebaRol(["ADMIN", "FEDE"], false)) {
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(["competicion" => $id, "orden" => $orden]);
} else {
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(["competicion" => $id, "fecha" => $ahora]);
$orden = $jornada?->getOrden() ?? $orden;
}
$livescoringData = null;
$horaSalida = null;
$livescoringH = null;
$livescoringS = null;
if ($jornada) {
$team = $jornada->isTeamLivescoring() ?? $request->query->get('team', false);
// llamada a la funcion de cache para obtener team
// $team = $this->util_cache->getTeamLivescoringValueCache($competicion->getId(), 'new-livescoring', $team);
// Se obtiene toda la informacion necesaria para el componente livescoring
// $livescoring = $utilResultados->livescoring($jornada, [], $team); // OLD LIVESCORING POR SI FALLA EL REFACTORIZADO
$livescoringParams = [
'isTeamLivescoring' => $team
];
$livescoringFormula = $competicion->getLivescoringFormula();
if (EnumLivescoringFormula::HANDICAP_SCRATCH === $livescoringFormula) {
$livescoringH = $livescoring->__invoke($jornada, $livescoringParams, HANDICAP_CALCULATION);
$livescoringS = $livescoring->__invoke($jornada, $livescoringParams, SCRATCH_CALCULATION);
$livescoringData = $livescoring->__invoke($jornada, $livescoringParams);
} else if (EnumLivescoringFormula::SCRATCH === $livescoringFormula) {
$livescoringData = $livescoring->__invoke($jornada, $livescoringParams, SCRATCH_CALCULATION);
} else if (EnumLivescoringFormula::HANDICAP === $livescoringFormula) {
$livescoringData = $livescoring->__invoke($jornada, $livescoringParams, HANDICAP_CALCULATION);
}
$horaSalida = $utilResultados->horaSalida($jornada->getId(), $livescoringData['individual']);
}
$isProd = ProjectEnvironment::isProd();
$calculation = $competicion->getCalculo()->getId();
$response = new Response($this->renderView("frontend/Competicion/livescoring.html.twig", [
"nombreCompeticion" => $competicion->getNombre(),
"nombreClub" => $competicion->getClub()->getNombre(),
"compId" => $id,
"orden" => $orden,
"livescoring" => $livescoringData,
"livescoringS" => $livescoringS,
"livescoringH" => $livescoringH,
"horaSalida" => $horaSalida,
'competicion' => $competicion,
'isProduction' => $isProd,
"calculation" => $calculation
]));
$competitionIsOrganizerByCM01 = "CM01" == $competicion->getOrganizador()->getId() && $competicion->getPrivada() && !$this->utilidades->compruebaRol(["ADMIN", "ROLE_CLUB_CM01"], false);
if ($competitionIsOrganizerByCM01) {
$response->headers->set("Content-Security-Policy", "frame-ancestors https://www.rcphierro.com/");
}
return $response;
}
/**
* F-057 Livescoring individual
*
* @Route("/{id}/livescoring/{orden}/{letra}", name="competicion_envivo", defaults={ "orden" = 0, "letra" = "H" }, options={"expose"=true})
*
*/
public function resultadosEnvivo(Request $request, $id, $orden, $letra, KernelInterface $kernel, Packages $doctrine, AuthorizationCheckerInterface $authorizationChecker)
{
$files = [];
$competicion = $this->em->getRepository(Competicion::class)->find($id);
if (empty($competicion)) {
$this->addFlash('error', "El torneo buscado no existe");
//return $this->redirect($this->generateUrl('_club', array('id' => "AM00")));
return $this->redirect($this->generateUrl('portada'));
}
//Si no es publica, admin logado como admin o federacion logado como (fede o admin), entonces error
$showLivescoring = $competicion->getShowLiveScoring();
if (!($authorizationChecker->isGranted('ROLE_ADMIN') ||
($showLivescoring == "publico") ||
($authorizationChecker->isGranted('ROLE_ADMIN')) ||
($showLivescoring == "club" && $authorizationChecker->isGranted('ROLE_CLUB')) ||
($showLivescoring == "federacion" && (($this->utilidades->compruebaRol(["ADMIN", "RFGA", "DIRE", "AYUDANTE", "LIVESCORING"], false))))
)) {
$this->addFlash('info', "El livescoring de esta competición no está activado en este momento");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
$isToday = false;
if ($orden <= 0) {
//Por defecto si no hay día indicado, toma el actual
$now = new \DateTime('midnight');
$jornada = $this->em->getRepository(Jornada::class)->getMaxJornadaWithResults($id, $now, 1);
$isToday = true;
} else {
//Para ADMIN o FEDE si dejamos ver indicando el orden de jornada
if ($this->utilidades->compruebaRol(["ADMIN", "FEDE "], false)) {
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id, 'orden' => $orden));
} else {
//Para el resto de roles solo se deja ver el día de hoy.
//Al estar marcado el orden, usa dicho orden para varias jornadas el mismo día
$now = new \DateTime('midnight');
$jornada = $this->em->getRepository(Jornada::class)->getMaxJornadaWithResults($id, $now, 1, $orden);
$isToday = true;
}
}
if (empty($jornada)) {
$hoy = new \DateTime('today 23:59:59');
$jornadasHastaAhora = [];
$jornadasDesdeAhora = [];
foreach ($competicion->getJornadas() as $competicionJornada) {
if ($competicionJornada->getFecha() <= $hoy) {
$jornadasHastaAhora[] = $competicionJornada->getOrden();
} else {
$jornadasDesdeAhora[] = $competicionJornada->getOrden();
}
}
if (empty($jornadasHastaAhora)) {
$orden = $jornadasDesdeAhora[array_key_first($jornadasDesdeAhora)];
} else {
$orden = $jornadasHastaAhora[array_key_last($jornadasHastaAhora)];
}
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id, 'orden' => $orden));
if (empty($jornada)) {
$this->addFlash('error', "No hay resultados para el torneo en el día de hoy o no tiene permisos para acceder");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
} else {
/* if ($jornada->getModalidad()->getId() != "I") {
$this->addFlash(
'error', "No podemos mostrarle la jornada solicitada");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
} */
}
//tomamos solo una para coger el número de hoyos a jugar, ya que va a ser el mismo para todas las categorías, si no que estaría mal
$jornadaConfig = $this->em->getRepository(JornadaConfig::class)->findOneByJornada($jornada);
$limits = explode("-", $jornadaConfig->getHoyos());
//Si todas son individuales esto devuelve cero, si hay alguna no individual, entonces será falso
$todasIndividual = ($this->em->getRepository(Jornada::class)->cuentaJornadasNoIndividuales($id) == 0);
//comprobamos si hay fotos y se las pasamos al JS
$clubes = [$competicion->getClub()->getId(), "AMXX"];
$cFondo = 0;
$hayUrl = false;
try {
while ($cFondo < 2 && !$hayUrl) {
$imgPath = $doctrine->getUrl('img/frontend/livescore/' . $clubes[$cFondo] . "/");
$fullPath = $kernel->getProjectDir() . '/public/' . $imgPath; //prod
$hayUrl = file_exists($fullPath);
if ($hayUrl) {
$files = scandir($fullPath);
}
$cFondo++;
}
} catch (\Exception $ex) {
//Nothing
}
//21/02/2019 Movido del simplificado para que las actualizaciones del livescoring sean menos pesadas
$inscritosAux = $this->em->getRepository(Inscrito::class)->getInscritosActivos($id, 0);
$horarios = array();
$inscritos = array();
foreach ($inscritosAux as $ins) {
if (empty($ins->getCategoria())) {
//nos lo saltamos
continue;
}
$horarioAux = $this->em->getRepository(Horario::class)->findOneBy(array("jornada" => $jornada, "inscrito" => $ins->getId()));
if ($horarioAux) {
$horarios[$ins->getId()] = ["tee" => $horarioAux->getTee(), "hora" => $horarioAux->getFecha()->format("H:i")];
}
$i = $this->em->getRepository(Inscrito::class)->findInscritoBarra($jornada, $ins->getId());
if (!is_null($i)) {
$inscritos[$ins->getId()] = ["licencia" => $i["licencia"], "handicap" => $i["hcpJ"], "apellidos" => $i["apellidos"], "nombre" => $i["nombre"], "categoria" => $i["categoria"], "barra" => $i["barra"] != "outline" ? $i["barra"] : "basic"];
} else {
//Si no encuentra el InscritoBarra (normalmente es porque el jugador es invalido, no deberia de salir, pero acordamos que saltga) asi que montamos a manos el elemento
//asi nos garantizamos siempre que exista, aunque controlemos en el JS que no exista para evitar errores
$jugador = $ins->getJugador();
$inscritos[$ins->getId()] = ["licencia" => $jugador->getLicencia(), "apellidos" => $jugador->getApellidos(), "nombre" => $jugador->getNombre(), "categoria" => $ins->getCategoria()->getId()];
//Y ponemos a mano la barra y el hcp (estos valores han de ser corregidos calculados en inscritos)
$hcpJugg = $this->em->getRepository(HcpJuego::class)->findBy(["jornada" => $jornada, "inscrito" => $ins]);
if ($hcpJugg) {
$inscritos[$ins->getId()]["handicap"] = $hcpJugg[0]->getHcp();
} else {
$inscritos[$ins->getId()]["handicap"] = " ";
}
$traz_barr = $this->em->getRepository(Inscrito::class)->getTrazadoBarra($jugador->getSexo(), $ins->getCategoria()->getId(), $jornada);
if ($traz_barr) {
$inscritos[$ins->getId()]["barra"] = $traz_barr->getBarra()->getColor() != "outline" ? $traz_barr->getBarra()->getColor() : "basic";
} else {
$inscritos[$ins->getId()]["barra"] = " ";
}
}
$inscritos[$ins->getId()]["teamname"] = $ins->getEquipoEntidad() ? $ins->getEquipoEntidad()->getNombre() : $ins->getNombreEquipo();
}
//mejorar esto para que solo lo haga una vez y no cada vez que se le llama (sacarla fuera o algo)
$trazadosbarras = array();
try {
$categos = $this->em->getRepository(Categoria::class)->findByCompeticion($id);
foreach ($categos as $cat) {
//buscamos cada categoriaconfig para obtener el sexo
$categosconfig = $this->em->getRepository(CategoriaConfig::class)->findOneByCategoria($cat);
//buscamos en cada jornada config (a partir de la categoria y jornada) para obtener la Barra. Relacion 1:1
$jornadaconfig = $this->em->getRepository(JornadaConfig::class)->findOneBy(array('categoria' => $cat, 'jornada' => $jornada));
if (empty($jornadaconfig)) {
//para evitar el error de que $jornadaconfig es nulo y se esta intentando acceder mas adelante. Nos saltamos el elemento
continue;
}
//el trazado sale de la jornada (no tengo que buscarlo)
//obtenemos el trazado barra a partir de:
$trazadobarra = $this->em->getRepository(TrazadoBarra::class)->findOneBy(array('trazado' => $jornada->getTrazado(), 'barra' => $jornadaconfig->getBarra(), 'sexo' => $categosconfig->getSexo(), 'activo' => 1));
//Obtenemos la info de los hoyos (metros, par y hcp) a aprtir del trazado barra
$hoyos = $this->em->getRepository(Hoyo::class)->findBy(array('trazadoBarra' => $trazadobarra));
$hoyosmodif = array();
foreach ($hoyos as $hoyo) {
$hoyito = array();
$hoyito['metros'] = $hoyo->getMetros();
$hoyito['par'] = $hoyo->getPar();
$hoyito['hcp'] = $hoyo->getHcp();
$hoyito['hoyo'] = $hoyo->getNumero();
$hoyosmodif[] = $hoyito;
}
$hoyosmodif['barra'] = $jornadaconfig->getBarra()->getId();
$trazadosbarras[$cat->getId()] = $hoyosmodif;
}
//$respuesta['trazadosbarras'] = $trazadosbarras;
} catch (\Exception $ex) {
$trazadosbarras = array();
}
$jornadas = $competicion->getJornadas(); // $this->em->getRepository(Jornada::class)->findBy(['competicion' => $competicion], ['orden' => 'ASC']);
/* ADAPTAR ESTO QUE ES DE INSERCION DE RESULTADOS PARA PONERLO AQUI */
$mobile = false;
$useragent = $request->headers->get('User-Agent');
if (preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i', $useragent) || preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i', substr($useragent, 0, 4))) {
$mobile = true;
}
if (!$mobile) {
$vista = 'frontend/Competicion/envivo.html.twig';
} else {
$vista = 'frontend/Competicion/envivoMobile.html.twig';
}
$agrupaciones = $this->em->getRepository(Inscrito::class)->getAgrupacionesByCompeticion($competicion);
$response = new Response($this->renderView($vista, array(
'competicion' => $competicion,
'esEquipo' => intval($competicion->getJugadores() > 2),
'jornada' => $jornada,
'jornadas' => $jornadas,
'letra' => $letra,
'isToday' => $isToday,
'imgPath' => $imgPath,
'files' => array_slice($files, 2), //eliminamos "." y ".."
'hayUrl' => $hayUrl,
'todasIndividual' => $todasIndividual,
'numHoyos' => intval($limits[1]) - intval($limits[0]) + 1,
'trazadosbarras' => $trazadosbarras,
'inscritos' => $inscritos,
'horarios' => $horarios,
'agrupaciones' => $agrupaciones,
)));
if ("CM01" == $competicion->getOrganizador()->getId() && $competicion->getPrivada() && !$this->utilidades->compruebaRol(["ADMIN", "ROLE_CLUB_CM01"], false)) {
$response->headers->set("Content-Security-Policy", "frame-ancestors https://www.rcphierro.com/");
}
return $response;
}
/**
* F-058 Livescoring de parejas
*
* @Route("/{id}/livescoring-couple/{orden}/{letra}", name="competicion_envivo_parejas", defaults={ "letra" = "H" })
*/
public function resultadosEnvivoParejas(Request $request, $id, $orden, $letra, KernelInterface $kernel, AuthorizationCheckerInterface $authorizationChecker)
{
// if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == "on")) {
// $url = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
// header("Location: $url");
// exit;
// }
$files = [];
$competicion = $this->em->getRepository(Competicion::class)->find($id);
if (!$competicion) {
$this->addFlash('error', "El torneo buscado no existe");
//return $this->redirect($this->generateUrl('_club', array('id' => "AM00")));
return $this->redirect($this->generateUrl('portada'));
}
//Si no es publica, admin logado como admin o federacion logado como (fede o admin), entonces error
$showLivescoring = $competicion->getShowLiveScoring();
if (!($authorizationChecker->isGranted('ROLE_ADMIN') ||
($showLivescoring == "publico") ||
($showLivescoring == "deshabilitado" && $authorizationChecker->isGranted('ROLE_ADMIN')) ||
($showLivescoring == "club" && $authorizationChecker->isGranted('ROLE_CLUB')) ||
($showLivescoring == "federacion" && (($this->utilidades->compruebaRol(["ADMIN", "FEDE", "DIRE", "AYUDANTE", "LIVESCORING"], false))))
)) {
$this->addFlash('info', "El livescoring de esta competición no está activado en este momento");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
$isToday = false;
if ($orden <= 0) {
//Por defecto si no hay día indicado, toma el actual
$now = new \DateTime('midnight');
$jornada = $this->em->getRepository(Jornada::class)->getMaxJornadaWithResults($id, $now, 1);
$isToday = true;
} else {
//Para ADMIN o FEDE si dejamos ver indicando el orden de jornada
if ($this->utilidades->compruebaRol(["ADMIN", "FEDE "], false)) {
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id, 'orden' => $orden));
} else {
//Para el resto de roles solo se deja ver el día de hoy.
//Al estar marcado el orden, usa dicho orden para varias jornadas el mismo día
$now = new \DateTime('midnight');
$jornada = $this->em->getRepository(Jornada::class)->getMaxJornadaWithResults($id, $now, 1, $orden);
$isToday = true;
}
}
if (empty($jornada)) {
$hoy = new \DateTime('today 23:59:59');
$jornadasHastaAhora = [];
$jornadasDesdeAhora = [];
foreach ($competicion->getJornadas() as $competicionJornada) {
if ($competicionJornada->getFecha() <= $hoy) {
$jornadasHastaAhora[] = $competicionJornada->getOrden();
} else {
$jornadasDesdeAhora[] = $competicionJornada->getOrden();
}
}
if (empty($jornadasHastaAhora)) {
$orden = $jornadasDesdeAhora[array_key_first($jornadasDesdeAhora)];
} else {
$orden = $jornadasHastaAhora[array_key_last($jornadasHastaAhora)];
}
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $id, 'orden' => $orden));
}
if (!$jornada) {
$this->addFlash('error', "No existen resultados para ese torneo en el día de hoy o No tiene permisos para acceder");
return $this->redirect($this->generateUrl('_tournament', array('id' => $id)));
}
//tomamos solo una para coger el numero de hoyos a jugar, ya que va a ser el mismo para todas las categorias,sino es que estaria mal
$jornadaConfig = $this->em->getRepository(JornadaConfig::class)->findOneByJornada($jornada);
$limits = explode("-", $jornadaConfig->getHoyos());
//Si todas son individuales esto devuelve cero, si hay alguna no individual, entonces será falso
$todasIndividual = ($this->em->getRepository(Jornada::class)->cuentaJornadasNoIndividuales($id) == 0);
//comprobamos si hay fotos y se las pasamos al JS
$clubes = [$competicion->getClub()->getId(), "AMXX"];
$cFondo = 0;
$hayUrl = false;
while ($cFondo < 2 && !$hayUrl) {
$imgPath = 'img/frontend/livescore/' . $clubes[$cFondo] . "/";
$fullPath = $kernel->getProjectDir() . '/public/' . $imgPath; //prod
$hayUrl = file_exists($fullPath);
if ($hayUrl) {
$files = scandir($fullPath);
}
$cFondo++;
}
//21/02/2019 Movido del simplificado para que las actualizaciones del livescoring sean menos pesadas
$inscritosAux = $this->em->getRepository(Inscrito::class)->getInscritosActivos($id, 0);
$horarios = array();
$inscritos = array();
foreach ($inscritosAux as $ins) {
if (empty($ins->getCategoria())) {
//nos lo saltamos
continue;
}
$horarioAux = $this->em->getRepository(Horario::class)->findOneBy(array("jornada" => $jornada, "inscrito" => $ins->getId()));
if ($horarioAux) {
$horarios[$ins->getId()] = ["tee" => $horarioAux->getTee(), "hora" => $horarioAux->getFecha()->format("H:i")];
}
$i = $this->em->getRepository(Inscrito::class)->findInscritoBarra($jornada, $ins->getId());
if (!is_null($i)) {
$inscritos[$ins->getId()] = ["licencia" => $i["licencia"], "handicap" => $i["hcpJ"], "apellidos" => $i["apellidos"], "nombre" => $i["nombre"], "categoria" => $i["categoria"], "barra" => $i["barra"] != "outline" ? $i["barra"] : "basic"];
} else {
//Si no encuentra el InscritoBarra (normalmente es porque el jugador es invalido, no deberia de salir, pero acordamos que saltga) asi que montamos a manos el elemento
//asi nos garantizamos siempre que exista, aunque controlemos en el JS que no exista para evitar errores
$jugador = $ins->getJugador();
$inscritos[$ins->getId()] = ["licencia" => $jugador->getLicencia(), "apellidos" => $jugador->getApellidos(), "nombre" => $jugador->getNombre(), "categoria" => $ins->getCategoria()->getId()];
//Y ponemos a mano la barra y el hcp (estos valores han de ser corregidos calculados en inscritos)
$hcpJugg = $this->em->getRepository(HcpJuego::class)->findBy(["jornada" => $jornada, "inscrito" => $ins]);
if ($hcpJugg) {
$inscritos[$ins->getId()]["handicap"] = $hcpJugg[0]->getHcp();
} else {
$inscritos[$ins->getId()]["handicap"] = " ";
}
$traz_barr = $this->em->getRepository(Inscrito::class)->getTrazadoBarra($jugador->getSexo(), $ins->getCategoria()->getId(), $jornada);
if ($traz_barr) {
$inscritos[$ins->getId()]["barra"] = $traz_barr->getBarra()->getColor() != "outline" ? $traz_barr->getBarra()->getColor() : "basic";
} else {
$inscritos[$ins->getId()]["barra"] = " ";
}
}
$inscritos[$ins->getId()]["index"] = $ins->getEquipo() . "-" . $ins->getPareja();
$inscritos[$ins->getId()]["id"] = $ins->getId();
$inscritos[$ins->getId()]["teamname"] = $ins->getEquipoEntidad() ? $ins->getEquipoEntidad()->getNombre() : $ins->getNombreEquipo();
}
//mejorar esto para que solo lo haga una vez y no cada vez que se le llama (sacarla fuera o algo)
$trazadosbarras = array();
try {
$categos = $this->em->getRepository(Categoria::class)->findByCompeticion($id);
foreach ($categos as $cat) {
//buscamos cada categoriaconfig para obtener el sexo
$categosconfig = $this->em->getRepository(CategoriaConfig::class)->findOneByCategoria($cat);
//buscamos en cada jornada config (a partir de la categoria y jornada) para obtener la Barra. Relacion 1:1
$jornadaconfig = $this->em->getRepository(JornadaConfig::class)->findOneBy(array('categoria' => $cat, 'jornada' => $jornada));
if (empty($jornadaconfig)) {
//para evitar el error de que $jornadaconfig es nulo y se esta intentando acceder mas adelante. Nos saltamos el elemento
continue;
}
//el trazado sale de la jornada (no tengo que buscarlo)
//obtenemos el trazado barra a partir de:
$trazadobarra = $this->em->getRepository(TrazadoBarra::class)->findOneBy(array('trazado' => $jornada->getTrazado(), 'barra' => $jornadaconfig->getBarra(), 'sexo' => $categosconfig->getSexo(), 'activo' => 1));
//Obtenemos la info de los hoyos (metros, par y hcp) a aprtir del trazado barra
$hoyos = $this->em->getRepository(Hoyo::class)->findBy(array('trazadoBarra' => $trazadobarra));
$hoyosmodif = array();
foreach ($hoyos as $hoyo) {
$hoyito = array();
$hoyito['metros'] = $hoyo->getMetros();
$hoyito['par'] = $hoyo->getPar();
$hoyito['hcp'] = $hoyo->getHcp();
$hoyito['hoyo'] = $hoyo->getNumero();
$hoyosmodif[] = $hoyito;
}
$hoyosmodif['barra'] = $jornadaconfig->getBarra()->getId();
$trazadosbarras[$cat->getId()] = $hoyosmodif;
}
//$respuesta['trazadosbarras'] = $trazadosbarras;
} catch (\Exception $ex) {
$trazadosbarras = array();
}
$jornadas = $this->em->getRepository(Jornada::class)->findBy(['competicion' => $competicion], ['orden' => 'ASC']);
/* ADAPTAR ESTO QUE ES DE INSERCION DE RESULTADOS PARA PONERLO AQUI */
$mobile = false;
$useragent = $request->headers->get('User-Agent');
if (preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i', $useragent) || preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i', substr($useragent, 0, 4))) {
$mobile = true;
}
if (!$mobile) {
$vista = 'frontend/Competicion/envivoParejas.html.twig';
} else {
$vista = 'frontend/Competicion/envivoMobileParejas.html.twig';
}
$jornadasCompatibles = $competicion->getJornadasCompatibles();
$response = new Response($this->renderView($vista, array(
'competicion' => $competicion,
'esEquipo' => intval($competicion->getJugadores() > 2),
'jornada' => $jornada,
'jornadas' => $jornadas,
'letra' => $letra,
'isToday' => $isToday,
'imgPath' => $imgPath,
'files' => array_slice($files, 2), //eliminamos "." y ".."
'hayUrl' => $hayUrl,
'todasIndividual' => $todasIndividual,
'numHoyos' => intval($limits[1]) - intval($limits[0]) + 1,
'trazadosbarras' => $trazadosbarras,
'inscritos' => $inscritos,
'horarios' => $horarios,
'jornadasCompatibles' => $jornadasCompatibles
)));
if ("CM01" == $competicion->getOrganizador()->getId() && $competicion->getPrivada() && !$this->utilidades->compruebaRol(["ADMIN", "ROLE_CLUB_CM01"], false)) {
$response->headers->set("Content-Security-Policy", "frame-ancestors https://www.rcphierro.com/");
} else {
//En principio nada, no se pone cabecera
}
return $response;
}
/**
* F-061 Visualizacion detallada de un torneo
*
* @Route("/{id}/{publi}", name="_tournament", requirements={"id": "\d+"}, options={"expose"=true}, defaults={"publi" = 0})
*/
public function tournament($id, $publi, Request $request, TournamentView $tournamentView): RedirectResponse|Response
{
return $tournamentView->__invoke($id, $publi, $request);
}
/**
* F-085 Enviar etiquetas por correo a un jugador
*
* @Route("/{idc}/etiqueta-mail/{id}/{idi}", name="etiquetas_enviar_correo", options={"expose"=true}, methods={"POST"})
*/
public function enviarEtiquetasCorreo($id, $idc, $idi, Request $request, KernelInterface $kernel, EnvioCorreo $mailer, Environment $twig, GestionHorarioController $gh)
{
$request->request->set('inscritos', 1); //como si viniera el parametro de que vienen inscritos
$request->request->set('inscrito', [$idi]); //simulando el select de inscritos
$request->request->set('tipo', 'tarjetasA4'); //adhesivas2, adhesivas3, tarjetasA4, preimpreso
//habra que ver si definimos el tipo segun el organizador de la competicion
//(en el fondo no hace falta, asi la gente se acostumbra a la tarjeta de nextcaddy)
$request->request->set('tipoTarj', 'nextcaddy');
//$request->request->set('correo', 1);
$retorno = $gh->generarEtiquetas($request, $id, $idc, 0, $this, $twig, $kernel);
$secret = $this->getParameter('secret');
if ($retorno['data']) {
$inscrito = $this->em->getRepository(Inscrito::class)->find($idi);
//ENVIAR CORREO
//$retorno es el pdf
$to = $request->request->get('correo');
if (!$to && !empty($inscrito->getPedido())) {
$to = $inscrito->getPedido()->getEmailCod($secret);
}
$dir = $kernel->getProjectDir() . '/public/relaxed';
$args = [
"to" => $to,
"attachments" => [$dir . "/" . $retorno["mensaje"]],
'competicion' => $inscrito->getCompeticion(),
"subject" => "NEXTCADDY - Tarjeta torneo {$inscrito->getCompeticion()->getNombre()} ({$inscrito->getCompeticion()->getFecha()->format("d-m-y")})| {$inscrito->getJugador()->getNombreCompleto()}",
"html" => $this->renderView('backend/mail/email_imprimir_tarjeta.html.twig', array(
'inscrito' => $inscrito,
'competicion' => $inscrito->getCompeticion(),
))
];
//EnvioCorreo::enviarCorreo($args);
$mailer->enviarCorreo($args);
return new JsonResponse(true);
} else {
return new JsonResponse(false);
}
}
/**
* F-002 Obtención del historico acumulado de los contrapares de una partida (PARECE ESTAR OBSOLETA)
*
* @Route("/{idc}/partida-horario", name="horario_partida_estadisticas", options={"expose"=true})
*/
public function horarioPartidaEstadisticas($idc, Request $request)
{
$partidaID = $request->request->get("partida");
$partida = $this->em->getRepository(PartidaHorario::class)->find($partidaID);
if (!$partida) {
return -2;
}
$jornada = $partida->getHorario()->getJornada();
$calculo = $jornada->getCompeticion()->getCalculo()->getNombre();
$modalidad = $jornada->getModalidad()->getId();
$jornadaId = $jornada->getId();
$jugadoresHorario = $this->em->getRepository(JugadorHorario::class)->findBy(['partida' => $partida], ['inscrito' => 'ASC']); //ordenamos por ID inscrito para mantener siempre el orden
$jugadores = array();
$contrapares = array();
if ($modalidad == "I") {
foreach ($jugadoresHorario as $h) {
$insc = $h->getInscrito();
$inscId = $insc->getId();
$esp = $this->em->getRepository(Resultado::class)->findResultadoEspecial($inscId, $jornadaId); //buscamos si tiene resultado especial para no incluirlo
if (!$esp) {
$jugadores[$insc->getId()] = $insc->getJugador()->getNombre();
$hoyoAnt = 0;
$acumulado = 0;
$resultados = $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId, 'inscrito' => $insc->getId()], ['hoyo' => 'ASC']);
foreach ($resultados as $resultado) {
//Si nos falta un hoyo (Stableford), lo añadimos a mano
for ($e = $hoyoAnt + 1; $e < $resultado->getHoyo(); $e++) {
$acumulado += 2; //Si levanta bola (no existe el hoyo, stableford [pero solo desde programa]) el contrapar es +2 siempre (en ese hoyo)
$contrapares[$insc->getId()][] = $acumulado;
}
$acumulado += $resultado->{"getContrapar" . ucfirst($calculo)}();
$contrapares[$insc->getId()][] = $acumulado;
$hoyoAnt = $resultado->getHoyo();
}
}
}
} else {
foreach ($jugadoresHorario as $jh) {
$equipo = $jh->getEquipo();
$pareja = $jh->getPareja();
$esp = $this->em->getRepository(Resultado::class)->findResultadoEspecialEquipoPareja($equipo, $pareja, $jornadaId);
if (!$esp) {
$jugadores[$equipo . "-" . $pareja] = "";
$inscritos = $this->em->getRepository(Inscrito::class)->findBy(['equipo' => $equipo, 'pareja' => $pareja, 'competicion' => $jornada->getCompeticion()->getId()]);
foreach ($inscritos as $inscrito) {
$jugadores[$equipo . "-" . $pareja] .= $inscrito->getjugador()->getNombre() . " - ";
}
$jugadores[$equipo . "-" . $pareja] = substr($jugadores[$equipo . "-" . $pareja], 0, strlen($jugadores[$equipo . "-" . $pareja]) - 3);
$acumulado = 0;
$resultados = $this->em->getRepository(Resultado::class)->findBy(['equipo' => $equipo, 'pareja' => $pareja, 'jornada' => $jornada->getId()], ['hoyo' => 'ASC']);
foreach ($resultados as $resultado) {
$acumulado += $resultado->{"getContrapar" . ucfirst($calculo)}();
$contrapares[$equipo . "-" . $pareja][] = $acumulado;
}
}
}
}
return new JsonResponse(["contrapares" => $contrapares, "jugadores" => $jugadores]);
}
}