src/Controller/Frontend/Club/ClubView.php line 39

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\Frontend\Club;
  4. use App\DBAL\Backend\EnumEstadoCompeticion;
  5. use App\Entity\Backend\Agrupacion;
  6. use App\Entity\Backend\Clasificado;
  7. use App\Entity\Backend\Cliente;
  8. use App\Entity\Backend\Club;
  9. use App\Entity\Backend\Competicion;
  10. use App\Entity\Backend\Comunidad;
  11. use App\Entity\Backend\Equipo;
  12. use App\Entity\Backend\Federacion;
  13. use App\Entity\Backend\Inscrito;
  14. use App\Entity\Backend\Jornada;
  15. use App\Entity\Backend\Parcial;
  16. use App\Entity\Backend\Resultado;
  17. use App\Entity\Backend\Trazado;
  18. use App\Entity\Gestion\Encuentro;
  19. use Buzz\Browser;
  20. use Buzz\Client\FileGetContents;
  21. use DateTime;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Nyholm\Psr7\Factory\Psr17Factory;
  24. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  25. use Symfony\Component\HttpFoundation\RedirectResponse;
  26. use Symfony\Component\HttpFoundation\Response;
  27. final class ClubView extends AbstractController
  28. {
  29.     public function __construct(
  30.         private readonly EntityManagerInterface $em
  31.     )
  32.     {
  33.     }
  34.     public function __invoke($id$publi): Response|RedirectResponse
  35.     {
  36.         $club $this->em->getRepository(Club::class)->findOneBy(array("id" => $id"habilitado" => true));
  37.         if (!$club) {
  38.             $this->addFlash('error'"No encontramos el Club que nos ha solicitado");
  39.             return $this->redirect($this->generateUrl('provincias'));
  40.         }
  41.         list($defaultLogoGlobal$defaultLogo) = $this->obtainDefaultLogo($id);
  42.         list($futures$pastCompetitions) = $this->obtainCompetitions($id$club);
  43.         $bestResults = array();
  44.         foreach ($pastCompetitions as $pastCompetition) {
  45.             if ($pastCompetition['grouping']) {
  46.                 continue;
  47.             }
  48.             $competitionId $pastCompetition['id'];
  49.             $bestResults[$competitionId] = $this->obtainBestResults($pastCompetition);
  50.         }
  51.         $courses $this->em->getRepository(Trazado::class)->findBy(['club' => $id'activo' => 1], ['prioridad' => 'DESC''numero' => 'ASC']);
  52.         $weather $this->obtainWeather($club);
  53.         return $this->render("frontend/Club/index-club.html.twig", [
  54.             'entity' => $club,
  55.             'publi' => $publi,
  56.             'defaultLogo' => $defaultLogo,
  57.             'defaultLogoGlobal' => $defaultLogoGlobal,
  58.             'futuras' => $futures,
  59.             'pasadas' => $pastCompetitions,
  60.             'tiempo' => $weather,
  61.             'trazados' => $courses,
  62.             'numElementos' => 6,                        //Numero de competiciones a mostrar por pagina de tab.
  63.             'bestResults' => $bestResults,
  64.         ]);
  65.     }
  66.     private function obtainDefaultLogo($id): array
  67.     {
  68.         $defaultLogoGlobal "https://resources.nextcaddy.com/clubResources/nextcaddy/logos/SVG/nextcaddy.svg";
  69.         $defaultLogo $defaultLogoGlobal;
  70.         $prefix strtoupper(substr($id02));
  71.         $mapComunidad = [
  72.             "CM" => "Comunidad de Madrid",
  73.             "AM" => "Andalucia",
  74.             "77" => "Castilla y León",
  75.             "CP" => "Canarias",
  76.         ];
  77.         $comunidadNombre $mapComunidad[$prefix] ?? null;
  78.         if ($comunidadNombre) {
  79.             $comunidad $this->em->getRepository(Comunidad::class)->findOneBy(["nombre" => $comunidadNombre]);
  80.             $defaultLogo $comunidad?->getDefaultLogo() ?? $defaultLogoGlobal;
  81.         }
  82.         return array($defaultLogoGlobal$defaultLogo);
  83.     }
  84.     private function obtainCompetitions($idClub $club): array
  85.     {
  86.         $isFederation = !empty($this->em->getRepository(Federacion::class)->find($id));
  87.         $client $club->getCliente();
  88.         $clientType $client->getTipo();
  89.         $isClientTypeClub "club" == $clientType;
  90.         $isClientTypeFederation "federacion" == $clientType;
  91.         list($futureGroupings$pastGroupings) = $this->addGroupings($client);
  92.         $total 48;
  93.         $totalFuture $total count($futureGroupings);
  94.         $totalPast $total count($pastGroupings);
  95.         if ($isClientTypeClub || ($isClientTypeFederation && !$isFederation)) {
  96.             //Si es club me traigo sus alojadas
  97.             //Me traigo competiciones futuras y pasadas
  98. //            $futures = $this->em->getRepository(Competicion::class)->getCompeticiones($id, 36, 0, "mayor", "ASC", true);
  99. //            $pastCompetitions = $this->em->getRepository(Competicion::class)->getCompeticiones($id, 36, 0, "menor", "DESC", true);
  100.             $futureCompetitions $this->em->getRepository(Competicion::class)->obtainFuturesCompetitionByClub($id$totalFuture);
  101.             $pastCompetitions $this->em->getRepository(Competicion::class)->obtainPastCompetitionByClub($id$totalPast);
  102.         } else {
  103.             //Si es federacion o circuito buscamos sus organziadas
  104.             //Me traigo competiciones futuras y pasadas
  105. //            $futureCompetitions = $this->em->getRepository(Competicion::class)->getCompeticionesOrganizador($client->getNombreCorto(), 48, 0, "mayor", "ASC", true);
  106. //            $pastCompetitions = $this->em->getRepository(Competicion::class)->getCompeticionesOrganizador($client->getNombreCorto(), 48, 0, "menor", "DESC", true);
  107.             $organizer $client->getNombreCorto();
  108.             $futureCompetitions $this->em->getRepository(Competicion::class)->obtainFuturesCompetitionByOrganizer($organizer$totalFuture);
  109.             $pastCompetitions $this->em->getRepository(Competicion::class)->obtainPastCompetitionByOrganizer($organizer$totalPast);
  110.         }
  111.         $futureCompetitions $this->formatCompetitionData($futureCompetitions);
  112.         $pastCompetitions $this->formatCompetitionData($pastCompetitions);
  113.         $futureCompetitions array_merge($futureGroupings$futureCompetitions);
  114.         $pastCompetitions array_merge($pastGroupings$pastCompetitions);
  115.         $futureCompetitions $this->sortCompetitions($futureCompetitions);
  116.         $pastCompetitions $this->sortCompetitions($pastCompetitionstrue);
  117.         return array($futureCompetitions$pastCompetitions);
  118.     }
  119.     private function obtainWeather(Club $club): array
  120.     {
  121.         //Id del municipio (según la Relación Española de Localidades en el INE)
  122.         $idAemet = ($club->getLocalidad()) ? $club->getLocalidad()->getIdAemet() : 0;
  123.         $tiempo = ['idAemet' => $idAemet,
  124.             'nombre' => "-",
  125.             'provincia' => "-",
  126.             'estado_cielo' => -1,
  127.             'prob_precipitacion' => "-",
  128.             'fecha' => "-",
  129.             'direccion' => "-",
  130.             'velocidad' => "-",
  131.             'maxima' => "-",
  132.             'minima' => "-"
  133.         ];
  134.         if ($idAemet != 0) {
  135.             $client = new FileGetContents(new Psr17Factory());
  136.             $browser = new Browser($client, new Psr17Factory());
  137.             try {
  138.                 $idAemet strval($idAemet);
  139.                 $response $browser->get('https://www.aemet.es/xml/municipios/localidad_' str_pad($idAemet5"0"STR_PAD_LEFT) . '.xml');
  140.             } catch (\Throwable $e) {
  141.                 $response null;
  142.             }
  143.             if ((!is_null($response)) && ($response->getStatusCode() == 200)) {
  144.                 $hoy = new \DateTime('now');
  145.                 //Convertimos el XML a un array asociativo para manejarlo con comodidad
  146.                 $data $response->getBody();
  147.                 $xml simplexml_load_string(strval($data));
  148.                 $json json_encode($xml);
  149.                 $array json_decode($jsonTRUE);
  150.                 if (!empty($array)) {
  151.                     $tiempo['nombre'] = $array['nombre'];          //Nombre del municipio
  152.                     $tiempo['provincia'] = $array['provincia'];    //Nombre de la provincia
  153.                     //Buscamos el día actual
  154.                     foreach ($array['prediccion']['dia'] as $dia) {
  155.                         if ($hoy->format('Y-m-d') == $dia['@attributes']['fecha']) {
  156.                             $pos 0;
  157.                             if (($hoy->format('H') >= 0) && ($hoy->format('H') < 6)) {
  158.                                 $pos 3;
  159.                             } else if (($hoy->format('H') >= 6) && ($hoy->format('H') < 12)) {
  160.                                 $pos 4;
  161.                             } else if (($hoy->format('H') >= 12) && ($hoy->format('H') < 18)) {
  162.                                 $pos 5;
  163.                             } else if (($hoy->format('H') >= 18) && ($hoy->format('H') < 24)) {
  164.                                 $pos 6;
  165.                             }
  166.                             //Arreglo para la lectura del XML que hay veces que la conversion es extraña y no coge bien el dato
  167.                             if (is_array($dia['estado_cielo'][$pos]) && array_key_exists('@attributes'$dia['estado_cielo'][$pos])) {    //Estado del cielo (un numero que indica el icono a usar para la previsión del día (de las 00h a las 24h) --> Decodificar dichos numeros
  168.                                 //Ahora mismo ignora los iconos de por la noche. Habría que añadirlos.
  169.                                 $tiempo['estado_cielo'] = str_replace("n"""$dia['estado_cielo'][$pos][0]);
  170.                             } else {
  171.                                 $tiempo['estado_cielo'] = str_replace("n"""$dia['estado_cielo'][$pos]);
  172.                             }
  173.                             if (is_array($dia['prob_precipitacion'][$pos]) && array_key_exists('@attributes'$dia['prob_precipitacion'][$pos])) {
  174.                                 $tiempo['prob_precipitacion'] = $dia['prob_precipitacion'][$pos][0];
  175.                             } else {
  176.                                 $tiempo['prob_precipitacion'] = $dia['prob_precipitacion'][$pos];
  177.                             }
  178.                             $tiempo['fecha'] = $dia['@attributes']['fecha'];
  179.                             $tiempo['direccion'] = $dia['viento'][$pos]['direccion'];
  180.                             $tiempo['velocidad'] = $dia['viento'][$pos]['velocidad'];
  181.                             $tiempo['maxima'] = $dia['temperatura']['maxima'];
  182.                             $tiempo['minima'] = $dia['temperatura']['minima'];
  183.                             //Como ya tenemos datos, rompemos el bucle
  184.                             break;
  185.                         }
  186.                     }
  187.                 }
  188.             }
  189.         }
  190.         return $tiempo;
  191.     }
  192.     private function obtainBestResults(array $competitionData): ?array
  193.     {
  194.         $competitionId $competitionData['id'];
  195.         $calculation $competitionData['calculationId'];
  196.         $formula $competitionData['formula'];
  197.         $totalPlayersByTeam $competitionData['jugadores'];
  198.         $round null;
  199.         $competition $this->em->getRepository(Competicion::class)->find($competitionId);
  200.         $compatibleRounds $competition->getJornadasCompatibles(false);
  201.         if (!$compatibleRounds) {
  202.             /* @var Jornada $round */
  203.             $round $competition->getJornadas()->first();
  204.         }
  205.         $bestResult null;
  206.         $formulaId $competition->getFormula()->getId();
  207.         if (empty($round)) {
  208.             switch ($totalPlayersByTeam) {
  209.                 case 1:
  210.                     if (in_array($formulaId, [MATCH_PLAYRYDER_CUP], true)) {
  211.                         $winner $this->em->getRepository(Encuentro::class)->findWinnerOfIndividualTournament($competitionId);
  212.                         $results $winner ? [$winner] : [];
  213.                     } else {
  214.                         $results $this->em->getRepository(Resultado::class)
  215.                             ->bestResultIndividual($competitionId$calculation);
  216.                     }
  217.                     $bestResult $this->formatBestResult($results);
  218.                     break;
  219.                 case 2:
  220.                     if (in_array($formulaId, [MATCH_PLAYRYDER_CUP], true)) {
  221.                         $winner $this->em->getRepository(Encuentro::class)->findWinnerOfCoupleTournament($competitionId);
  222.                         $results $winner ? [$winner] : [];
  223.                     } else {
  224.                         $results $this->em->getRepository(Resultado::class)->bestResultCouple($competitionId$calculation);
  225.                     }
  226.                     $bestResult $this->formatBestResult($results);
  227.                     break;
  228.                 default:
  229.                     // PARA EQUIPO SE HA DECIDIDO NO HACERLO PORQUE SE SUELEN HACER CLASIFICACIONES DE LAS MEJORES X TARJETAS, Y ES ALGO QUE NO PODEMOS CONTROLAR
  230.                     break;
  231.             }
  232.         } else {
  233.             $bestResult $this->obtainBestResultsByRoundFormat($competitionId$totalPlayersByTeam$calculation$round);
  234.         }
  235.         if (!empty($bestResult)) {
  236.             $bestResult['formula'] = $formula;
  237.         }
  238.         return $bestResult;
  239.     }
  240.     private function addGroupings(Cliente $client): array
  241.     {
  242.         $clientId $client->getId();
  243.         $futureGroupings $this->em->getRepository(Agrupacion::class)->obtainFuturesGroupingByClient($clientId);
  244.         $futureGroupings $this->formatGroupingData($client$futureGroupings);
  245.         $pastGroupings $this->em->getRepository(Agrupacion::class)->obtainPastGroupingByClient($clientId);
  246.         $pastGroupings $this->formatGroupingData($client$pastGroupingsfalse);
  247.         return [$futureGroupings$pastGroupings];
  248.     }
  249.     private function formatCompetitionData(array $competitions): array
  250.     {
  251.         $response = [];
  252.         foreach ($competitions as $key => $competition) {
  253.             $response[$key] = $competition;
  254.             $response[$key]['grouping'] = false;
  255.         }
  256.         return $response;
  257.     }
  258.     private function formatGroupingData(Cliente $client, array $groupingsbool $isFuture true): array
  259.     {
  260.         $organizer $client->getNombreCorto();
  261.         $response = [];
  262.         /* @var Agrupacion $grouping */
  263.         foreach ($groupings as $key => $grouping) {
  264.             $response[$key] = $grouping;
  265.             $response[$key]['grouping'] = true;
  266.             $response[$key]['fecha'] = min($grouping['fecha_fin'], (new \DateTime('now'))->format('Y-m-d'));
  267.             $response[$key]['organizer'] = $organizer;
  268.             $response[$key]['club'] = $organizer;
  269.             $response[$key]['wagr'] = false;
  270.             if ($isFuture) {
  271.                 $response[$key]['mode'] = 3;
  272.                 $response[$key]['estado'] = EnumEstadoCompeticion::ABIERTA;
  273.             }
  274.         }
  275.         return $response;
  276.     }
  277.     private function formatBestResult(array $results): ?array
  278.     {
  279.         $resultRow reset($results);
  280.         if (!$resultRow) {
  281.             return null;
  282.         }
  283.         return [
  284.             'result' => $resultRow['contrapar'],
  285.             'player' => $resultRow['player']
  286.         ];
  287.     }
  288.     private function obtainBestResultsByRoundFormat(mixed $competitionId$totalPlayersByTeammixed $calculationJornada $round): ?array
  289.     {
  290.         $format $round->getModalidad()->getId();
  291.         if ($totalPlayersByTeam || PROAM === $format) {
  292.             return null;
  293.         }
  294.         $roundId $round->getId();
  295.         if (INDIVIDUAL === $format) {
  296.             $results $this->em->getRepository(Resultado::class)->bestResultIndividual($competitionId$calculation$roundId);
  297.         } else {
  298.             $results $this->em->getRepository(Resultado::class)->bestResultCouple($competitionId$calculation);
  299.         }
  300.         return $this->formatBestResult($results);
  301.     }
  302.     private function sortCompetitions(array $competitionsbool $desc false): array
  303.     {
  304.         usort($competitions, function ($a$b) use ($desc) {
  305.             $dateA = new DateTime($a['fecha']);
  306.             $dateB = new DateTime($b['fecha']);
  307.             if ($desc) {
  308.                 return $dateB <=> $dateA;
  309.             } else {
  310.                 return $dateA <=> $dateB;
  311.             }
  312.         });
  313.         return $competitions;
  314.     }
  315. }