<?php
namespace App\Repository;
use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method User|null find($id, $lockMode = null, $lockVersion = null)
* @method User|null findOneBy(array $criteria, array $orderBy = null)
* @method User[] findAll()
* @method User[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class UserRepository extends ServiceEntityRepository
{
private $entityManager;
public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager)
{
parent::__construct($registry, User::class);
$this->entityManager = $entityManager;
}
public function saveUser($user):User
{
$this->entityManager->persist($user);
$this->entityManager->flush();
return $user;
}
public function findOneByUsernameOrEmail($value): ?User
{
return $this->createQueryBuilder('u')
->andWhere('u.email = :val or u.username = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult();
}
public function changeValidite(User $user){
if ($user->isValid())
{
$user->setValid(false);
}
else
{
if((!$user->getFechaExpiracionClave()) or
($user->getFechaExpiracionClave() > (new \DateTime('now'))))
{
$user->setValid(true);
}
}
$this->entityManager->persist($user);
$this->entityManager->flush();
return $user;
}
public function delete(User $user){
$user->setDeleted(true);
$this->entityManager->persist($user);
$this->entityManager->flush();
return $user;
}
public function findClavesExpiradas()
{
$fecha = (new \DateTime('today'));
return $this->createQueryBuilder("q")
->andWhere("q.valid = 1")
->andWhere("q.fechaExpiracionClave IS NOT NULL")
->andWhere("q.fechaExpiracionClave <= :fecha")
->setParameter('fecha', $fecha)
->getQuery()
->getResult()
;
}
public function buscarEjecutivaPorCliente($clienteId): ?User
{
// Crear una conexión directa a la base de datos
$conn = $this->getEntityManager()->getConnection();
// Consulta SQL para buscar la ejecutiva en la tabla `ejecutiva_cliente`
$sql = '
SELECT u.*
FROM user u
INNER JOIN ejecutiva_cliente ec ON u.id = ec.ejecutiva_id
WHERE ec.cliente_id = :clienteId
AND u.es_ejecutiva = 1
LIMIT 1
';
// Preparar y ejecutar la consulta
$stmt = $conn->prepare($sql);
$result = $stmt->executeQuery(['clienteId' => $clienteId])->fetchAssociative();
// Si se encuentra un resultado, retornar el objeto User
if ($result) {
return $this->getEntityManager()->getRepository(User::class)->find($result['id']);
}
// Retornar null si no se encuentra una ejecutiva
return null;
}
public function getClientesPorEjecutiva(User $ejecutiva): array
{
$qb = $this->createQueryBuilder('u')
->select('c.id')
->innerJoin('u.clientes', 'c') // Relación entre User y Cliente
->where('u.id = :ejecutivaId')
->setParameter('ejecutivaId', $ejecutiva->getId());
return $qb->getQuery()->getArrayResult();
}
public function findClavesPorExpirar($dias)
{
$interval = new \DateInterval('P'.$dias.'D');
$fecha_desde = (new \DateTime('today'));
$fecha_hasta = (new \DateTime('today'))->add($interval);
$interval2 = new \DateInterval('P1D');
$interval2->invert = 1;
$fecha_notificacion = (new \DateTime('today'))->add($interval2);
return $this->createQueryBuilder("q")
->andWhere("q.valid = 1")
->andWhere("q.fechaExpiracionClave IS NOT NULL")
->andWhere("q.fechaExpiracionClave >= :fecha_desde")
->andWhere("q.fechaExpiracionClave <= :fecha_hasta")
->andWhere("q.fechaNotificacionExpiracionClave IS NULL OR q.fechaNotificacionExpiracionClave < :fecha_notificacion")
->setParameter('fecha_desde', $fecha_desde)
->setParameter('fecha_hasta', $fecha_hasta)
->setParameter('fecha_notificacion', $fecha_notificacion)
->getQuery()
->getResult()
;
}
}