<?php
namespace App\Controller\Frontend;
use App\Controller\Shared\Livescoring\LivescoringCache;
use App\DBAL\Backend\EnumEstadoInscrito;
use App\Service\CalculateCurrentHoleService;
use App\Entity\Backend\CompetitionSection;
use App\Entity\Backend\CompetitionSectionHidden;
use Doctrine\Common\Collections\ArrayCollection;
use Redis;
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\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Asset\Packages;
use Buzz\Browser;
use Buzz\Client\FileGetContents;
use Nyholm\Psr7\Factory\Psr17Factory;
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\UtilStatic;
use App\Util\UtilJugadores;
use App\Util\Tarjetas;
use App\Entity\Backend\Pedido;
use App\Entity\Backend\Jugador;
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\Comunidad;
use App\Service\FederatedWebService;
// use App\Service\RFEGWebService;
use App\Util\RedsysAPI;
use App\Util\Recipe;
use App\Entity\Backend\JugadorRGPD;
use App\Service\EnvioCorreo;
use App\Service\EnvioSms;
use App\Service\NotificacionesService;
use App\Util\Utilidades;
use App\Entity\Backend\Club;
use App\Entity\Backend\Competicion;
use App\Entity\Backend\Estadisticas;
use App\Entity\Backend\Horario;
use App\Entity\Backend\Jornada;
use App\Entity\Backend\JornadaConfig;
use App\Entity\Backend\Resultado;
use App\Entity\Backend\Sms;
use App\Entity\Backend\SoftwareGolf;
use App\Entity\Backend\Trazado;
use App\Entity\Backend\TrazadoBarra;
use App\Entity\Gestion\JugadorHorario;
use App\Entity\Gestion\PartidaHorario;
use App\Entity\User\User;
use App\Entity\User\UserApp;
use App\Entity\Backend\Provincia;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use App\Util\SoftwareExternoUtil;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class IndexController extends AbstractController {
private $em;
private $util;
private $utilidades;
private $tokenStorage;
private $session;
public function __construct(ManagerRegistry $doctrine, Util $util, Utilidades $utilidades, TokenStorageInterface $tokenStorage, SessionInterface $session) {
$this->util = $util;
$this->utilidades = $utilidades;
$this->em = $doctrine->getManager();
$this->tokenStorage = $tokenStorage;
$this->session = $session;
}
/**
* F-017 Pagina principal
*
* @Route("/", name="portada")
*
*/
public function index(Request $request, EnvioCorreo $mailer) {
// $secret = $this->getParameter('secret');
// $long = $this->getParameter('next.longitud.hash');
// $cifrado = $this->util->encriptarLargo('majgolfacademyForSlope', $secret, $long);
$numTournaments = $this->em->getRepository(Competicion::class)->cuentaCompeticionesTotal();
$totalPaidEnrolled = $this->em->getRepository(Inscrito::class)->countPaid();
// Creamos el formulario. Lo creamos asi ya que no hace falta entidad para contacto.
$form = $this->createContactForm();
$form->handleRequest($request);
// Cuando se mande el formulario se enviara un correo para nosotros con el mensaje del usuario y los datos que ha introducido
if($form->isSubmitted() && $form->isValid()){
$this->sendContact($form, $mailer);
$form = $this->createContactForm();
return $this->redirectToRoute('portada');
}
// Se recoge la informacion necesaria para mostrar el componente de las plazas de la competicion
$competicionesInscripcionCercana = $this->em->getRepository(Competicion::class)->competicionesInscripcionCercana(12);
return $this->render('frontend/Default/index.html.twig', [
"form" => $form->createView(),
"limiteLivescoring" => 4, // tarjetas que se muestran por cada componente livescoring
"competicionesInscripcionCercana" => $competicionesInscripcionCercana,
"counter" => [
"tournaments" => $numTournaments,
"players" => $totalPaidEnrolled
]
]);
}
// Creamos aqui el formulario de contacto que tendra la index
private function createContactForm() {
$form = $this->createFormBuilder()
->setMethod("POST")
->add('name', TextType::class, array(
'constraints' => new NotBlank(),
"required" => true,
"label" => "labels.contact.name",
"translation_domain" => "FrontendBundle",
'label_attr' => [
'class' => 'label'
],
'attr' => [
'class' => "text-input"
]
))
->add('email', EmailType::class, array(
'constraints' => new NotBlank(),
"required" => true,
"label" => "labels.contact.email",
"translation_domain" => "FrontendBundle",
'label_attr' => [
'class' => 'label'
],
'attr' => [
'class' => "text-input"
]
))
->add('club', TextType::class, array(
"required" => false,
"label" => "labels.contact.club",
"translation_domain" => "FrontendBundle",
'label_attr' => [
'class' => 'label'
],
'attr' => [
'class' => "text-input"
]
))
->add('license', TextType::class, array(
"required" => false,
"label" => "labels.contact.license",
"translation_domain" => "FrontendBundle",
'label_attr' => [
'class' => 'label'
],
'attr' => [
'class' => "text-input"
]
))
->add('message', TextareaType::class, array(
'constraints' => new NotBlank(),
"required" => true,
"label" => "labels.contact.message",
"translation_domain" => "FrontendBundle",
'label_attr' => [
'class' => 'label'
],
'attr' => [
"rows" => 4,
"cols" => 50,
'class' => "textarea"
]
))
->add('privacyPolicy', CheckboxType::class, array(
'constraints' => new NotBlank(),
"required" => true,
"label" => false,
'label_attr' => [
'class' => 'label-check'
],
"translation_domain" => "FrontendBundle"
))
->add('send', SubmitType::class, array(
'label' => "labels.contact.send",
"translation_domain" => "FrontendBundle",
'attr' => [
'class' => "button enviar"
]
))
->getForm();
return $form;
}
/**
* @Route("/livescoring-start", name="livescoring_start")
*/
public function indexLivescoringStart (LivescoringCache $livescoringCache) {
// Devuelve las jornadas que se quieren mostrar en el livescoring de la index
$jornadasLivescoring = $this->em->getRepository(Jornada::class)->indexLivescoring();
$livescoring = [];
foreach($jornadasLivescoring as $jl){
$jornada = $this->em->getRepository(Jornada::class)->find($jl["id"]);
$competicion = $jornada->getCompeticion();
$livescoringParams = [
'isTeamLivescoring' => false
];
$livescoring["l-" . $jl["id"]] = [
...$livescoringCache->__invoke($jornada, $livescoringParams),
"compId" => $competicion->getId(),
"nombreClub" => $competicion->getClub()->getNombre(),
"nombreCompeticion" => $competicion->getNombre()
];
}
return $this->json($livescoring);
}
// public function contacto(Request $request, SendEmailUtil $mailer): Response {
// $sended = 0;
// //Creamos el formulario. Lo creamos asi ya que no hace falta entidad para contacto.
// $form = $this->createContactForm([]);
// $form->handleRequest($request);
// if (count($form->getErrors()) > 0) {
// $sended = -1;
// }
// if ($form->isSubmitted() && $form->isValid() /* && $this->captchaverify($request->get('g-recaptcha-response')) */) {
// $mailer->sendEmail([
// "from" => $this->getParameter('app.notifications.email_sender'),
// "to" => $this->getParameter('email.contacto'),
// "asunto" => 'Contacto FGM',
// "cco" => "gest.slope@gmail.com",
// "html" => $this->renderView('mail/contact_mail.html.twig', [
// 'nombre' => $form->get("name")->getData(),
// 'emailFrom' => $form->get("email")->getData(),
// 'texto' => $form->get("text")->getData(),
// 'telefono' => $form->get("phone")->getData(),
// 'bloque' => 'contacto'
// ])
// ]);
// //EmailContacto::sendEmailContact($form, $mailer, $this->getParameter('emails.contacto.user'));
// //Limpiamos el array (lo creamos de nuevo)
// $data = array();
// $form = $this->createContactForm($data);
// $sended = 1;
// }
// return $this->render('frontend/default/contacto.html.twig', array("form" => $form->createView(), "sended" => $sended));
// }
/**
* @Route("/search-panel", name="searchPanel", options={"expose"=true})
*
* Hace la busqueda de competiciones y clubes en la index
*/
public function searchPanel(Request $request) {
$text = $request->request->get('text');
$competicionesBusqueda = $this->em->getRepository(Competicion::class)->indexSearch($text);
$clubes = $this->em->getRepository(Club::class)->findClubes($text);
$competiciones = [];
foreach ($competicionesBusqueda as $cb) {
$competiciones[] = [
"id" => $cb["id"],
"nombre" => $cb["nombre"],
"fecha" => $cb["fecha"]->format("Y-m-d"),
"nombreClub" => $cb["nombreClub"]
];
}
return $this->json([
"competiciones" => $competiciones,
"clubes" => $clubes
]);
}
/**
* F-018 Falso feed de calendario
*
* @Route("/{locale}/f/club/{club}/feed.ics", name="feed")
*
*/
public function feed($locale, $club) {
return new JsonResponse(["club" => $club, "locale" => $locale]); //$this->redirect($this->generateUrl('_club', array('id' => $club)));
}
/**
* F-019 Envio de SMS de prueba para los usuarios con rol marketing
*
* @Route("/sms-reset", name="sms_reset_marketing", options={"expose"=true})
*
*/
public function smsReset(Request $request, EnvioCorreo $mailer, EnvioSms $messaging, UtilJugadores $util_jugadores) {
$respuesta = array();
$numero = $request->request->get('numero');
if (!$numero) {
$respuesta['codigo'] = -2;
$respuesta['mensaje'] = "No se ha indicado ningĆŗn numero de telefono al que mandar los mensajes";
return new JsonResponse($respuesta);
}
//usamos el campo publicidad a modo de prioridad. Buscamos los que son de prioridad negativa, segun su usuario
$usuario = $request->request->get('usuario');
$smss = $this->em->getRepository(Sms::class)->findBy(array('publicidad' => (-1 * $usuario)));
if (!$smss) {
$respuesta['codigo'] = -1;
$respuesta['mensaje'] = "No hay ningĆŗn SMS de ejemplo";
return new JsonResponse($respuesta);
}
$ahora = new \DateTime('now');
//ponemos los mensjaes como no enviados y le asignamos el numero de telefono que le corresponde
foreach ($smss as $sms) {
$sms->setTelefono($numero);
$sms->setUpdatedAt($ahora);
$messaging->enviarSmsAPI($sms, true, 0, true);
}
$this->em->flush();
//tomamos la IP y la localización del cliente para adjuntarla al email
$client_location = Recipe::getClientLocation();
$client_IP = Recipe::getClientIP();
$user = $this->em->getRepository(User::class)->findOneBy(array('ccc' => $usuario));
//mandamos email avisando del login
$args = [
"to" => "nacho.perez.benito@gmail.com",
"subject" => 'NextCaddy - SMS de prueba enviados (pagina de marketing)',
"html" => $this->renderView('backend/mail/email_envio_sms.html.twig', array(
'user' => $user,
'numero' => $numero,
'client_ip' => $client_IP,
'client_location' => $client_location))
];
//EnvioCorreo::enviarCorreo($args);
$mailer->enviarCorreo($args);
$respuesta['codigo'] = 0;
$respuesta['mensaje'] = "Se han enviado los mensajes de ejemplo";
return new JsonResponse($respuesta);
}
/**
* @Route("/field-f1", name="field_f1")
*/
public function fieldF1 () {
$totalRoundsNumber = $this->em->getRepository(Jornada::class)->countAllWithDeleted();
$totalPaidEnrolled = $this->em->getRepository(Inscrito::class)->countPaid();
return $this->render("frontend/Television/formula1.html.twig", [
"totalRoundsNumber" => $totalRoundsNumber,
"totalPaidEnrolled" => $totalPaidEnrolled
]);
}
/**
* F-020 Envio de SMS de prueba para demos y presentaciones
*
* @Route("/sms-reset/{numero}", name="sms_reset", options={"expose"=true})
*
*/
public function smsExample($numero, EnvioSms $messaging) {
$respuesta = ['codigo' => 0];
//usamos el campo publicidad a modo de prioridad. Buscamos los que son de maxima prioridad, ya que esos seran los que sean de ejemplo (prioridad minima 8, 9 o mas, no envia)
$smss = $this->em->getRepository(Sms::class)->findBy(array('publicidad' => 0));
if (!$smss) {
$respuesta['codigo'] = -1;
return $this->render("frontend/Default/smsExamples.html.twig", $respuesta);
}
$ahora = new \DateTime('now');
//ponemos los mensjaes como no enviados y le asignamos el numero de telefono que le corresponde
foreach ($smss as $sms) {
$sms->setTelefono($numero);
$sms->setUpdatedAt($ahora);
$messaging->enviarSmsAPI($sms, true, 0, true);
}
$this->em->flush();
$log_message = "Envio de Sms de prueba al telƩfono " . $numero;
$log = new Log('i', $log_message, null);
$this->em->persist($log);
$this->em->flush();
return $this->render("frontend/Default/smsExamples.html.twig", $respuesta);
}
/**
* F-021 Envio de visita a la pagina para estadisticas de Google Analitycs para Internet Explorer o fallo de la libreria Javascript
*
* @Route("/collect", name="collect", options={"expose"=true})
*
*/
public function collect() {
$params = array('v' => 1,
'tid' => "UA-61056427-1",
'cid' => rand(1000000, 9999999),
't' => "event",
'ec' => "Blocking",
'ea' => "NextCaddy",
'ni' => '0',
'z' => rand(1000000, 9999999),
);
$client = new FileGetContents(new Psr17Factory());
$browser = new Browser($client, new Psr17Factory());
$url = 'https://www.google-analytics.com/collect?' . http_build_query($params);
try {
$response = $browser->get($url);
$res = $response->getStatusCode() == '200';
} catch (\Throwable $e) {
$res = false;
}
return new JsonResponse($res);
}
/**
* F-022 Obtención de datos de un club concreto
*
* @Route("/getClubs", name="_ajGetClubs", options={"expose"=true})
*
*/
public function getClubsByName(Request $request) {
//retrieve the query
$query = $request->request->get("query");
$Clubs = $this->em->getRepository(Club::class)->findClubByName($query);
if (!$Clubs) {
// throw exception
}
$response = new JsonResponse();
$response->setData($Clubs);
return $response;
}
/**
* F-023 Obtención de datos de un jugador en un torneo
*
* @Route("/getJugador", name="_ajGetJugador", options={"expose"=true})
*
*/
public function getJugadorByName(Request $request) {
//retrieve the query
$query = $request->get('query');
$tour = $request->get('tournament');
$playersNames = $this->em->getRepository(Jugador::class)->findPlayerCard($query, $tour);
if (!$playersNames) {
// throw exception
}
$response = new JsonResponse();
$response->setData($playersNames);
return $response;
}
/**
* F-024 Pagina de instrucciones para integrar NextCaddy en la web del club
*
* @Route("/integracion", name="integracion")
*/
public function integracionWidget() {
$clubs = $this->em->getRepository(Club::class)->findTodosParaRandom();
if (!$clubs) {
$this->addFlash(
'error', "Ha ocurrido un error. Por favor, intƩntelo mƔs tarde");
//return $this->redirect($this->generateUrl('_club', array('id' => "AM00")));
return $this->redirect($this->generateUrl('portada'));
}
return $this->render("frontend/Club/generarWidget.html.twig", [
'clubes' => $clubs
]);
}
/**
* F-025 Pagina de Politica de cookies
*
* @Route("/cookies", name="cookies")
*/
public function cookies() {
return $this->render("frontend/Default/politica_cookies.html.twig");
}
/**
* F-026 Pagina de Politica de privacidad
*
* @Route("/privacidad", name="privacidad")
*/
public function privacidad() {
return $this->render("frontend/Default/privacidad.html.twig");
}
/**
* F-027 Pagina de Terminos y condiciones
*
* @Route("/terminos-y-condiciones", name="terminos_condiciones")
*/
public function terminosCondiciones() {
return $this->render("frontend/Default/terminos_condiciones.html.twig");
}
/**
* F-028 Listado de competiciones que tienen una jornada en el dia de hoy
*
* @Route("/livescoring/ahora/{letra}", name="envivo_ahora", defaults={ "letra" = "H" })
*/
public function envivoAhora($letra) {
$competiciones = $this->em->getRepository(Competicion::class)->findTodasEnVivo();
if (!$competiciones) {
$this->addFlash('error', "En este momento no disponemos de datos en vivo del dĆa de hoy. IntĆ©ntelo mĆ”s tarde");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
} else {
return $this->redirect($this->generateUrl('competicion_envivo', array('id' => $competiciones[0]['id'], 'letra' => $letra)));
}
}
/**
* F-029 Seleccionamos el tipo de livescoring para la competicion
*
* @Route("/livescoring-select/{id}/{ordenUrl}/{letra}", name="envivo_select", defaults={"letra"="H", "ordenUrl"=0}, options={"expose"=true})
*/
public function envivoSelect($id, $ordenUrl, $letra): RedirectResponse
{
//TODO search all uses and change to new livesoring route. While Redirect to new livescoring
return $this->redirect($this->generateUrl('livescoring', array('id' => $id)));
}
/**
* F-030 Visualización de competiciones a través del widget (iframe)
*
* @Route("/widget/{id}", name="_widget")
*/
public function widget($id) {
$entity = $this->em->getRepository(Club::class)->findOneBy(array("id" => $id, "habilitado" => true));
if (!$entity) {
$this->addFlash(
'error', "No encontramos el Club que nos ha solicitado");
//return $this->redirect($this->generateUrl('_club', array('id' => "AM00")));
return $this->redirect($this->generateUrl('portada'));
}
$futuras = array();
$pasadas = array();
if ($id != "AM00") {
//Me traigo competiciones futuras y pasadas
$futuras = $this->em->getRepository(Competicion::class)->getCompeticiones($id, 36, 0, "mayor", "ASC", true);
$pasadas = $this->em->getRepository(Competicion::class)->getCompeticiones($id, 36, 0, "menor", "DESC", true);
} else {
//Me traigo competiciones futuras y pasadas
$futuras = $this->em->getRepository(Competicion::class)->getCompeticionesOrganizador("AM00", 48, 0, "mayor", "ASC", true);
$pasadas = $this->em->getRepository(Competicion::class)->getCompeticionesOrganizador("AM00", 48, 0, "menor", "DESC", true);
}
return $this->render("frontend/Club/widget.html.twig", [
'entity' => $entity,
'futuras' => $futuras,
'pasadas' => $pasadas
]);
}
/**
* F-033 Mostrar inscritos estado de corte. [Creo que en desuso]
*
* @Route("/inscritoscorte", name="_ajInscritosCorte", options={"expose"=true})
*/
public function inscritosCorte(Request $request) {
$id = $request->request->get("id");
//comprobar datos de ordenacion competicion.
$comp_criteria = $this->em->getRepository(Competicion::class)->find($id);
$num_jugadores = $comp_criteria->getJugadores();
//Distinguimos entre si tenemos 1 o mas jugadores por equipo en la competicion,
//de esta manera para parejas y equipos mostramos la lista sin linea de corte (que ha sido deshabilidada en el backend)
//para mostrar el listado que estĆ” agrupado por parejas o equipos
if ($num_jugadores == 1) {
$params['competi'] = $comp_criteria;
if ($comp_criteria->getCriterio() == null && $comp_criteria->getCriterio2() == null) {
//comprobar datos de ordenacion categoria.
//$cat_criteria = $this->em->getRepository(Categoria::class)->findByCompeticion($id);
$cat_criteria = $this->em->getRepository(Categoria::class)->findCategoriasInscritosActivos($id);
foreach ($cat_criteria as $crit) {
$inscritosporcategoria[$crit->getId()] = $this->em->getRepository(Inscrito::class)->getPlayersByCatCorte($id, $crit->getId(), $crit->getCriterio(), $crit->getCriterio2());
}
$params['inscritosbycat'] = $inscritosporcategoria;
$params['categorias'] = $cat_criteria;
} else {
$cri1 = null;
$ord1 = "ASC";
$cmpcr1 = $comp_criteria->getCriterio();
if (!empty($cmpcr1)) {
$cri1 = $cmpcr1->getCampo();
$ord1 = $cmpcr1->getOrden();
}
$cri2 = null;
$ord2 = "ASC";
$cmpcr2 = $comp_criteria->getCriterio2();
if (!empty($cmpcr2)) {
$cri2 = $cmpcr2->getCampo();
$ord2 = $cmpcr2->getOrden();
}
$players = $this->em->getRepository(Inscrito::class)->getPlayersByCorte($id, $cri1, $ord1, $cri2, $ord2);
$params['inscritos'] = $players;
}
$params['showInscribeDateInWaitingList'] = $this->checkIfShowInscribeDateInWaitingList($id);
return $this->render('frontend/Inscritos/inscritos_corte_tbl_new.html.twig', $params);
} else {
$players = $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($comp_criteria, true);
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_criteria,
'sexos' => count($list)
));
// }
}
}
/**
* F-034 Mostrar inscritos con y sin linea de corte
* Ya es la plantilla la que me lo separa. Yo solo mando array agrupado
*
* @Route("/getListadoInscritos", name="listado_inscritos", options={"expose"=true})
*
*/
public function listadoInscritos(Request $request) {
$competitionId = $request->request->get("id", 0);
$token = $request->request->get("token", null);
//comprobar datos de ordenacion competicion.
$competition = $this->em->getRepository(Competicion::class)->find($competitionId);
if (!$competition) {
return new JsonResponse(-1);
}
if (!$this->util->checkTokenValidIframe($competition, $token)) {
return new JsonResponse(-1);
}
$numPlayersByTeam = $competition->getJugadores();
//Distinguimos entre si tenemos 1 o mas jugadores por equipo en la competicion,
//de esta manera para parejas y equipos mostramos la lista sin linea de corte (que ha sido deshabilidada en el backend)
//para mostrar el listado que estĆ” agrupado por parejas o equipos
if ($numPlayersByTeam == 1) {
$numTotalJornadas = count($competition->getJornadas());
$params['competition'] = $competition;
$jornadaConfigByCategory = [];
if ($competition->getCriterio() == null && $competition->getCriterio2() == null) {
$inscritosByCategory = [];
$categoriasByCompetition = [];
$cutOffByCategory = false;
$inscritos = $this->em->getRepository(Inscrito::class)->getActiveInscribedOrdered($competition);
foreach ($inscritos as $inscrito) {
if (!isset($categoriasByCompetition[$inscrito->getCategoria()->getId()])) {
$categoriasByCompetition[$inscrito->getCategoria()->getId()] = [
'id' => $inscrito->getCategoria()->getId(),
'name' => $inscrito->getCategoria()->getNombre(),
'criterio' => $inscrito->getCategoria()->getCriterio()?->getNombre(),
'criterio_id' => $inscrito->getCategoria()->getCriterio()?->getId(),
'criterio_orden' => $inscrito->getCategoria()->getCriterio()?->getOrden(),
'criterio2' => $inscrito->getCategoria()->getCriterio2()?->getNombre(),
];
if (!$cutOffByCategory && !is_null($inscrito->getCategoria()->getCriterio())) {
$cutOffByCategory = true;
}
$inscritosByCategory[$inscrito->getCategoria()->getId()] = [];
}
if ($inscrito->getParticipa() !== -1) {
$inscritosByCategory[$inscrito->getCategoria()->getId()][] = $inscrito;
}
$inscritosByCategory['total'][] = $inscrito;
}
foreach ($categoriasByCompetition as $categoria) {
if ($numTotalJornadas == 1) {
$jornadaConfigByCategory[$categoria['id']] = $this->em->getRepository(JornadaConfig::class)->findOneByCategoria($categoria['id']);
}
if ($categoria['criterio_id'] == 'HCP') {
usort($inscritosByCategory[$categoria['id']], function (Inscrito $a, Inscrito $b) use ($categoria) {
$participaComparison = $b->getParticipa() <=> $a->getParticipa();
if ($participaComparison !== 0) {
return $participaComparison;
}
if ($categoria['criterio_orden'] == 'ASC') {
$hcpComparison = $a->getHCP() <=> $b->getHCP();
} else {
$hcpComparison = $b->getHCP() <=> $a->getHCP();
}
if ($hcpComparison === 0) {
return $a->getId() <=> $b->getId();
}
return $hcpComparison;
});
}
}
$categoriasByCompetition['total'] = [
'id' => 'total',
'name' => 'Total'
];
if ($cutOffByCategory) {
unset($inscritosByCategory['total']);
unset($categoriasByCompetition['total']);
}
$params['inscritosByCat'] = $inscritosByCategory;
$params['categories'] = $categoriasByCompetition;
$params['jornadaConfig'] = $jornadaConfigByCategory;
} else {
$players = $this->em->getRepository(Inscrito::class)->getPlayersByCorte($competitionId, $competition->getCriterio()?->getCampo(), $competition->getCriterio()?->getOrden(), $competition->getCriterio2()?->getCampo(), $competition->getCriterio2()?->getOrden());
$params['inscritos'] = $players;
}
$params['showInscribeDateInWaitingList'] = $this->checkIfShowInscribeDateInWaitingList($competitionId);
return $this->render('frontend/Inscritos/inscritos_corte_tbl_new.html.twig', $params);
} else {
$players = $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($competition, true);
if ($numPlayersByTeam == 2 && $competition->getEstricto()) {
$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' => $competition,
'sexos' => count($list)
));
}
}
}
private function checkIfShowInscribeDateInWaitingList (int $competitionId): bool
{
$competitionSectionInscribedDateInWaitingList = $this->em->getRepository(CompetitionSection::class)->findOneBy([
"dom_id" => "fecha_lista_espera"
]);
$competitionSectionHiddenInscribedDateInWaitingList = $this->em->getRepository(CompetitionSectionHidden::class)->findOneBy([
"competition" => $competitionId,
"competition_section" => $competitionSectionInscribedDateInWaitingList
]);
return empty($competitionSectionHiddenInscribedDateInWaitingList);
}
/**
* @Route("/f1/{roundId}", name="formula1", options={"expose"=true})
*/
public function formula1 ($roundId) {
$round = $this->em->getRepository(Jornada::class)->find($roundId);
if (empty($round)) {
return $this->json([]);
}
$calculateCurrentHoleService = new CalculateCurrentHoleService();
$jornadaConfig = $this->em->getRepository(JornadaConfig::class)->findOneByJornada($round->getId());
$holesRange = explode("-", $jornadaConfig->getHoyos());
$holesRangeArray = range(intval($holesRange[0]), intval($holesRange[1]));
$isIndividual = "I" === $round->getModalidad()->getId();
$playerSchedules = $this->em->getRepository(JugadorHorario::class)->findJugadoresJornadaPublicada($round);
$numberHolesPlayed = 0;
$players = [];
if ($playerSchedules) {
foreach ($playerSchedules as $playerSchedule) {
$match = $playerSchedule->getPartida();
$lastHolePlayed = $this->em->getRepository(Resultado::class)->findUltimoHoyo($roundId,[$playerSchedule->getInscrito()->getId()])["hoyo"] ?? 0;
$currentHole = $calculateCurrentHoleService->calculateCurrentHole($lastHolePlayed, $holesRangeArray, $match->getTee(), $numberHolesPlayed);
if ($isIndividual) {
$player = $playerSchedule->getInscrito()?->getJugador();
$hcp_juego = $playerSchedule->getInscrito()->getHcpJuego() ? unserialize($playerSchedule->getInscrito()->getHcpJuego()) : "";
if(!empty($hcp_juego)) {
$hcpGame = $this->em->getRepository(HcpJuego::class)->findOneBy(["inscrito" => $playerSchedule->getInscrito(), "jornada" => array_keys($hcp_juego)[0]]);
}
$players[] = [
"teamId" => $playerSchedule->getEquipo(),
"pairId" => $playerSchedule->getPareja(),
"hcp" => round($playerSchedule->getInscrito()?->getHcp(),2),
"hcp_game" => round($hcpGame?->getHcp(), 2),
"matchId" => $match->getId(),
"teeTime" => $match->getHora(),
"currentHole" => $currentHole,
"name" => $player->getNombre(),
"surname" => $player->getApellidos(),
"license" => $player->getLicencia()
];
} else {
$enrolleds = $this->em->getRepository(Inscrito::class)->findBy([
"competicion" => $round->getCompeticion()?->getId(),
"equipo" => $playerSchedule->getEquipo(),
"pareja" => $playerSchedule->getPareja(),
"participa" => 1,
"estado" => "pagado"
]);
foreach ($enrolleds as $enrolled) {
$hcp_juego = $enrolled->getHcpJuego() ? unserialize($enrolled->getHcpJuego()) : "";
$hcpGame = "";
if(!empty($hcp_juego)) {
$hcpGame = $this->em->getRepository(HcpJuego::class)->findOneBy(["inscrito" => $enrolled, "jornada" => array_keys($hcp_juego)[0]]);
}
$players[] = [
"teamId" => $playerSchedule->getEquipo(),
"pairId" => $playerSchedule->getPareja(),
"hcp" => $enrolled?->getHcp(),
"hcp_game" => round($hcpGame, 2),
"matchId" => $match->getId(),
"teeTime" => $match->getHora(),
"currentHole" => $currentHole,
"name" => $enrolled->getJugador()?->getNombre(),
"surname" => $enrolled->getJugador()?->getApellidos(),
"license" => $enrolled->getJugador()?->getLicencia()
];
}
}
}
}
return $this->json($players);
}
/**
* @Route("/3djs/{teeId}/{holeId}", name="3djs", options={"expose"=true})
*/
public function apiInfoMarkers(Request $request)
{
$id = $request->request->get("id", 0);
}
/**
* F-036 Mostrar listado de las clasificaciones publicadas
*
* @Route("/getListadoClasificaciones", name="listado_clasificaciones", options={"expose"=true})
*
*/
public function listadoClasificaciones(Request $request)
{
$id = $request->request->get("id", 0);
$token = $request->request->get("token", null);
//comprobar competicion.
$competicion = $this->em->getRepository(Competicion::class)->find($id);
if (!$competicion) {
return new JsonResponse(-1);
}
if (!$this->util->checkTokenValidIframe($competicion, $token)) {
return new JsonResponse(-1);
}
$tipoClasif = 0; //Normal, ExAequo, PlayOff
$clasificaciones = array();
$nombresEquipos = array();
$equipos = array();
$numJugadores = $competicion->getJugadores();
//Me traigo todas las clasificaciones de esta competicion que sean visibles
$clasifs = $this->em->getRepository(Clasificacion::class)->findBy(["competicion" => $id, "publicada" => true], array("orden" => "ASC", "id" => "DESC"));
//Esta es la que sustituye a la anterior cuando se haga bien el menu para que no salga el icono de clasificaicones si no hay ninguna clasificacion visible
//$clasifs = $this->em->getRepository(Clasificacion::class)->findBy(array("id" => $id, "publicada" => 1), array("id" => "DESC"));
foreach ($clasifs as $clf) {
$modalidad = ($numJugadores == 2 || $clf->getModalidad() != "pareja") ? $clf->getModalidad() : "equipo-pareja";
$posicionAnt = 0;
switch ($modalidad) {
case "individual":
//13/07/2018 Jose: Se saca fuera del for $njornadasAux = $this->em->getRepository(Clasificado::class)->getJornadasByClasificacion($competicion);
//indexamos por clasificacion
//Tengo un listado ordenado por clasificaciones, de manera que tengo primero todos los clasificados ordenados de la 1Āŗ clasif, despues la 2Āŗ clasif y asi
$clasificaciones[$clf->getId()] = array("clasificacion" => $clf->getNombre(), "modalidad" => $modalidad, "calculo" => $clf->getCalculo()->getId(), "tipo" => $clf->getTipo(), "clasificados" => array(), "plantilla" => "Frontend:Clasificacion:clasificados_new-torneo-profesional.html.twig", "equipos" => array());
$listado = $this->em->getRepository(Clasificado::class)->getClasificacionIndividualListado($id, $clf->getCalculo()->getId(), $clf->getId());
foreach ($listado as $elemento) {
//El listado me repite el jugador para la siguiente jornada, me aprovecho de eso
//Al estar indexado, no repito los datos del jugador
if ($posicionAnt != $elemento["posicion"]) {
$clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]] = array("idi" => $elemento["idi"], "nombre" => $elemento["nombre"], "apellidos" => $elemento["apellidos"], "licencia" => $elemento["licencia"], "nacimiento" => $elemento["nacimiento"], "hcp" => $elemento["hcp"], "nivel" => $elemento["nivel"], "jornadas" => array());
$posicionAnt = $elemento["posicion"];
}
//Como estoy indexando arrays y no necesito repetir el jugador, aƱado tantas jornadas con sus resultados como necesite para ese jugador
$clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]]["jornadas"][$elemento["jornada"]] = array(
"bruto" => $elemento["bruto"],
"neto" => $elemento["neto"],
"contrapar" => $elemento["contrapar"],
"ide" => $elemento["ide"],
"penalidad" => $elemento["penalidad"],
"hcpJuego" => $elemento["hcpJuego"],
"especial" => $elemento["especial"]
);
}
break;
case "equipo-pareja":
//caso inscritos equipo clasificacion parejas. La plantilla puede ser la de equipo y parejas
$esEquipo = false;
//13/07/2018 Jose: Se saca fuera del for $njornadasAux = $this->em->getRepository(Clasificado::class)->getJornadasByClasificacionCouple($competicion, $esEquipo);
//Tengo un listado ordenado por clasificaciones, de manera que tengo primero todos los clasificados ordenados de la 1Āŗ clasif, despues la 2Āŗ clasif y asi
$clasificaciones[$clf->getId()] = array("clasificacion" => $clf->getNombre(), "modalidad" => $modalidad, "calculo" => $clf->getCalculo()->getId(), "tipo" => $clf->getTipo(), "clasificados" => array(), "plantilla" => "Frontend:Clasificacion:clasificadosParejasEquipos_new-torneo.html.twig");
$listado = $this->em->getRepository(Clasificado::class)->getClasificacionParejaListado($id, $competicion->getCalculo()->getId(), $clf->getId());
foreach ($listado as $elemento) {
//El listado me repite el jugador para la siguiente jornada, me aprovecho de eso
//Al estar indexado, no repito los datos del jugador
if ($posicionAnt != $elemento["posicion"]) {
$clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]] = array("equipo" => $elemento["equipo"], "pareja" => $elemento["pareja"], "jornadas" => array());
$posicionAnt = $elemento["posicion"];
}
//Como estoy indexando arrays y no necesito repetir el jugador, aƱado tantas jornadas con sus resultados como necesite para ese jugador
$clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]]["jornadas"][$elemento["jornada"]] = array(
"bruto" => $elemento["bruto"],
"neto" => $elemento["neto"],
"contrapar" => $elemento["contrapar"],
"ide" => $elemento["ide"],
"especial" => $elemento["especial"]
);
}
$equipos = array();
//$nombresEquipos = array();
$equiposAux = $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($competicion);
foreach ($equiposAux as $equipo) {
$indice = $equipo->getEquipo() . "-" . $equipo->getPareja();
if (!isset($equipos[$indice])) {
$equipos[$indice] = array();
$nombresEquipos[$indice] = $equipo->getNombreEquipo();
}
$jugador = $equipo->getJugador();
$equipos[$indice][] = array(
"idi" => $equipo->getId(),
"nombre" => $jugador->getNombre(),
"apellidos" => $jugador->getApellidos(),
"licencia" => $jugador->getLicencia(),
"nacimiento" => $jugador->getFecha(),
"hcp" => $equipo->getHcp(),
"nivel" => (!is_null($equipo->getNivel())) ? $equipo->getNivel()->getId() : "M"
);
}
$clasificaciones[$clf->getId()]["equipos"] = $equipos;
break;
default:
//caso inscritos equipo clasificacion equipo
//caso inscritos parejas clasificacion parejas
$equipos = array();
$esEquipo = ($competicion->getJugadores() > 2);
//13/07/2018 Jose: Se saca fuera del for $njornadasAux = $this->em->getRepository(Clasificado::class)->getJornadasByClasificacionCouple($competicion, $esEquipo);
//Tengo un listado ordenado por clasificaciones, de manera que tengo primero todos los clasificados ordenados de la 1Āŗ clasif, despues la 2Āŗ clasif y asi
$clasificaciones[$clf->getId()] = array("clasificacion" => $clf->getNombre(), "modalidad" => $modalidad, "calculo" => $clf->getCalculo()->getId(), "tipo" => $clf->getTipo(), "clasificados" => array(), "plantilla" => "Frontend:Clasificacion:clasificadosParejasEquipos_new-torneo.html.twig");
$listado = $this->em->getRepository(Clasificado::class)->getClasificacionParejaListado($id, $competicion->getCalculo()->getId(), $clf->getId());
foreach ($listado as $elemento) {
//El listado me repite el jugador para la siguiente jornada, me aprovecho de eso
//Al estar indexado, no repito los datos del jugador
if ($posicionAnt != $elemento["posicion"]) {
$clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]] = array("equipo" => $elemento["equipo"], "equipoId" => $elemento["equipoId"], "pareja" => $elemento["pareja"], "jornadas" => array());
$posicionAnt = $elemento["posicion"];
}
//Como estoy indexando arrays y no necesito repetir el jugador, aƱado tantas jornadas con sus resultados como necesite para ese jugador
$clasificaciones[$clf->getId()]["clasificados"][$elemento["posicion"]]["jornadas"][$elemento["jornada"]] = array(
"bruto" => $elemento["bruto"],
"neto" => $elemento["neto"],
"contrapar" => $elemento["contrapar"],
"ide" => $elemento["ide"],
"especial" => $elemento["especial"]
);
//Para una competicion de equipos (clasif de equipos) ha ocurrido que (supongo con logica) ha publicado las clasificaciones con pareja = 0,
//entocnes a la hora de buscar por equipo-pareja no encuentra los miembros, por lo que no los pintaba en el listado
//Si filtramos de manera que si pareja = 0 coja todos los miembros del equipo, ya los debe de pintar
if ($elemento["equipoId"]) {
if ($elemento["pareja"] != 0) {
$miembros = $this->em->getRepository(Inscrito::class)->getParejaByEquipoEntidad($elemento["pareja"], $elemento["equipoId"]);
} else {
$miembros = $this->em->getRepository(Inscrito::class)->findBy(["estado" => "pagado", "equipo_entidad" => $elemento["equipoId"]]);
}
$indice = $elemento["equipoId"];
} else {
if ($elemento["pareja"] != 0) {
$miembros = $this->em->getRepository(Inscrito::class)->getInscritosParejaCompeticion($competicion->getId(), $elemento["pareja"], $elemento["equipo"]);
} else {
$miembros = $this->em->getRepository(Inscrito::class)->findBy(["estado" => "pagado", "equipo" => $elemento["equipo"], "pareja" => $elemento["pareja"], "competicion" => $competicion]);
}
$indice = $elemento["equipo"] . "-" . $elemento["pareja"];
}
foreach ($miembros as $miembro) {
$jugador = $miembro->getJugador();
$mid = $miembro->getId();
$equipos[$indice][$mid] = array(//indexamos el miembro por Id de inscrito para evitar que duplique, que es lo que ocurria
"idi" => $mid,
"nombre" => $jugador->getNombre(),
"apellidos" => $jugador->getApellidos(),
"licencia" => $jugador->getLicencia(),
"nacimiento" => $jugador->getFecha(),
"hcp" => $miembro->getHcp(),
"pais" => (!is_null($jugador->getPais())) ? $jugador->getPais()->getId() : "EX",
"nivel" => (!is_null($miembro->getNivel())) ? $miembro->getNivel()->getId() : "M"
);
}
}
//$nombresEquipos = array();
//$equiposEntidadAux = $this->em->getRepository(Equipo::class)->findEquiposEnClasificacion($clf->getId());
//$equiposAux = $this->em->getRepository(Inscrito::class)->getPlayersParejasByCompeticion($id);
/* if (count($equiposEntidadAux) > 1) { //26/07/2018 Jose: Si hay equipos de la entidad nueva se hace mas facil
foreach ($equiposEntidadAux as $idAux) {
$equipo = $this->em->getRepository(Equipo::class)->find($idAux[1]); //Tengo que hacer el "[1]" por como lo devuelve la query.
$indice = $equipo->getEquipo();
if (!isset($equipos[$indice])) {
$equipos[$indice] = array();
$nombresEquipos[$indice] = $equipo->getNombre();
}
foreach ($equipo->getInscritos() as $inscrito) {
$jugador = $inscrito->getJugador();
$equipos[$indice][] = array(
"idi" => $inscrito->getId(),
"nombre" => $jugador->getNombre(),
"apellidos" => $jugador->getApellidos(),
"licencia" => $jugador->getLicencia(),
"hcp" => $inscrito->getHcp(),
"nivel" => (!is_null($inscrito->getNivel())) ? $inscrito->getNivel()->getId() : "M"
);
}
}
} else {
*/
/* foreach ($equiposAux as $equipo) {//"equipo" es inscrito
if (!$esEquipo) {
$indice = $equipo->getPareja();
} else {
$indice = $equipo->getEquipo();
}
if (!isset($equipos[$indice])) {
$equipos[$indice] = array();
$nombresEquipos[$indice] = $equipo->getNombreEquipo();
}
$jugador = $equipo->getJugador();
$equipos[$indice][] = array(
"idi" => $equipo->getId(),
"nombre" => $jugador->getNombre(),
"apellidos" => $jugador->getApellidos(),
"licencia" => $jugador->getLicencia(),
"nacimiento" => $jugador->getFecha(),
"hcp" => $equipo->getHcp(),
"nivel" => (!is_null($equipo->getNivel())) ? $equipo->getNivel()->getId() : "M"
);
} */
$equiposEntity = $this->em->getRepository(Equipo::class)->findEquiposParticipantesTodos($competicion);
if ($equiposEntity) {
foreach ($equiposEntity as $equipo) {
$nombresEquipos[$equipo->getEquipo()] = $equipo->getNombre();
}
}
//}
$clasificaciones[$clf->getId()]["equipos"] = $equipos;
break;
}
$clasificaciones[$clf->getId()]["posicion_corte"] = $clf->getPosicionCorte();
$clasificaciones[$clf->getId()]["etiqueta_corte"] = $clf->getEtiquetaCorte();
}
//13/07/2018 Jose: Se hace aqui porque no hay que calcularlo dentro de cada clasificacion
$njornadasAux = $this->em->getRepository(Clasificado::class)->getJornadasClasificacionByCompeticion($competicion);
//Busco cuantas jornadas tiene cada clasificacion, lo necesito para la cabecera de las tablas
$njornadas = array();
foreach ($njornadasAux as $nja) {
$njornadas[$nja['id']] = $nja['contador'];
}
// $zonasneutras = [];
// $bajadas = [];
// $znsAux = $this->em->getRepository(ZonaNeutra::class)->findBy([], ["tipoPrueba" => "ASC", "campoCorto" => "ASC", "son18hoyos" => "ASC", "categoria" => "ASC"]);
// foreach ($znsAux as $zn) {
// $zonasneutras[$zn->getTipoPrueba()][intval($zn->getCampoCorto())][intval($zn->getSon18hoyos())][$zn->getCategoria()->getId()] = ['max' => $zn->getPuntosMax(), 'min' => $zn->getPuntosMin(), 'subida' => $zn->getSubidaInferiorZn()];
// }
// $bajadasAux = $this->em->getRepository(Bajada::class)->findBy([], array('tipoPrueba' => 'ASC', 'campoCorto' => 'ASC', 'categoria' => 'ASC', 'puntos' => 'ASC'));
// foreach ($bajadasAux as $b) {
// $bajadas[$b->getTipoPrueba()][intval($b->getCampoCorto())][$b->getCategoria()->getId()][$b->getPuntos()] = $b->getBajada();
// }
// $categoriasHcp = $this->em->getRepository(CategoriaHandicap::class)->findAll();
return $this->render("frontend/Clasificacion/clasificacion_base.html.twig", [
'clasificaciones' => $clasificaciones,
'competicion' => $competicion,
'njornadas' => $njornadas,
'numJugadores' => $numJugadores,
'equipos' => $equipos,
'nombresEquipos' => $nombresEquipos,
'tipoClasif' => $tipoClasif,
// "zonasneutras" => $zonasneutras,
// "bajadas" => $bajadas,
// "categoriasHcp" => $categoriasHcp,
]);
}
/**
* F-037 Listado ordenado de resultados hasta un hoyo concreto
*
* @Route("/getListadoDinamicoClasificacion", name="listado_dinamico", options={"expose"=true})
*
*/
public function listadoClasificacionDinamico(Request $request) {
$id = $request->request->get("id", 0);
$token = $request->request->get("token", null);
//comprobar competicion.
$competicion = $this->em->getRepository(Competicion::class)->find($id);
if (!$competicion) {
return $this->render("frontend/Clasificacion/clasificacionListadoDinamico.html.twig", array('listado' => []));
}
if (!$this->util->checkTokenValidIframe($competicion, $token)) {
return new JsonResponse(-1);
}
$nJor = $this->em->getRepository(Jornada::class)->getCountPorCompeticion($competicion);
$clasificacionId = $request->request->get("clasificacion");
$clasificacion = $this->em->getRepository(Clasificacion::class)->find($clasificacionId);
if (is_null($clasificacion)) {
return $this->render("frontend/Clasificacion/clasificacionListadoDinamico.html.twig", array('listado' => []));
}
$orden = $request->request->get("orden", $nJor);
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $competicion, 'orden' => intval($orden)));
if (!$jornada) {
return $this->render("frontend/Clasificacion/clasificacionListadoDinamico.html.twig", array('listado' => []));
}
$hoyo = $request->request->get("hoyo", 18);
$inscritos = $this->em->getRepository(Inscrito::class)->getPlayersByCompeticion($competicion);
foreach ($inscritos as $inscrito) {
$hcpJuego = unserialize($inscrito->getHcpJuego());
if (isset($hcpJuego[$jornada->getId()])) {
$hcpJuegoJornada = $hcpJuego[$jornada->getId()];
$hcpJuegoNuevaTabla = $this->em->getRepository(HcpJuego::class)->findOneBy(array('jornada' => $jornada, 'inscrito' => $inscrito));
if (is_null($hcpJuegoNuevaTabla)) {
$hcpJuegoNuevaTabla = new HcpJuego();
$hcpJuegoNuevaTabla->setHcp($hcpJuegoJornada);
$hcpJuegoNuevaTabla->setInscrito($inscrito);
$hcpJuegoNuevaTabla->setJornada($jornada);
$this->em->persist($hcpJuegoNuevaTabla);
$this->em->flush();
}
}
}
//Si es individual o si es Four Ball o Canada que se guarda tambiƩn la tarjeta individual del jugador.
if ($clasificacion->getModalidad() == "individual" || $jornada->getModalidad()->getId() == "P" || $jornada->getModalidad()->getId() == "C") {
$listado = $this->em->getRepository(Resultado::class)->getListadoAcumuladoHoyos($clasificacion->getId(), $jornada, intval($hoyo), $clasificacion->getCalculo()->getId(), $competicion->getFormula()->getId());
} else {
/*
* Habria que hacer la query para clasificar individualmente a los miembros de la pareja en caso de haberse hecho una clasificacion individual de una Xsome.
*/
}
return $this->render("frontend/Clasificacion/clasificacionListadoDinamico.html.twig", [
'listado' => $listado,
'hoyo' => $hoyo,
'competicion' => $competicion,
'njornadas' => $nJor,
'clasificacion' => $clasificacion,
'orden' => $orden
]);
}
/**
* F-038 Listado ordenado de resultados de parejas hasta un hoyo concreto variable
*
* @Route("/getListadoDinamicoClasificacionPareja", name="listado_dinamico_pareja", options={"expose"=true})
*
*/
public function listadoClasificacionDinamicoPareja(Request $request) {
$id = $request->request->get("id");
//comprobar competicion.
$competicion = $this->em->getRepository(Competicion::class)->findOneById($id);
if (!$competicion) {
return new JsonResponse(-1);
}
$nJor = $this->em->getRepository(Jornada::class)->getCountPorCompeticion($competicion);
$numJugadores = $competicion->getJugadores();
$clasificacionId = $request->request->get("clasificacion");
$clasificacion = $this->em->getRepository(Clasificacion::class)->findOneById($clasificacionId);
if (is_null($clasificacion)) {
return new JsonResponse(-1);
}
$orden = $request->request->get("orden");
if (is_null($orden)) {
$orden = $nJor;
}
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $competicion, 'orden' => intval($orden)));
if (!$jornada) {
return new JsonResponse(-1);
}
$hoyo = $request->request->get("hoyo", 18);
$inscritos = $this->em->getRepository(Inscrito::class)->getPlayersByCompeticion($competicion);
$nombresEquipos = array();
foreach ($inscritos as $inscrito) {
$hcpJuego = unserialize($inscrito->getHcpJuego());
if (isset($hcpJuego[$jornada->getId()])) {
$hcpJuegoJornada = $hcpJuego[$jornada->getId()];
$hcpJuegoNuevaTabla = $this->em->getRepository(HcpJuego::class)->findOneBy(array('jornada' => $jornada, 'inscrito' => $inscrito));
if (is_null($hcpJuegoNuevaTabla)) {
$hcpJuegoNuevaTabla = new HcpJuego();
$hcpJuegoNuevaTabla->setHcp($hcpJuegoJornada);
$hcpJuegoNuevaTabla->setInscrito($inscrito);
$hcpJuegoNuevaTabla->setJornada($jornada);
$this->em->persist($hcpJuegoNuevaTabla);
$this->em->flush();
}
}
if ($numJugadores != 2) {
if (!isset($nombresEquipos[$inscrito->getEquipo()])) {
$nombresEquipos[$inscrito->getEquipo()] = $inscrito->getNombreEquipo();
}
}
}
if ($clasificacion->getModalidad() == "pareja" || $clasificacion->getModalidad() == "equipo") {
$listado = $this->em->getRepository(Resultado::class)->getAcumuladoHoyosEquipo($clasificacion->getId(), $jornada, intval($hoyo), $clasificacion->getCalculo()->getId());
} else {
/*
* Habria que hacer la query para buscar la suma de cada miembro de la pareja.
*/
}
$datosJugadores = array();
foreach ($listado as $equipo) {
$datosJugadores[$equipo["equipo"]] = $this->em->getRepository(Inscrito::class)->getDatosHcpJuegoByEquipo($equipo["equipo"], $jornada);
}
return $this->render("frontend/Clasificacion/clasificacionListadoDinamicoPareja.html.twig", array(
'listado' => $listado,
'datosJugadores' => $datosJugadores,
'hoyo' => $hoyo,
'competicion' => $competicion,
'njornadas' => $nJor,
'clasificacion' => $clasificacion,
'numJugadores' => $numJugadores,
'nombresEquipos' => $nombresEquipos,
'orden' => $orden
));
}
/**
* F-052 Verificacion del captcha
*
* @param type $recaptcha
* @return type
*
*/
function captchaverify($recaptcha) {
$url = "https://www.google.com/recaptcha/api/siteverify";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
"secret" => "6Ld1hVIUAAAAAPgO50zNtsjjVDmorOUMwMCf8J_U", "response" => $recaptcha));
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response);
return $data->success;
}
/**
* F-060 Estadisticas de una partida tras haber sido jugada [EN DESUSO]
*
* @Route("/match/{token}/{publi}", name="_match", options={"expose"=true}, defaults={"publi" = 0})
*/
public function partidaInscrito($token, $publi) {
// TODO: COMPROBAR QUE ESTĆ EN DESUSO Y ELIMINAR O RECUPERAR EN TAL CASO
$i = 0;
$enc = false;
$partidas = $this->em->getRepository(PartidaHorario::class)->findByToken($token);
$tam = count($partidas);
while ($i < $tam && !$enc) {
$partida = $partidas[$i];
$enc = (strcmp($partida->getToken(), $token) == 0); //buscamos la partida exacta (antes habia un findoneby pero es caseinsensitive, por lo que no nos vale)
$i++;
}
if (!$enc) {
$this->addFlash('error', "No existe la partida");
return $this->redirect($this->generateUrl('competiciones_comite'));
}
$jornada = $partida->getHorario()->getJornada(); //Cuidado si horario es nulo porque no exista $partida
if (!$jornada) {
$this->addFlash('error', "No existe la Jornada");
return $this->redirect($this->generateUrl('competiciones_comite'));
}
//Deshabilitamos el filtro del softdelete, ya que como no tenemos el ID de la competicion no podemos hacer su busqueda explicita para la comprobacion,
//Al deshabilitarse la competicion va a existir, pero va a estar marcado el softdelete, por lo que si es asĆ, avisamos de que estĆ” borrada
$this->em->getFilters()->disable('softdeleteable');
$competicion = $jornada->getCompeticion();
if (!$competicion || !is_null($competicion->getDeletedAt())) {
$this->addFlash('error', 'No se ha encontrado la competición');
return $this->redirect($this->generateUrl('competiciones_comite'));
}
$this->em->getFilters()->enable('softdeleteable');
//Si no tenemos resultados, rediigimos a la pagina de frontend
if (!$this->em->getRepository(Competicion::class)->hasResultados($competicion->getId())) {
$this->addFlash('error', 'Información de partida aún no disponible. Inténtelo mÔs tarde');
return $this->redirect($this->generateUrl('_tournament', array('id' => $competicion->getId())));
}
$jornadaId = $jornada->getId();
$modalidad = $jornada->getModalidad()->getId();
$jugadoresAux = $this->em->getRepository(JugadorHorario::class)->findBy(['partida' => $partida->getId()], ['inscrito' => 'ASC']); //ordenamos por ID inscrito para mantener siempre el orden
$equipos = array();
$hcpJs = array();
$contrapares = array();
$resumen = array();
$valores = ["eagles" => -2, "birdies" => -1, "pares" => 0, "bogeys" => 1]; //Falta resultado Peor (> +1)
$acumulados = ["eagles" => 0, "birdies" => 0, "pares" => 0, "bogeys" => 0, "peor" => 0]; //Falta resultado Peor (> +1)
//$calculo = ($competicion->getCalculo()->getId() == "H" ? "Hcp" : "Scratch" );
//Si es medal play es susceptible de no tener los contrapares
//Por lo tanto preparamos los datos que nos hacen falta
if ($competicion->getFormula()->getId() == 'M') {
$jcs = $this->em->getRepository(JornadaConfig::class)->findByJornada($jornada);
$hoyosDatos = array();
$hoyosDatosAux = array();
foreach ($jcs as $jc) {
$jconfig_cat = $jc->getCategoria()->getId();
$cc = $this->em->getRepository(CategoriaConfig::class)->findOneByCategoria($jconfig_cat);
if ($cc->getSexo() == "" || $cc->getSexo() == "sin especificar") {
$cc->setSexo('masculino');
}
$hoyosDatosAux = $this->em->getRepository(Trazado::class)->findDatosHoyoByTrazado($jornada->getTrazado()->getNumero(), $jc->getBarra()->getId(), $cc->getSexo());
foreach ($hoyosDatosAux as $h) {
$hoyosDatos[$cc->getSexo()][$jconfig_cat][$h["numero"]] = $h;
}
}
}
if ($modalidad == "I") {
//AƱadido para calculo de contrapares que no tengamos todavia de medal play.
if ($jornada->getCompeticion()->getFormula()->getId() == 'M') {
foreach ($jugadoresAux as $h) {
$insc = $h->getInscrito();
$inscId = $insc->getId();
$resultados = $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId, "inscrito" => $inscId], ['hoyo' => 'ASC']);
foreach ($resultados as $r) {
if (is_null($r->getContraparScratch())) {
$par = $hoyosDatos[$insc->getJugador()->getSexo()][$insc->getCategoria()->getId()][$r->getHoyo()]["par"];
$r->setContraparScratch($r->getScratch() - $par);
$r->setContraparHcp($r->getHcp() - $par);
}
}
}
$this->em->flush();
}
foreach ($jugadoresAux as $h) {
$insc = $h->getInscrito();
$inscId = $insc->getId();
$jorConfig = $this->em->getRepository(JornadaConfig::class)->findOneBy(["jornada" => $jornadaId, "categoria" => $insc->getCategoria()]);
$tipo_hoyos = $jorConfig->getHoyos();
$limits = explode('-', $tipo_hoyos);
$esp = $this->em->getRepository(Resultado::class)->findResultadoEspecial($inscId, $jornadaId); //buscamos si tiene resultado especial para no incluirlo
if (!$esp) {
$hoyos = array_fill($limits[0], ($limits[1] - $limits[0]) + 1, true);
$hcpJs[$inscId] = $this->em->getRepository(HcpJuego::class)->findOneByInscrito($insc);
foreach ($valores as $k => $v) {
$resultados = $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId, "inscrito" => $inscId, "contrapar_scratch" => $v], ['hoyo' => 'ASC']);
$valor = count($resultados);
$contrapares[$inscId][$k] = $valor;
$acumulados[$k] += $valor;
$resumen[$inscId][$k] = [];
foreach ($resultados as $resu) {
$resumen[$inscId][$k][] = $resu->getHoyo();
//eliminamos el hoyo, para saber cuales nos quedan sin usar, esos seran los resultados peores (ya que no son ni par, ni eagle, ni birdie ni bogey)
unset($hoyos[$resu->getHoyo()]);
}
}
//Lo que nos queda son los resultados peores
$peor = count($hoyos);
$contrapares[$inscId]["peor"] = $peor;
$acumulados["peor"] += $peor;
$resumen[$inscId]["peor"] = [];
foreach ($hoyos as $hoyo => $ho) {
$resumen[$inscId]["peor"][] = $hoyo;
}
$jugadores[] = $h;
}
}
} else {
//AƱadido para calculo de contrapares que no tengamos todavia de medal play.
if ($jornada->getCompeticion()->getFormula()->getId() == 'M' && in_array($modalidad, ["C", "P"])) {
$teams = array();
foreach ($jugadoresAux as $h) {
$equipo = $h->getEquipo();
$pareja = $h->getPareja();
$teams[$h->getEquipo() . "-" . $h->getPareja()] = ["equipo" => $equipo, "pareja" => $pareja];
$inscritos = $this->em->getRepository(Inscrito::class)->findBy(['equipo' => $equipo, 'pareja' => $pareja, 'competicion' => $jornada->getCompeticion()->getId()], ['id' => 'ASC']);
$resultadosMiembros = array();
foreach ($inscritos as $inscrito) {
$resultados = $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId, "inscrito" => $inscrito->getId()], ['hoyo' => 'ASC']);
foreach ($resultados as $r) {
if (is_null($r->getContraparScratch())) {
$par = $hoyosDatos[$inscrito->getJugador()->getSexo()][$inscrito->getCategoria()->getId()][$r->getHoyo()]["par"];
$r->setContraparScratch($r->getScratch() - $par);
$r->setContraparHcp($r->getHcp() - $par);
}
}
array_push($resultadosMiembros, $resultados);
}
$resultadosPareja = $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId, 'equipo' => $equipo, 'pareja' => $pareja], ['hoyo' => 'ASC']);
foreach ($resultadosPareja as $loop => $rp) {
if (is_null($rp->getContraparScratch())) {
$m1 = $resultadosMiembros[0][$loop];
$m2 = $resultadosMiembros[1][$loop];
if ($modalidad == "C") {
$rp->setContraparScratch($m1->getContraparScratch() + $m2->getContraparScratch());
$rp->setContraparHcp($m1->getContraparHcp() + $m2->getContraparHcp());
} elseif ($modalidad == "P") {
$rp->setContraparScratch(min($m1->getContraparScratch(), $m2->getContraparScratch()));
$rp->setContraparHcp(min($m1->getContraparHcp(), $m2->getContraparHcp()));
}
}
}
}
$this->em->flush();
}
foreach ($jugadoresAux as $h) {
$equipo = $h->getEquipo();
$pareja = $h->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()], ['id' => 'ASC']);
foreach ($inscritos as $inscrito) {
$jugadores[$equipo . "-" . $pareja] .= $inscrito->getJugador()->getNombre() . " - ";
}
$jugadores[$equipo . "-" . $pareja] = substr($jugadores[$equipo . "-" . $pareja], 0, strlen($jugadores[$equipo . "-" . $pareja]) - 3);
$jorConfig = $this->em->getRepository(JornadaConfig::class)->findOneBy(["jornada" => $jornadaId, "categoria" => $inscrito->getCategoria()]);
$tipo_hoyos = $jorConfig->getHoyos();
$limits = explode('-', $tipo_hoyos);
$hcpJs[$equipo . "-" . $pareja] = $this->em->getRepository(HcpJuego::class)->findOneBy(['equipo' => $equipo, 'pareja' => $pareja, 'jornada' => $jornada->getId()]);
$equipos[$equipo . "-" . $pareja] = $this->em->getRepository(Inscrito::class)->findOneBy(['equipo' => $equipo, 'pareja' => $pareja, 'competicion' => $competicion->getId()]);
$hoyos = array_fill($limits[0], ($limits[1] - $limits[0]) + 1, true);
//Calculo de los detalles por hoyo
foreach ($valores as $k => $v) {
$resultados = $this->em->getRepository(Resultado::class)->findBy(["jornada" => $jornadaId, 'equipo' => $equipo, 'pareja' => $pareja, "contrapar_scratch" => $v], ['hoyo' => 'ASC']);
$valor = count($resultados);
$contrapares[$equipo . "-" . $pareja][$k] = $valor;
$acumulados[$k] += $valor;
$resumen[$equipo . "-" . $pareja][$k] = [];
foreach ($resultados as $resu) {
$resumen[$equipo . "-" . $pareja][$k][] = $resu->getHoyo();
//eliminamos el hoyo, para saber cuales nos quedan sin usar, esos seran los resultados peores (ya que no son ni par, ni eagle, ni birdie ni bogey)
unset($hoyos[$resu->getHoyo()]);
}
}
//Lo que nos queda son los resultados peores
$peor = count($hoyos);
$contrapares[$equipo . "-" . $pareja]["peor"] = $peor;
$acumulados["peor"] += $peor;
$resumen[$equipo . "-" . $pareja]["peor"] = [];
foreach ($hoyos as $hoyo => $ho) {
$resumen[$equipo . "-" . $pareja]["peor"][] = $hoyo;
}
}
}
}
// 2023/08/07 esto esta obsoleto a dia de hoy (deberia haberse ocultado en 2023/05/08)
// $url = $this->util->acortarUrl('_match', array('token' => $token));
return $this->render("frontend/Competicion/match.html.twig", [
'competicion' => $competicion,
'jugadores' => $jugadores,
'hcpJs' => $hcpJs,
'equipos' => $equipos,
'ccc' => $publi,
'contrapares' => $contrapares,
'acumulados' => $acumulados,
'resumen' => $resumen,
'partida' => $partida,
// 'url' => $url,
'modalidad' => $modalidad,
'limits' => $limits
]);
}
/**
* F-062
*
* @Route("/pago/{idi}/tpv/{idp}", name="pago_tpv")
*/
public function tpv($idi, $idp) {
$params = array();
$inscrito = $this->em->getRepository(Inscrito::class)->find($idi);
if (!$inscrito) {
throw new NotFoundHttpException("No existe el inscrito");
}
$competicion = $inscrito->getCompeticion();
if (!$competicion) {
$this->addFlash(
'error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
$pedido = $this->em->getRepository(Pedido::class)->find($idp);
if (!$pedido) {
//poner que redirija a competicion en un mensaje de esos flash
//y que ponga el inscrito y el pedido a "Error"
throw new NotFoundHttpException("No existe el pedido asociado a la inscripcion");
}
$secret = $this->getParameter('secret');
$redsys = new RedsysAPI();
$redsys->setParameter("DS_MERCHANT_AMOUNT", intval(number_format($pedido->getImporte() * 100, 0, "", "")));
$redsys->setParameter("DS_MERCHANT_ORDER", strval($inscrito->getPedido()->getNumero()));
$redsys->setParameter("DS_MERCHANT_CURRENCY", $this->getParameter('tpv.currency'));
$redsys->setParameter("DS_MERCHANT_TRANSACTIONTYPE", 0); //0 = Pago
/*
if (strpos($competicion->getOrganizador()->getId(), "AM") !== false) {
$usuario = $this->em->getRepository(User::class)->findOneByUsername("AM00");
} else {
$usuario = $this->em->getRepository(User::class)->findOneByUsername($competicion->getOrganizador()->getId());
}
*/
$fechaTPVDesprosa = new \DateTime("2021-04-20 10:00:00"); //Desprosa es el nombre de la empresa y 20 de mayo es cuando se hizo este codigo
$fechaTPVSherry = new \DateTime("2022-03-14 00:00:00"); //Aunque el cambio se hace el dia 09/03/2022, hay competiciones abiertas hasta el dia 12, por lo que se espera a que se cierren
$fechaTPVAlhaurin = new \DateTime("2023-05-19 00:00:00"); //Peticion de la solicitud
$idComp = $competicion->getId();
//El pago, lo hace LV05 o CM81 o lo hacemos con nuestra pasarela
//IMportante!!! En la configuracion del TPV (en la web del redsys) debe de aparecer como "Asincrona"
$orgnzdr = "AM00";
switch (trim($competicion->getOrganizador()->getId())) {
case "LV05":
$orgnzdr = "LV05";
break;
case "GALN":
$orgnzdr = "GALN";
break;
case "CMC8":
$orgnzdr = "CMC8";
if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
$orgnzdr = "AM00";
}
break;
case "CM81":
$orgnzdr = "CM81";
if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
$orgnzdr = "AM00";
}
break;
case "AM15":
$orgnzdr = "AM15";
if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
$orgnzdr = "AM00";
}
break;
case "AMC3":
$orgnzdr = "AMC3";
if ($competicion->getInicio()->format("U") < $fechaTPVSherry->format("U")) {
$orgnzdr = "AM00";
}
break;
case "AM22":
$orgnzdr = "AM22";
if ($competicion->getInicio()->format("U") < $fechaTPVAlhaurin->format("U")) {
$orgnzdr = "AM00";
}
break;
default:
$orgnzdr = "AM00";
break;
}
$usuario = $this->em->getRepository(User::class)->findOneByUsername($orgnzdr);
$usuarioTpv = $usuario->getTpv();
$merchantCode = $redsys->merchantCodeFromUser($usuarioTpv, $secret);
$terminal = $redsys->terminalFromUser($usuarioTpv, $secret);
$redsys->setParameter("DS_MERCHANT_MERCHANTCODE", $merchantCode);
$redsys->setParameter("DS_MERCHANT_TERMINAL", $terminal);
$params['Ds_Merchant_KEY_256'] = $redsys->keyFromUser($usuarioTpv, $secret); //Key de REAL del TPV correspondiente
//lineas originales
//$params['Ds_Merchant_KEY_256'] = $this->getParameter('tpv.key_test_256'); //Key de TEST.
//$params['Ds_Merchant_KEY_256'] = $this->getParameter('tpv.key_256'); //Key de REAL. Codigo antiguo
//$redsys->setParameter("DS_MERCHANT_MERCHANTCODE", $this->getParameter('tpv.merchant_code'));
//$redsys->setParameter("DS_MERCHANT_TERMINAL", $this->getParameter('tpv.terminal'));
//$dire = str_replace("https", "http", $this->generateUrl('pago_procesar', array(), UrlGeneratorInterface::ABSOLUTE_URL)); //Como el SSL de la pagina es Lets encrypt y el banco no lo admite, tenemos que hacerlo por HTTP, y no por HTTPS para evitar errores
$dire = $this->generateUrl('pago_procesar', array(), UrlGeneratorInterface::ABSOLUTE_URL);
$redsys->setParameter("DS_MERCHANT_MERCHANTURL", $dire); //URL de mi pagina para procesar el pago
//$redsys->setParameter("DS_MERCHANT_MERCHANTURL", $this->generateUrl('pago_procesar', array(), UrlGeneratorInterface::ABSOLUTE_URL)); //URL de mi pagina para procesar el pago
$idInsc = ($competicion->getJugadores() == 1) ? $inscrito->getId() : 0;
$redsys->setParameter("DS_MERCHANT_URLOK", $this->generateUrl('pago_terminado', array('token' => 'success', 'id' => $idComp, 'idi' => $idInsc), UrlGeneratorInterface::ABSOLUTE_URL));
$redsys->setParameter("DS_MERCHANT_URLKO", $this->generateUrl('pago_terminado', array('token' => 'fail', 'id' => $idComp, 'idi' => $idInsc), UrlGeneratorInterface::ABSOLUTE_URL));
$redsys->setParameter("DS_MERCHANT_PAYMETHODS", "C"); //solo pago con tarjeta
$redsys->setParameter("DS_MERCHANT_MERCHANTNAME", $this->getParameter('tpv.merchant_name'));
$redsys->setParameter("DS_MERCHANT_MERCHANTDATA", base64_encode(json_encode(array('idi' => $idi, 'idp' => $idp))));
$params['Ds_Merchant_URL_Pago'] = $this->getParameter('tpv.url');
$params['Ds_SignatureVersion'] = $this->getParameter('tpv.version'); //Version SHA256 --> esto no se usa
$params['Ds_MerchantParameters'] = $redsys->createMerchantParameters(); //Parametros, una vez codificados
$params['Ds_Signature'] = $redsys->createMerchantSignature($params['Ds_Merchant_KEY_256']); //Firma de SHA256
return $this->render('frontend/Default/tpv.html.twig', $params);
}
/**
* F-063 Genera el formulario de devolución del banco
*
* @Route("/devolucion/{idi}/tpv/{idp}", name="devolucion_tpv")
*/
public function tpvDevolucion($idi, $idp) {
$params = array();
$inscrito = $this->em->getRepository(Inscrito::class)->find($idi);
if (!$inscrito) {
throw new NotFoundHttpException("No existe el inscrito");
}
$competicion = $inscrito->getCompeticion();
if (!$competicion) {
$this->addFlash(
'error', "El torneo buscado no existe");
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
$pedido = $this->em->getRepository(Pedido::class)->find($idp);
if (!$pedido) {
//poner que redirija a competicion en un mensaje de esos flash
//y que ponga el inscrito y el pedido a "Error"
throw new NotFoundHttpException("No existe el pedido asociado a la inscripcion");
}
$secret = $this->getParameter('secret');
$importeDev = intval(number_format($pedido->getImporte() * 100, 0, "", ""));
$redsys = new RedsysAPI();
$redsys->setParameter("DS_MERCHANT_AMOUNT", $importeDev);
$redsys->setParameter("DS_MERCHANT_ORDER", $this->util->reformatPedido($pedido));
$redsys->setParameter("DS_MERCHANT_CURRENCY", $this->getParameter('tpv.currency'));
$redsys->setParameter("DS_MERCHANT_TRANSACTIONTYPE", 3); //3 = Devolucion
/*
if (strpos($competicion->getOrganizador()->getId(), "AM") !== false) {
$usuario = $this->em->getRepository(User::class)->findOneByUsername("AM00");
} else {
$usuario = $this->em->getRepository(User::class)->findOneByUsername($competicion->getOrganizador()->getId());
}
*/
$fechaTPVDesprosa = new \DateTime("2021-04-20 10:00:00"); //Desprosa es el nombre de la empresa y 20 de mayo es cuando se hizo este codigo
$fechaTPVSherry = new \DateTime("2022-03-14 00:00:00"); //Aunque el cambio se hace el dia 09/03/2022, hay competiciones abiertas hasta el dia 12, por lo que se espera a que se cierren
$fechaTPVAlhaurin = new \DateTime("2023-05-19 00:00:00");
$idComp = $competicion->getId();
//El pago, lo hace LV05 o CM81 o lo hacemos con nuestra pasarela
$orgnzdr = "AM00";
switch (trim($competicion->getOrganizador()->getId())) {
case "LV05":
$orgnzdr = "LV05";
break;
case "GALN":
$orgnzdr = "GALN";
break;
case "CMC8":
$orgnzdr = "CMC8";
if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
$orgnzdr = "AM00";
}
break;
case "CM81":
$orgnzdr = "CM81";
if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
$orgnzdr = "AM00";
}
break;
case "AM15":
$orgnzdr = "AM15";
if ($competicion->getInicio()->format("U") < $fechaTPVDesprosa->format("U")) {
$orgnzdr = "AM00";
}
break;
case "AMC3":
$orgnzdr = "AMC3";
if ($competicion->getInicio()->format("U") < $fechaTPVSherry->format("U")) {
$orgnzdr = "AM00";
}
break;
case "AM22":
$orgnzdr = "AM22";
if ($competicion->getInicio()->format("U") < $fechaTPVAlhaurin->format("U")) {
$orgnzdr = "AM00";
}
break;
default:
$orgnzdr = "AM00";
break;
}
$usuario = $this->em->getRepository(User::class)->findOneByUsername($orgnzdr);
$usuarioTpv = $usuario->getTpv();
$redsys->setParameter("DS_MERCHANT_MERCHANTCODE", $redsys->merchantCodeFromUser($usuarioTpv, $secret));
$redsys->setParameter("DS_MERCHANT_TERMINAL", $redsys->terminalFromUser($usuarioTpv, $secret));
$params['Ds_Merchant_KEY_256'] = $redsys->keyFromUser($usuarioTpv, $secret); //Key de REAL del TPV correspondiente
//lineas originales
//$redsys->setParameter("DS_MERCHANT_MERCHANTCODE", $this->getParameter('tpv.merchant_code'));
//$redsys->setParameter("DS_MERCHANT_TERMINAL", $this->getParameter('tpv.terminal'));
//$dire = str_replace("https", "http", $this->generateUrl('competicion_cancelainscrito', array('id' => $idComp, 'pedido' => $idp), UrlGeneratorInterface::ABSOLUTE_URL)); //Como el SSL de la pagina es Lets encrypt y el banco no lo admite, tenemos que hacerlo por HTTP, y no por HTTPS para evitar errores
$dire = $this->generateUrl('competicion_cancelainscrito', array('id' => $idComp, 'pedido' => $idp), UrlGeneratorInterface::ABSOLUTE_URL);
$redsys->setParameter("DS_MERCHANT_MERCHANTURL", $dire); //URL de mi pagina para procesar el pago
//$redsys->setParameter("DS_MERCHANT_MERCHANTURL", $this->generateUrl('pago_procesar', array(), UrlGeneratorInterface::ABSOLUTE_URL)); //URL de mi pagina para procesar el pago
$idInsc = ($competicion->getJugadores() == 1) ? $inscrito->getId() : 0;
$redsys->setParameter("DS_MERCHANT_URLOK", $this->generateUrl('pago_terminado', array('token' => 'cancel', 'id' => $idComp, 'idi' => $idInsc), UrlGeneratorInterface::ABSOLUTE_URL));
$redsys->setParameter("DS_MERCHANT_URLKO", $this->generateUrl('pago_terminado', array('token' => 'fail', 'id' => $idComp, 'idi' => $idInsc), UrlGeneratorInterface::ABSOLUTE_URL));
$redsys->setParameter("DS_MERCHANT_PAYMETHODS", "C"); //solo pago con tarjeta
$redsys->setParameter("DS_MERCHANT_MERCHANTNAME", $this->getParameter('tpv.merchant_name'));
$redsys->setParameter("DS_MERCHANT_MERCHANTDATA", base64_encode(json_encode(array('idi' => $idi, 'idp' => $idp))));
//$params['Ds_Merchant_KEY_256'] = $this->getParameter('tpv.key_test_256'); //Key de TEST.
//$params['Ds_Merchant_KEY_256'] = $this->getParameter('tpv.key_256'); //Key de REAL. Codigo antiguo
//$params['Ds_Merchant_URL_Pago'] = $this->getParameter('tpv.url_test'); //Direccion de TEST
$params['Ds_Merchant_URL_Pago'] = $this->getParameter('tpv.url'); //Direccion REAL
$params['Ds_SignatureVersion'] = $this->getParameter('tpv.version'); //Version SHA256 --> esto no se usa
$params['Ds_MerchantParameters'] = $redsys->createMerchantParameters(); //Parametros, una vez codificados
$params['Ds_Signature'] = $redsys->createMerchantSignature($params['Ds_Merchant_KEY_256']); //Firma de SHA256
return $this->render('frontend/Default/tpv.html.twig', $params);
}
/**
* F-064 Landing de retorno al pago en el banco
*
* @Route("/pago/{idi}/intermedio/{idp}", name="pago_intermedio")
*/
public function pagoIntermedio($idi, $idp) {
$inscrito = $this->em->getRepository(Inscrito::class)->find($idi);
if (!$inscrito) {
throw new NotFoundHttpException("No existe el inscrito");
}
$pedido = $this->em->getRepository(Pedido::class)->find($idp);
if (!$pedido) {
//poner que redirija a competicion en un mensaje de esos flash
//y que ponga el inscrito y el pedido a "Error"
throw new NotFoundHttpException("No existe el pedido asociado a la inscripcion");
}
return $this->render("frontend/Default/pagoIntermedio.html.twig", [
'inscrito' => $inscrito,
'pedido' => $pedido
]);
}
/**
* F-065 Landing de retorno al pago en el banco
*
* @Route("/pago-terminado/{token}/{id}/{idi}", name="pago_terminado", defaults={"idi" = 0})
*/
public function pagoTerminado($token, $id, $idi, 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('_tournament', array('id' => $id)));
}
$params = [
'token' => $token,
'id' => $id
];
if ($idi != 0) {
$inscrito = $this->em->getRepository(Inscrito::class)->find($idi);
if (!empty($inscrito) && ($token == "success")) {
$jugador = $inscrito->getJugador();
$cl = $competicion->getOrganizador()->getCliente();
$telefono = $util_jugadores->getDatoPlanoDesdeJugador($jugador, "Telefono", $cl); //
if (empty($telefono)) {
$params["idj"] = $jugador->getId();
}
}
}
/*
$tarifa = $this->em->getRepository(Tarifa::class)->find($idt);
if (!$tarifa) {
//poner que redirija a competicion en un mensaje de esos flash
//y que ponga el inscrito y el pedido a "Error"
throw new NotFoundHttpException("No existe la tarifa");
}
*/
return $this->render("frontend/Default/pagoTerminado.html.twig", $params);
}
/**
* F-066 Procesamiento del pago tras aviso del banco
*
* @Route("/pago-procesar", name="pago_procesar")
*
*/
public function pagoProcesar(Request $request, EnvioCorreo $mailer, NotificacionesService $notificator, EnvioSms $messaging, UtilJugadores $util_jugadores, SoftwareExternoUtil $swutil) {
$redsys = new RedsysAPI();
$Ds_MerchantParameters = $request->request->get('Ds_MerchantParameters');
$decodec = $redsys->decodeMerchantParameters($Ds_MerchantParameters);
$fields = json_decode($decodec, true);
$other_fields = json_decode(base64_decode($fields['Ds_MerchantData']), true);
$inscritos = array();
$jugadores = array();
$secret = $this->getParameter('secret');
$inscrito = $this->em->getRepository(Inscrito::class)->find($other_fields['idi']);
if (!$inscrito) {
return new JsonResponse([]);
}
$pedido = $this->em->getRepository(Pedido::class)->find($other_fields['idp']);
if (!$pedido) {
return new JsonResponse([]);
}
$competicion = $inscrito->getCompeticion();
$num_inscritos = $this->em->getRepository(Inscrito::class)->getCountInscritosByEstadoCorrecto($competicion->getId(), false, ["pagado"]);
$lista_espera = (($num_inscritos >= $competicion->getPlazas()) && $competicion->getListaEspera());
//Permitimos que se terminen de inscribir aquellos, que aun habiendo acbado el plazo, la competicion sigue abierta a la espera de que la tarea la ponga en "finalizada"
if (($competicion->getModo()->getId() != 3) && ($competicion->getEstado() != "abierta")) {
//Mandamos correo a soporte para avisar
$args = [
"to" => $this->getParameter('next.email.rfga'),
"bcc" => false,
"competicion" => $competicion,
"subject" => 'ā³ NEXTCADDY - Inscripción AL LĆMITE [' . $pedido->getNumero() . ']',
"html" => $this->renderView('frontend/Inscritos/emailInscripcionLimite.html.twig', array('jugador' => $inscrito->getJugador(),
'inscrito' => $inscrito,
'competicion' => $competicion,
'pedido' => $pedido,
'tarifa' => $pedido->getTarifa()
))
];
//EnvioCorreo::enviarCorreo($args);
$mailer->enviarCorreo($args);
return new JsonResponse([]);
}
//SWGOLF
//$gmutil = new GolfmanagerUtilidad();
$swbd = $this->em->getRepository(SoftwareGolf::class)->findOneBy(["innerClass" => "Club", "cliente" => $competicion->getOrganizador()->getCliente(),"clubId" => $competicion->getClub()->getId()]);
if ($swbd) {
$swutil->init($swbd);
}
if (in_array($inscrito->getEstado(), ["espera", "error"]) && in_array($pedido->getEstado(), ["espera", "error"])) {
$avisar = false;
if ($fields['Ds_Order'] == $pedido->getNumero()) {
if (intval($fields['Ds_Response']) < 100) {
$estado = "pagado";
$avisar = true;
/*
} else if (intval($fields['Ds_Response']) == 900) {
$estado = "devolucion";
$avisar = false;
*
*/
$pedido->setPayedAt(new \DateTime('now'));
} else {
$pedido->setCodigoError($fields['Ds_Response']);
$estado = "error";
$avisar = false;
}
//04/03/20 Subimos el pedido set estado aqui porque sospechamos que el guardaCsv ha podido dar error, para que el pedido e quede en "pagado"/"error" para evitar que la tarea que busca los "en espera" lo limpie.
$pedido->setEstado($estado);
$pedido->setUpdatedAt(new \DateTime('now'));
//buscamos todos los inscritos que tienen el mismo pedido para cambiarle el estado
$inscritos = $this->em->getRepository(Inscrito::class)->findBy(array('pedido' => $pedido->getId()));
foreach ($inscritos as $ins) {
$ins->setEstado($estado);
$participaAux = 0;
if ($avisar) {
if ($lista_espera) {
$participaAux = -1;
} else {
$participaAux = 1;
}
}
$ins->setParticipa($participaAux);
$ins->setUpdatedAt(new \DateTime('now'));
$jugador = $ins->getJugador();
$log_message = "Inscripción online en Competicion " . $competicion->getNombre() . "(" . $competicion->getId() . "): " . $jugador->getLicencia() . " - " . $estado . " - (" . $pedido->getNumero() . ")";
$log = new Log('i', $log_message, null);
$this->em->persist($log);
$this->em->flush();
try {
$this->util->guardaCsvInscripciones($ins);
} catch (\Throwable $ex) {
$log_message = "Error guardaCsvInscripciones inscripcion online en Competicion " . $competicion->getNombre() . "(" . $competicion->getId() . "): " . $jugador->getLicencia() . " - " . $estado . " - (" . $pedido->getNumero() . ")";
$log = new Log('i', $log_message, null);
$this->em->persist($log);
$this->em->flush();
}
//Pablo 22/02/2024: Borramos esta condicion, me da igual el softwaregolf que tengamos que ha de ejecutarse la funcion de agregar,
// como es de pago avisamos aqui al proveedor (pago formalziado)
if ($swbd) {
$swutil->addClientToActivity($inscrito, $this->em, true);
}
}
$this->em->flush();
}
//Separado, para eviar que falle y deje a la mitad la inscripcion, sino iria arriba. De esta manera nos aseguramos que
if ($avisar) {
$url = $this->util->getShortUrl($competicion);
if (!$lista_espera) {
$texto = "Se ha inscrito correctamente en " . substr($this->util->limpiar($competicion->getNombre()), 0, 45) . ". Puede consultar el listado de inscritos en " . $url;
} else {
$texto = "EstĆ” en lista de espera de " . substr($this->util->limpiar($competicion->getNombre()), 0, 50) . ". Consulte lista de inscritos en " . $url;
}
$cl = $competicion->getOrganizador()->getCliente();
foreach ($inscritos as $ins) {
$jugador = $ins->getJugador();
//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($jugador, "Telefono", $cl); // $telefono = $jugador->getTelefonoDecod($secret); //$this->em->getRepository(Telefono::class)->findOneBy(array("jugador" => $jugador->getId(), "activo" => true));
if ($rgpd && !empty($telefono)) {
$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"] = "Nueva inscripción en torneo";
$args["msg"] = $texto;
$args["url"] = $url;
$args["destinatario"] = $userApp;
$args["tipo"] = "new-inscription";
$args["competicion"] = $competicion->getId();
$notificator->enviarNotificacion($args);
//}
}
$jugadores[] = $jugador;
}
//$email = $pedido->getEmail();
$email = $pedido->getEmailCodDecod($secret);
if (count($jugadores) == 1) {
$html = $this->renderView('frontend/Inscritos/emailInscripcion.html.twig', array('jugador' => $jugador,
'competicion' => $competicion,
'pedido' => $pedido,
'inscrito' => $inscrito,
'barras' => $this->em->getRepository(JornadaConfig::class)->findByInscrito($inscrito),
'tarifa' => $pedido->getTarifa(),
'lista_espera' => $lista_espera
));
/* $email_send->addTo($email)
->setBcc($this->getParameter('next.email.rfga'))
->setFrom('mailing@nextcaddy.com')
->setSubject('ⳠNextCaddy - Inscripción online [' . $pedido->getNumero() . ']')
->setHtml($this->renderView('frontend/Inscritos/emailInscripcion.html.twig', array('jugador' => $jugador,
'competicion' => $competicion,
'pedido' => $pedido,
'tarifa' => $pedido->getTarifa()
))
); */
} else {
$html = $this->renderView('frontend/Inscritos/emailInscripcionPareja.html.twig', array('jugadores' => $jugadores,
'competicion' => $competicion,
'inscritos' => $inscritos,
'pedido' => $pedido,
'tarifas' => $pedido->getImporte() . "ā¬",
'lista_espera' => $lista_espera
));
}
/* $organizador = (substr($competicion->getOrganizador()->getId(), 0, 2) == "AM") ? "AM00" : $competicion->getOrganizador()->getId();
$userSendgrid = $this->em->getRepository(User::class)->findOneByUsername($organizador);
$sendgridKey = $userSendgrid->getSocialRed($this->getParameter('secret'), "sendgrid");
$sendgrid = new \SendGrid($sendgridKey["api_key"]); //segun usuario
if ($_SERVER['SERVER_NAME'] != 'localhost') {
$sendgrid->send($email_send); } */
$args = [
"to" => $email,
"competicion" => $competicion,
"subject" => 'ⳠNEXTCADDY - Inscripción online [' . $pedido->getNumero() . ']',
"html" => $html
];
//EnvioCorreo::enviarCorreo($args);
$mailer->enviarCorreo($args);
}
//Simplificamos la condicion, ya que puede haber inscritos anulados y preservado el pedido e inscritos a los que se le devuelve el importe
} else if (empty($pedido->getReturnedAt()) && in_array($pedido->getEstado(), ["devolucion", "anulado"])) {
//} else if ((empty($pedido->getReturnedAt())) && ($inscrito->getEstado() == $pedido->getEstado()) && (($pedido->getEstado() == "devolucion") || ($pedido->getEstado() == "anulado"))) {
//
//En este ELSEIF solamente entra cuando es una devolucion desde los emials de aviso por reemplazo de un jugador
////https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Redireccion.pdf
//0000 a 0099 Transacción autorizada para pagos y preautorizaciones
//900 Transacción autorizada para devoluciones y confirmaciones
//400 Transacción autorizada para anulaciones
//Resto son errores en el pedido: Tarjeta caducada, Código de seguridad (CVV2/CVC2) incorrecto, Tarjeta no existente, etc
$ds_response = intval($fields['Ds_Response']);
if (($ds_response == 900) || ($ds_response == 400)) {
//marcamos como devuelto en el banco el elemento
$pedido->setReturnedAt(new \DateTime('now'));
$pedido->setEstado("anulado"); //Esto es anulado, ya que para el caso de que el jugador autocancele su inscripcion va por la URL de "competicion_cancelainscrito"
$log_message = "Devolución del pedido " . $pedido->getNumero() . " realizada con éxito.";
//Pablo 22/02/2024: Me da igual el softwaregolf que tengamos que ha de ejecutarse la funcion de borrar inscrito, como es de pago avisamos aqui al proveedor (devolucion formalziado)
//Lo ponemos aqui, que la devolucion ha ido OK, si hay fallo no borramos a nadie
if ($swbd) {
$swutil->deleteClientFromActivity($inscrito, $this->em, true);
}
} else {
$pedido->setCodigoError($fields['Ds_Response']);
$log_message = "Error realizando la devolución del pedido " . $pedido->getNumero() . "Codigo de error: " . $fields['Ds_Response'];
}
$log = new Log('i', $log_message, $this->getUser()?->getUserIdentifier());
$this->em->persist($log);
$this->em->flush();
}
return new JsonResponse([]);
}
/**
* F-067 Muestra un listado con los cambios de handicap tras el torneo
*
* @Route("/getListadoCambiosHandicap", name="listado_cambios_handicap", options={"expose"=true})
*
*/
public function listadoCambiosHandicap(Request $request) {
$id = $request->request->get("id");
//comprobar competicion.
$competicion = $this->em->getRepository(Competicion::class)->findOneById($id);
if (!$competicion) {
return new JsonResponse(-1);
}
$diferencias = array();
$inscritos = array();
$inscritosAux = $this->em->getRepository(Inscrito::class)->getHandicapsSms($id);
foreach ($inscritosAux as $inscrito) {
$idi = $inscrito->getId();
$handicaps = unserialize($inscrito->getHcpSms());
$long = count($handicaps);
$cambio = 0;
for ($i = 1; $i <= $long; $i++) {
if ($i != 1) {
$diferencias[$i] = number_format($handicaps[$i], 1) - number_format($handicaps[$i - 1], 1);
$cambio += $diferencias[$i];
} else {
$diferencias[$i] = number_format($handicaps[$i], 1) - $inscrito->getHcp();
$cambio += $diferencias[$i];
}
}
$inscritos[$idi] = [
"nombre" => $inscrito->getJugador()->getNombre(),
"apellidos" => $inscrito->getJugador()->getApellidos(),
"licencia" => $inscrito->getJugador()->getLicencia(),
"hcp" => $inscrito->getHcp(),
"handicaps" => $handicaps,
"cambio" => $cambio,
"diferencias" => $diferencias
];
}
$cmp = function ($a, $b) {
$a1 = number_format($a["cambio"], 1);
$b1 = number_format($b["cambio"], 1);
if ($a1 == $b1) {
if (number_format($a["hcp"]) == number_format($b["hcp"])) {
return 0;
}
return (number_format($a["hcp"]) < number_format($b["hcp"])) ? -1 : 1;
}
return ($a1 < $b1) ? -1 : 1;
};
//ordenamos
usort($inscritos, $cmp);
return $this->render("frontend/Inscritos/listado_cambio_handicap.html.twig", [
'competicion' => $competicion,
'inscritos' => $inscritos
]);
}
/**
* F-068 Devuelve las estadisticas de una competicion
*
* @Route("/getListadoEstadisticas", name="listado_estadisticas", options={"expose"=true})
*
*/
public function listadoEstadisticas(Request $request) {
//$isAjax = $request->isXMLHttpRequest();
//if ($isAjax) {
$response = new JsonResponse();
//comprobar que hay Puntuaciones publicadas.
$competicion = $request->get("id");
$estadisticas = $this->em->getRepository(Estadisticas::class)->findBy(array('competicion' => $competicion));
if ($estadisticas) {
$arDatos = array();
foreach ($estadisticas as $data) {
if (!isset($arDatos[$data->getJornada()])) {
$arDatos[$data->getJornada()] = array();
}
$arDatos[$data->getJornada()][$data->getTipo()] = array("id" => $data->getId(), "datos" => $data->getDatos());
}
$response->setData($arDatos);
} else {
$response->setData("No data");
}
return $response;
//} else {
// return new Response('This is not ajax!', 400);
//}
}
/**
* F-069 Muestra las estadisticas de una competicion
*
* @Route("/renderStats", name="_ajRenderStats", options={"expose"=true})
*
*/
public function renderEstadistica(Request $request) {
$isAjax = $request->isXMLHttpRequest();
$response = new JsonResponse();
$competicion = $request->get("id");
if ($isAjax) {
$datos = array();
$fechas = array(0 => ""); //primer elemento ficticio para el total
//comprobar que hay Puntuaciones publicadas.
$estadisticas = $this->em->getRepository(Estadisticas::class)->findBy(array('competicion' => $competicion), array("jornada" => "ASC"));
if (!$estadisticas) {
$response->setData("No data");
} else {
foreach ($estadisticas as $data) {
if (!isset($datos[$data->getJornada()])) {
$datos[$data->getJornada()] = array();
$jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $competicion, "orden" => $data->getJornada()));
if ($jornada) {
$fechas[$data->getJornada()] = $jornada->getFecha();
}
}
$datos[$data->getJornada()][$data->getTipo()] = array('id' => $data->getId(), 'datos' => $data->getDatos());
}
}
return $this->render('frontend/Estadisticas/index.html.twig', array("datos" => $datos, "fechas" => $fechas));
} else {
return new Response('This is not ajax!', 400);
}
}
/**
* F-070 Pagina de bienvenida a jugadores
*
* @Route("/bienvenido/{lic}", name="bienvenido_nextcaddy")
*/
public function bienvenido($lic) {
$inicialFed = substr(trim($lic), 0, 2);
$jugador = $this->em->getRepository(Jugador::class)->findOneBy(array('habilitado' => 1, 'licencia_corta' => substr($lic, -6)));
if (!$jugador) {
//creamos un jugador por defecto si no existe, para que vaya a la pagina de club de la federacion
$jugador = new Jugador(__METHOD__);
$jugador->setLicencia($inicialFed . "00123456");
}
$club = $this->em->getRepository(Club::class)->findOneBy(array('id' => substr(trim($jugador->getLicencia()), 0, 4), 'habilitado' => true));
if (!$club) {
$club = $this->em->getRepository(Club::class)->find($inicialFed . "00");
if (!$club) {
return $this->redirect($this->generateUrl('provincias'));
}
}
return $this->render("frontend/Default/bienvenido.html.twig", [
'club' => $club,
'jugador' => $jugador
]);
}
/**
* F-071 Listado de clubes agrupados por provincia
*
* @Route("/provincias/{id}", name="provincias", defaults={"id" = 0})
*/
public function provinces($id): Response
{
$clubRepository = $this->em->getRepository(Club::class);
$provinceRepository = $this->em->getRepository(Provincia::class);
$regionRepository = $this->em->getRepository(Comunidad::class);
$clubsByProvince = $this->getClubsByProvince($clubRepository);
$provincesWithCount = $this->getProvincesWithClubCount($clubsByProvince, $provinceRepository);
$regionsWithProvinces = $this->getRegionsWithProvinces($provincesWithCount, $provinceRepository, $regionRepository);
return $this->render("frontend/Default/provincias.html.twig", [
'id' => $id,
'clubsByProvince' => $clubsByProvince,
'provincesWithCount' => $provincesWithCount,
'regions' => $regionsWithProvinces
]);
}
private function getClubsByProvince($clubRepository): array
{
$clubs = $clubRepository->findTodosProvincia();
$clubsByProvince = [];
foreach ($clubs as $club) {
$locality = $club->getLocalidad();
$province = $locality?->getProvincia();
if (!$province) {
continue;
}
$provinceId = $province->getId();
$clubsByProvince[$provinceId]['name'] = $province->getNombre();
$clubsByProvince[$provinceId]['clubs'][] = [
'id' => $club->getId(),
'name' => $club->getNombre(),
'locality' => $locality->getNombre(),
'phone' => $club->getTelefono() ?? 'No disponible'
];
}
return $clubsByProvince;
}
private function getProvincesWithClubCount(array $clubsByProvince, $provinceRepository): array
{
$provinces = $provinceRepository->findAll();
$provincesWithCount = [];
foreach ($provinces as $province) {
$provinceId = $province->getId();
$provincesWithCount[$provinceId] = [
'name' => $province->getNombre(),
'num_clubs' => count($clubsByProvince[$provinceId]['clubs'] ?? [])
];
}
return $provincesWithCount;
}
private function getRegionsWithProvinces(array $provincesWithCount, $provinceRepository, $regionRepository): array
{
$regions = $regionRepository->findAll();
$regionsWithProvinces = [];
foreach ($regions as $region) {
$regionsWithProvinces[$region->getId()] = [
'name' => $region->getNombre(),
'default_logo' => $region->getDefaultLogo() ?? 'https://resources.nextcaddy.com/clubResources/nextcaddy/logos/SVG/nextcaddy.svg',
'provinces' => []
];
}
foreach ($provincesWithCount as $provinceId => $provinceData) {
$province = $provinceRepository->find($provinceId);
$regionId = $province->getComunidad()->getId();
if (isset($regionsWithProvinces[$regionId])) {
$regionsWithProvinces[$regionId]['provinces'][$provinceId] = $provinceData;
}
}
return $regionsWithProvinces;
}
/**
* F-072 Pagina para felicitar el aƱo nuevo
* @Route("/felicitacion-navidad/{token}", name="felicitacion_navidad")
*
* MƔs info: https://slopenxt.atlassian.net/wiki/spaces/NXT/pages/638386177/Felicitaci+n+de+Navidad
*
*/
public function felicitacionNavidad($token) {
$key = $this->getParameter('secret');
$cadena = UtilStatic::desencriptar($token, $key); //LICENCIA-AĆO
$f = new \DateTime("now");
if (intval($f->format("Y")) > 2020) {
$valores = explode("_", $cadena); //asi los profesionales pueden verlo sin que sea generico
} else {
$valores = explode("-", $cadena);
}
$licencia = $valores[0];
$year = $valores[1];
$jugador = $this->em->getRepository(Jugador::class)->findOneBy(array('habilitado' => 1, 'licencia' => $licencia));
if ($jugador) {
//Excepcion en el aƱo 2019 por culpa de la RGPD
if ($year != 2019) {
if (substr($jugador->getLicencia(), 0, 2) != "CM") {
//buscamos las competiciones del aƱo anterior
$competiciones = $this->em->getRepository(Inscrito::class)->getCompeticionesAnualLicencia($licencia, "" . ($year - 1));
}
}
} else {
//creamos un jugador por defecto si no existe, para que vaya a la pagina de club de la federacion
$jugador = new Jugador(__METHOD__);
$jugador->setNombre("Golfista");
$jugador->setLicencia("AM00123456");
$competiciones = [];
}
if ($year >= 2020) {
$view = "frontend/Navidad/navidad_" . $year . ".html.twig";
} else {
$view = "frontend/Navidad/navidad.html.twig";
}
return $this->render($view, array(
'year' => $year,
'jugador' => $jugador,
'competiciones' => $competiciones,
'leones' => false //in_array($licencia, ["AM85111566"])
));
}
/**
* F-073 Pagina para felicitar las fiestas navideƱas 2016/17
*
* @Route("/navidad/{licencia}", name="navidad")
*/
public function navidad($licencia) {
$key = $this->getParameter('secret');
$token = UtilStatic::encriptar($licencia . "-" . 2017, $key);
return $this->redirect($this->generateUrl('felicitacion_navidad', array("token" => $token)));
/*
$jugador = $this->em->getRepository(Jugador::class)->findOneBy(array('licencia' => $licencia));
if (!$jugador) {
//creamos un jugador por defecto si no existe, para que vaya a la pagina de club de la federacion
$jugador = new Jugador(__METHOD__);
$jugador->setNombre("Golfista");
$jugador->setLicencia("AM00123456");
}
$competiciones = $this->em->getRepository(Inscrito::class)->getCompeticionesAnualLicencia($licencia, "2016");
return array('jugador' => $jugador,
'competiciones' => $competiciones
);
* */
}
// Pablo 10/08/2023: Se comenta ya que estan llegando muchos errores a esta pagina (posiblemente un bot);
// y asi evitar el bombardeo de emails de error en esta pagina obsoleta y sin mantenimiento
// /**
// * F-074 Cambio de handicap de un jugador tras competicion
// *
// * @Route("/cambio-hcp/{id}/{orden}/{ccc}", name="cambio_hcp", defaults={ "ccc" = 0 })
// */
// public function cambioHcp($id, $orden, $ccc) {
// $inscrito = $this->em->getRepository(Inscrito::class)->find($id);
// if (!$inscrito) {
// $this->addFlash(
// 'error', "No encontramos el Inscrito que nos ha solicitado");
// return $this->redirect($this->generateUrl('portada'));
// }
// $this->em->getFilters()->disable('softdeleteable');
// $competicion = $inscrito->getCompeticion();
// if (!$competicion || !is_null($competicion->getDeletedAt())) {
// $this->addFlash('error', 'No se ha encontrado la competición');
// return $this->redirect($this->generateUrl('portada'));
// }
// $this->em->getFilters()->enable('softdeleteable');
// //$totalJornadas = count($this->em->getRepository(Jornada'::class->findBy(array('competicion' => $competicion->getId()), array('orden' => 'ASC')));
// $totalJornadas = count($competicion->getJornadas());
// $jornada = $this->em->getRepository(Jornada::class)->findOneBy(array('competicion' => $competicion->getId(), 'orden' => $orden));
// if (!$jornada) {
// $this->addFlash(
// 'error', "No encontramos la Jornada que nos ha solicitado");
// return $this->redirect($this->generateUrl('portada'));
// }
// $hcpInscrito = $inscrito->getHcp();
// //buscamos la categoria de HCP para empezar a mirar la tabla
// $categoria = $this->em->getRepository(CategoriaHandicap::class)->findOneByHandicapRange($hcpInscrito);
// $handicaps = unserialize($inscrito->getHcpSms());
// $diferencia = 0;
// $precision = 1;
// if ($categoria->getId() == 6) {
// $precision = 0; //Para 6a categoria se redondea sin decimales para que queden numeros enteros
// }
// if ((!isset($handicaps[$orden - 1])) || ($orden == 1)) {
// $diferencia = round($handicaps[$orden] - $inscrito->getHcp(), $precision);
// } else {
// $diferencia = round($handicaps[$orden] - $handicaps[$orden - 1], $precision);
// }
// $array_bajada = array();
// $clasificado = array();
// $acumulado = 0;
// if ($competicion->getFormula() != NULL) {
// if ($competicion->getFormula()->getId() == "S") {
// $clasificaciones = $this->em->getRepository(Clasificacion::class)->findBy(array('competicion' => $competicion->getId(), 'calculo' => 'H'));
// $parciales = $this->em->getRepository(Parcial::class)->findBy(array('jornada' => null, 'clasificacion' => $clasificaciones));
// $clasificado = $this->em->getRepository(Clasificado::class)->findOneBy(array('parcial' => $parciales, 'inscrito' => $inscrito->getId()));
// if ($clasificado) {
// //buscamos en la zona neutra una vez que sabemos la categoriahcp
// $tipo_prueba = "i";
// if ($jornada->getModalidad()->getId() == "P") {
// $tipo_prueba = "p";
// }
// $son18hoyos = true;
// if ($tipo_prueba != "p") { //el distinguir entre 18 o 9 hoyos solo tiene sentido para Individual o CanadaCup
// $jc = $this->em->getRepository(JornadaConfig::class)->findOneBy(array('jornada' => $jornada->getId(), 'categoria' => $inscrito->getCategoria()));
// if (!empty($jc)) {
// if ($jc->getHoyos() != "1-18") {
// $son18hoyos = false;
// }
// }
// }
// $campoCorto = false;
// $t = $jornada->getTrazado();
// if (!is_null($t->getCampoCorto())) {
// $campoCorto = $t->getCampoCorto();
// } else {
// // Consultar a la espaƱola la primera vez y guardar el dato para las siguientes consultas
// $numero_trazado = $t->spanishFederationNumberCourseFormat();
// $this->cws->init();
// //$resultado = $coursews->listar(array("courseCode" => $numero_trazado));
// //$campoCorto = $resultado->course->shortCourse;
// $resultado = $this->cws->listar2020(array("courseCode" => $numero_trazado));
// $campoCorto = $resultado->courses->course->shortCourse; //En este caso solo se busca por un trzado en concreto, por lo que podemos acceder directamente
// $t->setCampoCorto($campoCorto);
// $this->em->flush();
// }
// $zona_neutra = $this->em->getRepository(ZonaNeutra::class)->findOneBy(array('categoria' => $categoria, 'tipoPrueba' => $tipo_prueba, 'campoCorto' => $campoCorto, 'son18hoyos' => $son18hoyos));
// $ascValor = $jornada->getAscValor();
// if ($ascValor == 99) {
// $ascValor = 2;
// }
// $suma_asc_neto = $clasificado->getNeto() + $ascValor; //$jornada->getAscValor();
// if ($suma_asc_neto < $zona_neutra->getPuntosMin()) {
// $array_bajada[$clasificado->getNeto() + $ascValor /* $jornada->getAscValor() */] = $zona_neutra->getSubidaInferiorZn();
// } else {
// if ($suma_asc_neto < $zona_neutra->getPuntosMax()) {
// $array_bajada[$clasificado->getNeto() + $ascValor /* $jornada->getAscValor() */] = 0;
// } else {
// if ($suma_asc_neto > 72) {
// $suma_asc_neto = 72;
// }
// if ($tipo_prueba == "i") {
// for ($b = ($zona_neutra->getPuntosMax() + 1); $b <= $suma_asc_neto; $b++) {
// $bajada = $this->em->getRepository(Bajada::class)->findBajadasExact($b, $categoria->getId(), $tipo_prueba, $campoCorto);
// $array_bajada[$b] = $bajada->getBajada();
// $acumulado += $bajada->getBajada();
// //comprobamos si tenemos que actualizar categoria para cambiar los valores
// $acu = $inscrito->getHcp() + $acumulado;
// if (($acu < $categoria->getHcpMin()) || ($acu > $categoria->getHcpMax())) {
// $categoria = $this->em->getRepository(CategoriaHandicap::class)->findOneByHandicapRange($inscrito->getHcp() + $acumulado);
// }
// }
// } else {
// $bajada = $this->em->getRepository(Bajada::class)->findBajadasExact($suma_asc_neto, $categoria->getId(), $tipo_prueba, $campoCorto);
// $array_bajada[$suma_asc_neto] = $bajada->getBajada();
// $acumulado += $bajada->getBajada();
// }
// }
// }
// }
// }
// }
// $jugador = $inscrito->getjugador();
// $fb = $this->createFormBuilder($jugador, array('action' => $this->generateUrl('tour_autocomplete_update_rgpd'), 'method' => 'POST'))
// ->add('newsletters', CheckboxType::class, array('mapped' => false, "label" => "TambiƩn quiero recibir newsletters", "required" => false, "attr" => array("checked" => (strpos($competicion->getOrganizador()->getId(), "AM") !== false))))
// ->add('organizador', HiddenType::class, array('mapped' => false, 'attr' => array('value' => $competicion->getOrganizador()->getId())))
// ->add('rgpd', HiddenType::class, array('mapped' => false))
// ->add('id', HiddenType::class);
// //$secret = $this->getParameter('secret');
// //if (empty($jugador->getEmail())) {
// if (empty($jugador->getEmailCod())) {
// $fb->add('email', EmailType::class, array("label" => false, "required" => false, "attr" => array("placeholder" => "Introduzca email")));
// }
// $form = $fb->getForm();
// return $this->render("frontend/Default/cambioHcp.html.twig", [
// 'hcp' => $handicaps[$orden],
// 'diferencia' => $diferencia,
// 'competicion' => $competicion,
// 'clasificado' => $clasificado,
// 'orden' => $orden,
// 'form' => $form,
// 'id' => $id,
// 'ccc' => $ccc,
// 'inscrito' => $inscrito,
// 'acumulado' => round($acumulado, 1), //Es necesario redondear. Se manda para solucionar temporalmente el probblema del campo corto
// 'jornada' => $jornada,
// 'totalJornadas' => $totalJornadas,
// 'array_bajada' => $array_bajada
// ]);
// }
/**
* F-075 Muestra la pagina de información de marketing
*
* @Route("/descripcion", name="marketing")
*/
public function marketing() {
$user = $this->getUser();
if (!$this->utilidades->compruebaRol(["NUEVA_FEDE", "PUBLICIDAD"], false)) {
$this->addFlash(
'error', "No tiene permisos suficientes para acceder a la pƔgina solicitada");
return $this->redirect($this->generateUrl('_club', array('id' => 'AM00')));
}
return $this->render("frontend/Default/marketing.html.twig", [
'user' => $user,
]);
}
/**
* F-076 Demo de visualización del HÔndicap actual de acceso al campeonato de España INFANTIL
*
* @Route("/acceso-campeonato-rfeg/{licencia}", name="acceso_campeonato_rfeg")
*/
public function accesoCampeonatosEspania($licencia, FederatedWebService $rfeg) {
$lic = substr($licencia, 4);
$rfeg->init("AM00");
//$jugadores = $rfeg->searchByCode(array('federationCode' => $lic));
$jugadores = $rfeg->listByCode2020(array('federatedCodes' => ['federatedCode' => $lic]));
if (isset($jugadores->federateds)) {
if (isset($jugadores->federateds->federated)) {
$jugador = $this->em->getRepository(Jugador::class)->findByLicenciaCortaNoTemporal($lic);
if (!$jugador) {
$jugador = new Jugador(__METHOD__);
}
$this->utilidades->actualizarDatosJugadorFromFederated($jugadores->federateds->federated, $jugador);
}
//vemos si es el tercer o cuarto mejor handicap
$posicionHcp = ($jugador->getNivel()->getId() != "B") ? 4 : 3;
return $this->render("frontend/Default/acceso_campeonato_rfeg.html.twig", [
'jugador' => $jugador,
'posicionHcp' => $posicionHcp,
]);
} else {
$this->addFlash('error', 'No existen datos para ese jugador');
return $this->redirect($this->generateUrl('competiciones_abiertas'));
}
}
//
// Pablo 08/02/2024: Comentamos ya que el RFEGWebService
//
// F-077 Demo del Calculo nuevo Hcp Mundial
//
// @Route("/world-hcp/{licencia}", name="world_hcp")
//
// public function newHcpMundial($licencia, FederatedWebService $rfeg, RFEGWebService $webservice) {
// $rfeg->init("AM00");
//
// if (strlen($licencia) > 6) {
// $lic = substr($licencia, 4);
// } else {
// $lic = $licencia;
// }
//
// //$jugadores = $rfeg->searchByCode(array('federationCode' => $lic));
// $jugadores = $rfeg->listByCode2020(array('federatedCodes' => ['federatedCode' => $lic]));
//
// if (isset($jugadores->federateds)) {
// if (isset($jugadores->federateds->federated)) {
//
// $jugador = $this->em->getRepository(Jugador::class)->findOneBy(array('habilitado' => 1, 'licencia_corta' => $lic));
// if (!$jugador) {
// $jugador = new Jugador(__METHOD__);
// }
//
// $this->utilidades->actualizarDatosJugadorFromFederated($jugadores->federateds->federated, $jugador);
// }
//
// $ultimasVueltas = $webservice->getUltimas20Vueltas($jugador->getLicenciaCorta());
// $ultimasVueltasSinOrdenar = $ultimasVueltas;
// $nVueltas = count($ultimasVueltas);
// $diferenciales = [];
// $hcpCalculo = 0;
// $ajuste = 0;
// $nResultados = 0;
// if ($nVueltas > 1) {
// usort($ultimasVueltas, function ($a, $b) {
// return strnatcmp($a["sgd"], $b["sgd"]);
// });
//
// switch ($nVueltas) {
// case 1:
// case 2:
// case 3:
// $ajuste = -2;
// $diferenciales[] = $ultimasVueltas[0];
// $hcpCalculo = $diferenciales[0]["sgd"] - $ajuste;
// case 4:
// $ajuste = -1;
// $diferenciales[] = $ultimasVueltas[0];
// $hcpCalculo = $diferenciales[0]["sgd"] - $ajuste;
// case 5:
// $diferenciales[] = $ultimasVueltas[0];
// $hcpCalculo = $diferenciales[0]["sgd"] - $ajuste;
// case 5:
// $diferenciales[] = $ultimasVueltas[0];
// $hcpCalculo = $diferenciales[0]["sgd"] - $ajuste;
// case 6:
// $ajuste = -1;
// $nResultados = 2;
// $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
// $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados) - $ajuste;
// case 7:
// case 8:
// $nResultados = 2;
// $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
// $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados) - $ajuste;
// case 9:
// case 10:
// case 11:
// $nResultados = 3;
// $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
// $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
// case 12:
// case 13:
// case 14:
// $nResultados = 4;
// $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
// $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
// case 15:
// case 16:
// $nResultados = 5;
// $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
// $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
// case 17:
// case 18:
// $nResultados = 6;
// $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
// $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
// case 19:
// $nResultados = 7;
// $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
// $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
// case 20:
// $nResultados = 8;
// $diferenciales = array_slice($ultimasVueltas, 0, $nResultados);
// $hcpCalculo = $this->calcularMedia($diferenciales, $nResultados);
// }
// }
//
// return $this->render("frontend/Default/world_hcp.html.twig", [
// 'jugador' => $jugador,
// 'vueltas' => $ultimasVueltasSinOrdenar,
// "resultados" => $nResultados,
// "diferenciales" => array_column($diferenciales, null, 'id'),
// "hcp" => $hcpCalculo
// ]);
// } else {
// $this->addFlash(
// 'error', 'No existen datos para ese jugador');
//
// return $this->redirect($this->generateUrl('club', array('id' => "AM00")));
// }
// }
//
//
// F-078 Calcula la media de un array de valores
//
// @param type $array
// @param type $n
// @return type
//
//
// function calcularMedia($array, $n) {
// $result = 0;
// for ($i = 1; $i < sizeof($array); $i++) {
// $result += $array[$i]["sgd"];
// }
//
// return $result / $n;
// }
/**
* @Route("/calculo-hcpjuego", name="nxt_calculo_hcpjuego", options={"expose"=true})
*/
public function calculoHcpjuego(Request $request) {
$data = $request->request;
$hcp = str_replace(",", ".", $data->get('handicap')); //arreglo que en JS no funcionaba
$tramo = $data->get('tramo');
$barraNombre = $data->get('barra');
$trazadoNombre = $data->get('trazado');
$porcentaje = $data->get('porcentaje');
$parAnt = 0;
$hcps_juego = array();
$trazado_barra = $this->em->getRepository(TrazadoBarra::class)->getTrazadoBarraByName($trazadoNombre, $barraNombre);
foreach ($trazado_barra as $tb) {
$vs = $tb["slope"];
$vc = $tb["campo"];
$par = $tb["par"];
switch ($tramo) {
case "1-9":
$vs = $tb["slope19"];
$vc = $tb["campo19"];
$par = $tb["par19"];
break;
case "10-18":
$vs = $tb["slope1018"];
$vc = $tb["campo1018"];
$par = $tb["par1018"];
break;
}
if (!$par || $par == 0) {
$par = $parAnt;
}
$hcps_juego[$tb["sexo"]] = null;
if (!is_null($vs) && !is_null($vc) && ($par != 0)) {
$hcps_juego[$tb["sexo"]] = Tarjetas::calcularHcpJuego(null, $hcp, $vs, $vc, $par, $tramo, $porcentaje);
}
$parAnt = $par;
}
return new JsonResponse($hcps_juego);
}
/**
* F-079 Calcula el handicap de juego de un jugador para la vista de calculadora de club
*
* TODO Ya existe funcion "nxt_calculo_hcpjuego" que sustituye a esta, cuando se introduzca el nuevo componente en nextcaddy se debera eliminar
*
* @Route("/calculadora", name="nextcaddy_calculadora_hcpjuego", options={"expose"=true})
*/
public function calculadoraHcpJuego(Request $request) {
$data = $request->request;
$hcp = str_replace(",", ".", $data->get('handicap')); //arreglo que en JS no funcionaba
$hoyo = $data->get('hoyo');
$barra = $data->get('barra');
$trazado = $data->get('trazado');
$parAnt = 0;
$hcps_juego = array();
$trazado_barra = $this->em->getRepository(TrazadoBarra::class)->findBy(array('trazado' => $trazado, 'barra' => $barra, 'activo' => 1));
foreach ($trazado_barra as $tb) {
$hoyos = '1-18';
$vs = $tb->getSlope();
$vc = $tb->getCampo();
$par = $tb->getPar();
switch ($hoyo) {
case 1:
$hoyos = '1-9';
$vs = $tb->getSlope19();
$vc = $tb->getCampo19();
$par = $tb->getPar19();
break;
case 2:
$hoyos = '10-18';
$vs = $tb->getSlope1018();
$vc = $tb->getCampo1018();
$par = $tb->getPar1018();
break;
}
//$limites = explode("-", $hoyos);
//$par = $this->em->getRepository(Hoyo::class)->getSumaPar($tb->getId(), $limites[0], $limites[1]);
if (!$par || $par == 0) {
$par = $parAnt;
}
$hcps_juego[$tb->getSexo()] = null;
if (!is_null($vs) && !is_null($vc) && ($par != 0)) {
$hcps_juego[$tb->getSexo()] = Tarjetas::calcularHcpJuego(null, $hcp, $vs, $vc, $par, $hoyos);
}
$parAnt = $par;
}
return new JsonResponse($hcps_juego);
}
// Esta vista deja de ser accesible, se comenta
// /*
// * F-080 URL de acceso rapido en la pagina de marketing para usuarios de rol Gerente
// *
// * @Route("/info", name="info", options={"expose"=true})
// *
// */
// public function accesoGerente() {
// $username = "gerente";
// $token = strtoupper(sha1($username . $this->getParameter('next.secret')));
//
// return $this->redirect($this->generateUrl('get_auto_login', array('username' => $username, 'token' => $token)));
// }
/**
* F-081 Hace autologin y redirige
*
* @Route("/redirect-login", name="redirect_login", options={"expose"=true}, methods={"GET"})
*/
public function redirectAutoLogin(Request $request) {
$data = json_decode(base64_decode($request->query->get("g")));
$secret = $this->getParameter("secret");
$nxtSecret = $this->getParameter("next.secret");
$id = UtilStatic::desencriptar($data->i, $secret);
$username = UtilStatic::desencriptar($data->u, $secret);
$url = UtilStatic::desencriptar($data->r, $secret);
$token = UtilStatic::desencriptar($data->t, $secret);
$iat = new \DateTime(UtilStatic::desencriptar($data->a, $secret));
$hoy = new \DateTime("now");
if ($hoy->format("U") > $iat->format("U")) {
$this->addFlash('error', "Imposible acceder (-1)");
return $this->redirect($this->generateUrl("portada"));
}
$user = $this->em->getRepository(User::class)->findOneBy(array('username' => $username, "enabled" => 1));
if (!$user) {
$this->addFlash('error', "Imposible acceder (-2)");
return $this->redirect($this->generateUrl("portada"));
}
if (strtoupper($token) != strtoupper(sha1($nxtSecret . UtilStatic::encriptar($username, $secret) . $secret))) {
$this->addFlash('error', "Imposible acceder (-3)");
return $this->redirect($this->generateUrl("portada"));
}
$roles = $user->getRoles();
$uspsto = new UsernamePasswordToken($user, null, 'main', $roles);
$this->get('security.token_storage')->setToken($uspsto);
$this->get('session')->set('_security_main', serialize($uspsto));
return $this->redirect($this->generateUrl($url, ['idc' => $id]));
}
/**
* @Route("/staff-redirect/{params}", name="staff_redirect", methods={"GET"})
*/
public function staffRedirect ($params) {
$params = json_decode(base64_decode($params));
$secret = $this->getParameter("secret");
$nxtSecret = $this->getParameter("next.secret");
$username = UtilStatic::desencriptar($params->username, $secret);
$token = UtilStatic::desencriptar($params->authToken, $secret);
$url = UtilStatic::desencriptar($params->url, $secret);
$user = $this->em->getRepository(User::class)->findOneBy(array('username' => $username, "enabled" => 1));
if (!$user) {
return $this->json([
'success' => false
]);
}
if (strtoupper($token) != strtoupper(sha1($nxtSecret . UtilStatic::encriptar($username, $secret) . $secret))) {
return $this->json([
'success' => false
]);
}
$uspsto = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->tokenStorage->setToken($uspsto);
$this->session->set('_security_main', serialize($uspsto));
return $this->redirect($url);
}
/**
* F-082 Muestra la pagina de suscripcion del telefono
*
* @Route("/suscripcion/{token}", name="next_suscribe_rgpd", options={"expose"=true})
*/
public function suscripcionRgpd($token) {
$key = $this->getParameter('secret');
$idj = UtilStatic::desencriptar($token, $key);
$jugador = $this->em->getRepository(Jugador::class)->find($idj);
$clientes = $this->em->getRepository(Cliente::class)->findFederaciones(); //findBy(['nombreCorto' => array("AM00", "LV05", "CM41")]);
return $this->render("frontend/User/suscribe_rgpd.html.twig", [
"idj" => $idj,
"clientes" => $clientes,
'jugadorRGPD' => $jugador->getPrivacidadAsArray(),
'jugador' => $jugador
]);
}
/**
* F-083 Guarda la configuracion de privacidad del jugador
*
* @Route("/realizar-suscripcion", name="next_realizar_suscripcion", options={"expose"=true}, methods={"POST"})
*/
public function realizarSuscripcion(Request $request, EnvioSms $messaging, UtilJugadores $util_jugadores) {
$telefono = $request->request->get('telefono');
$idj = $request->request->get('idj');
$privacidad = array();
//$clientes = $this->em->getRepository(Cliente::class)->findBy(['nombreCorto' => array("AM00", "LV05", "CM41")]);
//$clientes = array("AM00", "LV05", "CM41");
$clientes = $this->em->getRepository(Cliente::class)->findFederaciones();
$todas = boolval($request->request->get('pTodas'));
if ($todas) {
foreach ($clientes as $cn) {
$c = $cn->getNombreCorto();
$privacidad[$c] = true;
}
} else {
foreach ($clientes as $cn) {
$c = $cn->getNombreCorto();
$privacidad[$c] = boolval($request->request->get('p' . $c));
}
}
$jugador = $this->em->getRepository(Jugador::class)->find($idj);
if ($jugador) {
$jpriv = $jugador->getPrivacidadSimple();
$tel = $util_jugadores->getDatoPlanoDesdeJugador($jugador, "Telefono");
if ($telefono != $tel) {
$log_message = "Cambio de telƩfono del Jugador " . $jugador->getNombreCompleto() . " (" . $jugador->getLicencia() . ") en el mƩtodo " . __METHOD__ . ", de " . ($tel ?: "(vacio)") . " a " . $telefono;
// $jugador->setTelefono($telefono, $secret);
// //$entity->setTlfn($telefono);
$jugador = $util_jugadores->setDatoPlanoDesdeJugador($jugador, "Telefono", $telefono, false);
$log = new \App\Entity\Backend\Log('i', $log_message, null);
$this->em->persist($log);
}
$new = false;
foreach ($privacidad as $key => $priv) {
if ($priv) {
if (isset($jpriv[$key])) {
$jugadorRGPD = $this->em->getRepository(JugadorRGPD::class)->findBy(['jugador' => $jugador, 'aceptacion' => $key])[0];
} else {
$jugadorRGPD = new JugadorRGPD();
$jugadorRGPD->setCliente($this->em->getRepository(Cliente::class)->findOneBy(['nombreCorto' => $key]));
$jugadorRGPD->setAceptacion($key);
$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);
}
}
}
$this->em->flush();
$competi = null;
$api = false; //mandamos por la api segun corresponda
//Buscamos la ultima competicion donde se ha inscrito. Lo normal es que llegue a suscripcion porque se ha inscrito y no tenemos el telefono
$inscrito = $this->em->getRepository(Inscrito::class)->findOneBy(['jugador' => $jugador], ["created_at" => "DESC"]);
if ($inscrito) {
$competi = $inscrito->getCompeticion();
$org = $competi->getOrganizador()->getCliente()->getId();
$api = ($org >= 3); //1-RFGA 2-LV05 3-FCG 4y5-FGM
}
$messaging->enviarSms($telefono, "Bienvenido a Nextcaddy, " . $jugador->getNombre() . ". " . $this->generateUrl('bienvenido_nextcaddy', array('lic' => $jugador->getLicencia()), UrlGeneratorInterface::ABSOLUTE_URL), $competi, 5, $api);
}
return new JsonResponse(true);
}
// Se elimina esta funcion ya que desaparece el covid de la inscripcion NEX-1838
// /**
// * F-086 Guardado del FLP. Protocolo covid-19
// *
// * @Route("/formulario/{idc}", name="_formulario", options={"expose"=true}, methods={"POST"})
// */
// public function formularioCovid($idc, Request $request, KernelInterface $kernel) {
// $competicion = $this->em->getRepository(Competicion::class)->find($idc);
// $datos = [];
// //$organizadorId = $competicion->getOrganizador()->getId();
// /* if (!in_array($organizadorId, ["CM00", "AM00"])) {
// return new JsonResponse(["error" => "La competición no estÔ organizada por la Federación de Golf", "codigo" => false]);
// } */
// /*
// //Se cambia segun tarea NEX-1447-5
// if (strpos($competicion->getOrganizador()->getId(), "0") !== false) {
// //if ('NEW-FORM' != $competicion->getCodigo() && $competicion->getOrganizador()->getId() != "CM00") {
// return new JsonResponse(["error" => "La competición no tiene disponible esta funcionalidad", "codigo" => false]);
// } */
// $cliente = $competicion->getOrganizador()->getCliente();
// $ruta_temporal = $kernel->getProjectDir() . "/public/uploads/inscritoCovid/$idc";
// if (!file_exists($ruta_temporal)) {
// mkdir($ruta_temporal, 0777, true);
// }
// $filenameid = sha1(uniqid(mt_rand(), true));
// if ($request->request->get('riesgo', 0)) {
// $filenameid .= "_x";
// }
// if (file_exists($ruta_temporal . '/' . $filenameid . '.pdf')) {
// unlink($ruta_temporal . '/' . $filenameid . '.pdf');
// }
// if (in_array($cliente->getId(), [4, 5])) {
// $datos['dni'] = $request->request->get('dni');
// $params["vulnerable"] = $request->request->get('vulnerable', 0);
// if (boolval($params["vulnerable"])) {
// $params["vulnerable_entidad"] = $request->request->get('vulnerable_entidad', "-");
// $params["vulnerable_actividades"] = $request->request->get('vulnerable_actividad', "-");
// $params["vulnerable_fecha"] = $request->request->get('vulnerable_fecha', "-");
// }
// } elseif (1 == $cliente->getId()) {
// $datos['competicion'] = $request->request->get('competicion');
// $datos['telefono'] = $request->request->get('telefono', "");
// $datos['emailCovid'] = $request->request->get('emailCovid', "");
// $datos['ciudad'] = $request->request->get('ciudad');
// $params['contacto'] = $request->request->get('contacto');
// $params['atencion'] = $request->request->get('atencion');
// $params['ambiente'] = $request->request->get('ambiente');
// $params['cercana'] = $request->request->get('cercana');
// $params['viaje'] = $request->request->get('viaje');
// $params['vivir'] = $request->request->get('vivir');
// $params['detalles'] = $request->request->get('detalles');
// // if(count($competicion->getJornadas()) > 1){
// // $params['consciente'] = $request->request->get('detalles');
// // }
// }
// $datos['nombre'] = $request->request->get('nombre');
// $params['datos'] = $datos;
// $params['firma'] = $request->request->get('firma', null);
// $params["propio"] = $request->request->get('propio', 1);
// if ($params["propio"] == 0) {
// $interesado['nombre'] = $request->request->get('interesado-nombre');
// $interesado['dni'] = $request->request->get('interesado-dni', "");
// } else {
// $interesado['nombre'] = "";
// $interesado['dni'] = "";
// }
// $params['interesado'] = $interesado;
// $params['flp'] = $request->request->get('flp', 0);
// setlocale(LC_ALL, "es_ES");
// $params['fecha'] = strftime("%A %d de %B del %Y");
// $params['localidad'] = ucwords($request->request->get('localidad'));
// $params['jornadas'] = $competicion->getJornadas();
// $html = $this->render('frontend/Competicion/formulario_covid_' . strtolower(substr($cliente->getNombreCorto(), 0, 2)) . '.html.twig', $params);
// $myfile = fopen($ruta_temporal . "/" . $filenameid . ".html", "w");
// fwrite($myfile, $html);
// fclose($myfile);
// try {
// $isProd = ($kernel->getEnvironment() == 'prod');
// if ($_SERVER['SERVER_ADDR'] == "178.33.230.218") {
// $cmd = "/opt/plesk/node/8/bin/relaxed " . $ruta_temporal . "/" . $filenameid . ".html --bo";
// } else {
// La direccion ha quedado obsoleta
// $cmd = "relaxed " . $ruta_temporal . "/" . $filenameid . ".html --build-once";
// }
// exec($cmd);
// if ($isProd) {
// //Borramos los ficheros temporales generados
// if (file_exists($ruta_temporal . '/' . $filenameid . '.html')) {
// unlink($ruta_temporal . '/' . $filenameid . '.html');
// }
// if (file_exists($ruta_temporal . '/' . $filenameid . '_temp.htm')) {
// unlink($ruta_temporal . '/' . $filenameid . '_temp.htm');
// }
// }
// $keyAge = $this->getParameter('age.key');
// $rutaArchivo = $ruta_temporal . '/' . $filenameid . '.pdf';
// if ($isProd) {
// $cmd = "/var/www/vhosts/nextcaddy.com/.linuxbrew/bin/age -r " . $keyAge . " " . $rutaArchivo . " > " . $rutaArchivo . ".age";
// } else {
// $cmd = "C:\age\age.exe -r " . $keyAge . " " . $rutaArchivo . " > " . $rutaArchivo . ".age";
// }
// exec($cmd);
// if (file_exists($rutaArchivo) && file_exists($rutaArchivo . ".age")) {
// unlink($rutaArchivo);
// }
// } catch (\Exception $excptn) {
// return new JsonResponse(["error" => "Error generando el PDF", "codigo" => false]);
// }
// //$file = $ruta_temporal . "/" . $idc . "_formcovid.pdf";
// //Si ya tenemos inscrito (es el formulario del horario) entonces aƱadimos el nuevo documento y lo marcamos como ya modificado
// $idi = $request->request->get("idi", null);
// if (!empty($idi)) {
// try {
// $inscrito = $this->em->getRepository(Inscrito::class)->find($idi);
// if ($inscrito) {
// $documento = new InscritoDocumento();
// $documento->setInscrito($inscrito);
// $documento->setDocumento($filenameid . ".pdf");
// $documento->setTipo(2);
// $inscrito->addDocumento($documento);
// //if (is_null($inscrito->getCovidModif())) {
// // $inscrito->setCovidModif(0);
// //} else {
// $inscrito->setCovidModif(1);
// //}
// $this->em->flush();
// }
// } catch (\Throwable $ex) {
// throw new NotFoundHttpException("Error generando el PDF");
// }
// // // Segun la nota informativa del 28/03/2022 se comenta esta parte
// // } else {
// // try {
// // $certificado = $request->files->get("certificado", 0);
// //
// // if ($certificado) {
// // $certname = md5(rand() . "_" . uniqid('certCov19')) . ".pdf";
// //
// // $rutaCarpeta = __DIR__ . '/../../../../web/uploads/inscritoCovid/' . $idc;
// // $rutaArchivo = $rutaCarpeta . "/" . $certname;
// //
// // $certificado->move($rutaCarpeta, $certname);
// //
// // $keyAge = $this->getParameter('age.key');
// // $isProd = ($kernel->getEnvironment() == 'prod');
// // if ($isProd) {
// // $cmd = "/var/www/vhosts/nextcaddy.com/.linuxbrew/bin/age -r " . $keyAge . " " . $rutaArchivo . " > " . $rutaArchivo . ".age";
// // } else {
// // $cmd = "C:\age\age.exe -r " . $keyAge . " " . $rutaArchivo . " > " . $rutaArchivo . ".age";
// // }
// // exec($cmd);
// //
// // if (file_exists($rutaArchivo) && file_exists($rutaArchivo . ".age")) {
// // unlink($rutaArchivo);
// // }
// // } else {
// // $certname = 0;
// // }
// // } catch (\Throwable $ex) {
// // $log_message = "Error guardando fichero certificado covid " . $idc;
// // $log = new Log('i', $log_message, null);
// // $this->em->persist($log);
// // $this->em->flush();
// // }
// }
// $flp = $request->request->get("flp", 0);
// if ($flp) {
// $this->addFlash(
// 'success', "Formulario rellenado correctamente");
// }
// return new JsonResponse(["file" => $filenameid . ".pdf", "codigo" => true /* , "certificado" => $certname */]);
// }
// Se elimina esta funcion ya que desaparece el covid de la inscripcion NEX-1838
// /**
// * F-087 Mostrar formulario FLP - Protocolo covid-19
// *
// * @Route("/flp/{idc}/{idi}", name="flp", options={"expose"=true})
// */
// function formularioFLP($idc, $idi) {
// $competicion = $this->em->getRepository(Competicion::class)->find($idc);
// if (!$competicion) {
// $this->addFlash('error', "El torneo buscado no existe");
// return $this->redirect($this->generateUrl('portada'));
// }
// $inscrito = $this->em->getRepository(Inscrito::class)->find($idi);
// if (!$inscrito) {
// $this->addFlash('error', "No se ha encontrado al jugador solicitado");
// return $this->redirect($this->generateUrl('_tournament', array('id' => $idc)));
// }
// $secret = $this->getParameter('secret');
// return $this->render("frontend/Default/flp.html.twig", [
// 'competicion' => $competicion,
// 'jornadas' => $competicion->getJornadas(),
// 'inscrito' => $inscrito,
// 'secret' => $secret
// ]);
// }
/**
* F-158 - Mostrar url tokenizada de archivo
*
* @Route("/resource/{token}", name="resource", options={"expose"=true})
*
*/
public function mostrarArchivo($token): Response {
try {
$ruta = explode("|", UtilStatic::desencriptarNew($token, $this->getParameter('secret')));
$response = new BinaryFileResponse($ruta[1]);
switch ($ruta[2]) {
case 'txt':
$documento = 'Documento.txt';
break;
case 'exe':
$documento = 'Programa.exe';
break;
case 'zip':
$documento = 'Programa.zip';
break;
case 'rar':
$documento = 'Programa.rar';
break;
default:
$documento = 'Documento.pdf';
break;
}
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_INLINE, $documento, $documento
);
} catch (\Exception $e) {
throw new \Exception("Error, no existe el documento");
}
return $response;
}
/**
* @param \Symfony\Component\Form\FormInterface $form
* @param EnvioCorreo $mailer
* @return void
*/
public function sendContact(\Symfony\Component\Form\FormInterface $form, EnvioCorreo $mailer): bool
{
$formData = $form->getData();
$msg = "<br>" . $formData['message'];
$msg .= "<br><br> [Nombre: " . ($formData['name'] ?? "Sin especificar") . ", Email: " . ($formData['email'] ?? "Sin especificar") . ", Club: " . ($formData['club'] ?? "Sin especificar") . ", License: " . ($formData['license'] ?? "Sin especificar") . "]";
$emailStatus = $mailer->enviarCorreo([
"to" => "info@nextcaddy.com",
"subject" => "Mensaje de contacto",
"html" => $msg
]);
if ($emailStatus) {
$this->addFlash("success", "Se ha enviado tu mensaje");
return true;
} else {
$this->addFlash("error", "No se ha podido enviar tu mensaje");
return false;
}
}
/**
* @Route("/livescoring-new-template", name="livescoring_new_template")
*/
public function livescoringNewTemplate(): Response
{
return $this->render('frontend/Default/livescoring_new_template.html.twig');
}
}