← Back
Editing: AdresseRepository.php
<?php namespace App\Repository; use App\Entity\Adresse; use App\Entity\Agency; use App\Entity\Controle; use App\Entity\Organization; use App\Entity\Prestataire; use App\Entity\Solution; use App\Entity\User; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\Security\Core\User\UserInterface; /** * @method Adresse|null find($id, $lockMode = null, $lockVersion = null) * @method Adresse|null findOneBy(array $criteria, array $orderBy = null) * @method Adresse[] findAll() * @method Adresse[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) */ class AdresseRepository extends ServiceEntityRepository { use OptionsTrait; public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Adresse::class); } public function save(Adresse $entity, bool $flush = false): void { $this->getEntityManager()->persist($entity); if ($flush) { $this->getEntityManager()->flush(); } } public function remove(Adresse $entity, bool $flush = false): void { $this->getEntityManager()->remove($entity); if ($flush) { $this->getEntityManager()->flush(); } } /** * @throws NonUniqueResultException * @throws NoResultException */ public function addressDoneByAgencies(array $agenciesId, bool $previous = false): array { // Fetch total address $nb = $this->countByAgencies($agenciesId); $qb = $this->createQueryBuilder('a') ->select('COUNT(DISTINCT(a)) as total') ->addSelect("(COUNT(DISTINCT(a))/$nb) * 100 as percent") ->addSelect('DATE_FORMAT(c.dateRealisation, \'%Y-%m\') as month') ->join('a.controles', 'c', Join::WITH, 'c.valide = :valid') ->where('a.agency IN ('.implode(',', $agenciesId).')') ->groupBy('month') ->orderBy('c.dateRealisation') ->setParameter('valid', true); $qb = $this->addOptions($qb, $previous); return $qb->getQuery()->getResult(); } public function search(string $query) { $elements = explode($query, ' '); $qb = $this->createQueryBuilder('a') ->where('a.voie IN :elements') ->orWhere('a.numero IN :elements') ->setParameter(':elements', $elements); return $qb->getQuery()->getResult(); } /** * @return int|mixed|string */ public function getAll() { return $this->createQueryBuilder('a') ->select('a, c') ->addSelect('AVG(n.note) as noteMoyenne') ->leftJoin('a.controles', 'c', Join::WITH, 'c.valide = 1') ->leftJoin('c.service', 's') ->leftJoin('c.notes', 'n') ->orderBy('a.voie', 'ASC') ->groupBy('a.id, c.id') ->getQuery() ->getResult(); } public function getBreakdown() { return $this->createQueryBuilder('a') ->select('a, c') ->addSelect('AVG(n.note) as noteMoyenne') ->leftJoin('a.controles', 'c', Join::WITH, 'c.valide = 1') ->leftJoin('c.notes', 'n') ->leftJoin('a.elevatorBreakdowns', 'eb') ->where('eb.endDate IS NULL') ->andWhere('eb.startDate IS NOT NULL') ->orderBy('a.voie', 'ASC') ->groupBy('a.id, c.id') ->getQuery() ->getResult(); } /** * @return array{Adresse, noteMoyenne: float}[] */ public function getByManager(UserInterface $manager, ?bool $isBreakdown = null): array { $qb = $this->getQueryByManager($manager, $isBreakdown); return $qb ->getQuery() ->getResult(); } public function getQueryByManager( UserInterface $manager, $isBreakdown = null ): QueryBuilder { $qb = $this->createQueryBuilder('a') ->addSelect('AVG(c.averageNote) as noteMoyenne') ->addSelect('COUNT(c) as nbControls') ->leftJoin('a.manager', 'm'); $this->leftJoinControlsWithOptions($qb, 'a.controles'); $qb ->where('m = :manager') ->setParameter('manager', $manager) ->orderBy('a.voie', 'ASC') ->groupBy('a') ->orderBy('a.ville') ->addOrderBy('a.voie') ->addOrderBy('a.numero'); if ($isBreakdown) { $qb->leftJoin('a.elevatorBreakdowns', 'eb') ->andWhere('eb.endDate IS NULL') ->andWhere('eb.startDate IS NOT NULL'); } return $qb; } public function countByAgencyQuery(Agency $agency, bool $withControls = false): QueryBuilder { $qb = $this->createQueryBuilder('a') ->select('count(DISTINCT(a.id))') ->where('a.agency = :agency') ->setParameter('agency', $agency); if ($withControls) { $qb->leftJoin('a.controles', 'c') ->having('COUNT(c) > 0'); } $qb = $this->leftJoinControlsWithOptions($qb, 'a.controles'); return $this->addOptions($qb); } public function countByAgenciesQuery(array $agenciesId, bool $withControls = false): QueryBuilder { $qb = $this->createQueryBuilder('a') ->select('count(DISTINCT(a.id))') ->where('a.agency IN ('.implode(',', $agenciesId).')'); if ($withControls) { $qb->leftJoin('a.controles', 'c') ->having('COUNT(c) > 0'); } $qb = $this->leftJoinControlsWithOptions($qb, 'a.controles'); $qb = $this->addOptions($qb); return $qb; } /** * @throws NoResultException * @throws NonUniqueResultException */ public function countByAgencies(array $agenciesId, array $options = [], bool $withControles = false): int { $qb = $this->countByAgenciesQuery($agenciesId, $withControles); return $qb ->getQuery() ->getSingleScalarResult(); } /** * @return array{Adresse, Controle, noteMoyenne: float}[] */ public function getByAgency(Agency $agency): array { return $this->createQueryBuilder('a') ->select('a, c') ->addSelect('AVG(n.note) as noteMoyenne') ->leftJoin('a.controles', 'c', Join::WITH, 'c.valide = 1') ->leftJoin('c.notes', 'n') ->where('a.agency = :agency') ->setParameter('agency', $agency) ->orderBy('a.voie', 'ASC') ->groupBy('a.id, c.id') ->getQuery() ->getResult(); } /** * @return array{Adresse, Controle, noteMoyenne: float}[] */ public function getByOrganization(Organization $organization): array { return $this->createQueryBuilder('a') ->select('a, c') ->addSelect('AVG(n.note) as noteMoyenne') ->leftJoin('a.controles', 'c', Join::WITH, 'c.valide = 1') ->leftJoin('a.agency', 'ag') ->leftJoin('c.notes', 'n') ->where('ag.organization = :organization') ->setParameter('organization', $organization) ->orderBy('a.voie', 'ASC') ->groupBy('a.id, c.id') ->getQuery() ->getResult(); } public function getQueryByAgencies( array $agenciesId, ?Adresse $address = null, ?Solution $solution = null, ?bool $previous = false ): QueryBuilder { $qb = $this->createQueryBuilder('a'); if (!empty($agenciesId)) { $qb->andWhere('a.agency IN ('.implode(',', $agenciesId).')'); } if (null !== $address) { $qb->andWhere('a = :address') ->setParameter('address', $address); } if ($solution) { $qb ->andWhere('a.solution = :solution') ->setParameter('solution', $solution); } $this->leftJoinControlsWithOptions($qb, 'a.controles', $previous); $this->addOptions(qb: $qb); return $qb; } public function getVillesByManager(UserInterface $manager): array { return $this->createQueryBuilder('a') ->select('a.ville') ->where('a.manager = :manager') ->setParameter('manager', $manager) ->orderBy('a.voie', 'ASC') ->groupBy('a.ville') ->getQuery() ->getResult(); } public function getVillesByAgencies(array $agenciesId = []): array { return $this->createQueryBuilder('a') ->select('a.ville') ->where('a.agency IN ('.implode(',', $agenciesId).')') ->orderBy('a.voie', 'ASC') ->groupBy('a.ville') ->getQuery() ->getResult(); } /** * @return Adresse[] */ public function getRuesByVillesByManager(UserInterface $user, $ville = null): array { $qb = $this->createQueryBuilder('a') ->where('a.manager = :manager') ->setParameter('manager', $user) ->orderBy('a.voie', 'ASC') ->groupBy('a.voie') ->addGroupBy('a.numero'); if ($ville) { $qb->andWhere('a.ville LIKE :ville') ->setParameter('ville', '%'.$ville.'%'); } return $qb->getQuery() ->getResult(); } public function getSupervisorAddressesByAgencyQuery( ?int $agencyId, Solution $solution, $city = null ): QueryBuilder { $qb = $this->createQueryBuilder('a') // ->addSelect("GROUP_CONCAT(DISTINCT u.id SEPARATOR '|') as agentIds") ->leftJoin('a.manager', 'ag') ->where('a.agency = :agencyId') ->andWhere('a.solution = :solution') ->setParameter('agencyId', $agencyId) ->setParameter('solution', $solution) ->groupBy('a') ->orderBy('a.voie', 'ASC') ->addOrderBy('a.numero', 'ASC'); if ($city) { $qb->andWhere('a.ville LIKE :ville') ->setParameter('ville', '%'.$city.'%'); } return $qb; } public function getOrganizationAddressesByAgenciesQuery( array $agenciesId, Solution $solution, $city = null ): QueryBuilder { $qb = $this->createQueryBuilder('a') ->leftJoin('a.manager', 'ag') ->where('a.agency IN ('.implode(',', $agenciesId).')') ->andWhere('a.solution = :solution') ->setParameter('solution', $solution) ->groupBy('a') ->orderBy('a.voie', 'ASC') ->addOrderBy('a.numero', 'ASC'); if ($city) { $qb->andWhere('a.ville LIKE :ville') ->setParameter('ville', '%'.$city.'%'); } return $qb; } /** * @param null $ville * * @return Adresse[] */ public function getSupervisorAddressesByAgency($agencyId, Solution $solution, $ville = null) { return $this->getSupervisorAddressesByAgencyQuery($agencyId, $solution, $ville)->getQuery()->getResult(); } public function getResidencesByRueByAgency($agencyId, $adresse = null) { $qb = $this->createQueryBuilder('a') ->select('a.residence') ->where('a.agency = :agencyId') ->setParameter('agencyId', $agencyId) ->orderBy('a.voie', 'ASC'); if ($adresse) { $qb ->andWhere('a.voie LIKE :adresse') ->setParameter('adresse', '%'.$adresse.'%'); } return $qb ->getQuery() ->getResult(); } public function getBatimentByResidenceByAgency($agencyId, $selectedResidence) { return $this->createQueryBuilder('a') ->select('a.batiment') ->where('a.agency = :agencyId') ->andWhere('a.residence LIKE :residence') ->andWhere('a.batiment IS NOT NULL') ->setParameter('agencyId', $agencyId) ->setParameter('residence', '%'.$selectedResidence.'%') ->orderBy('a.batiment', 'ASC') ->groupBy('a.batiment') ->getQuery() ->getResult(); } public function getWithItemsByAgent(?UserInterface $agentId) { $qb = $this->createQueryBuilder('a'); $currentDate = new \DateTime('today midnight'); return $qb ->select('a', 'i') ->leftJoin('a.userAddresses', 'ua') ->leftJoin('a.items', 'i') ->leftJoin('i.zone', 'z') ->andWhere('ua.user = :agentId') ->andWhere('z is not null') ->andWhere($qb->expr()->orX('ua.startDate <= :startDate', 'ua.startDate is null')) ->andWhere($qb->expr()->orX('ua.endDate >= :endDate', 'ua.endDate is null')) ->setParameter('agentId', $agentId) ->setParameter('startDate', $currentDate) ->setParameter('endDate', $currentDate) ->getQuery() ->getResult(); } /** * @return int|mixed|string */ public function getWithItemsByManager(UserInterface $manager) { return $this->createQueryBuilder('a') ->select('a', 'i') ->leftJoin('a.items', 'i') ->leftJoin('i.zone', 'z') ->andWhere('a.manager = :manager') ->andWhere('z is not null') ->setParameter('manager', $manager) ->getQuery() ->getResult(); } /** * @return int|mixed|string */ public function getWithItemsByAgency(Agency $agency) { return $this->createQueryBuilder('a') ->select('a', 'i') ->leftJoin('a.items', 'i') ->leftJoin('i.zone', 'z') ->where('a.agency = :agency') ->andWhere('z is not null') ->setParameter('agency', $agency) ->getQuery() ->getResult(); } public function getWithItemsByOrganization(Organization $organization) { return $this->createQueryBuilder('a') ->select('a', 'i') ->leftJoin('a.items', 'i') ->leftJoin('i.zone', 'z') ->leftJoin('a.agency', 'ag') ->where('ag.organization = :organization') ->andWhere('z is not null') ->setParameter('organization', $organization) ->getQuery() ->getResult(); } /** * @return int|mixed|string */ public function getWithItemsByTenant(UserInterface $tenant) { return $this->createQueryBuilder('a') ->select('a', 'i') ->leftJoin('a.usersAccess', 'ua') ->leftJoin('a.items', 'i') ->leftJoin('i.zone', 'z') ->andWhere('z is not null') ->andWhere('ua = :tenant') ->setParameter('tenant', $tenant) ->getQuery() ->getResult(); } /** * @return int|mixed|string */ public function getAllByManagerByPrestataireInDateRange( UserInterface $manager, Prestataire $prestataire, $dateStart, $dateEnd ) { return $this->createQueryBuilder('a') ->select('a') ->addSelect('AVG(n.note) as noteMoyenne') ->leftJoin('a.prestataires', 'ap') ->leftJoin('a.controles', 'c') ->leftJoin('c.notes', 'n') ->leftJoin('c.agent', 'ag') ->andWhere('ag.manager = :manager') ->andWhere('ap.id = :prestataireId') ->andWhere('c.dateRealisation >= :dateStart') ->andWhere('c.dateRealisation < :dateEnd') ->setParameter('manager', $manager) ->setParameter('prestataireId', $prestataire) ->setParameter('dateStart', $dateStart) ->setParameter('dateEnd', $dateEnd) ->getQuery() ->getResult(); } /** * @throws \Exception */ public function noteItemsByAgentByAdresse(int $agentId, ?int $itemId) { $qb = $this->createQueryBuilder('ad') ->addSelect('i.id as id') ->addSelect('i.nom as item') ->addSelect('ad.voie as voie') ->addSelect('ad.numero as numero') ->addSelect('ad.ville as ville') ->addSelect('AVG(n.note) as averageNote') ->addSelect('a.nom as nomAgent') ->addSelect('a.prenom as prenomAgent') ->addSelect('a.id as idAgent') ->addSelect('ad.numeroAscenseur') ->leftJoin('ad.controles', 'c') ->leftJoin('c.agent', 'a') ->leftJoin('c.notes', 'n') ->leftJoin('n.item', 'i') ->where('i.id = :itemId') ->andWhere('c.adresse = ad') ->andWhere('c.valide = :valide') ->andWhere('a.id = :agentId') ->groupBy('ad') ->addGroupBy('a') ->addGroupBy('i') ->setParameter('itemId', $itemId) ->setParameter('valide', true) ->setParameter('agentId', $agentId); $this->addOptions($qb); return $qb->getQuery()->getResult(); } /** * Add zone to restrict by solution. * * @return int|mixed|string * * @throws NoResultException * @throws NonUniqueResultException */ public function findWithZones($id) { return $this->createQueryBuilder('a') ->leftJoin('a.items', 'i') ->leftJoin('i.zone', 'z') ->where('z is not null') ->andWhere('a.id = :id') ->setParameter('id', $id) ->getQuery() ->getSingleResult(); } public function migrateManager(User $sourceManager, User $targetManager) { return $this->createQueryBuilder('a') ->update() ->set('a.manager', ':targetManager') ->where('a.manager = :sourceManager') ->setParameter('sourceManager', $sourceManager) ->setParameter('targetManager', $targetManager) ->getQuery() ->execute(); } /** * @return float|int|mixed|string * * @throws NoResultException * @throws NonUniqueResultException */ public function addressUncontroledByAgencies(array $agenciesId, bool $previous = false) { // Fetch total address $nb = $this->countByAgencies($agenciesId); $qb = $this->createQueryBuilder('a'); $qb ->select("$nb - (COUNT(DISTINCT(a))) as total") ->addSelect("(100 - (COUNT(DISTINCT(a))/$nb) * 100) as percent") ->addSelect('DATE_FORMAT(c.dateRealisation, \'%Y-%m\') as month') ->where('a.agency IN ('.implode(',', $agenciesId).')') ->groupBy('month') ->orderBy('c.dateRealisation') ->setParameter('valid', true); $qb = $this->leftJoinControlsWithOptions($qb, 'a.controles'); $qb = $this->addOptions($qb, $previous); $qb->having('COUNT(c) > 0'); return $qb->getQuery()->getResult(); } }
Save File
Cancel