<?php
namespace App\Util;
use App\Entity\Backend\Cliente;
use App\Entity\Backend\Inscrito;
use App\Entity\Backend\SoftwareGolf;
use App\Entity\Backend\Jornada;
use App\Util\GolfmanagerApiUtil;
use Psr\Log\LoggerInterface;
class GolfmanagerUtilidad {
protected $api;
protected $logger;
//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:
// https://symfony.com/doc/5.4/logging/channels_handlers.html#how-to-autowire-logger-channels
// 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
public function __construct(GolfmanagerApiUtil $api, LoggerInterface $swgolfLogger) {
$this->api = $api;
$this->logger = $swgolfLogger;
}
public function clients() {
}
public function clientsFull() {
}
public function saveClient($jugador, $clienteNxt, $em, $flush = true, $clubId) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
$sgCliente = $this->api->saveClient($jugador);
$sg = new SoftwareGolf();
$sg->setInnerId($jugador->getId());
$sg->setInnerClass("Jugador");
$sg->setExternalId($sgCliente);
$sg->setExternalClass("client");
$sg->setCliente($clienteNxt);
$sg->setClubId($clubId);
$em->persist($sg);
if ($flush) {
$em->flush();
}
return $sgCliente;
}
public function clientTags($offset = 0, $limit = 500) {
return $this->api->clientTags($offset, $limit);
}
public function clientGroups($offset = null, $count = null) {
return $this->api->clientGroups($offset, $count);
}
public function saveTag() {
}
public function saveClientTags() {
}
public function deleteClientTag() {
}
public function saveActivity($competicion, $clienteNxt, $em, $flush = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
//Si el id de la actividad va, se actualiza, sino inserta
$activity_id = null;
$activity = $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "activity", "innerClass" => "Competicion", "innerId" => $competicion->getId(), "cliente" => $clienteNxt, 'clubId' => $competicion->getClub()->getId()]);
if ($activity) {
$activity_id = $activity->getExternalId();
} else {
$activity = new SoftwareGolf();
$activity->setExternalClass("activity");
$activity->setInnerClass("Competicion");
$activity->setInnerId($competicion->getId());
$activity->setCliente($clienteNxt);
$activity->setExternalId('no-activity-response');
$activity->setClubId($competicion->getClub()->getId());
$em->persist($activity);
$em->flush();
}
$gmActivityId = $this->api->saveActivity($competicion, $activity_id);
$activity->setExternalId($gmActivityId);
$em->persist($activity);
if ($flush) {
$em->flush();
}
}
public function deleteActivity($competicion, $cliente, $em, $flush = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
$activity = $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "activity", "innerClass" => "Competicion", "innerId" => $competicion->getId(), "cliente" => $cliente,"clubId" => $competicion->getClub()->getId()]);
if ($activity) {
$this->api->deleteActivity($activity->getExternalId());
$em->remove($activity);
if ($flush) {
$em->flush();
}
}
}
public function addClientToActivityGM($client, $inscrito, $em, $flush = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
if (!$client) {
return false;
}
$sgClientActivity = false;
$activity = $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "activity", "innerClass" => "Competicion", "innerId" => $inscrito->getCompeticion()->getId(), "cliente" => $inscrito->getCompeticion()->getOrganizador()->getCliente(),"clubId" => $inscrito->getCompeticion()->getClub()->getId()]);
if ($activity) {
$sgClientActivity = $this->api->addClientToActivity($client, $activity->getExternalId())[0];
if ($sgClientActivity) {
$sg = new SoftwareGolf();
$sg->setInnerId($inscrito->getId());
$sg->setInnerClass("Inscrito");
$sg->setExternalId($sgClientActivity);
$sg->setExternalClass("client-activity");
$sg->setCliente($inscrito->getCompeticion()->getOrganizador()->getCliente());
$sg->setClubId($inscrito->getCompeticion()->getClub()->getId());
$em->persist($sg);
if ($flush) {
$em->flush();
}
}
}
return $sgClientActivity;
}
public function addClientToActivity($inscrito, $em, $flush) {
$client = self::obtenerCliente($inscrito->getJugador(), $em, true, false);
$clubId = $inscrito->getCompeticion()->getClub()->getId();
$sgClientActivity = false;
if ($client != -1) {
$activity = $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "activity", "innerClass" => "Competicion", "innerId" => $inscrito->getCompeticion()->getId(), "cliente" => $inscrito->getCompeticion()->getOrganizador()->getCliente(), "clubId" => $clubId]);
if ($activity) {
$sgClientActivity = $this->api->addClientToActivity($client, $activity->getExternalId())[0];
if ($sgClientActivity) {
$sg = new SoftwareGolf();
$sg->setInnerId($inscrito->getId());
$sg->setInnerClass("Inscrito");
$sg->setExternalId($sgClientActivity);
$sg->setExternalClass("client-activity");
$sg->setCliente($inscrito->getCompeticion()->getOrganizador()->getCliente());
$sg->setClubId($clubId);
$em->persist($sg);
if ($flush) {
$em->flush();
}
//Si hay pedido (no es inscripcion local, por tanto es gestion, backend o frontend
//Y el tipo de inscripcion es frontend (es la que hay que notificar, las de gestion o backend se emten solamente por control),
//entonces notificamos al software externo
//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
if ((!is_null($inscrito->getPedido())) && ("frontend" == $inscrito->getTipoInscripcion())) {
$this->api->confirmActivities($sgClientActivity, $inscrito->getPedido()->getNumero());
}
}
}
}
return $sgClientActivity;
}
public function deleteClientFromActivity($inscrito, $em, $flush = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
//Borramos el inscrito anterior de la tabla de Golfmanager y del propio sistema de Golfmanager
$client_activity = $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "client-activity", "innerClass" => "Inscrito", "innerId" => $inscrito->getId(),"clubId" => $inscrito->getCompeticion()->getClub()->getId()]);
if ($client_activity) {
$this->api->deleteClientFromActivity($client_activity->getExternalId());
$em->remove($client_activity);
if ($flush) {
$em->flush();
}
}
}
public function blockouts() {
}
public function blockout(Jornada $jornada, $clienteNxt, $em, $flush = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
$resource = $em->getRepository(SoftwareGolf::class)->findBy(["externalClass" => "resource", "innerClass" => "Trazado", "innerId" => $jornada->getTrazado()->getNumero(), "cliente" => $clienteNxt,"clubId" => $jornada->getCompeticion()->getClub()->getId()]);
if ($resource) {
$gmBlockoutId = $this->api->blockout($resource[0]->getExternalId(), $jornada);
if (!$gmBlockoutId["error"]) {
$sg = new SoftwareGolf();
$sg->setExternalClass("blockout");
$sg->setExternalId($gmBlockoutId["id"]);
$sg->setInnerClass("Jornada");
$sg->setInnerId($jornada->getId());
$sg->setCliente($clienteNxt);
$sg->setClubId($jornada->getCompeticion()->getClub()->getId());
$em->persist($sg);
if ($flush) {
$em->flush();
}
}
}
}
public function cancelblockout(Jornada $jornada, $cliente, $em, $flush = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
//Borramos la jornada de la tabla de Golfmanager y del propio sistema de Golfmanager
$blockouts = $em->getRepository(SoftwareGolf::class)->findBy(["externalClass" => "blockout", "innerClass" => "Jornada", "innerId" => $jornada->getId(), "cliente" => $cliente,"clubId" => $jornada->getCompeticion()->getClub()->getId()]);
foreach ($blockouts as $blockout) {
$em->remove($blockout);
if ($flush) {
$em->flush();
}
$this->api->cancelblockout($blockout->getExternalId());
}
}
public function guardarCompeticion($competicion, $em, $jornadasPrevias, $jornadasNuevas, $cliente, $flush = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
$sg_tenant = $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "Golfmanager", "innerClass" => "Club", "innerId" => $cliente->getNombreCorto(), "cliente" => $cliente,"clubId" => $competicion->getClub()->getId()]);
$tenant = !is_null($sg_tenant) ? $sg_tenant->getExternalId() : "";
if ("" != $tenant) {
//Creamos Activity en GM (actividad para que se pueda apuntar gente)
self::saveActivity($competicion, $cliente, $em);
/* Pablo 31/03/2023: Se comenta esta parte tras hablar con Jose para que no haga el bloqueo
* - si el campo esta dividido en 2 resources (hoyos 1-9 y hoyos 10-18) solo bloquea el primero que este en BD
* - si ya hay reservas el bloqueo se hace igual
* - las horas de bloqueo son una propuesta y deberian ser personalizadas y no se ha contemplado en esta version
* - LV05 que es para lo que estamos haciendo esto hace el bloqueo de manera manual con mucha antelación
* - no teniendo en BD resource no haria los blockout, pero lo comentamos para que asi no se ejecute nada y ahorrar tiempo de ejecucion
//Si jornadasPrevias es un booleano lo pasamos directamente (para el caso de que es nueva competicion, por ejemplo, no hay que comprobar nada
//En el caso de los edit si hay que comprobarlo por si se ha modificado alguna de las jornadas
$borrarJornadasPrevias = (!is_bool($jornadasPrevias)) ? Util::fechaJornadasModificadas($jornadasPrevias, $competicion->getJornadas()) : $jornadasPrevias;
self::guardarJornadas(
$competicion,
$em,
$borrarJornadasPrevias,
(($borrarJornadasPrevias) ? $borrarJornadasPrevias : $jornadasNuevas), //Ver Cuadro JORNADA
$cliente,
false);
if ($flush) {
$em->flush();
}
*/
// Se comenta tambien el flush ya que anteriormente se olvidaria incluirlo porque pertenecia a la logica de borrado y guardado de jornadas
}
}
public function borrarCompeticion($competicion, $cliente, $em, $flush = true) {
self::deleteActivity($competicion, $cliente, $em, $flush);
$jornadas = $em->getRepository(Jornada::class)->findBy(['competicion' => $competicion->getId()], ['orden' => "ASC"]);
foreach ($jornadas as $jornada) {
self::cancelblockout($jornada, $cliente, $em, $flush);
}
}
public function guardarJornadas($competicion, $em, $borrarJornadasPrevias, $añadirJornadasNuevas, $cliente, $flush = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
$jornadas = $em->getRepository(Jornada::class)->findBy(['competicion' => $competicion->getId()], ['orden' => "ASC"]);
foreach ($jornadas as $jornada) {
//Borramos directamente las entradas en BD del mapeo entre blockout y Jornadas, asi como en GM
self::guardarJornada($jornada, $em, $borrarJornadasPrevias, $añadirJornadasNuevas, $cliente, $flush);
}
}
/*
* Cuadro JORNADA
| borrarPrevia | añadirNuevas |
--------------------------------------------------
Nueva Competicion | NO | SI |
--------------------------------------------------
Edit Competicion | | |
sin cambio en | NO | NO |
jornadas | | |
--------------------------------------------------
Edit Competicion | | |
añade o elimina | SI | SI |
alguna jornada | | |
--------------------------------------------------
Edit Competicion | | |
cambio de fecha | SI | SI |
en jornadas | | |
*/
public function guardarJornada($jornada, $em, $borrarPrevia, $añadirNuevas, $cliente, $flush = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
if ($borrarPrevia) {
//Borramos directamente las entradas en BD del mapeo entre blockout y Jornadas, asi como en GM
self::cancelblockout($jornada, $cliente, $em, true);
}
if ($borrarPrevia || $añadirNuevas) {
//Creamos Blockout en GM (bloqueamos las horas de los teetimes) para cada una de las jornadas de la competicion y guardamos en BD
self::blockout($jornada, $cliente, $em, false);
}
if ($flush) {
$em->flush();
}
}
//Separado porque hay sitios donde solo hace falta una parte del proceso al hacerse paso a paso
public function checkSaveClient($jugador, $cliente, $em, $flush = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
$sgClienteA = self::checkSaveClientA($jugador);
$sgClienteB = self::checkSaveClientB($sgClienteA, $jugador, $cliente, $em, $flush);
return $sgClienteB;
}
//Separado porque hay sitios donde solo hace falta una parte del proceso al hacerse paso a paso
public function checkSaveClientA($jugador, $onlyId = true) {
//TODO: Falta alguna comprobacion para que no se ejecute la funcion completa si no es necesario???
$respCliente = -1;
$sgClient = $this->api->clientsFull($jugador);
//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á,
//pero todo eso se hace en un paso posterior (al guardarel inscrito)
if (count($sgClient) > 0) {
if ($onlyId) {
$respCliente = $sgClient[0]["id"];
} else {
$respCliente = $sgClient;
}
}
return $respCliente;
}
//Separado porque hay sitios donde solo hace falta una parte del proceso al hacerse paso a paso
public function checkSaveClientB($sgCliente, $jugador, $clienteNxt, $em, $flush = true) {
if (!$sgCliente) {
return false;
}
//Si no hay client en el proveedor creamos uno nuevo con el inscrito??
if (-1 == $sgCliente) {
$sgCliente = self::saveClient($jugador, $clienteNxt, $em, $flush);
} else {
//Buscamos el client en nextcaddy y si no existe lo añadimos para ya conservarlo.
$client = $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "client", "innerClass" => "Jugador", "innerId" => $jugador->getId(), "cliente" => $clienteNxt]);
if (!$client) {
$sg = new SoftwareGolf();
$sg->setInnerId($jugador->getId());
$sg->setInnerClass("Jugador");
$sg->setExternalClass("client");
$sg->setExternalId($sgCliente);
$sg->setCliente($clienteNxt);
$em->persist($sg);
if ($flush) {
$em->flush();
}
}
}
return $sgCliente;
}
public function guardarCliente($cliente, $jugador, $clientenxt, $em, $flush = true) {
//Si no hay client en el proveedor creamos uno nuevo con el inscrito??
if ($cliente == -1) {
$sgCliente = self::saveClient($jugador, $clientenxt, $em, $flush);
} else {
//Buscamos el client en nextcaddy y si no existe lo añadimos para ya conservarlo.
$client = $em->getRepository(SoftwareGolf::class)->findOneBy(["externalClass" => "client", "innerClass" => "Jugador", "innerId" => $jugador->getId(), "cliente" => $clientenxt]);
if (!$client) {
$sg = new SoftwareGolf();
$sg->setInnerId($jugador->getId());
$sg->setInnerClass("Jugador");
$sg->setExternalClass("client");
$sg->setExternalId($cliente->getId());
$sg->setCliente($clientenxt);
$em->persist($sg);
if ($flush) {
$em->flush();
}
}
}
return $sgCliente;
}
public static function comprobarTarifaCliente($tarifa, $cliente) {
$tags = [];
//Los tags del jugador vienen en una cadena de IDs separados por coma
//Los colectivos son uno por cliente (jugador) y es un ID numerico
$existeTarifa = false;
$tipoSocioTarifa = $tarifa->getTipoSocio2();
if ($tipoSocioTarifa && $tipoSocioTarifa->getProviderOrigin()) {
if ("idTags" == $tipoSocioTarifa->getProviderOrigin()) {
$tags = explode(",", $cliente["idTags"]);
} elseif ("idGroups" == $tipoSocioTarifa->getProviderOrigin()) {
$tags[] = $cliente["idGroup"];
}
$existeTarifa = ((boolval($tarifa->getSocial()) && (in_array($tipoSocioTarifa->getProviderId(), $tags)
)) || is_null($tarifa->getSocial()));
}
return $existeTarifa;
}
public function obtenerCliente($jugador, $em, $saveIfnot, $flush = true) {
$sgClient = $this->api->clientsFull($jugador);
$clienteNxt = $em->getRepository(Cliente::class)->find($this->api->golfManager->clientId);
$cliente = -1;
if (count($sgClient) > 0) {
$cliente = $sgClient[0];
} else {
if ($saveIfnot) {
self::saveClient($jugador, $clienteNxt, $em, $flush, $this->api->golfManager->attributes->clubId);
$cliente = $this->api->clientsFull($jugador);
if (count($sgClient) > 0) {
$cliente = $sgClient[0];
}
}
}
return $cliente;
}
public function getApi() {
return $this->api;
}
}