← Back
Editing: NoteRepository.php
<?php namespace App\Repository; use App\Entity\Adresse; use App\Entity\Agency; use App\Entity\Item; use App\Entity\Note; use App\Entity\Organization; use App\Entity\Solution; use App\Entity\Thematic; use App\Entity\User; use App\Session\Filter\ValueObject\DateRange; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\Security\Core\User\UserInterface; /** * @method Note|null find($id, $lockMode = null, $lockVersion = null) * @method Note|null findOneBy(array $criteria, array $orderBy = null) * @method Note[] findAll() * @method Note[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) */ class NoteRepository extends ServiceEntityRepository { use OptionsTrait; public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Note::class); } /** * @throws NoResultException * @throws NonUniqueResultException * @throws \Exception */ public function averageNoteByAgent( UserInterface $agent, $dateStart = null, $dateEnd = null, ?Solution $solution = null ) { $qb = $this->createQueryBuilder('n') ->select('AVG(n.note)') ->leftJoin('n.controle', 'c') ->where('c.agent = :agent') ->andWhere('c.valide = 1') ->setParameter('agent', $agent); if ($dateStart) { $qb->andWhere('c.dateRealisation >= :dateStart'); if ($dateStart instanceof \DateTime) { $qb->setParameter('dateStart', $dateStart); } else { $qb->setParameter('dateStart', new \DateTime($dateStart)); } } if ($dateEnd) { $qb->andWhere('c.dateRealisation < :dateEnd'); if ($dateEnd instanceof \DateTime) { $qb->setParameter('dateEnd', $dateEnd); } else { $qb->setParameter('dateEnd', new \DateTime($dateEnd)); } } if ($solution) { $qb->andWhere('c.solution = :solution'); $qb->setParameter('solution', $solution); } return $qb ->getQuery() ->getSingleScalarResult(); } /** * @throws \Exception */ public function averageNoteItemsByManager( UserInterface $manager, ?Adresse $adresse = null, array $options = [] ): array { $qb = $this->createQueryBuilder('n') ->select('i.nom as item') ->addSelect('i.id as id') ->addSelect('i.notationType as notationType') ->addSelect('i.id as itemId') ->addSelect('z.nom as zone') ->addSelect('AVG(n.note) as averageNote') ->leftJoin('n.item', 'i') ->innerJoin('i.zone', 'z') ->leftJoin('n.controle', 'c') ->leftJoin('c.adresse', 'ad') ->where('ad.manager = :manager') ->andWhere('c.valide = 1') ->groupBy('i.id') ->setParameter('manager', $manager); if (null !== $adresse) { $qb->andWhere('ad = :address') ->setParameter('address', $adresse); } $this->addOptions( qb: $qb, forceOptions: $options ); return $qb ->getQuery() ->getResult(); } /** * @throws \Exception */ public function averageNoteItemsByAgent( User $agent, ?Adresse $adresse = null, array $options = [] ): array { $qb = $this->createQueryBuilder('n') ->select('i.nom as item') ->addSelect('i.id as id') ->addSelect('i.notationType as notationType') ->addSelect('i.id as itemId') ->addSelect('z.nom as zone') ->addSelect('AVG(n.note) as averageNote') ->leftJoin('n.item', 'i') ->innerJoin('i.zone', 'z') ->leftJoin('n.controle', 'c') ->leftJoin('c.adresse', 'ad') ->leftJoin('ad.userAddresses', 'ua') ->where('ua.user = :agent') ->andWhere('c.agent = :agent') ->andWhere('c.valide = 1') ->groupBy('i.id') ->setParameter('agent', $agent); if (null !== $adresse) { $qb->andWhere('ad = :address') ->setParameter('address', $adresse); } $this->addOptions( qb: $qb, forceOptions: $options ); return $qb ->getQuery() ->getResult(); } /** * @throws \Exception */ public function noteItemsByAgent(User $agent, Item $item): array { $qb = $this->createQueryBuilder('n') ->select('i.nom as item') ->addSelect('AVG(n.note) as averageNote') ->addSelect('a.nom as nomAgent') ->addSelect('a.prenom as prenomAgent') ->addSelect('a.id as idAgent') ->addSelect('c.id as controleId') ->leftJoin('n.controle', 'c') ->leftJoin('n.item', 'i') ->leftjoin('c.agent', 'a') ->where('i = :item') ->andWhere('c.valide = 1') ->andWhere('a = :agent') ->groupBy('a.nom') ->setParameter('item', $item) ->setParameter('agent', $agent); $this->addOptions($qb); return $qb ->getQuery() ->getResult(); } /** * @throws \Exception */ public function noteAllItemsByAgent( ?int $agentId, array $options = [] ) { $qb = $this->createQueryBuilder('n') ->select('i.nom as item') ->addSelect('i.id as id') ->addSelect('AVG(n.note) as note') ->addSelect('a.nom as nomAgent') ->addSelect('a.prenom as prenomAgent') ->addSelect('a.id as idAgent') ->addSelect('c.id as controleId') ->addSelect('z.nom as zone') ->addSelect('z.id as zoneId') ->addSelect('i.notationType') ->leftJoin('n.controle', 'c') ->leftJoin('n.item', 'i') ->leftJoin('c.agent', 'a') ->innerJoin('i.zone', 'z') ->andWhere('c.valide = :valide') ->andWhere('a.id = :agentId') ->groupBy('i') ->setParameter('agentId', $agentId) ->setParameter('valide', true); $this->addOptions( qb: $qb, forceOptions: $options ); return $qb->getQuery()->getResult(); } /** * @throws \Exception */ public function averageNoteByManagerByFullAdresse( UserInterface $manager, $ville, $voie, $residence, $batiment, $numero, ?\DateTime $dateStart = null, ?\DateTime $dateEnd = null ) { $options = []; if (null !== $dateStart && null !== $dateEnd) { $options['dateRange'] = new DateRange($dateStart, $dateEnd); } $queryBuilder = $this->createQueryBuilder('n') ->select('AVG(n.note) as noteMoyenne') ->addSelect('count(c.id) as nbControl') ->join('n.controle', 'c') ->join('c.adresse', 'ad') ->join('c.agent', 'ag') ->where('ag.manager = :manager') ->andWhere('ad.manager = :manager') ->andWhere('c.valide = :valid') ->setParameter('manager', $manager) ->setParameter('valid', true); 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(); } public function averageNoteForSupervisorV2(Agency $agency, ?Thematic $thematic = null): array { $queryBuilder = $this->createQueryBuilder('n') ->select('AVG(n.note) as averageNote') ->leftJoin('n.item', 'i') ->leftJoin('n.controle', 'c') ->leftJoin('c.adresse', 'a') ->andWhere('a.agency = :agency') ->setParameter('agency', $agency); if (null !== $thematic) { $queryBuilder ->leftJoin('i.zone', 'z') ->leftJoin('z.root', 'zr') ->andWhere('zr.thematic = :thematic') ->setParameter('thematic', $thematic); } $queryBuilder = $this->addOptions($queryBuilder); return $queryBuilder->getQuery()->getArrayResult(); } public function averageNoteForOrganization(Organization $organization, ?Thematic $thematic = null): array { $queryBuilder = $this->createQueryBuilder('n') ->select('AVG(n.note) as averageNote') ->leftJoin('n.item', 'i') ->leftJoin('n.controle', 'c') ->leftJoin('c.adresse', 'a') ->leftJoin('a.agency', 'ag') ->andWhere('ag.organization = :organization') ->setParameter('organization', $organization) ; if (null !== $thematic) { $queryBuilder ->leftJoin('i.zone', 'z') ->leftJoin('z.root', 'zr') ->andWhere('zr.thematic = :thematic') ->setParameter('thematic', $thematic); } $queryBuilder = $this->addOptions($queryBuilder); return $queryBuilder->getQuery()->getArrayResult(); } public function averageNoteItemsForSupervisor(Agency $agency) { $queryBuilder = $this->createQueryBuilder('n') ->select('i.nom') ->addSelect('z.nom as zone') ->addSelect('AVG(n.note) as averageNote') ->addSelect('i.id') ->leftJoin('n.item', 'i') ->innerJoin('i.zone', 'z') ->leftJoin('n.controle', 'c') ->leftJoin('c.adresse', 'a') ->andWhere('a.agency = :agency') ->groupBy('i') ->setParameter('agency', $agency); $queryBuilder = $this->addOptions($queryBuilder); return $queryBuilder->getQuery()->getResult(); } public function averageNoteItemsForOrganization(array $agenciesId) { $queryBuilder = $this->createQueryBuilder('n') ->select('i.nom') ->addSelect('z.nom as zone') ->addSelect('AVG(n.note) as averageNote') ->addSelect('i.id') ->leftJoin('n.item', 'i') ->innerJoin('i.zone', 'z') ->leftJoin('n.controle', 'c') ->leftJoin('c.adresse', 'a') ->andWhere('a.agency IN ('.implode(',', $agenciesId).')') ->groupBy('i'); $queryBuilder = $this->addOptions($queryBuilder); return $queryBuilder->getQuery()->getResult(); } /** * @return Note[] */ public function findWithPicture(): array { return $this->createQueryBuilder('n') ->where('n.photo is not null') ->getQuery()->getResult(); } /** * @return int|mixed|string */ public function removeNoteWithItemForAgency(Agency $agency, Item $item) { $ids = $this->createQueryBuilder('n') ->leftJoin('n.controle', 'c') ->leftJoin('c.adresse', 'ad') ->where('n.item = :item') ->andWhere('ad.agency = :agency') ->setParameter('agency', $agency) ->setParameter('item', $item) ->getQuery() ->getResult(); return $this->createQueryBuilder('n') ->where('n.id in (:ids)') ->setParameter('ids', $ids) ->delete() ->getQuery() ->execute(); } }
Save File
Cancel