src/Util/GolfmanagerUtilidad.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Util;
  3. use App\Entity\Backend\Cliente;
  4. use App\Entity\Backend\Inscrito;
  5. use App\Entity\Backend\SoftwareGolf;
  6. use App\Entity\Backend\Jornada;
  7. use App\Util\GolfmanagerApiUtil;
  8. use Psr\Log\LoggerInterface;
  9. class GolfmanagerUtilidad {
  10.     protected $api;
  11.     protected $logger;
  12.     //El logger que queremos es el del "channel" swgolf configurado en el monolog, por lo que lo instanciamos con ese nombre debido al "autowire" del propio monolog:
  13.     // https://symfony.com/doc/5.4/logging/channels_handlers.html#how-to-autowire-logger-channels
  14.     // Los parametros deben ser los mismos y en el mismo orden, para evitar errores. Si no se usan, no se instancian y no pasa nada
  15.     public function __construct(GolfmanagerApiUtil $apiLoggerInterface $swgolfLogger) {
  16.         $this->api $api;
  17.         $this->logger $swgolfLogger;
  18.     }
  19.     public function clients() {
  20.     }
  21.     public function clientsFull() {
  22.     }
  23.     public function saveClient($jugador$clienteNxt$em$flush true$clubId) {
  24.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  25.         $sgCliente $this->api->saveClient($jugador);
  26.         $sg = new SoftwareGolf();
  27.         $sg->setInnerId($jugador->getId());
  28.         $sg->setInnerClass("Jugador");
  29.         $sg->setExternalId($sgCliente);
  30.         $sg->setExternalClass("client");
  31.         $sg->setCliente($clienteNxt);
  32.         $sg->setClubId($clubId);
  33.         $em->persist($sg);
  34.         if ($flush) {
  35.             $em->flush();
  36.         }
  37.         return $sgCliente;
  38.     }
  39.     public function clientTags($offset 0$limit 500) {
  40.         return $this->api->clientTags($offset$limit);
  41.     }
  42.     public function clientGroups($offset null$count null) {
  43.         return $this->api->clientGroups($offset$count);
  44.     }
  45.     public function saveTag() {
  46.     }
  47.     public function saveClientTags() {
  48.     }
  49.     public function deleteClientTag() {
  50.     }
  51.     public function saveActivity($competicion$clienteNxt$em$flush true) {
  52.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  53.         //Si el id de la actividad va, se actualiza, sino  inserta
  54.         $activity_id null;
  55.         $activity $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "activity""innerClass" => "Competicion""innerId" => $competicion->getId(), "cliente" => $clienteNxt'clubId' => $competicion->getClub()->getId()]);
  56.         if ($activity) {
  57.             $activity_id $activity->getExternalId();
  58.         } else {
  59.             $activity = new SoftwareGolf();
  60.             $activity->setExternalClass("activity");
  61.             $activity->setInnerClass("Competicion");
  62.             $activity->setInnerId($competicion->getId());
  63.             $activity->setCliente($clienteNxt);
  64.             $activity->setExternalId('no-activity-response');
  65.             $activity->setClubId($competicion->getClub()->getId());
  66.             $em->persist($activity);
  67.             $em->flush();
  68.         }
  69.         $gmActivityId $this->api->saveActivity($competicion$activity_id);
  70.         $activity->setExternalId($gmActivityId);
  71.         $em->persist($activity);
  72.         if ($flush) {
  73.             $em->flush();
  74.         }
  75.     }
  76.     public function deleteActivity($competicion$cliente$em$flush true) {
  77.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  78.         $activity $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "activity""innerClass" => "Competicion""innerId" => $competicion->getId(), "cliente" => $cliente,"clubId" => $competicion->getClub()->getId()]);
  79.         if ($activity) {
  80.             $this->api->deleteActivity($activity->getExternalId());
  81.             $em->remove($activity);
  82.             if ($flush) {
  83.                 $em->flush();
  84.             }
  85.         }
  86.     }
  87.     public function addClientToActivityGM($client$inscrito$em$flush true) {
  88.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  89.         if (!$client) {
  90.             return false;
  91.         }
  92.         $sgClientActivity false;
  93.         $activity $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "activity""innerClass" => "Competicion""innerId" => $inscrito->getCompeticion()->getId(), "cliente" => $inscrito->getCompeticion()->getOrganizador()->getCliente(),"clubId" => $inscrito->getCompeticion()->getClub()->getId()]);
  94.         if ($activity) {
  95.             $sgClientActivity $this->api->addClientToActivity($client$activity->getExternalId())[0];
  96.             if ($sgClientActivity) {
  97.                 $sg = new SoftwareGolf();
  98.                 $sg->setInnerId($inscrito->getId());
  99.                 $sg->setInnerClass("Inscrito");
  100.                 $sg->setExternalId($sgClientActivity);
  101.                 $sg->setExternalClass("client-activity");
  102.                 $sg->setCliente($inscrito->getCompeticion()->getOrganizador()->getCliente());
  103.                 $sg->setClubId($inscrito->getCompeticion()->getClub()->getId());
  104.                 $em->persist($sg);
  105.                 if ($flush) {
  106.                     $em->flush();
  107.                 }
  108.             }
  109.         }
  110.         return $sgClientActivity;
  111.     }
  112.     public function addClientToActivity($inscrito$em$flush) {
  113.         $client self::obtenerCliente($inscrito->getJugador(), $emtruefalse);
  114.         $clubId $inscrito->getCompeticion()->getClub()->getId();
  115.         $sgClientActivity false;
  116.         if ($client != -1) {
  117.             $activity $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "activity""innerClass" => "Competicion""innerId" => $inscrito->getCompeticion()->getId(), "cliente" => $inscrito->getCompeticion()->getOrganizador()->getCliente(), "clubId" => $clubId]);
  118.             if ($activity) {
  119.                 $sgClientActivity $this->api->addClientToActivity($client$activity->getExternalId())[0];
  120.                 if ($sgClientActivity) {
  121.                     $sg = new SoftwareGolf();
  122.                     $sg->setInnerId($inscrito->getId());
  123.                     $sg->setInnerClass("Inscrito");
  124.                     $sg->setExternalId($sgClientActivity);
  125.                     $sg->setExternalClass("client-activity");
  126.                     $sg->setCliente($inscrito->getCompeticion()->getOrganizador()->getCliente());
  127.                     $sg->setClubId($clubId);
  128.                     $em->persist($sg);
  129.                     if ($flush) {
  130.                         $em->flush();
  131.                     }
  132.                     //Si hay pedido (no es inscripcion local, por tanto es gestion, backend o frontend
  133.                     //Y el tipo de inscripcion es frontend (es la que hay que notificar, las de gestion o backend se emten solamente por control),
  134.                     //entonces notificamos al software externo
  135.                     //por aqui pasa aun cuando el torneo es gratutito, porque hay veces que se paga en el club y para tener las referencias, por eso no hay filtro de tarifa o precio
  136.                     if ((!is_null($inscrito->getPedido())) && ("frontend" == $inscrito->getTipoInscripcion())) {
  137.                         $this->api->confirmActivities($sgClientActivity$inscrito->getPedido()->getNumero());
  138.                     }
  139.                 }
  140.             }
  141.         }
  142.         return $sgClientActivity;
  143.     }
  144.     public function deleteClientFromActivity($inscrito$em$flush true) {
  145.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  146.         //Borramos el inscrito anterior de la tabla de Golfmanager y del propio sistema de Golfmanager
  147.         $client_activity $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "client-activity""innerClass" => "Inscrito""innerId" => $inscrito->getId(),"clubId" => $inscrito->getCompeticion()->getClub()->getId()]);
  148.         if ($client_activity) {
  149.             $this->api->deleteClientFromActivity($client_activity->getExternalId());
  150.             $em->remove($client_activity);
  151.             if ($flush) {
  152.                 $em->flush();
  153.             }
  154.         }
  155.     }
  156.     public function blockouts() {
  157.     }
  158.     public function blockout(Jornada $jornada$clienteNxt$em$flush true) {
  159.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  160.         $resource $em->getRepository(SoftwareGolf::class)->findBy(["externalClass" => "resource""innerClass" => "Trazado""innerId" => $jornada->getTrazado()->getNumero(), "cliente" => $clienteNxt,"clubId" => $jornada->getCompeticion()->getClub()->getId()]);
  161.         if ($resource) {
  162.             $gmBlockoutId $this->api->blockout($resource[0]->getExternalId(), $jornada);
  163.             if (!$gmBlockoutId["error"]) {
  164.                 $sg = new SoftwareGolf();
  165.                 $sg->setExternalClass("blockout");
  166.                 $sg->setExternalId($gmBlockoutId["id"]);
  167.                 $sg->setInnerClass("Jornada");
  168.                 $sg->setInnerId($jornada->getId());
  169.                 $sg->setCliente($clienteNxt);
  170.                 $sg->setClubId($jornada->getCompeticion()->getClub()->getId());
  171.                 $em->persist($sg);
  172.                 if ($flush) {
  173.                     $em->flush();
  174.                 }
  175.             }
  176.         }
  177.     }
  178.     public function cancelblockout(Jornada $jornada$cliente$em$flush true) {
  179.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  180.         //Borramos la jornada de la tabla de Golfmanager y del propio sistema de Golfmanager
  181.         $blockouts $em->getRepository(SoftwareGolf::class)->findBy(["externalClass" => "blockout""innerClass" => "Jornada""innerId" => $jornada->getId(), "cliente" => $cliente,"clubId" => $jornada->getCompeticion()->getClub()->getId()]);
  182.         foreach ($blockouts as $blockout) {
  183.             $em->remove($blockout);
  184.             if ($flush) {
  185.                 $em->flush();
  186.             }
  187.             $this->api->cancelblockout($blockout->getExternalId());
  188.         }
  189.     }
  190.     public function guardarCompeticion($competicion$em$jornadasPrevias$jornadasNuevas$cliente$flush true) {
  191.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  192.         $sg_tenant $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "Golfmanager""innerClass" => "Club""innerId" => $cliente->getNombreCorto(), "cliente" => $cliente,"clubId" => $competicion->getClub()->getId()]);
  193.         $tenant = !is_null($sg_tenant) ? $sg_tenant->getExternalId() : "";
  194.         if ("" != $tenant) {
  195.             //Creamos Activity en GM (actividad para que se pueda apuntar gente)
  196.             self::saveActivity($competicion$cliente$em);
  197.             /* Pablo 31/03/2023: Se comenta esta parte tras hablar con Jose para que no haga el bloqueo
  198.              * - si el campo esta dividido en 2 resources (hoyos 1-9 y hoyos 10-18) solo bloquea el primero que este en BD
  199.              * - si ya hay reservas el bloqueo se hace igual
  200.              * - las horas de bloqueo son una propuesta y deberian ser personalizadas y no se ha contemplado en esta version
  201.              * - LV05 que es para lo que estamos haciendo esto hace el bloqueo de manera manual con mucha antelación
  202.              * - no teniendo en BD resource no haria los blockout, pero lo comentamos para que asi no se ejecute nada y ahorrar tiempo de ejecucion
  203.               //Si jornadasPrevias es un booleano lo pasamos directamente (para el caso de que es nueva competicion, por ejemplo, no hay que comprobar nada
  204.               //En el caso de los edit si hay que comprobarlo por si se ha modificado alguna de las jornadas
  205.               $borrarJornadasPrevias = (!is_bool($jornadasPrevias)) ? Util::fechaJornadasModificadas($jornadasPrevias, $competicion->getJornadas()) : $jornadasPrevias;
  206.               self::guardarJornadas(
  207.               $competicion,
  208.               $em,
  209.               $borrarJornadasPrevias,
  210.               (($borrarJornadasPrevias) ? $borrarJornadasPrevias : $jornadasNuevas), //Ver Cuadro JORNADA
  211.               $cliente,
  212.               false);
  213.             if ($flush) {
  214.                 $em->flush();
  215.             }
  216.              */
  217.             // Se comenta tambien el flush ya que anteriormente se olvidaria incluirlo porque pertenecia a la logica de borrado y guardado de jornadas
  218.         }
  219.     }
  220.     public function borrarCompeticion($competicion$cliente$em$flush true) {
  221.         self::deleteActivity($competicion$cliente$em$flush);
  222.         $jornadas $em->getRepository(Jornada::class)->findBy(['competicion' => $competicion->getId()], ['orden' => "ASC"]);
  223.         foreach ($jornadas as $jornada) {
  224.             self::cancelblockout($jornada$cliente$em$flush);
  225.         }
  226.     }
  227.     public function guardarJornadas($competicion$em$borrarJornadasPrevias$añadirJornadasNuevas$cliente$flush true) {
  228.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  229.         $jornadas $em->getRepository(Jornada::class)->findBy(['competicion' => $competicion->getId()], ['orden' => "ASC"]);
  230.         foreach ($jornadas as $jornada) {
  231.             //Borramos directamente las entradas en BD del mapeo entre blockout y Jornadas, asi como en GM
  232.             self::guardarJornada($jornada$em$borrarJornadasPrevias$añadirJornadasNuevas$cliente$flush);
  233.         }
  234.     }
  235.     /*
  236.      * Cuadro JORNADA
  237.       | borrarPrevia | añadirNuevas |
  238.       --------------------------------------------------
  239.       Nueva Competicion  |   NO         |     SI       |
  240.       --------------------------------------------------
  241.       Edit Competicion   |              |              |
  242.       sin cambio en      |   NO         |   NO         |
  243.       jornadas           |              |              |
  244.       --------------------------------------------------
  245.       Edit Competicion   |              |              |
  246.       añade o elimina    |     SI       |     SI       |
  247.       alguna jornada     |              |              |
  248.       --------------------------------------------------
  249.       Edit Competicion   |              |              |
  250.       cambio de fecha    |     SI       |     SI       |
  251.       en jornadas        |              |              |
  252.      */
  253.     public function guardarJornada($jornada$em$borrarPrevia$añadirNuevas$cliente$flush true) {
  254.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  255.         if ($borrarPrevia) {
  256.             //Borramos directamente las entradas en BD del mapeo entre blockout y Jornadas, asi como en GM
  257.             self::cancelblockout($jornada$cliente$emtrue);
  258.         }
  259.         if ($borrarPrevia || $añadirNuevas) {
  260.             //Creamos Blockout en GM (bloqueamos las horas de los teetimes) para cada una de las jornadas de la competicion y guardamos en BD
  261.             self::blockout($jornada$cliente$emfalse);
  262.         }
  263.         if ($flush) {
  264.             $em->flush();
  265.         }
  266.     }
  267.     //Separado porque hay sitios donde solo hace falta una parte del proceso al hacerse paso a paso
  268.     public function checkSaveClient($jugador$cliente$em$flush true) {
  269.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  270.         $sgClienteA self::checkSaveClientA($jugador);
  271.         $sgClienteB self::checkSaveClientB($sgClienteA$jugador$cliente$em$flush);
  272.         return $sgClienteB;
  273.     }
  274.     //Separado porque hay sitios donde solo hace falta una parte del proceso al hacerse paso a paso
  275.     public function checkSaveClientA($jugador$onlyId true) {
  276.         //TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
  277.         $respCliente = -1;
  278.         $sgClient $this->api->clientsFull($jugador);
  279.         //Solo hay que pasar el idClient del proveedor. Si existe en y no esta en el sistema se guarda, si ya existe no se hace nada, y si no hay en el proveedor se creará,
  280.         //pero todo eso se hace en un paso posterior (al guardarel inscrito)
  281.         if (count($sgClient) > 0) {
  282.             if ($onlyId) {
  283.                 $respCliente $sgClient[0]["id"];
  284.             } else {
  285.                 $respCliente $sgClient;
  286.             }
  287.         }
  288.         return $respCliente;
  289.     }
  290.     //Separado porque hay sitios donde solo hace falta una parte del proceso al hacerse paso a paso
  291.     public function checkSaveClientB($sgCliente$jugador$clienteNxt$em$flush true) {
  292.         if (!$sgCliente) {
  293.             return false;
  294.         }
  295.         //Si no hay client en el proveedor creamos uno nuevo con el inscrito??
  296.         if (-== $sgCliente) {
  297.             $sgCliente self::saveClient($jugador$clienteNxt$em$flush);
  298.         } else {
  299.             //Buscamos el client en nextcaddy y si no existe lo añadimos para ya conservarlo.
  300.             $client $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "client""innerClass" => "Jugador""innerId" => $jugador->getId(), "cliente" => $clienteNxt]);
  301.             if (!$client) {
  302.                 $sg = new SoftwareGolf();
  303.                 $sg->setInnerId($jugador->getId());
  304.                 $sg->setInnerClass("Jugador");
  305.                 $sg->setExternalClass("client");
  306.                 $sg->setExternalId($sgCliente);
  307.                 $sg->setCliente($clienteNxt);
  308.                 $em->persist($sg);
  309.                 if ($flush) {
  310.                     $em->flush();
  311.                 }
  312.             }
  313.         }
  314.         return $sgCliente;
  315.     }
  316.     public function guardarCliente($cliente$jugador$clientenxt$em$flush true) {
  317.         //Si no hay client en el proveedor creamos uno nuevo con el inscrito??
  318.         if ($cliente == -1) {
  319.             $sgCliente self::saveClient($jugador$clientenxt$em$flush);
  320.         } else {
  321.             //Buscamos el client en nextcaddy y si no existe lo añadimos para ya conservarlo.
  322.             $client $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "client""innerClass" => "Jugador""innerId" => $jugador->getId(), "cliente" => $clientenxt]);
  323.             if (!$client) {
  324.                 $sg = new SoftwareGolf();
  325.                 $sg->setInnerId($jugador->getId());
  326.                 $sg->setInnerClass("Jugador");
  327.                 $sg->setExternalClass("client");
  328.                 $sg->setExternalId($cliente->getId());
  329.                 $sg->setCliente($clientenxt);
  330.                 $em->persist($sg);
  331.                 if ($flush) {
  332.                     $em->flush();
  333.                 }
  334.             }
  335.         }
  336.         return $sgCliente;
  337.     }
  338.     public static function comprobarTarifaCliente($tarifa$cliente) {
  339.         $tags = [];
  340.         //Los tags del jugador vienen en una cadena de IDs separados por coma
  341.         //Los colectivos son uno por cliente (jugador) y es un ID numerico
  342.         $existeTarifa false;
  343.         $tipoSocioTarifa $tarifa->getTipoSocio2();
  344.         if ($tipoSocioTarifa && $tipoSocioTarifa->getProviderOrigin()) {
  345.             if ("idTags" == $tipoSocioTarifa->getProviderOrigin()) {
  346.                 $tags explode(","$cliente["idTags"]);
  347.             } elseif ("idGroups" == $tipoSocioTarifa->getProviderOrigin()) {
  348.                 $tags[] = $cliente["idGroup"];
  349.             }
  350.             $existeTarifa = ((boolval($tarifa->getSocial()) && (in_array($tipoSocioTarifa->getProviderId(), $tags)
  351.                     )) || is_null($tarifa->getSocial()));
  352.         }
  353.         return $existeTarifa;
  354.     }
  355.     public function obtenerCliente($jugador$em$saveIfnot$flush true) {
  356.         $sgClient $this->api->clientsFull($jugador);
  357.         $clienteNxt $em->getRepository(Cliente::class)->find($this->api->golfManager->clientId);
  358.         $cliente = -1;
  359.         if (count($sgClient) > 0) {
  360.             $cliente $sgClient[0];
  361.         } else {
  362.             if ($saveIfnot) {
  363.                 self::saveClient($jugador$clienteNxt$em$flush$this->api->golfManager->attributes->clubId);
  364.                 $cliente $this->api->clientsFull($jugador);
  365.                 if (count($sgClient) > 0) {
  366.                     $cliente $sgClient[0];
  367.                 }
  368.             }
  369.         }
  370.         return $cliente;
  371.     }
  372.     public function getApi() {
  373.         return $this->api;
  374.     }
  375. }