← Back
Editing: ThematicRepository.php
<?php namespace App\Repository; use App\Contract\EntityFinderInterface; use App\Entity\Adresse; use App\Entity\Agency; use App\Entity\Controle; use App\Entity\Organization; use App\Entity\Thematic; use App\Entity\User; use App\Session\Filter\ValueObject\DateRange; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\Security\Core\User\UserInterface; /** * @extends ServiceEntityRepository<Thematic> * * @method Thematic|null find($id, $lockMode = null, $lockVersion = null) * @method Thematic|null findOneBy(array $criteria, array $orderBy = null) * @method Thematic[] findAll() * @method Thematic[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) */ class ThematicRepository extends ServiceEntityRepository implements EntityFinderInterface { use OptionsTrait; public function __construct(ManagerRegistry $registry, private ZoneRepository $zoneRepository) { parent::__construct($registry, Thematic::class); } public function save(Thematic $entity, bool $flush = false): void { $this->getEntityManager()->persist($entity); if ($flush) { $this->getEntityManager()->flush(); } } public function remove(Thematic $entity, bool $flush = false): void { $this->getEntityManager()->remove($entity); if ($flush) { $this->getEntityManager()->flush(); } } /** * @return Thematic[] */ public function findForAgent(User $agent): array { return $this->createQueryBuilder('t') ->leftJoin('t.zones', 'z') ->leftJoin('z.allChildren', 'zc') ->leftJoin('zc.items', 'i') ->leftJoin('i.adresses', 'a') ->leftJoin('a.userAddresses', 'ua') ->where('ua.user = :agent') ->setParameter('agent', $agent) ->orderBy('t.position') ->getQuery() ->getResult(); } /** * @return Thematic[] */ public function findForAgency(Agency $agency): array { return $this->createQueryBuilder('t') ->select('t') ->addSelect('z') ->addSelect('zc') ->addSelect('i') ->leftJoin('t.zones', 'z') ->leftJoin('z.allChildren', 'zc') ->leftJoin('zc.items', 'i') ->leftJoin('i.adresses', 'a') ->where('a.agency = :agency') ->setParameter('agency', $agency) ->orderBy('t.position') ->getQuery() ->getResult(); } public function findForOrganization(Organization $organization): array { return $this->createQueryBuilder('t') ->select('t') ->addSelect('z') ->addSelect('zc') ->addSelect('i') ->leftJoin('t.zones', 'z') ->leftJoin('z.allChildren', 'zc') ->leftJoin('zc.items', 'i') ->leftJoin('i.adresses', 'a') ->leftJoin('a.agency', 'ag') ->where('ag.organization = :organization') ->setParameter('organization', $organization) ->orderBy('t.position') ->getQuery() ->getResult(); } public function findAverageNote( UserInterface $manager, $ville, $voie, $residence, $batiment, $numero, $dateStart = null, $dateEnd = null ) { $options = []; if (null === $dateStart || null === $dateEnd) { $options['dateRange'] = new DateRange($dateStart, $dateEnd); } $queryBuilder = $this->createQueryBuilder('t') ->select('t') ->addSelect('AVG(n.note) as averageNote') ->leftJoin('t.zones', 'z') ->leftJoin('z.allChildren', 'zc') ->leftJoin('zc.items', 'i') ->leftJoin('i.adresses', 'a') ->leftJoin('a.manager', 'm') ->leftJoin('a.controles', 'c') ->leftJoin('c.adresse', 'ad') ->leftJoin('c.notes', 'n') ->where('a.manager = :manager') ->andWhere('a = ad') ->andWhere('n.item = i') ->andWhere('c.valide = :isValid') ->setParameter('manager', $manager) ->setParameter('isValid', true) ->orderBy('t.position') ->groupBy('t'); if (null != $ville) { $queryBuilder->andWhere('ad.ville = :ville'); $queryBuilder->setParameter('ville', $ville); } if (null != $voie) { $queryBuilder->andWhere('ad.voie LIKE :voie'); $queryBuilder->setParameter('voie', '%'.$voie.'%'); } if (null != $residence) { $queryBuilder->andWhere('ad.residence LIKE :residence'); $queryBuilder->setParameter('residence', '%'.$residence.'%'); } if (null != $batiment) { $queryBuilder->andWhere('ad.batiment LIKE :batiment'); $queryBuilder->setParameter('batiment', '%'.$batiment.'%'); } if (null != $numero) { $queryBuilder->andWhere('ad.numero LIKE :numero'); $queryBuilder->setParameter('numero', '%'.$numero.'%'); } $this->addOptions( qb: $queryBuilder, forceOptions: $options ); return $queryBuilder->getQuery()->getResult(); } public function findForControl(Controle $control): array { $qb = $this->createQueryBuilder('t') ->select('t') ->addSelect('z') ->leftJoin('t.zones', 'z') ->leftJoin('z.items', 'i') ->leftJoin('i.notes', 'n') ->orderBy('t.position') ->where('n.controle = :control') ->setParameter('control', $control); return $qb->getQuery()->getResult(); } /** * @return Thematic[] */ public function findForAddress(Adresse $address): array { return $this->createQueryBuilder('t') ->select('t') ->addSelect('z') ->addSelect('zc') ->addSelect('i') ->leftJoin('t.zones', 'z') ->leftJoin('z.allChildren', 'zc') ->leftJoin('zc.items', 'i') ->leftJoin('i.adresses', 'a') ->where('a = :address') ->setParameter('address', $address) ->orderBy('t.position') ->getQuery() ->getResult(); } /** * @throws \Exception */ public function averageNoteByManagerByFullAdresse( UserInterface $manager, $ville, $voie, $residence, $batiment, $numero, $dateStart = null, $dateEnd = null, ) { $options = []; if (null === $dateStart || null === $dateEnd) { $options['dateRange'] = new DateRange($dateStart, $dateEnd); } $queryBuilder = $this->createQueryBuilder('t') ->addSelect('AVG(n.note) as note') ->addSelect('count(c.id) as nbControl') ->leftJoin('t.zones', 'z') ->leftJoin('z.allChildren', 'zc') ->leftJoin('zc.items', 'i') ->leftJoin('i.notes', 'n') ->leftJoin('n.controle', 'c') ->leftJoin('c.adresse', 'ad') ->leftJoin('c.agent', 'ag') ->where('ag.manager = :manager') ->andWhere('ad.manager = :manager') ->andWhere('c.valide = :valid') ->setParameter('manager', $manager) ->setParameter('valid', true) ->orderBy('t.position') ->groupBy('t') ; if (null != $ville) { $queryBuilder->andWhere('ad.ville LIKE :ville'); $queryBuilder->setParameter('ville', '%'.$ville.'%'); } if (null != $voie) { $queryBuilder->andWhere('ad.voie LIKE :voie'); $queryBuilder->setParameter('voie', '%'.$voie.'%'); } if (null != $residence) { $queryBuilder->andWhere('ad.residence LIKE :residence'); $queryBuilder->setParameter('residence', '%'.$residence.'%'); } if (null != $batiment) { $queryBuilder->andWhere('ad.batiment LIKE :batiment'); $queryBuilder->setParameter('batiment', '%'.$batiment.'%'); } if (null != $numero) { $queryBuilder->andWhere('ad.numero LIKE :numero'); $queryBuilder->setParameter('numero', '%'.$numero.'%'); } $this->addOptions( qb: $queryBuilder, forceOptions: $options ); return $queryBuilder->getQuery()->getResult(); } }
Save File
Cancel